From a38a2f25cf1ce85e8a36c88322739bfe8329bfd3 Mon Sep 17 00:00:00 2001 From: can1357 Date: Thu, 30 Jul 2026 04:56:47 +0200 Subject: [PATCH 01/19] ci: optimized github actions caching and workflows - Updated GitHub Actions workflows and custom actions to optimize caching strategies and runners. - Configured separate restore and save steps for bun store caching with non-PR restrictions. - Added darwin release bazel cache seeding and fallback keys for cache restore. - Removed native-inputs workflow action and disabled PR-side Rust validation. --- .github/actionlint.yaml | 6 + .github/actions/bazel-cache/action.yml | 27 +++- .github/actions/bun-install/action.yml | 27 +++- .github/actions/native-inputs/action.yml | 78 ---------- .github/workflows/bazel-cache-warm.yml | 112 ++++++++------ .github/workflows/ci.yml | 177 ++++++----------------- docs/natives-build-release-debugging.md | 19 +-- 7 files changed, 174 insertions(+), 272 deletions(-) create mode 100644 .github/actionlint.yaml delete mode 100644 .github/actions/native-inputs/action.yml diff --git a/.github/actionlint.yaml b/.github/actionlint.yaml new file mode 100644 index 000000000..73bd0da5a --- /dev/null +++ b/.github/actionlint.yaml @@ -0,0 +1,6 @@ +# actionlint only knows GitHub-hosted labels; register the self-hosted ARC +# runner scale set (infra/docs/04-arc-and-caching.md) so `runs-on: omp-kata` +# lints clean. +self-hosted-runner: + labels: + - omp-kata diff --git a/.github/actions/bazel-cache/action.yml b/.github/actions/bazel-cache/action.yml index 6d3239fcc..0d40424b0 100644 --- a/.github/actions/bazel-cache/action.yml +++ b/.github/actions/bazel-cache/action.yml @@ -12,11 +12,17 @@ description: > The v3 key is -: config covers toolchain and build settings, source covers crates/** + BUILD.bazel. Restores fall - back to the config-scoped prefix, so a source generation the exact key - has never seen still seeds from the previous generation's archive, and - the refreshed archive is saved after the build (an exact hit suppresses + back to the config-scoped prefix, then to a bare scope+os+arch prefix: + the config hash covers Cargo.toml/Cargo.lock, which every release + version bump rewrites, so without the bare fallback each release built + the darwin addons fully cold (~40-50 min on macos-15-intel; CI run + 30357804722). A stale-config archive is safe — bazel keys every + action by content digest, so mismatched entries just miss — and the + refreshed archive is saved after the build (an exact hit suppresses the save — without the source component the first archive for a config - generation would permanently shadow newer source states). + generation would permanently shadow newer source states). Restored + entries untouched for 14 days are pruned before the build so + ever-seeding archives don't grow without bound. inputs: scope: @@ -58,10 +64,12 @@ runs: fi key="bazel-disk-v3-${{ inputs.scope }}-${{ runner.os }}-${{ runner.arch }}-$CONFIG_HASH-$SOURCE_HASH" prefix="bazel-disk-v3-${{ inputs.scope }}-${{ runner.os }}-${{ runner.arch }}-$CONFIG_HASH-" + bare_prefix="bazel-disk-v3-${{ inputs.scope }}-${{ runner.os }}-${{ runner.arch }}-" { echo "remote=$remote" echo "cache-key=$key" echo "cache-prefix=$prefix" + echo "cache-bare-prefix=$bare_prefix" } >> "$GITHUB_OUTPUT" - name: Restore bazel disk cache @@ -71,8 +79,14 @@ runs: with: path: ~/.cache/omp-bazel-disk key: ${{ steps.backend.outputs.cache-key }} + # Order matters: exact key, same-config prefix, then any archive for + # this scope+os+arch. The bare fallback is what keeps release version + # bumps (Cargo.toml/Cargo.lock churn -> new CONFIG_HASH) from going + # fully cold; bazel's content-addressed action keys make a + # stale-config archive a partial hit, never a wrong output. restore-keys: | ${{ steps.backend.outputs.cache-prefix }} + ${{ steps.backend.outputs.cache-bare-prefix }} - name: Compose cache config id: compose @@ -112,6 +126,11 @@ runs: } > "$rc" else mkdir -p "$HOME/.cache/omp-bazel-disk" "$HOME/.cache/omp-bazel-repo" + # Seeding from stale archives means entries dead source + # generations wrote would otherwise ride along forever; drop + # anything untouched for 14 days (tar preserves mtimes across + # the actions/cache round trip, so age survives restores). + find "$HOME/.cache/omp-bazel-disk" -type f -mtime +14 -delete 2>/dev/null || true { echo "common --config=ci" echo "common --disk_cache=$HOME/.cache/omp-bazel-disk" diff --git a/.github/actions/bun-install/action.yml b/.github/actions/bun-install/action.yml index 54f2ddeab..752907a76 100644 --- a/.github/actions/bun-install/action.yml +++ b/.github/actions/bun-install/action.yml @@ -42,13 +42,25 @@ runs: curl -fsSL https://bun.sh/install | bash -s "bun-v1.3.14" echo "${BUN_INSTALL}/bin" >> "$GITHUB_PATH" - # Off-infra (GitHub-hosted): stock actions/cache for the bun store. - - name: Cache bun store (GitHub cache) + # Off-infra (GitHub-hosted): actions/cache for the bun store, split into + # restore + save. actions/cache entries are scoped per ref but count + # against the shared 10 GB repo quota — letting every PR branch save its + # own copy of the ~500 MB store duplicated it 19x, evicting the far more + # valuable bazel disk-cache archives (which is why release darwin builds + # kept going cold). PRs only restore; non-PR runs (main pushes, releases, + # dispatches) produce the shared entry every PR can see. + - name: Restore bun store (GitHub cache) + id: bun-cache if: steps.env.outputs.cache == 'gha' - uses: actions/cache@v4 + uses: actions/cache/restore@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: ~/.bun/install/cache key: bun-${{ runner.os }}-${{ hashFiles('**/bun.lock') }} + # A lockfile change seeds from the previous store: entries are + # content-hash-named tarballs, so stale extras waste only space and + # bun downloads just the delta. + restore-keys: | + bun-${{ runner.os }}- # On-infra (omp-kata): the pod mounts a shared PVC at bun's store path. - name: Prepare mounted bun store @@ -75,3 +87,12 @@ runs: echo "::warning title=bun install retry::shared bun store install failed; retrying with a clean job-local cache" retry_cache="$(mktemp -d "${RUNNER_TEMP:-/tmp}/bun-cache-retry.XXXXXX")" bun install --frozen-lockfile --cache-dir="$retry_cache" + + # Producer half of the split cache: only non-PR runs save, so the store + # exists once per lockfile generation instead of once per PR ref. + - name: Save bun store (GitHub cache) + if: steps.env.outputs.cache == 'gha' && github.event_name != 'pull_request' && steps.bun-cache.outputs.cache-hit != 'true' + uses: actions/cache/save@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 + with: + path: ~/.bun/install/cache + key: bun-${{ runner.os }}-${{ hashFiles('**/bun.lock') }} diff --git a/.github/actions/native-inputs/action.yml b/.github/actions/native-inputs/action.yml deleted file mode 100644 index 52d65ffe8..000000000 --- a/.github/actions/native-inputs/action.yml +++ /dev/null @@ -1,78 +0,0 @@ -name: "Native inputs: change detection + artifact cache key" -description: > - Single source of truth for what counts as a native-affecting change. - - `rust` gates Rust validation (tests, clippy, rustfmt); `cache-key` - addresses the prebuilt Linux x64 addon pair published by trusted main - builds. The detector pathspec and the hashed file set MUST cover the same - inputs — drift means a native change could ship without validation or be - tested against stale addons. The key embeds a schema version, OS, arch, - target pair, and build profile so a future target/profile change can - never resolve valid-but-wrong .node files under the same source hash. - -outputs: - rust: - description: Whether the event touches native inputs (always true off pull_request) - value: ${{ steps.changes.outputs.rust }} - source-hash: - description: 16-hex fingerprint over every native build input - value: ${{ steps.hash.outputs.source-hash }} - cache-key: - description: Exact actions/cache key for the prebuilt Linux x64 addon pair - value: ${{ steps.hash.outputs.cache-key }} - -runs: - using: composite - steps: - - name: Detect native-affecting changes - id: changes - shell: bash - env: - GH_TOKEN: ${{ github.token }} - run: | - set -euo pipefail - if [ "${{ github.event_name }}" != "pull_request" ]; then - echo "rust=true" >> "$GITHUB_OUTPUT" - exit 0 - fi - # Write the diff to a file before matching: in a pipeline, an API - # failure is indistinguishable from "no native changes" (skips - # validation — fail-open), and grep -q can close the pipe early so - # gh dies on SIGPIPE and pipefail flips a MATCH to rust=false. - changed_files="$RUNNER_TEMP/native-changed-files" - gh pr diff ${{ github.event.pull_request.number }} --name-only > "$changed_files" - if grep -qE '^(crates/|bazel/|Cargo\.(toml|lock)|MODULE\.bazel(\.lock)?|BUILD\.bazel|\.bazelrc|\.bazelignore|\.bazelversion|rust-toolchain\.toml|rustfmt\.toml|scripts/bazel-natives\.ts|\.github/actions/(bazel-cache|bazel-natives|native-artifacts|native-inputs)/|\.github/workflows/ci\.yml)' "$changed_files"; then - echo "rust=true" >> "$GITHUB_OUTPUT" - else - echo "No native-affecting changes; skipping Rust validation." - echo "rust=false" >> "$GITHUB_OUTPUT" - fi - - # Content-addresses the addon bytes from git index entries (mode, - # blob identity, path) — `git ls-files -s` covers the executable bit - # and never follows symlinks into worktree bytes. `--error-unmatch` - # fails the step loudly when a listed path disappears instead of - # silently narrowing the key. - - name: Compute native source hash - id: hash - shell: bash - run: | - set -euo pipefail - source_hash=$(git ls-files -s -z --error-unmatch -- \ - crates bazel \ - Cargo.toml Cargo.lock \ - MODULE.bazel MODULE.bazel.lock BUILD.bazel \ - .bazelrc .bazelignore .bazelversion \ - rust-toolchain.toml rustfmt.toml \ - scripts/bazel-natives.ts \ - .github/actions/bazel-cache .github/actions/bazel-natives \ - .github/actions/native-artifacts .github/actions/native-inputs \ - .github/workflows/ci.yml \ - | sort -z \ - | sha256sum \ - | cut -c1-16) - { - echo "source-hash=$source_hash" - echo "cache-key=native-addons-v1-linux-x64-baseline+modern-opt-$source_hash" - } >> "$GITHUB_OUTPUT" - echo "Native source hash: $source_hash" diff --git a/.github/workflows/bazel-cache-warm.yml b/.github/workflows/bazel-cache-warm.yml index adc722996..3d61a3cb9 100644 --- a/.github/workflows/bazel-cache-warm.yml +++ b/.github/workflows/bazel-cache-warm.yml @@ -1,24 +1,38 @@ name: Warm bazel disk cache -# GitHub-hosted PR runners cannot use the cluster remote cache and only see -# actions/cache entries created on the default branch. Bazel action keys do -# not transfer across runner environments (a kata-produced disk cache misses -# every action on ubuntu-22.04), so seed the disk cache from the same image -# PR jobs run on. Runs the full hosted action set — Rust validation (test, -# clippy, rustfmt) plus the native addons — so one exact-key archive covers -# both rust_validate and native_addons for this source generation. The v3 -# key embeds a crates/** source fingerprint, so a native change on main -# means an exact miss: the build seeds from the previous generation via the -# config-scoped prefix and the refreshed archive is saved. An exact hit -# makes every invocation a cache replay and saves nothing. +# GitHub-hosted runners cannot use the cluster remote cache and only see +# actions/cache entries created on the default branch, and bazel action keys +# do not transfer across runner environments (a kata-produced disk cache +# misses every action on a hosted image) — so seed each hosted consumer from +# the same image it runs on: +# +# warm_darwin (macos-*) -> scopes `release-darwin-*`, consumed by the +# release_binary darwin jobs. Releases are the +# only other producers for these scopes and a +# release always changes CONFIG_HASH (version +# bump rewrites Cargo.toml/Cargo.lock), so +# without warming here every release rebuilt the +# darwin addons cold (~40-50 min on +# macos-15-intel — run 30357804722). +# warm_bun (ubuntu-22.04)-> the shared `bun--` store entry. +# PR jobs restore it but never save (per-PR-ref +# copies of the ~500 MB store once ate ~9.4 GB of +# the 10 GB repo cache quota and evicted every +# bazel archive). +# +# The v3 key embeds a crates/** source fingerprint, so a native change on +# main means an exact miss: the build seeds from a previous generation via +# the prefix/bare restore keys and the refreshed archive is saved. An exact +# hit makes every invocation a cache replay and saves nothing. +# +# Paths mirror the cache-key inputs (bazel-cache action) plus bun.lock — a +# packages/** push cannot change any archive, so it does not trigger a warm. on: push: branches: [main] paths: - - "packages/**" - "crates/**" - - "scripts/**" - "bazel/**" - "MODULE.bazel" - "MODULE.bazel.lock" @@ -30,50 +44,54 @@ on: - "Cargo.lock" - "rust-toolchain.toml" - "rustfmt.toml" + - "bun.lock" - ".github/**" workflow_dispatch: permissions: contents: read +# No cancel-in-progress: a cancelled warm saves nothing, and the first darwin +# warm on a cold runner takes long enough that back-to-back native pushes +# would cancel it forever. Superseded queued runs still collapse to the +# newest one, and staleness is harmless — consumers seed via prefix keys. concurrency: group: bazel-cache-warm - cancel-in-progress: true + cancel-in-progress: false jobs: - warm: - name: Seed hosted bazel disk cache + # Keeps the release_binary darwin scopes seeded near HEAD so a release's + # bazel build is the version-bump delta, not a cold graph. Scope, runner + # image, and target must stay in lockstep with the release_binary matrix + # in ci.yml — a mismatched scope warms an archive nobody restores. + warm_darwin: + name: "Seed darwin release bazel cache: ${{ matrix.target }}" + strategy: + fail-fast: false + matrix: + include: + - { os: macos-15-intel, target: darwin-x64-baseline, scope: release-darwin-x64 } + - { os: macos-14, target: darwin-arm64, scope: release-darwin-arm64 } + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v4 + - uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0 + with: + bun-version: "1.3" + # scripts/bazel-natives.ts is dependency-free (node builtins only), so + # no `bun install` is needed; the bazel-natives action restores, + # builds, and saves the scope's disk cache. + - uses: ./.github/actions/bazel-natives + with: + targets: ${{ matrix.target }} + cache-scope: ${{ matrix.scope }} + + # Produces the shared bun store entry PR jobs restore. bun-install's save + # half only runs on non-PR events, and main CI jobs run on omp-kata (PVC + # store, no GitHub cache), so this is the sole hosted-runner producer. + warm_bun: + name: Seed bun store cache runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 - - id: cache - uses: ./.github/actions/bazel-cache - with: - scope: linux - # Invocation set mirrors the hosted CI jobs (rust_validate + - # native_addons) so the saved archive serves both. - - name: Rust tests - run: | - set -euo pipefail - if [ "$(ulimit -Sn)" != unlimited ] && [ "$(ulimit -Sn)" -lt 65536 ]; then ulimit -Sn 65536 || true; fi - bazelisk --bazelrc="${{ steps.cache.outputs.rc }}" test //crates/... - - name: Clippy (workspace lint policy on opted-in crates) - run: | - bazelisk query "kind('rust_library|rust_shared_library', //crates/pi-ast/... + //crates/pi-iso/... + //crates/pi-natives/... + //crates/pi-shell/... + //crates/pi-walker/...)" \ - | xargs bazelisk --bazelrc="${{ steps.cache.outputs.rc }}" build --config=clippy-strict -- - - name: Clippy (default lints elsewhere) - run: | - bazelisk query "kind('rust_library|rust_shared_library', //crates/... - (//crates/pi-ast/... + //crates/pi-iso/... + //crates/pi-natives/... + //crates/pi-shell/... + //crates/pi-walker/...) - //crates/vendor/brush-core/... - //crates/vendor/brush-builtins/...)" \ - | xargs bazelisk --bazelrc="${{ steps.cache.outputs.rc }}" build --config=clippy -- - - name: Rustfmt - run: bazelisk --bazelrc="${{ steps.cache.outputs.rc }}" build --config=rustfmt //crates/... - - name: Build native addons - run: | - set -euo pipefail - bazelisk --bazelrc="${{ steps.cache.outputs.rc }}" build //:natives-linux-x64-baseline //:natives-linux-x64-modern - - name: Save bazel disk cache - if: steps.cache.outputs.save-needed == 'true' - uses: actions/cache/save@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 - with: - path: ~/.cache/omp-bazel-disk - key: ${{ steps.cache.outputs.cache-key }} + - uses: ./.github/actions/bun-install diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 910fec12b..c2880cd12 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -124,26 +124,23 @@ jobs: - name: Build collab web run: bun run collab:web:build - # Rust validation (tests, clippy, rustfmt) and native addon production are - # separate jobs: TS test shards wait only on the addons, and on - # native-changing PRs validation no longer delays artifact production. + # Rust validation (tests, clippy, rustfmt) runs on non-PR events only. + # Native-changing PRs are rare enough that they do not warrant PR-side + # Rust validation or a PR-side addon build (see native_addons): Rust is + # validated post-merge on main (kata remote cache, warm) and again at + # release. A skipped required check still satisfies branch protection. rust_validate: name: Validate Rust workspace (bazel) - runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-22.04' || 'omp-kata' }} + if: github.event_name != 'pull_request' + runs-on: omp-kata steps: - uses: actions/checkout@v4 - - id: inputs - uses: ./.github/actions/native-inputs - # TS-only PRs skip Rust validation entirely. - - if: steps.inputs.outputs.rust == 'true' - uses: ./.github/actions/bun-install + - uses: ./.github/actions/bun-install - id: cache - if: steps.inputs.outputs.rust == 'true' uses: ./.github/actions/bazel-cache with: scope: linux - name: Rust tests - if: steps.inputs.outputs.rust == 'true' # The ulimit guard runs in the step that launches the bazel server # (limits are per-process and the server persists across steps). run: | @@ -154,67 +151,49 @@ jobs: # `[lints] workspace = true` get the workspace policy, the vendored # brush fork is exempt (same as run-rs-task.ts's cargo excludes). - name: Clippy (workspace lint policy on opted-in crates) - if: steps.inputs.outputs.rust == 'true' run: | bazelisk query "kind('rust_library|rust_shared_library', //crates/pi-ast/... + //crates/pi-iso/... + //crates/pi-natives/... + //crates/pi-shell/... + //crates/pi-walker/...)" \ | xargs bazelisk --bazelrc="${{ steps.cache.outputs.rc }}" build --config=clippy-strict -- - name: Clippy (default lints elsewhere) - if: steps.inputs.outputs.rust == 'true' run: | bazelisk query "kind('rust_library|rust_shared_library', //crates/... - (//crates/pi-ast/... + //crates/pi-iso/... + //crates/pi-natives/... + //crates/pi-shell/... + //crates/pi-walker/...) - //crates/vendor/brush-core/... - //crates/vendor/brush-builtins/...)" \ | xargs bazelisk --bazelrc="${{ steps.cache.outputs.rc }}" build --config=clippy -- - name: Rustfmt - if: steps.inputs.outputs.rust == 'true' run: bazelisk --bazelrc="${{ steps.cache.outputs.rc }}" build --config=rustfmt //crates/... - # No disk-cache save here: native_addons saves this same key - # concurrently, and an immutable archive can have only one producer - # per key — a validation-only archive winning the race would - # suppress the addon half on every later exact hit. Validation - # actions are seeded by the main cache warmer's combined archive. - # Builds the native addons every downstream job installs. TS-only PRs - # restore the prebuilt Linux x64 pair published by trusted main builds - # (exact content-addressed key, smoke-loaded before use) and skip Bazel - # entirely; anything else builds with bazel. Main builds all Linux-hosted - # targets, pull requests only the x64 pair tests require. + # Provides the native addons every downstream TS job installs. PRs never + # build: they fetch the latest release's Linux x64 pair from the + # @oh-my-pi/pi-natives-linux-x64 npm leaf instead. The workspace loader + # skips its version sentinel for workspace loads, so release addons load + # fine under a newer checkout; a PR whose TS tests depend on changed + # native behavior fails visibly and the native side lands via main. + # Main (kata, cluster remote cache) builds all Linux-hosted targets with + # bazel. Job name says "bazel" for continuity with required checks. native_addons: name: Build native addons (bazel) runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-22.04' || 'omp-kata' }} steps: - uses: actions/checkout@v4 - - id: inputs - uses: ./.github/actions/native-inputs - # Trusted fast path. Exact-key restores only — a prefix fallback - # could resolve valid-but-wrong .node files under a changed - # target/profile (the key embeds schema + os/arch + target pair + - # build profile + input hash; see native-inputs action). - - name: Restore prebuilt native addons - id: prebuilt + + # ---- PR path: latest release addons from npm ---- + - name: Fetch release native addons (npm) if: github.event_name == 'pull_request' - uses: actions/cache/restore@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 - with: - path: ~/.cache/omp-native-addons - key: ${{ steps.inputs.outputs.cache-key }} - - name: Stage cached addons - if: steps.prebuilt.outputs.cache-hit == 'true' shell: bash - # Canonical filenames come from the target map in - # scripts/bazel-natives.ts; staging reproduces the bazel-bin - # layout the artifact upload below globs. run: | set -euo pipefail + tarball="$(npm view @oh-my-pi/pi-natives-linux-x64@latest dist.tarball)" + echo "Fetching $tarball" + curl -fsSL --retry 3 "$tarball" | tar -xz -C "$RUNNER_TEMP" mkdir -p bazel-bin/natives-linux-x64-baseline bazel-bin/natives-linux-x64-modern - cp ~/.cache/omp-native-addons/pi_natives.linux-x64-baseline.node bazel-bin/natives-linux-x64-baseline/ - cp ~/.cache/omp-native-addons/pi_natives.linux-x64-modern.node bazel-bin/natives-linux-x64-modern/ - # A poisoned cache entry must not ship: load both addons before - # trusting them. Failure falls back to a full build (loudly) rather - # than failing the PR. - - name: Smoke cached addons - id: smoke - if: steps.prebuilt.outputs.cache-hit == 'true' + cp "$RUNNER_TEMP/package/pi_natives.linux-x64-baseline.node" bazel-bin/natives-linux-x64-baseline/ + cp "$RUNNER_TEMP/package/pi_natives.linux-x64-modern.node" bazel-bin/natives-linux-x64-modern/ + # A corrupt download must fail here, not as a confusing dlopen error + # in every downstream test shard. + - name: Smoke release addons + if: github.event_name == 'pull_request' shell: bash run: | - set -uo pipefail + set -euo pipefail # NOTE: `bun -e 'require("./x.node")'` swallows dlopen failures # (exit 0 on a bogus addon); a script file enforces them in # both bun and node. Verified against a corrupt .node fixture. @@ -229,50 +208,40 @@ jobs: EOF loader=node if command -v bun >/dev/null 2>&1; then loader=bun; fi - if "$loader" "$RUNNER_TEMP/smoke-addons.js" \ - "$PWD/bazel-bin/natives-linux-x64-baseline/pi_natives.linux-x64-baseline.node" \ - "$PWD/bazel-bin/natives-linux-x64-modern/pi_natives.linux-x64-modern.node"; then - echo "ok=true" >> "$GITHUB_OUTPUT" - else - echo "::warning::cached native addons failed to load; falling back to a full bazel build" - rm -rf bazel-bin - echo "ok=false" >> "$GITHUB_OUTPUT" - fi - - name: Decide build path - id: decide + "$loader" "$RUNNER_TEMP/smoke-addons.js" \ + "$PWD/bazel-bin/natives-linux-x64-baseline/pi_natives.linux-x64-baseline.node" \ + "$PWD/bazel-bin/natives-linux-x64-modern/pi_natives.linux-x64-modern.node" + # Make the policy visible on the rare native-touching PR instead of + # leaving a reviewer to wonder which addons the tests exercised. + # Best-effort: a diff-API failure must not fail the job over a notice. + - name: Note native changes tested against release addons + if: github.event_name == 'pull_request' shell: bash env: - HIT: ${{ steps.prebuilt.outputs.cache-hit }} - SMOKE: ${{ steps.smoke.outputs.ok }} + GH_TOKEN: ${{ github.token }} run: | - if [ "$HIT" = "true" ] && [ "$SMOKE" = "true" ]; then - echo "Prebuilt addons restored and verified; skipping bazel." - echo "needed=false" >> "$GITHUB_OUTPUT" - else - echo "needed=true" >> "$GITHUB_OUTPUT" + if gh pr diff ${{ github.event.pull_request.number }} --name-only 2>/dev/null \ + | grep -qE '^(crates/|bazel/|Cargo\.(toml|lock)|MODULE\.bazel(\.lock)?|BUILD\.bazel|\.bazelrc|\.bazelignore|\.bazelversion|rust-toolchain\.toml|rustfmt\.toml)'; then + echo "::notice title=Native sources changed::PR CI tests against the latest release addons by design; native changes are validated post-merge on main and at release." fi + + # ---- main path: bazel build of all Linux-hosted targets ---- - id: cache - if: steps.decide.outputs.needed == 'true' + if: github.event_name != 'pull_request' uses: ./.github/actions/bazel-cache with: scope: linux - name: Build native addons once - if: steps.decide.outputs.needed == 'true' - env: - EVENT_NAME: ${{ github.event_name }} + if: github.event_name != 'pull_request' run: | set -eo pipefail if [ "$(ulimit -Sn)" != unlimited ] && [ "$(ulimit -Sn)" -lt 65536 ]; then ulimit -Sn 65536 || true; fi - targets=(//:natives-linux-x64-baseline //:natives-linux-x64-modern) - if [ "$EVENT_NAME" != "pull_request" ]; then - targets=(//:natives-linux-all) - fi - bazelisk --bazelrc="${{ steps.cache.outputs.rc }}" build "${targets[@]}" 2>&1 | tee "$RUNNER_TEMP/bazel-build.log" + bazelisk --bazelrc="${{ steps.cache.outputs.rc }}" build //:natives-linux-all 2>&1 | tee "$RUNNER_TEMP/bazel-build.log" # Cache-hit visibility: a supposedly warm build that executes # thousands of actions is the failure mode that made CI slow — make # it visible in the run summary instead of discovering it weeks in. - name: Report bazel cache stats - if: steps.decide.outputs.needed == 'true' + if: github.event_name != 'pull_request' shell: bash run: | # Bazel runs with --color=yes (config=ci); strip ANSI before @@ -280,57 +249,7 @@ jobs: # the raw log. summary=$(sed -E 's/\x1b\[[0-9;]*m//g' "$RUNNER_TEMP/bazel-build.log" | grep -E '[0-9]+ processes:' | tail -1 || true) echo "::notice title=Bazel build summary::${summary:-no process summary found}" - - name: Save Bazel disk cache - if: steps.cache.outputs.save-needed == 'true' - uses: actions/cache/save@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 - with: - path: ~/.cache/omp-bazel-disk - key: ${{ steps.cache.outputs.cache-key }} - # Producer side of the fast path: trusted main builds publish the - # x64 pair under the content-addressed key. Smoke-load before save — - # an exact-key archive is never overwritten, so bad bytes would - # poison every TS-only PR until manual eviction. - - name: Stage built addons for cache - if: github.event_name != 'pull_request' - shell: bash - run: | - set -euo pipefail - mkdir -p ~/.cache/omp-native-addons - cp bazel-bin/natives-linux-x64-baseline/pi_natives.linux-x64-baseline.node \ - bazel-bin/natives-linux-x64-modern/pi_natives.linux-x64-modern.node \ - ~/.cache/omp-native-addons/ - - name: Smoke addons before caching - if: github.event_name != 'pull_request' - shell: bash - run: | - set -euo pipefail - cd ~/.cache/omp-native-addons - cat > "$RUNNER_TEMP/smoke-addons.js" <<'EOF' - for (const f of process.argv.slice(2)) { - const m = require(f); - if (!m || Object.keys(m).length === 0) { - console.error(`addon failed to load: ${f}`); - process.exit(1); - } - } - EOF - bun "$RUNNER_TEMP/smoke-addons.js" \ - "$PWD/pi_natives.linux-x64-baseline.node" \ - "$PWD/pi_natives.linux-x64-modern.node" - - name: Look up native addon cache - id: addon-cache - if: github.event_name != 'pull_request' - uses: actions/cache/restore@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 - with: - path: ~/.cache/omp-native-addons - key: ${{ steps.inputs.outputs.cache-key }} - lookup-only: true - - name: Save native addon cache - if: github.event_name != 'pull_request' && steps.addon-cache.outputs.cache-hit != 'true' - uses: actions/cache/save@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 - with: - path: ~/.cache/omp-native-addons - key: ${{ steps.inputs.outputs.cache-key }} + - name: Upload native addon artifacts uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: diff --git a/docs/natives-build-release-debugging.md b/docs/natives-build-release-debugging.md index b2886e8fa..32ead96ab 100644 --- a/docs/natives-build-release-debugging.md +++ b/docs/natives-build-release-debugging.md @@ -136,9 +136,11 @@ build --tls_certificate=infra/bazel-remote/ca.crt ### Split Rust validation and addon production -`.github/workflows/ci.yml` separates `rust_validate` from `native_addons`. Both run on `omp-kata` pods for pushes and `ubuntu-22.04` for pull requests, but TypeScript jobs depend only on `native_addons`. +`.github/workflows/ci.yml` separates `rust_validate` from `native_addons`; TypeScript jobs depend only on `native_addons`. -`rust_validate` uses `.github/actions/native-inputs` to inspect the complete pull-request file list. TypeScript-only pull requests skip every Rust step; native-affecting changes and all non-PR events run: +**Pull requests never build or validate Rust.** Native-affecting PRs are rare enough that they don't warrant a PR-side bazel build: `rust_validate` is skipped entirely (`if: github.event_name != 'pull_request'`), and `native_addons` fetches the latest release's Linux x64 addon pair from the `@oh-my-pi/pi-natives-linux-x64` npm leaf, smoke-loads both, and uploads them as the `native-addons` workflow artifact. The loader skips its version sentinel for workspace loads, so release-versioned addons load fine under a newer checkout. A PR whose TypeScript tests depend on changed native behavior fails visibly (and CI emits a notice on any native-touching PR); the Rust side is validated post-merge on main and again at release. + +On non-PR events both jobs run on `omp-kata` pods against the cluster remote cache. `rust_validate` runs: ```bash bazelisk --bazelrc="$rc" test //crates/... # full Rust suite @@ -153,19 +155,14 @@ bazelisk --bazelrc="$rc" build --config=rustfmt //crates/... - `--config=clippy` = rules_rust clippy aspect + `-Dwarnings`; `--config=clippy-strict` layers the generated `bazel/clippy.bazelrc` for crates with `[lints] workspace = true`. - `--config=rustfmt` = rustfmt aspect against the workspace `rustfmt.toml`. -- `rust_validate` never saves a hosted disk-cache archive: `native_addons` may concurrently own the same immutable key, while the main-branch warmer publishes a combined validation/addon archive. -`native_addons` is the artifact producer for every downstream TypeScript and release job: - -- Pull requests first restore the exact `native-addons-v1-linux-x64-baseline+modern-opt-` cache entry published by trusted main builds. Both addons are loaded before use; a miss or failed smoke check falls back to building the Linux x64 pair. -- Main and other non-PR runs build `//:natives-linux-all`, smoke the x64 pair before publishing its exact addon cache, and upload every `.node` output as the `native-addons` workflow artifact. -- Downstream jobs use `.github/actions/native-artifacts` to download that workflow artifact and install the requested target set without invoking Bazel. +`native_addons` on main builds `//:natives-linux-all` and uploads every `.node` output as the `native-addons` workflow artifact. Downstream jobs use `.github/actions/native-artifacts` to download that artifact and install the requested target set without invoking Bazel. No toolchain setup steps are required for native jobs: bazelisk is on the GitHub images and baked into the kata runner image; Bazel fetches Rust/zig/LLVM/xwin hermetically. ### Hosted cache warmer -`.github/workflows/bazel-cache-warm.yml` runs the full hosted validation and Linux x64 addon invocation set on `ubuntu-22.04`. Main-branch input changes restore the previous config-compatible generation, rebuild incrementally, and publish one combined exact-key disk-cache archive visible to pull requests. +`.github/workflows/bazel-cache-warm.yml` seeds the GitHub-hosted caches that have no other reliable producer: the `release-darwin-*` bazel disk caches (built on the same macOS images as the `release_binary` darwin matrix, so a release's bazel build is the version-bump delta instead of a ~40-min cold graph) and the shared bun store entry PR jobs restore but never save. It triggers only on pushes that can change those archives (crate/bazel/lock inputs, `bun.lock`, `.github/**`). ### `bazel-cache` action (`.github/actions/bazel-cache`) @@ -176,7 +173,7 @@ Single source of truth for cache wiring, emitted as a bazelrc fragment (its `rc` | omp-kata pod | `--config=ci --config=cache-rw --remote_cache=grpcs://bazel-remote.bazel-cache.svc.cluster.local:9092 --tls_certificate=infra/bazel-remote/ca.crt --remote_header='authorization=Basic '` | | GitHub-hosted | `--config=ci --disk_cache=~/.cache/omp-bazel-disk --repository_cache=~/.cache/omp-bazel-repo` | -Hosted disk caches use `bazel-disk-v3-----`. The config hash covers Cargo/Bazel/toolchain settings; the source hash covers `crates/**` and root `BUILD.bazel`. An exact miss restores the newest config-compatible generation and permits one refreshed exact-key save. The remote endpoint resolves only inside the cluster. +Hosted disk caches use `bazel-disk-v3-----`. The config hash covers Cargo/Bazel/toolchain settings; the source hash covers `crates/**` and root `BUILD.bazel`. Restores fall back from the exact key to the config-scoped prefix, then to a bare `--` prefix — the bare fallback is what keeps release version bumps (which rewrite `Cargo.toml`/`Cargo.lock` and thus the config hash) from rebuilding cold; bazel's content-addressed action keys make a stale archive a partial hit, never a wrong output. An inexact restore permits one refreshed exact-key save, and restored entries untouched for 14 days are pruned so archives don't grow without bound. The remote endpoint resolves only inside the cluster. ### Native artifact actions @@ -228,7 +225,7 @@ bazelisk build --nobuild //:natives-win32-x64-baseline ### Cache behavior - **omp-kata:** read-write gRPC to the in-cluster bazel-remote (`grpcs://bazel-remote.bazel-cache.svc.cluster.local:9092`, TLS via the committed `infra/bazel-remote/ca.crt`, htpasswd user `ci`). `--remote_local_fallback` plus retries make an outage degrade to local execution rather than fail the build. -- **GitHub-hosted:** no cluster access. The v3 `actions/cache` disk key separates config and source generations; `.github/workflows/bazel-cache-warm.yml` publishes the combined default-branch archive from the same `ubuntu-22.04` image as pull-request consumers. The smaller final-addon cache is independent and is trusted only after both addons load successfully. +- **GitHub-hosted:** no cluster access; only the darwin release/warm jobs build with bazel here. The v3 `actions/cache` disk key separates config and source generations with prefix + bare fallbacks (see the `bazel-cache` action section above); `.github/workflows/bazel-cache-warm.yml` publishes the `release-darwin-*` archives from the same macOS images as the release consumers. - **msvc repos:** the ~2 GiB LLVM download is sha256-pinned and repository-cache backed; the ~1 GiB xwin CRT/SDK splat is fetched from the Microsoft CDN inside the repo rule and is **not** repo-cache backed — a cold output base re-downloads it. Microsoft advances the VS channel payload over time, so remote-cache hit rates for win32 actions degrade gracefully after an MS bump (same property the previous cross toolchain had). Win32 link actions also don't share cache entries across host OSes (linux vs mac clang binaries). - Server-side operations (deploy, TLS/auth, egress, poisoning boundary): `infra/docs/04-arc-and-caching.md` §5. From d562e53b835100dd3bd7924408130a0703bf77ac Mon Sep 17 00:00:00 2001 From: can1357 Date: Thu, 30 Jul 2026 05:12:40 +0200 Subject: [PATCH 02/19] refactor: extracted audio and voice engine into a standalone library crate - Extracted audio capture and playback implementations, along with the WebRTC peer engine, from `pi-natives` into a new `pi-voice` library crate. - Updated `pi-natives` bindings to consume the extracted `pi_voice` audio streams and live peer core. - Added release validation gate jobs, parallelized Linux binary builds, and introduced a concurrent macOS release build job in the CI workflow. - Updated Bazel workspace configurations, Cargo manifests, and documentation to include the new `pi-voice` crate and its dependencies. --- .bazelrc | 3 +- .github/workflows/ci.yml | 251 +++++--- Cargo.lock | 20 +- Cargo.toml | 1 + MODULE.bazel.lock | 69 +-- crates/pi-natives/BUILD.bazel | 1 + crates/pi-natives/Cargo.toml | 16 +- crates/pi-natives/src/audio.rs | 392 +------------ crates/pi-natives/src/live.rs | 712 +---------------------- crates/pi-voice/BUILD.bazel | 29 + crates/pi-voice/Cargo.toml | 33 ++ crates/pi-voice/src/audio.rs | 400 +++++++++++++ crates/pi-voice/src/lib.rs | 26 + crates/pi-voice/src/live.rs | 722 ++++++++++++++++++++++++ docs/natives-build-release-debugging.md | 6 +- packages/natives/CHANGELOG.md | 5 + 16 files changed, 1485 insertions(+), 1201 deletions(-) create mode 100644 crates/pi-voice/BUILD.bazel create mode 100644 crates/pi-voice/Cargo.toml create mode 100644 crates/pi-voice/src/audio.rs create mode 100644 crates/pi-voice/src/lib.rs create mode 100644 crates/pi-voice/src/live.rs diff --git a/.bazelrc b/.bazelrc index 2816269e3..25f27d3c2 100644 --- a/.bazelrc +++ b/.bazelrc @@ -22,7 +22,8 @@ build --@rules_rust//rust/toolchain/channel=nightly # --- Rust validation (replaces cargo clippy/nextest in CI) -------------------- # Mirrors cargo semantics: crates with `[lints] workspace = true` (pi-ast, -# pi-iso, pi-natives, pi-shell, pi-walker) get the strict workspace policy +# pi-iso, pi-natives, pi-shell, pi-voice, pi-walker) get the strict workspace +# policy # (clippy-strict; bazel/clippy.bazelrc is generated from Cargo.toml); everything # else gets default clippy + -Dwarnings (clippy). build:clippy --aspects=@rules_rust//rust:defs.bzl%rust_clippy_aspect diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c2880cd12..34ff5e1dd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -75,7 +75,10 @@ jobs: # ref (or from a tagged main HEAD) is also treated as a release. release_metadata: name: Resolve release metadata - runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-22.04' || 'omp-kata' }} + # Hosted, not omp-kata: this ~20 s git-tag probe gates the whole release + # chain, and queueing it behind the 4-runner kata pool adds dead minutes + # to the darwin critical path. + runs-on: ubuntu-22.04 outputs: is-release: ${{ steps.detect.outputs.is-release }} release-tag: ${{ steps.detect.outputs.release-tag }} @@ -152,11 +155,11 @@ jobs: # brush fork is exempt (same as run-rs-task.ts's cargo excludes). - name: Clippy (workspace lint policy on opted-in crates) run: | - bazelisk query "kind('rust_library|rust_shared_library', //crates/pi-ast/... + //crates/pi-iso/... + //crates/pi-natives/... + //crates/pi-shell/... + //crates/pi-walker/...)" \ + bazelisk query "kind('rust_library|rust_shared_library', //crates/pi-ast/... + //crates/pi-iso/... + //crates/pi-natives/... + //crates/pi-shell/... + //crates/pi-voice/... + //crates/pi-walker/...)" \ | xargs bazelisk --bazelrc="${{ steps.cache.outputs.rc }}" build --config=clippy-strict -- - name: Clippy (default lints elsewhere) run: | - bazelisk query "kind('rust_library|rust_shared_library', //crates/... - (//crates/pi-ast/... + //crates/pi-iso/... + //crates/pi-natives/... + //crates/pi-shell/... + //crates/pi-walker/...) - //crates/vendor/brush-core/... - //crates/vendor/brush-builtins/...)" \ + bazelisk query "kind('rust_library|rust_shared_library', //crates/... - (//crates/pi-ast/... + //crates/pi-iso/... + //crates/pi-natives/... + //crates/pi-shell/... + //crates/pi-voice/... + //crates/pi-walker/...) - //crates/vendor/brush-core/... - //crates/vendor/brush-builtins/...)" \ | xargs bazelisk --bazelrc="${{ steps.cache.outputs.rc }}" build --config=clippy -- - name: Rustfmt run: bazelisk --bazelrc="${{ steps.cache.outputs.rc }}" build --config=rustfmt //crates/... @@ -401,8 +404,11 @@ jobs: OMP_INSTALL_TEST_SKIP_NATIVE_BUILD: "1" run: bun run ci:test:install-methods - release_binary: - name: "Release binary: ${{ matrix.target_id }}" + # Aggregates every validation job so publish-side release jobs gate on one + # result. Binary BUILDS deliberately do not wait for this gate — they run + # in parallel with the test fan-out and only publishing is held back. + release_gate: + name: Release validation gate if: ${{ needs.release_metadata.outputs.is-release == 'true' && !cancelled() && needs.rust_validate.result == 'success' && needs.native_addons.result == 'success' && @@ -415,6 +421,20 @@ jobs: needs.test_smoke.result == 'success' && needs.check.result == 'success' && needs.install_methods.result == 'success' }} needs: [release_metadata, check, rust_validate, native_addons, test_workspace, test_coding_agent_singleton, test_ts_native, test_coding_agent_ui, test_coding_agent_runtime, test_coding_agent_native, test_smoke, install_methods] + runs-on: ubuntu-22.04 + steps: + - run: echo "release validation green" + + # Builds (does not publish) the Linux-hosted release binaries in parallel + # with the test fan-out; the single need is native_addons, whose artifact + # supplies their addons. Darwin builds live in release_binary_darwin so + # they start at release_metadata time instead. Publishing (npm leaves, + # GitHub release, core npm) is gated on release_gate downstream. + release_binary: + name: "Release binary: ${{ matrix.target_id }}" + if: ${{ needs.release_metadata.outputs.is-release == 'true' && !cancelled() && + needs.native_addons.result == 'success' }} + needs: [release_metadata, native_addons] strategy: fail-fast: false matrix: @@ -453,22 +473,6 @@ jobs: binary_path: packages/coding-agent/binaries/omp-linux-musl-arm64, native_targets: linux-musl-arm64, } - - { - os: macos-15-intel, - platform: darwin, - arch: x64, - target_id: darwin-x64, - binary_path: packages/coding-agent/binaries/omp-darwin-x64, - native_targets: darwin-x64-baseline, - } - - { - os: macos-14, - platform: darwin, - arch: arm64, - target_id: darwin-arm64, - binary_path: packages/coding-agent/binaries/omp-darwin-arm64, - native_targets: darwin-arm64, - } - { os: ubuntu-22.04, platform: win32, @@ -480,60 +484,25 @@ jobs: runs-on: ${{ matrix.os }} permissions: contents: read - id-token: write - env: - MACOS_SIGNING: ${{ secrets.APPLE_CERTIFICATE_P12 != '' && secrets.APPLE_CERTIFICATE_PASSWORD != '' && secrets.APPLE_API_KEY_ID != '' && secrets.APPLE_API_ISSUER_ID != '' && secrets.APPLE_API_KEY != '' }} steps: - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 - uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0 with: bun-version: "1.3" - - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 - with: - node-version: "24" - registry-url: "https://registry.npmjs.org" - # npm runs under Bun when invoked by the release script; npm 12 - # requires a newer emulated Node version than Bun 1.3 provides. - - name: Ensure npm supports trusted publishing - if: ${{ !inputs.skip_npm }} - run: npm install -g npm@11.17.0 - name: Cache bun dependencies uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: ~/.bun/install/cache key: bun-${{ runner.os }}-${{ hashFiles('**/bun.lock') }} - run: bun install --frozen-lockfile - # Linux and Windows addons come from the native_addons job. Darwin runners - # build only their own architecture because cross-hosted artifacts do - # not exist for macOS. - name: Install prebuilt native addon(s) - if: matrix.platform != 'darwin' uses: ./.github/actions/native-artifacts with: targets: ${{ matrix.native_targets }} - - name: Build native addon (bazel) - if: matrix.platform == 'darwin' - uses: ./.github/actions/bazel-natives - with: - targets: ${{ matrix.native_targets }} - cache-scope: release-${{ matrix.target_id }} - name: Build release binary env: RELEASE_TARGETS: ${{ matrix.target_id }} run: bun run ci:release:build-binaries - - name: Sign and notarize macOS binary (Developer ID) - # Replaces the ad-hoc signature with a Developer ID + hardened-runtime - # one (+JIT/library-validation entitlements; omp dlopens its - # runtime-extracted native addon, which has a different Team ID) and - # notarizes. Auto-skips until the APPLE_* secrets are configured. - if: matrix.platform == 'darwin' && env.MACOS_SIGNING == 'true' - env: - APPLE_CERTIFICATE_P12: ${{ secrets.APPLE_CERTIFICATE_P12 }} - APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }} - APPLE_API_KEY_ID: ${{ secrets.APPLE_API_KEY_ID }} - APPLE_API_ISSUER_ID: ${{ secrets.APPLE_API_ISSUER_ID }} - APPLE_API_KEY: ${{ secrets.APPLE_API_KEY }} - run: bash scripts/ci-macos-sign.sh "${{ matrix.binary_path }}" # Windows binary is cross-built on Linux, so we have no Windows runner # to smoke it on. Cross-build correctness is verified via the bun # `--compile --target=bun-windows-x64-*` cross-compile. Musl binaries @@ -557,25 +526,168 @@ jobs: HOME="$runtime_dir/home" XDG_DATA_HOME="$runtime_dir/xdg" omp --version HOME="$runtime_dir/home" XDG_DATA_HOME="$runtime_dir/xdg" omp --smoke-test ' - - name: Publish native addon package - if: ${{ !inputs.skip_npm && matrix.libc != 'musl' }} - env: - # Fallback auth: setup-node wrote an .npmrc referencing - # NODE_AUTH_TOKEN; npm uses it only when OIDC has no trusted - # publisher for the package (or on a first publish). - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - run: bun run ci:release:publish-native-leaf ${{ matrix.target_id }} - name: Upload release binary artifact uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: omp-binary-${{ matrix.target_id }} path: ${{ matrix.binary_path }} + # Darwin release builds are the longest leg of a release (bazel-built + # addons on macOS runners), build their own addons, and touch nothing from + # native_addons — so they gate on release_metadata alone and start the + # moment the release run is detected, fully overlapped with the tests. + release_binary_darwin: + name: "Release binary: ${{ matrix.target_id }}" + if: ${{ needs.release_metadata.outputs.is-release == 'true' && !cancelled() }} + needs: [release_metadata] + strategy: + fail-fast: false + matrix: + include: + - { + os: macos-15-intel, + target_id: darwin-x64, + binary_path: packages/coding-agent/binaries/omp-darwin-x64, + native_targets: darwin-x64-baseline, + } + - { + os: macos-14, + target_id: darwin-arm64, + binary_path: packages/coding-agent/binaries/omp-darwin-arm64, + native_targets: darwin-arm64, + } + runs-on: ${{ matrix.os }} + permissions: + contents: read + env: + MACOS_SIGNING: ${{ secrets.APPLE_CERTIFICATE_P12 != '' && secrets.APPLE_CERTIFICATE_PASSWORD != '' && secrets.APPLE_API_KEY_ID != '' && secrets.APPLE_API_ISSUER_ID != '' && secrets.APPLE_API_KEY != '' }} + steps: + - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0 + with: + bun-version: "1.3" + - name: Cache bun dependencies + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 + with: + path: ~/.bun/install/cache + key: bun-${{ runner.os }}-${{ hashFiles('**/bun.lock') }} + - run: bun install --frozen-lockfile + # Darwin runners build their own architecture; cross-hosted artifacts + # do not exist for macOS. The warm workflow keeps these scopes seeded + # near HEAD, so this is normally the version-bump delta. + - name: Build native addon (bazel) + uses: ./.github/actions/bazel-natives + with: + targets: ${{ matrix.native_targets }} + cache-scope: release-${{ matrix.target_id }} + - name: Build release binary + env: + RELEASE_TARGETS: ${{ matrix.target_id }} + run: bun run ci:release:build-binaries + - name: Sign and notarize macOS binary (Developer ID) + # Replaces the ad-hoc signature with a Developer ID + hardened-runtime + # one (+JIT/library-validation entitlements; omp dlopens its + # runtime-extracted native addon, which has a different Team ID) and + # notarizes. Auto-skips until the APPLE_* secrets are configured. + if: env.MACOS_SIGNING == 'true' + env: + APPLE_CERTIFICATE_P12: ${{ secrets.APPLE_CERTIFICATE_P12 }} + APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }} + APPLE_API_KEY_ID: ${{ secrets.APPLE_API_KEY_ID }} + APPLE_API_ISSUER_ID: ${{ secrets.APPLE_API_ISSUER_ID }} + APPLE_API_KEY: ${{ secrets.APPLE_API_KEY }} + run: bash scripts/ci-macos-sign.sh "${{ matrix.binary_path }}" + - name: Smoke release binary + run: | + runtime_dir="$(mktemp -d)" + HOME="$runtime_dir/home" XDG_DATA_HOME="$runtime_dir/xdg" "${{ matrix.binary_path }}" --version + HOME="$runtime_dir/home" XDG_DATA_HOME="$runtime_dir/xdg" "${{ matrix.binary_path }}" --smoke-test + # Darwin addons exist only on these runners; export them so + # release_native_leaves can publish every leaf package after the + # validation gate. Non-darwin leaves reuse the native-addons artifact. + - name: Upload darwin native addon artifact + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: native-addons-${{ matrix.target_id }} + path: packages/natives/native/pi_natives.${{ matrix.target_id }}*.node + if-no-files-found: error + retention-days: 1 + - name: Upload release binary artifact + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: omp-binary-${{ matrix.target_id }} + path: ${{ matrix.binary_path }} + + # Publishes the five @oh-my-pi/pi-natives- leaf packages once + # validation passes and every binary built. Runs on one linux runner: leaf + # publishing is platform-agnostic file packaging (gen-npm-packages reads + # packages/natives/native), so no per-platform runners are needed. + release_native_leaves: + name: Publish native leaf packages + if: ${{ needs.release_metadata.outputs.is-release == 'true' && !cancelled() && + needs.release_gate.result == 'success' && + needs.release_binary.result == 'success' && + needs.release_binary_darwin.result == 'success' && + !inputs.skip_npm }} + needs: [release_metadata, release_gate, release_binary, release_binary_darwin] + runs-on: ubuntu-22.04 + # id-token lets npm mint the OIDC token for trusted publishing; the + # NODE_AUTH_TOKEN below is the fallback for unconfigured packages. + permissions: + id-token: write + contents: read + steps: + - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0 + with: + bun-version: "1.3" + - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 + with: + node-version: "24" + registry-url: "https://registry.npmjs.org" + # npm runs under Bun when invoked by the release script; npm 12 + # requires a newer emulated Node version than Bun 1.3 provides. + - name: Ensure npm supports trusted publishing + run: npm install -g npm@11.17.0 + - name: Cache bun dependencies + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 + with: + path: ~/.bun/install/cache + key: bun-${{ runner.os }}-${{ hashFiles('**/bun.lock') }} + - run: bun install --frozen-lockfile + # Linux + win32 addons from the native_addons artifact (gnu targets + # only — musl reuses the linux filenames and has no leaf package). + - name: Install linux and win32 native addons + uses: ./.github/actions/native-artifacts + with: + targets: linux-x64-baseline linux-x64-modern linux-arm64 win32-x64-baseline + # Darwin addons come flat (canonical filenames) from the + # release_binary_darwin legs. + - name: Install darwin native addons + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + pattern: native-addons-darwin-* + path: packages/natives/native + merge-multiple: true + - name: Publish native leaf packages + env: + # Fallback auth: setup-node wrote an .npmrc referencing + # NODE_AUTH_TOKEN; npm uses it only when OIDC has no trusted + # publisher for the package (or on a first publish). + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + run: | + set -euo pipefail + for tag in linux-x64 linux-arm64 darwin-x64 darwin-arm64 win32-x64; do + bun run ci:release:publish-native-leaf "$tag" + done + release_github: name: Publish GitHub release if: ${{ needs.release_metadata.outputs.is-release == 'true' && !cancelled() && - needs.release_binary.result == 'success' }} - needs: [release_metadata, release_binary] + needs.release_gate.result == 'success' && + needs.release_binary.result == 'success' && + needs.release_binary_darwin.result == 'success' }} + needs: [release_metadata, release_gate, release_binary, release_binary_darwin] runs-on: ubuntu-22.04 permissions: contents: write @@ -646,9 +758,14 @@ jobs: name: Publish to npm if: ${{ needs.release_metadata.outputs.is-release == 'true' && !cancelled() && needs.release_binary.result == 'success' && + needs.release_binary_darwin.result == 'success' && needs.release_github_verify.result == 'success' && + needs.release_native_leaves.result == 'success' && !inputs.skip_npm }} - needs: [release_metadata, release_binary, release_github_verify] + # release_native_leaves must finish first: the core package lists the + # leaf packages as lockstep-versioned optionalDependencies, so installs + # resolve them the moment the core version is live. + needs: [release_metadata, release_binary, release_binary_darwin, release_github_verify, release_native_leaves] runs-on: ubuntu-22.04 # `id-token: write` lets npm mint the GitHub OIDC token it exchanges for a # short-lived publish token (trusted publishing + provenance). When a diff --git a/Cargo.lock b/Cargo.lock index 0d26b34a2..ff178c6c4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4818,9 +4818,7 @@ dependencies = [ "anyhow", "arboard", "ast-grep-core", - "audiopus_sys", "base64", - "bytes", "clap", "clipboard-win", "core-graphics", @@ -4838,17 +4836,16 @@ dependencies = [ "image", "inferno", "libc", - "maudio", "napi", "napi-build", "napi-derive", - "opus", "parking_lot", "phf 0.13.1", "pi-ast", "pi-iso", "pi-shell", "pi-uutils-ctx", + "pi-voice", "pi-walker", "png", "portable-pty", @@ -4865,7 +4862,6 @@ dependencies = [ "toml", "unicode-segmentation", "unicode-width 0.2.2", - "webrtc", "windows-sys 0.61.2", "winreg 0.56.0", "x11rb", @@ -4961,6 +4957,20 @@ dependencies = [ "libc", ] +[[package]] +name = "pi-voice" +version = "17.1.8" +dependencies = [ + "audiopus_sys", + "bytes", + "flume", + "maudio", + "opus", + "parking_lot", + "tokio", + "webrtc", +] + [[package]] name = "pi-walker" version = "17.1.8" diff --git a/Cargo.toml b/Cargo.toml index 0aec4ace9..79868c335 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -177,6 +177,7 @@ too_many_lines = "allow" # Arbitrary limits don't account for necessary comp pi-ast = { path = "crates/pi-ast" } pi-iso = { path = "crates/pi-iso" } pi-shell = { path = "crates/pi-shell" } +pi-voice = { path = "crates/pi-voice" } pi-walker = { path = "crates/pi-walker" } brush-core = { path = "crates/vendor/brush-core" } brush-builtins = { path = "crates/vendor/brush-builtins" } diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock index 6074ca2f6..7a0a4e221 100644 --- a/MODULE.bazel.lock +++ b/MODULE.bazel.lock @@ -479,11 +479,11 @@ "REPO_MAPPING:rules_rust+,bazel_skylib bazel_skylib+", "REPO_MAPPING:rules_rust+,bazel_tools bazel_tools", "REPO_MAPPING:rules_rust+,rules_cc rules_cc+", - "FILE:@@//Cargo.lock 2f6175327e3eda9efe339c2763039c5f6d6b0eb819e5c03f7f30a23043f7fceb", - "FILE:@@//Cargo.toml 87e9784018cdcabbe49ea960b2bf2fb5b7023e94f5d13248fad93b03d2945a13", + "FILE:@@//Cargo.lock e4832f453a923b7f3dd3f1f5e1c43d4f6b583003085e129074e870ca8498fbfe", + "FILE:@@//Cargo.toml 71321e61d1afb06e31359b4d1936d07133ddda97ad1b02a5416ef23a208e3ce4", "FILE:@@//crates/pi-ast/Cargo.toml 4467b5854e91088ad1669756f7a0aaec3c2208fc28057a29982ccc902ecaf356", "FILE:@@//crates/pi-iso/Cargo.toml 1cd7ed7e5e8cbe9b1683f38f1250d475d6bec29cd84c757af817eb5a79cffdb2", - "FILE:@@//crates/pi-natives/Cargo.toml 2fac3e444359f388843cc26e2cb70902490e9e5dd3e97e1c7410c18f85518e57", + "FILE:@@//crates/pi-natives/Cargo.toml 1d575044e37ceabd9dd029f273b56c50012da463833333298535232fa88a94b8", "FILE:@@//crates/pi-shell/Cargo.toml dff7badd2729fe8ba492500bab6119cb994f3d0bb21d559587b2c6a17168408a", "FILE:@@//crates/vendor/brush-builtins/Cargo.toml 9799575fe609133927291fbca4c4e190e0378c7efe20aa9f66bb0ae6a08cb6ef", "FILE:@@//crates/vendor/brush-core/Cargo.toml a15b65352d399a599153c739a69064c82c12170fd989bf96adeaee87bed98c2c", @@ -537,16 +537,17 @@ "FILE:@@//crates/vendor/uu-wc/Cargo.toml 9af4d9fe9f1bb66a4b838e0ac7d51d6f331e39576e86b0836f39cbe9a3432a92", "FILE:@@//crates/vendor/uu-whoami/Cargo.toml 4d2e3cd67fc1408641dca3f77c754dfc245777d5c3f1260014694632e4c48540", "FILE:@@//crates/vendor/uu-xargs/Cargo.toml ecd2699904131db4fac1592793816a1e063f57100d5e599da095adcf919b27ef", - "FILE:@@//crates/vendor/uu-yes/Cargo.toml 6a717ee1ec2f45d388858c3e2333e315532f8cbc4e30805ad5cece19cb59a4dc" + "FILE:@@//crates/vendor/uu-yes/Cargo.toml 6a717ee1ec2f45d388858c3e2333e315532f8cbc4e30805ad5cece19cb59a4dc", + "FILE:@@//crates/pi-voice/Cargo.toml 688e136b939a030ae8d8ddac9adaff0513db4c038477550cbfb9f6a97a71176e" ], "generatedRepoSpecs": { "crates": { "repoRuleId": "@@rules_rust+//crate_universe/private:crates_vendor.bzl%crates_vendor_remote_repository", "attributes": { "contents": { - "BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files(\n [\n \"cargo-bazel.json\",\n \"crates.bzl\",\n \"defs.bzl\",\n ] + glob(\n allow_empty = True,\n include = [\"*.bazel\"],\n ),\n)\n\nfilegroup(\n name = \"srcs\",\n srcs = glob(\n allow_empty = True,\n include = [\n \"*.bazel\",\n \"*.bzl\",\n ],\n ),\n)\n\n# Workspace Member Dependencies\nalias(\n name = \"ansi-width-0.1.0\",\n actual = \"@crates__ansi-width-0.1.0//:ansi_width\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"ansi-width\",\n actual = \"@crates__ansi-width-0.1.0//:ansi_width\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"anyhow-1.0.104\",\n actual = \"@crates__anyhow-1.0.104//:anyhow\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"anyhow\",\n actual = \"@crates__anyhow-1.0.104//:anyhow\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"arboard-3.6.1\",\n actual = \"@crates__arboard-3.6.1//:arboard\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"arboard\",\n actual = \"@crates__arboard-3.6.1//:arboard\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"argmax-0.3.1\",\n actual = \"@crates__argmax-0.3.1//:argmax\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"argmax\",\n actual = \"@crates__argmax-0.3.1//:argmax\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"ast-grep-core-0.39.9\",\n actual = \"@crates__ast-grep-core-0.39.9//:ast_grep_core\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"ast-grep-core\",\n actual = \"@crates__ast-grep-core-0.39.9//:ast_grep_core\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"async-recursion-1.1.1\",\n actual = \"@crates__async-recursion-1.1.1//:async_recursion\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"async-recursion\",\n actual = \"@crates__async-recursion-1.1.1//:async_recursion\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"async-trait-0.1.91\",\n actual = \"@crates__async-trait-0.1.91//:async_trait\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"async-trait\",\n actual = \"@crates__async-trait-0.1.91//:async_trait\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"audiopus_sys-0.2.2\",\n actual = \"@crates__audiopus_sys-0.2.2//:audiopus_sys\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"audiopus_sys\",\n actual = \"@crates__audiopus_sys-0.2.2//:audiopus_sys\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"base64-0.22.1\",\n actual = \"@crates__base64-0.22.1//:base64\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"base64\",\n actual = \"@crates__base64-0.22.1//:base64\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"base64-simd-0.8.0\",\n actual = \"@crates__base64-simd-0.8.0//:base64_simd\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"base64-simd\",\n actual = \"@crates__base64-simd-0.8.0//:base64_simd\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"bigdecimal-0.4.10\",\n actual = \"@crates__bigdecimal-0.4.10//:bigdecimal\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"bigdecimal\",\n actual = \"@crates__bigdecimal-0.4.10//:bigdecimal\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"binary-heap-plus-0.5.0\",\n actual = \"@crates__binary-heap-plus-0.5.0//:binary_heap_plus\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"binary-heap-plus\",\n actual = \"@crates__binary-heap-plus-0.5.0//:binary_heap_plus\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"bon-3.9.3\",\n actual = \"@crates__bon-3.9.3//:bon\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"bon\",\n actual = \"@crates__bon-3.9.3//:bon\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"brush-parser-0.3.0\",\n actual = \"@crates__brush-parser-0.3.0//:brush_parser\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"brush-parser-0.4.0\",\n actual = \"@crates__brush-parser-0.4.0//:brush_parser\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"bstr-1.13.0\",\n actual = \"@crates__bstr-1.13.0//:bstr\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"bstr\",\n actual = \"@crates__bstr-1.13.0//:bstr\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"bytecount-0.6.9\",\n actual = \"@crates__bytecount-0.6.9//:bytecount\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"bytecount\",\n actual = \"@crates__bytecount-0.6.9//:bytecount\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"bytes-1.12.1\",\n actual = \"@crates__bytes-1.12.1//:bytes\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"bytes\",\n actual = \"@crates__bytes-1.12.1//:bytes\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"cached-0.59.0\",\n actual = \"@crates__cached-0.59.0//:cached\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"cached\",\n actual = \"@crates__cached-0.59.0//:cached\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"cfg-if-1.0.4\",\n actual = \"@crates__cfg-if-1.0.4//:cfg_if\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"cfg-if\",\n actual = \"@crates__cfg-if-1.0.4//:cfg_if\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"check_elevation-0.2.7\",\n actual = \"@crates__check_elevation-0.2.7//:check_elevation\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"check_elevation\",\n actual = \"@crates__check_elevation-0.2.7//:check_elevation\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"chrono-0.4.45\",\n actual = \"@crates__chrono-0.4.45//:chrono\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"chrono\",\n actual = \"@crates__chrono-0.4.45//:chrono\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"clap-4.6.4\",\n actual = \"@crates__clap-4.6.4//:clap\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"clap\",\n actual = \"@crates__clap-4.6.4//:clap\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"clipboard-win-5.4.1\",\n actual = \"@crates__clipboard-win-5.4.1//:clipboard_win\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"clipboard-win\",\n actual = \"@crates__clipboard-win-5.4.1//:clipboard_win\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"codesnake-0.2.1\",\n actual = \"@crates__codesnake-0.2.1//:codesnake\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"codesnake\",\n actual = \"@crates__codesnake-0.2.1//:codesnake\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"color-print-0.3.7\",\n actual = \"@crates__color-print-0.3.7//:color_print\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"color-print\",\n actual = \"@crates__color-print-0.3.7//:color_print\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"command-fds-0.3.3\",\n actual = \"@crates__command-fds-0.3.3//:command_fds\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"command-fds\",\n actual = \"@crates__command-fds-0.3.3//:command_fds\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"compare-0.1.0\",\n actual = \"@crates__compare-0.1.0//:compare\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"compare\",\n actual = \"@crates__compare-0.1.0//:compare\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"core-graphics-0.25.0\",\n actual = \"@crates__core-graphics-0.25.0//:core_graphics\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"core-graphics\",\n actual = \"@crates__core-graphics-0.25.0//:core_graphics\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"dashmap-6.2.1\",\n actual = \"@crates__dashmap-6.2.1//:dashmap\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"dashmap\",\n actual = \"@crates__dashmap-6.2.1//:dashmap\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"dns-lookup-3.0.1\",\n actual = \"@crates__dns-lookup-3.0.1//:dns_lookup\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"dns-lookup\",\n actual = \"@crates__dns-lookup-3.0.1//:dns_lookup\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"enigo-0.6.1\",\n actual = \"@crates__enigo-0.6.1//:enigo\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"enigo\",\n actual = \"@crates__enigo-0.6.1//:enigo\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"faccess-0.2.4\",\n actual = \"@crates__faccess-0.2.4//:faccess\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"faccess\",\n actual = \"@crates__faccess-0.2.4//:faccess\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"fancy-regex-0.17.0\",\n actual = \"@crates__fancy-regex-0.17.0//:fancy_regex\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"fancy-regex-0.18.0\",\n actual = \"@crates__fancy-regex-0.18.0//:fancy_regex\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"filetime-0.2.29\",\n actual = \"@crates__filetime-0.2.29//:filetime\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"filetime\",\n actual = \"@crates__filetime-0.2.29//:filetime\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"flume-0.11.1\",\n actual = \"@crates__flume-0.11.1//:flume\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"flume\",\n actual = \"@crates__flume-0.11.1//:flume\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"foldhash-0.2.0\",\n actual = \"@crates__foldhash-0.2.0//:foldhash\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"foldhash\",\n actual = \"@crates__foldhash-0.2.0//:foldhash\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"fontdue-0.9.3\",\n actual = \"@crates__fontdue-0.9.3//:fontdue\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"fontdue\",\n actual = \"@crates__fontdue-0.9.3//:fontdue\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"fs_extra-1.3.0\",\n actual = \"@crates__fs_extra-1.3.0//:fs_extra\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"fs_extra\",\n actual = \"@crates__fs_extra-1.3.0//:fs_extra\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"futures-0.3.33\",\n actual = \"@crates__futures-0.3.33//:futures\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"futures\",\n actual = \"@crates__futures-0.3.33//:futures\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"getrandom-0.4.3\",\n actual = \"@crates__getrandom-0.4.3//:getrandom\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"getrandom\",\n actual = \"@crates__getrandom-0.4.3//:getrandom\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"glob-0.3.4\",\n actual = \"@crates__glob-0.3.4//:glob\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"glob\",\n actual = \"@crates__glob-0.3.4//:glob\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"globset-0.4.19\",\n actual = \"@crates__globset-0.4.19//:globset\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"globset\",\n actual = \"@crates__globset-0.4.19//:globset\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"grep-cli-0.1.12\",\n actual = \"@crates__grep-cli-0.1.12//:grep_cli\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"grep-cli\",\n actual = \"@crates__grep-cli-0.1.12//:grep_cli\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"grep-matcher-0.1.9\",\n actual = \"@crates__grep-matcher-0.1.9//:grep_matcher\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"grep-matcher\",\n actual = \"@crates__grep-matcher-0.1.9//:grep_matcher\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"grep-pcre2-0.1.10\",\n actual = \"@crates__grep-pcre2-0.1.10//:grep_pcre2\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"grep-pcre2\",\n actual = \"@crates__grep-pcre2-0.1.10//:grep_pcre2\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"grep-printer-0.3.1\",\n actual = \"@crates__grep-printer-0.3.1//:grep_printer\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"grep-printer\",\n actual = \"@crates__grep-printer-0.3.1//:grep_printer\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"grep-regex-0.1.14\",\n actual = \"@crates__grep-regex-0.1.14//:grep_regex\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"grep-regex\",\n actual = \"@crates__grep-regex-0.1.14//:grep_regex\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"grep-searcher-0.1.17\",\n actual = \"@crates__grep-searcher-0.1.17//:grep_searcher\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"grep-searcher\",\n actual = \"@crates__grep-searcher-0.1.17//:grep_searcher\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"hex-0.4.3\",\n actual = \"@crates__hex-0.4.3//:hex\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"hex\",\n actual = \"@crates__hex-0.4.3//:hex\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"hifijson-0.2.3\",\n actual = \"@crates__hifijson-0.2.3//:hifijson\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"hifijson\",\n actual = \"@crates__hifijson-0.2.3//:hifijson\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"hostname-0.4.2\",\n actual = \"@crates__hostname-0.4.2//:hostname\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"hostname\",\n actual = \"@crates__hostname-0.4.2//:hostname\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"html-to-markdown-rs-2.30.0\",\n actual = \"@crates__html-to-markdown-rs-2.30.0//:html_to_markdown_rs\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"html-to-markdown-rs\",\n actual = \"@crates__html-to-markdown-rs-2.30.0//:html_to_markdown_rs\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"icy_sixel-0.5.0\",\n actual = \"@crates__icy_sixel-0.5.0//:icy_sixel\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"icy_sixel\",\n actual = \"@crates__icy_sixel-0.5.0//:icy_sixel\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"ignore-0.4.31\",\n actual = \"@crates__ignore-0.4.31//:ignore\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"ignore\",\n actual = \"@crates__ignore-0.4.31//:ignore\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"image-0.25.10\",\n actual = \"@crates__image-0.25.10//:image\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"image\",\n actual = \"@crates__image-0.25.10//:image\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"indicatif-0.18.6\",\n actual = \"@crates__indicatif-0.18.6//:indicatif\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"indicatif\",\n actual = \"@crates__indicatif-0.18.6//:indicatif\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"inferno-0.12.8\",\n actual = \"@crates__inferno-0.12.8//:inferno\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"inferno\",\n actual = \"@crates__inferno-0.12.8//:inferno\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"inherent-1.0.14\",\n actual = \"@crates__inherent-1.0.14//:inherent\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"inherent\",\n actual = \"@crates__inherent-1.0.14//:inherent\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"itertools-0.14.0\",\n actual = \"@crates__itertools-0.14.0//:itertools\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"itertools\",\n actual = \"@crates__itertools-0.14.0//:itertools\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"jaq-core-2.2.1\",\n actual = \"@crates__jaq-core-2.2.1//:jaq_core\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"jaq-core\",\n actual = \"@crates__jaq-core-2.2.1//:jaq_core\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"jaq-json-1.1.3\",\n actual = \"@crates__jaq-json-1.1.3//:jaq_json\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"jaq-json\",\n actual = \"@crates__jaq-json-1.1.3//:jaq_json\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"jaq-std-2.1.2\",\n actual = \"@crates__jaq-std-2.1.2//:jaq_std\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"jaq-std\",\n actual = \"@crates__jaq-std-2.1.2//:jaq_std\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"jiff-0.2.35\",\n actual = \"@crates__jiff-0.2.35//:jiff\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"jiff\",\n actual = \"@crates__jiff-0.2.35//:jiff\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"libc-0.2.189\",\n actual = \"@crates__libc-0.2.189//:libc\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"libc\",\n actual = \"@crates__libc-0.2.189//:libc\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"lscolors-0.21.0\",\n actual = \"@crates__lscolors-0.21.0//:lscolors\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"lscolors\",\n actual = \"@crates__lscolors-0.21.0//:lscolors\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"maudio-0.1.6\",\n actual = \"@crates__maudio-0.1.6//:maudio\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"maudio\",\n actual = \"@crates__maudio-0.1.6//:maudio\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"memchr-2.8.3\",\n actual = \"@crates__memchr-2.8.3//:memchr\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"memchr\",\n actual = \"@crates__memchr-2.8.3//:memchr\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"memmap2-0.9.11\",\n actual = \"@crates__memmap2-0.9.11//:memmap2\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"memmap2\",\n actual = \"@crates__memmap2-0.9.11//:memmap2\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"napi-3.11.0\",\n actual = \"@crates__napi-3.11.0//:napi\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"napi\",\n actual = \"@crates__napi-3.11.0//:napi\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"napi-build-2.3.2\",\n actual = \"@crates__napi-build-2.3.2//:napi_build\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"napi-build\",\n actual = \"@crates__napi-build-2.3.2//:napi_build\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"napi-derive-3.6.0\",\n actual = \"@crates__napi-derive-3.6.0//:napi_derive\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"napi-derive\",\n actual = \"@crates__napi-derive-3.6.0//:napi_derive\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"nix-0.29.0\",\n actual = \"@crates__nix-0.29.0//:nix\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"nix-0.31.3\",\n actual = \"@crates__nix-0.31.3//:nix\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"nom-8.0.0\",\n actual = \"@crates__nom-8.0.0//:nom\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"nom\",\n actual = \"@crates__nom-8.0.0//:nom\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"normalize-path-0.2.1\",\n actual = \"@crates__normalize-path-0.2.1//:normalize_path\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"normalize-path\",\n actual = \"@crates__normalize-path-0.2.1//:normalize_path\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"notify-8.2.0\",\n actual = \"@crates__notify-8.2.0//:notify\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"notify\",\n actual = \"@crates__notify-8.2.0//:notify\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"num-bigint-0.4.8\",\n actual = \"@crates__num-bigint-0.4.8//:num_bigint\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"num-bigint\",\n actual = \"@crates__num-bigint-0.4.8//:num_bigint\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"num-traits-0.2.19\",\n actual = \"@crates__num-traits-0.2.19//:num_traits\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"num-traits\",\n actual = \"@crates__num-traits-0.2.19//:num_traits\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"onig-6.5.3\",\n actual = \"@crates__onig-6.5.3//:onig\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"onig\",\n actual = \"@crates__onig-6.5.3//:onig\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"opus-0.3.1\",\n actual = \"@crates__opus-0.3.1//:opus\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"opus\",\n actual = \"@crates__opus-0.3.1//:opus\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"os_display-0.1.4\",\n actual = \"@crates__os_display-0.1.4//:os_display\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"os_display\",\n actual = \"@crates__os_display-0.1.4//:os_display\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"os_pipe-1.2.3\",\n actual = \"@crates__os_pipe-1.2.3//:os_pipe\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"os_pipe\",\n actual = \"@crates__os_pipe-1.2.3//:os_pipe\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"parking_lot-0.12.5\",\n actual = \"@crates__parking_lot-0.12.5//:parking_lot\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"parking_lot\",\n actual = \"@crates__parking_lot-0.12.5//:parking_lot\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"parse_datetime-0.14.0\",\n actual = \"@crates__parse_datetime-0.14.0//:parse_datetime\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"parse_datetime\",\n actual = \"@crates__parse_datetime-0.14.0//:parse_datetime\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"phf-0.13.1\",\n actual = \"@crates__phf-0.13.1//:phf\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"phf\",\n actual = \"@crates__phf-0.13.1//:phf\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"pi-shell-17.1.7\",\n actual = \"@crates__pi-shell-17.1.7//:pi_shell\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"pi-shell\",\n actual = \"@crates__pi-shell-17.1.7//:pi_shell\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"platform-info-2.1.0\",\n actual = \"@crates__platform-info-2.1.0//:platform_info\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"platform-info\",\n actual = \"@crates__platform-info-2.1.0//:platform_info\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"png-0.18.1\",\n actual = \"@crates__png-0.18.1//:png\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"png\",\n actual = \"@crates__png-0.18.1//:png\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"portable-pty-0.9.0\",\n actual = \"@crates__portable-pty-0.9.0//:portable_pty\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"portable-pty\",\n actual = \"@crates__portable-pty-0.9.0//:portable_pty\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"pretty_assertions-1.4.1\",\n actual = \"@crates__pretty_assertions-1.4.1//:pretty_assertions\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"pretty_assertions\",\n actual = \"@crates__pretty_assertions-1.4.1//:pretty_assertions\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"procfs-0.18.0\",\n actual = \"@crates__procfs-0.18.0//:procfs\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"procfs\",\n actual = \"@crates__procfs-0.18.0//:procfs\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rand-0.10.2\",\n actual = \"@crates__rand-0.10.2//:rand\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rand\",\n actual = \"@crates__rand-0.10.2//:rand\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rayon-1.12.0\",\n actual = \"@crates__rayon-1.12.0//:rayon\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rayon\",\n actual = \"@crates__rayon-1.12.0//:rayon\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"regex-1.13.1\",\n actual = \"@crates__regex-1.13.1//:regex\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"regex\",\n actual = \"@crates__regex-1.13.1//:regex\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rlimit-0.11.0\",\n actual = \"@crates__rlimit-0.11.0//:rlimit\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rlimit\",\n actual = \"@crates__rlimit-0.11.0//:rlimit\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rpds-1.2.1\",\n actual = \"@crates__rpds-1.2.1//:rpds\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rpds\",\n actual = \"@crates__rpds-1.2.1//:rpds\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rstest-0.26.1\",\n actual = \"@crates__rstest-0.26.1//:rstest\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rstest\",\n actual = \"@crates__rstest-0.26.1//:rstest\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rustc-hash-2.1.3\",\n actual = \"@crates__rustc-hash-2.1.3//:rustc_hash\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rustc-hash\",\n actual = \"@crates__rustc-hash-2.1.3//:rustc_hash\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rustix-1.1.4\",\n actual = \"@crates__rustix-1.1.4//:rustix\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rustix\",\n actual = \"@crates__rustix-1.1.4//:rustix\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"self_cell-1.3.0\",\n actual = \"@crates__self_cell-1.3.0//:self_cell\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"self_cell\",\n actual = \"@crates__self_cell-1.3.0//:self_cell\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"serde-1.0.229\",\n actual = \"@crates__serde-1.0.229//:serde\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"serde\",\n actual = \"@crates__serde-1.0.229//:serde\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"serde_json-1.0.151\",\n actual = \"@crates__serde_json-1.0.151//:serde_json\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"serde_json\",\n actual = \"@crates__serde_json-1.0.151//:serde_json\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"similar-3.1.1\",\n actual = \"@crates__similar-3.1.1//:similar\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"similar\",\n actual = \"@crates__similar-3.1.1//:similar\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"smallvec-1.15.2\",\n actual = \"@crates__smallvec-1.15.2//:smallvec\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"smallvec\",\n actual = \"@crates__smallvec-1.15.2//:smallvec\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"strum-0.28.0\",\n actual = \"@crates__strum-0.28.0//:strum\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"strum\",\n actual = \"@crates__strum-0.28.0//:strum\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"strum_macros-0.28.0\",\n actual = \"@crates__strum_macros-0.28.0//:strum_macros\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"strum_macros\",\n actual = \"@crates__strum_macros-0.28.0//:strum_macros\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"syntect-5.3.0\",\n actual = \"@crates__syntect-5.3.0//:syntect\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"syntect\",\n actual = \"@crates__syntect-5.3.0//:syntect\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tempfile-3.27.0\",\n actual = \"@crates__tempfile-3.27.0//:tempfile\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tempfile\",\n actual = \"@crates__tempfile-3.27.0//:tempfile\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"terminfo-0.9.0\",\n actual = \"@crates__terminfo-0.9.0//:terminfo\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"terminfo\",\n actual = \"@crates__terminfo-0.9.0//:terminfo\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"thiserror-2.0.19\",\n actual = \"@crates__thiserror-2.0.19//:thiserror\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"thiserror\",\n actual = \"@crates__thiserror-2.0.19//:thiserror\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tiktoken-rs-0.11.0\",\n actual = \"@crates__tiktoken-rs-0.11.0//:tiktoken_rs\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tiktoken-rs\",\n actual = \"@crates__tiktoken-rs-0.11.0//:tiktoken_rs\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tokio-1.53.1\",\n actual = \"@crates__tokio-1.53.1//:tokio\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tokio\",\n actual = \"@crates__tokio-1.53.1//:tokio\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tokio-util-0.7.19\",\n actual = \"@crates__tokio-util-0.7.19//:tokio_util\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tokio-util\",\n actual = \"@crates__tokio-util-0.7.19//:tokio_util\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"toml-1.1.3+spec-1.1.0\",\n actual = \"@crates__toml-1.1.3-spec-1.1.0//:toml\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"toml\",\n actual = \"@crates__toml-1.1.3-spec-1.1.0//:toml\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tracing-0.1.44\",\n actual = \"@crates__tracing-0.1.44//:tracing\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tracing\",\n actual = \"@crates__tracing-0.1.44//:tracing\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-0.25.10\",\n actual = \"@crates__tree-sitter-0.25.10//:tree_sitter\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter\",\n actual = \"@crates__tree-sitter-0.25.10//:tree_sitter\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-astro-next-0.1.1\",\n actual = \"@crates__tree-sitter-astro-next-0.1.1//:tree_sitter_astro_next\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree_sitter_astro-0.1.1\",\n actual = \"@crates__tree-sitter-astro-next-0.1.1//:tree_sitter_astro_next\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree_sitter_astro\",\n actual = \"@crates__tree-sitter-astro-next-0.1.1//:tree_sitter_astro_next\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-bash-0.25.1\",\n actual = \"@crates__tree-sitter-bash-0.25.1//:tree_sitter_bash\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-bash\",\n actual = \"@crates__tree-sitter-bash-0.25.1//:tree_sitter_bash\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-c-0.24.2\",\n actual = \"@crates__tree-sitter-c-0.24.2//:tree_sitter_c\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-c\",\n actual = \"@crates__tree-sitter-c-0.24.2//:tree_sitter_c\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-c-sharp-0.23.5\",\n actual = \"@crates__tree-sitter-c-sharp-0.23.5//:tree_sitter_c_sharp\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-c-sharp\",\n actual = \"@crates__tree-sitter-c-sharp-0.23.5//:tree_sitter_c_sharp\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-clojure-0.1.0\",\n actual = \"@crates__tree-sitter-clojure-0.1.0//:tree_sitter_clojure\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-clojure\",\n actual = \"@crates__tree-sitter-clojure-0.1.0//:tree_sitter_clojure\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-cmake-0.7.4\",\n actual = \"@crates__tree-sitter-cmake-0.7.4//:tree_sitter_cmake\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-cmake\",\n actual = \"@crates__tree-sitter-cmake-0.7.4//:tree_sitter_cmake\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-cpp-0.23.4\",\n actual = \"@crates__tree-sitter-cpp-0.23.4//:tree_sitter_cpp\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-cpp\",\n actual = \"@crates__tree-sitter-cpp-0.23.4//:tree_sitter_cpp\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-css-0.25.0\",\n actual = \"@crates__tree-sitter-css-0.25.0//:tree_sitter_css\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-css\",\n actual = \"@crates__tree-sitter-css-0.25.0//:tree_sitter_css\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-dart-0.2.0\",\n actual = \"@crates__tree-sitter-dart-0.2.0//:tree_sitter_dart\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-dart\",\n actual = \"@crates__tree-sitter-dart-0.2.0//:tree_sitter_dart\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-diff-0.1.0\",\n actual = \"@crates__tree-sitter-diff-0.1.0//:tree_sitter_diff\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-diff\",\n actual = \"@crates__tree-sitter-diff-0.1.0//:tree_sitter_diff\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-dockerfile-updated-0.2.0\",\n actual = \"@crates__tree-sitter-dockerfile-updated-0.2.0//:tree_sitter_dockerfile_updated\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree_sitter_dockerfile-0.2.0\",\n actual = \"@crates__tree-sitter-dockerfile-updated-0.2.0//:tree_sitter_dockerfile_updated\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree_sitter_dockerfile\",\n actual = \"@crates__tree-sitter-dockerfile-updated-0.2.0//:tree_sitter_dockerfile_updated\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-elisp-1.6.1\",\n actual = \"@crates__tree-sitter-elisp-1.6.1//:tree_sitter_elisp\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-elisp\",\n actual = \"@crates__tree-sitter-elisp-1.6.1//:tree_sitter_elisp\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-elixir-0.3.5\",\n actual = \"@crates__tree-sitter-elixir-0.3.5//:tree_sitter_elixir\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-elixir\",\n actual = \"@crates__tree-sitter-elixir-0.3.5//:tree_sitter_elixir\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-erlang-0.16.0\",\n actual = \"@crates__tree-sitter-erlang-0.16.0//:tree_sitter_erlang\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-erlang\",\n actual = \"@crates__tree-sitter-erlang-0.16.0//:tree_sitter_erlang\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-fortran-0.6.0\",\n actual = \"@crates__tree-sitter-fortran-0.6.0//:tree_sitter_fortran\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-fortran\",\n actual = \"@crates__tree-sitter-fortran-0.6.0//:tree_sitter_fortran\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-go-0.25.0\",\n actual = \"@crates__tree-sitter-go-0.25.0//:tree_sitter_go\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-go\",\n actual = \"@crates__tree-sitter-go-0.25.0//:tree_sitter_go\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-graphql-0.1.0\",\n actual = \"@crates__tree-sitter-graphql-0.1.0//:tree_sitter_graphql\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-graphql\",\n actual = \"@crates__tree-sitter-graphql-0.1.0//:tree_sitter_graphql\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-haskell-0.23.1\",\n actual = \"@crates__tree-sitter-haskell-0.23.1//:tree_sitter_haskell\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-haskell\",\n actual = \"@crates__tree-sitter-haskell-0.23.1//:tree_sitter_haskell\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-hcl-1.1.0\",\n actual = \"@crates__tree-sitter-hcl-1.1.0//:tree_sitter_hcl\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-hcl\",\n actual = \"@crates__tree-sitter-hcl-1.1.0//:tree_sitter_hcl\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-html-0.23.2\",\n actual = \"@crates__tree-sitter-html-0.23.2//:tree_sitter_html\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-html\",\n actual = \"@crates__tree-sitter-html-0.23.2//:tree_sitter_html\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-ini-1.4.0\",\n actual = \"@crates__tree-sitter-ini-1.4.0//:tree_sitter_ini\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-ini\",\n actual = \"@crates__tree-sitter-ini-1.4.0//:tree_sitter_ini\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-java-0.23.5\",\n actual = \"@crates__tree-sitter-java-0.23.5//:tree_sitter_java\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-java\",\n actual = \"@crates__tree-sitter-java-0.23.5//:tree_sitter_java\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-javascript-0.25.0\",\n actual = \"@crates__tree-sitter-javascript-0.25.0//:tree_sitter_javascript\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-javascript\",\n actual = \"@crates__tree-sitter-javascript-0.25.0//:tree_sitter_javascript\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-json-0.24.8\",\n actual = \"@crates__tree-sitter-json-0.24.8//:tree_sitter_json\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-json\",\n actual = \"@crates__tree-sitter-json-0.24.8//:tree_sitter_json\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-julia-0.23.1\",\n actual = \"@crates__tree-sitter-julia-0.23.1//:tree_sitter_julia\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-julia\",\n actual = \"@crates__tree-sitter-julia-0.23.1//:tree_sitter_julia\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-just-0.2.0\",\n actual = \"@crates__tree-sitter-just-0.2.0//:tree_sitter_just\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-just\",\n actual = \"@crates__tree-sitter-just-0.2.0//:tree_sitter_just\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-kotlin-sg-0.4.1\",\n actual = \"@crates__tree-sitter-kotlin-sg-0.4.1//:tree_sitter_kotlin_sg\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree_sitter_kotlin-0.4.1\",\n actual = \"@crates__tree-sitter-kotlin-sg-0.4.1//:tree_sitter_kotlin_sg\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree_sitter_kotlin\",\n actual = \"@crates__tree-sitter-kotlin-sg-0.4.1//:tree_sitter_kotlin_sg\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-lua-0.5.0\",\n actual = \"@crates__tree-sitter-lua-0.5.0//:tree_sitter_lua\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-lua\",\n actual = \"@crates__tree-sitter-lua-0.5.0//:tree_sitter_lua\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-make-1.1.1\",\n actual = \"@crates__tree-sitter-make-1.1.1//:tree_sitter_make\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-make\",\n actual = \"@crates__tree-sitter-make-1.1.1//:tree_sitter_make\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-md-0.5.3\",\n actual = \"@crates__tree-sitter-md-0.5.3//:tree_sitter_md\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-md\",\n actual = \"@crates__tree-sitter-md-0.5.3//:tree_sitter_md\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-nix-0.3.0\",\n actual = \"@crates__tree-sitter-nix-0.3.0//:tree_sitter_nix\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-nix\",\n actual = \"@crates__tree-sitter-nix-0.3.0//:tree_sitter_nix\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-objc-3.0.2\",\n actual = \"@crates__tree-sitter-objc-3.0.2//:tree_sitter_objc\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-objc\",\n actual = \"@crates__tree-sitter-objc-3.0.2//:tree_sitter_objc\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-ocaml-0.24.2\",\n actual = \"@crates__tree-sitter-ocaml-0.24.2//:tree_sitter_ocaml\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-ocaml\",\n actual = \"@crates__tree-sitter-ocaml-0.24.2//:tree_sitter_ocaml\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-odin-1.3.0\",\n actual = \"@crates__tree-sitter-odin-1.3.0//:tree_sitter_odin\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-odin\",\n actual = \"@crates__tree-sitter-odin-1.3.0//:tree_sitter_odin\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-php-0.24.2\",\n actual = \"@crates__tree-sitter-php-0.24.2//:tree_sitter_php\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-php\",\n actual = \"@crates__tree-sitter-php-0.24.2//:tree_sitter_php\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-powershell-0.26.4\",\n actual = \"@crates__tree-sitter-powershell-0.26.4//:tree_sitter_powershell\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-powershell\",\n actual = \"@crates__tree-sitter-powershell-0.26.4//:tree_sitter_powershell\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-proto-0.4.0\",\n actual = \"@crates__tree-sitter-proto-0.4.0//:tree_sitter_proto\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-proto\",\n actual = \"@crates__tree-sitter-proto-0.4.0//:tree_sitter_proto\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-python-0.25.0\",\n actual = \"@crates__tree-sitter-python-0.25.0//:tree_sitter_python\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-python\",\n actual = \"@crates__tree-sitter-python-0.25.0//:tree_sitter_python\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-r-1.3.0\",\n actual = \"@crates__tree-sitter-r-1.3.0//:tree_sitter_r\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-r\",\n actual = \"@crates__tree-sitter-r-1.3.0//:tree_sitter_r\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-regex-0.25.0\",\n actual = \"@crates__tree-sitter-regex-0.25.0//:tree_sitter_regex\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-regex\",\n actual = \"@crates__tree-sitter-regex-0.25.0//:tree_sitter_regex\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-ruby-0.23.1\",\n actual = \"@crates__tree-sitter-ruby-0.23.1//:tree_sitter_ruby\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-ruby\",\n actual = \"@crates__tree-sitter-ruby-0.23.1//:tree_sitter_ruby\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-rust-0.24.2\",\n actual = \"@crates__tree-sitter-rust-0.24.2//:tree_sitter_rust\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-rust\",\n actual = \"@crates__tree-sitter-rust-0.24.2//:tree_sitter_rust\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-scala-0.26.0\",\n actual = \"@crates__tree-sitter-scala-0.26.0//:tree_sitter_scala\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-scala\",\n actual = \"@crates__tree-sitter-scala-0.26.0//:tree_sitter_scala\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-sequel-0.3.11\",\n actual = \"@crates__tree-sitter-sequel-0.3.11//:tree_sitter_sequel\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree_sitter_sql-0.3.11\",\n actual = \"@crates__tree-sitter-sequel-0.3.11//:tree_sitter_sequel\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree_sitter_sql\",\n actual = \"@crates__tree-sitter-sequel-0.3.11//:tree_sitter_sequel\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-solidity-1.2.13\",\n actual = \"@crates__tree-sitter-solidity-1.2.13//:tree_sitter_solidity\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-solidity\",\n actual = \"@crates__tree-sitter-solidity-1.2.13//:tree_sitter_solidity\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-starlark-1.3.0\",\n actual = \"@crates__tree-sitter-starlark-1.3.0//:tree_sitter_starlark\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-starlark\",\n actual = \"@crates__tree-sitter-starlark-1.3.0//:tree_sitter_starlark\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-svelte-next-0.1.1\",\n actual = \"@crates__tree-sitter-svelte-next-0.1.1//:tree_sitter_svelte_next\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree_sitter_svelte-0.1.1\",\n actual = \"@crates__tree-sitter-svelte-next-0.1.1//:tree_sitter_svelte_next\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree_sitter_svelte\",\n actual = \"@crates__tree-sitter-svelte-next-0.1.1//:tree_sitter_svelte_next\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-swift-0.7.3\",\n actual = \"@crates__tree-sitter-swift-0.7.3//:tree_sitter_swift\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-swift\",\n actual = \"@crates__tree-sitter-swift-0.7.3//:tree_sitter_swift\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-tlaplus-1.5.0\",\n actual = \"@crates__tree-sitter-tlaplus-1.5.0//:tree_sitter_tlaplus\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-tlaplus\",\n actual = \"@crates__tree-sitter-tlaplus-1.5.0//:tree_sitter_tlaplus\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-toml-ng-0.7.0\",\n actual = \"@crates__tree-sitter-toml-ng-0.7.0//:tree_sitter_toml_ng\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-toml-ng\",\n actual = \"@crates__tree-sitter-toml-ng-0.7.0//:tree_sitter_toml_ng\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-typescript-0.23.2\",\n actual = \"@crates__tree-sitter-typescript-0.23.2//:tree_sitter_typescript\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-typescript\",\n actual = \"@crates__tree-sitter-typescript-0.23.2//:tree_sitter_typescript\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-verilog-1.0.3\",\n actual = \"@crates__tree-sitter-verilog-1.0.3//:tree_sitter_verilog\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-verilog\",\n actual = \"@crates__tree-sitter-verilog-1.0.3//:tree_sitter_verilog\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-vue-next-0.1.0\",\n actual = \"@crates__tree-sitter-vue-next-0.1.0//:tree_sitter_vue_next\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree_sitter_vue-0.1.0\",\n actual = \"@crates__tree-sitter-vue-next-0.1.0//:tree_sitter_vue_next\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree_sitter_vue\",\n actual = \"@crates__tree-sitter-vue-next-0.1.0//:tree_sitter_vue_next\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-xml-0.7.0\",\n actual = \"@crates__tree-sitter-xml-0.7.0//:tree_sitter_xml\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-xml\",\n actual = \"@crates__tree-sitter-xml-0.7.0//:tree_sitter_xml\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-yaml-0.7.2\",\n actual = \"@crates__tree-sitter-yaml-0.7.2//:tree_sitter_yaml\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-yaml\",\n actual = \"@crates__tree-sitter-yaml-0.7.2//:tree_sitter_yaml\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-zig-1.1.2\",\n actual = \"@crates__tree-sitter-zig-1.1.2//:tree_sitter_zig\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-zig\",\n actual = \"@crates__tree-sitter-zig-1.1.2//:tree_sitter_zig\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"unicode-segmentation-1.13.3\",\n actual = \"@crates__unicode-segmentation-1.13.3//:unicode_segmentation\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"unicode-segmentation\",\n actual = \"@crates__unicode-segmentation-1.13.3//:unicode_segmentation\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"unicode-width-0.1.14\",\n actual = \"@crates__unicode-width-0.1.14//:unicode_width\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"unicode-width-0.2.2\",\n actual = \"@crates__unicode-width-0.2.2//:unicode_width\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uucore-0.0.30\",\n actual = \"@crates__uucore-0.0.30//:uucore\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uucore-0.8.0\",\n actual = \"@crates__uucore-0.8.0//:uucore\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uucore-0.9.0\",\n actual = \"@crates__uucore-0.9.0//:uucore\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uuid-1.24.0\",\n actual = \"@crates__uuid-1.24.0//:uuid\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uuid\",\n actual = \"@crates__uuid-1.24.0//:uuid\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uutils_term_grid-0.8.0\",\n actual = \"@crates__uutils_term_grid-0.8.0//:term_grid\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uutils_term_grid\",\n actual = \"@crates__uutils_term_grid-0.8.0//:term_grid\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uzers-0.12.2\",\n actual = \"@crates__uzers-0.12.2//:uzers\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uzers\",\n actual = \"@crates__uzers-0.12.2//:uzers\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"webrtc-0.17.2\",\n actual = \"@crates__webrtc-0.17.2//:webrtc\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"webrtc\",\n actual = \"@crates__webrtc-0.17.2//:webrtc\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"whoami-2.1.2\",\n actual = \"@crates__whoami-2.1.2//:whoami\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"whoami\",\n actual = \"@crates__whoami-2.1.2//:whoami\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"windows-sys-0.59.0\",\n actual = \"@crates__windows-sys-0.59.0//:windows_sys\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"windows-sys-0.61.2\",\n actual = \"@crates__windows-sys-0.61.2//:windows_sys\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"winreg-0.56.0\",\n actual = \"@crates__winreg-0.56.0//:winreg\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"winreg\",\n actual = \"@crates__winreg-0.56.0//:winreg\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"x11rb-0.13.2\",\n actual = \"@crates__x11rb-0.13.2//:x11rb\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"x11rb\",\n actual = \"@crates__x11rb-0.13.2//:x11rb\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"xcap-0.9.6\",\n actual = \"@crates__xcap-0.9.6//:xcap\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"xcap\",\n actual = \"@crates__xcap-0.9.6//:xcap\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"xkeysym-0.2.1\",\n actual = \"@crates__xkeysym-0.2.1//:xkeysym\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"xkeysym\",\n actual = \"@crates__xkeysym-0.2.1//:xkeysym\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"xxhash-rust-0.8.18\",\n actual = \"@crates__xxhash-rust-0.8.18//:xxhash_rust\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"xxhash-rust\",\n actual = \"@crates__xxhash-rust-0.8.18//:xxhash_rust\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"yansi-1.0.1\",\n actual = \"@crates__yansi-1.0.1//:yansi\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"yansi\",\n actual = \"@crates__yansi-1.0.1//:yansi\",\n tags = [\"manual\"],\n)\n", + "BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files(\n [\n \"cargo-bazel.json\",\n \"crates.bzl\",\n \"defs.bzl\",\n ] + glob(\n allow_empty = True,\n include = [\"*.bazel\"],\n ),\n)\n\nfilegroup(\n name = \"srcs\",\n srcs = glob(\n allow_empty = True,\n include = [\n \"*.bazel\",\n \"*.bzl\",\n ],\n ),\n)\n\n# Workspace Member Dependencies\nalias(\n name = \"ansi-width-0.1.0\",\n actual = \"@crates__ansi-width-0.1.0//:ansi_width\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"ansi-width\",\n actual = \"@crates__ansi-width-0.1.0//:ansi_width\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"anyhow-1.0.104\",\n actual = \"@crates__anyhow-1.0.104//:anyhow\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"anyhow\",\n actual = \"@crates__anyhow-1.0.104//:anyhow\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"arboard-3.6.1\",\n actual = \"@crates__arboard-3.6.1//:arboard\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"arboard\",\n actual = \"@crates__arboard-3.6.1//:arboard\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"argmax-0.3.1\",\n actual = \"@crates__argmax-0.3.1//:argmax\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"argmax\",\n actual = \"@crates__argmax-0.3.1//:argmax\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"ast-grep-core-0.39.9\",\n actual = \"@crates__ast-grep-core-0.39.9//:ast_grep_core\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"ast-grep-core\",\n actual = \"@crates__ast-grep-core-0.39.9//:ast_grep_core\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"async-recursion-1.1.1\",\n actual = \"@crates__async-recursion-1.1.1//:async_recursion\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"async-recursion\",\n actual = \"@crates__async-recursion-1.1.1//:async_recursion\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"async-trait-0.1.91\",\n actual = \"@crates__async-trait-0.1.91//:async_trait\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"async-trait\",\n actual = \"@crates__async-trait-0.1.91//:async_trait\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"audiopus_sys-0.2.2\",\n actual = \"@crates__audiopus_sys-0.2.2//:audiopus_sys\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"audiopus_sys\",\n actual = \"@crates__audiopus_sys-0.2.2//:audiopus_sys\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"base64-0.22.1\",\n actual = \"@crates__base64-0.22.1//:base64\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"base64\",\n actual = \"@crates__base64-0.22.1//:base64\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"base64-simd-0.8.0\",\n actual = \"@crates__base64-simd-0.8.0//:base64_simd\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"base64-simd\",\n actual = \"@crates__base64-simd-0.8.0//:base64_simd\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"bigdecimal-0.4.10\",\n actual = \"@crates__bigdecimal-0.4.10//:bigdecimal\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"bigdecimal\",\n actual = \"@crates__bigdecimal-0.4.10//:bigdecimal\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"binary-heap-plus-0.5.0\",\n actual = \"@crates__binary-heap-plus-0.5.0//:binary_heap_plus\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"binary-heap-plus\",\n actual = \"@crates__binary-heap-plus-0.5.0//:binary_heap_plus\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"bon-3.9.3\",\n actual = \"@crates__bon-3.9.3//:bon\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"bon\",\n actual = \"@crates__bon-3.9.3//:bon\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"brush-parser-0.3.0\",\n actual = \"@crates__brush-parser-0.3.0//:brush_parser\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"brush-parser-0.4.0\",\n actual = \"@crates__brush-parser-0.4.0//:brush_parser\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"bstr-1.13.0\",\n actual = \"@crates__bstr-1.13.0//:bstr\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"bstr\",\n actual = \"@crates__bstr-1.13.0//:bstr\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"bytecount-0.6.9\",\n actual = \"@crates__bytecount-0.6.9//:bytecount\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"bytecount\",\n actual = \"@crates__bytecount-0.6.9//:bytecount\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"bytes-1.12.1\",\n actual = \"@crates__bytes-1.12.1//:bytes\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"bytes\",\n actual = \"@crates__bytes-1.12.1//:bytes\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"cached-0.59.0\",\n actual = \"@crates__cached-0.59.0//:cached\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"cached\",\n actual = \"@crates__cached-0.59.0//:cached\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"cfg-if-1.0.4\",\n actual = \"@crates__cfg-if-1.0.4//:cfg_if\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"cfg-if\",\n actual = \"@crates__cfg-if-1.0.4//:cfg_if\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"check_elevation-0.2.7\",\n actual = \"@crates__check_elevation-0.2.7//:check_elevation\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"check_elevation\",\n actual = \"@crates__check_elevation-0.2.7//:check_elevation\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"chrono-0.4.45\",\n actual = \"@crates__chrono-0.4.45//:chrono\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"chrono\",\n actual = \"@crates__chrono-0.4.45//:chrono\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"clap-4.6.4\",\n actual = \"@crates__clap-4.6.4//:clap\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"clap\",\n actual = \"@crates__clap-4.6.4//:clap\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"clipboard-win-5.4.1\",\n actual = \"@crates__clipboard-win-5.4.1//:clipboard_win\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"clipboard-win\",\n actual = \"@crates__clipboard-win-5.4.1//:clipboard_win\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"codesnake-0.2.1\",\n actual = \"@crates__codesnake-0.2.1//:codesnake\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"codesnake\",\n actual = \"@crates__codesnake-0.2.1//:codesnake\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"color-print-0.3.7\",\n actual = \"@crates__color-print-0.3.7//:color_print\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"color-print\",\n actual = \"@crates__color-print-0.3.7//:color_print\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"command-fds-0.3.3\",\n actual = \"@crates__command-fds-0.3.3//:command_fds\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"command-fds\",\n actual = \"@crates__command-fds-0.3.3//:command_fds\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"compare-0.1.0\",\n actual = \"@crates__compare-0.1.0//:compare\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"compare\",\n actual = \"@crates__compare-0.1.0//:compare\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"core-graphics-0.25.0\",\n actual = \"@crates__core-graphics-0.25.0//:core_graphics\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"core-graphics\",\n actual = \"@crates__core-graphics-0.25.0//:core_graphics\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"dashmap-6.2.1\",\n actual = \"@crates__dashmap-6.2.1//:dashmap\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"dashmap\",\n actual = \"@crates__dashmap-6.2.1//:dashmap\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"dns-lookup-3.0.1\",\n actual = \"@crates__dns-lookup-3.0.1//:dns_lookup\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"dns-lookup\",\n actual = \"@crates__dns-lookup-3.0.1//:dns_lookup\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"enigo-0.6.1\",\n actual = \"@crates__enigo-0.6.1//:enigo\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"enigo\",\n actual = \"@crates__enigo-0.6.1//:enigo\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"faccess-0.2.4\",\n actual = \"@crates__faccess-0.2.4//:faccess\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"faccess\",\n actual = \"@crates__faccess-0.2.4//:faccess\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"fancy-regex-0.17.0\",\n actual = \"@crates__fancy-regex-0.17.0//:fancy_regex\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"fancy-regex-0.18.0\",\n actual = \"@crates__fancy-regex-0.18.0//:fancy_regex\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"filetime-0.2.29\",\n actual = \"@crates__filetime-0.2.29//:filetime\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"filetime\",\n actual = \"@crates__filetime-0.2.29//:filetime\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"flume-0.11.1\",\n actual = \"@crates__flume-0.11.1//:flume\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"flume\",\n actual = \"@crates__flume-0.11.1//:flume\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"foldhash-0.2.0\",\n actual = \"@crates__foldhash-0.2.0//:foldhash\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"foldhash\",\n actual = \"@crates__foldhash-0.2.0//:foldhash\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"fontdue-0.9.3\",\n actual = \"@crates__fontdue-0.9.3//:fontdue\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"fontdue\",\n actual = \"@crates__fontdue-0.9.3//:fontdue\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"fs_extra-1.3.0\",\n actual = \"@crates__fs_extra-1.3.0//:fs_extra\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"fs_extra\",\n actual = \"@crates__fs_extra-1.3.0//:fs_extra\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"futures-0.3.33\",\n actual = \"@crates__futures-0.3.33//:futures\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"futures\",\n actual = \"@crates__futures-0.3.33//:futures\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"getrandom-0.4.3\",\n actual = \"@crates__getrandom-0.4.3//:getrandom\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"getrandom\",\n actual = \"@crates__getrandom-0.4.3//:getrandom\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"glob-0.3.4\",\n actual = \"@crates__glob-0.3.4//:glob\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"glob\",\n actual = \"@crates__glob-0.3.4//:glob\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"globset-0.4.19\",\n actual = \"@crates__globset-0.4.19//:globset\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"globset\",\n actual = \"@crates__globset-0.4.19//:globset\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"grep-cli-0.1.12\",\n actual = \"@crates__grep-cli-0.1.12//:grep_cli\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"grep-cli\",\n actual = \"@crates__grep-cli-0.1.12//:grep_cli\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"grep-matcher-0.1.9\",\n actual = \"@crates__grep-matcher-0.1.9//:grep_matcher\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"grep-matcher\",\n actual = \"@crates__grep-matcher-0.1.9//:grep_matcher\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"grep-pcre2-0.1.10\",\n actual = \"@crates__grep-pcre2-0.1.10//:grep_pcre2\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"grep-pcre2\",\n actual = \"@crates__grep-pcre2-0.1.10//:grep_pcre2\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"grep-printer-0.3.1\",\n actual = \"@crates__grep-printer-0.3.1//:grep_printer\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"grep-printer\",\n actual = \"@crates__grep-printer-0.3.1//:grep_printer\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"grep-regex-0.1.14\",\n actual = \"@crates__grep-regex-0.1.14//:grep_regex\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"grep-regex\",\n actual = \"@crates__grep-regex-0.1.14//:grep_regex\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"grep-searcher-0.1.17\",\n actual = \"@crates__grep-searcher-0.1.17//:grep_searcher\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"grep-searcher\",\n actual = \"@crates__grep-searcher-0.1.17//:grep_searcher\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"hex-0.4.3\",\n actual = \"@crates__hex-0.4.3//:hex\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"hex\",\n actual = \"@crates__hex-0.4.3//:hex\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"hifijson-0.2.3\",\n actual = \"@crates__hifijson-0.2.3//:hifijson\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"hifijson\",\n actual = \"@crates__hifijson-0.2.3//:hifijson\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"hostname-0.4.2\",\n actual = \"@crates__hostname-0.4.2//:hostname\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"hostname\",\n actual = \"@crates__hostname-0.4.2//:hostname\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"html-to-markdown-rs-2.30.0\",\n actual = \"@crates__html-to-markdown-rs-2.30.0//:html_to_markdown_rs\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"html-to-markdown-rs\",\n actual = \"@crates__html-to-markdown-rs-2.30.0//:html_to_markdown_rs\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"icy_sixel-0.5.0\",\n actual = \"@crates__icy_sixel-0.5.0//:icy_sixel\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"icy_sixel\",\n actual = \"@crates__icy_sixel-0.5.0//:icy_sixel\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"ignore-0.4.31\",\n actual = \"@crates__ignore-0.4.31//:ignore\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"ignore\",\n actual = \"@crates__ignore-0.4.31//:ignore\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"image-0.25.10\",\n actual = \"@crates__image-0.25.10//:image\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"image\",\n actual = \"@crates__image-0.25.10//:image\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"indicatif-0.18.6\",\n actual = \"@crates__indicatif-0.18.6//:indicatif\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"indicatif\",\n actual = \"@crates__indicatif-0.18.6//:indicatif\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"inferno-0.12.8\",\n actual = \"@crates__inferno-0.12.8//:inferno\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"inferno\",\n actual = \"@crates__inferno-0.12.8//:inferno\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"inherent-1.0.14\",\n actual = \"@crates__inherent-1.0.14//:inherent\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"inherent\",\n actual = \"@crates__inherent-1.0.14//:inherent\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"itertools-0.14.0\",\n actual = \"@crates__itertools-0.14.0//:itertools\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"itertools\",\n actual = \"@crates__itertools-0.14.0//:itertools\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"jaq-core-2.2.1\",\n actual = \"@crates__jaq-core-2.2.1//:jaq_core\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"jaq-core\",\n actual = \"@crates__jaq-core-2.2.1//:jaq_core\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"jaq-json-1.1.3\",\n actual = \"@crates__jaq-json-1.1.3//:jaq_json\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"jaq-json\",\n actual = \"@crates__jaq-json-1.1.3//:jaq_json\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"jaq-std-2.1.2\",\n actual = \"@crates__jaq-std-2.1.2//:jaq_std\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"jaq-std\",\n actual = \"@crates__jaq-std-2.1.2//:jaq_std\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"jiff-0.2.35\",\n actual = \"@crates__jiff-0.2.35//:jiff\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"jiff\",\n actual = \"@crates__jiff-0.2.35//:jiff\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"libc-0.2.189\",\n actual = \"@crates__libc-0.2.189//:libc\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"libc\",\n actual = \"@crates__libc-0.2.189//:libc\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"lscolors-0.21.0\",\n actual = \"@crates__lscolors-0.21.0//:lscolors\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"lscolors\",\n actual = \"@crates__lscolors-0.21.0//:lscolors\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"maudio-0.1.6\",\n actual = \"@crates__maudio-0.1.6//:maudio\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"maudio\",\n actual = \"@crates__maudio-0.1.6//:maudio\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"memchr-2.8.3\",\n actual = \"@crates__memchr-2.8.3//:memchr\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"memchr\",\n actual = \"@crates__memchr-2.8.3//:memchr\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"memmap2-0.9.11\",\n actual = \"@crates__memmap2-0.9.11//:memmap2\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"memmap2\",\n actual = \"@crates__memmap2-0.9.11//:memmap2\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"napi-3.12.0\",\n actual = \"@crates__napi-3.12.0//:napi\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"napi\",\n actual = \"@crates__napi-3.12.0//:napi\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"napi-build-2.4.0\",\n actual = \"@crates__napi-build-2.4.0//:napi_build\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"napi-build\",\n actual = \"@crates__napi-build-2.4.0//:napi_build\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"napi-derive-3.6.1\",\n actual = \"@crates__napi-derive-3.6.1//:napi_derive\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"napi-derive\",\n actual = \"@crates__napi-derive-3.6.1//:napi_derive\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"nix-0.29.0\",\n actual = \"@crates__nix-0.29.0//:nix\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"nix-0.31.3\",\n actual = \"@crates__nix-0.31.3//:nix\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"nom-8.0.0\",\n actual = \"@crates__nom-8.0.0//:nom\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"nom\",\n actual = \"@crates__nom-8.0.0//:nom\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"normalize-path-0.2.1\",\n actual = \"@crates__normalize-path-0.2.1//:normalize_path\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"normalize-path\",\n actual = \"@crates__normalize-path-0.2.1//:normalize_path\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"notify-8.2.0\",\n actual = \"@crates__notify-8.2.0//:notify\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"notify\",\n actual = \"@crates__notify-8.2.0//:notify\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"num-bigint-0.4.8\",\n actual = \"@crates__num-bigint-0.4.8//:num_bigint\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"num-bigint\",\n actual = \"@crates__num-bigint-0.4.8//:num_bigint\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"num-traits-0.2.19\",\n actual = \"@crates__num-traits-0.2.19//:num_traits\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"num-traits\",\n actual = \"@crates__num-traits-0.2.19//:num_traits\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"onig-6.5.3\",\n actual = \"@crates__onig-6.5.3//:onig\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"onig\",\n actual = \"@crates__onig-6.5.3//:onig\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"opus-0.3.1\",\n actual = \"@crates__opus-0.3.1//:opus\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"opus\",\n actual = \"@crates__opus-0.3.1//:opus\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"os_display-0.1.4\",\n actual = \"@crates__os_display-0.1.4//:os_display\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"os_display\",\n actual = \"@crates__os_display-0.1.4//:os_display\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"os_pipe-1.2.3\",\n actual = \"@crates__os_pipe-1.2.3//:os_pipe\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"os_pipe\",\n actual = \"@crates__os_pipe-1.2.3//:os_pipe\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"parking_lot-0.12.5\",\n actual = \"@crates__parking_lot-0.12.5//:parking_lot\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"parking_lot\",\n actual = \"@crates__parking_lot-0.12.5//:parking_lot\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"parse_datetime-0.14.0\",\n actual = \"@crates__parse_datetime-0.14.0//:parse_datetime\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"parse_datetime\",\n actual = \"@crates__parse_datetime-0.14.0//:parse_datetime\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"phf-0.13.1\",\n actual = \"@crates__phf-0.13.1//:phf\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"phf\",\n actual = \"@crates__phf-0.13.1//:phf\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"pi-shell-17.1.8\",\n actual = \"@crates__pi-shell-17.1.8//:pi_shell\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"pi-shell\",\n actual = \"@crates__pi-shell-17.1.8//:pi_shell\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"platform-info-2.1.0\",\n actual = \"@crates__platform-info-2.1.0//:platform_info\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"platform-info\",\n actual = \"@crates__platform-info-2.1.0//:platform_info\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"png-0.18.1\",\n actual = \"@crates__png-0.18.1//:png\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"png\",\n actual = \"@crates__png-0.18.1//:png\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"portable-pty-0.9.0\",\n actual = \"@crates__portable-pty-0.9.0//:portable_pty\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"portable-pty\",\n actual = \"@crates__portable-pty-0.9.0//:portable_pty\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"pretty_assertions-1.4.1\",\n actual = \"@crates__pretty_assertions-1.4.1//:pretty_assertions\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"pretty_assertions\",\n actual = \"@crates__pretty_assertions-1.4.1//:pretty_assertions\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"procfs-0.18.0\",\n actual = \"@crates__procfs-0.18.0//:procfs\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"procfs\",\n actual = \"@crates__procfs-0.18.0//:procfs\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rand-0.10.2\",\n actual = \"@crates__rand-0.10.2//:rand\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rand\",\n actual = \"@crates__rand-0.10.2//:rand\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rayon-1.12.0\",\n actual = \"@crates__rayon-1.12.0//:rayon\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rayon\",\n actual = \"@crates__rayon-1.12.0//:rayon\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"regex-1.13.1\",\n actual = \"@crates__regex-1.13.1//:regex\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"regex\",\n actual = \"@crates__regex-1.13.1//:regex\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rlimit-0.11.0\",\n actual = \"@crates__rlimit-0.11.0//:rlimit\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rlimit\",\n actual = \"@crates__rlimit-0.11.0//:rlimit\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rpds-1.2.1\",\n actual = \"@crates__rpds-1.2.1//:rpds\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rpds\",\n actual = \"@crates__rpds-1.2.1//:rpds\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rstest-0.26.1\",\n actual = \"@crates__rstest-0.26.1//:rstest\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rstest\",\n actual = \"@crates__rstest-0.26.1//:rstest\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rustc-hash-2.1.3\",\n actual = \"@crates__rustc-hash-2.1.3//:rustc_hash\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rustc-hash\",\n actual = \"@crates__rustc-hash-2.1.3//:rustc_hash\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rustix-1.1.4\",\n actual = \"@crates__rustix-1.1.4//:rustix\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rustix\",\n actual = \"@crates__rustix-1.1.4//:rustix\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"self_cell-1.3.0\",\n actual = \"@crates__self_cell-1.3.0//:self_cell\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"self_cell\",\n actual = \"@crates__self_cell-1.3.0//:self_cell\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"serde-1.0.229\",\n actual = \"@crates__serde-1.0.229//:serde\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"serde\",\n actual = \"@crates__serde-1.0.229//:serde\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"serde_json-1.0.151\",\n actual = \"@crates__serde_json-1.0.151//:serde_json\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"serde_json\",\n actual = \"@crates__serde_json-1.0.151//:serde_json\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"similar-3.1.1\",\n actual = \"@crates__similar-3.1.1//:similar\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"similar\",\n actual = \"@crates__similar-3.1.1//:similar\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"smallvec-1.15.2\",\n actual = \"@crates__smallvec-1.15.2//:smallvec\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"smallvec\",\n actual = \"@crates__smallvec-1.15.2//:smallvec\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"strum-0.28.0\",\n actual = \"@crates__strum-0.28.0//:strum\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"strum\",\n actual = \"@crates__strum-0.28.0//:strum\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"strum_macros-0.28.0\",\n actual = \"@crates__strum_macros-0.28.0//:strum_macros\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"strum_macros\",\n actual = \"@crates__strum_macros-0.28.0//:strum_macros\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"syntect-5.3.0\",\n actual = \"@crates__syntect-5.3.0//:syntect\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"syntect\",\n actual = \"@crates__syntect-5.3.0//:syntect\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tempfile-3.27.0\",\n actual = \"@crates__tempfile-3.27.0//:tempfile\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tempfile\",\n actual = \"@crates__tempfile-3.27.0//:tempfile\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"terminfo-0.9.0\",\n actual = \"@crates__terminfo-0.9.0//:terminfo\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"terminfo\",\n actual = \"@crates__terminfo-0.9.0//:terminfo\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"thiserror-2.0.19\",\n actual = \"@crates__thiserror-2.0.19//:thiserror\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"thiserror\",\n actual = \"@crates__thiserror-2.0.19//:thiserror\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tiktoken-rs-0.11.0\",\n actual = \"@crates__tiktoken-rs-0.11.0//:tiktoken_rs\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tiktoken-rs\",\n actual = \"@crates__tiktoken-rs-0.11.0//:tiktoken_rs\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tokio-1.53.1\",\n actual = \"@crates__tokio-1.53.1//:tokio\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tokio\",\n actual = \"@crates__tokio-1.53.1//:tokio\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tokio-util-0.7.19\",\n actual = \"@crates__tokio-util-0.7.19//:tokio_util\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tokio-util\",\n actual = \"@crates__tokio-util-0.7.19//:tokio_util\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"toml-1.1.3+spec-1.1.0\",\n actual = \"@crates__toml-1.1.3-spec-1.1.0//:toml\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"toml\",\n actual = \"@crates__toml-1.1.3-spec-1.1.0//:toml\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tracing-0.1.44\",\n actual = \"@crates__tracing-0.1.44//:tracing\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tracing\",\n actual = \"@crates__tracing-0.1.44//:tracing\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-0.25.10\",\n actual = \"@crates__tree-sitter-0.25.10//:tree_sitter\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter\",\n actual = \"@crates__tree-sitter-0.25.10//:tree_sitter\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-astro-next-0.1.1\",\n actual = \"@crates__tree-sitter-astro-next-0.1.1//:tree_sitter_astro_next\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree_sitter_astro-0.1.1\",\n actual = \"@crates__tree-sitter-astro-next-0.1.1//:tree_sitter_astro_next\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree_sitter_astro\",\n actual = \"@crates__tree-sitter-astro-next-0.1.1//:tree_sitter_astro_next\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-bash-0.25.1\",\n actual = \"@crates__tree-sitter-bash-0.25.1//:tree_sitter_bash\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-bash\",\n actual = \"@crates__tree-sitter-bash-0.25.1//:tree_sitter_bash\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-c-0.24.2\",\n actual = \"@crates__tree-sitter-c-0.24.2//:tree_sitter_c\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-c\",\n actual = \"@crates__tree-sitter-c-0.24.2//:tree_sitter_c\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-c-sharp-0.23.5\",\n actual = \"@crates__tree-sitter-c-sharp-0.23.5//:tree_sitter_c_sharp\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-c-sharp\",\n actual = \"@crates__tree-sitter-c-sharp-0.23.5//:tree_sitter_c_sharp\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-clojure-0.1.0\",\n actual = \"@crates__tree-sitter-clojure-0.1.0//:tree_sitter_clojure\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-clojure\",\n actual = \"@crates__tree-sitter-clojure-0.1.0//:tree_sitter_clojure\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-cmake-0.7.4\",\n actual = \"@crates__tree-sitter-cmake-0.7.4//:tree_sitter_cmake\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-cmake\",\n actual = \"@crates__tree-sitter-cmake-0.7.4//:tree_sitter_cmake\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-cpp-0.23.4\",\n actual = \"@crates__tree-sitter-cpp-0.23.4//:tree_sitter_cpp\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-cpp\",\n actual = \"@crates__tree-sitter-cpp-0.23.4//:tree_sitter_cpp\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-css-0.25.0\",\n actual = \"@crates__tree-sitter-css-0.25.0//:tree_sitter_css\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-css\",\n actual = \"@crates__tree-sitter-css-0.25.0//:tree_sitter_css\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-dart-0.2.0\",\n actual = \"@crates__tree-sitter-dart-0.2.0//:tree_sitter_dart\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-dart\",\n actual = \"@crates__tree-sitter-dart-0.2.0//:tree_sitter_dart\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-diff-0.1.0\",\n actual = \"@crates__tree-sitter-diff-0.1.0//:tree_sitter_diff\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-diff\",\n actual = \"@crates__tree-sitter-diff-0.1.0//:tree_sitter_diff\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-dockerfile-updated-0.2.0\",\n actual = \"@crates__tree-sitter-dockerfile-updated-0.2.0//:tree_sitter_dockerfile_updated\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree_sitter_dockerfile-0.2.0\",\n actual = \"@crates__tree-sitter-dockerfile-updated-0.2.0//:tree_sitter_dockerfile_updated\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree_sitter_dockerfile\",\n actual = \"@crates__tree-sitter-dockerfile-updated-0.2.0//:tree_sitter_dockerfile_updated\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-elisp-1.6.1\",\n actual = \"@crates__tree-sitter-elisp-1.6.1//:tree_sitter_elisp\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-elisp\",\n actual = \"@crates__tree-sitter-elisp-1.6.1//:tree_sitter_elisp\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-elixir-0.3.5\",\n actual = \"@crates__tree-sitter-elixir-0.3.5//:tree_sitter_elixir\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-elixir\",\n actual = \"@crates__tree-sitter-elixir-0.3.5//:tree_sitter_elixir\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-erlang-0.16.0\",\n actual = \"@crates__tree-sitter-erlang-0.16.0//:tree_sitter_erlang\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-erlang\",\n actual = \"@crates__tree-sitter-erlang-0.16.0//:tree_sitter_erlang\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-fortran-0.6.0\",\n actual = \"@crates__tree-sitter-fortran-0.6.0//:tree_sitter_fortran\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-fortran\",\n actual = \"@crates__tree-sitter-fortran-0.6.0//:tree_sitter_fortran\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-go-0.25.0\",\n actual = \"@crates__tree-sitter-go-0.25.0//:tree_sitter_go\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-go\",\n actual = \"@crates__tree-sitter-go-0.25.0//:tree_sitter_go\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-graphql-0.1.0\",\n actual = \"@crates__tree-sitter-graphql-0.1.0//:tree_sitter_graphql\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-graphql\",\n actual = \"@crates__tree-sitter-graphql-0.1.0//:tree_sitter_graphql\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-haskell-0.23.1\",\n actual = \"@crates__tree-sitter-haskell-0.23.1//:tree_sitter_haskell\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-haskell\",\n actual = \"@crates__tree-sitter-haskell-0.23.1//:tree_sitter_haskell\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-hcl-1.1.0\",\n actual = \"@crates__tree-sitter-hcl-1.1.0//:tree_sitter_hcl\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-hcl\",\n actual = \"@crates__tree-sitter-hcl-1.1.0//:tree_sitter_hcl\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-html-0.23.2\",\n actual = \"@crates__tree-sitter-html-0.23.2//:tree_sitter_html\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-html\",\n actual = \"@crates__tree-sitter-html-0.23.2//:tree_sitter_html\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-ini-1.4.0\",\n actual = \"@crates__tree-sitter-ini-1.4.0//:tree_sitter_ini\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-ini\",\n actual = \"@crates__tree-sitter-ini-1.4.0//:tree_sitter_ini\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-java-0.23.5\",\n actual = \"@crates__tree-sitter-java-0.23.5//:tree_sitter_java\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-java\",\n actual = \"@crates__tree-sitter-java-0.23.5//:tree_sitter_java\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-javascript-0.25.0\",\n actual = \"@crates__tree-sitter-javascript-0.25.0//:tree_sitter_javascript\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-javascript\",\n actual = \"@crates__tree-sitter-javascript-0.25.0//:tree_sitter_javascript\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-json-0.24.8\",\n actual = \"@crates__tree-sitter-json-0.24.8//:tree_sitter_json\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-json\",\n actual = \"@crates__tree-sitter-json-0.24.8//:tree_sitter_json\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-julia-0.23.1\",\n actual = \"@crates__tree-sitter-julia-0.23.1//:tree_sitter_julia\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-julia\",\n actual = \"@crates__tree-sitter-julia-0.23.1//:tree_sitter_julia\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-just-0.2.0\",\n actual = \"@crates__tree-sitter-just-0.2.0//:tree_sitter_just\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-just\",\n actual = \"@crates__tree-sitter-just-0.2.0//:tree_sitter_just\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-kotlin-sg-0.4.1\",\n actual = \"@crates__tree-sitter-kotlin-sg-0.4.1//:tree_sitter_kotlin_sg\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree_sitter_kotlin-0.4.1\",\n actual = \"@crates__tree-sitter-kotlin-sg-0.4.1//:tree_sitter_kotlin_sg\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree_sitter_kotlin\",\n actual = \"@crates__tree-sitter-kotlin-sg-0.4.1//:tree_sitter_kotlin_sg\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-lua-0.5.0\",\n actual = \"@crates__tree-sitter-lua-0.5.0//:tree_sitter_lua\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-lua\",\n actual = \"@crates__tree-sitter-lua-0.5.0//:tree_sitter_lua\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-make-1.1.1\",\n actual = \"@crates__tree-sitter-make-1.1.1//:tree_sitter_make\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-make\",\n actual = \"@crates__tree-sitter-make-1.1.1//:tree_sitter_make\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-md-0.5.3\",\n actual = \"@crates__tree-sitter-md-0.5.3//:tree_sitter_md\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-md\",\n actual = \"@crates__tree-sitter-md-0.5.3//:tree_sitter_md\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-nix-0.3.0\",\n actual = \"@crates__tree-sitter-nix-0.3.0//:tree_sitter_nix\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-nix\",\n actual = \"@crates__tree-sitter-nix-0.3.0//:tree_sitter_nix\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-objc-3.0.2\",\n actual = \"@crates__tree-sitter-objc-3.0.2//:tree_sitter_objc\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-objc\",\n actual = \"@crates__tree-sitter-objc-3.0.2//:tree_sitter_objc\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-ocaml-0.24.2\",\n actual = \"@crates__tree-sitter-ocaml-0.24.2//:tree_sitter_ocaml\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-ocaml\",\n actual = \"@crates__tree-sitter-ocaml-0.24.2//:tree_sitter_ocaml\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-odin-1.3.0\",\n actual = \"@crates__tree-sitter-odin-1.3.0//:tree_sitter_odin\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-odin\",\n actual = \"@crates__tree-sitter-odin-1.3.0//:tree_sitter_odin\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-php-0.24.2\",\n actual = \"@crates__tree-sitter-php-0.24.2//:tree_sitter_php\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-php\",\n actual = \"@crates__tree-sitter-php-0.24.2//:tree_sitter_php\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-powershell-0.26.4\",\n actual = \"@crates__tree-sitter-powershell-0.26.4//:tree_sitter_powershell\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-powershell\",\n actual = \"@crates__tree-sitter-powershell-0.26.4//:tree_sitter_powershell\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-proto-0.4.0\",\n actual = \"@crates__tree-sitter-proto-0.4.0//:tree_sitter_proto\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-proto\",\n actual = \"@crates__tree-sitter-proto-0.4.0//:tree_sitter_proto\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-python-0.25.0\",\n actual = \"@crates__tree-sitter-python-0.25.0//:tree_sitter_python\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-python\",\n actual = \"@crates__tree-sitter-python-0.25.0//:tree_sitter_python\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-r-1.3.0\",\n actual = \"@crates__tree-sitter-r-1.3.0//:tree_sitter_r\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-r\",\n actual = \"@crates__tree-sitter-r-1.3.0//:tree_sitter_r\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-regex-0.25.0\",\n actual = \"@crates__tree-sitter-regex-0.25.0//:tree_sitter_regex\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-regex\",\n actual = \"@crates__tree-sitter-regex-0.25.0//:tree_sitter_regex\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-ruby-0.23.1\",\n actual = \"@crates__tree-sitter-ruby-0.23.1//:tree_sitter_ruby\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-ruby\",\n actual = \"@crates__tree-sitter-ruby-0.23.1//:tree_sitter_ruby\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-rust-0.24.2\",\n actual = \"@crates__tree-sitter-rust-0.24.2//:tree_sitter_rust\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-rust\",\n actual = \"@crates__tree-sitter-rust-0.24.2//:tree_sitter_rust\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-scala-0.26.0\",\n actual = \"@crates__tree-sitter-scala-0.26.0//:tree_sitter_scala\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-scala\",\n actual = \"@crates__tree-sitter-scala-0.26.0//:tree_sitter_scala\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-sequel-0.3.11\",\n actual = \"@crates__tree-sitter-sequel-0.3.11//:tree_sitter_sequel\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree_sitter_sql-0.3.11\",\n actual = \"@crates__tree-sitter-sequel-0.3.11//:tree_sitter_sequel\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree_sitter_sql\",\n actual = \"@crates__tree-sitter-sequel-0.3.11//:tree_sitter_sequel\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-solidity-1.2.13\",\n actual = \"@crates__tree-sitter-solidity-1.2.13//:tree_sitter_solidity\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-solidity\",\n actual = \"@crates__tree-sitter-solidity-1.2.13//:tree_sitter_solidity\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-starlark-1.3.0\",\n actual = \"@crates__tree-sitter-starlark-1.3.0//:tree_sitter_starlark\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-starlark\",\n actual = \"@crates__tree-sitter-starlark-1.3.0//:tree_sitter_starlark\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-svelte-next-0.1.1\",\n actual = \"@crates__tree-sitter-svelte-next-0.1.1//:tree_sitter_svelte_next\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree_sitter_svelte-0.1.1\",\n actual = \"@crates__tree-sitter-svelte-next-0.1.1//:tree_sitter_svelte_next\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree_sitter_svelte\",\n actual = \"@crates__tree-sitter-svelte-next-0.1.1//:tree_sitter_svelte_next\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-swift-0.7.3\",\n actual = \"@crates__tree-sitter-swift-0.7.3//:tree_sitter_swift\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-swift\",\n actual = \"@crates__tree-sitter-swift-0.7.3//:tree_sitter_swift\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-tlaplus-1.5.0\",\n actual = \"@crates__tree-sitter-tlaplus-1.5.0//:tree_sitter_tlaplus\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-tlaplus\",\n actual = \"@crates__tree-sitter-tlaplus-1.5.0//:tree_sitter_tlaplus\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-toml-ng-0.7.0\",\n actual = \"@crates__tree-sitter-toml-ng-0.7.0//:tree_sitter_toml_ng\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-toml-ng\",\n actual = \"@crates__tree-sitter-toml-ng-0.7.0//:tree_sitter_toml_ng\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-typescript-0.23.2\",\n actual = \"@crates__tree-sitter-typescript-0.23.2//:tree_sitter_typescript\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-typescript\",\n actual = \"@crates__tree-sitter-typescript-0.23.2//:tree_sitter_typescript\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-verilog-1.0.3\",\n actual = \"@crates__tree-sitter-verilog-1.0.3//:tree_sitter_verilog\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-verilog\",\n actual = \"@crates__tree-sitter-verilog-1.0.3//:tree_sitter_verilog\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-vue-next-0.1.0\",\n actual = \"@crates__tree-sitter-vue-next-0.1.0//:tree_sitter_vue_next\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree_sitter_vue-0.1.0\",\n actual = \"@crates__tree-sitter-vue-next-0.1.0//:tree_sitter_vue_next\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree_sitter_vue\",\n actual = \"@crates__tree-sitter-vue-next-0.1.0//:tree_sitter_vue_next\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-xml-0.7.0\",\n actual = \"@crates__tree-sitter-xml-0.7.0//:tree_sitter_xml\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-xml\",\n actual = \"@crates__tree-sitter-xml-0.7.0//:tree_sitter_xml\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-yaml-0.7.2\",\n actual = \"@crates__tree-sitter-yaml-0.7.2//:tree_sitter_yaml\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-yaml\",\n actual = \"@crates__tree-sitter-yaml-0.7.2//:tree_sitter_yaml\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-zig-1.1.2\",\n actual = \"@crates__tree-sitter-zig-1.1.2//:tree_sitter_zig\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tree-sitter-zig\",\n actual = \"@crates__tree-sitter-zig-1.1.2//:tree_sitter_zig\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"unicode-segmentation-1.13.3\",\n actual = \"@crates__unicode-segmentation-1.13.3//:unicode_segmentation\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"unicode-segmentation\",\n actual = \"@crates__unicode-segmentation-1.13.3//:unicode_segmentation\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"unicode-width-0.1.14\",\n actual = \"@crates__unicode-width-0.1.14//:unicode_width\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"unicode-width-0.2.2\",\n actual = \"@crates__unicode-width-0.2.2//:unicode_width\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uucore-0.0.30\",\n actual = \"@crates__uucore-0.0.30//:uucore\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uucore-0.8.0\",\n actual = \"@crates__uucore-0.8.0//:uucore\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uucore-0.9.0\",\n actual = \"@crates__uucore-0.9.0//:uucore\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uuid-1.24.0\",\n actual = \"@crates__uuid-1.24.0//:uuid\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uuid\",\n actual = \"@crates__uuid-1.24.0//:uuid\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uutils_term_grid-0.8.0\",\n actual = \"@crates__uutils_term_grid-0.8.0//:term_grid\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uutils_term_grid\",\n actual = \"@crates__uutils_term_grid-0.8.0//:term_grid\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uzers-0.12.2\",\n actual = \"@crates__uzers-0.12.2//:uzers\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uzers\",\n actual = \"@crates__uzers-0.12.2//:uzers\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"webrtc-0.17.2\",\n actual = \"@crates__webrtc-0.17.2//:webrtc\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"webrtc\",\n actual = \"@crates__webrtc-0.17.2//:webrtc\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"whoami-2.1.2\",\n actual = \"@crates__whoami-2.1.2//:whoami\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"whoami\",\n actual = \"@crates__whoami-2.1.2//:whoami\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"windows-sys-0.59.0\",\n actual = \"@crates__windows-sys-0.59.0//:windows_sys\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"windows-sys-0.61.2\",\n actual = \"@crates__windows-sys-0.61.2//:windows_sys\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"winreg-0.56.0\",\n actual = \"@crates__winreg-0.56.0//:winreg\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"winreg\",\n actual = \"@crates__winreg-0.56.0//:winreg\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"x11rb-0.13.2\",\n actual = \"@crates__x11rb-0.13.2//:x11rb\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"x11rb\",\n actual = \"@crates__x11rb-0.13.2//:x11rb\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"xcap-0.9.6\",\n actual = \"@crates__xcap-0.9.6//:xcap\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"xcap\",\n actual = \"@crates__xcap-0.9.6//:xcap\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"xkeysym-0.2.1\",\n actual = \"@crates__xkeysym-0.2.1//:xkeysym\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"xkeysym\",\n actual = \"@crates__xkeysym-0.2.1//:xkeysym\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"xxhash-rust-0.8.18\",\n actual = \"@crates__xxhash-rust-0.8.18//:xxhash_rust\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"xxhash-rust\",\n actual = \"@crates__xxhash-rust-0.8.18//:xxhash_rust\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"yansi-1.0.1\",\n actual = \"@crates__yansi-1.0.1//:yansi\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"yansi\",\n actual = \"@crates__yansi-1.0.1//:yansi\",\n tags = [\"manual\"],\n)\n", "alias_rules.bzl": "\"\"\"Alias that transitions its target to `compilation_mode=opt`. Use `transition_alias=\"opt\"` to enable.\"\"\"\n\nload(\"@rules_cc//cc:defs.bzl\", \"CcInfo\")\nload(\"@rules_rust//rust:rust_common.bzl\", \"COMMON_PROVIDERS\")\n\ndef _transition_alias_impl(ctx):\n # `ctx.attr.actual` is a list of 1 item due to the transition\n providers = [ctx.attr.actual[0][provider] for provider in COMMON_PROVIDERS]\n if CcInfo in ctx.attr.actual[0]:\n providers.append(ctx.attr.actual[0][CcInfo])\n return providers\n\ndef _change_compilation_mode(compilation_mode):\n def _change_compilation_mode_impl(_settings, _attr):\n return {\n \"//command_line_option:compilation_mode\": compilation_mode,\n }\n\n return transition(\n implementation = _change_compilation_mode_impl,\n inputs = [],\n outputs = [\n \"//command_line_option:compilation_mode\",\n ],\n )\n\ndef _transition_alias_rule(compilation_mode):\n return rule(\n implementation = _transition_alias_impl,\n provides = COMMON_PROVIDERS,\n attrs = {\n \"actual\": attr.label(\n mandatory = True,\n doc = \"`rust_library()` target to transition to `compilation_mode=opt`.\",\n providers = COMMON_PROVIDERS,\n cfg = _change_compilation_mode(compilation_mode),\n ),\n \"_allowlist_function_transition\": attr.label(\n default = \"@bazel_tools//tools/allowlists/function_transition_allowlist\",\n ),\n },\n doc = \"Transitions a Rust library crate to the `compilation_mode=opt`.\",\n )\n\ntransition_alias_dbg = _transition_alias_rule(\"dbg\")\ntransition_alias_fastbuild = _transition_alias_rule(\"fastbuild\")\ntransition_alias_opt = _transition_alias_rule(\"opt\")\n", - "crates.bzl": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\"\"\"\n# `crates_repository` API\n\n- [aliases](#aliases)\n- [crate_edition](#crate_edition)\n- [crate_deps](#crate_deps)\n- [all_crate_deps](#all_crate_deps)\n- [crate_repositories](#crate_repositories)\n\n\"\"\"\n\nload(\"@bazel_tools//tools/build_defs/repo:git.bzl\", \"git_repository\")\nload(\"@bazel_tools//tools/build_defs/repo:http.bzl\", \"http_archive\")\nload(\"@bazel_tools//tools/build_defs/repo:utils.bzl\", \"maybe\")\nload(\"@bazel_skylib//lib:selects.bzl\", \"selects\")\nload(\"@rules_rust//crate_universe:defs.bzl\", \"crates_vendor_remote_repository\", \"local_crate_mirror\")\n\n###############################################################################\n# MACROS API\n###############################################################################\n\n# An identifier that represent common dependencies (unconditional).\n_COMMON_CONDITION = \"\"\n\ndef _flatten_dependency_maps(all_dependency_maps):\n \"\"\"Flatten a list of dependency maps into one dictionary.\n\n Dependency maps have the following structure:\n\n ```python\n DEPENDENCIES_MAP = {\n # The first key in the map is a Bazel package\n # name of the workspace this file is defined in.\n \"workspace_member_package\": {\n\n # Not all dependencies are supported for all platforms.\n # the condition key is the condition required to be true\n # on the host platform.\n \"condition\": {\n\n # An alias to a crate target. # The label of the crate target the\n # Aliases are only crate names. # package name refers to.\n \"package_name\": \"@full//:label\",\n }\n }\n }\n ```\n\n Args:\n all_dependency_maps (list): A list of dicts as described above\n\n Returns:\n dict: A dictionary as described above\n \"\"\"\n dependencies = {}\n\n for workspace_deps_map in all_dependency_maps:\n for pkg_name, conditional_deps_map in workspace_deps_map.items():\n if pkg_name not in dependencies:\n non_frozen_map = dict()\n for key, values in conditional_deps_map.items():\n non_frozen_map.update({key: dict(values.items())})\n dependencies.setdefault(pkg_name, non_frozen_map)\n continue\n\n for condition, deps_map in conditional_deps_map.items():\n # If the condition has not been recorded, do so and continue\n if condition not in dependencies[pkg_name]:\n dependencies[pkg_name].setdefault(condition, dict(deps_map.items()))\n continue\n\n # Alert on any miss-matched dependencies\n inconsistent_entries = []\n for crate_name, crate_label in deps_map.items():\n existing = dependencies[pkg_name][condition].get(crate_name)\n if existing and existing != crate_label:\n inconsistent_entries.append((crate_name, existing, crate_label))\n dependencies[pkg_name][condition].update({crate_name: crate_label})\n\n return dependencies\n\ndef crate_deps(deps, package_name = None):\n \"\"\"Finds the fully qualified label of the requested crates for the package where this macro is called.\n\n Args:\n deps (list): The desired list of crate targets.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()`.\n\n Returns:\n list: A list of labels to generated rust targets (str)\n \"\"\"\n\n if not deps:\n return []\n\n if package_name == None:\n package_name = native.package_name()\n\n # Join both sets of dependencies\n dependencies = _flatten_dependency_maps([\n _NORMAL_DEPENDENCIES,\n _NORMAL_DEV_DEPENDENCIES,\n _PROC_MACRO_DEPENDENCIES,\n _PROC_MACRO_DEV_DEPENDENCIES,\n _BUILD_DEPENDENCIES,\n _BUILD_PROC_MACRO_DEPENDENCIES,\n ]).pop(package_name, {})\n\n # Combine all conditional packages so we can easily index over a flat list\n # TODO: Perhaps this should actually return select statements and maintain\n # the conditionals of the dependencies\n flat_deps = {}\n for deps_set in dependencies.values():\n for crate_name, crate_label in deps_set.items():\n flat_deps.update({crate_name: crate_label})\n\n missing_crates = []\n crate_targets = []\n for crate_target in deps:\n if crate_target not in flat_deps:\n missing_crates.append(crate_target)\n else:\n crate_targets.append(flat_deps[crate_target])\n\n if missing_crates:\n fail(\"Could not find crates `{}` among dependencies of `{}`. Available dependencies were `{}`\".format(\n missing_crates,\n package_name,\n dependencies,\n ))\n\n return crate_targets\n\ndef crate_edition(package_name = None):\n \"\"\"Finds the Rust edition for the package where this macro is called.\n\n Args:\n package_name (str, optional): The package name whose edition should be\n looked up. Defaults to `native.package_name()` when unset.\n\n Returns:\n str: The Rust edition declared by the package's Cargo.toml file.\n \"\"\"\n if package_name == None:\n package_name = native.package_name()\n\n if package_name not in _CRATE_EDITIONS:\n fail(\"Tried to get crate_edition for package \" + package_name + \" but that package had no Cargo.toml file\")\n\n return _CRATE_EDITIONS[package_name]\n\ndef all_crate_deps(\n normal = False, \n normal_dev = False, \n proc_macro = False, \n proc_macro_dev = False,\n build = False,\n build_proc_macro = False,\n package_name = None):\n \"\"\"Finds the fully qualified label of all requested direct crate dependencies \\\n for the package where this macro is called.\n\n If no parameters are set, all normal dependencies are returned. Setting any one flag will\n otherwise impact the contents of the returned list.\n\n Args:\n normal (bool, optional): If True, normal dependencies are included in the\n output list.\n normal_dev (bool, optional): If True, normal dev dependencies will be\n included in the output list.\n proc_macro (bool, optional): If True, proc_macro dependencies are included\n in the output list.\n proc_macro_dev (bool, optional): If True, dev proc_macro dependencies are\n included in the output list.\n build (bool, optional): If True, build dependencies are included\n in the output list.\n build_proc_macro (bool, optional): If True, build proc_macro dependencies are\n included in the output list.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()` when unset.\n\n Returns:\n list: A list of labels to generated rust targets (str)\n \"\"\"\n\n if package_name == None:\n package_name = native.package_name()\n\n # Determine the relevant maps to use\n all_dependency_maps = []\n if normal:\n all_dependency_maps.append(_NORMAL_DEPENDENCIES)\n if normal_dev:\n all_dependency_maps.append(_NORMAL_DEV_DEPENDENCIES)\n if proc_macro:\n all_dependency_maps.append(_PROC_MACRO_DEPENDENCIES)\n if proc_macro_dev:\n all_dependency_maps.append(_PROC_MACRO_DEV_DEPENDENCIES)\n if build:\n all_dependency_maps.append(_BUILD_DEPENDENCIES)\n if build_proc_macro:\n all_dependency_maps.append(_BUILD_PROC_MACRO_DEPENDENCIES)\n\n # Default to always using normal dependencies\n if not all_dependency_maps:\n all_dependency_maps.append(_NORMAL_DEPENDENCIES)\n\n dependencies = _flatten_dependency_maps(all_dependency_maps).pop(package_name, None)\n\n if not dependencies:\n if dependencies == None:\n fail(\"Tried to get all_crate_deps for package \" + package_name + \" but that package had no Cargo.toml file\")\n else:\n return []\n\n crate_deps = list(dependencies.pop(_COMMON_CONDITION, {}).values())\n for condition, deps in dependencies.items():\n crate_deps += selects.with_or({\n tuple(_CONDITIONS[condition]): deps.values(),\n \"//conditions:default\": [],\n })\n\n return crate_deps\n\ndef aliases(\n normal = False,\n normal_dev = False,\n proc_macro = False,\n proc_macro_dev = False,\n build = False,\n build_proc_macro = False,\n package_name = None):\n \"\"\"Produces a map of Crate alias names to their original label\n\n If no dependency kinds are specified, `normal` and `proc_macro` are used by default.\n Setting any one flag will otherwise determine the contents of the returned dict.\n\n Args:\n normal (bool, optional): If True, normal dependencies are included in the\n output list.\n normal_dev (bool, optional): If True, normal dev dependencies will be\n included in the output list..\n proc_macro (bool, optional): If True, proc_macro dependencies are included\n in the output list.\n proc_macro_dev (bool, optional): If True, dev proc_macro dependencies are\n included in the output list.\n build (bool, optional): If True, build dependencies are included\n in the output list.\n build_proc_macro (bool, optional): If True, build proc_macro dependencies are\n included in the output list.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()` when unset.\n\n Returns:\n dict: The aliases of all associated packages\n \"\"\"\n if package_name == None:\n package_name = native.package_name()\n\n # Determine the relevant maps to use\n all_aliases_maps = []\n if normal:\n all_aliases_maps.append(_NORMAL_ALIASES)\n if normal_dev:\n all_aliases_maps.append(_NORMAL_DEV_ALIASES)\n if proc_macro:\n all_aliases_maps.append(_PROC_MACRO_ALIASES)\n if proc_macro_dev:\n all_aliases_maps.append(_PROC_MACRO_DEV_ALIASES)\n if build:\n all_aliases_maps.append(_BUILD_ALIASES)\n if build_proc_macro:\n all_aliases_maps.append(_BUILD_PROC_MACRO_ALIASES)\n\n # Default to always using normal aliases\n if not all_aliases_maps:\n all_aliases_maps.append(_NORMAL_ALIASES)\n all_aliases_maps.append(_PROC_MACRO_ALIASES)\n\n aliases = _flatten_dependency_maps(all_aliases_maps).pop(package_name, None)\n\n if not aliases:\n return dict()\n\n common_items = aliases.pop(_COMMON_CONDITION, {}).items()\n\n # If there are only common items in the dictionary, immediately return them\n if not len(aliases.keys()) == 1:\n return dict(common_items)\n\n # Build a single select statement where each conditional has accounted for the\n # common set of aliases.\n crate_aliases = {\"//conditions:default\": dict(common_items)}\n for condition, deps in aliases.items():\n condition_triples = _CONDITIONS[condition]\n for triple in condition_triples:\n if triple in crate_aliases:\n crate_aliases[triple].update(deps)\n else:\n crate_aliases.update({triple: dict(deps.items() + common_items)})\n\n return select(crate_aliases)\n\n###############################################################################\n# WORKSPACE MEMBER DEPS, ALIASES, AND EDITIONS\n###############################################################################\n\n_CRATE_EDITIONS = {\n \"crates/vendor/brush-builtins\": \"2024\",\n \"crates/vendor/brush-core\": \"2024\",\n \"crates/vendor/jaq\": \"2024\",\n \"crates/pi-ast\": \"2024\",\n \"crates/pi-iso\": \"2024\",\n \"crates/pi-natives\": \"2024\",\n \"crates/pi-shell\": \"2024\",\n \"crates/pi-uutils-ctx\": \"2024\",\n \"crates/pi-walker\": \"2024\",\n \"crates/pi-uu-diff\": \"2024\",\n \"crates/pi-uu-grep\": \"2024\",\n \"crates/vendor/uu-b2sum\": \"2024\",\n \"crates/vendor/uu-base32\": \"2024\",\n \"crates/vendor/uu-base64\": \"2024\",\n \"crates/vendor/uu-basename\": \"2024\",\n \"crates/vendor/uu-cat\": \"2024\",\n \"crates/vendor/uu-checksum-common\": \"2024\",\n \"crates/vendor/uu-comm\": \"2024\",\n \"crates/vendor/uu-cut\": \"2024\",\n \"crates/vendor/uu-date\": \"2024\",\n \"crates/vendor/uu-dirname\": \"2024\",\n \"crates/vendor/uu-find\": \"2024\",\n \"crates/vendor/uu-head\": \"2024\",\n \"crates/vendor/uu-hostname\": \"2024\",\n \"crates/vendor/uu-ln\": \"2024\",\n \"crates/vendor/uu-ls\": \"2024\",\n \"crates/vendor/uu-md5sum\": \"2024\",\n \"crates/vendor/uu-mkdir\": \"2024\",\n \"crates/vendor/uu-mktemp\": \"2024\",\n \"crates/vendor/uu-mv\": \"2024\",\n \"crates/vendor/uu-nproc\": \"2024\",\n \"crates/vendor/uu-paste\": \"2024\",\n \"crates/vendor/uu-printenv\": \"2024\",\n \"crates/vendor/uu-readlink\": \"2024\",\n \"crates/vendor/uu-realpath\": \"2024\",\n \"crates/vendor/uu-rm\": \"2024\",\n \"crates/vendor/uu-sed\": \"2024\",\n \"crates/vendor/uu-seq\": \"2024\",\n \"crates/vendor/uu-sha1sum\": \"2024\",\n \"crates/vendor/uu-sha224sum\": \"2024\",\n \"crates/vendor/uu-sha256sum\": \"2024\",\n \"crates/vendor/uu-sha384sum\": \"2024\",\n \"crates/vendor/uu-sha512sum\": \"2024\",\n \"crates/vendor/uu-sort\": \"2024\",\n \"crates/vendor/uu-stat\": \"2024\",\n \"crates/vendor/uu-tac\": \"2024\",\n \"crates/vendor/uu-tail\": \"2024\",\n \"crates/vendor/uu-tee\": \"2024\",\n \"crates/vendor/uu-touch\": \"2024\",\n \"crates/vendor/uu-tr\": \"2024\",\n \"crates/vendor/uu-truncate\": \"2024\",\n \"crates/vendor/uu-uname\": \"2024\",\n \"crates/vendor/uu-uniq\": \"2024\",\n \"crates/vendor/uu-wc\": \"2024\",\n \"crates/vendor/uu-whoami\": \"2024\",\n \"crates/vendor/uu-xargs\": \"2024\",\n \"crates/vendor/uu-yes\": \"2024\",\n}\n\n_NORMAL_DEPENDENCIES = {\n \"crates/vendor/brush-builtins\": {\n _COMMON_CONDITION: {\n \"brush-parser\": Label(\"//brush-parser-0.4.0\"),\n \"cfg-if\": Label(\"//cfg-if-1.0.4\"),\n \"chrono\": Label(\"//chrono-0.4.45\"),\n \"clap\": Label(\"//clap-4.6.4\"),\n \"fancy-regex\": Label(\"//fancy-regex-0.17.0\"),\n \"futures\": Label(\"//futures-0.3.33\"),\n \"itertools\": Label(\"//itertools-0.14.0\"),\n \"strum\": Label(\"//strum-0.28.0\"),\n \"thiserror\": Label(\"//thiserror-2.0.19\"),\n \"tracing\": Label(\"//tracing-0.1.44\"),\n },\n \"cfg(any(target_os = \\\"linux\\\", target_os = \\\"android\\\"))\": {\n \"procfs\": Label(\"//procfs-0.18.0\"),\n },\n \"cfg(any(unix, windows))\": {\n \"tokio\": Label(\"//tokio-1.53.1\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n \"cfg(target_family = \\\"wasm\\\")\": {\n \"tokio\": Label(\"//tokio-1.53.1\"),\n },\n \"cfg(unix)\": {\n \"nix\": Label(\"//nix-0.31.3\"),\n \"rlimit\": Label(\"//rlimit-0.11.0\"),\n },\n },\n \"crates/vendor/brush-core\": {\n _COMMON_CONDITION: {\n \"bon\": Label(\"//bon-3.9.3\"),\n \"brush-parser\": Label(\"//brush-parser-0.4.0\"),\n \"cached\": Label(\"//cached-0.59.0\"),\n \"cfg-if\": Label(\"//cfg-if-1.0.4\"),\n \"chrono\": Label(\"//chrono-0.4.45\"),\n \"clap\": Label(\"//clap-4.6.4\"),\n \"color-print\": Label(\"//color-print-0.3.7\"),\n \"fancy-regex\": Label(\"//fancy-regex-0.17.0\"),\n \"futures\": Label(\"//futures-0.3.33\"),\n \"itertools\": Label(\"//itertools-0.14.0\"),\n \"normalize-path\": Label(\"//normalize-path-0.2.1\"),\n \"rand\": Label(\"//rand-0.10.2\"),\n \"rpds\": Label(\"//rpds-1.2.1\"),\n \"strum\": Label(\"//strum-0.28.0\"),\n \"thiserror\": Label(\"//thiserror-2.0.19\"),\n \"tokio-util\": Label(\"//tokio-util-0.7.19\"),\n \"tracing\": Label(\"//tracing-0.1.44\"),\n },\n \"cfg(any(unix, windows))\": {\n \"hostname\": Label(\"//hostname-0.4.2\"),\n \"tokio\": Label(\"//tokio-1.53.1\"),\n },\n \"cfg(target_family = \\\"wasm\\\")\": {\n \"tokio\": Label(\"//tokio-1.53.1\"),\n },\n \"cfg(unix)\": {\n \"command-fds\": Label(\"//command-fds-0.3.3\"),\n \"libc\": Label(\"//libc-0.2.189\"),\n \"nix\": Label(\"//nix-0.31.3\"),\n \"terminfo\": Label(\"//terminfo-0.9.0\"),\n \"uzers\": Label(\"//uzers-0.12.2\"),\n },\n \"cfg(windows)\": {\n \"check_elevation\": Label(\"//check_elevation-0.2.7\"),\n \"whoami\": Label(\"//whoami-2.1.2\"),\n \"windows-sys\": Label(\"//windows-sys-0.59.0\"),\n },\n \"wasm32-unknown-unknown\": {\n \"getrandom\": Label(\"//getrandom-0.4.3\"),\n \"uuid\": Label(\"//uuid-1.24.0\"),\n },\n },\n \"crates/vendor/jaq\": {\n _COMMON_CONDITION: {\n \"codesnake\": Label(\"//codesnake-0.2.1\"),\n \"hifijson\": Label(\"//hifijson-0.2.3\"),\n \"jaq-core\": Label(\"//jaq-core-2.2.1\"),\n \"jaq-json\": Label(\"//jaq-json-1.1.3\"),\n \"jaq-std\": Label(\"//jaq-std-2.1.2\"),\n \"memmap2\": Label(\"//memmap2-0.9.11\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n \"unicode-width\": Label(\"//unicode-width-0.1.14\"),\n \"yansi\": Label(\"//yansi-1.0.1\"),\n },\n },\n \"crates/pi-ast\": {\n _COMMON_CONDITION: {\n \"anyhow\": Label(\"//anyhow-1.0.104\"),\n \"ast-grep-core\": Label(\"//ast-grep-core-0.39.9\"),\n \"globset\": Label(\"//globset-0.4.19\"),\n \"ignore\": Label(\"//ignore-0.4.31\"),\n \"phf\": Label(\"//phf-0.13.1\"),\n \"serde\": Label(\"//serde-1.0.229\"),\n \"tree-sitter\": Label(\"//tree-sitter-0.25.10\"),\n \"tree_sitter_astro\": Label(\"//tree-sitter-astro-next-0.1.1\"),\n \"tree-sitter-bash\": Label(\"//tree-sitter-bash-0.25.1\"),\n \"tree-sitter-c\": Label(\"//tree-sitter-c-0.24.2\"),\n \"tree-sitter-c-sharp\": Label(\"//tree-sitter-c-sharp-0.23.5\"),\n \"tree-sitter-clojure\": Label(\"//tree-sitter-clojure-0.1.0\"),\n \"tree-sitter-cmake\": Label(\"//tree-sitter-cmake-0.7.4\"),\n \"tree-sitter-cpp\": Label(\"//tree-sitter-cpp-0.23.4\"),\n \"tree-sitter-css\": Label(\"//tree-sitter-css-0.25.0\"),\n \"tree-sitter-dart\": Label(\"//tree-sitter-dart-0.2.0\"),\n \"tree-sitter-diff\": Label(\"//tree-sitter-diff-0.1.0\"),\n \"tree_sitter_dockerfile\": Label(\"//tree-sitter-dockerfile-updated-0.2.0\"),\n \"tree-sitter-elisp\": Label(\"//tree-sitter-elisp-1.6.1\"),\n \"tree-sitter-elixir\": Label(\"//tree-sitter-elixir-0.3.5\"),\n \"tree-sitter-erlang\": Label(\"//tree-sitter-erlang-0.16.0\"),\n \"tree-sitter-fortran\": Label(\"//tree-sitter-fortran-0.6.0\"),\n \"tree-sitter-go\": Label(\"//tree-sitter-go-0.25.0\"),\n \"tree-sitter-graphql\": Label(\"//tree-sitter-graphql-0.1.0\"),\n \"tree-sitter-haskell\": Label(\"//tree-sitter-haskell-0.23.1\"),\n \"tree-sitter-hcl\": Label(\"//tree-sitter-hcl-1.1.0\"),\n \"tree-sitter-html\": Label(\"//tree-sitter-html-0.23.2\"),\n \"tree-sitter-ini\": Label(\"//tree-sitter-ini-1.4.0\"),\n \"tree-sitter-java\": Label(\"//tree-sitter-java-0.23.5\"),\n \"tree-sitter-javascript\": Label(\"//tree-sitter-javascript-0.25.0\"),\n \"tree-sitter-json\": Label(\"//tree-sitter-json-0.24.8\"),\n \"tree-sitter-julia\": Label(\"//tree-sitter-julia-0.23.1\"),\n \"tree-sitter-just\": Label(\"//tree-sitter-just-0.2.0\"),\n \"tree_sitter_kotlin\": Label(\"//tree-sitter-kotlin-sg-0.4.1\"),\n \"tree-sitter-lua\": Label(\"//tree-sitter-lua-0.5.0\"),\n \"tree-sitter-make\": Label(\"//tree-sitter-make-1.1.1\"),\n \"tree-sitter-md\": Label(\"//tree-sitter-md-0.5.3\"),\n \"tree-sitter-nix\": Label(\"//tree-sitter-nix-0.3.0\"),\n \"tree-sitter-objc\": Label(\"//tree-sitter-objc-3.0.2\"),\n \"tree-sitter-ocaml\": Label(\"//tree-sitter-ocaml-0.24.2\"),\n \"tree-sitter-odin\": Label(\"//tree-sitter-odin-1.3.0\"),\n \"tree-sitter-php\": Label(\"//tree-sitter-php-0.24.2\"),\n \"tree-sitter-powershell\": Label(\"//tree-sitter-powershell-0.26.4\"),\n \"tree-sitter-proto\": Label(\"//tree-sitter-proto-0.4.0\"),\n \"tree-sitter-python\": Label(\"//tree-sitter-python-0.25.0\"),\n \"tree-sitter-r\": Label(\"//tree-sitter-r-1.3.0\"),\n \"tree-sitter-regex\": Label(\"//tree-sitter-regex-0.25.0\"),\n \"tree-sitter-ruby\": Label(\"//tree-sitter-ruby-0.23.1\"),\n \"tree-sitter-rust\": Label(\"//tree-sitter-rust-0.24.2\"),\n \"tree-sitter-scala\": Label(\"//tree-sitter-scala-0.26.0\"),\n \"tree_sitter_sql\": Label(\"//tree-sitter-sequel-0.3.11\"),\n \"tree-sitter-solidity\": Label(\"//tree-sitter-solidity-1.2.13\"),\n \"tree-sitter-starlark\": Label(\"//tree-sitter-starlark-1.3.0\"),\n \"tree_sitter_svelte\": Label(\"//tree-sitter-svelte-next-0.1.1\"),\n \"tree-sitter-swift\": Label(\"//tree-sitter-swift-0.7.3\"),\n \"tree-sitter-tlaplus\": Label(\"//tree-sitter-tlaplus-1.5.0\"),\n \"tree-sitter-toml-ng\": Label(\"//tree-sitter-toml-ng-0.7.0\"),\n \"tree-sitter-typescript\": Label(\"//tree-sitter-typescript-0.23.2\"),\n \"tree-sitter-verilog\": Label(\"//tree-sitter-verilog-1.0.3\"),\n \"tree_sitter_vue\": Label(\"//tree-sitter-vue-next-0.1.0\"),\n \"tree-sitter-xml\": Label(\"//tree-sitter-xml-0.7.0\"),\n \"tree-sitter-yaml\": Label(\"//tree-sitter-yaml-0.7.2\"),\n \"tree-sitter-zig\": Label(\"//tree-sitter-zig-1.1.2\"),\n },\n },\n \"crates/pi-iso\": {\n _COMMON_CONDITION: {\n \"similar\": Label(\"//similar-3.1.1\"),\n \"tokio\": Label(\"//tokio-1.53.1\"),\n },\n \"cfg(target_os = \\\"linux\\\")\": {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n },\n \"cfg(unix)\": {\n \"libc\": Label(\"//libc-0.2.189\"),\n },\n \"cfg(windows)\": {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"windows-sys\": Label(\"//windows-sys-0.61.2\"),\n },\n },\n \"crates/pi-natives\": {\n _COMMON_CONDITION: {\n \"anyhow\": Label(\"//anyhow-1.0.104\"),\n \"arboard\": Label(\"//arboard-3.6.1\"),\n \"ast-grep-core\": Label(\"//ast-grep-core-0.39.9\"),\n \"audiopus_sys\": Label(\"//audiopus_sys-0.2.2\"),\n \"base64\": Label(\"//base64-0.22.1\"),\n \"bytes\": Label(\"//bytes-1.12.1\"),\n \"clap\": Label(\"//clap-4.6.4\"),\n \"flume\": Label(\"//flume-0.11.1\"),\n \"fontdue\": Label(\"//fontdue-0.9.3\"),\n \"globset\": Label(\"//globset-0.4.19\"),\n \"grep-matcher\": Label(\"//grep-matcher-0.1.9\"),\n \"grep-pcre2\": Label(\"//grep-pcre2-0.1.10\"),\n \"grep-regex\": Label(\"//grep-regex-0.1.14\"),\n \"grep-searcher\": Label(\"//grep-searcher-0.1.17\"),\n \"html-to-markdown-rs\": Label(\"//html-to-markdown-rs-2.30.0\"),\n \"icy_sixel\": Label(\"//icy_sixel-0.5.0\"),\n \"ignore\": Label(\"//ignore-0.4.31\"),\n \"image\": Label(\"//image-0.25.10\"),\n \"inferno\": Label(\"//inferno-0.12.8\"),\n \"maudio\": Label(\"//maudio-0.1.6\"),\n \"napi\": Label(\"//napi-3.11.0\"),\n \"opus\": Label(\"//opus-0.3.1\"),\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"phf\": Label(\"//phf-0.13.1\"),\n \"png\": Label(\"//png-0.18.1\"),\n \"portable-pty\": Label(\"//portable-pty-0.9.0\"),\n \"rayon\": Label(\"//rayon-1.12.0\"),\n \"regex\": Label(\"//regex-1.13.1\"),\n \"serde\": Label(\"//serde-1.0.229\"),\n \"serde_json\": Label(\"//serde_json-1.0.151\"),\n \"smallvec\": Label(\"//smallvec-1.15.2\"),\n \"syntect\": Label(\"//syntect-5.3.0\"),\n \"tiktoken-rs\": Label(\"//tiktoken-rs-0.11.0\"),\n \"tokio\": Label(\"//tokio-1.53.1\"),\n \"tokio-util\": Label(\"//tokio-util-0.7.19\"),\n \"toml\": Label(\"//toml-1.1.3+spec-1.1.0\"),\n \"unicode-segmentation\": Label(\"//unicode-segmentation-1.13.3\"),\n \"unicode-width\": Label(\"//unicode-width-0.2.2\"),\n \"webrtc\": Label(\"//webrtc-0.17.2\"),\n \"xxhash-rust\": Label(\"//xxhash-rust-0.8.18\"),\n },\n \"cfg(any(target_os = \\\"macos\\\", target_os = \\\"windows\\\"))\": {\n \"enigo\": Label(\"//enigo-0.6.1\"),\n \"xcap\": Label(\"//xcap-0.9.6\"),\n },\n \"cfg(target_os = \\\"linux\\\")\": {\n \"x11rb\": Label(\"//x11rb-0.13.2\"),\n \"xkeysym\": Label(\"//xkeysym-0.2.1\"),\n },\n \"cfg(target_os = \\\"macos\\\")\": {\n \"core-graphics\": Label(\"//core-graphics-0.25.0\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n \"cfg(unix)\": {\n \"libc\": Label(\"//libc-0.2.189\"),\n },\n \"cfg(windows)\": {\n \"clipboard-win\": Label(\"//clipboard-win-5.4.1\"),\n \"windows-sys\": Label(\"//windows-sys-0.61.2\"),\n \"winreg\": Label(\"//winreg-0.56.0\"),\n },\n },\n \"crates/pi-shell\": {\n _COMMON_CONDITION: {\n \"anyhow\": Label(\"//anyhow-1.0.104\"),\n \"brush-parser\": Label(\"//brush-parser-0.3.0\"),\n \"bytes\": Label(\"//bytes-1.12.1\"),\n \"clap\": Label(\"//clap-4.6.4\"),\n \"flume\": Label(\"//flume-0.11.1\"),\n \"globset\": Label(\"//globset-0.4.19\"),\n \"ignore\": Label(\"//ignore-0.4.31\"),\n \"jiff\": Label(\"//jiff-0.2.35\"),\n \"memchr\": Label(\"//memchr-2.8.3\"),\n \"os_pipe\": Label(\"//os_pipe-1.2.3\"),\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"regex\": Label(\"//regex-1.13.1\"),\n \"serde\": Label(\"//serde-1.0.229\"),\n \"serde_json\": Label(\"//serde_json-1.0.151\"),\n \"tokio\": Label(\"//tokio-1.53.1\"),\n \"tokio-util\": Label(\"//tokio-util-0.7.19\"),\n \"toml\": Label(\"//toml-1.1.3+spec-1.1.0\"),\n \"xxhash-rust\": Label(\"//xxhash-rust-0.8.18\"),\n },\n \"cfg(unix)\": {\n \"libc\": Label(\"//libc-0.2.189\"),\n },\n \"cfg(windows)\": {\n \"smallvec\": Label(\"//smallvec-1.15.2\"),\n \"windows-sys\": Label(\"//windows-sys-0.61.2\"),\n \"winreg\": Label(\"//winreg-0.56.0\"),\n },\n },\n \"crates/pi-uutils-ctx\": {\n \"cfg(unix)\": {\n \"libc\": Label(\"//libc-0.2.189\"),\n },\n },\n \"crates/pi-walker\": {\n _COMMON_CONDITION: {\n \"dashmap\": Label(\"//dashmap-6.2.1\"),\n \"globset\": Label(\"//globset-0.4.19\"),\n \"ignore\": Label(\"//ignore-0.4.31\"),\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"rayon\": Label(\"//rayon-1.12.0\"),\n },\n \"cfg(unix)\": {\n \"libc\": Label(\"//libc-0.2.189\"),\n },\n \"cfg(windows)\": {\n \"windows-sys\": Label(\"//windows-sys-0.61.2\"),\n },\n },\n \"crates/pi-uu-diff\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"similar\": Label(\"//similar-3.1.1\"),\n },\n },\n \"crates/pi-uu-grep\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"globset\": Label(\"//globset-0.4.19\"),\n \"grep-cli\": Label(\"//grep-cli-0.1.12\"),\n \"grep-matcher\": Label(\"//grep-matcher-0.1.9\"),\n \"grep-pcre2\": Label(\"//grep-pcre2-0.1.10\"),\n \"grep-printer\": Label(\"//grep-printer-0.3.1\"),\n \"grep-regex\": Label(\"//grep-regex-0.1.14\"),\n \"grep-searcher\": Label(\"//grep-searcher-0.1.17\"),\n \"ignore\": Label(\"//ignore-0.4.31\"),\n \"serde_json\": Label(\"//serde_json-1.0.151\"),\n },\n },\n \"crates/vendor/uu-b2sum\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-base32\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-base64\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-basename\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-cat\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"memchr\": Label(\"//memchr-2.8.3\"),\n \"thiserror\": Label(\"//thiserror-2.0.19\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-checksum-common\": {\n _COMMON_CONDITION: {\n \"base64-simd\": Label(\"//base64-simd-0.8.0\"),\n \"clap\": Label(\"//clap-4.6.4\"),\n \"hex\": Label(\"//hex-0.4.3\"),\n \"os_display\": Label(\"//os_display-0.1.4\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-comm\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-cut\": {\n _COMMON_CONDITION: {\n \"bstr\": Label(\"//bstr-1.13.0\"),\n \"clap\": Label(\"//clap-4.6.4\"),\n \"memchr\": Label(\"//memchr-2.8.3\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-date\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"jiff\": Label(\"//jiff-0.2.35\"),\n \"parse_datetime\": Label(\"//parse_datetime-0.14.0\"),\n \"regex\": Label(\"//regex-1.13.1\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n \"cfg(unix)\": {\n \"rustix\": Label(\"//rustix-1.1.4\"),\n },\n },\n \"crates/vendor/uu-dirname\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-find\": {\n _COMMON_CONDITION: {\n \"argmax\": Label(\"//argmax-0.3.1\"),\n \"chrono\": Label(\"//chrono-0.4.45\"),\n \"clap\": Label(\"//clap-4.6.4\"),\n \"faccess\": Label(\"//faccess-0.2.4\"),\n \"nix\": Label(\"//nix-0.29.0\"),\n \"onig\": Label(\"//onig-6.5.3\"),\n \"regex\": Label(\"//regex-1.13.1\"),\n \"uucore\": Label(\"//uucore-0.0.30\"),\n },\n },\n \"crates/vendor/uu-head\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"memchr\": Label(\"//memchr-2.8.3\"),\n \"thiserror\": Label(\"//thiserror-2.0.19\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-hostname\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"hostname\": Label(\"//hostname-0.4.2\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n \"cfg(any(target_os = \\\"freebsd\\\", target_os = \\\"openbsd\\\"))\": {\n \"dns-lookup\": Label(\"//dns-lookup-3.0.1\"),\n },\n \"cfg(target_os = \\\"windows\\\")\": {\n \"windows-sys\": Label(\"//windows-sys-0.61.2\"),\n },\n },\n \"crates/vendor/uu-ln\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"thiserror\": Label(\"//thiserror-2.0.19\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-ls\": {\n _COMMON_CONDITION: {\n \"ansi-width\": Label(\"//ansi-width-0.1.0\"),\n \"clap\": Label(\"//clap-4.6.4\"),\n \"glob\": Label(\"//glob-0.3.4\"),\n \"lscolors\": Label(\"//lscolors-0.21.0\"),\n \"rustc-hash\": Label(\"//rustc-hash-2.1.3\"),\n \"thiserror\": Label(\"//thiserror-2.0.19\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n \"uutils_term_grid\": Label(\"//uutils_term_grid-0.8.0\"),\n },\n \"cfg(not(target_os = \\\"wasi\\\"))\": {\n \"hostname\": Label(\"//hostname-0.4.2\"),\n },\n },\n \"crates/vendor/uu-md5sum\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-mkdir\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n \"cfg(unix)\": {\n \"rustix\": Label(\"//rustix-1.1.4\"),\n },\n },\n \"crates/vendor/uu-mktemp\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"rand\": Label(\"//rand-0.10.2\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n \"thiserror\": Label(\"//thiserror-2.0.19\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-mv\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"fs_extra\": Label(\"//fs_extra-1.3.0\"),\n \"indicatif\": Label(\"//indicatif-0.18.6\"),\n \"libc\": Label(\"//libc-0.2.189\"),\n \"rustc-hash\": Label(\"//rustc-hash-2.1.3\"),\n \"thiserror\": Label(\"//thiserror-2.0.19\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n \"cfg(windows)\": {\n \"windows-sys\": Label(\"//windows-sys-0.61.2\"),\n },\n },\n \"crates/vendor/uu-nproc\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"libc\": Label(\"//libc-0.2.189\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-paste\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-printenv\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-readlink\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-realpath\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-rm\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"indicatif\": Label(\"//indicatif-0.18.6\"),\n \"thiserror\": Label(\"//thiserror-2.0.19\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n \"cfg(unix)\": {\n \"libc\": Label(\"//libc-0.2.189\"),\n },\n \"cfg(windows)\": {\n \"windows-sys\": Label(\"//windows-sys-0.61.2\"),\n },\n },\n \"crates/vendor/uu-sed\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"fancy-regex\": Label(\"//fancy-regex-0.18.0\"),\n \"memchr\": Label(\"//memchr-2.8.3\"),\n \"regex\": Label(\"//regex-1.13.1\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n \"uucore\": Label(\"//uucore-0.9.0\"),\n },\n \"cfg(unix)\": {\n \"memmap2\": Label(\"//memmap2-0.9.11\"),\n },\n },\n \"crates/vendor/uu-seq\": {\n _COMMON_CONDITION: {\n \"bigdecimal\": Label(\"//bigdecimal-0.4.10\"),\n \"clap\": Label(\"//clap-4.6.4\"),\n \"num-bigint\": Label(\"//num-bigint-0.4.8\"),\n \"num-traits\": Label(\"//num-traits-0.2.19\"),\n \"thiserror\": Label(\"//thiserror-2.0.19\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-sha1sum\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-sha224sum\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-sha256sum\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-sha384sum\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-sha512sum\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-sort\": {\n _COMMON_CONDITION: {\n \"bigdecimal\": Label(\"//bigdecimal-0.4.10\"),\n \"binary-heap-plus\": Label(\"//binary-heap-plus-0.5.0\"),\n \"clap\": Label(\"//clap-4.6.4\"),\n \"compare\": Label(\"//compare-0.1.0\"),\n \"flume\": Label(\"//flume-0.11.1\"),\n \"foldhash\": Label(\"//foldhash-0.2.0\"),\n \"itertools\": Label(\"//itertools-0.14.0\"),\n \"memchr\": Label(\"//memchr-2.8.3\"),\n \"rand\": Label(\"//rand-0.10.2\"),\n \"rayon\": Label(\"//rayon-1.12.0\"),\n \"self_cell\": Label(\"//self_cell-1.3.0\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n \"thiserror\": Label(\"//thiserror-2.0.19\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n \"cfg(unix)\": {\n \"nix\": Label(\"//nix-0.31.3\"),\n },\n },\n \"crates/vendor/uu-stat\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"thiserror\": Label(\"//thiserror-2.0.19\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n \"cfg(windows)\": {\n \"windows-sys\": Label(\"//windows-sys-0.61.2\"),\n },\n },\n \"crates/vendor/uu-tac\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"memchr\": Label(\"//memchr-2.8.3\"),\n \"memmap2\": Label(\"//memmap2-0.9.11\"),\n \"regex\": Label(\"//regex-1.13.1\"),\n \"thiserror\": Label(\"//thiserror-2.0.19\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-tail\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"memchr\": Label(\"//memchr-2.8.3\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n \"cfg(not(target_os = \\\"wasi\\\"))\": {\n \"libc\": Label(\"//libc-0.2.189\"),\n \"notify\": Label(\"//notify-8.2.0\"),\n },\n \"cfg(unix)\": {\n \"rustix\": Label(\"//rustix-1.1.4\"),\n },\n \"cfg(windows)\": {\n \"windows-sys\": Label(\"//windows-sys-0.61.2\"),\n },\n },\n \"crates/vendor/uu-tee\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-touch\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"filetime\": Label(\"//filetime-0.2.29\"),\n \"jiff\": Label(\"//jiff-0.2.35\"),\n \"parse_datetime\": Label(\"//parse_datetime-0.14.0\"),\n \"thiserror\": Label(\"//thiserror-2.0.19\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n \"cfg(unix)\": {\n \"libc\": Label(\"//libc-0.2.189\"),\n \"rustix\": Label(\"//rustix-1.1.4\"),\n },\n \"cfg(windows)\": {\n \"windows-sys\": Label(\"//windows-sys-0.61.2\"),\n },\n },\n \"crates/vendor/uu-tr\": {\n _COMMON_CONDITION: {\n \"bytecount\": Label(\"//bytecount-0.6.9\"),\n \"clap\": Label(\"//clap-4.6.4\"),\n \"nom\": Label(\"//nom-8.0.0\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-truncate\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-uname\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"platform-info\": Label(\"//platform-info-2.1.0\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-uniq\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-wc\": {\n _COMMON_CONDITION: {\n \"bytecount\": Label(\"//bytecount-0.6.9\"),\n \"clap\": Label(\"//clap-4.6.4\"),\n \"thiserror\": Label(\"//thiserror-2.0.19\"),\n \"unicode-width\": Label(\"//unicode-width-0.2.2\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n \"cfg(unix)\": {\n \"libc\": Label(\"//libc-0.2.189\"),\n \"rustix\": Label(\"//rustix-1.1.4\"),\n },\n },\n \"crates/vendor/uu-whoami\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n \"cfg(target_os = \\\"windows\\\")\": {\n \"windows-sys\": Label(\"//windows-sys-0.61.2\"),\n },\n },\n \"crates/vendor/uu-xargs\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"libc\": Label(\"//libc-0.2.189\"),\n },\n },\n \"crates/vendor/uu-yes\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"itertools\": Label(\"//itertools-0.14.0\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n}\n\n\n_NORMAL_ALIASES = {\n \"crates/vendor/brush-builtins\": {\n _COMMON_CONDITION: {\n },\n \"cfg(any(target_os = \\\"linux\\\", target_os = \\\"android\\\"))\": {\n },\n \"cfg(any(unix, windows))\": {\n },\n \"cfg(target_family = \\\"wasm\\\")\": {\n },\n \"cfg(unix)\": {\n },\n },\n \"crates/vendor/brush-core\": {\n _COMMON_CONDITION: {\n },\n \"cfg(any(unix, windows))\": {\n },\n \"cfg(target_family = \\\"wasm\\\")\": {\n },\n \"cfg(unix)\": {\n },\n \"cfg(windows)\": {\n },\n \"wasm32-unknown-unknown\": {\n },\n },\n \"crates/vendor/jaq\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/pi-ast\": {\n _COMMON_CONDITION: {\n Label(\"//tree-sitter-astro-next-0.1.1\"): \"tree_sitter_astro\",\n Label(\"//tree-sitter-dockerfile-updated-0.2.0\"): \"tree_sitter_dockerfile\",\n Label(\"//tree-sitter-kotlin-sg-0.4.1\"): \"tree_sitter_kotlin\",\n Label(\"//tree-sitter-sequel-0.3.11\"): \"tree_sitter_sql\",\n Label(\"//tree-sitter-svelte-next-0.1.1\"): \"tree_sitter_svelte\",\n Label(\"//tree-sitter-vue-next-0.1.0\"): \"tree_sitter_vue\",\n },\n },\n \"crates/pi-iso\": {\n _COMMON_CONDITION: {\n },\n \"cfg(target_os = \\\"linux\\\")\": {\n },\n \"cfg(unix)\": {\n },\n \"cfg(windows)\": {\n },\n },\n \"crates/pi-natives\": {\n _COMMON_CONDITION: {\n },\n \"cfg(any(target_os = \\\"macos\\\", target_os = \\\"windows\\\"))\": {\n },\n \"cfg(target_os = \\\"linux\\\")\": {\n },\n \"cfg(target_os = \\\"macos\\\")\": {\n },\n \"cfg(unix)\": {\n },\n \"cfg(windows)\": {\n },\n },\n \"crates/pi-shell\": {\n _COMMON_CONDITION: {\n },\n \"cfg(unix)\": {\n },\n \"cfg(windows)\": {\n },\n },\n \"crates/pi-uutils-ctx\": {\n \"cfg(unix)\": {\n },\n },\n \"crates/pi-walker\": {\n _COMMON_CONDITION: {\n },\n \"cfg(unix)\": {\n },\n \"cfg(windows)\": {\n },\n },\n \"crates/pi-uu-diff\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/pi-uu-grep\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-b2sum\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-base32\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-base64\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-basename\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-cat\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-checksum-common\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-comm\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-cut\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-date\": {\n _COMMON_CONDITION: {\n },\n \"cfg(unix)\": {\n },\n },\n \"crates/vendor/uu-dirname\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-find\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-head\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-hostname\": {\n _COMMON_CONDITION: {\n },\n \"cfg(any(target_os = \\\"freebsd\\\", target_os = \\\"openbsd\\\"))\": {\n },\n \"cfg(target_os = \\\"windows\\\")\": {\n },\n },\n \"crates/vendor/uu-ln\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-ls\": {\n _COMMON_CONDITION: {\n },\n \"cfg(not(target_os = \\\"wasi\\\"))\": {\n },\n },\n \"crates/vendor/uu-md5sum\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-mkdir\": {\n _COMMON_CONDITION: {\n },\n \"cfg(unix)\": {\n },\n },\n \"crates/vendor/uu-mktemp\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-mv\": {\n _COMMON_CONDITION: {\n },\n \"cfg(windows)\": {\n },\n },\n \"crates/vendor/uu-nproc\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-paste\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-printenv\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-readlink\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-realpath\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-rm\": {\n _COMMON_CONDITION: {\n },\n \"cfg(unix)\": {\n },\n \"cfg(windows)\": {\n },\n },\n \"crates/vendor/uu-sed\": {\n _COMMON_CONDITION: {\n },\n \"cfg(unix)\": {\n },\n },\n \"crates/vendor/uu-seq\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-sha1sum\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-sha224sum\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-sha256sum\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-sha384sum\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-sha512sum\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-sort\": {\n _COMMON_CONDITION: {\n },\n \"cfg(unix)\": {\n },\n },\n \"crates/vendor/uu-stat\": {\n _COMMON_CONDITION: {\n },\n \"cfg(windows)\": {\n },\n },\n \"crates/vendor/uu-tac\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-tail\": {\n _COMMON_CONDITION: {\n },\n \"cfg(not(target_os = \\\"wasi\\\"))\": {\n },\n \"cfg(unix)\": {\n },\n \"cfg(windows)\": {\n },\n },\n \"crates/vendor/uu-tee\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-touch\": {\n _COMMON_CONDITION: {\n },\n \"cfg(unix)\": {\n },\n \"cfg(windows)\": {\n },\n },\n \"crates/vendor/uu-tr\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-truncate\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-uname\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-uniq\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-wc\": {\n _COMMON_CONDITION: {\n },\n \"cfg(unix)\": {\n },\n },\n \"crates/vendor/uu-whoami\": {\n _COMMON_CONDITION: {\n },\n \"cfg(target_os = \\\"windows\\\")\": {\n },\n },\n \"crates/vendor/uu-xargs\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-yes\": {\n _COMMON_CONDITION: {\n },\n },\n}\n\n\n_NORMAL_DEV_DEPENDENCIES = {\n \"crates/vendor/brush-builtins\": {\n _COMMON_CONDITION: {\n \"anyhow\": Label(\"//anyhow-1.0.104\"),\n \"pretty_assertions\": Label(\"//pretty_assertions-1.4.1\"),\n },\n },\n \"crates/vendor/brush-core\": {\n _COMMON_CONDITION: {\n \"anyhow\": Label(\"//anyhow-1.0.104\"),\n \"pretty_assertions\": Label(\"//pretty_assertions-1.4.1\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n },\n \"crates/vendor/jaq\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n },\n },\n \"crates/pi-ast\": {\n },\n \"crates/pi-iso\": {\n },\n \"crates/pi-natives\": {\n },\n \"crates/pi-shell\": {\n _COMMON_CONDITION: {\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n },\n \"crates/pi-uutils-ctx\": {\n },\n \"crates/pi-walker\": {\n },\n \"crates/pi-uu-diff\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n },\n \"crates/pi-uu-grep\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n },\n },\n \"crates/vendor/uu-b2sum\": {\n },\n \"crates/vendor/uu-base32\": {\n },\n \"crates/vendor/uu-base64\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n },\n \"crates/vendor/uu-basename\": {\n },\n \"crates/vendor/uu-cat\": {\n },\n \"crates/vendor/uu-checksum-common\": {\n },\n \"crates/vendor/uu-comm\": {\n },\n \"crates/vendor/uu-cut\": {\n },\n \"crates/vendor/uu-date\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n },\n \"crates/vendor/uu-dirname\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n },\n },\n \"crates/vendor/uu-find\": {\n _COMMON_CONDITION: {\n \"filetime\": Label(\"//filetime-0.2.29\"),\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n },\n \"crates/vendor/uu-head\": {\n },\n \"crates/vendor/uu-hostname\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n },\n },\n \"crates/vendor/uu-ln\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n },\n \"crates/vendor/uu-ls\": {\n },\n \"crates/vendor/uu-md5sum\": {\n },\n \"crates/vendor/uu-mkdir\": {\n },\n \"crates/vendor/uu-mktemp\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n },\n },\n \"crates/vendor/uu-mv\": {\n },\n \"crates/vendor/uu-nproc\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n },\n },\n \"crates/vendor/uu-paste\": {\n },\n \"crates/vendor/uu-printenv\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n },\n },\n \"crates/vendor/uu-readlink\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n },\n \"crates/vendor/uu-realpath\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n },\n \"crates/vendor/uu-rm\": {\n },\n \"crates/vendor/uu-sed\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n },\n },\n \"crates/vendor/uu-seq\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n },\n },\n \"crates/vendor/uu-sha1sum\": {\n },\n \"crates/vendor/uu-sha224sum\": {\n },\n \"crates/vendor/uu-sha256sum\": {\n },\n \"crates/vendor/uu-sha384sum\": {\n },\n \"crates/vendor/uu-sha512sum\": {\n },\n \"crates/vendor/uu-sort\": {\n },\n \"crates/vendor/uu-stat\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n },\n \"crates/vendor/uu-tac\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n },\n \"crates/vendor/uu-tail\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"rstest\": Label(\"//rstest-0.26.1\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n },\n \"crates/vendor/uu-tee\": {\n },\n \"crates/vendor/uu-touch\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n },\n \"crates/vendor/uu-tr\": {\n },\n \"crates/vendor/uu-truncate\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n },\n \"crates/vendor/uu-uname\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n },\n },\n \"crates/vendor/uu-uniq\": {\n },\n \"crates/vendor/uu-wc\": {\n },\n \"crates/vendor/uu-whoami\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n },\n },\n \"crates/vendor/uu-xargs\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n },\n \"crates/vendor/uu-yes\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n },\n },\n}\n\n\n_NORMAL_DEV_ALIASES = {\n \"crates/vendor/brush-builtins\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/brush-core\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/jaq\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/pi-ast\": {\n },\n \"crates/pi-iso\": {\n },\n \"crates/pi-natives\": {\n },\n \"crates/pi-shell\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/pi-uutils-ctx\": {\n },\n \"crates/pi-walker\": {\n },\n \"crates/pi-uu-diff\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/pi-uu-grep\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-b2sum\": {\n },\n \"crates/vendor/uu-base32\": {\n },\n \"crates/vendor/uu-base64\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-basename\": {\n },\n \"crates/vendor/uu-cat\": {\n },\n \"crates/vendor/uu-checksum-common\": {\n },\n \"crates/vendor/uu-comm\": {\n },\n \"crates/vendor/uu-cut\": {\n },\n \"crates/vendor/uu-date\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-dirname\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-find\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-head\": {\n },\n \"crates/vendor/uu-hostname\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-ln\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-ls\": {\n },\n \"crates/vendor/uu-md5sum\": {\n },\n \"crates/vendor/uu-mkdir\": {\n },\n \"crates/vendor/uu-mktemp\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-mv\": {\n },\n \"crates/vendor/uu-nproc\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-paste\": {\n },\n \"crates/vendor/uu-printenv\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-readlink\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-realpath\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-rm\": {\n },\n \"crates/vendor/uu-sed\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-seq\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-sha1sum\": {\n },\n \"crates/vendor/uu-sha224sum\": {\n },\n \"crates/vendor/uu-sha256sum\": {\n },\n \"crates/vendor/uu-sha384sum\": {\n },\n \"crates/vendor/uu-sha512sum\": {\n },\n \"crates/vendor/uu-sort\": {\n },\n \"crates/vendor/uu-stat\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-tac\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-tail\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-tee\": {\n },\n \"crates/vendor/uu-touch\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-tr\": {\n },\n \"crates/vendor/uu-truncate\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-uname\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-uniq\": {\n },\n \"crates/vendor/uu-wc\": {\n },\n \"crates/vendor/uu-whoami\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-xargs\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-yes\": {\n _COMMON_CONDITION: {\n },\n },\n}\n\n\n_PROC_MACRO_DEPENDENCIES = {\n \"crates/vendor/brush-builtins\": {\n _COMMON_CONDITION: {\n \"strum_macros\": Label(\"//strum_macros-0.28.0\"),\n },\n },\n \"crates/vendor/brush-core\": {\n _COMMON_CONDITION: {\n \"async-recursion\": Label(\"//async-recursion-1.1.1\"),\n \"async-trait\": Label(\"//async-trait-0.1.91\"),\n \"inherent\": Label(\"//inherent-1.0.14\"),\n \"strum_macros\": Label(\"//strum_macros-0.28.0\"),\n },\n },\n \"crates/vendor/jaq\": {\n },\n \"crates/pi-ast\": {\n },\n \"crates/pi-iso\": {\n _COMMON_CONDITION: {\n \"async-trait\": Label(\"//async-trait-0.1.91\"),\n },\n },\n \"crates/pi-natives\": {\n _COMMON_CONDITION: {\n \"napi-derive\": Label(\"//napi-derive-3.6.0\"),\n },\n },\n \"crates/pi-shell\": {\n },\n \"crates/pi-uutils-ctx\": {\n },\n \"crates/pi-walker\": {\n },\n \"crates/pi-uu-diff\": {\n },\n \"crates/pi-uu-grep\": {\n },\n \"crates/vendor/uu-b2sum\": {\n },\n \"crates/vendor/uu-base32\": {\n },\n \"crates/vendor/uu-base64\": {\n },\n \"crates/vendor/uu-basename\": {\n },\n \"crates/vendor/uu-cat\": {\n },\n \"crates/vendor/uu-checksum-common\": {\n },\n \"crates/vendor/uu-comm\": {\n },\n \"crates/vendor/uu-cut\": {\n },\n \"crates/vendor/uu-date\": {\n },\n \"crates/vendor/uu-dirname\": {\n },\n \"crates/vendor/uu-find\": {\n },\n \"crates/vendor/uu-head\": {\n },\n \"crates/vendor/uu-hostname\": {\n },\n \"crates/vendor/uu-ln\": {\n },\n \"crates/vendor/uu-ls\": {\n },\n \"crates/vendor/uu-md5sum\": {\n },\n \"crates/vendor/uu-mkdir\": {\n },\n \"crates/vendor/uu-mktemp\": {\n },\n \"crates/vendor/uu-mv\": {\n },\n \"crates/vendor/uu-nproc\": {\n },\n \"crates/vendor/uu-paste\": {\n },\n \"crates/vendor/uu-printenv\": {\n },\n \"crates/vendor/uu-readlink\": {\n },\n \"crates/vendor/uu-realpath\": {\n },\n \"crates/vendor/uu-rm\": {\n },\n \"crates/vendor/uu-sed\": {\n },\n \"crates/vendor/uu-seq\": {\n },\n \"crates/vendor/uu-sha1sum\": {\n },\n \"crates/vendor/uu-sha224sum\": {\n },\n \"crates/vendor/uu-sha256sum\": {\n },\n \"crates/vendor/uu-sha384sum\": {\n },\n \"crates/vendor/uu-sha512sum\": {\n },\n \"crates/vendor/uu-sort\": {\n },\n \"crates/vendor/uu-stat\": {\n },\n \"crates/vendor/uu-tac\": {\n },\n \"crates/vendor/uu-tail\": {\n },\n \"crates/vendor/uu-tee\": {\n },\n \"crates/vendor/uu-touch\": {\n },\n \"crates/vendor/uu-tr\": {\n },\n \"crates/vendor/uu-truncate\": {\n },\n \"crates/vendor/uu-uname\": {\n },\n \"crates/vendor/uu-uniq\": {\n },\n \"crates/vendor/uu-wc\": {\n },\n \"crates/vendor/uu-whoami\": {\n },\n \"crates/vendor/uu-xargs\": {\n },\n \"crates/vendor/uu-yes\": {\n },\n}\n\n\n_PROC_MACRO_ALIASES = {\n \"crates/vendor/brush-builtins\": {\n },\n \"crates/vendor/brush-core\": {\n },\n \"crates/vendor/jaq\": {\n },\n \"crates/pi-ast\": {\n },\n \"crates/pi-iso\": {\n },\n \"crates/pi-natives\": {\n },\n \"crates/pi-shell\": {\n },\n \"crates/pi-uutils-ctx\": {\n },\n \"crates/pi-walker\": {\n },\n \"crates/pi-uu-diff\": {\n },\n \"crates/pi-uu-grep\": {\n },\n \"crates/vendor/uu-b2sum\": {\n },\n \"crates/vendor/uu-base32\": {\n },\n \"crates/vendor/uu-base64\": {\n },\n \"crates/vendor/uu-basename\": {\n },\n \"crates/vendor/uu-cat\": {\n },\n \"crates/vendor/uu-checksum-common\": {\n },\n \"crates/vendor/uu-comm\": {\n },\n \"crates/vendor/uu-cut\": {\n },\n \"crates/vendor/uu-date\": {\n },\n \"crates/vendor/uu-dirname\": {\n },\n \"crates/vendor/uu-find\": {\n },\n \"crates/vendor/uu-head\": {\n },\n \"crates/vendor/uu-hostname\": {\n },\n \"crates/vendor/uu-ln\": {\n },\n \"crates/vendor/uu-ls\": {\n },\n \"crates/vendor/uu-md5sum\": {\n },\n \"crates/vendor/uu-mkdir\": {\n },\n \"crates/vendor/uu-mktemp\": {\n },\n \"crates/vendor/uu-mv\": {\n },\n \"crates/vendor/uu-nproc\": {\n },\n \"crates/vendor/uu-paste\": {\n },\n \"crates/vendor/uu-printenv\": {\n },\n \"crates/vendor/uu-readlink\": {\n },\n \"crates/vendor/uu-realpath\": {\n },\n \"crates/vendor/uu-rm\": {\n },\n \"crates/vendor/uu-sed\": {\n },\n \"crates/vendor/uu-seq\": {\n },\n \"crates/vendor/uu-sha1sum\": {\n },\n \"crates/vendor/uu-sha224sum\": {\n },\n \"crates/vendor/uu-sha256sum\": {\n },\n \"crates/vendor/uu-sha384sum\": {\n },\n \"crates/vendor/uu-sha512sum\": {\n },\n \"crates/vendor/uu-sort\": {\n },\n \"crates/vendor/uu-stat\": {\n },\n \"crates/vendor/uu-tac\": {\n },\n \"crates/vendor/uu-tail\": {\n },\n \"crates/vendor/uu-tee\": {\n },\n \"crates/vendor/uu-touch\": {\n },\n \"crates/vendor/uu-tr\": {\n },\n \"crates/vendor/uu-truncate\": {\n },\n \"crates/vendor/uu-uname\": {\n },\n \"crates/vendor/uu-uniq\": {\n },\n \"crates/vendor/uu-wc\": {\n },\n \"crates/vendor/uu-whoami\": {\n },\n \"crates/vendor/uu-xargs\": {\n },\n \"crates/vendor/uu-yes\": {\n },\n}\n\n\n_PROC_MACRO_DEV_DEPENDENCIES = {\n \"crates/vendor/brush-builtins\": {\n },\n \"crates/vendor/brush-core\": {\n },\n \"crates/vendor/jaq\": {\n },\n \"crates/pi-ast\": {\n },\n \"crates/pi-iso\": {\n },\n \"crates/pi-natives\": {\n },\n \"crates/pi-shell\": {\n },\n \"crates/pi-uutils-ctx\": {\n },\n \"crates/pi-walker\": {\n },\n \"crates/pi-uu-diff\": {\n },\n \"crates/pi-uu-grep\": {\n },\n \"crates/vendor/uu-b2sum\": {\n },\n \"crates/vendor/uu-base32\": {\n },\n \"crates/vendor/uu-base64\": {\n },\n \"crates/vendor/uu-basename\": {\n },\n \"crates/vendor/uu-cat\": {\n },\n \"crates/vendor/uu-checksum-common\": {\n },\n \"crates/vendor/uu-comm\": {\n },\n \"crates/vendor/uu-cut\": {\n },\n \"crates/vendor/uu-date\": {\n },\n \"crates/vendor/uu-dirname\": {\n },\n \"crates/vendor/uu-find\": {\n },\n \"crates/vendor/uu-head\": {\n },\n \"crates/vendor/uu-hostname\": {\n },\n \"crates/vendor/uu-ln\": {\n },\n \"crates/vendor/uu-ls\": {\n },\n \"crates/vendor/uu-md5sum\": {\n },\n \"crates/vendor/uu-mkdir\": {\n },\n \"crates/vendor/uu-mktemp\": {\n },\n \"crates/vendor/uu-mv\": {\n },\n \"crates/vendor/uu-nproc\": {\n },\n \"crates/vendor/uu-paste\": {\n },\n \"crates/vendor/uu-printenv\": {\n },\n \"crates/vendor/uu-readlink\": {\n },\n \"crates/vendor/uu-realpath\": {\n },\n \"crates/vendor/uu-rm\": {\n },\n \"crates/vendor/uu-sed\": {\n },\n \"crates/vendor/uu-seq\": {\n },\n \"crates/vendor/uu-sha1sum\": {\n },\n \"crates/vendor/uu-sha224sum\": {\n },\n \"crates/vendor/uu-sha256sum\": {\n },\n \"crates/vendor/uu-sha384sum\": {\n },\n \"crates/vendor/uu-sha512sum\": {\n },\n \"crates/vendor/uu-sort\": {\n },\n \"crates/vendor/uu-stat\": {\n },\n \"crates/vendor/uu-tac\": {\n },\n \"crates/vendor/uu-tail\": {\n },\n \"crates/vendor/uu-tee\": {\n },\n \"crates/vendor/uu-touch\": {\n },\n \"crates/vendor/uu-tr\": {\n },\n \"crates/vendor/uu-truncate\": {\n },\n \"crates/vendor/uu-uname\": {\n },\n \"crates/vendor/uu-uniq\": {\n },\n \"crates/vendor/uu-wc\": {\n },\n \"crates/vendor/uu-whoami\": {\n },\n \"crates/vendor/uu-xargs\": {\n },\n \"crates/vendor/uu-yes\": {\n },\n}\n\n\n_PROC_MACRO_DEV_ALIASES = {\n \"crates/vendor/brush-builtins\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/brush-core\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/jaq\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/pi-ast\": {\n },\n \"crates/pi-iso\": {\n },\n \"crates/pi-natives\": {\n },\n \"crates/pi-shell\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/pi-uutils-ctx\": {\n },\n \"crates/pi-walker\": {\n },\n \"crates/pi-uu-diff\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/pi-uu-grep\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-b2sum\": {\n },\n \"crates/vendor/uu-base32\": {\n },\n \"crates/vendor/uu-base64\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-basename\": {\n },\n \"crates/vendor/uu-cat\": {\n },\n \"crates/vendor/uu-checksum-common\": {\n },\n \"crates/vendor/uu-comm\": {\n },\n \"crates/vendor/uu-cut\": {\n },\n \"crates/vendor/uu-date\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-dirname\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-find\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-head\": {\n },\n \"crates/vendor/uu-hostname\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-ln\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-ls\": {\n },\n \"crates/vendor/uu-md5sum\": {\n },\n \"crates/vendor/uu-mkdir\": {\n },\n \"crates/vendor/uu-mktemp\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-mv\": {\n },\n \"crates/vendor/uu-nproc\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-paste\": {\n },\n \"crates/vendor/uu-printenv\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-readlink\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-realpath\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-rm\": {\n },\n \"crates/vendor/uu-sed\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-seq\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-sha1sum\": {\n },\n \"crates/vendor/uu-sha224sum\": {\n },\n \"crates/vendor/uu-sha256sum\": {\n },\n \"crates/vendor/uu-sha384sum\": {\n },\n \"crates/vendor/uu-sha512sum\": {\n },\n \"crates/vendor/uu-sort\": {\n },\n \"crates/vendor/uu-stat\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-tac\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-tail\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-tee\": {\n },\n \"crates/vendor/uu-touch\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-tr\": {\n },\n \"crates/vendor/uu-truncate\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-uname\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-uniq\": {\n },\n \"crates/vendor/uu-wc\": {\n },\n \"crates/vendor/uu-whoami\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-xargs\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-yes\": {\n _COMMON_CONDITION: {\n },\n },\n}\n\n\n_BUILD_DEPENDENCIES = {\n \"crates/vendor/brush-builtins\": {\n },\n \"crates/vendor/brush-core\": {\n },\n \"crates/vendor/jaq\": {\n },\n \"crates/pi-ast\": {\n },\n \"crates/pi-iso\": {\n },\n \"crates/pi-natives\": {\n _COMMON_CONDITION: {\n \"napi-build\": Label(\"//napi-build-2.3.2\"),\n \"serde\": Label(\"//serde-1.0.229\"),\n \"serde_json\": Label(\"//serde_json-1.0.151\"),\n },\n },\n \"crates/pi-shell\": {\n },\n \"crates/pi-uutils-ctx\": {\n },\n \"crates/pi-walker\": {\n },\n \"crates/pi-uu-diff\": {\n },\n \"crates/pi-uu-grep\": {\n },\n \"crates/vendor/uu-b2sum\": {\n },\n \"crates/vendor/uu-base32\": {\n },\n \"crates/vendor/uu-base64\": {\n },\n \"crates/vendor/uu-basename\": {\n },\n \"crates/vendor/uu-cat\": {\n },\n \"crates/vendor/uu-checksum-common\": {\n },\n \"crates/vendor/uu-comm\": {\n },\n \"crates/vendor/uu-cut\": {\n },\n \"crates/vendor/uu-date\": {\n },\n \"crates/vendor/uu-dirname\": {\n },\n \"crates/vendor/uu-find\": {\n },\n \"crates/vendor/uu-head\": {\n },\n \"crates/vendor/uu-hostname\": {\n },\n \"crates/vendor/uu-ln\": {\n },\n \"crates/vendor/uu-ls\": {\n },\n \"crates/vendor/uu-md5sum\": {\n },\n \"crates/vendor/uu-mkdir\": {\n },\n \"crates/vendor/uu-mktemp\": {\n },\n \"crates/vendor/uu-mv\": {\n },\n \"crates/vendor/uu-nproc\": {\n },\n \"crates/vendor/uu-paste\": {\n },\n \"crates/vendor/uu-printenv\": {\n },\n \"crates/vendor/uu-readlink\": {\n },\n \"crates/vendor/uu-realpath\": {\n },\n \"crates/vendor/uu-rm\": {\n },\n \"crates/vendor/uu-sed\": {\n },\n \"crates/vendor/uu-seq\": {\n },\n \"crates/vendor/uu-sha1sum\": {\n },\n \"crates/vendor/uu-sha224sum\": {\n },\n \"crates/vendor/uu-sha256sum\": {\n },\n \"crates/vendor/uu-sha384sum\": {\n },\n \"crates/vendor/uu-sha512sum\": {\n },\n \"crates/vendor/uu-sort\": {\n },\n \"crates/vendor/uu-stat\": {\n },\n \"crates/vendor/uu-tac\": {\n },\n \"crates/vendor/uu-tail\": {\n },\n \"crates/vendor/uu-tee\": {\n },\n \"crates/vendor/uu-touch\": {\n },\n \"crates/vendor/uu-tr\": {\n },\n \"crates/vendor/uu-truncate\": {\n },\n \"crates/vendor/uu-uname\": {\n },\n \"crates/vendor/uu-uniq\": {\n },\n \"crates/vendor/uu-wc\": {\n },\n \"crates/vendor/uu-whoami\": {\n },\n \"crates/vendor/uu-xargs\": {\n },\n \"crates/vendor/uu-yes\": {\n },\n}\n\n\n_BUILD_ALIASES = {\n \"crates/vendor/brush-builtins\": {\n },\n \"crates/vendor/brush-core\": {\n },\n \"crates/vendor/jaq\": {\n },\n \"crates/pi-ast\": {\n },\n \"crates/pi-iso\": {\n },\n \"crates/pi-natives\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/pi-shell\": {\n },\n \"crates/pi-uutils-ctx\": {\n },\n \"crates/pi-walker\": {\n },\n \"crates/pi-uu-diff\": {\n },\n \"crates/pi-uu-grep\": {\n },\n \"crates/vendor/uu-b2sum\": {\n },\n \"crates/vendor/uu-base32\": {\n },\n \"crates/vendor/uu-base64\": {\n },\n \"crates/vendor/uu-basename\": {\n },\n \"crates/vendor/uu-cat\": {\n },\n \"crates/vendor/uu-checksum-common\": {\n },\n \"crates/vendor/uu-comm\": {\n },\n \"crates/vendor/uu-cut\": {\n },\n \"crates/vendor/uu-date\": {\n },\n \"crates/vendor/uu-dirname\": {\n },\n \"crates/vendor/uu-find\": {\n },\n \"crates/vendor/uu-head\": {\n },\n \"crates/vendor/uu-hostname\": {\n },\n \"crates/vendor/uu-ln\": {\n },\n \"crates/vendor/uu-ls\": {\n },\n \"crates/vendor/uu-md5sum\": {\n },\n \"crates/vendor/uu-mkdir\": {\n },\n \"crates/vendor/uu-mktemp\": {\n },\n \"crates/vendor/uu-mv\": {\n },\n \"crates/vendor/uu-nproc\": {\n },\n \"crates/vendor/uu-paste\": {\n },\n \"crates/vendor/uu-printenv\": {\n },\n \"crates/vendor/uu-readlink\": {\n },\n \"crates/vendor/uu-realpath\": {\n },\n \"crates/vendor/uu-rm\": {\n },\n \"crates/vendor/uu-sed\": {\n },\n \"crates/vendor/uu-seq\": {\n },\n \"crates/vendor/uu-sha1sum\": {\n },\n \"crates/vendor/uu-sha224sum\": {\n },\n \"crates/vendor/uu-sha256sum\": {\n },\n \"crates/vendor/uu-sha384sum\": {\n },\n \"crates/vendor/uu-sha512sum\": {\n },\n \"crates/vendor/uu-sort\": {\n },\n \"crates/vendor/uu-stat\": {\n },\n \"crates/vendor/uu-tac\": {\n },\n \"crates/vendor/uu-tail\": {\n },\n \"crates/vendor/uu-tee\": {\n },\n \"crates/vendor/uu-touch\": {\n },\n \"crates/vendor/uu-tr\": {\n },\n \"crates/vendor/uu-truncate\": {\n },\n \"crates/vendor/uu-uname\": {\n },\n \"crates/vendor/uu-uniq\": {\n },\n \"crates/vendor/uu-wc\": {\n },\n \"crates/vendor/uu-whoami\": {\n },\n \"crates/vendor/uu-xargs\": {\n },\n \"crates/vendor/uu-yes\": {\n },\n}\n\n\n_BUILD_PROC_MACRO_DEPENDENCIES = {\n \"crates/vendor/brush-builtins\": {\n },\n \"crates/vendor/brush-core\": {\n },\n \"crates/vendor/jaq\": {\n },\n \"crates/pi-ast\": {\n },\n \"crates/pi-iso\": {\n },\n \"crates/pi-natives\": {\n },\n \"crates/pi-shell\": {\n },\n \"crates/pi-uutils-ctx\": {\n },\n \"crates/pi-walker\": {\n },\n \"crates/pi-uu-diff\": {\n },\n \"crates/pi-uu-grep\": {\n },\n \"crates/vendor/uu-b2sum\": {\n },\n \"crates/vendor/uu-base32\": {\n },\n \"crates/vendor/uu-base64\": {\n },\n \"crates/vendor/uu-basename\": {\n },\n \"crates/vendor/uu-cat\": {\n },\n \"crates/vendor/uu-checksum-common\": {\n },\n \"crates/vendor/uu-comm\": {\n },\n \"crates/vendor/uu-cut\": {\n },\n \"crates/vendor/uu-date\": {\n },\n \"crates/vendor/uu-dirname\": {\n },\n \"crates/vendor/uu-find\": {\n },\n \"crates/vendor/uu-head\": {\n },\n \"crates/vendor/uu-hostname\": {\n },\n \"crates/vendor/uu-ln\": {\n },\n \"crates/vendor/uu-ls\": {\n },\n \"crates/vendor/uu-md5sum\": {\n },\n \"crates/vendor/uu-mkdir\": {\n },\n \"crates/vendor/uu-mktemp\": {\n },\n \"crates/vendor/uu-mv\": {\n },\n \"crates/vendor/uu-nproc\": {\n },\n \"crates/vendor/uu-paste\": {\n },\n \"crates/vendor/uu-printenv\": {\n },\n \"crates/vendor/uu-readlink\": {\n },\n \"crates/vendor/uu-realpath\": {\n },\n \"crates/vendor/uu-rm\": {\n },\n \"crates/vendor/uu-sed\": {\n },\n \"crates/vendor/uu-seq\": {\n },\n \"crates/vendor/uu-sha1sum\": {\n },\n \"crates/vendor/uu-sha224sum\": {\n },\n \"crates/vendor/uu-sha256sum\": {\n },\n \"crates/vendor/uu-sha384sum\": {\n },\n \"crates/vendor/uu-sha512sum\": {\n },\n \"crates/vendor/uu-sort\": {\n },\n \"crates/vendor/uu-stat\": {\n },\n \"crates/vendor/uu-tac\": {\n },\n \"crates/vendor/uu-tail\": {\n },\n \"crates/vendor/uu-tee\": {\n },\n \"crates/vendor/uu-touch\": {\n },\n \"crates/vendor/uu-tr\": {\n },\n \"crates/vendor/uu-truncate\": {\n },\n \"crates/vendor/uu-uname\": {\n },\n \"crates/vendor/uu-uniq\": {\n },\n \"crates/vendor/uu-wc\": {\n },\n \"crates/vendor/uu-whoami\": {\n },\n \"crates/vendor/uu-xargs\": {\n },\n \"crates/vendor/uu-yes\": {\n },\n}\n\n\n_BUILD_PROC_MACRO_ALIASES = {\n \"crates/vendor/brush-builtins\": {\n },\n \"crates/vendor/brush-core\": {\n },\n \"crates/vendor/jaq\": {\n },\n \"crates/pi-ast\": {\n },\n \"crates/pi-iso\": {\n },\n \"crates/pi-natives\": {\n },\n \"crates/pi-shell\": {\n },\n \"crates/pi-uutils-ctx\": {\n },\n \"crates/pi-walker\": {\n },\n \"crates/pi-uu-diff\": {\n },\n \"crates/pi-uu-grep\": {\n },\n \"crates/vendor/uu-b2sum\": {\n },\n \"crates/vendor/uu-base32\": {\n },\n \"crates/vendor/uu-base64\": {\n },\n \"crates/vendor/uu-basename\": {\n },\n \"crates/vendor/uu-cat\": {\n },\n \"crates/vendor/uu-checksum-common\": {\n },\n \"crates/vendor/uu-comm\": {\n },\n \"crates/vendor/uu-cut\": {\n },\n \"crates/vendor/uu-date\": {\n },\n \"crates/vendor/uu-dirname\": {\n },\n \"crates/vendor/uu-find\": {\n },\n \"crates/vendor/uu-head\": {\n },\n \"crates/vendor/uu-hostname\": {\n },\n \"crates/vendor/uu-ln\": {\n },\n \"crates/vendor/uu-ls\": {\n },\n \"crates/vendor/uu-md5sum\": {\n },\n \"crates/vendor/uu-mkdir\": {\n },\n \"crates/vendor/uu-mktemp\": {\n },\n \"crates/vendor/uu-mv\": {\n },\n \"crates/vendor/uu-nproc\": {\n },\n \"crates/vendor/uu-paste\": {\n },\n \"crates/vendor/uu-printenv\": {\n },\n \"crates/vendor/uu-readlink\": {\n },\n \"crates/vendor/uu-realpath\": {\n },\n \"crates/vendor/uu-rm\": {\n },\n \"crates/vendor/uu-sed\": {\n },\n \"crates/vendor/uu-seq\": {\n },\n \"crates/vendor/uu-sha1sum\": {\n },\n \"crates/vendor/uu-sha224sum\": {\n },\n \"crates/vendor/uu-sha256sum\": {\n },\n \"crates/vendor/uu-sha384sum\": {\n },\n \"crates/vendor/uu-sha512sum\": {\n },\n \"crates/vendor/uu-sort\": {\n },\n \"crates/vendor/uu-stat\": {\n },\n \"crates/vendor/uu-tac\": {\n },\n \"crates/vendor/uu-tail\": {\n },\n \"crates/vendor/uu-tee\": {\n },\n \"crates/vendor/uu-touch\": {\n },\n \"crates/vendor/uu-tr\": {\n },\n \"crates/vendor/uu-truncate\": {\n },\n \"crates/vendor/uu-uname\": {\n },\n \"crates/vendor/uu-uniq\": {\n },\n \"crates/vendor/uu-wc\": {\n },\n \"crates/vendor/uu-whoami\": {\n },\n \"crates/vendor/uu-xargs\": {\n },\n \"crates/vendor/uu-yes\": {\n },\n}\n\n\n_CONDITIONS = {\n \"aarch64-apple-darwin\": [\"@@//bazel/triples:aarch64-apple-darwin\"],\n \"aarch64-linux-android\": [],\n \"aarch64-pc-windows-gnullvm\": [],\n \"aarch64-unknown-linux-gnu\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\"],\n \"aarch64-unknown-linux-musl\": [\"@@//bazel/triples:aarch64-unknown-linux-musl\"],\n \"cfg(all(all(target_arch = \\\"aarch64\\\", target_endian = \\\"little\\\"), target_os = \\\"windows\\\"))\": [],\n \"cfg(all(all(target_arch = \\\"aarch64\\\", target_endian = \\\"little\\\"), target_vendor = \\\"apple\\\", any(target_os = \\\"ios\\\", target_os = \\\"macos\\\", target_os = \\\"tvos\\\", target_os = \\\"visionos\\\", target_os = \\\"watchos\\\")))\": [\"@@//bazel/triples:aarch64-apple-darwin\"],\n \"cfg(all(any(all(target_arch = \\\"aarch64\\\", target_endian = \\\"little\\\"), all(target_arch = \\\"arm\\\", target_endian = \\\"little\\\")), any(target_os = \\\"android\\\", target_os = \\\"linux\\\")))\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\"],\n \"cfg(all(any(target_arch = \\\"x86_64\\\", target_arch = \\\"arm64ec\\\"), target_env = \\\"msvc\\\", not(windows_raw_dylib)))\": [\"@@//bazel/triples:x86_64-pc-windows-msvc\"],\n \"cfg(all(any(target_os = \\\"android\\\", target_os = \\\"linux\\\"), any(rustix_use_libc, miri, not(all(target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", target_arch = \\\"s390x\\\"), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\")))))))\": [],\n \"cfg(all(any(target_os = \\\"linux\\\", target_os = \\\"android\\\"), any(rustix_use_libc, miri, not(all(target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", any(target_arch = \\\"s390x\\\", target_arch = \\\"powerpc\\\")), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc\\\"), all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\")))))))\": [],\n \"cfg(all(any(target_os = \\\"linux\\\", target_os = \\\"android\\\"), not(any(all(target_os = \\\"linux\\\", target_env = \\\"\\\"), getrandom_backend = \\\"custom\\\", getrandom_backend = \\\"linux_raw\\\", getrandom_backend = \\\"rdrand\\\", getrandom_backend = \\\"rndr\\\"))))\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(all(not(curve25519_dalek_backend = \\\"fiat\\\"), not(curve25519_dalek_backend = \\\"serial\\\"), target_arch = \\\"x86_64\\\"))\": [\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-pc-windows-msvc\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(all(not(rustix_use_libc), not(miri), target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", any(target_arch = \\\"s390x\\\", target_arch = \\\"powerpc\\\")), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc\\\"), all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\"))))\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(all(not(rustix_use_libc), not(miri), target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", target_arch = \\\"s390x\\\"), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\"))))\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(all(not(windows), any(rustix_use_libc, miri, not(all(target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", any(target_arch = \\\"s390x\\\", target_arch = \\\"powerpc\\\")), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc\\\"), all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\")))))))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:x86_64-apple-darwin\"],\n \"cfg(all(not(windows), any(rustix_use_libc, miri, not(all(target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", target_arch = \\\"s390x\\\"), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\")))))))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:x86_64-apple-darwin\"],\n \"cfg(all(target_arch = \\\"aarch64\\\", target_env = \\\"msvc\\\", not(windows_raw_dylib)))\": [],\n \"cfg(all(target_arch = \\\"aarch64\\\", target_os = \\\"android\\\"))\": [],\n \"cfg(all(target_arch = \\\"aarch64\\\", target_os = \\\"linux\\\"))\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\"],\n \"cfg(all(target_arch = \\\"aarch64\\\", target_vendor = \\\"apple\\\"))\": [\"@@//bazel/triples:aarch64-apple-darwin\"],\n \"cfg(all(target_arch = \\\"loongarch64\\\", target_os = \\\"linux\\\"))\": [],\n \"cfg(all(target_arch = \\\"wasm32\\\", target_os = \\\"unknown\\\"))\": [],\n \"cfg(all(target_arch = \\\"wasm32\\\", target_os = \\\"wasi\\\", target_env = \\\"p2\\\"))\": [],\n \"cfg(all(target_arch = \\\"x86\\\", target_env = \\\"gnu\\\", not(target_abi = \\\"llvm\\\"), not(windows_raw_dylib)))\": [],\n \"cfg(all(target_arch = \\\"x86\\\", target_env = \\\"gnu\\\", not(windows_raw_dylib)))\": [],\n \"cfg(all(target_arch = \\\"x86\\\", target_env = \\\"msvc\\\", not(windows_raw_dylib)))\": [],\n \"cfg(all(target_arch = \\\"x86_64\\\", target_env = \\\"gnu\\\", not(target_abi = \\\"llvm\\\"), not(windows_raw_dylib)))\": [\"@@//bazel/triples:x86_64-unknown-linux-gnu\"],\n \"cfg(all(target_arch = \\\"x86_64\\\", target_env = \\\"msvc\\\", not(windows_raw_dylib)))\": [\"@@//bazel/triples:x86_64-pc-windows-msvc\"],\n \"cfg(all(target_family = \\\"wasm\\\", target_os = \\\"unknown\\\"))\": [],\n \"cfg(all(target_os = \\\"linux\\\", not(target_env = \\\"ohos\\\")))\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(all(target_os = \\\"uefi\\\", getrandom_backend = \\\"efi_rng\\\"))\": [],\n \"cfg(all(unix, not(any(target_os = \\\"macos\\\", target_os = \\\"android\\\", target_os = \\\"emscripten\\\"))))\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(all(unix, not(target_os = \\\"macos\\\")))\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any())\": [],\n \"cfg(any(target_arch = \\\"aarch64\\\", target_arch = \\\"x86\\\", target_arch = \\\"x86_64\\\"))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-pc-windows-msvc\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any(target_arch = \\\"aarch64\\\", target_arch = \\\"x86_64\\\", target_arch = \\\"x86\\\"))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-pc-windows-msvc\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any(target_arch = \\\"x86\\\", target_arch = \\\"x86_64\\\"))\": [\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-pc-windows-msvc\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any(target_arch = \\\"x86_64\\\", target_arch = \\\"x86\\\"))\": [\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-pc-windows-msvc\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any(target_os = \\\"android\\\", target_os = \\\"linux\\\"))\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any(target_os = \\\"android\\\", target_os = \\\"linux\\\", target_os = \\\"macos\\\", target_os = \\\"hurd\\\"))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any(target_os = \\\"dragonfly\\\", target_os = \\\"freebsd\\\", target_os = \\\"hurd\\\", target_os = \\\"illumos\\\", target_os = \\\"cygwin\\\", all(target_os = \\\"horizon\\\", target_arch = \\\"arm\\\")))\": [],\n \"cfg(any(target_os = \\\"freebsd\\\", target_os = \\\"dragonfly\\\"))\": [],\n \"cfg(any(target_os = \\\"freebsd\\\", target_os = \\\"netbsd\\\"))\": [],\n \"cfg(any(target_os = \\\"freebsd\\\", target_os = \\\"openbsd\\\"))\": [],\n \"cfg(any(target_os = \\\"freebsd\\\", target_os = \\\"openbsd\\\", target_os = \\\"netbsd\\\", target_os = \\\"dragonflybsd\\\", target_os = \\\"ios\\\"))\": [],\n \"cfg(any(target_os = \\\"haiku\\\", target_os = \\\"redox\\\", target_os = \\\"nto\\\", target_os = \\\"aix\\\"))\": [],\n \"cfg(any(target_os = \\\"ios\\\", target_os = \\\"visionos\\\", target_os = \\\"watchos\\\", target_os = \\\"tvos\\\"))\": [],\n \"cfg(any(target_os = \\\"linux\\\", target_os = \\\"android\\\"))\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any(target_os = \\\"macos\\\", target_os = \\\"openbsd\\\", target_os = \\\"vita\\\", target_os = \\\"emscripten\\\"))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:x86_64-apple-darwin\"],\n \"cfg(any(target_os = \\\"macos\\\", target_os = \\\"windows\\\"))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-pc-windows-msvc\"],\n \"cfg(any(unix, target_os = \\\"fuchsia\\\", target_os = \\\"vxworks\\\"))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any(unix, target_os = \\\"hermit\\\", target_os = \\\"wasi\\\"))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any(unix, target_os = \\\"redox\\\"))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any(unix, target_os = \\\"wasi\\\"))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any(unix, windows))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-pc-windows-msvc\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any(windows, target_os = \\\"linux\\\"))\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-pc-windows-msvc\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(curve25519_dalek_backend = \\\"fiat\\\")\": [],\n \"cfg(not(all(target_arch = \\\"arm\\\", target_os = \\\"none\\\")))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-pc-windows-msvc\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(not(any(target_os = \\\"android\\\", target_os = \\\"linux\\\")))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-pc-windows-msvc\"],\n \"cfg(not(target_has_atomic = \\\"ptr\\\"))\": [],\n \"cfg(not(target_os = \\\"wasi\\\"))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-pc-windows-msvc\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(not(target_os = \\\"windows\\\"))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(not(windows))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(target_arch = \\\"aarch64\\\")\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\"],\n \"cfg(target_arch = \\\"spirv\\\")\": [],\n \"cfg(target_arch = \\\"x86\\\")\": [],\n \"cfg(target_arch = \\\"x86_64\\\")\": [\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-pc-windows-msvc\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(target_family = \\\"wasm\\\")\": [],\n \"cfg(target_os = \\\"android\\\")\": [],\n \"cfg(target_os = \\\"freebsd\\\")\": [],\n \"cfg(target_os = \\\"haiku\\\")\": [],\n \"cfg(target_os = \\\"hermit\\\")\": [],\n \"cfg(target_os = \\\"linux\\\")\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(target_os = \\\"macos\\\")\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:x86_64-apple-darwin\"],\n \"cfg(target_os = \\\"netbsd\\\")\": [],\n \"cfg(target_os = \\\"redox\\\")\": [],\n \"cfg(target_os = \\\"solaris\\\")\": [],\n \"cfg(target_os = \\\"vxworks\\\")\": [],\n \"cfg(target_os = \\\"wasi\\\")\": [],\n \"cfg(target_os = \\\"windows\\\")\": [\"@@//bazel/triples:x86_64-pc-windows-msvc\"],\n \"cfg(target_vendor = \\\"apple\\\")\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:x86_64-apple-darwin\"],\n \"cfg(unix)\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(windows)\": [\"@@//bazel/triples:x86_64-pc-windows-msvc\"],\n \"cfg(windows_raw_dylib)\": [],\n \"i686-pc-windows-gnu\": [],\n \"i686-pc-windows-gnullvm\": [],\n \"wasm32-unknown-unknown\": [],\n \"x86_64-apple-darwin\": [\"@@//bazel/triples:x86_64-apple-darwin\"],\n \"x86_64-pc-windows-gnu\": [],\n \"x86_64-pc-windows-gnullvm\": [],\n \"x86_64-pc-windows-msvc\": [\"@@//bazel/triples:x86_64-pc-windows-msvc\"],\n \"x86_64-unknown-linux-gnu\": [\"@@//bazel/triples:x86_64-unknown-linux-gnu\"],\n \"x86_64-unknown-linux-musl\": [\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n}\n\n###############################################################################\n\ndef crate_repositories():\n \"\"\"A macro for defining repositories for all generated crates.\n\n Returns:\n A list of repos visible to the module through the module extension.\n \"\"\"\n maybe(\n crates_vendor_remote_repository,\n name = \"crates\",\n # Lean interface: just point at `crates.bzl`; the repo rule\n # derives the sibling `BUILD.bazel` and `defs.bzl`.\n crates_module = Label(\"@crates//crates:crates.bzl\"),\n )\n maybe(\n http_archive,\n name = \"crates__adler2-2.0.1\",\n sha256 = \"320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/adler2/2.0.1/download\"],\n strip_prefix = \"adler2-2.0.1\",\n build_file = Label(\"@crates//crates:BUILD.adler2-2.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__aead-0.5.2\",\n sha256 = \"d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/aead/0.5.2/download\"],\n strip_prefix = \"aead-0.5.2\",\n build_file = Label(\"@crates//crates:BUILD.aead-0.5.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__aes-0.8.4\",\n sha256 = \"b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/aes/0.8.4/download\"],\n strip_prefix = \"aes-0.8.4\",\n build_file = Label(\"@crates//crates:BUILD.aes-0.8.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__aes-gcm-0.10.3\",\n sha256 = \"831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/aes-gcm/0.10.3/download\"],\n strip_prefix = \"aes-gcm-0.10.3\",\n build_file = Label(\"@crates//crates:BUILD.aes-gcm-0.10.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ahash-0.8.12\",\n sha256 = \"5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ahash/0.8.12/download\"],\n strip_prefix = \"ahash-0.8.12\",\n build_file = Label(\"@crates//crates:BUILD.ahash-0.8.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__aho-corasick-1.1.4\",\n sha256 = \"ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/aho-corasick/1.1.4/download\"],\n strip_prefix = \"aho-corasick-1.1.4\",\n build_file = Label(\"@crates//crates:BUILD.aho-corasick-1.1.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__allocator-api2-0.2.21\",\n sha256 = \"683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/allocator-api2/0.2.21/download\"],\n strip_prefix = \"allocator-api2-0.2.21\",\n build_file = Label(\"@crates//crates:BUILD.allocator-api2-0.2.21.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__android_system_properties-0.1.5\",\n sha256 = \"819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/android_system_properties/0.1.5/download\"],\n strip_prefix = \"android_system_properties-0.1.5\",\n build_file = Label(\"@crates//crates:BUILD.android_system_properties-0.1.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__annotate-snippets-0.11.5\",\n sha256 = \"710e8eae58854cdc1790fcb56cca04d712a17be849eeb81da2a724bf4bae2bc4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/annotate-snippets/0.11.5/download\"],\n strip_prefix = \"annotate-snippets-0.11.5\",\n build_file = Label(\"@crates//crates:BUILD.annotate-snippets-0.11.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ansi-width-0.1.0\",\n sha256 = \"219e3ce6f2611d83b51ec2098a12702112c29e57203a6b0a0929b2cddb486608\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ansi-width/0.1.0/download\"],\n strip_prefix = \"ansi-width-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.ansi-width-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstream-1.0.0\",\n sha256 = \"824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstream/1.0.0/download\"],\n strip_prefix = \"anstream-1.0.0\",\n build_file = Label(\"@crates//crates:BUILD.anstream-1.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstyle-1.0.14\",\n sha256 = \"940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle/1.0.14/download\"],\n strip_prefix = \"anstyle-1.0.14\",\n build_file = Label(\"@crates//crates:BUILD.anstyle-1.0.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstyle-parse-1.0.0\",\n sha256 = \"52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle-parse/1.0.0/download\"],\n strip_prefix = \"anstyle-parse-1.0.0\",\n build_file = Label(\"@crates//crates:BUILD.anstyle-parse-1.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstyle-query-1.1.5\",\n sha256 = \"40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle-query/1.1.5/download\"],\n strip_prefix = \"anstyle-query-1.1.5\",\n build_file = Label(\"@crates//crates:BUILD.anstyle-query-1.1.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstyle-wincon-3.0.11\",\n sha256 = \"291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle-wincon/3.0.11/download\"],\n strip_prefix = \"anstyle-wincon-3.0.11\",\n build_file = Label(\"@crates//crates:BUILD.anstyle-wincon-3.0.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anyhow-1.0.104\",\n sha256 = \"330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anyhow/1.0.104/download\"],\n strip_prefix = \"anyhow-1.0.104\",\n build_file = Label(\"@crates//crates:BUILD.anyhow-1.0.104.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__arboard-3.6.1\",\n sha256 = \"0348a1c054491f4bfe6ab86a7b6ab1e44e45d899005de92f58b3df180b36ddaf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/arboard/3.6.1/download\"],\n strip_prefix = \"arboard-3.6.1\",\n build_file = Label(\"@crates//crates:BUILD.arboard-3.6.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__arc-swap-1.9.2\",\n sha256 = \"c049c0be4daef0b145cb3555416b3b8ef5b7888a38aea1a3a155801fe7b0810b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/arc-swap/1.9.2/download\"],\n strip_prefix = \"arc-swap-1.9.2\",\n build_file = Label(\"@crates//crates:BUILD.arc-swap-1.9.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__archery-1.2.2\",\n sha256 = \"70e0a5f99dfebb87bb342d0f53bb92c81842e100bbb915223e38349580e5441d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/archery/1.2.2/download\"],\n strip_prefix = \"archery-1.2.2\",\n build_file = Label(\"@crates//crates:BUILD.archery-1.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__argmax-0.3.1\",\n sha256 = \"5b7e3ef5e3a7f2c5e5a49d90ad087c03d38258e75155daac64deb62c50972c66\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/argmax/0.3.1/download\"],\n strip_prefix = \"argmax-0.3.1\",\n build_file = Label(\"@crates//crates:BUILD.argmax-0.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__arrayref-0.3.9\",\n sha256 = \"76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/arrayref/0.3.9/download\"],\n strip_prefix = \"arrayref-0.3.9\",\n build_file = Label(\"@crates//crates:BUILD.arrayref-0.3.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__arrayvec-0.7.8\",\n sha256 = \"d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/arrayvec/0.7.8/download\"],\n strip_prefix = \"arrayvec-0.7.8\",\n build_file = Label(\"@crates//crates:BUILD.arrayvec-0.7.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__asn1-rs-0.6.2\",\n sha256 = \"5493c3bedbacf7fd7382c6346bbd66687d12bbaad3a89a2d2c303ee6cf20b048\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/asn1-rs/0.6.2/download\"],\n strip_prefix = \"asn1-rs-0.6.2\",\n build_file = Label(\"@crates//crates:BUILD.asn1-rs-0.6.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__asn1-rs-derive-0.5.1\",\n sha256 = \"965c2d33e53cb6b267e148a4cb0760bc01f4904c1cd4bb4002a085bb016d1490\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/asn1-rs-derive/0.5.1/download\"],\n strip_prefix = \"asn1-rs-derive-0.5.1\",\n build_file = Label(\"@crates//crates:BUILD.asn1-rs-derive-0.5.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__asn1-rs-impl-0.2.0\",\n sha256 = \"7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/asn1-rs-impl/0.2.0/download\"],\n strip_prefix = \"asn1-rs-impl-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.asn1-rs-impl-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ast-grep-core-0.39.9\",\n sha256 = \"057ae90e7256ebf85f840b1638268df0142c9d19467d500b790631fd301acc27\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ast-grep-core/0.39.9/download\"],\n strip_prefix = \"ast-grep-core-0.39.9\",\n build_file = Label(\"@crates//crates:BUILD.ast-grep-core-0.39.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__astral-tl-0.7.11\",\n sha256 = \"d90933ffb0f97e2fc2e0de21da9d3f20597b804012d199843a6fe7c2810d28f3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/astral-tl/0.7.11/download\"],\n strip_prefix = \"astral-tl-0.7.11\",\n build_file = Label(\"@crates//crates:BUILD.astral-tl-0.7.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__async-broadcast-0.7.2\",\n sha256 = \"435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/async-broadcast/0.7.2/download\"],\n strip_prefix = \"async-broadcast-0.7.2\",\n build_file = Label(\"@crates//crates:BUILD.async-broadcast-0.7.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__async-channel-2.5.0\",\n sha256 = \"924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/async-channel/2.5.0/download\"],\n strip_prefix = \"async-channel-2.5.0\",\n build_file = Label(\"@crates//crates:BUILD.async-channel-2.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__async-executor-1.14.0\",\n sha256 = \"c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/async-executor/1.14.0/download\"],\n strip_prefix = \"async-executor-1.14.0\",\n build_file = Label(\"@crates//crates:BUILD.async-executor-1.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__async-io-2.6.0\",\n sha256 = \"456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/async-io/2.6.0/download\"],\n strip_prefix = \"async-io-2.6.0\",\n build_file = Label(\"@crates//crates:BUILD.async-io-2.6.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__async-lock-3.4.2\",\n sha256 = \"290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/async-lock/3.4.2/download\"],\n strip_prefix = \"async-lock-3.4.2\",\n build_file = Label(\"@crates//crates:BUILD.async-lock-3.4.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__async-process-2.5.0\",\n sha256 = \"fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/async-process/2.5.0/download\"],\n strip_prefix = \"async-process-2.5.0\",\n build_file = Label(\"@crates//crates:BUILD.async-process-2.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__async-recursion-1.1.1\",\n sha256 = \"3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/async-recursion/1.1.1/download\"],\n strip_prefix = \"async-recursion-1.1.1\",\n build_file = Label(\"@crates//crates:BUILD.async-recursion-1.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__async-signal-0.2.14\",\n sha256 = \"52b5aaafa020cf5053a01f2a60e8ff5dccf550f0f77ec54a4e47285ac2bab485\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/async-signal/0.2.14/download\"],\n strip_prefix = \"async-signal-0.2.14\",\n build_file = Label(\"@crates//crates:BUILD.async-signal-0.2.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__async-task-4.7.1\",\n sha256 = \"8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/async-task/4.7.1/download\"],\n strip_prefix = \"async-task-4.7.1\",\n build_file = Label(\"@crates//crates:BUILD.async-task-4.7.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__async-trait-0.1.91\",\n sha256 = \"ae36dc4177970ef04fde5178d3e2429882def40e57a451f919c098f72baa6cec\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/async-trait/0.1.91/download\"],\n strip_prefix = \"async-trait-0.1.91\",\n build_file = Label(\"@crates//crates:BUILD.async-trait-0.1.91.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__atomic-waker-1.1.2\",\n sha256 = \"1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/atomic-waker/1.1.2/download\"],\n strip_prefix = \"atomic-waker-1.1.2\",\n build_file = Label(\"@crates//crates:BUILD.atomic-waker-1.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__audiopus_sys-0.2.2\",\n sha256 = \"62314a1546a2064e033665d658e88c620a62904be945f8147e6b16c3db9f8651\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/audiopus_sys/0.2.2/download\"],\n strip_prefix = \"audiopus_sys-0.2.2\",\n build_file = Label(\"@crates//crates:BUILD.audiopus_sys-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__autocfg-1.5.1\",\n sha256 = \"f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/autocfg/1.5.1/download\"],\n strip_prefix = \"autocfg-1.5.1\",\n build_file = Label(\"@crates//crates:BUILD.autocfg-1.5.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__base16ct-0.2.0\",\n sha256 = \"4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/base16ct/0.2.0/download\"],\n strip_prefix = \"base16ct-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.base16ct-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__base64-0.22.1\",\n sha256 = \"72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/base64/0.22.1/download\"],\n strip_prefix = \"base64-0.22.1\",\n build_file = Label(\"@crates//crates:BUILD.base64-0.22.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__base64-simd-0.8.0\",\n sha256 = \"339abbe78e73178762e23bea9dfd08e697eb3f3301cd4be981c0f78ba5859195\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/base64-simd/0.8.0/download\"],\n strip_prefix = \"base64-simd-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.base64-simd-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__base64ct-1.8.3\",\n sha256 = \"2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/base64ct/1.8.3/download\"],\n strip_prefix = \"base64ct-1.8.3\",\n build_file = Label(\"@crates//crates:BUILD.base64ct-1.8.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bigdecimal-0.4.10\",\n sha256 = \"4d6867f1565b3aad85681f1015055b087fcfd840d6aeee6eee7f2da317603695\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bigdecimal/0.4.10/download\"],\n strip_prefix = \"bigdecimal-0.4.10\",\n build_file = Label(\"@crates//crates:BUILD.bigdecimal-0.4.10.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__binary-heap-plus-0.5.0\",\n sha256 = \"e4551d8382e911ecc0d0f0ffb602777988669be09447d536ff4388d1def11296\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/binary-heap-plus/0.5.0/download\"],\n strip_prefix = \"binary-heap-plus-0.5.0\",\n build_file = Label(\"@crates//crates:BUILD.binary-heap-plus-0.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bincode-1.3.3\",\n sha256 = \"b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bincode/1.3.3/download\"],\n strip_prefix = \"bincode-1.3.3\",\n build_file = Label(\"@crates//crates:BUILD.bincode-1.3.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bindgen-0.72.1\",\n sha256 = \"993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bindgen/0.72.1/download\"],\n strip_prefix = \"bindgen-0.72.1\",\n build_file = Label(\"@crates//crates:BUILD.bindgen-0.72.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bit-set-0.8.0\",\n sha256 = \"08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bit-set/0.8.0/download\"],\n strip_prefix = \"bit-set-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.bit-set-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bit-vec-0.8.0\",\n sha256 = \"5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bit-vec/0.8.0/download\"],\n strip_prefix = \"bit-vec-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.bit-vec-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bitflags-1.3.2\",\n sha256 = \"bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bitflags/1.3.2/download\"],\n strip_prefix = \"bitflags-1.3.2\",\n build_file = Label(\"@crates//crates:BUILD.bitflags-1.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bitflags-2.13.1\",\n sha256 = \"b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bitflags/2.13.1/download\"],\n strip_prefix = \"bitflags-2.13.1\",\n build_file = Label(\"@crates//crates:BUILD.bitflags-2.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bitvec-1.1.1\",\n sha256 = \"ddcec3d12c579d40898fe0a9a358a803c23e9c52ca3c425707f81c9436211837\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bitvec/1.1.1/download\"],\n strip_prefix = \"bitvec-1.1.1\",\n build_file = Label(\"@crates//crates:BUILD.bitvec-1.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__blake2b_simd-1.0.4\",\n sha256 = \"b79834656f71332577234b50bfc009996f7449e0c056884e6a02492ded0ca2f3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/blake2b_simd/1.0.4/download\"],\n strip_prefix = \"blake2b_simd-1.0.4\",\n build_file = Label(\"@crates//crates:BUILD.blake2b_simd-1.0.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__blake3-1.8.5\",\n sha256 = \"0aa83c34e62843d924f905e0f5c866eb1dd6545fc4d719e803d9ba6030371fce\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/blake3/1.8.5/download\"],\n strip_prefix = \"blake3-1.8.5\",\n build_file = Label(\"@crates//crates:BUILD.blake3-1.8.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__block-buffer-0.10.4\",\n sha256 = \"3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/block-buffer/0.10.4/download\"],\n strip_prefix = \"block-buffer-0.10.4\",\n build_file = Label(\"@crates//crates:BUILD.block-buffer-0.10.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__block-buffer-0.12.1\",\n sha256 = \"d2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aa\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/block-buffer/0.12.1/download\"],\n strip_prefix = \"block-buffer-0.12.1\",\n build_file = Label(\"@crates//crates:BUILD.block-buffer-0.12.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__block-padding-0.3.3\",\n sha256 = \"a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/block-padding/0.3.3/download\"],\n strip_prefix = \"block-padding-0.3.3\",\n build_file = Label(\"@crates//crates:BUILD.block-padding-0.3.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__block2-0.6.2\",\n sha256 = \"cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/block2/0.6.2/download\"],\n strip_prefix = \"block2-0.6.2\",\n build_file = Label(\"@crates//crates:BUILD.block2-0.6.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__blocking-1.6.2\",\n sha256 = \"e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/blocking/1.6.2/download\"],\n strip_prefix = \"blocking-1.6.2\",\n build_file = Label(\"@crates//crates:BUILD.blocking-1.6.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bon-3.9.3\",\n sha256 = \"a602c73c7b0148ec6d12af6fd5cc7a46e2eacc8878271a999abac56eed12f561\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bon/3.9.3/download\"],\n strip_prefix = \"bon-3.9.3\",\n build_file = Label(\"@crates//crates:BUILD.bon-3.9.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bon-macros-3.9.3\",\n sha256 = \"6dee98b0db6a962de883bf5d20362dee4d7ca0d12fe39a7c6c73c844e1cd7c1f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bon-macros/3.9.3/download\"],\n strip_prefix = \"bon-macros-3.9.3\",\n build_file = Label(\"@crates//crates:BUILD.bon-macros-3.9.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__brush-parser-0.3.0\",\n sha256 = \"f7367124d4f38fdcd65f4b815bda7caeb3de377b9cd95ffa1b23627989c93718\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/brush-parser/0.3.0/download\"],\n strip_prefix = \"brush-parser-0.3.0\",\n build_file = Label(\"@crates//crates:BUILD.brush-parser-0.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__brush-parser-0.4.0\",\n sha256 = \"9f64b19efc02f0dd6cac1d462e20a1098f425f09cb13624efbb1b7d63f061735\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/brush-parser/0.4.0/download\"],\n strip_prefix = \"brush-parser-0.4.0\",\n build_file = Label(\"@crates//crates:BUILD.brush-parser-0.4.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bstr-1.13.0\",\n sha256 = \"1f7dc094d718f2e1c1559ad110e27eeaae14a5465d3d56dd6dbd793079fbd530\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bstr/1.13.0/download\"],\n strip_prefix = \"bstr-1.13.0\",\n build_file = Label(\"@crates//crates:BUILD.bstr-1.13.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bumpalo-3.20.3\",\n sha256 = \"72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bumpalo/3.20.3/download\"],\n strip_prefix = \"bumpalo-3.20.3\",\n build_file = Label(\"@crates//crates:BUILD.bumpalo-3.20.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__by_address-1.2.1\",\n sha256 = \"64fa3c856b712db6612c019f14756e64e4bcea13337a6b33b696333a9eaa2d06\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/by_address/1.2.1/download\"],\n strip_prefix = \"by_address-1.2.1\",\n build_file = Label(\"@crates//crates:BUILD.by_address-1.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bytecheck-0.8.2\",\n sha256 = \"0caa33a2c0edca0419d15ac723dff03f1956f7978329b1e3b5fdaaaed9d3ca8b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bytecheck/0.8.2/download\"],\n strip_prefix = \"bytecheck-0.8.2\",\n build_file = Label(\"@crates//crates:BUILD.bytecheck-0.8.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bytecheck_derive-0.8.2\",\n sha256 = \"89385e82b5d1821d2219e0b095efa2cc1f246cbf99080f3be46a1a85c0d392d9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bytecheck_derive/0.8.2/download\"],\n strip_prefix = \"bytecheck_derive-0.8.2\",\n build_file = Label(\"@crates//crates:BUILD.bytecheck_derive-0.8.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bytecount-0.6.9\",\n sha256 = \"175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bytecount/0.6.9/download\"],\n strip_prefix = \"bytecount-0.6.9\",\n build_file = Label(\"@crates//crates:BUILD.bytecount-0.6.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bytemuck-1.25.2\",\n sha256 = \"95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bytemuck/1.25.2/download\"],\n strip_prefix = \"bytemuck-1.25.2\",\n build_file = Label(\"@crates//crates:BUILD.bytemuck-1.25.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bytemuck_derive-1.11.0\",\n sha256 = \"f65693059b6b9c588b9f62fed1cedbf0a8b805631457ea162d68f0de186f3de5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bytemuck_derive/1.11.0/download\"],\n strip_prefix = \"bytemuck_derive-1.11.0\",\n build_file = Label(\"@crates//crates:BUILD.bytemuck_derive-1.11.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__byteorder-1.5.0\",\n sha256 = \"1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/byteorder/1.5.0/download\"],\n strip_prefix = \"byteorder-1.5.0\",\n build_file = Label(\"@crates//crates:BUILD.byteorder-1.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__byteorder-lite-0.1.0\",\n sha256 = \"8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/byteorder-lite/0.1.0/download\"],\n strip_prefix = \"byteorder-lite-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.byteorder-lite-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bytes-1.12.1\",\n sha256 = \"fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bytes/1.12.1/download\"],\n strip_prefix = \"bytes-1.12.1\",\n build_file = Label(\"@crates//crates:BUILD.bytes-1.12.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cached-0.56.0\",\n sha256 = \"801927ee168e17809ab8901d9f01f700cd7d8d6a6527997fee44e4b0327a253c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cached/0.56.0/download\"],\n strip_prefix = \"cached-0.56.0\",\n build_file = Label(\"@crates//crates:BUILD.cached-0.56.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cached-0.59.0\",\n sha256 = \"53b6f5d101f0f6322c8646a45b7c581a673e476329040d97565815c2461dd0c4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cached/0.59.0/download\"],\n strip_prefix = \"cached-0.59.0\",\n build_file = Label(\"@crates//crates:BUILD.cached-0.59.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cached_proc_macro-0.25.0\",\n sha256 = \"9225bdcf4e4a9a4c08bf16607908eb2fbf746828d5e0b5e019726dbf6571f201\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cached_proc_macro/0.25.0/download\"],\n strip_prefix = \"cached_proc_macro-0.25.0\",\n build_file = Label(\"@crates//crates:BUILD.cached_proc_macro-0.25.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cached_proc_macro-0.27.0\",\n sha256 = \"8ebcf9c75f17a17d55d11afc98e46167d4790a263f428891b8705ab2f793eca3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cached_proc_macro/0.27.0/download\"],\n strip_prefix = \"cached_proc_macro-0.27.0\",\n build_file = Label(\"@crates//crates:BUILD.cached_proc_macro-0.27.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cached_proc_macro_types-0.1.1\",\n sha256 = \"ade8366b8bd5ba243f0a58f036cc0ca8a2f069cff1a2351ef1cac6b083e16fc0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cached_proc_macro_types/0.1.1/download\"],\n strip_prefix = \"cached_proc_macro_types-0.1.1\",\n build_file = Label(\"@crates//crates:BUILD.cached_proc_macro_types-0.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__calendrical_calculations-0.2.4\",\n sha256 = \"5abbd6eeda6885048d357edc66748eea6e0268e3dd11f326fff5bd248d779c26\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/calendrical_calculations/0.2.4/download\"],\n strip_prefix = \"calendrical_calculations-0.2.4\",\n build_file = Label(\"@crates//crates:BUILD.calendrical_calculations-0.2.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cbc-0.1.2\",\n sha256 = \"26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cbc/0.1.2/download\"],\n strip_prefix = \"cbc-0.1.2\",\n build_file = Label(\"@crates//crates:BUILD.cbc-0.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cc-1.2.67\",\n sha256 = \"e17dd265a7d0f31ef544e1b20e03add05d3b45b491b633b10d67145d2acc1a38\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cc/1.2.67/download\"],\n strip_prefix = \"cc-1.2.67\",\n build_file = Label(\"@crates//crates:BUILD.cc-1.2.67.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ccm-0.5.0\",\n sha256 = \"9ae3c82e4355234767756212c570e29833699ab63e6ffd161887314cc5b43847\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ccm/0.5.0/download\"],\n strip_prefix = \"ccm-0.5.0\",\n build_file = Label(\"@crates//crates:BUILD.ccm-0.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cexpr-0.6.0\",\n sha256 = \"6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cexpr/0.6.0/download\"],\n strip_prefix = \"cexpr-0.6.0\",\n build_file = Label(\"@crates//crates:BUILD.cexpr-0.6.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cfg-expr-0.20.8\",\n sha256 = \"fb693542bcafa528e198be0ebd9d3632ca5b7c93dbe7237460e199910835997c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cfg-expr/0.20.8/download\"],\n strip_prefix = \"cfg-expr-0.20.8\",\n build_file = Label(\"@crates//crates:BUILD.cfg-expr-0.20.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cfg-if-1.0.4\",\n sha256 = \"9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cfg-if/1.0.4/download\"],\n strip_prefix = \"cfg-if-1.0.4\",\n build_file = Label(\"@crates//crates:BUILD.cfg-if-1.0.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cfg_aliases-0.1.1\",\n sha256 = \"fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cfg_aliases/0.1.1/download\"],\n strip_prefix = \"cfg_aliases-0.1.1\",\n build_file = Label(\"@crates//crates:BUILD.cfg_aliases-0.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cfg_aliases-0.2.2\",\n sha256 = \"f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cfg_aliases/0.2.2/download\"],\n strip_prefix = \"cfg_aliases-0.2.2\",\n build_file = Label(\"@crates//crates:BUILD.cfg_aliases-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__chacha20-0.10.1\",\n sha256 = \"d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/chacha20/0.10.1/download\"],\n strip_prefix = \"chacha20-0.10.1\",\n build_file = Label(\"@crates//crates:BUILD.chacha20-0.10.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__chacha20-0.9.1\",\n sha256 = \"c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/chacha20/0.9.1/download\"],\n strip_prefix = \"chacha20-0.9.1\",\n build_file = Label(\"@crates//crates:BUILD.chacha20-0.9.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__chacha20poly1305-0.10.1\",\n sha256 = \"10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/chacha20poly1305/0.10.1/download\"],\n strip_prefix = \"chacha20poly1305-0.10.1\",\n build_file = Label(\"@crates//crates:BUILD.chacha20poly1305-0.10.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__check_elevation-0.2.7\",\n sha256 = \"a7fe1fbbd8bd3174109071530f12932ff471eeff30d83e9c485d6ff424ac534b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/check_elevation/0.2.7/download\"],\n strip_prefix = \"check_elevation-0.2.7\",\n build_file = Label(\"@crates//crates:BUILD.check_elevation-0.2.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__chrono-0.4.45\",\n sha256 = \"1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/chrono/0.4.45/download\"],\n strip_prefix = \"chrono-0.4.45\",\n build_file = Label(\"@crates//crates:BUILD.chrono-0.4.45.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__chrono-tz-0.10.4\",\n sha256 = \"a6139a8597ed92cf816dfb33f5dd6cf0bb93a6adc938f11039f371bc5bcd26c3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/chrono-tz/0.10.4/download\"],\n strip_prefix = \"chrono-tz-0.10.4\",\n build_file = Label(\"@crates//crates:BUILD.chrono-tz-0.10.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cipher-0.4.4\",\n sha256 = \"773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cipher/0.4.4/download\"],\n strip_prefix = \"cipher-0.4.4\",\n build_file = Label(\"@crates//crates:BUILD.cipher-0.4.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clang-sys-1.8.1\",\n sha256 = \"0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clang-sys/1.8.1/download\"],\n strip_prefix = \"clang-sys-1.8.1\",\n build_file = Label(\"@crates//crates:BUILD.clang-sys-1.8.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clap-4.6.4\",\n sha256 = \"d91e0c145792ef73a6ad36d27c75ac09f1832222a3c209689d90f534685ee5b7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap/4.6.4/download\"],\n strip_prefix = \"clap-4.6.4\",\n build_file = Label(\"@crates//crates:BUILD.clap-4.6.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clap_builder-4.6.2\",\n sha256 = \"f09628afdcc538b57f3c6341e9c8e9970f18e4a481690a64974d7023bd33548b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap_builder/4.6.2/download\"],\n strip_prefix = \"clap_builder-4.6.2\",\n build_file = Label(\"@crates//crates:BUILD.clap_builder-4.6.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clap_derive-4.6.4\",\n sha256 = \"d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap_derive/4.6.4/download\"],\n strip_prefix = \"clap_derive-4.6.4\",\n build_file = Label(\"@crates//crates:BUILD.clap_derive-4.6.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clap_lex-1.1.0\",\n sha256 = \"c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap_lex/1.1.0/download\"],\n strip_prefix = \"clap_lex-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.clap_lex-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clipboard-win-5.4.1\",\n sha256 = \"bde03770d3df201d4fb868f2c9c59e66a3e4e2bd06692a0fe701e7103c7e84d4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clipboard-win/5.4.1/download\"],\n strip_prefix = \"clipboard-win-5.4.1\",\n build_file = Label(\"@crates//crates:BUILD.clipboard-win-5.4.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cmake-0.1.58\",\n sha256 = \"c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cmake/0.1.58/download\"],\n strip_prefix = \"cmake-0.1.58\",\n build_file = Label(\"@crates//crates:BUILD.cmake-0.1.58.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__codesnake-0.2.1\",\n sha256 = \"2205f7f6d3de68ecf4c291c789b3edf07b6569268abd0188819086f71ae42225\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/codesnake/0.2.1/download\"],\n strip_prefix = \"codesnake-0.2.1\",\n build_file = Label(\"@crates//crates:BUILD.codesnake-0.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__color-print-0.3.7\",\n sha256 = \"3aa954171903797d5623e047d9ab69d91b493657917bdfb8c2c80ecaf9cdb6f4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/color-print/0.3.7/download\"],\n strip_prefix = \"color-print-0.3.7\",\n build_file = Label(\"@crates//crates:BUILD.color-print-0.3.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__color-print-proc-macro-0.3.7\",\n sha256 = \"692186b5ebe54007e45a59aea47ece9eb4108e141326c304cdc91699a7118a22\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/color-print-proc-macro/0.3.7/download\"],\n strip_prefix = \"color-print-proc-macro-0.3.7\",\n build_file = Label(\"@crates//crates:BUILD.color-print-proc-macro-0.3.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__color_quant-1.1.0\",\n sha256 = \"3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/color_quant/1.1.0/download\"],\n strip_prefix = \"color_quant-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.color_quant-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__colorchoice-1.0.5\",\n sha256 = \"1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/colorchoice/1.0.5/download\"],\n strip_prefix = \"colorchoice-1.0.5\",\n build_file = Label(\"@crates//crates:BUILD.colorchoice-1.0.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__command-fds-0.3.3\",\n sha256 = \"1b60b5124979fccd9addd89d8b97a1d6eebb4950694520c75ddd722535ea443f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/command-fds/0.3.3/download\"],\n strip_prefix = \"command-fds-0.3.3\",\n build_file = Label(\"@crates//crates:BUILD.command-fds-0.3.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__compare-0.1.0\",\n sha256 = \"120133d4db2ec47efe2e26502ee984747630c67f51974fca0b6c1340cf2368d3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/compare/0.1.0/download\"],\n strip_prefix = \"compare-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.compare-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__concurrent-queue-2.5.0\",\n sha256 = \"4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/concurrent-queue/2.5.0/download\"],\n strip_prefix = \"concurrent-queue-2.5.0\",\n build_file = Label(\"@crates//crates:BUILD.concurrent-queue-2.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__console-0.16.4\",\n sha256 = \"4fe5f465a4f6fee88fad41b85d990f84c835335e85b5d9e6e63e0d06d28cba7c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/console/0.16.4/download\"],\n strip_prefix = \"console-0.16.4\",\n build_file = Label(\"@crates//crates:BUILD.console-0.16.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__const-oid-0.10.2\",\n sha256 = \"a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/const-oid/0.10.2/download\"],\n strip_prefix = \"const-oid-0.10.2\",\n build_file = Label(\"@crates//crates:BUILD.const-oid-0.10.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__const-oid-0.9.6\",\n sha256 = \"c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/const-oid/0.9.6/download\"],\n strip_prefix = \"const-oid-0.9.6\",\n build_file = Label(\"@crates//crates:BUILD.const-oid-0.9.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__const-random-0.1.18\",\n sha256 = \"87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/const-random/0.1.18/download\"],\n strip_prefix = \"const-random-0.1.18\",\n build_file = Label(\"@crates//crates:BUILD.const-random-0.1.18.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__const-random-macro-0.1.16\",\n sha256 = \"f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/const-random-macro/0.1.16/download\"],\n strip_prefix = \"const-random-macro-0.1.16\",\n build_file = Label(\"@crates//crates:BUILD.const-random-macro-0.1.16.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__constant_time_eq-0.4.2\",\n sha256 = \"3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/constant_time_eq/0.4.2/download\"],\n strip_prefix = \"constant_time_eq-0.4.2\",\n build_file = Label(\"@crates//crates:BUILD.constant_time_eq-0.4.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__convert_case-0.11.0\",\n sha256 = \"affbf0190ed2caf063e3def54ff444b449371d55c58e513a95ab98eca50adb49\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/convert_case/0.11.0/download\"],\n strip_prefix = \"convert_case-0.11.0\",\n build_file = Label(\"@crates//crates:BUILD.convert_case-0.11.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__convert_case-0.8.0\",\n sha256 = \"baaaa0ecca5b51987b9423ccdc971514dd8b0bb7b4060b983d3664dad3f1f89f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/convert_case/0.8.0/download\"],\n strip_prefix = \"convert_case-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.convert_case-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cookie-factory-0.3.3\",\n sha256 = \"9885fa71e26b8ab7855e2ec7cae6e9b380edff76cd052e07c683a0319d51b3a2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cookie-factory/0.3.3/download\"],\n strip_prefix = \"cookie-factory-0.3.3\",\n build_file = Label(\"@crates//crates:BUILD.cookie-factory-0.3.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__core-foundation-0.10.1\",\n sha256 = \"b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/core-foundation/0.10.1/download\"],\n strip_prefix = \"core-foundation-0.10.1\",\n build_file = Label(\"@crates//crates:BUILD.core-foundation-0.10.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__core-foundation-sys-0.8.7\",\n sha256 = \"773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/core-foundation-sys/0.8.7/download\"],\n strip_prefix = \"core-foundation-sys-0.8.7\",\n build_file = Label(\"@crates//crates:BUILD.core-foundation-sys-0.8.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__core-graphics-0.25.0\",\n sha256 = \"064badf302c3194842cf2c5d61f56cc88e54a759313879cdf03abdd27d0c3b97\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/core-graphics/0.25.0/download\"],\n strip_prefix = \"core-graphics-0.25.0\",\n build_file = Label(\"@crates//crates:BUILD.core-graphics-0.25.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__core-graphics-types-0.2.0\",\n sha256 = \"3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/core-graphics-types/0.2.0/download\"],\n strip_prefix = \"core-graphics-types-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.core-graphics-types-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__core_maths-0.1.1\",\n sha256 = \"77745e017f5edba1a9c1d854f6f3a52dac8a12dd5af5d2f54aecf61e43d80d30\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/core_maths/0.1.1/download\"],\n strip_prefix = \"core_maths-0.1.1\",\n build_file = Label(\"@crates//crates:BUILD.core_maths-0.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cpufeatures-0.2.17\",\n sha256 = \"59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cpufeatures/0.2.17/download\"],\n strip_prefix = \"cpufeatures-0.2.17\",\n build_file = Label(\"@crates//crates:BUILD.cpufeatures-0.2.17.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cpufeatures-0.3.0\",\n sha256 = \"8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cpufeatures/0.3.0/download\"],\n strip_prefix = \"cpufeatures-0.3.0\",\n build_file = Label(\"@crates//crates:BUILD.cpufeatures-0.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crc-3.4.0\",\n sha256 = \"5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crc/3.4.0/download\"],\n strip_prefix = \"crc-3.4.0\",\n build_file = Label(\"@crates//crates:BUILD.crc-3.4.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crc-catalog-2.5.0\",\n sha256 = \"217698eaf96b4a3f0bc4f3662aaa55bdf913cd54d7204591faa790070c6d0853\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crc-catalog/2.5.0/download\"],\n strip_prefix = \"crc-catalog-2.5.0\",\n build_file = Label(\"@crates//crates:BUILD.crc-catalog-2.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crc-fast-1.8.2\",\n sha256 = \"85d9be5297a59f1b7651fd2711a1f4461929f53b182b394df0df15b3a387ef51\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crc-fast/1.8.2/download\"],\n strip_prefix = \"crc-fast-1.8.2\",\n build_file = Label(\"@crates//crates:BUILD.crc-fast-1.8.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crc32fast-1.5.0\",\n sha256 = \"9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crc32fast/1.5.0/download\"],\n strip_prefix = \"crc32fast-1.5.0\",\n build_file = Label(\"@crates//crates:BUILD.crc32fast-1.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crossbeam-deque-0.8.7\",\n sha256 = \"5181e0de7b61eb03a81e347d6dd8797bae9da5146707b51077e2d71a54ec0ceb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crossbeam-deque/0.8.7/download\"],\n strip_prefix = \"crossbeam-deque-0.8.7\",\n build_file = Label(\"@crates//crates:BUILD.crossbeam-deque-0.8.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crossbeam-epoch-0.9.20\",\n sha256 = \"2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crossbeam-epoch/0.9.20/download\"],\n strip_prefix = \"crossbeam-epoch-0.9.20\",\n build_file = Label(\"@crates//crates:BUILD.crossbeam-epoch-0.9.20.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crossbeam-utils-0.8.22\",\n sha256 = \"61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crossbeam-utils/0.8.22/download\"],\n strip_prefix = \"crossbeam-utils-0.8.22\",\n build_file = Label(\"@crates//crates:BUILD.crossbeam-utils-0.8.22.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crunchy-0.2.4\",\n sha256 = \"460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crunchy/0.2.4/download\"],\n strip_prefix = \"crunchy-0.2.4\",\n build_file = Label(\"@crates//crates:BUILD.crunchy-0.2.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crypto-bigint-0.5.5\",\n sha256 = \"0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crypto-bigint/0.5.5/download\"],\n strip_prefix = \"crypto-bigint-0.5.5\",\n build_file = Label(\"@crates//crates:BUILD.crypto-bigint-0.5.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crypto-common-0.1.7\",\n sha256 = \"78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crypto-common/0.1.7/download\"],\n strip_prefix = \"crypto-common-0.1.7\",\n build_file = Label(\"@crates//crates:BUILD.crypto-common-0.1.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crypto-common-0.2.2\",\n sha256 = \"ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crypto-common/0.2.2/download\"],\n strip_prefix = \"crypto-common-0.2.2\",\n build_file = Label(\"@crates//crates:BUILD.crypto-common-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ctor-1.0.11\",\n sha256 = \"e9bb72bb94fdc1bd619f4c18cc91ecf6302aeb333d31b3c6ec0bb841cd920209\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ctor/1.0.11/download\"],\n strip_prefix = \"ctor-1.0.11\",\n build_file = Label(\"@crates//crates:BUILD.ctor-1.0.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ctr-0.9.2\",\n sha256 = \"0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ctr/0.9.2/download\"],\n strip_prefix = \"ctr-0.9.2\",\n build_file = Label(\"@crates//crates:BUILD.ctr-0.9.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__curve25519-dalek-4.1.3\",\n sha256 = \"97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/curve25519-dalek/4.1.3/download\"],\n strip_prefix = \"curve25519-dalek-4.1.3\",\n build_file = Label(\"@crates//crates:BUILD.curve25519-dalek-4.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__curve25519-dalek-derive-0.1.1\",\n sha256 = \"f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/curve25519-dalek-derive/0.1.1/download\"],\n strip_prefix = \"curve25519-dalek-derive-0.1.1\",\n build_file = Label(\"@crates//crates:BUILD.curve25519-dalek-derive-0.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__darling-0.20.11\",\n sha256 = \"fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/darling/0.20.11/download\"],\n strip_prefix = \"darling-0.20.11\",\n build_file = Label(\"@crates//crates:BUILD.darling-0.20.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__darling-0.23.0\",\n sha256 = \"25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/darling/0.23.0/download\"],\n strip_prefix = \"darling-0.23.0\",\n build_file = Label(\"@crates//crates:BUILD.darling-0.23.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__darling_core-0.20.11\",\n sha256 = \"0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/darling_core/0.20.11/download\"],\n strip_prefix = \"darling_core-0.20.11\",\n build_file = Label(\"@crates//crates:BUILD.darling_core-0.20.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__darling_core-0.23.0\",\n sha256 = \"9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/darling_core/0.23.0/download\"],\n strip_prefix = \"darling_core-0.23.0\",\n build_file = Label(\"@crates//crates:BUILD.darling_core-0.23.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__darling_macro-0.20.11\",\n sha256 = \"fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/darling_macro/0.20.11/download\"],\n strip_prefix = \"darling_macro-0.20.11\",\n build_file = Label(\"@crates//crates:BUILD.darling_macro-0.20.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__darling_macro-0.23.0\",\n sha256 = \"ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/darling_macro/0.23.0/download\"],\n strip_prefix = \"darling_macro-0.23.0\",\n build_file = Label(\"@crates//crates:BUILD.darling_macro-0.23.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__dashmap-6.2.1\",\n sha256 = \"e6361d5c062261c78a176addb82d4c821ae42bed6089de0e12603cd25de2059c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/dashmap/6.2.1/download\"],\n strip_prefix = \"dashmap-6.2.1\",\n build_file = Label(\"@crates//crates:BUILD.dashmap-6.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__data-encoding-2.11.0\",\n sha256 = \"a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/data-encoding/2.11.0/download\"],\n strip_prefix = \"data-encoding-2.11.0\",\n build_file = Label(\"@crates//crates:BUILD.data-encoding-2.11.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__data-encoding-macro-0.1.20\",\n sha256 = \"3259c913752a86488b501ed8680446a5ed2d5aeac6e596cb23ba3800768ea32c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/data-encoding-macro/0.1.20/download\"],\n strip_prefix = \"data-encoding-macro-0.1.20\",\n build_file = Label(\"@crates//crates:BUILD.data-encoding-macro-0.1.20.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__data-encoding-macro-internal-0.1.18\",\n sha256 = \"ccc2776f0c61eca1ca32528f85548abd1a4be8fb53d1b21c013e4f18da1e7090\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/data-encoding-macro-internal/0.1.18/download\"],\n strip_prefix = \"data-encoding-macro-internal-0.1.18\",\n build_file = Label(\"@crates//crates:BUILD.data-encoding-macro-internal-0.1.18.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__defmt-1.1.1\",\n sha256 = \"e2953bfe4f93bbd20cc71198842756f77d161884c99ebbabc41d80231ded88d1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/defmt/1.1.1/download\"],\n strip_prefix = \"defmt-1.1.1\",\n build_file = Label(\"@crates//crates:BUILD.defmt-1.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__defmt-macros-1.1.1\",\n sha256 = \"bad9c72e7ca2137e0dc3813245a0d282fd6daad32fd800af018306a9169b5fe8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/defmt-macros/1.1.1/download\"],\n strip_prefix = \"defmt-macros-1.1.1\",\n build_file = Label(\"@crates//crates:BUILD.defmt-macros-1.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__defmt-parser-1.0.0\",\n sha256 = \"10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/defmt-parser/1.0.0/download\"],\n strip_prefix = \"defmt-parser-1.0.0\",\n build_file = Label(\"@crates//crates:BUILD.defmt-parser-1.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__der-0.7.10\",\n sha256 = \"e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/der/0.7.10/download\"],\n strip_prefix = \"der-0.7.10\",\n build_file = Label(\"@crates//crates:BUILD.der-0.7.10.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__der-parser-9.0.0\",\n sha256 = \"5cd0a5c643689626bec213c4d8bd4d96acc8ffdb4ad4bb6bc16abf27d5f4b553\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/der-parser/9.0.0/download\"],\n strip_prefix = \"der-parser-9.0.0\",\n build_file = Label(\"@crates//crates:BUILD.der-parser-9.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__deranged-0.5.8\",\n sha256 = \"7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/deranged/0.5.8/download\"],\n strip_prefix = \"deranged-0.5.8\",\n build_file = Label(\"@crates//crates:BUILD.deranged-0.5.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__diff-0.1.13\",\n sha256 = \"56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/diff/0.1.13/download\"],\n strip_prefix = \"diff-0.1.13\",\n build_file = Label(\"@crates//crates:BUILD.diff-0.1.13.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__digest-0.10.7\",\n sha256 = \"9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/digest/0.10.7/download\"],\n strip_prefix = \"digest-0.10.7\",\n build_file = Label(\"@crates//crates:BUILD.digest-0.10.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__digest-0.11.3\",\n sha256 = \"f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/digest/0.11.3/download\"],\n strip_prefix = \"digest-0.11.3\",\n build_file = Label(\"@crates//crates:BUILD.digest-0.11.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__dispatch2-0.3.1\",\n sha256 = \"1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/dispatch2/0.3.1/download\"],\n strip_prefix = \"dispatch2-0.3.1\",\n build_file = Label(\"@crates//crates:BUILD.dispatch2-0.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__displaydoc-0.2.6\",\n sha256 = \"1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/displaydoc/0.2.6/download\"],\n strip_prefix = \"displaydoc-0.2.6\",\n build_file = Label(\"@crates//crates:BUILD.displaydoc-0.2.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__dlib-0.5.3\",\n sha256 = \"ab8ecd87370524b461f8557c119c405552c396ed91fc0a8eec68679eab26f94a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/dlib/0.5.3/download\"],\n strip_prefix = \"dlib-0.5.3\",\n build_file = Label(\"@crates//crates:BUILD.dlib-0.5.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__dns-lookup-3.0.1\",\n sha256 = \"6e39034cee21a2f5bbb66ba0e3689819c4bb5d00382a282006e802a7ffa6c41d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/dns-lookup/3.0.1/download\"],\n strip_prefix = \"dns-lookup-3.0.1\",\n build_file = Label(\"@crates//crates:BUILD.dns-lookup-3.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__downcast-rs-1.2.1\",\n sha256 = \"75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/downcast-rs/1.2.1/download\"],\n strip_prefix = \"downcast-rs-1.2.1\",\n build_file = Label(\"@crates//crates:BUILD.downcast-rs-1.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__drm-0.14.1\",\n sha256 = \"80bc8c5c6c2941f70a55c15f8d9f00f9710ebda3ffda98075f996a0e6c92756f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/drm/0.14.1/download\"],\n strip_prefix = \"drm-0.14.1\",\n build_file = Label(\"@crates//crates:BUILD.drm-0.14.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__drm-0.15.0\",\n sha256 = \"7a41816e58f47f49acfd956651055ddcf137c4882c2098c30c448817af21183a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/drm/0.15.0/download\"],\n strip_prefix = \"drm-0.15.0\",\n build_file = Label(\"@crates//crates:BUILD.drm-0.15.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__drm-ffi-0.9.1\",\n sha256 = \"51a91c9b32ac4e8105dec255e849e0d66e27d7c34d184364fb93e469db08f690\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/drm-ffi/0.9.1/download\"],\n strip_prefix = \"drm-ffi-0.9.1\",\n build_file = Label(\"@crates//crates:BUILD.drm-ffi-0.9.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__drm-fourcc-2.2.0\",\n sha256 = \"0aafbcdb8afc29c1a7ee5fbe53b5d62f4565b35a042a662ca9fecd0b54dae6f4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/drm-fourcc/2.2.0/download\"],\n strip_prefix = \"drm-fourcc-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.drm-fourcc-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__drm-sys-0.8.1\",\n sha256 = \"ecc8e1361066d91f5ffccff060a3c3be9c3ecde15be2959c1937595f7a82a9f8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/drm-sys/0.8.1/download\"],\n strip_prefix = \"drm-sys-0.8.1\",\n build_file = Label(\"@crates//crates:BUILD.drm-sys-0.8.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__dtls-0.17.2\",\n sha256 = \"01a431e87fc386bd5e02deb554a013f97bc406e47a7d8e97efb7c6366b980e9c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/dtls/0.17.2/download\"],\n strip_prefix = \"dtls-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.dtls-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__dunce-1.0.5\",\n sha256 = \"92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/dunce/1.0.5/download\"],\n strip_prefix = \"dunce-1.0.5\",\n build_file = Label(\"@crates//crates:BUILD.dunce-1.0.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__dyn-clone-1.0.20\",\n sha256 = \"d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/dyn-clone/1.0.20/download\"],\n strip_prefix = \"dyn-clone-1.0.20\",\n build_file = Label(\"@crates//crates:BUILD.dyn-clone-1.0.20.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ecdsa-0.16.9\",\n sha256 = \"ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ecdsa/0.16.9/download\"],\n strip_prefix = \"ecdsa-0.16.9\",\n build_file = Label(\"@crates//crates:BUILD.ecdsa-0.16.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__either-1.17.0\",\n sha256 = \"9e5e8f6c15a24b9a3ee5efec809ccd006d3b30e8b3bb63c39af737c7f87daa1d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/either/1.17.0/download\"],\n strip_prefix = \"either-1.17.0\",\n build_file = Label(\"@crates//crates:BUILD.either-1.17.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__elliptic-curve-0.13.8\",\n sha256 = \"b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/elliptic-curve/0.13.8/download\"],\n strip_prefix = \"elliptic-curve-0.13.8\",\n build_file = Label(\"@crates//crates:BUILD.elliptic-curve-0.13.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__encode_unicode-1.0.0\",\n sha256 = \"34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/encode_unicode/1.0.0/download\"],\n strip_prefix = \"encode_unicode-1.0.0\",\n build_file = Label(\"@crates//crates:BUILD.encode_unicode-1.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__encoding_rs-0.8.35\",\n sha256 = \"75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/encoding_rs/0.8.35/download\"],\n strip_prefix = \"encoding_rs-0.8.35\",\n build_file = Label(\"@crates//crates:BUILD.encoding_rs-0.8.35.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__encoding_rs_io-0.1.7\",\n sha256 = \"1cc3c5651fb62ab8aa3103998dade57efdd028544bd300516baa31840c252a83\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/encoding_rs_io/0.1.7/download\"],\n strip_prefix = \"encoding_rs_io-0.1.7\",\n build_file = Label(\"@crates//crates:BUILD.encoding_rs_io-0.1.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__endi-1.1.1\",\n sha256 = \"66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/endi/1.1.1/download\"],\n strip_prefix = \"endi-1.1.1\",\n build_file = Label(\"@crates//crates:BUILD.endi-1.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__enigo-0.6.1\",\n sha256 = \"71c6c56e50f7acae2906a0dcbb34529ca647e40421119ad5d12e7f8ba6e50010\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/enigo/0.6.1/download\"],\n strip_prefix = \"enigo-0.6.1\",\n build_file = Label(\"@crates//crates:BUILD.enigo-0.6.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__enumflags2-0.7.12\",\n sha256 = \"1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/enumflags2/0.7.12/download\"],\n strip_prefix = \"enumflags2-0.7.12\",\n build_file = Label(\"@crates//crates:BUILD.enumflags2-0.7.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__enumflags2_derive-0.7.12\",\n sha256 = \"67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/enumflags2_derive/0.7.12/download\"],\n strip_prefix = \"enumflags2_derive-0.7.12\",\n build_file = Label(\"@crates//crates:BUILD.enumflags2_derive-0.7.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__equivalent-1.0.2\",\n sha256 = \"877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/equivalent/1.0.2/download\"],\n strip_prefix = \"equivalent-1.0.2\",\n build_file = Label(\"@crates//crates:BUILD.equivalent-1.0.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__errno-0.3.14\",\n sha256 = \"39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/errno/0.3.14/download\"],\n strip_prefix = \"errno-0.3.14\",\n build_file = Label(\"@crates//crates:BUILD.errno-0.3.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__error-code-3.3.2\",\n sha256 = \"dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/error-code/3.3.2/download\"],\n strip_prefix = \"error-code-3.3.2\",\n build_file = Label(\"@crates//crates:BUILD.error-code-3.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__event-listener-5.4.2\",\n sha256 = \"5a23add41df1562121a9393cb065eab5146a1242410f23a644851e90cfd669d2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/event-listener/5.4.2/download\"],\n strip_prefix = \"event-listener-5.4.2\",\n build_file = Label(\"@crates//crates:BUILD.event-listener-5.4.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__event-listener-strategy-0.5.4\",\n sha256 = \"8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/event-listener-strategy/0.5.4/download\"],\n strip_prefix = \"event-listener-strategy-0.5.4\",\n build_file = Label(\"@crates//crates:BUILD.event-listener-strategy-0.5.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__faccess-0.2.4\",\n sha256 = \"59ae66425802d6a903e268ae1a08b8c38ba143520f227a205edf4e9c7e3e26d5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/faccess/0.2.4/download\"],\n strip_prefix = \"faccess-0.2.4\",\n build_file = Label(\"@crates//crates:BUILD.faccess-0.2.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fancy-regex-0.16.2\",\n sha256 = \"998b056554fbe42e03ae0e152895cd1a7e1002aec800fdc6635d20270260c46f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fancy-regex/0.16.2/download\"],\n strip_prefix = \"fancy-regex-0.16.2\",\n build_file = Label(\"@crates//crates:BUILD.fancy-regex-0.16.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fancy-regex-0.17.0\",\n sha256 = \"72cf461f865c862bb7dc573f643dd6a2b6842f7c30b07882b56bd148cc2761b8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fancy-regex/0.17.0/download\"],\n strip_prefix = \"fancy-regex-0.17.0\",\n build_file = Label(\"@crates//crates:BUILD.fancy-regex-0.17.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fancy-regex-0.18.0\",\n sha256 = \"e1e1dacd0d2082dfcf1351c4bdd566bbe89a2b263235a2b50058f1e130a47277\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fancy-regex/0.18.0/download\"],\n strip_prefix = \"fancy-regex-0.18.0\",\n build_file = Label(\"@crates//crates:BUILD.fancy-regex-0.18.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fast-srgb8-1.0.0\",\n sha256 = \"dd2e7510819d6fbf51a5545c8f922716ecfb14df168a3242f7d33e0239efe6a1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fast-srgb8/1.0.0/download\"],\n strip_prefix = \"fast-srgb8-1.0.0\",\n build_file = Label(\"@crates//crates:BUILD.fast-srgb8-1.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fastrand-2.5.0\",\n sha256 = \"da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fastrand/2.5.0/download\"],\n strip_prefix = \"fastrand-2.5.0\",\n build_file = Label(\"@crates//crates:BUILD.fastrand-2.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fax-0.2.7\",\n sha256 = \"caf1079563223d5d59d83c85886a56e586cfd5c1a26292e971a0fa266531ac5a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fax/0.2.7/download\"],\n strip_prefix = \"fax-0.2.7\",\n build_file = Label(\"@crates//crates:BUILD.fax-0.2.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fdeflate-0.3.7\",\n sha256 = \"1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fdeflate/0.3.7/download\"],\n strip_prefix = \"fdeflate-0.3.7\",\n build_file = Label(\"@crates//crates:BUILD.fdeflate-0.3.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ff-0.13.1\",\n sha256 = \"c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ff/0.13.1/download\"],\n strip_prefix = \"ff-0.13.1\",\n build_file = Label(\"@crates//crates:BUILD.ff-0.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fiat-crypto-0.2.9\",\n sha256 = \"28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fiat-crypto/0.2.9/download\"],\n strip_prefix = \"fiat-crypto-0.2.9\",\n build_file = Label(\"@crates//crates:BUILD.fiat-crypto-0.2.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__filedescriptor-0.8.3\",\n sha256 = \"e40758ed24c9b2eeb76c35fb0aebc66c626084edd827e07e1552279814c6682d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/filedescriptor/0.8.3/download\"],\n strip_prefix = \"filedescriptor-0.8.3\",\n build_file = Label(\"@crates//crates:BUILD.filedescriptor-0.8.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__filetime-0.2.29\",\n sha256 = \"5c287a33c7f0a620c38e641e7f60827713987b3c0f26e8ddc9462cc69cf75759\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/filetime/0.2.29/download\"],\n strip_prefix = \"filetime-0.2.29\",\n build_file = Label(\"@crates//crates:BUILD.filetime-0.2.29.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__find-msvc-tools-0.1.9\",\n sha256 = \"5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/find-msvc-tools/0.1.9/download\"],\n strip_prefix = \"find-msvc-tools-0.1.9\",\n build_file = Label(\"@crates//crates:BUILD.find-msvc-tools-0.1.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fixed_decimal-0.7.2\",\n sha256 = \"79c3c892f121fff406e5dd6b28c1b30096b95111c30701a899d4f2b18da6d1bd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fixed_decimal/0.7.2/download\"],\n strip_prefix = \"fixed_decimal-0.7.2\",\n build_file = Label(\"@crates//crates:BUILD.fixed_decimal-0.7.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fixedbitset-0.5.7\",\n sha256 = \"1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fixedbitset/0.5.7/download\"],\n strip_prefix = \"fixedbitset-0.5.7\",\n build_file = Label(\"@crates//crates:BUILD.fixedbitset-0.5.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__flate2-1.1.9\",\n sha256 = \"843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/flate2/1.1.9/download\"],\n strip_prefix = \"flate2-1.1.9\",\n build_file = Label(\"@crates//crates:BUILD.flate2-1.1.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fluent-0.17.0\",\n sha256 = \"8137a6d5a2c50d6b0ebfcb9aaa91a28154e0a70605f112d30cb0cd4a78670477\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fluent/0.17.0/download\"],\n strip_prefix = \"fluent-0.17.0\",\n build_file = Label(\"@crates//crates:BUILD.fluent-0.17.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fluent-bundle-0.16.0\",\n sha256 = \"01203cb8918f5711e73891b347816d932046f95f54207710bda99beaeb423bf4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fluent-bundle/0.16.0/download\"],\n strip_prefix = \"fluent-bundle-0.16.0\",\n build_file = Label(\"@crates//crates:BUILD.fluent-bundle-0.16.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fluent-langneg-0.13.1\",\n sha256 = \"7eebbe59450baee8282d71676f3bfed5689aeab00b27545e83e5f14b1195e8b0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fluent-langneg/0.13.1/download\"],\n strip_prefix = \"fluent-langneg-0.13.1\",\n build_file = Label(\"@crates//crates:BUILD.fluent-langneg-0.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fluent-syntax-0.12.0\",\n sha256 = \"54f0d287c53ffd184d04d8677f590f4ac5379785529e5e08b1c8083acdd5c198\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fluent-syntax/0.12.0/download\"],\n strip_prefix = \"fluent-syntax-0.12.0\",\n build_file = Label(\"@crates//crates:BUILD.fluent-syntax-0.12.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__flume-0.11.1\",\n sha256 = \"da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/flume/0.11.1/download\"],\n strip_prefix = \"flume-0.11.1\",\n build_file = Label(\"@crates//crates:BUILD.flume-0.11.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fnv-1.0.7\",\n sha256 = \"3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fnv/1.0.7/download\"],\n strip_prefix = \"fnv-1.0.7\",\n build_file = Label(\"@crates//crates:BUILD.fnv-1.0.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__foldhash-0.1.5\",\n sha256 = \"d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/foldhash/0.1.5/download\"],\n strip_prefix = \"foldhash-0.1.5\",\n build_file = Label(\"@crates//crates:BUILD.foldhash-0.1.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__foldhash-0.2.0\",\n sha256 = \"77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/foldhash/0.2.0/download\"],\n strip_prefix = \"foldhash-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.foldhash-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fontdue-0.9.3\",\n sha256 = \"2e57e16b3fe8ff4364c0661fdaac543fb38b29ea9bc9c2f45612d90adf931d2b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fontdue/0.9.3/download\"],\n strip_prefix = \"fontdue-0.9.3\",\n build_file = Label(\"@crates//crates:BUILD.fontdue-0.9.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__foreign-types-0.5.0\",\n sha256 = \"d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/foreign-types/0.5.0/download\"],\n strip_prefix = \"foreign-types-0.5.0\",\n build_file = Label(\"@crates//crates:BUILD.foreign-types-0.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__foreign-types-macros-0.2.4\",\n sha256 = \"ea5190182e6915eb873ddbc16e23b711b6eb1f9c00a0d0a3a91b5f6228475225\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/foreign-types-macros/0.2.4/download\"],\n strip_prefix = \"foreign-types-macros-0.2.4\",\n build_file = Label(\"@crates//crates:BUILD.foreign-types-macros-0.2.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__foreign-types-shared-0.3.1\",\n sha256 = \"aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/foreign-types-shared/0.3.1/download\"],\n strip_prefix = \"foreign-types-shared-0.3.1\",\n build_file = Label(\"@crates//crates:BUILD.foreign-types-shared-0.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__form_urlencoded-1.2.2\",\n sha256 = \"cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/form_urlencoded/1.2.2/download\"],\n strip_prefix = \"form_urlencoded-1.2.2\",\n build_file = Label(\"@crates//crates:BUILD.form_urlencoded-1.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fs_extra-1.3.0\",\n sha256 = \"42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fs_extra/1.3.0/download\"],\n strip_prefix = \"fs_extra-1.3.0\",\n build_file = Label(\"@crates//crates:BUILD.fs_extra-1.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fsevent-sys-4.1.0\",\n sha256 = \"76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fsevent-sys/4.1.0/download\"],\n strip_prefix = \"fsevent-sys-4.1.0\",\n build_file = Label(\"@crates//crates:BUILD.fsevent-sys-4.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__funty-2.0.0\",\n sha256 = \"e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/funty/2.0.0/download\"],\n strip_prefix = \"funty-2.0.0\",\n build_file = Label(\"@crates//crates:BUILD.funty-2.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-0.3.33\",\n sha256 = \"a88cf1f829d945f548cf8fec32c61b1f202b6d93b45848602fc02af4b12ad218\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures/0.3.33/download\"],\n strip_prefix = \"futures-0.3.33\",\n build_file = Label(\"@crates//crates:BUILD.futures-0.3.33.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-channel-0.3.33\",\n sha256 = \"262590f4fe6afeb0bc83be1daa64e52657fe185690a958af7f3ad0e92085c5ae\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-channel/0.3.33/download\"],\n strip_prefix = \"futures-channel-0.3.33\",\n build_file = Label(\"@crates//crates:BUILD.futures-channel-0.3.33.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-core-0.3.33\",\n sha256 = \"2cd50c473c80f6d7c3670a752354b8e569b1a7cbfdc0419ec88e5edad85e0dc7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-core/0.3.33/download\"],\n strip_prefix = \"futures-core-0.3.33\",\n build_file = Label(\"@crates//crates:BUILD.futures-core-0.3.33.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-executor-0.3.33\",\n sha256 = \"6754879cc9f2c66f88c6e5c35344bb0bdb0708b0352b1201815667c7eabc7458\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-executor/0.3.33/download\"],\n strip_prefix = \"futures-executor-0.3.33\",\n build_file = Label(\"@crates//crates:BUILD.futures-executor-0.3.33.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-io-0.3.33\",\n sha256 = \"4577ecaa3c4f96589d473f679a71b596316f6641bc350038b962a5daf0085d7a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-io/0.3.33/download\"],\n strip_prefix = \"futures-io-0.3.33\",\n build_file = Label(\"@crates//crates:BUILD.futures-io-0.3.33.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-lite-2.6.1\",\n sha256 = \"f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-lite/2.6.1/download\"],\n strip_prefix = \"futures-lite-2.6.1\",\n build_file = Label(\"@crates//crates:BUILD.futures-lite-2.6.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-macro-0.3.33\",\n sha256 = \"2d6d3cde68c518367be28956066ddfef33813991b77a55005a69dae04bf3b10b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-macro/0.3.33/download\"],\n strip_prefix = \"futures-macro-0.3.33\",\n build_file = Label(\"@crates//crates:BUILD.futures-macro-0.3.33.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-sink-0.3.33\",\n sha256 = \"e34418ac499d6305c2fb5ad0ed2f6ac998c5f8ca209b4510f7f94242c647e307\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-sink/0.3.33/download\"],\n strip_prefix = \"futures-sink-0.3.33\",\n build_file = Label(\"@crates//crates:BUILD.futures-sink-0.3.33.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-task-0.3.33\",\n sha256 = \"b231ed28831efb4a61a08580c4bc233ec56bc009f4cd8f52da2c3cb97df0c109\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-task/0.3.33/download\"],\n strip_prefix = \"futures-task-0.3.33\",\n build_file = Label(\"@crates//crates:BUILD.futures-task-0.3.33.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-timer-3.0.4\",\n sha256 = \"af43fadb8a98512d547e37b4e92e0ced13e205c061b87b4623eff01d918d6968\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-timer/3.0.4/download\"],\n strip_prefix = \"futures-timer-3.0.4\",\n build_file = Label(\"@crates//crates:BUILD.futures-timer-3.0.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-util-0.3.33\",\n sha256 = \"a77a90a256fce34da66415271e30f94ee91c57b04b8a2c042d9cf3220179deaa\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-util/0.3.33/download\"],\n strip_prefix = \"futures-util-0.3.33\",\n build_file = Label(\"@crates//crates:BUILD.futures-util-0.3.33.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__gbm-0.18.0\",\n sha256 = \"ce852e998d3ca5e4a97014fb31c940dc5ef344ec7d364984525fd11e8a547e6a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/gbm/0.18.0/download\"],\n strip_prefix = \"gbm-0.18.0\",\n build_file = Label(\"@crates//crates:BUILD.gbm-0.18.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__gbm-sys-0.4.0\",\n sha256 = \"c13a5f2acc785d8fb6bf6b7ab6bfb0ef5dad4f4d97e8e70bb8e470722312f76f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/gbm-sys/0.4.0/download\"],\n strip_prefix = \"gbm-sys-0.4.0\",\n build_file = Label(\"@crates//crates:BUILD.gbm-sys-0.4.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__generic-array-0.14.7\",\n sha256 = \"85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/generic-array/0.14.7/download\"],\n strip_prefix = \"generic-array-0.14.7\",\n build_file = Label(\"@crates//crates:BUILD.generic-array-0.14.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__gethostname-1.1.0\",\n sha256 = \"1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/gethostname/1.1.0/download\"],\n strip_prefix = \"gethostname-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.gethostname-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__getrandom-0.2.17\",\n sha256 = \"ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/getrandom/0.2.17/download\"],\n strip_prefix = \"getrandom-0.2.17\",\n build_file = Label(\"@crates//crates:BUILD.getrandom-0.2.17.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__getrandom-0.3.4\",\n sha256 = \"899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/getrandom/0.3.4/download\"],\n strip_prefix = \"getrandom-0.3.4\",\n build_file = Label(\"@crates//crates:BUILD.getrandom-0.3.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__getrandom-0.4.3\",\n sha256 = \"300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/getrandom/0.4.3/download\"],\n strip_prefix = \"getrandom-0.4.3\",\n build_file = Label(\"@crates//crates:BUILD.getrandom-0.4.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ghash-0.5.1\",\n sha256 = \"f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ghash/0.5.1/download\"],\n strip_prefix = \"ghash-0.5.1\",\n build_file = Label(\"@crates//crates:BUILD.ghash-0.5.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__gif-0.14.2\",\n sha256 = \"ee8cfcc411d9adbbaba82fb72661cc1bcca13e8bba98b364e62b2dba8f960159\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/gif/0.14.2/download\"],\n strip_prefix = \"gif-0.14.2\",\n build_file = Label(\"@crates//crates:BUILD.gif-0.14.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__gl-0.14.0\",\n sha256 = \"a94edab108827d67608095e269cf862e60d920f144a5026d3dbcfd8b877fb404\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/gl/0.14.0/download\"],\n strip_prefix = \"gl-0.14.0\",\n build_file = Label(\"@crates//crates:BUILD.gl-0.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__gl_generator-0.14.0\",\n sha256 = \"1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/gl_generator/0.14.0/download\"],\n strip_prefix = \"gl_generator-0.14.0\",\n build_file = Label(\"@crates//crates:BUILD.gl_generator-0.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__glob-0.3.4\",\n sha256 = \"e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/glob/0.3.4/download\"],\n strip_prefix = \"glob-0.3.4\",\n build_file = Label(\"@crates//crates:BUILD.glob-0.3.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__globset-0.4.19\",\n sha256 = \"e47d37d2ae4464254884b60ab7071be2b876a9c35b696bd018ddcc76847309cd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/globset/0.4.19/download\"],\n strip_prefix = \"globset-0.4.19\",\n build_file = Label(\"@crates//crates:BUILD.globset-0.4.19.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__grep-cli-0.1.12\",\n sha256 = \"cf32d263c5d5cc2a23ce587097f5ddafdb188492ba2e6fb638eaccdc22453631\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/grep-cli/0.1.12/download\"],\n strip_prefix = \"grep-cli-0.1.12\",\n build_file = Label(\"@crates//crates:BUILD.grep-cli-0.1.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__grep-matcher-0.1.9\",\n sha256 = \"f9417543f4870fc8f1c8e1af870afae2431007626d9e703fce6471c468d33847\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/grep-matcher/0.1.9/download\"],\n strip_prefix = \"grep-matcher-0.1.9\",\n build_file = Label(\"@crates//crates:BUILD.grep-matcher-0.1.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__grep-pcre2-0.1.10\",\n sha256 = \"b752bb6f57dd3716e55b63a33ca05b5825c3d66cd427468874a5564af6ca365c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/grep-pcre2/0.1.10/download\"],\n strip_prefix = \"grep-pcre2-0.1.10\",\n build_file = Label(\"@crates//crates:BUILD.grep-pcre2-0.1.10.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__grep-printer-0.3.1\",\n sha256 = \"fd76035e87871f51c1ee5b793e32122b3ccf9c692662d9622ef1686ff5321acb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/grep-printer/0.3.1/download\"],\n strip_prefix = \"grep-printer-0.3.1\",\n build_file = Label(\"@crates//crates:BUILD.grep-printer-0.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__grep-regex-0.1.14\",\n sha256 = \"0ce0c256c3ad82bcc07b812c15a45ec1d398122e8e15124f96695234db7112ef\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/grep-regex/0.1.14/download\"],\n strip_prefix = \"grep-regex-0.1.14\",\n build_file = Label(\"@crates//crates:BUILD.grep-regex-0.1.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__grep-searcher-0.1.17\",\n sha256 = \"72348823a0eafc4bc2e9051064f28b5b42cc100b571b3a35d67918d711efcbc6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/grep-searcher/0.1.17/download\"],\n strip_prefix = \"grep-searcher-0.1.17\",\n build_file = Label(\"@crates//crates:BUILD.grep-searcher-0.1.17.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__group-0.13.0\",\n sha256 = \"f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/group/0.13.0/download\"],\n strip_prefix = \"group-0.13.0\",\n build_file = Label(\"@crates//crates:BUILD.group-0.13.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__half-2.7.1\",\n sha256 = \"6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/half/2.7.1/download\"],\n strip_prefix = \"half-2.7.1\",\n build_file = Label(\"@crates//crates:BUILD.half-2.7.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hashbrown-0.14.5\",\n sha256 = \"e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hashbrown/0.14.5/download\"],\n strip_prefix = \"hashbrown-0.14.5\",\n build_file = Label(\"@crates//crates:BUILD.hashbrown-0.14.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hashbrown-0.15.5\",\n sha256 = \"9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hashbrown/0.15.5/download\"],\n strip_prefix = \"hashbrown-0.15.5\",\n build_file = Label(\"@crates//crates:BUILD.hashbrown-0.15.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hashbrown-0.16.1\",\n sha256 = \"841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hashbrown/0.16.1/download\"],\n strip_prefix = \"hashbrown-0.16.1\",\n build_file = Label(\"@crates//crates:BUILD.hashbrown-0.16.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hashbrown-0.17.1\",\n sha256 = \"ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hashbrown/0.17.1/download\"],\n strip_prefix = \"hashbrown-0.17.1\",\n build_file = Label(\"@crates//crates:BUILD.hashbrown-0.17.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__heck-0.5.0\",\n sha256 = \"2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/heck/0.5.0/download\"],\n strip_prefix = \"heck-0.5.0\",\n build_file = Label(\"@crates//crates:BUILD.heck-0.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hermit-abi-0.5.2\",\n sha256 = \"fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hermit-abi/0.5.2/download\"],\n strip_prefix = \"hermit-abi-0.5.2\",\n build_file = Label(\"@crates//crates:BUILD.hermit-abi-0.5.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hex-0.4.3\",\n sha256 = \"7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hex/0.4.3/download\"],\n strip_prefix = \"hex-0.4.3\",\n build_file = Label(\"@crates//crates:BUILD.hex-0.4.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hifijson-0.2.3\",\n sha256 = \"0a7763b98ba8a24f59e698bf9ab197e7676c640d6455d1580b4ce7dc560f0f0d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hifijson/0.2.3/download\"],\n strip_prefix = \"hifijson-0.2.3\",\n build_file = Label(\"@crates//crates:BUILD.hifijson-0.2.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hkdf-0.12.4\",\n sha256 = \"7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hkdf/0.12.4/download\"],\n strip_prefix = \"hkdf-0.12.4\",\n build_file = Label(\"@crates//crates:BUILD.hkdf-0.12.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hmac-0.12.1\",\n sha256 = \"6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hmac/0.12.1/download\"],\n strip_prefix = \"hmac-0.12.1\",\n build_file = Label(\"@crates//crates:BUILD.hmac-0.12.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hostname-0.4.2\",\n sha256 = \"617aaa3557aef3810a6369d0a99fac8a080891b68bd9f9812a1eeda0c0730cbd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hostname/0.4.2/download\"],\n strip_prefix = \"hostname-0.4.2\",\n build_file = Label(\"@crates//crates:BUILD.hostname-0.4.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__html-escape-0.2.14\",\n sha256 = \"46c1ff2d1cbf39efe5af0900ced8a069b5e61557a17544eb0c4a50239937389e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/html-escape/0.2.14/download\"],\n strip_prefix = \"html-escape-0.2.14\",\n build_file = Label(\"@crates//crates:BUILD.html-escape-0.2.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__html-to-markdown-rs-2.30.0\",\n sha256 = \"7ea41945a2fd834381642a000ef75b03f0030f3023f3dd3291fc5c372d3dda33\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/html-to-markdown-rs/2.30.0/download\"],\n strip_prefix = \"html-to-markdown-rs-2.30.0\",\n build_file = Label(\"@crates//crates:BUILD.html-to-markdown-rs-2.30.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__html5ever-0.39.0\",\n sha256 = \"46a1761807faccc9a19e86944bbf40610014066306f96edcdedc2fb714bcb7b8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/html5ever/0.39.0/download\"],\n strip_prefix = \"html5ever-0.39.0\",\n build_file = Label(\"@crates//crates:BUILD.html5ever-0.39.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hybrid-array-0.4.13\",\n sha256 = \"818356c5132c1fede50f837ca96afbe78ff42413047f4abb886217845e1b6c8c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hybrid-array/0.4.13/download\"],\n strip_prefix = \"hybrid-array-0.4.13\",\n build_file = Label(\"@crates//crates:BUILD.hybrid-array-0.4.13.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__iana-time-zone-0.1.65\",\n sha256 = \"e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/iana-time-zone/0.1.65/download\"],\n strip_prefix = \"iana-time-zone-0.1.65\",\n build_file = Label(\"@crates//crates:BUILD.iana-time-zone-0.1.65.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__iana-time-zone-haiku-0.1.2\",\n sha256 = \"f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/iana-time-zone-haiku/0.1.2/download\"],\n strip_prefix = \"iana-time-zone-haiku-0.1.2\",\n build_file = Label(\"@crates//crates:BUILD.iana-time-zone-haiku-0.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_calendar-2.2.1\",\n sha256 = \"a2b2acc6263f494f1df50685b53ff8e57869e47d5c6fe39c23d518ae9a4f3e45\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_calendar/2.2.1/download\"],\n strip_prefix = \"icu_calendar-2.2.1\",\n build_file = Label(\"@crates//crates:BUILD.icu_calendar-2.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_calendar_data-2.2.0\",\n sha256 = \"118577bcf3a0fa7c6ac0a7d6e951814da84ee56b9b1f68fb4d8d10b08cefaf4d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_calendar_data/2.2.0/download\"],\n strip_prefix = \"icu_calendar_data-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_calendar_data-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_collator-2.2.1\",\n sha256 = \"8bbdf98e5e0aa827770acee171ebb568aaab975a36b56afdb5fd0e2f525750bb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_collator/2.2.1/download\"],\n strip_prefix = \"icu_collator-2.2.1\",\n build_file = Label(\"@crates//crates:BUILD.icu_collator-2.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_collator_data-2.2.0\",\n sha256 = \"038ed8e5817f2059c2f3efb0945ba78d060d3d25e8f1a1bea5139f821a21a2f0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_collator_data/2.2.0/download\"],\n strip_prefix = \"icu_collator_data-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_collator_data-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_collections-2.2.0\",\n sha256 = \"2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_collections/2.2.0/download\"],\n strip_prefix = \"icu_collections-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_collections-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_datetime-2.2.0\",\n sha256 = \"989d56ea5bbc43ae2b4e0388874b002884eaf4ed3a76c84a6c8c5ad575e04d72\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_datetime/2.2.0/download\"],\n strip_prefix = \"icu_datetime-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_datetime-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_datetime_data-2.2.0\",\n sha256 = \"40d3cc1b690d9703202bc319692ac8a1f3a6390686f0930ff40542450fa34f0b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_datetime_data/2.2.0/download\"],\n strip_prefix = \"icu_datetime_data-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_datetime_data-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_decimal-2.2.0\",\n sha256 = \"288247df2e32aa776ac54fdd64de552149ac43cb840f2761811f0e8d09719dd4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_decimal/2.2.0/download\"],\n strip_prefix = \"icu_decimal-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_decimal-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_decimal_data-2.2.0\",\n sha256 = \"6f14a5ca9e8af29eef62064f269078424283d90dbaffeac5225addf62aaabc22\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_decimal_data/2.2.0/download\"],\n strip_prefix = \"icu_decimal_data-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_decimal_data-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_locale-2.2.0\",\n sha256 = \"d5a396343c7208121dc86e35623d3dfe19814a7613cfd14964994cdc9c9a2e26\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_locale/2.2.0/download\"],\n strip_prefix = \"icu_locale-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_locale-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_locale_core-2.2.0\",\n sha256 = \"92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_locale_core/2.2.0/download\"],\n strip_prefix = \"icu_locale_core-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_locale_core-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_locale_data-2.2.0\",\n sha256 = \"d5fdcc9ac77c6d74ff5cf6e65ef3181d6af32003b16fce3a77fb451d2f695993\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_locale_data/2.2.0/download\"],\n strip_prefix = \"icu_locale_data-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_locale_data-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_normalizer-2.2.0\",\n sha256 = \"c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_normalizer/2.2.0/download\"],\n strip_prefix = \"icu_normalizer-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_normalizer-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_normalizer_data-2.2.0\",\n sha256 = \"da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_normalizer_data/2.2.0/download\"],\n strip_prefix = \"icu_normalizer_data-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_normalizer_data-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_pattern-0.4.2\",\n sha256 = \"1c4c568054ffe735398a9f4c55aec37ad7c768844553cc0978f09cc9b933a1fb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_pattern/0.4.2/download\"],\n strip_prefix = \"icu_pattern-0.4.2\",\n build_file = Label(\"@crates//crates:BUILD.icu_pattern-0.4.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_plurals-2.2.0\",\n sha256 = \"2a50023f1d49ad5c4333380328a0d4a19e4b9d6d842ec06639affd5ba47c8103\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_plurals/2.2.0/download\"],\n strip_prefix = \"icu_plurals-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_plurals-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_plurals_data-2.2.0\",\n sha256 = \"8485497155dc865f901decb93ecc20d3e467df67bfeceb91e3ba34e2b11e8e1d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_plurals_data/2.2.0/download\"],\n strip_prefix = \"icu_plurals_data-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_plurals_data-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_properties-2.2.0\",\n sha256 = \"bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_properties/2.2.0/download\"],\n strip_prefix = \"icu_properties-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_properties-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_properties_data-2.2.0\",\n sha256 = \"8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_properties_data/2.2.0/download\"],\n strip_prefix = \"icu_properties_data-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_properties_data-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_provider-2.2.0\",\n sha256 = \"139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_provider/2.2.0/download\"],\n strip_prefix = \"icu_provider-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_provider-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_time-2.2.0\",\n sha256 = \"ec3af0c141da0a61d4f6970cd1d5f4b388b17ea22f8124f8f6049d3d5147586a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_time/2.2.0/download\"],\n strip_prefix = \"icu_time-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_time-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_time_data-2.2.1\",\n sha256 = \"2e0ee79a0bb29772465234bfbad6ea04fbc5220bef9fa4f318cc53eb8897070e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_time_data/2.2.1/download\"],\n strip_prefix = \"icu_time_data-2.2.1\",\n build_file = Label(\"@crates//crates:BUILD.icu_time_data-2.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icy_sixel-0.5.0\",\n sha256 = \"85518b9086bf01117761b90e7691c0ef3236fa8adfb1fb44dd248fe5f87215d5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icy_sixel/0.5.0/download\"],\n strip_prefix = \"icy_sixel-0.5.0\",\n build_file = Label(\"@crates//crates:BUILD.icy_sixel-0.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ident_case-1.0.1\",\n sha256 = \"b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ident_case/1.0.1/download\"],\n strip_prefix = \"ident_case-1.0.1\",\n build_file = Label(\"@crates//crates:BUILD.ident_case-1.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__idna-1.1.0\",\n sha256 = \"3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/idna/1.1.0/download\"],\n strip_prefix = \"idna-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.idna-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__idna_adapter-1.2.2\",\n sha256 = \"cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/idna_adapter/1.2.2/download\"],\n strip_prefix = \"idna_adapter-1.2.2\",\n build_file = Label(\"@crates//crates:BUILD.idna_adapter-1.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ignore-0.4.31\",\n sha256 = \"7f8a7b8211e695a1d0cd91cace480d4d0bd57667ab10277cc412c5f7f4884f83\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ignore/0.4.31/download\"],\n strip_prefix = \"ignore-0.4.31\",\n build_file = Label(\"@crates//crates:BUILD.ignore-0.4.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__image-0.25.10\",\n sha256 = \"85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/image/0.25.10/download\"],\n strip_prefix = \"image-0.25.10\",\n build_file = Label(\"@crates//crates:BUILD.image-0.25.10.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__image-webp-0.2.4\",\n sha256 = \"525e9ff3e1a4be2fbea1fdf0e98686a6d98b4d8f937e1bf7402245af1909e8c3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/image-webp/0.2.4/download\"],\n strip_prefix = \"image-webp-0.2.4\",\n build_file = Label(\"@crates//crates:BUILD.image-webp-0.2.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__indenter-0.3.4\",\n sha256 = \"964de6e86d545b246d84badc0fef527924ace5134f30641c203ef52ba83f58d5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/indenter/0.3.4/download\"],\n strip_prefix = \"indenter-0.3.4\",\n build_file = Label(\"@crates//crates:BUILD.indenter-0.3.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__indexmap-2.14.0\",\n sha256 = \"d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/indexmap/2.14.0/download\"],\n strip_prefix = \"indexmap-2.14.0\",\n build_file = Label(\"@crates//crates:BUILD.indexmap-2.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__indicatif-0.18.6\",\n sha256 = \"9433806cd6b4ec1aba79c021c7e4c58fb4c3b9977c085062e611ac929998fb0c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/indicatif/0.18.6/download\"],\n strip_prefix = \"indicatif-0.18.6\",\n build_file = Label(\"@crates//crates:BUILD.indicatif-0.18.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__inferno-0.12.8\",\n sha256 = \"0c460d4fa06223667240720ab69a8045133755ae6dfbe100cf481b95e3a014f1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/inferno/0.12.8/download\"],\n strip_prefix = \"inferno-0.12.8\",\n build_file = Label(\"@crates//crates:BUILD.inferno-0.12.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__inherent-1.0.14\",\n sha256 = \"bee2c455ca60511a054699102d40ce7153621cb2429558f9eaa600e4499b5984\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/inherent/1.0.14/download\"],\n strip_prefix = \"inherent-1.0.14\",\n build_file = Label(\"@crates//crates:BUILD.inherent-1.0.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__inotify-0.11.4\",\n sha256 = \"153be1941a183ec9ccd095ddbe17a8b8d435ef6c76e9e02451b933c3999af2c8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/inotify/0.11.4/download\"],\n strip_prefix = \"inotify-0.11.4\",\n build_file = Label(\"@crates//crates:BUILD.inotify-0.11.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__inotify-sys-0.1.8\",\n sha256 = \"c033f80b2c113cdf91ab7a33faa9cbc014726dcad99880c8609af2a370edf37d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/inotify-sys/0.1.8/download\"],\n strip_prefix = \"inotify-sys-0.1.8\",\n build_file = Label(\"@crates//crates:BUILD.inotify-sys-0.1.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__inout-0.1.4\",\n sha256 = \"879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/inout/0.1.4/download\"],\n strip_prefix = \"inout-0.1.4\",\n build_file = Label(\"@crates//crates:BUILD.inout-0.1.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__insta-1.48.0\",\n sha256 = \"86f0f8fee8c926415c58d6ae43a08523a26faccb2323f5e6b644fe7dd4ef6b82\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/insta/1.48.0/download\"],\n strip_prefix = \"insta-1.48.0\",\n build_file = Label(\"@crates//crates:BUILD.insta-1.48.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__interceptor-0.17.2\",\n sha256 = \"88c11a956a48159f7fe539b8198f12b4db9b709ae5f94385b840db38f97fed74\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/interceptor/0.17.2/download\"],\n strip_prefix = \"interceptor-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.interceptor-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__intl-memoizer-0.5.3\",\n sha256 = \"310da2e345f5eb861e7a07ee182262e94975051db9e4223e909ba90f392f163f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/intl-memoizer/0.5.3/download\"],\n strip_prefix = \"intl-memoizer-0.5.3\",\n build_file = Label(\"@crates//crates:BUILD.intl-memoizer-0.5.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__intl_pluralrules-7.0.2\",\n sha256 = \"078ea7b7c29a2b4df841a7f6ac8775ff6074020c6776d48491ce2268e068f972\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/intl_pluralrules/7.0.2/download\"],\n strip_prefix = \"intl_pluralrules-7.0.2\",\n build_file = Label(\"@crates//crates:BUILD.intl_pluralrules-7.0.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ipnet-2.12.0\",\n sha256 = \"d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ipnet/2.12.0/download\"],\n strip_prefix = \"ipnet-2.12.0\",\n build_file = Label(\"@crates//crates:BUILD.ipnet-2.12.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__is_terminal_polyfill-1.70.2\",\n sha256 = \"a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/is_terminal_polyfill/1.70.2/download\"],\n strip_prefix = \"is_terminal_polyfill-1.70.2\",\n build_file = Label(\"@crates//crates:BUILD.is_terminal_polyfill-1.70.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__itertools-0.13.0\",\n sha256 = \"413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/itertools/0.13.0/download\"],\n strip_prefix = \"itertools-0.13.0\",\n build_file = Label(\"@crates//crates:BUILD.itertools-0.13.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__itertools-0.14.0\",\n sha256 = \"2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/itertools/0.14.0/download\"],\n strip_prefix = \"itertools-0.14.0\",\n build_file = Label(\"@crates//crates:BUILD.itertools-0.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__itoa-1.0.18\",\n sha256 = \"8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/itoa/1.0.18/download\"],\n strip_prefix = \"itoa-1.0.18\",\n build_file = Label(\"@crates//crates:BUILD.itoa-1.0.18.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jaq-core-2.2.1\",\n sha256 = \"77526a72eb79412c29fd141767a6549bbfcb1cb40e00556fe16532d5e878e098\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jaq-core/2.2.1/download\"],\n strip_prefix = \"jaq-core-2.2.1\",\n build_file = Label(\"@crates//crates:BUILD.jaq-core-2.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jaq-json-1.1.3\",\n sha256 = \"01dbdbd07b076e8403abac68ce7744d93e2ecd953bbc44bf77bf00e1e81172bc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jaq-json/1.1.3/download\"],\n strip_prefix = \"jaq-json-1.1.3\",\n build_file = Label(\"@crates//crates:BUILD.jaq-json-1.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jaq-std-2.1.2\",\n sha256 = \"2c264fe397c981705976c71f1bfe020382b9eda52ae950e57fe885e147bdd67d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jaq-std/2.1.2/download\"],\n strip_prefix = \"jaq-std-2.1.2\",\n build_file = Label(\"@crates//crates:BUILD.jaq-std-2.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jiff-0.2.35\",\n sha256 = \"668b7183bd07af9a4885f5c35b0cc5c83c4607a913c16b7e17291832910d2dcc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jiff/0.2.35/download\"],\n strip_prefix = \"jiff-0.2.35\",\n build_file = Label(\"@crates//crates:BUILD.jiff-0.2.35.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jiff-core-0.1.0\",\n sha256 = \"7feca88439efe53da3754500c1851dedf3cb36c524dd5cf8225cc0794de95d09\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jiff-core/0.1.0/download\"],\n strip_prefix = \"jiff-core-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.jiff-core-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jiff-icu-0.2.2\",\n sha256 = \"0e67c2beaae8b10a82d849b9aabb698a43a682f32b17bcdc035d5ecadb44d646\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jiff-icu/0.2.2/download\"],\n strip_prefix = \"jiff-icu-0.2.2\",\n build_file = Label(\"@crates//crates:BUILD.jiff-icu-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jiff-static-0.2.35\",\n sha256 = \"3a69dcb3a21cfb32ce1cd056169337ca284af0766dd766e7878819b251a49204\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jiff-static/0.2.35/download\"],\n strip_prefix = \"jiff-static-0.2.35\",\n build_file = Label(\"@crates//crates:BUILD.jiff-static-0.2.35.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jiff-tzdb-0.1.8\",\n sha256 = \"142bd39932ad231f10513df9ab62661fead8719872150b7ad02a2df79f4e141e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jiff-tzdb/0.1.8/download\"],\n strip_prefix = \"jiff-tzdb-0.1.8\",\n build_file = Label(\"@crates//crates:BUILD.jiff-tzdb-0.1.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jiff-tzdb-platform-0.1.3\",\n sha256 = \"875a5a69ac2bab1a891711cf5eccbec1ce0341ea805560dcd90b7a2e925132e8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jiff-tzdb-platform/0.1.3/download\"],\n strip_prefix = \"jiff-tzdb-platform-0.1.3\",\n build_file = Label(\"@crates//crates:BUILD.jiff-tzdb-platform-0.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jobserver-0.1.35\",\n sha256 = \"1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jobserver/0.1.35/download\"],\n strip_prefix = \"jobserver-0.1.35\",\n build_file = Label(\"@crates//crates:BUILD.jobserver-0.1.35.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__js-sys-0.3.103\",\n sha256 = \"53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/js-sys/0.3.103/download\"],\n strip_prefix = \"js-sys-0.3.103\",\n build_file = Label(\"@crates//crates:BUILD.js-sys-0.3.103.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__keccak-0.1.6\",\n sha256 = \"cb26cec98cce3a3d96cbb7bced3c4b16e3d13f27ec56dbd62cbc8f39cfb9d653\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/keccak/0.1.6/download\"],\n strip_prefix = \"keccak-0.1.6\",\n build_file = Label(\"@crates//crates:BUILD.keccak-0.1.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__khronos-egl-6.0.0\",\n sha256 = \"6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/khronos-egl/6.0.0/download\"],\n strip_prefix = \"khronos-egl-6.0.0\",\n build_file = Label(\"@crates//crates:BUILD.khronos-egl-6.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__khronos_api-3.1.0\",\n sha256 = \"e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/khronos_api/3.1.0/download\"],\n strip_prefix = \"khronos_api-3.1.0\",\n build_file = Label(\"@crates//crates:BUILD.khronos_api-3.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__kqueue-1.2.0\",\n sha256 = \"273c0752728918e0ac4976f2b275b6fefb9ecd400585dec929419f3844cd87b5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/kqueue/1.2.0/download\"],\n strip_prefix = \"kqueue-1.2.0\",\n build_file = Label(\"@crates//crates:BUILD.kqueue-1.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__kqueue-sys-1.1.2\",\n sha256 = \"07293a4e297ac234359b510362495713f75ea345d5307140414f20c69ffeb087\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/kqueue-sys/1.1.2/download\"],\n strip_prefix = \"kqueue-sys-1.1.2\",\n build_file = Label(\"@crates//crates:BUILD.kqueue-sys-1.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__lazy_static-1.5.0\",\n sha256 = \"bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/lazy_static/1.5.0/download\"],\n strip_prefix = \"lazy_static-1.5.0\",\n build_file = Label(\"@crates//crates:BUILD.lazy_static-1.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__libc-0.2.189\",\n sha256 = \"3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/libc/0.2.189/download\"],\n strip_prefix = \"libc-0.2.189\",\n build_file = Label(\"@crates//crates:BUILD.libc-0.2.189.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__libloading-0.8.9\",\n sha256 = \"d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/libloading/0.8.9/download\"],\n strip_prefix = \"libloading-0.8.9\",\n build_file = Label(\"@crates//crates:BUILD.libloading-0.8.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__libloading-0.9.0\",\n sha256 = \"754ca22de805bb5744484a5b151a9e1a8e837d5dc232c2d7d8c2e3492edc8b60\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/libloading/0.9.0/download\"],\n strip_prefix = \"libloading-0.9.0\",\n build_file = Label(\"@crates//crates:BUILD.libloading-0.9.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__libm-0.2.16\",\n sha256 = \"b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/libm/0.2.16/download\"],\n strip_prefix = \"libm-0.2.16\",\n build_file = Label(\"@crates//crates:BUILD.libm-0.2.16.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__libredox-0.1.18\",\n sha256 = \"c943259e342f1e06ff2da7a83eabdfe7f92ce10262688dbf1895ff0b3e6e4652\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/libredox/0.1.18/download\"],\n strip_prefix = \"libredox-0.1.18\",\n build_file = Label(\"@crates//crates:BUILD.libredox-0.1.18.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__libspa-0.9.2\",\n sha256 = \"b6b8cfa2a7656627b4c92c6b9ef929433acd673d5ab3708cda1b18478ac00df4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/libspa/0.9.2/download\"],\n strip_prefix = \"libspa-0.9.2\",\n build_file = Label(\"@crates//crates:BUILD.libspa-0.9.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__libspa-sys-0.9.2\",\n sha256 = \"901049455d2eb6decf9058235d745237952f4804bc584c5fcb41412e6adcc6e0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/libspa-sys/0.9.2/download\"],\n strip_prefix = \"libspa-sys-0.9.2\",\n build_file = Label(\"@crates//crates:BUILD.libspa-sys-0.9.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__libwayshot-xcap-0.3.3\",\n sha256 = \"ea8a46e4d016ef464e386e4970f5415fe0939c2d63abe0c2f539c05ef88c5fe5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/libwayshot-xcap/0.3.3/download\"],\n strip_prefix = \"libwayshot-xcap-0.3.3\",\n build_file = Label(\"@crates//crates:BUILD.libwayshot-xcap-0.3.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__linked-hash-map-0.5.6\",\n sha256 = \"0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/linked-hash-map/0.5.6/download\"],\n strip_prefix = \"linked-hash-map-0.5.6\",\n build_file = Label(\"@crates//crates:BUILD.linked-hash-map-0.5.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__linux-raw-sys-0.12.1\",\n sha256 = \"32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/linux-raw-sys/0.12.1/download\"],\n strip_prefix = \"linux-raw-sys-0.12.1\",\n build_file = Label(\"@crates//crates:BUILD.linux-raw-sys-0.12.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__linux-raw-sys-0.4.15\",\n sha256 = \"d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/linux-raw-sys/0.4.15/download\"],\n strip_prefix = \"linux-raw-sys-0.4.15\",\n build_file = Label(\"@crates//crates:BUILD.linux-raw-sys-0.4.15.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__linux-raw-sys-0.9.4\",\n sha256 = \"cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/linux-raw-sys/0.9.4/download\"],\n strip_prefix = \"linux-raw-sys-0.9.4\",\n build_file = Label(\"@crates//crates:BUILD.linux-raw-sys-0.9.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__litemap-0.8.2\",\n sha256 = \"92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/litemap/0.8.2/download\"],\n strip_prefix = \"litemap-0.8.2\",\n build_file = Label(\"@crates//crates:BUILD.litemap-0.8.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__lock_api-0.4.14\",\n sha256 = \"224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/lock_api/0.4.14/download\"],\n strip_prefix = \"lock_api-0.4.14\",\n build_file = Label(\"@crates//crates:BUILD.lock_api-0.4.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__log-0.4.33\",\n sha256 = \"0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/log/0.4.33/download\"],\n strip_prefix = \"log-0.4.33\",\n build_file = Label(\"@crates//crates:BUILD.log-0.4.33.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__lru-0.16.4\",\n sha256 = \"7f66e8d5d03f609abc3a39e6f08e4164ebf1447a732906d39eb9b99b7919ef39\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/lru/0.16.4/download\"],\n strip_prefix = \"lru-0.16.4\",\n build_file = Label(\"@crates//crates:BUILD.lru-0.16.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__lscolors-0.21.0\",\n sha256 = \"d60e266dfb1426eb2d24792602e041131fdc0236bb7007abc0e589acafd60929\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/lscolors/0.21.0/download\"],\n strip_prefix = \"lscolors-0.21.0\",\n build_file = Label(\"@crates//crates:BUILD.lscolors-0.21.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__markup5ever-0.39.0\",\n sha256 = \"7122d987ec5f704ee56f6e5b41a7d93722e9aae27ae07cafa4036c4d3f9757de\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/markup5ever/0.39.0/download\"],\n strip_prefix = \"markup5ever-0.39.0\",\n build_file = Label(\"@crates//crates:BUILD.markup5ever-0.39.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__maudio-0.1.6\",\n sha256 = \"c6ab2d47a7b24f4cf6ab85d335b4a6cc932f650080dfe0819b22bc553aada602\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/maudio/0.1.6/download\"],\n strip_prefix = \"maudio-0.1.6\",\n build_file = Label(\"@crates//crates:BUILD.maudio-0.1.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__maudio-sys-0.1.3\",\n patch_args = [\n \"-p1\",\n ],\n patches = [\n \"@@//bazel/patches:maudio-sys-target-bindings.patch\",\n ],\n sha256 = \"f00ae1969d0a389937161b834623e5cba2d8449752a0970d71382cf9a905bb35\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/maudio-sys/0.1.3/download\"],\n strip_prefix = \"maudio-sys-0.1.3\",\n build_file = Label(\"@crates//crates:BUILD.maudio-sys-0.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__md-5-0.10.6\",\n sha256 = \"d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/md-5/0.10.6/download\"],\n strip_prefix = \"md-5-0.10.6\",\n build_file = Label(\"@crates//crates:BUILD.md-5-0.10.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__memchr-2.8.3\",\n sha256 = \"cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/memchr/2.8.3/download\"],\n strip_prefix = \"memchr-2.8.3\",\n build_file = Label(\"@crates//crates:BUILD.memchr-2.8.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__memmap2-0.9.11\",\n sha256 = \"d1219ed1b7f229ee7104d281dd01d6802fe28bb6e95d292942c4daacdeb798c0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/memmap2/0.9.11/download\"],\n strip_prefix = \"memmap2-0.9.11\",\n build_file = Label(\"@crates//crates:BUILD.memmap2-0.9.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__memoffset-0.7.1\",\n sha256 = \"5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/memoffset/0.7.1/download\"],\n strip_prefix = \"memoffset-0.7.1\",\n build_file = Label(\"@crates//crates:BUILD.memoffset-0.7.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__memoffset-0.9.1\",\n sha256 = \"488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/memoffset/0.9.1/download\"],\n strip_prefix = \"memoffset-0.9.1\",\n build_file = Label(\"@crates//crates:BUILD.memoffset-0.9.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__minimal-lexical-0.2.1\",\n sha256 = \"68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/minimal-lexical/0.2.1/download\"],\n strip_prefix = \"minimal-lexical-0.2.1\",\n build_file = Label(\"@crates//crates:BUILD.minimal-lexical-0.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__miniz_oxide-0.8.9\",\n sha256 = \"1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/miniz_oxide/0.8.9/download\"],\n strip_prefix = \"miniz_oxide-0.8.9\",\n build_file = Label(\"@crates//crates:BUILD.miniz_oxide-0.8.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__mio-1.2.2\",\n sha256 = \"30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/mio/1.2.2/download\"],\n strip_prefix = \"mio-1.2.2\",\n build_file = Label(\"@crates//crates:BUILD.mio-1.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__moxcms-0.8.1\",\n sha256 = \"bb85c154ba489f01b25c0d36ae69a87e4a1c73a72631fc6c0eb6dde34a73e44b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/moxcms/0.8.1/download\"],\n strip_prefix = \"moxcms-0.8.1\",\n build_file = Label(\"@crates//crates:BUILD.moxcms-0.8.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__munge-0.4.7\",\n sha256 = \"5e17401f259eba956ca16491461b6e8f72913a0a114e39736ce404410f915a0c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/munge/0.4.7/download\"],\n strip_prefix = \"munge-0.4.7\",\n build_file = Label(\"@crates//crates:BUILD.munge-0.4.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__munge_macro-0.4.7\",\n sha256 = \"4568f25ccbd45ab5d5603dc34318c1ec56b117531781260002151b8530a9f931\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/munge_macro/0.4.7/download\"],\n strip_prefix = \"munge_macro-0.4.7\",\n build_file = Label(\"@crates//crates:BUILD.munge_macro-0.4.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__nanorand-0.7.0\",\n sha256 = \"6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/nanorand/0.7.0/download\"],\n strip_prefix = \"nanorand-0.7.0\",\n build_file = Label(\"@crates//crates:BUILD.nanorand-0.7.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__napi-3.11.0\",\n sha256 = \"de33522036981030a75c231829566bc63414e08101a6f5ff4ac6cef19c8e0941\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/napi/3.11.0/download\"],\n strip_prefix = \"napi-3.11.0\",\n build_file = Label(\"@crates//crates:BUILD.napi-3.11.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__napi-build-2.3.2\",\n sha256 = \"c9c366d2c8c60b86fa632df75f745509b52f9128f91a6bad4c796e44abb505e1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/napi-build/2.3.2/download\"],\n strip_prefix = \"napi-build-2.3.2\",\n build_file = Label(\"@crates//crates:BUILD.napi-build-2.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__napi-derive-3.6.0\",\n sha256 = \"a49c513341a61a16a10af6efcce46b30d0822ba2d4fb197d24d33dfc199c78d5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/napi-derive/3.6.0/download\"],\n strip_prefix = \"napi-derive-3.6.0\",\n build_file = Label(\"@crates//crates:BUILD.napi-derive-3.6.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__napi-derive-backend-6.0.0\",\n sha256 = \"4747005fa3e2c9989ac45a723a514c5db2411238b72981a3cda4c701a9dfea17\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/napi-derive-backend/6.0.0/download\"],\n strip_prefix = \"napi-derive-backend-6.0.0\",\n build_file = Label(\"@crates//crates:BUILD.napi-derive-backend-6.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__napi-sys-3.3.0\",\n sha256 = \"85fbf1fa9f1babfe396d74bbbf52b3643770243e8f5b0b46715d4caf7f0dfc9a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/napi-sys/3.3.0/download\"],\n strip_prefix = \"napi-sys-3.3.0\",\n build_file = Label(\"@crates//crates:BUILD.napi-sys-3.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__new_debug_unreachable-1.0.6\",\n sha256 = \"650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/new_debug_unreachable/1.0.6/download\"],\n strip_prefix = \"new_debug_unreachable-1.0.6\",\n build_file = Label(\"@crates//crates:BUILD.new_debug_unreachable-1.0.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__nix-0.24.3\",\n sha256 = \"fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/nix/0.24.3/download\"],\n strip_prefix = \"nix-0.24.3\",\n build_file = Label(\"@crates//crates:BUILD.nix-0.24.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__nix-0.26.4\",\n sha256 = \"598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/nix/0.26.4/download\"],\n strip_prefix = \"nix-0.26.4\",\n build_file = Label(\"@crates//crates:BUILD.nix-0.26.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__nix-0.28.0\",\n sha256 = \"ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/nix/0.28.0/download\"],\n strip_prefix = \"nix-0.28.0\",\n build_file = Label(\"@crates//crates:BUILD.nix-0.28.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__nix-0.29.0\",\n sha256 = \"71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/nix/0.29.0/download\"],\n strip_prefix = \"nix-0.29.0\",\n build_file = Label(\"@crates//crates:BUILD.nix-0.29.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__nix-0.30.1\",\n sha256 = \"74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/nix/0.30.1/download\"],\n strip_prefix = \"nix-0.30.1\",\n build_file = Label(\"@crates//crates:BUILD.nix-0.30.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__nix-0.31.3\",\n sha256 = \"cf20d2fde8ff38632c426f1165ed7436270b44f199fc55284c38276f9db47c3d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/nix/0.31.3/download\"],\n strip_prefix = \"nix-0.31.3\",\n build_file = Label(\"@crates//crates:BUILD.nix-0.31.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__nohash-hasher-0.2.0\",\n sha256 = \"2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/nohash-hasher/0.2.0/download\"],\n strip_prefix = \"nohash-hasher-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.nohash-hasher-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__nom-7.1.3\",\n sha256 = \"d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/nom/7.1.3/download\"],\n strip_prefix = \"nom-7.1.3\",\n build_file = Label(\"@crates//crates:BUILD.nom-7.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__nom-8.0.0\",\n sha256 = \"df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/nom/8.0.0/download\"],\n strip_prefix = \"nom-8.0.0\",\n build_file = Label(\"@crates//crates:BUILD.nom-8.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__normalize-path-0.2.1\",\n sha256 = \"f5438dd2b2ff4c6df6e1ce22d825ed2fa93ee2922235cc45186991717f0a892d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/normalize-path/0.2.1/download\"],\n strip_prefix = \"normalize-path-0.2.1\",\n build_file = Label(\"@crates//crates:BUILD.normalize-path-0.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__notify-8.2.0\",\n sha256 = \"4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/notify/8.2.0/download\"],\n strip_prefix = \"notify-8.2.0\",\n build_file = Label(\"@crates//crates:BUILD.notify-8.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__notify-types-2.1.0\",\n sha256 = \"42b8cfee0e339a0337359f3c88165702ac6e600dc01c0cc9579a92d62b08477a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/notify-types/2.1.0/download\"],\n strip_prefix = \"notify-types-2.1.0\",\n build_file = Label(\"@crates//crates:BUILD.notify-types-2.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__nu-ansi-term-0.50.3\",\n sha256 = \"7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/nu-ansi-term/0.50.3/download\"],\n strip_prefix = \"nu-ansi-term-0.50.3\",\n build_file = Label(\"@crates//crates:BUILD.nu-ansi-term-0.50.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-bigint-0.4.8\",\n sha256 = \"c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-bigint/0.4.8/download\"],\n strip_prefix = \"num-bigint-0.4.8\",\n build_file = Label(\"@crates//crates:BUILD.num-bigint-0.4.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-conv-0.2.2\",\n sha256 = \"521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-conv/0.2.2/download\"],\n strip_prefix = \"num-conv-0.2.2\",\n build_file = Label(\"@crates//crates:BUILD.num-conv-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-format-0.4.4\",\n sha256 = \"a652d9771a63711fd3c3deb670acfbe5c30a4072e664d7a3bf5a9e1056ac72c3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-format/0.4.4/download\"],\n strip_prefix = \"num-format-0.4.4\",\n build_file = Label(\"@crates//crates:BUILD.num-format-0.4.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-integer-0.1.46\",\n sha256 = \"7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-integer/0.1.46/download\"],\n strip_prefix = \"num-integer-0.1.46\",\n build_file = Label(\"@crates//crates:BUILD.num-integer-0.1.46.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-traits-0.2.19\",\n sha256 = \"071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-traits/0.2.19/download\"],\n strip_prefix = \"num-traits-0.2.19\",\n build_file = Label(\"@crates//crates:BUILD.num-traits-0.2.19.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__number_prefix-0.4.0\",\n sha256 = \"830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/number_prefix/0.4.0/download\"],\n strip_prefix = \"number_prefix-0.4.0\",\n build_file = Label(\"@crates//crates:BUILD.number_prefix-0.4.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-0.6.4\",\n sha256 = \"3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2/0.6.4/download\"],\n strip_prefix = \"objc2-0.6.4\",\n build_file = Label(\"@crates//crates:BUILD.objc2-0.6.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-app-kit-0.3.2\",\n sha256 = \"d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-app-kit/0.3.2/download\"],\n strip_prefix = \"objc2-app-kit-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-app-kit-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-av-foundation-0.3.2\",\n sha256 = \"478ae33fcac9df0a18db8302387c666b8ef08a3e2d62b510ca4fc278a384b6c0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-av-foundation/0.3.2/download\"],\n strip_prefix = \"objc2-av-foundation-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-av-foundation-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-avf-audio-0.3.2\",\n sha256 = \"13a380031deed8e99db00065c45937da434ca987c034e13b87e4441f9e4090be\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-avf-audio/0.3.2/download\"],\n strip_prefix = \"objc2-avf-audio-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-avf-audio-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-cloud-kit-0.3.2\",\n sha256 = \"73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-cloud-kit/0.3.2/download\"],\n strip_prefix = \"objc2-cloud-kit-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-cloud-kit-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-core-audio-0.3.2\",\n sha256 = \"e1eebcea8b0dbff5f7c8504f3107c68fc061a3eb44932051c8cf8a68d969c3b2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-core-audio/0.3.2/download\"],\n strip_prefix = \"objc2-core-audio-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-core-audio-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-core-audio-types-0.3.2\",\n sha256 = \"5a89f2ec274a0cf4a32642b2991e8b351a404d290da87bb6a9a9d8632490bd1c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-core-audio-types/0.3.2/download\"],\n strip_prefix = \"objc2-core-audio-types-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-core-audio-types-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-core-data-0.3.2\",\n sha256 = \"0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-core-data/0.3.2/download\"],\n strip_prefix = \"objc2-core-data-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-core-data-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-core-foundation-0.3.2\",\n sha256 = \"2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-core-foundation/0.3.2/download\"],\n strip_prefix = \"objc2-core-foundation-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-core-foundation-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-core-graphics-0.3.2\",\n sha256 = \"e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-core-graphics/0.3.2/download\"],\n strip_prefix = \"objc2-core-graphics-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-core-graphics-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-core-image-0.3.2\",\n sha256 = \"e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-core-image/0.3.2/download\"],\n strip_prefix = \"objc2-core-image-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-core-image-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-core-media-0.3.2\",\n sha256 = \"05ec576860167a15dd9fce7fbee7512beb4e31f532159d3482d1f9c6caedf31d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-core-media/0.3.2/download\"],\n strip_prefix = \"objc2-core-media-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-core-media-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-core-text-0.3.2\",\n sha256 = \"0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-core-text/0.3.2/download\"],\n strip_prefix = \"objc2-core-text-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-core-text-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-core-video-0.3.2\",\n sha256 = \"d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-core-video/0.3.2/download\"],\n strip_prefix = \"objc2-core-video-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-core-video-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-encode-4.1.0\",\n sha256 = \"ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-encode/4.1.0/download\"],\n strip_prefix = \"objc2-encode-4.1.0\",\n build_file = Label(\"@crates//crates:BUILD.objc2-encode-4.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-foundation-0.3.2\",\n sha256 = \"e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-foundation/0.3.2/download\"],\n strip_prefix = \"objc2-foundation-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-foundation-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-image-io-0.3.2\",\n sha256 = \"32b0446e98cf4a784cc7a0177715ff317eeaa8463841c616cfc78aa4f953c4ea\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-image-io/0.3.2/download\"],\n strip_prefix = \"objc2-image-io-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-image-io-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-io-surface-0.3.2\",\n sha256 = \"180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-io-surface/0.3.2/download\"],\n strip_prefix = \"objc2-io-surface-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-io-surface-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-media-toolbox-0.3.2\",\n sha256 = \"edd9fdde720df3da7046bb9097811000c1e7ab5cd579fa89d96b27d56781fb30\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-media-toolbox/0.3.2/download\"],\n strip_prefix = \"objc2-media-toolbox-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-media-toolbox-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-metal-0.3.2\",\n sha256 = \"a0125f776a10d00af4152d74616409f0d4a2053a6f57fa5b7d6aa2854ac04794\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-metal/0.3.2/download\"],\n strip_prefix = \"objc2-metal-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-metal-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-quartz-core-0.3.2\",\n sha256 = \"96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-quartz-core/0.3.2/download\"],\n strip_prefix = \"objc2-quartz-core-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-quartz-core-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-system-configuration-0.3.2\",\n sha256 = \"7216bd11cbda54ccabcab84d523dc93b858ec75ecfb3a7d89513fa22464da396\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-system-configuration/0.3.2/download\"],\n strip_prefix = \"objc2-system-configuration-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-system-configuration-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__oid-registry-0.7.1\",\n sha256 = \"a8d8034d9489cdaf79228eb9f6a3b8d7bb32ba00d6645ebd48eef4077ceb5bd9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/oid-registry/0.7.1/download\"],\n strip_prefix = \"oid-registry-0.7.1\",\n build_file = Label(\"@crates//crates:BUILD.oid-registry-0.7.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__once_cell-1.21.4\",\n sha256 = \"9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/once_cell/1.21.4/download\"],\n strip_prefix = \"once_cell-1.21.4\",\n build_file = Label(\"@crates//crates:BUILD.once_cell-1.21.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__once_cell_polyfill-1.70.2\",\n sha256 = \"384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/once_cell_polyfill/1.70.2/download\"],\n strip_prefix = \"once_cell_polyfill-1.70.2\",\n build_file = Label(\"@crates//crates:BUILD.once_cell_polyfill-1.70.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__onig-6.5.3\",\n sha256 = \"0cc3cbf698f9438986c11a880c90a6d04b9de27575afd28bbf45b154b6c709e2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/onig/6.5.3/download\"],\n strip_prefix = \"onig-6.5.3\",\n build_file = Label(\"@crates//crates:BUILD.onig-6.5.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__onig_sys-69.9.3\",\n sha256 = \"1e68317604e77e53b85896388e1a803c1d21b74c899ec9e5e1112db90735edd7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/onig_sys/69.9.3/download\"],\n strip_prefix = \"onig_sys-69.9.3\",\n build_file = Label(\"@crates//crates:BUILD.onig_sys-69.9.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__opaque-debug-0.3.1\",\n sha256 = \"c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/opaque-debug/0.3.1/download\"],\n strip_prefix = \"opaque-debug-0.3.1\",\n build_file = Label(\"@crates//crates:BUILD.opaque-debug-0.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__opus-0.3.1\",\n sha256 = \"4d3809943dff6fbad5f0484449ea26bdb9cb7d8efdf26ed50d3c7f227f69eb5c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/opus/0.3.1/download\"],\n strip_prefix = \"opus-0.3.1\",\n build_file = Label(\"@crates//crates:BUILD.opus-0.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ordered-float-5.3.0\",\n sha256 = \"b7d950ca161dc355eaf28f82b11345ed76c6e1f6eb1f4f4479e0323b9e2fbd0e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ordered-float/5.3.0/download\"],\n strip_prefix = \"ordered-float-5.3.0\",\n build_file = Label(\"@crates//crates:BUILD.ordered-float-5.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ordered-stream-0.2.0\",\n sha256 = \"9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ordered-stream/0.2.0/download\"],\n strip_prefix = \"ordered-stream-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.ordered-stream-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__os_display-0.1.4\",\n sha256 = \"ad5fd71b79026fb918650dde6d125000a233764f1c2f1659a1c71118e33ea08f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/os_display/0.1.4/download\"],\n strip_prefix = \"os_display-0.1.4\",\n build_file = Label(\"@crates//crates:BUILD.os_display-0.1.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__os_pipe-1.2.3\",\n sha256 = \"7d8fae84b431384b68627d0f9b3b1245fcf9f46f6c0e3dc902e9dce64edd1967\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/os_pipe/1.2.3/download\"],\n strip_prefix = \"os_pipe-1.2.3\",\n build_file = Label(\"@crates//crates:BUILD.os_pipe-1.2.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__outref-0.5.2\",\n sha256 = \"1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/outref/0.5.2/download\"],\n strip_prefix = \"outref-0.5.2\",\n build_file = Label(\"@crates//crates:BUILD.outref-0.5.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__p256-0.13.2\",\n sha256 = \"c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/p256/0.13.2/download\"],\n strip_prefix = \"p256-0.13.2\",\n build_file = Label(\"@crates//crates:BUILD.p256-0.13.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__p384-0.13.1\",\n sha256 = \"fe42f1670a52a47d448f14b6a5c61dd78fce51856e68edaa38f7ae3a46b8d6b6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/p384/0.13.1/download\"],\n strip_prefix = \"p384-0.13.1\",\n build_file = Label(\"@crates//crates:BUILD.p384-0.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__palette-0.7.6\",\n sha256 = \"4cbf71184cc5ecc2e4e1baccdb21026c20e5fc3dcf63028a086131b3ab00b6e6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/palette/0.7.6/download\"],\n strip_prefix = \"palette-0.7.6\",\n build_file = Label(\"@crates//crates:BUILD.palette-0.7.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__palette_derive-0.7.6\",\n sha256 = \"f5030daf005bface118c096f510ffb781fc28f9ab6a32ab224d8631be6851d30\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/palette_derive/0.7.6/download\"],\n strip_prefix = \"palette_derive-0.7.6\",\n build_file = Label(\"@crates//crates:BUILD.palette_derive-0.7.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__parking-2.2.1\",\n sha256 = \"f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/parking/2.2.1/download\"],\n strip_prefix = \"parking-2.2.1\",\n build_file = Label(\"@crates//crates:BUILD.parking-2.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__parking_lot-0.12.5\",\n sha256 = \"93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/parking_lot/0.12.5/download\"],\n strip_prefix = \"parking_lot-0.12.5\",\n build_file = Label(\"@crates//crates:BUILD.parking_lot-0.12.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__parking_lot_core-0.9.12\",\n sha256 = \"2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/parking_lot_core/0.9.12/download\"],\n strip_prefix = \"parking_lot_core-0.9.12\",\n build_file = Label(\"@crates//crates:BUILD.parking_lot_core-0.9.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__parse_datetime-0.14.0\",\n sha256 = \"413775a7eac2261d2211a79d10ef275e5b6f7b527eec42ad09adce2ffa92b6e5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/parse_datetime/0.14.0/download\"],\n strip_prefix = \"parse_datetime-0.14.0\",\n build_file = Label(\"@crates//crates:BUILD.parse_datetime-0.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pcre2-0.2.11\",\n sha256 = \"9e970b0fcce0c7ee6ef662744ff711f21ccd6f11b7cf03cd187a80e89797fc67\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pcre2/0.2.11/download\"],\n strip_prefix = \"pcre2-0.2.11\",\n build_file = Label(\"@crates//crates:BUILD.pcre2-0.2.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pcre2-sys-0.2.10\",\n sha256 = \"18b9073c1a2549bd409bf4a32c94d903bb1a09bf845bc306ae148897fa0760a4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pcre2-sys/0.2.10/download\"],\n strip_prefix = \"pcre2-sys-0.2.10\",\n build_file = Label(\"@crates//crates:BUILD.pcre2-sys-0.2.10.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__peg-0.8.6\",\n sha256 = \"0aad070be5b63aa72103f2fcdd70a83adbd5e90112ce5b574171ff1c65501773\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/peg/0.8.6/download\"],\n strip_prefix = \"peg-0.8.6\",\n build_file = Label(\"@crates//crates:BUILD.peg-0.8.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__peg-macros-0.8.6\",\n sha256 = \"ddd8ef6825cae95355031ae26a99b616a2a21f22ba2de0197c43dfb05acbe7ee\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/peg-macros/0.8.6/download\"],\n strip_prefix = \"peg-macros-0.8.6\",\n build_file = Label(\"@crates//crates:BUILD.peg-macros-0.8.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__peg-runtime-0.8.6\",\n sha256 = \"7011d97b484a5ebdc4b1fdb3b12d5e4bbbea56e9d22b688f2e79e04b65a7d8a6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/peg-runtime/0.8.6/download\"],\n strip_prefix = \"peg-runtime-0.8.6\",\n build_file = Label(\"@crates//crates:BUILD.peg-runtime-0.8.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pem-3.0.6\",\n sha256 = \"1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pem/3.0.6/download\"],\n strip_prefix = \"pem-3.0.6\",\n build_file = Label(\"@crates//crates:BUILD.pem-3.0.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pem-rfc7468-0.7.0\",\n sha256 = \"88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pem-rfc7468/0.7.0/download\"],\n strip_prefix = \"pem-rfc7468-0.7.0\",\n build_file = Label(\"@crates//crates:BUILD.pem-rfc7468-0.7.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__percent-encoding-2.3.2\",\n sha256 = \"9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/percent-encoding/2.3.2/download\"],\n strip_prefix = \"percent-encoding-2.3.2\",\n build_file = Label(\"@crates//crates:BUILD.percent-encoding-2.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pest-2.8.8\",\n sha256 = \"7df728be843c7070fab6ab7c328c4e9e9d78e23bf749c0669c86ee7ebfa050a2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pest/2.8.8/download\"],\n strip_prefix = \"pest-2.8.8\",\n build_file = Label(\"@crates//crates:BUILD.pest-2.8.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pest_derive-2.8.8\",\n sha256 = \"9e2dd6fc3b26b3462ee188aac870f5a41d398f1cd5e2408d16531bd71c9591fd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pest_derive/2.8.8/download\"],\n strip_prefix = \"pest_derive-2.8.8\",\n build_file = Label(\"@crates//crates:BUILD.pest_derive-2.8.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pest_generator-2.8.8\",\n sha256 = \"6a7a9205cfb6f596a9e8b689c0a15f9ceb7a1aafae7aaf788150ac65b29975b6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pest_generator/2.8.8/download\"],\n strip_prefix = \"pest_generator-2.8.8\",\n build_file = Label(\"@crates//crates:BUILD.pest_generator-2.8.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pest_meta-2.8.8\",\n sha256 = \"85abd351c0de1e8384fc791a0737111a350394937e92b956b743dac12429f57c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pest_meta/2.8.8/download\"],\n strip_prefix = \"pest_meta-2.8.8\",\n build_file = Label(\"@crates//crates:BUILD.pest_meta-2.8.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__petgraph-0.8.3\",\n sha256 = \"8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/petgraph/0.8.3/download\"],\n strip_prefix = \"petgraph-0.8.3\",\n build_file = Label(\"@crates//crates:BUILD.petgraph-0.8.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__phf-0.11.3\",\n sha256 = \"1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/phf/0.11.3/download\"],\n strip_prefix = \"phf-0.11.3\",\n build_file = Label(\"@crates//crates:BUILD.phf-0.11.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__phf-0.12.1\",\n sha256 = \"913273894cec178f401a31ec4b656318d95473527be05c0752cc41cdc32be8b7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/phf/0.12.1/download\"],\n strip_prefix = \"phf-0.12.1\",\n build_file = Label(\"@crates//crates:BUILD.phf-0.12.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__phf-0.13.1\",\n sha256 = \"c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/phf/0.13.1/download\"],\n strip_prefix = \"phf-0.13.1\",\n build_file = Label(\"@crates//crates:BUILD.phf-0.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__phf_codegen-0.11.3\",\n sha256 = \"aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/phf_codegen/0.11.3/download\"],\n strip_prefix = \"phf_codegen-0.11.3\",\n build_file = Label(\"@crates//crates:BUILD.phf_codegen-0.11.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__phf_codegen-0.13.1\",\n sha256 = \"49aa7f9d80421bca176ca8dbfebe668cc7a2684708594ec9f3c0db0805d5d6e1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/phf_codegen/0.13.1/download\"],\n strip_prefix = \"phf_codegen-0.13.1\",\n build_file = Label(\"@crates//crates:BUILD.phf_codegen-0.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__phf_generator-0.11.3\",\n sha256 = \"3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/phf_generator/0.11.3/download\"],\n strip_prefix = \"phf_generator-0.11.3\",\n build_file = Label(\"@crates//crates:BUILD.phf_generator-0.11.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__phf_generator-0.13.1\",\n sha256 = \"135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/phf_generator/0.13.1/download\"],\n strip_prefix = \"phf_generator-0.13.1\",\n build_file = Label(\"@crates//crates:BUILD.phf_generator-0.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__phf_macros-0.13.1\",\n sha256 = \"812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/phf_macros/0.13.1/download\"],\n strip_prefix = \"phf_macros-0.13.1\",\n build_file = Label(\"@crates//crates:BUILD.phf_macros-0.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__phf_shared-0.11.3\",\n sha256 = \"67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/phf_shared/0.11.3/download\"],\n strip_prefix = \"phf_shared-0.11.3\",\n build_file = Label(\"@crates//crates:BUILD.phf_shared-0.11.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__phf_shared-0.12.1\",\n sha256 = \"06005508882fb681fd97892ecff4b7fd0fee13ef1aa569f8695dae7ab9099981\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/phf_shared/0.12.1/download\"],\n strip_prefix = \"phf_shared-0.12.1\",\n build_file = Label(\"@crates//crates:BUILD.phf_shared-0.12.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__phf_shared-0.13.1\",\n sha256 = \"e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/phf_shared/0.13.1/download\"],\n strip_prefix = \"phf_shared-0.13.1\",\n build_file = Label(\"@crates//crates:BUILD.phf_shared-0.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pin-project-lite-0.2.17\",\n sha256 = \"a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pin-project-lite/0.2.17/download\"],\n strip_prefix = \"pin-project-lite-0.2.17\",\n build_file = Label(\"@crates//crates:BUILD.pin-project-lite-0.2.17.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pin-utils-0.1.0\",\n sha256 = \"8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pin-utils/0.1.0/download\"],\n strip_prefix = \"pin-utils-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.pin-utils-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__piper-0.2.5\",\n sha256 = \"c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/piper/0.2.5/download\"],\n strip_prefix = \"piper-0.2.5\",\n build_file = Label(\"@crates//crates:BUILD.piper-0.2.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pipewire-0.9.2\",\n sha256 = \"9688b89abf11d756499f7c6190711d6dbe5a3acdb30c8fbf001d6596d06a8d44\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pipewire/0.9.2/download\"],\n strip_prefix = \"pipewire-0.9.2\",\n build_file = Label(\"@crates//crates:BUILD.pipewire-0.9.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pipewire-sys-0.9.2\",\n sha256 = \"cb028afee0d6ca17020b090e3b8fa2d7de23305aef975c7e5192a5050246ea36\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pipewire-sys/0.9.2/download\"],\n strip_prefix = \"pipewire-sys-0.9.2\",\n build_file = Label(\"@crates//crates:BUILD.pipewire-sys-0.9.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pkcs8-0.10.2\",\n sha256 = \"f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pkcs8/0.10.2/download\"],\n strip_prefix = \"pkcs8-0.10.2\",\n build_file = Label(\"@crates//crates:BUILD.pkcs8-0.10.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pkg-config-0.3.33\",\n sha256 = \"19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pkg-config/0.3.33/download\"],\n strip_prefix = \"pkg-config-0.3.33\",\n build_file = Label(\"@crates//crates:BUILD.pkg-config-0.3.33.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__platform-info-2.1.0\",\n sha256 = \"9368d62437c8cbb7c31ee37fd8c08a7d390e09a3ff75698a674953f46705ffcb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/platform-info/2.1.0/download\"],\n strip_prefix = \"platform-info-2.1.0\",\n build_file = Label(\"@crates//crates:BUILD.platform-info-2.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__png-0.18.1\",\n sha256 = \"60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/png/0.18.1/download\"],\n strip_prefix = \"png-0.18.1\",\n build_file = Label(\"@crates//crates:BUILD.png-0.18.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__polling-3.11.0\",\n sha256 = \"5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/polling/3.11.0/download\"],\n strip_prefix = \"polling-3.11.0\",\n build_file = Label(\"@crates//crates:BUILD.polling-3.11.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__poly1305-0.8.0\",\n sha256 = \"8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/poly1305/0.8.0/download\"],\n strip_prefix = \"poly1305-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.poly1305-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__polyval-0.6.2\",\n sha256 = \"9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/polyval/0.6.2/download\"],\n strip_prefix = \"polyval-0.6.2\",\n build_file = Label(\"@crates//crates:BUILD.polyval-0.6.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__portable-atomic-1.14.0\",\n sha256 = \"3d20d5497ef88037a52ff98267d066e7f11fcc5e99bbfbd58a42336193aacec3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/portable-atomic/1.14.0/download\"],\n strip_prefix = \"portable-atomic-1.14.0\",\n build_file = Label(\"@crates//crates:BUILD.portable-atomic-1.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__portable-atomic-util-0.2.7\",\n sha256 = \"c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/portable-atomic-util/0.2.7/download\"],\n strip_prefix = \"portable-atomic-util-0.2.7\",\n build_file = Label(\"@crates//crates:BUILD.portable-atomic-util-0.2.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__portable-pty-0.9.0\",\n sha256 = \"b4a596a2b3d2752d94f51fac2d4a96737b8705dddd311a32b9af47211f08671e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/portable-pty/0.9.0/download\"],\n strip_prefix = \"portable-pty-0.9.0\",\n build_file = Label(\"@crates//crates:BUILD.portable-pty-0.9.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__potential_utf-0.1.5\",\n sha256 = \"0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/potential_utf/0.1.5/download\"],\n strip_prefix = \"potential_utf-0.1.5\",\n build_file = Label(\"@crates//crates:BUILD.potential_utf-0.1.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__powerfmt-0.2.0\",\n sha256 = \"439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/powerfmt/0.2.0/download\"],\n strip_prefix = \"powerfmt-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.powerfmt-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ppv-lite86-0.2.21\",\n sha256 = \"85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ppv-lite86/0.2.21/download\"],\n strip_prefix = \"ppv-lite86-0.2.21\",\n build_file = Label(\"@crates//crates:BUILD.ppv-lite86-0.2.21.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__precomputed-hash-0.1.1\",\n sha256 = \"925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/precomputed-hash/0.1.1/download\"],\n strip_prefix = \"precomputed-hash-0.1.1\",\n build_file = Label(\"@crates//crates:BUILD.precomputed-hash-0.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pretty_assertions-1.4.1\",\n sha256 = \"3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pretty_assertions/1.4.1/download\"],\n strip_prefix = \"pretty_assertions-1.4.1\",\n build_file = Label(\"@crates//crates:BUILD.pretty_assertions-1.4.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__prettyplease-0.2.37\",\n sha256 = \"479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/prettyplease/0.2.37/download\"],\n strip_prefix = \"prettyplease-0.2.37\",\n build_file = Label(\"@crates//crates:BUILD.prettyplease-0.2.37.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__primeorder-0.13.6\",\n sha256 = \"353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/primeorder/0.13.6/download\"],\n strip_prefix = \"primeorder-0.13.6\",\n build_file = Label(\"@crates//crates:BUILD.primeorder-0.13.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__proc-macro-crate-3.5.0\",\n sha256 = \"e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/proc-macro-crate/3.5.0/download\"],\n strip_prefix = \"proc-macro-crate-3.5.0\",\n build_file = Label(\"@crates//crates:BUILD.proc-macro-crate-3.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__proc-macro2-1.0.107\",\n sha256 = \"985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/proc-macro2/1.0.107/download\"],\n strip_prefix = \"proc-macro2-1.0.107\",\n build_file = Label(\"@crates//crates:BUILD.proc-macro2-1.0.107.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__procfs-0.18.0\",\n sha256 = \"25485360a54d6861439d60facef26de713b1e126bf015ec8f98239467a2b82f7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/procfs/0.18.0/download\"],\n strip_prefix = \"procfs-0.18.0\",\n build_file = Label(\"@crates//crates:BUILD.procfs-0.18.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__procfs-core-0.18.0\",\n sha256 = \"e6401bf7b6af22f78b563665d15a22e9aef27775b79b149a66ca022468a4e405\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/procfs-core/0.18.0/download\"],\n strip_prefix = \"procfs-core-0.18.0\",\n build_file = Label(\"@crates//crates:BUILD.procfs-core-0.18.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ptr_meta-0.3.1\",\n sha256 = \"0b9a0cf95a1196af61d4f1cbdab967179516d9a4a4312af1f31948f8f6224a79\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ptr_meta/0.3.1/download\"],\n strip_prefix = \"ptr_meta-0.3.1\",\n build_file = Label(\"@crates//crates:BUILD.ptr_meta-0.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ptr_meta_derive-0.3.1\",\n sha256 = \"7347867d0a7e1208d93b46767be83e2b8f978c3dad35f775ac8d8847551d6fe1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ptr_meta_derive/0.3.1/download\"],\n strip_prefix = \"ptr_meta_derive-0.3.1\",\n build_file = Label(\"@crates//crates:BUILD.ptr_meta_derive-0.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pxfm-0.1.30\",\n sha256 = \"d55d956fa96f5ec02be2e13af0e20391a5aa83d6a074e3ad368959d0fab299ea\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pxfm/0.1.30/download\"],\n strip_prefix = \"pxfm-0.1.30\",\n build_file = Label(\"@crates//crates:BUILD.pxfm-0.1.30.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__quantette-0.5.1\",\n sha256 = \"c98fecda8b16396ff9adac67644a523dd1778c42b58606a29df5c31ca925d174\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/quantette/0.5.1/download\"],\n strip_prefix = \"quantette-0.5.1\",\n build_file = Label(\"@crates//crates:BUILD.quantette-0.5.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__quick-error-2.0.1\",\n sha256 = \"a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/quick-error/2.0.1/download\"],\n strip_prefix = \"quick-error-2.0.1\",\n build_file = Label(\"@crates//crates:BUILD.quick-error-2.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__quick-xml-0.30.0\",\n sha256 = \"eff6510e86862b57b210fd8cbe8ed3f0d7d600b9c2863cd4549a2e033c66e956\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/quick-xml/0.30.0/download\"],\n strip_prefix = \"quick-xml-0.30.0\",\n build_file = Label(\"@crates//crates:BUILD.quick-xml-0.30.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__quick-xml-0.41.0\",\n sha256 = \"e660451e55124f798a69a5af3f49ccfbefbd41910eefd25caf2393e1f3473ec1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/quick-xml/0.41.0/download\"],\n strip_prefix = \"quick-xml-0.41.0\",\n build_file = Label(\"@crates//crates:BUILD.quick-xml-0.41.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__quote-1.0.47\",\n sha256 = \"1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/quote/1.0.47/download\"],\n strip_prefix = \"quote-1.0.47\",\n build_file = Label(\"@crates//crates:BUILD.quote-1.0.47.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__r-efi-5.3.0\",\n sha256 = \"69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/r-efi/5.3.0/download\"],\n strip_prefix = \"r-efi-5.3.0\",\n build_file = Label(\"@crates//crates:BUILD.r-efi-5.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__r-efi-6.0.0\",\n sha256 = \"f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/r-efi/6.0.0/download\"],\n strip_prefix = \"r-efi-6.0.0\",\n build_file = Label(\"@crates//crates:BUILD.r-efi-6.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__radium-0.7.0\",\n sha256 = \"dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/radium/0.7.0/download\"],\n strip_prefix = \"radium-0.7.0\",\n build_file = Label(\"@crates//crates:BUILD.radium-0.7.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rancor-0.1.2\",\n sha256 = \"daff8b7b3ccf5f7ba270b3e7a0a4d4c701c5797e38dec27c7e2c3dbb830fed1c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rancor/0.1.2/download\"],\n strip_prefix = \"rancor-0.1.2\",\n build_file = Label(\"@crates//crates:BUILD.rancor-0.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rand-0.10.2\",\n sha256 = \"c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rand/0.10.2/download\"],\n strip_prefix = \"rand-0.10.2\",\n build_file = Label(\"@crates//crates:BUILD.rand-0.10.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rand-0.8.7\",\n sha256 = \"22f6172bdec972074665ed81ed53b71da00bfc44b65a753cfde883ec4c702a1a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rand/0.8.7/download\"],\n strip_prefix = \"rand-0.8.7\",\n build_file = Label(\"@crates//crates:BUILD.rand-0.8.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rand-0.9.5\",\n sha256 = \"b9ef1d0d795eb7d84685bca4f72f3649f064e6641543d3a8c415898726a57b41\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rand/0.9.5/download\"],\n strip_prefix = \"rand-0.9.5\",\n build_file = Label(\"@crates//crates:BUILD.rand-0.9.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rand_chacha-0.9.0\",\n sha256 = \"d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rand_chacha/0.9.0/download\"],\n strip_prefix = \"rand_chacha-0.9.0\",\n build_file = Label(\"@crates//crates:BUILD.rand_chacha-0.9.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rand_core-0.10.1\",\n sha256 = \"63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rand_core/0.10.1/download\"],\n strip_prefix = \"rand_core-0.10.1\",\n build_file = Label(\"@crates//crates:BUILD.rand_core-0.10.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rand_core-0.6.4\",\n sha256 = \"ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rand_core/0.6.4/download\"],\n strip_prefix = \"rand_core-0.6.4\",\n build_file = Label(\"@crates//crates:BUILD.rand_core-0.6.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rand_core-0.9.5\",\n sha256 = \"76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rand_core/0.9.5/download\"],\n strip_prefix = \"rand_core-0.9.5\",\n build_file = Label(\"@crates//crates:BUILD.rand_core-0.9.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rand_xoshiro-0.7.0\",\n sha256 = \"f703f4665700daf5512dcca5f43afa6af89f09db47fb56be587f80636bda2d41\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rand_xoshiro/0.7.0/download\"],\n strip_prefix = \"rand_xoshiro-0.7.0\",\n build_file = Label(\"@crates//crates:BUILD.rand_xoshiro-0.7.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rayon-1.12.0\",\n sha256 = \"fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rayon/1.12.0/download\"],\n strip_prefix = \"rayon-1.12.0\",\n build_file = Label(\"@crates//crates:BUILD.rayon-1.12.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rayon-core-1.13.0\",\n sha256 = \"22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rayon-core/1.13.0/download\"],\n strip_prefix = \"rayon-core-1.13.0\",\n build_file = Label(\"@crates//crates:BUILD.rayon-core-1.13.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rcgen-0.13.2\",\n sha256 = \"75e669e5202259b5314d1ea5397316ad400819437857b90861765f24c4cf80a2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rcgen/0.13.2/download\"],\n strip_prefix = \"rcgen-0.13.2\",\n build_file = Label(\"@crates//crates:BUILD.rcgen-0.13.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__redox_syscall-0.5.18\",\n sha256 = \"ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/redox_syscall/0.5.18/download\"],\n strip_prefix = \"redox_syscall-0.5.18\",\n build_file = Label(\"@crates//crates:BUILD.redox_syscall-0.5.18.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ref-cast-1.0.26\",\n sha256 = \"216e8f773d7923bcba9ceb86a86c93cabb3903a11872fc3f138c49630e50b96d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ref-cast/1.0.26/download\"],\n strip_prefix = \"ref-cast-1.0.26\",\n build_file = Label(\"@crates//crates:BUILD.ref-cast-1.0.26.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ref-cast-impl-1.0.26\",\n sha256 = \"2c9283685feec7d69af75fb0e858d5e7378f33fe4fc699383b2916ab9273e03c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ref-cast-impl/1.0.26/download\"],\n strip_prefix = \"ref-cast-impl-1.0.26\",\n build_file = Label(\"@crates//crates:BUILD.ref-cast-impl-1.0.26.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__regex-1.13.1\",\n sha256 = \"f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/regex/1.13.1/download\"],\n strip_prefix = \"regex-1.13.1\",\n build_file = Label(\"@crates//crates:BUILD.regex-1.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__regex-automata-0.4.16\",\n sha256 = \"8fcfdb36bda0c880c5931cdc7a2bcdc8ba4556847b9d912bca70bc94708711ad\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/regex-automata/0.4.16/download\"],\n strip_prefix = \"regex-automata-0.4.16\",\n build_file = Label(\"@crates//crates:BUILD.regex-automata-0.4.16.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__regex-lite-0.1.9\",\n sha256 = \"cab834c73d247e67f4fae452806d17d3c7501756d98c8808d7c9c7aa7d18f973\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/regex-lite/0.1.9/download\"],\n strip_prefix = \"regex-lite-0.1.9\",\n build_file = Label(\"@crates//crates:BUILD.regex-lite-0.1.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__regex-syntax-0.8.11\",\n sha256 = \"d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/regex-syntax/0.8.11/download\"],\n strip_prefix = \"regex-syntax-0.8.11\",\n build_file = Label(\"@crates//crates:BUILD.regex-syntax-0.8.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__relative-path-1.9.3\",\n sha256 = \"ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/relative-path/1.9.3/download\"],\n strip_prefix = \"relative-path-1.9.3\",\n build_file = Label(\"@crates//crates:BUILD.relative-path-1.9.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rend-0.5.4\",\n sha256 = \"663ba70707f96e871406fe10d68128412e619b06d1d47cb91c3a4c6501176240\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rend/0.5.4/download\"],\n strip_prefix = \"rend-0.5.4\",\n build_file = Label(\"@crates//crates:BUILD.rend-0.5.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rfc6979-0.4.0\",\n sha256 = \"f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rfc6979/0.4.0/download\"],\n strip_prefix = \"rfc6979-0.4.0\",\n build_file = Label(\"@crates//crates:BUILD.rfc6979-0.4.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rgb-0.8.53\",\n sha256 = \"47b34b781b31e5d73e9fbc8689c70551fd1ade9a19e3e28cfec8580a79290cc4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rgb/0.8.53/download\"],\n strip_prefix = \"rgb-0.8.53\",\n build_file = Label(\"@crates//crates:BUILD.rgb-0.8.53.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ring-0.17.14\",\n sha256 = \"a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ring/0.17.14/download\"],\n strip_prefix = \"ring-0.17.14\",\n build_file = Label(\"@crates//crates:BUILD.ring-0.17.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rkyv-0.8.17\",\n sha256 = \"815cc8a37159a463064825246cadb07961e25cd9885908606f6d08a98d8f8874\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rkyv/0.8.17/download\"],\n strip_prefix = \"rkyv-0.8.17\",\n build_file = Label(\"@crates//crates:BUILD.rkyv-0.8.17.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rkyv_derive-0.8.17\",\n sha256 = \"c0ed1a78a1b19d184b0daa629dd9a024573173ec7d485b287cb369fb3607cc1c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rkyv_derive/0.8.17/download\"],\n strip_prefix = \"rkyv_derive-0.8.17\",\n build_file = Label(\"@crates//crates:BUILD.rkyv_derive-0.8.17.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rlimit-0.11.0\",\n sha256 = \"f35ee2729c56bb610f6dba436bf78135f728b7373bdffae2ec815b2d3eb98cc3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rlimit/0.11.0/download\"],\n strip_prefix = \"rlimit-0.11.0\",\n build_file = Label(\"@crates//crates:BUILD.rlimit-0.11.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rpds-1.2.1\",\n sha256 = \"e025feb26210bc196b908e72deb063b1b4000754304341cbc168a1e72c857ebc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rpds/1.2.1/download\"],\n strip_prefix = \"rpds-1.2.1\",\n build_file = Label(\"@crates//crates:BUILD.rpds-1.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rstest-0.26.1\",\n sha256 = \"f5a3193c063baaa2a95a33f03035c8a72b83d97a54916055ba22d35ed3839d49\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rstest/0.26.1/download\"],\n strip_prefix = \"rstest-0.26.1\",\n build_file = Label(\"@crates//crates:BUILD.rstest-0.26.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rstest_macros-0.26.1\",\n sha256 = \"9c845311f0ff7951c5506121a9ad75aec44d083c31583b2ea5a30bcb0b0abba0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rstest_macros/0.26.1/download\"],\n strip_prefix = \"rstest_macros-0.26.1\",\n build_file = Label(\"@crates//crates:BUILD.rstest_macros-0.26.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rtcp-0.17.2\",\n sha256 = \"adad7f6a501162881032fc84b4bc78ae11f1b30748180b9f5cbe8810bf613aab\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rtcp/0.17.2/download\"],\n strip_prefix = \"rtcp-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.rtcp-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rtp-0.17.2\",\n sha256 = \"149329e78ada26b5e174a4c281a7a7e5c8bda6008adc90daddd6f98fce56db29\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rtp/0.17.2/download\"],\n strip_prefix = \"rtp-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.rtp-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustc-hash-1.1.0\",\n sha256 = \"08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustc-hash/1.1.0/download\"],\n strip_prefix = \"rustc-hash-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.rustc-hash-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustc-hash-2.1.3\",\n sha256 = \"6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustc-hash/2.1.3/download\"],\n strip_prefix = \"rustc-hash-2.1.3\",\n build_file = Label(\"@crates//crates:BUILD.rustc-hash-2.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustc_version-0.4.1\",\n sha256 = \"cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustc_version/0.4.1/download\"],\n strip_prefix = \"rustc_version-0.4.1\",\n build_file = Label(\"@crates//crates:BUILD.rustc_version-0.4.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rusticata-macros-4.1.0\",\n sha256 = \"faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rusticata-macros/4.1.0/download\"],\n strip_prefix = \"rusticata-macros-4.1.0\",\n build_file = Label(\"@crates//crates:BUILD.rusticata-macros-4.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustix-0.38.44\",\n sha256 = \"fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustix/0.38.44/download\"],\n strip_prefix = \"rustix-0.38.44\",\n build_file = Label(\"@crates//crates:BUILD.rustix-0.38.44.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustix-1.1.4\",\n sha256 = \"b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustix/1.1.4/download\"],\n strip_prefix = \"rustix-1.1.4\",\n build_file = Label(\"@crates//crates:BUILD.rustix-1.1.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustls-0.23.42\",\n sha256 = \"3c54fcab019b409d04215d3a17cb438fd7fbf192ee61461f20f4fe18704bc138\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustls/0.23.42/download\"],\n strip_prefix = \"rustls-0.23.42\",\n build_file = Label(\"@crates//crates:BUILD.rustls-0.23.42.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustls-pki-types-1.15.1\",\n sha256 = \"2f4925028c7eb5d1fcdaf196971378ed9d2c1c4efc7dc5d011256f76c99c0a96\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustls-pki-types/1.15.1/download\"],\n strip_prefix = \"rustls-pki-types-1.15.1\",\n build_file = Label(\"@crates//crates:BUILD.rustls-pki-types-1.15.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustls-webpki-0.103.13\",\n sha256 = \"61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustls-webpki/0.103.13/download\"],\n strip_prefix = \"rustls-webpki-0.103.13\",\n build_file = Label(\"@crates//crates:BUILD.rustls-webpki-0.103.13.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustversion-1.0.23\",\n sha256 = \"cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustversion/1.0.23/download\"],\n strip_prefix = \"rustversion-1.0.23\",\n build_file = Label(\"@crates//crates:BUILD.rustversion-1.0.23.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__safe_arch-0.9.3\",\n sha256 = \"629516c85c29fe757770fa03f2074cf1eac43d44c02a3de9fc2ef7b0e207dfdd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/safe_arch/0.9.3/download\"],\n strip_prefix = \"safe_arch-0.9.3\",\n build_file = Label(\"@crates//crates:BUILD.safe_arch-0.9.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__same-file-1.0.6\",\n sha256 = \"93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/same-file/1.0.6/download\"],\n strip_prefix = \"same-file-1.0.6\",\n build_file = Label(\"@crates//crates:BUILD.same-file-1.0.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__scoped-tls-1.0.1\",\n sha256 = \"e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/scoped-tls/1.0.1/download\"],\n strip_prefix = \"scoped-tls-1.0.1\",\n build_file = Label(\"@crates//crates:BUILD.scoped-tls-1.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__scopeguard-1.2.0\",\n sha256 = \"94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/scopeguard/1.2.0/download\"],\n strip_prefix = \"scopeguard-1.2.0\",\n build_file = Label(\"@crates//crates:BUILD.scopeguard-1.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__sdp-0.17.2\",\n sha256 = \"66b6eecfa5151edef84d544ff3885dff98e5b5fe97586757a4b5118bde51c958\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/sdp/0.17.2/download\"],\n strip_prefix = \"sdp-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.sdp-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__sec1-0.7.3\",\n sha256 = \"d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/sec1/0.7.3/download\"],\n strip_prefix = \"sec1-0.7.3\",\n build_file = Label(\"@crates//crates:BUILD.sec1-0.7.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__self_cell-1.3.0\",\n sha256 = \"2ab42ca02749e120097e328d91d415325bdf43b1c72c4c8badf37375fe40a813\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/self_cell/1.3.0/download\"],\n strip_prefix = \"self_cell-1.3.0\",\n build_file = Label(\"@crates//crates:BUILD.self_cell-1.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__semver-1.0.28\",\n sha256 = \"8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/semver/1.0.28/download\"],\n strip_prefix = \"semver-1.0.28\",\n build_file = Label(\"@crates//crates:BUILD.semver-1.0.28.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde-1.0.229\",\n sha256 = \"4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde/1.0.229/download\"],\n strip_prefix = \"serde-1.0.229\",\n build_file = Label(\"@crates//crates:BUILD.serde-1.0.229.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_core-1.0.229\",\n sha256 = \"67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_core/1.0.229/download\"],\n strip_prefix = \"serde_core-1.0.229\",\n build_file = Label(\"@crates//crates:BUILD.serde_core-1.0.229.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_derive-1.0.229\",\n sha256 = \"e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_derive/1.0.229/download\"],\n strip_prefix = \"serde_derive-1.0.229\",\n build_file = Label(\"@crates//crates:BUILD.serde_derive-1.0.229.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_json-1.0.151\",\n sha256 = \"c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_json/1.0.151/download\"],\n strip_prefix = \"serde_json-1.0.151\",\n build_file = Label(\"@crates//crates:BUILD.serde_json-1.0.151.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_repr-0.1.21\",\n sha256 = \"8d3b1629de253c70a0508c3899572da79ca359fdab27c7920ff00406df418906\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_repr/0.1.21/download\"],\n strip_prefix = \"serde_repr-0.1.21\",\n build_file = Label(\"@crates//crates:BUILD.serde_repr-0.1.21.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_spanned-1.1.1\",\n sha256 = \"6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_spanned/1.1.1/download\"],\n strip_prefix = \"serde_spanned-1.1.1\",\n build_file = Label(\"@crates//crates:BUILD.serde_spanned-1.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serial2-0.2.37\",\n sha256 = \"9eb6ea5562eeaed6936b8b54e086aa0f88b9e5b1bef45beb038e2519fa1185b1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serial2/0.2.37/download\"],\n strip_prefix = \"serial2-0.2.37\",\n build_file = Label(\"@crates//crates:BUILD.serial2-0.2.37.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__sha1-0.10.7\",\n sha256 = \"a978451301f4db1d02937a4ab3ccce137717b81826e79b7d49ffe3244a13c3b8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/sha1/0.10.7/download\"],\n strip_prefix = \"sha1-0.10.7\",\n build_file = Label(\"@crates//crates:BUILD.sha1-0.10.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__sha2-0.10.9\",\n sha256 = \"a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/sha2/0.10.9/download\"],\n strip_prefix = \"sha2-0.10.9\",\n build_file = Label(\"@crates//crates:BUILD.sha2-0.10.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__sha3-0.10.9\",\n sha256 = \"77fd7028345d415a4034cf8777cd4f8ab1851274233b45f84e3d955502d93874\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/sha3/0.10.9/download\"],\n strip_prefix = \"sha3-0.10.9\",\n build_file = Label(\"@crates//crates:BUILD.sha3-0.10.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__shared_library-0.1.9\",\n sha256 = \"5a9e7e0f2bfae24d8a5b5a66c5b257a83c7412304311512a0c054cd5e619da11\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/shared_library/0.1.9/download\"],\n strip_prefix = \"shared_library-0.1.9\",\n build_file = Label(\"@crates//crates:BUILD.shared_library-0.1.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__shell-words-1.1.1\",\n sha256 = \"dc6fe69c597f9c37bfeeeeeb33da3530379845f10be461a66d16d03eca2ded77\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/shell-words/1.1.1/download\"],\n strip_prefix = \"shell-words-1.1.1\",\n build_file = Label(\"@crates//crates:BUILD.shell-words-1.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__shlex-1.3.0\",\n sha256 = \"0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/shlex/1.3.0/download\"],\n strip_prefix = \"shlex-1.3.0\",\n build_file = Label(\"@crates//crates:BUILD.shlex-1.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__shlex-2.0.1\",\n sha256 = \"f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/shlex/2.0.1/download\"],\n strip_prefix = \"shlex-2.0.1\",\n build_file = Label(\"@crates//crates:BUILD.shlex-2.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__signal-hook-registry-1.4.8\",\n sha256 = \"c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/signal-hook-registry/1.4.8/download\"],\n strip_prefix = \"signal-hook-registry-1.4.8\",\n build_file = Label(\"@crates//crates:BUILD.signal-hook-registry-1.4.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__signature-2.2.0\",\n sha256 = \"77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/signature/2.2.0/download\"],\n strip_prefix = \"signature-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.signature-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__simd-adler32-0.3.10\",\n sha256 = \"3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/simd-adler32/0.3.10/download\"],\n strip_prefix = \"simd-adler32-0.3.10\",\n build_file = Label(\"@crates//crates:BUILD.simd-adler32-0.3.10.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__simdutf8-0.1.5\",\n sha256 = \"e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/simdutf8/0.1.5/download\"],\n strip_prefix = \"simdutf8-0.1.5\",\n build_file = Label(\"@crates//crates:BUILD.simdutf8-0.1.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__similar-2.7.0\",\n sha256 = \"bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/similar/2.7.0/download\"],\n strip_prefix = \"similar-2.7.0\",\n build_file = Label(\"@crates//crates:BUILD.similar-2.7.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__similar-3.1.1\",\n sha256 = \"e6505efef05804732ed8a3f2d4f279429eb485bd69d5b0cc6b19cc02005cda16\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/similar/3.1.1/download\"],\n strip_prefix = \"similar-3.1.1\",\n build_file = Label(\"@crates//crates:BUILD.similar-3.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__siphasher-1.0.3\",\n sha256 = \"8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/siphasher/1.0.3/download\"],\n strip_prefix = \"siphasher-1.0.3\",\n build_file = Label(\"@crates//crates:BUILD.siphasher-1.0.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__slab-0.4.12\",\n sha256 = \"0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/slab/0.4.12/download\"],\n strip_prefix = \"slab-0.4.12\",\n build_file = Label(\"@crates//crates:BUILD.slab-0.4.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__sm3-0.5.0\",\n sha256 = \"da6a89ba31723d185fd7413b98c576a575f356d9b84729d8ecb6ead60000a5b6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/sm3/0.5.0/download\"],\n strip_prefix = \"sm3-0.5.0\",\n build_file = Label(\"@crates//crates:BUILD.sm3-0.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__smallvec-1.15.2\",\n sha256 = \"8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/smallvec/1.15.2/download\"],\n strip_prefix = \"smallvec-1.15.2\",\n build_file = Label(\"@crates//crates:BUILD.smallvec-1.15.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__smol_str-0.2.2\",\n sha256 = \"dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/smol_str/0.2.2/download\"],\n strip_prefix = \"smol_str-0.2.2\",\n build_file = Label(\"@crates//crates:BUILD.smol_str-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__socket2-0.5.10\",\n sha256 = \"e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/socket2/0.5.10/download\"],\n strip_prefix = \"socket2-0.5.10\",\n build_file = Label(\"@crates//crates:BUILD.socket2-0.5.10.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__socket2-0.6.5\",\n sha256 = \"c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/socket2/0.6.5/download\"],\n strip_prefix = \"socket2-0.6.5\",\n build_file = Label(\"@crates//crates:BUILD.socket2-0.6.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__spin-0.10.1\",\n sha256 = \"023a211cb3138dbc438680b32560ad89f699977624c9f8dbb95a47d5b4c07dd3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/spin/0.10.1/download\"],\n strip_prefix = \"spin-0.10.1\",\n build_file = Label(\"@crates//crates:BUILD.spin-0.10.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__spin-0.9.9\",\n sha256 = \"3763264f6b73151db08c50ff20d7d8a0b8796e021cdea7ceedad07b80155fa0e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/spin/0.9.9/download\"],\n strip_prefix = \"spin-0.9.9\",\n build_file = Label(\"@crates//crates:BUILD.spin-0.9.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__spki-0.7.3\",\n sha256 = \"d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/spki/0.7.3/download\"],\n strip_prefix = \"spki-0.7.3\",\n build_file = Label(\"@crates//crates:BUILD.spki-0.7.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__stable_deref_trait-1.2.1\",\n sha256 = \"6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/stable_deref_trait/1.2.1/download\"],\n strip_prefix = \"stable_deref_trait-1.2.1\",\n build_file = Label(\"@crates//crates:BUILD.stable_deref_trait-1.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__str_stack-0.1.1\",\n sha256 = \"7f446288b699d66d0fd2e30d1cfe7869194312524b3b9252594868ed26ef056a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/str_stack/0.1.1/download\"],\n strip_prefix = \"str_stack-0.1.1\",\n build_file = Label(\"@crates//crates:BUILD.str_stack-0.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__streaming-iterator-0.1.9\",\n sha256 = \"2b2231b7c3057d5e4ad0156fb3dc807d900806020c5ffa3ee6ff2c8c76fb8520\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/streaming-iterator/0.1.9/download\"],\n strip_prefix = \"streaming-iterator-0.1.9\",\n build_file = Label(\"@crates//crates:BUILD.streaming-iterator-0.1.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__string_cache-0.9.0\",\n sha256 = \"a18596f8c785a729f2819c0f6a7eae6ebeebdfffbfe4214ae6b087f690e31901\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/string_cache/0.9.0/download\"],\n strip_prefix = \"string_cache-0.9.0\",\n build_file = Label(\"@crates//crates:BUILD.string_cache-0.9.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__string_cache_codegen-0.6.1\",\n sha256 = \"585635e46db231059f76c5849798146164652513eb9e8ab2685939dd90f29b69\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/string_cache_codegen/0.6.1/download\"],\n strip_prefix = \"string_cache_codegen-0.6.1\",\n build_file = Label(\"@crates//crates:BUILD.string_cache_codegen-0.6.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__strsim-0.11.1\",\n sha256 = \"7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/strsim/0.11.1/download\"],\n strip_prefix = \"strsim-0.11.1\",\n build_file = Label(\"@crates//crates:BUILD.strsim-0.11.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__strum-0.28.0\",\n sha256 = \"9628de9b8791db39ceda2b119bbe13134770b56c138ec1d3af810d045c04f9bd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/strum/0.28.0/download\"],\n strip_prefix = \"strum-0.28.0\",\n build_file = Label(\"@crates//crates:BUILD.strum-0.28.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__strum_macros-0.28.0\",\n sha256 = \"ab85eea0270ee17587ed4156089e10b9e6880ee688791d45a905f5b1ca36f664\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/strum_macros/0.28.0/download\"],\n strip_prefix = \"strum_macros-0.28.0\",\n build_file = Label(\"@crates//crates:BUILD.strum_macros-0.28.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__stun-0.17.2\",\n sha256 = \"2e3b8d5ad1dd4c8cd0595440f26521a71dd593cb5873ee8e06b91510b7d97269\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/stun/0.17.2/download\"],\n strip_prefix = \"stun-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.stun-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__substring-1.4.5\",\n sha256 = \"42ee6433ecef213b2e72f587ef64a2f5943e7cd16fbd82dbe8bc07486c534c86\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/substring/1.4.5/download\"],\n strip_prefix = \"substring-1.4.5\",\n build_file = Label(\"@crates//crates:BUILD.substring-1.4.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__subtle-2.6.1\",\n sha256 = \"13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/subtle/2.6.1/download\"],\n strip_prefix = \"subtle-2.6.1\",\n build_file = Label(\"@crates//crates:BUILD.subtle-2.6.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__syn-2.0.119\",\n sha256 = \"872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/syn/2.0.119/download\"],\n strip_prefix = \"syn-2.0.119\",\n build_file = Label(\"@crates//crates:BUILD.syn-2.0.119.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__syn-3.0.3\",\n sha256 = \"53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/syn/3.0.3/download\"],\n strip_prefix = \"syn-3.0.3\",\n build_file = Label(\"@crates//crates:BUILD.syn-3.0.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__synstructure-0.13.2\",\n sha256 = \"728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/synstructure/0.13.2/download\"],\n strip_prefix = \"synstructure-0.13.2\",\n build_file = Label(\"@crates//crates:BUILD.synstructure-0.13.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__syntect-5.3.0\",\n sha256 = \"656b45c05d95a5704399aeef6bd0ddec7b2b3531b7c9e900abbf7c4d2190c925\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/syntect/5.3.0/download\"],\n strip_prefix = \"syntect-5.3.0\",\n build_file = Label(\"@crates//crates:BUILD.syntect-5.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__system-deps-7.0.8\",\n sha256 = \"396a35feb67335377e0251fcbc1092fc85c484bd4e3a7a54319399da127796e7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/system-deps/7.0.8/download\"],\n strip_prefix = \"system-deps-7.0.8\",\n build_file = Label(\"@crates//crates:BUILD.system-deps-7.0.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tap-1.0.1\",\n sha256 = \"55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tap/1.0.1/download\"],\n strip_prefix = \"tap-1.0.1\",\n build_file = Label(\"@crates//crates:BUILD.tap-1.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__target-lexicon-0.13.5\",\n sha256 = \"adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/target-lexicon/0.13.5/download\"],\n strip_prefix = \"target-lexicon-0.13.5\",\n build_file = Label(\"@crates//crates:BUILD.target-lexicon-0.13.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tempfile-3.27.0\",\n sha256 = \"32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tempfile/3.27.0/download\"],\n strip_prefix = \"tempfile-3.27.0\",\n build_file = Label(\"@crates//crates:BUILD.tempfile-3.27.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tendril-0.5.1\",\n sha256 = \"5fed54709c5b3a53d09bb1c113ea4f5ceafd1e772ddcb0030a82e1d56c087b08\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tendril/0.5.1/download\"],\n strip_prefix = \"tendril-0.5.1\",\n build_file = Label(\"@crates//crates:BUILD.tendril-0.5.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__termcolor-1.4.1\",\n sha256 = \"06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/termcolor/1.4.1/download\"],\n strip_prefix = \"termcolor-1.4.1\",\n build_file = Label(\"@crates//crates:BUILD.termcolor-1.4.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__terminal_size-0.4.4\",\n sha256 = \"230a1b821ccbd75b185820a1f1ff7b14d21da1e442e22c0863ea5f08771a8874\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/terminal_size/0.4.4/download\"],\n strip_prefix = \"terminal_size-0.4.4\",\n build_file = Label(\"@crates//crates:BUILD.terminal_size-0.4.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__terminfo-0.9.0\",\n sha256 = \"d4ea810f0692f9f51b382fff5893887bb4580f5fa246fde546e0b13e7fcee662\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/terminfo/0.9.0/download\"],\n strip_prefix = \"terminfo-0.9.0\",\n build_file = Label(\"@crates//crates:BUILD.terminfo-0.9.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__thiserror-1.0.69\",\n sha256 = \"b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/thiserror/1.0.69/download\"],\n strip_prefix = \"thiserror-1.0.69\",\n build_file = Label(\"@crates//crates:BUILD.thiserror-1.0.69.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__thiserror-2.0.19\",\n sha256 = \"09a43598840e33d5b0331f38c5e30d13bb11c11210a4b58f0d9b18a5a5eefcd9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/thiserror/2.0.19/download\"],\n strip_prefix = \"thiserror-2.0.19\",\n build_file = Label(\"@crates//crates:BUILD.thiserror-2.0.19.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__thiserror-impl-1.0.69\",\n sha256 = \"4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/thiserror-impl/1.0.69/download\"],\n strip_prefix = \"thiserror-impl-1.0.69\",\n build_file = Label(\"@crates//crates:BUILD.thiserror-impl-1.0.69.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__thiserror-impl-2.0.19\",\n sha256 = \"43cbfe0cf76104d42a574802844187e84a305e531ed54455f11fbde0f10541cd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/thiserror-impl/2.0.19/download\"],\n strip_prefix = \"thiserror-impl-2.0.19\",\n build_file = Label(\"@crates//crates:BUILD.thiserror-impl-2.0.19.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tiff-0.11.3\",\n sha256 = \"b63feaf3343d35b6ca4d50483f94843803b0f51634937cc2ec519fc32232bc52\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tiff/0.11.3/download\"],\n strip_prefix = \"tiff-0.11.3\",\n build_file = Label(\"@crates//crates:BUILD.tiff-0.11.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tiktoken-rs-0.11.0\",\n sha256 = \"fac4a168cfc1d8ed65bf17a6ee0843ad9a68f863c63c0fb2fa7eab67838782ee\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tiktoken-rs/0.11.0/download\"],\n strip_prefix = \"tiktoken-rs-0.11.0\",\n build_file = Label(\"@crates//crates:BUILD.tiktoken-rs-0.11.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__time-0.3.54\",\n sha256 = \"3e1d5e639ff6bab73cb6885cc7e7b1de96c3f32c68ec55f3952614bec1092244\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/time/0.3.54/download\"],\n strip_prefix = \"time-0.3.54\",\n build_file = Label(\"@crates//crates:BUILD.time-0.3.54.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__time-core-0.1.9\",\n sha256 = \"9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/time-core/0.1.9/download\"],\n strip_prefix = \"time-core-0.1.9\",\n build_file = Label(\"@crates//crates:BUILD.time-core-0.1.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__time-macros-0.2.32\",\n sha256 = \"7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/time-macros/0.2.32/download\"],\n strip_prefix = \"time-macros-0.2.32\",\n build_file = Label(\"@crates//crates:BUILD.time-macros-0.2.32.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tiny-keccak-2.0.2\",\n sha256 = \"2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tiny-keccak/2.0.2/download\"],\n strip_prefix = \"tiny-keccak-2.0.2\",\n build_file = Label(\"@crates//crates:BUILD.tiny-keccak-2.0.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tinystr-0.8.3\",\n sha256 = \"c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tinystr/0.8.3/download\"],\n strip_prefix = \"tinystr-0.8.3\",\n build_file = Label(\"@crates//crates:BUILD.tinystr-0.8.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tinyvec-1.12.0\",\n sha256 = \"bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tinyvec/1.12.0/download\"],\n strip_prefix = \"tinyvec-1.12.0\",\n build_file = Label(\"@crates//crates:BUILD.tinyvec-1.12.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tinyvec_macros-0.1.1\",\n sha256 = \"1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tinyvec_macros/0.1.1/download\"],\n strip_prefix = \"tinyvec_macros-0.1.1\",\n build_file = Label(\"@crates//crates:BUILD.tinyvec_macros-0.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tokio-1.53.1\",\n sha256 = \"202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tokio/1.53.1/download\"],\n strip_prefix = \"tokio-1.53.1\",\n build_file = Label(\"@crates//crates:BUILD.tokio-1.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tokio-macros-2.7.1\",\n sha256 = \"6328af13490e73a9b4694030fafd93f8c8c6a9dede33e821c3fc63eddf8042ba\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tokio-macros/2.7.1/download\"],\n strip_prefix = \"tokio-macros-2.7.1\",\n build_file = Label(\"@crates//crates:BUILD.tokio-macros-2.7.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tokio-util-0.7.19\",\n sha256 = \"494815d09bf52b5548659851081238f0ca39ff638363907596da739561c62c52\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tokio-util/0.7.19/download\"],\n strip_prefix = \"tokio-util-0.7.19\",\n build_file = Label(\"@crates//crates:BUILD.tokio-util-0.7.19.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__toml-1.1.3-spec-1.1.0\",\n sha256 = \"53c96ecdfa941c8fc4fcaed14f99ada8ebed502eef533015095a07e3301d4c3c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/toml/1.1.3+spec-1.1.0/download\"],\n strip_prefix = \"toml-1.1.3+spec-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.toml-1.1.3+spec-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__toml_datetime-1.1.1-spec-1.1.0\",\n sha256 = \"3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/toml_datetime/1.1.1+spec-1.1.0/download\"],\n strip_prefix = \"toml_datetime-1.1.1+spec-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.toml_datetime-1.1.1+spec-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__toml_edit-0.25.13-spec-1.1.0\",\n sha256 = \"6975367e4d2ef766d86af01ffad14b622fecc8d4357a998fbc4deb6e9bacaf9b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/toml_edit/0.25.13+spec-1.1.0/download\"],\n strip_prefix = \"toml_edit-0.25.13+spec-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.toml_edit-0.25.13+spec-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__toml_parser-1.1.3-spec-1.1.0\",\n sha256 = \"1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/toml_parser/1.1.3+spec-1.1.0/download\"],\n strip_prefix = \"toml_parser-1.1.3+spec-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.toml_parser-1.1.3+spec-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__toml_writer-1.1.2-spec-1.1.0\",\n sha256 = \"7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/toml_writer/1.1.2+spec-1.1.0/download\"],\n strip_prefix = \"toml_writer-1.1.2+spec-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.toml_writer-1.1.2+spec-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tracing-0.1.44\",\n sha256 = \"63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tracing/0.1.44/download\"],\n strip_prefix = \"tracing-0.1.44\",\n build_file = Label(\"@crates//crates:BUILD.tracing-0.1.44.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tracing-attributes-0.1.31\",\n sha256 = \"7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tracing-attributes/0.1.31/download\"],\n strip_prefix = \"tracing-attributes-0.1.31\",\n build_file = Label(\"@crates//crates:BUILD.tracing-attributes-0.1.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tracing-core-0.1.36\",\n sha256 = \"db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tracing-core/0.1.36/download\"],\n strip_prefix = \"tracing-core-0.1.36\",\n build_file = Label(\"@crates//crates:BUILD.tracing-core-0.1.36.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-0.25.10\",\n sha256 = \"78f873475d258561b06f1c595d93308a7ed124d9977cb26b148c2084a4a3cc87\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter/0.25.10/download\"],\n strip_prefix = \"tree-sitter-0.25.10\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-0.25.10.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-astro-next-0.1.1\",\n sha256 = \"794a4a59fc2d88e49b4bc41fef9522d77184a36f4e68bbaf545cd1eb2364c46e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-astro-next/0.1.1/download\"],\n strip_prefix = \"tree-sitter-astro-next-0.1.1\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-astro-next-0.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-bash-0.25.1\",\n sha256 = \"9e5ec769279cc91b561d3df0d8a5deb26b0ad40d183127f409494d6d8fc53062\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-bash/0.25.1/download\"],\n strip_prefix = \"tree-sitter-bash-0.25.1\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-bash-0.25.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-c-0.24.2\",\n sha256 = \"a9b2eb57a55fed6b00812912e730b7a275cf4fe98bfd6a5d76263d4438371728\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-c/0.24.2/download\"],\n strip_prefix = \"tree-sitter-c-0.24.2\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-c-0.24.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-c-sharp-0.23.5\",\n sha256 = \"c1aac67f1ad71de1d6d39708d34811081c26dfa495658de6c14c34200849357c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-c-sharp/0.23.5/download\"],\n strip_prefix = \"tree-sitter-c-sharp-0.23.5\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-c-sharp-0.23.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-clojure-0.1.0\",\n sha256 = \"4004884cc509449a1d78fa3e1f02b4e953d0a8065984445304795e72e885338c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-clojure/0.1.0/download\"],\n strip_prefix = \"tree-sitter-clojure-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-clojure-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-cmake-0.7.4\",\n sha256 = \"164e0c4f4236ec5ceff14824a5528615cf462e100467e49826442ff57d327061\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-cmake/0.7.4/download\"],\n strip_prefix = \"tree-sitter-cmake-0.7.4\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-cmake-0.7.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-cpp-0.23.4\",\n sha256 = \"df2196ea9d47b4ab4a31b9297eaa5a5d19a0b121dceb9f118f6790ad0ab94743\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-cpp/0.23.4/download\"],\n strip_prefix = \"tree-sitter-cpp-0.23.4\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-cpp-0.23.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-css-0.25.0\",\n sha256 = \"a5cbc5e18f29a2c6d6435891f42569525cf95435a3e01c2f1947abcde178686f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-css/0.25.0/download\"],\n strip_prefix = \"tree-sitter-css-0.25.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-css-0.25.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-dart-0.2.0\",\n sha256 = \"325dd1e24ee9ee21111e9c43680ae7d6010aaa9f282b048a99b9c7163c1cf553\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-dart/0.2.0/download\"],\n strip_prefix = \"tree-sitter-dart-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-dart-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-diff-0.1.0\",\n sha256 = \"dfe1e5ca280a65dfe5ba4205c1bcc84edf486464fed315db53dee6da9a335889\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-diff/0.1.0/download\"],\n strip_prefix = \"tree-sitter-diff-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-diff-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-dockerfile-updated-0.2.0\",\n sha256 = \"5e61eb704364be179ab9be89e2891c8e77c0041eca5891a5c04164a21f6df7a0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-dockerfile-updated/0.2.0/download\"],\n strip_prefix = \"tree-sitter-dockerfile-updated-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-dockerfile-updated-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-elisp-1.6.1\",\n sha256 = \"5e2e9a6ab3cebf24ca41cdc1f985549b9b33f7ef25c19ac7d18e53a4ee24da09\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-elisp/1.6.1/download\"],\n strip_prefix = \"tree-sitter-elisp-1.6.1\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-elisp-1.6.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-elixir-0.3.5\",\n sha256 = \"66dd064a762ed95bfc29857fa3cb7403bb1e5cb88112de0f6341b7e47284ba40\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-elixir/0.3.5/download\"],\n strip_prefix = \"tree-sitter-elixir-0.3.5\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-elixir-0.3.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-erlang-0.16.0\",\n sha256 = \"ceb442e728225d601db0661f60d64e166bd9b9a55c587f71d4e4f27378717cce\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-erlang/0.16.0/download\"],\n strip_prefix = \"tree-sitter-erlang-0.16.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-erlang-0.16.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-fortran-0.6.0\",\n sha256 = \"ea5fea41363a9b59666001dc26c4b356d4e164da27c6ce31145e00aba6bf9b16\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-fortran/0.6.0/download\"],\n strip_prefix = \"tree-sitter-fortran-0.6.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-fortran-0.6.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-go-0.25.0\",\n sha256 = \"c8560a4d2f835cc0d4d2c2e03cbd0dde2f6114b43bc491164238d333e28b16ea\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-go/0.25.0/download\"],\n strip_prefix = \"tree-sitter-go-0.25.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-go-0.25.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-graphql-0.1.0\",\n sha256 = \"efedc4cac157161cc23a0adc4553a2cedc908e1cd754b6cd033a919bb81ce5d6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-graphql/0.1.0/download\"],\n strip_prefix = \"tree-sitter-graphql-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-graphql-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-haskell-0.23.1\",\n sha256 = \"977c51e504548cba13fc27cb5a2edab2124cf6716a1934915d07ab99523b05a4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-haskell/0.23.1/download\"],\n strip_prefix = \"tree-sitter-haskell-0.23.1\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-haskell-0.23.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-hcl-1.1.0\",\n sha256 = \"5a7b2cc3d7121553b84309fab9d11b3ff3d420403eef9ae50f9fd1cd9d9cf012\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-hcl/1.1.0/download\"],\n strip_prefix = \"tree-sitter-hcl-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-hcl-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-html-0.23.2\",\n sha256 = \"261b708e5d92061ede329babaaa427b819329a9d427a1d710abb0f67bbef63ee\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-html/0.23.2/download\"],\n strip_prefix = \"tree-sitter-html-0.23.2\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-html-0.23.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-ini-1.4.0\",\n sha256 = \"387f79682cd53b7c0a5777c96e601a02b9965a787984ef86dbb8952bdab2d62f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-ini/1.4.0/download\"],\n strip_prefix = \"tree-sitter-ini-1.4.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-ini-1.4.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-java-0.23.5\",\n sha256 = \"0aa6cbcdc8c679b214e616fd3300da67da0e492e066df01bcf5a5921a71e90d6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-java/0.23.5/download\"],\n strip_prefix = \"tree-sitter-java-0.23.5\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-java-0.23.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-javascript-0.25.0\",\n sha256 = \"68204f2abc0627a90bdf06e605f5c470aa26fdcb2081ea553a04bdad756693f5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-javascript/0.25.0/download\"],\n strip_prefix = \"tree-sitter-javascript-0.25.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-javascript-0.25.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-json-0.24.8\",\n sha256 = \"4d727acca406c0020cffc6cf35516764f36c8e3dc4408e5ebe2cb35a947ec471\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-json/0.24.8/download\"],\n strip_prefix = \"tree-sitter-json-0.24.8\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-json-0.24.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-julia-0.23.1\",\n sha256 = \"4144731a178812ee867619b1e98b3b91e54c1652304b26e5ebe3175b701de323\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-julia/0.23.1/download\"],\n strip_prefix = \"tree-sitter-julia-0.23.1\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-julia-0.23.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-just-0.2.0\",\n sha256 = \"bd46794f2c270f43d73b2f2c8c256992471f3493c903604da0886df984771920\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-just/0.2.0/download\"],\n strip_prefix = \"tree-sitter-just-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-just-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-kotlin-sg-0.4.1\",\n sha256 = \"c06ec43ae3c12165d4ac08afe4e1f5fc6757ffe274fa7bd5af9007ef11ba4319\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-kotlin-sg/0.4.1/download\"],\n strip_prefix = \"tree-sitter-kotlin-sg-0.4.1\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-kotlin-sg-0.4.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-language-0.1.7\",\n sha256 = \"009994f150cc0cd50ff54917d5bc8bffe8cad10ca10d81c34da2ec421ae61782\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-language/0.1.7/download\"],\n strip_prefix = \"tree-sitter-language-0.1.7\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-language-0.1.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-lua-0.5.0\",\n sha256 = \"8daaf5f4235188a58603c39760d5fa5d4b920d36a299c934adddae757f32a10c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-lua/0.5.0/download\"],\n strip_prefix = \"tree-sitter-lua-0.5.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-lua-0.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-make-1.1.1\",\n sha256 = \"c5998dc7cbcbdab19fae8aefef982bf2d6544513d8d2e69cc44aec4c63810104\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-make/1.1.1/download\"],\n strip_prefix = \"tree-sitter-make-1.1.1\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-make-1.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-md-0.5.3\",\n sha256 = \"2efd398be546456c814598ee56c0f51769a77241511b4a58077815d120afa882\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-md/0.5.3/download\"],\n strip_prefix = \"tree-sitter-md-0.5.3\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-md-0.5.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-nix-0.3.0\",\n sha256 = \"4952a9733f3a98f6683a0ccd1035d84ab7a52f7e84eeed58548d86765ad92de3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-nix/0.3.0/download\"],\n strip_prefix = \"tree-sitter-nix-0.3.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-nix-0.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-objc-3.0.2\",\n sha256 = \"9ca8bb556423fc176f0535e79d525f783a6684d3c9da81bf9d905303c129e1d2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-objc/3.0.2/download\"],\n strip_prefix = \"tree-sitter-objc-3.0.2\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-objc-3.0.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-ocaml-0.24.2\",\n sha256 = \"7d19db582b3855f56b5f9ec484170fbfb9ee60b938ec7720d76d2ee788e8b640\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-ocaml/0.24.2/download\"],\n strip_prefix = \"tree-sitter-ocaml-0.24.2\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-ocaml-0.24.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-odin-1.3.0\",\n sha256 = \"24db210fe9ba2237c71c5030d7b146c7025420ba72dd8013d13cd822c3a8d77a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-odin/1.3.0/download\"],\n strip_prefix = \"tree-sitter-odin-1.3.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-odin-1.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-php-0.24.2\",\n sha256 = \"0d8c17c3ab69052c5eeaa7ff5cd972dd1bc25d1b97ee779fec391ad3b5df5592\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-php/0.24.2/download\"],\n strip_prefix = \"tree-sitter-php-0.24.2\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-php-0.24.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-powershell-0.26.4\",\n sha256 = \"3faf304d44b9ddd4a7d97804bb8de7daf564336dd5a526dc6de5b39238243022\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-powershell/0.26.4/download\"],\n strip_prefix = \"tree-sitter-powershell-0.26.4\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-powershell-0.26.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-proto-0.4.0\",\n sha256 = \"2e410ccb5fa3cbd6bf7b8e512ecf7ad9d5254395b822bfe9f751b50fa978f31c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-proto/0.4.0/download\"],\n strip_prefix = \"tree-sitter-proto-0.4.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-proto-0.4.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-python-0.25.0\",\n sha256 = \"6bf85fd39652e740bf60f46f4cda9492c3a9ad75880575bf14960f775cb74a1c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-python/0.25.0/download\"],\n strip_prefix = \"tree-sitter-python-0.25.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-python-0.25.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-r-1.3.0\",\n sha256 = \"ffc9954ec870dcad6cffdd302b405306c68cf031ed79a78cd9746f6740d9fe20\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-r/1.3.0/download\"],\n strip_prefix = \"tree-sitter-r-1.3.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-r-1.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-regex-0.25.0\",\n sha256 = \"bd8a59be9f0ac131fd8f062eaaba14882b2fa5a6a7882a20134cb1d60df2e625\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-regex/0.25.0/download\"],\n strip_prefix = \"tree-sitter-regex-0.25.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-regex-0.25.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-ruby-0.23.1\",\n sha256 = \"be0484ea4ef6bb9c575b4fdabde7e31340a8d2dbc7d52b321ac83da703249f95\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-ruby/0.23.1/download\"],\n strip_prefix = \"tree-sitter-ruby-0.23.1\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-ruby-0.23.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-rust-0.24.2\",\n sha256 = \"439e577dbe07423ec2582ac62c7531120dbfccfa6e5f92406f93dd271a120e45\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-rust/0.24.2/download\"],\n strip_prefix = \"tree-sitter-rust-0.24.2\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-rust-0.24.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-scala-0.26.0\",\n sha256 = \"de5a4a7ff23a55474ce6a741d52aaeca7a82fe9421bb982b86e98c6ac8629397\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-scala/0.26.0/download\"],\n strip_prefix = \"tree-sitter-scala-0.26.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-scala-0.26.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-sequel-0.3.11\",\n sha256 = \"9d198ad3c319c02e43c21efa1ec796b837afcb96ffaef1a40c1978fbdcec7d17\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-sequel/0.3.11/download\"],\n strip_prefix = \"tree-sitter-sequel-0.3.11\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-sequel-0.3.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-solidity-1.2.13\",\n sha256 = \"4eacf8875b70879f0cb670c60b233ad0b68752d9e1474e6c3ef168eea8a90b25\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-solidity/1.2.13/download\"],\n strip_prefix = \"tree-sitter-solidity-1.2.13\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-solidity-1.2.13.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-starlark-1.3.0\",\n sha256 = \"8934f282d085cc4b9ee28aa688aa3fbe8aa3766201c2a6252f411d45b4c3a721\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-starlark/1.3.0/download\"],\n strip_prefix = \"tree-sitter-starlark-1.3.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-starlark-1.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-svelte-next-0.1.1\",\n sha256 = \"56f88190d0743e897c3e148a7e241aba0a8844b8afe816943851426e3f7b9753\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-svelte-next/0.1.1/download\"],\n strip_prefix = \"tree-sitter-svelte-next-0.1.1\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-svelte-next-0.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-swift-0.7.3\",\n sha256 = \"fe36052155b9dd69ca82b3b8f1b4ccfb2d867125ac1a4db1dd7331829242668c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-swift/0.7.3/download\"],\n strip_prefix = \"tree-sitter-swift-0.7.3\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-swift-0.7.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-tlaplus-1.5.0\",\n sha256 = \"ddaacc0337bfee38f233a91a704dc36b887a0c385348163f65344d64b73f79e1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-tlaplus/1.5.0/download\"],\n strip_prefix = \"tree-sitter-tlaplus-1.5.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-tlaplus-1.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-toml-ng-0.7.0\",\n sha256 = \"e9adc2c898ae49730e857d75be403da3f92bb81d8e37a2f918a08dd10de5ebb1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-toml-ng/0.7.0/download\"],\n strip_prefix = \"tree-sitter-toml-ng-0.7.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-toml-ng-0.7.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-typescript-0.23.2\",\n sha256 = \"6c5f76ed8d947a75cc446d5fccd8b602ebf0cde64ccf2ffa434d873d7a575eff\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-typescript/0.23.2/download\"],\n strip_prefix = \"tree-sitter-typescript-0.23.2\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-typescript-0.23.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-verilog-1.0.3\",\n sha256 = \"d4e7e0360395852f1f6ff5b7b82c72dc6557d181073188df1d60ec469ea69c66\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-verilog/1.0.3/download\"],\n strip_prefix = \"tree-sitter-verilog-1.0.3\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-verilog-1.0.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-vue-next-0.1.0\",\n sha256 = \"e9ac89acaa8165aaabfa8ae9683aa423b0d2bf42c815dae5ca031a36a75525f1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-vue-next/0.1.0/download\"],\n strip_prefix = \"tree-sitter-vue-next-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-vue-next-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-xml-0.7.0\",\n sha256 = \"e670041f591d994f54d597ddcd8f4ebc930e282c4c76a42268743b71f0c8b6b3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-xml/0.7.0/download\"],\n strip_prefix = \"tree-sitter-xml-0.7.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-xml-0.7.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-yaml-0.7.2\",\n sha256 = \"53c223db85f05e34794f065454843b0668ebc15d240ada63e2b5939f43ce7c97\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-yaml/0.7.2/download\"],\n strip_prefix = \"tree-sitter-yaml-0.7.2\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-yaml-0.7.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-zig-1.1.2\",\n sha256 = \"ab11fc124851b0db4dd5e55983bbd9631192e93238389dcd44521715e5d53e28\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-zig/1.1.2/download\"],\n strip_prefix = \"tree-sitter-zig-1.1.2\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-zig-1.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree_magic_mini-3.2.2\",\n sha256 = \"b8765b90061cba6c22b5831f675da109ae5561588290f9fa2317adab2714d5a6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree_magic_mini/3.2.2/download\"],\n strip_prefix = \"tree_magic_mini-3.2.2\",\n build_file = Label(\"@crates//crates:BUILD.tree_magic_mini-3.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__triomphe-0.1.16\",\n sha256 = \"b40688ea6389c8171614b25491f71d4a27946e0c7ce2da1c6de27e25abf1a0ae\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/triomphe/0.1.16/download\"],\n strip_prefix = \"triomphe-0.1.16\",\n build_file = Label(\"@crates//crates:BUILD.triomphe-0.1.16.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ttf-parser-0.21.1\",\n sha256 = \"2c591d83f69777866b9126b24c6dd9a18351f177e49d625920d19f989fd31cf8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ttf-parser/0.21.1/download\"],\n strip_prefix = \"ttf-parser-0.21.1\",\n build_file = Label(\"@crates//crates:BUILD.ttf-parser-0.21.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__turn-0.17.2\",\n sha256 = \"d99249a493335eb44c4d7943a8751b22561a82c9903d8eb2d29780b3927880a7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/turn/0.17.2/download\"],\n strip_prefix = \"turn-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.turn-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__type-map-0.5.1\",\n sha256 = \"cb30dbbd9036155e74adad6812e9898d03ec374946234fbcebd5dfc7b9187b90\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/type-map/0.5.1/download\"],\n strip_prefix = \"type-map-0.5.1\",\n build_file = Label(\"@crates//crates:BUILD.type-map-0.5.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__typed-arena-2.0.2\",\n sha256 = \"6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/typed-arena/2.0.2/download\"],\n strip_prefix = \"typed-arena-2.0.2\",\n build_file = Label(\"@crates//crates:BUILD.typed-arena-2.0.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__typenum-1.20.1\",\n sha256 = \"b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/typenum/1.20.1/download\"],\n strip_prefix = \"typenum-1.20.1\",\n build_file = Label(\"@crates//crates:BUILD.typenum-1.20.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ucd-trie-0.1.7\",\n sha256 = \"2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ucd-trie/0.1.7/download\"],\n strip_prefix = \"ucd-trie-0.1.7\",\n build_file = Label(\"@crates//crates:BUILD.ucd-trie-0.1.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__uds_windows-1.2.1\",\n sha256 = \"f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/uds_windows/1.2.1/download\"],\n strip_prefix = \"uds_windows-1.2.1\",\n build_file = Label(\"@crates//crates:BUILD.uds_windows-1.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__unic-langid-0.9.6\",\n sha256 = \"a28ba52c9b05311f4f6e62d5d9d46f094bd6e84cb8df7b3ef952748d752a7d05\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/unic-langid/0.9.6/download\"],\n strip_prefix = \"unic-langid-0.9.6\",\n build_file = Label(\"@crates//crates:BUILD.unic-langid-0.9.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__unic-langid-impl-0.9.6\",\n sha256 = \"dce1bf08044d4b7a94028c93786f8566047edc11110595914de93362559bc658\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/unic-langid-impl/0.9.6/download\"],\n strip_prefix = \"unic-langid-impl-0.9.6\",\n build_file = Label(\"@crates//crates:BUILD.unic-langid-impl-0.9.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__unicase-2.9.0\",\n sha256 = \"dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/unicase/2.9.0/download\"],\n strip_prefix = \"unicase-2.9.0\",\n build_file = Label(\"@crates//crates:BUILD.unicase-2.9.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__unicode-ident-1.0.24\",\n sha256 = \"e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/unicode-ident/1.0.24/download\"],\n strip_prefix = \"unicode-ident-1.0.24\",\n build_file = Label(\"@crates//crates:BUILD.unicode-ident-1.0.24.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__unicode-segmentation-1.13.3\",\n sha256 = \"c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/unicode-segmentation/1.13.3/download\"],\n strip_prefix = \"unicode-segmentation-1.13.3\",\n build_file = Label(\"@crates//crates:BUILD.unicode-segmentation-1.13.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__unicode-width-0.1.14\",\n sha256 = \"7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/unicode-width/0.1.14/download\"],\n strip_prefix = \"unicode-width-0.1.14\",\n build_file = Label(\"@crates//crates:BUILD.unicode-width-0.1.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__unicode-width-0.2.2\",\n sha256 = \"b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/unicode-width/0.2.2/download\"],\n strip_prefix = \"unicode-width-0.2.2\",\n build_file = Label(\"@crates//crates:BUILD.unicode-width-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__unit-prefix-0.5.2\",\n sha256 = \"81e544489bf3d8ef66c953931f56617f423cd4b5494be343d9b9d3dda037b9a3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/unit-prefix/0.5.2/download\"],\n strip_prefix = \"unit-prefix-0.5.2\",\n build_file = Label(\"@crates//crates:BUILD.unit-prefix-0.5.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__universal-hash-0.5.1\",\n sha256 = \"fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/universal-hash/0.5.1/download\"],\n strip_prefix = \"universal-hash-0.5.1\",\n build_file = Label(\"@crates//crates:BUILD.universal-hash-0.5.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__untrusted-0.9.0\",\n sha256 = \"8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/untrusted/0.9.0/download\"],\n strip_prefix = \"untrusted-0.9.0\",\n build_file = Label(\"@crates//crates:BUILD.untrusted-0.9.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__url-2.5.8\",\n sha256 = \"ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/url/2.5.8/download\"],\n strip_prefix = \"url-2.5.8\",\n build_file = Label(\"@crates//crates:BUILD.url-2.5.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__urlencoding-2.1.3\",\n sha256 = \"daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/urlencoding/2.1.3/download\"],\n strip_prefix = \"urlencoding-2.1.3\",\n build_file = Label(\"@crates//crates:BUILD.urlencoding-2.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__utf16_iter-1.0.5\",\n sha256 = \"c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/utf16_iter/1.0.5/download\"],\n strip_prefix = \"utf16_iter-1.0.5\",\n build_file = Label(\"@crates//crates:BUILD.utf16_iter-1.0.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__utf8-chars-3.0.7\",\n sha256 = \"92498c67ea3511b37eccff13b573ed871faf0ce9c4056ab032bd01a681f445a0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/utf8-chars/3.0.7/download\"],\n strip_prefix = \"utf8-chars-3.0.7\",\n build_file = Label(\"@crates//crates:BUILD.utf8-chars-3.0.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__utf8_iter-1.0.4\",\n sha256 = \"b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/utf8_iter/1.0.4/download\"],\n strip_prefix = \"utf8_iter-1.0.4\",\n build_file = Label(\"@crates//crates:BUILD.utf8_iter-1.0.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__utf8parse-0.2.2\",\n sha256 = \"06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/utf8parse/0.2.2/download\"],\n strip_prefix = \"utf8parse-0.2.2\",\n build_file = Label(\"@crates//crates:BUILD.utf8parse-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__uucore-0.0.30\",\n sha256 = \"71f4e82877d06de779c611a3d54720f56f1e68b228fb30a5b6c66ef07e68263d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/uucore/0.0.30/download\"],\n strip_prefix = \"uucore-0.0.30\",\n build_file = Label(\"@crates//crates:BUILD.uucore-0.0.30.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__uucore-0.8.0\",\n sha256 = \"07d779636d827cde4100f0e65ff3fd23b0b1f1195055475c6e6813d425f30c8e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/uucore/0.8.0/download\"],\n strip_prefix = \"uucore-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.uucore-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__uucore-0.9.0\",\n sha256 = \"069b34217c27f611e1589f540f58118dbf226a9e407d38ab472052ff075a1dc2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/uucore/0.9.0/download\"],\n strip_prefix = \"uucore-0.9.0\",\n build_file = Label(\"@crates//crates:BUILD.uucore-0.9.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__uucore_procs-0.0.30\",\n sha256 = \"c72435859e812e602e225dea48d014abb6b1072220a8d44f2fe0565553b1f7e4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/uucore_procs/0.0.30/download\"],\n strip_prefix = \"uucore_procs-0.0.30\",\n build_file = Label(\"@crates//crates:BUILD.uucore_procs-0.0.30.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__uucore_procs-0.8.0\",\n sha256 = \"da865e8a648b260dbd89fca76d0801995877ab27a4e259b6dec30ba9743b86ab\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/uucore_procs/0.8.0/download\"],\n strip_prefix = \"uucore_procs-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.uucore_procs-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__uucore_procs-0.9.0\",\n sha256 = \"34337da211e7abfff7189b794afb3b5018fe356fb36474b73645458fc1201350\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/uucore_procs/0.9.0/download\"],\n strip_prefix = \"uucore_procs-0.9.0\",\n build_file = Label(\"@crates//crates:BUILD.uucore_procs-0.9.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__uuhelp_parser-0.0.30\",\n sha256 = \"0bb6d972f580f8223cb7052d8580aea2b7061e368cf476de32ea9457b19459ed\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/uuhelp_parser/0.0.30/download\"],\n strip_prefix = \"uuhelp_parser-0.0.30\",\n build_file = Label(\"@crates//crates:BUILD.uuhelp_parser-0.0.30.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__uuid-1.24.0\",\n sha256 = \"bf3923a6f5c4c6382e0b653c4117f48d631ea17f38ed86e2a828e6f7412f5239\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/uuid/1.24.0/download\"],\n strip_prefix = \"uuid-1.24.0\",\n build_file = Label(\"@crates//crates:BUILD.uuid-1.24.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__uutils_term_grid-0.8.0\",\n sha256 = \"382d49b39de4a115f203305057741126b09a615892d773a2d419a2b816e30e39\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/uutils_term_grid/0.8.0/download\"],\n strip_prefix = \"uutils_term_grid-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.uutils_term_grid-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__uzers-0.12.2\",\n sha256 = \"0b8275fb1afee25b4111d2dc8b5c505dbbc4afd0b990cb96deb2d88bff8be18d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/uzers/0.12.2/download\"],\n strip_prefix = \"uzers-0.12.2\",\n build_file = Label(\"@crates//crates:BUILD.uzers-0.12.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__version-compare-0.2.1\",\n sha256 = \"03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/version-compare/0.2.1/download\"],\n strip_prefix = \"version-compare-0.2.1\",\n build_file = Label(\"@crates//crates:BUILD.version-compare-0.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__version_check-0.9.5\",\n sha256 = \"0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/version_check/0.9.5/download\"],\n strip_prefix = \"version_check-0.9.5\",\n build_file = Label(\"@crates//crates:BUILD.version_check-0.9.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__vsimd-0.8.0\",\n sha256 = \"5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/vsimd/0.8.0/download\"],\n strip_prefix = \"vsimd-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.vsimd-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__waitgroup-0.1.2\",\n sha256 = \"d1f50000a783467e6c0200f9d10642f4bc424e39efc1b770203e88b488f79292\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/waitgroup/0.1.2/download\"],\n strip_prefix = \"waitgroup-0.1.2\",\n build_file = Label(\"@crates//crates:BUILD.waitgroup-0.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__walkdir-2.5.0\",\n sha256 = \"29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/walkdir/2.5.0/download\"],\n strip_prefix = \"walkdir-2.5.0\",\n build_file = Label(\"@crates//crates:BUILD.walkdir-2.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasi-0.11.1-wasi-snapshot-preview1\",\n sha256 = \"ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasi/0.11.1+wasi-snapshot-preview1/download\"],\n strip_prefix = \"wasi-0.11.1+wasi-snapshot-preview1\",\n build_file = Label(\"@crates//crates:BUILD.wasi-0.11.1+wasi-snapshot-preview1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasi-0.14.7-wasi-0.2.4\",\n sha256 = \"883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasi/0.14.7+wasi-0.2.4/download\"],\n strip_prefix = \"wasi-0.14.7+wasi-0.2.4\",\n build_file = Label(\"@crates//crates:BUILD.wasi-0.14.7+wasi-0.2.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasip2-1.0.4-wasi-0.2.12\",\n sha256 = \"b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasip2/1.0.4+wasi-0.2.12/download\"],\n strip_prefix = \"wasip2-1.0.4+wasi-0.2.12\",\n build_file = Label(\"@crates//crates:BUILD.wasip2-1.0.4+wasi-0.2.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasite-1.0.2\",\n sha256 = \"66fe902b4a6b8028a753d5424909b764ccf79b7a209eac9bf97e59cda9f71a42\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasite/1.0.2/download\"],\n strip_prefix = \"wasite-1.0.2\",\n build_file = Label(\"@crates//crates:BUILD.wasite-1.0.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-0.2.126\",\n sha256 = \"4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen/0.2.126/download\"],\n strip_prefix = \"wasm-bindgen-0.2.126\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-0.2.126.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-macro-0.2.126\",\n sha256 = \"167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen-macro/0.2.126/download\"],\n strip_prefix = \"wasm-bindgen-macro-0.2.126\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-macro-0.2.126.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-macro-support-0.2.126\",\n sha256 = \"f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen-macro-support/0.2.126/download\"],\n strip_prefix = \"wasm-bindgen-macro-support-0.2.126\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-macro-support-0.2.126.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-shared-0.2.126\",\n sha256 = \"dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen-shared/0.2.126/download\"],\n strip_prefix = \"wasm-bindgen-shared-0.2.126\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-shared-0.2.126.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wayland-backend-0.3.16\",\n sha256 = \"016ccf01d1c58b6f8999612813e17c9b2390f7d70671428869913310f83f54b8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wayland-backend/0.3.16/download\"],\n strip_prefix = \"wayland-backend-0.3.16\",\n build_file = Label(\"@crates//crates:BUILD.wayland-backend-0.3.16.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wayland-client-0.31.15\",\n sha256 = \"e3c36a0f861ad76d0901f2800b46321410d9f73f2ea88aac0650d86c32688073\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wayland-client/0.31.15/download\"],\n strip_prefix = \"wayland-client-0.31.15\",\n build_file = Label(\"@crates//crates:BUILD.wayland-client-0.31.15.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wayland-protocols-0.32.13\",\n sha256 = \"23d0c813de3daa2ed6520af85a3bd49b0e722a3078506899aa9686fea58dc4b6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wayland-protocols/0.32.13/download\"],\n strip_prefix = \"wayland-protocols-0.32.13\",\n build_file = Label(\"@crates//crates:BUILD.wayland-protocols-0.32.13.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wayland-protocols-wlr-0.3.12\",\n sha256 = \"eb04e52f7836d7c7976c78ca0250d61e33873c34156a2a1fc9474828ec268234\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wayland-protocols-wlr/0.3.12/download\"],\n strip_prefix = \"wayland-protocols-wlr-0.3.12\",\n build_file = Label(\"@crates//crates:BUILD.wayland-protocols-wlr-0.3.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wayland-scanner-0.31.11\",\n sha256 = \"338e30461b3a2b67d70eb30a6d89f8e0c93a833e07d2ae89085cd070c4a00ac0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wayland-scanner/0.31.11/download\"],\n strip_prefix = \"wayland-scanner-0.31.11\",\n build_file = Label(\"@crates//crates:BUILD.wayland-scanner-0.31.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wayland-server-0.31.14\",\n sha256 = \"0dde9c29be0f723a573977de51ee455bf3dfa03652730a74f9dd3b337e374d75\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wayland-server/0.31.14/download\"],\n strip_prefix = \"wayland-server-0.31.14\",\n build_file = Label(\"@crates//crates:BUILD.wayland-server-0.31.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wayland-sys-0.31.11\",\n sha256 = \"d8eab23fefc9e41f8e841df4a9c707e8a8c4ed26e944ef69297184de2785e3be\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wayland-sys/0.31.11/download\"],\n strip_prefix = \"wayland-sys-0.31.11\",\n build_file = Label(\"@crates//crates:BUILD.wayland-sys-0.31.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__web-sys-0.3.103\",\n sha256 = \"8622dcb61c0bcc9fffa6938bed81210af2da9a7e4a1a834b2e37a59b6dfb6141\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/web-sys/0.3.103/download\"],\n strip_prefix = \"web-sys-0.3.103\",\n build_file = Label(\"@crates//crates:BUILD.web-sys-0.3.103.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__web-time-1.1.0\",\n sha256 = \"5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/web-time/1.1.0/download\"],\n strip_prefix = \"web-time-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.web-time-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__web_atoms-0.2.5\",\n sha256 = \"075474b12bcb3d2e3d4546580e9de478eeeead668a1761e2a8860c836b7ef297\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/web_atoms/0.2.5/download\"],\n strip_prefix = \"web_atoms-0.2.5\",\n build_file = Label(\"@crates//crates:BUILD.web_atoms-0.2.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__webrtc-0.17.2\",\n sha256 = \"baaacdf9d96224d7b6e2872ba065578f38775f7634367e3ac2cc87c7271da433\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/webrtc/0.17.2/download\"],\n strip_prefix = \"webrtc-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.webrtc-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__webrtc-data-0.17.2\",\n sha256 = \"bd470286275809f2fcfcdb1e73ef5f1500be82eff7fe98150ce81b20aad5a2a4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/webrtc-data/0.17.2/download\"],\n strip_prefix = \"webrtc-data-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.webrtc-data-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__webrtc-ice-0.17.2\",\n sha256 = \"5b7fd30f52e6fda8664779b84b7904b2553b76fee24d9ca665e774ae32b13f53\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/webrtc-ice/0.17.2/download\"],\n strip_prefix = \"webrtc-ice-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.webrtc-ice-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__webrtc-mdns-0.17.2\",\n sha256 = \"91ffa0ea00c0fae979aafa5db285fec5eeb360e1ea246ebec529ba4e09f8e03e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/webrtc-mdns/0.17.2/download\"],\n strip_prefix = \"webrtc-mdns-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.webrtc-mdns-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__webrtc-media-0.17.2\",\n sha256 = \"26a6c7335bdd03dc023cb9a3bd7966866d969c92c86987b73aa16dfa39c7ca29\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/webrtc-media/0.17.2/download\"],\n strip_prefix = \"webrtc-media-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.webrtc-media-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__webrtc-sctp-0.17.2\",\n sha256 = \"1c4b637f0d8eb96d900ac0f79b3060ddd21ca88dfefa467e96e67ab0016f2574\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/webrtc-sctp/0.17.2/download\"],\n strip_prefix = \"webrtc-sctp-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.webrtc-sctp-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__webrtc-srtp-0.17.2\",\n sha256 = \"45d2b667a0b5d04eebcb7cb22fd51b2af3721f418097b496e72de16386c8d0c3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/webrtc-srtp/0.17.2/download\"],\n strip_prefix = \"webrtc-srtp-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.webrtc-srtp-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__webrtc-util-0.17.2\",\n sha256 = \"1beae0b4f24969741c26ca282a257dc5823bd9cbe608f7e3ca3775102d323ad9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/webrtc-util/0.17.2/download\"],\n strip_prefix = \"webrtc-util-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.webrtc-util-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__weezl-0.1.12\",\n sha256 = \"a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/weezl/0.1.12/download\"],\n strip_prefix = \"weezl-0.1.12\",\n build_file = Label(\"@crates//crates:BUILD.weezl-0.1.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__whoami-2.1.2\",\n sha256 = \"998767ef88740d1f5b0682a9c53c24431453923962269c2db68ee43788c5a40d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/whoami/2.1.2/download\"],\n strip_prefix = \"whoami-2.1.2\",\n build_file = Label(\"@crates//crates:BUILD.whoami-2.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wide-0.8.3\",\n sha256 = \"13ca908d26e4786149c48efcf6c0ea09ab0e06d1fe3c17dc1b4b0f1ca4a7e788\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wide/0.8.3/download\"],\n strip_prefix = \"wide-0.8.3\",\n build_file = Label(\"@crates//crates:BUILD.wide-0.8.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__widestring-1.2.1\",\n sha256 = \"72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/widestring/1.2.1/download\"],\n strip_prefix = \"widestring-1.2.1\",\n build_file = Label(\"@crates//crates:BUILD.widestring-1.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wild-2.2.1\",\n sha256 = \"a3131afc8c575281e1e80f36ed6a092aa502c08b18ed7524e86fbbb12bb410e1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wild/2.2.1/download\"],\n strip_prefix = \"wild-2.2.1\",\n build_file = Label(\"@crates//crates:BUILD.wild-2.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__winapi-0.3.9\",\n sha256 = \"5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/winapi/0.3.9/download\"],\n strip_prefix = \"winapi-0.3.9\",\n build_file = Label(\"@crates//crates:BUILD.winapi-0.3.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__winapi-i686-pc-windows-gnu-0.4.0\",\n sha256 = \"ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/winapi-i686-pc-windows-gnu/0.4.0/download\"],\n strip_prefix = \"winapi-i686-pc-windows-gnu-0.4.0\",\n build_file = Label(\"@crates//crates:BUILD.winapi-i686-pc-windows-gnu-0.4.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__winapi-util-0.1.11\",\n sha256 = \"c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/winapi-util/0.1.11/download\"],\n strip_prefix = \"winapi-util-0.1.11\",\n build_file = Label(\"@crates//crates:BUILD.winapi-util-0.1.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__winapi-x86_64-pc-windows-gnu-0.4.0\",\n sha256 = \"712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/winapi-x86_64-pc-windows-gnu/0.4.0/download\"],\n strip_prefix = \"winapi-x86_64-pc-windows-gnu-0.4.0\",\n build_file = Label(\"@crates//crates:BUILD.winapi-x86_64-pc-windows-gnu-0.4.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-0.51.1\",\n sha256 = \"ca229916c5ee38c2f2bc1e9d8f04df975b4bd93f9955dc69fabb5d91270045c9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows/0.51.1/download\"],\n strip_prefix = \"windows-0.51.1\",\n build_file = Label(\"@crates//crates:BUILD.windows-0.51.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-0.61.3\",\n sha256 = \"9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows/0.61.3/download\"],\n strip_prefix = \"windows-0.61.3\",\n build_file = Label(\"@crates//crates:BUILD.windows-0.61.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-0.62.2\",\n sha256 = \"527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows/0.62.2/download\"],\n strip_prefix = \"windows-0.62.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-0.62.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-collections-0.2.0\",\n sha256 = \"3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-collections/0.2.0/download\"],\n strip_prefix = \"windows-collections-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.windows-collections-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-collections-0.3.2\",\n sha256 = \"23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-collections/0.3.2/download\"],\n strip_prefix = \"windows-collections-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-collections-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-core-0.51.1\",\n sha256 = \"f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-core/0.51.1/download\"],\n strip_prefix = \"windows-core-0.51.1\",\n build_file = Label(\"@crates//crates:BUILD.windows-core-0.51.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-core-0.61.2\",\n sha256 = \"c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-core/0.61.2/download\"],\n strip_prefix = \"windows-core-0.61.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-core-0.61.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-core-0.62.2\",\n sha256 = \"b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-core/0.62.2/download\"],\n strip_prefix = \"windows-core-0.62.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-core-0.62.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-future-0.2.1\",\n sha256 = \"fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-future/0.2.1/download\"],\n strip_prefix = \"windows-future-0.2.1\",\n build_file = Label(\"@crates//crates:BUILD.windows-future-0.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-future-0.3.2\",\n sha256 = \"e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-future/0.3.2/download\"],\n strip_prefix = \"windows-future-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-future-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-implement-0.60.2\",\n sha256 = \"053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-implement/0.60.2/download\"],\n strip_prefix = \"windows-implement-0.60.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-implement-0.60.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-interface-0.59.3\",\n sha256 = \"3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-interface/0.59.3/download\"],\n strip_prefix = \"windows-interface-0.59.3\",\n build_file = Label(\"@crates//crates:BUILD.windows-interface-0.59.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-link-0.1.3\",\n sha256 = \"5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-link/0.1.3/download\"],\n strip_prefix = \"windows-link-0.1.3\",\n build_file = Label(\"@crates//crates:BUILD.windows-link-0.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-link-0.2.1\",\n sha256 = \"f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-link/0.2.1/download\"],\n strip_prefix = \"windows-link-0.2.1\",\n build_file = Label(\"@crates//crates:BUILD.windows-link-0.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-numerics-0.2.0\",\n sha256 = \"9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-numerics/0.2.0/download\"],\n strip_prefix = \"windows-numerics-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.windows-numerics-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-numerics-0.3.1\",\n sha256 = \"6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-numerics/0.3.1/download\"],\n strip_prefix = \"windows-numerics-0.3.1\",\n build_file = Label(\"@crates//crates:BUILD.windows-numerics-0.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-result-0.3.4\",\n sha256 = \"56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-result/0.3.4/download\"],\n strip_prefix = \"windows-result-0.3.4\",\n build_file = Label(\"@crates//crates:BUILD.windows-result-0.3.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-result-0.4.1\",\n sha256 = \"7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-result/0.4.1/download\"],\n strip_prefix = \"windows-result-0.4.1\",\n build_file = Label(\"@crates//crates:BUILD.windows-result-0.4.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-strings-0.4.2\",\n sha256 = \"56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-strings/0.4.2/download\"],\n strip_prefix = \"windows-strings-0.4.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-strings-0.4.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-strings-0.5.1\",\n sha256 = \"7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-strings/0.5.1/download\"],\n strip_prefix = \"windows-strings-0.5.1\",\n build_file = Label(\"@crates//crates:BUILD.windows-strings-0.5.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-sys-0.52.0\",\n sha256 = \"282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-sys/0.52.0/download\"],\n strip_prefix = \"windows-sys-0.52.0\",\n build_file = Label(\"@crates//crates:BUILD.windows-sys-0.52.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-sys-0.59.0\",\n sha256 = \"1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-sys/0.59.0/download\"],\n strip_prefix = \"windows-sys-0.59.0\",\n build_file = Label(\"@crates//crates:BUILD.windows-sys-0.59.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-sys-0.60.2\",\n sha256 = \"f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-sys/0.60.2/download\"],\n strip_prefix = \"windows-sys-0.60.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-sys-0.60.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-sys-0.61.2\",\n sha256 = \"ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-sys/0.61.2/download\"],\n strip_prefix = \"windows-sys-0.61.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-sys-0.61.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-targets-0.48.5\",\n sha256 = \"9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-targets/0.48.5/download\"],\n strip_prefix = \"windows-targets-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows-targets-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-targets-0.52.6\",\n sha256 = \"9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-targets/0.52.6/download\"],\n strip_prefix = \"windows-targets-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows-targets-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-targets-0.53.5\",\n sha256 = \"4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-targets/0.53.5/download\"],\n strip_prefix = \"windows-targets-0.53.5\",\n build_file = Label(\"@crates//crates:BUILD.windows-targets-0.53.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-threading-0.1.0\",\n sha256 = \"b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-threading/0.1.0/download\"],\n strip_prefix = \"windows-threading-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.windows-threading-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-threading-0.2.1\",\n sha256 = \"3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-threading/0.2.1/download\"],\n strip_prefix = \"windows-threading-0.2.1\",\n build_file = Label(\"@crates//crates:BUILD.windows-threading-0.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_gnullvm-0.48.5\",\n sha256 = \"2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_gnullvm/0.48.5/download\"],\n strip_prefix = \"windows_aarch64_gnullvm-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_gnullvm-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_gnullvm-0.52.6\",\n sha256 = \"32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_gnullvm/0.52.6/download\"],\n strip_prefix = \"windows_aarch64_gnullvm-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_gnullvm-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_gnullvm-0.53.1\",\n sha256 = \"a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_gnullvm/0.53.1/download\"],\n strip_prefix = \"windows_aarch64_gnullvm-0.53.1\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_gnullvm-0.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_msvc-0.48.5\",\n sha256 = \"dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_msvc/0.48.5/download\"],\n strip_prefix = \"windows_aarch64_msvc-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_msvc-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_msvc-0.52.6\",\n sha256 = \"09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_msvc/0.52.6/download\"],\n strip_prefix = \"windows_aarch64_msvc-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_msvc-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_msvc-0.53.1\",\n sha256 = \"b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_msvc/0.53.1/download\"],\n strip_prefix = \"windows_aarch64_msvc-0.53.1\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_msvc-0.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnu-0.48.5\",\n sha256 = \"a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnu/0.48.5/download\"],\n strip_prefix = \"windows_i686_gnu-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnu-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnu-0.52.6\",\n sha256 = \"8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnu/0.52.6/download\"],\n strip_prefix = \"windows_i686_gnu-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnu-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnu-0.53.1\",\n sha256 = \"960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnu/0.53.1/download\"],\n strip_prefix = \"windows_i686_gnu-0.53.1\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnu-0.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnullvm-0.52.6\",\n sha256 = \"0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnullvm/0.52.6/download\"],\n strip_prefix = \"windows_i686_gnullvm-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnullvm-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnullvm-0.53.1\",\n sha256 = \"fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnullvm/0.53.1/download\"],\n strip_prefix = \"windows_i686_gnullvm-0.53.1\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnullvm-0.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_msvc-0.48.5\",\n sha256 = \"8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_msvc/0.48.5/download\"],\n strip_prefix = \"windows_i686_msvc-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_msvc-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_msvc-0.52.6\",\n sha256 = \"240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_msvc/0.52.6/download\"],\n strip_prefix = \"windows_i686_msvc-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_msvc-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_msvc-0.53.1\",\n sha256 = \"1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_msvc/0.53.1/download\"],\n strip_prefix = \"windows_i686_msvc-0.53.1\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_msvc-0.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnu-0.48.5\",\n sha256 = \"53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnu/0.48.5/download\"],\n strip_prefix = \"windows_x86_64_gnu-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnu-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnu-0.52.6\",\n sha256 = \"147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnu/0.52.6/download\"],\n strip_prefix = \"windows_x86_64_gnu-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnu-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnu-0.53.1\",\n sha256 = \"9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnu/0.53.1/download\"],\n strip_prefix = \"windows_x86_64_gnu-0.53.1\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnu-0.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnullvm-0.48.5\",\n sha256 = \"0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnullvm/0.48.5/download\"],\n strip_prefix = \"windows_x86_64_gnullvm-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnullvm-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnullvm-0.52.6\",\n sha256 = \"24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnullvm/0.52.6/download\"],\n strip_prefix = \"windows_x86_64_gnullvm-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnullvm-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnullvm-0.53.1\",\n sha256 = \"0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnullvm/0.53.1/download\"],\n strip_prefix = \"windows_x86_64_gnullvm-0.53.1\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnullvm-0.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_msvc-0.48.5\",\n sha256 = \"ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_msvc/0.48.5/download\"],\n strip_prefix = \"windows_x86_64_msvc-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_msvc-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_msvc-0.52.6\",\n sha256 = \"589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_msvc/0.52.6/download\"],\n strip_prefix = \"windows_x86_64_msvc-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_msvc-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_msvc-0.53.1\",\n sha256 = \"d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_msvc/0.53.1/download\"],\n strip_prefix = \"windows_x86_64_msvc-0.53.1\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_msvc-0.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__winnow-0.7.15\",\n sha256 = \"df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/winnow/0.7.15/download\"],\n strip_prefix = \"winnow-0.7.15\",\n build_file = Label(\"@crates//crates:BUILD.winnow-0.7.15.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__winnow-1.0.4\",\n sha256 = \"23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/winnow/1.0.4/download\"],\n strip_prefix = \"winnow-1.0.4\",\n build_file = Label(\"@crates//crates:BUILD.winnow-1.0.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__winreg-0.10.1\",\n sha256 = \"80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/winreg/0.10.1/download\"],\n strip_prefix = \"winreg-0.10.1\",\n build_file = Label(\"@crates//crates:BUILD.winreg-0.10.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__winreg-0.56.0\",\n sha256 = \"7d6f32a0ff4a9f6f01231eb2059cc85479330739333e0e58cadf03b6af2cca10\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/winreg/0.56.0/download\"],\n strip_prefix = \"winreg-0.56.0\",\n build_file = Label(\"@crates//crates:BUILD.winreg-0.56.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wit-bindgen-0.57.1\",\n sha256 = \"1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wit-bindgen/0.57.1/download\"],\n strip_prefix = \"wit-bindgen-0.57.1\",\n build_file = Label(\"@crates//crates:BUILD.wit-bindgen-0.57.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wl-clipboard-rs-0.9.3\",\n sha256 = \"e9651471a32e87d96ef3a127715382b2d11cc7c8bb9822ded8a7cc94072eb0a3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wl-clipboard-rs/0.9.3/download\"],\n strip_prefix = \"wl-clipboard-rs-0.9.3\",\n build_file = Label(\"@crates//crates:BUILD.wl-clipboard-rs-0.9.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__write16-1.0.0\",\n sha256 = \"d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/write16/1.0.0/download\"],\n strip_prefix = \"write16-1.0.0\",\n build_file = Label(\"@crates//crates:BUILD.write16-1.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__writeable-0.6.3\",\n sha256 = \"1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/writeable/0.6.3/download\"],\n strip_prefix = \"writeable-0.6.3\",\n build_file = Label(\"@crates//crates:BUILD.writeable-0.6.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wyz-0.5.1\",\n sha256 = \"05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wyz/0.5.1/download\"],\n strip_prefix = \"wyz-0.5.1\",\n build_file = Label(\"@crates//crates:BUILD.wyz-0.5.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__x11rb-0.13.2\",\n sha256 = \"9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/x11rb/0.13.2/download\"],\n strip_prefix = \"x11rb-0.13.2\",\n build_file = Label(\"@crates//crates:BUILD.x11rb-0.13.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__x11rb-protocol-0.13.2\",\n sha256 = \"ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/x11rb-protocol/0.13.2/download\"],\n strip_prefix = \"x11rb-protocol-0.13.2\",\n build_file = Label(\"@crates//crates:BUILD.x11rb-protocol-0.13.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__x25519-dalek-2.0.1\",\n sha256 = \"c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/x25519-dalek/2.0.1/download\"],\n strip_prefix = \"x25519-dalek-2.0.1\",\n build_file = Label(\"@crates//crates:BUILD.x25519-dalek-2.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__x509-parser-0.16.0\",\n sha256 = \"fcbc162f30700d6f3f82a24bf7cc62ffe7caea42c0b2cba8bf7f3ae50cf51f69\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/x509-parser/0.16.0/download\"],\n strip_prefix = \"x509-parser-0.16.0\",\n build_file = Label(\"@crates//crates:BUILD.x509-parser-0.16.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__xattr-1.6.1\",\n sha256 = \"32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/xattr/1.6.1/download\"],\n strip_prefix = \"xattr-1.6.1\",\n build_file = Label(\"@crates//crates:BUILD.xattr-1.6.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__xcap-0.9.6\",\n sha256 = \"b6ad471d5ba232bc276382d26a9d3b837d6853b7df389058b5bb1e94dcdd248c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/xcap/0.9.6/download\"],\n strip_prefix = \"xcap-0.9.6\",\n build_file = Label(\"@crates//crates:BUILD.xcap-0.9.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__xcb-1.7.0\",\n sha256 = \"ee4c580d8205abb0a5cf4eb7e927bd664e425b6c3263f9c5310583da96970cf6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/xcb/1.7.0/download\"],\n strip_prefix = \"xcb-1.7.0\",\n build_file = Label(\"@crates//crates:BUILD.xcb-1.7.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__xkbcommon-0.9.0\",\n sha256 = \"a7a974f48060a14e95705c01f24ad9c3345022f4d97441b8a36beb7ed5c4a02d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/xkbcommon/0.9.0/download\"],\n strip_prefix = \"xkbcommon-0.9.0\",\n build_file = Label(\"@crates//crates:BUILD.xkbcommon-0.9.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__xkeysym-0.2.1\",\n sha256 = \"b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/xkeysym/0.2.1/download\"],\n strip_prefix = \"xkeysym-0.2.1\",\n build_file = Label(\"@crates//crates:BUILD.xkeysym-0.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__xml-rs-0.8.28\",\n sha256 = \"3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5fb912d3f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/xml-rs/0.8.28/download\"],\n strip_prefix = \"xml-rs-0.8.28\",\n build_file = Label(\"@crates//crates:BUILD.xml-rs-0.8.28.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__xxhash-rust-0.8.18\",\n sha256 = \"aee1b19627c7c60102ab80d3a9cbe18de90bfe03bfa6c3715447681f0e8c8af6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/xxhash-rust/0.8.18/download\"],\n strip_prefix = \"xxhash-rust-0.8.18\",\n build_file = Label(\"@crates//crates:BUILD.xxhash-rust-0.8.18.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__yaml-rust-0.4.5\",\n sha256 = \"56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/yaml-rust/0.4.5/download\"],\n strip_prefix = \"yaml-rust-0.4.5\",\n build_file = Label(\"@crates//crates:BUILD.yaml-rust-0.4.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__yansi-1.0.1\",\n sha256 = \"cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/yansi/1.0.1/download\"],\n strip_prefix = \"yansi-1.0.1\",\n build_file = Label(\"@crates//crates:BUILD.yansi-1.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__yasna-0.5.2\",\n sha256 = \"e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/yasna/0.5.2/download\"],\n strip_prefix = \"yasna-0.5.2\",\n build_file = Label(\"@crates//crates:BUILD.yasna-0.5.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__yoke-0.8.3\",\n sha256 = \"709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/yoke/0.8.3/download\"],\n strip_prefix = \"yoke-0.8.3\",\n build_file = Label(\"@crates//crates:BUILD.yoke-0.8.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__yoke-derive-0.8.2\",\n sha256 = \"de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/yoke-derive/0.8.2/download\"],\n strip_prefix = \"yoke-derive-0.8.2\",\n build_file = Label(\"@crates//crates:BUILD.yoke-derive-0.8.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__z85-3.0.7\",\n sha256 = \"c6e61e59a957b7ccee15d2049f86e8bfd6f66968fcd88f018950662d9b86e675\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/z85/3.0.7/download\"],\n strip_prefix = \"z85-3.0.7\",\n build_file = Label(\"@crates//crates:BUILD.z85-3.0.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zbus-5.18.0\",\n sha256 = \"fe18fb60dc696039e738717b76eaea21e7a4489bbb1885020b43c94236d7e98a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zbus/5.18.0/download\"],\n strip_prefix = \"zbus-5.18.0\",\n build_file = Label(\"@crates//crates:BUILD.zbus-5.18.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zbus_macros-5.18.0\",\n sha256 = \"fe96480bed92df2b442a1a30df364e12d08eed03aeb061f2b8dc6afb2be91119\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zbus_macros/5.18.0/download\"],\n strip_prefix = \"zbus_macros-5.18.0\",\n build_file = Label(\"@crates//crates:BUILD.zbus_macros-5.18.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zbus_names-4.3.4\",\n sha256 = \"d8bf88b4a3ff53e883001e0e0115b297a9d53c31b9c1edd2bfdd853e3428624e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zbus_names/4.3.4/download\"],\n strip_prefix = \"zbus_names-4.3.4\",\n build_file = Label(\"@crates//crates:BUILD.zbus_names-4.3.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerocopy-0.8.55\",\n sha256 = \"b5a105cd7b140f6eeec8acff2ea38135d3cab283ada58540f629fe51e46696eb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerocopy/0.8.55/download\"],\n strip_prefix = \"zerocopy-0.8.55\",\n build_file = Label(\"@crates//crates:BUILD.zerocopy-0.8.55.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerocopy-derive-0.8.55\",\n sha256 = \"0fe976fb70c78cd64cccfe3a6fc142244e8a77b70959b30faf9d0ac37ee228eb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerocopy-derive/0.8.55/download\"],\n strip_prefix = \"zerocopy-derive-0.8.55\",\n build_file = Label(\"@crates//crates:BUILD.zerocopy-derive-0.8.55.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerofrom-0.1.8\",\n sha256 = \"0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerofrom/0.1.8/download\"],\n strip_prefix = \"zerofrom-0.1.8\",\n build_file = Label(\"@crates//crates:BUILD.zerofrom-0.1.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerofrom-derive-0.1.7\",\n sha256 = \"11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerofrom-derive/0.1.7/download\"],\n strip_prefix = \"zerofrom-derive-0.1.7\",\n build_file = Label(\"@crates//crates:BUILD.zerofrom-derive-0.1.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zeroize-1.9.0\",\n sha256 = \"e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zeroize/1.9.0/download\"],\n strip_prefix = \"zeroize-1.9.0\",\n build_file = Label(\"@crates//crates:BUILD.zeroize-1.9.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zeroize_derive-1.5.0\",\n sha256 = \"3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zeroize_derive/1.5.0/download\"],\n strip_prefix = \"zeroize_derive-1.5.0\",\n build_file = Label(\"@crates//crates:BUILD.zeroize_derive-1.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerotrie-0.2.4\",\n sha256 = \"0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerotrie/0.2.4/download\"],\n strip_prefix = \"zerotrie-0.2.4\",\n build_file = Label(\"@crates//crates:BUILD.zerotrie-0.2.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerovec-0.11.6\",\n sha256 = \"90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerovec/0.11.6/download\"],\n strip_prefix = \"zerovec-0.11.6\",\n build_file = Label(\"@crates//crates:BUILD.zerovec-0.11.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerovec-derive-0.11.3\",\n sha256 = \"625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerovec-derive/0.11.3/download\"],\n strip_prefix = \"zerovec-derive-0.11.3\",\n build_file = Label(\"@crates//crates:BUILD.zerovec-derive-0.11.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zmij-1.0.23\",\n sha256 = \"29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zmij/1.0.23/download\"],\n strip_prefix = \"zmij-1.0.23\",\n build_file = Label(\"@crates//crates:BUILD.zmij-1.0.23.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zune-core-0.5.1\",\n sha256 = \"cb8a0807f7c01457d0379ba880ba6322660448ddebc890ce29bb64da71fb40f9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zune-core/0.5.1/download\"],\n strip_prefix = \"zune-core-0.5.1\",\n build_file = Label(\"@crates//crates:BUILD.zune-core-0.5.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zune-jpeg-0.5.15\",\n sha256 = \"27bc9d5b815bc103f142aa054f561d9187d191692ec7c2d1e2b4737f8dbd7296\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zune-jpeg/0.5.15/download\"],\n strip_prefix = \"zune-jpeg-0.5.15\",\n build_file = Label(\"@crates//crates:BUILD.zune-jpeg-0.5.15.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zvariant-5.13.1\",\n sha256 = \"bee2a0bcd2a907786a456fff45aaaaf54c9ba5f50b71ae9ec1a4edd200c94911\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zvariant/5.13.1/download\"],\n strip_prefix = \"zvariant-5.13.1\",\n build_file = Label(\"@crates//crates:BUILD.zvariant-5.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zvariant_derive-5.13.1\",\n sha256 = \"38a708216a18780796770bfe3f4739c7c83a3e8f789b755534bbbc06e4e23e12\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zvariant_derive/5.13.1/download\"],\n strip_prefix = \"zvariant_derive-5.13.1\",\n build_file = Label(\"@crates//crates:BUILD.zvariant_derive-5.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zvariant_utils-3.5.0\",\n sha256 = \"90cb9383f9b45290407a1258b202d3f8f01db719eb60b4e4055c6375af4fc7c7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zvariant_utils/3.5.0/download\"],\n strip_prefix = \"zvariant_utils-3.5.0\",\n build_file = Label(\"@crates//crates:BUILD.zvariant_utils-3.5.0.bazel\"),\n )\n\n return [\n struct(repo = \"crates\", is_dev_dep = False),\n struct(repo=\"crates__ansi-width-0.1.0\", is_dev_dep = False),\n struct(repo=\"crates__anyhow-1.0.104\", is_dev_dep = False),\n struct(repo=\"crates__arboard-3.6.1\", is_dev_dep = False),\n struct(repo=\"crates__argmax-0.3.1\", is_dev_dep = False),\n struct(repo=\"crates__ast-grep-core-0.39.9\", is_dev_dep = False),\n struct(repo=\"crates__async-recursion-1.1.1\", is_dev_dep = False),\n struct(repo=\"crates__async-trait-0.1.91\", is_dev_dep = False),\n struct(repo=\"crates__audiopus_sys-0.2.2\", is_dev_dep = False),\n struct(repo=\"crates__base64-0.22.1\", is_dev_dep = False),\n struct(repo=\"crates__base64-simd-0.8.0\", is_dev_dep = False),\n struct(repo=\"crates__bigdecimal-0.4.10\", is_dev_dep = False),\n struct(repo=\"crates__binary-heap-plus-0.5.0\", is_dev_dep = False),\n struct(repo=\"crates__bon-3.9.3\", is_dev_dep = False),\n struct(repo=\"crates__brush-parser-0.3.0\", is_dev_dep = False),\n struct(repo=\"crates__brush-parser-0.4.0\", is_dev_dep = False),\n struct(repo=\"crates__bstr-1.13.0\", is_dev_dep = False),\n struct(repo=\"crates__bytecount-0.6.9\", is_dev_dep = False),\n struct(repo=\"crates__bytes-1.12.1\", is_dev_dep = False),\n struct(repo=\"crates__cached-0.59.0\", is_dev_dep = False),\n struct(repo=\"crates__cfg-if-1.0.4\", is_dev_dep = False),\n struct(repo=\"crates__check_elevation-0.2.7\", is_dev_dep = False),\n struct(repo=\"crates__chrono-0.4.45\", is_dev_dep = False),\n struct(repo=\"crates__clap-4.6.4\", is_dev_dep = False),\n struct(repo=\"crates__clipboard-win-5.4.1\", is_dev_dep = False),\n struct(repo=\"crates__codesnake-0.2.1\", is_dev_dep = False),\n struct(repo=\"crates__color-print-0.3.7\", is_dev_dep = False),\n struct(repo=\"crates__command-fds-0.3.3\", is_dev_dep = False),\n struct(repo=\"crates__compare-0.1.0\", is_dev_dep = False),\n struct(repo=\"crates__core-graphics-0.25.0\", is_dev_dep = False),\n struct(repo=\"crates__dashmap-6.2.1\", is_dev_dep = False),\n struct(repo=\"crates__dns-lookup-3.0.1\", is_dev_dep = False),\n struct(repo=\"crates__enigo-0.6.1\", is_dev_dep = False),\n struct(repo=\"crates__faccess-0.2.4\", is_dev_dep = False),\n struct(repo=\"crates__fancy-regex-0.17.0\", is_dev_dep = False),\n struct(repo=\"crates__fancy-regex-0.18.0\", is_dev_dep = False),\n struct(repo=\"crates__filetime-0.2.29\", is_dev_dep = False),\n struct(repo=\"crates__flume-0.11.1\", is_dev_dep = False),\n struct(repo=\"crates__foldhash-0.2.0\", is_dev_dep = False),\n struct(repo=\"crates__fontdue-0.9.3\", is_dev_dep = False),\n struct(repo=\"crates__fs_extra-1.3.0\", is_dev_dep = False),\n struct(repo=\"crates__futures-0.3.33\", is_dev_dep = False),\n struct(repo=\"crates__getrandom-0.4.3\", is_dev_dep = False),\n struct(repo=\"crates__glob-0.3.4\", is_dev_dep = False),\n struct(repo=\"crates__globset-0.4.19\", is_dev_dep = False),\n struct(repo=\"crates__grep-cli-0.1.12\", is_dev_dep = False),\n struct(repo=\"crates__grep-matcher-0.1.9\", is_dev_dep = False),\n struct(repo=\"crates__grep-pcre2-0.1.10\", is_dev_dep = False),\n struct(repo=\"crates__grep-printer-0.3.1\", is_dev_dep = False),\n struct(repo=\"crates__grep-regex-0.1.14\", is_dev_dep = False),\n struct(repo=\"crates__grep-searcher-0.1.17\", is_dev_dep = False),\n struct(repo=\"crates__hex-0.4.3\", is_dev_dep = False),\n struct(repo=\"crates__hifijson-0.2.3\", is_dev_dep = False),\n struct(repo=\"crates__hostname-0.4.2\", is_dev_dep = False),\n struct(repo=\"crates__html-to-markdown-rs-2.30.0\", is_dev_dep = False),\n struct(repo=\"crates__icy_sixel-0.5.0\", is_dev_dep = False),\n struct(repo=\"crates__ignore-0.4.31\", is_dev_dep = False),\n struct(repo=\"crates__image-0.25.10\", is_dev_dep = False),\n struct(repo=\"crates__indicatif-0.18.6\", is_dev_dep = False),\n struct(repo=\"crates__inferno-0.12.8\", is_dev_dep = False),\n struct(repo=\"crates__inherent-1.0.14\", is_dev_dep = False),\n struct(repo=\"crates__itertools-0.14.0\", is_dev_dep = False),\n struct(repo=\"crates__jaq-core-2.2.1\", is_dev_dep = False),\n struct(repo=\"crates__jaq-json-1.1.3\", is_dev_dep = False),\n struct(repo=\"crates__jaq-std-2.1.2\", is_dev_dep = False),\n struct(repo=\"crates__jiff-0.2.35\", is_dev_dep = False),\n struct(repo=\"crates__libc-0.2.189\", is_dev_dep = False),\n struct(repo=\"crates__lscolors-0.21.0\", is_dev_dep = False),\n struct(repo=\"crates__maudio-0.1.6\", is_dev_dep = False),\n struct(repo=\"crates__memchr-2.8.3\", is_dev_dep = False),\n struct(repo=\"crates__memmap2-0.9.11\", is_dev_dep = False),\n struct(repo=\"crates__napi-3.11.0\", is_dev_dep = False),\n struct(repo=\"crates__napi-build-2.3.2\", is_dev_dep = False),\n struct(repo=\"crates__napi-derive-3.6.0\", is_dev_dep = False),\n struct(repo=\"crates__nix-0.29.0\", is_dev_dep = False),\n struct(repo=\"crates__nix-0.31.3\", is_dev_dep = False),\n struct(repo=\"crates__nom-8.0.0\", is_dev_dep = False),\n struct(repo=\"crates__normalize-path-0.2.1\", is_dev_dep = False),\n struct(repo=\"crates__notify-8.2.0\", is_dev_dep = False),\n struct(repo=\"crates__num-bigint-0.4.8\", is_dev_dep = False),\n struct(repo=\"crates__num-traits-0.2.19\", is_dev_dep = False),\n struct(repo=\"crates__onig-6.5.3\", is_dev_dep = False),\n struct(repo=\"crates__opus-0.3.1\", is_dev_dep = False),\n struct(repo=\"crates__os_display-0.1.4\", is_dev_dep = False),\n struct(repo=\"crates__os_pipe-1.2.3\", is_dev_dep = False),\n struct(repo=\"crates__parking_lot-0.12.5\", is_dev_dep = False),\n struct(repo=\"crates__parse_datetime-0.14.0\", is_dev_dep = False),\n struct(repo=\"crates__phf-0.13.1\", is_dev_dep = False),\n struct(repo=\"crates__platform-info-2.1.0\", is_dev_dep = False),\n struct(repo=\"crates__png-0.18.1\", is_dev_dep = False),\n struct(repo=\"crates__portable-pty-0.9.0\", is_dev_dep = False),\n struct(repo=\"crates__procfs-0.18.0\", is_dev_dep = False),\n struct(repo=\"crates__rand-0.10.2\", is_dev_dep = False),\n struct(repo=\"crates__rayon-1.12.0\", is_dev_dep = False),\n struct(repo=\"crates__regex-1.13.1\", is_dev_dep = False),\n struct(repo=\"crates__rlimit-0.11.0\", is_dev_dep = False),\n struct(repo=\"crates__rpds-1.2.1\", is_dev_dep = False),\n struct(repo=\"crates__rustc-hash-2.1.3\", is_dev_dep = False),\n struct(repo=\"crates__rustix-1.1.4\", is_dev_dep = False),\n struct(repo=\"crates__self_cell-1.3.0\", is_dev_dep = False),\n struct(repo=\"crates__serde-1.0.229\", is_dev_dep = False),\n struct(repo=\"crates__serde_json-1.0.151\", is_dev_dep = False),\n struct(repo=\"crates__similar-3.1.1\", is_dev_dep = False),\n struct(repo=\"crates__smallvec-1.15.2\", is_dev_dep = False),\n struct(repo=\"crates__strum-0.28.0\", is_dev_dep = False),\n struct(repo=\"crates__strum_macros-0.28.0\", is_dev_dep = False),\n struct(repo=\"crates__syntect-5.3.0\", is_dev_dep = False),\n struct(repo=\"crates__tempfile-3.27.0\", is_dev_dep = False),\n struct(repo=\"crates__terminfo-0.9.0\", is_dev_dep = False),\n struct(repo=\"crates__thiserror-2.0.19\", is_dev_dep = False),\n struct(repo=\"crates__tiktoken-rs-0.11.0\", is_dev_dep = False),\n struct(repo=\"crates__tokio-1.53.1\", is_dev_dep = False),\n struct(repo=\"crates__tokio-util-0.7.19\", is_dev_dep = False),\n struct(repo=\"crates__toml-1.1.3-spec-1.1.0\", is_dev_dep = False),\n struct(repo=\"crates__tracing-0.1.44\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-0.25.10\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-astro-next-0.1.1\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-bash-0.25.1\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-c-0.24.2\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-c-sharp-0.23.5\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-clojure-0.1.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-cmake-0.7.4\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-cpp-0.23.4\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-css-0.25.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-dart-0.2.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-diff-0.1.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-dockerfile-updated-0.2.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-elisp-1.6.1\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-elixir-0.3.5\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-erlang-0.16.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-fortran-0.6.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-go-0.25.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-graphql-0.1.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-haskell-0.23.1\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-hcl-1.1.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-html-0.23.2\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-ini-1.4.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-java-0.23.5\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-javascript-0.25.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-json-0.24.8\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-julia-0.23.1\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-just-0.2.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-kotlin-sg-0.4.1\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-lua-0.5.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-make-1.1.1\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-md-0.5.3\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-nix-0.3.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-objc-3.0.2\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-ocaml-0.24.2\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-odin-1.3.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-php-0.24.2\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-powershell-0.26.4\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-proto-0.4.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-python-0.25.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-r-1.3.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-regex-0.25.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-ruby-0.23.1\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-rust-0.24.2\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-scala-0.26.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-sequel-0.3.11\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-solidity-1.2.13\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-starlark-1.3.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-svelte-next-0.1.1\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-swift-0.7.3\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-tlaplus-1.5.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-toml-ng-0.7.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-typescript-0.23.2\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-verilog-1.0.3\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-vue-next-0.1.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-xml-0.7.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-yaml-0.7.2\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-zig-1.1.2\", is_dev_dep = False),\n struct(repo=\"crates__unicode-segmentation-1.13.3\", is_dev_dep = False),\n struct(repo=\"crates__unicode-width-0.1.14\", is_dev_dep = False),\n struct(repo=\"crates__unicode-width-0.2.2\", is_dev_dep = False),\n struct(repo=\"crates__uucore-0.0.30\", is_dev_dep = False),\n struct(repo=\"crates__uucore-0.8.0\", is_dev_dep = False),\n struct(repo=\"crates__uucore-0.9.0\", is_dev_dep = False),\n struct(repo=\"crates__uuid-1.24.0\", is_dev_dep = False),\n struct(repo=\"crates__uutils_term_grid-0.8.0\", is_dev_dep = False),\n struct(repo=\"crates__uzers-0.12.2\", is_dev_dep = False),\n struct(repo=\"crates__webrtc-0.17.2\", is_dev_dep = False),\n struct(repo=\"crates__whoami-2.1.2\", is_dev_dep = False),\n struct(repo=\"crates__windows-sys-0.59.0\", is_dev_dep = False),\n struct(repo=\"crates__windows-sys-0.61.2\", is_dev_dep = False),\n struct(repo=\"crates__winreg-0.56.0\", is_dev_dep = False),\n struct(repo=\"crates__x11rb-0.13.2\", is_dev_dep = False),\n struct(repo=\"crates__xcap-0.9.6\", is_dev_dep = False),\n struct(repo=\"crates__xkeysym-0.2.1\", is_dev_dep = False),\n struct(repo=\"crates__xxhash-rust-0.8.18\", is_dev_dep = False),\n struct(repo=\"crates__yansi-1.0.1\", is_dev_dep = False),\n struct(repo = \"crates__pretty_assertions-1.4.1\", is_dev_dep = True),\n struct(repo = \"crates__rstest-0.26.1\", is_dev_dep = True),\n ]\n", + "crates.bzl": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\"\"\"\n# `crates_repository` API\n\n- [aliases](#aliases)\n- [crate_edition](#crate_edition)\n- [crate_deps](#crate_deps)\n- [all_crate_deps](#all_crate_deps)\n- [crate_repositories](#crate_repositories)\n\n\"\"\"\n\nload(\"@bazel_tools//tools/build_defs/repo:git.bzl\", \"git_repository\")\nload(\"@bazel_tools//tools/build_defs/repo:http.bzl\", \"http_archive\")\nload(\"@bazel_tools//tools/build_defs/repo:utils.bzl\", \"maybe\")\nload(\"@bazel_skylib//lib:selects.bzl\", \"selects\")\nload(\"@rules_rust//crate_universe:defs.bzl\", \"crates_vendor_remote_repository\", \"local_crate_mirror\")\n\n###############################################################################\n# MACROS API\n###############################################################################\n\n# An identifier that represent common dependencies (unconditional).\n_COMMON_CONDITION = \"\"\n\ndef _flatten_dependency_maps(all_dependency_maps):\n \"\"\"Flatten a list of dependency maps into one dictionary.\n\n Dependency maps have the following structure:\n\n ```python\n DEPENDENCIES_MAP = {\n # The first key in the map is a Bazel package\n # name of the workspace this file is defined in.\n \"workspace_member_package\": {\n\n # Not all dependencies are supported for all platforms.\n # the condition key is the condition required to be true\n # on the host platform.\n \"condition\": {\n\n # An alias to a crate target. # The label of the crate target the\n # Aliases are only crate names. # package name refers to.\n \"package_name\": \"@full//:label\",\n }\n }\n }\n ```\n\n Args:\n all_dependency_maps (list): A list of dicts as described above\n\n Returns:\n dict: A dictionary as described above\n \"\"\"\n dependencies = {}\n\n for workspace_deps_map in all_dependency_maps:\n for pkg_name, conditional_deps_map in workspace_deps_map.items():\n if pkg_name not in dependencies:\n non_frozen_map = dict()\n for key, values in conditional_deps_map.items():\n non_frozen_map.update({key: dict(values.items())})\n dependencies.setdefault(pkg_name, non_frozen_map)\n continue\n\n for condition, deps_map in conditional_deps_map.items():\n # If the condition has not been recorded, do so and continue\n if condition not in dependencies[pkg_name]:\n dependencies[pkg_name].setdefault(condition, dict(deps_map.items()))\n continue\n\n # Alert on any miss-matched dependencies\n inconsistent_entries = []\n for crate_name, crate_label in deps_map.items():\n existing = dependencies[pkg_name][condition].get(crate_name)\n if existing and existing != crate_label:\n inconsistent_entries.append((crate_name, existing, crate_label))\n dependencies[pkg_name][condition].update({crate_name: crate_label})\n\n return dependencies\n\ndef crate_deps(deps, package_name = None):\n \"\"\"Finds the fully qualified label of the requested crates for the package where this macro is called.\n\n Args:\n deps (list): The desired list of crate targets.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()`.\n\n Returns:\n list: A list of labels to generated rust targets (str)\n \"\"\"\n\n if not deps:\n return []\n\n if package_name == None:\n package_name = native.package_name()\n\n # Join both sets of dependencies\n dependencies = _flatten_dependency_maps([\n _NORMAL_DEPENDENCIES,\n _NORMAL_DEV_DEPENDENCIES,\n _PROC_MACRO_DEPENDENCIES,\n _PROC_MACRO_DEV_DEPENDENCIES,\n _BUILD_DEPENDENCIES,\n _BUILD_PROC_MACRO_DEPENDENCIES,\n ]).pop(package_name, {})\n\n # Combine all conditional packages so we can easily index over a flat list\n # TODO: Perhaps this should actually return select statements and maintain\n # the conditionals of the dependencies\n flat_deps = {}\n for deps_set in dependencies.values():\n for crate_name, crate_label in deps_set.items():\n flat_deps.update({crate_name: crate_label})\n\n missing_crates = []\n crate_targets = []\n for crate_target in deps:\n if crate_target not in flat_deps:\n missing_crates.append(crate_target)\n else:\n crate_targets.append(flat_deps[crate_target])\n\n if missing_crates:\n fail(\"Could not find crates `{}` among dependencies of `{}`. Available dependencies were `{}`\".format(\n missing_crates,\n package_name,\n dependencies,\n ))\n\n return crate_targets\n\ndef crate_edition(package_name = None):\n \"\"\"Finds the Rust edition for the package where this macro is called.\n\n Args:\n package_name (str, optional): The package name whose edition should be\n looked up. Defaults to `native.package_name()` when unset.\n\n Returns:\n str: The Rust edition declared by the package's Cargo.toml file.\n \"\"\"\n if package_name == None:\n package_name = native.package_name()\n\n if package_name not in _CRATE_EDITIONS:\n fail(\"Tried to get crate_edition for package \" + package_name + \" but that package had no Cargo.toml file\")\n\n return _CRATE_EDITIONS[package_name]\n\ndef all_crate_deps(\n normal = False, \n normal_dev = False, \n proc_macro = False, \n proc_macro_dev = False,\n build = False,\n build_proc_macro = False,\n package_name = None):\n \"\"\"Finds the fully qualified label of all requested direct crate dependencies \\\n for the package where this macro is called.\n\n If no parameters are set, all normal dependencies are returned. Setting any one flag will\n otherwise impact the contents of the returned list.\n\n Args:\n normal (bool, optional): If True, normal dependencies are included in the\n output list.\n normal_dev (bool, optional): If True, normal dev dependencies will be\n included in the output list.\n proc_macro (bool, optional): If True, proc_macro dependencies are included\n in the output list.\n proc_macro_dev (bool, optional): If True, dev proc_macro dependencies are\n included in the output list.\n build (bool, optional): If True, build dependencies are included\n in the output list.\n build_proc_macro (bool, optional): If True, build proc_macro dependencies are\n included in the output list.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()` when unset.\n\n Returns:\n list: A list of labels to generated rust targets (str)\n \"\"\"\n\n if package_name == None:\n package_name = native.package_name()\n\n # Determine the relevant maps to use\n all_dependency_maps = []\n if normal:\n all_dependency_maps.append(_NORMAL_DEPENDENCIES)\n if normal_dev:\n all_dependency_maps.append(_NORMAL_DEV_DEPENDENCIES)\n if proc_macro:\n all_dependency_maps.append(_PROC_MACRO_DEPENDENCIES)\n if proc_macro_dev:\n all_dependency_maps.append(_PROC_MACRO_DEV_DEPENDENCIES)\n if build:\n all_dependency_maps.append(_BUILD_DEPENDENCIES)\n if build_proc_macro:\n all_dependency_maps.append(_BUILD_PROC_MACRO_DEPENDENCIES)\n\n # Default to always using normal dependencies\n if not all_dependency_maps:\n all_dependency_maps.append(_NORMAL_DEPENDENCIES)\n\n dependencies = _flatten_dependency_maps(all_dependency_maps).pop(package_name, None)\n\n if not dependencies:\n if dependencies == None:\n fail(\"Tried to get all_crate_deps for package \" + package_name + \" but that package had no Cargo.toml file\")\n else:\n return []\n\n crate_deps = list(dependencies.pop(_COMMON_CONDITION, {}).values())\n for condition, deps in dependencies.items():\n crate_deps += selects.with_or({\n tuple(_CONDITIONS[condition]): deps.values(),\n \"//conditions:default\": [],\n })\n\n return crate_deps\n\ndef aliases(\n normal = False,\n normal_dev = False,\n proc_macro = False,\n proc_macro_dev = False,\n build = False,\n build_proc_macro = False,\n package_name = None):\n \"\"\"Produces a map of Crate alias names to their original label\n\n If no dependency kinds are specified, `normal` and `proc_macro` are used by default.\n Setting any one flag will otherwise determine the contents of the returned dict.\n\n Args:\n normal (bool, optional): If True, normal dependencies are included in the\n output list.\n normal_dev (bool, optional): If True, normal dev dependencies will be\n included in the output list..\n proc_macro (bool, optional): If True, proc_macro dependencies are included\n in the output list.\n proc_macro_dev (bool, optional): If True, dev proc_macro dependencies are\n included in the output list.\n build (bool, optional): If True, build dependencies are included\n in the output list.\n build_proc_macro (bool, optional): If True, build proc_macro dependencies are\n included in the output list.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()` when unset.\n\n Returns:\n dict: The aliases of all associated packages\n \"\"\"\n if package_name == None:\n package_name = native.package_name()\n\n # Determine the relevant maps to use\n all_aliases_maps = []\n if normal:\n all_aliases_maps.append(_NORMAL_ALIASES)\n if normal_dev:\n all_aliases_maps.append(_NORMAL_DEV_ALIASES)\n if proc_macro:\n all_aliases_maps.append(_PROC_MACRO_ALIASES)\n if proc_macro_dev:\n all_aliases_maps.append(_PROC_MACRO_DEV_ALIASES)\n if build:\n all_aliases_maps.append(_BUILD_ALIASES)\n if build_proc_macro:\n all_aliases_maps.append(_BUILD_PROC_MACRO_ALIASES)\n\n # Default to always using normal aliases\n if not all_aliases_maps:\n all_aliases_maps.append(_NORMAL_ALIASES)\n all_aliases_maps.append(_PROC_MACRO_ALIASES)\n\n aliases = _flatten_dependency_maps(all_aliases_maps).pop(package_name, None)\n\n if not aliases:\n return dict()\n\n common_items = aliases.pop(_COMMON_CONDITION, {}).items()\n\n # If there are only common items in the dictionary, immediately return them\n if not len(aliases.keys()) == 1:\n return dict(common_items)\n\n # Build a single select statement where each conditional has accounted for the\n # common set of aliases.\n crate_aliases = {\"//conditions:default\": dict(common_items)}\n for condition, deps in aliases.items():\n condition_triples = _CONDITIONS[condition]\n for triple in condition_triples:\n if triple in crate_aliases:\n crate_aliases[triple].update(deps)\n else:\n crate_aliases.update({triple: dict(deps.items() + common_items)})\n\n return select(crate_aliases)\n\n###############################################################################\n# WORKSPACE MEMBER DEPS, ALIASES, AND EDITIONS\n###############################################################################\n\n_CRATE_EDITIONS = {\n \"crates/vendor/brush-builtins\": \"2024\",\n \"crates/vendor/brush-core\": \"2024\",\n \"crates/vendor/jaq\": \"2024\",\n \"crates/pi-ast\": \"2024\",\n \"crates/pi-iso\": \"2024\",\n \"crates/pi-natives\": \"2024\",\n \"crates/pi-shell\": \"2024\",\n \"crates/pi-uutils-ctx\": \"2024\",\n \"crates/pi-voice\": \"2024\",\n \"crates/pi-walker\": \"2024\",\n \"crates/pi-uu-diff\": \"2024\",\n \"crates/pi-uu-grep\": \"2024\",\n \"crates/vendor/uu-b2sum\": \"2024\",\n \"crates/vendor/uu-base32\": \"2024\",\n \"crates/vendor/uu-base64\": \"2024\",\n \"crates/vendor/uu-basename\": \"2024\",\n \"crates/vendor/uu-cat\": \"2024\",\n \"crates/vendor/uu-checksum-common\": \"2024\",\n \"crates/vendor/uu-comm\": \"2024\",\n \"crates/vendor/uu-cut\": \"2024\",\n \"crates/vendor/uu-date\": \"2024\",\n \"crates/vendor/uu-dirname\": \"2024\",\n \"crates/vendor/uu-find\": \"2024\",\n \"crates/vendor/uu-head\": \"2024\",\n \"crates/vendor/uu-hostname\": \"2024\",\n \"crates/vendor/uu-ln\": \"2024\",\n \"crates/vendor/uu-ls\": \"2024\",\n \"crates/vendor/uu-md5sum\": \"2024\",\n \"crates/vendor/uu-mkdir\": \"2024\",\n \"crates/vendor/uu-mktemp\": \"2024\",\n \"crates/vendor/uu-mv\": \"2024\",\n \"crates/vendor/uu-nproc\": \"2024\",\n \"crates/vendor/uu-paste\": \"2024\",\n \"crates/vendor/uu-printenv\": \"2024\",\n \"crates/vendor/uu-readlink\": \"2024\",\n \"crates/vendor/uu-realpath\": \"2024\",\n \"crates/vendor/uu-rm\": \"2024\",\n \"crates/vendor/uu-sed\": \"2024\",\n \"crates/vendor/uu-seq\": \"2024\",\n \"crates/vendor/uu-sha1sum\": \"2024\",\n \"crates/vendor/uu-sha224sum\": \"2024\",\n \"crates/vendor/uu-sha256sum\": \"2024\",\n \"crates/vendor/uu-sha384sum\": \"2024\",\n \"crates/vendor/uu-sha512sum\": \"2024\",\n \"crates/vendor/uu-sort\": \"2024\",\n \"crates/vendor/uu-stat\": \"2024\",\n \"crates/vendor/uu-tac\": \"2024\",\n \"crates/vendor/uu-tail\": \"2024\",\n \"crates/vendor/uu-tee\": \"2024\",\n \"crates/vendor/uu-touch\": \"2024\",\n \"crates/vendor/uu-tr\": \"2024\",\n \"crates/vendor/uu-truncate\": \"2024\",\n \"crates/vendor/uu-uname\": \"2024\",\n \"crates/vendor/uu-uniq\": \"2024\",\n \"crates/vendor/uu-wc\": \"2024\",\n \"crates/vendor/uu-whoami\": \"2024\",\n \"crates/vendor/uu-xargs\": \"2024\",\n \"crates/vendor/uu-yes\": \"2024\",\n}\n\n_NORMAL_DEPENDENCIES = {\n \"crates/vendor/brush-builtins\": {\n _COMMON_CONDITION: {\n \"brush-parser\": Label(\"//brush-parser-0.4.0\"),\n \"cfg-if\": Label(\"//cfg-if-1.0.4\"),\n \"chrono\": Label(\"//chrono-0.4.45\"),\n \"clap\": Label(\"//clap-4.6.4\"),\n \"fancy-regex\": Label(\"//fancy-regex-0.17.0\"),\n \"futures\": Label(\"//futures-0.3.33\"),\n \"itertools\": Label(\"//itertools-0.14.0\"),\n \"strum\": Label(\"//strum-0.28.0\"),\n \"thiserror\": Label(\"//thiserror-2.0.19\"),\n \"tracing\": Label(\"//tracing-0.1.44\"),\n },\n \"cfg(any(target_os = \\\"linux\\\", target_os = \\\"android\\\"))\": {\n \"procfs\": Label(\"//procfs-0.18.0\"),\n },\n \"cfg(any(unix, windows))\": {\n \"tokio\": Label(\"//tokio-1.53.1\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n \"cfg(target_family = \\\"wasm\\\")\": {\n \"tokio\": Label(\"//tokio-1.53.1\"),\n },\n \"cfg(unix)\": {\n \"nix\": Label(\"//nix-0.31.3\"),\n \"rlimit\": Label(\"//rlimit-0.11.0\"),\n },\n },\n \"crates/vendor/brush-core\": {\n _COMMON_CONDITION: {\n \"bon\": Label(\"//bon-3.9.3\"),\n \"brush-parser\": Label(\"//brush-parser-0.4.0\"),\n \"cached\": Label(\"//cached-0.59.0\"),\n \"cfg-if\": Label(\"//cfg-if-1.0.4\"),\n \"chrono\": Label(\"//chrono-0.4.45\"),\n \"clap\": Label(\"//clap-4.6.4\"),\n \"color-print\": Label(\"//color-print-0.3.7\"),\n \"fancy-regex\": Label(\"//fancy-regex-0.17.0\"),\n \"futures\": Label(\"//futures-0.3.33\"),\n \"itertools\": Label(\"//itertools-0.14.0\"),\n \"normalize-path\": Label(\"//normalize-path-0.2.1\"),\n \"rand\": Label(\"//rand-0.10.2\"),\n \"rpds\": Label(\"//rpds-1.2.1\"),\n \"strum\": Label(\"//strum-0.28.0\"),\n \"thiserror\": Label(\"//thiserror-2.0.19\"),\n \"tokio-util\": Label(\"//tokio-util-0.7.19\"),\n \"tracing\": Label(\"//tracing-0.1.44\"),\n },\n \"cfg(any(unix, windows))\": {\n \"hostname\": Label(\"//hostname-0.4.2\"),\n \"tokio\": Label(\"//tokio-1.53.1\"),\n },\n \"cfg(target_family = \\\"wasm\\\")\": {\n \"tokio\": Label(\"//tokio-1.53.1\"),\n },\n \"cfg(unix)\": {\n \"command-fds\": Label(\"//command-fds-0.3.3\"),\n \"libc\": Label(\"//libc-0.2.189\"),\n \"nix\": Label(\"//nix-0.31.3\"),\n \"terminfo\": Label(\"//terminfo-0.9.0\"),\n \"uzers\": Label(\"//uzers-0.12.2\"),\n },\n \"cfg(windows)\": {\n \"check_elevation\": Label(\"//check_elevation-0.2.7\"),\n \"whoami\": Label(\"//whoami-2.1.2\"),\n \"windows-sys\": Label(\"//windows-sys-0.59.0\"),\n },\n \"wasm32-unknown-unknown\": {\n \"getrandom\": Label(\"//getrandom-0.4.3\"),\n \"uuid\": Label(\"//uuid-1.24.0\"),\n },\n },\n \"crates/vendor/jaq\": {\n _COMMON_CONDITION: {\n \"codesnake\": Label(\"//codesnake-0.2.1\"),\n \"hifijson\": Label(\"//hifijson-0.2.3\"),\n \"jaq-core\": Label(\"//jaq-core-2.2.1\"),\n \"jaq-json\": Label(\"//jaq-json-1.1.3\"),\n \"jaq-std\": Label(\"//jaq-std-2.1.2\"),\n \"memmap2\": Label(\"//memmap2-0.9.11\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n \"unicode-width\": Label(\"//unicode-width-0.1.14\"),\n \"yansi\": Label(\"//yansi-1.0.1\"),\n },\n },\n \"crates/pi-ast\": {\n _COMMON_CONDITION: {\n \"anyhow\": Label(\"//anyhow-1.0.104\"),\n \"ast-grep-core\": Label(\"//ast-grep-core-0.39.9\"),\n \"globset\": Label(\"//globset-0.4.19\"),\n \"ignore\": Label(\"//ignore-0.4.31\"),\n \"phf\": Label(\"//phf-0.13.1\"),\n \"serde\": Label(\"//serde-1.0.229\"),\n \"tree-sitter\": Label(\"//tree-sitter-0.25.10\"),\n \"tree_sitter_astro\": Label(\"//tree-sitter-astro-next-0.1.1\"),\n \"tree-sitter-bash\": Label(\"//tree-sitter-bash-0.25.1\"),\n \"tree-sitter-c\": Label(\"//tree-sitter-c-0.24.2\"),\n \"tree-sitter-c-sharp\": Label(\"//tree-sitter-c-sharp-0.23.5\"),\n \"tree-sitter-clojure\": Label(\"//tree-sitter-clojure-0.1.0\"),\n \"tree-sitter-cmake\": Label(\"//tree-sitter-cmake-0.7.4\"),\n \"tree-sitter-cpp\": Label(\"//tree-sitter-cpp-0.23.4\"),\n \"tree-sitter-css\": Label(\"//tree-sitter-css-0.25.0\"),\n \"tree-sitter-dart\": Label(\"//tree-sitter-dart-0.2.0\"),\n \"tree-sitter-diff\": Label(\"//tree-sitter-diff-0.1.0\"),\n \"tree_sitter_dockerfile\": Label(\"//tree-sitter-dockerfile-updated-0.2.0\"),\n \"tree-sitter-elisp\": Label(\"//tree-sitter-elisp-1.6.1\"),\n \"tree-sitter-elixir\": Label(\"//tree-sitter-elixir-0.3.5\"),\n \"tree-sitter-erlang\": Label(\"//tree-sitter-erlang-0.16.0\"),\n \"tree-sitter-fortran\": Label(\"//tree-sitter-fortran-0.6.0\"),\n \"tree-sitter-go\": Label(\"//tree-sitter-go-0.25.0\"),\n \"tree-sitter-graphql\": Label(\"//tree-sitter-graphql-0.1.0\"),\n \"tree-sitter-haskell\": Label(\"//tree-sitter-haskell-0.23.1\"),\n \"tree-sitter-hcl\": Label(\"//tree-sitter-hcl-1.1.0\"),\n \"tree-sitter-html\": Label(\"//tree-sitter-html-0.23.2\"),\n \"tree-sitter-ini\": Label(\"//tree-sitter-ini-1.4.0\"),\n \"tree-sitter-java\": Label(\"//tree-sitter-java-0.23.5\"),\n \"tree-sitter-javascript\": Label(\"//tree-sitter-javascript-0.25.0\"),\n \"tree-sitter-json\": Label(\"//tree-sitter-json-0.24.8\"),\n \"tree-sitter-julia\": Label(\"//tree-sitter-julia-0.23.1\"),\n \"tree-sitter-just\": Label(\"//tree-sitter-just-0.2.0\"),\n \"tree_sitter_kotlin\": Label(\"//tree-sitter-kotlin-sg-0.4.1\"),\n \"tree-sitter-lua\": Label(\"//tree-sitter-lua-0.5.0\"),\n \"tree-sitter-make\": Label(\"//tree-sitter-make-1.1.1\"),\n \"tree-sitter-md\": Label(\"//tree-sitter-md-0.5.3\"),\n \"tree-sitter-nix\": Label(\"//tree-sitter-nix-0.3.0\"),\n \"tree-sitter-objc\": Label(\"//tree-sitter-objc-3.0.2\"),\n \"tree-sitter-ocaml\": Label(\"//tree-sitter-ocaml-0.24.2\"),\n \"tree-sitter-odin\": Label(\"//tree-sitter-odin-1.3.0\"),\n \"tree-sitter-php\": Label(\"//tree-sitter-php-0.24.2\"),\n \"tree-sitter-powershell\": Label(\"//tree-sitter-powershell-0.26.4\"),\n \"tree-sitter-proto\": Label(\"//tree-sitter-proto-0.4.0\"),\n \"tree-sitter-python\": Label(\"//tree-sitter-python-0.25.0\"),\n \"tree-sitter-r\": Label(\"//tree-sitter-r-1.3.0\"),\n \"tree-sitter-regex\": Label(\"//tree-sitter-regex-0.25.0\"),\n \"tree-sitter-ruby\": Label(\"//tree-sitter-ruby-0.23.1\"),\n \"tree-sitter-rust\": Label(\"//tree-sitter-rust-0.24.2\"),\n \"tree-sitter-scala\": Label(\"//tree-sitter-scala-0.26.0\"),\n \"tree_sitter_sql\": Label(\"//tree-sitter-sequel-0.3.11\"),\n \"tree-sitter-solidity\": Label(\"//tree-sitter-solidity-1.2.13\"),\n \"tree-sitter-starlark\": Label(\"//tree-sitter-starlark-1.3.0\"),\n \"tree_sitter_svelte\": Label(\"//tree-sitter-svelte-next-0.1.1\"),\n \"tree-sitter-swift\": Label(\"//tree-sitter-swift-0.7.3\"),\n \"tree-sitter-tlaplus\": Label(\"//tree-sitter-tlaplus-1.5.0\"),\n \"tree-sitter-toml-ng\": Label(\"//tree-sitter-toml-ng-0.7.0\"),\n \"tree-sitter-typescript\": Label(\"//tree-sitter-typescript-0.23.2\"),\n \"tree-sitter-verilog\": Label(\"//tree-sitter-verilog-1.0.3\"),\n \"tree_sitter_vue\": Label(\"//tree-sitter-vue-next-0.1.0\"),\n \"tree-sitter-xml\": Label(\"//tree-sitter-xml-0.7.0\"),\n \"tree-sitter-yaml\": Label(\"//tree-sitter-yaml-0.7.2\"),\n \"tree-sitter-zig\": Label(\"//tree-sitter-zig-1.1.2\"),\n },\n },\n \"crates/pi-iso\": {\n _COMMON_CONDITION: {\n \"similar\": Label(\"//similar-3.1.1\"),\n \"tokio\": Label(\"//tokio-1.53.1\"),\n },\n \"cfg(target_os = \\\"linux\\\")\": {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n },\n \"cfg(unix)\": {\n \"libc\": Label(\"//libc-0.2.189\"),\n },\n \"cfg(windows)\": {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"windows-sys\": Label(\"//windows-sys-0.61.2\"),\n },\n },\n \"crates/pi-natives\": {\n _COMMON_CONDITION: {\n \"anyhow\": Label(\"//anyhow-1.0.104\"),\n \"arboard\": Label(\"//arboard-3.6.1\"),\n \"ast-grep-core\": Label(\"//ast-grep-core-0.39.9\"),\n \"base64\": Label(\"//base64-0.22.1\"),\n \"clap\": Label(\"//clap-4.6.4\"),\n \"flume\": Label(\"//flume-0.11.1\"),\n \"fontdue\": Label(\"//fontdue-0.9.3\"),\n \"globset\": Label(\"//globset-0.4.19\"),\n \"grep-matcher\": Label(\"//grep-matcher-0.1.9\"),\n \"grep-pcre2\": Label(\"//grep-pcre2-0.1.10\"),\n \"grep-regex\": Label(\"//grep-regex-0.1.14\"),\n \"grep-searcher\": Label(\"//grep-searcher-0.1.17\"),\n \"html-to-markdown-rs\": Label(\"//html-to-markdown-rs-2.30.0\"),\n \"icy_sixel\": Label(\"//icy_sixel-0.5.0\"),\n \"ignore\": Label(\"//ignore-0.4.31\"),\n \"image\": Label(\"//image-0.25.10\"),\n \"inferno\": Label(\"//inferno-0.12.8\"),\n \"napi\": Label(\"//napi-3.12.0\"),\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"phf\": Label(\"//phf-0.13.1\"),\n \"png\": Label(\"//png-0.18.1\"),\n \"portable-pty\": Label(\"//portable-pty-0.9.0\"),\n \"rayon\": Label(\"//rayon-1.12.0\"),\n \"regex\": Label(\"//regex-1.13.1\"),\n \"serde\": Label(\"//serde-1.0.229\"),\n \"serde_json\": Label(\"//serde_json-1.0.151\"),\n \"smallvec\": Label(\"//smallvec-1.15.2\"),\n \"syntect\": Label(\"//syntect-5.3.0\"),\n \"tiktoken-rs\": Label(\"//tiktoken-rs-0.11.0\"),\n \"tokio\": Label(\"//tokio-1.53.1\"),\n \"tokio-util\": Label(\"//tokio-util-0.7.19\"),\n \"toml\": Label(\"//toml-1.1.3+spec-1.1.0\"),\n \"unicode-segmentation\": Label(\"//unicode-segmentation-1.13.3\"),\n \"unicode-width\": Label(\"//unicode-width-0.2.2\"),\n \"xxhash-rust\": Label(\"//xxhash-rust-0.8.18\"),\n },\n \"cfg(any(target_os = \\\"macos\\\", target_os = \\\"windows\\\"))\": {\n \"enigo\": Label(\"//enigo-0.6.1\"),\n \"xcap\": Label(\"//xcap-0.9.6\"),\n },\n \"cfg(target_os = \\\"linux\\\")\": {\n \"x11rb\": Label(\"//x11rb-0.13.2\"),\n \"xkeysym\": Label(\"//xkeysym-0.2.1\"),\n },\n \"cfg(target_os = \\\"macos\\\")\": {\n \"core-graphics\": Label(\"//core-graphics-0.25.0\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n \"cfg(unix)\": {\n \"libc\": Label(\"//libc-0.2.189\"),\n },\n \"cfg(windows)\": {\n \"clipboard-win\": Label(\"//clipboard-win-5.4.1\"),\n \"windows-sys\": Label(\"//windows-sys-0.61.2\"),\n \"winreg\": Label(\"//winreg-0.56.0\"),\n },\n },\n \"crates/pi-shell\": {\n _COMMON_CONDITION: {\n \"anyhow\": Label(\"//anyhow-1.0.104\"),\n \"brush-parser\": Label(\"//brush-parser-0.3.0\"),\n \"bytes\": Label(\"//bytes-1.12.1\"),\n \"clap\": Label(\"//clap-4.6.4\"),\n \"flume\": Label(\"//flume-0.11.1\"),\n \"globset\": Label(\"//globset-0.4.19\"),\n \"ignore\": Label(\"//ignore-0.4.31\"),\n \"jiff\": Label(\"//jiff-0.2.35\"),\n \"memchr\": Label(\"//memchr-2.8.3\"),\n \"os_pipe\": Label(\"//os_pipe-1.2.3\"),\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"regex\": Label(\"//regex-1.13.1\"),\n \"serde\": Label(\"//serde-1.0.229\"),\n \"serde_json\": Label(\"//serde_json-1.0.151\"),\n \"tokio\": Label(\"//tokio-1.53.1\"),\n \"tokio-util\": Label(\"//tokio-util-0.7.19\"),\n \"toml\": Label(\"//toml-1.1.3+spec-1.1.0\"),\n \"xxhash-rust\": Label(\"//xxhash-rust-0.8.18\"),\n },\n \"cfg(unix)\": {\n \"libc\": Label(\"//libc-0.2.189\"),\n },\n \"cfg(windows)\": {\n \"smallvec\": Label(\"//smallvec-1.15.2\"),\n \"windows-sys\": Label(\"//windows-sys-0.61.2\"),\n \"winreg\": Label(\"//winreg-0.56.0\"),\n },\n },\n \"crates/pi-uutils-ctx\": {\n \"cfg(unix)\": {\n \"libc\": Label(\"//libc-0.2.189\"),\n },\n },\n \"crates/pi-voice\": {\n _COMMON_CONDITION: {\n \"audiopus_sys\": Label(\"//audiopus_sys-0.2.2\"),\n \"bytes\": Label(\"//bytes-1.12.1\"),\n \"flume\": Label(\"//flume-0.11.1\"),\n \"maudio\": Label(\"//maudio-0.1.6\"),\n \"opus\": Label(\"//opus-0.3.1\"),\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"tokio\": Label(\"//tokio-1.53.1\"),\n \"webrtc\": Label(\"//webrtc-0.17.2\"),\n },\n },\n \"crates/pi-walker\": {\n _COMMON_CONDITION: {\n \"dashmap\": Label(\"//dashmap-6.2.1\"),\n \"globset\": Label(\"//globset-0.4.19\"),\n \"ignore\": Label(\"//ignore-0.4.31\"),\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"rayon\": Label(\"//rayon-1.12.0\"),\n },\n \"cfg(unix)\": {\n \"libc\": Label(\"//libc-0.2.189\"),\n },\n \"cfg(windows)\": {\n \"windows-sys\": Label(\"//windows-sys-0.61.2\"),\n },\n },\n \"crates/pi-uu-diff\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"similar\": Label(\"//similar-3.1.1\"),\n },\n },\n \"crates/pi-uu-grep\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"globset\": Label(\"//globset-0.4.19\"),\n \"grep-cli\": Label(\"//grep-cli-0.1.12\"),\n \"grep-matcher\": Label(\"//grep-matcher-0.1.9\"),\n \"grep-pcre2\": Label(\"//grep-pcre2-0.1.10\"),\n \"grep-printer\": Label(\"//grep-printer-0.3.1\"),\n \"grep-regex\": Label(\"//grep-regex-0.1.14\"),\n \"grep-searcher\": Label(\"//grep-searcher-0.1.17\"),\n \"ignore\": Label(\"//ignore-0.4.31\"),\n \"serde_json\": Label(\"//serde_json-1.0.151\"),\n },\n },\n \"crates/vendor/uu-b2sum\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-base32\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-base64\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-basename\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-cat\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"memchr\": Label(\"//memchr-2.8.3\"),\n \"thiserror\": Label(\"//thiserror-2.0.19\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-checksum-common\": {\n _COMMON_CONDITION: {\n \"base64-simd\": Label(\"//base64-simd-0.8.0\"),\n \"clap\": Label(\"//clap-4.6.4\"),\n \"hex\": Label(\"//hex-0.4.3\"),\n \"os_display\": Label(\"//os_display-0.1.4\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-comm\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-cut\": {\n _COMMON_CONDITION: {\n \"bstr\": Label(\"//bstr-1.13.0\"),\n \"clap\": Label(\"//clap-4.6.4\"),\n \"memchr\": Label(\"//memchr-2.8.3\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-date\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"jiff\": Label(\"//jiff-0.2.35\"),\n \"parse_datetime\": Label(\"//parse_datetime-0.14.0\"),\n \"regex\": Label(\"//regex-1.13.1\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n \"cfg(unix)\": {\n \"rustix\": Label(\"//rustix-1.1.4\"),\n },\n },\n \"crates/vendor/uu-dirname\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-find\": {\n _COMMON_CONDITION: {\n \"argmax\": Label(\"//argmax-0.3.1\"),\n \"chrono\": Label(\"//chrono-0.4.45\"),\n \"clap\": Label(\"//clap-4.6.4\"),\n \"faccess\": Label(\"//faccess-0.2.4\"),\n \"nix\": Label(\"//nix-0.29.0\"),\n \"onig\": Label(\"//onig-6.5.3\"),\n \"regex\": Label(\"//regex-1.13.1\"),\n \"uucore\": Label(\"//uucore-0.0.30\"),\n },\n },\n \"crates/vendor/uu-head\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"memchr\": Label(\"//memchr-2.8.3\"),\n \"thiserror\": Label(\"//thiserror-2.0.19\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-hostname\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"hostname\": Label(\"//hostname-0.4.2\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n \"cfg(any(target_os = \\\"freebsd\\\", target_os = \\\"openbsd\\\"))\": {\n \"dns-lookup\": Label(\"//dns-lookup-3.0.1\"),\n },\n \"cfg(target_os = \\\"windows\\\")\": {\n \"windows-sys\": Label(\"//windows-sys-0.61.2\"),\n },\n },\n \"crates/vendor/uu-ln\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"thiserror\": Label(\"//thiserror-2.0.19\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-ls\": {\n _COMMON_CONDITION: {\n \"ansi-width\": Label(\"//ansi-width-0.1.0\"),\n \"clap\": Label(\"//clap-4.6.4\"),\n \"glob\": Label(\"//glob-0.3.4\"),\n \"lscolors\": Label(\"//lscolors-0.21.0\"),\n \"rustc-hash\": Label(\"//rustc-hash-2.1.3\"),\n \"thiserror\": Label(\"//thiserror-2.0.19\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n \"uutils_term_grid\": Label(\"//uutils_term_grid-0.8.0\"),\n },\n \"cfg(not(target_os = \\\"wasi\\\"))\": {\n \"hostname\": Label(\"//hostname-0.4.2\"),\n },\n },\n \"crates/vendor/uu-md5sum\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-mkdir\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n \"cfg(unix)\": {\n \"rustix\": Label(\"//rustix-1.1.4\"),\n },\n },\n \"crates/vendor/uu-mktemp\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"rand\": Label(\"//rand-0.10.2\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n \"thiserror\": Label(\"//thiserror-2.0.19\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-mv\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"fs_extra\": Label(\"//fs_extra-1.3.0\"),\n \"indicatif\": Label(\"//indicatif-0.18.6\"),\n \"libc\": Label(\"//libc-0.2.189\"),\n \"rustc-hash\": Label(\"//rustc-hash-2.1.3\"),\n \"thiserror\": Label(\"//thiserror-2.0.19\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n \"cfg(windows)\": {\n \"windows-sys\": Label(\"//windows-sys-0.61.2\"),\n },\n },\n \"crates/vendor/uu-nproc\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"libc\": Label(\"//libc-0.2.189\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-paste\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-printenv\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-readlink\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-realpath\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-rm\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"indicatif\": Label(\"//indicatif-0.18.6\"),\n \"thiserror\": Label(\"//thiserror-2.0.19\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n \"cfg(unix)\": {\n \"libc\": Label(\"//libc-0.2.189\"),\n },\n \"cfg(windows)\": {\n \"windows-sys\": Label(\"//windows-sys-0.61.2\"),\n },\n },\n \"crates/vendor/uu-sed\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"fancy-regex\": Label(\"//fancy-regex-0.18.0\"),\n \"memchr\": Label(\"//memchr-2.8.3\"),\n \"regex\": Label(\"//regex-1.13.1\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n \"uucore\": Label(\"//uucore-0.9.0\"),\n },\n \"cfg(unix)\": {\n \"memmap2\": Label(\"//memmap2-0.9.11\"),\n },\n },\n \"crates/vendor/uu-seq\": {\n _COMMON_CONDITION: {\n \"bigdecimal\": Label(\"//bigdecimal-0.4.10\"),\n \"clap\": Label(\"//clap-4.6.4\"),\n \"num-bigint\": Label(\"//num-bigint-0.4.8\"),\n \"num-traits\": Label(\"//num-traits-0.2.19\"),\n \"thiserror\": Label(\"//thiserror-2.0.19\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-sha1sum\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-sha224sum\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-sha256sum\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-sha384sum\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-sha512sum\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-sort\": {\n _COMMON_CONDITION: {\n \"bigdecimal\": Label(\"//bigdecimal-0.4.10\"),\n \"binary-heap-plus\": Label(\"//binary-heap-plus-0.5.0\"),\n \"clap\": Label(\"//clap-4.6.4\"),\n \"compare\": Label(\"//compare-0.1.0\"),\n \"flume\": Label(\"//flume-0.11.1\"),\n \"foldhash\": Label(\"//foldhash-0.2.0\"),\n \"itertools\": Label(\"//itertools-0.14.0\"),\n \"memchr\": Label(\"//memchr-2.8.3\"),\n \"rand\": Label(\"//rand-0.10.2\"),\n \"rayon\": Label(\"//rayon-1.12.0\"),\n \"self_cell\": Label(\"//self_cell-1.3.0\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n \"thiserror\": Label(\"//thiserror-2.0.19\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n \"cfg(unix)\": {\n \"nix\": Label(\"//nix-0.31.3\"),\n },\n },\n \"crates/vendor/uu-stat\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"thiserror\": Label(\"//thiserror-2.0.19\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n \"cfg(windows)\": {\n \"windows-sys\": Label(\"//windows-sys-0.61.2\"),\n },\n },\n \"crates/vendor/uu-tac\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"memchr\": Label(\"//memchr-2.8.3\"),\n \"memmap2\": Label(\"//memmap2-0.9.11\"),\n \"regex\": Label(\"//regex-1.13.1\"),\n \"thiserror\": Label(\"//thiserror-2.0.19\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-tail\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"memchr\": Label(\"//memchr-2.8.3\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n \"cfg(not(target_os = \\\"wasi\\\"))\": {\n \"libc\": Label(\"//libc-0.2.189\"),\n \"notify\": Label(\"//notify-8.2.0\"),\n },\n \"cfg(unix)\": {\n \"rustix\": Label(\"//rustix-1.1.4\"),\n },\n \"cfg(windows)\": {\n \"windows-sys\": Label(\"//windows-sys-0.61.2\"),\n },\n },\n \"crates/vendor/uu-tee\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-touch\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"filetime\": Label(\"//filetime-0.2.29\"),\n \"jiff\": Label(\"//jiff-0.2.35\"),\n \"parse_datetime\": Label(\"//parse_datetime-0.14.0\"),\n \"thiserror\": Label(\"//thiserror-2.0.19\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n \"cfg(unix)\": {\n \"libc\": Label(\"//libc-0.2.189\"),\n \"rustix\": Label(\"//rustix-1.1.4\"),\n },\n \"cfg(windows)\": {\n \"windows-sys\": Label(\"//windows-sys-0.61.2\"),\n },\n },\n \"crates/vendor/uu-tr\": {\n _COMMON_CONDITION: {\n \"bytecount\": Label(\"//bytecount-0.6.9\"),\n \"clap\": Label(\"//clap-4.6.4\"),\n \"nom\": Label(\"//nom-8.0.0\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-truncate\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-uname\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"platform-info\": Label(\"//platform-info-2.1.0\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-uniq\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n \"crates/vendor/uu-wc\": {\n _COMMON_CONDITION: {\n \"bytecount\": Label(\"//bytecount-0.6.9\"),\n \"clap\": Label(\"//clap-4.6.4\"),\n \"thiserror\": Label(\"//thiserror-2.0.19\"),\n \"unicode-width\": Label(\"//unicode-width-0.2.2\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n \"cfg(unix)\": {\n \"libc\": Label(\"//libc-0.2.189\"),\n \"rustix\": Label(\"//rustix-1.1.4\"),\n },\n },\n \"crates/vendor/uu-whoami\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n \"cfg(target_os = \\\"windows\\\")\": {\n \"windows-sys\": Label(\"//windows-sys-0.61.2\"),\n },\n },\n \"crates/vendor/uu-xargs\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"libc\": Label(\"//libc-0.2.189\"),\n },\n },\n \"crates/vendor/uu-yes\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"//clap-4.6.4\"),\n \"itertools\": Label(\"//itertools-0.14.0\"),\n \"uucore\": Label(\"//uucore-0.8.0\"),\n },\n },\n}\n\n\n_NORMAL_ALIASES = {\n \"crates/vendor/brush-builtins\": {\n _COMMON_CONDITION: {\n },\n \"cfg(any(target_os = \\\"linux\\\", target_os = \\\"android\\\"))\": {\n },\n \"cfg(any(unix, windows))\": {\n },\n \"cfg(target_family = \\\"wasm\\\")\": {\n },\n \"cfg(unix)\": {\n },\n },\n \"crates/vendor/brush-core\": {\n _COMMON_CONDITION: {\n },\n \"cfg(any(unix, windows))\": {\n },\n \"cfg(target_family = \\\"wasm\\\")\": {\n },\n \"cfg(unix)\": {\n },\n \"cfg(windows)\": {\n },\n \"wasm32-unknown-unknown\": {\n },\n },\n \"crates/vendor/jaq\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/pi-ast\": {\n _COMMON_CONDITION: {\n Label(\"//tree-sitter-astro-next-0.1.1\"): \"tree_sitter_astro\",\n Label(\"//tree-sitter-dockerfile-updated-0.2.0\"): \"tree_sitter_dockerfile\",\n Label(\"//tree-sitter-kotlin-sg-0.4.1\"): \"tree_sitter_kotlin\",\n Label(\"//tree-sitter-sequel-0.3.11\"): \"tree_sitter_sql\",\n Label(\"//tree-sitter-svelte-next-0.1.1\"): \"tree_sitter_svelte\",\n Label(\"//tree-sitter-vue-next-0.1.0\"): \"tree_sitter_vue\",\n },\n },\n \"crates/pi-iso\": {\n _COMMON_CONDITION: {\n },\n \"cfg(target_os = \\\"linux\\\")\": {\n },\n \"cfg(unix)\": {\n },\n \"cfg(windows)\": {\n },\n },\n \"crates/pi-natives\": {\n _COMMON_CONDITION: {\n },\n \"cfg(any(target_os = \\\"macos\\\", target_os = \\\"windows\\\"))\": {\n },\n \"cfg(target_os = \\\"linux\\\")\": {\n },\n \"cfg(target_os = \\\"macos\\\")\": {\n },\n \"cfg(unix)\": {\n },\n \"cfg(windows)\": {\n },\n },\n \"crates/pi-shell\": {\n _COMMON_CONDITION: {\n },\n \"cfg(unix)\": {\n },\n \"cfg(windows)\": {\n },\n },\n \"crates/pi-uutils-ctx\": {\n \"cfg(unix)\": {\n },\n },\n \"crates/pi-voice\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/pi-walker\": {\n _COMMON_CONDITION: {\n },\n \"cfg(unix)\": {\n },\n \"cfg(windows)\": {\n },\n },\n \"crates/pi-uu-diff\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/pi-uu-grep\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-b2sum\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-base32\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-base64\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-basename\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-cat\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-checksum-common\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-comm\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-cut\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-date\": {\n _COMMON_CONDITION: {\n },\n \"cfg(unix)\": {\n },\n },\n \"crates/vendor/uu-dirname\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-find\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-head\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-hostname\": {\n _COMMON_CONDITION: {\n },\n \"cfg(any(target_os = \\\"freebsd\\\", target_os = \\\"openbsd\\\"))\": {\n },\n \"cfg(target_os = \\\"windows\\\")\": {\n },\n },\n \"crates/vendor/uu-ln\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-ls\": {\n _COMMON_CONDITION: {\n },\n \"cfg(not(target_os = \\\"wasi\\\"))\": {\n },\n },\n \"crates/vendor/uu-md5sum\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-mkdir\": {\n _COMMON_CONDITION: {\n },\n \"cfg(unix)\": {\n },\n },\n \"crates/vendor/uu-mktemp\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-mv\": {\n _COMMON_CONDITION: {\n },\n \"cfg(windows)\": {\n },\n },\n \"crates/vendor/uu-nproc\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-paste\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-printenv\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-readlink\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-realpath\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-rm\": {\n _COMMON_CONDITION: {\n },\n \"cfg(unix)\": {\n },\n \"cfg(windows)\": {\n },\n },\n \"crates/vendor/uu-sed\": {\n _COMMON_CONDITION: {\n },\n \"cfg(unix)\": {\n },\n },\n \"crates/vendor/uu-seq\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-sha1sum\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-sha224sum\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-sha256sum\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-sha384sum\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-sha512sum\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-sort\": {\n _COMMON_CONDITION: {\n },\n \"cfg(unix)\": {\n },\n },\n \"crates/vendor/uu-stat\": {\n _COMMON_CONDITION: {\n },\n \"cfg(windows)\": {\n },\n },\n \"crates/vendor/uu-tac\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-tail\": {\n _COMMON_CONDITION: {\n },\n \"cfg(not(target_os = \\\"wasi\\\"))\": {\n },\n \"cfg(unix)\": {\n },\n \"cfg(windows)\": {\n },\n },\n \"crates/vendor/uu-tee\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-touch\": {\n _COMMON_CONDITION: {\n },\n \"cfg(unix)\": {\n },\n \"cfg(windows)\": {\n },\n },\n \"crates/vendor/uu-tr\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-truncate\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-uname\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-uniq\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-wc\": {\n _COMMON_CONDITION: {\n },\n \"cfg(unix)\": {\n },\n },\n \"crates/vendor/uu-whoami\": {\n _COMMON_CONDITION: {\n },\n \"cfg(target_os = \\\"windows\\\")\": {\n },\n },\n \"crates/vendor/uu-xargs\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-yes\": {\n _COMMON_CONDITION: {\n },\n },\n}\n\n\n_NORMAL_DEV_DEPENDENCIES = {\n \"crates/vendor/brush-builtins\": {\n _COMMON_CONDITION: {\n \"anyhow\": Label(\"//anyhow-1.0.104\"),\n \"pretty_assertions\": Label(\"//pretty_assertions-1.4.1\"),\n },\n },\n \"crates/vendor/brush-core\": {\n _COMMON_CONDITION: {\n \"anyhow\": Label(\"//anyhow-1.0.104\"),\n \"pretty_assertions\": Label(\"//pretty_assertions-1.4.1\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n },\n \"crates/vendor/jaq\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n },\n },\n \"crates/pi-ast\": {\n },\n \"crates/pi-iso\": {\n },\n \"crates/pi-natives\": {\n },\n \"crates/pi-shell\": {\n _COMMON_CONDITION: {\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n },\n \"crates/pi-uutils-ctx\": {\n },\n \"crates/pi-voice\": {\n },\n \"crates/pi-walker\": {\n },\n \"crates/pi-uu-diff\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n },\n \"crates/pi-uu-grep\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n },\n },\n \"crates/vendor/uu-b2sum\": {\n },\n \"crates/vendor/uu-base32\": {\n },\n \"crates/vendor/uu-base64\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n },\n \"crates/vendor/uu-basename\": {\n },\n \"crates/vendor/uu-cat\": {\n },\n \"crates/vendor/uu-checksum-common\": {\n },\n \"crates/vendor/uu-comm\": {\n },\n \"crates/vendor/uu-cut\": {\n },\n \"crates/vendor/uu-date\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n },\n \"crates/vendor/uu-dirname\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n },\n },\n \"crates/vendor/uu-find\": {\n _COMMON_CONDITION: {\n \"filetime\": Label(\"//filetime-0.2.29\"),\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n },\n \"crates/vendor/uu-head\": {\n },\n \"crates/vendor/uu-hostname\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n },\n },\n \"crates/vendor/uu-ln\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n },\n \"crates/vendor/uu-ls\": {\n },\n \"crates/vendor/uu-md5sum\": {\n },\n \"crates/vendor/uu-mkdir\": {\n },\n \"crates/vendor/uu-mktemp\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n },\n },\n \"crates/vendor/uu-mv\": {\n },\n \"crates/vendor/uu-nproc\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n },\n },\n \"crates/vendor/uu-paste\": {\n },\n \"crates/vendor/uu-printenv\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n },\n },\n \"crates/vendor/uu-readlink\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n },\n \"crates/vendor/uu-realpath\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n },\n \"crates/vendor/uu-rm\": {\n },\n \"crates/vendor/uu-sed\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n },\n },\n \"crates/vendor/uu-seq\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n },\n },\n \"crates/vendor/uu-sha1sum\": {\n },\n \"crates/vendor/uu-sha224sum\": {\n },\n \"crates/vendor/uu-sha256sum\": {\n },\n \"crates/vendor/uu-sha384sum\": {\n },\n \"crates/vendor/uu-sha512sum\": {\n },\n \"crates/vendor/uu-sort\": {\n },\n \"crates/vendor/uu-stat\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n },\n \"crates/vendor/uu-tac\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n },\n \"crates/vendor/uu-tail\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"rstest\": Label(\"//rstest-0.26.1\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n },\n \"crates/vendor/uu-tee\": {\n },\n \"crates/vendor/uu-touch\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n },\n \"crates/vendor/uu-tr\": {\n },\n \"crates/vendor/uu-truncate\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n },\n \"crates/vendor/uu-uname\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n },\n },\n \"crates/vendor/uu-uniq\": {\n },\n \"crates/vendor/uu-wc\": {\n },\n \"crates/vendor/uu-whoami\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n },\n },\n \"crates/vendor/uu-xargs\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n \"tempfile\": Label(\"//tempfile-3.27.0\"),\n },\n },\n \"crates/vendor/uu-yes\": {\n _COMMON_CONDITION: {\n \"parking_lot\": Label(\"//parking_lot-0.12.5\"),\n },\n },\n}\n\n\n_NORMAL_DEV_ALIASES = {\n \"crates/vendor/brush-builtins\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/brush-core\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/jaq\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/pi-ast\": {\n },\n \"crates/pi-iso\": {\n },\n \"crates/pi-natives\": {\n },\n \"crates/pi-shell\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/pi-uutils-ctx\": {\n },\n \"crates/pi-voice\": {\n },\n \"crates/pi-walker\": {\n },\n \"crates/pi-uu-diff\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/pi-uu-grep\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-b2sum\": {\n },\n \"crates/vendor/uu-base32\": {\n },\n \"crates/vendor/uu-base64\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-basename\": {\n },\n \"crates/vendor/uu-cat\": {\n },\n \"crates/vendor/uu-checksum-common\": {\n },\n \"crates/vendor/uu-comm\": {\n },\n \"crates/vendor/uu-cut\": {\n },\n \"crates/vendor/uu-date\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-dirname\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-find\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-head\": {\n },\n \"crates/vendor/uu-hostname\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-ln\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-ls\": {\n },\n \"crates/vendor/uu-md5sum\": {\n },\n \"crates/vendor/uu-mkdir\": {\n },\n \"crates/vendor/uu-mktemp\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-mv\": {\n },\n \"crates/vendor/uu-nproc\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-paste\": {\n },\n \"crates/vendor/uu-printenv\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-readlink\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-realpath\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-rm\": {\n },\n \"crates/vendor/uu-sed\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-seq\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-sha1sum\": {\n },\n \"crates/vendor/uu-sha224sum\": {\n },\n \"crates/vendor/uu-sha256sum\": {\n },\n \"crates/vendor/uu-sha384sum\": {\n },\n \"crates/vendor/uu-sha512sum\": {\n },\n \"crates/vendor/uu-sort\": {\n },\n \"crates/vendor/uu-stat\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-tac\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-tail\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-tee\": {\n },\n \"crates/vendor/uu-touch\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-tr\": {\n },\n \"crates/vendor/uu-truncate\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-uname\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-uniq\": {\n },\n \"crates/vendor/uu-wc\": {\n },\n \"crates/vendor/uu-whoami\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-xargs\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-yes\": {\n _COMMON_CONDITION: {\n },\n },\n}\n\n\n_PROC_MACRO_DEPENDENCIES = {\n \"crates/vendor/brush-builtins\": {\n _COMMON_CONDITION: {\n \"strum_macros\": Label(\"//strum_macros-0.28.0\"),\n },\n },\n \"crates/vendor/brush-core\": {\n _COMMON_CONDITION: {\n \"async-recursion\": Label(\"//async-recursion-1.1.1\"),\n \"async-trait\": Label(\"//async-trait-0.1.91\"),\n \"inherent\": Label(\"//inherent-1.0.14\"),\n \"strum_macros\": Label(\"//strum_macros-0.28.0\"),\n },\n },\n \"crates/vendor/jaq\": {\n },\n \"crates/pi-ast\": {\n },\n \"crates/pi-iso\": {\n _COMMON_CONDITION: {\n \"async-trait\": Label(\"//async-trait-0.1.91\"),\n },\n },\n \"crates/pi-natives\": {\n _COMMON_CONDITION: {\n \"napi-derive\": Label(\"//napi-derive-3.6.1\"),\n },\n },\n \"crates/pi-shell\": {\n },\n \"crates/pi-uutils-ctx\": {\n },\n \"crates/pi-voice\": {\n },\n \"crates/pi-walker\": {\n },\n \"crates/pi-uu-diff\": {\n },\n \"crates/pi-uu-grep\": {\n },\n \"crates/vendor/uu-b2sum\": {\n },\n \"crates/vendor/uu-base32\": {\n },\n \"crates/vendor/uu-base64\": {\n },\n \"crates/vendor/uu-basename\": {\n },\n \"crates/vendor/uu-cat\": {\n },\n \"crates/vendor/uu-checksum-common\": {\n },\n \"crates/vendor/uu-comm\": {\n },\n \"crates/vendor/uu-cut\": {\n },\n \"crates/vendor/uu-date\": {\n },\n \"crates/vendor/uu-dirname\": {\n },\n \"crates/vendor/uu-find\": {\n },\n \"crates/vendor/uu-head\": {\n },\n \"crates/vendor/uu-hostname\": {\n },\n \"crates/vendor/uu-ln\": {\n },\n \"crates/vendor/uu-ls\": {\n },\n \"crates/vendor/uu-md5sum\": {\n },\n \"crates/vendor/uu-mkdir\": {\n },\n \"crates/vendor/uu-mktemp\": {\n },\n \"crates/vendor/uu-mv\": {\n },\n \"crates/vendor/uu-nproc\": {\n },\n \"crates/vendor/uu-paste\": {\n },\n \"crates/vendor/uu-printenv\": {\n },\n \"crates/vendor/uu-readlink\": {\n },\n \"crates/vendor/uu-realpath\": {\n },\n \"crates/vendor/uu-rm\": {\n },\n \"crates/vendor/uu-sed\": {\n },\n \"crates/vendor/uu-seq\": {\n },\n \"crates/vendor/uu-sha1sum\": {\n },\n \"crates/vendor/uu-sha224sum\": {\n },\n \"crates/vendor/uu-sha256sum\": {\n },\n \"crates/vendor/uu-sha384sum\": {\n },\n \"crates/vendor/uu-sha512sum\": {\n },\n \"crates/vendor/uu-sort\": {\n },\n \"crates/vendor/uu-stat\": {\n },\n \"crates/vendor/uu-tac\": {\n },\n \"crates/vendor/uu-tail\": {\n },\n \"crates/vendor/uu-tee\": {\n },\n \"crates/vendor/uu-touch\": {\n },\n \"crates/vendor/uu-tr\": {\n },\n \"crates/vendor/uu-truncate\": {\n },\n \"crates/vendor/uu-uname\": {\n },\n \"crates/vendor/uu-uniq\": {\n },\n \"crates/vendor/uu-wc\": {\n },\n \"crates/vendor/uu-whoami\": {\n },\n \"crates/vendor/uu-xargs\": {\n },\n \"crates/vendor/uu-yes\": {\n },\n}\n\n\n_PROC_MACRO_ALIASES = {\n \"crates/vendor/brush-builtins\": {\n },\n \"crates/vendor/brush-core\": {\n },\n \"crates/vendor/jaq\": {\n },\n \"crates/pi-ast\": {\n },\n \"crates/pi-iso\": {\n },\n \"crates/pi-natives\": {\n },\n \"crates/pi-shell\": {\n },\n \"crates/pi-uutils-ctx\": {\n },\n \"crates/pi-voice\": {\n },\n \"crates/pi-walker\": {\n },\n \"crates/pi-uu-diff\": {\n },\n \"crates/pi-uu-grep\": {\n },\n \"crates/vendor/uu-b2sum\": {\n },\n \"crates/vendor/uu-base32\": {\n },\n \"crates/vendor/uu-base64\": {\n },\n \"crates/vendor/uu-basename\": {\n },\n \"crates/vendor/uu-cat\": {\n },\n \"crates/vendor/uu-checksum-common\": {\n },\n \"crates/vendor/uu-comm\": {\n },\n \"crates/vendor/uu-cut\": {\n },\n \"crates/vendor/uu-date\": {\n },\n \"crates/vendor/uu-dirname\": {\n },\n \"crates/vendor/uu-find\": {\n },\n \"crates/vendor/uu-head\": {\n },\n \"crates/vendor/uu-hostname\": {\n },\n \"crates/vendor/uu-ln\": {\n },\n \"crates/vendor/uu-ls\": {\n },\n \"crates/vendor/uu-md5sum\": {\n },\n \"crates/vendor/uu-mkdir\": {\n },\n \"crates/vendor/uu-mktemp\": {\n },\n \"crates/vendor/uu-mv\": {\n },\n \"crates/vendor/uu-nproc\": {\n },\n \"crates/vendor/uu-paste\": {\n },\n \"crates/vendor/uu-printenv\": {\n },\n \"crates/vendor/uu-readlink\": {\n },\n \"crates/vendor/uu-realpath\": {\n },\n \"crates/vendor/uu-rm\": {\n },\n \"crates/vendor/uu-sed\": {\n },\n \"crates/vendor/uu-seq\": {\n },\n \"crates/vendor/uu-sha1sum\": {\n },\n \"crates/vendor/uu-sha224sum\": {\n },\n \"crates/vendor/uu-sha256sum\": {\n },\n \"crates/vendor/uu-sha384sum\": {\n },\n \"crates/vendor/uu-sha512sum\": {\n },\n \"crates/vendor/uu-sort\": {\n },\n \"crates/vendor/uu-stat\": {\n },\n \"crates/vendor/uu-tac\": {\n },\n \"crates/vendor/uu-tail\": {\n },\n \"crates/vendor/uu-tee\": {\n },\n \"crates/vendor/uu-touch\": {\n },\n \"crates/vendor/uu-tr\": {\n },\n \"crates/vendor/uu-truncate\": {\n },\n \"crates/vendor/uu-uname\": {\n },\n \"crates/vendor/uu-uniq\": {\n },\n \"crates/vendor/uu-wc\": {\n },\n \"crates/vendor/uu-whoami\": {\n },\n \"crates/vendor/uu-xargs\": {\n },\n \"crates/vendor/uu-yes\": {\n },\n}\n\n\n_PROC_MACRO_DEV_DEPENDENCIES = {\n \"crates/vendor/brush-builtins\": {\n },\n \"crates/vendor/brush-core\": {\n },\n \"crates/vendor/jaq\": {\n },\n \"crates/pi-ast\": {\n },\n \"crates/pi-iso\": {\n },\n \"crates/pi-natives\": {\n },\n \"crates/pi-shell\": {\n },\n \"crates/pi-uutils-ctx\": {\n },\n \"crates/pi-voice\": {\n },\n \"crates/pi-walker\": {\n },\n \"crates/pi-uu-diff\": {\n },\n \"crates/pi-uu-grep\": {\n },\n \"crates/vendor/uu-b2sum\": {\n },\n \"crates/vendor/uu-base32\": {\n },\n \"crates/vendor/uu-base64\": {\n },\n \"crates/vendor/uu-basename\": {\n },\n \"crates/vendor/uu-cat\": {\n },\n \"crates/vendor/uu-checksum-common\": {\n },\n \"crates/vendor/uu-comm\": {\n },\n \"crates/vendor/uu-cut\": {\n },\n \"crates/vendor/uu-date\": {\n },\n \"crates/vendor/uu-dirname\": {\n },\n \"crates/vendor/uu-find\": {\n },\n \"crates/vendor/uu-head\": {\n },\n \"crates/vendor/uu-hostname\": {\n },\n \"crates/vendor/uu-ln\": {\n },\n \"crates/vendor/uu-ls\": {\n },\n \"crates/vendor/uu-md5sum\": {\n },\n \"crates/vendor/uu-mkdir\": {\n },\n \"crates/vendor/uu-mktemp\": {\n },\n \"crates/vendor/uu-mv\": {\n },\n \"crates/vendor/uu-nproc\": {\n },\n \"crates/vendor/uu-paste\": {\n },\n \"crates/vendor/uu-printenv\": {\n },\n \"crates/vendor/uu-readlink\": {\n },\n \"crates/vendor/uu-realpath\": {\n },\n \"crates/vendor/uu-rm\": {\n },\n \"crates/vendor/uu-sed\": {\n },\n \"crates/vendor/uu-seq\": {\n },\n \"crates/vendor/uu-sha1sum\": {\n },\n \"crates/vendor/uu-sha224sum\": {\n },\n \"crates/vendor/uu-sha256sum\": {\n },\n \"crates/vendor/uu-sha384sum\": {\n },\n \"crates/vendor/uu-sha512sum\": {\n },\n \"crates/vendor/uu-sort\": {\n },\n \"crates/vendor/uu-stat\": {\n },\n \"crates/vendor/uu-tac\": {\n },\n \"crates/vendor/uu-tail\": {\n },\n \"crates/vendor/uu-tee\": {\n },\n \"crates/vendor/uu-touch\": {\n },\n \"crates/vendor/uu-tr\": {\n },\n \"crates/vendor/uu-truncate\": {\n },\n \"crates/vendor/uu-uname\": {\n },\n \"crates/vendor/uu-uniq\": {\n },\n \"crates/vendor/uu-wc\": {\n },\n \"crates/vendor/uu-whoami\": {\n },\n \"crates/vendor/uu-xargs\": {\n },\n \"crates/vendor/uu-yes\": {\n },\n}\n\n\n_PROC_MACRO_DEV_ALIASES = {\n \"crates/vendor/brush-builtins\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/brush-core\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/jaq\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/pi-ast\": {\n },\n \"crates/pi-iso\": {\n },\n \"crates/pi-natives\": {\n },\n \"crates/pi-shell\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/pi-uutils-ctx\": {\n },\n \"crates/pi-voice\": {\n },\n \"crates/pi-walker\": {\n },\n \"crates/pi-uu-diff\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/pi-uu-grep\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-b2sum\": {\n },\n \"crates/vendor/uu-base32\": {\n },\n \"crates/vendor/uu-base64\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-basename\": {\n },\n \"crates/vendor/uu-cat\": {\n },\n \"crates/vendor/uu-checksum-common\": {\n },\n \"crates/vendor/uu-comm\": {\n },\n \"crates/vendor/uu-cut\": {\n },\n \"crates/vendor/uu-date\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-dirname\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-find\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-head\": {\n },\n \"crates/vendor/uu-hostname\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-ln\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-ls\": {\n },\n \"crates/vendor/uu-md5sum\": {\n },\n \"crates/vendor/uu-mkdir\": {\n },\n \"crates/vendor/uu-mktemp\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-mv\": {\n },\n \"crates/vendor/uu-nproc\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-paste\": {\n },\n \"crates/vendor/uu-printenv\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-readlink\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-realpath\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-rm\": {\n },\n \"crates/vendor/uu-sed\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-seq\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-sha1sum\": {\n },\n \"crates/vendor/uu-sha224sum\": {\n },\n \"crates/vendor/uu-sha256sum\": {\n },\n \"crates/vendor/uu-sha384sum\": {\n },\n \"crates/vendor/uu-sha512sum\": {\n },\n \"crates/vendor/uu-sort\": {\n },\n \"crates/vendor/uu-stat\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-tac\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-tail\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-tee\": {\n },\n \"crates/vendor/uu-touch\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-tr\": {\n },\n \"crates/vendor/uu-truncate\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-uname\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-uniq\": {\n },\n \"crates/vendor/uu-wc\": {\n },\n \"crates/vendor/uu-whoami\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-xargs\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/vendor/uu-yes\": {\n _COMMON_CONDITION: {\n },\n },\n}\n\n\n_BUILD_DEPENDENCIES = {\n \"crates/vendor/brush-builtins\": {\n },\n \"crates/vendor/brush-core\": {\n },\n \"crates/vendor/jaq\": {\n },\n \"crates/pi-ast\": {\n },\n \"crates/pi-iso\": {\n },\n \"crates/pi-natives\": {\n _COMMON_CONDITION: {\n \"napi-build\": Label(\"//napi-build-2.4.0\"),\n \"serde\": Label(\"//serde-1.0.229\"),\n \"serde_json\": Label(\"//serde_json-1.0.151\"),\n },\n },\n \"crates/pi-shell\": {\n },\n \"crates/pi-uutils-ctx\": {\n },\n \"crates/pi-voice\": {\n },\n \"crates/pi-walker\": {\n },\n \"crates/pi-uu-diff\": {\n },\n \"crates/pi-uu-grep\": {\n },\n \"crates/vendor/uu-b2sum\": {\n },\n \"crates/vendor/uu-base32\": {\n },\n \"crates/vendor/uu-base64\": {\n },\n \"crates/vendor/uu-basename\": {\n },\n \"crates/vendor/uu-cat\": {\n },\n \"crates/vendor/uu-checksum-common\": {\n },\n \"crates/vendor/uu-comm\": {\n },\n \"crates/vendor/uu-cut\": {\n },\n \"crates/vendor/uu-date\": {\n },\n \"crates/vendor/uu-dirname\": {\n },\n \"crates/vendor/uu-find\": {\n },\n \"crates/vendor/uu-head\": {\n },\n \"crates/vendor/uu-hostname\": {\n },\n \"crates/vendor/uu-ln\": {\n },\n \"crates/vendor/uu-ls\": {\n },\n \"crates/vendor/uu-md5sum\": {\n },\n \"crates/vendor/uu-mkdir\": {\n },\n \"crates/vendor/uu-mktemp\": {\n },\n \"crates/vendor/uu-mv\": {\n },\n \"crates/vendor/uu-nproc\": {\n },\n \"crates/vendor/uu-paste\": {\n },\n \"crates/vendor/uu-printenv\": {\n },\n \"crates/vendor/uu-readlink\": {\n },\n \"crates/vendor/uu-realpath\": {\n },\n \"crates/vendor/uu-rm\": {\n },\n \"crates/vendor/uu-sed\": {\n },\n \"crates/vendor/uu-seq\": {\n },\n \"crates/vendor/uu-sha1sum\": {\n },\n \"crates/vendor/uu-sha224sum\": {\n },\n \"crates/vendor/uu-sha256sum\": {\n },\n \"crates/vendor/uu-sha384sum\": {\n },\n \"crates/vendor/uu-sha512sum\": {\n },\n \"crates/vendor/uu-sort\": {\n },\n \"crates/vendor/uu-stat\": {\n },\n \"crates/vendor/uu-tac\": {\n },\n \"crates/vendor/uu-tail\": {\n },\n \"crates/vendor/uu-tee\": {\n },\n \"crates/vendor/uu-touch\": {\n },\n \"crates/vendor/uu-tr\": {\n },\n \"crates/vendor/uu-truncate\": {\n },\n \"crates/vendor/uu-uname\": {\n },\n \"crates/vendor/uu-uniq\": {\n },\n \"crates/vendor/uu-wc\": {\n },\n \"crates/vendor/uu-whoami\": {\n },\n \"crates/vendor/uu-xargs\": {\n },\n \"crates/vendor/uu-yes\": {\n },\n}\n\n\n_BUILD_ALIASES = {\n \"crates/vendor/brush-builtins\": {\n },\n \"crates/vendor/brush-core\": {\n },\n \"crates/vendor/jaq\": {\n },\n \"crates/pi-ast\": {\n },\n \"crates/pi-iso\": {\n },\n \"crates/pi-natives\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/pi-shell\": {\n },\n \"crates/pi-uutils-ctx\": {\n },\n \"crates/pi-voice\": {\n },\n \"crates/pi-walker\": {\n },\n \"crates/pi-uu-diff\": {\n },\n \"crates/pi-uu-grep\": {\n },\n \"crates/vendor/uu-b2sum\": {\n },\n \"crates/vendor/uu-base32\": {\n },\n \"crates/vendor/uu-base64\": {\n },\n \"crates/vendor/uu-basename\": {\n },\n \"crates/vendor/uu-cat\": {\n },\n \"crates/vendor/uu-checksum-common\": {\n },\n \"crates/vendor/uu-comm\": {\n },\n \"crates/vendor/uu-cut\": {\n },\n \"crates/vendor/uu-date\": {\n },\n \"crates/vendor/uu-dirname\": {\n },\n \"crates/vendor/uu-find\": {\n },\n \"crates/vendor/uu-head\": {\n },\n \"crates/vendor/uu-hostname\": {\n },\n \"crates/vendor/uu-ln\": {\n },\n \"crates/vendor/uu-ls\": {\n },\n \"crates/vendor/uu-md5sum\": {\n },\n \"crates/vendor/uu-mkdir\": {\n },\n \"crates/vendor/uu-mktemp\": {\n },\n \"crates/vendor/uu-mv\": {\n },\n \"crates/vendor/uu-nproc\": {\n },\n \"crates/vendor/uu-paste\": {\n },\n \"crates/vendor/uu-printenv\": {\n },\n \"crates/vendor/uu-readlink\": {\n },\n \"crates/vendor/uu-realpath\": {\n },\n \"crates/vendor/uu-rm\": {\n },\n \"crates/vendor/uu-sed\": {\n },\n \"crates/vendor/uu-seq\": {\n },\n \"crates/vendor/uu-sha1sum\": {\n },\n \"crates/vendor/uu-sha224sum\": {\n },\n \"crates/vendor/uu-sha256sum\": {\n },\n \"crates/vendor/uu-sha384sum\": {\n },\n \"crates/vendor/uu-sha512sum\": {\n },\n \"crates/vendor/uu-sort\": {\n },\n \"crates/vendor/uu-stat\": {\n },\n \"crates/vendor/uu-tac\": {\n },\n \"crates/vendor/uu-tail\": {\n },\n \"crates/vendor/uu-tee\": {\n },\n \"crates/vendor/uu-touch\": {\n },\n \"crates/vendor/uu-tr\": {\n },\n \"crates/vendor/uu-truncate\": {\n },\n \"crates/vendor/uu-uname\": {\n },\n \"crates/vendor/uu-uniq\": {\n },\n \"crates/vendor/uu-wc\": {\n },\n \"crates/vendor/uu-whoami\": {\n },\n \"crates/vendor/uu-xargs\": {\n },\n \"crates/vendor/uu-yes\": {\n },\n}\n\n\n_BUILD_PROC_MACRO_DEPENDENCIES = {\n \"crates/vendor/brush-builtins\": {\n },\n \"crates/vendor/brush-core\": {\n },\n \"crates/vendor/jaq\": {\n },\n \"crates/pi-ast\": {\n },\n \"crates/pi-iso\": {\n },\n \"crates/pi-natives\": {\n },\n \"crates/pi-shell\": {\n },\n \"crates/pi-uutils-ctx\": {\n },\n \"crates/pi-voice\": {\n },\n \"crates/pi-walker\": {\n },\n \"crates/pi-uu-diff\": {\n },\n \"crates/pi-uu-grep\": {\n },\n \"crates/vendor/uu-b2sum\": {\n },\n \"crates/vendor/uu-base32\": {\n },\n \"crates/vendor/uu-base64\": {\n },\n \"crates/vendor/uu-basename\": {\n },\n \"crates/vendor/uu-cat\": {\n },\n \"crates/vendor/uu-checksum-common\": {\n },\n \"crates/vendor/uu-comm\": {\n },\n \"crates/vendor/uu-cut\": {\n },\n \"crates/vendor/uu-date\": {\n },\n \"crates/vendor/uu-dirname\": {\n },\n \"crates/vendor/uu-find\": {\n },\n \"crates/vendor/uu-head\": {\n },\n \"crates/vendor/uu-hostname\": {\n },\n \"crates/vendor/uu-ln\": {\n },\n \"crates/vendor/uu-ls\": {\n },\n \"crates/vendor/uu-md5sum\": {\n },\n \"crates/vendor/uu-mkdir\": {\n },\n \"crates/vendor/uu-mktemp\": {\n },\n \"crates/vendor/uu-mv\": {\n },\n \"crates/vendor/uu-nproc\": {\n },\n \"crates/vendor/uu-paste\": {\n },\n \"crates/vendor/uu-printenv\": {\n },\n \"crates/vendor/uu-readlink\": {\n },\n \"crates/vendor/uu-realpath\": {\n },\n \"crates/vendor/uu-rm\": {\n },\n \"crates/vendor/uu-sed\": {\n },\n \"crates/vendor/uu-seq\": {\n },\n \"crates/vendor/uu-sha1sum\": {\n },\n \"crates/vendor/uu-sha224sum\": {\n },\n \"crates/vendor/uu-sha256sum\": {\n },\n \"crates/vendor/uu-sha384sum\": {\n },\n \"crates/vendor/uu-sha512sum\": {\n },\n \"crates/vendor/uu-sort\": {\n },\n \"crates/vendor/uu-stat\": {\n },\n \"crates/vendor/uu-tac\": {\n },\n \"crates/vendor/uu-tail\": {\n },\n \"crates/vendor/uu-tee\": {\n },\n \"crates/vendor/uu-touch\": {\n },\n \"crates/vendor/uu-tr\": {\n },\n \"crates/vendor/uu-truncate\": {\n },\n \"crates/vendor/uu-uname\": {\n },\n \"crates/vendor/uu-uniq\": {\n },\n \"crates/vendor/uu-wc\": {\n },\n \"crates/vendor/uu-whoami\": {\n },\n \"crates/vendor/uu-xargs\": {\n },\n \"crates/vendor/uu-yes\": {\n },\n}\n\n\n_BUILD_PROC_MACRO_ALIASES = {\n \"crates/vendor/brush-builtins\": {\n },\n \"crates/vendor/brush-core\": {\n },\n \"crates/vendor/jaq\": {\n },\n \"crates/pi-ast\": {\n },\n \"crates/pi-iso\": {\n },\n \"crates/pi-natives\": {\n },\n \"crates/pi-shell\": {\n },\n \"crates/pi-uutils-ctx\": {\n },\n \"crates/pi-voice\": {\n },\n \"crates/pi-walker\": {\n },\n \"crates/pi-uu-diff\": {\n },\n \"crates/pi-uu-grep\": {\n },\n \"crates/vendor/uu-b2sum\": {\n },\n \"crates/vendor/uu-base32\": {\n },\n \"crates/vendor/uu-base64\": {\n },\n \"crates/vendor/uu-basename\": {\n },\n \"crates/vendor/uu-cat\": {\n },\n \"crates/vendor/uu-checksum-common\": {\n },\n \"crates/vendor/uu-comm\": {\n },\n \"crates/vendor/uu-cut\": {\n },\n \"crates/vendor/uu-date\": {\n },\n \"crates/vendor/uu-dirname\": {\n },\n \"crates/vendor/uu-find\": {\n },\n \"crates/vendor/uu-head\": {\n },\n \"crates/vendor/uu-hostname\": {\n },\n \"crates/vendor/uu-ln\": {\n },\n \"crates/vendor/uu-ls\": {\n },\n \"crates/vendor/uu-md5sum\": {\n },\n \"crates/vendor/uu-mkdir\": {\n },\n \"crates/vendor/uu-mktemp\": {\n },\n \"crates/vendor/uu-mv\": {\n },\n \"crates/vendor/uu-nproc\": {\n },\n \"crates/vendor/uu-paste\": {\n },\n \"crates/vendor/uu-printenv\": {\n },\n \"crates/vendor/uu-readlink\": {\n },\n \"crates/vendor/uu-realpath\": {\n },\n \"crates/vendor/uu-rm\": {\n },\n \"crates/vendor/uu-sed\": {\n },\n \"crates/vendor/uu-seq\": {\n },\n \"crates/vendor/uu-sha1sum\": {\n },\n \"crates/vendor/uu-sha224sum\": {\n },\n \"crates/vendor/uu-sha256sum\": {\n },\n \"crates/vendor/uu-sha384sum\": {\n },\n \"crates/vendor/uu-sha512sum\": {\n },\n \"crates/vendor/uu-sort\": {\n },\n \"crates/vendor/uu-stat\": {\n },\n \"crates/vendor/uu-tac\": {\n },\n \"crates/vendor/uu-tail\": {\n },\n \"crates/vendor/uu-tee\": {\n },\n \"crates/vendor/uu-touch\": {\n },\n \"crates/vendor/uu-tr\": {\n },\n \"crates/vendor/uu-truncate\": {\n },\n \"crates/vendor/uu-uname\": {\n },\n \"crates/vendor/uu-uniq\": {\n },\n \"crates/vendor/uu-wc\": {\n },\n \"crates/vendor/uu-whoami\": {\n },\n \"crates/vendor/uu-xargs\": {\n },\n \"crates/vendor/uu-yes\": {\n },\n}\n\n\n_CONDITIONS = {\n \"aarch64-apple-darwin\": [\"@@//bazel/triples:aarch64-apple-darwin\"],\n \"aarch64-linux-android\": [],\n \"aarch64-pc-windows-gnullvm\": [],\n \"aarch64-unknown-linux-gnu\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\"],\n \"aarch64-unknown-linux-musl\": [\"@@//bazel/triples:aarch64-unknown-linux-musl\"],\n \"cfg(all(all(target_arch = \\\"aarch64\\\", target_endian = \\\"little\\\"), target_os = \\\"windows\\\"))\": [],\n \"cfg(all(all(target_arch = \\\"aarch64\\\", target_endian = \\\"little\\\"), target_vendor = \\\"apple\\\", any(target_os = \\\"ios\\\", target_os = \\\"macos\\\", target_os = \\\"tvos\\\", target_os = \\\"visionos\\\", target_os = \\\"watchos\\\")))\": [\"@@//bazel/triples:aarch64-apple-darwin\"],\n \"cfg(all(any(all(target_arch = \\\"aarch64\\\", target_endian = \\\"little\\\"), all(target_arch = \\\"arm\\\", target_endian = \\\"little\\\")), any(target_os = \\\"android\\\", target_os = \\\"linux\\\")))\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\"],\n \"cfg(all(any(target_arch = \\\"x86_64\\\", target_arch = \\\"arm64ec\\\"), target_env = \\\"msvc\\\", not(windows_raw_dylib)))\": [\"@@//bazel/triples:x86_64-pc-windows-msvc\"],\n \"cfg(all(any(target_os = \\\"android\\\", target_os = \\\"linux\\\"), any(rustix_use_libc, miri, not(all(target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", target_arch = \\\"s390x\\\"), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\")))))))\": [],\n \"cfg(all(any(target_os = \\\"linux\\\", target_os = \\\"android\\\"), any(rustix_use_libc, miri, not(all(target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", any(target_arch = \\\"s390x\\\", target_arch = \\\"powerpc\\\")), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc\\\"), all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\")))))))\": [],\n \"cfg(all(any(target_os = \\\"linux\\\", target_os = \\\"android\\\"), not(any(all(target_os = \\\"linux\\\", target_env = \\\"\\\"), getrandom_backend = \\\"custom\\\", getrandom_backend = \\\"linux_raw\\\", getrandom_backend = \\\"rdrand\\\", getrandom_backend = \\\"rndr\\\"))))\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(all(not(curve25519_dalek_backend = \\\"fiat\\\"), not(curve25519_dalek_backend = \\\"serial\\\"), target_arch = \\\"x86_64\\\"))\": [\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-pc-windows-msvc\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(all(not(rustix_use_libc), not(miri), target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", any(target_arch = \\\"s390x\\\", target_arch = \\\"powerpc\\\")), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc\\\"), all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\"))))\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(all(not(rustix_use_libc), not(miri), target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", target_arch = \\\"s390x\\\"), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\"))))\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(all(not(windows), any(rustix_use_libc, miri, not(all(target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", any(target_arch = \\\"s390x\\\", target_arch = \\\"powerpc\\\")), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc\\\"), all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\")))))))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:x86_64-apple-darwin\"],\n \"cfg(all(not(windows), any(rustix_use_libc, miri, not(all(target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", target_arch = \\\"s390x\\\"), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\")))))))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:x86_64-apple-darwin\"],\n \"cfg(all(target_arch = \\\"aarch64\\\", target_env = \\\"msvc\\\", not(windows_raw_dylib)))\": [],\n \"cfg(all(target_arch = \\\"aarch64\\\", target_os = \\\"android\\\"))\": [],\n \"cfg(all(target_arch = \\\"aarch64\\\", target_os = \\\"linux\\\"))\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\"],\n \"cfg(all(target_arch = \\\"aarch64\\\", target_vendor = \\\"apple\\\"))\": [\"@@//bazel/triples:aarch64-apple-darwin\"],\n \"cfg(all(target_arch = \\\"loongarch64\\\", target_os = \\\"linux\\\"))\": [],\n \"cfg(all(target_arch = \\\"wasm32\\\", target_os = \\\"unknown\\\"))\": [],\n \"cfg(all(target_arch = \\\"wasm32\\\", target_os = \\\"wasi\\\", target_env = \\\"p2\\\"))\": [],\n \"cfg(all(target_arch = \\\"x86\\\", target_env = \\\"gnu\\\", not(target_abi = \\\"llvm\\\"), not(windows_raw_dylib)))\": [],\n \"cfg(all(target_arch = \\\"x86\\\", target_env = \\\"gnu\\\", not(windows_raw_dylib)))\": [],\n \"cfg(all(target_arch = \\\"x86\\\", target_env = \\\"msvc\\\", not(windows_raw_dylib)))\": [],\n \"cfg(all(target_arch = \\\"x86_64\\\", target_env = \\\"gnu\\\", not(target_abi = \\\"llvm\\\"), not(windows_raw_dylib)))\": [\"@@//bazel/triples:x86_64-unknown-linux-gnu\"],\n \"cfg(all(target_arch = \\\"x86_64\\\", target_env = \\\"msvc\\\", not(windows_raw_dylib)))\": [\"@@//bazel/triples:x86_64-pc-windows-msvc\"],\n \"cfg(all(target_family = \\\"wasm\\\", target_os = \\\"unknown\\\"))\": [],\n \"cfg(all(target_os = \\\"linux\\\", not(target_env = \\\"ohos\\\")))\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(all(target_os = \\\"uefi\\\", getrandom_backend = \\\"efi_rng\\\"))\": [],\n \"cfg(all(unix, not(any(target_os = \\\"macos\\\", target_os = \\\"android\\\", target_os = \\\"emscripten\\\"))))\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(all(unix, not(target_os = \\\"macos\\\")))\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any())\": [],\n \"cfg(any(target_arch = \\\"aarch64\\\", target_arch = \\\"x86\\\", target_arch = \\\"x86_64\\\"))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-pc-windows-msvc\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any(target_arch = \\\"aarch64\\\", target_arch = \\\"x86_64\\\", target_arch = \\\"x86\\\"))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-pc-windows-msvc\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any(target_arch = \\\"x86\\\", target_arch = \\\"x86_64\\\"))\": [\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-pc-windows-msvc\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any(target_arch = \\\"x86_64\\\", target_arch = \\\"x86\\\"))\": [\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-pc-windows-msvc\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any(target_os = \\\"android\\\", target_os = \\\"linux\\\"))\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any(target_os = \\\"android\\\", target_os = \\\"linux\\\", target_os = \\\"macos\\\", target_os = \\\"hurd\\\"))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any(target_os = \\\"dragonfly\\\", target_os = \\\"freebsd\\\", target_os = \\\"hurd\\\", target_os = \\\"illumos\\\", target_os = \\\"cygwin\\\", all(target_os = \\\"horizon\\\", target_arch = \\\"arm\\\")))\": [],\n \"cfg(any(target_os = \\\"freebsd\\\", target_os = \\\"dragonfly\\\"))\": [],\n \"cfg(any(target_os = \\\"freebsd\\\", target_os = \\\"netbsd\\\"))\": [],\n \"cfg(any(target_os = \\\"freebsd\\\", target_os = \\\"openbsd\\\"))\": [],\n \"cfg(any(target_os = \\\"freebsd\\\", target_os = \\\"openbsd\\\", target_os = \\\"netbsd\\\", target_os = \\\"dragonflybsd\\\", target_os = \\\"ios\\\"))\": [],\n \"cfg(any(target_os = \\\"haiku\\\", target_os = \\\"redox\\\", target_os = \\\"nto\\\", target_os = \\\"aix\\\"))\": [],\n \"cfg(any(target_os = \\\"ios\\\", target_os = \\\"visionos\\\", target_os = \\\"watchos\\\", target_os = \\\"tvos\\\"))\": [],\n \"cfg(any(target_os = \\\"linux\\\", target_os = \\\"android\\\"))\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any(target_os = \\\"macos\\\", target_os = \\\"openbsd\\\", target_os = \\\"vita\\\", target_os = \\\"emscripten\\\"))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:x86_64-apple-darwin\"],\n \"cfg(any(target_os = \\\"macos\\\", target_os = \\\"windows\\\"))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-pc-windows-msvc\"],\n \"cfg(any(unix, target_os = \\\"fuchsia\\\", target_os = \\\"vxworks\\\"))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any(unix, target_os = \\\"hermit\\\", target_os = \\\"wasi\\\"))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any(unix, target_os = \\\"redox\\\"))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any(unix, target_os = \\\"wasi\\\"))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any(unix, windows))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-pc-windows-msvc\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(any(windows, target_os = \\\"linux\\\"))\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-pc-windows-msvc\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(curve25519_dalek_backend = \\\"fiat\\\")\": [],\n \"cfg(not(all(target_arch = \\\"arm\\\", target_os = \\\"none\\\")))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-pc-windows-msvc\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(not(any(target_os = \\\"android\\\", target_os = \\\"linux\\\")))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-pc-windows-msvc\"],\n \"cfg(not(target_has_atomic = \\\"ptr\\\"))\": [],\n \"cfg(not(target_os = \\\"wasi\\\"))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-pc-windows-msvc\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(not(target_os = \\\"windows\\\"))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(not(windows))\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(target_arch = \\\"aarch64\\\")\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\"],\n \"cfg(target_arch = \\\"spirv\\\")\": [],\n \"cfg(target_arch = \\\"x86\\\")\": [],\n \"cfg(target_arch = \\\"x86_64\\\")\": [\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-pc-windows-msvc\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(target_family = \\\"wasm\\\")\": [],\n \"cfg(target_os = \\\"android\\\")\": [],\n \"cfg(target_os = \\\"freebsd\\\")\": [],\n \"cfg(target_os = \\\"haiku\\\")\": [],\n \"cfg(target_os = \\\"hermit\\\")\": [],\n \"cfg(target_os = \\\"linux\\\")\": [\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(target_os = \\\"macos\\\")\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:x86_64-apple-darwin\"],\n \"cfg(target_os = \\\"netbsd\\\")\": [],\n \"cfg(target_os = \\\"redox\\\")\": [],\n \"cfg(target_os = \\\"solaris\\\")\": [],\n \"cfg(target_os = \\\"vxworks\\\")\": [],\n \"cfg(target_os = \\\"wasi\\\")\": [],\n \"cfg(target_os = \\\"windows\\\")\": [\"@@//bazel/triples:x86_64-pc-windows-msvc\"],\n \"cfg(target_vendor = \\\"apple\\\")\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:x86_64-apple-darwin\"],\n \"cfg(unix)\": [\"@@//bazel/triples:aarch64-apple-darwin\",\"@@//bazel/triples:aarch64-unknown-linux-gnu\",\"@@//bazel/triples:aarch64-unknown-linux-musl\",\"@@//bazel/triples:x86_64-apple-darwin\",\"@@//bazel/triples:x86_64-unknown-linux-gnu\",\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n \"cfg(windows)\": [\"@@//bazel/triples:x86_64-pc-windows-msvc\"],\n \"cfg(windows_raw_dylib)\": [],\n \"i686-pc-windows-gnu\": [],\n \"i686-pc-windows-gnullvm\": [],\n \"wasm32-unknown-unknown\": [],\n \"x86_64-apple-darwin\": [\"@@//bazel/triples:x86_64-apple-darwin\"],\n \"x86_64-pc-windows-gnu\": [],\n \"x86_64-pc-windows-gnullvm\": [],\n \"x86_64-pc-windows-msvc\": [\"@@//bazel/triples:x86_64-pc-windows-msvc\"],\n \"x86_64-unknown-linux-gnu\": [\"@@//bazel/triples:x86_64-unknown-linux-gnu\"],\n \"x86_64-unknown-linux-musl\": [\"@@//bazel/triples:x86_64-unknown-linux-musl\"],\n}\n\n###############################################################################\n\ndef crate_repositories():\n \"\"\"A macro for defining repositories for all generated crates.\n\n Returns:\n A list of repos visible to the module through the module extension.\n \"\"\"\n maybe(\n crates_vendor_remote_repository,\n name = \"crates\",\n # Lean interface: just point at `crates.bzl`; the repo rule\n # derives the sibling `BUILD.bazel` and `defs.bzl`.\n crates_module = Label(\"@crates//crates:crates.bzl\"),\n )\n maybe(\n http_archive,\n name = \"crates__adler2-2.0.1\",\n sha256 = \"320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/adler2/2.0.1/download\"],\n strip_prefix = \"adler2-2.0.1\",\n build_file = Label(\"@crates//crates:BUILD.adler2-2.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__aead-0.5.2\",\n sha256 = \"d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/aead/0.5.2/download\"],\n strip_prefix = \"aead-0.5.2\",\n build_file = Label(\"@crates//crates:BUILD.aead-0.5.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__aes-0.8.4\",\n sha256 = \"b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/aes/0.8.4/download\"],\n strip_prefix = \"aes-0.8.4\",\n build_file = Label(\"@crates//crates:BUILD.aes-0.8.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__aes-gcm-0.10.3\",\n sha256 = \"831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/aes-gcm/0.10.3/download\"],\n strip_prefix = \"aes-gcm-0.10.3\",\n build_file = Label(\"@crates//crates:BUILD.aes-gcm-0.10.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ahash-0.8.12\",\n sha256 = \"5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ahash/0.8.12/download\"],\n strip_prefix = \"ahash-0.8.12\",\n build_file = Label(\"@crates//crates:BUILD.ahash-0.8.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__aho-corasick-1.1.4\",\n sha256 = \"ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/aho-corasick/1.1.4/download\"],\n strip_prefix = \"aho-corasick-1.1.4\",\n build_file = Label(\"@crates//crates:BUILD.aho-corasick-1.1.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__allocator-api2-0.2.21\",\n sha256 = \"683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/allocator-api2/0.2.21/download\"],\n strip_prefix = \"allocator-api2-0.2.21\",\n build_file = Label(\"@crates//crates:BUILD.allocator-api2-0.2.21.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__android_system_properties-0.1.5\",\n sha256 = \"819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/android_system_properties/0.1.5/download\"],\n strip_prefix = \"android_system_properties-0.1.5\",\n build_file = Label(\"@crates//crates:BUILD.android_system_properties-0.1.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__annotate-snippets-0.11.5\",\n sha256 = \"710e8eae58854cdc1790fcb56cca04d712a17be849eeb81da2a724bf4bae2bc4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/annotate-snippets/0.11.5/download\"],\n strip_prefix = \"annotate-snippets-0.11.5\",\n build_file = Label(\"@crates//crates:BUILD.annotate-snippets-0.11.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ansi-width-0.1.0\",\n sha256 = \"219e3ce6f2611d83b51ec2098a12702112c29e57203a6b0a0929b2cddb486608\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ansi-width/0.1.0/download\"],\n strip_prefix = \"ansi-width-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.ansi-width-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstream-1.0.0\",\n sha256 = \"824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstream/1.0.0/download\"],\n strip_prefix = \"anstream-1.0.0\",\n build_file = Label(\"@crates//crates:BUILD.anstream-1.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstyle-1.0.14\",\n sha256 = \"940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle/1.0.14/download\"],\n strip_prefix = \"anstyle-1.0.14\",\n build_file = Label(\"@crates//crates:BUILD.anstyle-1.0.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstyle-parse-1.0.0\",\n sha256 = \"52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle-parse/1.0.0/download\"],\n strip_prefix = \"anstyle-parse-1.0.0\",\n build_file = Label(\"@crates//crates:BUILD.anstyle-parse-1.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstyle-query-1.1.5\",\n sha256 = \"40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle-query/1.1.5/download\"],\n strip_prefix = \"anstyle-query-1.1.5\",\n build_file = Label(\"@crates//crates:BUILD.anstyle-query-1.1.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstyle-wincon-3.0.11\",\n sha256 = \"291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle-wincon/3.0.11/download\"],\n strip_prefix = \"anstyle-wincon-3.0.11\",\n build_file = Label(\"@crates//crates:BUILD.anstyle-wincon-3.0.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anyhow-1.0.104\",\n sha256 = \"330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anyhow/1.0.104/download\"],\n strip_prefix = \"anyhow-1.0.104\",\n build_file = Label(\"@crates//crates:BUILD.anyhow-1.0.104.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__arboard-3.6.1\",\n sha256 = \"0348a1c054491f4bfe6ab86a7b6ab1e44e45d899005de92f58b3df180b36ddaf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/arboard/3.6.1/download\"],\n strip_prefix = \"arboard-3.6.1\",\n build_file = Label(\"@crates//crates:BUILD.arboard-3.6.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__arc-swap-1.9.2\",\n sha256 = \"c049c0be4daef0b145cb3555416b3b8ef5b7888a38aea1a3a155801fe7b0810b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/arc-swap/1.9.2/download\"],\n strip_prefix = \"arc-swap-1.9.2\",\n build_file = Label(\"@crates//crates:BUILD.arc-swap-1.9.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__archery-1.2.2\",\n sha256 = \"70e0a5f99dfebb87bb342d0f53bb92c81842e100bbb915223e38349580e5441d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/archery/1.2.2/download\"],\n strip_prefix = \"archery-1.2.2\",\n build_file = Label(\"@crates//crates:BUILD.archery-1.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__argmax-0.3.1\",\n sha256 = \"5b7e3ef5e3a7f2c5e5a49d90ad087c03d38258e75155daac64deb62c50972c66\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/argmax/0.3.1/download\"],\n strip_prefix = \"argmax-0.3.1\",\n build_file = Label(\"@crates//crates:BUILD.argmax-0.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__arrayref-0.3.9\",\n sha256 = \"76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/arrayref/0.3.9/download\"],\n strip_prefix = \"arrayref-0.3.9\",\n build_file = Label(\"@crates//crates:BUILD.arrayref-0.3.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__arrayvec-0.7.8\",\n sha256 = \"d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/arrayvec/0.7.8/download\"],\n strip_prefix = \"arrayvec-0.7.8\",\n build_file = Label(\"@crates//crates:BUILD.arrayvec-0.7.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__asn1-rs-0.6.2\",\n sha256 = \"5493c3bedbacf7fd7382c6346bbd66687d12bbaad3a89a2d2c303ee6cf20b048\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/asn1-rs/0.6.2/download\"],\n strip_prefix = \"asn1-rs-0.6.2\",\n build_file = Label(\"@crates//crates:BUILD.asn1-rs-0.6.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__asn1-rs-derive-0.5.1\",\n sha256 = \"965c2d33e53cb6b267e148a4cb0760bc01f4904c1cd4bb4002a085bb016d1490\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/asn1-rs-derive/0.5.1/download\"],\n strip_prefix = \"asn1-rs-derive-0.5.1\",\n build_file = Label(\"@crates//crates:BUILD.asn1-rs-derive-0.5.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__asn1-rs-impl-0.2.0\",\n sha256 = \"7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/asn1-rs-impl/0.2.0/download\"],\n strip_prefix = \"asn1-rs-impl-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.asn1-rs-impl-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ast-grep-core-0.39.9\",\n sha256 = \"057ae90e7256ebf85f840b1638268df0142c9d19467d500b790631fd301acc27\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ast-grep-core/0.39.9/download\"],\n strip_prefix = \"ast-grep-core-0.39.9\",\n build_file = Label(\"@crates//crates:BUILD.ast-grep-core-0.39.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__astral-tl-0.7.11\",\n sha256 = \"d90933ffb0f97e2fc2e0de21da9d3f20597b804012d199843a6fe7c2810d28f3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/astral-tl/0.7.11/download\"],\n strip_prefix = \"astral-tl-0.7.11\",\n build_file = Label(\"@crates//crates:BUILD.astral-tl-0.7.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__async-broadcast-0.7.2\",\n sha256 = \"435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/async-broadcast/0.7.2/download\"],\n strip_prefix = \"async-broadcast-0.7.2\",\n build_file = Label(\"@crates//crates:BUILD.async-broadcast-0.7.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__async-channel-2.5.0\",\n sha256 = \"924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/async-channel/2.5.0/download\"],\n strip_prefix = \"async-channel-2.5.0\",\n build_file = Label(\"@crates//crates:BUILD.async-channel-2.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__async-executor-1.14.0\",\n sha256 = \"c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/async-executor/1.14.0/download\"],\n strip_prefix = \"async-executor-1.14.0\",\n build_file = Label(\"@crates//crates:BUILD.async-executor-1.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__async-io-2.6.0\",\n sha256 = \"456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/async-io/2.6.0/download\"],\n strip_prefix = \"async-io-2.6.0\",\n build_file = Label(\"@crates//crates:BUILD.async-io-2.6.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__async-lock-3.4.2\",\n sha256 = \"290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/async-lock/3.4.2/download\"],\n strip_prefix = \"async-lock-3.4.2\",\n build_file = Label(\"@crates//crates:BUILD.async-lock-3.4.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__async-process-2.5.0\",\n sha256 = \"fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/async-process/2.5.0/download\"],\n strip_prefix = \"async-process-2.5.0\",\n build_file = Label(\"@crates//crates:BUILD.async-process-2.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__async-recursion-1.1.1\",\n sha256 = \"3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/async-recursion/1.1.1/download\"],\n strip_prefix = \"async-recursion-1.1.1\",\n build_file = Label(\"@crates//crates:BUILD.async-recursion-1.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__async-signal-0.2.14\",\n sha256 = \"52b5aaafa020cf5053a01f2a60e8ff5dccf550f0f77ec54a4e47285ac2bab485\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/async-signal/0.2.14/download\"],\n strip_prefix = \"async-signal-0.2.14\",\n build_file = Label(\"@crates//crates:BUILD.async-signal-0.2.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__async-task-4.7.1\",\n sha256 = \"8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/async-task/4.7.1/download\"],\n strip_prefix = \"async-task-4.7.1\",\n build_file = Label(\"@crates//crates:BUILD.async-task-4.7.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__async-trait-0.1.91\",\n sha256 = \"ae36dc4177970ef04fde5178d3e2429882def40e57a451f919c098f72baa6cec\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/async-trait/0.1.91/download\"],\n strip_prefix = \"async-trait-0.1.91\",\n build_file = Label(\"@crates//crates:BUILD.async-trait-0.1.91.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__atomic-waker-1.1.2\",\n sha256 = \"1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/atomic-waker/1.1.2/download\"],\n strip_prefix = \"atomic-waker-1.1.2\",\n build_file = Label(\"@crates//crates:BUILD.atomic-waker-1.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__audiopus_sys-0.2.2\",\n sha256 = \"62314a1546a2064e033665d658e88c620a62904be945f8147e6b16c3db9f8651\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/audiopus_sys/0.2.2/download\"],\n strip_prefix = \"audiopus_sys-0.2.2\",\n build_file = Label(\"@crates//crates:BUILD.audiopus_sys-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__autocfg-1.5.1\",\n sha256 = \"f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/autocfg/1.5.1/download\"],\n strip_prefix = \"autocfg-1.5.1\",\n build_file = Label(\"@crates//crates:BUILD.autocfg-1.5.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__base16ct-0.2.0\",\n sha256 = \"4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/base16ct/0.2.0/download\"],\n strip_prefix = \"base16ct-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.base16ct-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__base64-0.22.1\",\n sha256 = \"72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/base64/0.22.1/download\"],\n strip_prefix = \"base64-0.22.1\",\n build_file = Label(\"@crates//crates:BUILD.base64-0.22.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__base64-simd-0.8.0\",\n sha256 = \"339abbe78e73178762e23bea9dfd08e697eb3f3301cd4be981c0f78ba5859195\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/base64-simd/0.8.0/download\"],\n strip_prefix = \"base64-simd-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.base64-simd-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__base64ct-1.8.3\",\n sha256 = \"2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/base64ct/1.8.3/download\"],\n strip_prefix = \"base64ct-1.8.3\",\n build_file = Label(\"@crates//crates:BUILD.base64ct-1.8.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bigdecimal-0.4.10\",\n sha256 = \"4d6867f1565b3aad85681f1015055b087fcfd840d6aeee6eee7f2da317603695\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bigdecimal/0.4.10/download\"],\n strip_prefix = \"bigdecimal-0.4.10\",\n build_file = Label(\"@crates//crates:BUILD.bigdecimal-0.4.10.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__binary-heap-plus-0.5.0\",\n sha256 = \"e4551d8382e911ecc0d0f0ffb602777988669be09447d536ff4388d1def11296\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/binary-heap-plus/0.5.0/download\"],\n strip_prefix = \"binary-heap-plus-0.5.0\",\n build_file = Label(\"@crates//crates:BUILD.binary-heap-plus-0.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bincode-1.3.3\",\n sha256 = \"b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bincode/1.3.3/download\"],\n strip_prefix = \"bincode-1.3.3\",\n build_file = Label(\"@crates//crates:BUILD.bincode-1.3.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bindgen-0.72.1\",\n sha256 = \"993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bindgen/0.72.1/download\"],\n strip_prefix = \"bindgen-0.72.1\",\n build_file = Label(\"@crates//crates:BUILD.bindgen-0.72.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bit-set-0.8.0\",\n sha256 = \"08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bit-set/0.8.0/download\"],\n strip_prefix = \"bit-set-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.bit-set-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bit-vec-0.8.0\",\n sha256 = \"5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bit-vec/0.8.0/download\"],\n strip_prefix = \"bit-vec-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.bit-vec-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bitflags-1.3.2\",\n sha256 = \"bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bitflags/1.3.2/download\"],\n strip_prefix = \"bitflags-1.3.2\",\n build_file = Label(\"@crates//crates:BUILD.bitflags-1.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bitflags-2.13.1\",\n sha256 = \"b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bitflags/2.13.1/download\"],\n strip_prefix = \"bitflags-2.13.1\",\n build_file = Label(\"@crates//crates:BUILD.bitflags-2.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bitvec-1.1.1\",\n sha256 = \"ddcec3d12c579d40898fe0a9a358a803c23e9c52ca3c425707f81c9436211837\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bitvec/1.1.1/download\"],\n strip_prefix = \"bitvec-1.1.1\",\n build_file = Label(\"@crates//crates:BUILD.bitvec-1.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__blake2b_simd-1.0.4\",\n sha256 = \"b79834656f71332577234b50bfc009996f7449e0c056884e6a02492ded0ca2f3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/blake2b_simd/1.0.4/download\"],\n strip_prefix = \"blake2b_simd-1.0.4\",\n build_file = Label(\"@crates//crates:BUILD.blake2b_simd-1.0.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__blake3-1.8.5\",\n sha256 = \"0aa83c34e62843d924f905e0f5c866eb1dd6545fc4d719e803d9ba6030371fce\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/blake3/1.8.5/download\"],\n strip_prefix = \"blake3-1.8.5\",\n build_file = Label(\"@crates//crates:BUILD.blake3-1.8.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__block-buffer-0.10.4\",\n sha256 = \"3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/block-buffer/0.10.4/download\"],\n strip_prefix = \"block-buffer-0.10.4\",\n build_file = Label(\"@crates//crates:BUILD.block-buffer-0.10.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__block-buffer-0.12.1\",\n sha256 = \"d2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aa\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/block-buffer/0.12.1/download\"],\n strip_prefix = \"block-buffer-0.12.1\",\n build_file = Label(\"@crates//crates:BUILD.block-buffer-0.12.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__block-padding-0.3.3\",\n sha256 = \"a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/block-padding/0.3.3/download\"],\n strip_prefix = \"block-padding-0.3.3\",\n build_file = Label(\"@crates//crates:BUILD.block-padding-0.3.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__block2-0.6.2\",\n sha256 = \"cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/block2/0.6.2/download\"],\n strip_prefix = \"block2-0.6.2\",\n build_file = Label(\"@crates//crates:BUILD.block2-0.6.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__blocking-1.6.2\",\n sha256 = \"e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/blocking/1.6.2/download\"],\n strip_prefix = \"blocking-1.6.2\",\n build_file = Label(\"@crates//crates:BUILD.blocking-1.6.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bon-3.9.3\",\n sha256 = \"a602c73c7b0148ec6d12af6fd5cc7a46e2eacc8878271a999abac56eed12f561\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bon/3.9.3/download\"],\n strip_prefix = \"bon-3.9.3\",\n build_file = Label(\"@crates//crates:BUILD.bon-3.9.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bon-macros-3.9.3\",\n sha256 = \"6dee98b0db6a962de883bf5d20362dee4d7ca0d12fe39a7c6c73c844e1cd7c1f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bon-macros/3.9.3/download\"],\n strip_prefix = \"bon-macros-3.9.3\",\n build_file = Label(\"@crates//crates:BUILD.bon-macros-3.9.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__brush-parser-0.3.0\",\n sha256 = \"f7367124d4f38fdcd65f4b815bda7caeb3de377b9cd95ffa1b23627989c93718\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/brush-parser/0.3.0/download\"],\n strip_prefix = \"brush-parser-0.3.0\",\n build_file = Label(\"@crates//crates:BUILD.brush-parser-0.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__brush-parser-0.4.0\",\n sha256 = \"9f64b19efc02f0dd6cac1d462e20a1098f425f09cb13624efbb1b7d63f061735\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/brush-parser/0.4.0/download\"],\n strip_prefix = \"brush-parser-0.4.0\",\n build_file = Label(\"@crates//crates:BUILD.brush-parser-0.4.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bstr-1.13.0\",\n sha256 = \"1f7dc094d718f2e1c1559ad110e27eeaae14a5465d3d56dd6dbd793079fbd530\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bstr/1.13.0/download\"],\n strip_prefix = \"bstr-1.13.0\",\n build_file = Label(\"@crates//crates:BUILD.bstr-1.13.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bumpalo-3.20.3\",\n sha256 = \"72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bumpalo/3.20.3/download\"],\n strip_prefix = \"bumpalo-3.20.3\",\n build_file = Label(\"@crates//crates:BUILD.bumpalo-3.20.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__by_address-1.2.1\",\n sha256 = \"64fa3c856b712db6612c019f14756e64e4bcea13337a6b33b696333a9eaa2d06\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/by_address/1.2.1/download\"],\n strip_prefix = \"by_address-1.2.1\",\n build_file = Label(\"@crates//crates:BUILD.by_address-1.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bytecheck-0.8.2\",\n sha256 = \"0caa33a2c0edca0419d15ac723dff03f1956f7978329b1e3b5fdaaaed9d3ca8b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bytecheck/0.8.2/download\"],\n strip_prefix = \"bytecheck-0.8.2\",\n build_file = Label(\"@crates//crates:BUILD.bytecheck-0.8.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bytecheck_derive-0.8.2\",\n sha256 = \"89385e82b5d1821d2219e0b095efa2cc1f246cbf99080f3be46a1a85c0d392d9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bytecheck_derive/0.8.2/download\"],\n strip_prefix = \"bytecheck_derive-0.8.2\",\n build_file = Label(\"@crates//crates:BUILD.bytecheck_derive-0.8.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bytecount-0.6.9\",\n sha256 = \"175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bytecount/0.6.9/download\"],\n strip_prefix = \"bytecount-0.6.9\",\n build_file = Label(\"@crates//crates:BUILD.bytecount-0.6.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bytemuck-1.25.2\",\n sha256 = \"95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bytemuck/1.25.2/download\"],\n strip_prefix = \"bytemuck-1.25.2\",\n build_file = Label(\"@crates//crates:BUILD.bytemuck-1.25.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bytemuck_derive-1.11.0\",\n sha256 = \"f65693059b6b9c588b9f62fed1cedbf0a8b805631457ea162d68f0de186f3de5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bytemuck_derive/1.11.0/download\"],\n strip_prefix = \"bytemuck_derive-1.11.0\",\n build_file = Label(\"@crates//crates:BUILD.bytemuck_derive-1.11.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__byteorder-1.5.0\",\n sha256 = \"1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/byteorder/1.5.0/download\"],\n strip_prefix = \"byteorder-1.5.0\",\n build_file = Label(\"@crates//crates:BUILD.byteorder-1.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__byteorder-lite-0.1.0\",\n sha256 = \"8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/byteorder-lite/0.1.0/download\"],\n strip_prefix = \"byteorder-lite-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.byteorder-lite-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bytes-1.12.1\",\n sha256 = \"fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bytes/1.12.1/download\"],\n strip_prefix = \"bytes-1.12.1\",\n build_file = Label(\"@crates//crates:BUILD.bytes-1.12.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cached-0.56.0\",\n sha256 = \"801927ee168e17809ab8901d9f01f700cd7d8d6a6527997fee44e4b0327a253c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cached/0.56.0/download\"],\n strip_prefix = \"cached-0.56.0\",\n build_file = Label(\"@crates//crates:BUILD.cached-0.56.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cached-0.59.0\",\n sha256 = \"53b6f5d101f0f6322c8646a45b7c581a673e476329040d97565815c2461dd0c4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cached/0.59.0/download\"],\n strip_prefix = \"cached-0.59.0\",\n build_file = Label(\"@crates//crates:BUILD.cached-0.59.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cached_proc_macro-0.25.0\",\n sha256 = \"9225bdcf4e4a9a4c08bf16607908eb2fbf746828d5e0b5e019726dbf6571f201\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cached_proc_macro/0.25.0/download\"],\n strip_prefix = \"cached_proc_macro-0.25.0\",\n build_file = Label(\"@crates//crates:BUILD.cached_proc_macro-0.25.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cached_proc_macro-0.27.0\",\n sha256 = \"8ebcf9c75f17a17d55d11afc98e46167d4790a263f428891b8705ab2f793eca3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cached_proc_macro/0.27.0/download\"],\n strip_prefix = \"cached_proc_macro-0.27.0\",\n build_file = Label(\"@crates//crates:BUILD.cached_proc_macro-0.27.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cached_proc_macro_types-0.1.1\",\n sha256 = \"ade8366b8bd5ba243f0a58f036cc0ca8a2f069cff1a2351ef1cac6b083e16fc0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cached_proc_macro_types/0.1.1/download\"],\n strip_prefix = \"cached_proc_macro_types-0.1.1\",\n build_file = Label(\"@crates//crates:BUILD.cached_proc_macro_types-0.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__calendrical_calculations-0.2.4\",\n sha256 = \"5abbd6eeda6885048d357edc66748eea6e0268e3dd11f326fff5bd248d779c26\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/calendrical_calculations/0.2.4/download\"],\n strip_prefix = \"calendrical_calculations-0.2.4\",\n build_file = Label(\"@crates//crates:BUILD.calendrical_calculations-0.2.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cbc-0.1.2\",\n sha256 = \"26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cbc/0.1.2/download\"],\n strip_prefix = \"cbc-0.1.2\",\n build_file = Label(\"@crates//crates:BUILD.cbc-0.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cc-1.2.67\",\n sha256 = \"e17dd265a7d0f31ef544e1b20e03add05d3b45b491b633b10d67145d2acc1a38\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cc/1.2.67/download\"],\n strip_prefix = \"cc-1.2.67\",\n build_file = Label(\"@crates//crates:BUILD.cc-1.2.67.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ccm-0.5.0\",\n sha256 = \"9ae3c82e4355234767756212c570e29833699ab63e6ffd161887314cc5b43847\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ccm/0.5.0/download\"],\n strip_prefix = \"ccm-0.5.0\",\n build_file = Label(\"@crates//crates:BUILD.ccm-0.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cexpr-0.6.0\",\n sha256 = \"6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cexpr/0.6.0/download\"],\n strip_prefix = \"cexpr-0.6.0\",\n build_file = Label(\"@crates//crates:BUILD.cexpr-0.6.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cfg-expr-0.20.8\",\n sha256 = \"fb693542bcafa528e198be0ebd9d3632ca5b7c93dbe7237460e199910835997c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cfg-expr/0.20.8/download\"],\n strip_prefix = \"cfg-expr-0.20.8\",\n build_file = Label(\"@crates//crates:BUILD.cfg-expr-0.20.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cfg-if-1.0.4\",\n sha256 = \"9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cfg-if/1.0.4/download\"],\n strip_prefix = \"cfg-if-1.0.4\",\n build_file = Label(\"@crates//crates:BUILD.cfg-if-1.0.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cfg_aliases-0.1.1\",\n sha256 = \"fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cfg_aliases/0.1.1/download\"],\n strip_prefix = \"cfg_aliases-0.1.1\",\n build_file = Label(\"@crates//crates:BUILD.cfg_aliases-0.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cfg_aliases-0.2.2\",\n sha256 = \"f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cfg_aliases/0.2.2/download\"],\n strip_prefix = \"cfg_aliases-0.2.2\",\n build_file = Label(\"@crates//crates:BUILD.cfg_aliases-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__chacha20-0.10.1\",\n sha256 = \"d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/chacha20/0.10.1/download\"],\n strip_prefix = \"chacha20-0.10.1\",\n build_file = Label(\"@crates//crates:BUILD.chacha20-0.10.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__chacha20-0.9.1\",\n sha256 = \"c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/chacha20/0.9.1/download\"],\n strip_prefix = \"chacha20-0.9.1\",\n build_file = Label(\"@crates//crates:BUILD.chacha20-0.9.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__chacha20poly1305-0.10.1\",\n sha256 = \"10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/chacha20poly1305/0.10.1/download\"],\n strip_prefix = \"chacha20poly1305-0.10.1\",\n build_file = Label(\"@crates//crates:BUILD.chacha20poly1305-0.10.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__check_elevation-0.2.7\",\n sha256 = \"a7fe1fbbd8bd3174109071530f12932ff471eeff30d83e9c485d6ff424ac534b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/check_elevation/0.2.7/download\"],\n strip_prefix = \"check_elevation-0.2.7\",\n build_file = Label(\"@crates//crates:BUILD.check_elevation-0.2.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__chrono-0.4.45\",\n sha256 = \"1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/chrono/0.4.45/download\"],\n strip_prefix = \"chrono-0.4.45\",\n build_file = Label(\"@crates//crates:BUILD.chrono-0.4.45.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__chrono-tz-0.10.4\",\n sha256 = \"a6139a8597ed92cf816dfb33f5dd6cf0bb93a6adc938f11039f371bc5bcd26c3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/chrono-tz/0.10.4/download\"],\n strip_prefix = \"chrono-tz-0.10.4\",\n build_file = Label(\"@crates//crates:BUILD.chrono-tz-0.10.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cipher-0.4.4\",\n sha256 = \"773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cipher/0.4.4/download\"],\n strip_prefix = \"cipher-0.4.4\",\n build_file = Label(\"@crates//crates:BUILD.cipher-0.4.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clang-sys-1.8.1\",\n sha256 = \"0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clang-sys/1.8.1/download\"],\n strip_prefix = \"clang-sys-1.8.1\",\n build_file = Label(\"@crates//crates:BUILD.clang-sys-1.8.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clap-4.6.4\",\n sha256 = \"d91e0c145792ef73a6ad36d27c75ac09f1832222a3c209689d90f534685ee5b7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap/4.6.4/download\"],\n strip_prefix = \"clap-4.6.4\",\n build_file = Label(\"@crates//crates:BUILD.clap-4.6.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clap_builder-4.6.2\",\n sha256 = \"f09628afdcc538b57f3c6341e9c8e9970f18e4a481690a64974d7023bd33548b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap_builder/4.6.2/download\"],\n strip_prefix = \"clap_builder-4.6.2\",\n build_file = Label(\"@crates//crates:BUILD.clap_builder-4.6.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clap_derive-4.6.4\",\n sha256 = \"d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap_derive/4.6.4/download\"],\n strip_prefix = \"clap_derive-4.6.4\",\n build_file = Label(\"@crates//crates:BUILD.clap_derive-4.6.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clap_lex-1.1.0\",\n sha256 = \"c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap_lex/1.1.0/download\"],\n strip_prefix = \"clap_lex-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.clap_lex-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clipboard-win-5.4.1\",\n sha256 = \"bde03770d3df201d4fb868f2c9c59e66a3e4e2bd06692a0fe701e7103c7e84d4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clipboard-win/5.4.1/download\"],\n strip_prefix = \"clipboard-win-5.4.1\",\n build_file = Label(\"@crates//crates:BUILD.clipboard-win-5.4.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cmake-0.1.58\",\n sha256 = \"c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cmake/0.1.58/download\"],\n strip_prefix = \"cmake-0.1.58\",\n build_file = Label(\"@crates//crates:BUILD.cmake-0.1.58.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__codesnake-0.2.1\",\n sha256 = \"2205f7f6d3de68ecf4c291c789b3edf07b6569268abd0188819086f71ae42225\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/codesnake/0.2.1/download\"],\n strip_prefix = \"codesnake-0.2.1\",\n build_file = Label(\"@crates//crates:BUILD.codesnake-0.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__color-print-0.3.7\",\n sha256 = \"3aa954171903797d5623e047d9ab69d91b493657917bdfb8c2c80ecaf9cdb6f4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/color-print/0.3.7/download\"],\n strip_prefix = \"color-print-0.3.7\",\n build_file = Label(\"@crates//crates:BUILD.color-print-0.3.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__color-print-proc-macro-0.3.7\",\n sha256 = \"692186b5ebe54007e45a59aea47ece9eb4108e141326c304cdc91699a7118a22\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/color-print-proc-macro/0.3.7/download\"],\n strip_prefix = \"color-print-proc-macro-0.3.7\",\n build_file = Label(\"@crates//crates:BUILD.color-print-proc-macro-0.3.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__color_quant-1.1.0\",\n sha256 = \"3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/color_quant/1.1.0/download\"],\n strip_prefix = \"color_quant-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.color_quant-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__colorchoice-1.0.5\",\n sha256 = \"1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/colorchoice/1.0.5/download\"],\n strip_prefix = \"colorchoice-1.0.5\",\n build_file = Label(\"@crates//crates:BUILD.colorchoice-1.0.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__command-fds-0.3.3\",\n sha256 = \"1b60b5124979fccd9addd89d8b97a1d6eebb4950694520c75ddd722535ea443f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/command-fds/0.3.3/download\"],\n strip_prefix = \"command-fds-0.3.3\",\n build_file = Label(\"@crates//crates:BUILD.command-fds-0.3.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__compare-0.1.0\",\n sha256 = \"120133d4db2ec47efe2e26502ee984747630c67f51974fca0b6c1340cf2368d3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/compare/0.1.0/download\"],\n strip_prefix = \"compare-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.compare-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__concurrent-queue-2.5.0\",\n sha256 = \"4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/concurrent-queue/2.5.0/download\"],\n strip_prefix = \"concurrent-queue-2.5.0\",\n build_file = Label(\"@crates//crates:BUILD.concurrent-queue-2.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__console-0.16.4\",\n sha256 = \"4fe5f465a4f6fee88fad41b85d990f84c835335e85b5d9e6e63e0d06d28cba7c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/console/0.16.4/download\"],\n strip_prefix = \"console-0.16.4\",\n build_file = Label(\"@crates//crates:BUILD.console-0.16.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__const-oid-0.10.2\",\n sha256 = \"a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/const-oid/0.10.2/download\"],\n strip_prefix = \"const-oid-0.10.2\",\n build_file = Label(\"@crates//crates:BUILD.const-oid-0.10.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__const-oid-0.9.6\",\n sha256 = \"c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/const-oid/0.9.6/download\"],\n strip_prefix = \"const-oid-0.9.6\",\n build_file = Label(\"@crates//crates:BUILD.const-oid-0.9.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__const-random-0.1.18\",\n sha256 = \"87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/const-random/0.1.18/download\"],\n strip_prefix = \"const-random-0.1.18\",\n build_file = Label(\"@crates//crates:BUILD.const-random-0.1.18.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__const-random-macro-0.1.16\",\n sha256 = \"f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/const-random-macro/0.1.16/download\"],\n strip_prefix = \"const-random-macro-0.1.16\",\n build_file = Label(\"@crates//crates:BUILD.const-random-macro-0.1.16.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__constant_time_eq-0.4.2\",\n sha256 = \"3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/constant_time_eq/0.4.2/download\"],\n strip_prefix = \"constant_time_eq-0.4.2\",\n build_file = Label(\"@crates//crates:BUILD.constant_time_eq-0.4.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__convert_case-0.11.0\",\n sha256 = \"affbf0190ed2caf063e3def54ff444b449371d55c58e513a95ab98eca50adb49\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/convert_case/0.11.0/download\"],\n strip_prefix = \"convert_case-0.11.0\",\n build_file = Label(\"@crates//crates:BUILD.convert_case-0.11.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__convert_case-0.8.0\",\n sha256 = \"baaaa0ecca5b51987b9423ccdc971514dd8b0bb7b4060b983d3664dad3f1f89f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/convert_case/0.8.0/download\"],\n strip_prefix = \"convert_case-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.convert_case-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cookie-factory-0.3.3\",\n sha256 = \"9885fa71e26b8ab7855e2ec7cae6e9b380edff76cd052e07c683a0319d51b3a2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cookie-factory/0.3.3/download\"],\n strip_prefix = \"cookie-factory-0.3.3\",\n build_file = Label(\"@crates//crates:BUILD.cookie-factory-0.3.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__core-foundation-0.10.1\",\n sha256 = \"b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/core-foundation/0.10.1/download\"],\n strip_prefix = \"core-foundation-0.10.1\",\n build_file = Label(\"@crates//crates:BUILD.core-foundation-0.10.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__core-foundation-sys-0.8.7\",\n sha256 = \"773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/core-foundation-sys/0.8.7/download\"],\n strip_prefix = \"core-foundation-sys-0.8.7\",\n build_file = Label(\"@crates//crates:BUILD.core-foundation-sys-0.8.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__core-graphics-0.25.0\",\n sha256 = \"064badf302c3194842cf2c5d61f56cc88e54a759313879cdf03abdd27d0c3b97\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/core-graphics/0.25.0/download\"],\n strip_prefix = \"core-graphics-0.25.0\",\n build_file = Label(\"@crates//crates:BUILD.core-graphics-0.25.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__core-graphics-types-0.2.0\",\n sha256 = \"3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/core-graphics-types/0.2.0/download\"],\n strip_prefix = \"core-graphics-types-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.core-graphics-types-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__core_maths-0.1.1\",\n sha256 = \"77745e017f5edba1a9c1d854f6f3a52dac8a12dd5af5d2f54aecf61e43d80d30\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/core_maths/0.1.1/download\"],\n strip_prefix = \"core_maths-0.1.1\",\n build_file = Label(\"@crates//crates:BUILD.core_maths-0.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cpufeatures-0.2.17\",\n sha256 = \"59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cpufeatures/0.2.17/download\"],\n strip_prefix = \"cpufeatures-0.2.17\",\n build_file = Label(\"@crates//crates:BUILD.cpufeatures-0.2.17.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cpufeatures-0.3.0\",\n sha256 = \"8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cpufeatures/0.3.0/download\"],\n strip_prefix = \"cpufeatures-0.3.0\",\n build_file = Label(\"@crates//crates:BUILD.cpufeatures-0.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crc-3.4.0\",\n sha256 = \"5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crc/3.4.0/download\"],\n strip_prefix = \"crc-3.4.0\",\n build_file = Label(\"@crates//crates:BUILD.crc-3.4.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crc-catalog-2.5.0\",\n sha256 = \"217698eaf96b4a3f0bc4f3662aaa55bdf913cd54d7204591faa790070c6d0853\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crc-catalog/2.5.0/download\"],\n strip_prefix = \"crc-catalog-2.5.0\",\n build_file = Label(\"@crates//crates:BUILD.crc-catalog-2.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crc-fast-1.8.2\",\n sha256 = \"85d9be5297a59f1b7651fd2711a1f4461929f53b182b394df0df15b3a387ef51\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crc-fast/1.8.2/download\"],\n strip_prefix = \"crc-fast-1.8.2\",\n build_file = Label(\"@crates//crates:BUILD.crc-fast-1.8.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crc32fast-1.5.0\",\n sha256 = \"9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crc32fast/1.5.0/download\"],\n strip_prefix = \"crc32fast-1.5.0\",\n build_file = Label(\"@crates//crates:BUILD.crc32fast-1.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crossbeam-deque-0.8.7\",\n sha256 = \"5181e0de7b61eb03a81e347d6dd8797bae9da5146707b51077e2d71a54ec0ceb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crossbeam-deque/0.8.7/download\"],\n strip_prefix = \"crossbeam-deque-0.8.7\",\n build_file = Label(\"@crates//crates:BUILD.crossbeam-deque-0.8.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crossbeam-epoch-0.9.20\",\n sha256 = \"2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crossbeam-epoch/0.9.20/download\"],\n strip_prefix = \"crossbeam-epoch-0.9.20\",\n build_file = Label(\"@crates//crates:BUILD.crossbeam-epoch-0.9.20.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crossbeam-utils-0.8.22\",\n sha256 = \"61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crossbeam-utils/0.8.22/download\"],\n strip_prefix = \"crossbeam-utils-0.8.22\",\n build_file = Label(\"@crates//crates:BUILD.crossbeam-utils-0.8.22.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crunchy-0.2.4\",\n sha256 = \"460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crunchy/0.2.4/download\"],\n strip_prefix = \"crunchy-0.2.4\",\n build_file = Label(\"@crates//crates:BUILD.crunchy-0.2.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crypto-bigint-0.5.5\",\n sha256 = \"0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crypto-bigint/0.5.5/download\"],\n strip_prefix = \"crypto-bigint-0.5.5\",\n build_file = Label(\"@crates//crates:BUILD.crypto-bigint-0.5.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crypto-common-0.1.7\",\n sha256 = \"78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crypto-common/0.1.7/download\"],\n strip_prefix = \"crypto-common-0.1.7\",\n build_file = Label(\"@crates//crates:BUILD.crypto-common-0.1.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crypto-common-0.2.2\",\n sha256 = \"ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crypto-common/0.2.2/download\"],\n strip_prefix = \"crypto-common-0.2.2\",\n build_file = Label(\"@crates//crates:BUILD.crypto-common-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ctor-1.0.11\",\n sha256 = \"e9bb72bb94fdc1bd619f4c18cc91ecf6302aeb333d31b3c6ec0bb841cd920209\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ctor/1.0.11/download\"],\n strip_prefix = \"ctor-1.0.11\",\n build_file = Label(\"@crates//crates:BUILD.ctor-1.0.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ctr-0.9.2\",\n sha256 = \"0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ctr/0.9.2/download\"],\n strip_prefix = \"ctr-0.9.2\",\n build_file = Label(\"@crates//crates:BUILD.ctr-0.9.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__curve25519-dalek-4.1.3\",\n sha256 = \"97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/curve25519-dalek/4.1.3/download\"],\n strip_prefix = \"curve25519-dalek-4.1.3\",\n build_file = Label(\"@crates//crates:BUILD.curve25519-dalek-4.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__curve25519-dalek-derive-0.1.1\",\n sha256 = \"f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/curve25519-dalek-derive/0.1.1/download\"],\n strip_prefix = \"curve25519-dalek-derive-0.1.1\",\n build_file = Label(\"@crates//crates:BUILD.curve25519-dalek-derive-0.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__darling-0.20.11\",\n sha256 = \"fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/darling/0.20.11/download\"],\n strip_prefix = \"darling-0.20.11\",\n build_file = Label(\"@crates//crates:BUILD.darling-0.20.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__darling-0.23.0\",\n sha256 = \"25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/darling/0.23.0/download\"],\n strip_prefix = \"darling-0.23.0\",\n build_file = Label(\"@crates//crates:BUILD.darling-0.23.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__darling_core-0.20.11\",\n sha256 = \"0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/darling_core/0.20.11/download\"],\n strip_prefix = \"darling_core-0.20.11\",\n build_file = Label(\"@crates//crates:BUILD.darling_core-0.20.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__darling_core-0.23.0\",\n sha256 = \"9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/darling_core/0.23.0/download\"],\n strip_prefix = \"darling_core-0.23.0\",\n build_file = Label(\"@crates//crates:BUILD.darling_core-0.23.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__darling_macro-0.20.11\",\n sha256 = \"fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/darling_macro/0.20.11/download\"],\n strip_prefix = \"darling_macro-0.20.11\",\n build_file = Label(\"@crates//crates:BUILD.darling_macro-0.20.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__darling_macro-0.23.0\",\n sha256 = \"ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/darling_macro/0.23.0/download\"],\n strip_prefix = \"darling_macro-0.23.0\",\n build_file = Label(\"@crates//crates:BUILD.darling_macro-0.23.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__dashmap-6.2.1\",\n sha256 = \"e6361d5c062261c78a176addb82d4c821ae42bed6089de0e12603cd25de2059c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/dashmap/6.2.1/download\"],\n strip_prefix = \"dashmap-6.2.1\",\n build_file = Label(\"@crates//crates:BUILD.dashmap-6.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__data-encoding-2.11.0\",\n sha256 = \"a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/data-encoding/2.11.0/download\"],\n strip_prefix = \"data-encoding-2.11.0\",\n build_file = Label(\"@crates//crates:BUILD.data-encoding-2.11.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__data-encoding-macro-0.1.20\",\n sha256 = \"3259c913752a86488b501ed8680446a5ed2d5aeac6e596cb23ba3800768ea32c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/data-encoding-macro/0.1.20/download\"],\n strip_prefix = \"data-encoding-macro-0.1.20\",\n build_file = Label(\"@crates//crates:BUILD.data-encoding-macro-0.1.20.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__data-encoding-macro-internal-0.1.18\",\n sha256 = \"ccc2776f0c61eca1ca32528f85548abd1a4be8fb53d1b21c013e4f18da1e7090\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/data-encoding-macro-internal/0.1.18/download\"],\n strip_prefix = \"data-encoding-macro-internal-0.1.18\",\n build_file = Label(\"@crates//crates:BUILD.data-encoding-macro-internal-0.1.18.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__defmt-1.1.1\",\n sha256 = \"e2953bfe4f93bbd20cc71198842756f77d161884c99ebbabc41d80231ded88d1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/defmt/1.1.1/download\"],\n strip_prefix = \"defmt-1.1.1\",\n build_file = Label(\"@crates//crates:BUILD.defmt-1.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__defmt-macros-1.1.1\",\n sha256 = \"bad9c72e7ca2137e0dc3813245a0d282fd6daad32fd800af018306a9169b5fe8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/defmt-macros/1.1.1/download\"],\n strip_prefix = \"defmt-macros-1.1.1\",\n build_file = Label(\"@crates//crates:BUILD.defmt-macros-1.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__defmt-parser-1.0.0\",\n sha256 = \"10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/defmt-parser/1.0.0/download\"],\n strip_prefix = \"defmt-parser-1.0.0\",\n build_file = Label(\"@crates//crates:BUILD.defmt-parser-1.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__der-0.7.10\",\n sha256 = \"e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/der/0.7.10/download\"],\n strip_prefix = \"der-0.7.10\",\n build_file = Label(\"@crates//crates:BUILD.der-0.7.10.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__der-parser-9.0.0\",\n sha256 = \"5cd0a5c643689626bec213c4d8bd4d96acc8ffdb4ad4bb6bc16abf27d5f4b553\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/der-parser/9.0.0/download\"],\n strip_prefix = \"der-parser-9.0.0\",\n build_file = Label(\"@crates//crates:BUILD.der-parser-9.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__deranged-0.5.8\",\n sha256 = \"7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/deranged/0.5.8/download\"],\n strip_prefix = \"deranged-0.5.8\",\n build_file = Label(\"@crates//crates:BUILD.deranged-0.5.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__diff-0.1.13\",\n sha256 = \"56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/diff/0.1.13/download\"],\n strip_prefix = \"diff-0.1.13\",\n build_file = Label(\"@crates//crates:BUILD.diff-0.1.13.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__digest-0.10.7\",\n sha256 = \"9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/digest/0.10.7/download\"],\n strip_prefix = \"digest-0.10.7\",\n build_file = Label(\"@crates//crates:BUILD.digest-0.10.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__digest-0.11.3\",\n sha256 = \"f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/digest/0.11.3/download\"],\n strip_prefix = \"digest-0.11.3\",\n build_file = Label(\"@crates//crates:BUILD.digest-0.11.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__dispatch2-0.3.1\",\n sha256 = \"1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/dispatch2/0.3.1/download\"],\n strip_prefix = \"dispatch2-0.3.1\",\n build_file = Label(\"@crates//crates:BUILD.dispatch2-0.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__displaydoc-0.2.6\",\n sha256 = \"1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/displaydoc/0.2.6/download\"],\n strip_prefix = \"displaydoc-0.2.6\",\n build_file = Label(\"@crates//crates:BUILD.displaydoc-0.2.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__dlib-0.5.3\",\n sha256 = \"ab8ecd87370524b461f8557c119c405552c396ed91fc0a8eec68679eab26f94a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/dlib/0.5.3/download\"],\n strip_prefix = \"dlib-0.5.3\",\n build_file = Label(\"@crates//crates:BUILD.dlib-0.5.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__dns-lookup-3.0.1\",\n sha256 = \"6e39034cee21a2f5bbb66ba0e3689819c4bb5d00382a282006e802a7ffa6c41d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/dns-lookup/3.0.1/download\"],\n strip_prefix = \"dns-lookup-3.0.1\",\n build_file = Label(\"@crates//crates:BUILD.dns-lookup-3.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__downcast-rs-1.2.1\",\n sha256 = \"75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/downcast-rs/1.2.1/download\"],\n strip_prefix = \"downcast-rs-1.2.1\",\n build_file = Label(\"@crates//crates:BUILD.downcast-rs-1.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__drm-0.14.1\",\n sha256 = \"80bc8c5c6c2941f70a55c15f8d9f00f9710ebda3ffda98075f996a0e6c92756f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/drm/0.14.1/download\"],\n strip_prefix = \"drm-0.14.1\",\n build_file = Label(\"@crates//crates:BUILD.drm-0.14.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__drm-0.15.0\",\n sha256 = \"7a41816e58f47f49acfd956651055ddcf137c4882c2098c30c448817af21183a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/drm/0.15.0/download\"],\n strip_prefix = \"drm-0.15.0\",\n build_file = Label(\"@crates//crates:BUILD.drm-0.15.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__drm-ffi-0.9.1\",\n sha256 = \"51a91c9b32ac4e8105dec255e849e0d66e27d7c34d184364fb93e469db08f690\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/drm-ffi/0.9.1/download\"],\n strip_prefix = \"drm-ffi-0.9.1\",\n build_file = Label(\"@crates//crates:BUILD.drm-ffi-0.9.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__drm-fourcc-2.2.0\",\n sha256 = \"0aafbcdb8afc29c1a7ee5fbe53b5d62f4565b35a042a662ca9fecd0b54dae6f4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/drm-fourcc/2.2.0/download\"],\n strip_prefix = \"drm-fourcc-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.drm-fourcc-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__drm-sys-0.8.1\",\n sha256 = \"ecc8e1361066d91f5ffccff060a3c3be9c3ecde15be2959c1937595f7a82a9f8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/drm-sys/0.8.1/download\"],\n strip_prefix = \"drm-sys-0.8.1\",\n build_file = Label(\"@crates//crates:BUILD.drm-sys-0.8.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__dtls-0.17.2\",\n sha256 = \"01a431e87fc386bd5e02deb554a013f97bc406e47a7d8e97efb7c6366b980e9c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/dtls/0.17.2/download\"],\n strip_prefix = \"dtls-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.dtls-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__dunce-1.0.5\",\n sha256 = \"92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/dunce/1.0.5/download\"],\n strip_prefix = \"dunce-1.0.5\",\n build_file = Label(\"@crates//crates:BUILD.dunce-1.0.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__dyn-clone-1.0.20\",\n sha256 = \"d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/dyn-clone/1.0.20/download\"],\n strip_prefix = \"dyn-clone-1.0.20\",\n build_file = Label(\"@crates//crates:BUILD.dyn-clone-1.0.20.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ecdsa-0.16.9\",\n sha256 = \"ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ecdsa/0.16.9/download\"],\n strip_prefix = \"ecdsa-0.16.9\",\n build_file = Label(\"@crates//crates:BUILD.ecdsa-0.16.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__either-1.17.0\",\n sha256 = \"9e5e8f6c15a24b9a3ee5efec809ccd006d3b30e8b3bb63c39af737c7f87daa1d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/either/1.17.0/download\"],\n strip_prefix = \"either-1.17.0\",\n build_file = Label(\"@crates//crates:BUILD.either-1.17.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__elliptic-curve-0.13.8\",\n sha256 = \"b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/elliptic-curve/0.13.8/download\"],\n strip_prefix = \"elliptic-curve-0.13.8\",\n build_file = Label(\"@crates//crates:BUILD.elliptic-curve-0.13.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__encode_unicode-1.0.0\",\n sha256 = \"34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/encode_unicode/1.0.0/download\"],\n strip_prefix = \"encode_unicode-1.0.0\",\n build_file = Label(\"@crates//crates:BUILD.encode_unicode-1.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__encoding_rs-0.8.35\",\n sha256 = \"75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/encoding_rs/0.8.35/download\"],\n strip_prefix = \"encoding_rs-0.8.35\",\n build_file = Label(\"@crates//crates:BUILD.encoding_rs-0.8.35.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__encoding_rs_io-0.1.7\",\n sha256 = \"1cc3c5651fb62ab8aa3103998dade57efdd028544bd300516baa31840c252a83\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/encoding_rs_io/0.1.7/download\"],\n strip_prefix = \"encoding_rs_io-0.1.7\",\n build_file = Label(\"@crates//crates:BUILD.encoding_rs_io-0.1.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__endi-1.1.1\",\n sha256 = \"66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/endi/1.1.1/download\"],\n strip_prefix = \"endi-1.1.1\",\n build_file = Label(\"@crates//crates:BUILD.endi-1.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__enigo-0.6.1\",\n sha256 = \"71c6c56e50f7acae2906a0dcbb34529ca647e40421119ad5d12e7f8ba6e50010\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/enigo/0.6.1/download\"],\n strip_prefix = \"enigo-0.6.1\",\n build_file = Label(\"@crates//crates:BUILD.enigo-0.6.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__enumflags2-0.7.12\",\n sha256 = \"1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/enumflags2/0.7.12/download\"],\n strip_prefix = \"enumflags2-0.7.12\",\n build_file = Label(\"@crates//crates:BUILD.enumflags2-0.7.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__enumflags2_derive-0.7.12\",\n sha256 = \"67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/enumflags2_derive/0.7.12/download\"],\n strip_prefix = \"enumflags2_derive-0.7.12\",\n build_file = Label(\"@crates//crates:BUILD.enumflags2_derive-0.7.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__equivalent-1.0.2\",\n sha256 = \"877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/equivalent/1.0.2/download\"],\n strip_prefix = \"equivalent-1.0.2\",\n build_file = Label(\"@crates//crates:BUILD.equivalent-1.0.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__errno-0.3.14\",\n sha256 = \"39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/errno/0.3.14/download\"],\n strip_prefix = \"errno-0.3.14\",\n build_file = Label(\"@crates//crates:BUILD.errno-0.3.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__error-code-3.3.2\",\n sha256 = \"dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/error-code/3.3.2/download\"],\n strip_prefix = \"error-code-3.3.2\",\n build_file = Label(\"@crates//crates:BUILD.error-code-3.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__event-listener-5.4.2\",\n sha256 = \"5a23add41df1562121a9393cb065eab5146a1242410f23a644851e90cfd669d2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/event-listener/5.4.2/download\"],\n strip_prefix = \"event-listener-5.4.2\",\n build_file = Label(\"@crates//crates:BUILD.event-listener-5.4.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__event-listener-strategy-0.5.4\",\n sha256 = \"8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/event-listener-strategy/0.5.4/download\"],\n strip_prefix = \"event-listener-strategy-0.5.4\",\n build_file = Label(\"@crates//crates:BUILD.event-listener-strategy-0.5.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__faccess-0.2.4\",\n sha256 = \"59ae66425802d6a903e268ae1a08b8c38ba143520f227a205edf4e9c7e3e26d5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/faccess/0.2.4/download\"],\n strip_prefix = \"faccess-0.2.4\",\n build_file = Label(\"@crates//crates:BUILD.faccess-0.2.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fancy-regex-0.16.2\",\n sha256 = \"998b056554fbe42e03ae0e152895cd1a7e1002aec800fdc6635d20270260c46f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fancy-regex/0.16.2/download\"],\n strip_prefix = \"fancy-regex-0.16.2\",\n build_file = Label(\"@crates//crates:BUILD.fancy-regex-0.16.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fancy-regex-0.17.0\",\n sha256 = \"72cf461f865c862bb7dc573f643dd6a2b6842f7c30b07882b56bd148cc2761b8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fancy-regex/0.17.0/download\"],\n strip_prefix = \"fancy-regex-0.17.0\",\n build_file = Label(\"@crates//crates:BUILD.fancy-regex-0.17.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fancy-regex-0.18.0\",\n sha256 = \"e1e1dacd0d2082dfcf1351c4bdd566bbe89a2b263235a2b50058f1e130a47277\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fancy-regex/0.18.0/download\"],\n strip_prefix = \"fancy-regex-0.18.0\",\n build_file = Label(\"@crates//crates:BUILD.fancy-regex-0.18.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fast-srgb8-1.0.0\",\n sha256 = \"dd2e7510819d6fbf51a5545c8f922716ecfb14df168a3242f7d33e0239efe6a1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fast-srgb8/1.0.0/download\"],\n strip_prefix = \"fast-srgb8-1.0.0\",\n build_file = Label(\"@crates//crates:BUILD.fast-srgb8-1.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fastrand-2.5.0\",\n sha256 = \"da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fastrand/2.5.0/download\"],\n strip_prefix = \"fastrand-2.5.0\",\n build_file = Label(\"@crates//crates:BUILD.fastrand-2.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fax-0.2.7\",\n sha256 = \"caf1079563223d5d59d83c85886a56e586cfd5c1a26292e971a0fa266531ac5a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fax/0.2.7/download\"],\n strip_prefix = \"fax-0.2.7\",\n build_file = Label(\"@crates//crates:BUILD.fax-0.2.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fdeflate-0.3.7\",\n sha256 = \"1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fdeflate/0.3.7/download\"],\n strip_prefix = \"fdeflate-0.3.7\",\n build_file = Label(\"@crates//crates:BUILD.fdeflate-0.3.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ff-0.13.1\",\n sha256 = \"c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ff/0.13.1/download\"],\n strip_prefix = \"ff-0.13.1\",\n build_file = Label(\"@crates//crates:BUILD.ff-0.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fiat-crypto-0.2.9\",\n sha256 = \"28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fiat-crypto/0.2.9/download\"],\n strip_prefix = \"fiat-crypto-0.2.9\",\n build_file = Label(\"@crates//crates:BUILD.fiat-crypto-0.2.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__filedescriptor-0.8.3\",\n sha256 = \"e40758ed24c9b2eeb76c35fb0aebc66c626084edd827e07e1552279814c6682d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/filedescriptor/0.8.3/download\"],\n strip_prefix = \"filedescriptor-0.8.3\",\n build_file = Label(\"@crates//crates:BUILD.filedescriptor-0.8.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__filetime-0.2.29\",\n sha256 = \"5c287a33c7f0a620c38e641e7f60827713987b3c0f26e8ddc9462cc69cf75759\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/filetime/0.2.29/download\"],\n strip_prefix = \"filetime-0.2.29\",\n build_file = Label(\"@crates//crates:BUILD.filetime-0.2.29.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__find-msvc-tools-0.1.9\",\n sha256 = \"5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/find-msvc-tools/0.1.9/download\"],\n strip_prefix = \"find-msvc-tools-0.1.9\",\n build_file = Label(\"@crates//crates:BUILD.find-msvc-tools-0.1.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fixed_decimal-0.7.2\",\n sha256 = \"79c3c892f121fff406e5dd6b28c1b30096b95111c30701a899d4f2b18da6d1bd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fixed_decimal/0.7.2/download\"],\n strip_prefix = \"fixed_decimal-0.7.2\",\n build_file = Label(\"@crates//crates:BUILD.fixed_decimal-0.7.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fixedbitset-0.5.7\",\n sha256 = \"1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fixedbitset/0.5.7/download\"],\n strip_prefix = \"fixedbitset-0.5.7\",\n build_file = Label(\"@crates//crates:BUILD.fixedbitset-0.5.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__flate2-1.1.9\",\n sha256 = \"843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/flate2/1.1.9/download\"],\n strip_prefix = \"flate2-1.1.9\",\n build_file = Label(\"@crates//crates:BUILD.flate2-1.1.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fluent-0.17.0\",\n sha256 = \"8137a6d5a2c50d6b0ebfcb9aaa91a28154e0a70605f112d30cb0cd4a78670477\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fluent/0.17.0/download\"],\n strip_prefix = \"fluent-0.17.0\",\n build_file = Label(\"@crates//crates:BUILD.fluent-0.17.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fluent-bundle-0.16.0\",\n sha256 = \"01203cb8918f5711e73891b347816d932046f95f54207710bda99beaeb423bf4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fluent-bundle/0.16.0/download\"],\n strip_prefix = \"fluent-bundle-0.16.0\",\n build_file = Label(\"@crates//crates:BUILD.fluent-bundle-0.16.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fluent-langneg-0.13.1\",\n sha256 = \"7eebbe59450baee8282d71676f3bfed5689aeab00b27545e83e5f14b1195e8b0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fluent-langneg/0.13.1/download\"],\n strip_prefix = \"fluent-langneg-0.13.1\",\n build_file = Label(\"@crates//crates:BUILD.fluent-langneg-0.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fluent-syntax-0.12.0\",\n sha256 = \"54f0d287c53ffd184d04d8677f590f4ac5379785529e5e08b1c8083acdd5c198\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fluent-syntax/0.12.0/download\"],\n strip_prefix = \"fluent-syntax-0.12.0\",\n build_file = Label(\"@crates//crates:BUILD.fluent-syntax-0.12.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__flume-0.11.1\",\n sha256 = \"da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/flume/0.11.1/download\"],\n strip_prefix = \"flume-0.11.1\",\n build_file = Label(\"@crates//crates:BUILD.flume-0.11.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fnv-1.0.7\",\n sha256 = \"3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fnv/1.0.7/download\"],\n strip_prefix = \"fnv-1.0.7\",\n build_file = Label(\"@crates//crates:BUILD.fnv-1.0.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__foldhash-0.1.5\",\n sha256 = \"d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/foldhash/0.1.5/download\"],\n strip_prefix = \"foldhash-0.1.5\",\n build_file = Label(\"@crates//crates:BUILD.foldhash-0.1.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__foldhash-0.2.0\",\n sha256 = \"77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/foldhash/0.2.0/download\"],\n strip_prefix = \"foldhash-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.foldhash-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fontdue-0.9.3\",\n sha256 = \"2e57e16b3fe8ff4364c0661fdaac543fb38b29ea9bc9c2f45612d90adf931d2b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fontdue/0.9.3/download\"],\n strip_prefix = \"fontdue-0.9.3\",\n build_file = Label(\"@crates//crates:BUILD.fontdue-0.9.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__foreign-types-0.5.0\",\n sha256 = \"d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/foreign-types/0.5.0/download\"],\n strip_prefix = \"foreign-types-0.5.0\",\n build_file = Label(\"@crates//crates:BUILD.foreign-types-0.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__foreign-types-macros-0.2.4\",\n sha256 = \"ea5190182e6915eb873ddbc16e23b711b6eb1f9c00a0d0a3a91b5f6228475225\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/foreign-types-macros/0.2.4/download\"],\n strip_prefix = \"foreign-types-macros-0.2.4\",\n build_file = Label(\"@crates//crates:BUILD.foreign-types-macros-0.2.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__foreign-types-shared-0.3.1\",\n sha256 = \"aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/foreign-types-shared/0.3.1/download\"],\n strip_prefix = \"foreign-types-shared-0.3.1\",\n build_file = Label(\"@crates//crates:BUILD.foreign-types-shared-0.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__form_urlencoded-1.2.2\",\n sha256 = \"cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/form_urlencoded/1.2.2/download\"],\n strip_prefix = \"form_urlencoded-1.2.2\",\n build_file = Label(\"@crates//crates:BUILD.form_urlencoded-1.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fs_extra-1.3.0\",\n sha256 = \"42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fs_extra/1.3.0/download\"],\n strip_prefix = \"fs_extra-1.3.0\",\n build_file = Label(\"@crates//crates:BUILD.fs_extra-1.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fsevent-sys-4.1.0\",\n sha256 = \"76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fsevent-sys/4.1.0/download\"],\n strip_prefix = \"fsevent-sys-4.1.0\",\n build_file = Label(\"@crates//crates:BUILD.fsevent-sys-4.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__funty-2.0.0\",\n sha256 = \"e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/funty/2.0.0/download\"],\n strip_prefix = \"funty-2.0.0\",\n build_file = Label(\"@crates//crates:BUILD.funty-2.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-0.3.33\",\n sha256 = \"a88cf1f829d945f548cf8fec32c61b1f202b6d93b45848602fc02af4b12ad218\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures/0.3.33/download\"],\n strip_prefix = \"futures-0.3.33\",\n build_file = Label(\"@crates//crates:BUILD.futures-0.3.33.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-channel-0.3.33\",\n sha256 = \"262590f4fe6afeb0bc83be1daa64e52657fe185690a958af7f3ad0e92085c5ae\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-channel/0.3.33/download\"],\n strip_prefix = \"futures-channel-0.3.33\",\n build_file = Label(\"@crates//crates:BUILD.futures-channel-0.3.33.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-core-0.3.33\",\n sha256 = \"2cd50c473c80f6d7c3670a752354b8e569b1a7cbfdc0419ec88e5edad85e0dc7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-core/0.3.33/download\"],\n strip_prefix = \"futures-core-0.3.33\",\n build_file = Label(\"@crates//crates:BUILD.futures-core-0.3.33.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-executor-0.3.33\",\n sha256 = \"6754879cc9f2c66f88c6e5c35344bb0bdb0708b0352b1201815667c7eabc7458\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-executor/0.3.33/download\"],\n strip_prefix = \"futures-executor-0.3.33\",\n build_file = Label(\"@crates//crates:BUILD.futures-executor-0.3.33.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-io-0.3.33\",\n sha256 = \"4577ecaa3c4f96589d473f679a71b596316f6641bc350038b962a5daf0085d7a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-io/0.3.33/download\"],\n strip_prefix = \"futures-io-0.3.33\",\n build_file = Label(\"@crates//crates:BUILD.futures-io-0.3.33.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-lite-2.6.1\",\n sha256 = \"f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-lite/2.6.1/download\"],\n strip_prefix = \"futures-lite-2.6.1\",\n build_file = Label(\"@crates//crates:BUILD.futures-lite-2.6.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-macro-0.3.33\",\n sha256 = \"2d6d3cde68c518367be28956066ddfef33813991b77a55005a69dae04bf3b10b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-macro/0.3.33/download\"],\n strip_prefix = \"futures-macro-0.3.33\",\n build_file = Label(\"@crates//crates:BUILD.futures-macro-0.3.33.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-sink-0.3.33\",\n sha256 = \"e34418ac499d6305c2fb5ad0ed2f6ac998c5f8ca209b4510f7f94242c647e307\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-sink/0.3.33/download\"],\n strip_prefix = \"futures-sink-0.3.33\",\n build_file = Label(\"@crates//crates:BUILD.futures-sink-0.3.33.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-task-0.3.33\",\n sha256 = \"b231ed28831efb4a61a08580c4bc233ec56bc009f4cd8f52da2c3cb97df0c109\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-task/0.3.33/download\"],\n strip_prefix = \"futures-task-0.3.33\",\n build_file = Label(\"@crates//crates:BUILD.futures-task-0.3.33.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-timer-3.0.4\",\n sha256 = \"af43fadb8a98512d547e37b4e92e0ced13e205c061b87b4623eff01d918d6968\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-timer/3.0.4/download\"],\n strip_prefix = \"futures-timer-3.0.4\",\n build_file = Label(\"@crates//crates:BUILD.futures-timer-3.0.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-util-0.3.33\",\n sha256 = \"a77a90a256fce34da66415271e30f94ee91c57b04b8a2c042d9cf3220179deaa\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-util/0.3.33/download\"],\n strip_prefix = \"futures-util-0.3.33\",\n build_file = Label(\"@crates//crates:BUILD.futures-util-0.3.33.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__gbm-0.18.0\",\n sha256 = \"ce852e998d3ca5e4a97014fb31c940dc5ef344ec7d364984525fd11e8a547e6a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/gbm/0.18.0/download\"],\n strip_prefix = \"gbm-0.18.0\",\n build_file = Label(\"@crates//crates:BUILD.gbm-0.18.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__gbm-sys-0.4.0\",\n sha256 = \"c13a5f2acc785d8fb6bf6b7ab6bfb0ef5dad4f4d97e8e70bb8e470722312f76f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/gbm-sys/0.4.0/download\"],\n strip_prefix = \"gbm-sys-0.4.0\",\n build_file = Label(\"@crates//crates:BUILD.gbm-sys-0.4.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__generic-array-0.14.7\",\n sha256 = \"85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/generic-array/0.14.7/download\"],\n strip_prefix = \"generic-array-0.14.7\",\n build_file = Label(\"@crates//crates:BUILD.generic-array-0.14.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__gethostname-1.1.0\",\n sha256 = \"1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/gethostname/1.1.0/download\"],\n strip_prefix = \"gethostname-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.gethostname-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__getrandom-0.2.17\",\n sha256 = \"ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/getrandom/0.2.17/download\"],\n strip_prefix = \"getrandom-0.2.17\",\n build_file = Label(\"@crates//crates:BUILD.getrandom-0.2.17.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__getrandom-0.3.4\",\n sha256 = \"899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/getrandom/0.3.4/download\"],\n strip_prefix = \"getrandom-0.3.4\",\n build_file = Label(\"@crates//crates:BUILD.getrandom-0.3.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__getrandom-0.4.3\",\n sha256 = \"300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/getrandom/0.4.3/download\"],\n strip_prefix = \"getrandom-0.4.3\",\n build_file = Label(\"@crates//crates:BUILD.getrandom-0.4.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ghash-0.5.1\",\n sha256 = \"f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ghash/0.5.1/download\"],\n strip_prefix = \"ghash-0.5.1\",\n build_file = Label(\"@crates//crates:BUILD.ghash-0.5.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__gif-0.14.2\",\n sha256 = \"ee8cfcc411d9adbbaba82fb72661cc1bcca13e8bba98b364e62b2dba8f960159\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/gif/0.14.2/download\"],\n strip_prefix = \"gif-0.14.2\",\n build_file = Label(\"@crates//crates:BUILD.gif-0.14.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__gl-0.14.0\",\n sha256 = \"a94edab108827d67608095e269cf862e60d920f144a5026d3dbcfd8b877fb404\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/gl/0.14.0/download\"],\n strip_prefix = \"gl-0.14.0\",\n build_file = Label(\"@crates//crates:BUILD.gl-0.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__gl_generator-0.14.0\",\n sha256 = \"1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/gl_generator/0.14.0/download\"],\n strip_prefix = \"gl_generator-0.14.0\",\n build_file = Label(\"@crates//crates:BUILD.gl_generator-0.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__glob-0.3.4\",\n sha256 = \"e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/glob/0.3.4/download\"],\n strip_prefix = \"glob-0.3.4\",\n build_file = Label(\"@crates//crates:BUILD.glob-0.3.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__globset-0.4.19\",\n sha256 = \"e47d37d2ae4464254884b60ab7071be2b876a9c35b696bd018ddcc76847309cd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/globset/0.4.19/download\"],\n strip_prefix = \"globset-0.4.19\",\n build_file = Label(\"@crates//crates:BUILD.globset-0.4.19.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__grep-cli-0.1.12\",\n sha256 = \"cf32d263c5d5cc2a23ce587097f5ddafdb188492ba2e6fb638eaccdc22453631\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/grep-cli/0.1.12/download\"],\n strip_prefix = \"grep-cli-0.1.12\",\n build_file = Label(\"@crates//crates:BUILD.grep-cli-0.1.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__grep-matcher-0.1.9\",\n sha256 = \"f9417543f4870fc8f1c8e1af870afae2431007626d9e703fce6471c468d33847\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/grep-matcher/0.1.9/download\"],\n strip_prefix = \"grep-matcher-0.1.9\",\n build_file = Label(\"@crates//crates:BUILD.grep-matcher-0.1.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__grep-pcre2-0.1.10\",\n sha256 = \"b752bb6f57dd3716e55b63a33ca05b5825c3d66cd427468874a5564af6ca365c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/grep-pcre2/0.1.10/download\"],\n strip_prefix = \"grep-pcre2-0.1.10\",\n build_file = Label(\"@crates//crates:BUILD.grep-pcre2-0.1.10.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__grep-printer-0.3.1\",\n sha256 = \"fd76035e87871f51c1ee5b793e32122b3ccf9c692662d9622ef1686ff5321acb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/grep-printer/0.3.1/download\"],\n strip_prefix = \"grep-printer-0.3.1\",\n build_file = Label(\"@crates//crates:BUILD.grep-printer-0.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__grep-regex-0.1.14\",\n sha256 = \"0ce0c256c3ad82bcc07b812c15a45ec1d398122e8e15124f96695234db7112ef\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/grep-regex/0.1.14/download\"],\n strip_prefix = \"grep-regex-0.1.14\",\n build_file = Label(\"@crates//crates:BUILD.grep-regex-0.1.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__grep-searcher-0.1.17\",\n sha256 = \"72348823a0eafc4bc2e9051064f28b5b42cc100b571b3a35d67918d711efcbc6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/grep-searcher/0.1.17/download\"],\n strip_prefix = \"grep-searcher-0.1.17\",\n build_file = Label(\"@crates//crates:BUILD.grep-searcher-0.1.17.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__group-0.13.0\",\n sha256 = \"f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/group/0.13.0/download\"],\n strip_prefix = \"group-0.13.0\",\n build_file = Label(\"@crates//crates:BUILD.group-0.13.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__half-2.7.1\",\n sha256 = \"6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/half/2.7.1/download\"],\n strip_prefix = \"half-2.7.1\",\n build_file = Label(\"@crates//crates:BUILD.half-2.7.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hashbrown-0.14.5\",\n sha256 = \"e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hashbrown/0.14.5/download\"],\n strip_prefix = \"hashbrown-0.14.5\",\n build_file = Label(\"@crates//crates:BUILD.hashbrown-0.14.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hashbrown-0.15.5\",\n sha256 = \"9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hashbrown/0.15.5/download\"],\n strip_prefix = \"hashbrown-0.15.5\",\n build_file = Label(\"@crates//crates:BUILD.hashbrown-0.15.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hashbrown-0.16.1\",\n sha256 = \"841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hashbrown/0.16.1/download\"],\n strip_prefix = \"hashbrown-0.16.1\",\n build_file = Label(\"@crates//crates:BUILD.hashbrown-0.16.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hashbrown-0.17.1\",\n sha256 = \"ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hashbrown/0.17.1/download\"],\n strip_prefix = \"hashbrown-0.17.1\",\n build_file = Label(\"@crates//crates:BUILD.hashbrown-0.17.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__heck-0.5.0\",\n sha256 = \"2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/heck/0.5.0/download\"],\n strip_prefix = \"heck-0.5.0\",\n build_file = Label(\"@crates//crates:BUILD.heck-0.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hermit-abi-0.5.2\",\n sha256 = \"fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hermit-abi/0.5.2/download\"],\n strip_prefix = \"hermit-abi-0.5.2\",\n build_file = Label(\"@crates//crates:BUILD.hermit-abi-0.5.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hex-0.4.3\",\n sha256 = \"7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hex/0.4.3/download\"],\n strip_prefix = \"hex-0.4.3\",\n build_file = Label(\"@crates//crates:BUILD.hex-0.4.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hifijson-0.2.3\",\n sha256 = \"0a7763b98ba8a24f59e698bf9ab197e7676c640d6455d1580b4ce7dc560f0f0d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hifijson/0.2.3/download\"],\n strip_prefix = \"hifijson-0.2.3\",\n build_file = Label(\"@crates//crates:BUILD.hifijson-0.2.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hkdf-0.12.4\",\n sha256 = \"7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hkdf/0.12.4/download\"],\n strip_prefix = \"hkdf-0.12.4\",\n build_file = Label(\"@crates//crates:BUILD.hkdf-0.12.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hmac-0.12.1\",\n sha256 = \"6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hmac/0.12.1/download\"],\n strip_prefix = \"hmac-0.12.1\",\n build_file = Label(\"@crates//crates:BUILD.hmac-0.12.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hostname-0.4.2\",\n sha256 = \"617aaa3557aef3810a6369d0a99fac8a080891b68bd9f9812a1eeda0c0730cbd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hostname/0.4.2/download\"],\n strip_prefix = \"hostname-0.4.2\",\n build_file = Label(\"@crates//crates:BUILD.hostname-0.4.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__html-escape-0.2.14\",\n sha256 = \"46c1ff2d1cbf39efe5af0900ced8a069b5e61557a17544eb0c4a50239937389e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/html-escape/0.2.14/download\"],\n strip_prefix = \"html-escape-0.2.14\",\n build_file = Label(\"@crates//crates:BUILD.html-escape-0.2.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__html-to-markdown-rs-2.30.0\",\n sha256 = \"7ea41945a2fd834381642a000ef75b03f0030f3023f3dd3291fc5c372d3dda33\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/html-to-markdown-rs/2.30.0/download\"],\n strip_prefix = \"html-to-markdown-rs-2.30.0\",\n build_file = Label(\"@crates//crates:BUILD.html-to-markdown-rs-2.30.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__html5ever-0.39.0\",\n sha256 = \"46a1761807faccc9a19e86944bbf40610014066306f96edcdedc2fb714bcb7b8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/html5ever/0.39.0/download\"],\n strip_prefix = \"html5ever-0.39.0\",\n build_file = Label(\"@crates//crates:BUILD.html5ever-0.39.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hybrid-array-0.4.13\",\n sha256 = \"818356c5132c1fede50f837ca96afbe78ff42413047f4abb886217845e1b6c8c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hybrid-array/0.4.13/download\"],\n strip_prefix = \"hybrid-array-0.4.13\",\n build_file = Label(\"@crates//crates:BUILD.hybrid-array-0.4.13.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__iana-time-zone-0.1.65\",\n sha256 = \"e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/iana-time-zone/0.1.65/download\"],\n strip_prefix = \"iana-time-zone-0.1.65\",\n build_file = Label(\"@crates//crates:BUILD.iana-time-zone-0.1.65.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__iana-time-zone-haiku-0.1.2\",\n sha256 = \"f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/iana-time-zone-haiku/0.1.2/download\"],\n strip_prefix = \"iana-time-zone-haiku-0.1.2\",\n build_file = Label(\"@crates//crates:BUILD.iana-time-zone-haiku-0.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_calendar-2.2.1\",\n sha256 = \"a2b2acc6263f494f1df50685b53ff8e57869e47d5c6fe39c23d518ae9a4f3e45\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_calendar/2.2.1/download\"],\n strip_prefix = \"icu_calendar-2.2.1\",\n build_file = Label(\"@crates//crates:BUILD.icu_calendar-2.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_calendar_data-2.2.0\",\n sha256 = \"118577bcf3a0fa7c6ac0a7d6e951814da84ee56b9b1f68fb4d8d10b08cefaf4d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_calendar_data/2.2.0/download\"],\n strip_prefix = \"icu_calendar_data-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_calendar_data-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_collator-2.2.1\",\n sha256 = \"8bbdf98e5e0aa827770acee171ebb568aaab975a36b56afdb5fd0e2f525750bb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_collator/2.2.1/download\"],\n strip_prefix = \"icu_collator-2.2.1\",\n build_file = Label(\"@crates//crates:BUILD.icu_collator-2.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_collator_data-2.2.0\",\n sha256 = \"038ed8e5817f2059c2f3efb0945ba78d060d3d25e8f1a1bea5139f821a21a2f0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_collator_data/2.2.0/download\"],\n strip_prefix = \"icu_collator_data-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_collator_data-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_collections-2.2.0\",\n sha256 = \"2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_collections/2.2.0/download\"],\n strip_prefix = \"icu_collections-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_collections-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_datetime-2.2.0\",\n sha256 = \"989d56ea5bbc43ae2b4e0388874b002884eaf4ed3a76c84a6c8c5ad575e04d72\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_datetime/2.2.0/download\"],\n strip_prefix = \"icu_datetime-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_datetime-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_datetime_data-2.2.0\",\n sha256 = \"40d3cc1b690d9703202bc319692ac8a1f3a6390686f0930ff40542450fa34f0b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_datetime_data/2.2.0/download\"],\n strip_prefix = \"icu_datetime_data-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_datetime_data-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_decimal-2.2.0\",\n sha256 = \"288247df2e32aa776ac54fdd64de552149ac43cb840f2761811f0e8d09719dd4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_decimal/2.2.0/download\"],\n strip_prefix = \"icu_decimal-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_decimal-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_decimal_data-2.2.0\",\n sha256 = \"6f14a5ca9e8af29eef62064f269078424283d90dbaffeac5225addf62aaabc22\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_decimal_data/2.2.0/download\"],\n strip_prefix = \"icu_decimal_data-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_decimal_data-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_locale-2.2.0\",\n sha256 = \"d5a396343c7208121dc86e35623d3dfe19814a7613cfd14964994cdc9c9a2e26\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_locale/2.2.0/download\"],\n strip_prefix = \"icu_locale-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_locale-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_locale_core-2.2.0\",\n sha256 = \"92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_locale_core/2.2.0/download\"],\n strip_prefix = \"icu_locale_core-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_locale_core-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_locale_data-2.2.0\",\n sha256 = \"d5fdcc9ac77c6d74ff5cf6e65ef3181d6af32003b16fce3a77fb451d2f695993\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_locale_data/2.2.0/download\"],\n strip_prefix = \"icu_locale_data-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_locale_data-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_normalizer-2.2.0\",\n sha256 = \"c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_normalizer/2.2.0/download\"],\n strip_prefix = \"icu_normalizer-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_normalizer-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_normalizer_data-2.2.0\",\n sha256 = \"da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_normalizer_data/2.2.0/download\"],\n strip_prefix = \"icu_normalizer_data-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_normalizer_data-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_pattern-0.4.2\",\n sha256 = \"1c4c568054ffe735398a9f4c55aec37ad7c768844553cc0978f09cc9b933a1fb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_pattern/0.4.2/download\"],\n strip_prefix = \"icu_pattern-0.4.2\",\n build_file = Label(\"@crates//crates:BUILD.icu_pattern-0.4.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_plurals-2.2.0\",\n sha256 = \"2a50023f1d49ad5c4333380328a0d4a19e4b9d6d842ec06639affd5ba47c8103\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_plurals/2.2.0/download\"],\n strip_prefix = \"icu_plurals-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_plurals-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_plurals_data-2.2.0\",\n sha256 = \"8485497155dc865f901decb93ecc20d3e467df67bfeceb91e3ba34e2b11e8e1d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_plurals_data/2.2.0/download\"],\n strip_prefix = \"icu_plurals_data-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_plurals_data-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_properties-2.2.0\",\n sha256 = \"bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_properties/2.2.0/download\"],\n strip_prefix = \"icu_properties-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_properties-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_properties_data-2.2.0\",\n sha256 = \"8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_properties_data/2.2.0/download\"],\n strip_prefix = \"icu_properties_data-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_properties_data-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_provider-2.2.0\",\n sha256 = \"139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_provider/2.2.0/download\"],\n strip_prefix = \"icu_provider-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_provider-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_time-2.2.0\",\n sha256 = \"ec3af0c141da0a61d4f6970cd1d5f4b388b17ea22f8124f8f6049d3d5147586a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_time/2.2.0/download\"],\n strip_prefix = \"icu_time-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_time-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_time_data-2.2.1\",\n sha256 = \"2e0ee79a0bb29772465234bfbad6ea04fbc5220bef9fa4f318cc53eb8897070e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_time_data/2.2.1/download\"],\n strip_prefix = \"icu_time_data-2.2.1\",\n build_file = Label(\"@crates//crates:BUILD.icu_time_data-2.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icy_sixel-0.5.0\",\n sha256 = \"85518b9086bf01117761b90e7691c0ef3236fa8adfb1fb44dd248fe5f87215d5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icy_sixel/0.5.0/download\"],\n strip_prefix = \"icy_sixel-0.5.0\",\n build_file = Label(\"@crates//crates:BUILD.icy_sixel-0.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ident_case-1.0.1\",\n sha256 = \"b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ident_case/1.0.1/download\"],\n strip_prefix = \"ident_case-1.0.1\",\n build_file = Label(\"@crates//crates:BUILD.ident_case-1.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__idna-1.1.0\",\n sha256 = \"3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/idna/1.1.0/download\"],\n strip_prefix = \"idna-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.idna-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__idna_adapter-1.2.2\",\n sha256 = \"cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/idna_adapter/1.2.2/download\"],\n strip_prefix = \"idna_adapter-1.2.2\",\n build_file = Label(\"@crates//crates:BUILD.idna_adapter-1.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ignore-0.4.31\",\n sha256 = \"7f8a7b8211e695a1d0cd91cace480d4d0bd57667ab10277cc412c5f7f4884f83\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ignore/0.4.31/download\"],\n strip_prefix = \"ignore-0.4.31\",\n build_file = Label(\"@crates//crates:BUILD.ignore-0.4.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__image-0.25.10\",\n sha256 = \"85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/image/0.25.10/download\"],\n strip_prefix = \"image-0.25.10\",\n build_file = Label(\"@crates//crates:BUILD.image-0.25.10.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__image-webp-0.2.4\",\n sha256 = \"525e9ff3e1a4be2fbea1fdf0e98686a6d98b4d8f937e1bf7402245af1909e8c3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/image-webp/0.2.4/download\"],\n strip_prefix = \"image-webp-0.2.4\",\n build_file = Label(\"@crates//crates:BUILD.image-webp-0.2.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__indenter-0.3.4\",\n sha256 = \"964de6e86d545b246d84badc0fef527924ace5134f30641c203ef52ba83f58d5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/indenter/0.3.4/download\"],\n strip_prefix = \"indenter-0.3.4\",\n build_file = Label(\"@crates//crates:BUILD.indenter-0.3.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__indexmap-2.14.0\",\n sha256 = \"d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/indexmap/2.14.0/download\"],\n strip_prefix = \"indexmap-2.14.0\",\n build_file = Label(\"@crates//crates:BUILD.indexmap-2.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__indicatif-0.18.6\",\n sha256 = \"9433806cd6b4ec1aba79c021c7e4c58fb4c3b9977c085062e611ac929998fb0c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/indicatif/0.18.6/download\"],\n strip_prefix = \"indicatif-0.18.6\",\n build_file = Label(\"@crates//crates:BUILD.indicatif-0.18.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__inferno-0.12.8\",\n sha256 = \"0c460d4fa06223667240720ab69a8045133755ae6dfbe100cf481b95e3a014f1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/inferno/0.12.8/download\"],\n strip_prefix = \"inferno-0.12.8\",\n build_file = Label(\"@crates//crates:BUILD.inferno-0.12.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__inherent-1.0.14\",\n sha256 = \"bee2c455ca60511a054699102d40ce7153621cb2429558f9eaa600e4499b5984\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/inherent/1.0.14/download\"],\n strip_prefix = \"inherent-1.0.14\",\n build_file = Label(\"@crates//crates:BUILD.inherent-1.0.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__inotify-0.11.4\",\n sha256 = \"153be1941a183ec9ccd095ddbe17a8b8d435ef6c76e9e02451b933c3999af2c8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/inotify/0.11.4/download\"],\n strip_prefix = \"inotify-0.11.4\",\n build_file = Label(\"@crates//crates:BUILD.inotify-0.11.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__inotify-sys-0.1.8\",\n sha256 = \"c033f80b2c113cdf91ab7a33faa9cbc014726dcad99880c8609af2a370edf37d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/inotify-sys/0.1.8/download\"],\n strip_prefix = \"inotify-sys-0.1.8\",\n build_file = Label(\"@crates//crates:BUILD.inotify-sys-0.1.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__inout-0.1.4\",\n sha256 = \"879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/inout/0.1.4/download\"],\n strip_prefix = \"inout-0.1.4\",\n build_file = Label(\"@crates//crates:BUILD.inout-0.1.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__insta-1.48.0\",\n sha256 = \"86f0f8fee8c926415c58d6ae43a08523a26faccb2323f5e6b644fe7dd4ef6b82\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/insta/1.48.0/download\"],\n strip_prefix = \"insta-1.48.0\",\n build_file = Label(\"@crates//crates:BUILD.insta-1.48.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__interceptor-0.17.2\",\n sha256 = \"88c11a956a48159f7fe539b8198f12b4db9b709ae5f94385b840db38f97fed74\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/interceptor/0.17.2/download\"],\n strip_prefix = \"interceptor-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.interceptor-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__intl-memoizer-0.5.3\",\n sha256 = \"310da2e345f5eb861e7a07ee182262e94975051db9e4223e909ba90f392f163f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/intl-memoizer/0.5.3/download\"],\n strip_prefix = \"intl-memoizer-0.5.3\",\n build_file = Label(\"@crates//crates:BUILD.intl-memoizer-0.5.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__intl_pluralrules-7.0.2\",\n sha256 = \"078ea7b7c29a2b4df841a7f6ac8775ff6074020c6776d48491ce2268e068f972\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/intl_pluralrules/7.0.2/download\"],\n strip_prefix = \"intl_pluralrules-7.0.2\",\n build_file = Label(\"@crates//crates:BUILD.intl_pluralrules-7.0.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ipnet-2.12.0\",\n sha256 = \"d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ipnet/2.12.0/download\"],\n strip_prefix = \"ipnet-2.12.0\",\n build_file = Label(\"@crates//crates:BUILD.ipnet-2.12.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__is_terminal_polyfill-1.70.2\",\n sha256 = \"a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/is_terminal_polyfill/1.70.2/download\"],\n strip_prefix = \"is_terminal_polyfill-1.70.2\",\n build_file = Label(\"@crates//crates:BUILD.is_terminal_polyfill-1.70.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__itertools-0.13.0\",\n sha256 = \"413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/itertools/0.13.0/download\"],\n strip_prefix = \"itertools-0.13.0\",\n build_file = Label(\"@crates//crates:BUILD.itertools-0.13.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__itertools-0.14.0\",\n sha256 = \"2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/itertools/0.14.0/download\"],\n strip_prefix = \"itertools-0.14.0\",\n build_file = Label(\"@crates//crates:BUILD.itertools-0.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__itoa-1.0.18\",\n sha256 = \"8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/itoa/1.0.18/download\"],\n strip_prefix = \"itoa-1.0.18\",\n build_file = Label(\"@crates//crates:BUILD.itoa-1.0.18.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jaq-core-2.2.1\",\n sha256 = \"77526a72eb79412c29fd141767a6549bbfcb1cb40e00556fe16532d5e878e098\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jaq-core/2.2.1/download\"],\n strip_prefix = \"jaq-core-2.2.1\",\n build_file = Label(\"@crates//crates:BUILD.jaq-core-2.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jaq-json-1.1.3\",\n sha256 = \"01dbdbd07b076e8403abac68ce7744d93e2ecd953bbc44bf77bf00e1e81172bc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jaq-json/1.1.3/download\"],\n strip_prefix = \"jaq-json-1.1.3\",\n build_file = Label(\"@crates//crates:BUILD.jaq-json-1.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jaq-std-2.1.2\",\n sha256 = \"2c264fe397c981705976c71f1bfe020382b9eda52ae950e57fe885e147bdd67d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jaq-std/2.1.2/download\"],\n strip_prefix = \"jaq-std-2.1.2\",\n build_file = Label(\"@crates//crates:BUILD.jaq-std-2.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jiff-0.2.35\",\n sha256 = \"668b7183bd07af9a4885f5c35b0cc5c83c4607a913c16b7e17291832910d2dcc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jiff/0.2.35/download\"],\n strip_prefix = \"jiff-0.2.35\",\n build_file = Label(\"@crates//crates:BUILD.jiff-0.2.35.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jiff-core-0.1.0\",\n sha256 = \"7feca88439efe53da3754500c1851dedf3cb36c524dd5cf8225cc0794de95d09\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jiff-core/0.1.0/download\"],\n strip_prefix = \"jiff-core-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.jiff-core-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jiff-icu-0.2.2\",\n sha256 = \"0e67c2beaae8b10a82d849b9aabb698a43a682f32b17bcdc035d5ecadb44d646\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jiff-icu/0.2.2/download\"],\n strip_prefix = \"jiff-icu-0.2.2\",\n build_file = Label(\"@crates//crates:BUILD.jiff-icu-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jiff-static-0.2.35\",\n sha256 = \"3a69dcb3a21cfb32ce1cd056169337ca284af0766dd766e7878819b251a49204\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jiff-static/0.2.35/download\"],\n strip_prefix = \"jiff-static-0.2.35\",\n build_file = Label(\"@crates//crates:BUILD.jiff-static-0.2.35.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jiff-tzdb-0.1.8\",\n sha256 = \"142bd39932ad231f10513df9ab62661fead8719872150b7ad02a2df79f4e141e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jiff-tzdb/0.1.8/download\"],\n strip_prefix = \"jiff-tzdb-0.1.8\",\n build_file = Label(\"@crates//crates:BUILD.jiff-tzdb-0.1.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jiff-tzdb-platform-0.1.3\",\n sha256 = \"875a5a69ac2bab1a891711cf5eccbec1ce0341ea805560dcd90b7a2e925132e8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jiff-tzdb-platform/0.1.3/download\"],\n strip_prefix = \"jiff-tzdb-platform-0.1.3\",\n build_file = Label(\"@crates//crates:BUILD.jiff-tzdb-platform-0.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jobserver-0.1.35\",\n sha256 = \"1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jobserver/0.1.35/download\"],\n strip_prefix = \"jobserver-0.1.35\",\n build_file = Label(\"@crates//crates:BUILD.jobserver-0.1.35.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__js-sys-0.3.103\",\n sha256 = \"53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/js-sys/0.3.103/download\"],\n strip_prefix = \"js-sys-0.3.103\",\n build_file = Label(\"@crates//crates:BUILD.js-sys-0.3.103.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__keccak-0.1.6\",\n sha256 = \"cb26cec98cce3a3d96cbb7bced3c4b16e3d13f27ec56dbd62cbc8f39cfb9d653\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/keccak/0.1.6/download\"],\n strip_prefix = \"keccak-0.1.6\",\n build_file = Label(\"@crates//crates:BUILD.keccak-0.1.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__khronos-egl-6.0.0\",\n sha256 = \"6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/khronos-egl/6.0.0/download\"],\n strip_prefix = \"khronos-egl-6.0.0\",\n build_file = Label(\"@crates//crates:BUILD.khronos-egl-6.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__khronos_api-3.1.0\",\n sha256 = \"e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/khronos_api/3.1.0/download\"],\n strip_prefix = \"khronos_api-3.1.0\",\n build_file = Label(\"@crates//crates:BUILD.khronos_api-3.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__kqueue-1.2.0\",\n sha256 = \"273c0752728918e0ac4976f2b275b6fefb9ecd400585dec929419f3844cd87b5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/kqueue/1.2.0/download\"],\n strip_prefix = \"kqueue-1.2.0\",\n build_file = Label(\"@crates//crates:BUILD.kqueue-1.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__kqueue-sys-1.1.2\",\n sha256 = \"07293a4e297ac234359b510362495713f75ea345d5307140414f20c69ffeb087\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/kqueue-sys/1.1.2/download\"],\n strip_prefix = \"kqueue-sys-1.1.2\",\n build_file = Label(\"@crates//crates:BUILD.kqueue-sys-1.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__lazy_static-1.5.0\",\n sha256 = \"bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/lazy_static/1.5.0/download\"],\n strip_prefix = \"lazy_static-1.5.0\",\n build_file = Label(\"@crates//crates:BUILD.lazy_static-1.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__libc-0.2.189\",\n sha256 = \"3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/libc/0.2.189/download\"],\n strip_prefix = \"libc-0.2.189\",\n build_file = Label(\"@crates//crates:BUILD.libc-0.2.189.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__libloading-0.8.9\",\n sha256 = \"d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/libloading/0.8.9/download\"],\n strip_prefix = \"libloading-0.8.9\",\n build_file = Label(\"@crates//crates:BUILD.libloading-0.8.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__libloading-0.9.0\",\n sha256 = \"754ca22de805bb5744484a5b151a9e1a8e837d5dc232c2d7d8c2e3492edc8b60\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/libloading/0.9.0/download\"],\n strip_prefix = \"libloading-0.9.0\",\n build_file = Label(\"@crates//crates:BUILD.libloading-0.9.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__libm-0.2.16\",\n sha256 = \"b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/libm/0.2.16/download\"],\n strip_prefix = \"libm-0.2.16\",\n build_file = Label(\"@crates//crates:BUILD.libm-0.2.16.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__libredox-0.1.18\",\n sha256 = \"c943259e342f1e06ff2da7a83eabdfe7f92ce10262688dbf1895ff0b3e6e4652\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/libredox/0.1.18/download\"],\n strip_prefix = \"libredox-0.1.18\",\n build_file = Label(\"@crates//crates:BUILD.libredox-0.1.18.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__libspa-0.9.2\",\n sha256 = \"b6b8cfa2a7656627b4c92c6b9ef929433acd673d5ab3708cda1b18478ac00df4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/libspa/0.9.2/download\"],\n strip_prefix = \"libspa-0.9.2\",\n build_file = Label(\"@crates//crates:BUILD.libspa-0.9.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__libspa-sys-0.9.2\",\n sha256 = \"901049455d2eb6decf9058235d745237952f4804bc584c5fcb41412e6adcc6e0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/libspa-sys/0.9.2/download\"],\n strip_prefix = \"libspa-sys-0.9.2\",\n build_file = Label(\"@crates//crates:BUILD.libspa-sys-0.9.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__libwayshot-xcap-0.3.3\",\n sha256 = \"ea8a46e4d016ef464e386e4970f5415fe0939c2d63abe0c2f539c05ef88c5fe5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/libwayshot-xcap/0.3.3/download\"],\n strip_prefix = \"libwayshot-xcap-0.3.3\",\n build_file = Label(\"@crates//crates:BUILD.libwayshot-xcap-0.3.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__linked-hash-map-0.5.6\",\n sha256 = \"0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/linked-hash-map/0.5.6/download\"],\n strip_prefix = \"linked-hash-map-0.5.6\",\n build_file = Label(\"@crates//crates:BUILD.linked-hash-map-0.5.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__linux-raw-sys-0.12.1\",\n sha256 = \"32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/linux-raw-sys/0.12.1/download\"],\n strip_prefix = \"linux-raw-sys-0.12.1\",\n build_file = Label(\"@crates//crates:BUILD.linux-raw-sys-0.12.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__linux-raw-sys-0.4.15\",\n sha256 = \"d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/linux-raw-sys/0.4.15/download\"],\n strip_prefix = \"linux-raw-sys-0.4.15\",\n build_file = Label(\"@crates//crates:BUILD.linux-raw-sys-0.4.15.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__linux-raw-sys-0.9.4\",\n sha256 = \"cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/linux-raw-sys/0.9.4/download\"],\n strip_prefix = \"linux-raw-sys-0.9.4\",\n build_file = Label(\"@crates//crates:BUILD.linux-raw-sys-0.9.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__litemap-0.8.2\",\n sha256 = \"92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/litemap/0.8.2/download\"],\n strip_prefix = \"litemap-0.8.2\",\n build_file = Label(\"@crates//crates:BUILD.litemap-0.8.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__lock_api-0.4.14\",\n sha256 = \"224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/lock_api/0.4.14/download\"],\n strip_prefix = \"lock_api-0.4.14\",\n build_file = Label(\"@crates//crates:BUILD.lock_api-0.4.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__log-0.4.33\",\n sha256 = \"0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/log/0.4.33/download\"],\n strip_prefix = \"log-0.4.33\",\n build_file = Label(\"@crates//crates:BUILD.log-0.4.33.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__lru-0.16.4\",\n sha256 = \"7f66e8d5d03f609abc3a39e6f08e4164ebf1447a732906d39eb9b99b7919ef39\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/lru/0.16.4/download\"],\n strip_prefix = \"lru-0.16.4\",\n build_file = Label(\"@crates//crates:BUILD.lru-0.16.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__lscolors-0.21.0\",\n sha256 = \"d60e266dfb1426eb2d24792602e041131fdc0236bb7007abc0e589acafd60929\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/lscolors/0.21.0/download\"],\n strip_prefix = \"lscolors-0.21.0\",\n build_file = Label(\"@crates//crates:BUILD.lscolors-0.21.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__markup5ever-0.39.0\",\n sha256 = \"7122d987ec5f704ee56f6e5b41a7d93722e9aae27ae07cafa4036c4d3f9757de\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/markup5ever/0.39.0/download\"],\n strip_prefix = \"markup5ever-0.39.0\",\n build_file = Label(\"@crates//crates:BUILD.markup5ever-0.39.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__maudio-0.1.6\",\n sha256 = \"c6ab2d47a7b24f4cf6ab85d335b4a6cc932f650080dfe0819b22bc553aada602\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/maudio/0.1.6/download\"],\n strip_prefix = \"maudio-0.1.6\",\n build_file = Label(\"@crates//crates:BUILD.maudio-0.1.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__maudio-sys-0.1.3\",\n patch_args = [\n \"-p1\",\n ],\n patches = [\n \"@@//bazel/patches:maudio-sys-target-bindings.patch\",\n ],\n sha256 = \"f00ae1969d0a389937161b834623e5cba2d8449752a0970d71382cf9a905bb35\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/maudio-sys/0.1.3/download\"],\n strip_prefix = \"maudio-sys-0.1.3\",\n build_file = Label(\"@crates//crates:BUILD.maudio-sys-0.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__md-5-0.10.6\",\n sha256 = \"d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/md-5/0.10.6/download\"],\n strip_prefix = \"md-5-0.10.6\",\n build_file = Label(\"@crates//crates:BUILD.md-5-0.10.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__memchr-2.8.3\",\n sha256 = \"cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/memchr/2.8.3/download\"],\n strip_prefix = \"memchr-2.8.3\",\n build_file = Label(\"@crates//crates:BUILD.memchr-2.8.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__memmap2-0.9.11\",\n sha256 = \"d1219ed1b7f229ee7104d281dd01d6802fe28bb6e95d292942c4daacdeb798c0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/memmap2/0.9.11/download\"],\n strip_prefix = \"memmap2-0.9.11\",\n build_file = Label(\"@crates//crates:BUILD.memmap2-0.9.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__memoffset-0.7.1\",\n sha256 = \"5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/memoffset/0.7.1/download\"],\n strip_prefix = \"memoffset-0.7.1\",\n build_file = Label(\"@crates//crates:BUILD.memoffset-0.7.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__memoffset-0.9.1\",\n sha256 = \"488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/memoffset/0.9.1/download\"],\n strip_prefix = \"memoffset-0.9.1\",\n build_file = Label(\"@crates//crates:BUILD.memoffset-0.9.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__minimal-lexical-0.2.1\",\n sha256 = \"68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/minimal-lexical/0.2.1/download\"],\n strip_prefix = \"minimal-lexical-0.2.1\",\n build_file = Label(\"@crates//crates:BUILD.minimal-lexical-0.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__miniz_oxide-0.8.9\",\n sha256 = \"1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/miniz_oxide/0.8.9/download\"],\n strip_prefix = \"miniz_oxide-0.8.9\",\n build_file = Label(\"@crates//crates:BUILD.miniz_oxide-0.8.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__mio-1.2.2\",\n sha256 = \"30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/mio/1.2.2/download\"],\n strip_prefix = \"mio-1.2.2\",\n build_file = Label(\"@crates//crates:BUILD.mio-1.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__moxcms-0.8.1\",\n sha256 = \"bb85c154ba489f01b25c0d36ae69a87e4a1c73a72631fc6c0eb6dde34a73e44b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/moxcms/0.8.1/download\"],\n strip_prefix = \"moxcms-0.8.1\",\n build_file = Label(\"@crates//crates:BUILD.moxcms-0.8.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__munge-0.4.7\",\n sha256 = \"5e17401f259eba956ca16491461b6e8f72913a0a114e39736ce404410f915a0c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/munge/0.4.7/download\"],\n strip_prefix = \"munge-0.4.7\",\n build_file = Label(\"@crates//crates:BUILD.munge-0.4.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__munge_macro-0.4.7\",\n sha256 = \"4568f25ccbd45ab5d5603dc34318c1ec56b117531781260002151b8530a9f931\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/munge_macro/0.4.7/download\"],\n strip_prefix = \"munge_macro-0.4.7\",\n build_file = Label(\"@crates//crates:BUILD.munge_macro-0.4.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__nanorand-0.7.0\",\n sha256 = \"6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/nanorand/0.7.0/download\"],\n strip_prefix = \"nanorand-0.7.0\",\n build_file = Label(\"@crates//crates:BUILD.nanorand-0.7.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__napi-3.12.0\",\n sha256 = \"6f71d6bc097c4a6eb853c3f24991ab8c9f50f57d1f719e305175541482217e36\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/napi/3.12.0/download\"],\n strip_prefix = \"napi-3.12.0\",\n build_file = Label(\"@crates//crates:BUILD.napi-3.12.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__napi-build-2.4.0\",\n sha256 = \"5282704fbe8d49b0cf8b08e3f33233416a528658f205c7e5ace63b582de0b11c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/napi-build/2.4.0/download\"],\n strip_prefix = \"napi-build-2.4.0\",\n build_file = Label(\"@crates//crates:BUILD.napi-build-2.4.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__napi-derive-3.6.1\",\n sha256 = \"4d5c9c02556ea6dc99dffd36c1ce60141411657438501a125b675776d011ce92\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/napi-derive/3.6.1/download\"],\n strip_prefix = \"napi-derive-3.6.1\",\n build_file = Label(\"@crates//crates:BUILD.napi-derive-3.6.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__napi-derive-backend-6.1.0\",\n sha256 = \"6a9d8365cf97f54d9b6d6dbf83a25ca227ad7d6e920717426c599225aca6740b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/napi-derive-backend/6.1.0/download\"],\n strip_prefix = \"napi-derive-backend-6.1.0\",\n build_file = Label(\"@crates//crates:BUILD.napi-derive-backend-6.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__napi-sys-3.3.0\",\n sha256 = \"85fbf1fa9f1babfe396d74bbbf52b3643770243e8f5b0b46715d4caf7f0dfc9a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/napi-sys/3.3.0/download\"],\n strip_prefix = \"napi-sys-3.3.0\",\n build_file = Label(\"@crates//crates:BUILD.napi-sys-3.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__new_debug_unreachable-1.0.6\",\n sha256 = \"650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/new_debug_unreachable/1.0.6/download\"],\n strip_prefix = \"new_debug_unreachable-1.0.6\",\n build_file = Label(\"@crates//crates:BUILD.new_debug_unreachable-1.0.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__nix-0.24.3\",\n sha256 = \"fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/nix/0.24.3/download\"],\n strip_prefix = \"nix-0.24.3\",\n build_file = Label(\"@crates//crates:BUILD.nix-0.24.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__nix-0.26.4\",\n sha256 = \"598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/nix/0.26.4/download\"],\n strip_prefix = \"nix-0.26.4\",\n build_file = Label(\"@crates//crates:BUILD.nix-0.26.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__nix-0.28.0\",\n sha256 = \"ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/nix/0.28.0/download\"],\n strip_prefix = \"nix-0.28.0\",\n build_file = Label(\"@crates//crates:BUILD.nix-0.28.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__nix-0.29.0\",\n sha256 = \"71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/nix/0.29.0/download\"],\n strip_prefix = \"nix-0.29.0\",\n build_file = Label(\"@crates//crates:BUILD.nix-0.29.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__nix-0.30.1\",\n sha256 = \"74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/nix/0.30.1/download\"],\n strip_prefix = \"nix-0.30.1\",\n build_file = Label(\"@crates//crates:BUILD.nix-0.30.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__nix-0.31.3\",\n sha256 = \"cf20d2fde8ff38632c426f1165ed7436270b44f199fc55284c38276f9db47c3d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/nix/0.31.3/download\"],\n strip_prefix = \"nix-0.31.3\",\n build_file = Label(\"@crates//crates:BUILD.nix-0.31.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__nohash-hasher-0.2.0\",\n sha256 = \"2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/nohash-hasher/0.2.0/download\"],\n strip_prefix = \"nohash-hasher-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.nohash-hasher-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__nom-7.1.3\",\n sha256 = \"d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/nom/7.1.3/download\"],\n strip_prefix = \"nom-7.1.3\",\n build_file = Label(\"@crates//crates:BUILD.nom-7.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__nom-8.0.0\",\n sha256 = \"df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/nom/8.0.0/download\"],\n strip_prefix = \"nom-8.0.0\",\n build_file = Label(\"@crates//crates:BUILD.nom-8.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__normalize-path-0.2.1\",\n sha256 = \"f5438dd2b2ff4c6df6e1ce22d825ed2fa93ee2922235cc45186991717f0a892d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/normalize-path/0.2.1/download\"],\n strip_prefix = \"normalize-path-0.2.1\",\n build_file = Label(\"@crates//crates:BUILD.normalize-path-0.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__notify-8.2.0\",\n sha256 = \"4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/notify/8.2.0/download\"],\n strip_prefix = \"notify-8.2.0\",\n build_file = Label(\"@crates//crates:BUILD.notify-8.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__notify-types-2.1.0\",\n sha256 = \"42b8cfee0e339a0337359f3c88165702ac6e600dc01c0cc9579a92d62b08477a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/notify-types/2.1.0/download\"],\n strip_prefix = \"notify-types-2.1.0\",\n build_file = Label(\"@crates//crates:BUILD.notify-types-2.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__nu-ansi-term-0.50.3\",\n sha256 = \"7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/nu-ansi-term/0.50.3/download\"],\n strip_prefix = \"nu-ansi-term-0.50.3\",\n build_file = Label(\"@crates//crates:BUILD.nu-ansi-term-0.50.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-bigint-0.4.8\",\n sha256 = \"c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-bigint/0.4.8/download\"],\n strip_prefix = \"num-bigint-0.4.8\",\n build_file = Label(\"@crates//crates:BUILD.num-bigint-0.4.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-conv-0.2.2\",\n sha256 = \"521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-conv/0.2.2/download\"],\n strip_prefix = \"num-conv-0.2.2\",\n build_file = Label(\"@crates//crates:BUILD.num-conv-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-format-0.4.4\",\n sha256 = \"a652d9771a63711fd3c3deb670acfbe5c30a4072e664d7a3bf5a9e1056ac72c3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-format/0.4.4/download\"],\n strip_prefix = \"num-format-0.4.4\",\n build_file = Label(\"@crates//crates:BUILD.num-format-0.4.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-integer-0.1.46\",\n sha256 = \"7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-integer/0.1.46/download\"],\n strip_prefix = \"num-integer-0.1.46\",\n build_file = Label(\"@crates//crates:BUILD.num-integer-0.1.46.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-traits-0.2.19\",\n sha256 = \"071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-traits/0.2.19/download\"],\n strip_prefix = \"num-traits-0.2.19\",\n build_file = Label(\"@crates//crates:BUILD.num-traits-0.2.19.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__number_prefix-0.4.0\",\n sha256 = \"830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/number_prefix/0.4.0/download\"],\n strip_prefix = \"number_prefix-0.4.0\",\n build_file = Label(\"@crates//crates:BUILD.number_prefix-0.4.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-0.6.4\",\n sha256 = \"3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2/0.6.4/download\"],\n strip_prefix = \"objc2-0.6.4\",\n build_file = Label(\"@crates//crates:BUILD.objc2-0.6.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-app-kit-0.3.2\",\n sha256 = \"d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-app-kit/0.3.2/download\"],\n strip_prefix = \"objc2-app-kit-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-app-kit-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-av-foundation-0.3.2\",\n sha256 = \"478ae33fcac9df0a18db8302387c666b8ef08a3e2d62b510ca4fc278a384b6c0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-av-foundation/0.3.2/download\"],\n strip_prefix = \"objc2-av-foundation-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-av-foundation-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-avf-audio-0.3.2\",\n sha256 = \"13a380031deed8e99db00065c45937da434ca987c034e13b87e4441f9e4090be\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-avf-audio/0.3.2/download\"],\n strip_prefix = \"objc2-avf-audio-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-avf-audio-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-cloud-kit-0.3.2\",\n sha256 = \"73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-cloud-kit/0.3.2/download\"],\n strip_prefix = \"objc2-cloud-kit-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-cloud-kit-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-core-audio-0.3.2\",\n sha256 = \"e1eebcea8b0dbff5f7c8504f3107c68fc061a3eb44932051c8cf8a68d969c3b2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-core-audio/0.3.2/download\"],\n strip_prefix = \"objc2-core-audio-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-core-audio-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-core-audio-types-0.3.2\",\n sha256 = \"5a89f2ec274a0cf4a32642b2991e8b351a404d290da87bb6a9a9d8632490bd1c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-core-audio-types/0.3.2/download\"],\n strip_prefix = \"objc2-core-audio-types-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-core-audio-types-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-core-data-0.3.2\",\n sha256 = \"0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-core-data/0.3.2/download\"],\n strip_prefix = \"objc2-core-data-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-core-data-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-core-foundation-0.3.2\",\n sha256 = \"2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-core-foundation/0.3.2/download\"],\n strip_prefix = \"objc2-core-foundation-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-core-foundation-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-core-graphics-0.3.2\",\n sha256 = \"e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-core-graphics/0.3.2/download\"],\n strip_prefix = \"objc2-core-graphics-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-core-graphics-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-core-image-0.3.2\",\n sha256 = \"e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-core-image/0.3.2/download\"],\n strip_prefix = \"objc2-core-image-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-core-image-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-core-media-0.3.2\",\n sha256 = \"05ec576860167a15dd9fce7fbee7512beb4e31f532159d3482d1f9c6caedf31d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-core-media/0.3.2/download\"],\n strip_prefix = \"objc2-core-media-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-core-media-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-core-text-0.3.2\",\n sha256 = \"0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-core-text/0.3.2/download\"],\n strip_prefix = \"objc2-core-text-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-core-text-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-core-video-0.3.2\",\n sha256 = \"d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-core-video/0.3.2/download\"],\n strip_prefix = \"objc2-core-video-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-core-video-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-encode-4.1.0\",\n sha256 = \"ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-encode/4.1.0/download\"],\n strip_prefix = \"objc2-encode-4.1.0\",\n build_file = Label(\"@crates//crates:BUILD.objc2-encode-4.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-foundation-0.3.2\",\n sha256 = \"e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-foundation/0.3.2/download\"],\n strip_prefix = \"objc2-foundation-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-foundation-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-image-io-0.3.2\",\n sha256 = \"32b0446e98cf4a784cc7a0177715ff317eeaa8463841c616cfc78aa4f953c4ea\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-image-io/0.3.2/download\"],\n strip_prefix = \"objc2-image-io-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-image-io-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-io-surface-0.3.2\",\n sha256 = \"180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-io-surface/0.3.2/download\"],\n strip_prefix = \"objc2-io-surface-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-io-surface-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-media-toolbox-0.3.2\",\n sha256 = \"edd9fdde720df3da7046bb9097811000c1e7ab5cd579fa89d96b27d56781fb30\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-media-toolbox/0.3.2/download\"],\n strip_prefix = \"objc2-media-toolbox-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-media-toolbox-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-metal-0.3.2\",\n sha256 = \"a0125f776a10d00af4152d74616409f0d4a2053a6f57fa5b7d6aa2854ac04794\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-metal/0.3.2/download\"],\n strip_prefix = \"objc2-metal-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-metal-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-quartz-core-0.3.2\",\n sha256 = \"96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-quartz-core/0.3.2/download\"],\n strip_prefix = \"objc2-quartz-core-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-quartz-core-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__objc2-system-configuration-0.3.2\",\n sha256 = \"7216bd11cbda54ccabcab84d523dc93b858ec75ecfb3a7d89513fa22464da396\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/objc2-system-configuration/0.3.2/download\"],\n strip_prefix = \"objc2-system-configuration-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.objc2-system-configuration-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__oid-registry-0.7.1\",\n sha256 = \"a8d8034d9489cdaf79228eb9f6a3b8d7bb32ba00d6645ebd48eef4077ceb5bd9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/oid-registry/0.7.1/download\"],\n strip_prefix = \"oid-registry-0.7.1\",\n build_file = Label(\"@crates//crates:BUILD.oid-registry-0.7.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__once_cell-1.21.4\",\n sha256 = \"9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/once_cell/1.21.4/download\"],\n strip_prefix = \"once_cell-1.21.4\",\n build_file = Label(\"@crates//crates:BUILD.once_cell-1.21.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__once_cell_polyfill-1.70.2\",\n sha256 = \"384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/once_cell_polyfill/1.70.2/download\"],\n strip_prefix = \"once_cell_polyfill-1.70.2\",\n build_file = Label(\"@crates//crates:BUILD.once_cell_polyfill-1.70.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__onig-6.5.3\",\n sha256 = \"0cc3cbf698f9438986c11a880c90a6d04b9de27575afd28bbf45b154b6c709e2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/onig/6.5.3/download\"],\n strip_prefix = \"onig-6.5.3\",\n build_file = Label(\"@crates//crates:BUILD.onig-6.5.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__onig_sys-69.9.3\",\n sha256 = \"1e68317604e77e53b85896388e1a803c1d21b74c899ec9e5e1112db90735edd7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/onig_sys/69.9.3/download\"],\n strip_prefix = \"onig_sys-69.9.3\",\n build_file = Label(\"@crates//crates:BUILD.onig_sys-69.9.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__opaque-debug-0.3.1\",\n sha256 = \"c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/opaque-debug/0.3.1/download\"],\n strip_prefix = \"opaque-debug-0.3.1\",\n build_file = Label(\"@crates//crates:BUILD.opaque-debug-0.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__opus-0.3.1\",\n sha256 = \"4d3809943dff6fbad5f0484449ea26bdb9cb7d8efdf26ed50d3c7f227f69eb5c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/opus/0.3.1/download\"],\n strip_prefix = \"opus-0.3.1\",\n build_file = Label(\"@crates//crates:BUILD.opus-0.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ordered-float-5.3.0\",\n sha256 = \"b7d950ca161dc355eaf28f82b11345ed76c6e1f6eb1f4f4479e0323b9e2fbd0e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ordered-float/5.3.0/download\"],\n strip_prefix = \"ordered-float-5.3.0\",\n build_file = Label(\"@crates//crates:BUILD.ordered-float-5.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ordered-stream-0.2.0\",\n sha256 = \"9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ordered-stream/0.2.0/download\"],\n strip_prefix = \"ordered-stream-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.ordered-stream-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__os_display-0.1.4\",\n sha256 = \"ad5fd71b79026fb918650dde6d125000a233764f1c2f1659a1c71118e33ea08f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/os_display/0.1.4/download\"],\n strip_prefix = \"os_display-0.1.4\",\n build_file = Label(\"@crates//crates:BUILD.os_display-0.1.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__os_pipe-1.2.3\",\n sha256 = \"7d8fae84b431384b68627d0f9b3b1245fcf9f46f6c0e3dc902e9dce64edd1967\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/os_pipe/1.2.3/download\"],\n strip_prefix = \"os_pipe-1.2.3\",\n build_file = Label(\"@crates//crates:BUILD.os_pipe-1.2.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__outref-0.5.2\",\n sha256 = \"1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/outref/0.5.2/download\"],\n strip_prefix = \"outref-0.5.2\",\n build_file = Label(\"@crates//crates:BUILD.outref-0.5.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__p256-0.13.2\",\n sha256 = \"c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/p256/0.13.2/download\"],\n strip_prefix = \"p256-0.13.2\",\n build_file = Label(\"@crates//crates:BUILD.p256-0.13.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__p384-0.13.1\",\n sha256 = \"fe42f1670a52a47d448f14b6a5c61dd78fce51856e68edaa38f7ae3a46b8d6b6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/p384/0.13.1/download\"],\n strip_prefix = \"p384-0.13.1\",\n build_file = Label(\"@crates//crates:BUILD.p384-0.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__palette-0.7.6\",\n sha256 = \"4cbf71184cc5ecc2e4e1baccdb21026c20e5fc3dcf63028a086131b3ab00b6e6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/palette/0.7.6/download\"],\n strip_prefix = \"palette-0.7.6\",\n build_file = Label(\"@crates//crates:BUILD.palette-0.7.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__palette_derive-0.7.6\",\n sha256 = \"f5030daf005bface118c096f510ffb781fc28f9ab6a32ab224d8631be6851d30\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/palette_derive/0.7.6/download\"],\n strip_prefix = \"palette_derive-0.7.6\",\n build_file = Label(\"@crates//crates:BUILD.palette_derive-0.7.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__parking-2.2.1\",\n sha256 = \"f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/parking/2.2.1/download\"],\n strip_prefix = \"parking-2.2.1\",\n build_file = Label(\"@crates//crates:BUILD.parking-2.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__parking_lot-0.12.5\",\n sha256 = \"93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/parking_lot/0.12.5/download\"],\n strip_prefix = \"parking_lot-0.12.5\",\n build_file = Label(\"@crates//crates:BUILD.parking_lot-0.12.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__parking_lot_core-0.9.12\",\n sha256 = \"2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/parking_lot_core/0.9.12/download\"],\n strip_prefix = \"parking_lot_core-0.9.12\",\n build_file = Label(\"@crates//crates:BUILD.parking_lot_core-0.9.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__parse_datetime-0.14.0\",\n sha256 = \"413775a7eac2261d2211a79d10ef275e5b6f7b527eec42ad09adce2ffa92b6e5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/parse_datetime/0.14.0/download\"],\n strip_prefix = \"parse_datetime-0.14.0\",\n build_file = Label(\"@crates//crates:BUILD.parse_datetime-0.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pcre2-0.2.11\",\n sha256 = \"9e970b0fcce0c7ee6ef662744ff711f21ccd6f11b7cf03cd187a80e89797fc67\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pcre2/0.2.11/download\"],\n strip_prefix = \"pcre2-0.2.11\",\n build_file = Label(\"@crates//crates:BUILD.pcre2-0.2.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pcre2-sys-0.2.10\",\n sha256 = \"18b9073c1a2549bd409bf4a32c94d903bb1a09bf845bc306ae148897fa0760a4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pcre2-sys/0.2.10/download\"],\n strip_prefix = \"pcre2-sys-0.2.10\",\n build_file = Label(\"@crates//crates:BUILD.pcre2-sys-0.2.10.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__peg-0.8.6\",\n sha256 = \"0aad070be5b63aa72103f2fcdd70a83adbd5e90112ce5b574171ff1c65501773\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/peg/0.8.6/download\"],\n strip_prefix = \"peg-0.8.6\",\n build_file = Label(\"@crates//crates:BUILD.peg-0.8.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__peg-macros-0.8.6\",\n sha256 = \"ddd8ef6825cae95355031ae26a99b616a2a21f22ba2de0197c43dfb05acbe7ee\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/peg-macros/0.8.6/download\"],\n strip_prefix = \"peg-macros-0.8.6\",\n build_file = Label(\"@crates//crates:BUILD.peg-macros-0.8.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__peg-runtime-0.8.6\",\n sha256 = \"7011d97b484a5ebdc4b1fdb3b12d5e4bbbea56e9d22b688f2e79e04b65a7d8a6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/peg-runtime/0.8.6/download\"],\n strip_prefix = \"peg-runtime-0.8.6\",\n build_file = Label(\"@crates//crates:BUILD.peg-runtime-0.8.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pem-3.0.6\",\n sha256 = \"1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pem/3.0.6/download\"],\n strip_prefix = \"pem-3.0.6\",\n build_file = Label(\"@crates//crates:BUILD.pem-3.0.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pem-rfc7468-0.7.0\",\n sha256 = \"88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pem-rfc7468/0.7.0/download\"],\n strip_prefix = \"pem-rfc7468-0.7.0\",\n build_file = Label(\"@crates//crates:BUILD.pem-rfc7468-0.7.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__percent-encoding-2.3.2\",\n sha256 = \"9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/percent-encoding/2.3.2/download\"],\n strip_prefix = \"percent-encoding-2.3.2\",\n build_file = Label(\"@crates//crates:BUILD.percent-encoding-2.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pest-2.8.8\",\n sha256 = \"7df728be843c7070fab6ab7c328c4e9e9d78e23bf749c0669c86ee7ebfa050a2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pest/2.8.8/download\"],\n strip_prefix = \"pest-2.8.8\",\n build_file = Label(\"@crates//crates:BUILD.pest-2.8.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pest_derive-2.8.8\",\n sha256 = \"9e2dd6fc3b26b3462ee188aac870f5a41d398f1cd5e2408d16531bd71c9591fd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pest_derive/2.8.8/download\"],\n strip_prefix = \"pest_derive-2.8.8\",\n build_file = Label(\"@crates//crates:BUILD.pest_derive-2.8.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pest_generator-2.8.8\",\n sha256 = \"6a7a9205cfb6f596a9e8b689c0a15f9ceb7a1aafae7aaf788150ac65b29975b6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pest_generator/2.8.8/download\"],\n strip_prefix = \"pest_generator-2.8.8\",\n build_file = Label(\"@crates//crates:BUILD.pest_generator-2.8.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pest_meta-2.8.8\",\n sha256 = \"85abd351c0de1e8384fc791a0737111a350394937e92b956b743dac12429f57c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pest_meta/2.8.8/download\"],\n strip_prefix = \"pest_meta-2.8.8\",\n build_file = Label(\"@crates//crates:BUILD.pest_meta-2.8.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__petgraph-0.8.3\",\n sha256 = \"8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/petgraph/0.8.3/download\"],\n strip_prefix = \"petgraph-0.8.3\",\n build_file = Label(\"@crates//crates:BUILD.petgraph-0.8.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__phf-0.11.3\",\n sha256 = \"1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/phf/0.11.3/download\"],\n strip_prefix = \"phf-0.11.3\",\n build_file = Label(\"@crates//crates:BUILD.phf-0.11.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__phf-0.12.1\",\n sha256 = \"913273894cec178f401a31ec4b656318d95473527be05c0752cc41cdc32be8b7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/phf/0.12.1/download\"],\n strip_prefix = \"phf-0.12.1\",\n build_file = Label(\"@crates//crates:BUILD.phf-0.12.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__phf-0.13.1\",\n sha256 = \"c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/phf/0.13.1/download\"],\n strip_prefix = \"phf-0.13.1\",\n build_file = Label(\"@crates//crates:BUILD.phf-0.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__phf_codegen-0.11.3\",\n sha256 = \"aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/phf_codegen/0.11.3/download\"],\n strip_prefix = \"phf_codegen-0.11.3\",\n build_file = Label(\"@crates//crates:BUILD.phf_codegen-0.11.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__phf_codegen-0.13.1\",\n sha256 = \"49aa7f9d80421bca176ca8dbfebe668cc7a2684708594ec9f3c0db0805d5d6e1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/phf_codegen/0.13.1/download\"],\n strip_prefix = \"phf_codegen-0.13.1\",\n build_file = Label(\"@crates//crates:BUILD.phf_codegen-0.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__phf_generator-0.11.3\",\n sha256 = \"3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/phf_generator/0.11.3/download\"],\n strip_prefix = \"phf_generator-0.11.3\",\n build_file = Label(\"@crates//crates:BUILD.phf_generator-0.11.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__phf_generator-0.13.1\",\n sha256 = \"135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/phf_generator/0.13.1/download\"],\n strip_prefix = \"phf_generator-0.13.1\",\n build_file = Label(\"@crates//crates:BUILD.phf_generator-0.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__phf_macros-0.13.1\",\n sha256 = \"812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/phf_macros/0.13.1/download\"],\n strip_prefix = \"phf_macros-0.13.1\",\n build_file = Label(\"@crates//crates:BUILD.phf_macros-0.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__phf_shared-0.11.3\",\n sha256 = \"67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/phf_shared/0.11.3/download\"],\n strip_prefix = \"phf_shared-0.11.3\",\n build_file = Label(\"@crates//crates:BUILD.phf_shared-0.11.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__phf_shared-0.12.1\",\n sha256 = \"06005508882fb681fd97892ecff4b7fd0fee13ef1aa569f8695dae7ab9099981\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/phf_shared/0.12.1/download\"],\n strip_prefix = \"phf_shared-0.12.1\",\n build_file = Label(\"@crates//crates:BUILD.phf_shared-0.12.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__phf_shared-0.13.1\",\n sha256 = \"e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/phf_shared/0.13.1/download\"],\n strip_prefix = \"phf_shared-0.13.1\",\n build_file = Label(\"@crates//crates:BUILD.phf_shared-0.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pin-project-lite-0.2.17\",\n sha256 = \"a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pin-project-lite/0.2.17/download\"],\n strip_prefix = \"pin-project-lite-0.2.17\",\n build_file = Label(\"@crates//crates:BUILD.pin-project-lite-0.2.17.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pin-utils-0.1.0\",\n sha256 = \"8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pin-utils/0.1.0/download\"],\n strip_prefix = \"pin-utils-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.pin-utils-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__piper-0.2.5\",\n sha256 = \"c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/piper/0.2.5/download\"],\n strip_prefix = \"piper-0.2.5\",\n build_file = Label(\"@crates//crates:BUILD.piper-0.2.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pipewire-0.9.2\",\n sha256 = \"9688b89abf11d756499f7c6190711d6dbe5a3acdb30c8fbf001d6596d06a8d44\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pipewire/0.9.2/download\"],\n strip_prefix = \"pipewire-0.9.2\",\n build_file = Label(\"@crates//crates:BUILD.pipewire-0.9.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pipewire-sys-0.9.2\",\n sha256 = \"cb028afee0d6ca17020b090e3b8fa2d7de23305aef975c7e5192a5050246ea36\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pipewire-sys/0.9.2/download\"],\n strip_prefix = \"pipewire-sys-0.9.2\",\n build_file = Label(\"@crates//crates:BUILD.pipewire-sys-0.9.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pkcs8-0.10.2\",\n sha256 = \"f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pkcs8/0.10.2/download\"],\n strip_prefix = \"pkcs8-0.10.2\",\n build_file = Label(\"@crates//crates:BUILD.pkcs8-0.10.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pkg-config-0.3.33\",\n sha256 = \"19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pkg-config/0.3.33/download\"],\n strip_prefix = \"pkg-config-0.3.33\",\n build_file = Label(\"@crates//crates:BUILD.pkg-config-0.3.33.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__platform-info-2.1.0\",\n sha256 = \"9368d62437c8cbb7c31ee37fd8c08a7d390e09a3ff75698a674953f46705ffcb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/platform-info/2.1.0/download\"],\n strip_prefix = \"platform-info-2.1.0\",\n build_file = Label(\"@crates//crates:BUILD.platform-info-2.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__png-0.18.1\",\n sha256 = \"60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/png/0.18.1/download\"],\n strip_prefix = \"png-0.18.1\",\n build_file = Label(\"@crates//crates:BUILD.png-0.18.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__polling-3.11.0\",\n sha256 = \"5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/polling/3.11.0/download\"],\n strip_prefix = \"polling-3.11.0\",\n build_file = Label(\"@crates//crates:BUILD.polling-3.11.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__poly1305-0.8.0\",\n sha256 = \"8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/poly1305/0.8.0/download\"],\n strip_prefix = \"poly1305-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.poly1305-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__polyval-0.6.2\",\n sha256 = \"9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/polyval/0.6.2/download\"],\n strip_prefix = \"polyval-0.6.2\",\n build_file = Label(\"@crates//crates:BUILD.polyval-0.6.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__portable-atomic-1.14.0\",\n sha256 = \"3d20d5497ef88037a52ff98267d066e7f11fcc5e99bbfbd58a42336193aacec3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/portable-atomic/1.14.0/download\"],\n strip_prefix = \"portable-atomic-1.14.0\",\n build_file = Label(\"@crates//crates:BUILD.portable-atomic-1.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__portable-atomic-util-0.2.7\",\n sha256 = \"c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/portable-atomic-util/0.2.7/download\"],\n strip_prefix = \"portable-atomic-util-0.2.7\",\n build_file = Label(\"@crates//crates:BUILD.portable-atomic-util-0.2.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__portable-pty-0.9.0\",\n sha256 = \"b4a596a2b3d2752d94f51fac2d4a96737b8705dddd311a32b9af47211f08671e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/portable-pty/0.9.0/download\"],\n strip_prefix = \"portable-pty-0.9.0\",\n build_file = Label(\"@crates//crates:BUILD.portable-pty-0.9.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__potential_utf-0.1.5\",\n sha256 = \"0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/potential_utf/0.1.5/download\"],\n strip_prefix = \"potential_utf-0.1.5\",\n build_file = Label(\"@crates//crates:BUILD.potential_utf-0.1.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__powerfmt-0.2.0\",\n sha256 = \"439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/powerfmt/0.2.0/download\"],\n strip_prefix = \"powerfmt-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.powerfmt-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ppv-lite86-0.2.21\",\n sha256 = \"85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ppv-lite86/0.2.21/download\"],\n strip_prefix = \"ppv-lite86-0.2.21\",\n build_file = Label(\"@crates//crates:BUILD.ppv-lite86-0.2.21.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__precomputed-hash-0.1.1\",\n sha256 = \"925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/precomputed-hash/0.1.1/download\"],\n strip_prefix = \"precomputed-hash-0.1.1\",\n build_file = Label(\"@crates//crates:BUILD.precomputed-hash-0.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pretty_assertions-1.4.1\",\n sha256 = \"3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pretty_assertions/1.4.1/download\"],\n strip_prefix = \"pretty_assertions-1.4.1\",\n build_file = Label(\"@crates//crates:BUILD.pretty_assertions-1.4.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__prettyplease-0.2.37\",\n sha256 = \"479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/prettyplease/0.2.37/download\"],\n strip_prefix = \"prettyplease-0.2.37\",\n build_file = Label(\"@crates//crates:BUILD.prettyplease-0.2.37.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__primeorder-0.13.6\",\n sha256 = \"353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/primeorder/0.13.6/download\"],\n strip_prefix = \"primeorder-0.13.6\",\n build_file = Label(\"@crates//crates:BUILD.primeorder-0.13.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__proc-macro-crate-3.5.0\",\n sha256 = \"e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/proc-macro-crate/3.5.0/download\"],\n strip_prefix = \"proc-macro-crate-3.5.0\",\n build_file = Label(\"@crates//crates:BUILD.proc-macro-crate-3.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__proc-macro2-1.0.107\",\n sha256 = \"985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/proc-macro2/1.0.107/download\"],\n strip_prefix = \"proc-macro2-1.0.107\",\n build_file = Label(\"@crates//crates:BUILD.proc-macro2-1.0.107.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__procfs-0.18.0\",\n sha256 = \"25485360a54d6861439d60facef26de713b1e126bf015ec8f98239467a2b82f7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/procfs/0.18.0/download\"],\n strip_prefix = \"procfs-0.18.0\",\n build_file = Label(\"@crates//crates:BUILD.procfs-0.18.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__procfs-core-0.18.0\",\n sha256 = \"e6401bf7b6af22f78b563665d15a22e9aef27775b79b149a66ca022468a4e405\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/procfs-core/0.18.0/download\"],\n strip_prefix = \"procfs-core-0.18.0\",\n build_file = Label(\"@crates//crates:BUILD.procfs-core-0.18.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ptr_meta-0.3.1\",\n sha256 = \"0b9a0cf95a1196af61d4f1cbdab967179516d9a4a4312af1f31948f8f6224a79\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ptr_meta/0.3.1/download\"],\n strip_prefix = \"ptr_meta-0.3.1\",\n build_file = Label(\"@crates//crates:BUILD.ptr_meta-0.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ptr_meta_derive-0.3.1\",\n sha256 = \"7347867d0a7e1208d93b46767be83e2b8f978c3dad35f775ac8d8847551d6fe1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ptr_meta_derive/0.3.1/download\"],\n strip_prefix = \"ptr_meta_derive-0.3.1\",\n build_file = Label(\"@crates//crates:BUILD.ptr_meta_derive-0.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pxfm-0.1.30\",\n sha256 = \"d55d956fa96f5ec02be2e13af0e20391a5aa83d6a074e3ad368959d0fab299ea\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pxfm/0.1.30/download\"],\n strip_prefix = \"pxfm-0.1.30\",\n build_file = Label(\"@crates//crates:BUILD.pxfm-0.1.30.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__quantette-0.5.1\",\n sha256 = \"c98fecda8b16396ff9adac67644a523dd1778c42b58606a29df5c31ca925d174\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/quantette/0.5.1/download\"],\n strip_prefix = \"quantette-0.5.1\",\n build_file = Label(\"@crates//crates:BUILD.quantette-0.5.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__quick-error-2.0.1\",\n sha256 = \"a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/quick-error/2.0.1/download\"],\n strip_prefix = \"quick-error-2.0.1\",\n build_file = Label(\"@crates//crates:BUILD.quick-error-2.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__quick-xml-0.30.0\",\n sha256 = \"eff6510e86862b57b210fd8cbe8ed3f0d7d600b9c2863cd4549a2e033c66e956\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/quick-xml/0.30.0/download\"],\n strip_prefix = \"quick-xml-0.30.0\",\n build_file = Label(\"@crates//crates:BUILD.quick-xml-0.30.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__quick-xml-0.41.0\",\n sha256 = \"e660451e55124f798a69a5af3f49ccfbefbd41910eefd25caf2393e1f3473ec1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/quick-xml/0.41.0/download\"],\n strip_prefix = \"quick-xml-0.41.0\",\n build_file = Label(\"@crates//crates:BUILD.quick-xml-0.41.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__quote-1.0.47\",\n sha256 = \"1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/quote/1.0.47/download\"],\n strip_prefix = \"quote-1.0.47\",\n build_file = Label(\"@crates//crates:BUILD.quote-1.0.47.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__r-efi-5.3.0\",\n sha256 = \"69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/r-efi/5.3.0/download\"],\n strip_prefix = \"r-efi-5.3.0\",\n build_file = Label(\"@crates//crates:BUILD.r-efi-5.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__r-efi-6.0.0\",\n sha256 = \"f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/r-efi/6.0.0/download\"],\n strip_prefix = \"r-efi-6.0.0\",\n build_file = Label(\"@crates//crates:BUILD.r-efi-6.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__radium-0.7.0\",\n sha256 = \"dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/radium/0.7.0/download\"],\n strip_prefix = \"radium-0.7.0\",\n build_file = Label(\"@crates//crates:BUILD.radium-0.7.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rancor-0.1.2\",\n sha256 = \"daff8b7b3ccf5f7ba270b3e7a0a4d4c701c5797e38dec27c7e2c3dbb830fed1c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rancor/0.1.2/download\"],\n strip_prefix = \"rancor-0.1.2\",\n build_file = Label(\"@crates//crates:BUILD.rancor-0.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rand-0.10.2\",\n sha256 = \"c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rand/0.10.2/download\"],\n strip_prefix = \"rand-0.10.2\",\n build_file = Label(\"@crates//crates:BUILD.rand-0.10.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rand-0.8.7\",\n sha256 = \"22f6172bdec972074665ed81ed53b71da00bfc44b65a753cfde883ec4c702a1a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rand/0.8.7/download\"],\n strip_prefix = \"rand-0.8.7\",\n build_file = Label(\"@crates//crates:BUILD.rand-0.8.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rand-0.9.5\",\n sha256 = \"b9ef1d0d795eb7d84685bca4f72f3649f064e6641543d3a8c415898726a57b41\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rand/0.9.5/download\"],\n strip_prefix = \"rand-0.9.5\",\n build_file = Label(\"@crates//crates:BUILD.rand-0.9.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rand_chacha-0.9.0\",\n sha256 = \"d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rand_chacha/0.9.0/download\"],\n strip_prefix = \"rand_chacha-0.9.0\",\n build_file = Label(\"@crates//crates:BUILD.rand_chacha-0.9.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rand_core-0.10.1\",\n sha256 = \"63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rand_core/0.10.1/download\"],\n strip_prefix = \"rand_core-0.10.1\",\n build_file = Label(\"@crates//crates:BUILD.rand_core-0.10.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rand_core-0.6.4\",\n sha256 = \"ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rand_core/0.6.4/download\"],\n strip_prefix = \"rand_core-0.6.4\",\n build_file = Label(\"@crates//crates:BUILD.rand_core-0.6.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rand_core-0.9.5\",\n sha256 = \"76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rand_core/0.9.5/download\"],\n strip_prefix = \"rand_core-0.9.5\",\n build_file = Label(\"@crates//crates:BUILD.rand_core-0.9.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rand_xoshiro-0.7.0\",\n sha256 = \"f703f4665700daf5512dcca5f43afa6af89f09db47fb56be587f80636bda2d41\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rand_xoshiro/0.7.0/download\"],\n strip_prefix = \"rand_xoshiro-0.7.0\",\n build_file = Label(\"@crates//crates:BUILD.rand_xoshiro-0.7.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rayon-1.12.0\",\n sha256 = \"fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rayon/1.12.0/download\"],\n strip_prefix = \"rayon-1.12.0\",\n build_file = Label(\"@crates//crates:BUILD.rayon-1.12.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rayon-core-1.13.0\",\n sha256 = \"22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rayon-core/1.13.0/download\"],\n strip_prefix = \"rayon-core-1.13.0\",\n build_file = Label(\"@crates//crates:BUILD.rayon-core-1.13.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rcgen-0.13.2\",\n sha256 = \"75e669e5202259b5314d1ea5397316ad400819437857b90861765f24c4cf80a2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rcgen/0.13.2/download\"],\n strip_prefix = \"rcgen-0.13.2\",\n build_file = Label(\"@crates//crates:BUILD.rcgen-0.13.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__redox_syscall-0.5.18\",\n sha256 = \"ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/redox_syscall/0.5.18/download\"],\n strip_prefix = \"redox_syscall-0.5.18\",\n build_file = Label(\"@crates//crates:BUILD.redox_syscall-0.5.18.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ref-cast-1.0.26\",\n sha256 = \"216e8f773d7923bcba9ceb86a86c93cabb3903a11872fc3f138c49630e50b96d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ref-cast/1.0.26/download\"],\n strip_prefix = \"ref-cast-1.0.26\",\n build_file = Label(\"@crates//crates:BUILD.ref-cast-1.0.26.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ref-cast-impl-1.0.26\",\n sha256 = \"2c9283685feec7d69af75fb0e858d5e7378f33fe4fc699383b2916ab9273e03c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ref-cast-impl/1.0.26/download\"],\n strip_prefix = \"ref-cast-impl-1.0.26\",\n build_file = Label(\"@crates//crates:BUILD.ref-cast-impl-1.0.26.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__regex-1.13.1\",\n sha256 = \"f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/regex/1.13.1/download\"],\n strip_prefix = \"regex-1.13.1\",\n build_file = Label(\"@crates//crates:BUILD.regex-1.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__regex-automata-0.4.16\",\n sha256 = \"8fcfdb36bda0c880c5931cdc7a2bcdc8ba4556847b9d912bca70bc94708711ad\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/regex-automata/0.4.16/download\"],\n strip_prefix = \"regex-automata-0.4.16\",\n build_file = Label(\"@crates//crates:BUILD.regex-automata-0.4.16.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__regex-lite-0.1.9\",\n sha256 = \"cab834c73d247e67f4fae452806d17d3c7501756d98c8808d7c9c7aa7d18f973\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/regex-lite/0.1.9/download\"],\n strip_prefix = \"regex-lite-0.1.9\",\n build_file = Label(\"@crates//crates:BUILD.regex-lite-0.1.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__regex-syntax-0.8.11\",\n sha256 = \"d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/regex-syntax/0.8.11/download\"],\n strip_prefix = \"regex-syntax-0.8.11\",\n build_file = Label(\"@crates//crates:BUILD.regex-syntax-0.8.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__relative-path-1.9.3\",\n sha256 = \"ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/relative-path/1.9.3/download\"],\n strip_prefix = \"relative-path-1.9.3\",\n build_file = Label(\"@crates//crates:BUILD.relative-path-1.9.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rend-0.5.4\",\n sha256 = \"663ba70707f96e871406fe10d68128412e619b06d1d47cb91c3a4c6501176240\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rend/0.5.4/download\"],\n strip_prefix = \"rend-0.5.4\",\n build_file = Label(\"@crates//crates:BUILD.rend-0.5.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rfc6979-0.4.0\",\n sha256 = \"f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rfc6979/0.4.0/download\"],\n strip_prefix = \"rfc6979-0.4.0\",\n build_file = Label(\"@crates//crates:BUILD.rfc6979-0.4.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rgb-0.8.53\",\n sha256 = \"47b34b781b31e5d73e9fbc8689c70551fd1ade9a19e3e28cfec8580a79290cc4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rgb/0.8.53/download\"],\n strip_prefix = \"rgb-0.8.53\",\n build_file = Label(\"@crates//crates:BUILD.rgb-0.8.53.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ring-0.17.14\",\n sha256 = \"a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ring/0.17.14/download\"],\n strip_prefix = \"ring-0.17.14\",\n build_file = Label(\"@crates//crates:BUILD.ring-0.17.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rkyv-0.8.17\",\n sha256 = \"815cc8a37159a463064825246cadb07961e25cd9885908606f6d08a98d8f8874\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rkyv/0.8.17/download\"],\n strip_prefix = \"rkyv-0.8.17\",\n build_file = Label(\"@crates//crates:BUILD.rkyv-0.8.17.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rkyv_derive-0.8.17\",\n sha256 = \"c0ed1a78a1b19d184b0daa629dd9a024573173ec7d485b287cb369fb3607cc1c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rkyv_derive/0.8.17/download\"],\n strip_prefix = \"rkyv_derive-0.8.17\",\n build_file = Label(\"@crates//crates:BUILD.rkyv_derive-0.8.17.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rlimit-0.11.0\",\n sha256 = \"f35ee2729c56bb610f6dba436bf78135f728b7373bdffae2ec815b2d3eb98cc3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rlimit/0.11.0/download\"],\n strip_prefix = \"rlimit-0.11.0\",\n build_file = Label(\"@crates//crates:BUILD.rlimit-0.11.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rpds-1.2.1\",\n sha256 = \"e025feb26210bc196b908e72deb063b1b4000754304341cbc168a1e72c857ebc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rpds/1.2.1/download\"],\n strip_prefix = \"rpds-1.2.1\",\n build_file = Label(\"@crates//crates:BUILD.rpds-1.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rstest-0.26.1\",\n sha256 = \"f5a3193c063baaa2a95a33f03035c8a72b83d97a54916055ba22d35ed3839d49\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rstest/0.26.1/download\"],\n strip_prefix = \"rstest-0.26.1\",\n build_file = Label(\"@crates//crates:BUILD.rstest-0.26.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rstest_macros-0.26.1\",\n sha256 = \"9c845311f0ff7951c5506121a9ad75aec44d083c31583b2ea5a30bcb0b0abba0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rstest_macros/0.26.1/download\"],\n strip_prefix = \"rstest_macros-0.26.1\",\n build_file = Label(\"@crates//crates:BUILD.rstest_macros-0.26.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rtcp-0.17.2\",\n sha256 = \"adad7f6a501162881032fc84b4bc78ae11f1b30748180b9f5cbe8810bf613aab\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rtcp/0.17.2/download\"],\n strip_prefix = \"rtcp-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.rtcp-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rtp-0.17.2\",\n sha256 = \"149329e78ada26b5e174a4c281a7a7e5c8bda6008adc90daddd6f98fce56db29\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rtp/0.17.2/download\"],\n strip_prefix = \"rtp-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.rtp-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustc-hash-1.1.0\",\n sha256 = \"08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustc-hash/1.1.0/download\"],\n strip_prefix = \"rustc-hash-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.rustc-hash-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustc-hash-2.1.3\",\n sha256 = \"6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustc-hash/2.1.3/download\"],\n strip_prefix = \"rustc-hash-2.1.3\",\n build_file = Label(\"@crates//crates:BUILD.rustc-hash-2.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustc_version-0.4.1\",\n sha256 = \"cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustc_version/0.4.1/download\"],\n strip_prefix = \"rustc_version-0.4.1\",\n build_file = Label(\"@crates//crates:BUILD.rustc_version-0.4.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rusticata-macros-4.1.0\",\n sha256 = \"faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rusticata-macros/4.1.0/download\"],\n strip_prefix = \"rusticata-macros-4.1.0\",\n build_file = Label(\"@crates//crates:BUILD.rusticata-macros-4.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustix-0.38.44\",\n sha256 = \"fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustix/0.38.44/download\"],\n strip_prefix = \"rustix-0.38.44\",\n build_file = Label(\"@crates//crates:BUILD.rustix-0.38.44.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustix-1.1.4\",\n sha256 = \"b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustix/1.1.4/download\"],\n strip_prefix = \"rustix-1.1.4\",\n build_file = Label(\"@crates//crates:BUILD.rustix-1.1.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustls-0.23.42\",\n sha256 = \"3c54fcab019b409d04215d3a17cb438fd7fbf192ee61461f20f4fe18704bc138\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustls/0.23.42/download\"],\n strip_prefix = \"rustls-0.23.42\",\n build_file = Label(\"@crates//crates:BUILD.rustls-0.23.42.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustls-pki-types-1.15.1\",\n sha256 = \"2f4925028c7eb5d1fcdaf196971378ed9d2c1c4efc7dc5d011256f76c99c0a96\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustls-pki-types/1.15.1/download\"],\n strip_prefix = \"rustls-pki-types-1.15.1\",\n build_file = Label(\"@crates//crates:BUILD.rustls-pki-types-1.15.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustls-webpki-0.103.13\",\n sha256 = \"61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustls-webpki/0.103.13/download\"],\n strip_prefix = \"rustls-webpki-0.103.13\",\n build_file = Label(\"@crates//crates:BUILD.rustls-webpki-0.103.13.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustversion-1.0.23\",\n sha256 = \"cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustversion/1.0.23/download\"],\n strip_prefix = \"rustversion-1.0.23\",\n build_file = Label(\"@crates//crates:BUILD.rustversion-1.0.23.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__safe_arch-0.9.3\",\n sha256 = \"629516c85c29fe757770fa03f2074cf1eac43d44c02a3de9fc2ef7b0e207dfdd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/safe_arch/0.9.3/download\"],\n strip_prefix = \"safe_arch-0.9.3\",\n build_file = Label(\"@crates//crates:BUILD.safe_arch-0.9.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__same-file-1.0.6\",\n sha256 = \"93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/same-file/1.0.6/download\"],\n strip_prefix = \"same-file-1.0.6\",\n build_file = Label(\"@crates//crates:BUILD.same-file-1.0.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__scoped-tls-1.0.1\",\n sha256 = \"e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/scoped-tls/1.0.1/download\"],\n strip_prefix = \"scoped-tls-1.0.1\",\n build_file = Label(\"@crates//crates:BUILD.scoped-tls-1.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__scopeguard-1.2.0\",\n sha256 = \"94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/scopeguard/1.2.0/download\"],\n strip_prefix = \"scopeguard-1.2.0\",\n build_file = Label(\"@crates//crates:BUILD.scopeguard-1.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__sdp-0.17.2\",\n sha256 = \"66b6eecfa5151edef84d544ff3885dff98e5b5fe97586757a4b5118bde51c958\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/sdp/0.17.2/download\"],\n strip_prefix = \"sdp-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.sdp-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__sec1-0.7.3\",\n sha256 = \"d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/sec1/0.7.3/download\"],\n strip_prefix = \"sec1-0.7.3\",\n build_file = Label(\"@crates//crates:BUILD.sec1-0.7.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__self_cell-1.3.0\",\n sha256 = \"2ab42ca02749e120097e328d91d415325bdf43b1c72c4c8badf37375fe40a813\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/self_cell/1.3.0/download\"],\n strip_prefix = \"self_cell-1.3.0\",\n build_file = Label(\"@crates//crates:BUILD.self_cell-1.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__semver-1.0.28\",\n sha256 = \"8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/semver/1.0.28/download\"],\n strip_prefix = \"semver-1.0.28\",\n build_file = Label(\"@crates//crates:BUILD.semver-1.0.28.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde-1.0.229\",\n sha256 = \"4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde/1.0.229/download\"],\n strip_prefix = \"serde-1.0.229\",\n build_file = Label(\"@crates//crates:BUILD.serde-1.0.229.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_core-1.0.229\",\n sha256 = \"67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_core/1.0.229/download\"],\n strip_prefix = \"serde_core-1.0.229\",\n build_file = Label(\"@crates//crates:BUILD.serde_core-1.0.229.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_derive-1.0.229\",\n sha256 = \"e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_derive/1.0.229/download\"],\n strip_prefix = \"serde_derive-1.0.229\",\n build_file = Label(\"@crates//crates:BUILD.serde_derive-1.0.229.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_json-1.0.151\",\n sha256 = \"c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_json/1.0.151/download\"],\n strip_prefix = \"serde_json-1.0.151\",\n build_file = Label(\"@crates//crates:BUILD.serde_json-1.0.151.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_repr-0.1.21\",\n sha256 = \"8d3b1629de253c70a0508c3899572da79ca359fdab27c7920ff00406df418906\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_repr/0.1.21/download\"],\n strip_prefix = \"serde_repr-0.1.21\",\n build_file = Label(\"@crates//crates:BUILD.serde_repr-0.1.21.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_spanned-1.1.1\",\n sha256 = \"6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_spanned/1.1.1/download\"],\n strip_prefix = \"serde_spanned-1.1.1\",\n build_file = Label(\"@crates//crates:BUILD.serde_spanned-1.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serial2-0.2.37\",\n sha256 = \"9eb6ea5562eeaed6936b8b54e086aa0f88b9e5b1bef45beb038e2519fa1185b1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serial2/0.2.37/download\"],\n strip_prefix = \"serial2-0.2.37\",\n build_file = Label(\"@crates//crates:BUILD.serial2-0.2.37.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__sha1-0.10.7\",\n sha256 = \"a978451301f4db1d02937a4ab3ccce137717b81826e79b7d49ffe3244a13c3b8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/sha1/0.10.7/download\"],\n strip_prefix = \"sha1-0.10.7\",\n build_file = Label(\"@crates//crates:BUILD.sha1-0.10.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__sha2-0.10.9\",\n sha256 = \"a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/sha2/0.10.9/download\"],\n strip_prefix = \"sha2-0.10.9\",\n build_file = Label(\"@crates//crates:BUILD.sha2-0.10.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__sha3-0.10.9\",\n sha256 = \"77fd7028345d415a4034cf8777cd4f8ab1851274233b45f84e3d955502d93874\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/sha3/0.10.9/download\"],\n strip_prefix = \"sha3-0.10.9\",\n build_file = Label(\"@crates//crates:BUILD.sha3-0.10.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__shared_library-0.1.9\",\n sha256 = \"5a9e7e0f2bfae24d8a5b5a66c5b257a83c7412304311512a0c054cd5e619da11\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/shared_library/0.1.9/download\"],\n strip_prefix = \"shared_library-0.1.9\",\n build_file = Label(\"@crates//crates:BUILD.shared_library-0.1.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__shell-words-1.1.1\",\n sha256 = \"dc6fe69c597f9c37bfeeeeeb33da3530379845f10be461a66d16d03eca2ded77\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/shell-words/1.1.1/download\"],\n strip_prefix = \"shell-words-1.1.1\",\n build_file = Label(\"@crates//crates:BUILD.shell-words-1.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__shlex-1.3.0\",\n sha256 = \"0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/shlex/1.3.0/download\"],\n strip_prefix = \"shlex-1.3.0\",\n build_file = Label(\"@crates//crates:BUILD.shlex-1.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__shlex-2.0.1\",\n sha256 = \"f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/shlex/2.0.1/download\"],\n strip_prefix = \"shlex-2.0.1\",\n build_file = Label(\"@crates//crates:BUILD.shlex-2.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__signal-hook-registry-1.4.8\",\n sha256 = \"c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/signal-hook-registry/1.4.8/download\"],\n strip_prefix = \"signal-hook-registry-1.4.8\",\n build_file = Label(\"@crates//crates:BUILD.signal-hook-registry-1.4.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__signature-2.2.0\",\n sha256 = \"77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/signature/2.2.0/download\"],\n strip_prefix = \"signature-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.signature-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__simd-adler32-0.3.10\",\n sha256 = \"3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/simd-adler32/0.3.10/download\"],\n strip_prefix = \"simd-adler32-0.3.10\",\n build_file = Label(\"@crates//crates:BUILD.simd-adler32-0.3.10.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__simdutf8-0.1.5\",\n sha256 = \"e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/simdutf8/0.1.5/download\"],\n strip_prefix = \"simdutf8-0.1.5\",\n build_file = Label(\"@crates//crates:BUILD.simdutf8-0.1.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__similar-2.7.0\",\n sha256 = \"bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/similar/2.7.0/download\"],\n strip_prefix = \"similar-2.7.0\",\n build_file = Label(\"@crates//crates:BUILD.similar-2.7.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__similar-3.1.1\",\n sha256 = \"e6505efef05804732ed8a3f2d4f279429eb485bd69d5b0cc6b19cc02005cda16\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/similar/3.1.1/download\"],\n strip_prefix = \"similar-3.1.1\",\n build_file = Label(\"@crates//crates:BUILD.similar-3.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__siphasher-1.0.3\",\n sha256 = \"8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/siphasher/1.0.3/download\"],\n strip_prefix = \"siphasher-1.0.3\",\n build_file = Label(\"@crates//crates:BUILD.siphasher-1.0.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__slab-0.4.12\",\n sha256 = \"0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/slab/0.4.12/download\"],\n strip_prefix = \"slab-0.4.12\",\n build_file = Label(\"@crates//crates:BUILD.slab-0.4.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__sm3-0.5.0\",\n sha256 = \"da6a89ba31723d185fd7413b98c576a575f356d9b84729d8ecb6ead60000a5b6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/sm3/0.5.0/download\"],\n strip_prefix = \"sm3-0.5.0\",\n build_file = Label(\"@crates//crates:BUILD.sm3-0.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__smallvec-1.15.2\",\n sha256 = \"8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/smallvec/1.15.2/download\"],\n strip_prefix = \"smallvec-1.15.2\",\n build_file = Label(\"@crates//crates:BUILD.smallvec-1.15.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__smol_str-0.2.2\",\n sha256 = \"dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/smol_str/0.2.2/download\"],\n strip_prefix = \"smol_str-0.2.2\",\n build_file = Label(\"@crates//crates:BUILD.smol_str-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__socket2-0.5.10\",\n sha256 = \"e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/socket2/0.5.10/download\"],\n strip_prefix = \"socket2-0.5.10\",\n build_file = Label(\"@crates//crates:BUILD.socket2-0.5.10.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__socket2-0.6.5\",\n sha256 = \"c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/socket2/0.6.5/download\"],\n strip_prefix = \"socket2-0.6.5\",\n build_file = Label(\"@crates//crates:BUILD.socket2-0.6.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__spin-0.10.1\",\n sha256 = \"023a211cb3138dbc438680b32560ad89f699977624c9f8dbb95a47d5b4c07dd3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/spin/0.10.1/download\"],\n strip_prefix = \"spin-0.10.1\",\n build_file = Label(\"@crates//crates:BUILD.spin-0.10.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__spin-0.9.9\",\n sha256 = \"3763264f6b73151db08c50ff20d7d8a0b8796e021cdea7ceedad07b80155fa0e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/spin/0.9.9/download\"],\n strip_prefix = \"spin-0.9.9\",\n build_file = Label(\"@crates//crates:BUILD.spin-0.9.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__spki-0.7.3\",\n sha256 = \"d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/spki/0.7.3/download\"],\n strip_prefix = \"spki-0.7.3\",\n build_file = Label(\"@crates//crates:BUILD.spki-0.7.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__stable_deref_trait-1.2.1\",\n sha256 = \"6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/stable_deref_trait/1.2.1/download\"],\n strip_prefix = \"stable_deref_trait-1.2.1\",\n build_file = Label(\"@crates//crates:BUILD.stable_deref_trait-1.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__str_stack-0.1.1\",\n sha256 = \"7f446288b699d66d0fd2e30d1cfe7869194312524b3b9252594868ed26ef056a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/str_stack/0.1.1/download\"],\n strip_prefix = \"str_stack-0.1.1\",\n build_file = Label(\"@crates//crates:BUILD.str_stack-0.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__streaming-iterator-0.1.9\",\n sha256 = \"2b2231b7c3057d5e4ad0156fb3dc807d900806020c5ffa3ee6ff2c8c76fb8520\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/streaming-iterator/0.1.9/download\"],\n strip_prefix = \"streaming-iterator-0.1.9\",\n build_file = Label(\"@crates//crates:BUILD.streaming-iterator-0.1.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__string_cache-0.9.0\",\n sha256 = \"a18596f8c785a729f2819c0f6a7eae6ebeebdfffbfe4214ae6b087f690e31901\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/string_cache/0.9.0/download\"],\n strip_prefix = \"string_cache-0.9.0\",\n build_file = Label(\"@crates//crates:BUILD.string_cache-0.9.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__string_cache_codegen-0.6.1\",\n sha256 = \"585635e46db231059f76c5849798146164652513eb9e8ab2685939dd90f29b69\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/string_cache_codegen/0.6.1/download\"],\n strip_prefix = \"string_cache_codegen-0.6.1\",\n build_file = Label(\"@crates//crates:BUILD.string_cache_codegen-0.6.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__strsim-0.11.1\",\n sha256 = \"7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/strsim/0.11.1/download\"],\n strip_prefix = \"strsim-0.11.1\",\n build_file = Label(\"@crates//crates:BUILD.strsim-0.11.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__strum-0.28.0\",\n sha256 = \"9628de9b8791db39ceda2b119bbe13134770b56c138ec1d3af810d045c04f9bd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/strum/0.28.0/download\"],\n strip_prefix = \"strum-0.28.0\",\n build_file = Label(\"@crates//crates:BUILD.strum-0.28.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__strum_macros-0.28.0\",\n sha256 = \"ab85eea0270ee17587ed4156089e10b9e6880ee688791d45a905f5b1ca36f664\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/strum_macros/0.28.0/download\"],\n strip_prefix = \"strum_macros-0.28.0\",\n build_file = Label(\"@crates//crates:BUILD.strum_macros-0.28.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__stun-0.17.2\",\n sha256 = \"2e3b8d5ad1dd4c8cd0595440f26521a71dd593cb5873ee8e06b91510b7d97269\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/stun/0.17.2/download\"],\n strip_prefix = \"stun-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.stun-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__substring-1.4.5\",\n sha256 = \"42ee6433ecef213b2e72f587ef64a2f5943e7cd16fbd82dbe8bc07486c534c86\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/substring/1.4.5/download\"],\n strip_prefix = \"substring-1.4.5\",\n build_file = Label(\"@crates//crates:BUILD.substring-1.4.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__subtle-2.6.1\",\n sha256 = \"13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/subtle/2.6.1/download\"],\n strip_prefix = \"subtle-2.6.1\",\n build_file = Label(\"@crates//crates:BUILD.subtle-2.6.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__syn-2.0.119\",\n sha256 = \"872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/syn/2.0.119/download\"],\n strip_prefix = \"syn-2.0.119\",\n build_file = Label(\"@crates//crates:BUILD.syn-2.0.119.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__syn-3.0.3\",\n sha256 = \"53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/syn/3.0.3/download\"],\n strip_prefix = \"syn-3.0.3\",\n build_file = Label(\"@crates//crates:BUILD.syn-3.0.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__synstructure-0.13.2\",\n sha256 = \"728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/synstructure/0.13.2/download\"],\n strip_prefix = \"synstructure-0.13.2\",\n build_file = Label(\"@crates//crates:BUILD.synstructure-0.13.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__syntect-5.3.0\",\n sha256 = \"656b45c05d95a5704399aeef6bd0ddec7b2b3531b7c9e900abbf7c4d2190c925\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/syntect/5.3.0/download\"],\n strip_prefix = \"syntect-5.3.0\",\n build_file = Label(\"@crates//crates:BUILD.syntect-5.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__system-deps-7.0.8\",\n sha256 = \"396a35feb67335377e0251fcbc1092fc85c484bd4e3a7a54319399da127796e7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/system-deps/7.0.8/download\"],\n strip_prefix = \"system-deps-7.0.8\",\n build_file = Label(\"@crates//crates:BUILD.system-deps-7.0.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tap-1.0.1\",\n sha256 = \"55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tap/1.0.1/download\"],\n strip_prefix = \"tap-1.0.1\",\n build_file = Label(\"@crates//crates:BUILD.tap-1.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__target-lexicon-0.13.5\",\n sha256 = \"adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/target-lexicon/0.13.5/download\"],\n strip_prefix = \"target-lexicon-0.13.5\",\n build_file = Label(\"@crates//crates:BUILD.target-lexicon-0.13.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tempfile-3.27.0\",\n sha256 = \"32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tempfile/3.27.0/download\"],\n strip_prefix = \"tempfile-3.27.0\",\n build_file = Label(\"@crates//crates:BUILD.tempfile-3.27.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tendril-0.5.1\",\n sha256 = \"5fed54709c5b3a53d09bb1c113ea4f5ceafd1e772ddcb0030a82e1d56c087b08\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tendril/0.5.1/download\"],\n strip_prefix = \"tendril-0.5.1\",\n build_file = Label(\"@crates//crates:BUILD.tendril-0.5.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__termcolor-1.4.1\",\n sha256 = \"06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/termcolor/1.4.1/download\"],\n strip_prefix = \"termcolor-1.4.1\",\n build_file = Label(\"@crates//crates:BUILD.termcolor-1.4.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__terminal_size-0.4.4\",\n sha256 = \"230a1b821ccbd75b185820a1f1ff7b14d21da1e442e22c0863ea5f08771a8874\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/terminal_size/0.4.4/download\"],\n strip_prefix = \"terminal_size-0.4.4\",\n build_file = Label(\"@crates//crates:BUILD.terminal_size-0.4.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__terminfo-0.9.0\",\n sha256 = \"d4ea810f0692f9f51b382fff5893887bb4580f5fa246fde546e0b13e7fcee662\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/terminfo/0.9.0/download\"],\n strip_prefix = \"terminfo-0.9.0\",\n build_file = Label(\"@crates//crates:BUILD.terminfo-0.9.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__thiserror-1.0.69\",\n sha256 = \"b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/thiserror/1.0.69/download\"],\n strip_prefix = \"thiserror-1.0.69\",\n build_file = Label(\"@crates//crates:BUILD.thiserror-1.0.69.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__thiserror-2.0.19\",\n sha256 = \"09a43598840e33d5b0331f38c5e30d13bb11c11210a4b58f0d9b18a5a5eefcd9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/thiserror/2.0.19/download\"],\n strip_prefix = \"thiserror-2.0.19\",\n build_file = Label(\"@crates//crates:BUILD.thiserror-2.0.19.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__thiserror-impl-1.0.69\",\n sha256 = \"4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/thiserror-impl/1.0.69/download\"],\n strip_prefix = \"thiserror-impl-1.0.69\",\n build_file = Label(\"@crates//crates:BUILD.thiserror-impl-1.0.69.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__thiserror-impl-2.0.19\",\n sha256 = \"43cbfe0cf76104d42a574802844187e84a305e531ed54455f11fbde0f10541cd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/thiserror-impl/2.0.19/download\"],\n strip_prefix = \"thiserror-impl-2.0.19\",\n build_file = Label(\"@crates//crates:BUILD.thiserror-impl-2.0.19.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tiff-0.11.3\",\n sha256 = \"b63feaf3343d35b6ca4d50483f94843803b0f51634937cc2ec519fc32232bc52\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tiff/0.11.3/download\"],\n strip_prefix = \"tiff-0.11.3\",\n build_file = Label(\"@crates//crates:BUILD.tiff-0.11.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tiktoken-rs-0.11.0\",\n sha256 = \"fac4a168cfc1d8ed65bf17a6ee0843ad9a68f863c63c0fb2fa7eab67838782ee\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tiktoken-rs/0.11.0/download\"],\n strip_prefix = \"tiktoken-rs-0.11.0\",\n build_file = Label(\"@crates//crates:BUILD.tiktoken-rs-0.11.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__time-0.3.54\",\n sha256 = \"3e1d5e639ff6bab73cb6885cc7e7b1de96c3f32c68ec55f3952614bec1092244\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/time/0.3.54/download\"],\n strip_prefix = \"time-0.3.54\",\n build_file = Label(\"@crates//crates:BUILD.time-0.3.54.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__time-core-0.1.9\",\n sha256 = \"9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/time-core/0.1.9/download\"],\n strip_prefix = \"time-core-0.1.9\",\n build_file = Label(\"@crates//crates:BUILD.time-core-0.1.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__time-macros-0.2.32\",\n sha256 = \"7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/time-macros/0.2.32/download\"],\n strip_prefix = \"time-macros-0.2.32\",\n build_file = Label(\"@crates//crates:BUILD.time-macros-0.2.32.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tiny-keccak-2.0.2\",\n sha256 = \"2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tiny-keccak/2.0.2/download\"],\n strip_prefix = \"tiny-keccak-2.0.2\",\n build_file = Label(\"@crates//crates:BUILD.tiny-keccak-2.0.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tinystr-0.8.3\",\n sha256 = \"c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tinystr/0.8.3/download\"],\n strip_prefix = \"tinystr-0.8.3\",\n build_file = Label(\"@crates//crates:BUILD.tinystr-0.8.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tinyvec-1.12.0\",\n sha256 = \"bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tinyvec/1.12.0/download\"],\n strip_prefix = \"tinyvec-1.12.0\",\n build_file = Label(\"@crates//crates:BUILD.tinyvec-1.12.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tinyvec_macros-0.1.1\",\n sha256 = \"1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tinyvec_macros/0.1.1/download\"],\n strip_prefix = \"tinyvec_macros-0.1.1\",\n build_file = Label(\"@crates//crates:BUILD.tinyvec_macros-0.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tokio-1.53.1\",\n sha256 = \"202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tokio/1.53.1/download\"],\n strip_prefix = \"tokio-1.53.1\",\n build_file = Label(\"@crates//crates:BUILD.tokio-1.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tokio-macros-2.7.1\",\n sha256 = \"6328af13490e73a9b4694030fafd93f8c8c6a9dede33e821c3fc63eddf8042ba\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tokio-macros/2.7.1/download\"],\n strip_prefix = \"tokio-macros-2.7.1\",\n build_file = Label(\"@crates//crates:BUILD.tokio-macros-2.7.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tokio-util-0.7.19\",\n sha256 = \"494815d09bf52b5548659851081238f0ca39ff638363907596da739561c62c52\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tokio-util/0.7.19/download\"],\n strip_prefix = \"tokio-util-0.7.19\",\n build_file = Label(\"@crates//crates:BUILD.tokio-util-0.7.19.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__toml-1.1.3-spec-1.1.0\",\n sha256 = \"53c96ecdfa941c8fc4fcaed14f99ada8ebed502eef533015095a07e3301d4c3c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/toml/1.1.3+spec-1.1.0/download\"],\n strip_prefix = \"toml-1.1.3+spec-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.toml-1.1.3+spec-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__toml_datetime-1.1.1-spec-1.1.0\",\n sha256 = \"3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/toml_datetime/1.1.1+spec-1.1.0/download\"],\n strip_prefix = \"toml_datetime-1.1.1+spec-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.toml_datetime-1.1.1+spec-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__toml_edit-0.25.13-spec-1.1.0\",\n sha256 = \"6975367e4d2ef766d86af01ffad14b622fecc8d4357a998fbc4deb6e9bacaf9b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/toml_edit/0.25.13+spec-1.1.0/download\"],\n strip_prefix = \"toml_edit-0.25.13+spec-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.toml_edit-0.25.13+spec-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__toml_parser-1.1.3-spec-1.1.0\",\n sha256 = \"1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/toml_parser/1.1.3+spec-1.1.0/download\"],\n strip_prefix = \"toml_parser-1.1.3+spec-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.toml_parser-1.1.3+spec-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__toml_writer-1.1.2-spec-1.1.0\",\n sha256 = \"7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/toml_writer/1.1.2+spec-1.1.0/download\"],\n strip_prefix = \"toml_writer-1.1.2+spec-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.toml_writer-1.1.2+spec-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tracing-0.1.44\",\n sha256 = \"63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tracing/0.1.44/download\"],\n strip_prefix = \"tracing-0.1.44\",\n build_file = Label(\"@crates//crates:BUILD.tracing-0.1.44.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tracing-attributes-0.1.31\",\n sha256 = \"7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tracing-attributes/0.1.31/download\"],\n strip_prefix = \"tracing-attributes-0.1.31\",\n build_file = Label(\"@crates//crates:BUILD.tracing-attributes-0.1.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tracing-core-0.1.36\",\n sha256 = \"db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tracing-core/0.1.36/download\"],\n strip_prefix = \"tracing-core-0.1.36\",\n build_file = Label(\"@crates//crates:BUILD.tracing-core-0.1.36.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-0.25.10\",\n sha256 = \"78f873475d258561b06f1c595d93308a7ed124d9977cb26b148c2084a4a3cc87\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter/0.25.10/download\"],\n strip_prefix = \"tree-sitter-0.25.10\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-0.25.10.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-astro-next-0.1.1\",\n sha256 = \"794a4a59fc2d88e49b4bc41fef9522d77184a36f4e68bbaf545cd1eb2364c46e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-astro-next/0.1.1/download\"],\n strip_prefix = \"tree-sitter-astro-next-0.1.1\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-astro-next-0.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-bash-0.25.1\",\n sha256 = \"9e5ec769279cc91b561d3df0d8a5deb26b0ad40d183127f409494d6d8fc53062\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-bash/0.25.1/download\"],\n strip_prefix = \"tree-sitter-bash-0.25.1\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-bash-0.25.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-c-0.24.2\",\n sha256 = \"a9b2eb57a55fed6b00812912e730b7a275cf4fe98bfd6a5d76263d4438371728\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-c/0.24.2/download\"],\n strip_prefix = \"tree-sitter-c-0.24.2\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-c-0.24.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-c-sharp-0.23.5\",\n sha256 = \"c1aac67f1ad71de1d6d39708d34811081c26dfa495658de6c14c34200849357c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-c-sharp/0.23.5/download\"],\n strip_prefix = \"tree-sitter-c-sharp-0.23.5\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-c-sharp-0.23.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-clojure-0.1.0\",\n sha256 = \"4004884cc509449a1d78fa3e1f02b4e953d0a8065984445304795e72e885338c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-clojure/0.1.0/download\"],\n strip_prefix = \"tree-sitter-clojure-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-clojure-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-cmake-0.7.4\",\n sha256 = \"164e0c4f4236ec5ceff14824a5528615cf462e100467e49826442ff57d327061\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-cmake/0.7.4/download\"],\n strip_prefix = \"tree-sitter-cmake-0.7.4\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-cmake-0.7.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-cpp-0.23.4\",\n sha256 = \"df2196ea9d47b4ab4a31b9297eaa5a5d19a0b121dceb9f118f6790ad0ab94743\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-cpp/0.23.4/download\"],\n strip_prefix = \"tree-sitter-cpp-0.23.4\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-cpp-0.23.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-css-0.25.0\",\n sha256 = \"a5cbc5e18f29a2c6d6435891f42569525cf95435a3e01c2f1947abcde178686f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-css/0.25.0/download\"],\n strip_prefix = \"tree-sitter-css-0.25.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-css-0.25.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-dart-0.2.0\",\n sha256 = \"325dd1e24ee9ee21111e9c43680ae7d6010aaa9f282b048a99b9c7163c1cf553\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-dart/0.2.0/download\"],\n strip_prefix = \"tree-sitter-dart-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-dart-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-diff-0.1.0\",\n sha256 = \"dfe1e5ca280a65dfe5ba4205c1bcc84edf486464fed315db53dee6da9a335889\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-diff/0.1.0/download\"],\n strip_prefix = \"tree-sitter-diff-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-diff-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-dockerfile-updated-0.2.0\",\n sha256 = \"5e61eb704364be179ab9be89e2891c8e77c0041eca5891a5c04164a21f6df7a0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-dockerfile-updated/0.2.0/download\"],\n strip_prefix = \"tree-sitter-dockerfile-updated-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-dockerfile-updated-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-elisp-1.6.1\",\n sha256 = \"5e2e9a6ab3cebf24ca41cdc1f985549b9b33f7ef25c19ac7d18e53a4ee24da09\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-elisp/1.6.1/download\"],\n strip_prefix = \"tree-sitter-elisp-1.6.1\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-elisp-1.6.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-elixir-0.3.5\",\n sha256 = \"66dd064a762ed95bfc29857fa3cb7403bb1e5cb88112de0f6341b7e47284ba40\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-elixir/0.3.5/download\"],\n strip_prefix = \"tree-sitter-elixir-0.3.5\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-elixir-0.3.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-erlang-0.16.0\",\n sha256 = \"ceb442e728225d601db0661f60d64e166bd9b9a55c587f71d4e4f27378717cce\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-erlang/0.16.0/download\"],\n strip_prefix = \"tree-sitter-erlang-0.16.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-erlang-0.16.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-fortran-0.6.0\",\n sha256 = \"ea5fea41363a9b59666001dc26c4b356d4e164da27c6ce31145e00aba6bf9b16\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-fortran/0.6.0/download\"],\n strip_prefix = \"tree-sitter-fortran-0.6.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-fortran-0.6.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-go-0.25.0\",\n sha256 = \"c8560a4d2f835cc0d4d2c2e03cbd0dde2f6114b43bc491164238d333e28b16ea\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-go/0.25.0/download\"],\n strip_prefix = \"tree-sitter-go-0.25.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-go-0.25.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-graphql-0.1.0\",\n sha256 = \"efedc4cac157161cc23a0adc4553a2cedc908e1cd754b6cd033a919bb81ce5d6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-graphql/0.1.0/download\"],\n strip_prefix = \"tree-sitter-graphql-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-graphql-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-haskell-0.23.1\",\n sha256 = \"977c51e504548cba13fc27cb5a2edab2124cf6716a1934915d07ab99523b05a4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-haskell/0.23.1/download\"],\n strip_prefix = \"tree-sitter-haskell-0.23.1\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-haskell-0.23.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-hcl-1.1.0\",\n sha256 = \"5a7b2cc3d7121553b84309fab9d11b3ff3d420403eef9ae50f9fd1cd9d9cf012\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-hcl/1.1.0/download\"],\n strip_prefix = \"tree-sitter-hcl-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-hcl-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-html-0.23.2\",\n sha256 = \"261b708e5d92061ede329babaaa427b819329a9d427a1d710abb0f67bbef63ee\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-html/0.23.2/download\"],\n strip_prefix = \"tree-sitter-html-0.23.2\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-html-0.23.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-ini-1.4.0\",\n sha256 = \"387f79682cd53b7c0a5777c96e601a02b9965a787984ef86dbb8952bdab2d62f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-ini/1.4.0/download\"],\n strip_prefix = \"tree-sitter-ini-1.4.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-ini-1.4.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-java-0.23.5\",\n sha256 = \"0aa6cbcdc8c679b214e616fd3300da67da0e492e066df01bcf5a5921a71e90d6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-java/0.23.5/download\"],\n strip_prefix = \"tree-sitter-java-0.23.5\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-java-0.23.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-javascript-0.25.0\",\n sha256 = \"68204f2abc0627a90bdf06e605f5c470aa26fdcb2081ea553a04bdad756693f5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-javascript/0.25.0/download\"],\n strip_prefix = \"tree-sitter-javascript-0.25.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-javascript-0.25.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-json-0.24.8\",\n sha256 = \"4d727acca406c0020cffc6cf35516764f36c8e3dc4408e5ebe2cb35a947ec471\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-json/0.24.8/download\"],\n strip_prefix = \"tree-sitter-json-0.24.8\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-json-0.24.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-julia-0.23.1\",\n sha256 = \"4144731a178812ee867619b1e98b3b91e54c1652304b26e5ebe3175b701de323\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-julia/0.23.1/download\"],\n strip_prefix = \"tree-sitter-julia-0.23.1\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-julia-0.23.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-just-0.2.0\",\n sha256 = \"bd46794f2c270f43d73b2f2c8c256992471f3493c903604da0886df984771920\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-just/0.2.0/download\"],\n strip_prefix = \"tree-sitter-just-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-just-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-kotlin-sg-0.4.1\",\n sha256 = \"c06ec43ae3c12165d4ac08afe4e1f5fc6757ffe274fa7bd5af9007ef11ba4319\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-kotlin-sg/0.4.1/download\"],\n strip_prefix = \"tree-sitter-kotlin-sg-0.4.1\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-kotlin-sg-0.4.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-language-0.1.7\",\n sha256 = \"009994f150cc0cd50ff54917d5bc8bffe8cad10ca10d81c34da2ec421ae61782\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-language/0.1.7/download\"],\n strip_prefix = \"tree-sitter-language-0.1.7\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-language-0.1.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-lua-0.5.0\",\n sha256 = \"8daaf5f4235188a58603c39760d5fa5d4b920d36a299c934adddae757f32a10c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-lua/0.5.0/download\"],\n strip_prefix = \"tree-sitter-lua-0.5.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-lua-0.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-make-1.1.1\",\n sha256 = \"c5998dc7cbcbdab19fae8aefef982bf2d6544513d8d2e69cc44aec4c63810104\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-make/1.1.1/download\"],\n strip_prefix = \"tree-sitter-make-1.1.1\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-make-1.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-md-0.5.3\",\n sha256 = \"2efd398be546456c814598ee56c0f51769a77241511b4a58077815d120afa882\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-md/0.5.3/download\"],\n strip_prefix = \"tree-sitter-md-0.5.3\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-md-0.5.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-nix-0.3.0\",\n sha256 = \"4952a9733f3a98f6683a0ccd1035d84ab7a52f7e84eeed58548d86765ad92de3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-nix/0.3.0/download\"],\n strip_prefix = \"tree-sitter-nix-0.3.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-nix-0.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-objc-3.0.2\",\n sha256 = \"9ca8bb556423fc176f0535e79d525f783a6684d3c9da81bf9d905303c129e1d2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-objc/3.0.2/download\"],\n strip_prefix = \"tree-sitter-objc-3.0.2\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-objc-3.0.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-ocaml-0.24.2\",\n sha256 = \"7d19db582b3855f56b5f9ec484170fbfb9ee60b938ec7720d76d2ee788e8b640\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-ocaml/0.24.2/download\"],\n strip_prefix = \"tree-sitter-ocaml-0.24.2\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-ocaml-0.24.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-odin-1.3.0\",\n sha256 = \"24db210fe9ba2237c71c5030d7b146c7025420ba72dd8013d13cd822c3a8d77a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-odin/1.3.0/download\"],\n strip_prefix = \"tree-sitter-odin-1.3.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-odin-1.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-php-0.24.2\",\n sha256 = \"0d8c17c3ab69052c5eeaa7ff5cd972dd1bc25d1b97ee779fec391ad3b5df5592\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-php/0.24.2/download\"],\n strip_prefix = \"tree-sitter-php-0.24.2\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-php-0.24.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-powershell-0.26.4\",\n sha256 = \"3faf304d44b9ddd4a7d97804bb8de7daf564336dd5a526dc6de5b39238243022\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-powershell/0.26.4/download\"],\n strip_prefix = \"tree-sitter-powershell-0.26.4\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-powershell-0.26.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-proto-0.4.0\",\n sha256 = \"2e410ccb5fa3cbd6bf7b8e512ecf7ad9d5254395b822bfe9f751b50fa978f31c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-proto/0.4.0/download\"],\n strip_prefix = \"tree-sitter-proto-0.4.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-proto-0.4.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-python-0.25.0\",\n sha256 = \"6bf85fd39652e740bf60f46f4cda9492c3a9ad75880575bf14960f775cb74a1c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-python/0.25.0/download\"],\n strip_prefix = \"tree-sitter-python-0.25.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-python-0.25.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-r-1.3.0\",\n sha256 = \"ffc9954ec870dcad6cffdd302b405306c68cf031ed79a78cd9746f6740d9fe20\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-r/1.3.0/download\"],\n strip_prefix = \"tree-sitter-r-1.3.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-r-1.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-regex-0.25.0\",\n sha256 = \"bd8a59be9f0ac131fd8f062eaaba14882b2fa5a6a7882a20134cb1d60df2e625\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-regex/0.25.0/download\"],\n strip_prefix = \"tree-sitter-regex-0.25.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-regex-0.25.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-ruby-0.23.1\",\n sha256 = \"be0484ea4ef6bb9c575b4fdabde7e31340a8d2dbc7d52b321ac83da703249f95\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-ruby/0.23.1/download\"],\n strip_prefix = \"tree-sitter-ruby-0.23.1\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-ruby-0.23.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-rust-0.24.2\",\n sha256 = \"439e577dbe07423ec2582ac62c7531120dbfccfa6e5f92406f93dd271a120e45\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-rust/0.24.2/download\"],\n strip_prefix = \"tree-sitter-rust-0.24.2\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-rust-0.24.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-scala-0.26.0\",\n sha256 = \"de5a4a7ff23a55474ce6a741d52aaeca7a82fe9421bb982b86e98c6ac8629397\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-scala/0.26.0/download\"],\n strip_prefix = \"tree-sitter-scala-0.26.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-scala-0.26.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-sequel-0.3.11\",\n sha256 = \"9d198ad3c319c02e43c21efa1ec796b837afcb96ffaef1a40c1978fbdcec7d17\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-sequel/0.3.11/download\"],\n strip_prefix = \"tree-sitter-sequel-0.3.11\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-sequel-0.3.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-solidity-1.2.13\",\n sha256 = \"4eacf8875b70879f0cb670c60b233ad0b68752d9e1474e6c3ef168eea8a90b25\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-solidity/1.2.13/download\"],\n strip_prefix = \"tree-sitter-solidity-1.2.13\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-solidity-1.2.13.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-starlark-1.3.0\",\n sha256 = \"8934f282d085cc4b9ee28aa688aa3fbe8aa3766201c2a6252f411d45b4c3a721\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-starlark/1.3.0/download\"],\n strip_prefix = \"tree-sitter-starlark-1.3.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-starlark-1.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-svelte-next-0.1.1\",\n sha256 = \"56f88190d0743e897c3e148a7e241aba0a8844b8afe816943851426e3f7b9753\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-svelte-next/0.1.1/download\"],\n strip_prefix = \"tree-sitter-svelte-next-0.1.1\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-svelte-next-0.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-swift-0.7.3\",\n sha256 = \"fe36052155b9dd69ca82b3b8f1b4ccfb2d867125ac1a4db1dd7331829242668c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-swift/0.7.3/download\"],\n strip_prefix = \"tree-sitter-swift-0.7.3\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-swift-0.7.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-tlaplus-1.5.0\",\n sha256 = \"ddaacc0337bfee38f233a91a704dc36b887a0c385348163f65344d64b73f79e1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-tlaplus/1.5.0/download\"],\n strip_prefix = \"tree-sitter-tlaplus-1.5.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-tlaplus-1.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-toml-ng-0.7.0\",\n sha256 = \"e9adc2c898ae49730e857d75be403da3f92bb81d8e37a2f918a08dd10de5ebb1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-toml-ng/0.7.0/download\"],\n strip_prefix = \"tree-sitter-toml-ng-0.7.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-toml-ng-0.7.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-typescript-0.23.2\",\n sha256 = \"6c5f76ed8d947a75cc446d5fccd8b602ebf0cde64ccf2ffa434d873d7a575eff\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-typescript/0.23.2/download\"],\n strip_prefix = \"tree-sitter-typescript-0.23.2\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-typescript-0.23.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-verilog-1.0.3\",\n sha256 = \"d4e7e0360395852f1f6ff5b7b82c72dc6557d181073188df1d60ec469ea69c66\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-verilog/1.0.3/download\"],\n strip_prefix = \"tree-sitter-verilog-1.0.3\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-verilog-1.0.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-vue-next-0.1.0\",\n sha256 = \"e9ac89acaa8165aaabfa8ae9683aa423b0d2bf42c815dae5ca031a36a75525f1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-vue-next/0.1.0/download\"],\n strip_prefix = \"tree-sitter-vue-next-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-vue-next-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-xml-0.7.0\",\n sha256 = \"e670041f591d994f54d597ddcd8f4ebc930e282c4c76a42268743b71f0c8b6b3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-xml/0.7.0/download\"],\n strip_prefix = \"tree-sitter-xml-0.7.0\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-xml-0.7.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-yaml-0.7.2\",\n sha256 = \"53c223db85f05e34794f065454843b0668ebc15d240ada63e2b5939f43ce7c97\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-yaml/0.7.2/download\"],\n strip_prefix = \"tree-sitter-yaml-0.7.2\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-yaml-0.7.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree-sitter-zig-1.1.2\",\n sha256 = \"ab11fc124851b0db4dd5e55983bbd9631192e93238389dcd44521715e5d53e28\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree-sitter-zig/1.1.2/download\"],\n strip_prefix = \"tree-sitter-zig-1.1.2\",\n build_file = Label(\"@crates//crates:BUILD.tree-sitter-zig-1.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tree_magic_mini-3.2.2\",\n sha256 = \"b8765b90061cba6c22b5831f675da109ae5561588290f9fa2317adab2714d5a6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tree_magic_mini/3.2.2/download\"],\n strip_prefix = \"tree_magic_mini-3.2.2\",\n build_file = Label(\"@crates//crates:BUILD.tree_magic_mini-3.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__triomphe-0.1.16\",\n sha256 = \"b40688ea6389c8171614b25491f71d4a27946e0c7ce2da1c6de27e25abf1a0ae\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/triomphe/0.1.16/download\"],\n strip_prefix = \"triomphe-0.1.16\",\n build_file = Label(\"@crates//crates:BUILD.triomphe-0.1.16.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ttf-parser-0.21.1\",\n sha256 = \"2c591d83f69777866b9126b24c6dd9a18351f177e49d625920d19f989fd31cf8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ttf-parser/0.21.1/download\"],\n strip_prefix = \"ttf-parser-0.21.1\",\n build_file = Label(\"@crates//crates:BUILD.ttf-parser-0.21.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__turn-0.17.2\",\n sha256 = \"d99249a493335eb44c4d7943a8751b22561a82c9903d8eb2d29780b3927880a7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/turn/0.17.2/download\"],\n strip_prefix = \"turn-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.turn-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__type-map-0.5.1\",\n sha256 = \"cb30dbbd9036155e74adad6812e9898d03ec374946234fbcebd5dfc7b9187b90\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/type-map/0.5.1/download\"],\n strip_prefix = \"type-map-0.5.1\",\n build_file = Label(\"@crates//crates:BUILD.type-map-0.5.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__typed-arena-2.0.2\",\n sha256 = \"6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/typed-arena/2.0.2/download\"],\n strip_prefix = \"typed-arena-2.0.2\",\n build_file = Label(\"@crates//crates:BUILD.typed-arena-2.0.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__typenum-1.20.1\",\n sha256 = \"b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/typenum/1.20.1/download\"],\n strip_prefix = \"typenum-1.20.1\",\n build_file = Label(\"@crates//crates:BUILD.typenum-1.20.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ucd-trie-0.1.7\",\n sha256 = \"2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ucd-trie/0.1.7/download\"],\n strip_prefix = \"ucd-trie-0.1.7\",\n build_file = Label(\"@crates//crates:BUILD.ucd-trie-0.1.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__uds_windows-1.2.1\",\n sha256 = \"f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/uds_windows/1.2.1/download\"],\n strip_prefix = \"uds_windows-1.2.1\",\n build_file = Label(\"@crates//crates:BUILD.uds_windows-1.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__unic-langid-0.9.6\",\n sha256 = \"a28ba52c9b05311f4f6e62d5d9d46f094bd6e84cb8df7b3ef952748d752a7d05\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/unic-langid/0.9.6/download\"],\n strip_prefix = \"unic-langid-0.9.6\",\n build_file = Label(\"@crates//crates:BUILD.unic-langid-0.9.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__unic-langid-impl-0.9.6\",\n sha256 = \"dce1bf08044d4b7a94028c93786f8566047edc11110595914de93362559bc658\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/unic-langid-impl/0.9.6/download\"],\n strip_prefix = \"unic-langid-impl-0.9.6\",\n build_file = Label(\"@crates//crates:BUILD.unic-langid-impl-0.9.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__unicase-2.9.0\",\n sha256 = \"dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/unicase/2.9.0/download\"],\n strip_prefix = \"unicase-2.9.0\",\n build_file = Label(\"@crates//crates:BUILD.unicase-2.9.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__unicode-ident-1.0.24\",\n sha256 = \"e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/unicode-ident/1.0.24/download\"],\n strip_prefix = \"unicode-ident-1.0.24\",\n build_file = Label(\"@crates//crates:BUILD.unicode-ident-1.0.24.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__unicode-segmentation-1.13.3\",\n sha256 = \"c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/unicode-segmentation/1.13.3/download\"],\n strip_prefix = \"unicode-segmentation-1.13.3\",\n build_file = Label(\"@crates//crates:BUILD.unicode-segmentation-1.13.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__unicode-width-0.1.14\",\n sha256 = \"7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/unicode-width/0.1.14/download\"],\n strip_prefix = \"unicode-width-0.1.14\",\n build_file = Label(\"@crates//crates:BUILD.unicode-width-0.1.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__unicode-width-0.2.2\",\n sha256 = \"b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/unicode-width/0.2.2/download\"],\n strip_prefix = \"unicode-width-0.2.2\",\n build_file = Label(\"@crates//crates:BUILD.unicode-width-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__unit-prefix-0.5.2\",\n sha256 = \"81e544489bf3d8ef66c953931f56617f423cd4b5494be343d9b9d3dda037b9a3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/unit-prefix/0.5.2/download\"],\n strip_prefix = \"unit-prefix-0.5.2\",\n build_file = Label(\"@crates//crates:BUILD.unit-prefix-0.5.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__universal-hash-0.5.1\",\n sha256 = \"fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/universal-hash/0.5.1/download\"],\n strip_prefix = \"universal-hash-0.5.1\",\n build_file = Label(\"@crates//crates:BUILD.universal-hash-0.5.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__untrusted-0.9.0\",\n sha256 = \"8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/untrusted/0.9.0/download\"],\n strip_prefix = \"untrusted-0.9.0\",\n build_file = Label(\"@crates//crates:BUILD.untrusted-0.9.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__url-2.5.8\",\n sha256 = \"ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/url/2.5.8/download\"],\n strip_prefix = \"url-2.5.8\",\n build_file = Label(\"@crates//crates:BUILD.url-2.5.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__urlencoding-2.1.3\",\n sha256 = \"daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/urlencoding/2.1.3/download\"],\n strip_prefix = \"urlencoding-2.1.3\",\n build_file = Label(\"@crates//crates:BUILD.urlencoding-2.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__utf16_iter-1.0.5\",\n sha256 = \"c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/utf16_iter/1.0.5/download\"],\n strip_prefix = \"utf16_iter-1.0.5\",\n build_file = Label(\"@crates//crates:BUILD.utf16_iter-1.0.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__utf8-chars-3.0.7\",\n sha256 = \"92498c67ea3511b37eccff13b573ed871faf0ce9c4056ab032bd01a681f445a0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/utf8-chars/3.0.7/download\"],\n strip_prefix = \"utf8-chars-3.0.7\",\n build_file = Label(\"@crates//crates:BUILD.utf8-chars-3.0.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__utf8_iter-1.0.4\",\n sha256 = \"b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/utf8_iter/1.0.4/download\"],\n strip_prefix = \"utf8_iter-1.0.4\",\n build_file = Label(\"@crates//crates:BUILD.utf8_iter-1.0.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__utf8parse-0.2.2\",\n sha256 = \"06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/utf8parse/0.2.2/download\"],\n strip_prefix = \"utf8parse-0.2.2\",\n build_file = Label(\"@crates//crates:BUILD.utf8parse-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__uucore-0.0.30\",\n sha256 = \"71f4e82877d06de779c611a3d54720f56f1e68b228fb30a5b6c66ef07e68263d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/uucore/0.0.30/download\"],\n strip_prefix = \"uucore-0.0.30\",\n build_file = Label(\"@crates//crates:BUILD.uucore-0.0.30.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__uucore-0.8.0\",\n sha256 = \"07d779636d827cde4100f0e65ff3fd23b0b1f1195055475c6e6813d425f30c8e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/uucore/0.8.0/download\"],\n strip_prefix = \"uucore-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.uucore-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__uucore-0.9.0\",\n sha256 = \"069b34217c27f611e1589f540f58118dbf226a9e407d38ab472052ff075a1dc2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/uucore/0.9.0/download\"],\n strip_prefix = \"uucore-0.9.0\",\n build_file = Label(\"@crates//crates:BUILD.uucore-0.9.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__uucore_procs-0.0.30\",\n sha256 = \"c72435859e812e602e225dea48d014abb6b1072220a8d44f2fe0565553b1f7e4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/uucore_procs/0.0.30/download\"],\n strip_prefix = \"uucore_procs-0.0.30\",\n build_file = Label(\"@crates//crates:BUILD.uucore_procs-0.0.30.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__uucore_procs-0.8.0\",\n sha256 = \"da865e8a648b260dbd89fca76d0801995877ab27a4e259b6dec30ba9743b86ab\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/uucore_procs/0.8.0/download\"],\n strip_prefix = \"uucore_procs-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.uucore_procs-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__uucore_procs-0.9.0\",\n sha256 = \"34337da211e7abfff7189b794afb3b5018fe356fb36474b73645458fc1201350\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/uucore_procs/0.9.0/download\"],\n strip_prefix = \"uucore_procs-0.9.0\",\n build_file = Label(\"@crates//crates:BUILD.uucore_procs-0.9.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__uuhelp_parser-0.0.30\",\n sha256 = \"0bb6d972f580f8223cb7052d8580aea2b7061e368cf476de32ea9457b19459ed\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/uuhelp_parser/0.0.30/download\"],\n strip_prefix = \"uuhelp_parser-0.0.30\",\n build_file = Label(\"@crates//crates:BUILD.uuhelp_parser-0.0.30.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__uuid-1.24.0\",\n sha256 = \"bf3923a6f5c4c6382e0b653c4117f48d631ea17f38ed86e2a828e6f7412f5239\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/uuid/1.24.0/download\"],\n strip_prefix = \"uuid-1.24.0\",\n build_file = Label(\"@crates//crates:BUILD.uuid-1.24.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__uutils_term_grid-0.8.0\",\n sha256 = \"382d49b39de4a115f203305057741126b09a615892d773a2d419a2b816e30e39\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/uutils_term_grid/0.8.0/download\"],\n strip_prefix = \"uutils_term_grid-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.uutils_term_grid-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__uzers-0.12.2\",\n sha256 = \"0b8275fb1afee25b4111d2dc8b5c505dbbc4afd0b990cb96deb2d88bff8be18d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/uzers/0.12.2/download\"],\n strip_prefix = \"uzers-0.12.2\",\n build_file = Label(\"@crates//crates:BUILD.uzers-0.12.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__version-compare-0.2.1\",\n sha256 = \"03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/version-compare/0.2.1/download\"],\n strip_prefix = \"version-compare-0.2.1\",\n build_file = Label(\"@crates//crates:BUILD.version-compare-0.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__version_check-0.9.5\",\n sha256 = \"0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/version_check/0.9.5/download\"],\n strip_prefix = \"version_check-0.9.5\",\n build_file = Label(\"@crates//crates:BUILD.version_check-0.9.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__vsimd-0.8.0\",\n sha256 = \"5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/vsimd/0.8.0/download\"],\n strip_prefix = \"vsimd-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.vsimd-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__waitgroup-0.1.2\",\n sha256 = \"d1f50000a783467e6c0200f9d10642f4bc424e39efc1b770203e88b488f79292\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/waitgroup/0.1.2/download\"],\n strip_prefix = \"waitgroup-0.1.2\",\n build_file = Label(\"@crates//crates:BUILD.waitgroup-0.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__walkdir-2.5.0\",\n sha256 = \"29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/walkdir/2.5.0/download\"],\n strip_prefix = \"walkdir-2.5.0\",\n build_file = Label(\"@crates//crates:BUILD.walkdir-2.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasi-0.11.1-wasi-snapshot-preview1\",\n sha256 = \"ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasi/0.11.1+wasi-snapshot-preview1/download\"],\n strip_prefix = \"wasi-0.11.1+wasi-snapshot-preview1\",\n build_file = Label(\"@crates//crates:BUILD.wasi-0.11.1+wasi-snapshot-preview1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasi-0.14.7-wasi-0.2.4\",\n sha256 = \"883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasi/0.14.7+wasi-0.2.4/download\"],\n strip_prefix = \"wasi-0.14.7+wasi-0.2.4\",\n build_file = Label(\"@crates//crates:BUILD.wasi-0.14.7+wasi-0.2.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasip2-1.0.4-wasi-0.2.12\",\n sha256 = \"b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasip2/1.0.4+wasi-0.2.12/download\"],\n strip_prefix = \"wasip2-1.0.4+wasi-0.2.12\",\n build_file = Label(\"@crates//crates:BUILD.wasip2-1.0.4+wasi-0.2.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasite-1.0.2\",\n sha256 = \"66fe902b4a6b8028a753d5424909b764ccf79b7a209eac9bf97e59cda9f71a42\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasite/1.0.2/download\"],\n strip_prefix = \"wasite-1.0.2\",\n build_file = Label(\"@crates//crates:BUILD.wasite-1.0.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-0.2.126\",\n sha256 = \"4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen/0.2.126/download\"],\n strip_prefix = \"wasm-bindgen-0.2.126\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-0.2.126.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-macro-0.2.126\",\n sha256 = \"167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen-macro/0.2.126/download\"],\n strip_prefix = \"wasm-bindgen-macro-0.2.126\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-macro-0.2.126.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-macro-support-0.2.126\",\n sha256 = \"f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen-macro-support/0.2.126/download\"],\n strip_prefix = \"wasm-bindgen-macro-support-0.2.126\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-macro-support-0.2.126.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-shared-0.2.126\",\n sha256 = \"dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen-shared/0.2.126/download\"],\n strip_prefix = \"wasm-bindgen-shared-0.2.126\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-shared-0.2.126.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wayland-backend-0.3.16\",\n sha256 = \"016ccf01d1c58b6f8999612813e17c9b2390f7d70671428869913310f83f54b8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wayland-backend/0.3.16/download\"],\n strip_prefix = \"wayland-backend-0.3.16\",\n build_file = Label(\"@crates//crates:BUILD.wayland-backend-0.3.16.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wayland-client-0.31.15\",\n sha256 = \"e3c36a0f861ad76d0901f2800b46321410d9f73f2ea88aac0650d86c32688073\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wayland-client/0.31.15/download\"],\n strip_prefix = \"wayland-client-0.31.15\",\n build_file = Label(\"@crates//crates:BUILD.wayland-client-0.31.15.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wayland-protocols-0.32.13\",\n sha256 = \"23d0c813de3daa2ed6520af85a3bd49b0e722a3078506899aa9686fea58dc4b6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wayland-protocols/0.32.13/download\"],\n strip_prefix = \"wayland-protocols-0.32.13\",\n build_file = Label(\"@crates//crates:BUILD.wayland-protocols-0.32.13.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wayland-protocols-wlr-0.3.12\",\n sha256 = \"eb04e52f7836d7c7976c78ca0250d61e33873c34156a2a1fc9474828ec268234\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wayland-protocols-wlr/0.3.12/download\"],\n strip_prefix = \"wayland-protocols-wlr-0.3.12\",\n build_file = Label(\"@crates//crates:BUILD.wayland-protocols-wlr-0.3.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wayland-scanner-0.31.11\",\n sha256 = \"338e30461b3a2b67d70eb30a6d89f8e0c93a833e07d2ae89085cd070c4a00ac0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wayland-scanner/0.31.11/download\"],\n strip_prefix = \"wayland-scanner-0.31.11\",\n build_file = Label(\"@crates//crates:BUILD.wayland-scanner-0.31.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wayland-server-0.31.14\",\n sha256 = \"0dde9c29be0f723a573977de51ee455bf3dfa03652730a74f9dd3b337e374d75\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wayland-server/0.31.14/download\"],\n strip_prefix = \"wayland-server-0.31.14\",\n build_file = Label(\"@crates//crates:BUILD.wayland-server-0.31.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wayland-sys-0.31.11\",\n sha256 = \"d8eab23fefc9e41f8e841df4a9c707e8a8c4ed26e944ef69297184de2785e3be\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wayland-sys/0.31.11/download\"],\n strip_prefix = \"wayland-sys-0.31.11\",\n build_file = Label(\"@crates//crates:BUILD.wayland-sys-0.31.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__web-sys-0.3.103\",\n sha256 = \"8622dcb61c0bcc9fffa6938bed81210af2da9a7e4a1a834b2e37a59b6dfb6141\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/web-sys/0.3.103/download\"],\n strip_prefix = \"web-sys-0.3.103\",\n build_file = Label(\"@crates//crates:BUILD.web-sys-0.3.103.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__web-time-1.1.0\",\n sha256 = \"5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/web-time/1.1.0/download\"],\n strip_prefix = \"web-time-1.1.0\",\n build_file = Label(\"@crates//crates:BUILD.web-time-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__web_atoms-0.2.5\",\n sha256 = \"075474b12bcb3d2e3d4546580e9de478eeeead668a1761e2a8860c836b7ef297\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/web_atoms/0.2.5/download\"],\n strip_prefix = \"web_atoms-0.2.5\",\n build_file = Label(\"@crates//crates:BUILD.web_atoms-0.2.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__webrtc-0.17.2\",\n sha256 = \"baaacdf9d96224d7b6e2872ba065578f38775f7634367e3ac2cc87c7271da433\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/webrtc/0.17.2/download\"],\n strip_prefix = \"webrtc-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.webrtc-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__webrtc-data-0.17.2\",\n sha256 = \"bd470286275809f2fcfcdb1e73ef5f1500be82eff7fe98150ce81b20aad5a2a4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/webrtc-data/0.17.2/download\"],\n strip_prefix = \"webrtc-data-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.webrtc-data-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__webrtc-ice-0.17.2\",\n sha256 = \"5b7fd30f52e6fda8664779b84b7904b2553b76fee24d9ca665e774ae32b13f53\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/webrtc-ice/0.17.2/download\"],\n strip_prefix = \"webrtc-ice-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.webrtc-ice-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__webrtc-mdns-0.17.2\",\n sha256 = \"91ffa0ea00c0fae979aafa5db285fec5eeb360e1ea246ebec529ba4e09f8e03e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/webrtc-mdns/0.17.2/download\"],\n strip_prefix = \"webrtc-mdns-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.webrtc-mdns-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__webrtc-media-0.17.2\",\n sha256 = \"26a6c7335bdd03dc023cb9a3bd7966866d969c92c86987b73aa16dfa39c7ca29\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/webrtc-media/0.17.2/download\"],\n strip_prefix = \"webrtc-media-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.webrtc-media-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__webrtc-sctp-0.17.2\",\n sha256 = \"1c4b637f0d8eb96d900ac0f79b3060ddd21ca88dfefa467e96e67ab0016f2574\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/webrtc-sctp/0.17.2/download\"],\n strip_prefix = \"webrtc-sctp-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.webrtc-sctp-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__webrtc-srtp-0.17.2\",\n sha256 = \"45d2b667a0b5d04eebcb7cb22fd51b2af3721f418097b496e72de16386c8d0c3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/webrtc-srtp/0.17.2/download\"],\n strip_prefix = \"webrtc-srtp-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.webrtc-srtp-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__webrtc-util-0.17.2\",\n sha256 = \"1beae0b4f24969741c26ca282a257dc5823bd9cbe608f7e3ca3775102d323ad9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/webrtc-util/0.17.2/download\"],\n strip_prefix = \"webrtc-util-0.17.2\",\n build_file = Label(\"@crates//crates:BUILD.webrtc-util-0.17.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__weezl-0.1.12\",\n sha256 = \"a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/weezl/0.1.12/download\"],\n strip_prefix = \"weezl-0.1.12\",\n build_file = Label(\"@crates//crates:BUILD.weezl-0.1.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__whoami-2.1.2\",\n sha256 = \"998767ef88740d1f5b0682a9c53c24431453923962269c2db68ee43788c5a40d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/whoami/2.1.2/download\"],\n strip_prefix = \"whoami-2.1.2\",\n build_file = Label(\"@crates//crates:BUILD.whoami-2.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wide-0.8.3\",\n sha256 = \"13ca908d26e4786149c48efcf6c0ea09ab0e06d1fe3c17dc1b4b0f1ca4a7e788\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wide/0.8.3/download\"],\n strip_prefix = \"wide-0.8.3\",\n build_file = Label(\"@crates//crates:BUILD.wide-0.8.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__widestring-1.2.1\",\n sha256 = \"72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/widestring/1.2.1/download\"],\n strip_prefix = \"widestring-1.2.1\",\n build_file = Label(\"@crates//crates:BUILD.widestring-1.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wild-2.2.1\",\n sha256 = \"a3131afc8c575281e1e80f36ed6a092aa502c08b18ed7524e86fbbb12bb410e1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wild/2.2.1/download\"],\n strip_prefix = \"wild-2.2.1\",\n build_file = Label(\"@crates//crates:BUILD.wild-2.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__winapi-0.3.9\",\n sha256 = \"5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/winapi/0.3.9/download\"],\n strip_prefix = \"winapi-0.3.9\",\n build_file = Label(\"@crates//crates:BUILD.winapi-0.3.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__winapi-i686-pc-windows-gnu-0.4.0\",\n sha256 = \"ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/winapi-i686-pc-windows-gnu/0.4.0/download\"],\n strip_prefix = \"winapi-i686-pc-windows-gnu-0.4.0\",\n build_file = Label(\"@crates//crates:BUILD.winapi-i686-pc-windows-gnu-0.4.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__winapi-util-0.1.11\",\n sha256 = \"c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/winapi-util/0.1.11/download\"],\n strip_prefix = \"winapi-util-0.1.11\",\n build_file = Label(\"@crates//crates:BUILD.winapi-util-0.1.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__winapi-x86_64-pc-windows-gnu-0.4.0\",\n sha256 = \"712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/winapi-x86_64-pc-windows-gnu/0.4.0/download\"],\n strip_prefix = \"winapi-x86_64-pc-windows-gnu-0.4.0\",\n build_file = Label(\"@crates//crates:BUILD.winapi-x86_64-pc-windows-gnu-0.4.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-0.51.1\",\n sha256 = \"ca229916c5ee38c2f2bc1e9d8f04df975b4bd93f9955dc69fabb5d91270045c9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows/0.51.1/download\"],\n strip_prefix = \"windows-0.51.1\",\n build_file = Label(\"@crates//crates:BUILD.windows-0.51.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-0.61.3\",\n sha256 = \"9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows/0.61.3/download\"],\n strip_prefix = \"windows-0.61.3\",\n build_file = Label(\"@crates//crates:BUILD.windows-0.61.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-0.62.2\",\n sha256 = \"527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows/0.62.2/download\"],\n strip_prefix = \"windows-0.62.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-0.62.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-collections-0.2.0\",\n sha256 = \"3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-collections/0.2.0/download\"],\n strip_prefix = \"windows-collections-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.windows-collections-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-collections-0.3.2\",\n sha256 = \"23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-collections/0.3.2/download\"],\n strip_prefix = \"windows-collections-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-collections-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-core-0.51.1\",\n sha256 = \"f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-core/0.51.1/download\"],\n strip_prefix = \"windows-core-0.51.1\",\n build_file = Label(\"@crates//crates:BUILD.windows-core-0.51.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-core-0.61.2\",\n sha256 = \"c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-core/0.61.2/download\"],\n strip_prefix = \"windows-core-0.61.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-core-0.61.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-core-0.62.2\",\n sha256 = \"b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-core/0.62.2/download\"],\n strip_prefix = \"windows-core-0.62.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-core-0.62.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-future-0.2.1\",\n sha256 = \"fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-future/0.2.1/download\"],\n strip_prefix = \"windows-future-0.2.1\",\n build_file = Label(\"@crates//crates:BUILD.windows-future-0.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-future-0.3.2\",\n sha256 = \"e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-future/0.3.2/download\"],\n strip_prefix = \"windows-future-0.3.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-future-0.3.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-implement-0.60.2\",\n sha256 = \"053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-implement/0.60.2/download\"],\n strip_prefix = \"windows-implement-0.60.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-implement-0.60.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-interface-0.59.3\",\n sha256 = \"3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-interface/0.59.3/download\"],\n strip_prefix = \"windows-interface-0.59.3\",\n build_file = Label(\"@crates//crates:BUILD.windows-interface-0.59.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-link-0.1.3\",\n sha256 = \"5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-link/0.1.3/download\"],\n strip_prefix = \"windows-link-0.1.3\",\n build_file = Label(\"@crates//crates:BUILD.windows-link-0.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-link-0.2.1\",\n sha256 = \"f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-link/0.2.1/download\"],\n strip_prefix = \"windows-link-0.2.1\",\n build_file = Label(\"@crates//crates:BUILD.windows-link-0.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-numerics-0.2.0\",\n sha256 = \"9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-numerics/0.2.0/download\"],\n strip_prefix = \"windows-numerics-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.windows-numerics-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-numerics-0.3.1\",\n sha256 = \"6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-numerics/0.3.1/download\"],\n strip_prefix = \"windows-numerics-0.3.1\",\n build_file = Label(\"@crates//crates:BUILD.windows-numerics-0.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-result-0.3.4\",\n sha256 = \"56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-result/0.3.4/download\"],\n strip_prefix = \"windows-result-0.3.4\",\n build_file = Label(\"@crates//crates:BUILD.windows-result-0.3.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-result-0.4.1\",\n sha256 = \"7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-result/0.4.1/download\"],\n strip_prefix = \"windows-result-0.4.1\",\n build_file = Label(\"@crates//crates:BUILD.windows-result-0.4.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-strings-0.4.2\",\n sha256 = \"56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-strings/0.4.2/download\"],\n strip_prefix = \"windows-strings-0.4.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-strings-0.4.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-strings-0.5.1\",\n sha256 = \"7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-strings/0.5.1/download\"],\n strip_prefix = \"windows-strings-0.5.1\",\n build_file = Label(\"@crates//crates:BUILD.windows-strings-0.5.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-sys-0.52.0\",\n sha256 = \"282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-sys/0.52.0/download\"],\n strip_prefix = \"windows-sys-0.52.0\",\n build_file = Label(\"@crates//crates:BUILD.windows-sys-0.52.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-sys-0.59.0\",\n sha256 = \"1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-sys/0.59.0/download\"],\n strip_prefix = \"windows-sys-0.59.0\",\n build_file = Label(\"@crates//crates:BUILD.windows-sys-0.59.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-sys-0.60.2\",\n sha256 = \"f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-sys/0.60.2/download\"],\n strip_prefix = \"windows-sys-0.60.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-sys-0.60.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-sys-0.61.2\",\n sha256 = \"ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-sys/0.61.2/download\"],\n strip_prefix = \"windows-sys-0.61.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-sys-0.61.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-targets-0.48.5\",\n sha256 = \"9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-targets/0.48.5/download\"],\n strip_prefix = \"windows-targets-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows-targets-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-targets-0.52.6\",\n sha256 = \"9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-targets/0.52.6/download\"],\n strip_prefix = \"windows-targets-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows-targets-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-targets-0.53.5\",\n sha256 = \"4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-targets/0.53.5/download\"],\n strip_prefix = \"windows-targets-0.53.5\",\n build_file = Label(\"@crates//crates:BUILD.windows-targets-0.53.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-threading-0.1.0\",\n sha256 = \"b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-threading/0.1.0/download\"],\n strip_prefix = \"windows-threading-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.windows-threading-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-threading-0.2.1\",\n sha256 = \"3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-threading/0.2.1/download\"],\n strip_prefix = \"windows-threading-0.2.1\",\n build_file = Label(\"@crates//crates:BUILD.windows-threading-0.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_gnullvm-0.48.5\",\n sha256 = \"2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_gnullvm/0.48.5/download\"],\n strip_prefix = \"windows_aarch64_gnullvm-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_gnullvm-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_gnullvm-0.52.6\",\n sha256 = \"32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_gnullvm/0.52.6/download\"],\n strip_prefix = \"windows_aarch64_gnullvm-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_gnullvm-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_gnullvm-0.53.1\",\n sha256 = \"a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_gnullvm/0.53.1/download\"],\n strip_prefix = \"windows_aarch64_gnullvm-0.53.1\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_gnullvm-0.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_msvc-0.48.5\",\n sha256 = \"dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_msvc/0.48.5/download\"],\n strip_prefix = \"windows_aarch64_msvc-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_msvc-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_msvc-0.52.6\",\n sha256 = \"09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_msvc/0.52.6/download\"],\n strip_prefix = \"windows_aarch64_msvc-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_msvc-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_msvc-0.53.1\",\n sha256 = \"b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_msvc/0.53.1/download\"],\n strip_prefix = \"windows_aarch64_msvc-0.53.1\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_msvc-0.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnu-0.48.5\",\n sha256 = \"a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnu/0.48.5/download\"],\n strip_prefix = \"windows_i686_gnu-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnu-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnu-0.52.6\",\n sha256 = \"8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnu/0.52.6/download\"],\n strip_prefix = \"windows_i686_gnu-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnu-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnu-0.53.1\",\n sha256 = \"960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnu/0.53.1/download\"],\n strip_prefix = \"windows_i686_gnu-0.53.1\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnu-0.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnullvm-0.52.6\",\n sha256 = \"0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnullvm/0.52.6/download\"],\n strip_prefix = \"windows_i686_gnullvm-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnullvm-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnullvm-0.53.1\",\n sha256 = \"fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnullvm/0.53.1/download\"],\n strip_prefix = \"windows_i686_gnullvm-0.53.1\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnullvm-0.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_msvc-0.48.5\",\n sha256 = \"8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_msvc/0.48.5/download\"],\n strip_prefix = \"windows_i686_msvc-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_msvc-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_msvc-0.52.6\",\n sha256 = \"240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_msvc/0.52.6/download\"],\n strip_prefix = \"windows_i686_msvc-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_msvc-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_msvc-0.53.1\",\n sha256 = \"1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_msvc/0.53.1/download\"],\n strip_prefix = \"windows_i686_msvc-0.53.1\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_msvc-0.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnu-0.48.5\",\n sha256 = \"53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnu/0.48.5/download\"],\n strip_prefix = \"windows_x86_64_gnu-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnu-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnu-0.52.6\",\n sha256 = \"147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnu/0.52.6/download\"],\n strip_prefix = \"windows_x86_64_gnu-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnu-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnu-0.53.1\",\n sha256 = \"9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnu/0.53.1/download\"],\n strip_prefix = \"windows_x86_64_gnu-0.53.1\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnu-0.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnullvm-0.48.5\",\n sha256 = \"0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnullvm/0.48.5/download\"],\n strip_prefix = \"windows_x86_64_gnullvm-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnullvm-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnullvm-0.52.6\",\n sha256 = \"24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnullvm/0.52.6/download\"],\n strip_prefix = \"windows_x86_64_gnullvm-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnullvm-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnullvm-0.53.1\",\n sha256 = \"0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnullvm/0.53.1/download\"],\n strip_prefix = \"windows_x86_64_gnullvm-0.53.1\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnullvm-0.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_msvc-0.48.5\",\n sha256 = \"ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_msvc/0.48.5/download\"],\n strip_prefix = \"windows_x86_64_msvc-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_msvc-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_msvc-0.52.6\",\n sha256 = \"589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_msvc/0.52.6/download\"],\n strip_prefix = \"windows_x86_64_msvc-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_msvc-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_msvc-0.53.1\",\n sha256 = \"d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_msvc/0.53.1/download\"],\n strip_prefix = \"windows_x86_64_msvc-0.53.1\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_msvc-0.53.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__winnow-0.7.15\",\n sha256 = \"df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/winnow/0.7.15/download\"],\n strip_prefix = \"winnow-0.7.15\",\n build_file = Label(\"@crates//crates:BUILD.winnow-0.7.15.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__winnow-1.0.4\",\n sha256 = \"23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/winnow/1.0.4/download\"],\n strip_prefix = \"winnow-1.0.4\",\n build_file = Label(\"@crates//crates:BUILD.winnow-1.0.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__winreg-0.10.1\",\n sha256 = \"80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/winreg/0.10.1/download\"],\n strip_prefix = \"winreg-0.10.1\",\n build_file = Label(\"@crates//crates:BUILD.winreg-0.10.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__winreg-0.56.0\",\n sha256 = \"7d6f32a0ff4a9f6f01231eb2059cc85479330739333e0e58cadf03b6af2cca10\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/winreg/0.56.0/download\"],\n strip_prefix = \"winreg-0.56.0\",\n build_file = Label(\"@crates//crates:BUILD.winreg-0.56.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wit-bindgen-0.57.1\",\n sha256 = \"1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wit-bindgen/0.57.1/download\"],\n strip_prefix = \"wit-bindgen-0.57.1\",\n build_file = Label(\"@crates//crates:BUILD.wit-bindgen-0.57.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wl-clipboard-rs-0.9.3\",\n sha256 = \"e9651471a32e87d96ef3a127715382b2d11cc7c8bb9822ded8a7cc94072eb0a3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wl-clipboard-rs/0.9.3/download\"],\n strip_prefix = \"wl-clipboard-rs-0.9.3\",\n build_file = Label(\"@crates//crates:BUILD.wl-clipboard-rs-0.9.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__write16-1.0.0\",\n sha256 = \"d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/write16/1.0.0/download\"],\n strip_prefix = \"write16-1.0.0\",\n build_file = Label(\"@crates//crates:BUILD.write16-1.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__writeable-0.6.3\",\n sha256 = \"1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/writeable/0.6.3/download\"],\n strip_prefix = \"writeable-0.6.3\",\n build_file = Label(\"@crates//crates:BUILD.writeable-0.6.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wyz-0.5.1\",\n sha256 = \"05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wyz/0.5.1/download\"],\n strip_prefix = \"wyz-0.5.1\",\n build_file = Label(\"@crates//crates:BUILD.wyz-0.5.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__x11rb-0.13.2\",\n sha256 = \"9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/x11rb/0.13.2/download\"],\n strip_prefix = \"x11rb-0.13.2\",\n build_file = Label(\"@crates//crates:BUILD.x11rb-0.13.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__x11rb-protocol-0.13.2\",\n sha256 = \"ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/x11rb-protocol/0.13.2/download\"],\n strip_prefix = \"x11rb-protocol-0.13.2\",\n build_file = Label(\"@crates//crates:BUILD.x11rb-protocol-0.13.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__x25519-dalek-2.0.1\",\n sha256 = \"c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/x25519-dalek/2.0.1/download\"],\n strip_prefix = \"x25519-dalek-2.0.1\",\n build_file = Label(\"@crates//crates:BUILD.x25519-dalek-2.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__x509-parser-0.16.0\",\n sha256 = \"fcbc162f30700d6f3f82a24bf7cc62ffe7caea42c0b2cba8bf7f3ae50cf51f69\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/x509-parser/0.16.0/download\"],\n strip_prefix = \"x509-parser-0.16.0\",\n build_file = Label(\"@crates//crates:BUILD.x509-parser-0.16.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__xattr-1.6.1\",\n sha256 = \"32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/xattr/1.6.1/download\"],\n strip_prefix = \"xattr-1.6.1\",\n build_file = Label(\"@crates//crates:BUILD.xattr-1.6.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__xcap-0.9.6\",\n sha256 = \"b6ad471d5ba232bc276382d26a9d3b837d6853b7df389058b5bb1e94dcdd248c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/xcap/0.9.6/download\"],\n strip_prefix = \"xcap-0.9.6\",\n build_file = Label(\"@crates//crates:BUILD.xcap-0.9.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__xcb-1.7.0\",\n sha256 = \"ee4c580d8205abb0a5cf4eb7e927bd664e425b6c3263f9c5310583da96970cf6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/xcb/1.7.0/download\"],\n strip_prefix = \"xcb-1.7.0\",\n build_file = Label(\"@crates//crates:BUILD.xcb-1.7.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__xkbcommon-0.9.0\",\n sha256 = \"a7a974f48060a14e95705c01f24ad9c3345022f4d97441b8a36beb7ed5c4a02d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/xkbcommon/0.9.0/download\"],\n strip_prefix = \"xkbcommon-0.9.0\",\n build_file = Label(\"@crates//crates:BUILD.xkbcommon-0.9.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__xkeysym-0.2.1\",\n sha256 = \"b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/xkeysym/0.2.1/download\"],\n strip_prefix = \"xkeysym-0.2.1\",\n build_file = Label(\"@crates//crates:BUILD.xkeysym-0.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__xml-rs-0.8.28\",\n sha256 = \"3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5fb912d3f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/xml-rs/0.8.28/download\"],\n strip_prefix = \"xml-rs-0.8.28\",\n build_file = Label(\"@crates//crates:BUILD.xml-rs-0.8.28.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__xxhash-rust-0.8.18\",\n sha256 = \"aee1b19627c7c60102ab80d3a9cbe18de90bfe03bfa6c3715447681f0e8c8af6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/xxhash-rust/0.8.18/download\"],\n strip_prefix = \"xxhash-rust-0.8.18\",\n build_file = Label(\"@crates//crates:BUILD.xxhash-rust-0.8.18.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__yaml-rust-0.4.5\",\n sha256 = \"56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/yaml-rust/0.4.5/download\"],\n strip_prefix = \"yaml-rust-0.4.5\",\n build_file = Label(\"@crates//crates:BUILD.yaml-rust-0.4.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__yansi-1.0.1\",\n sha256 = \"cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/yansi/1.0.1/download\"],\n strip_prefix = \"yansi-1.0.1\",\n build_file = Label(\"@crates//crates:BUILD.yansi-1.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__yasna-0.5.2\",\n sha256 = \"e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/yasna/0.5.2/download\"],\n strip_prefix = \"yasna-0.5.2\",\n build_file = Label(\"@crates//crates:BUILD.yasna-0.5.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__yoke-0.8.3\",\n sha256 = \"709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/yoke/0.8.3/download\"],\n strip_prefix = \"yoke-0.8.3\",\n build_file = Label(\"@crates//crates:BUILD.yoke-0.8.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__yoke-derive-0.8.2\",\n sha256 = \"de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/yoke-derive/0.8.2/download\"],\n strip_prefix = \"yoke-derive-0.8.2\",\n build_file = Label(\"@crates//crates:BUILD.yoke-derive-0.8.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__z85-3.0.7\",\n sha256 = \"c6e61e59a957b7ccee15d2049f86e8bfd6f66968fcd88f018950662d9b86e675\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/z85/3.0.7/download\"],\n strip_prefix = \"z85-3.0.7\",\n build_file = Label(\"@crates//crates:BUILD.z85-3.0.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zbus-5.18.0\",\n sha256 = \"fe18fb60dc696039e738717b76eaea21e7a4489bbb1885020b43c94236d7e98a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zbus/5.18.0/download\"],\n strip_prefix = \"zbus-5.18.0\",\n build_file = Label(\"@crates//crates:BUILD.zbus-5.18.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zbus_macros-5.18.0\",\n sha256 = \"fe96480bed92df2b442a1a30df364e12d08eed03aeb061f2b8dc6afb2be91119\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zbus_macros/5.18.0/download\"],\n strip_prefix = \"zbus_macros-5.18.0\",\n build_file = Label(\"@crates//crates:BUILD.zbus_macros-5.18.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zbus_names-4.3.4\",\n sha256 = \"d8bf88b4a3ff53e883001e0e0115b297a9d53c31b9c1edd2bfdd853e3428624e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zbus_names/4.3.4/download\"],\n strip_prefix = \"zbus_names-4.3.4\",\n build_file = Label(\"@crates//crates:BUILD.zbus_names-4.3.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerocopy-0.8.55\",\n sha256 = \"b5a105cd7b140f6eeec8acff2ea38135d3cab283ada58540f629fe51e46696eb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerocopy/0.8.55/download\"],\n strip_prefix = \"zerocopy-0.8.55\",\n build_file = Label(\"@crates//crates:BUILD.zerocopy-0.8.55.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerocopy-derive-0.8.55\",\n sha256 = \"0fe976fb70c78cd64cccfe3a6fc142244e8a77b70959b30faf9d0ac37ee228eb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerocopy-derive/0.8.55/download\"],\n strip_prefix = \"zerocopy-derive-0.8.55\",\n build_file = Label(\"@crates//crates:BUILD.zerocopy-derive-0.8.55.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerofrom-0.1.8\",\n sha256 = \"0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerofrom/0.1.8/download\"],\n strip_prefix = \"zerofrom-0.1.8\",\n build_file = Label(\"@crates//crates:BUILD.zerofrom-0.1.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerofrom-derive-0.1.7\",\n sha256 = \"11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerofrom-derive/0.1.7/download\"],\n strip_prefix = \"zerofrom-derive-0.1.7\",\n build_file = Label(\"@crates//crates:BUILD.zerofrom-derive-0.1.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zeroize-1.9.0\",\n sha256 = \"e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zeroize/1.9.0/download\"],\n strip_prefix = \"zeroize-1.9.0\",\n build_file = Label(\"@crates//crates:BUILD.zeroize-1.9.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zeroize_derive-1.5.0\",\n sha256 = \"3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zeroize_derive/1.5.0/download\"],\n strip_prefix = \"zeroize_derive-1.5.0\",\n build_file = Label(\"@crates//crates:BUILD.zeroize_derive-1.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerotrie-0.2.4\",\n sha256 = \"0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerotrie/0.2.4/download\"],\n strip_prefix = \"zerotrie-0.2.4\",\n build_file = Label(\"@crates//crates:BUILD.zerotrie-0.2.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerovec-0.11.6\",\n sha256 = \"90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerovec/0.11.6/download\"],\n strip_prefix = \"zerovec-0.11.6\",\n build_file = Label(\"@crates//crates:BUILD.zerovec-0.11.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerovec-derive-0.11.3\",\n sha256 = \"625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerovec-derive/0.11.3/download\"],\n strip_prefix = \"zerovec-derive-0.11.3\",\n build_file = Label(\"@crates//crates:BUILD.zerovec-derive-0.11.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zmij-1.0.23\",\n sha256 = \"29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zmij/1.0.23/download\"],\n strip_prefix = \"zmij-1.0.23\",\n build_file = Label(\"@crates//crates:BUILD.zmij-1.0.23.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zune-core-0.5.1\",\n sha256 = \"cb8a0807f7c01457d0379ba880ba6322660448ddebc890ce29bb64da71fb40f9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zune-core/0.5.1/download\"],\n strip_prefix = \"zune-core-0.5.1\",\n build_file = Label(\"@crates//crates:BUILD.zune-core-0.5.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zune-jpeg-0.5.15\",\n sha256 = \"27bc9d5b815bc103f142aa054f561d9187d191692ec7c2d1e2b4737f8dbd7296\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zune-jpeg/0.5.15/download\"],\n strip_prefix = \"zune-jpeg-0.5.15\",\n build_file = Label(\"@crates//crates:BUILD.zune-jpeg-0.5.15.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zvariant-5.13.1\",\n sha256 = \"bee2a0bcd2a907786a456fff45aaaaf54c9ba5f50b71ae9ec1a4edd200c94911\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zvariant/5.13.1/download\"],\n strip_prefix = \"zvariant-5.13.1\",\n build_file = Label(\"@crates//crates:BUILD.zvariant-5.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zvariant_derive-5.13.1\",\n sha256 = \"38a708216a18780796770bfe3f4739c7c83a3e8f789b755534bbbc06e4e23e12\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zvariant_derive/5.13.1/download\"],\n strip_prefix = \"zvariant_derive-5.13.1\",\n build_file = Label(\"@crates//crates:BUILD.zvariant_derive-5.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zvariant_utils-3.5.0\",\n sha256 = \"90cb9383f9b45290407a1258b202d3f8f01db719eb60b4e4055c6375af4fc7c7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zvariant_utils/3.5.0/download\"],\n strip_prefix = \"zvariant_utils-3.5.0\",\n build_file = Label(\"@crates//crates:BUILD.zvariant_utils-3.5.0.bazel\"),\n )\n\n return [\n struct(repo = \"crates\", is_dev_dep = False),\n struct(repo=\"crates__ansi-width-0.1.0\", is_dev_dep = False),\n struct(repo=\"crates__anyhow-1.0.104\", is_dev_dep = False),\n struct(repo=\"crates__arboard-3.6.1\", is_dev_dep = False),\n struct(repo=\"crates__argmax-0.3.1\", is_dev_dep = False),\n struct(repo=\"crates__ast-grep-core-0.39.9\", is_dev_dep = False),\n struct(repo=\"crates__async-recursion-1.1.1\", is_dev_dep = False),\n struct(repo=\"crates__async-trait-0.1.91\", is_dev_dep = False),\n struct(repo=\"crates__audiopus_sys-0.2.2\", is_dev_dep = False),\n struct(repo=\"crates__base64-0.22.1\", is_dev_dep = False),\n struct(repo=\"crates__base64-simd-0.8.0\", is_dev_dep = False),\n struct(repo=\"crates__bigdecimal-0.4.10\", is_dev_dep = False),\n struct(repo=\"crates__binary-heap-plus-0.5.0\", is_dev_dep = False),\n struct(repo=\"crates__bon-3.9.3\", is_dev_dep = False),\n struct(repo=\"crates__brush-parser-0.3.0\", is_dev_dep = False),\n struct(repo=\"crates__brush-parser-0.4.0\", is_dev_dep = False),\n struct(repo=\"crates__bstr-1.13.0\", is_dev_dep = False),\n struct(repo=\"crates__bytecount-0.6.9\", is_dev_dep = False),\n struct(repo=\"crates__bytes-1.12.1\", is_dev_dep = False),\n struct(repo=\"crates__cached-0.59.0\", is_dev_dep = False),\n struct(repo=\"crates__cfg-if-1.0.4\", is_dev_dep = False),\n struct(repo=\"crates__check_elevation-0.2.7\", is_dev_dep = False),\n struct(repo=\"crates__chrono-0.4.45\", is_dev_dep = False),\n struct(repo=\"crates__clap-4.6.4\", is_dev_dep = False),\n struct(repo=\"crates__clipboard-win-5.4.1\", is_dev_dep = False),\n struct(repo=\"crates__codesnake-0.2.1\", is_dev_dep = False),\n struct(repo=\"crates__color-print-0.3.7\", is_dev_dep = False),\n struct(repo=\"crates__command-fds-0.3.3\", is_dev_dep = False),\n struct(repo=\"crates__compare-0.1.0\", is_dev_dep = False),\n struct(repo=\"crates__core-graphics-0.25.0\", is_dev_dep = False),\n struct(repo=\"crates__dashmap-6.2.1\", is_dev_dep = False),\n struct(repo=\"crates__dns-lookup-3.0.1\", is_dev_dep = False),\n struct(repo=\"crates__enigo-0.6.1\", is_dev_dep = False),\n struct(repo=\"crates__faccess-0.2.4\", is_dev_dep = False),\n struct(repo=\"crates__fancy-regex-0.17.0\", is_dev_dep = False),\n struct(repo=\"crates__fancy-regex-0.18.0\", is_dev_dep = False),\n struct(repo=\"crates__filetime-0.2.29\", is_dev_dep = False),\n struct(repo=\"crates__flume-0.11.1\", is_dev_dep = False),\n struct(repo=\"crates__foldhash-0.2.0\", is_dev_dep = False),\n struct(repo=\"crates__fontdue-0.9.3\", is_dev_dep = False),\n struct(repo=\"crates__fs_extra-1.3.0\", is_dev_dep = False),\n struct(repo=\"crates__futures-0.3.33\", is_dev_dep = False),\n struct(repo=\"crates__getrandom-0.4.3\", is_dev_dep = False),\n struct(repo=\"crates__glob-0.3.4\", is_dev_dep = False),\n struct(repo=\"crates__globset-0.4.19\", is_dev_dep = False),\n struct(repo=\"crates__grep-cli-0.1.12\", is_dev_dep = False),\n struct(repo=\"crates__grep-matcher-0.1.9\", is_dev_dep = False),\n struct(repo=\"crates__grep-pcre2-0.1.10\", is_dev_dep = False),\n struct(repo=\"crates__grep-printer-0.3.1\", is_dev_dep = False),\n struct(repo=\"crates__grep-regex-0.1.14\", is_dev_dep = False),\n struct(repo=\"crates__grep-searcher-0.1.17\", is_dev_dep = False),\n struct(repo=\"crates__hex-0.4.3\", is_dev_dep = False),\n struct(repo=\"crates__hifijson-0.2.3\", is_dev_dep = False),\n struct(repo=\"crates__hostname-0.4.2\", is_dev_dep = False),\n struct(repo=\"crates__html-to-markdown-rs-2.30.0\", is_dev_dep = False),\n struct(repo=\"crates__icy_sixel-0.5.0\", is_dev_dep = False),\n struct(repo=\"crates__ignore-0.4.31\", is_dev_dep = False),\n struct(repo=\"crates__image-0.25.10\", is_dev_dep = False),\n struct(repo=\"crates__indicatif-0.18.6\", is_dev_dep = False),\n struct(repo=\"crates__inferno-0.12.8\", is_dev_dep = False),\n struct(repo=\"crates__inherent-1.0.14\", is_dev_dep = False),\n struct(repo=\"crates__itertools-0.14.0\", is_dev_dep = False),\n struct(repo=\"crates__jaq-core-2.2.1\", is_dev_dep = False),\n struct(repo=\"crates__jaq-json-1.1.3\", is_dev_dep = False),\n struct(repo=\"crates__jaq-std-2.1.2\", is_dev_dep = False),\n struct(repo=\"crates__jiff-0.2.35\", is_dev_dep = False),\n struct(repo=\"crates__libc-0.2.189\", is_dev_dep = False),\n struct(repo=\"crates__lscolors-0.21.0\", is_dev_dep = False),\n struct(repo=\"crates__maudio-0.1.6\", is_dev_dep = False),\n struct(repo=\"crates__memchr-2.8.3\", is_dev_dep = False),\n struct(repo=\"crates__memmap2-0.9.11\", is_dev_dep = False),\n struct(repo=\"crates__napi-3.12.0\", is_dev_dep = False),\n struct(repo=\"crates__napi-build-2.4.0\", is_dev_dep = False),\n struct(repo=\"crates__napi-derive-3.6.1\", is_dev_dep = False),\n struct(repo=\"crates__nix-0.29.0\", is_dev_dep = False),\n struct(repo=\"crates__nix-0.31.3\", is_dev_dep = False),\n struct(repo=\"crates__nom-8.0.0\", is_dev_dep = False),\n struct(repo=\"crates__normalize-path-0.2.1\", is_dev_dep = False),\n struct(repo=\"crates__notify-8.2.0\", is_dev_dep = False),\n struct(repo=\"crates__num-bigint-0.4.8\", is_dev_dep = False),\n struct(repo=\"crates__num-traits-0.2.19\", is_dev_dep = False),\n struct(repo=\"crates__onig-6.5.3\", is_dev_dep = False),\n struct(repo=\"crates__opus-0.3.1\", is_dev_dep = False),\n struct(repo=\"crates__os_display-0.1.4\", is_dev_dep = False),\n struct(repo=\"crates__os_pipe-1.2.3\", is_dev_dep = False),\n struct(repo=\"crates__parking_lot-0.12.5\", is_dev_dep = False),\n struct(repo=\"crates__parse_datetime-0.14.0\", is_dev_dep = False),\n struct(repo=\"crates__phf-0.13.1\", is_dev_dep = False),\n struct(repo=\"crates__platform-info-2.1.0\", is_dev_dep = False),\n struct(repo=\"crates__png-0.18.1\", is_dev_dep = False),\n struct(repo=\"crates__portable-pty-0.9.0\", is_dev_dep = False),\n struct(repo=\"crates__procfs-0.18.0\", is_dev_dep = False),\n struct(repo=\"crates__rand-0.10.2\", is_dev_dep = False),\n struct(repo=\"crates__rayon-1.12.0\", is_dev_dep = False),\n struct(repo=\"crates__regex-1.13.1\", is_dev_dep = False),\n struct(repo=\"crates__rlimit-0.11.0\", is_dev_dep = False),\n struct(repo=\"crates__rpds-1.2.1\", is_dev_dep = False),\n struct(repo=\"crates__rustc-hash-2.1.3\", is_dev_dep = False),\n struct(repo=\"crates__rustix-1.1.4\", is_dev_dep = False),\n struct(repo=\"crates__self_cell-1.3.0\", is_dev_dep = False),\n struct(repo=\"crates__serde-1.0.229\", is_dev_dep = False),\n struct(repo=\"crates__serde_json-1.0.151\", is_dev_dep = False),\n struct(repo=\"crates__similar-3.1.1\", is_dev_dep = False),\n struct(repo=\"crates__smallvec-1.15.2\", is_dev_dep = False),\n struct(repo=\"crates__strum-0.28.0\", is_dev_dep = False),\n struct(repo=\"crates__strum_macros-0.28.0\", is_dev_dep = False),\n struct(repo=\"crates__syntect-5.3.0\", is_dev_dep = False),\n struct(repo=\"crates__tempfile-3.27.0\", is_dev_dep = False),\n struct(repo=\"crates__terminfo-0.9.0\", is_dev_dep = False),\n struct(repo=\"crates__thiserror-2.0.19\", is_dev_dep = False),\n struct(repo=\"crates__tiktoken-rs-0.11.0\", is_dev_dep = False),\n struct(repo=\"crates__tokio-1.53.1\", is_dev_dep = False),\n struct(repo=\"crates__tokio-util-0.7.19\", is_dev_dep = False),\n struct(repo=\"crates__toml-1.1.3-spec-1.1.0\", is_dev_dep = False),\n struct(repo=\"crates__tracing-0.1.44\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-0.25.10\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-astro-next-0.1.1\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-bash-0.25.1\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-c-0.24.2\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-c-sharp-0.23.5\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-clojure-0.1.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-cmake-0.7.4\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-cpp-0.23.4\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-css-0.25.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-dart-0.2.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-diff-0.1.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-dockerfile-updated-0.2.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-elisp-1.6.1\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-elixir-0.3.5\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-erlang-0.16.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-fortran-0.6.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-go-0.25.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-graphql-0.1.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-haskell-0.23.1\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-hcl-1.1.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-html-0.23.2\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-ini-1.4.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-java-0.23.5\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-javascript-0.25.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-json-0.24.8\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-julia-0.23.1\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-just-0.2.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-kotlin-sg-0.4.1\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-lua-0.5.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-make-1.1.1\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-md-0.5.3\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-nix-0.3.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-objc-3.0.2\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-ocaml-0.24.2\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-odin-1.3.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-php-0.24.2\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-powershell-0.26.4\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-proto-0.4.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-python-0.25.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-r-1.3.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-regex-0.25.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-ruby-0.23.1\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-rust-0.24.2\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-scala-0.26.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-sequel-0.3.11\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-solidity-1.2.13\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-starlark-1.3.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-svelte-next-0.1.1\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-swift-0.7.3\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-tlaplus-1.5.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-toml-ng-0.7.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-typescript-0.23.2\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-verilog-1.0.3\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-vue-next-0.1.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-xml-0.7.0\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-yaml-0.7.2\", is_dev_dep = False),\n struct(repo=\"crates__tree-sitter-zig-1.1.2\", is_dev_dep = False),\n struct(repo=\"crates__unicode-segmentation-1.13.3\", is_dev_dep = False),\n struct(repo=\"crates__unicode-width-0.1.14\", is_dev_dep = False),\n struct(repo=\"crates__unicode-width-0.2.2\", is_dev_dep = False),\n struct(repo=\"crates__uucore-0.0.30\", is_dev_dep = False),\n struct(repo=\"crates__uucore-0.8.0\", is_dev_dep = False),\n struct(repo=\"crates__uucore-0.9.0\", is_dev_dep = False),\n struct(repo=\"crates__uuid-1.24.0\", is_dev_dep = False),\n struct(repo=\"crates__uutils_term_grid-0.8.0\", is_dev_dep = False),\n struct(repo=\"crates__uzers-0.12.2\", is_dev_dep = False),\n struct(repo=\"crates__webrtc-0.17.2\", is_dev_dep = False),\n struct(repo=\"crates__whoami-2.1.2\", is_dev_dep = False),\n struct(repo=\"crates__windows-sys-0.59.0\", is_dev_dep = False),\n struct(repo=\"crates__windows-sys-0.61.2\", is_dev_dep = False),\n struct(repo=\"crates__winreg-0.56.0\", is_dev_dep = False),\n struct(repo=\"crates__x11rb-0.13.2\", is_dev_dep = False),\n struct(repo=\"crates__xcap-0.9.6\", is_dev_dep = False),\n struct(repo=\"crates__xkeysym-0.2.1\", is_dev_dep = False),\n struct(repo=\"crates__xxhash-rust-0.8.18\", is_dev_dep = False),\n struct(repo=\"crates__yansi-1.0.1\", is_dev_dep = False),\n struct(repo = \"crates__pretty_assertions-1.4.1\", is_dev_dep = True),\n struct(repo = \"crates__rstest-0.26.1\", is_dev_dep = True),\n ]\n", "defs.bzl": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\"\"\"Deprecated: re-exports the crate_universe macros from `:crates.bzl`.\"\"\"\n\nload(\n \":crates.bzl\",\n _aliases = \"aliases\",\n _all_crate_deps = \"all_crate_deps\",\n _crate_deps = \"crate_deps\",\n _crate_edition = \"crate_edition\",\n _crate_repositories = \"crate_repositories\",\n)\n\naliases = _aliases\nall_crate_deps = _all_crate_deps\ncrate_deps = _crate_deps\ncrate_edition = _crate_edition\ncrate_repositories = _crate_repositories\n", "ansi-width-0.1.0/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"ansi-width-0.1.0\",\n actual = \"@crates__ansi-width-0.1.0//:ansi_width\",\n tags = [\"manual\"],\n)\n", "ansi-width/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"ansi-width\",\n actual = \"@crates__ansi-width-0.1.0//:ansi_width\",\n tags = [\"manual\"],\n)\n", @@ -684,12 +685,12 @@ "memchr/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"memchr\",\n actual = \"@crates__memchr-2.8.3//:memchr\",\n tags = [\"manual\"],\n)\n", "memmap2-0.9.11/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"memmap2-0.9.11\",\n actual = \"@crates__memmap2-0.9.11//:memmap2\",\n tags = [\"manual\"],\n)\n", "memmap2/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"memmap2\",\n actual = \"@crates__memmap2-0.9.11//:memmap2\",\n tags = [\"manual\"],\n)\n", - "napi-3.11.0/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"napi-3.11.0\",\n actual = \"@crates__napi-3.11.0//:napi\",\n tags = [\"manual\"],\n)\n", - "napi/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"napi\",\n actual = \"@crates__napi-3.11.0//:napi\",\n tags = [\"manual\"],\n)\n", - "napi-build-2.3.2/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"napi-build-2.3.2\",\n actual = \"@crates__napi-build-2.3.2//:napi_build\",\n tags = [\"manual\"],\n)\n", - "napi-build/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"napi-build\",\n actual = \"@crates__napi-build-2.3.2//:napi_build\",\n tags = [\"manual\"],\n)\n", - "napi-derive-3.6.0/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"napi-derive-3.6.0\",\n actual = \"@crates__napi-derive-3.6.0//:napi_derive\",\n tags = [\"manual\"],\n)\n", - "napi-derive/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"napi-derive\",\n actual = \"@crates__napi-derive-3.6.0//:napi_derive\",\n tags = [\"manual\"],\n)\n", + "napi-3.12.0/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"napi-3.12.0\",\n actual = \"@crates__napi-3.12.0//:napi\",\n tags = [\"manual\"],\n)\n", + "napi/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"napi\",\n actual = \"@crates__napi-3.12.0//:napi\",\n tags = [\"manual\"],\n)\n", + "napi-build-2.4.0/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"napi-build-2.4.0\",\n actual = \"@crates__napi-build-2.4.0//:napi_build\",\n tags = [\"manual\"],\n)\n", + "napi-build/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"napi-build\",\n actual = \"@crates__napi-build-2.4.0//:napi_build\",\n tags = [\"manual\"],\n)\n", + "napi-derive-3.6.1/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"napi-derive-3.6.1\",\n actual = \"@crates__napi-derive-3.6.1//:napi_derive\",\n tags = [\"manual\"],\n)\n", + "napi-derive/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"napi-derive\",\n actual = \"@crates__napi-derive-3.6.1//:napi_derive\",\n tags = [\"manual\"],\n)\n", "nix-0.29.0/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"nix-0.29.0\",\n actual = \"@crates__nix-0.29.0//:nix\",\n tags = [\"manual\"],\n)\n", "nix-0.31.3/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"nix-0.31.3\",\n actual = \"@crates__nix-0.31.3//:nix\",\n tags = [\"manual\"],\n)\n", "nom-8.0.0/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"nom-8.0.0\",\n actual = \"@crates__nom-8.0.0//:nom\",\n tags = [\"manual\"],\n)\n", @@ -716,8 +717,8 @@ "parse_datetime/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"parse_datetime\",\n actual = \"@crates__parse_datetime-0.14.0//:parse_datetime\",\n tags = [\"manual\"],\n)\n", "phf-0.13.1/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"phf-0.13.1\",\n actual = \"@crates__phf-0.13.1//:phf\",\n tags = [\"manual\"],\n)\n", "phf/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"phf\",\n actual = \"@crates__phf-0.13.1//:phf\",\n tags = [\"manual\"],\n)\n", - "pi-shell-17.1.7/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"pi-shell-17.1.7\",\n actual = \"@crates__pi-shell-17.1.7//:pi_shell\",\n tags = [\"manual\"],\n)\n", - "pi-shell/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"pi-shell\",\n actual = \"@crates__pi-shell-17.1.7//:pi_shell\",\n tags = [\"manual\"],\n)\n", + "pi-shell-17.1.8/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"pi-shell-17.1.8\",\n actual = \"@crates__pi-shell-17.1.8//:pi_shell\",\n tags = [\"manual\"],\n)\n", + "pi-shell/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"pi-shell\",\n actual = \"@crates__pi-shell-17.1.8//:pi_shell\",\n tags = [\"manual\"],\n)\n", "platform-info-2.1.0/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"platform-info-2.1.0\",\n actual = \"@crates__platform-info-2.1.0//:platform_info\",\n tags = [\"manual\"],\n)\n", "platform-info/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"platform-info\",\n actual = \"@crates__platform-info-2.1.0//:platform_info\",\n tags = [\"manual\"],\n)\n", "png-0.18.1/BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nalias(\n name = \"png-0.18.1\",\n actual = \"@crates__png-0.18.1//:png\",\n tags = [\"manual\"],\n)\n", @@ -5681,56 +5682,56 @@ "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"nanorand\",\n deps = [\n \"@crates__getrandom-0.2.17//:getrandom\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"alloc\",\n \"chacha\",\n \"default\",\n \"getrandom\",\n \"pcg64\",\n \"std\",\n \"tls\",\n \"wyrand\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=nanorand\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [],\n \"@@//bazel/triples:x86_64-apple-darwin\": [],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.7.0\",\n)\n" } }, - "crates__napi-3.11.0": { + "crates__napi-3.12.0": { "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { "remote_patch_strip": 1, - "sha256": "de33522036981030a75c231829566bc63414e08101a6f5ff4ac6cef19c8e0941", + "sha256": "6f71d6bc097c4a6eb853c3f24991ab8c9f50f57d1f719e305175541482217e36", "type": "tar.gz", "urls": [ - "https://static.crates.io/crates/napi/3.11.0/download" + "https://static.crates.io/crates/napi/3.12.0/download" ], - "strip_prefix": "napi-3.11.0", - "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\nload(\n \"@rules_rust//cargo:defs.bzl\",\n \"cargo_build_script\",\n \"cargo_toml_env_vars\",\n)\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"napi\",\n deps = [\n \"@crates__bitflags-2.13.1//:bitflags\",\n \"@crates__ctor-1.0.11//:ctor\",\n \"@crates__futures-0.3.33//:futures\",\n \"@crates__napi-3.11.0//:build_script_build\",\n \"@crates__napi-sys-3.3.0//:napi_sys\",\n \"@crates__nohash-hasher-0.2.0//:nohash_hasher\",\n \"@crates__rustc-hash-2.1.3//:rustc_hash\",\n \"@crates__tokio-1.53.1//:tokio\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"default\",\n \"dyn-symbols\",\n \"napi1\",\n \"napi10\",\n \"napi2\",\n \"napi3\",\n \"napi4\",\n \"napi5\",\n \"napi6\",\n \"napi7\",\n \"napi8\",\n \"napi9\",\n \"tokio\",\n \"tokio_rt\",\n \"tokio_time\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=napi\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [],\n \"@@//bazel/triples:x86_64-apple-darwin\": [],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"3.11.0\",\n)\n\ncargo_build_script(\n name = \"_bs\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \"**/*.rs\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"default\",\n \"dyn-symbols\",\n \"napi1\",\n \"napi10\",\n \"napi2\",\n \"napi3\",\n \"napi4\",\n \"napi5\",\n \"napi6\",\n \"napi7\",\n \"napi8\",\n \"napi9\",\n \"tokio\",\n \"tokio_rt\",\n \"tokio_time\",\n ],\n crate_name = \"build_script_build\",\n crate_root = \"build.rs\",\n data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n deps = [\n \"@crates__napi-build-2.3.2//:napi_build\",\n ],\n emit_warnings = False,\n edition = \"2021\",\n pkg_name = \"napi\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=napi\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n version = \"3.11.0\",\n visibility = [\"//visibility:private\"],\n)\n\nalias(\n name = \"build_script_build\",\n actual = \":_bs\",\n tags = [\"manual\"],\n)\n" + "strip_prefix": "napi-3.12.0", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\nload(\n \"@rules_rust//cargo:defs.bzl\",\n \"cargo_build_script\",\n \"cargo_toml_env_vars\",\n)\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"napi\",\n deps = [\n \"@crates__bitflags-2.13.1//:bitflags\",\n \"@crates__ctor-1.0.11//:ctor\",\n \"@crates__futures-0.3.33//:futures\",\n \"@crates__napi-3.12.0//:build_script_build\",\n \"@crates__napi-sys-3.3.0//:napi_sys\",\n \"@crates__nohash-hasher-0.2.0//:nohash_hasher\",\n \"@crates__rustc-hash-2.1.3//:rustc_hash\",\n \"@crates__tokio-1.53.1//:tokio\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"default\",\n \"dyn-symbols\",\n \"napi1\",\n \"napi10\",\n \"napi2\",\n \"napi3\",\n \"napi4\",\n \"napi5\",\n \"napi6\",\n \"napi7\",\n \"napi8\",\n \"napi9\",\n \"tokio\",\n \"tokio_rt\",\n \"tokio_time\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=napi\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [],\n \"@@//bazel/triples:x86_64-apple-darwin\": [],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"3.12.0\",\n)\n\ncargo_build_script(\n name = \"_bs\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \"**/*.rs\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"default\",\n \"dyn-symbols\",\n \"napi1\",\n \"napi10\",\n \"napi2\",\n \"napi3\",\n \"napi4\",\n \"napi5\",\n \"napi6\",\n \"napi7\",\n \"napi8\",\n \"napi9\",\n \"tokio\",\n \"tokio_rt\",\n \"tokio_time\",\n ],\n crate_name = \"build_script_build\",\n crate_root = \"build.rs\",\n data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n deps = [\n \"@crates__napi-build-2.4.0//:napi_build\",\n ],\n emit_warnings = False,\n edition = \"2021\",\n pkg_name = \"napi\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=napi\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n version = \"3.12.0\",\n visibility = [\"//visibility:private\"],\n)\n\nalias(\n name = \"build_script_build\",\n actual = \":_bs\",\n tags = [\"manual\"],\n)\n" } }, - "crates__napi-build-2.3.2": { + "crates__napi-build-2.4.0": { "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { "remote_patch_strip": 1, - "sha256": "c9c366d2c8c60b86fa632df75f745509b52f9128f91a6bad4c796e44abb505e1", + "sha256": "5282704fbe8d49b0cf8b08e3f33233416a528658f205c7e5ace63b582de0b11c", "type": "tar.gz", "urls": [ - "https://static.crates.io/crates/napi-build/2.3.2/download" + "https://static.crates.io/crates/napi-build/2.4.0/download" ], - "strip_prefix": "napi-build-2.3.2", - "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"napi_build\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=napi-build\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [],\n \"@@//bazel/triples:x86_64-apple-darwin\": [],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"2.3.2\",\n)\n" + "strip_prefix": "napi-build-2.4.0", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"napi_build\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=napi-build\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [],\n \"@@//bazel/triples:x86_64-apple-darwin\": [],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"2.4.0\",\n)\n" } }, - "crates__napi-derive-3.6.0": { + "crates__napi-derive-3.6.1": { "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { "remote_patch_strip": 1, - "sha256": "a49c513341a61a16a10af6efcce46b30d0822ba2d4fb197d24d33dfc199c78d5", + "sha256": "4d5c9c02556ea6dc99dffd36c1ce60141411657438501a125b675776d011ce92", "type": "tar.gz", "urls": [ - "https://static.crates.io/crates/napi-derive/3.6.0/download" + "https://static.crates.io/crates/napi-derive/3.6.1/download" ], - "strip_prefix": "napi-derive-3.6.0", - "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_proc_macro\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_proc_macro(\n name = \"napi_derive\",\n deps = [\n \"@crates__convert_case-0.11.0//:convert_case\",\n \"@crates__ctor-1.0.11//:ctor\",\n \"@crates__napi-derive-backend-6.0.0//:napi_derive_backend\",\n \"@crates__proc-macro2-1.0.107//:proc_macro2\",\n \"@crates__quote-1.0.47//:quote\",\n \"@crates__syn-2.0.119//:syn\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"ctor\",\n \"default\",\n \"strict\",\n \"type-def\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=napi-derive\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [],\n \"@@//bazel/triples:x86_64-apple-darwin\": [],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"3.6.0\",\n)\n" + "strip_prefix": "napi-derive-3.6.1", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_proc_macro\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_proc_macro(\n name = \"napi_derive\",\n deps = [\n \"@crates__convert_case-0.11.0//:convert_case\",\n \"@crates__ctor-1.0.11//:ctor\",\n \"@crates__napi-derive-backend-6.1.0//:napi_derive_backend\",\n \"@crates__proc-macro2-1.0.107//:proc_macro2\",\n \"@crates__quote-1.0.47//:quote\",\n \"@crates__syn-2.0.119//:syn\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"ctor\",\n \"default\",\n \"strict\",\n \"type-def\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=napi-derive\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [],\n \"@@//bazel/triples:x86_64-apple-darwin\": [],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"3.6.1\",\n)\n" } }, - "crates__napi-derive-backend-6.0.0": { + "crates__napi-derive-backend-6.1.0": { "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { "remote_patch_strip": 1, - "sha256": "4747005fa3e2c9989ac45a723a514c5db2411238b72981a3cda4c701a9dfea17", + "sha256": "6a9d8365cf97f54d9b6d6dbf83a25ca227ad7d6e920717426c599225aca6740b", "type": "tar.gz", "urls": [ - "https://static.crates.io/crates/napi-derive-backend/6.0.0/download" + "https://static.crates.io/crates/napi-derive-backend/6.1.0/download" ], - "strip_prefix": "napi-derive-backend-6.0.0", - "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"napi_derive_backend\",\n deps = [\n \"@crates__convert_case-0.11.0//:convert_case\",\n \"@crates__proc-macro2-1.0.107//:proc_macro2\",\n \"@crates__quote-1.0.47//:quote\",\n \"@crates__semver-1.0.28//:semver\",\n \"@crates__syn-2.0.119//:syn\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"semver\",\n \"strict\",\n \"type-def\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=napi-derive-backend\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [],\n \"@@//bazel/triples:x86_64-apple-darwin\": [],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"6.0.0\",\n)\n" + "strip_prefix": "napi-derive-backend-6.1.0", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'oh-my-pi'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"napi_derive_backend\",\n deps = [\n \"@crates__convert_case-0.11.0//:convert_case\",\n \"@crates__proc-macro2-1.0.107//:proc_macro2\",\n \"@crates__quote-1.0.47//:quote\",\n \"@crates__semver-1.0.28//:semver\",\n \"@crates__syn-2.0.119//:syn\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"semver\",\n \"strict\",\n \"type-def\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=napi-derive-backend\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@@//bazel/triples:aarch64-apple-darwin\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:aarch64-unknown-linux-musl\": [],\n \"@@//bazel/triples:x86_64-apple-darwin\": [],\n \"@@//bazel/triples:x86_64-pc-windows-msvc\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-gnu\": [],\n \"@@//bazel/triples:x86_64-unknown-linux-musl\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"6.1.0\",\n)\n" } }, "crates__napi-sys-3.3.0": { diff --git a/crates/pi-natives/BUILD.bazel b/crates/pi-natives/BUILD.bazel index 56eb22670..6e2dc8a41 100644 --- a/crates/pi-natives/BUILD.bazel +++ b/crates/pi-natives/BUILD.bazel @@ -48,6 +48,7 @@ rust_shared_library( "//crates/pi-iso", "//crates/pi-shell", "//crates/pi-uutils-ctx", + "//crates/pi-voice", "//crates/pi-walker", ], ) diff --git a/crates/pi-natives/Cargo.toml b/crates/pi-natives/Cargo.toml index 78ce21756..009ac31bf 100644 --- a/crates/pi-natives/Cargo.toml +++ b/crates/pi-natives/Cargo.toml @@ -15,11 +15,9 @@ workspace = true [dependencies] anyhow.workspace = true -audiopus_sys.workspace = true arboard.workspace = true ast-grep-core.workspace = true base64.workspace = true -bytes.workspace = true clap.workspace = true globset.workspace = true fontdue.workspace = true @@ -32,16 +30,15 @@ icy_sixel.workspace = true ignore.workspace = true image = { workspace = true, features = ["bmp"] } inferno.workspace = true -maudio.workspace = true napi.workspace = true napi-derive.workspace = true -opus.workspace = true parking_lot.workspace = true phf.workspace = true flume.workspace = true pi-ast.workspace = true pi-iso.workspace = true pi-shell.workspace = true +pi-voice.workspace = true pi-walker.workspace = true pi-uutils-ctx = { path = "../pi-uutils-ctx" } portable-pty.workspace = true @@ -58,7 +55,6 @@ tokio-util.workspace = true toml.workspace = true unicode-segmentation.workspace = true unicode-width.workspace = true -webrtc.workspace = true xxhash-rust.workspace = true [target.'cfg(target_os = "linux")'.dependencies] @@ -72,16 +68,6 @@ xcap = { version = "=0.9.6", default-features = false } [target.'cfg(target_os = "macos")'.dependencies] tempfile = "=3.27.0" core-graphics = "0.25" -# Regenerate miniaudio FFI bindings from the compiled headers on macOS only. -# The maudio-sys pregenerated `unix.rs` bindings are Linux-shaped: their -# `ma_device`/`ma_context` backend-state unions omit the `#ifdef -# MA_SUPPORT_COREAUDIO` members that the macOS build of miniaudio.c actually -# contains, so shipping them on darwin is an ABI mismatch that silently breaks -# CoreAudio capture (device init/start succeed but no render callbacks fire). -# darwin builds with host Xcode (libclang available), so bindgen is fine here; -# the hermetic zig/musl/windows toolchains keep the bindgen-free pregen path, -# whose bindings are correct for those platforms. -maudio = { workspace = true, features = ["generate-bindings"] } [target.'cfg(unix)'.dependencies] libc.workspace = true diff --git a/crates/pi-natives/src/audio.rs b/crates/pi-natives/src/audio.rs index 1c68f682c..6ca937fba 100644 --- a/crates/pi-natives/src/audio.rs +++ b/crates/pi-natives/src/audio.rs @@ -1,310 +1,26 @@ -//! Cross-platform microphone capture and streaming speaker playback. +//! N-API bindings for microphone capture and speaker playback. //! -//! miniaudio owns platform device discovery, format conversion, channel mixing, -//! and resampling. The N-API classes expose one stable mono `f32` contract to -//! TypeScript while the internal playback stream is shared with native WebRTC. +//! The engine — device discovery, format conversion, mixing, drain semantics — +//! lives in `pi_voice::audio`; these classes adapt its mono `f32` contract to +//! TypeScript callbacks and `Float32Array` buffers. -use std::sync::{ - Arc, - atomic::{AtomicBool, AtomicU32, Ordering}, -}; +use std::sync::Arc; -use flume::TryRecvError; -use maudio::{ - audio::{performance::PerformanceProfile, sample_rate::SampleRate}, - backend::Backend, - device::{ - Device, - device_builder::{DeviceBuilder, DeviceBuilderOps}, - }, -}; use napi::{ bindgen_prelude::{Float32Array, Result}, threadsafe_function::{ThreadsafeFunction, ThreadsafeFunctionCallMode, UnknownReturnValue}, }; use napi_derive::napi; use parking_lot::Mutex; -use tokio::sync::Notify; - -const AUDIO_CHANNELS: u32 = 1; -// PulseAudio TCP playback stutters with a 20 ms target buffer; 50 ms absorbs -// transport jitter while preserving interactive latency. -#[cfg(target_os = "linux")] -const PLAYBACK_PERIOD_MS: u32 = 50; -#[cfg(not(target_os = "linux"))] -const PLAYBACK_PERIOD_MS: u32 = 20; -// miniaudio's PulseAudio backend reserves three periods. Android's OpenSL ES -// source emits 125 ms fragments, so Linux capture needs at least 150 ms queued. -#[cfg(target_os = "linux")] -const CAPTURE_PERIOD_MS: u32 = 50; -#[cfg(not(target_os = "linux"))] -const CAPTURE_PERIOD_MS: u32 = 20; -// PulseAudio can retain its default three periods after the producer closes. -// Wait for all of them before stopping the device so the tail reaches the sink. -#[cfg(target_os = "linux")] -const PLAYBACK_DRAIN_CALLBACKS: usize = 3; -#[cfg(not(target_os = "linux"))] -const PLAYBACK_DRAIN_CALLBACKS: usize = 2; - -#[cfg(target_os = "macos")] -const AUDIO_BACKENDS: &[Backend] = &[Backend::CoreAudio]; -#[cfg(target_os = "windows")] -const AUDIO_BACKENDS: &[Backend] = &[Backend::Wasapi]; -#[cfg(target_os = "linux")] -const AUDIO_BACKENDS: &[Backend] = &[Backend::PulseAudio, Backend::Alsa, Backend::Jack]; -#[cfg(not(any(target_os = "macos", target_os = "windows", target_os = "linux")))] -const AUDIO_BACKENDS: &[Backend] = &[Backend::Sndio, Backend::Audio4, Backend::Oss]; +use pi_voice::audio::{CaptureStream, PlaybackState, PlaybackStream}; type CaptureCallback = ThreadsafeFunction; -type NativeResult = std::result::Result; - -struct PlaybackState { - gain_bits: AtomicU32, - drained: AtomicBool, - stopped: AtomicBool, - notify: Notify, -} - -impl PlaybackState { - fn new() -> Self { - Self { - gain_bits: AtomicU32::new(1.0f32.to_bits()), - drained: AtomicBool::new(false), - stopped: AtomicBool::new(false), - notify: Notify::new(), - } - } - - fn gain(&self) -> f32 { - f32::from_bits(self.gain_bits.load(Ordering::Acquire)) - } - - fn set_gain(&self, gain: f32) { - self.gain_bits.store(gain.to_bits(), Ordering::Release); - } - - fn mark_drained(&self) { - if !self.drained.swap(true, Ordering::AcqRel) { - self.notify.notify_waiters(); - } - } - - fn mark_stopped(&self) { - self.stopped.store(true, Ordering::Release); - self.notify.notify_waiters(); - } - - async fn wait_for_drain(&self) { - loop { - let notified = self.notify.notified(); - if self.drained.load(Ordering::Acquire) || self.stopped.load(Ordering::Acquire) { - return; - } - notified.await; - } - } -} - -/// Producer endpoint for one native playback device. -#[derive(Clone)] -pub(crate) struct PlaybackWriter { - tx: flume::Sender>, - state: Arc, -} - -impl PlaybackWriter { - /// Queue mono floating-point samples without blocking the caller. - pub(crate) fn write(&self, samples: &[f32]) -> NativeResult<()> { - if samples.is_empty() { - return Ok(()); - } - if self.state.stopped.load(Ordering::Acquire) || self.state.drained.load(Ordering::Acquire) { - return Err("Native audio playback is closed".to_owned()); - } - self - .tx - .send(samples.to_vec()) - .map_err(|_| "Native audio playback is closed".to_owned()) - } -} - -/// Running mono playback stream shared by N-API playback and native WebRTC. -pub(crate) struct PlaybackStream { - device: Option>, - writer: Option, - state: Arc, -} - -impl PlaybackStream { - /// Open and start the default speaker at the requested logical sample rate. - pub(crate) fn start(sample_rate: u32) -> NativeResult { - let sample_rate = audio_sample_rate(sample_rate)?; - let state = Arc::new(PlaybackState::new()); - let (tx, rx) = flume::unbounded::>(); - let callback_state = Arc::clone(&state); - let mut current = Vec::new(); - let mut cursor = 0; - let mut empty_callbacks = 0; - let mut builder = DeviceBuilder::playback().f32(); - builder - .sample_rate(sample_rate) - .playback_channels(AUDIO_CHANNELS) - .period_size_millis(PLAYBACK_PERIOD_MS) - .performance_profile(PerformanceProfile::LowLatency) - .backends(AUDIO_BACKENDS); - let mut device = builder - .with_callback(move |_device, output| { - fill_playback( - &rx, - &mut current, - &mut cursor, - output, - &callback_state, - &mut empty_callbacks, - ); - }) - .map_err(|error| format!("Failed to open the default speaker: {error}"))?; - device - .device_start() - .map_err(|error| format!("Failed to start speaker playback: {error}"))?; - - Ok(Self { - device: Some(device), - writer: Some(PlaybackWriter { tx, state: Arc::clone(&state) }), - state, - }) - } - - /// Clone the producer endpoint used by the remote-audio decoder. - pub(crate) fn writer(&self) -> NativeResult { - self - .writer - .clone() - .ok_or_else(|| "Native audio playback is closed".to_owned()) - } - - fn state(&self) -> Arc { - Arc::clone(&self.state) - } - - fn finish_input(&mut self) { - self.writer.take(); - } - - fn set_gain(&self, gain: f32) -> NativeResult<()> { - if !gain.is_finite() { - return Err("Audio playback gain must be finite".to_owned()); - } - self.state.set_gain(gain.max(0.0)); - Ok(()) - } - - /// Stop playback immediately and release the default speaker. - pub(crate) fn stop(&mut self) -> NativeResult<()> { - self.writer.take(); - self.state.mark_stopped(); - let Some(mut device) = self.device.take() else { - return Ok(()); - }; - device - .device_stop() - .map_err(|error| format!("Failed to stop speaker playback: {error}")) - } -} - -impl Drop for PlaybackStream { - fn drop(&mut self) { - let _ = self.stop(); - } -} - -fn audio_sample_rate(sample_rate: u32) -> NativeResult { - SampleRate::try_from(sample_rate) - .map_err(|error| format!("Unsupported audio sample rate {sample_rate}: {error}")) -} - -fn fill_playback( - rx: &flume::Receiver>, - current: &mut Vec, - cursor: &mut usize, - output: &mut [f32], - state: &PlaybackState, - empty_callbacks: &mut usize, -) { - output.fill(0.0); - if state.stopped.load(Ordering::Acquire) { - return; - } - - let gain = state.gain(); - let mut output_offset = 0; - while output_offset < output.len() { - if *cursor == current.len() { - match rx.try_recv() { - Ok(next) => { - *current = next; - *cursor = 0; - *empty_callbacks = 0; - }, - Err(TryRecvError::Empty) => { - *empty_callbacks = 0; - break; - }, - Err(TryRecvError::Disconnected) => { - *empty_callbacks += 1; - if *empty_callbacks >= PLAYBACK_DRAIN_CALLBACKS { - state.mark_drained(); - } - break; - }, - } - } - - let count = (current.len() - *cursor).min(output.len() - output_offset); - let source = ¤t[*cursor..*cursor + count]; - let destination = &mut output[output_offset..output_offset + count]; - if gain == 1.0 { - destination.copy_from_slice(source); - } else { - for (destination, source) in destination.iter_mut().zip(source) { - *destination = *source * gain; - } - } - *cursor += count; - output_offset += count; - } -} - -fn start_capture_device(sample_rate: u32, mut on_audio: C) -> NativeResult> -where - C: FnMut(&[f32]) + Send + 'static, -{ - let sample_rate = audio_sample_rate(sample_rate)?; - let mut builder = DeviceBuilder::capture().f32(); - builder - .sample_rate(sample_rate) - .capture_channels(AUDIO_CHANNELS) - .period_size_millis(CAPTURE_PERIOD_MS) - .performance_profile(PerformanceProfile::LowLatency) - .backends(AUDIO_BACKENDS); - let mut device = builder - .with_callback(move |_device, samples| { - if !samples.is_empty() { - on_audio(samples); - } - }) - .map_err(|error| format!("Failed to open the default microphone: {error}"))?; - device - .device_start() - .map_err(|error| format!("Failed to start microphone capture: {error}"))?; - Ok(device) -} /// Default-microphone capture converted to mono `f32` at the requested sample /// rate. #[napi] pub struct AudioCapture { - device: Mutex>>, + stream: Mutex>, } #[napi] @@ -316,32 +32,22 @@ impl AudioCapture { #[napi(ts_arg_type = "(error: Error | null, samples: Float32Array) => void")] on_audio: CaptureCallback, ) -> Result { - let device = start_capture_device(sample_rate, move |samples| { + let stream = CaptureStream::start(sample_rate, move |samples| { on_audio .call(Ok(Float32Array::new(samples.to_vec())), ThreadsafeFunctionCallMode::NonBlocking); }) .map_err(napi::Error::from_reason)?; - Ok(Self { device: Mutex::new(Some(device)) }) + Ok(Self { stream: Mutex::new(Some(stream)) }) } /// Stop capture immediately and release the microphone. #[napi] pub fn stop(&self) -> Result<()> { - let device = self.device.lock().take(); - let Some(mut device) = device else { + let stream = self.stream.lock().take(); + let Some(mut stream) = stream else { return Ok(()); }; - device.device_stop().map_err(|error| { - napi::Error::from_reason(format!("Failed to stop microphone capture: {error}")) - }) - } -} - -impl Drop for AudioCapture { - fn drop(&mut self) { - if let Some(mut device) = self.device.get_mut().take() { - let _ = device.device_stop(); - } + stream.stop().map_err(napi::Error::from_reason) } } @@ -416,77 +122,3 @@ impl AudioPlayback { Ok(()) } } - -impl Drop for AudioPlayback { - fn drop(&mut self) { - if let Some(mut stream) = self.stream.get_mut().take() { - let _ = stream.stop(); - } - } -} - -#[cfg(test)] -mod tests { - use std::{ - env, - mem::forget, - sync::atomic::AtomicUsize, - thread::sleep, - time::{Duration, Instant}, - }; - - use super::*; - - #[test] - fn playback_preserves_chunk_order_and_applies_render_gain() { - let state = PlaybackState::new(); - state.set_gain(0.5); - let (tx, rx) = flume::unbounded(); - tx.send(vec![1.0, -1.0]).expect("receiver is live"); - tx.send(vec![0.5, -0.5]).expect("receiver is live"); - drop(tx); - let mut current = Vec::new(); - let mut cursor = 0; - let mut empty_callbacks = 0; - let mut output = [9.0; 5]; - - fill_playback(&rx, &mut current, &mut cursor, &mut output, &state, &mut empty_callbacks); - - assert_eq!(output, [0.5, -0.5, 0.25, -0.25, 0.0]); - assert!(!state.drained.load(Ordering::Acquire)); - let mut silence = [1.0; 2]; - while empty_callbacks < PLAYBACK_DRAIN_CALLBACKS { - silence.fill(1.0); - fill_playback(&rx, &mut current, &mut cursor, &mut silence, &state, &mut empty_callbacks); - assert_eq!(silence, [0.0, 0.0]); - assert_eq!( - state.drained.load(Ordering::Acquire), - empty_callbacks >= PLAYBACK_DRAIN_CALLBACKS - ); - } - } - - #[test] - fn opt_in_default_capture_receives_frames() { - if env::var_os("OMP_NATIVE_AUDIO_CAPTURE_TEST").is_none() { - return; - } - - let callbacks = Arc::new(AtomicUsize::new(0)); - let callback_count = Arc::clone(&callbacks); - let mut device = start_capture_device(16_000, move |_samples| { - callback_count.fetch_add(1, Ordering::Relaxed); - }) - .expect("default capture device starts"); - - let deadline = Instant::now() + Duration::from_secs(5); - while callbacks.load(Ordering::Relaxed) == 0 && Instant::now() < deadline { - sleep(Duration::from_millis(20)); - } - if callbacks.load(Ordering::Relaxed) == 0 { - forget(device); - panic!("capture device started but delivered no frames within five seconds"); - } - device.device_stop().expect("capture device stops"); - } -} diff --git a/crates/pi-natives/src/live.rs b/crates/pi-natives/src/live.rs index 75bd9b54d..9cbcd99d6 100644 --- a/crates/pi-natives/src/live.rs +++ b/crates/pi-natives/src/live.rs @@ -1,365 +1,21 @@ -//! Native WebRTC media transport for Codex live conversations. +//! N-API bindings for the Codex live WebRTC peer. //! //! The TypeScript host owns authenticated signaling and the sideband protocol; -//! this module owns the realtime WebRTC peer, Opus media, and speaker playback. +//! the realtime peer, Opus media, and speaker playback live in +//! `pi_voice::live`. This class adapts its callbacks to non-blocking +//! threadsafe functions and its PCM input to `Float32Array`. -use std::{ - sync::{ - Arc, Weak, - atomic::{AtomicBool, AtomicUsize, Ordering}, - }, - time::Duration, -}; +use std::sync::Arc; -use bytes::Bytes; use napi::{ bindgen_prelude::{Float32Array, Result}, threadsafe_function::{ThreadsafeFunction, ThreadsafeFunctionCallMode, UnknownReturnValue}, }; use napi_derive::napi; -use opus::{Application, Channels, Decoder, Encoder}; -use parking_lot::Mutex; -use tokio::{sync::watch, task::JoinHandle}; -use webrtc::{ - api::{ - APIBuilder, - interceptor_registry::register_default_interceptors, - media_engine::{MIME_TYPE_OPUS, MediaEngine}, - }, - data_channel::{RTCDataChannel, data_channel_message::DataChannelMessage}, - interceptor::registry::Registry, - media::Sample, - peer_connection::{ - RTCPeerConnection, configuration::RTCConfiguration, - peer_connection_state::RTCPeerConnectionState, - sdp::session_description::RTCSessionDescription, - }, - rtp_transceiver::{ - rtp_codec::{RTCRtpCodecCapability, RTCRtpCodecParameters, RTPCodecType}, - rtp_sender::RTCRtpSender, - }, - track::{ - track_local::{TrackLocal, track_local_static_sample::TrackLocalStaticSample}, - track_remote::TrackRemote, - }, -}; - -use crate::audio::{PlaybackStream, PlaybackWriter}; - -const DATA_CHANNEL_LABEL: &str = "oai-events"; -const INPUT_SAMPLE_RATE: u32 = 16_000; -const INPUT_FRAME_SAMPLES: usize = 320; -const INPUT_FRAME_DURATION: Duration = Duration::from_millis(20); -const MAX_ENCODED_OPUS_BYTES: usize = 1_275; -const MAX_QUEUED_INPUT_SAMPLES: usize = 32_000; -const OUTPUT_SAMPLE_RATE: u32 = 48_000; -const MAX_DECODED_OPUS_SAMPLES: usize = 5_760; -const OUTPUT_LEVEL_SAMPLES: usize = 2_400; -const OUTPUT_FRAME_SAMPLES: usize = 960; -const DEFAULT_OPEN_TIMEOUT_MS: u32 = 20_000; -const DISCONNECT_GRACE: Duration = Duration::from_secs(2); -const CLOSE_TASK_TIMEOUT: Duration = Duration::from_secs(1); - -const OPUS_CAPABILITY: RTCRtpCodecCapability = RTCRtpCodecCapability { - mime_type: String::new(), - clock_rate: OUTPUT_SAMPLE_RATE, - channels: 2, - sdp_fmtp_line: String::new(), - rtcp_feedback: Vec::new(), -}; +use pi_voice::live::{DEFAULT_OPEN_TIMEOUT_MS, LiveCallbacks, LivePeerCore}; type StringCallback = ThreadsafeFunction; type LevelCallback = ThreadsafeFunction; -type NativeResult = std::result::Result; - -#[derive(Clone, Debug)] -enum PeerSignal { - Connecting, - Open, - Failed(String), - Closed, -} - -enum InputCommand { - Audio(Vec), - Muted(bool), - Close, -} - -struct LiveCallbacks { - event: StringCallback, - level: LevelCallback, - failure: StringCallback, -} - -struct LiveResources { - peer: Arc, - data_channel: Arc, - input_tx: flume::Sender, - input_task: JoinHandle<()>, - rtcp_task: JoinHandle<()>, - playback: PlaybackStream, -} - -struct LivePeerCore { - callbacks: LiveCallbacks, - resources: Mutex>, - signal_tx: watch::Sender, - started: AtomicBool, - closing: AtomicBool, - muted: AtomicBool, - failure_reported: AtomicBool, - queued_samples: AtomicUsize, -} - -impl LivePeerCore { - fn new(callbacks: LiveCallbacks) -> Self { - let (signal_tx, _) = watch::channel(PeerSignal::Connecting); - Self { - callbacks, - resources: Mutex::new(None), - signal_tx, - started: AtomicBool::new(false), - closing: AtomicBool::new(false), - muted: AtomicBool::new(false), - failure_reported: AtomicBool::new(false), - queued_samples: AtomicUsize::new(0), - } - } - - async fn create_offer(self: &Arc) -> NativeResult { - if self.started.swap(true, Ordering::AcqRel) { - return Err("Native live WebRTC peer has already started".to_owned()); - } - if self.closing.load(Ordering::Acquire) { - return Err("Native live WebRTC peer is closed".to_owned()); - } - - let playback = PlaybackStream::start(OUTPUT_SAMPLE_RATE)?; - let playback_tx = playback.writer()?; - let mut media_engine = MediaEngine::default(); - let capability = opus_capability(); - media_engine - .register_codec( - RTCRtpCodecParameters { - capability: capability.clone(), - payload_type: 111, - ..Default::default() - }, - RTPCodecType::Audio, - ) - .map_err(|error| format!("Failed to register the live Opus codec: {error}"))?; - let registry = register_default_interceptors(Registry::new(), &mut media_engine) - .map_err(|error| format!("Failed to configure live WebRTC interceptors: {error}"))?; - let api = APIBuilder::new() - .with_media_engine(media_engine) - .with_interceptor_registry(registry) - .build(); - let peer = Arc::new( - api.new_peer_connection(RTCConfiguration::default()) - .await - .map_err(|error| format!("Failed to create the live WebRTC peer: {error}"))?, - ); - - let track = Arc::new(TrackLocalStaticSample::new( - capability, - "audio".to_owned(), - "omp-live".to_owned(), - )); - let sender = match peer - .add_track(Arc::clone(&track) as Arc) - .await - { - Ok(sender) => sender, - Err(error) => { - let _ = peer.close().await; - return Err(format!("Failed to add the live audio track: {error}")); - }, - }; - - install_peer_callbacks(&peer, Arc::downgrade(self), playback_tx); - let data_channel = match peer.create_data_channel(DATA_CHANNEL_LABEL, None).await { - Ok(channel) => channel, - Err(error) => { - let _ = peer.close().await; - return Err(format!("Failed to create the live data channel: {error}")); - }, - }; - install_data_channel_callbacks(&data_channel, Arc::downgrade(self)); - - let offer = match peer.create_offer(None).await { - Ok(offer) => offer, - Err(error) => { - let _ = peer.close().await; - return Err(format!("Failed to create the live SDP offer: {error}")); - }, - }; - if let Err(error) = peer.set_local_description(offer.clone()).await { - let _ = peer.close().await; - return Err(format!("Failed to install the live SDP offer: {error}")); - } - let mut resources_slot = self.resources.lock(); - if self.closing.load(Ordering::Acquire) { - drop(resources_slot); - let _ = peer.close().await; - return Err("Native live WebRTC peer was closed while starting".to_owned()); - } - - let (input_tx, input_rx) = flume::unbounded(); - let input_task = tokio::spawn(run_input_audio(track, input_rx, Arc::downgrade(self))); - let rtcp_task = tokio::spawn(drain_rtcp(sender)); - let resources = - LiveResources { peer, data_channel, input_tx, input_task, rtcp_task, playback }; - *resources_slot = Some(resources); - Ok(offer.sdp) - } - - async fn accept_answer(&self, sdp: String) -> NativeResult<()> { - let peer = self - .resources - .lock() - .as_ref() - .map(|resources| Arc::clone(&resources.peer)) - .ok_or_else(|| "Native live WebRTC peer has not started".to_owned())?; - let answer = RTCSessionDescription::answer(sdp) - .map_err(|error| format!("Codex returned an invalid live SDP answer: {error}"))?; - peer - .set_remote_description(answer) - .await - .map_err(|error| format!("Failed to install the live SDP answer: {error}")) - } - - async fn wait_for_open(&self, timeout_ms: u32) -> NativeResult<()> { - let mut signal_rx = self.signal_tx.subscribe(); - let wait = async { - loop { - let signal = signal_rx.borrow().clone(); - match signal { - PeerSignal::Open => return Ok(()), - PeerSignal::Failed(message) => return Err(message), - PeerSignal::Closed => { - return Err("Native live WebRTC peer closed before opening".to_owned()); - }, - PeerSignal::Connecting => {}, - } - signal_rx - .changed() - .await - .map_err(|_| "Native live WebRTC peer stopped before opening".to_owned())?; - } - }; - tokio::time::timeout(Duration::from_millis(u64::from(timeout_ms)), wait) - .await - .map_err(|_| "Timed out waiting for the live data channel to open".to_owned())? - } - - fn push_audio(&self, samples: &[f32]) -> NativeResult<()> { - if samples.is_empty() || self.muted.load(Ordering::Acquire) { - return Ok(()); - } - let input_tx = self - .resources - .lock() - .as_ref() - .map(|resources| resources.input_tx.clone()) - .ok_or_else(|| "Native live WebRTC peer has not started".to_owned())?; - let sample_count = samples.len().min(MAX_QUEUED_INPUT_SAMPLES); - let retained = &samples[samples.len() - sample_count..]; - let queued = self - .queued_samples - .fetch_add(sample_count, Ordering::AcqRel); - if queued.saturating_add(sample_count) > MAX_QUEUED_INPUT_SAMPLES { - self - .queued_samples - .fetch_sub(sample_count, Ordering::AcqRel); - return Ok(()); - } - if input_tx - .send(InputCommand::Audio(retained.to_vec())) - .is_err() - { - self - .queued_samples - .fetch_sub(sample_count, Ordering::AcqRel); - return Err("Native live audio input is closed".to_owned()); - } - Ok(()) - } - - fn set_muted(&self, muted: bool) -> NativeResult<()> { - self.muted.store(muted, Ordering::Release); - let input_tx = self - .resources - .lock() - .as_ref() - .map(|resources| resources.input_tx.clone()); - if let Some(input_tx) = input_tx { - input_tx - .send(InputCommand::Muted(muted)) - .map_err(|_| "Native live audio input is closed".to_owned())?; - } - Ok(()) - } - - fn report_event(&self, payload: String) { - self - .callbacks - .event - .call(Ok(payload), ThreadsafeFunctionCallMode::NonBlocking); - } - - fn report_level(&self, level: f64) { - self - .callbacks - .level - .call(Ok(level.clamp(0.0, 1.0)), ThreadsafeFunctionCallMode::NonBlocking); - } - - fn mark_open(&self) { - if !self.closing.load(Ordering::Acquire) { - self.signal_tx.send_replace(PeerSignal::Open); - } - } - - fn report_failure(&self, message: String) { - if self.closing.load(Ordering::Acquire) || self.failure_reported.swap(true, Ordering::AcqRel) - { - return; - } - self - .signal_tx - .send_replace(PeerSignal::Failed(message.clone())); - self - .callbacks - .failure - .call(Ok(message), ThreadsafeFunctionCallMode::NonBlocking); - } - - async fn close(&self) { - if self.closing.swap(true, Ordering::AcqRel) { - let mut signal_rx = self.signal_tx.subscribe(); - while !matches!(*signal_rx.borrow(), PeerSignal::Closed) { - if signal_rx.changed().await.is_err() { - break; - } - } - return; - } - - let resources = self.resources.lock().take(); - if let Some(mut resources) = resources { - let _ = resources.input_tx.send(InputCommand::Close); - let _ = resources.peer.close().await; - let _ = resources.playback.stop(); - let _ = tokio::time::timeout(CLOSE_TASK_TIMEOUT, resources.input_task).await; - resources.rtcp_task.abort(); - let _ = resources.rtcp_task.await; - drop(resources.data_channel); - } - self.queued_samples.store(0, Ordering::Release); - self.signal_tx.send_replace(PeerSignal::Closed); - } -} /// WebRTC peer that accepts 16 kHz mono PCM and renders remote Opus audio. #[napi] @@ -381,9 +37,15 @@ impl LiveWebRtcPeer { ) -> Self { Self { inner: Arc::new(LivePeerCore::new(LiveCallbacks { - event: on_event, - level: on_level, - failure: on_failure, + event: Box::new(move |payload| { + on_event.call(Ok(payload), ThreadsafeFunctionCallMode::NonBlocking); + }), + level: Box::new(move |level| { + on_level.call(Ok(level), ThreadsafeFunctionCallMode::NonBlocking); + }), + failure: Box::new(move |message| { + on_failure.call(Ok(message), ThreadsafeFunctionCallMode::NonBlocking); + }), })), } } @@ -446,7 +108,7 @@ impl LiveWebRtcPeer { impl Drop for LiveWebRtcPeer { fn drop(&mut self) { - if self.inner.closing.load(Ordering::Acquire) { + if self.inner.is_closing() { return; } let inner = Arc::clone(&self.inner); @@ -457,345 +119,3 @@ impl Drop for LiveWebRtcPeer { } } } - -fn opus_capability() -> RTCRtpCodecCapability { - RTCRtpCodecCapability { - mime_type: MIME_TYPE_OPUS.to_owned(), - clock_rate: OPUS_CAPABILITY.clock_rate, - channels: OPUS_CAPABILITY.channels, - sdp_fmtp_line: "minptime=10;useinbandfec=1".to_owned(), - rtcp_feedback: Vec::new(), - } -} - -fn install_peer_callbacks( - peer: &Arc, - core: Weak, - playback_tx: PlaybackWriter, -) { - let output_sender = Arc::new(Mutex::new(Some(playback_tx))); - let output_sender_for_track = Arc::clone(&output_sender); - let core_for_track = core.clone(); - peer.on_track(Box::new(move |track, _receiver, _transceiver| { - let output_sender = output_sender_for_track.lock().take(); - let core = core_for_track.clone(); - Box::pin(async move { - if track.kind() != RTPCodecType::Audio { - return; - } - let Some(output_sender) = output_sender else { - if let Some(core) = core.upgrade() { - core.report_failure( - "Codex live returned more than one remote audio track".to_owned(), - ); - } - return; - }; - tokio::spawn(receive_output_audio(track, output_sender, core)); - }) - })); - - let peer_for_state = Arc::downgrade(peer); - peer.on_peer_connection_state_change(Box::new(move |state| { - let core = core.clone(); - let peer = peer_for_state.clone(); - Box::pin(async move { - let Some(core) = core.upgrade() else { - return; - }; - match state { - RTCPeerConnectionState::Failed => { - core.report_failure("Live WebRTC peer connection failed".to_owned()); - }, - RTCPeerConnectionState::Closed if !core.closing.load(Ordering::Acquire) => { - core.report_failure("Live WebRTC peer connection closed unexpectedly".to_owned()); - }, - RTCPeerConnectionState::Disconnected => { - tokio::time::sleep(DISCONNECT_GRACE).await; - if peer.upgrade().is_some_and(|peer| { - peer.connection_state() == RTCPeerConnectionState::Disconnected - }) { - core.report_failure("Live WebRTC peer connection disconnected".to_owned()); - } - }, - _ => {}, - } - }) - })); -} - -fn install_data_channel_callbacks(data_channel: &Arc, core: Weak) { - let core_for_open = core.clone(); - data_channel.on_open(Box::new(move || { - Box::pin(async move { - if let Some(core) = core_for_open.upgrade() { - core.mark_open(); - } - }) - })); - - let core_for_message = core.clone(); - data_channel.on_message(Box::new(move |message: DataChannelMessage| { - let core = core_for_message.clone(); - Box::pin(async move { - if !message.is_string { - return; - } - if let (Some(core), Ok(payload)) = - (core.upgrade(), String::from_utf8(message.data.to_vec())) - { - core.report_event(payload); - } - }) - })); - - let core_for_close = core.clone(); - data_channel.on_close(Box::new(move || { - let core = core_for_close.clone(); - Box::pin(async move { - if let Some(core) = core.upgrade() { - core.report_failure("Live data channel closed unexpectedly".to_owned()); - } - }) - })); - - data_channel.on_error(Box::new(move |error| { - let core = core.clone(); - Box::pin(async move { - if let Some(core) = core.upgrade() { - core.report_failure(format!("Live data channel failed: {error}")); - } - }) - })); -} - -async fn run_input_audio( - track: Arc, - input_rx: flume::Receiver, - core: Weak, -) { - let mut encoder = match Encoder::new(INPUT_SAMPLE_RATE, Channels::Mono, Application::Voip) { - Ok(encoder) => encoder, - Err(error) => { - if let Some(core) = core.upgrade() { - core.report_failure(format!("Failed to initialize the live Opus encoder: {error}")); - } - return; - }, - }; - if let Err(error) = encoder.set_inband_fec(true) { - if let Some(core) = core.upgrade() { - core.report_failure(format!("Failed to configure the live Opus encoder: {error}")); - } - return; - } - - let mut muted = false; - let mut pending = Vec::with_capacity(INPUT_FRAME_SAMPLES * 2); - let mut encoded = [0u8; MAX_ENCODED_OPUS_BYTES]; - let mut ticker = tokio::time::interval(INPUT_FRAME_DURATION); - ticker.set_missed_tick_behavior(tokio::time::MissedTickBehavior::Burst); - ticker.tick().await; - loop { - tokio::select! { - biased; - command = input_rx.recv_async() => { - let Ok(command) = command else { - break; - }; - match command { - InputCommand::Audio(samples) => { - if let Some(core) = core.upgrade() { - core.queued_samples.fetch_sub(samples.len(), Ordering::AcqRel); - } - if muted { - continue; - } - if samples.len() >= MAX_QUEUED_INPUT_SAMPLES { - pending.clear(); - pending.extend_from_slice(&samples[samples.len() - MAX_QUEUED_INPUT_SAMPLES..]); - continue; - } - let overflow = pending - .len() - .saturating_add(samples.len()) - .saturating_sub(MAX_QUEUED_INPUT_SAMPLES); - if overflow > 0 { - pending.drain(..overflow); - } - pending.extend_from_slice(&samples); - }, - InputCommand::Muted(next_muted) => { - muted = next_muted; - pending.clear(); - }, - InputCommand::Close => break, - } - }, - _ = ticker.tick() => { - let mut frame = [0.0f32; INPUT_FRAME_SAMPLES]; - if !muted { - let consumed = pending.len().min(INPUT_FRAME_SAMPLES); - frame[..consumed].copy_from_slice(&pending[..consumed]); - if consumed > 0 { - pending.copy_within(consumed.., 0); - pending.truncate(pending.len() - consumed); - } - } - let encoded_len = match encoder.encode_float(&frame, &mut encoded) { - Ok(encoded_len) => encoded_len, - Err(error) => { - if let Some(core) = core.upgrade() { - core.report_failure(format!("Failed to encode live microphone audio: {error}")); - } - return; - }, - }; - let sample = Sample { - data: Bytes::copy_from_slice(&encoded[..encoded_len]), - duration: INPUT_FRAME_DURATION, - ..Default::default() - }; - if let Err(error) = track.write_sample(&sample).await { - if let Some(core) = core.upgrade() { - core.report_failure(format!("Failed to send live microphone audio: {error}")); - } - return; - } - }, - } - } -} - -async fn drain_rtcp(sender: Arc) { - while sender.read_rtcp().await.is_ok() {} -} - -async fn receive_output_audio( - track: Arc, - playback_tx: PlaybackWriter, - core: Weak, -) { - if !track - .codec() - .capability - .mime_type - .eq_ignore_ascii_case(MIME_TYPE_OPUS) - { - if let Some(core) = core.upgrade() { - core.report_failure(format!( - "Codex live negotiated unsupported audio codec {}", - track.codec().capability.mime_type - )); - } - return; - } - let mut decoder = match Decoder::new(OUTPUT_SAMPLE_RATE, Channels::Mono) { - Ok(decoder) => decoder, - Err(error) => { - if let Some(core) = core.upgrade() { - core.report_failure(format!("Failed to initialize the live Opus decoder: {error}")); - } - return; - }, - }; - let mut decoded = vec![0.0f32; MAX_DECODED_OPUS_SAMPLES].into_boxed_slice(); - let mut expected_sequence: Option = None; - let mut level = OutputLevel::default(); - - loop { - let packet = match track.read_rtp().await { - Ok((packet, _attributes)) => packet, - Err(error) => { - if let Some(core) = core.upgrade() - && !core.closing.load(Ordering::Acquire) - { - core.report_failure(format!("Live remote audio track failed: {error}")); - } - return; - }, - }; - let sequence = packet.header.sequence_number; - if let Some(expected) = expected_sequence { - let gap = sequence.wrapping_sub(expected); - if gap >= u16::MAX / 2 { - continue; - } - if gap > 0 { - for _ in 1..gap.min(5) { - if let Ok(samples) = - decoder.decode_float(&[], &mut decoded[..OUTPUT_FRAME_SAMPLES], false) - { - if !write_output(&playback_tx, &decoded[..samples], &core) { - return; - } - level.observe(&decoded[..samples], &core); - } - } - if let Ok(samples) = decoder.decode_float(&packet.payload, &mut decoded, true) { - if !write_output(&playback_tx, &decoded[..samples], &core) { - return; - } - level.observe(&decoded[..samples], &core); - } - } - } - expected_sequence = Some(sequence.wrapping_add(1)); - match decoder.decode_float(&packet.payload, &mut decoded, false) { - Ok(samples) => { - if !write_output(&playback_tx, &decoded[..samples], &core) { - return; - } - level.observe(&decoded[..samples], &core); - }, - Err(error) => { - if let Some(core) = core.upgrade() { - core.report_failure(format!("Failed to decode live speaker audio: {error}")); - } - return; - }, - } - } -} - -fn write_output(playback_tx: &PlaybackWriter, samples: &[f32], core: &Weak) -> bool { - match playback_tx.write(samples) { - Ok(()) => true, - Err(error) => { - if let Some(core) = core.upgrade() - && !core.closing.load(Ordering::Acquire) - { - core.report_failure(format!("Live speaker playback failed: {error}")); - } - false - }, - } -} - -#[derive(Default)] -struct OutputLevel { - sum_squares: f64, - samples: usize, -} - -impl OutputLevel { - fn observe(&mut self, decoded: &[f32], core: &Weak) { - let mut offset = 0; - while offset < decoded.len() { - let take = (OUTPUT_LEVEL_SAMPLES - self.samples).min(decoded.len() - offset); - for &sample in &decoded[offset..offset + take] { - let sample = f64::from(sample); - self.sum_squares = sample.mul_add(sample, self.sum_squares); - } - self.samples += take; - offset += take; - if self.samples == OUTPUT_LEVEL_SAMPLES { - if let Some(core) = core.upgrade() { - core.report_level((self.sum_squares / self.samples as f64).sqrt()); - } - self.sum_squares = 0.0; - self.samples = 0; - } - } - } -} diff --git a/crates/pi-voice/BUILD.bazel b/crates/pi-voice/BUILD.bazel new file mode 100644 index 000000000..0e45353d2 --- /dev/null +++ b/crates/pi-voice/BUILD.bazel @@ -0,0 +1,29 @@ +load("@crates//:defs.bzl", "aliases", "all_crate_deps") +load("@rules_rust//rust:defs.bzl", "rust_library", "rust_test") + +package(default_visibility = ["//visibility:public"]) + +exports_files(["Cargo.toml"]) + +# napi-free voice engine (miniaudio capture/playback + WebRTC/Opus live peer). +# Keeping the webrtc/opus/maudio graph behind this rlib means the pi_natives +# leaf — which recompiles on every release (version-sentinel edit in lib.rs) — +# no longer pays for the voice stack's monomorphization. +rust_library( + name = "pi-voice", + srcs = glob(["src/**/*.rs"]), + aliases = aliases(), + crate_name = "pi_voice", + edition = "2024", + proc_macro_deps = all_crate_deps(proc_macro = True), + version = "17.1.5", + deps = all_crate_deps(normal = True), +) + +rust_test( + name = "pi-voice_test", + crate = ":pi-voice", + edition = "2024", + proc_macro_deps = all_crate_deps(proc_macro_dev = True), + deps = all_crate_deps(normal_dev = True), +) diff --git a/crates/pi-voice/Cargo.toml b/crates/pi-voice/Cargo.toml new file mode 100644 index 000000000..9decd2a62 --- /dev/null +++ b/crates/pi-voice/Cargo.toml @@ -0,0 +1,33 @@ +[package] +name = "pi-voice" +version.workspace = true +edition.workspace = true +license.workspace = true +authors.workspace = true +repository.workspace = true + +[lints] +workspace = true + +[dependencies] +# Forces the static libopus build for the `opus` codec crate. +audiopus_sys.workspace = true +bytes.workspace = true +flume.workspace = true +maudio.workspace = true +opus.workspace = true +parking_lot.workspace = true +tokio.workspace = true +webrtc.workspace = true + +[target.'cfg(target_os = "macos")'.dependencies] +# Regenerate miniaudio FFI bindings from the compiled headers on macOS only. +# The maudio-sys pregenerated `unix.rs` bindings are Linux-shaped: their +# `ma_device`/`ma_context` backend-state unions omit the `#ifdef +# MA_SUPPORT_COREAUDIO` members that the macOS build of miniaudio.c actually +# contains, so shipping them on darwin is an ABI mismatch that silently breaks +# CoreAudio capture (device init/start succeed but no render callbacks fire). +# darwin builds with host Xcode (libclang available), so bindgen is fine here; +# the hermetic zig/musl/windows toolchains keep the bindgen-free pregen path, +# whose bindings are correct for those platforms. +maudio = { workspace = true, features = ["generate-bindings"] } diff --git a/crates/pi-voice/src/audio.rs b/crates/pi-voice/src/audio.rs new file mode 100644 index 000000000..abd025b6f --- /dev/null +++ b/crates/pi-voice/src/audio.rs @@ -0,0 +1,400 @@ +//! Cross-platform microphone capture and streaming speaker playback. +//! +//! miniaudio owns platform device discovery, format conversion, channel mixing, +//! and resampling. The engine exposes one stable mono `f32` contract: the +//! N-API classes in pi-natives adapt it to TypeScript, and [`crate::live`] +//! shares [`PlaybackStream`] for remote-audio rendering. + +use std::sync::{ + Arc, + atomic::{AtomicBool, AtomicU32, Ordering}, +}; + +use flume::TryRecvError; +use maudio::{ + audio::{performance::PerformanceProfile, sample_rate::SampleRate}, + backend::Backend, + device::{ + Device, + device_builder::{DeviceBuilder, DeviceBuilderOps}, + }, +}; +use tokio::sync::Notify; + +use crate::VoiceResult; + +const AUDIO_CHANNELS: u32 = 1; +// PulseAudio TCP playback stutters with a 20 ms target buffer; 50 ms absorbs +// transport jitter while preserving interactive latency. +#[cfg(target_os = "linux")] +const PLAYBACK_PERIOD_MS: u32 = 50; +#[cfg(not(target_os = "linux"))] +const PLAYBACK_PERIOD_MS: u32 = 20; +// miniaudio's PulseAudio backend reserves three periods. Android's OpenSL ES +// source emits 125 ms fragments, so Linux capture needs at least 150 ms queued. +#[cfg(target_os = "linux")] +const CAPTURE_PERIOD_MS: u32 = 50; +#[cfg(not(target_os = "linux"))] +const CAPTURE_PERIOD_MS: u32 = 20; +// PulseAudio can retain its default three periods after the producer closes. +// Wait for all of them before stopping the device so the tail reaches the sink. +#[cfg(target_os = "linux")] +const PLAYBACK_DRAIN_CALLBACKS: usize = 3; +#[cfg(not(target_os = "linux"))] +const PLAYBACK_DRAIN_CALLBACKS: usize = 2; + +#[cfg(target_os = "macos")] +const AUDIO_BACKENDS: &[Backend] = &[Backend::CoreAudio]; +#[cfg(target_os = "windows")] +const AUDIO_BACKENDS: &[Backend] = &[Backend::Wasapi]; +#[cfg(target_os = "linux")] +const AUDIO_BACKENDS: &[Backend] = &[Backend::PulseAudio, Backend::Alsa, Backend::Jack]; +#[cfg(not(any(target_os = "macos", target_os = "windows", target_os = "linux")))] +const AUDIO_BACKENDS: &[Backend] = &[Backend::Sndio, Backend::Audio4, Backend::Oss]; + +/// Shared render-time state for one playback device: gain, drain, stop. +/// +/// Held as an `Arc` by both the stream and its N-API wrapper so +/// [`PlaybackState::wait_for_drain`] can outlive the stream lock. +pub struct PlaybackState { + gain_bits: AtomicU32, + drained: AtomicBool, + stopped: AtomicBool, + notify: Notify, +} + +impl PlaybackState { + fn new() -> Self { + Self { + gain_bits: AtomicU32::new(1.0f32.to_bits()), + drained: AtomicBool::new(false), + stopped: AtomicBool::new(false), + notify: Notify::new(), + } + } + + fn gain(&self) -> f32 { + f32::from_bits(self.gain_bits.load(Ordering::Acquire)) + } + + fn set_gain(&self, gain: f32) { + self.gain_bits.store(gain.to_bits(), Ordering::Release); + } + + fn mark_drained(&self) { + if !self.drained.swap(true, Ordering::AcqRel) { + self.notify.notify_waiters(); + } + } + + fn mark_stopped(&self) { + self.stopped.store(true, Ordering::Release); + self.notify.notify_waiters(); + } + + /// Resolve once every queued sample reached the speaker (or the stream + /// stopped). Used by the N-API `AudioPlayback.end()` graceful-close path. + pub async fn wait_for_drain(&self) { + loop { + let notified = self.notify.notified(); + if self.drained.load(Ordering::Acquire) || self.stopped.load(Ordering::Acquire) { + return; + } + notified.await; + } + } +} + +/// Producer endpoint for one native playback device. Cloned into the WebRTC +/// remote-audio decoder so it can feed the same speaker stream. +#[derive(Clone)] +pub struct PlaybackWriter { + tx: flume::Sender>, + state: Arc, +} + +impl PlaybackWriter { + /// Queue mono floating-point samples without blocking the caller. + pub fn write(&self, samples: &[f32]) -> VoiceResult<()> { + if samples.is_empty() { + return Ok(()); + } + if self.state.stopped.load(Ordering::Acquire) || self.state.drained.load(Ordering::Acquire) { + return Err("Native audio playback is closed".to_owned()); + } + self + .tx + .send(samples.to_vec()) + .map_err(|_| "Native audio playback is closed".to_owned()) + } +} + +/// Running mono playback stream shared by N-API playback and native WebRTC. +pub struct PlaybackStream { + device: Option>, + writer: Option, + state: Arc, +} + +impl PlaybackStream { + /// Open and start the default speaker at the requested logical sample rate. + pub fn start(sample_rate: u32) -> VoiceResult { + let sample_rate = audio_sample_rate(sample_rate)?; + let state = Arc::new(PlaybackState::new()); + let (tx, rx) = flume::unbounded::>(); + let callback_state = Arc::clone(&state); + let mut current = Vec::new(); + let mut cursor = 0; + let mut empty_callbacks = 0; + let mut builder = DeviceBuilder::playback().f32(); + builder + .sample_rate(sample_rate) + .playback_channels(AUDIO_CHANNELS) + .period_size_millis(PLAYBACK_PERIOD_MS) + .performance_profile(PerformanceProfile::LowLatency) + .backends(AUDIO_BACKENDS); + let mut device = builder + .with_callback(move |_device, output| { + fill_playback( + &rx, + &mut current, + &mut cursor, + output, + &callback_state, + &mut empty_callbacks, + ); + }) + .map_err(|error| format!("Failed to open the default speaker: {error}"))?; + device + .device_start() + .map_err(|error| format!("Failed to start speaker playback: {error}"))?; + + Ok(Self { + device: Some(device), + writer: Some(PlaybackWriter { tx, state: Arc::clone(&state) }), + state, + }) + } + + /// Clone the producer endpoint used by the remote-audio decoder. + pub fn writer(&self) -> VoiceResult { + self + .writer + .clone() + .ok_or_else(|| "Native audio playback is closed".to_owned()) + } + + /// Shared render-time state, cloned out so callers can await drain after + /// releasing the stream lock. + pub fn state(&self) -> Arc { + Arc::clone(&self.state) + } + + /// Close the producer side so the render callback can detect drain. + pub fn finish_input(&mut self) { + self.writer.take(); + } + + /// Scale audio at render time so gain changes affect already queued + /// samples. Rejects non-finite gains; negative gains clamp to silence. + pub fn set_gain(&self, gain: f32) -> VoiceResult<()> { + if !gain.is_finite() { + return Err("Audio playback gain must be finite".to_owned()); + } + self.state.set_gain(gain.max(0.0)); + Ok(()) + } + + /// Stop playback immediately and release the default speaker. + pub fn stop(&mut self) -> VoiceResult<()> { + self.writer.take(); + self.state.mark_stopped(); + let Some(mut device) = self.device.take() else { + return Ok(()); + }; + device + .device_stop() + .map_err(|error| format!("Failed to stop speaker playback: {error}")) + } +} + +impl Drop for PlaybackStream { + fn drop(&mut self) { + let _ = self.stop(); + } +} + +fn audio_sample_rate(sample_rate: u32) -> VoiceResult { + SampleRate::try_from(sample_rate) + .map_err(|error| format!("Unsupported audio sample rate {sample_rate}: {error}")) +} + +fn fill_playback( + rx: &flume::Receiver>, + current: &mut Vec, + cursor: &mut usize, + output: &mut [f32], + state: &PlaybackState, + empty_callbacks: &mut usize, +) { + output.fill(0.0); + if state.stopped.load(Ordering::Acquire) { + return; + } + + let gain = state.gain(); + let mut output_offset = 0; + while output_offset < output.len() { + if *cursor == current.len() { + match rx.try_recv() { + Ok(next) => { + *current = next; + *cursor = 0; + *empty_callbacks = 0; + }, + Err(TryRecvError::Empty) => { + *empty_callbacks = 0; + break; + }, + Err(TryRecvError::Disconnected) => { + *empty_callbacks += 1; + if *empty_callbacks >= PLAYBACK_DRAIN_CALLBACKS { + state.mark_drained(); + } + break; + }, + } + } + + let count = (current.len() - *cursor).min(output.len() - output_offset); + let source = ¤t[*cursor..*cursor + count]; + let destination = &mut output[output_offset..output_offset + count]; + if gain == 1.0 { + destination.copy_from_slice(source); + } else { + for (destination, source) in destination.iter_mut().zip(source) { + *destination = *source * gain; + } + } + *cursor += count; + output_offset += count; + } +} + +/// Running default-microphone capture delivering low-latency mono `f32` +/// chunks to its callback. Wraps the miniaudio device so N-API callers never +/// see maudio types. +pub struct CaptureStream { + device: Option>, +} + +impl CaptureStream { + /// Open the default microphone at the requested sample rate. `on_audio` + /// runs on the realtime audio thread — it must not block. + pub fn start(sample_rate: u32, mut on_audio: C) -> VoiceResult + where + C: FnMut(&[f32]) + Send + 'static, + { + let sample_rate = audio_sample_rate(sample_rate)?; + let mut builder = DeviceBuilder::capture().f32(); + builder + .sample_rate(sample_rate) + .capture_channels(AUDIO_CHANNELS) + .period_size_millis(CAPTURE_PERIOD_MS) + .performance_profile(PerformanceProfile::LowLatency) + .backends(AUDIO_BACKENDS); + let mut device = builder + .with_callback(move |_device, samples| { + if !samples.is_empty() { + on_audio(samples); + } + }) + .map_err(|error| format!("Failed to open the default microphone: {error}"))?; + device + .device_start() + .map_err(|error| format!("Failed to start microphone capture: {error}"))?; + Ok(Self { device: Some(device) }) + } + + /// Stop capture immediately and release the microphone. + pub fn stop(&mut self) -> VoiceResult<()> { + let Some(mut device) = self.device.take() else { + return Ok(()); + }; + device + .device_stop() + .map_err(|error| format!("Failed to stop microphone capture: {error}")) + } +} + +impl Drop for CaptureStream { + fn drop(&mut self) { + let _ = self.stop(); + } +} + +#[cfg(test)] +mod tests { + use std::{ + env, + mem::forget, + sync::atomic::AtomicUsize, + thread::sleep, + time::{Duration, Instant}, + }; + + use super::*; + + #[test] + fn playback_preserves_chunk_order_and_applies_render_gain() { + let state = PlaybackState::new(); + state.set_gain(0.5); + let (tx, rx) = flume::unbounded(); + tx.send(vec![1.0, -1.0]).expect("receiver is live"); + tx.send(vec![0.5, -0.5]).expect("receiver is live"); + drop(tx); + let mut current = Vec::new(); + let mut cursor = 0; + let mut empty_callbacks = 0; + let mut output = [9.0; 5]; + + fill_playback(&rx, &mut current, &mut cursor, &mut output, &state, &mut empty_callbacks); + + assert_eq!(output, [0.5, -0.5, 0.25, -0.25, 0.0]); + assert!(!state.drained.load(Ordering::Acquire)); + let mut silence = [1.0; 2]; + while empty_callbacks < PLAYBACK_DRAIN_CALLBACKS { + silence.fill(1.0); + fill_playback(&rx, &mut current, &mut cursor, &mut silence, &state, &mut empty_callbacks); + assert_eq!(silence, [0.0, 0.0]); + assert_eq!( + state.drained.load(Ordering::Acquire), + empty_callbacks >= PLAYBACK_DRAIN_CALLBACKS + ); + } + } + + #[test] + fn opt_in_default_capture_receives_frames() { + if env::var_os("OMP_NATIVE_AUDIO_CAPTURE_TEST").is_none() { + return; + } + + let callbacks = Arc::new(AtomicUsize::new(0)); + let callback_count = Arc::clone(&callbacks); + let mut stream = CaptureStream::start(16_000, move |_samples| { + callback_count.fetch_add(1, Ordering::Relaxed); + }) + .expect("default capture device starts"); + + let deadline = Instant::now() + Duration::from_secs(5); + while callbacks.load(Ordering::Relaxed) == 0 && Instant::now() < deadline { + sleep(Duration::from_millis(20)); + } + if callbacks.load(Ordering::Relaxed) == 0 { + forget(stream); + panic!("capture device started but delivered no frames within five seconds"); + } + stream.stop().expect("capture device stops"); + } +} diff --git a/crates/pi-voice/src/lib.rs b/crates/pi-voice/src/lib.rs new file mode 100644 index 000000000..1366b786e --- /dev/null +++ b/crates/pi-voice/src/lib.rs @@ -0,0 +1,26 @@ +//! Native voice engine: microphone capture, speaker playback, and the WebRTC +//! live-conversation peer. +//! +//! napi-free by design. `pi-natives` wraps these types in thin `#[napi]` +//! adapters, so the webrtc/opus/miniaudio dependency graph compiles once into +//! this rlib and rebuilds only when voice code changes — never when the +//! N-API surface elsewhere in the addon does. +//! +//! # Architecture +//! ```text +//! JS (packages/natives) -> #[napi] adapters (pi-natives audio.rs / live.rs) +//! -> pi_voice::audio (miniaudio capture/playback engine) +//! -> pi_voice::live (WebRTC peer + Opus media, feeds audio playback) +//! ``` +//! +//! Async entry points ([`live::LivePeerCore::create_offer`] and friends) run +//! on the caller's ambient tokio runtime — napi-rs's `tokio_rt` inside the +//! addon. Callback fields ([`live::LiveCallbacks`]) are invoked from tokio +//! worker threads and must not block. + +pub mod audio; +pub mod live; + +/// Engine-level result: a human-readable failure message the N-API layer maps +/// to a JS error verbatim. +pub type VoiceResult = std::result::Result; diff --git a/crates/pi-voice/src/live.rs b/crates/pi-voice/src/live.rs new file mode 100644 index 000000000..3e2da3a96 --- /dev/null +++ b/crates/pi-voice/src/live.rs @@ -0,0 +1,722 @@ +//! Native WebRTC media transport for Codex live conversations. +//! +//! The TypeScript host owns authenticated signaling and the sideband protocol; +//! this module owns the realtime WebRTC peer, Opus media, and speaker +//! playback. The N-API class in pi-natives is a thin adapter over +//! [`LivePeerCore`]. + +use std::{ + sync::{ + Arc, Weak, + atomic::{AtomicBool, AtomicUsize, Ordering}, + }, + time::Duration, +}; + +use bytes::Bytes; +use opus::{Application, Channels, Decoder, Encoder}; +use parking_lot::Mutex; +use tokio::{sync::watch, task::JoinHandle}; +use webrtc::{ + api::{ + APIBuilder, + interceptor_registry::register_default_interceptors, + media_engine::{MIME_TYPE_OPUS, MediaEngine}, + }, + data_channel::{RTCDataChannel, data_channel_message::DataChannelMessage}, + interceptor::registry::Registry, + media::Sample, + peer_connection::{ + RTCPeerConnection, configuration::RTCConfiguration, + peer_connection_state::RTCPeerConnectionState, + sdp::session_description::RTCSessionDescription, + }, + rtp_transceiver::{ + rtp_codec::{RTCRtpCodecCapability, RTCRtpCodecParameters, RTPCodecType}, + rtp_sender::RTCRtpSender, + }, + track::{ + track_local::{TrackLocal, track_local_static_sample::TrackLocalStaticSample}, + track_remote::TrackRemote, + }, +}; + +use crate::{ + VoiceResult, + audio::{PlaybackStream, PlaybackWriter}, +}; + +const DATA_CHANNEL_LABEL: &str = "oai-events"; +const INPUT_SAMPLE_RATE: u32 = 16_000; +const INPUT_FRAME_SAMPLES: usize = 320; +const INPUT_FRAME_DURATION: Duration = Duration::from_millis(20); +const MAX_ENCODED_OPUS_BYTES: usize = 1_275; +const MAX_QUEUED_INPUT_SAMPLES: usize = 32_000; +const OUTPUT_SAMPLE_RATE: u32 = 48_000; +const MAX_DECODED_OPUS_SAMPLES: usize = 5_760; +const OUTPUT_LEVEL_SAMPLES: usize = 2_400; +const OUTPUT_FRAME_SAMPLES: usize = 960; +/// Default `wait_for_open` timeout, exposed so the N-API adapter can apply it +/// when TypeScript passes no override. +pub const DEFAULT_OPEN_TIMEOUT_MS: u32 = 20_000; +const DISCONNECT_GRACE: Duration = Duration::from_secs(2); +const CLOSE_TASK_TIMEOUT: Duration = Duration::from_secs(1); + +const OPUS_CAPABILITY: RTCRtpCodecCapability = RTCRtpCodecCapability { + mime_type: String::new(), + clock_rate: OUTPUT_SAMPLE_RATE, + channels: 2, + sdp_fmtp_line: String::new(), + rtcp_feedback: Vec::new(), +}; + +#[derive(Clone, Debug)] +enum PeerSignal { + Connecting, + Open, + Failed(String), + Closed, +} + +enum InputCommand { + Audio(Vec), + Muted(bool), + Close, +} + +/// Host callbacks for peer lifecycle and media events. Every callback is +/// invoked from tokio worker threads and must not block (the N-API adapter +/// forwards through non-blocking threadsafe functions). +pub struct LiveCallbacks { + /// One `oai-events` data-channel text payload. + pub event: Box, + /// RMS output level in `[0, 1]`, one report per level window. + pub level: Box, + /// Terminal transport failure; reported at most once per peer. + pub failure: Box, +} + +struct LiveResources { + peer: Arc, + data_channel: Arc, + input_tx: flume::Sender, + input_task: JoinHandle<()>, + rtcp_task: JoinHandle<()>, + playback: PlaybackStream, +} + +/// WebRTC live-conversation peer: accepts 16 kHz mono PCM input and renders +/// remote Opus audio to the default speaker. Owned as an `Arc` by the N-API +/// `LiveWebRtcPeer` wrapper. +pub struct LivePeerCore { + callbacks: LiveCallbacks, + resources: Mutex>, + signal_tx: watch::Sender, + started: AtomicBool, + closing: AtomicBool, + muted: AtomicBool, + failure_reported: AtomicBool, + queued_samples: AtomicUsize, +} + +impl LivePeerCore { + /// Create an idle peer with its host callbacks registered. + pub fn new(callbacks: LiveCallbacks) -> Self { + let (signal_tx, _) = watch::channel(PeerSignal::Connecting); + Self { + callbacks, + resources: Mutex::new(None), + signal_tx, + started: AtomicBool::new(false), + closing: AtomicBool::new(false), + muted: AtomicBool::new(false), + failure_reported: AtomicBool::new(false), + queued_samples: AtomicUsize::new(0), + } + } + + /// Start the native media peer and return its SDP offer. + /// + /// Fails when called twice, after close, or when the speaker, codec, + /// peer, track, or data channel cannot be set up. + pub async fn create_offer(self: &Arc) -> VoiceResult { + if self.started.swap(true, Ordering::AcqRel) { + return Err("Native live WebRTC peer has already started".to_owned()); + } + if self.closing.load(Ordering::Acquire) { + return Err("Native live WebRTC peer is closed".to_owned()); + } + + let playback = PlaybackStream::start(OUTPUT_SAMPLE_RATE)?; + let playback_tx = playback.writer()?; + let mut media_engine = MediaEngine::default(); + let capability = opus_capability(); + media_engine + .register_codec( + RTCRtpCodecParameters { + capability: capability.clone(), + payload_type: 111, + ..Default::default() + }, + RTPCodecType::Audio, + ) + .map_err(|error| format!("Failed to register the live Opus codec: {error}"))?; + let registry = register_default_interceptors(Registry::new(), &mut media_engine) + .map_err(|error| format!("Failed to configure live WebRTC interceptors: {error}"))?; + let api = APIBuilder::new() + .with_media_engine(media_engine) + .with_interceptor_registry(registry) + .build(); + let peer = Arc::new( + api.new_peer_connection(RTCConfiguration::default()) + .await + .map_err(|error| format!("Failed to create the live WebRTC peer: {error}"))?, + ); + + let track = Arc::new(TrackLocalStaticSample::new( + capability, + "audio".to_owned(), + "omp-live".to_owned(), + )); + let sender = match peer + .add_track(Arc::clone(&track) as Arc) + .await + { + Ok(sender) => sender, + Err(error) => { + let _ = peer.close().await; + return Err(format!("Failed to add the live audio track: {error}")); + }, + }; + + install_peer_callbacks(&peer, Arc::downgrade(self), playback_tx); + let data_channel = match peer.create_data_channel(DATA_CHANNEL_LABEL, None).await { + Ok(channel) => channel, + Err(error) => { + let _ = peer.close().await; + return Err(format!("Failed to create the live data channel: {error}")); + }, + }; + install_data_channel_callbacks(&data_channel, Arc::downgrade(self)); + + let offer = match peer.create_offer(None).await { + Ok(offer) => offer, + Err(error) => { + let _ = peer.close().await; + return Err(format!("Failed to create the live SDP offer: {error}")); + }, + }; + if let Err(error) = peer.set_local_description(offer.clone()).await { + let _ = peer.close().await; + return Err(format!("Failed to install the live SDP offer: {error}")); + } + let mut resources_slot = self.resources.lock(); + if self.closing.load(Ordering::Acquire) { + drop(resources_slot); + let _ = peer.close().await; + return Err("Native live WebRTC peer was closed while starting".to_owned()); + } + + let (input_tx, input_rx) = flume::unbounded(); + let input_task = tokio::spawn(run_input_audio(track, input_rx, Arc::downgrade(self))); + let rtcp_task = tokio::spawn(drain_rtcp(sender)); + let resources = + LiveResources { peer, data_channel, input_tx, input_task, rtcp_task, playback }; + *resources_slot = Some(resources); + Ok(offer.sdp) + } + + /// Apply the remote SDP answer returned by Codex signaling. + pub async fn accept_answer(&self, sdp: String) -> VoiceResult<()> { + let peer = self + .resources + .lock() + .as_ref() + .map(|resources| Arc::clone(&resources.peer)) + .ok_or_else(|| "Native live WebRTC peer has not started".to_owned())?; + let answer = RTCSessionDescription::answer(sdp) + .map_err(|error| format!("Codex returned an invalid live SDP answer: {error}"))?; + peer + .set_remote_description(answer) + .await + .map_err(|error| format!("Failed to install the live SDP answer: {error}")) + } + + /// Wait until the `oai-events` data channel is open, failing on peer + /// failure, close, or timeout. + pub async fn wait_for_open(&self, timeout_ms: u32) -> VoiceResult<()> { + let mut signal_rx = self.signal_tx.subscribe(); + let wait = async { + loop { + let signal = signal_rx.borrow().clone(); + match signal { + PeerSignal::Open => return Ok(()), + PeerSignal::Failed(message) => return Err(message), + PeerSignal::Closed => { + return Err("Native live WebRTC peer closed before opening".to_owned()); + }, + PeerSignal::Connecting => {}, + } + signal_rx + .changed() + .await + .map_err(|_| "Native live WebRTC peer stopped before opening".to_owned())?; + } + }; + tokio::time::timeout(Duration::from_millis(u64::from(timeout_ms)), wait) + .await + .map_err(|_| "Timed out waiting for the live data channel to open".to_owned())? + } + + /// Queue 16 kHz mono PCM for Opus transmission. Silently drops audio while + /// muted or when the bounded input queue is full. + pub fn push_audio(&self, samples: &[f32]) -> VoiceResult<()> { + if samples.is_empty() || self.muted.load(Ordering::Acquire) { + return Ok(()); + } + let input_tx = self + .resources + .lock() + .as_ref() + .map(|resources| resources.input_tx.clone()) + .ok_or_else(|| "Native live WebRTC peer has not started".to_owned())?; + let sample_count = samples.len().min(MAX_QUEUED_INPUT_SAMPLES); + let retained = &samples[samples.len() - sample_count..]; + let queued = self + .queued_samples + .fetch_add(sample_count, Ordering::AcqRel); + if queued.saturating_add(sample_count) > MAX_QUEUED_INPUT_SAMPLES { + self + .queued_samples + .fetch_sub(sample_count, Ordering::AcqRel); + return Ok(()); + } + if input_tx + .send(InputCommand::Audio(retained.to_vec())) + .is_err() + { + self + .queued_samples + .fetch_sub(sample_count, Ordering::AcqRel); + return Err("Native live audio input is closed".to_owned()); + } + Ok(()) + } + + /// Enable or disable microphone transmission, discarding partial muted + /// frames. + pub fn set_muted(&self, muted: bool) -> VoiceResult<()> { + self.muted.store(muted, Ordering::Release); + let input_tx = self + .resources + .lock() + .as_ref() + .map(|resources| resources.input_tx.clone()); + if let Some(input_tx) = input_tx { + input_tx + .send(InputCommand::Muted(muted)) + .map_err(|_| "Native live audio input is closed".to_owned())?; + } + Ok(()) + } + + /// Whether close has begun; lets the adapter's `Drop` skip spawning a + /// redundant close task. + pub fn is_closing(&self) -> bool { + self.closing.load(Ordering::Acquire) + } + + fn report_event(&self, payload: String) { + (self.callbacks.event)(payload); + } + + fn report_level(&self, level: f64) { + (self.callbacks.level)(level.clamp(0.0, 1.0)); + } + + fn mark_open(&self) { + if !self.closing.load(Ordering::Acquire) { + self.signal_tx.send_replace(PeerSignal::Open); + } + } + + fn report_failure(&self, message: String) { + if self.closing.load(Ordering::Acquire) || self.failure_reported.swap(true, Ordering::AcqRel) + { + return; + } + self + .signal_tx + .send_replace(PeerSignal::Failed(message.clone())); + (self.callbacks.failure)(message); + } + + /// Close media, the data channel, the peer connection, and speaker + /// playback. Concurrent calls wait for the first closer to finish. + pub async fn close(&self) { + if self.closing.swap(true, Ordering::AcqRel) { + let mut signal_rx = self.signal_tx.subscribe(); + while !matches!(*signal_rx.borrow(), PeerSignal::Closed) { + if signal_rx.changed().await.is_err() { + break; + } + } + return; + } + + let resources = self.resources.lock().take(); + if let Some(mut resources) = resources { + let _ = resources.input_tx.send(InputCommand::Close); + let _ = resources.peer.close().await; + let _ = resources.playback.stop(); + let _ = tokio::time::timeout(CLOSE_TASK_TIMEOUT, resources.input_task).await; + resources.rtcp_task.abort(); + let _ = resources.rtcp_task.await; + drop(resources.data_channel); + } + self.queued_samples.store(0, Ordering::Release); + self.signal_tx.send_replace(PeerSignal::Closed); + } +} + +fn opus_capability() -> RTCRtpCodecCapability { + RTCRtpCodecCapability { + mime_type: MIME_TYPE_OPUS.to_owned(), + clock_rate: OPUS_CAPABILITY.clock_rate, + channels: OPUS_CAPABILITY.channels, + sdp_fmtp_line: "minptime=10;useinbandfec=1".to_owned(), + rtcp_feedback: Vec::new(), + } +} + +fn install_peer_callbacks( + peer: &Arc, + core: Weak, + playback_tx: PlaybackWriter, +) { + let output_sender = Arc::new(Mutex::new(Some(playback_tx))); + let output_sender_for_track = Arc::clone(&output_sender); + let core_for_track = core.clone(); + peer.on_track(Box::new(move |track, _receiver, _transceiver| { + let output_sender = output_sender_for_track.lock().take(); + let core = core_for_track.clone(); + Box::pin(async move { + if track.kind() != RTPCodecType::Audio { + return; + } + let Some(output_sender) = output_sender else { + if let Some(core) = core.upgrade() { + core.report_failure( + "Codex live returned more than one remote audio track".to_owned(), + ); + } + return; + }; + tokio::spawn(receive_output_audio(track, output_sender, core)); + }) + })); + + let peer_for_state = Arc::downgrade(peer); + peer.on_peer_connection_state_change(Box::new(move |state| { + let core = core.clone(); + let peer = peer_for_state.clone(); + Box::pin(async move { + let Some(core) = core.upgrade() else { + return; + }; + match state { + RTCPeerConnectionState::Failed => { + core.report_failure("Live WebRTC peer connection failed".to_owned()); + }, + RTCPeerConnectionState::Closed if !core.closing.load(Ordering::Acquire) => { + core.report_failure("Live WebRTC peer connection closed unexpectedly".to_owned()); + }, + RTCPeerConnectionState::Disconnected => { + tokio::time::sleep(DISCONNECT_GRACE).await; + if peer.upgrade().is_some_and(|peer| { + peer.connection_state() == RTCPeerConnectionState::Disconnected + }) { + core.report_failure("Live WebRTC peer connection disconnected".to_owned()); + } + }, + _ => {}, + } + }) + })); +} + +fn install_data_channel_callbacks(data_channel: &Arc, core: Weak) { + let core_for_open = core.clone(); + data_channel.on_open(Box::new(move || { + Box::pin(async move { + if let Some(core) = core_for_open.upgrade() { + core.mark_open(); + } + }) + })); + + let core_for_message = core.clone(); + data_channel.on_message(Box::new(move |message: DataChannelMessage| { + let core = core_for_message.clone(); + Box::pin(async move { + if !message.is_string { + return; + } + if let (Some(core), Ok(payload)) = + (core.upgrade(), String::from_utf8(message.data.to_vec())) + { + core.report_event(payload); + } + }) + })); + + let core_for_close = core.clone(); + data_channel.on_close(Box::new(move || { + let core = core_for_close.clone(); + Box::pin(async move { + if let Some(core) = core.upgrade() { + core.report_failure("Live data channel closed unexpectedly".to_owned()); + } + }) + })); + + data_channel.on_error(Box::new(move |error| { + let core = core.clone(); + Box::pin(async move { + if let Some(core) = core.upgrade() { + core.report_failure(format!("Live data channel failed: {error}")); + } + }) + })); +} + +async fn run_input_audio( + track: Arc, + input_rx: flume::Receiver, + core: Weak, +) { + let mut encoder = match Encoder::new(INPUT_SAMPLE_RATE, Channels::Mono, Application::Voip) { + Ok(encoder) => encoder, + Err(error) => { + if let Some(core) = core.upgrade() { + core.report_failure(format!("Failed to initialize the live Opus encoder: {error}")); + } + return; + }, + }; + if let Err(error) = encoder.set_inband_fec(true) { + if let Some(core) = core.upgrade() { + core.report_failure(format!("Failed to configure the live Opus encoder: {error}")); + } + return; + } + + let mut muted = false; + let mut pending = Vec::with_capacity(INPUT_FRAME_SAMPLES * 2); + let mut encoded = [0u8; MAX_ENCODED_OPUS_BYTES]; + let mut ticker = tokio::time::interval(INPUT_FRAME_DURATION); + ticker.set_missed_tick_behavior(tokio::time::MissedTickBehavior::Burst); + ticker.tick().await; + loop { + tokio::select! { + biased; + command = input_rx.recv_async() => { + let Ok(command) = command else { + break; + }; + match command { + InputCommand::Audio(samples) => { + if let Some(core) = core.upgrade() { + core.queued_samples.fetch_sub(samples.len(), Ordering::AcqRel); + } + if muted { + continue; + } + if samples.len() >= MAX_QUEUED_INPUT_SAMPLES { + pending.clear(); + pending.extend_from_slice(&samples[samples.len() - MAX_QUEUED_INPUT_SAMPLES..]); + continue; + } + let overflow = pending + .len() + .saturating_add(samples.len()) + .saturating_sub(MAX_QUEUED_INPUT_SAMPLES); + if overflow > 0 { + pending.drain(..overflow); + } + pending.extend_from_slice(&samples); + }, + InputCommand::Muted(next_muted) => { + muted = next_muted; + pending.clear(); + }, + InputCommand::Close => break, + } + }, + _ = ticker.tick() => { + let mut frame = [0.0f32; INPUT_FRAME_SAMPLES]; + if !muted { + let consumed = pending.len().min(INPUT_FRAME_SAMPLES); + frame[..consumed].copy_from_slice(&pending[..consumed]); + if consumed > 0 { + pending.copy_within(consumed.., 0); + pending.truncate(pending.len() - consumed); + } + } + let encoded_len = match encoder.encode_float(&frame, &mut encoded) { + Ok(encoded_len) => encoded_len, + Err(error) => { + if let Some(core) = core.upgrade() { + core.report_failure(format!("Failed to encode live microphone audio: {error}")); + } + return; + }, + }; + let sample = Sample { + data: Bytes::copy_from_slice(&encoded[..encoded_len]), + duration: INPUT_FRAME_DURATION, + ..Default::default() + }; + if let Err(error) = track.write_sample(&sample).await { + if let Some(core) = core.upgrade() { + core.report_failure(format!("Failed to send live microphone audio: {error}")); + } + return; + } + }, + } + } +} + +async fn drain_rtcp(sender: Arc) { + while sender.read_rtcp().await.is_ok() {} +} + +async fn receive_output_audio( + track: Arc, + playback_tx: PlaybackWriter, + core: Weak, +) { + if !track + .codec() + .capability + .mime_type + .eq_ignore_ascii_case(MIME_TYPE_OPUS) + { + if let Some(core) = core.upgrade() { + core.report_failure(format!( + "Codex live negotiated unsupported audio codec {}", + track.codec().capability.mime_type + )); + } + return; + } + let mut decoder = match Decoder::new(OUTPUT_SAMPLE_RATE, Channels::Mono) { + Ok(decoder) => decoder, + Err(error) => { + if let Some(core) = core.upgrade() { + core.report_failure(format!("Failed to initialize the live Opus decoder: {error}")); + } + return; + }, + }; + let mut decoded = vec![0.0f32; MAX_DECODED_OPUS_SAMPLES].into_boxed_slice(); + let mut expected_sequence: Option = None; + let mut level = OutputLevel::default(); + + loop { + let packet = match track.read_rtp().await { + Ok((packet, _attributes)) => packet, + Err(error) => { + if let Some(core) = core.upgrade() + && !core.closing.load(Ordering::Acquire) + { + core.report_failure(format!("Live remote audio track failed: {error}")); + } + return; + }, + }; + let sequence = packet.header.sequence_number; + if let Some(expected) = expected_sequence { + let gap = sequence.wrapping_sub(expected); + if gap >= u16::MAX / 2 { + continue; + } + if gap > 0 { + for _ in 1..gap.min(5) { + if let Ok(samples) = + decoder.decode_float(&[], &mut decoded[..OUTPUT_FRAME_SAMPLES], false) + { + if !write_output(&playback_tx, &decoded[..samples], &core) { + return; + } + level.observe(&decoded[..samples], &core); + } + } + if let Ok(samples) = decoder.decode_float(&packet.payload, &mut decoded, true) { + if !write_output(&playback_tx, &decoded[..samples], &core) { + return; + } + level.observe(&decoded[..samples], &core); + } + } + } + expected_sequence = Some(sequence.wrapping_add(1)); + match decoder.decode_float(&packet.payload, &mut decoded, false) { + Ok(samples) => { + if !write_output(&playback_tx, &decoded[..samples], &core) { + return; + } + level.observe(&decoded[..samples], &core); + }, + Err(error) => { + if let Some(core) = core.upgrade() { + core.report_failure(format!("Failed to decode live speaker audio: {error}")); + } + return; + }, + } + } +} + +fn write_output(playback_tx: &PlaybackWriter, samples: &[f32], core: &Weak) -> bool { + match playback_tx.write(samples) { + Ok(()) => true, + Err(error) => { + if let Some(core) = core.upgrade() + && !core.closing.load(Ordering::Acquire) + { + core.report_failure(format!("Live speaker playback failed: {error}")); + } + false + }, + } +} + +#[derive(Default)] +struct OutputLevel { + sum_squares: f64, + samples: usize, +} + +impl OutputLevel { + fn observe(&mut self, decoded: &[f32], core: &Weak) { + let mut offset = 0; + while offset < decoded.len() { + let take = (OUTPUT_LEVEL_SAMPLES - self.samples).min(decoded.len() - offset); + for &sample in &decoded[offset..offset + take] { + let sample = f64::from(sample); + self.sum_squares = sample.mul_add(sample, self.sum_squares); + } + self.samples += take; + offset += take; + if self.samples == OUTPUT_LEVEL_SAMPLES { + if let Some(core) = core.upgrade() { + core.report_level((self.sum_squares / self.samples as f64).sqrt()); + } + self.sum_squares = 0.0; + self.samples = 0; + } + } + } +} diff --git a/docs/natives-build-release-debugging.md b/docs/natives-build-release-debugging.md index 32ead96ab..432cf9656 100644 --- a/docs/natives-build-release-debugging.md +++ b/docs/natives-build-release-debugging.md @@ -146,7 +146,7 @@ On non-PR events both jobs run on `omp-kata` pods against the cluster remote cac bazelisk --bazelrc="$rc" test //crates/... # full Rust suite # clippy scope mirrors `cargo clippy --workspace` (libraries only), split by # lint policy via a query kind filter: -bazelisk query "kind('rust_library|rust_shared_library', //crates/pi-ast/... + //crates/pi-iso/... + //crates/pi-natives/... + //crates/pi-shell/... + //crates/pi-walker/...)" \ +bazelisk query "kind('rust_library|rust_shared_library', //crates/pi-ast/... + //crates/pi-iso/... + //crates/pi-natives/... + //crates/pi-shell/... + //crates/pi-voice/... + //crates/pi-walker/...)" \ | xargs bazelisk --bazelrc="$rc" build --config=clippy-strict -- bazelisk query "kind('rust_library|rust_shared_library', //crates/... - (…strict set…) - //crates/vendor/brush-core/... - //crates/vendor/brush-builtins/...)" \ | xargs bazelisk --bazelrc="$rc" build --config=clippy -- @@ -179,9 +179,9 @@ Hosted disk caches use `bazel-disk-v3----- bun scripts/bazel-natives.ts --dest `, followed by a disk-cache save after a hosted miss. `.github/actions/native-artifacts` is the no-build consumer: download `native-addons` → run the same driver with `--source`. -### `release_binary` +### Release binary builds and publishing -Linux and Windows release matrices install addons from the `native_addons` workflow artifact. Darwin artifacts cannot be cross-built on Linux, so each macOS matrix builds only its own architecture through `bazel-natives` with scope `release-`, then `bun run ci:release:build-binaries` embeds and compiles the executable. +Binary builds are build-only and run in parallel with the test fan-out. `release_binary` (Linux + Windows matrices) needs only `native_addons`, whose workflow artifact supplies their addons. `release_binary_darwin` needs only `release_metadata` and starts the moment a release run is detected: darwin artifacts cannot be cross-built on Linux, so each macOS leg builds its own architecture through `bazel-natives` with scope `release-` (seeded near HEAD by the warm workflow — normally just the version-bump delta), then `bun run ci:release:build-binaries` embeds and compiles the executable. Publishing is held behind `release_gate` (the aggregate of every validation job): `release_native_leaves` downloads all built addons and publishes the five `@oh-my-pi/pi-natives-` leaves from one linux runner, and the GitHub release / verify / core npm chain runs beside it. ## Debugging playbook diff --git a/packages/natives/CHANGELOG.md b/packages/natives/CHANGELOG.md index bd46c8b4c..57c8ba915 100644 --- a/packages/natives/CHANGELOG.md +++ b/packages/natives/CHANGELOG.md @@ -2,6 +2,11 @@ ## [Unreleased] +### Changed + +- Split the native voice engine (miniaudio capture/playback, WebRTC peer, Opus media) out of the `pi-natives` addon crate into a napi-free `pi-voice` rlib. The addon keeps thin `#[napi]` adapters, so the JS API is unchanged; the webrtc/opus/miniaudio dependency graph now compiles once into the library and no longer rebuilds with the addon leaf (which recompiles every release via its version-sentinel edit). +- Release binaries now build in parallel with the test fan-out; npm leaf publishing moved to a dedicated post-validation job (`release_native_leaves`), and darwin release bazel caches are pre-warmed on native-affecting main pushes — cutting release wall time from the previous serialized tests → cold darwin build pipeline. + ## [17.1.8] - 2026-07-28 ### Fixed From 00fedcf6ac97ddfefde9071927fb10f51aac7f3b Mon Sep 17 00:00:00 2001 From: can1357 Date: Thu, 30 Jul 2026 05:33:06 +0200 Subject: [PATCH 03/19] feat(ai): extended codex and stream timeout defaults to 300 seconds - Increased codex websocket first event timeout default to 300 seconds. - Increased default stream idle and first event timeout thresholds to 300 seconds. - Updated stream timeout test expectations to match new 300s global default. --- packages/ai/src/providers/openai-codex-responses.ts | 2 +- packages/ai/src/utils/idle-iterator.ts | 4 ++-- packages/ai/test/proxy.test.ts | 1 - packages/ai/test/stream-timeout-defaults.test.ts | 4 ++-- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/packages/ai/src/providers/openai-codex-responses.ts b/packages/ai/src/providers/openai-codex-responses.ts index 4239673fa..20751703c 100644 --- a/packages/ai/src/providers/openai-codex-responses.ts +++ b/packages/ai/src/providers/openai-codex-responses.ts @@ -252,7 +252,7 @@ const CODEX_WEBSOCKET_IDLE_TIMEOUT_MS = Number($env.PI_CODEX_WEBSOCKET_IDLE_TIME * SSE. Generous default so legitimately slow first-token providers still get * a chance on the WS transport before falling through. */ -const CODEX_WEBSOCKET_FIRST_EVENT_TIMEOUT_MS = Number($env.PI_CODEX_WEBSOCKET_FIRST_EVENT_TIMEOUT_MS || 60_000); +const CODEX_WEBSOCKET_FIRST_EVENT_TIMEOUT_MS = Number($env.PI_CODEX_WEBSOCKET_FIRST_EVENT_TIMEOUT_MS || 300_000); const CODEX_WEBSOCKET_RETRY_BUDGET = Number($env.PI_CODEX_WEBSOCKET_RETRY_BUDGET || CODEX_MAX_RETRIES); const CODEX_WEBSOCKET_RETRY_DELAY_MS = Number($env.PI_CODEX_WEBSOCKET_RETRY_DELAY_MS || CODEX_RETRY_DELAY_MS); const CODEX_WEBSOCKET_TRANSPORT_ERROR_PREFIX = "Codex websocket transport error"; diff --git a/packages/ai/src/utils/idle-iterator.ts b/packages/ai/src/utils/idle-iterator.ts index f89da41a2..6d743bbac 100644 --- a/packages/ai/src/utils/idle-iterator.ts +++ b/packages/ai/src/utils/idle-iterator.ts @@ -1,8 +1,8 @@ import { $env } from "@oh-my-pi/pi-utils"; import * as AIError from "../error"; -const DEFAULT_STREAM_IDLE_TIMEOUT_MS = 120_000; -const DEFAULT_STREAM_FIRST_EVENT_TIMEOUT_MS = 100_000; +const DEFAULT_STREAM_IDLE_TIMEOUT_MS = 300_000; +const DEFAULT_STREAM_FIRST_EVENT_TIMEOUT_MS = 300_000; /** Re-mint persistent race promises every N iterations (see hoisted-racer comment). */ const RACER_REMINT_INTERVAL = 1024; diff --git a/packages/ai/test/proxy.test.ts b/packages/ai/test/proxy.test.ts index 94aff51f6..30548b25f 100644 --- a/packages/ai/test/proxy.test.ts +++ b/packages/ai/test/proxy.test.ts @@ -61,7 +61,6 @@ async function waitForSocketClose(socket: net.Socket): Promise { socket.once("close", () => closed.resolve()); await closed.promise; } - const isProxyEnvKey = (k: string): boolean => k.startsWith("PI_PROXY") || k === "HTTP_PROXY" || diff --git a/packages/ai/test/stream-timeout-defaults.test.ts b/packages/ai/test/stream-timeout-defaults.test.ts index 3674e998b..dbc63944a 100644 --- a/packages/ai/test/stream-timeout-defaults.test.ts +++ b/packages/ai/test/stream-timeout-defaults.test.ts @@ -101,8 +101,8 @@ describe("getStreamFirstEventTimeoutMs(idleTimeoutMs, fallbackMs)", () => { expect(getStreamFirstEventTimeoutMs(undefined, 300_000)).toBeUndefined(); }); - it("falls back to the 100s global default when no fallback or env is provided", () => { - expect(getStreamFirstEventTimeoutMs()).toBe(100_000); + it("falls back to the 300s global default when no fallback or env is provided", () => { + expect(getStreamFirstEventTimeoutMs()).toBe(300_000); }); }); From a6001c04a3a7fad023b775d5bb91dff9fc23122f Mon Sep 17 00:00:00 2001 From: can1357 Date: Thu, 30 Jul 2026 06:03:32 +0200 Subject: [PATCH 04/19] fix(coding-agent): prevented race condition in concurrent createAgentSession calls - Export AgentRegistry from the SDK to allow passing a private registry instance. - Provide a dedicated AgentRegistry per in-process client in the benchmark runner. --- packages/coding-agent/CHANGELOG.md | 1 + packages/coding-agent/src/sdk.ts | 4 ++++ packages/typescript-edit-benchmark/src/in-process-client.ts | 6 ++++++ 3 files changed, 11 insertions(+) diff --git a/packages/coding-agent/CHANGELOG.md b/packages/coding-agent/CHANGELOG.md index 2e8ffcd37..92cead391 100644 --- a/packages/coding-agent/CHANGELOG.md +++ b/packages/coding-agent/CHANGELOG.md @@ -22,6 +22,7 @@ ### Fixed +- Fixed concurrent `createAgentSession` calls with the default agent id failing initialization with `Agent "Main" was replaced during session initialization` — each in-process embedder (e.g. the edit benchmark runner) can now pass a private registry via the newly exported `AgentRegistry`, keeping every top-level session's "Main" out of the process-global roster race. - Fixed task tool blocks duplicating their per-agent progress rows into terminal scrollback on every update: live task frames now pin the transcript live region so mid-run rows are never recorded as frozen snapshots, and a detached background task freezes its progress the moment any of its rows commit to scrollback instead of mutating committed history. - Fixed Codex reset fireworks comparing different quota tiers or plans, preventing false celebrations when usage reports switch between Spark and base weekly limits. - Fixed Cursor ranged-read results losing the full file byte size after applying the requested window. diff --git a/packages/coding-agent/src/sdk.ts b/packages/coding-agent/src/sdk.ts index 16f9e2716..0b0078982 100644 --- a/packages/coding-agent/src/sdk.ts +++ b/packages/coding-agent/src/sdk.ts @@ -609,6 +609,10 @@ export type * from "./extensibility/extensions"; export type { Skill } from "./extensibility/skills"; export type { FileSlashCommand } from "./extensibility/slash-commands"; export type { MCPManager, MCPServerConfig, MCPServerConnection, MCPToolsLoadResult } from "./mcp"; +// Agent registry: pass a private instance per `createAgentSession` when +// embedding several concurrent top-level sessions in one process (the default +// global registry admits only one "Main" per process generation). +export { type AgentRef, AgentRegistry, MAIN_AGENT_ID } from "./registry/agent-registry"; export type { Tool } from "./tools"; export { buildDirectoryTree, buildWorkspaceTree, type DirectoryTree, type WorkspaceTree } from "./workspace-tree"; diff --git a/packages/typescript-edit-benchmark/src/in-process-client.ts b/packages/typescript-edit-benchmark/src/in-process-client.ts index 39995efbf..99f17fde7 100644 --- a/packages/typescript-edit-benchmark/src/in-process-client.ts +++ b/packages/typescript-edit-benchmark/src/in-process-client.ts @@ -9,6 +9,7 @@ import type { AgentEvent, AgentMessage, ResolvedThinkingLevel, ThinkingLevel } f import type { Model, ToolExample } from "@oh-my-pi/pi-ai"; import type { AgentSession, AgentSessionEvent, AuthStorage, SessionStats } from "@oh-my-pi/pi-coding-agent"; import { + AgentRegistry, type CreateAgentSessionResult, createAgentSession, discoverAuthStorage, @@ -97,6 +98,11 @@ export class InProcessClient { authStorage: shared?.authStorage, modelRegistry: shared?.modelRegistry, sessionManager: SessionManager.inMemory(this.#options.cwd), + // Benchmark tasks run many top-level sessions concurrently in one + // process. The global registry admits only one "Main" per process + // generation (later registrations replace earlier refs, which then + // fail session initialization), so each client gets its own registry. + agentRegistry: new AgentRegistry(), systemPrompt: this.#options.appendSystemPrompt ? (defaultPrompt: string[]) => [...defaultPrompt, this.#options.appendSystemPrompt!] : undefined, From 4e5f480f142c6a34ab373fec81a20cb1033cafad Mon Sep 17 00:00:00 2001 From: can1357 Date: Thu, 30 Jul 2026 06:14:45 +0200 Subject: [PATCH 05/19] feat(metaharness/adapters): implemented interactive cli runner and reporting - Added comprehensive CLI arguments for thinking levels, timeouts, concurrency, and report formatting. - Implemented real-time interactive terminal progress rendering and runtime statistics summary. - Enhanced runner logic with tokenizer-based hashline operation detection and aggregated reporting. - Added bench:edit script to package configuration and updated default report output paths. --- packages/metaharness/adapters/edit/cli.ts | 352 +++++++++++++++--- .../adapters/edit/live-progress.ts | 241 ++++++++++++ packages/metaharness/adapters/edit/report.ts | 16 +- packages/metaharness/adapters/edit/runner.ts | 118 ++++-- packages/metaharness/package.json | 1 + 5 files changed, 650 insertions(+), 78 deletions(-) mode change 100644 => 100755 packages/metaharness/adapters/edit/cli.ts create mode 100644 packages/metaharness/adapters/edit/live-progress.ts diff --git a/packages/metaharness/adapters/edit/cli.ts b/packages/metaharness/adapters/edit/cli.ts old mode 100644 new mode 100755 index eff9e91de..cb3fa3bc5 --- a/packages/metaharness/adapters/edit/cli.ts +++ b/packages/metaharness/adapters/edit/cli.ts @@ -1,97 +1,363 @@ #!/usr/bin/env bun -/** Manager-owned executable adapter for the TypeScript edit benchmark. */ +/** + * Executable adapter for the TypeScript edit benchmark. + * + * Two audiences share this entry point: + * - The metaharness manager spawns it headless (`--model … --output result.json`) + * and consumes only the continuously-rewritten report file. + * - Humans run it directly and get the interactive experience: a config + * banner, a live progress bar with per-run failure diffs (stderr, TTY-aware), + * a runtime-stats summary, and a markdown or JSON report. + */ import * as fs from "node:fs/promises"; import * as path from "node:path"; import { parseArgs } from "node:util"; -import { TempDir } from "@oh-my-pi/pi-utils"; -import { loadTasksFromDir } from "@oh-my-pi/typescript-edit-benchmark/tasks"; -import { generateJsonReport } from "./report"; -import { type BenchmarkConfig, runBenchmark } from "./runner"; +import { type ResolvedThinkingLevel, ThinkingLevel } from "@oh-my-pi/pi-agent-core"; +import { THINKING_EFFORTS } from "@oh-my-pi/pi-ai"; +import { postmortem, TempDir } from "@oh-my-pi/pi-utils"; +import { loadTasksFromDir, validateFixturesFromDir } from "@oh-my-pi/typescript-edit-benchmark/tasks"; +import { LiveProgress } from "./live-progress"; +import { generateJsonReport, generateReport } from "./report"; +import { type BenchmarkConfig, type BenchmarkResult, buildBenchmarkResult, runBenchmark } from "./runner"; const EDIT_PACKAGE = path.resolve(import.meta.dir, "..", "..", "..", "typescript-edit-benchmark"); +const RUNS_DIR = path.resolve(import.meta.dir, "..", "..", "..", "..", "runs"); -async function extractFixtures(): Promise<{ dir: string; temp: TempDir }> { +type ReportFormat = "markdown" | "json"; + +function log(line = ""): void { + process.stderr.write(`${line}\n`); +} + +function fail(message: string): never { + throw new Error(message); +} + +function parseThinkingLevel(value: string): ResolvedThinkingLevel { + if ([ThinkingLevel.Off, ...THINKING_EFFORTS].includes(value as ResolvedThinkingLevel)) { + return value as ResolvedThinkingLevel; + } + return fail(`Invalid thinking level: ${value}. Valid levels: ${[ThinkingLevel.Off, ...THINKING_EFFORTS].join(", ")}`); +} + +function parsePositiveInt(raw: string | undefined, flag: string, fallback: number): number { + if (raw === undefined) return fallback; + const parsed = Number.parseInt(raw, 10); + if (Number.isNaN(parsed) || parsed < 1) fail(`Invalid ${flag} value: ${raw}. Must be a positive integer.`); + return parsed; +} + +function parseFuzzy(raw: string | undefined): boolean | "auto" | undefined { + if (raw === undefined) return undefined; + if (raw === "auto") return "auto"; + if (raw === "true" || raw === "1") return true; + if (raw === "false" || raw === "0") return false; + return fail(`Invalid --edit-fuzzy: ${raw}. Must be true, false, 1, 0, or auto.`); +} + +function parseFuzzyThreshold(raw: string | undefined): number | "auto" | undefined { + if (raw === undefined) return undefined; + if (raw === "auto") return "auto"; + const parsed = Number.parseFloat(raw); + if (Number.isNaN(parsed) || parsed < 0 || parsed > 1) { + fail(`Invalid --edit-fuzzy-threshold: ${raw}. Must be 0-1 or auto.`); + } + return parsed; +} + +function resolveFormat(explicit: string | undefined, outputPath: string): ReportFormat { + if (explicit === "markdown" || explicit === "json") return explicit; + if (explicit !== undefined) fail(`Invalid --format: ${explicit}. Must be markdown or json.`); + return outputPath.endsWith(".md") || outputPath.endsWith(".markdown") ? "markdown" : "json"; +} + +function generateReportFilename(config: BenchmarkConfig): string { + const modelName = config.model + .split("/") + .pop()! + .replace(/[^a-zA-Z0-9-]/g, "_"); + const variant = config.editVariant ?? "auto"; + const timestamp = new Date().toISOString().replace(/:/g, "-").replace(/\..+$/, "Z"); + return path.join(RUNS_DIR, `${modelName}_${variant}_${timestamp}.md`); +} + +/** Sibling `.dump` directory for an output path, timestamped on collision. */ +async function resolveConversationDumpDir(outputPath: string): Promise { + const parsed = path.parse(outputPath); + const preferred = path.join(parsed.dir, `${parsed.name}.dump`); + try { + await fs.stat(preferred); + } catch { + return preferred; + } + const timestamp = new Date().toISOString().replace(/[:.]/g, "-"); + return path.join(parsed.dir, `${parsed.name}.${timestamp}.dump`); +} + +interface ResolvedFixtures { + dir: string; + cleanup?: () => Promise; +} + +/** Resolve `--fixtures` (directory or tarball; default: the built-in tarball). */ +async function resolveFixtures(fixturesArg: string | undefined): Promise { + const source = fixturesArg ?? path.join(EDIT_PACKAGE, "fixtures.tar.gz"); + if (!source.endsWith(".tar.gz") && !source.endsWith(".tgz")) { + return { dir: source }; + } const temp = await TempDir.create("@metaharness-edit-fixtures-"); - const archive = new Bun.Archive(await Bun.file(path.join(EDIT_PACKAGE, "fixtures.tar.gz")).arrayBuffer()); + const archive = new Bun.Archive(await Bun.file(source).arrayBuffer()); for (const [filePath, file] of await archive.files()) { await Bun.write(path.join(temp.path(), filePath), file); } const entries = await fs.readdir(temp.path(), { withFileTypes: true }); const directories = entries.filter(entry => entry.isDirectory()); const files = entries.filter(entry => entry.isFile()); - return { dir: directories.length === 1 && files.length === 0 ? path.join(temp.path(), directories[0]!.name) : temp.path(), temp }; + const dir = directories.length === 1 && files.length === 0 ? path.join(temp.path(), directories[0]!.name) : temp.path(); + return { dir, cleanup: () => temp.remove() }; } -/** Execute an edit benchmark and continuously materialize its normalized source artifact. */ +function printUsage(): void { + log(` +Edit Benchmark - Evaluate patch application success rates + +Usage: + bun adapters/edit/cli.ts --model [options] + +Options: + --model Provider/model ID, e.g. anthropic/claude-sonnet-4 (required) + --provider Override provider (auto-detected from model prefix) + --thinking Thinking level: off, minimal, low, medium, high, xhigh, max + --runs Runs per task (default: 1) + --timeout Timeout per run in ms (default: 120000) + --connection-timeout Timeout for first event before fast-retry (default: 30000) + --max-turns Max turns per attempt before failing (default: 30) + --task-concurrency Max tasks to run in parallel (default: 32) + --tasks Comma-separated task IDs to run (default: sampled) + --max-tasks Max tasks to sample evenly (default: 80, 0 = all) + --fixtures Fixtures directory or .tar.gz archive (default: built-in) + --edit-variant Edit variant, e.g. hashline, replace, apply_patch (default: auto) + --edit-fuzzy Fuzzy matching: true, false, auto + --edit-fuzzy-threshold Fuzzy threshold 0-1 or auto + --guided Include an authoritative suggested edit payload + --max-attempts Max prompt attempts per run (default: 1) + --no-early-stop-on-match Don't short-circuit when output matches expected + --output Report file (default: runs/__.md) + --format Report format: markdown, json (default: by extension) + --check-fixtures Validate fixtures and exit + --quiet Suppress the live progress view + --list Print task ids as JSON and exit + --help Show this help message + +Examples: + # Full run against the default sample of 80 tasks + bun adapters/edit/cli.ts --model anthropic/claude-sonnet-4 + + # Compare edit variants + bun adapters/edit/cli.ts --model openai/gpt-5 --edit-variant hashline --output hashline.md + bun adapters/edit/cli.ts --model openai/gpt-5 --edit-variant apply_patch --output apply_patch.md + + # Specific tasks, more runs + bun adapters/edit/cli.ts --model anthropic/claude-sonnet-4 --tasks logic-flip-strict-equality-001 --runs 5 +`); +} + +/** Execute an edit benchmark and continuously materialize its report artifact. */ export async function main(argv = process.argv.slice(2)): Promise { const { values } = parseArgs({ args: argv, options: { model: { type: "string" }, - output: { type: "string" }, - "max-tasks": { type: "string", default: "80" }, - tasks: { type: "string" }, - "task-concurrency": { type: "string", default: "32" }, + provider: { type: "string" }, + thinking: { type: "string" }, runs: { type: "string", default: "1" }, + timeout: { type: "string", default: "120000" }, + "connection-timeout": { type: "string", default: "30000" }, + "max-turns": { type: "string", default: "30" }, + "task-concurrency": { type: "string", default: "32" }, + tasks: { type: "string" }, + "max-tasks": { type: "string", default: "80" }, + fixtures: { type: "string" }, + "edit-variant": { type: "string" }, + "edit-fuzzy": { type: "string" }, + "edit-fuzzy-threshold": { type: "string" }, + guided: { type: "boolean", default: false }, + "max-attempts": { type: "string", default: "1" }, + "no-op-retry-limit": { type: "string", default: "2" }, + "max-timeout-retries": { type: "string", default: "3" }, + "max-provider-retries": { type: "string", default: "3" }, + "mutation-scope-window": { type: "string", default: "20" }, + "no-early-stop-on-match": { type: "boolean", default: false }, + output: { type: "string" }, + format: { type: "string" }, + "check-fixtures": { type: "boolean", default: false }, + quiet: { type: "boolean", default: false }, list: { type: "boolean", default: false }, + help: { type: "boolean", default: false }, }, strict: true, }); - const fixtures = await extractFixtures(); + + if (values.help) { + printUsage(); + return; + } + + const fixtures = await resolveFixtures(values.fixtures); try { + if (values["check-fixtures"]) { + const issues = await validateFixturesFromDir(fixtures.dir); + if (issues.length === 0) { + log("Fixtures OK"); + return; + } + log("Fixture validation failed:"); + for (const issue of issues) log(` - ${issue.taskId}: ${issue.message}`); + process.exitCode = 1; + return; + } + let tasks = await loadTasksFromDir(fixtures.dir); if (values.list) { process.stdout.write(`${JSON.stringify(tasks.map(task => ({ id: task.id, name: task.name })))}\n`); return; } - if (!values.model || !values.output) throw new Error("edit adapter requires --model and --output"); + if (!values.model) fail("edit adapter requires --model (see --help)"); + if (values.tasks) { const selected = new Set(values.tasks.split(",").map(value => value.trim())); tasks = tasks.filter(task => selected.has(task.id)); - if (tasks.length !== selected.size) throw new Error("one or more edit task ids were not found"); + if (tasks.length !== selected.size) fail("one or more edit task ids were not found (see --list)"); } else { const limit = Number(values["max-tasks"]); if (limit > 0 && tasks.length > limit) { + // Deterministic even sampling across the id-sorted list keeps + // mutation-category coverage representative. const sorted = tasks.slice().sort((a, b) => a.id.localeCompare(b.id)); const step = sorted.length / limit; tasks = Array.from({ length: limit }, (_, index) => sorted[Math.floor(index * step)]!); } } - const slash = values.model.indexOf("/"); + + const model = values.model; + const slash = model.indexOf("/"); const config: BenchmarkConfig = { - provider: slash === -1 ? "anthropic" : values.model.slice(0, slash), - model: values.model, - runsPerTask: Number(values.runs), - timeout: 120_000, - connectionTimeout: 30_000, - maxTurns: 30, - taskConcurrency: Number(values["task-concurrency"]), - guided: false, - maxAttempts: 1, - noOpRetryLimit: 2, - maxTimeoutRetries: 3, - maxProviderFailureRetries: 3, - mutationScopeWindow: 20, - conversationDumpDir: path.join(path.dirname(values.output), "result.dump"), + provider: values.provider ?? (slash === -1 ? "anthropic" : model.slice(0, slash)), + model, + ...(values.thinking === undefined ? {} : { thinkingLevel: parseThinkingLevel(values.thinking) }), + runsPerTask: parsePositiveInt(values.runs, "--runs", 1), + timeout: parsePositiveInt(values.timeout, "--timeout", 120_000), + connectionTimeout: parsePositiveInt(values["connection-timeout"], "--connection-timeout", 30_000), + maxTurns: parsePositiveInt(values["max-turns"], "--max-turns", 30), + taskConcurrency: parsePositiveInt(values["task-concurrency"], "--task-concurrency", 32), + guided: values.guided, + maxAttempts: parsePositiveInt(values["max-attempts"], "--max-attempts", 1), + noOpRetryLimit: parsePositiveInt(values["no-op-retry-limit"], "--no-op-retry-limit", 2), + maxTimeoutRetries: parsePositiveInt(values["max-timeout-retries"], "--max-timeout-retries", 3), + maxProviderFailureRetries: parsePositiveInt(values["max-provider-retries"], "--max-provider-retries", 3), + mutationScopeWindow: parsePositiveInt(values["mutation-scope-window"], "--mutation-scope-window", 20), inProcess: true, - earlyStopOnMatch: true, + earlyStopOnMatch: !values["no-early-stop-on-match"], }; - let writes = Promise.resolve(); - const result = await runBenchmark(tasks, config, undefined, snapshot => { - writes = writes.then(async () => { - await Bun.write(values.output!, generateJsonReport(snapshot)); - }); + const editVariant = values["edit-variant"]; + if (editVariant) config.editVariant = editVariant; + const editFuzzy = parseFuzzy(values["edit-fuzzy"]); + if (editFuzzy !== undefined) config.editFuzzy = editFuzzy; + const editFuzzyThreshold = parseFuzzyThreshold(values["edit-fuzzy-threshold"]); + if (editFuzzyThreshold !== undefined) config.editFuzzyThreshold = editFuzzyThreshold; + + let outputPath = values.output; + if (outputPath === undefined) { + await fs.mkdir(RUNS_DIR, { recursive: true }); + outputPath = generateReportFilename(config); + } + const format = resolveFormat(values.format, outputPath); + config.conversationDumpDir = await resolveConversationDumpDir(outputPath); + + log("Edit Benchmark"); + log("=============="); + log(`Provider: ${config.provider}`); + log(`Model: ${config.model}`); + if (config.thinkingLevel) log(`Thinking: ${config.thinkingLevel}`); + log(`Runs per task: ${config.runsPerTask}`); + log(`Timeout: ${config.timeout}ms`); + log(`Task concurrency: ${config.taskConcurrency}`); + log(`Guided mode: ${config.guided ? "enabled" : "disabled"}`); + if (config.editVariant) log(`Edit variant: ${config.editVariant}`); + if (config.editFuzzy !== undefined) log(`Edit fuzzy: ${config.editFuzzy}`); + if (config.editFuzzyThreshold !== undefined) log(`Edit fuzzy threshold: ${config.editFuzzyThreshold}`); + log(`Tasks: ${tasks.length}`); + log(`Report: ${outputPath}`); + log(`Conversation dumps: ${config.conversationDumpDir}`); + log(); + + const renderReport = (result: BenchmarkResult): string => + format === "json" ? generateJsonReport(result) : generateReport(result); + + const progress = values.quiet ? undefined : new LiveProgress(tasks.length * config.runsPerTask, config.runsPerTask); + let latestResult = buildBenchmarkResult({ + tasks, + config, + resultsByTask: new Map(), + startTime: new Date().toISOString(), }); + let writes = Promise.resolve(); + const queueReportWrite = (result: BenchmarkResult) => { + writes = writes.then(async () => { + await Bun.write(outputPath, renderReport(result)); + }); + }; + // A killed/interrupted run still leaves a usable partial report behind. + const unregisterCleanup = postmortem.register("edit-benchmark-report", async reason => { + if (reason === postmortem.Reason.EXIT) return; + progress?.finish(); + log("Benchmark interrupted; writing partial report..."); + await Bun.write(outputPath, renderReport(latestResult)); + await fixtures.cleanup?.(); + }); + + const result = await runBenchmark( + tasks, + config, + event => progress?.handleEvent(event), + snapshot => { + latestResult = snapshot; + queueReportWrite(snapshot); + }, + ); + latestResult = result; + progress?.finish(); + queueReportWrite(result); await writes; - await Bun.write(values.output, generateJsonReport(result)); + unregisterCleanup(); + + log(); + log("Benchmark complete!"); + log( + ` Task success rate (best of ${config.runsPerTask}): ${(result.summary.taskSuccessRate * 100).toFixed(1)}% (${result.summary.successfulTasks}/${result.summary.totalTasks})`, + ); + log(` Total tokens (best): ${result.summary.totalTokens.input} in / ${result.summary.totalTokens.output} out`); + log( + ` Tokens/task (best): mean=${result.summary.avgTokensPerTask.total} median=${result.summary.medianTokensPerTask.total} p1=${result.summary.p1TokensPerTask.total} p99=${result.summary.p99TokensPerTask.total} reasoning=${result.summary.avgTokensPerTask.reasoning}`, + ); + if (result.summary.ghostRuns > 0) log(` Ghost runs (0/0/0): ${result.summary.ghostRuns}`); + if (result.summary.timeoutRuns > 0) log(` Timeout runs: ${result.summary.timeoutRuns}`); + log(`Report written to: ${outputPath}`); } finally { - await fixtures.temp.remove(); + await fixtures.cleanup?.(); } } if (import.meta.main) { - main().catch(error => { - process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`); - process.exitCode = 1; - }); + main() + .then(async () => { + // In-process benchmark runs can leave provider keep-alive sockets and + // background AgentSession timers alive after the report is written. + // Treat the final report as the CLI boundary. + await postmortem.quit(Number(process.exitCode ?? 0)); + }) + .catch(async error => { + process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`); + await postmortem.quit(1); + }); } diff --git a/packages/metaharness/adapters/edit/live-progress.ts b/packages/metaharness/adapters/edit/live-progress.ts new file mode 100644 index 000000000..efdc65bc7 --- /dev/null +++ b/packages/metaharness/adapters/edit/live-progress.ts @@ -0,0 +1,241 @@ +/** + * Live terminal renderer for edit benchmark runs. + * + * Thin view over {@link runBenchmark}'s `onProgress` stream: a single + * in-place progress line (bar, pass rates, token/latency averages, in-flight + * count) on a TTY, plain per-run lines otherwise, plus inline colored diffs + * for failed runs and a runtime-stats block at the end. Renders to stderr so + * stdout stays free for machine output (`--list` JSON), and the report file + * remains the only artifact the manager consumes. + */ +import { percentile, type ProgressEvent } from "./runner"; + +const ANSI = { + reset: "\x1b[0m", + bold: "\x1b[1m", + dim: "\x1b[2m", + red: "\x1b[31m", + green: "\x1b[32m", + yellow: "\x1b[33m", + cyan: "\x1b[36m", +} as const; + +function rateColor(percent: number): string { + if (percent >= 80) return ANSI.green; + if (percent >= 50) return ANSI.yellow; + return ANSI.red; +} + +export class LiveProgress { + readonly #totalRuns: number; + readonly #runsPerTask: number; + readonly #isTty: boolean; + readonly #colors: boolean; + #started = 0; + #completed = 0; + #success = 0; + #totalInput = 0; + #totalOutput = 0; + #totalDuration = 0; + #totalReads = 0; + #totalEdits = 0; + #totalWrites = 0; + #totalEditSuccesses = 0; + #totalToolInputChars = 0; + #indentScores: number[] = []; + #inputTokens: number[] = []; + #outputTokens: number[] = []; + #totalTokens: number[] = []; + #oneShotSuccessTokens: number[] = []; + #lastLineLength = 0; + + constructor(totalRuns: number, runsPerTask: number) { + this.#totalRuns = totalRuns; + this.#runsPerTask = runsPerTask; + this.#isTty = Boolean(process.stderr.isTTY); + this.#colors = this.#isTty && !process.env.NO_COLOR; + } + + #paint(code: string, text: string): string { + return this.#colors ? `${code}${text}${ANSI.reset}` : text; + } + + #log(line: string): void { + process.stderr.write(`${line}\n`); + } + + handleEvent(event: ProgressEvent): void { + if (event.status === "started") { + this.#started += 1; + if (!this.#isTty) { + this.#log(` [${event.taskId}] Run ${event.runIndex + 1}/${this.#runsPerTask} started...`); + } + this.#renderLine(); + return; + } + + this.#completed += 1; + if (event.result) { + if (event.result.success) { + this.#success += 1; + } + if (event.result.success && event.runIndex === 0) { + this.#oneShotSuccessTokens.push(event.result.tokens.total); + } + this.#totalInput += event.result.tokens.input; + this.#totalOutput += event.result.tokens.output; + this.#inputTokens.push(event.result.tokens.input); + this.#outputTokens.push(event.result.tokens.output); + this.#totalTokens.push(event.result.tokens.total); + this.#totalDuration += event.result.duration; + this.#totalReads += event.result.toolCalls.read; + this.#totalEdits += event.result.toolCalls.edit; + this.#totalWrites += event.result.toolCalls.write; + this.#totalEditSuccesses += event.result.toolCalls.editSuccesses; + this.#totalToolInputChars += event.result.toolCalls.totalInputChars; + if (typeof event.result.indentScore === "number") { + this.#indentScores.push(event.result.indentScore); + } + } + + const result = event.result; + if (result && !result.success && result.error) { + this.#flushLine(); + const header = this.#paint( + ANSI.red, + `[${event.taskId}] Run ${event.runIndex + 1}/${this.#runsPerTask} failed:`, + ); + this.#log(` ${header} ${result.error}`); + if (result.diff) { + const changeLines = result.diff + .split("\n") + .filter(line => /^[-+@]/.test(line) && !/^(---|\+\+\+)/.test(line)); + const maxLines = 40; + for (const line of changeLines.slice(0, maxLines)) { + let color: string | undefined; + if (line.startsWith("@@")) color = ANSI.cyan; + else if (line.startsWith("-")) color = ANSI.red; + else if (line.startsWith("+")) color = ANSI.green; + this.#log(` ${color ? this.#paint(color, line) : line}`); + } + if (changeLines.length > maxLines) { + this.#log(this.#paint(ANSI.dim, ` ... (${changeLines.length - maxLines} more change lines)`)); + } + } + } + + if (result?.editFailures && result.editFailures.length > 0) { + this.#flushLine(); + for (const [i, failure] of result.editFailures.entries()) { + const args = (failure.args ?? {}) as Record; + const target = + typeof args.path === "string" ? args.path : typeof args.file === "string" ? args.file : undefined; + const op = typeof args.operation === "string" ? args.operation : undefined; + const oneLine = failure.error.replace(/\s+/g, " ").trim(); + const clipped = oneLine.length > 240 ? `${oneLine.slice(0, 237)}...` : oneLine; + const tag = this.#paint(ANSI.yellow, `[${event.taskId}] schema #${i + 1}`); + const metaParts = [op, target].filter((value): value is string => Boolean(value)); + const meta = metaParts.length > 0 ? this.#paint(ANSI.dim, metaParts.join(" ")) : ""; + this.#log(` ${tag}${meta ? ` ${meta}` : ""} ${clipped}`); + if (failure.rawBlock) { + const rawLine = failure.rawBlock.replace(/\s+/g, " ").trim(); + const clippedRaw = rawLine.length > 240 ? `${rawLine.slice(0, 237)}...` : rawLine; + this.#log(` ${this.#paint(ANSI.dim, "raw")} ${clippedRaw}`); + } + } + } + + if (!this.#isTty) { + const status = event.result?.success ? "completed" : "failed"; + this.#log(` [${event.taskId}] Run ${event.runIndex + 1}/${this.#runsPerTask} ${status}`); + } + + this.#renderLine(); + } + + finish(): void { + this.#flushLine(); + this.#printSummary(); + } + + #printSummary(): void { + const n = this.#completed; + const denom = n || 1; + + const successRate = (this.#success / denom) * 100; + const editSuccessRate = this.#totalEdits > 0 ? (this.#totalEditSuccesses / this.#totalEdits) * 100 : 100; + const avgIndent = + this.#indentScores.length > 0 ? this.#indentScores.reduce((a, b) => a + b, 0) / this.#indentScores.length : 0; + + this.#log(""); + this.#log(this.#paint(ANSI.bold, "Runtime Stats:")); + this.#log( + ` Task success: ${this.#paint(rateColor(successRate), `${successRate.toFixed(1)}% (${this.#success}/${n})`)}`, + ); + this.#log( + ` Edit success: ${this.#paint(rateColor(editSuccessRate), `${editSuccessRate.toFixed(1)}% (${this.#totalEditSuccesses}/${this.#totalEdits})`)}`, + ); + this.#log(` Avg indent score: ${avgIndent.toFixed(2)}`); + this.#log(` Tool calls: read=${this.#totalReads} edit=${this.#totalEdits} write=${this.#totalWrites}`); + this.#log(` Tool input chars: ${this.#totalToolInputChars.toLocaleString()}`); + const fmtTokens = (samples: number[]): string => { + if (samples.length === 0) return "mean=0 median=0 p1=0 p99=0"; + const sorted = [...samples].sort((a, b) => a - b); + const mean = Math.round(sorted.reduce((a, b) => a + b, 0) / sorted.length); + return `mean=${mean} median=${Math.round(percentile(sorted, 50))} p1=${Math.round(percentile(sorted, 1))} p99=${Math.round(percentile(sorted, 99))}`; + }; + this.#log(` Tokens/task in: ${fmtTokens(this.#inputTokens)}`); + this.#log(` Tokens/task out: ${fmtTokens(this.#outputTokens)}`); + this.#log(` Tokens/task tot: ${fmtTokens(this.#totalTokens)}`); + this.#log(` Tokens/task (one-shot successes): ${fmtTokens(this.#oneShotSuccessTokens)}`); + this.#log(` Avg time/task: ${Math.round(this.#totalDuration / denom)}ms`); + } + + #renderLine(): void { + if (!this.#isTty) { + return; + } + const successRate = this.#completed > 0 ? (this.#success / this.#completed) * 100 : 0; + const editRate = this.#totalEdits > 0 ? (this.#totalEditSuccesses / this.#totalEdits) * 100 : 100; + const avgInput = this.#completed > 0 ? Math.round(this.#totalInput / this.#completed) : 0; + const avgOutput = this.#completed > 0 ? Math.round(this.#totalOutput / this.#completed) : 0; + const avgDuration = this.#completed > 0 ? Math.round(this.#totalDuration / this.#completed) : 0; + const inFlight = this.#started - this.#completed; + const bar = this.#renderBar(this.#completed, this.#totalRuns, 20); + const progress = this.#paint(ANSI.bold, `${this.#completed}/${this.#totalRuns}`); + const taskCol = `task=${this.#paint(rateColor(successRate), `${successRate.toFixed(0)}%`)}`; + const editCol = `edit=${this.#paint(rateColor(editRate), `${editRate.toFixed(0)}%`)}`; + const tokCol = this.#paint(ANSI.dim, `tok=${avgInput}/${avgOutput}`); + const durCol = this.#paint(ANSI.dim, `${avgDuration}ms`); + const rewCol = this.#paint(ANSI.dim, `r/e/w=${this.#totalReads}/${this.#totalEdits}/${this.#totalWrites}`); + const flyCol = `fly=${this.#paint(ANSI.cyan, String(inFlight))}`; + const line = ` ${bar} ${progress} ${taskCol} ${editCol} ${tokCol} ${durCol} ${rewCol} ${flyCol}`; + this.#writeLine(line); + } + + #renderBar(done: number, total: number, width: number): string { + const ratio = total === 0 ? 0 : done / total; + const filled = Math.round(ratio * width); + const empty = Math.max(0, width - filled); + const filledPart = this.#paint(ANSI.green, "#".repeat(filled)); + const emptyPart = this.#paint(ANSI.dim, "-".repeat(empty)); + return `[${filledPart}${emptyPart}]`; + } + + #writeLine(line: string): void { + const lineWidth = Bun.stringWidth(line); + const pad = this.#lastLineLength > lineWidth ? " ".repeat(this.#lastLineLength - lineWidth) : ""; + process.stderr.write(`\r${line}${pad}`); + this.#lastLineLength = lineWidth; + } + + #flushLine(): void { + if (!this.#isTty) { + return; + } + if (this.#lastLineLength > 0) { + process.stderr.write(`\r${" ".repeat(this.#lastLineLength)}\r`); + this.#lastLineLength = 0; + } + } +} diff --git a/packages/metaharness/adapters/edit/report.ts b/packages/metaharness/adapters/edit/report.ts index bf0274cd3..5943587bf 100644 --- a/packages/metaharness/adapters/edit/report.ts +++ b/packages/metaharness/adapters/edit/report.ts @@ -212,17 +212,19 @@ export function generateReport(result: BenchmarkResult): string { lines.push(""); if (summary.hashlineEditSubtypes) { - const order = ["set", "set_range", "insert"] as const; - const total = order.reduce((sum, key) => sum + (summary.hashlineEditSubtypes?.[key] ?? 0), 0); + const rows = Object.entries(summary.hashlineEditSubtypes) + .filter(([, count]) => count > 0) + .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0])); + const total = rows.reduce((sum, [, count]) => sum + count, 0); if (total > 0) { - lines.push("### Hashline Edit Subtypes"); + lines.push("### Hashline Op Breakdown"); + lines.push(""); + lines.push("All attempted edit calls across all runs (retries and failed calls included)."); lines.push(""); lines.push("| Operation | Count | % |"); lines.push("|-----------|-------|---|"); - for (const key of order) { - const count = summary.hashlineEditSubtypes[key] ?? 0; - const pct = formatPercent(count / total); - lines.push(`| ${key} | ${count} | ${pct} |`); + for (const [op, count] of rows) { + lines.push(`| \`${op}\` | ${count} | ${formatPercent(count / total)} |`); } lines.push(`| **Total** | **${total}** | 100% |`); lines.push(""); diff --git a/packages/metaharness/adapters/edit/runner.ts b/packages/metaharness/adapters/edit/runner.ts index 47568e6af..397c55caf 100644 --- a/packages/metaharness/adapters/edit/runner.ts +++ b/packages/metaharness/adapters/edit/runner.ts @@ -7,7 +7,12 @@ /// import * as fs from "node:fs"; import * as path from "node:path"; -import { formatHashlineHeader, InMemorySnapshotStore } from "@oh-my-pi/hashline"; +import { + type BlockTarget as HashlineBlockTarget, + formatHashlineHeader, + InMemorySnapshotStore, + Tokenizer as HashlineTokenizer, +} from "@oh-my-pi/hashline"; import type { AgentMessage, ResolvedThinkingLevel, ThinkingLevel } from "@oh-my-pi/pi-agent-core"; import type { Model, ToolExample } from "@oh-my-pi/pi-ai"; import { formatSessionDumpText, RpcClient } from "@oh-my-pi/pi-coding-agent"; @@ -262,7 +267,6 @@ function countEditFailureCategories(runs: TaskRunResult[]): Record { - const counts: Record = Object.fromEntries(HL_SUBTYPES.map(k => [k, 0])); - if (!args || typeof args !== "object") return counts; - const edits = (args as { edits?: unknown[] }).edits; - if (!Array.isArray(edits)) return counts; - for (const edit of edits) { - if (!edit || typeof edit !== "object") continue; - for (const key of HL_SUBTYPES) { - if (key in edit) { - counts[key]++; - break; +// Pure classification — single shared tokenizer is safe. +const HASHLINE_OP_TOKENIZER = new HashlineTokenizer(); + +/** Display label for a hashline op header, e.g. `SWAP.BLK` or `PASTE.POST`. */ +function hashlineOpLabel(target: HashlineBlockTarget): string { + switch (target.kind) { + case "replace": + return "SWAP"; + case "block": + return "SWAP.BLK"; + case "delete": + return "DEL"; + case "delete_block": + return "DEL.BLK"; + case "insert_before": + return "INS.PRE"; + case "insert_after": + return "INS.POST"; + case "bof": + return "INS.HEAD"; + case "eof": + return "INS.TAIL"; + case "insert_after_block": + return "INS.BLK.POST"; + case "copy": + return target.cut ? "CUT" : "COPY"; + case "copy_block": + return target.cut ? "CUT.BLK" : "COPY.BLK"; + case "paste": + switch (target.cursor.kind) { + case "before_anchor": + return "PASTE.PRE"; + case "after_anchor": + return "PASTE.POST"; + case "bof": + return "PASTE.HEAD"; + case "eof": + return "PASTE.TAIL"; } - } + break; + case "paste_after_block": + return "PASTE.BLK.POST"; + case "rem": + return "REM"; + case "move": + return "MV"; } - return counts; +} + +/** + * Count hashline op headers (`SWAP`, `DEL.BLK`, `CUT`, `PASTE.POST`, …) in an + * edit call's patch input. Returns `null` when the args carry no hashline + * patch — non-hashline edit variants and malformed calls contribute nothing. + */ +function countHashlineOps(args: unknown): Record | null { + if (!args || typeof args !== "object" || !("input" in args)) return null; + const input = args.input; + if (typeof input !== "string" || input.length === 0) return null; + const counts: Record = {}; + for (const token of HASHLINE_OP_TOKENIZER.tokenizeAll(input)) { + if (token.kind !== "op-block") continue; + const label = hashlineOpLabel(token.target); + counts[label] = (counts[label] ?? 0) + 1; + } + return Object.keys(counts).length > 0 ? counts : null; } async function collectOriginalFileContents(cwd: string, files: string[]): Promise> { @@ -829,7 +883,7 @@ export interface TaskRunResult { editFailures: EditFailure[]; editWarnings: string[]; editAutocorrectCount: number; - /** Hashline edit subtype counts (replaceLine, replaceLines, etc.) — only when editVariant is hashline */ + /** Hashline op counts (`SWAP`, `DEL.BLK`, `CUT`, …) — present when edit calls carried hashline patches. */ hashlineEditSubtypes?: Record; mutationIntentMatched?: boolean; mutationIntentReason?: string; @@ -945,7 +999,7 @@ export interface BenchmarkSummary { mutationIntentMatchRate?: number; /** Edit failure categories across all runs. */ editFailureCategories: Record; - /** Hashline edit subtype totals across all runs — only when editVariant is hashline. */ + /** Hashline op totals across all runs — present when any run's edit calls carried hashline patches. */ hashlineEditSubtypes?: Record; } @@ -1037,7 +1091,7 @@ async function runSingleTask( editAutocorrects: 0, totalInputChars: 0, }; - const hashlineSubtypes: Record = Object.fromEntries(HL_SUBTYPES.map(k => [k, 0])); + const hashlineSubtypes: Record = {}; const logFile = path.join(TMP, `run-${task.id}-${runIndex}.jsonl`); const logEvent = async (event: unknown) => { @@ -1271,10 +1325,10 @@ async function runSingleTask( const pendingEdit = pendingEdits.get(e.toolCallId) ?? { args: null }; const args = pendingEdit.args; pendingEdits.delete(e.toolCallId); - if (config.editVariant === "hashline" && args) { - const counts = countHashlineEditSubtypes(args); - for (const key of HL_SUBTYPES) { - hashlineSubtypes[key] += counts[key]; + const hashlineOpCounts = countHashlineOps(args); + if (hashlineOpCounts) { + for (const key in hashlineOpCounts) { + hashlineSubtypes[key] = (hashlineSubtypes[key] ?? 0) + hashlineOpCounts[key]; } } if (e.isError) { @@ -1422,7 +1476,7 @@ async function runSingleTask( editFailures, editWarnings, editAutocorrectCount, - hashlineEditSubtypes: config.editVariant === "hashline" ? hashlineSubtypes : undefined, + hashlineEditSubtypes: Object.keys(hashlineSubtypes).length > 0 ? hashlineSubtypes : undefined, mutationIntentMatched: mutationIntentValidation?.matched, mutationIntentReason: mutationIntentValidation?.reason, timeoutTelemetry, @@ -1936,12 +1990,20 @@ export function buildBenchmarkResult(params: { 0, ); const editFailureCategories = countEditFailureCategories(nonGhostRuns); + // Op counts aggregate every attempted edit call across ALL runs (retries and + // failed calls included) — deliberately: the mix shows what the model reaches + // for, not just what landed. Best-run-only would hide exactly the flailing + // (failed SWAPs before a successful retry) this table exists to expose. + const hashlineEditSubtypeTotals: Record = {}; + for (const run of allRuns) { + const runOps = run.hashlineEditSubtypes; + if (!runOps) continue; + for (const key in runOps) { + hashlineEditSubtypeTotals[key] = (hashlineEditSubtypeTotals[key] ?? 0) + runOps[key]; + } + } const hashlineEditSubtypes: Record | undefined = - params.config.editVariant === "hashline" - ? Object.fromEntries( - HL_SUBTYPES.map(key => [key, allRuns.reduce((sum, r) => sum + (r.hashlineEditSubtypes?.[key] ?? 0), 0)]), - ) - : undefined; + Object.keys(hashlineEditSubtypeTotals).length > 0 ? hashlineEditSubtypeTotals : undefined; // Primary aggregates run over the *best* run of each completed task. const bestRuns: TaskRunResult[] = []; diff --git a/packages/metaharness/package.json b/packages/metaharness/package.json index c41e98cb0..cbbedf4fc 100644 --- a/packages/metaharness/package.json +++ b/packages/metaharness/package.json @@ -20,6 +20,7 @@ "check:types": "tsgo -p tsconfig.json --noEmit && tsgo -p adapters/edit/tsconfig.json --noEmit && tsgo -p scripts/tsconfig.json --noEmit", "lint": "biome lint .", "serve": "bun run src/server.ts", + "bench:edit": "bun adapters/edit/cli.ts", "dev": "bun --hot src/server.ts", "test": "bun test" }, From 6b4efa896f926aefa2ded9bc33528bb7e6abfe91 Mon Sep 17 00:00:00 2001 From: can1357 Date: Thu, 30 Jul 2026 06:14:53 +0200 Subject: [PATCH 06/19] feat(coding-agent): implemented oauth credential pin persistence and seeding - Added hashing utilities and session entry definitions for OAuth credential pins. - Added session manager methods to append and retrieve credential pins with backdated timestamp support. - Added credential pin recording after assistant turns and seeding during session restoration. - Added comprehensive unit tests covering credential pin recording, persistence, and seeding. --- packages/ai/CHANGELOG.md | 1 + packages/ai/src/auth-storage.ts | 23 ++- packages/coding-agent/CHANGELOG.md | 1 + .../coding-agent/src/session/agent-session.ts | 18 ++ .../src/session/credential-pin.ts | 93 +++++++++ .../src/session/session-entries.ts | 22 ++- .../src/session/session-manager.ts | 37 ++++ .../coding-agent/test/credential-pin.test.ts | 185 ++++++++++++++++++ 8 files changed, 375 insertions(+), 5 deletions(-) create mode 100644 packages/coding-agent/src/session/credential-pin.ts create mode 100644 packages/coding-agent/test/credential-pin.test.ts diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 6aec9a351..000e05848 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -9,6 +9,7 @@ - Added interactive Exa API-key login through `/login exa`, opening the official API-key dashboard and saving pasted keys to the credential store ([#1798](https://github.com/can1357/oh-my-pi/issues/1798)). - Cursor's modern exec wire protocol is now handled end to end. `agent.proto` models the frames current Cursor CLI builds emit — the seven Pi tools (`ExecServerMessage` 45-51), hooks, subagents, allowlist prechecks, MCP state, smart-mode classification, canvas diagnostics, conversation search, agent-store conflicts and git diff — and every one of them gets a typed answer. The Pi frames run their local equivalents (`read`/`bash`/`edit`/`write`/`grep`/`glob`); the rest answer with the error, not-found or empty-but-valid variant that is actually true of this client. Frames this build cannot name at all now raise `ExecClientControlMessage.throw` with `unknown_exec_variant`, and recognised frames with no truthful answer (`git_diff_request`, whose `GetDiffResponse` has no error variant) raise `exec_variant_unsupported`, instead of a silent ack that leaves the server waiting. - `lsp` is advertised in the MCP tool catalog again. It was filtered out as a Cursor-native tool, but the native `diagnostics` frame covers one of roughly ten LSP actions, so the other nine were unreachable. +- Added `pinSessionOAuthAccount` support for backdating the sticky's last-use timestamp (`options.lastUsedAtMs`), so pins restored from persisted sessions keep the provider's warm-window semantics: resumes inside the prompt-cache TTL reuse the account, stale resumes still re-rank. ### Changed diff --git a/packages/ai/src/auth-storage.ts b/packages/ai/src/auth-storage.ts index 583c6ab72..dd60b2a1c 100644 --- a/packages/ai/src/auth-storage.ts +++ b/packages/ai/src/auth-storage.ts @@ -1811,15 +1811,20 @@ export class AuthStorage { } } - /** Records which credential was used for a session (for rate-limit switching). */ + /** + * Records which credential was used for a session (for rate-limit switching). + * `lastUsedAtMs` backdates the sticky (session-file pin restores on resume); + * it defaults to now for live selections. + */ #recordSessionCredential( provider: string, sessionId: string | undefined, type: AuthCredential["type"], index: number, + lastUsedAtMs?: number, ): void { if (!sessionId) return; - const nowMs = Date.now(); + const nowMs = lastUsedAtMs ?? Date.now(); const sessionMap = this.#sessionLastCredential.get(provider) ?? new Map(); sessionMap.set(sessionId, { type, index, lastUsedAtMs: nowMs }); this.#sessionLastCredential.set(provider, sessionMap); @@ -5403,8 +5408,18 @@ export class AuthStorage { * The durable credential id keeps the pin stable across credential refreshes, * storage reordering, and process restarts. Normal auth retry and usage-limit * handling may still route around an unavailable account. + * + * `options.lastUsedAtMs` backdates the sticky's last-use timestamp so a pin + * restored from a persisted session keeps the provider's warm-window + * semantics: a resume inside the prompt-cache TTL reuses the account, a + * stale resume still re-ranks. */ - pinSessionOAuthAccount(provider: string, sessionId: string, credentialId: number): boolean { + pinSessionOAuthAccount( + provider: string, + sessionId: string, + credentialId: number, + options?: { lastUsedAtMs?: number }, + ): boolean { if (!sessionId || this.#runtimeOverrides.has(provider) || this.#configOverrides.has(provider)) { return false; } @@ -5412,7 +5427,7 @@ export class AuthStorage { const index = stored.findIndex(entry => entry.id === credentialId); const target = stored[index]; if (target?.credential.type !== "oauth") return false; - this.#recordSessionCredential(provider, sessionId, "oauth", index); + this.#recordSessionCredential(provider, sessionId, "oauth", index, options?.lastUsedAtMs); return true; } diff --git a/packages/coding-agent/CHANGELOG.md b/packages/coding-agent/CHANGELOG.md index 92cead391..b30b584a1 100644 --- a/packages/coding-agent/CHANGELOG.md +++ b/packages/coding-agent/CHANGELOG.md @@ -22,6 +22,7 @@ ### Fixed +- Fixed Anthropic prompt-cache cold misses on session resume with multiple OAuth accounts: the account that served a session is now recorded in the session file (as a `credential_pin` sha-256 of the account + org/project scope, so exports carry no plaintext identity) and re-pinned on resume with the session's effective last-use time, so a fresh process no longer re-ranks accounts by usage headroom — which systematically routed away from the just-used account and cold-missed the entire account-scoped cache prefix. Sticky routing was previously stored only in the auth store's KV cache, which is in-memory when a remote auth broker is configured. - Fixed concurrent `createAgentSession` calls with the default agent id failing initialization with `Agent "Main" was replaced during session initialization` — each in-process embedder (e.g. the edit benchmark runner) can now pass a private registry via the newly exported `AgentRegistry`, keeping every top-level session's "Main" out of the process-global roster race. - Fixed task tool blocks duplicating their per-agent progress rows into terminal scrollback on every update: live task frames now pin the transcript live region so mid-run rows are never recorded as frozen snapshots, and a detached background task freezes its progress the moment any of its rows commit to scrollback instead of mutating committed history. - Fixed Codex reset fireworks comparing different quota tiers or plans, preventing false celebrations when usage reports switch between Spark and base weekly limits. diff --git a/packages/coding-agent/src/session/agent-session.ts b/packages/coding-agent/src/session/agent-session.ts index 4117c17aa..2011e7b61 100644 --- a/packages/coding-agent/src/session/agent-session.ts +++ b/packages/coding-agent/src/session/agent-session.ts @@ -249,6 +249,7 @@ import { shouldEvaluateCodexAutoRedeem, shouldPromptCodexAutoRedeem, } from "./codex-auto-reset"; +import { recordCredentialPin, seedCredentialPins } from "./credential-pin"; import { EvalRunner, type EvalRunnerHost } from "./eval-runner"; import { collectPendingToolCalls, @@ -2428,6 +2429,15 @@ export class AgentSession { }, costUsd: assistantMsg.usage.cost.total, }); + // Persist which account served this turn so a resumed process can + // re-pin it and keep the provider's account-scoped prompt cache + // warm (broker-mode sticky routing is process-local). + recordCredentialPin( + this.#modelRegistry.authStorage, + this.sessionManager, + this.sessionId, + assistantMsg.provider, + ); } if (event.message.role === "toolResult") { const { toolName, toolCallId, isError, content } = event.message; @@ -3400,6 +3410,14 @@ export class AgentSession { this.agent.setMetadataResolver((provider: string) => buildSessionMetadata(sid, provider, this.#modelRegistry.authStorage), ); + // Restore the session's recorded provider accounts before the first + // request routes: sticky rows are process-local under a remote auth + // broker, and losing them re-ranks onto a different account, cold-missing + // the account-scoped prompt cache. Skipped for fresh provider sessions — + // those explicitly want new routing identity. + if (!this.#freshProviderSessionId) { + seedCredentialPins(this.#modelRegistry.authStorage, this.sessionManager, sid); + } // Keep every live advisor's provider identity in lockstep with the primary's // across every session-boundary transition — including branch paths that // skip conversation restore — so advisors never emit the previous diff --git a/packages/coding-agent/src/session/credential-pin.ts b/packages/coding-agent/src/session/credential-pin.ts new file mode 100644 index 000000000..c7c6b99f2 --- /dev/null +++ b/packages/coding-agent/src/session/credential-pin.ts @@ -0,0 +1,93 @@ +/** + * Session-file persistence of the OAuth account that served a session. + * + * Provider prompt caches are account-scoped (Anthropic bills a full cache + * re-write after an account flip), and the auth store's session-sticky routing + * is process-local when a remote auth broker is configured — the broker + * store's KV cache is in-memory, so sticky rows die with the CLI process. + * Resuming a session in a fresh process then re-ranks accounts by usage + * headroom, which is biased *away* from the account that just served the + * session (it has the highest recent burn), cold-missing the entire prefix. + * + * These helpers close the loop through the session file itself: after each + * assistant turn the serving account is recorded as a `credential_pin` entry, + * and on session adoption the pin is matched against the stored accounts and + * seeded back into the auth store with the session's effective last-use + * timestamp, so the provider's warm-window semantics still decide whether to + * stick or re-rank. + */ + +import type { AuthStorage } from "./auth-storage"; +import type { SessionManager } from "./session-manager"; + +/** Account fields shared by `OAuthAccountIdentity` and `OAuthAccountSummary`. */ +interface CredentialPinIdentity { + accountId?: string; + email?: string; + projectId?: string; + orgId?: string; +} + +/** + * Stable identifier for a provider account within its billing scope. The + * digest covers the full scope tuple — the same account in two orgs (Anthropic + * multi-subscription) or projects (Gemini) is two distinct cache domains and + * must produce two distinct pins. The digest input is the persisted contract + * for `CredentialPinEntry.hash` — changing it orphans every recorded pin. + * + * Hashing avoids embedding raw emails/uuids in session files, but an unsalted + * digest of a guessable email is still linkable — treat exported sessions + * accordingly. + * + * Returns `undefined` when the identity carries no account key at all. + */ +export function credentialPinHash(provider: string, identity: CredentialPinIdentity): string | undefined { + if (!identity.accountId && !identity.email) return undefined; + const key = [ + provider, + identity.accountId ?? "", + identity.email ?? "", + identity.orgId ?? "", + identity.projectId ?? "", + ].join("\0"); + return new Bun.CryptoHasher("sha256").update(key).digest("hex"); +} + +/** + * Record the account that served the latest assistant turn for `provider`. + * Appends a `credential_pin` entry only when the account differs from the + * branch's latest pin, so steady-state sessions add a single entry; the + * effective last-use time is derived from later assistant turns on read + * (see `SessionManager.getCredentialPins`). + */ +export function recordCredentialPin( + authStorage: AuthStorage, + sessionManager: SessionManager, + sessionId: string, + provider: string, +): void { + const identity = authStorage.getOAuthAccountIdentity(provider, sessionId); + if (!identity) return; + const hash = credentialPinHash(provider, identity); + if (!hash || sessionManager.getCredentialPins().get(provider)?.hash === hash) return; + sessionManager.appendCredentialPin(provider, hash); +} + +/** + * Re-pin the accounts recorded in the session file onto the auth store's + * session stickiness. No-op per provider when the account is gone (logged out) + * or when a live sticky already exists (same-process branch/session switches + * must not clobber fresher routing). Seeds with the session's effective + * last-use time so stale resumes still fall through to usage ranking. + */ +export function seedCredentialPins(authStorage: AuthStorage, sessionManager: SessionManager, sessionId: string): void { + for (const [provider, pin] of sessionManager.getCredentialPins()) { + const accounts = authStorage.listOAuthAccounts(provider, sessionId); + if (accounts.length === 0 || accounts.some(account => account.active)) continue; + const match = accounts.find(account => credentialPinHash(provider, account) === pin.hash); + if (!match) continue; + authStorage.pinSessionOAuthAccount(provider, sessionId, match.credentialId, { + lastUsedAtMs: pin.lastUsedAt, + }); + } +} diff --git a/packages/coding-agent/src/session/session-entries.ts b/packages/coding-agent/src/session/session-entries.ts index 630361a8f..2386ed829 100644 --- a/packages/coding-agent/src/session/session-entries.ts +++ b/packages/coding-agent/src/session/session-entries.ts @@ -154,6 +154,7 @@ export interface TitleChangeEntry extends SessionEntryBase { declare module "@oh-my-pi/pi-agent-core/compaction/entries" { interface CustomCompactionSessionEntries { titleChange: TitleChangeEntry; + credentialPin: CredentialPinEntry; } } @@ -164,6 +165,24 @@ export interface TtsrInjectionEntry extends SessionEntryBase { injectedRules: string[]; } +/** + * Records which OAuth account served this session's requests for a provider. + * + * Provider prompt caches (Anthropic in particular) are account-scoped, and the + * auth store's session-sticky routing is process-local under a remote auth + * broker, so resume must re-pin the same account to reuse the warm cache + * prefix. Stores a sha-256 of the account + billing-scope tuple instead of + * the raw email/uuid/org; note an unsalted digest of a guessable email is + * still linkable, so exported sessions are pseudonymous, not anonymous. + */ +export interface CredentialPinEntry extends SessionEntryBase { + type: "credential_pin"; + /** Provider id the pin applies to (e.g. "anthropic"). */ + provider: string; + /** `credentialPinHash()` of the serving account's identity + scope tuple. */ + hash: string; +} + /** Session init entry - captures initial context for subagent sessions (debugging/replay). */ export interface SessionInitEntry extends SessionEntryBase { type: "session_init"; @@ -230,7 +249,8 @@ export type SessionEntry = | TitleChangeEntry | TtsrInjectionEntry | SessionInitEntry - | ModeChangeEntry; + | ModeChangeEntry + | CredentialPinEntry; /** Raw logical file entry after loaders strip any fixed-width title slot. */ export type FileEntry = SessionHeader | SessionEntry; diff --git a/packages/coding-agent/src/session/session-manager.ts b/packages/coding-agent/src/session/session-manager.ts index 083d6cd2a..ffe1dd712 100644 --- a/packages/coding-agent/src/session/session-manager.ts +++ b/packages/coding-agent/src/session/session-manager.ts @@ -35,6 +35,7 @@ import { type BuildSessionContextOptions, buildSessionContext, type SessionConte import { type BranchSummaryEntry, type CompactionEntry, + type CredentialPinEntry, CURRENT_SESSION_VERSION, type CustomEntry, type CustomMessageEntry, @@ -179,6 +180,7 @@ function isDraftOnlyMetadataEntry(entry: SessionEntry): boolean { case "thinking_level_change": case "service_tier_change": case "mode_change": + case "credential_pin": return true; default: return false; @@ -2062,6 +2064,41 @@ export class SessionManager { return [...names]; } + /** Append a credential pin recording which OAuth account served `provider`. */ + appendCredentialPin(provider: string, hash: string): string { + const entry: CredentialPinEntry = { + type: "credential_pin", + ...this.#freshEntryFields(), + provider, + hash, + }; + this.#recordEntry(entry); + return entry.id; + } + + /** + * Latest credential pin per provider on the current branch (root → leaf), + * with the effective last-use time of the pinned account. + * + * Pins are appended only when the serving account *changes*, so a long + * session on one account carries a single old pin entry. Any assistant turn + * for the same provider after that pin was necessarily served by the pinned + * account, so its timestamp advances `lastUsedAt` — a resume seconds after + * the last turn seeds a warm sticky instead of a stale one. + */ + getCredentialPins(): Map { + const pins = new Map(); + for (const entry of this.getBranch()) { + if (entry.type === "credential_pin") { + pins.set(entry.provider, { hash: entry.hash, lastUsedAt: new Date(entry.timestamp).getTime() }); + } else if (entry.type === "message" && entry.message.role === "assistant") { + const pin = pins.get(entry.message.provider); + if (pin) pin.lastUsedAt = Math.max(pin.lastUsedAt, entry.message.timestamp); + } + } + return pins; + } + getLeafId(): string | null { return this.#index.leafId(); } diff --git a/packages/coding-agent/test/credential-pin.test.ts b/packages/coding-agent/test/credential-pin.test.ts new file mode 100644 index 000000000..5763976b1 --- /dev/null +++ b/packages/coding-agent/test/credential-pin.test.ts @@ -0,0 +1,185 @@ +import { Database } from "bun:sqlite"; +import { afterEach, beforeEach, describe, expect, test } from "bun:test"; +import { TempDir } from "@oh-my-pi/pi-utils"; +import { AuthStorage, SqliteAuthCredentialStore } from "../src/session/auth-storage"; +import { credentialPinHash, recordCredentialPin, seedCredentialPins } from "../src/session/credential-pin"; +import { SessionManager } from "../src/session/session-manager"; + +const ANTHROPIC_ENV = ["ANTHROPIC_API_KEY", "ANTHROPIC_OAUTH_TOKEN"] as const; +const savedEnv: Partial> = {}; + +function mintOAuthCredential(suffix: string, extra?: { orgId?: string }) { + return { + type: "oauth" as const, + access: `access-${suffix}`, + refresh: `refresh-${suffix}`, + expires: Date.now() + 60_000, + accountId: `account-${suffix}`, + email: `${suffix}@example.com`, + ...extra, + }; +} + +function assistantMessage(provider: string, timestamp: number) { + return { + role: "assistant" as const, + content: [{ type: "text" as const, text: "hi" }], + api: "anthropic-messages", + provider, + model: "claude-test", + usage: { + input: 1, + output: 1, + cacheRead: 0, + cacheWrite: 0, + totalTokens: 2, + cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 }, + }, + stopReason: "stop" as const, + timestamp, + }; +} + +describe("credential pins", () => { + let tempDir: TempDir; + let storage: AuthStorage; + + beforeEach(async () => { + for (const key of ANTHROPIC_ENV) { + savedEnv[key] = process.env[key]; + delete process.env[key]; + } + tempDir = TempDir.createSync("@pi-credential-pin-"); + const store = new SqliteAuthCredentialStore(new Database(":memory:")); + store.saveOAuth("anthropic", mintOAuthCredential("a")); + store.saveOAuth("anthropic", mintOAuthCredential("b")); + storage = new AuthStorage(store); + await storage.reload(); + }); + + afterEach(() => { + for (const key of ANTHROPIC_ENV) { + const value = savedEnv[key]; + if (value === undefined) delete process.env[key]; + else process.env[key] = value; + } + tempDir[Symbol.dispose](); + }); + + test("pin entries survive a session reload and the latest pin per provider wins", async () => { + const manager = SessionManager.create(tempDir.path(), tempDir.path()); + manager.appendMessage({ role: "user", content: "hello", timestamp: Date.now() }); + manager.appendMessage(assistantMessage("anthropic", Date.now())); + manager.appendCredentialPin("anthropic", "hash-old"); + manager.appendCredentialPin("openai-codex", "hash-codex"); + manager.appendCredentialPin("anthropic", "hash-new"); + await manager.flush(); + const file = manager.getSessionFile(); + if (!file) throw new Error("expected a persisted session file"); + + const reopened = await SessionManager.open(file); + const pins = reopened.getCredentialPins(); + expect(pins.get("anthropic")?.hash).toBe("hash-new"); + expect(pins.get("openai-codex")?.hash).toBe("hash-codex"); + }); + + test("later assistant turns advance the pin's effective last-use; other providers and new pins do not", () => { + const manager = SessionManager.create(tempDir.path(), tempDir.path()); + const pinId = manager.appendCredentialPin("anthropic", "hash-a"); + const pinnedAt = new Date(manager.getEntry(pinId)!.timestamp).getTime(); + + // Long session on one account: no new pin entries, only assistant turns. + const lastTurnAt = pinnedAt + 3 * 60 * 60 * 1000; + manager.appendMessage(assistantMessage("anthropic", pinnedAt + 60_000)); + manager.appendMessage(assistantMessage("anthropic", lastTurnAt)); + expect(manager.getCredentialPins().get("anthropic")?.lastUsedAt).toBe(lastTurnAt); + + // A different provider's turn never advances this provider's pin. + manager.appendMessage(assistantMessage("openai-codex", lastTurnAt + 60_000)); + expect(manager.getCredentialPins().get("anthropic")?.lastUsedAt).toBe(lastTurnAt); + + // An account change re-bases last-use at the new pin. + const newPinId = manager.appendCredentialPin("anthropic", "hash-b"); + const newPinnedAt = new Date(manager.getEntry(newPinId)!.timestamp).getTime(); + expect(manager.getCredentialPins().get("anthropic")?.lastUsedAt).toBe(newPinnedAt); + }); + + test("seeding re-pins the recorded account in a store with no session stickiness", () => { + const manager = SessionManager.create(tempDir.path(), tempDir.path()); + const sessionId = manager.getSessionId(); + const hash = credentialPinHash("anthropic", { accountId: "account-b", email: "b@example.com" }); + if (!hash) throw new Error("expected a pin hash"); + manager.appendCredentialPin("anthropic", hash); + + // Fresh process: no sticky exists yet (the broker-mode resume scenario). + expect(storage.listOAuthAccounts("anthropic", sessionId).some(account => account.active)).toBe(false); + + seedCredentialPins(storage, manager, sessionId); + + const active = storage.listOAuthAccounts("anthropic", sessionId).find(account => account.active); + expect(active?.accountId).toBe("account-b"); + }); + + test("pins are org-scoped: the same account in two orgs re-pins the matching org credential", async () => { + const store = new SqliteAuthCredentialStore(new Database(":memory:")); + store.saveOAuth("anthropic", mintOAuthCredential("x", { orgId: "org-1" })); + store.saveOAuth("anthropic", mintOAuthCredential("x", { orgId: "org-2" })); + const orgStorage = new AuthStorage(store); + await orgStorage.reload(); + + const manager = SessionManager.create(tempDir.path(), tempDir.path()); + const sessionId = manager.getSessionId(); + const identity = { accountId: "account-x", email: "x@example.com" }; + const orgTwoHash = credentialPinHash("anthropic", { ...identity, orgId: "org-2" }); + if (!orgTwoHash) throw new Error("expected a pin hash"); + expect(orgTwoHash).not.toBe(credentialPinHash("anthropic", { ...identity, orgId: "org-1" })); + manager.appendCredentialPin("anthropic", orgTwoHash); + + seedCredentialPins(orgStorage, manager, sessionId); + + const active = orgStorage.listOAuthAccounts("anthropic", sessionId).find(account => account.active); + expect(active?.orgId).toBe("org-2"); + }); + + test("seeding never clobbers a live sticky from the same process", () => { + const manager = SessionManager.create(tempDir.path(), tempDir.path()); + const sessionId = manager.getSessionId(); + const accounts = storage.listOAuthAccounts("anthropic", sessionId); + const accountA = accounts.find(account => account.accountId === "account-a"); + expect(storage.pinSessionOAuthAccount("anthropic", sessionId, accountA!.credentialId)).toBe(true); + + const hash = credentialPinHash("anthropic", { accountId: "account-b", email: "b@example.com" }); + manager.appendCredentialPin("anthropic", hash!); + seedCredentialPins(storage, manager, sessionId); + + const active = storage.listOAuthAccounts("anthropic", sessionId).find(account => account.active); + expect(active?.accountId).toBe("account-a"); + }); + + test("seeding is a no-op when the pinned account is no longer stored", () => { + const manager = SessionManager.create(tempDir.path(), tempDir.path()); + const sessionId = manager.getSessionId(); + const hash = credentialPinHash("anthropic", { accountId: "account-gone" }); + manager.appendCredentialPin("anthropic", hash!); + + seedCredentialPins(storage, manager, sessionId); + + expect(storage.listOAuthAccounts("anthropic", sessionId).some(account => account.active)).toBe(false); + }); + + test("recording appends the serving account's hash once and dedupes repeats", () => { + const manager = SessionManager.create(tempDir.path(), tempDir.path()); + const sessionId = manager.getSessionId(); + const accounts = storage.listOAuthAccounts("anthropic", sessionId); + const accountA = accounts.find(account => account.accountId === "account-a"); + storage.pinSessionOAuthAccount("anthropic", sessionId, accountA!.credentialId); + + recordCredentialPin(storage, manager, sessionId, "anthropic"); + recordCredentialPin(storage, manager, sessionId, "anthropic"); + + const entries = manager.getBranch().filter(entry => entry.type === "credential_pin"); + expect(entries).toHaveLength(1); + const identity = storage.getOAuthAccountIdentity("anthropic", sessionId); + expect(manager.getCredentialPins().get("anthropic")?.hash).toBe(credentialPinHash("anthropic", identity!)); + }); +}); From 52bd191b34c7e9044b82cda51f92e0df51693855 Mon Sep 17 00:00:00 2001 From: can1357 Date: Thu, 30 Jul 2026 07:20:27 +0200 Subject: [PATCH 07/19] build: optimized Bazel repository and toolchain caching for CI - Pin Rust toolchain component checksums in MODULE.bazel to enable Bazel's repo contents cache. - Opt MSVC LLVM tools, XWin sysroot, and Zig repositories into reproducible repo metadata caching. - Extend GitHub Actions cache paths to include the Bazel repository download and contents cache. --- .github/actions/bazel-cache/action.yml | 14 ++++++- .github/actions/bazel-natives/action.yml | 5 ++- MODULE.bazel | 39 +++++++++++++++++++ ..._cc_toolchain-isolated-compile-cache.patch | 27 ++++++++++++- bazel/toolchains/msvc/llvm.bzl | 6 +++ bazel/toolchains/msvc/sysroot.bzl | 8 ++++ 6 files changed, 95 insertions(+), 4 deletions(-) diff --git a/.github/actions/bazel-cache/action.yml b/.github/actions/bazel-cache/action.yml index 0d40424b0..6247e2c9f 100644 --- a/.github/actions/bazel-cache/action.yml +++ b/.github/actions/bazel-cache/action.yml @@ -77,7 +77,14 @@ runs: if: steps.backend.outputs.remote != 'true' uses: actions/cache/restore@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: - path: ~/.cache/omp-bazel-disk + # Both caches ride one archive: the action cache AND the repository + # cache (downloads + extracted repo contents at repo/contents, which + # reproducible repo rules reuse across output bases). Without the + # repo half, every hosted job re-downloaded and re-extracted the + # rust/LLVM/zig toolchains. Save sites must list the same paths. + path: | + ~/.cache/omp-bazel-disk + ~/.cache/omp-bazel-repo key: ${{ steps.backend.outputs.cache-key }} # Order matters: exact key, same-config prefix, then any archive for # this scope+os+arch. The bare fallback is what keeps release version @@ -130,7 +137,10 @@ runs: # generations wrote would otherwise ride along forever; drop # anything untouched for 14 days (tar preserves mtimes across # the actions/cache round trip, so age survives restores). - find "$HOME/.cache/omp-bazel-disk" -type f -mtime +14 -delete 2>/dev/null || true + # Covers the repo download/contents cache too — bazel's own + # contents-cache GC only runs on idle servers, which short-lived + # CI invocations never have. + find "$HOME/.cache/omp-bazel-disk" "$HOME/.cache/omp-bazel-repo" -type f -mtime +14 -delete 2>/dev/null || true { echo "common --config=ci" echo "common --disk_cache=$HOME/.cache/omp-bazel-disk" diff --git a/.github/actions/bazel-natives/action.yml b/.github/actions/bazel-natives/action.yml index 8dfbf9457..408548d1e 100644 --- a/.github/actions/bazel-natives/action.yml +++ b/.github/actions/bazel-natives/action.yml @@ -43,5 +43,8 @@ runs: if: steps.cache.outputs.save-needed == 'true' uses: actions/cache/save@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: - path: ~/.cache/omp-bazel-disk + # Must mirror the restore path list in the bazel-cache action. + path: | + ~/.cache/omp-bazel-disk + ~/.cache/omp-bazel-repo key: ${{ steps.cache.outputs.cache-key }} \ No newline at end of file diff --git a/MODULE.bazel b/MODULE.bazel index 7846ae953..74c8ed707 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -37,6 +37,45 @@ rust = use_extension("@rules_rust//rust:extensions.bzl", "rust") rust.toolchain( edition = "2024", versions = ["nightly/2026-04-29"], + # Pinned archive checksums for every toolchain component. Not (only) a + # supply-chain nicety: rules_rust marks a toolchain-tools repo as + # reproducible — and therefore eligible for Bazel's repo contents cache — + # only when every sha256 it needs was predeclared here (repositories.bzl: + # `reproducible = sha256s == dict(ctx.attr.sha256s)`). Without these, + # every fresh output base (= every ephemeral CI pod) re-downloaded and + # re-extracted ~5 rustc toolchains (~20 s each). Regenerate after a + # version bump: for each `-nightly-` below, take the value + # from https://static.rust-lang.org/dist//.tar.xz.sha256. + sha256s = { + "2026-04-29/cargo-nightly-aarch64-apple-darwin.tar.xz": "9165010618ad581a90bd3e74a36cab092e6f509c8e7ffdcfe00293257cafabb7", + "2026-04-29/cargo-nightly-aarch64-unknown-linux-gnu.tar.xz": "f9b463c3eadaf040b5028590c3d3072c8b0893f9863ed25138dfc54c254388e1", + "2026-04-29/cargo-nightly-x86_64-apple-darwin.tar.xz": "03cf3edb1d0b9564fd466553092ccec5c37be729c35df1d77f7c5a9206801638", + "2026-04-29/cargo-nightly-x86_64-unknown-linux-gnu.tar.xz": "0ae6ed5a9e262d082003d5804cd7fc6977057cfa3df721451e356347962f391f", + "2026-04-29/clippy-nightly-aarch64-apple-darwin.tar.xz": "84b933f8a2837c81adca3e3a44fed971ec0de27673e2c56f122f6d2b35ef9371", + "2026-04-29/clippy-nightly-aarch64-unknown-linux-gnu.tar.xz": "827c90b264a716475e85f51bd1999344af14648882cdd5a6d517a73c7e4c02c4", + "2026-04-29/clippy-nightly-x86_64-apple-darwin.tar.xz": "2c749f10bb18c752323b489e056c55f2e6e04ff3939d16444f4f0d960463d2d2", + "2026-04-29/clippy-nightly-x86_64-unknown-linux-gnu.tar.xz": "36a9409a58b3ac16ce9823d4e705055cad8144dd7f18464c028e3a06ae5d87c8", + "2026-04-29/llvm-tools-nightly-aarch64-apple-darwin.tar.xz": "c6a5cfd0c6133e1fae913a624bef2387a1b9c1e2e75316f9d9b6872a592a8b2c", + "2026-04-29/llvm-tools-nightly-aarch64-unknown-linux-gnu.tar.xz": "7e51dc58df2d0d9e263d629e6b149785bb61b716e267cc841556a4641ed52a50", + "2026-04-29/llvm-tools-nightly-x86_64-apple-darwin.tar.xz": "ab6cd3bae1c979fd807982b8c39e911227f9344dab5051d45f612b440dad13ff", + "2026-04-29/llvm-tools-nightly-x86_64-unknown-linux-gnu.tar.xz": "0fb4bed6714359d9505b870c8bd67c722266c5a3894f66523bc231b9c479db31", + "2026-04-29/rust-src-nightly.tar.xz": "2a9c5ae7696a808e30fc5169ddfea20d69571a11997f142944c022a0d30af48b", + "2026-04-29/rust-std-nightly-aarch64-apple-darwin.tar.xz": "cd9e231f3e343b4ed5cff5c384c813cecba13fca94ef767fa8dc4aa0ff58a171", + "2026-04-29/rust-std-nightly-aarch64-unknown-linux-gnu.tar.xz": "80dceec313e144e3cfc5d67326826d85c664e762a27b53fea018a96d537a2942", + "2026-04-29/rust-std-nightly-aarch64-unknown-linux-musl.tar.xz": "9d5cb99d5678b2310bd69b2b654e9dcbbc3c5a50f9b66d03a21745cff4444927", + "2026-04-29/rust-std-nightly-x86_64-apple-darwin.tar.xz": "4992887472dfdea66a7f96c85b81104b543974204f91722742bbe5453bce8ec1", + "2026-04-29/rust-std-nightly-x86_64-pc-windows-msvc.tar.xz": "890d91c1b86e482aaee32d793b366ee3889a9326143cd7f82a2b7507a4f4d592", + "2026-04-29/rust-std-nightly-x86_64-unknown-linux-gnu.tar.xz": "09774060c01c82005a2ae4e4b46a899c5e6157d6cc7188dfbb750c0a0f7c52cf", + "2026-04-29/rust-std-nightly-x86_64-unknown-linux-musl.tar.xz": "de5936933a2994ebff227b62fe41fca5707496d13da33563f2bfee3049e7b122", + "2026-04-29/rustc-nightly-aarch64-apple-darwin.tar.xz": "61fc2a3fd11637fbe9f961319aa16d84615d2a033de46909742000448290c687", + "2026-04-29/rustc-nightly-aarch64-unknown-linux-gnu.tar.xz": "d8c9d9117a0499b6891e4622c55c7be9568e6b0cbed4f53540e51459ab514633", + "2026-04-29/rustc-nightly-x86_64-apple-darwin.tar.xz": "66efb8a2fb4155cd010bafda3382f643d87f337b646542f7830eda36cf1571a4", + "2026-04-29/rustc-nightly-x86_64-unknown-linux-gnu.tar.xz": "b0db9dc4957c0f12ff8be0a30d22b411d4e2a7f434d747d767156be80d782f1d", + "2026-04-29/rustfmt-nightly-aarch64-apple-darwin.tar.xz": "56dcf5ac72bcf663687273b0b9cdf953537081f38a4592d3577e9a6502707b4b", + "2026-04-29/rustfmt-nightly-aarch64-unknown-linux-gnu.tar.xz": "b495726b0f311dcb53a8cf5325c61ef321f110a3739247536bc87109d428a3cc", + "2026-04-29/rustfmt-nightly-x86_64-apple-darwin.tar.xz": "9c64403758b4b631b60057f6ed4a93b02f19286a59a60f8ea235b4f7d4e1ba4c", + "2026-04-29/rustfmt-nightly-x86_64-unknown-linux-gnu.tar.xz": "397e4ead440f29a1fc10903388a377f5607a1d404c29dc3e3a979d2bc813a801", + }, extra_target_triples = [ "x86_64-unknown-linux-gnu", "aarch64-unknown-linux-gnu", diff --git a/bazel/patches/hermetic_cc_toolchain-isolated-compile-cache.patch b/bazel/patches/hermetic_cc_toolchain-isolated-compile-cache.patch index 52ac68089..5b14de212 100644 --- a/bazel/patches/hermetic_cc_toolchain-isolated-compile-cache.patch +++ b/bazel/patches/hermetic_cc_toolchain-isolated-compile-cache.patch @@ -12,9 +12,18 @@ dir. Link steps keep the shared cache: they are the ones that benefit battle-tested path for concurrent artifact builds, and after first warm they are pure readers. +Also opt @zig_config into Bazel's repo contents cache (repo_metadata, +bazel >= 8.3): the fetch is deterministic given the pinned zig archive and +wrapper source, and re-running it cost ~20 s of wrapper compilation on every +fresh output base — every job on ephemeral CI pods. + +Note: bazel's own patch parser (unlike GNU patch) requires the `diff --git` +separator line before each file section of a multi-file patch. + +diff --git a/toolchain/zig-wrapper.zig b/toolchain/zig-wrapper.zig --- a/toolchain/zig-wrapper.zig +++ b/toolchain/zig-wrapper.zig -@@ -252,6 +252,32 @@ fn parseArgs( +@@ -267,6 +267,32 @@ if (run_mode == RunMode.cc) try resolveColonLibraries(arena, cwd, &args); @@ -47,3 +56,19 @@ are pure readers. // Add -target as the last parameter. The wrapper should overwrite // the target specified by other tools calling the wrapper. // Some tools might pass LLVM target triple, which are rejected by zig. +diff --git a/toolchain/defs.bzl b/toolchain/defs.bzl +--- a/toolchain/defs.bzl ++++ b/toolchain/defs.bzl +@@ -278,6 +278,12 @@ + ) + repository_ctx.symlink("tools/zig-wrapper{}".format(exe), tool_path) + ++ # omp: opt into the repo contents cache — the fetch is deterministic ++ # given the pinned zig archive and the wrapper source above. ++ if hasattr(repository_ctx, "repo_metadata"): ++ return repository_ctx.repo_metadata(reproducible = True) ++ return None ++ + zig_repository = repository_rule( + attrs = { + "version": attr.string(), diff --git a/bazel/toolchains/msvc/llvm.bzl b/bazel/toolchains/msvc/llvm.bzl index 35172658c..1a2f9a43e 100644 --- a/bazel/toolchains/msvc/llvm.bzl +++ b/bazel/toolchains/msvc/llvm.bzl @@ -120,6 +120,12 @@ def _llvm_msvc_tools_impl(rctx): rctx.file("BUILD.bazel", _BUILD.format(version = _LLVM_VERSION, host = key), executable = False) + # Opt into the repo contents cache: the fetch is a pure function of the + # pinned URL+sha256 and the deterministic prune above, and the ~172 s + # extraction of the 2 GiB archive was the single largest cost of every + # fresh output base on ephemeral CI pods (profiled: run 30510579596). + return rctx.repo_metadata(reproducible = True) + llvm_msvc_tools_repository = repository_rule( implementation = _llvm_msvc_tools_impl, doc = "Pruned LLVM release binaries (clang-cl/lld-link/llvm-lib/llvm-rc) for the exec host.", diff --git a/bazel/toolchains/msvc/sysroot.bzl b/bazel/toolchains/msvc/sysroot.bzl index 0a6fa8503..486ef1c39 100644 --- a/bazel/toolchains/msvc/sysroot.bzl +++ b/bazel/toolchains/msvc/sysroot.bzl @@ -161,6 +161,14 @@ def _xwin_sysroot_impl(rctx): executable = False, ) + # Opt into the repo contents cache. The splat is channel-stable, not + # bit-reproducible forever (see the module docstring) — caching freezes a + # known-good splat, which also keeps remote action keys stable across + # pods until this file changes or the cache entry ages out (14 d GC). + # OMP_XWIN_CACHE_DIR is a predeclared input (environ attr), so kata and + # dev fetches key separate entries. + return rctx.repo_metadata(reproducible = True) + xwin_sysroot_repository = repository_rule( implementation = _xwin_sysroot_impl, doc = "MSVC CRT + Windows SDK sysroot splatted by a pinned xwin release.", From 9aada058ee2cd4ba183f53f613aa5da1830e2328 Mon Sep 17 00:00:00 2001 From: can1357 Date: Thu, 30 Jul 2026 06:13:58 +0200 Subject: [PATCH 08/19] feat(hashline): implemented clipboard operations in hashline engine - Implemented clipboard register management, parsing, and execution rules for CUT, COPY, and PASTE operations in the hashline engine. - Added session-persistent clipboard state and integration across agent session execution, diff previews, and streaming tools. - Added comprehensive validation, error messages, recovery handling, and test coverage for clipboard and block operations. --- packages/coding-agent/CHANGELOG.md | 2 + .../coding-agent/src/edit/edit-clipboard.ts | 23 ++ .../coding-agent/src/edit/hashline/diff.ts | 69 +++- .../coding-agent/src/edit/hashline/execute.ts | 88 ++++- packages/coding-agent/src/edit/streaming.ts | 17 +- .../coding-agent/src/export/html/template.js | 2 +- .../src/modes/components/tool-execution.ts | 7 +- .../src/modes/controllers/event-controller.ts | 3 + .../src/modes/utils/ui-helpers.ts | 2 + .../coding-agent/src/session/agent-session.ts | 4 +- packages/coding-agent/src/tools/index.ts | 6 +- packages/coding-agent/test/edit-diff.test.ts | 69 +++- packages/hashline/CHANGELOG.md | 6 + packages/hashline/README.md | 3 + packages/hashline/src/apply.ts | 32 +- packages/hashline/src/block.ts | 47 ++- packages/hashline/src/clipboard.ts | 158 +++++++++ packages/hashline/src/format.ts | 12 + packages/hashline/src/grammar.lark | 8 +- packages/hashline/src/index.ts | 1 + packages/hashline/src/input.ts | 72 +++- packages/hashline/src/messages.ts | 149 +++++--- packages/hashline/src/parser.ts | 85 ++++- packages/hashline/src/patcher.ts | 85 ++++- packages/hashline/src/prompt.md | 21 +- packages/hashline/src/recovery.ts | 34 +- packages/hashline/src/tokenizer.ts | 119 ++++++- packages/hashline/src/types.ts | 60 +++- packages/hashline/test/clipboard.test.ts | 325 ++++++++++++++++++ 29 files changed, 1389 insertions(+), 120 deletions(-) create mode 100644 packages/coding-agent/src/edit/edit-clipboard.ts create mode 100644 packages/hashline/src/clipboard.ts create mode 100644 packages/hashline/test/clipboard.test.ts diff --git a/packages/coding-agent/CHANGELOG.md b/packages/coding-agent/CHANGELOG.md index b30b584a1..ac641fbed 100644 --- a/packages/coding-agent/CHANGELOG.md +++ b/packages/coding-agent/CHANGELOG.md @@ -5,6 +5,7 @@ ### Added - Added server-name autocomplete for `/mcp` commands (`enable`, `disable`, `test`, `remove`, `reconnect`, `reauth`, `unauth`) using configured and runtime-discovered MCP servers. +- Added `CUT`/`COPY`/`PASTE` ops to the hashline edit tool for moving code without retyping it: `CUT N.=M` / `COPY N.=M` (and `.BLK` block forms) capture lines into a clipboard register, `PASTE.PRE|POST N` / `PASTE.HEAD|TAIL` / `PASTE.BLK.POST N` insert them. The register flows across sections within a patch (cross-file moves) and persists across edit calls per session; streaming and permission diff previews render pasted content, and copy-only sections report "copied to clipboard" instead of tripping the no-change guard. - Added `--from-claude` and `--from-codex` session imports (including compaction state for Codex), also available from `/resume @claude` and `/resume @codex`. - Added interactive Exa API-key onboarding through `/login exa`, opening the official key dashboard and saving pasted keys for authenticated web search while preserving `EXA_API_KEY` and explicit-selection public MCP fallback behavior ([#1798](https://github.com/can1357/oh-my-pi/issues/1798)). - Added `ExtensionContext.getAsyncJobSnapshot()` so extensions can read the owning session's async-job state without relying on process-global job-manager identity @@ -23,6 +24,7 @@ ### Fixed - Fixed Anthropic prompt-cache cold misses on session resume with multiple OAuth accounts: the account that served a session is now recorded in the session file (as a `credential_pin` sha-256 of the account + org/project scope, so exports carry no plaintext identity) and re-pinned on resume with the session's effective last-use time, so a fresh process no longer re-ranks accounts by usage headroom — which systematically routed away from the just-used account and cold-missed the entire account-scoped cache prefix. Sticky routing was previously stored only in the auth store's KV cache, which is in-memory when a remote auth broker is configured. +- Fixed Anthropic prompt-cache cold misses on session resume with multiple OAuth accounts: the account that served a session is now recorded in the session file (as a PII-free `credential_pin` hash) and re-pinned on resume, so a fresh process no longer re-ranks accounts by usage headroom — which systematically routed away from the just-used account and cold-missed the entire account-scoped cache prefix. Sticky routing was previously stored only in the auth store's KV cache, which is in-memory when a remote auth broker is configured. - Fixed concurrent `createAgentSession` calls with the default agent id failing initialization with `Agent "Main" was replaced during session initialization` — each in-process embedder (e.g. the edit benchmark runner) can now pass a private registry via the newly exported `AgentRegistry`, keeping every top-level session's "Main" out of the process-global roster race. - Fixed task tool blocks duplicating their per-agent progress rows into terminal scrollback on every update: live task frames now pin the transcript live region so mid-run rows are never recorded as frozen snapshots, and a detached background task freezes its progress the moment any of its rows commit to scrollback instead of mutating committed history. - Fixed Codex reset fireworks comparing different quota tiers or plans, preventing false celebrations when usage reports switch between Spark and base weekly limits. diff --git a/packages/coding-agent/src/edit/edit-clipboard.ts b/packages/coding-agent/src/edit/edit-clipboard.ts new file mode 100644 index 000000000..a25fc145b --- /dev/null +++ b/packages/coding-agent/src/edit/edit-clipboard.ts @@ -0,0 +1,23 @@ +/** + * Session-bound edit clipboard register. + * + * `CUT`/`COPY`/`PASTE` hashline ops share one {@link Clipboard} per session so + * content captured by one edit call can be pasted by a later one (and across + * files within one call). The executor works on a fork per batch and commits + * it back only after every write lands — see `executeHashlineSingle`. + */ +import type { Clipboard } from "@oh-my-pi/hashline"; + +interface EditClipboardOwner { + editClipboard?: Clipboard; +} + +/** + * Look up (or lazily create) the clipboard register attached to a session. + * Storage lives on `session.editClipboard` so it ages out exactly with the + * session itself. + */ +export function getEditClipboard(session: EditClipboardOwner): Clipboard { + session.editClipboard ??= {}; + return session.editClipboard; +} diff --git a/packages/coding-agent/src/edit/hashline/diff.ts b/packages/coding-agent/src/edit/hashline/diff.ts index d38e493eb..d3aa3eb97 100644 --- a/packages/coding-agent/src/edit/hashline/diff.ts +++ b/packages/coding-agent/src/edit/hashline/diff.ts @@ -13,6 +13,7 @@ import * as path from "node:path"; import { type ApplyResult, applyEdits, + type Clipboard, type Cursor, computeFileHash, type Edit, @@ -26,8 +27,10 @@ import { parsePatchStreaming, Recovery, resolveBlockEdits, + resolveClipboardEdits, type SnapshotStore, stripBom, + validateClipboardSequence, } from "@oh-my-pi/hashline"; import { resolveToCwd } from "../../tools/path-utils"; import { generateDiffString } from "../diff"; @@ -48,6 +51,15 @@ export interface HashlineDiffOptions { * authoring input; the final apply path still validates through Patcher. */ skipHashValidation?: boolean; + /** + * Clipboard register shared across the sections of one patch preview. + * `CUT`/`COPY` in an earlier section feeds `PASTE` in a later one, so the + * preview a user approves shows the pasted content exactly like apply + * will. Callers previewing a multi-section patch MUST thread one register + * through the sections in patch order; omitted, each section gets a + * private register (same-file cut/paste still previews correctly). + */ + clipboard?: Clipboard; } async function readSectionText(absolutePath: string, sectionPath: string): Promise { @@ -144,6 +156,7 @@ function hasAnchorScopedEdit(edits: readonly Edit[]): boolean { return edits.some(edit => { if (edit.kind === "delete") return true; if (edit.kind === "block") return true; + if (edit.kind === "copy") return true; return edit.cursor.kind === "before_anchor" || edit.cursor.kind === "after_anchor"; }); } @@ -204,14 +217,24 @@ function applyPreviewEdits(args: { const liveMatches = expected !== undefined && computeFileHash(normalized) === expected; const edits = parsePreviewEdits(section, options.streaming); const resolved = resolvePreviewEdits({ section, absolutePath, normalized, snapshots, expected, liveMatches, edits }); - if (options.skipHashValidation || expected === undefined || liveMatches) return applyEdits(normalized, resolved); - if (!hasAnchorScopedEdit(resolved)) return applyEdits(normalized, resolved); + const clipboard = options.clipboard ?? {}; + // Mirror the Patcher: surface clipboard sequencing mistakes with their + // targeted message before the recovery path below swallows them. Streaming + // previews stay lenient — a mid-typed op transiently violating sequencing + // must not flash an error frame. + if (!options.streaming) validateClipboardSequence(resolved, clipboard); + const applyOptions = { clipboard, ...(options.streaming ? { onEmptyPaste: "drop" as const } : {}) }; + if (options.skipHashValidation || expected === undefined || liveMatches) { + return applyEdits(normalized, resolved, applyOptions); + } + if (!hasAnchorScopedEdit(resolved)) return applyEdits(normalized, resolved, applyOptions); const recovered = new Recovery(snapshots).tryRecover({ path: absolutePath, currentText: normalized, fileHash: expected, edits: resolved, + clipboard, }); if (recovered) return recovered; throw createMismatchError(section, absolutePath, normalized, snapshots, expected); @@ -250,18 +273,40 @@ function insertCursorLine(cursor: Cursor, fileLineCount: number): number { function buildStreamingSectionDiff( section: PatchSection, normalized: string, + clipboard: Clipboard, ): { diff: string; firstChangedLine: number | undefined } | { error: string } { const { edits, fileOp } = parsePatchStreaming(section.diff); - const resolved = resolveBlockEdits(edits, normalized, section.path, nativeBlockResolver, { onUnresolved: "drop" }); + const blockResolved = resolveBlockEdits(edits, normalized, section.path, nativeBlockResolver, { + onUnresolved: "drop", + }); + const fileLines = normalized.split("\n"); + // Expand clipboard ops so a `PASTE` previews the moved rows. Resolve into + // a scratch register and commit it back only on success: a mid-typed + // capture (out-of-range while the range digits are still streaming, + // transient sequencing violations) throws AFTER earlier captures may have + // landed, and leaking those into the shared register would let a later + // section preview a paste that never happened. On failure, fall back to + // filtering the clipboard edits out of this section's frame. + const scratch: Clipboard = { ...clipboard }; + let resolved: readonly Edit[]; + try { + resolved = resolveClipboardEdits(blockResolved, fileLines, scratch, { onEmptyPaste: "drop" }); + if (scratch.lines === undefined) delete clipboard.lines; + else clipboard.lines = scratch.lines; + if (scratch.pendingCut === undefined) delete clipboard.pendingCut; + else clipboard.pendingCut = scratch.pendingCut; + } catch { + resolved = blockResolved.filter(edit => edit.kind !== "copy" && edit.kind !== "paste"); + } if (resolved.length === 0) { // A whole-file op (REM / MV) carries no line edits: the change is the // delete/move itself, conveyed by the result header, so emit an empty - // diff rather than a misleading "No changes" error. - if (fileOp) return { diff: "", firstChangedLine: undefined }; + // diff rather than a misleading "No changes" error. A copy-only section + // likewise changes nothing itself — it feeds a later `PASTE`. + if (fileOp || section.isClipboardSource) return { diff: "", firstChangedLine: undefined }; return { error: `No changes would be made to ${section.path}.` }; } - const fileLines = normalized.split("\n"); const rows: string[] = []; let firstChangedLine: number | undefined; @@ -299,7 +344,10 @@ function buildStreamingSectionDiff( } } - if (rows.length === 0) return { error: `No changes would be made to ${section.path}.` }; + if (rows.length === 0) { + if (section.isClipboardSource) return { diff: "", firstChangedLine: undefined }; + return { error: `No changes would be made to ${section.path}.` }; + } return { diff: rows.join("\n"), firstChangedLine }; } @@ -323,12 +371,13 @@ export async function computeHashlineSectionDiff( // diff: feed the in-flight ops through the natural-order builder so the // streamed cursor stays pinned to the bottom. The args-complete pass // (`streaming` unset) falls through to the real Myers diff below. - if (options.streaming) return buildStreamingSectionDiff(section, normalized); + if (options.streaming) return buildStreamingSectionDiff(section, normalized, options.clipboard ?? {}); const result = applyPreviewEdits({ section, absolutePath, normalized, snapshots, options }); if (normalized === result.text) { // REM/MV-only sections change no text; the header conveys the - // delete/move, so don't surface a "No changes" error. - if (section.fileOp) return { diff: "", firstChangedLine: undefined }; + // delete/move, so don't surface a "No changes" error. A copy-only + // section likewise changes nothing itself — it feeds a later `PASTE`. + if (section.fileOp || section.isClipboardSource) return { diff: "", firstChangedLine: undefined }; return { error: `No changes would be made to ${section.path}.` }; } return generateDiffString(normalized, result.text, undefined, { path: section.path }); diff --git a/packages/coding-agent/src/edit/hashline/execute.ts b/packages/coding-agent/src/edit/hashline/execute.ts index fc3d4fc78..9e2e3ccca 100644 --- a/packages/coding-agent/src/edit/hashline/execute.ts +++ b/packages/coding-agent/src/edit/hashline/execute.ts @@ -13,11 +13,15 @@ import { type BlockResolution, buildCompactDiffPreview, + type Clipboard, + commitClipboard, + forkClipboard, MismatchError as HashlineMismatchError, Patch, Patcher, type PatchSectionResult, type PreparedSection, + pendingCutWarning, } from "@oh-my-pi/hashline"; import type { AgentToolResult } from "@oh-my-pi/pi-agent-core"; import type { FileDiagnosticsResult, WritethroughCallback, WritethroughDeferredHandle } from "../../lsp"; @@ -25,6 +29,7 @@ import type { ToolSession } from "../../tools"; import { outputMeta } from "../../tools/output-meta"; import { ToolError } from "../../tools/tool-errors"; import { generateDiffString } from "../diff"; +import { getEditClipboard } from "../edit-clipboard"; import { getFileSnapshotStore } from "../file-snapshot-store"; import type { EditToolDetails, EditToolPerFileResult, LspBatchRequest } from "../renderer"; import { pruneOversizedEditSnapshots } from "../snapshot-details"; @@ -98,12 +103,26 @@ interface RenderedSection { perFileResult: EditToolPerFileResult; } +const BLOCK_OP_LABELS: Record = { + replace: "SWAP.BLK", + delete: "DEL.BLK", + insert_after: "INS.BLK.POST", + copy: "COPY.BLK", + cut: "CUT.BLK", + paste_after: "PASTE.BLK.POST", +}; + function formatBlockResolution(resolution: BlockResolution): string { - const op = resolution.op === "delete" ? "DEL.BLK" : resolution.op === "insert_after" ? "INS.BLK.POST" : "SWAP.BLK"; + const op = BLOCK_OP_LABELS[resolution.op]; const lines = resolution.end - resolution.start + 1; const span = resolution.start === resolution.end ? `line ${resolution.start}` : `lines ${resolution.start}-${resolution.end}`; - const suffix = resolution.op === "insert_after" ? `; body lands after line ${resolution.end}` : ""; + const suffix = + resolution.op === "insert_after" + ? `; body lands after line ${resolution.end}` + : resolution.op === "paste_after" + ? `; clipboard lands after line ${resolution.end}` + : ""; return `${op} ${resolution.anchorLine} → resolved ${span} (${lines} line${lines === 1 ? "" : "s"})${suffix}`; } @@ -194,6 +213,25 @@ function renderSection( }; } +/** + * Render a copy-only (`COPY`/`COPY.BLK`) section: it filled the clipboard for + * a later `PASTE` and intentionally left its own file unchanged, so the + * standard "no changes" diagnostics do not apply. The fresh header still + * re-mints the snapshot tag for follow-up edits. + */ +function clipboardSourceResult(result: PatchSectionResult): RenderedSection { + const warningsBlock = result.warnings.length > 0 ? `\n\nWarnings:\n${result.warnings.join("\n")}` : ""; + return { + toolResult: { + content: [ + { type: "text", text: `${result.header}\nCopied lines to the clipboard; file unchanged.${warningsBlock}` }, + ], + details: { diff: "", op: "update", meta: outputMeta().get() }, + }, + perFileResult: { path: result.path, diff: "", op: "update" }, + }; +} + export async function executeHashlineSingle( options: ExecuteHashlineSingleOptions, ): Promise> { @@ -213,13 +251,25 @@ export async function executeHashlineSingle( const enforceSeenLines = options.session.settings.get("edit.enforceSeenLines"); const patcher = new Patcher({ fs, snapshots, blockResolver: nativeBlockResolver, enforceSeenLines }); + // The clipboard register is session-persistent: `CUT` in one edit call can + // `PASTE` in a later one. Each batch works on a fork and publishes it back + // only after every write lands, so a failed batch never poisons the + // register (a retried `CUT` would otherwise trip the overwrite guard). + const sessionClipboard = getEditClipboard(options.session); + const clipboard = forkClipboard(sessionClipboard); + // Single-section fast path: prepare, commit, render. const inputHash = hashPatchInput(options.input); if (patch.sections.length === 1) { fs.setBatchRequest(narrowBatchRequest(options.batchRequest, true)); - const prepared = await patcher.prepare(patch.sections[0]); + const prepared = await patcher.prepare(patch.sections[0], clipboard); const sectionResult = await patcher.commit(prepared); + commitClipboard(clipboard, sessionClipboard); + if (clipboard.pendingCut !== undefined) sectionResult.warnings.push(pendingCutWarning(clipboard.pendingCut)); if (sectionResult.op === "noop") { + if (prepared.section.isClipboardSource) { + return clipboardSourceResult(sectionResult).toolResult; + } const { count, escalate } = recordNoopEdit(options.session, sectionResult.canonicalPath, inputHash); if (escalate) { throw new ToolError(noChangeLoopDiagnostic(sectionResult.path, count)); @@ -231,12 +281,23 @@ export async function executeHashlineSingle( } // Multi-section: prepare every section up front so we fail fast before - // any write hits the filesystem. + // any write hits the filesystem. One clipboard register spans the batch, + // so `CUT`/`COPY` in one section feeds `PASTE` in a later one. const prepared: PreparedSection[] = []; - for (const section of patch.sections) prepared.push(await patcher.prepare(section)); + // Register state after each section's prepare. Commits are non-atomic: a + // mid-batch write failure leaves earlier sections on disk, so the session + // register must reflect exactly the landed prefix — content a landed CUT + // deleted would otherwise be lost. + const sectionStates: Clipboard[] = []; + for (const section of patch.sections) { + prepared.push(await patcher.prepare(section, clipboard)); + sectionStates.push(forkClipboard(clipboard)); + } assertUniqueCanonicalPaths(prepared); for (const entry of prepared) { - if (entry.isNoop) { + // A copy-only section legitimately changes nothing: it exists to fill + // the clipboard for a `PASTE` in a later section. + if (entry.isNoop && !entry.section.isClipboardSource) { const { count, escalate } = recordNoopEdit(options.session, entry.canonicalPath, inputHash); throw escalate ? new ToolError(noChangeLoopDiagnostic(entry.section.path, count)) @@ -251,7 +312,12 @@ export async function executeHashlineSingle( const isLast = i === prepared.length - 1; fs.setBatchRequest(narrowBatchRequest(options.batchRequest, isLast)); const sectionResult = await patcher.commit(prepared[i]); + commitClipboard(sectionStates[i], sessionClipboard); if (sectionResult.op === "noop") { + if (prepared[i].section.isClipboardSource) { + rendered.push(clipboardSourceResult(sectionResult)); + continue; + } const { count, escalate } = recordNoopEdit(options.session, sectionResult.canonicalPath, inputHash); throw escalate ? new ToolError(noChangeLoopDiagnostic(sectionResult.path, count)) @@ -260,14 +326,18 @@ export async function executeHashlineSingle( resetNoopEdit(options.session, sectionResult.canonicalPath); rendered.push(renderSection(sectionResult, fs.consumeDiagnostics(sectionResult.path), prepared[i].section.path)); } + // Every write landed; carry any still-pending cut forward as a warning. + const pendingCutNote = + clipboard.pendingCut === undefined ? "" : `\n\nWarnings:\n${pendingCutWarning(clipboard.pendingCut)}`; return { content: [ { type: "text", - text: rendered - .map(r => r.toolResult.content.map(part => (part.type === "text" ? part.text : "")).join("\n")) - .join("\n\n"), + text: + rendered + .map(r => r.toolResult.content.map(part => (part.type === "text" ? part.text : "")).join("\n")) + .join("\n\n") + pendingCutNote, }, ], details: pruneOversizedEditSnapshots({ diff --git a/packages/coding-agent/src/edit/streaming.ts b/packages/coding-agent/src/edit/streaming.ts index ebbd93299..36df33c21 100644 --- a/packages/coding-agent/src/edit/streaming.ts +++ b/packages/coding-agent/src/edit/streaming.ts @@ -16,8 +16,10 @@ import { ABORT_MARKER, BEGIN_PATCH_MARKER, + type Clipboard, containsRecognizableHashlineOperations, END_PATCH_MARKER, + forkClipboard, type PatchSection as HashlineInputSection, Patch as HashlinePatch, type SnapshotStore, @@ -50,6 +52,13 @@ export interface StreamingDiffContext { * not flicker in the preview. */ isStreaming?: boolean; + /** + * Session-persistent clipboard register (`CUT`/`COPY`/`PASTE`). Previews + * fork it per frame — never mutating it — so a `PASTE` of content cut in + * an earlier edit call (or an earlier section of this patch) renders the + * real rows. + */ + clipboard?: Clipboard; } /** @@ -542,7 +551,9 @@ const hashlineStrategy: EditStreamingStrategy = { // to parse; suppress until the next chunk arrives. Once args are // complete, surface the error so the model sees what went wrong. if (ctx.isStreaming) return null; - const result = await computeHashlineDiff({ input }, ctx.cwd, ctx.snapshots); + const result = await computeHashlineDiff({ input }, ctx.cwd, ctx.snapshots, { + clipboard: forkClipboard(ctx.clipboard), + }); ctx.signal.throwIfAborted(); return [toPerFilePreview("", result)]; } @@ -558,12 +569,16 @@ const hashlineStrategy: EditStreamingStrategy = { const trailingProcessedIndex = sectionsToProcess.length - 1; const previews: PerFileDiffPreview[] = []; + // Fork the session register per preview frame: sections feed each other + // in patch order, but a preview must never mutate the live register. + const clipboard = forkClipboard(ctx.clipboard); for (let i = 0; i < sectionsToProcess.length; i++) { ctx.signal.throwIfAborted(); const section = sectionsToProcess[i]; const result = await computeHashlineSectionDiff(section, ctx.cwd, ctx.snapshots, { streaming: ctx.isStreaming, skipHashValidation: ctx.isStreaming === true, + clipboard, }); ctx.signal.throwIfAborted(); // Ignore parse/apply errors from the trailing (actively-typed) diff --git a/packages/coding-agent/src/export/html/template.js b/packages/coding-agent/src/export/html/template.js index d111cbb55..f3a4be6ab 100644 --- a/packages/coding-agent/src/export/html/template.js +++ b/packages/coding-agent/src/export/html/template.js @@ -395,7 +395,7 @@ } // Apply filter mode - const isSettingsEntry = ['label', 'custom', 'model_change', 'thinking_level_change', 'mode_change', 'ttsr_injection', 'session_init'].includes(entry.type); + const isSettingsEntry = ['label', 'custom', 'model_change', 'thinking_level_change', 'mode_change', 'ttsr_injection', 'session_init', 'credential_pin'].includes(entry.type); let passesFilter = true; switch (filterMode) { diff --git a/packages/coding-agent/src/modes/components/tool-execution.ts b/packages/coding-agent/src/modes/components/tool-execution.ts index 061f890ed..a0920407b 100644 --- a/packages/coding-agent/src/modes/components/tool-execution.ts +++ b/packages/coding-agent/src/modes/components/tool-execution.ts @@ -1,4 +1,4 @@ -import type { SnapshotStore } from "@oh-my-pi/hashline"; +import type { Clipboard, SnapshotStore } from "@oh-my-pi/hashline"; import type { AgentTool } from "@oh-my-pi/pi-agent-core"; import { Box, @@ -222,6 +222,8 @@ export interface ToolExecutionUi { export interface ToolExecutionOptions { snapshots?: SnapshotStore; + /** Session-persistent edit clipboard register, forked per preview frame. */ + clipboard?: Clipboard; showImages?: boolean; // default: true (only used if terminal supports images) editFuzzyThreshold?: number; editAllowFuzzy?: boolean; @@ -285,6 +287,7 @@ export class ToolExecutionComponent extends Container implements NativeScrollbac #editFuzzyThreshold: number | undefined; #editAllowFuzzy: boolean | undefined; #snapshots?: SnapshotStore; + #clipboard?: Clipboard; #isPartial = true; #resultVersion = 0; #lastDisplayKey: string | undefined; @@ -393,6 +396,7 @@ export class ToolExecutionComponent extends Container implements NativeScrollbac this.#editFuzzyThreshold = options.editFuzzyThreshold; this.#editAllowFuzzy = options.editAllowFuzzy; this.#snapshots = options.snapshots; + this.#clipboard = options.clipboard; this.#liveRegion = options.liveRegion; this.#tool = tool; this.#ui = ui; @@ -550,6 +554,7 @@ export class ToolExecutionComponent extends Container implements NativeScrollbac cwd: this.#cwd, signal: controller.signal, snapshots: this.#snapshots!, + clipboard: this.#clipboard, fuzzyThreshold: this.#editFuzzyThreshold, allowFuzzy: this.#editAllowFuzzy, isStreaming, diff --git a/packages/coding-agent/src/modes/controllers/event-controller.ts b/packages/coding-agent/src/modes/controllers/event-controller.ts index 62eb79b67..546b6057a 100644 --- a/packages/coding-agent/src/modes/controllers/event-controller.ts +++ b/packages/coding-agent/src/modes/controllers/event-controller.ts @@ -6,6 +6,7 @@ import { logger, prompt, sanitizeText } from "@oh-my-pi/pi-utils"; import { INTENT_FIELD } from "@oh-my-pi/pi-wire"; import { extractTextContent } from "../../commit/utils"; import { settings } from "../../config/settings"; +import { getEditClipboard } from "../../edit/edit-clipboard"; import { getFileSnapshotStore } from "../../edit/file-snapshot-store"; import { AssistantMessageComponent } from "../../modes/components/assistant-message"; import { detectCacheInvalidation } from "../../modes/components/cache-invalidation-marker"; @@ -810,6 +811,7 @@ export class EventController { renderArgs, { snapshots: getFileSnapshotStore(this.ctx.viewSession), + clipboard: getEditClipboard(this.ctx.viewSession), showImages: settings.get("terminal.showImages"), editFuzzyThreshold: settings.get("edit.fuzzyThreshold"), editAllowFuzzy: settings.get("edit.fuzzyMatch"), @@ -1033,6 +1035,7 @@ export class EventController { event.args, { snapshots: getFileSnapshotStore(this.ctx.viewSession), + clipboard: getEditClipboard(this.ctx.viewSession), showImages: settings.get("terminal.showImages"), editFuzzyThreshold: settings.get("edit.fuzzyThreshold"), editAllowFuzzy: settings.get("edit.fuzzyMatch"), diff --git a/packages/coding-agent/src/modes/utils/ui-helpers.ts b/packages/coding-agent/src/modes/utils/ui-helpers.ts index 5482d6df4..608cc89ea 100644 --- a/packages/coding-agent/src/modes/utils/ui-helpers.ts +++ b/packages/coding-agent/src/modes/utils/ui-helpers.ts @@ -5,6 +5,7 @@ import { type Component, Spacer, Text, TruncatedText } from "@oh-my-pi/pi-tui"; import type { AdvisorMessageDetails } from "../../advisor"; import { COLLAB_PROMPT_MESSAGE_TYPE, type CollabPromptDetails } from "../../collab/protocol"; import { settings } from "../../config/settings"; +import { getEditClipboard } from "../../edit/edit-clipboard"; import { getFileSnapshotStore } from "../../edit/file-snapshot-store"; import { createAdvisorMessageCard } from "../../modes/components/advisor-message"; import { AssistantMessageComponent } from "../../modes/components/assistant-message"; @@ -497,6 +498,7 @@ export class UiHelpers { renderArgs, { snapshots: getFileSnapshotStore(this.ctx.viewSession), + clipboard: getEditClipboard(this.ctx.viewSession), showImages: settings.get("terminal.showImages"), editFuzzyThreshold: settings.get("edit.fuzzyThreshold"), editAllowFuzzy: settings.get("edit.fuzzyMatch"), diff --git a/packages/coding-agent/src/session/agent-session.ts b/packages/coding-agent/src/session/agent-session.ts index 2011e7b61..3423ab9c6 100644 --- a/packages/coding-agent/src/session/agent-session.ts +++ b/packages/coding-agent/src/session/agent-session.ts @@ -19,7 +19,7 @@ import * as path from "node:path"; import { scheduler } from "node:timers/promises"; import { isPromise } from "node:util/types"; -import type { InMemorySnapshotStore } from "@oh-my-pi/hashline"; +import type { Clipboard, InMemorySnapshotStore } from "@oh-my-pi/hashline"; import { type AfterToolCallContext, type AfterToolCallResult, @@ -410,6 +410,8 @@ export class AgentSession { getXdevToolEntries: () => Array<{ name: string; summary: string }>; readonly yieldQueue: YieldQueue; fileSnapshotStore?: InMemorySnapshotStore; + /** Per-session `CUT`/`COPY`/`PASTE` clipboard register shared across edit calls. */ + editClipboard?: Clipboard; #powerAssertion: MacOSPowerAssertion | undefined; diff --git a/packages/coding-agent/src/tools/index.ts b/packages/coding-agent/src/tools/index.ts index 3155ae642..ee698df1f 100644 --- a/packages/coding-agent/src/tools/index.ts +++ b/packages/coding-agent/src/tools/index.ts @@ -1,4 +1,4 @@ -import type { InMemorySnapshotStore } from "@oh-my-pi/hashline"; +import type { Clipboard, InMemorySnapshotStore } from "@oh-my-pi/hashline"; import type { AgentTelemetryConfig, AgentTool } from "@oh-my-pi/pi-agent-core"; import type { FetchImpl, ImageContent, Model, ServiceTierByFamily, ToolChoice } from "@oh-my-pi/pi-ai"; import { logger } from "@oh-my-pi/pi-utils"; @@ -351,6 +351,10 @@ export interface ToolSession { * file changed out-of-band. Lazily initialized by `getFileSnapshotStore`. */ fileSnapshotStore?: InMemorySnapshotStore; + /** Per-session `CUT`/`COPY`/`PASTE` clipboard register shared across edit + * calls. Lazily initialized by `getEditClipboard`. */ + editClipboard?: Clipboard; + /** Per-session log of unresolved git merge conflict regions surfaced by * `read`. Each entry gets a stable id N referenced by `write conflict://N` * to splice the recorded region with replacement content. Lazily initialized diff --git a/packages/coding-agent/test/edit-diff.test.ts b/packages/coding-agent/test/edit-diff.test.ts index 10cbace63..76438bdd6 100644 --- a/packages/coding-agent/test/edit-diff.test.ts +++ b/packages/coding-agent/test/edit-diff.test.ts @@ -2,7 +2,12 @@ import { afterEach, beforeEach, describe, expect, test } from "bun:test"; import * as fs from "node:fs/promises"; import * as os from "node:os"; import * as path from "node:path"; -import { formatHashlineHeader, InMemorySnapshotStore, missingSnapshotTagMessage } from "@oh-my-pi/hashline"; +import { + forkClipboard, + formatHashlineHeader, + InMemorySnapshotStore, + missingSnapshotTagMessage, +} from "@oh-my-pi/hashline"; import { adjustIndentation, computeEditDiff, @@ -268,6 +273,68 @@ describe("computeHashlineDiff", () => { } }); + test("previews a same-file CUT + PASTE as the moved content", async () => { + const sourcePath = path.join(tempDir, "source.txt"); + const text = "l1\nl2\nl3\n"; + await Bun.write(sourcePath, text); + + const snapshotStore = new InMemorySnapshotStore(); + const tag = snapshotStore.record(sourcePath, text); + const result = await computeHashlineDiff( + { input: `${formatHashlineHeader(sourcePath, tag)}\nCUT 1.=1\nPASTE.TAIL` }, + tempDir, + snapshotStore, + ); + expect("diff" in result).toBe(true); + if ("diff" in result) { + expect(result.diff).toContain("-1|l1"); + expect(result.diff).toContain("+3|l1"); + } + }); + + test("previews a PASTE from a forked session register without touching the source", async () => { + const sourcePath = path.join(tempDir, "source.txt"); + const text = "l1\n"; + await Bun.write(sourcePath, text); + + const snapshotStore = new InMemorySnapshotStore(); + const tag = snapshotStore.record(sourcePath, text); + // Mirror the streaming-strategy contract: the session register is forked + // once per preview frame; sections then thread the fork in patch order. + const sessionRegister = { lines: ["carried"], pendingCut: "CUT 5" }; + const result = await computeHashlineDiff( + { input: `${formatHashlineHeader(sourcePath, tag)}\nPASTE.TAIL` }, + tempDir, + snapshotStore, + { clipboard: forkClipboard(sessionRegister) }, + ); + expect("diff" in result).toBe(true); + if ("diff" in result) { + expect(result.diff).toContain("|carried"); + } + expect(sessionRegister.pendingCut).toBe("CUT 5"); + }); + + test("streams paste rows in the natural-order preview", async () => { + const sourcePath = path.join(tempDir, "source.txt"); + const text = "l1\nl2\nl3\n"; + await Bun.write(sourcePath, text); + + const snapshotStore = new InMemorySnapshotStore(); + const tag = snapshotStore.record(sourcePath, text); + const result = await computeHashlineDiff( + { input: `${formatHashlineHeader(sourcePath, tag)}\nCUT 2.=2\nPASTE.HEAD` }, + tempDir, + snapshotStore, + { streaming: true, skipHashValidation: true }, + ); + expect("diff" in result).toBe(true); + if ("diff" in result) { + expect(result.diff).toContain("-2|l2"); + expect(result.diff).toContain("+1|l2"); + } + }); + test("rejects a tagless head/tail insert in the preview path, matching apply", async () => { const relativePath = "source.txt"; await Bun.write(path.join(tempDir, relativePath), "first\n"); diff --git a/packages/hashline/CHANGELOG.md b/packages/hashline/CHANGELOG.md index 94a51b69f..1d4d750cf 100644 --- a/packages/hashline/CHANGELOG.md +++ b/packages/hashline/CHANGELOG.md @@ -2,6 +2,12 @@ ## [Unreleased] +### Added + +- Added clipboard ops: `CUT N.=M` / `COPY N.=M` capture lines into a register (`CUT` also deletes them), `CUT.BLK N` / `COPY.BLK N` capture tree-sitter blocks, and `PASTE.PRE|POST N` / `PASTE.HEAD|TAIL` / `PASTE.BLK.POST N` insert the captured lines without retyping. The register flows top-to-bottom across sections, so content moves between files in one patch; `PASTE` does not consume it and the last capture wins. +- Added `PatcherOptions.clipboard` for a host-owned register that persists across `Patcher.apply` batches. Batches work on a fork (`forkClipboard`) published per landed section (`commitClipboard`), so failed batches never poison the register and a mid-batch write failure still preserves content already cut from disk; un-pasted `CUT` content becomes a carry-forward warning instead of an error. +- Added clipboard safety guards: a `PASTE` with an empty register, a capture overwriting un-pasted `CUT` content, a batch-local `CUT` that is never pasted, and clipboard ops in same-path sections interleaved across another file's section are all rejected with targeted diagnostics. `CUT`/`COPY` ranges participate in overlap validation, the seen-lines guard, and drift recovery (every captured line must remap). + ### Fixed - Prevented CPU and memory exhaustion in streaming previews by rejecting line anchors above Number.MAX_SAFE_INTEGER and ranges spanning more than 100,000 lines. diff --git a/packages/hashline/README.md b/packages/hashline/README.md index 934030f6d..728105da0 100644 --- a/packages/hashline/README.md +++ b/packages/hashline/README.md @@ -52,6 +52,9 @@ Inside a section: - `DEL A.=B` / `DEL.BLK A` — delete concrete lines or a resolved block. - `INS.PRE A:` / `INS.POST A:` / `INS.HEAD:` / `INS.TAIL:` — insert following body rows. - `INS.BLK.POST A:` — insert following body rows after the resolved block's last line. +- `CUT A.=B` / `COPY A.=B` — capture lines into the clipboard register (`CUT` also deletes them). +- `CUT.BLK A` / `COPY.BLK A` — capture the resolved block (`CUT.BLK` also deletes it). +- `PASTE.PRE A` / `PASTE.POST A` / `PASTE.HEAD` / `PASTE.TAIL` / `PASTE.BLK.POST A` — insert the clipboard; no body rows. The register flows top-to-bottom across sections (cross-file moves) and can be host-persisted across batches via `PatcherOptions.clipboard`. - `REM` — delete the whole file named by the section header. - `MV DEST` — move/rename the section file to `DEST` (optionally after line edits). - `+TEXT` — literal body row (use `+` alone for a blank line). diff --git a/packages/hashline/src/apply.ts b/packages/hashline/src/apply.ts index eff2175e9..b50de23af 100644 --- a/packages/hashline/src/apply.ts +++ b/packages/hashline/src/apply.ts @@ -7,6 +7,8 @@ * which absorbs common model mistakes where a payload restates unchanged range * boundaries or duplicates/drops structural closers. */ + +import { resolveClipboardEdits } from "./clipboard"; import { afterInsertLandingShiftWarning, ambiguousBoundaryEchoMessage, @@ -15,7 +17,7 @@ import { UNRESOLVED_BLOCK_INTERNAL, } from "./messages"; import { cloneCursor } from "./tokenizer"; -import type { Anchor, ApplyResult, Cursor, Edit } from "./types"; +import type { Anchor, ApplyResult, Clipboard, Cursor, Edit } from "./types"; type LineOrigin = "original" | "insert" | "replacement"; @@ -1221,24 +1223,44 @@ function repairAfterInsertLandings( return { edits: out ?? edits, warnings }; } +/** Optional knobs for {@link applyEdits}. */ +export interface ApplyEditsOptions { + /** + * Clipboard register filled by `copy` edits and read by `paste` edits. + * Thread one register through every section of a batch to move content + * across files; when omitted, the call gets a private register (same-file + * cut/paste still works). + */ + clipboard?: Clipboard; + /** `PASTE` with an empty register: `throw` (default) or `drop` (streaming previews). */ + onEmptyPaste?: "throw" | "drop"; +} + /** * Apply a parsed list of edits to a text body. Pure function — no I/O. * * Returns the post-edit text and the first changed line number (1-indexed). * Throws if an anchor is out of bounds. */ -export function applyEdits(text: string, edits: readonly Edit[]): ApplyResult { +export function applyEdits(text: string, edits: readonly Edit[], options: ApplyEditsOptions = {}): ApplyResult { if (edits.length === 0) return { text, firstChangedLine: undefined }; + const fileLines = text.split("\n"); + + // Clipboard pre-pass: capture `copy` ranges from the original lines and + // expand `paste` edits into plain inserts, in authored order. + const concrete = resolveClipboardEdits(edits, fileLines, options.clipboard ?? {}, { + ...(options.onEmptyPaste === undefined ? {} : { onEmptyPaste: options.onEmptyPaste }), + }); + // Block edits are deferred until `resolveBlockEdits` expands them into // concrete inserts + deletes. Reaching the applier with one still present // is an internal wiring bug, not authored-input error. - for (const edit of edits) { + for (const edit of concrete) { if (edit.kind === "block") throw new Error(UNRESOLVED_BLOCK_INTERNAL); } - const appliedEdits = edits as readonly AppliedEdit[]; + const appliedEdits = concrete as readonly AppliedEdit[]; - const fileLines = text.split("\n"); const lineOrigins: LineOrigin[] = fileLines.map(() => "original"); let firstChangedLine: number | undefined; diff --git a/packages/hashline/src/block.ts b/packages/hashline/src/block.ts index 4e6c95b42..4cee0d09d 100644 --- a/packages/hashline/src/block.ts +++ b/packages/hashline/src/block.ts @@ -16,10 +16,13 @@ import { STRUCTURAL_CLOSER_RE } from "./apply"; import { BLOCK_RESOLVER_UNAVAILABLE, type BlockDiagnosticSuggestions, + type BlockOp, blockSingleLineMessage, blockUnresolvedMessage, insertAfterBlockCloserLoweredWarning, insertAfterBlockUnresolvedLoweredWarning, + pasteAfterBlockCloserLoweredWarning, + pasteAfterBlockUnresolvedLoweredWarning, } from "./messages"; import type { BlockResolution, BlockResolver, BlockSpan, Cursor, Edit } from "./types"; @@ -124,7 +127,7 @@ export function resolveBlockEdits( resolved.push(edit); continue; } - const op = edit.mode === "insert_after" ? "insert_after" : edit.payloads.length === 0 ? "delete" : "replace"; + const op: BlockOp = edit.mode ?? (edit.payloads.length === 0 ? "delete" : "replace"); const span = resolver ? resolver({ path, text, line: edit.anchor.line }) : null; if (span === null) { // `insert_after_block N:` never fails the patch — lower it to plain @@ -135,9 +138,19 @@ export function resolveBlockEdits( // - otherwise (unsupported language, blank line, unparsable block, // or no resolver wired): "after the block at N" degrades to // "after line N" — warn to verify the landing line. - if (op === "insert_after") { + if (op === "insert_after" || op === "paste_after") { const anchorText = text.split("\n")[edit.anchor.line - 1]; const isCloser = anchorText !== undefined && STRUCTURAL_CLOSER_RE.test(anchorText); + if (op === "paste_after") { + options.onWarning?.( + isCloser + ? pasteAfterBlockCloserLoweredWarning(edit.anchor.line) + : pasteAfterBlockUnresolvedLoweredWarning(edit.anchor.line), + ); + const cursor: Cursor = { kind: "after_anchor", anchor: { line: edit.anchor.line } }; + resolved.push({ kind: "paste", cursor, lineNum: edit.lineNum, index: synthIndex++ }); + continue; + } options.onWarning?.( isCloser ? insertAfterBlockCloserLoweredWarning(edit.anchor.line) @@ -183,6 +196,36 @@ export function resolveBlockEdits( end: span.end, op, }); + if (op === "paste_after") { + // Mirror the block-lowered insert: paste after the block's last + // line, tagging `blockStart` so landing correction can slide a body + // claiming a depth inside the block back across its trailing closers. + resolved.push({ + kind: "paste", + cursor: { kind: "after_anchor", anchor: { line: span.end } }, + lineNum: edit.lineNum, + index: synthIndex++, + blockStart: span.start, + }); + continue; + } + if (op === "copy" || op === "cut") { + // Capture the resolved span; a cut also deletes it line-by-line, + // exactly like the parser's lowering of `CUT N.=M`. + resolved.push({ + kind: "copy", + range: { start: { line: span.start }, end: { line: span.end } }, + cut: op === "cut", + lineNum: edit.lineNum, + index: synthIndex++, + }); + if (op === "cut") { + for (let line = span.start; line <= span.end; line++) { + resolved.push({ kind: "delete", anchor: { line }, lineNum: edit.lineNum, index: synthIndex++ }); + } + } + continue; + } if (op === "insert_after") { // Mirror the parser's `insert after N:` lowering: one `after_anchor` // insert per payload row, anchored on the block's last line. The diff --git a/packages/hashline/src/clipboard.ts b/packages/hashline/src/clipboard.ts new file mode 100644 index 000000000..72f004714 --- /dev/null +++ b/packages/hashline/src/clipboard.ts @@ -0,0 +1,158 @@ +/** + * Clipboard register support for `CUT` / `COPY` / `PASTE` ops. + * + * `CUT N.=M` / `COPY N.=M` (and their `.BLK` block-resolved forms) capture the + * range's current lines into a {@link Clipboard} register — cut additionally + * lowers to ordinary per-line deletes at parse/resolve time. `PASTE.PRE|POST N`, + * `PASTE.HEAD|TAIL`, and `PASTE.BLK.POST N` insert the captured lines at a + * cursor. The register is threaded through a whole patch application in source + * order — across sections — so content can move between files without being + * retyped: the last capture wins, and a `PASTE` does not consume the register, + * so the same content can land in several places. + * + * {@link resolveClipboardEdits} is the applier's pre-pass: it runs inside + * {@link applyEdits} against the exact text the edits apply to (after block + * resolution and recovery remapping), captures `copy` edits, and expands + * `paste` edits into plain inserts. + */ +import { HL_COPY_KEYWORD, HL_CUT_KEYWORD, HL_RANGE_SEP } from "./format"; +import { EMPTY_PASTE, overwrittenCutMessage, unusedCutMessage } from "./messages"; +import { cloneCursor } from "./tokenizer"; +import type { Clipboard, Edit } from "./types"; + +type CopyEdit = Extract; + +/** `CUT 5.=10` / `COPY 5` display form for diagnostics. */ +function describeCopyEdit(edit: CopyEdit): string { + const { start, end } = edit.range; + const range = start.line === end.line ? `${start.line}` : `${start.line}${HL_RANGE_SEP}${end.line}`; + return `${edit.cut ? HL_CUT_KEYWORD : HL_COPY_KEYWORD} ${range}`; +} + +/** True when at least one edit reads or writes the clipboard register (including unresolved `.BLK` forms). */ +export function hasClipboardEdit(edits: readonly Edit[]): boolean { + return edits.some( + edit => + edit.kind === "copy" || + edit.kind === "paste" || + (edit.kind === "block" && (edit.mode === "copy" || edit.mode === "cut" || edit.mode === "paste_after")), + ); +} +/** Optional knobs for {@link resolveClipboardEdits}. */ +export interface ResolveClipboardEditsOptions { + /** `PASTE` with an empty register: `throw` (default) or `drop` (streaming previews). */ + onEmptyPaste?: "throw" | "drop"; +} + +/** + * Expand clipboard edits against `fileLines` (the text the edit batch applies + * to): `copy` edits capture their range into `clipboard` and emit nothing; + * `paste` edits become one plain insert per captured line. Non-clipboard edits + * pass through untouched, and the fast path returns the input unchanged when + * there is nothing to resolve. Edits are processed in array order — the + * authored patch order — so a `PASTE` uses the most recent capture above it. + * + * Throws on an out-of-range capture, a capture that would overwrite un-pasted + * `CUT` content, and (unless `onEmptyPaste: "drop"`) a `PASTE` with an empty + * register. + */ +export function resolveClipboardEdits( + edits: readonly Edit[], + fileLines: readonly string[], + clipboard: Clipboard, + options: ResolveClipboardEditsOptions = {}, +): readonly Edit[] { + if (!hasClipboardEdit(edits)) return edits; + const onEmptyPaste = options.onEmptyPaste ?? "throw"; + const resolved: Edit[] = []; + let synthIndex = 0; + for (const edit of edits) { + if (edit.kind === "copy") { + const { start, end } = edit.range; + if (start.line < 1 || end.line > fileLines.length) { + throw new Error( + `line ${edit.lineNum}: \`${describeCopyEdit(edit)}\` is out of range (file has ${fileLines.length} lines).`, + ); + } + if (clipboard.pendingCut !== undefined) { + throw new Error(overwrittenCutMessage(clipboard.pendingCut, edit.lineNum)); + } + clipboard.lines = fileLines.slice(start.line - 1, end.line); + if (edit.cut) clipboard.pendingCut = describeCopyEdit(edit); + else delete clipboard.pendingCut; + continue; + } + if (edit.kind === "paste") { + const lines = clipboard.lines; + if (lines === undefined) { + if (onEmptyPaste === "drop") continue; + throw new Error(`line ${edit.lineNum}: ${EMPTY_PASTE}`); + } + delete clipboard.pendingCut; + for (const text of lines) { + resolved.push({ + kind: "insert", + cursor: cloneCursor(edit.cursor), + text, + lineNum: edit.lineNum, + index: synthIndex++, + ...(edit.blockStart === undefined ? {} : { blockStart: edit.blockStart }), + }); + } + continue; + } + resolved.push(edit); + } + return resolved; +} + +/** + * Shallow working copy of a register, for transactional batches: resolve the + * whole batch against the fork, then {@link commitClipboard} it back only + * after the batch's writes actually land. A failed batch leaves the source + * register untouched, so retries are never blocked by phantom captures and a + * failed `PASTE` never clears a real pending cut. + */ +export function forkClipboard(source?: Clipboard): Clipboard { + return source === undefined ? {} : { ...source }; +} + +/** Publish a fork's state back to its source register. */ +export function commitClipboard(fork: Clipboard, target: Clipboard): void { + if (fork.lines === undefined) delete target.lines; + else target.lines = fork.lines; + if (fork.pendingCut === undefined) delete target.pendingCut; + else target.pendingCut = fork.pendingCut; +} + +/** + * Throw when the register still holds un-pasted `CUT` content. Called at the + * end of a batch by whoever created the register: a cut that never landed + * means the patch deleted lines it meant to move (the classic truncated-patch + * failure), so it is rejected rather than silently applied as a delete. + */ +export function assertClipboardConsumed(clipboard: Clipboard): void { + if (clipboard.pendingCut !== undefined) throw new Error(unusedCutMessage(clipboard.pendingCut)); +} + +/** + * Validate clipboard sequencing (a `PASTE` before any capture, a capture over + * un-pasted `CUT` content) without mutating `clipboard` or touching file text. + * The patcher runs this before its recovery path, where {@link applyEdits} + * failures are swallowed and re-surfaced as tag-mismatch errors — sequencing + * mistakes must keep their targeted message instead. + */ +export function validateClipboardSequence(edits: readonly Edit[], clipboard: Clipboard): void { + let hasLines = clipboard.lines !== undefined; + let pendingCut = clipboard.pendingCut; + for (const edit of edits) { + if (edit.kind === "copy") { + if (pendingCut !== undefined) throw new Error(overwrittenCutMessage(pendingCut, edit.lineNum)); + hasLines = true; + pendingCut = edit.cut ? describeCopyEdit(edit) : undefined; + } else if (edit.kind === "paste") { + if (!hasLines) throw new Error(`line ${edit.lineNum}: ${EMPTY_PASTE}`); + pendingCut = undefined; + } + } +} diff --git a/packages/hashline/src/format.ts b/packages/hashline/src/format.ts index ff782ac68..6692e96a8 100644 --- a/packages/hashline/src/format.ts +++ b/packages/hashline/src/format.ts @@ -33,6 +33,18 @@ export const HL_REPLACE_BLOCK_KEYWORD = "SWAP.BLK"; export const HL_DELETE_BLOCK_KEYWORD = "DEL.BLK"; /** Hunk-header keyword: `INS.BLK.POST N:` inserts after the last line of the tree-sitter block at N. */ export const HL_INSERT_AFTER_BLOCK_KEYWORD = "INS.BLK.POST"; +/** Hunk-header keyword: `COPY N.=M` captures lines into the clipboard register. */ +export const HL_COPY_KEYWORD = "COPY"; +/** Hunk-header keyword: `CUT N.=M` captures lines into the clipboard register and deletes them. */ +export const HL_CUT_KEYWORD = "CUT"; +/** Hunk-header keyword: `COPY.BLK N` captures the tree-sitter block at N into the clipboard. */ +export const HL_COPY_BLOCK_KEYWORD = "COPY.BLK"; +/** Hunk-header keyword: `CUT.BLK N` captures the tree-sitter block at N and deletes its span. */ +export const HL_CUT_BLOCK_KEYWORD = "CUT.BLK"; +/** Hunk-header keyword prefix: `PASTE.PRE|POST N` / `PASTE.HEAD|TAIL` inserts the clipboard. */ +export const HL_PASTE_KEYWORD = "PASTE"; +/** Hunk-header keyword: `PASTE.BLK.POST N` inserts the clipboard after the tree-sitter block at N. */ +export const HL_PASTE_AFTER_BLOCK_KEYWORD = "PASTE.BLK.POST"; /** File-level keyword: `REM` deletes the whole file named by the section header. */ export const HL_REM_KEYWORD = "REM"; /** File-level keyword: `MV DEST` renames/moves the section file to `DEST`. */ diff --git a/packages/hashline/src/grammar.lark b/packages/hashline/src/grammar.lark index 41c7a2a32..a93bdf727 100644 --- a/packages/hashline/src/grammar.lark +++ b/packages/hashline/src/grammar.lark @@ -7,13 +7,19 @@ file_header: "[" filename "#" file_hash "]" LF file_hash: /[0-9A-F]{4}/ filename: /[^#\r\n]+/ -hunk: replace_hunk | replace_block_hunk | insert_hunk | insert_block_hunk | delete_hunk | delete_block_hunk | remove_hunk | move_hunk +hunk: replace_hunk | replace_block_hunk | insert_hunk | insert_block_hunk | delete_hunk | delete_block_hunk | copy_hunk | copy_block_hunk | paste_hunk | paste_block_hunk | remove_hunk | move_hunk replace_hunk: replace_anchor LF emit_op* replace_block_hunk: replace_block_anchor LF emit_op+ insert_hunk: insert_anchor LF emit_op+ insert_block_hunk: insert_block_anchor LF emit_op+ delete_hunk: "DEL " header_range LF delete_block_hunk: "DEL.BLK " LID LF +copy_hunk: copy_verb " " header_range LF +copy_block_hunk: copy_verb ".BLK " LID LF +copy_verb: "CUT" | "COPY" +paste_hunk: "PASTE." paste_pos LF +paste_block_hunk: "PASTE.BLK.POST " LID LF +paste_pos: "PRE " LID | "POST " LID | "HEAD" | "TAIL" remove_hunk: "REM" LF move_hunk: "MV " filename LF emit_op* replace_anchor: "SWAP " header_range ":" diff --git a/packages/hashline/src/index.ts b/packages/hashline/src/index.ts index b7e61b17a..def2ee798 100644 --- a/packages/hashline/src/index.ts +++ b/packages/hashline/src/index.ts @@ -1,5 +1,6 @@ export * from "./apply"; export * from "./block"; +export * from "./clipboard"; export * from "./diff-preview"; export * from "./format"; export * from "./fs"; diff --git a/packages/hashline/src/input.ts b/packages/hashline/src/input.ts index e2b3f9455..455dd1a1b 100644 --- a/packages/hashline/src/input.ts +++ b/packages/hashline/src/input.ts @@ -10,10 +10,12 @@ import * as path from "node:path"; import { applyEdits } from "./apply"; import { resolveBlockEdits } from "./block"; +import { assertClipboardConsumed, hasClipboardEdit } from "./clipboard"; import { HL_FILE_HASH_EXAMPLES, HL_FILE_HASH_LENGTH, HL_FILE_HASH_SEP, HL_FILE_PREFIX, HL_FILE_SUFFIX } from "./format"; +import { CLIPBOARD_INTERLEAVED_SECTIONS } from "./messages"; import { parsePatch, parsePatchStreaming } from "./parser"; import { Tokenizer } from "./tokenizer"; -import type { ApplyResult, BlockResolver, Edit, FileOp, SplitOptions } from "./types"; +import type { ApplyResult, BlockResolver, Clipboard, Edit, FileOp, SplitOptions } from "./types"; // Pure classification — single shared tokenizer is safe. const TOKENIZER = new Tokenizer(); @@ -97,6 +99,14 @@ interface RawSection { path: string; fileHash?: string; diff: string; + /** + * True when this section coalesced same-path sections that were NOT + * adjacent in the authored input (another file's section sat between + * them). Merging moves the later ops up to the first occurrence, which + * would silently reorder the clipboard register sequence — so clipboard + * ops are rejected in such sections. + */ + interleaved?: boolean; } /** @@ -239,10 +249,13 @@ export class PatchSection { readonly diff: string; #parsed: { edits: Edit[]; fileOp?: FileOp; warnings: string[] } | undefined; + #interleavedMerge: boolean; + constructor(raw: RawSection) { this.path = raw.path; this.fileHash = raw.fileHash; this.diff = raw.diff; + this.#interleavedMerge = raw.interleaved === true; } /** @@ -253,6 +266,12 @@ export class PatchSection { parse(): { edits: Edit[]; fileOp?: FileOp; warnings: readonly string[] } { this.#parsed ??= parsePatch(this.diff); const parsed = this.#parsed; + // Same-path sections merge into their first occurrence; when that merge + // crossed another file's section, the authored top-to-bottom register + // order is gone, so clipboard ops cannot apply deterministically. + if (this.#interleavedMerge && hasClipboardEdit(parsed.edits)) { + throw new Error(CLIPBOARD_INTERLEAVED_SECTIONS); + } const fileOp = parsed.fileOp === undefined ? undefined @@ -289,10 +308,28 @@ export class PatchSection { if (edit.kind === "delete") return true; // A `replace_block N:` edit is anchored to concrete content on line N. if (edit.kind === "block") return true; + // A `COPY`/`CUT` range reads concrete content. + if (edit.kind === "copy") return true; return edit.cursor.kind === "before_anchor" || edit.cursor.kind === "after_anchor"; }); } + /** + * True when this section is a pure clipboard source: at least one edit, + * and every edit is a non-cut `COPY`/`COPY.BLK`. Only such a section may + * legitimately change nothing in its own file (it exists to fill the + * clipboard for a later `PASTE`), so only it is exempt from no-change + * validation — a section mixing COPY with mutating edits that all no-op'd + * still trips the guard. + */ + get isClipboardSource(): boolean { + const edits = this.edits; + return ( + edits.length > 0 && + edits.every(edit => (edit.kind === "copy" && !edit.cut) || (edit.kind === "block" && edit.mode === "copy")) + ); + } + /** Anchor lines touched by this section, sorted ascending and deduplicated. */ collectAnchorLines(): readonly number[] { const lines = new Set(); @@ -305,6 +342,10 @@ export class PatchSection { lines.add(edit.anchor.line); continue; } + if (edit.kind === "copy") { + for (let line = edit.range.start.line; line <= edit.range.end.line; line++) lines.add(line); + continue; + } if (edit.cursor.kind === "before_anchor" || edit.cursor.kind === "after_anchor") { lines.add(edit.cursor.anchor.line); } @@ -321,15 +362,22 @@ export class PatchSection { * * `blockResolver` resolves any `replace_block N:` edits against `text`; an * unresolvable block throws (this is the final, authoritative preview path). + * + * `clipboard` is the register shared by `CUT`/`COPY`/`PASTE` ops. Pass one + * when applying several sections of a batch so content can move across + * files; when omitted, a private register is used and un-pasted `CUT` + * content is rejected at the end of the call. */ - applyTo(text: string, blockResolver?: BlockResolver): ApplyResult { + applyTo(text: string, blockResolver?: BlockResolver, clipboard?: Clipboard): ApplyResult { const { edits, warnings } = this.parse(); const resolveWarnings: string[] = []; const resolved = resolveBlockEdits(edits, text, this.path, blockResolver, { onUnresolved: "throw", onWarning: warning => resolveWarnings.push(warning), }); - const result = applyEdits(text, resolved); + const register = clipboard ?? {}; + const result = applyEdits(text, resolved, { clipboard: register }); + if (clipboard === undefined) assertClipboardConsumed(register); // Preserve parse warnings so consumers don't need to call `parse()` // separately. const merged = [...warnings, ...resolveWarnings, ...(result.warnings ?? [])]; @@ -347,16 +395,17 @@ export class PatchSection { * * `blockResolver` resolves any `replace_block N:` edits against `text`; an * unresolvable block is silently dropped so a half-written file does not - * throw mid-stream. + * throw mid-stream. A `PASTE` with an empty register is dropped for the + * same reason, and un-pasted `CUT` content is never rejected here. */ - applyPartialTo(text: string, blockResolver?: BlockResolver): ApplyResult { + applyPartialTo(text: string, blockResolver?: BlockResolver, clipboard?: Clipboard): ApplyResult { const { edits, warnings } = parsePatchStreaming(this.diff); const resolveWarnings: string[] = []; const resolved = resolveBlockEdits(edits, text, this.path, blockResolver, { onUnresolved: "drop", onWarning: warning => resolveWarnings.push(warning), }); - const result = applyEdits(text, resolved); + const result = applyEdits(text, resolved, { clipboard: clipboard ?? {}, onEmptyPaste: "drop" }); const merged = [...warnings, ...resolveWarnings, ...(result.warnings ?? [])]; return merged.length > 0 ? { ...result, warnings: merged } @@ -374,6 +423,7 @@ export class PatchSection { path, ...(this.fileHash !== undefined ? { fileHash: this.fileHash } : {}), diff: this.diff, + ...(this.#interleavedMerge ? { interleaved: true } : {}), }); next.#parsed = this.#parsed; return next; @@ -432,7 +482,8 @@ export class Patch { * fails. Path order is preserved by first occurrence. */ function mergeSamePathSections(sections: RawSection[]): RawSection[] { - const byPath = new Map(); + const byPath = new Map(); + let previousPath: string | undefined; for (const section of sections) { const existing = byPath.get(section.path); if (existing) { @@ -446,17 +497,24 @@ function mergeSamePathSections(sections: RawSection[]): RawSection[] { ); } if (existing.fileHash === undefined && section.fileHash !== undefined) existing.fileHash = section.fileHash; + // Merging across another file's section moves these ops up to the + // first occurrence; flag it so clipboard ops can refuse the reorder. + if (previousPath !== section.path) existing.interleaved = true; existing.diffs.push(section.diff); + previousPath = section.path; continue; } byPath.set(section.path, { ...(section.fileHash !== undefined ? { fileHash: section.fileHash } : {}), diffs: [section.diff], + interleaved: false, }); + previousPath = section.path; } return Array.from(byPath, ([sectionPath, entry]) => ({ path: sectionPath, ...(entry.fileHash !== undefined ? { fileHash: entry.fileHash } : {}), diff: entry.diffs.join("\n"), + ...(entry.interleaved ? { interleaved: true } : {}), })); } diff --git a/packages/hashline/src/messages.ts b/packages/hashline/src/messages.ts index d3a7e249a..687c96f5b 100644 --- a/packages/hashline/src/messages.ts +++ b/packages/hashline/src/messages.ts @@ -31,7 +31,21 @@ export function formatAnchoredContext(anchorLines: readonly number[], fileLines: return rows; } /** Concrete range operation rejected because its absolute end precedes its start. */ -export type AbsoluteRangeOp = "replace" | "delete"; +export type AbsoluteRangeOp = "replace" | "delete" | "copy" | "cut"; + +/** Header forms per concrete-range op, used to compose retry suggestions. */ +const RANGE_OP_FORMS: Record = { + replace: { keyword: "SWAP", colon: ":", blockKeyword: "SWAP.BLK" }, + delete: { keyword: "DEL", colon: "", blockKeyword: "DEL.BLK" }, + copy: { keyword: "COPY", colon: "", blockKeyword: "COPY.BLK" }, + cut: { keyword: "CUT", colon: "", blockKeyword: "CUT.BLK" }, +}; + +/** `OP.BLK N`-style header for a concrete-range op (`SWAP.BLK 5:` / `CUT.BLK 5`). */ +function blockFormAt(op: AbsoluteRangeOp, line: number): string { + const forms = RANGE_OP_FORMS[op]; + return `${forms.blockKeyword} ${line}${forms.colon}`; +} /** Explain absolute range endpoints and provide safe, non-applying retry forms. */ export function invalidAbsoluteRangeMessage( @@ -41,15 +55,14 @@ export function invalidAbsoluteRangeMessage( op: AbsoluteRangeOp, block?: BlockSpan, ): string { - const single = op === "replace" ? `SWAP ${start}${HL_RANGE_SEP}${start}:` : `DEL ${start}`; + const forms = RANGE_OP_FORMS[op]; + const single = op === "replace" ? `SWAP ${start}${HL_RANGE_SEP}${start}:` : `${forms.keyword} ${start}`; const countedEnd = start + end - 1; const counted = Number.isSafeInteger(countedEnd) && countedEnd >= start - ? op === "replace" - ? `SWAP ${start}${HL_RANGE_SEP}${countedEnd}:` - : `DEL ${start}${HL_RANGE_SEP}${countedEnd}` + ? `${forms.keyword} ${start}${HL_RANGE_SEP}${countedEnd}${forms.colon}` : null; - const blockForm = op === "replace" ? `SWAP.BLK ${start}:` : `DEL.BLK ${start}`; + const blockForm = blockFormAt(op, start); let message = `line ${patchLine}: Invalid absolute range: start ${start}, end ${end}. ` + `The value after \`${HL_RANGE_SEP}\` is an absolute source line, not a line count or replacement length. ` + @@ -122,17 +135,18 @@ export interface BlockDiagnosticSuggestions { */ export function blockUnresolvedMessage( line: number, - op: "replace" | "delete" = "replace", + op: AbsoluteRangeOp = "replace", fileLines?: readonly string[], suggestions: BlockDiagnosticSuggestions = {}, ): string { - const phrase = op === "delete" ? `DEL.BLK ${line}` : `SWAP.BLK ${line}:`; - const fallback = op === "delete" ? `DEL ${line}${HL_RANGE_SEP}M` : `SWAP ${line}${HL_RANGE_SEP}M:`; + const forms = RANGE_OP_FORMS[op]; + const phrase = blockFormAt(op, line); + const fallback = `${forms.keyword} ${line}${HL_RANGE_SEP}M${forms.colon}`; const anchorText = fileLines?.[line - 1]; const nextBlock = suggestions.nextBlock; let message: string; if (anchorText !== undefined && anchorText.trim().length === 0 && nextBlock) { - const retry = op === "delete" ? `DEL.BLK ${nextBlock.start}` : `SWAP.BLK ${nextBlock.start}:`; + const retry = blockFormAt(op, nextBlock.start); message = `Line ${line} is blank; no syntactic block can begin there. ` + `The next multi-line block begins at line ${nextBlock.start} and ends at line ${nextBlock.end}. ` + @@ -144,7 +158,7 @@ export function blockUnresolvedMessage( } const enclosingBlock = suggestions.enclosingBlock; if (enclosingBlock) { - const retry = op === "delete" ? `DEL.BLK ${enclosingBlock.start}` : `SWAP.BLK ${enclosingBlock.start}:`; + const retry = blockFormAt(op, enclosingBlock.start); message += ` The nearest enclosing multi-line block begins at line ${enclosingBlock.start} ` + `and ends at line ${enclosingBlock.end}; use \`${retry}\` to target it.`; @@ -158,24 +172,44 @@ export function blockUnresolvedMessage( /** Block-anchored edit reached a path with no {@link BlockResolver} wired in — a host-configuration bug. */ export const BLOCK_RESOLVER_UNAVAILABLE = - "`SWAP.BLK`/`DEL.BLK`/`INS.BLK.POST` are not available here (no block resolver configured). Use a concrete line range."; + "Block ops (`SWAP.BLK`, `DEL.BLK`, `INS.BLK.POST`, `CUT.BLK`, `COPY.BLK`, `PASTE.BLK.POST`) are not available here (no block resolver configured). Use a concrete line range."; /** - * `insert_after_block N:` anchored on a closing-delimiter line, lowered to - * plain `insert after N:` — the closer ends a block, and inserting after it - * is exactly what the plain form does. + * An after-block op anchored on a closing-delimiter line, lowered to its + * plain after-line form — the closer ends a block, and inserting after it is + * exactly what the plain form does. */ -export function insertAfterBlockCloserLoweredWarning(line: number): string { - return `\`INS.BLK.POST ${line}:\` anchors on a closing delimiter, so it was applied as plain \`INS.POST ${line}:\`. Anchor on the line that OPENS the construct.`; +function closerLoweredWarning(blockForm: string, plainForm: string): string { + return `\`${blockForm}\` anchors on a closing delimiter, so it was applied as plain \`${plainForm}\`. Anchor on the line that OPENS the construct.`; } /** - * `insert_after_block N:` anchor unresolvable (unsupported language, blank - * line, parse error, or no resolver), lowered to plain `insert after N:` — - * applying with a warning beats failing the patch. + * An after-block op whose anchor was unresolvable (unsupported language, + * blank line, parse error, or no resolver), lowered to its plain after-line + * form — applying with a warning beats failing the patch. */ +function unresolvedLoweredWarning(blockForm: string, line: number, plainForm: string): string { + return `\`${blockForm}\` could not resolve a syntactic block on line ${line}, so it was applied as plain \`${plainForm}\`. Verify the landing line; anchor on a line that OPENS a construct.`; +} + +/** `INS.BLK.POST N:` anchored on a closing-delimiter line; applied as `INS.POST N:`. */ +export function insertAfterBlockCloserLoweredWarning(line: number): string { + return closerLoweredWarning(`INS.BLK.POST ${line}:`, `INS.POST ${line}:`); +} + +/** `INS.BLK.POST N:` anchor unresolvable; applied as `INS.POST N:`. */ export function insertAfterBlockUnresolvedLoweredWarning(line: number): string { - return `\`INS.BLK.POST ${line}:\` could not resolve a syntactic block on line ${line}, so it was applied as plain \`INS.POST ${line}:\`. Verify the landing line; anchor on a line that OPENS a construct.`; + return unresolvedLoweredWarning(`INS.BLK.POST ${line}:`, line, `INS.POST ${line}:`); +} + +/** `PASTE.BLK.POST N` anchored on a closing-delimiter line; applied as `PASTE.POST N`. */ +export function pasteAfterBlockCloserLoweredWarning(line: number): string { + return closerLoweredWarning(`PASTE.BLK.POST ${line}`, `PASTE.POST ${line}`); +} + +/** `PASTE.BLK.POST N` anchor unresolvable; applied as `PASTE.POST N`. */ +export function pasteAfterBlockUnresolvedLoweredWarning(line: number): string { + return unresolvedLoweredWarning(`PASTE.BLK.POST ${line}`, line, `PASTE.POST ${line}`); } /** * A one-sided boundary echo whose payload is too short to be the widened @@ -248,6 +282,42 @@ export const MOVE_TAKES_NO_BODY = /** `delete_block N` hunk received a body row. */ export const DELETE_BLOCK_TAKES_NO_BODY = "`DEL.BLK N` does not take body rows. Remove the body, or use `SWAP.BLK N:`."; +/** `COPY N.=M` hunk received a body row. */ +export const COPY_TAKES_NO_BODY = `\`COPY N${HL_RANGE_SEP}M\` captures lines into the clipboard and takes no body rows.`; + +/** `CUT N.=M` hunk received a body row. */ +export const CUT_TAKES_NO_BODY = `\`CUT N${HL_RANGE_SEP}M\` captures + deletes lines and takes no body rows. To replace lines with new content, use \`SWAP N${HL_RANGE_SEP}M:\`.`; + +/** `PASTE` hunk received a body row. */ +export const PASTE_TAKES_NO_BODY = + "`PASTE` inserts the clipboard content and takes no `+` body rows. To insert literal text, use `INS`."; + +/** `PASTE` ran with an empty clipboard register. */ +export const EMPTY_PASTE = `\`PASTE\` found nothing in the clipboard. Ops run top-to-bottom across the whole patch (sections included): put \`CUT N${HL_RANGE_SEP}M\` / \`COPY N${HL_RANGE_SEP}M\` (or \`CUT.BLK N\` / \`COPY.BLK N\`) above the \`PASTE\`.`; + +/** A `CUT` filled the register and the whole patch finished without a `PASTE`. */ +export function unusedCutMessage(cutForm: string): string { + return `\`${cutForm}\` deleted lines that were never pasted — no \`PASTE\` follows it in the patch. Add a \`PASTE.PRE|POST N\` / \`PASTE.HEAD|TAIL\` op, or use \`DEL\` to delete without moving.`; +} + +/** A later CUT/COPY overwrote a register whose CUT content was never pasted. */ +export function overwrittenCutMessage(cutForm: string, lineNum: number): string { + return `line ${lineNum}: the clipboard still holds \`${cutForm}\` content that was never pasted. \`PASTE\` it before capturing again, or use \`DEL\` if those lines should just be deleted.`; +} + +/** Batch ended with un-pasted `CUT` content in a session-persistent register. */ +export function pendingCutWarning(cutForm: string): string { + return `\`${cutForm}\` content is in the clipboard but was not pasted by this edit. It stays available — \`PASTE\` it in a follow-up edit; capturing again before pasting it will be rejected.`; +} + +/** + * Clipboard ops inside a same-path section that was merged across another + * file's section. Same-path sections coalesce into their first occurrence, so + * an interleaved layout would silently reorder the register sequence. + */ +export const CLIPBOARD_INTERLEAVED_SECTIONS = + "`CUT`/`COPY`/`PASTE` cannot be used in a file whose sections are interleaved with another file's: same-path sections merge into the first occurrence, which would reorder the clipboard sequence. Keep each file's ops under ONE `[path#TAG]` header, with every capture above its `PASTE`."; + /** Insert hunk with no body. */ export const EMPTY_INSERT = "`INS` needs at least one `+TEXT` body row."; @@ -413,33 +483,32 @@ export function unseenLinesMessage( } /** Op kind of a deferred block edit, for {@link blockSingleLineMessage}. */ -export type BlockOp = "replace" | "delete" | "insert_after"; +export type BlockOp = "replace" | "delete" | "insert_after" | "copy" | "cut" | "paste_after"; + +/** Display forms per deferred-block op: block keyword, trailing colon, and single-line plain form. */ +const BLOCK_OP_FORMS: Record string }> = { + replace: { keyword: "SWAP.BLK", colon: ":", plain: line => `SWAP ${line}${HL_RANGE_SEP}${line}:` }, + delete: { keyword: "DEL.BLK", colon: "", plain: line => `DEL ${line}` }, + insert_after: { keyword: "INS.BLK.POST", colon: ":", plain: line => `INS.POST ${line}:` }, + copy: { keyword: "COPY.BLK", colon: "", plain: line => `COPY ${line}` }, + cut: { keyword: "CUT.BLK", colon: "", plain: line => `CUT ${line}` }, + paste_after: { keyword: "PASTE.BLK.POST", colon: "", plain: line => `PASTE.POST ${line}` }, +}; /** * A `replace_block`/`delete_block`/`insert_after_block` anchor resolved to a - * single line — almost always a bare statement the model mis-anchored, not a - * multi-line construct. The plain op is unambiguous for one line; the block - * form only earns its keep when it spares counting a closing line you cannot - * see. Reject and point at both fixes. + * single line: line N is a bare statement, not the opening line of a + * multi-line construct. The plain op is exact for one line, so reject and + * point at it (with the enclosing block as an alternative when known). */ export function blockSingleLineMessage(line: number, op: BlockOp, enclosingBlock?: BlockSpan): string { - const blockForm = op === "insert_after" ? "INS.BLK.POST" : op === "delete" ? "DEL.BLK" : "SWAP.BLK"; - const plainForm = - op === "insert_after" - ? `INS.POST ${line}:` - : op === "delete" - ? `DEL ${line}` - : `SWAP ${line}${HL_RANGE_SEP}${line}:`; + const forms = BLOCK_OP_FORMS[op]; + const plainForm = forms.plain(line); let message = - `\`${blockForm} ${line}\` resolved a single-line block — line ${line} is a bare statement, not the opening line ` + + `\`${forms.keyword} ${line}\` resolved a single-line block — line ${line} is a bare statement, not the opening line ` + `of a multi-line construct. For only this statement use \`${plainForm}\`.`; if (enclosingBlock) { - const enclosingForm = - op === "insert_after" - ? `INS.BLK.POST ${enclosingBlock.start}:` - : op === "delete" - ? `DEL.BLK ${enclosingBlock.start}` - : `SWAP.BLK ${enclosingBlock.start}:`; + const enclosingForm = `${forms.keyword} ${enclosingBlock.start}${forms.colon}`; message += ` The nearest enclosing multi-line block begins at line ${enclosingBlock.start} ` + `and ends at line ${enclosingBlock.end}; use \`${enclosingForm}\` to target it.`; diff --git a/packages/hashline/src/parser.ts b/packages/hashline/src/parser.ts index 13751113b..624b72aa7 100644 --- a/packages/hashline/src/parser.ts +++ b/packages/hashline/src/parser.ts @@ -7,6 +7,8 @@ import { HL_PAYLOAD_REPLACE, HL_RANGE_SEP } from "./format"; import { type AbsoluteRangeOp, BARE_BODY_AUTO_PIPED_WARNING, + COPY_TAKES_NO_BODY, + CUT_TAKES_NO_BODY, DELETE_BLOCK_TAKES_NO_BODY, DELETE_TAKES_NO_BODY, EMPTY_BLOCK, @@ -15,6 +17,7 @@ import { MINUS_BULLET_AUTO_PIPED_WARNING, MINUS_ROW_REJECTED, MOVE_TAKES_NO_BODY, + PASTE_TAKES_NO_BODY, REM_TAKES_NO_BODY, } from "./messages"; import { stripOneLeadingHashlinePrefix } from "./prefixes"; @@ -75,6 +78,27 @@ function isSkippableCommentLine(line: string): boolean { return line.trimStart().startsWith("#"); } +/** + * Body-row rejection message for targets that take no `+TEXT` rows, or `null` + * for targets whose header is followed by a body. + */ +function bodylessTargetMessage(target: BlockTarget): string | null { + switch (target.kind) { + case "delete": + return DELETE_TAKES_NO_BODY; + case "delete_block": + return DELETE_BLOCK_TAKES_NO_BODY; + case "copy": + case "copy_block": + return target.cut ? CUT_TAKES_NO_BODY : COPY_TAKES_NO_BODY; + case "paste": + case "paste_after_block": + return PASTE_TAKES_NO_BODY; + default: + return null; + } +} + /** * Stripped remainder of a bare `N: ` row that is a lone quoted or * numeric literal (optionally comma-terminated) — the shape of a numeric-keyed @@ -121,6 +145,12 @@ function detectApplyPatchContamination(text: string, _hasPending: boolean): stri if (/^DEL\s+[1-9]\d*(?:\s*(?:\.\.|\.=|-|…|\s)\s*[1-9]\d*)?\s*:/.test(trimmed)) { return `\`DEL N${HL_RANGE_SEP}M\` has no colon and no body. Remove the colon and body rows.`; } + // Bare `PASTE` (optionally `PASTE 5` / `PASTE:`) — the op requires an + // explicit position suffix; a bare form would otherwise surface as a + // confusing body-row rejection under the preceding hunk. + if (/^PASTE(?:\s+[1-9]\d*)?\s*:?\s*$/.test(trimmed)) { + return "`PASTE` needs a position: use `PASTE.PRE N` / `PASTE.POST N` / `PASTE.HEAD` / `PASTE.TAIL` / `PASTE.BLK.POST N`."; + } if (/^[1-9]\d*\s*$/.test(trimmed)) { return `hunk headers need a verb. Use \`SWAP ${trimmed}${HL_RANGE_SEP}${trimmed}:\` to replace, or \`DEL ${trimmed}\` to delete.`; } @@ -210,6 +240,9 @@ export class Executor { if (token.target.kind === "replace" || token.target.kind === "delete") { validateRange(token.target.range, token.lineNum, token.target.kind); } + if (token.target.kind === "copy") { + validateRange(token.target.range, token.lineNum, token.target.cut ? "cut" : "copy"); + } if (token.target.kind === "rem") { this.#flushPending(); this.#setFileOp({ kind: "rem" }, token.lineNum); @@ -241,8 +274,7 @@ export class Executor { endStreaming(): { edits: Edit[]; fileOp?: FileOp; warnings: string[] } { this.#consumePendingSkippableComments(); if (this.#pending && this.#pending.payloads.length > 0) this.#flushPending(); - else if (this.#pending?.target.kind === "delete" || this.#pending?.target.kind === "delete_block") - this.#flushPending(); + else if (this.#pending && bodylessTargetMessage(this.#pending.target) !== null) this.#flushPending(); else this.#pending = undefined; this.#validateFileOp(); this.#validateNoOverlappingDeletes(); @@ -312,8 +344,8 @@ export class Executor { `Got ${JSON.stringify(`${HL_PAYLOAD_REPLACE}${text}`)}.`, ); } - if (pending.target.kind === "delete") throw new Error(`line ${lineNum}: ${DELETE_TAKES_NO_BODY}`); - if (pending.target.kind === "delete_block") throw new Error(`line ${lineNum}: ${DELETE_BLOCK_TAKES_NO_BODY}`); + const noBodyOnLiteral = bodylessTargetMessage(pending.target); + if (noBodyOnLiteral !== null) throw new Error(`line ${lineNum}: ${noBodyOnLiteral}`); this.#commitDeferredBlanks(pending); pending.payloads.push({ kind: "literal", text, lineNum }); } @@ -327,9 +359,8 @@ export class Executor { this.#handleBlank(text, lineNum); return; } - if (this.#pending.target.kind === "delete") throw new Error(`line ${lineNum}: ${DELETE_TAKES_NO_BODY}`); - if (this.#pending.target.kind === "delete_block") - throw new Error(`line ${lineNum}: ${DELETE_BLOCK_TAKES_NO_BODY}`); + const noBodyOnRaw = bodylessTargetMessage(this.#pending.target); + if (noBodyOnRaw !== null) throw new Error(`line ${lineNum}: ${noBodyOnRaw}`); const row: PayloadRow = { kind: "literal", text, lineNum, bare: true }; // `-` rows are held and judged at flush time by #resolveMinusRows, // once the whole body is visible. @@ -364,7 +395,7 @@ export class Executor { #handleBlank(text: string, lineNum: number): void { const pending = this.#pending; if (!pending) return; - if (pending.target.kind === "delete" || pending.target.kind === "delete_block") return; + if (bodylessTargetMessage(pending.target) !== null) return; if (pending.payloads.length === 0) return; pending.deferredBlanks.push({ kind: "literal", text, lineNum, bare: true }); } @@ -455,7 +486,27 @@ export class Executor { for (let line = range.start.line; line <= range.end.line; line++) this.#pushDelete({ line }, lineNum); } - #pushBlock(anchor: Anchor, payloads: readonly PayloadRow[], lineNum: number, mode?: "insert_after"): void { + #pushCopy(range: ParsedRange, cut: boolean, lineNum: number): void { + this.#edits.push({ + kind: "copy", + range: { start: { ...range.start }, end: { ...range.end } }, + cut, + lineNum, + index: this.#editIndex++, + }); + // A CUT deletes its range exactly like `DEL N.=M`; the copy edit above + // only captures. Keeping the deletes as ordinary per-line edits lets + // overlap validation, recovery remapping, and the applier treat them + // identically to a plain delete. + if (cut) this.#pushDeleteRange(range, lineNum); + } + + #pushBlock( + anchor: Anchor, + payloads: readonly PayloadRow[], + lineNum: number, + mode?: "insert_after" | "copy" | "cut" | "paste_after", + ): void { this.#edits.push({ kind: "block", anchor: { ...anchor }, @@ -486,6 +537,22 @@ export class Executor { this.#pushBlock(target.anchor, [], lineNum); return; } + if (target.kind === "copy") { + this.#pushCopy(target.range, target.cut, lineNum); + return; + } + if (target.kind === "copy_block") { + this.#pushBlock(target.anchor, [], lineNum, target.cut ? "cut" : "copy"); + return; + } + if (target.kind === "paste") { + this.#edits.push({ kind: "paste", cursor: cloneCursor(target.cursor), lineNum, index: this.#editIndex++ }); + return; + } + if (target.kind === "paste_after_block") { + this.#pushBlock(target.anchor, [], lineNum, "paste_after"); + return; + } if (target.kind === "block") { if (payloads.length === 0) throw new Error(`line ${lineNum}: ${EMPTY_BLOCK}`); this.#pushBlock(target.anchor, payloads, lineNum); diff --git a/packages/hashline/src/patcher.ts b/packages/hashline/src/patcher.ts index 162aee2ad..bb9ec3031 100644 --- a/packages/hashline/src/patcher.ts +++ b/packages/hashline/src/patcher.ts @@ -25,6 +25,7 @@ import * as path from "node:path"; import { applyEdits } from "./apply"; import { hasBlockEdit, resolveBlockEdits } from "./block"; +import { assertClipboardConsumed, commitClipboard, forkClipboard, validateClipboardSequence } from "./clipboard"; import { computeFileHash, formatHashlineHeader } from "./format"; import type { Filesystem, WriteResult } from "./fs"; import { isNotFound } from "./fs"; @@ -33,6 +34,7 @@ import { HEADTAIL_DRIFT_WARNING, missingSnapshotTagMessage, pathRecoveredFromTagMessage, + pendingCutWarning, type RevealedLine, unseenLinesMessage, writeDriftWarning, @@ -42,7 +44,7 @@ import { detectLineEnding, type LineEnding, normalizeToLF, restoreLineEndings, s import { InvalidAbsoluteRangeError } from "./parser"; import { Recovery, type RecoveryResult } from "./recovery"; import type { Snapshot, SnapshotStore } from "./snapshots"; -import type { ApplyResult, BlockResolution, BlockResolver, BlockSpan, Edit, FileOp } from "./types"; +import type { ApplyResult, BlockResolution, BlockResolver, BlockSpan, Clipboard, Edit, FileOp } from "./types"; /** * Upper bound on the number of unseen anchor lines whose actual file content @@ -81,6 +83,15 @@ export interface PatcherOptions { * validate on content hash alone and any anchor into the tagged content applies. */ enforceSeenLines?: boolean; + /** + * Host-owned clipboard register shared across batches, so `CUT` content + * can be `PASTE`d by a later {@link Patcher.apply} call. Each batch works + * on a fork and publishes it back only after every write lands; un-pasted + * `CUT` content at batch end becomes a warning instead of an error. + * Omitted, every batch gets its own register and un-pasted `CUT` content + * is rejected when the batch ends. + */ + clipboard?: Clipboard; } /** Per-section result returned by {@link Patcher.apply} / {@link Patcher.commit}. */ @@ -158,6 +169,8 @@ function hasAnchorScopedEdit(edits: readonly Edit[]): boolean { if (edit.kind === "delete") return true; // A `replace_block N:` edit anchors to concrete content on line N. if (edit.kind === "block") return true; + // A `COPY`/`CUT` range reads concrete content. + if (edit.kind === "copy") return true; return edit.cursor.kind === "before_anchor" || edit.cursor.kind === "after_anchor"; }); } @@ -211,6 +224,7 @@ export class Patcher { readonly snapshots: SnapshotStore; readonly recovery: Recovery; readonly blockResolver: BlockResolver | undefined; + readonly clipboard: Clipboard | undefined; readonly #enforceSeenLines: boolean; constructor(options: PatcherOptions) { @@ -221,6 +235,7 @@ export class Patcher { this.snapshots = options.snapshots; this.recovery = new Recovery(options.snapshots); this.blockResolver = options.blockResolver; + this.clipboard = options.clipboard; this.#enforceSeenLines = options.enforceSeenLines ?? true; } @@ -231,19 +246,44 @@ export class Patcher { * {@link PatchSectionResult} per section in the original patch order. */ async apply(patch: Patch): Promise { + // One register per batch: `CUT`/`COPY` in one section feeds `PASTE` in + // a later one, so content can move across files. A host-owned register + // (see PatcherOptions.clipboard) additionally persists across batches: + // work on a fork and publish it per landed section, so a failed batch + // never poisons the persistent register and a mid-batch failure still + // preserves content already cut from disk. + const clipboard = forkClipboard(this.clipboard); + // Single-section fast path. if (patch.sections.length === 1) { - const prepared = await this.prepare(patch.sections[0]); - return { sections: [await this.commit(prepared)] }; + const prepared = await this.prepare(patch.sections[0], clipboard); + if (this.clipboard === undefined) assertClipboardConsumed(clipboard); + const result = await this.commit(prepared); + if (this.clipboard !== undefined) { + commitClipboard(clipboard, this.clipboard); + if (clipboard.pendingCut !== undefined) result.warnings.push(pendingCutWarning(clipboard.pendingCut)); + } + return { sections: [result] }; } // Prepare every section first so any failure (stale hash, missing // file, parse error, in-memory no-op) surfaces before any write. const prepared: PreparedSection[] = []; - for (const section of patch.sections) prepared.push(await this.prepare(section)); + // Register state after each section's prepare. Commits are non-atomic: + // when a later write fails, the sections before it are already on disk, + // so the host register must reflect exactly the landed prefix — content + // a landed CUT deleted would otherwise be lost. + const sectionStates: Clipboard[] = []; + for (const section of patch.sections) { + prepared.push(await this.prepare(section, clipboard)); + sectionStates.push(forkClipboard(clipboard)); + } + if (this.clipboard === undefined) assertClipboardConsumed(clipboard); assertUniqueCanonicalPaths(prepared); for (const entry of prepared) { - if (entry.isNoop) { + // A copy-only section legitimately changes nothing: it exists to + // fill the clipboard for a later `PASTE`. + if (entry.isNoop && !entry.section.isClipboardSource) { throw new Error(`Edits to ${entry.section.path} resulted in no changes being made.`); } } @@ -266,6 +306,10 @@ export class Patcher { { cause: error }, ); } + if (this.clipboard !== undefined) commitClipboard(sectionStates[index], this.clipboard); + } + if (this.clipboard !== undefined && clipboard.pendingCut !== undefined) { + results[results.length - 1]?.warnings.push(pendingCutWarning(clipboard.pendingCut)); } return { sections: results }; } @@ -275,11 +319,14 @@ export class Patcher { * No writes hit the filesystem. Use for CI checks and dry runs. */ async preflight(patch: Patch): Promise { + // Dry run: fork the register and never publish it back. + const clipboard = forkClipboard(this.clipboard); const prepared: PreparedSection[] = []; - for (const section of patch.sections) prepared.push(await this.prepare(section)); + for (const section of patch.sections) prepared.push(await this.prepare(section, clipboard)); + if (this.clipboard === undefined) assertClipboardConsumed(clipboard); assertUniqueCanonicalPaths(prepared); for (const entry of prepared) { - if (entry.isNoop) { + if (entry.isNoop && !entry.section.isClipboardSource) { throw new Error(`Edits to ${entry.section.path} resulted in no changes being made.`); } } @@ -310,10 +357,15 @@ export class Patcher { * {@link PreparedSection} which can be fed to {@link commit} to land * the result on the filesystem. * + * `clipboard` is the register shared by `CUT`/`COPY`/`PASTE` ops. Pass the + * batch's register when preparing several sections so content can move + * across files; when omitted, a private register is used and un-pasted + * `CUT` content is rejected before this method returns. + * * Throws on parse error, missing-file-for-anchored-edit, or unrecovered * tag mismatch ({@link MismatchError}). */ - async prepare(section: PatchSection): Promise { + async prepare(section: PatchSection, clipboard?: Clipboard): Promise { const parsed = await this.#parseWithRangeDiagnostics(section); const parseWarnings = [...parsed.warnings]; const fileOp = parsed.fileOp; @@ -360,6 +412,7 @@ export class Patcher { const lineEnding = detectLineEnding(text); const normalized = normalizeToLF(text); + const register = clipboard ?? {}; const applyResult = fileOp?.kind === "rem" ? this.#applyWithRecovery({ @@ -368,6 +421,7 @@ export class Patcher { exists: read.exists, normalized, edits: [], + clipboard: register, }) : this.#applyWithRecovery({ section: target, @@ -375,7 +429,9 @@ export class Patcher { exists: read.exists, normalized, edits: parsed.edits, + clipboard: register, }); + if (clipboard === undefined) assertClipboardConsumed(register); return new PreparedSection( target, @@ -639,8 +695,9 @@ export class Patcher { exists: boolean; normalized: string; edits: readonly Edit[]; + clipboard: Clipboard; }): ApplyResult { - const { section, canonicalPath, exists, normalized, edits } = args; + const { section, canonicalPath, exists, normalized, edits, clipboard } = args; const expected = exists ? section.fileHash : undefined; // The 4-hex tag is content-derived: when the live text hashes to it, // trust the match and apply directly. `storedSnapshotForTag` feeds the @@ -673,6 +730,11 @@ export class Patcher { onWarning: warning => resolveWarnings.push(warning), }); } + // Surface clipboard sequencing mistakes (`PASTE` before any capture, + // capturing over un-pasted `CUT` content) with their targeted message + // before the recovery path below, which swallows apply failures and + // re-surfaces them as tag-mismatch errors. + validateClipboardSequence(resolved, clipboard); const withResolveWarnings = (result: ApplyResult): ApplyResult => resolveWarnings.length === 0 ? result @@ -689,7 +751,7 @@ export class Patcher { if (expected !== undefined && this.#enforceSeenLines) { this.#assertSeenLines(section, expected, matchedSnapshot); } - const result = applyEdits(normalized, resolved); + const result = applyEdits(normalized, resolved, { clipboard }); return withResolveWarnings(blockResolutions.length > 0 ? { ...result, blockResolutions } : result); } // Head/tail-only inserts are position-stable: "start"/"end" cannot move @@ -697,7 +759,7 @@ export class Patcher { // content and warn instead of hard-failing — unlike an anchored // mismatch, which cannot be safely relocated and must reject. if (!hasAnchorScopedEdit(resolved)) { - const result = applyEdits(normalized, resolved); + const result = applyEdits(normalized, resolved, { clipboard }); return withResolveWarnings({ ...result, warnings: [HEADTAIL_DRIFT_WARNING, ...(result.warnings ?? [])] }); } // File drifted: map every anchor from the tagged snapshot to unchanged @@ -707,6 +769,7 @@ export class Patcher { currentText: normalized, fileHash: expected, edits: resolved, + clipboard, }); if (recovered) return withResolveWarnings(recoveryToApplyResult(recovered)); const hashRecognized = this.snapshots.byHash(canonicalPath, expected) !== null; diff --git a/packages/hashline/src/prompt.md b/packages/hashline/src/prompt.md index 655401689..883716757 100644 --- a/packages/hashline/src/prompt.md +++ b/packages/hashline/src/prompt.md @@ -1,4 +1,4 @@ -Your patch language names lines to replace, delete, or insert at, then lists the new content. Rule of thumb: a header ending in `:` is followed by `+` body rows; `DEL` has no body. +Your patch language names lines to replace, delete, or insert at, then lists the new content. Rule of thumb: a header ending in `:` is followed by `+` body rows; `DEL`, `CUT`/`COPY`, and `PASTE` have no body. Every file section starts with `[PATH#TAG]`. `TAG` = 4-hex snapshot tag from your latest `read`/`search`, REQUIRED on every section — no hashless form. Create new files with `write`; hashline only edits existing files. @@ -13,6 +13,9 @@ Every file section starts with `[PATH#TAG]`. `TAG` = 4-hex snapshot tag from you `INS.POST N:` — insert the body rows immediately after line N. `INS.BLK.POST N:` — insert the body rows after the END of the block that BEGINS on line N — outside it, at sibling depth. To append inside a block, use `INS.POST`. `INS.HEAD:` / `INS.TAIL:` — insert the body rows at the very start / end of the file. +`CUT N.=M` / `COPY N.=M` — capture original lines N.=M into the clipboard (CUT also deletes them, like `DEL`). No body. +`CUT.BLK N` / `COPY.BLK N` — capture the whole syntactic block that BEGINS on line N. +`PASTE.PRE N` / `PASTE.POST N` / `PASTE.HEAD` / `PASTE.TAIL` / `PASTE.BLK.POST N` — insert the clipboard at the position. No body — the clipboard IS the body. `REM` — delete the whole file named by the section header. No body, no line ops. `MV DEST` — move/rename the section file to `DEST` (a path, quoted when it contains spaces). Line edits above `MV` land on the source first, then the final content is written at `DEST`. Single line: `SWAP N.=N:` / `DEL N`. The range is the ORIGINAL lines you touch; body length is irrelevant (replacing 1 line with 10 is still `SWAP N.=N:`). @@ -39,6 +42,8 @@ Body rows appear only under a `:` header. Every body row is `+TEXT` — add a li - Markdown: a heading line IS a block opener — `SWAP.BLK`/`DEL.BLK`/`INS.BLK.POST` on a `##`/`###` heading resolves its WHOLE section (heading through every nested deeper heading, up to the next same-or-higher heading). So `DEL.BLK` drops the section, `SWAP.BLK` rewrites it, `INS.BLK.POST` lands after it (end the inserted body with a blank line to keep the next heading separated). - Non-adjacent changes = separate hunks; untouched lines stay out of every range. - Pure additions use `INS.PRE` / `INS.POST` / `INS.HEAD` / `INS.TAIL`, never a widened `SWAP` — retyped keepers are exactly what gets dropped. (A multi-line `SWAP` whose body restates the line just past the range is auto-dropped as an off-by-one keeper with a warning — issue the payload for the range only; never lean on the repair.) +- Move code with `CUT`+`PASTE`, never by retyping it in a body. The clipboard runs top-to-bottom through the whole patch — across `[file]` sections, so content moves between files — and persists across edit calls. The last `CUT`/`COPY` wins; `PASTE` may repeat (it does not consume). Content pastes verbatim, indentation included — re-indenting a move needs `SWAP`. +- `CUT` content must land: un-pasted `CUT` content is rejected or carried to the next call with a warning, and a new `CUT`/`COPY` before pasting it is an error. - NEVER format/restyle code with this tool; run the project formatter instead. @@ -111,6 +116,16 @@ INS.POST 2: + - nested task ``` +Move the `greet` function after line 4 without retyping it, then copy line 4 into a sibling file — the clipboard flows top-to-bottom across sections: +``` +[greet.py#A1B2] +CUT.BLK 1 +PASTE.POST 4 +COPY 4.=4 +[other.py#3C4D] +PASTE.HEAD +``` + Replace the whole `greet` function block — `SWAP.BLK 1:` resolves lines 1–3 (the `def` header through `print(msg)`); line 4 is a separate statement and stays: ``` [greet.py#A1B2] @@ -162,6 +177,10 @@ INS.BLK.POST 3: # RIGHT INS.POST 3: +after() + +# WRONG — body rows under PASTE; the clipboard is the body. RIGHT: capture first, then a bodyless `PASTE.POST 20` (no colon, no rows). +PASTE.POST 20: ++function f() {} diff --git a/packages/hashline/src/recovery.ts b/packages/hashline/src/recovery.ts index f6456b23f..a93e7f1ac 100644 --- a/packages/hashline/src/recovery.ts +++ b/packages/hashline/src/recovery.ts @@ -10,13 +10,15 @@ import { diffLineRuns } from "@oh-my-pi/pi-natives"; import { applyEdits } from "./apply"; import { RECOVERY_EXTERNAL_WARNING, RECOVERY_LINE_REMAP_WARNING, RECOVERY_SESSION_CHAIN_WARNING } from "./messages"; import type { SnapshotStore } from "./snapshots"; -import type { Anchor, ApplyResult, Edit } from "./types"; +import type { Anchor, ApplyResult, Clipboard, Edit } from "./types"; export interface RecoveryArgs { path: string; currentText: string; fileHash: string; edits: readonly Edit[]; + /** Shared clipboard register for `copy`/`paste` edits, threaded into the replay apply. */ + clipboard?: Clipboard; } export interface RecoveryResult { @@ -41,6 +43,13 @@ function getEditAnchors(edit: Edit): Anchor[] { // Recovery only ever receives already-resolved edits (no `block`); this arm // exists for type-exhaustiveness over the full `Edit` union. if (edit.kind === "block") return [edit.anchor]; + if (edit.kind === "copy") { + // Every line of the captured range is an anchor: capturing a range + // whose interior changed would paste content the author never saw. + const anchors: Anchor[] = []; + for (let line = edit.range.start.line; line <= edit.range.end.line; line++) anchors.push({ line }); + return anchors; + } return edit.cursor.kind === "before_anchor" || edit.cursor.kind === "after_anchor" ? [edit.cursor.anchor] : []; } @@ -213,6 +222,22 @@ function remapEditsToCurrent(previousText: string, currentText: string, edits: r remapped.push({ ...edit, anchor }); continue; } + if (edit.kind === "copy") { + // Map every line of the captured range, not just its endpoints: an + // unmapped interior line means the content drifted and the capture + // would carry text the author never saw. The uniform-offset rule + // below keeps the mapped range contiguous. + const start = mapLine(edit.range.start.line); + if (start === null) return null; + let end = start; + for (let line = edit.range.start.line + 1; line <= edit.range.end.line; line++) { + const mapped = mapLine(line); + if (mapped === null) return null; + end = mapped; + } + remapped.push({ ...edit, range: { start: { line: start }, end: { line: end } } }); + continue; + } let blockStart = edit.blockStart; if (blockStart !== undefined) { @@ -243,12 +268,13 @@ function replayRemappedAnchorsOnCurrent( currentText: string, edits: readonly Edit[], recoveryWarning: string, + clipboard: Clipboard | undefined, ): RecoveryResult | null { const remapped = remapEditsToCurrent(previousText, currentText, edits); if (remapped === null) return null; let applied: ApplyResult; try { - applied = applyEdits(currentText, remapped.edits); + applied = applyEdits(currentText, remapped.edits, clipboard === undefined ? {} : { clipboard }); } catch { return null; } @@ -276,13 +302,13 @@ export class Recovery { * caller should then surface a {@link MismatchError}. */ tryRecover(args: RecoveryArgs): RecoveryResult | null { - const { path, currentText, fileHash, edits } = args; + const { path, currentText, fileHash, edits, clipboard } = args; // When retained texts collide on the 16-bit tag, use the latest one. // Recovery still requires its anchors and context to map unambiguously. const snapshot = this.store.byHash(path, fileHash); if (!snapshot) return null; const recoveryWarning = this.store.head(path) === snapshot ? RECOVERY_EXTERNAL_WARNING : RECOVERY_SESSION_CHAIN_WARNING; - return replayRemappedAnchorsOnCurrent(snapshot.text, currentText, edits, recoveryWarning); + return replayRemappedAnchorsOnCurrent(snapshot.text, currentText, edits, recoveryWarning, clipboard); } } diff --git a/packages/hashline/src/tokenizer.ts b/packages/hashline/src/tokenizer.ts index ad6a8e6ac..a0533a8e8 100644 --- a/packages/hashline/src/tokenizer.ts +++ b/packages/hashline/src/tokenizer.ts @@ -10,6 +10,10 @@ */ import { describeAnchorExamples, + HL_COPY_BLOCK_KEYWORD, + HL_COPY_KEYWORD, + HL_CUT_BLOCK_KEYWORD, + HL_CUT_KEYWORD, HL_DELETE_BLOCK_KEYWORD, HL_DELETE_KEYWORD, HL_FILE_HASH_LENGTH, @@ -24,6 +28,8 @@ import { HL_INSERT_KEYWORD, HL_INSERT_TAIL, HL_MOVE_KEYWORD, + HL_PASTE_AFTER_BLOCK_KEYWORD, + HL_PASTE_KEYWORD, HL_PAYLOAD_REPLACE, HL_REM_KEYWORD, HL_REPLACE_BLOCK_KEYWORD, @@ -220,6 +226,10 @@ export type BlockTarget = | { kind: "insert_before"; anchor: Anchor } | { kind: "insert_after"; anchor: Anchor } | { kind: "insert_after_block"; anchor: Anchor } + | { kind: "copy"; range: ParsedRange; cut: boolean } + | { kind: "copy_block"; anchor: Anchor; cut: boolean } + | { kind: "paste"; cursor: Cursor } + | { kind: "paste_after_block"; anchor: Anchor } | { kind: "rem" } | { kind: "move"; dest: string } | { kind: "bof" } @@ -270,30 +280,52 @@ function consumeReplaceColon(line: string, index: number, end: number): number { return skipWhitespace(line, afterEquals + 1, end); } -function scanInsertTarget(line: string, index: number, end: number): TargetScan | null { +interface PositionScan { + cursor: Cursor; + nextIndex: number; +} + +/** Scan the `.PRE N` / `.POST N` / `.HEAD` / `.TAIL` positional suffix shared by `INS` and `PASTE`. */ +function scanPositionalSuffix(line: string, index: number, end: number): PositionScan | null { if (index >= end || line.charCodeAt(index) !== CHAR_DOT) return null; - const cursor = skipWhitespace(line, index + 1, end); - const beforeEnd = scanKeyword(line, cursor, end, HL_INSERT_BEFORE); + const probe = skipWhitespace(line, index + 1, end); + const beforeEnd = scanKeyword(line, probe, end, HL_INSERT_BEFORE); if (beforeEnd !== null) { const anchor = scanLineNumber(line, skipWhitespace(line, beforeEnd, end), end); if (anchor === null) return null; const nextIndex = consumeOptionalColon(line, anchor.nextIndex, end); - return { target: { kind: "insert_before", anchor: { line: anchor.line } }, nextIndex }; + return { cursor: { kind: "before_anchor", anchor: { line: anchor.line } }, nextIndex }; } - const afterEnd = scanKeyword(line, cursor, end, HL_INSERT_AFTER); + const afterEnd = scanKeyword(line, probe, end, HL_INSERT_AFTER); if (afterEnd !== null) { const anchor = scanLineNumber(line, skipWhitespace(line, afterEnd, end), end); if (anchor === null) return null; const nextIndex = consumeOptionalColon(line, anchor.nextIndex, end); - return { target: { kind: "insert_after", anchor: { line: anchor.line } }, nextIndex }; + return { cursor: { kind: "after_anchor", anchor: { line: anchor.line } }, nextIndex }; } - const headEnd = scanKeyword(line, cursor, end, HL_INSERT_HEAD); - if (headEnd !== null) return { target: { kind: "bof" }, nextIndex: consumeOptionalColon(line, headEnd, end) }; - const tailEnd = scanKeyword(line, cursor, end, HL_INSERT_TAIL); - if (tailEnd !== null) return { target: { kind: "eof" }, nextIndex: consumeOptionalColon(line, tailEnd, end) }; + const headEnd = scanKeyword(line, probe, end, HL_INSERT_HEAD); + if (headEnd !== null) return { cursor: { kind: "bof" }, nextIndex: consumeOptionalColon(line, headEnd, end) }; + const tailEnd = scanKeyword(line, probe, end, HL_INSERT_TAIL); + if (tailEnd !== null) return { cursor: { kind: "eof" }, nextIndex: consumeOptionalColon(line, tailEnd, end) }; return null; } +function scanInsertTarget(line: string, index: number, end: number): TargetScan | null { + const scan = scanPositionalSuffix(line, index, end); + if (scan === null) return null; + const { cursor, nextIndex } = scan; + switch (cursor.kind) { + case "before_anchor": + return { target: { kind: "insert_before", anchor: cursor.anchor }, nextIndex }; + case "after_anchor": + return { target: { kind: "insert_after", anchor: cursor.anchor }, nextIndex }; + case "bof": + return { target: { kind: "bof" }, nextIndex }; + case "eof": + return { target: { kind: "eof" }, nextIndex }; + } +} + function unquotePath(pathText: string): string { if (pathText.length < 2) return pathText; const first = pathText[0]; @@ -394,6 +426,68 @@ function scanHunkAnchor(line: string, start: number, end: number): TargetScan | nextIndex: consumeOptionalColon(line, anchor.nextIndex, end), }; } + // `PASTE.BLK.POST N` — insert the clipboard after the tree-sitter block + // at N. Like all clipboard ops, takes no body rows. + const pasteAfterBlockEnd = scanKeyword(line, cursor, end, HL_PASTE_AFTER_BLOCK_KEYWORD); + if (pasteAfterBlockEnd !== null) { + const anchor = scanLineNumber(line, skipWhitespace(line, pasteAfterBlockEnd, end), end); + if (anchor === null) return null; + return { + target: { kind: "paste_after_block", anchor: { line: anchor.line } }, + nextIndex: consumeOptionalColon(line, anchor.nextIndex, end), + }; + } + // `PASTE.PRE|POST N` / `PASTE.HEAD|TAIL` — insert the clipboard at the position. + const pasteEnd = scanKeyword(line, cursor, end, HL_PASTE_KEYWORD); + if (pasteEnd !== null) { + const scan = scanPositionalSuffix(line, pasteEnd, end); + if (scan === null) return null; + return { target: { kind: "paste", cursor: scan.cursor }, nextIndex: scan.nextIndex }; + } + // `CUT.BLK N` / `COPY.BLK N` — capture the tree-sitter block at N into the + // clipboard (cut also deletes its span). Scanned before the plain forms so + // the `.BLK` suffix is not consumed as a malformed range. + const cutBlockEnd = scanKeyword(line, cursor, end, HL_CUT_BLOCK_KEYWORD); + if (cutBlockEnd !== null) { + const anchor = scanLineNumber(line, skipWhitespace(line, cutBlockEnd, end), end); + if (anchor === null) return null; + return { + target: { kind: "copy_block", anchor: { line: anchor.line }, cut: true }, + nextIndex: consumeOptionalColon(line, anchor.nextIndex, end), + }; + } + const copyBlockEnd = scanKeyword(line, cursor, end, HL_COPY_BLOCK_KEYWORD); + if (copyBlockEnd !== null) { + const anchor = scanLineNumber(line, skipWhitespace(line, copyBlockEnd, end), end); + if (anchor === null) return null; + return { + target: { kind: "copy_block", anchor: { line: anchor.line }, cut: false }, + nextIndex: consumeOptionalColon(line, anchor.nextIndex, end), + }; + } + // `CUT N.=M` / `COPY N.=M` — capture concrete lines (cut also deletes + // them). A trailing colon is tolerated and ignored; body rows are rejected + // by the parser. + const cutEnd = scanKeyword(line, cursor, end, HL_CUT_KEYWORD); + if (cutEnd !== null) { + const range = scanHeaderRange(line, cutEnd, end, true); + if (range === null) return null; + const next = skipStrayDot(line, range.nextIndex, end); + return { + target: { kind: "copy", range: range.range, cut: true }, + nextIndex: consumeOptionalColon(line, next, end), + }; + } + const copyEnd = scanKeyword(line, cursor, end, HL_COPY_KEYWORD); + if (copyEnd !== null) { + const range = scanHeaderRange(line, copyEnd, end, true); + if (range === null) return null; + const next = skipStrayDot(line, range.nextIndex, end); + return { + target: { kind: "copy", range: range.range, cut: false }, + nextIndex: consumeOptionalColon(line, next, end), + }; + } const insertEnd = scanKeyword(line, cursor, end, HL_INSERT_KEYWORD); if (insertEnd !== null) return scanInsertTarget(line, insertEnd, end); return null; @@ -491,7 +585,10 @@ function classifyLine(line: string, lineNum: number): Token { line.startsWith(HL_DELETE_KEYWORD, lead) || line.startsWith(HL_INSERT_KEYWORD, lead) || line.startsWith(HL_REM_KEYWORD, lead) || - line.startsWith(HL_MOVE_KEYWORD, lead); + line.startsWith(HL_MOVE_KEYWORD, lead) || + line.startsWith(HL_CUT_KEYWORD, lead) || + line.startsWith(HL_COPY_KEYWORD, lead) || + line.startsWith(HL_PASTE_KEYWORD, lead); if (isHunkLead) { const hunk = tryParseHunkHeader(line); if (hunk !== null) return { kind: "op-block", lineNum, target: hunk.target }; diff --git a/packages/hashline/src/types.ts b/packages/hashline/src/types.ts index 72d7e66fe..8f1f00a98 100644 --- a/packages/hashline/src/types.ts +++ b/packages/hashline/src/types.ts @@ -40,6 +40,37 @@ export type Edit = blockStart?: number; } | { kind: "delete"; anchor: Anchor; lineNum: number; index: number; oldAssertion?: string } + | { + /** + * Clipboard capture (`COPY N.=M` / `CUT N.=M`, or the resolved form of + * `COPY.BLK N` / `CUT.BLK N`). Captures the range's current lines into + * the {@link Clipboard} register during the applier's clipboard + * pre-pass. Emits no text change itself — a `CUT` additionally lowers + * to one `delete` per range line at parse/resolve time, exactly like + * `DEL N.=M`. + */ + kind: "copy"; + range: ParsedRange; + /** True for `CUT` (capture + delete), false for `COPY` (capture only). */ + cut: boolean; + lineNum: number; + index: number; + } + | { + /** + * Clipboard insertion (`PASTE.PRE N` / `PASTE.POST N` / `PASTE.HEAD` / + * `PASTE.TAIL`, or the resolved form of `PASTE.BLK.POST N`). Expanded + * by the clipboard pre-pass into one plain insert per captured line. + * `blockStart` mirrors the insert variant's field for block-lowered + * pastes so landing correction can slide the body across trailing + * closer lines. + */ + kind: "paste"; + cursor: Cursor; + lineNum: number; + index: number; + blockStart?: number; + } | { /** * Deferred block edit (`replace_block N:` / `delete_block N` / @@ -50,13 +81,15 @@ export type Edit = * the same `replacement` inserts + deletes that `replace start.=end:` * produces; an empty `payloads` (from `delete_block`) becomes a pure * range deletion; `mode: "insert_after"` becomes plain `after_anchor` - * inserts at the block's last line. `applyEdits` never sees this - * variant. + * inserts at the block's last line; `mode: "copy"`/`"cut"` becomes a + * `copy` edit over the resolved span (plus per-line deletes for cut); + * `mode: "paste_after"` becomes a `paste` edit anchored after the + * block's last line. `applyEdits` never sees this variant. */ kind: "block"; anchor: Anchor; payloads: string[]; - mode?: "insert_after"; + mode?: "insert_after" | "copy" | "cut" | "paste_after"; lineNum: number; index: number; }; @@ -149,7 +182,7 @@ export interface BlockResolution { /** Last line of the resolved span (1-indexed, inclusive). */ end: number; /** Which block op produced this resolution. */ - op: "replace" | "delete" | "insert_after"; + op: "replace" | "delete" | "insert_after" | "copy" | "cut" | "paste_after"; } /** Request handed to a {@link BlockResolver} to resolve one `replace_block N:` anchor. */ @@ -170,3 +203,22 @@ export interface BlockResolverRequest { * the contract; the host injects a tree-sitter-backed implementation. */ export type BlockResolver = (request: BlockResolverRequest) => BlockSpan | null; + +/** + * Mutable clipboard register threaded through one patch application. Filled + * by `CUT`/`COPY` edits, read by `PASTE` edits, in patch source order — + * across sections, so content can move between files. Create one per batch + * (`{}`) and hand it to every {@link Patcher.prepare} / `applyTo` call in + * that batch; callers that omit it get a private per-call register. + */ +export interface Clipboard { + /** Lines captured by the most recent `CUT`/`COPY`, or unset. */ + lines?: readonly string[]; + /** + * Human-readable form of the `CUT` that filled the register (e.g. + * `CUT 5.=10`), cleared by the first `PASTE`. A register that still has a + * pending cut at batch end (or when overwritten) is an authoring error: + * lines were deleted but never landed anywhere. + */ + pendingCut?: string; +} diff --git a/packages/hashline/test/clipboard.test.ts b/packages/hashline/test/clipboard.test.ts new file mode 100644 index 000000000..2fce15816 --- /dev/null +++ b/packages/hashline/test/clipboard.test.ts @@ -0,0 +1,325 @@ +import { describe, expect, it } from "bun:test"; +import { + applyEdits, + type BlockResolver, + type BlockSpan, + type Clipboard, + computeFileHash, + InMemoryFilesystem, + InMemorySnapshotStore, + Patch, + Patcher, + parsePatch, + parsePatchStreaming, + resolveBlockEdits, +} from "@oh-my-pi/hashline"; + +const PATH = "x.ts"; + +// Deterministic stub: the block beginning on line N spans [N, N+1]. +const stubResolver: BlockResolver = ({ line }): BlockSpan => ({ start: line, end: line + 1 }); + +function taggedPatcher(files: Array<[string, string]>): { + fs: InMemoryFilesystem; + snapshots: InMemorySnapshotStore; + patcher: Patcher; + tags: Map; +} { + const fs = new InMemoryFilesystem(files); + const snapshots = new InMemorySnapshotStore(); + const tags = new Map(); + for (const [path, text] of files) tags.set(path, snapshots.record(path, text)); + return { fs, snapshots, patcher: new Patcher({ fs, snapshots }), tags }; +} + +describe("clipboard parsing", () => { + it("lowers `CUT N.=M` to a capture plus per-line deletes, `COPY N.=M` to a capture only", () => { + const cut = parsePatch("CUT 2.=3").edits; + expect(cut.map(edit => edit.kind)).toEqual(["copy", "delete", "delete"]); + expect(cut[0]).toMatchObject({ kind: "copy", cut: true, range: { start: { line: 2 }, end: { line: 3 } } }); + + const copy = parsePatch("COPY 2.=3").edits; + expect(copy.map(edit => edit.kind)).toEqual(["copy"]); + expect(copy[0]).toMatchObject({ kind: "copy", cut: false }); + }); + + it("parses every PASTE position, tolerating a trailing colon", () => { + const cursors = parsePatch("COPY 1\nPASTE.PRE 2\nPASTE.POST 3:\nPASTE.HEAD\nPASTE.TAIL:").edits.flatMap(edit => + edit.kind === "paste" ? [edit.cursor] : [], + ); + expect(cursors).toEqual([ + { kind: "before_anchor", anchor: { line: 2 } }, + { kind: "after_anchor", anchor: { line: 3 } }, + { kind: "bof" }, + { kind: "eof" }, + ]); + }); + + it("rejects bare `PASTE` without a position", () => { + expect(() => parsePatch("COPY 1\nPASTE")).toThrow(/`PASTE` needs a position/); + }); + + it("rejects body rows under clipboard ops", () => { + expect(() => parsePatch("CUT 1.=2\n+x")).toThrow(/`CUT N.=M` captures \+ deletes/); + expect(() => parsePatch("COPY 1.=2\n+x")).toThrow(/`COPY N.=M` captures lines/); + expect(() => parsePatch("COPY 1\nPASTE.POST 1\n+x")).toThrow(/`PASTE` inserts the clipboard content/); + }); + + it("rejects a CUT range overlapping another hunk's range", () => { + expect(() => parsePatch("CUT 2.=4\nSWAP 3.=3:\n+x")).toThrow(/already targeted by another hunk/); + }); + + it("reports inverted CUT/COPY ranges with op-specific retry forms", () => { + expect(() => parsePatch("CUT 5.=2")).toThrow(/`CUT 5`.*`CUT 5.=6`/); + }); + + it("flushes a trailing bodyless clipboard op in streaming mode", () => { + const { edits } = parsePatchStreaming("COPY 1\nPASTE.TAIL"); + expect(edits.map(edit => edit.kind)).toEqual(["copy", "paste"]); + }); +}); + +describe("clipboard apply semantics", () => { + it("moves a range within a file (CUT + PASTE)", () => { + const section = Patch.parseSingle(`[${PATH}#1A2B]\nCUT 2.=3\nPASTE.POST 5`); + expect(section.applyTo("l1\nl2\nl3\nl4\nl5\n").text).toBe("l1\nl4\nl5\nl2\nl3\n"); + }); + + it("duplicates COPY content to several places; PASTE does not consume", () => { + const section = Patch.parseSingle(`[${PATH}#1A2B]\nCOPY 2.=2\nPASTE.HEAD\nPASTE.TAIL`); + expect(section.applyTo("l1\nl2\nl3\n").text).toBe("l2\nl1\nl2\nl3\nl2\n"); + }); + + it("swaps two regions with sequential CUT/PASTE pairs on original coordinates", () => { + const section = Patch.parseSingle(`[${PATH}#1A2B]\nCUT 1.=2\nPASTE.POST 4\nCUT 3.=4\nPASTE.PRE 1`); + expect(section.applyTo("a1\na2\nb1\nb2").text).toBe("b1\nb2\na1\na2"); + }); + + it("rejects PASTE with an empty register", () => { + const section = Patch.parseSingle(`[${PATH}#1A2B]\nPASTE.POST 1`); + expect(() => section.applyTo("l1\nl2\n")).toThrow(/found nothing in the clipboard/); + }); + + it("drops an empty-register PASTE on the streaming-tolerant path", () => { + const section = Patch.parseSingle(`[${PATH}#1A2B]\nPASTE.POST 1`); + expect(section.applyPartialTo("l1\nl2\n").text).toBe("l1\nl2\n"); + }); + + it("rejects a CUT that is never pasted when the call owns the register", () => { + const section = Patch.parseSingle(`[${PATH}#1A2B]\nCUT 2.=2`); + expect(() => section.applyTo("l1\nl2\nl3\n")).toThrow(/never pasted/); + }); + + it("rejects capturing over un-pasted CUT content", () => { + const section = Patch.parseSingle(`[${PATH}#1A2B]\nCUT 1.=1\nCUT 3.=3\nPASTE.TAIL`); + expect(() => section.applyTo("l1\nl2\nl3\n")).toThrow(/still holds `CUT 1` content/); + }); + + it("rejects an out-of-range capture", () => { + const section = Patch.parseSingle(`[${PATH}#1A2B]\nCOPY 8.=9\nPASTE.HEAD`); + expect(() => section.applyTo("l1\nl2\n")).toThrow(/out of range \(file has 3 lines\)/); + }); + + it("threads a caller-owned register across applyEdits calls", () => { + const clipboard: Clipboard = {}; + const cut = parsePatch("CUT 1.=1").edits; + const paste = parsePatch("PASTE.TAIL").edits; + expect(applyEdits("a\nb", cut, { clipboard }).text).toBe("b"); + expect(applyEdits("x\ny", paste, { clipboard }).text).toBe("x\ny\na"); + }); +}); + +describe("clipboard block ops", () => { + it("expands CUT.BLK to a span capture plus per-line deletes", () => { + const edits = parsePatch("CUT.BLK 2\nPASTE.TAIL").edits; + const resolved = resolveBlockEdits(edits, "l1\nl2\nl3\nl4", PATH, stubResolver); + expect(resolved.map(edit => edit.kind)).toEqual(["copy", "delete", "delete", "paste"]); + expect(resolved[0]).toMatchObject({ kind: "copy", cut: true, range: { start: { line: 2 }, end: { line: 3 } } }); + }); + + it("moves a block after another block via PASTE.BLK.POST", () => { + const section = Patch.parseSingle(`[${PATH}#1A2B]\nCUT.BLK 1\nPASTE.BLK.POST 3`); + // stub blocks: [1,2] and [3,4]. + expect(section.applyTo("a1\na2\nb1\nb2\nrest", stubResolver).text).toBe("b1\nb2\na1\na2\nrest"); + }); + + it("echoes clipboard block resolutions with their op", () => { + const seen: string[] = []; + resolveBlockEdits(parsePatch("COPY.BLK 2\nPASTE.TAIL").edits, "l1\nl2\nl3", PATH, stubResolver, { + onResolved: resolution => seen.push(resolution.op), + }); + expect(seen).toEqual(["copy"]); + }); + + it("rejects a single-line CUT.BLK resolution with the plain-op retry", () => { + const single: BlockResolver = ({ line }): BlockSpan => ({ start: line, end: line }); + const edits = parsePatch("CUT.BLK 2\nPASTE.TAIL").edits; + expect(() => resolveBlockEdits(edits, "a\nb\nc", PATH, single)).toThrow(/use `CUT 2`/); + }); + + it("lowers an unresolvable PASTE.BLK.POST to a plain paste with a warning", () => { + const warnings: string[] = []; + const resolved = resolveBlockEdits(parsePatch("COPY 1\nPASTE.BLK.POST 2").edits, "a\nb\nc", PATH, () => null, { + onWarning: warning => warnings.push(warning), + }); + expect(resolved.map(edit => edit.kind)).toEqual(["copy", "paste"]); + expect(warnings.some(warning => warning.includes("`PASTE.BLK.POST 2`"))).toBe(true); + }); +}); + +describe("clipboard across sections and batches", () => { + it("moves lines between files within one patch", async () => { + const a = "keep\nmove1\nmove2\n"; + const b = "b1\n"; + const { fs, patcher, tags } = taggedPatcher([ + ["a.ts", a], + ["b.ts", b], + ]); + + const patch = Patch.parse(`[a.ts#${tags.get("a.ts")}]\nCUT 2.=3\n[b.ts#${tags.get("b.ts")}]\nPASTE.TAIL`); + await patcher.apply(patch); + + expect(fs.get("a.ts")).toBe("keep\n"); + expect(fs.get("b.ts")).toBe("b1\nmove1\nmove2\n"); + }); + + it("allows a copy-only section to be a no-op clipboard source", async () => { + const a = "shared\n"; + const b = "b1\n"; + const { fs, patcher, tags } = taggedPatcher([ + ["a.ts", a], + ["b.ts", b], + ]); + + const result = await patcher.apply( + Patch.parse(`[a.ts#${tags.get("a.ts")}]\nCOPY 1.=1\n[b.ts#${tags.get("b.ts")}]\nPASTE.HEAD`), + ); + + expect(result.sections[0]?.op).toBe("noop"); + expect(fs.get("a.ts")).toBe(a); + expect(fs.get("b.ts")).toBe("shared\nb1\n"); + }); + + it("still rejects a no-op section that mixes COPY with mutating edits", async () => { + const a = "l1\nl2\n"; + const b = "b1\n"; + const { patcher, tags } = taggedPatcher([ + ["a.ts", a], + ["b.ts", b], + ]); + + // The SWAP restates the existing line, so the section changes nothing; + // the COPY beside it must not shield it from the no-change guard. + const patch = Patch.parse( + `[a.ts#${tags.get("a.ts")}]\nCOPY 1.=1\nSWAP 2.=2:\n+l2\n[b.ts#${tags.get("b.ts")}]\nPASTE.TAIL`, + ); + await expect(patcher.apply(patch)).rejects.toThrow(/no changes/); + }); + + it("rejects the whole batch when a batch-local CUT is never pasted", async () => { + const a = "l1\nl2\n"; + const { fs, patcher, tags } = taggedPatcher([["a.ts", a]]); + + await expect(patcher.apply(Patch.parse(`[a.ts#${tags.get("a.ts")}]\nCUT 1.=1`))).rejects.toThrow(/never pasted/); + expect(fs.get("a.ts")).toBe(a); + }); + + it("persists a host-owned register across apply calls with a carry-forward warning", async () => { + const a = "l1\nl2\n"; + const b = "b1\n"; + const fs = new InMemoryFilesystem([ + ["a.ts", a], + ["b.ts", b], + ]); + const snapshots = new InMemorySnapshotStore(); + const tagA = snapshots.record("a.ts", a); + const tagB = snapshots.record("b.ts", b); + const clipboard: Clipboard = {}; + const patcher = new Patcher({ fs, snapshots, clipboard }); + + const first = await patcher.apply(Patch.parse(`[a.ts#${tagA}]\nCUT 1.=1`)); + expect(fs.get("a.ts")).toBe("l2\n"); + expect(first.sections[0]?.warnings.some(warning => warning.includes("in the clipboard"))).toBe(true); + expect(clipboard).toMatchObject({ lines: ["l1"], pendingCut: "CUT 1" }); + + await patcher.apply(Patch.parse(`[b.ts#${tagB}]\nPASTE.TAIL`)); + expect(fs.get("b.ts")).toBe("b1\nl1\n"); + expect(clipboard.pendingCut).toBeUndefined(); + }); + + it("does not publish register changes from a failed batch", async () => { + const a = "l1\nl2\n"; + const b = "b1\n"; + const fs = new InMemoryFilesystem([ + ["a.ts", a], + ["b.ts", b], + ]); + const snapshots = new InMemorySnapshotStore(); + const tagA = snapshots.record("a.ts", a); + snapshots.record("b.ts", b); + const clipboard: Clipboard = {}; + const patcher = new Patcher({ fs, snapshots, clipboard }); + + // Second section carries a bogus tag, so the batch fails in prepare. + const patch = Patch.parse(`[a.ts#${tagA}]\nCUT 1.=1\n[b.ts#0000]\nSWAP 1.=1:\n+x`); + await expect(patcher.apply(patch)).rejects.toThrow(); + + expect(fs.get("a.ts")).toBe(a); + expect(clipboard.lines).toBeUndefined(); + expect(clipboard.pendingCut).toBeUndefined(); + }); + + it("recovers clipboard anchors when the file drifted by a uniform offset", async () => { + const original = "x1\nx2\nx3\n"; + const live = "new\nx1\nx2\nx3\n"; + const fs = new InMemoryFilesystem([["a.ts", live]]); + const snapshots = new InMemorySnapshotStore(); + const tag = snapshots.record("a.ts", original); + const patcher = new Patcher({ fs, snapshots }); + + const result = await patcher.apply(Patch.parse(`[a.ts#${tag}]\nCUT 2.=2\nPASTE.TAIL`)); + + expect(fs.get("a.ts")).toBe("new\nx1\nx3\nx2\n"); + expect(result.sections[0]?.warnings.length).toBeGreaterThan(0); + }); + + it("rejects clipboard ops in same-path sections interleaved across another file", () => { + const patch = Patch.parse(`[a.ts#1A2B]\nCUT 1.=1\n[b.ts#3C4D]\nSWAP 1.=1:\n+x\n[a.ts#1A2B]\nPASTE.TAIL`); + expect(() => patch.sections[0]?.edits).toThrow(/interleaved with another file/); + }); + + it("still merges interleaved same-path sections without clipboard ops", () => { + const patch = Patch.parse(`[a.ts#1A2B]\nDEL 1\n[b.ts#3C4D]\nDEL 1\n[a.ts#1A2B]\nDEL 3`); + expect(patch.sections).toHaveLength(2); + expect(patch.sections[0]?.edits.map(edit => edit.kind)).toEqual(["delete", "delete"]); + }); + + it("surfaces a targeted sequencing error instead of a mismatch on the drift path", async () => { + const original = "x1\nx2\nx3\n"; + const live = "new\nx1\nx2\nx3\n"; + const fs = new InMemoryFilesystem([["a.ts", live]]); + const snapshots = new InMemorySnapshotStore(); + const tag = snapshots.record("a.ts", original); + const patcher = new Patcher({ fs, snapshots }); + + // PASTE with nothing captured, against a drifted tag: the recovery path + // swallows apply errors, so the sequencing check must fire first. + await expect(patcher.apply(Patch.parse(`[a.ts#${tag}]\nPASTE.POST 2\nCUT 2.=2`))).rejects.toThrow( + /found nothing in the clipboard/, + ); + }); +}); + +describe("clipboard header hash interplay", () => { + it("applies a paste-only section on the clean-tag fast path", async () => { + const text = "l1\nl2\n"; + const fs = new InMemoryFilesystem([["a.ts", text]]); + const snapshots = new InMemorySnapshotStore(); + expect(computeFileHash(text)).toBe(snapshots.record("a.ts", text)); + const clipboard: Clipboard = { lines: ["from-before"] }; + const patcher = new Patcher({ fs, snapshots, clipboard }); + + await patcher.apply(Patch.parse(`[a.ts#${computeFileHash(text)}]\nPASTE.POST 1`)); + expect(fs.get("a.ts")).toBe("l1\nfrom-before\nl2\n"); + }); +}); From aaa1ff4e3fe84979b9ebc7182c4735a26347de14 Mon Sep 17 00:00:00 2001 From: can1357 Date: Thu, 30 Jul 2026 06:25:07 +0200 Subject: [PATCH 09/19] refactor(hashline): restructured Lark grammar rules to reduce complexity - Regrouped `grammar.lark` around shared `target` and `pos` rules, reducing hunk rules from twelve to seven. - Maintained byte-identical language acceptance while simplifying internal grammar structure. --- packages/hashline/CHANGELOG.md | 4 ++++ packages/hashline/src/grammar.lark | 34 ++++++++++++------------------ 2 files changed, 17 insertions(+), 21 deletions(-) diff --git a/packages/hashline/CHANGELOG.md b/packages/hashline/CHANGELOG.md index 1d4d750cf..672a976e3 100644 --- a/packages/hashline/CHANGELOG.md +++ b/packages/hashline/CHANGELOG.md @@ -8,6 +8,10 @@ - Added `PatcherOptions.clipboard` for a host-owned register that persists across `Patcher.apply` batches. Batches work on a fork (`forkClipboard`) published per landed section (`commitClipboard`), so failed batches never poison the register and a mid-batch write failure still preserves content already cut from disk; un-pasted `CUT` content becomes a carry-forward warning instead of an error. - Added clipboard safety guards: a `PASTE` with an empty register, a capture overwriting un-pasted `CUT` content, a batch-local `CUT` that is never pasted, and clipboard ops in same-path sections interleaved across another file's section are all rejected with targeted diagnostics. `CUT`/`COPY` ranges participate in overlap validation, the seen-lines guard, and drift recovery (every captured line must remap). +### Changed + +- Regrouped `grammar.lark` around shared shapes — one `target` rule (`N.=M` | `.BLK N`) for `DEL`/`CUT`/`COPY` and one `pos` rule (`PRE`/`POST`/`BLK.POST`/`HEAD`/`TAIL`) for `INS`/`PASTE` — collapsing twelve per-op hunk rules into seven. The accepted language is byte-identical. + ### Fixed - Prevented CPU and memory exhaustion in streaming previews by rejecting line anchors above Number.MAX_SAFE_INTEGER and ranges spanning more than 100,000 lines. diff --git a/packages/hashline/src/grammar.lark b/packages/hashline/src/grammar.lark index a93bdf727..3c126fa38 100644 --- a/packages/hashline/src/grammar.lark +++ b/packages/hashline/src/grammar.lark @@ -7,27 +7,19 @@ file_header: "[" filename "#" file_hash "]" LF file_hash: /[0-9A-F]{4}/ filename: /[^#\r\n]+/ -hunk: replace_hunk | replace_block_hunk | insert_hunk | insert_block_hunk | delete_hunk | delete_block_hunk | copy_hunk | copy_block_hunk | paste_hunk | paste_block_hunk | remove_hunk | move_hunk -replace_hunk: replace_anchor LF emit_op* -replace_block_hunk: replace_block_anchor LF emit_op+ -insert_hunk: insert_anchor LF emit_op+ -insert_block_hunk: insert_block_anchor LF emit_op+ -delete_hunk: "DEL " header_range LF -delete_block_hunk: "DEL.BLK " LID LF -copy_hunk: copy_verb " " header_range LF -copy_block_hunk: copy_verb ".BLK " LID LF -copy_verb: "CUT" | "COPY" -paste_hunk: "PASTE." paste_pos LF -paste_block_hunk: "PASTE.BLK.POST " LID LF -paste_pos: "PRE " LID | "POST " LID | "HEAD" | "TAIL" -remove_hunk: "REM" LF -move_hunk: "MV " filename LF emit_op* -replace_anchor: "SWAP " header_range ":" -replace_block_anchor: "SWAP.BLK " LID ":" -insert_anchor: "INS." insert_pos ":" -insert_block_anchor: "INS.BLK.POST " LID ":" -insert_pos: "PRE " LID | "POST " LID | "HEAD" | "TAIL" -emit_op: "+" /(.*)/ LF +hunk: swap_hunk | ins_hunk | del_hunk | copy_hunk | paste_hunk | rem_hunk | mv_hunk +swap_hunk: "SWAP " header_range ":" LF body* + | "SWAP.BLK " LID ":" LF body+ +ins_hunk: "INS." pos ":" LF body+ +del_hunk: "DEL" target LF +copy_hunk: ("CUT" | "COPY") target LF +paste_hunk: "PASTE." pos LF +rem_hunk: "REM" LF +mv_hunk: "MV " filename LF body* + +target: " " header_range | ".BLK " LID +pos: "PRE " LID | "POST " LID | "BLK.POST " LID | "HEAD" | "TAIL" +body: "+" /(.*)/ LF header_range: LID ".=" LID LID: /[1-9]\d*/ From b9ae2a3f9b667c3aef77329c1f9c7de588d4b89b Mon Sep 17 00:00:00 2001 From: can1357 Date: Thu, 30 Jul 2026 06:56:48 +0200 Subject: [PATCH 10/19] docs(hashline): condensed and clarified instructions in prompt documentation - Condensed instructions and rule descriptions in `packages/hashline/src/prompt.md`. - Streamlined formatting examples and anti-patterns for clarity. - Clarified block operation boundaries and markdown heading section rules. --- packages/coding-agent/src/utils/git.ts | 6 ++ packages/hashline/src/prompt.md | 137 ++++++++----------------- 2 files changed, 48 insertions(+), 95 deletions(-) diff --git a/packages/coding-agent/src/utils/git.ts b/packages/coding-agent/src/utils/git.ts index 556423baa..35342a75e 100644 --- a/packages/coding-agent/src/utils/git.ts +++ b/packages/coding-agent/src/utils/git.ts @@ -1727,6 +1727,12 @@ export const revList = { async range(cwd: string, base: string, head: string, signal?: AbortSignal): Promise { return splitLines(await runText(cwd, ["rev-list", "--reverse", `${base}..${head}`], { readOnly: true, signal })); }, + /** Commits reachable from `ref` that touched `file`, newest first, capped at `limit`. */ + async touching(cwd: string, ref: string, file: string, limit: number, signal?: AbortSignal): Promise { + return splitLines( + await runText(cwd, ["rev-list", `--max-count=${limit}`, ref, "--", file], { readOnly: true, signal }), + ); + }, }; // ════════════════════════════════════════════════════════════════════════════ diff --git a/packages/hashline/src/prompt.md b/packages/hashline/src/prompt.md index 883716757..2eee092af 100644 --- a/packages/hashline/src/prompt.md +++ b/packages/hashline/src/prompt.md @@ -1,54 +1,45 @@ -Your patch language names lines to replace, delete, or insert at, then lists the new content. Rule of thumb: a header ending in `:` is followed by `+` body rows; `DEL`, `CUT`/`COPY`, and `PASTE` have no body. +Line-anchored patch language: name original lines to replace, delete, or insert at, then list new content. A header ending in `:` takes `+` body rows; `DEL`, `CUT`/`COPY`, `PASTE`, `REM`, `MV` take none. -Every file section starts with `[PATH#TAG]`. `TAG` = 4-hex snapshot tag from your latest `read`/`search`, REQUIRED on every section — no hashless form. Create new files with `write`; hashline only edits existing files. +Every file section starts `[PATH#TAG]`. `TAG` = 4-hex snapshot tag from your latest `read`/`search` — REQUIRED on every section. Create new files with `write`; hashline only edits existing files. -`SWAP N.=M:` — replace original lines N.=M with the body rows below. INCLUSIVE — line M is consumed too. -`SWAP.BLK N:` — replace the whole syntactic block that BEGINS on line N; tree-sitter resolves the closing line. Body rows below. -`DEL N.=M` — delete original lines N.=M. No body. -`DEL.BLK N` — delete the whole syntactic block that BEGINS on line N. -`INS.PRE N:` — insert the body rows immediately before line N. -`INS.POST N:` — insert the body rows immediately after line N. -`INS.BLK.POST N:` — insert the body rows after the END of the block that BEGINS on line N — outside it, at sibling depth. To append inside a block, use `INS.POST`. -`INS.HEAD:` / `INS.TAIL:` — insert the body rows at the very start / end of the file. -`CUT N.=M` / `COPY N.=M` — capture original lines N.=M into the clipboard (CUT also deletes them, like `DEL`). No body. -`CUT.BLK N` / `COPY.BLK N` — capture the whole syntactic block that BEGINS on line N. -`PASTE.PRE N` / `PASTE.POST N` / `PASTE.HEAD` / `PASTE.TAIL` / `PASTE.BLK.POST N` — insert the clipboard at the position. No body — the clipboard IS the body. -`REM` — delete the whole file named by the section header. No body, no line ops. -`MV DEST` — move/rename the section file to `DEST` (a path, quoted when it contains spaces). Line edits above `MV` land on the source first, then the final content is written at `DEST`. -Single line: `SWAP N.=N:` / `DEL N`. The range is the ORIGINAL lines you touch; body length is irrelevant (replacing 1 line with 10 is still `SWAP N.=N:`). +`SWAP N.=M:` — replace original lines N.=M (INCLUSIVE). +`SWAP.BLK N:` — replace the whole syntactic block BEGINNING on line N; its closing line is resolved for you. +`DEL N.=M` / `DEL.BLK N` — delete lines N.=M / the block beginning at N. +`INS.PRE N:` / `INS.POST N:` — insert immediately before / after line N. +`INS.BLK.POST N:` — insert after the END of the block beginning at N, outside it at sibling depth. Append inside a block → `INS.POST`. +`INS.HEAD:` / `INS.TAIL:` — insert at the very start / end of the file. +`CUT N.=M` / `COPY N.=M` — capture lines N.=M into the clipboard (`CUT` also deletes); `.BLK N` forms capture the block. +`PASTE.PRE N` / `PASTE.POST N` / `PASTE.HEAD` / `PASTE.TAIL` / `PASTE.BLK.POST N` — insert the clipboard at the position (the clipboard IS the body). +`REM` — delete the whole section file. `MV DEST` — move/rename to `DEST` (quote paths with spaces); edits above `MV` land on the source first, final content written at `DEST`. +Single line: `SWAP N.=N:` / `DEL N`. Range = ORIGINAL lines touched; body length irrelevant (1 line → 10 is still `SWAP N.=N:`). -Body rows appear only under a `:` header. Every body row is `+TEXT` — add a literal line `TEXT`, verbatim (leading whitespace kept); `+` alone adds a blank line. No other row kind. NEVER write `-old` or a bare/context line. To keep a line, leave it out of every range. Literal lines starting with `-`/`+` still need the body prefix: Markdown `- item` → `+- item`, `+ item` → `++ item`. +Only under a `:` header. Every row is `+TEXT`, verbatim (leading whitespace kept); `+` alone = blank line. NEVER `-old` or bare/context rows — the range deletes; the body is only the final content. Keep a line: leave it out of every range. Literal leading `-`/`+` keeps the prefix: `- item` → `+- item`, `+ item` → `++ item`. -- Line numbers + `[PATH#TAG]` header come from your latest `read`/`search` (`LINE:TEXT` rows). -- Numbers refer to the ORIGINAL file; never shift as hunks apply. -- They die with the call: every applied edit mints a fresh `#TAG` and renumbers — anchor the next edit on the edit response or a fresh `read`. -- Touch only lines your latest `read`/`search` literally displayed as `LINE:TEXT`; the tag certifies the snapshot, not your memory. A hunk anchored on a line you never displayed is REJECTED — re-`read` first. Seeing a line ≠ it holds the code you mean; confirm numbers map to the construct you intend, especially far from your read window. -- Elided regions are UNSEEN: `…`/`..` markers and a collapsed `N-M:` summary row (only boundary lines N and M shown) hide their interior. NEVER place or span a hunk inside one — `read` the range first. -- Never start or end a range mid-expression or mid-block. -- Indent body rows exactly for the depth they should live at. -- On a stale-tag rejection or any surprising result: STOP and re-`read` before further edits. -- One hunk per range; body = final content, never an old/new pair. -- Ranges cover ONLY lines whose content changes. Never widen over unchanged lines — a stale wide range shreds everything it spans. -- Whole construct → `SWAP.BLK N` (tree-sitter resolves the end); lines inside it → `SWAP N.=M`. -- `SWAP.BLK N` resolves EXACTLY the node at N. Leading decorators/attributes/doc-comments are separate nodes: point N at the FIRST decorator to sweep both; standalone line-comments are never swept — use `SWAP N.=M`. -- Block ops (`SWAP.BLK`/`DEL.BLK`/`INS.BLK.POST`) anchor the OPENING line of a MULTI-LINE construct — never its closer, last line, or a bare inner statement. Anchoring one statement resolves to ONE line and is REJECTED: use the plain op (`SWAP N.=N` / `DEL N` / `INS.POST N`), or point N at the real opener. Saw the closer? Use plain `INS.POST M:`. -- Markdown: a heading line IS a block opener — `SWAP.BLK`/`DEL.BLK`/`INS.BLK.POST` on a `##`/`###` heading resolves its WHOLE section (heading through every nested deeper heading, up to the next same-or-higher heading). So `DEL.BLK` drops the section, `SWAP.BLK` rewrites it, `INS.BLK.POST` lands after it (end the inserted body with a blank line to keep the next heading separated). -- Non-adjacent changes = separate hunks; untouched lines stay out of every range. -- Pure additions use `INS.PRE` / `INS.POST` / `INS.HEAD` / `INS.TAIL`, never a widened `SWAP` — retyped keepers are exactly what gets dropped. (A multi-line `SWAP` whose body restates the line just past the range is auto-dropped as an off-by-one keeper with a warning — issue the payload for the range only; never lean on the repair.) -- Move code with `CUT`+`PASTE`, never by retyping it in a body. The clipboard runs top-to-bottom through the whole patch — across `[file]` sections, so content moves between files — and persists across edit calls. The last `CUT`/`COPY` wins; `PASTE` may repeat (it does not consume). Content pastes verbatim, indentation included — re-indenting a move needs `SWAP`. -- `CUT` content must land: un-pasted `CUT` content is rejected or carried to the next call with a warning, and a new `CUT`/`COPY` before pasting it is an error. -- NEVER format/restyle code with this tool; run the project formatter instead. +- Line numbers + `#TAG` come from your latest `read`/`search` (`LINE:TEXT` rows); numbers name ORIGINAL lines, never shifted by applied hunks. +- Applied edits renumber the file and change the `#TAG` — take the next edit's numbers from the edit response or a fresh `read`. +- Touch only displayed lines — hunks on undisplayed lines are REJECTED. Far from your read window? Re-`read`; confirm numbers map to the intended construct. +- Elided regions are UNSEEN (`…`/`..` markers, collapsed `N-M:` summary rows) — NEVER place or span a hunk inside one; `read` the range first. +- NEVER start or end a range mid-expression or mid-block. +- Ranges cover ONLY changed lines — never widen over keepers. Non-adjacent changes = separate hunks. +- Whole construct → `SWAP.BLK N`; lines inside one → `SWAP N.=M`. +- `SWAP.BLK` resolves EXACTLY the node at N: leading decorators/attributes/doc-comments are separate nodes — point N at the FIRST decorator to sweep both; standalone line-comments are never swept (use `SWAP N.=M`). +- Block ops anchor the OPENING line of a MULTI-LINE construct — never the closer, last line, or a bare inner statement; one statement → plain op (`SWAP N.=N:` / `DEL N` / `INS.POST N:`). Saw the closer? `INS.POST M:`. +- Markdown: a heading IS a block opener — block ops on `##`/`###` resolve the WHOLE section (through deeper nested headings, up to the next same-or-higher heading). `INS.BLK.POST` after a section: end the body with a blank line to keep the next heading separated. +- Pure additions → `INS.PRE`/`INS.POST`/`INS.HEAD`/`INS.TAIL`, never a widened `SWAP`. +- Move code with `CUT`+`PASTE`, never retype. Clipboard: top-to-bottom across the whole patch (cross-file moves), persists across edit calls, last `CUT`/`COPY` wins, `PASTE` repeats freely, pastes verbatim with indentation — re-indent via `SWAP`. +- Paste `CUT` content before any new `CUT`/`COPY`. +- NEVER format/restyle code with this tool; run the project formatter. -Original (the exact shape `read` returns): +`read` output shape: ``` [greet.py#A1B2] 1:def greet(name): @@ -57,40 +48,7 @@ Original (the exact shape `read` returns): 4:greet("world") ``` -Insert a guard after line 1: -``` -[greet.py#A1B2] -INS.POST 1: -+ if not name: name = "stranger" -``` - -Replace line 2 with two lines: -``` -[greet.py#A1B2] -SWAP 2.=2: -+ greeting = "Hi" -+ msg = f"{greeting}, {name}" -``` - -Delete line 3: -``` -[greet.py#A1B2] -DEL 3 -``` - -Delete the whole file: -``` -[greet.py#A1B2] -REM -``` - -Rename or move the file: -``` -[greet.py#A1B2] -MV greet_v2.py -``` - -Move after editing: +Edit, then move: ``` [greet.py#A1B2] SWAP 1.=3: @@ -99,16 +57,7 @@ SWAP 1.=3: MV lib/greet.py ``` -Add a header and trailer: -``` -[greet.py#A1B2] -INS.HEAD: -+# generated header -INS.TAIL: -+greet("everyone") -``` - -Insert Markdown bullets — the leading `+` is the body-row marker; the file receives `- task`: +Markdown bullets — the file receives `- task`: ``` [PLAN.md#A1B2] INS.POST 2: @@ -116,7 +65,7 @@ INS.POST 2: + - nested task ``` -Move the `greet` function after line 4 without retyping it, then copy line 4 into a sibling file — the clipboard flows top-to-bottom across sections: +Move `greet` after line 4, copy line 4 to a sibling file — clipboard flows across sections: ``` [greet.py#A1B2] CUT.BLK 1 @@ -126,7 +75,7 @@ COPY 4.=4 PASTE.HEAD ``` -Replace the whole `greet` function block — `SWAP.BLK 1:` resolves lines 1–3 (the `def` header through `print(msg)`); line 4 is a separate statement and stays: +`SWAP.BLK 1:` resolves lines 1–3 (`def` header through `print(msg)`); line 4 is a separate statement and stays: ``` [greet.py#A1B2] SWAP.BLK 1: @@ -134,7 +83,7 @@ SWAP.BLK 1: + print(f"Hello, {name}") ``` -A decorator/doc-comment is a SEPARATE block — `SWAP.BLK` on the `def`/`fn` line keeps it. Point N at the decorator to take both; here line 1 is `@cache`, so anchoring on the `def` (line 2) would orphan `@cache`: +Decorator/doc-comment = SEPARATE block — point N at the decorator to take both; anchoring the `def` (line 2) would orphan `@cache`: ``` [svc.py#C3D4] SWAP.BLK 1: @@ -148,11 +97,11 @@ SWAP.BLK 1: # WRONG — empty `SWAP` to delete. RIGHT: DEL 4 SWAP 4.=4: -# WRONG — range describes post-edit size. RIGHT: SWAP 1.=1: (body length is irrelevant) +# WRONG — range sized to the post-edit content. RIGHT: SWAP 1.=1: (body length irrelevant) SWAP 1.=2: +def greet(name): -# WRONG — `-` rows / bare context lines do not exist. The range deletes; the body is only the new content. +# WRONG — `-` rows / bare context lines do not exist; the range deletes, the body is only new content. SWAP 3.=3: msg = "Hello, " + name - print(msg) @@ -161,31 +110,29 @@ SWAP 3.=3: SWAP 3.=3: + return msg -# WRONG — a pure insertion done as a widened `SWAP`: you want to add one line after 2, -# but you replace 2.=4, retype the keepers, and drop one (here line 4, `greet("world")`). +# WRONG — pure insertion as a widened `SWAP`: retyped keepers get dropped (here line 4). SWAP 2.=4: + msg = "Hello, " + name + extra = compute(name) + print(msg) -# RIGHT — touch nothing you keep; the new line is the whole body. +# RIGHT — touch nothing you keep. INS.POST 2: + extra = compute(name) -# WRONG — `INS.BLK.POST N:` anchored on a closing delimiter / last visible line. RIGHT: plain `INS.POST M:` +# WRONG — `INS.BLK.POST` anchored on the closing delimiter / last visible line. RIGHT: plain `INS.POST M:` INS.BLK.POST 3: +after() # RIGHT INS.POST 3: +after() -# WRONG — body rows under PASTE; the clipboard is the body. RIGHT: capture first, then a bodyless `PASTE.POST 20` (no colon, no rows). +# WRONG — body rows under PASTE; the clipboard is the body. RIGHT: capture first, then a bodyless `PASTE.POST 20`. PASTE.POST 20: +function f() {} -If you remember nothing else: -1. RE-GROUND AFTER EVERY EDIT. Every apply mints a fresh `#TAG` and renumbers — take the next edit's numbers from the edit response or a fresh `read`. Stale tag or surprise? STOP, re-`read`. -2. RANGES ARE TIGHT. Cover only lines that change; a stale wide range shreds everything it spans. Whole construct → `SWAP.BLK N`. -3. THE BODY IS THE FINAL CONTENT. Every body row starts with `+`; Markdown bullets use `+- item`, not `- item`. +1. RE-GROUND AFTER EVERY EDIT — applied edits renumber the file and change the `#TAG`; take next numbers from the edit response or a fresh `read`. Stale tag or surprise? STOP, re-`read`. +2. RANGES ARE TIGHT — cover only lines that change. Whole construct → `SWAP.BLK N`. +3. BODY = FINAL CONTENT — every body row starts with `+`; Markdown bullets use `+- item`, not `- item`. From e05f229f43098f9c4eb77018b36372d5620657ed Mon Sep 17 00:00:00 2001 From: can1357 Date: Thu, 30 Jul 2026 07:41:55 +0200 Subject: [PATCH 11/19] refactor: standardized editing syntax by removing copy and delete operations - Removed copy and delete operations across tokenizer, parser, grammar, and clipboard logic. - Standardized line-editing operations and block resolvers to use cut exclusively. - Updated documentation, prompts, and test suites to reflect the removal of copy and delete syntax. --- packages/coding-agent/CHANGELOG.md | 10 +- .../coding-agent/src/edit/edit-clipboard.ts | 2 +- .../coding-agent/src/edit/hashline/diff.ts | 32 ++---- .../coding-agent/src/edit/hashline/execute.ts | 49 +-------- packages/coding-agent/src/edit/renderer.ts | 8 +- packages/coding-agent/src/edit/streaming.ts | 2 +- .../src/prompts/system/plan-mode-active.md | 4 +- .../coding-agent/src/session/agent-session.ts | 2 +- packages/coding-agent/src/tools/index.ts | 2 +- .../test/core/block-replace.test.ts | 16 +-- packages/coding-agent/test/edit-diff.test.ts | 4 +- .../test/edit-streaming-preview.test.ts | 4 +- .../test/edit/seen-line-guard.test.ts | 4 +- packages/hashline/CHANGELOG.md | 8 +- packages/hashline/README.md | 4 +- packages/hashline/src/apply.ts | 9 +- packages/hashline/src/block.ts | 49 +++------ packages/hashline/src/clipboard.ts | 98 +++++------------ packages/hashline/src/format.ts | 14 +-- packages/hashline/src/grammar.lark | 5 +- packages/hashline/src/input.ts | 36 ++---- packages/hashline/src/messages.ts | 66 +++-------- packages/hashline/src/parser.ts | 66 ++++------- packages/hashline/src/patcher.ts | 45 +++----- packages/hashline/src/prompt.md | 18 ++- packages/hashline/src/recovery.ts | 16 ++- packages/hashline/src/tokenizer.ts | 67 ++--------- packages/hashline/src/types.ts | 84 ++++++-------- packages/hashline/test/block.test.ts | 36 +++--- .../hashline/test/boundary-repair.test.ts | 8 +- packages/hashline/test/clipboard.test.ts | 104 ++++++------------ packages/hashline/test/core-contracts.test.ts | 14 +-- packages/hashline/test/format-v2.test.ts | 27 +++-- packages/hashline/test/landing-shift.test.ts | 4 +- packages/hashline/test/leniency.test.ts | 22 ++-- packages/hashline/test/patcher.test.ts | 2 +- packages/metaharness/adapters/edit/runner.ts | 17 +-- 37 files changed, 313 insertions(+), 645 deletions(-) diff --git a/packages/coding-agent/CHANGELOG.md b/packages/coding-agent/CHANGELOG.md index ac641fbed..724ed5adb 100644 --- a/packages/coding-agent/CHANGELOG.md +++ b/packages/coding-agent/CHANGELOG.md @@ -5,7 +5,7 @@ ### Added - Added server-name autocomplete for `/mcp` commands (`enable`, `disable`, `test`, `remove`, `reconnect`, `reauth`, `unauth`) using configured and runtime-discovered MCP servers. -- Added `CUT`/`COPY`/`PASTE` ops to the hashline edit tool for moving code without retyping it: `CUT N.=M` / `COPY N.=M` (and `.BLK` block forms) capture lines into a clipboard register, `PASTE.PRE|POST N` / `PASTE.HEAD|TAIL` / `PASTE.BLK.POST N` insert them. The register flows across sections within a patch (cross-file moves) and persists across edit calls per session; streaming and permission diff previews render pasted content, and copy-only sections report "copied to clipboard" instead of tripping the no-change guard. +- Added `CUT` and `PASTE` ops to the hashline edit tool for moving code without retyping it: `CUT N.=M` (and `.BLK` block forms) capture lines into a clipboard register, and `PASTE` operations insert them. The register flows across sections within a patch (cross-file moves) and persists across edit calls per session. - Added `--from-claude` and `--from-codex` session imports (including compaction state for Codex), also available from `/resume @claude` and `/resume @codex`. - Added interactive Exa API-key onboarding through `/login exa`, opening the official key dashboard and saving pasted keys for authenticated web search while preserving `EXA_API_KEY` and explicit-selection public MCP fallback behavior ([#1798](https://github.com/can1357/oh-my-pi/issues/1798)). - Added `ExtensionContext.getAsyncJobSnapshot()` so extensions can read the owning session's async-job state without relying on process-global job-manager identity @@ -21,6 +21,10 @@ - Optimized models configuration resource probing to run in a single child process, reducing startup contention. - Startup release notes now default to a compact change-count summary. Use `startup.changelogMode` (`summary` | `expanded` | `hidden`) to control them; legacy `collapseChangelog` choices migrate automatically ([#6771](https://github.com/can1357/oh-my-pi/issues/6771)). +### Removed + +- Removed the dangling `MCPManager.setOnNotification` single-slot setter, which had no callers in the runtime. Replaced by `MCPManager.addNotificationListener` — multi-listener, per-listener error isolation, returns an unsubscribe function. + ### Fixed - Fixed Anthropic prompt-cache cold misses on session resume with multiple OAuth accounts: the account that served a session is now recorded in the session file (as a `credential_pin` sha-256 of the account + org/project scope, so exports carry no plaintext identity) and re-pinned on resume with the session's effective last-use time, so a fresh process no longer re-ranks accounts by usage headroom — which systematically routed away from the just-used account and cold-missed the entire account-scoped cache prefix. Sticky routing was previously stored only in the auth store's KV cache, which is in-memory when a remote auth broker is configured. @@ -84,10 +88,6 @@ - Fixed advisor tools bypassing the approval gate. They are built straight from the builtin table, outside the loop that wraps every registry tool, and both the advisor's own agent loop and its Cursor exec bridge (`pi_write`, `pi_bash`) run those instances directly — so an advisor granted `write` or `bash` executed them regardless of a configured `ask` or `deny`. They now carry the same `ExtensionToolWrapper` as every other tool. - Added `mcp_notification` extension event and multi-listener `MCPManager.addNotificationListener` API. The runtime already received MCP server-initiated JSON-RPC notifications at the transport layer but had no path to forward them to extensions; every notification (including server-custom methods) is now delivered as `{ server, method, params }` after the manager's own list/update handling. For known list-change methods (`notifications/tools/list_changed`, `notifications/resources/list_changed`, `notifications/prompts/list_changed`) the internal refresh promise is awaited before fanout, so a listener acting on `tools/list_changed` sees fresh `getTools()`. Notifications received before any listener attaches are buffered (bounded FIFO, cap 100, drop-oldest — matches `IrcBus`'s `MAILBOX_CAP`) and drained into the first subscriber, so startup-time frames aren't lost even if the extension binds after MCP discovery. Extensions can use this to bridge push-capable MCP servers (e.g. peer messaging) into session behavior by injecting a mid-turn steer via `pi.sendMessage` / `pi.sendUserMessage`. -### Removed - -- Removed the dangling `MCPManager.setOnNotification` single-slot setter, which had no callers in the runtime. Replaced by `MCPManager.addNotificationListener` — multi-listener, per-listener error isolation, returns an unsubscribe function. - ## [17.1.8] - 2026-07-28 ### Breaking Changes diff --git a/packages/coding-agent/src/edit/edit-clipboard.ts b/packages/coding-agent/src/edit/edit-clipboard.ts index a25fc145b..fcd969f8e 100644 --- a/packages/coding-agent/src/edit/edit-clipboard.ts +++ b/packages/coding-agent/src/edit/edit-clipboard.ts @@ -1,7 +1,7 @@ /** * Session-bound edit clipboard register. * - * `CUT`/`COPY`/`PASTE` hashline ops share one {@link Clipboard} per session so + * `CUT`/`PASTE` hashline ops share one {@link Clipboard} per session so * content captured by one edit call can be pasted by a later one (and across * files within one call). The executor works on a fork per batch and commits * it back only after every write lands — see `executeHashlineSingle`. diff --git a/packages/coding-agent/src/edit/hashline/diff.ts b/packages/coding-agent/src/edit/hashline/diff.ts index d3aa3eb97..6d52aafaa 100644 --- a/packages/coding-agent/src/edit/hashline/diff.ts +++ b/packages/coding-agent/src/edit/hashline/diff.ts @@ -53,10 +53,9 @@ export interface HashlineDiffOptions { skipHashValidation?: boolean; /** * Clipboard register shared across the sections of one patch preview. - * `CUT`/`COPY` in an earlier section feeds `PASTE` in a later one, so the - * preview a user approves shows the pasted content exactly like apply - * will. Callers previewing a multi-section patch MUST thread one register - * through the sections in patch order; omitted, each section gets a + * `CUT` in an earlier section feeds `PASTE` in a later one, so the preview + * matches apply. Multi-section previews MUST thread one register through + * sections in patch order; omitted, each section gets a * private register (same-file cut/paste still previews correctly). */ clipboard?: Clipboard; @@ -156,7 +155,7 @@ function hasAnchorScopedEdit(edits: readonly Edit[]): boolean { return edits.some(edit => { if (edit.kind === "delete") return true; if (edit.kind === "block") return true; - if (edit.kind === "copy") return true; + if (edit.kind === "cut") return true; return edit.cursor.kind === "before_anchor" || edit.cursor.kind === "after_anchor"; }); } @@ -293,17 +292,13 @@ function buildStreamingSectionDiff( resolved = resolveClipboardEdits(blockResolved, fileLines, scratch, { onEmptyPaste: "drop" }); if (scratch.lines === undefined) delete clipboard.lines; else clipboard.lines = scratch.lines; - if (scratch.pendingCut === undefined) delete clipboard.pendingCut; - else clipboard.pendingCut = scratch.pendingCut; } catch { - resolved = blockResolved.filter(edit => edit.kind !== "copy" && edit.kind !== "paste"); + resolved = blockResolved.filter(edit => edit.kind !== "cut" && edit.kind !== "paste"); } if (resolved.length === 0) { - // A whole-file op (REM / MV) carries no line edits: the change is the - // delete/move itself, conveyed by the result header, so emit an empty - // diff rather than a misleading "No changes" error. A copy-only section - // likewise changes nothing itself — it feeds a later `PASTE`. - if (fileOp || section.isClipboardSource) return { diff: "", firstChangedLine: undefined }; + // A whole-file op (REM / MV) carries no line edits; the result header + // conveys the change, so emit an empty diff. + if (fileOp) return { diff: "", firstChangedLine: undefined }; return { error: `No changes would be made to ${section.path}.` }; } @@ -344,10 +339,7 @@ function buildStreamingSectionDiff( } } - if (rows.length === 0) { - if (section.isClipboardSource) return { diff: "", firstChangedLine: undefined }; - return { error: `No changes would be made to ${section.path}.` }; - } + if (rows.length === 0) return { error: `No changes would be made to ${section.path}.` }; return { diff: rows.join("\n"), firstChangedLine }; } @@ -374,10 +366,8 @@ export async function computeHashlineSectionDiff( if (options.streaming) return buildStreamingSectionDiff(section, normalized, options.clipboard ?? {}); const result = applyPreviewEdits({ section, absolutePath, normalized, snapshots, options }); if (normalized === result.text) { - // REM/MV-only sections change no text; the header conveys the - // delete/move, so don't surface a "No changes" error. A copy-only - // section likewise changes nothing itself — it feeds a later `PASTE`. - if (section.fileOp || section.isClipboardSource) return { diff: "", firstChangedLine: undefined }; + // REM/MV-only sections change no text; the header conveys the op. + if (section.fileOp) return { diff: "", firstChangedLine: undefined }; return { error: `No changes would be made to ${section.path}.` }; } return generateDiffString(normalized, result.text, undefined, { path: section.path }); diff --git a/packages/coding-agent/src/edit/hashline/execute.ts b/packages/coding-agent/src/edit/hashline/execute.ts index 9e2e3ccca..a000c8737 100644 --- a/packages/coding-agent/src/edit/hashline/execute.ts +++ b/packages/coding-agent/src/edit/hashline/execute.ts @@ -21,7 +21,6 @@ import { Patcher, type PatchSectionResult, type PreparedSection, - pendingCutWarning, } from "@oh-my-pi/hashline"; import type { AgentToolResult } from "@oh-my-pi/pi-agent-core"; import type { FileDiagnosticsResult, WritethroughCallback, WritethroughDeferredHandle } from "../../lsp"; @@ -105,9 +104,7 @@ interface RenderedSection { const BLOCK_OP_LABELS: Record = { replace: "SWAP.BLK", - delete: "DEL.BLK", insert_after: "INS.BLK.POST", - copy: "COPY.BLK", cut: "CUT.BLK", paste_after: "PASTE.BLK.POST", }; @@ -213,24 +210,6 @@ function renderSection( }; } -/** - * Render a copy-only (`COPY`/`COPY.BLK`) section: it filled the clipboard for - * a later `PASTE` and intentionally left its own file unchanged, so the - * standard "no changes" diagnostics do not apply. The fresh header still - * re-mints the snapshot tag for follow-up edits. - */ -function clipboardSourceResult(result: PatchSectionResult): RenderedSection { - const warningsBlock = result.warnings.length > 0 ? `\n\nWarnings:\n${result.warnings.join("\n")}` : ""; - return { - toolResult: { - content: [ - { type: "text", text: `${result.header}\nCopied lines to the clipboard; file unchanged.${warningsBlock}` }, - ], - details: { diff: "", op: "update", meta: outputMeta().get() }, - }, - perFileResult: { path: result.path, diff: "", op: "update" }, - }; -} export async function executeHashlineSingle( options: ExecuteHashlineSingleOptions, @@ -253,8 +232,7 @@ export async function executeHashlineSingle( // The clipboard register is session-persistent: `CUT` in one edit call can // `PASTE` in a later one. Each batch works on a fork and publishes it back - // only after every write lands, so a failed batch never poisons the - // register (a retried `CUT` would otherwise trip the overwrite guard). + // only after writes land. const sessionClipboard = getEditClipboard(options.session); const clipboard = forkClipboard(sessionClipboard); @@ -265,11 +243,7 @@ export async function executeHashlineSingle( const prepared = await patcher.prepare(patch.sections[0], clipboard); const sectionResult = await patcher.commit(prepared); commitClipboard(clipboard, sessionClipboard); - if (clipboard.pendingCut !== undefined) sectionResult.warnings.push(pendingCutWarning(clipboard.pendingCut)); if (sectionResult.op === "noop") { - if (prepared.section.isClipboardSource) { - return clipboardSourceResult(sectionResult).toolResult; - } const { count, escalate } = recordNoopEdit(options.session, sectionResult.canonicalPath, inputHash); if (escalate) { throw new ToolError(noChangeLoopDiagnostic(sectionResult.path, count)); @@ -282,7 +256,7 @@ export async function executeHashlineSingle( // Multi-section: prepare every section up front so we fail fast before // any write hits the filesystem. One clipboard register spans the batch, - // so `CUT`/`COPY` in one section feeds `PASTE` in a later one. + // so `CUT` in one section feeds `PASTE` in a later one. const prepared: PreparedSection[] = []; // Register state after each section's prepare. Commits are non-atomic: a // mid-batch write failure leaves earlier sections on disk, so the session @@ -295,9 +269,7 @@ export async function executeHashlineSingle( } assertUniqueCanonicalPaths(prepared); for (const entry of prepared) { - // A copy-only section legitimately changes nothing: it exists to fill - // the clipboard for a `PASTE` in a later section. - if (entry.isNoop && !entry.section.isClipboardSource) { + if (entry.isNoop) { const { count, escalate } = recordNoopEdit(options.session, entry.canonicalPath, inputHash); throw escalate ? new ToolError(noChangeLoopDiagnostic(entry.section.path, count)) @@ -314,10 +286,6 @@ export async function executeHashlineSingle( const sectionResult = await patcher.commit(prepared[i]); commitClipboard(sectionStates[i], sessionClipboard); if (sectionResult.op === "noop") { - if (prepared[i].section.isClipboardSource) { - rendered.push(clipboardSourceResult(sectionResult)); - continue; - } const { count, escalate } = recordNoopEdit(options.session, sectionResult.canonicalPath, inputHash); throw escalate ? new ToolError(noChangeLoopDiagnostic(sectionResult.path, count)) @@ -326,18 +294,13 @@ export async function executeHashlineSingle( resetNoopEdit(options.session, sectionResult.canonicalPath); rendered.push(renderSection(sectionResult, fs.consumeDiagnostics(sectionResult.path), prepared[i].section.path)); } - // Every write landed; carry any still-pending cut forward as a warning. - const pendingCutNote = - clipboard.pendingCut === undefined ? "" : `\n\nWarnings:\n${pendingCutWarning(clipboard.pendingCut)}`; - return { content: [ { type: "text", - text: - rendered - .map(r => r.toolResult.content.map(part => (part.type === "text" ? part.text : "")).join("\n")) - .join("\n\n") + pendingCutNote, + text: rendered + .map(r => r.toolResult.content.map(part => (part.type === "text" ? part.text : "")).join("\n")) + .join("\n\n"), }, ], details: pruneOversizedEditSnapshots({ diff --git a/packages/coding-agent/src/edit/renderer.ts b/packages/coding-agent/src/edit/renderer.ts index cd11ab3c5..507b6e4ea 100644 --- a/packages/coding-agent/src/edit/renderer.ts +++ b/packages/coding-agent/src/edit/renderer.ts @@ -140,7 +140,7 @@ interface HashlineInputEntry { path: string; op?: Operation; rename?: string; - /** A SWAP/DEL/INS line-editing op precedes the file op — keeps a move framed. */ + /** A SWAP/CUT/INS line-editing op precedes the file op — keeps a move framed. */ hasLineEdits?: boolean; } @@ -568,9 +568,9 @@ function parseHashlineInputPreviewHeader(line: string): string | null { return previewPath.length > 0 ? previewPath : null; } -// Line-editing op headers (SWAP/DEL/INS family), distinct from the file-level -// REM/MV ops. Body rows are always `+TEXT`, so this only matches real headers. -const HL_LINE_OP_HEADER = /^(?:SWAP|DEL|INS)\b/; +// Line-editing op headers (SWAP/CUT/INS family), distinct from file-level +// REM/MV ops. Body rows are `+TEXT`, so this only matches real headers. +const HL_LINE_OP_HEADER = /^(?:SWAP|CUT|INS)\b/; /** * Walk a (possibly mid-stream) hashline payload into per-section descriptors: diff --git a/packages/coding-agent/src/edit/streaming.ts b/packages/coding-agent/src/edit/streaming.ts index 36df33c21..02bee2f90 100644 --- a/packages/coding-agent/src/edit/streaming.ts +++ b/packages/coding-agent/src/edit/streaming.ts @@ -53,7 +53,7 @@ export interface StreamingDiffContext { */ isStreaming?: boolean; /** - * Session-persistent clipboard register (`CUT`/`COPY`/`PASTE`). Previews + * Session-persistent clipboard register (`CUT`/`PASTE`). Previews * fork it per frame — never mutating it — so a `PASTE` of content cut in * an earlier edit call (or an earlier section of this patch) renders the * real rows. diff --git a/packages/coding-agent/src/prompts/system/plan-mode-active.md b/packages/coding-agent/src/prompts/system/plan-mode-active.md index e03e0dadc..fe1a1b862 100644 --- a/packages/coding-agent/src/prompts/system/plan-mode-active.md +++ b/packages/coding-agent/src/prompts/system/plan-mode-active.md @@ -30,10 +30,10 @@ Use `{{editToolName}}` for incremental edits and `{{writeToolName}}` only to cre {{#if isHashlineEditMode}} Structure the plan as `##`/`###` markdown sections so you can revise it section-by-section: with `{{editToolName}}`, a heading anchors its WHOLE section (through every nested deeper heading, up to the next same-or-higher heading). Rely on the block ops to grow the plan without rewriting the file: - `SWAP.BLK N:` on a heading line — rewrite that entire section in place. -- `DEL.BLK N` on a heading line — drop the whole section. +- `CUT.BLK N` on a heading line — drop the whole section. - `INS.BLK.POST N:` on a heading line — add a new section AFTER that one (end the inserted body with a blank line so the next heading stays separated). -Write each section together with its body — block ops need a multi-line section; a bare heading with no body falls back to plain `INS.POST`/`DEL`/`SWAP`. +Write each section together with its body — block ops need a multi-line section; a bare heading with no body falls back to plain `INS.POST`/`CUT`/`SWAP`. {{/if}} ## Ground every claim diff --git a/packages/coding-agent/src/session/agent-session.ts b/packages/coding-agent/src/session/agent-session.ts index 3423ab9c6..e5658acac 100644 --- a/packages/coding-agent/src/session/agent-session.ts +++ b/packages/coding-agent/src/session/agent-session.ts @@ -410,7 +410,7 @@ export class AgentSession { getXdevToolEntries: () => Array<{ name: string; summary: string }>; readonly yieldQueue: YieldQueue; fileSnapshotStore?: InMemorySnapshotStore; - /** Per-session `CUT`/`COPY`/`PASTE` clipboard register shared across edit calls. */ + /** Per-session `CUT`/`PASTE` clipboard register shared across edit calls. */ editClipboard?: Clipboard; #powerAssertion: MacOSPowerAssertion | undefined; diff --git a/packages/coding-agent/src/tools/index.ts b/packages/coding-agent/src/tools/index.ts index ee698df1f..c1e30211c 100644 --- a/packages/coding-agent/src/tools/index.ts +++ b/packages/coding-agent/src/tools/index.ts @@ -351,7 +351,7 @@ export interface ToolSession { * file changed out-of-band. Lazily initialized by `getFileSnapshotStore`. */ fileSnapshotStore?: InMemorySnapshotStore; - /** Per-session `CUT`/`COPY`/`PASTE` clipboard register shared across edit + /** Per-session `CUT`/`PASTE` clipboard register shared across edit * calls. Lazily initialized by `getEditClipboard`. */ editClipboard?: Clipboard; diff --git a/packages/coding-agent/test/core/block-replace.test.ts b/packages/coding-agent/test/core/block-replace.test.ts index 99e563944..c3e35058f 100644 --- a/packages/coding-agent/test/core/block-replace.test.ts +++ b/packages/coding-agent/test/core/block-replace.test.ts @@ -90,11 +90,11 @@ describe("SWAP.BLK — native tree-sitter resolution end-to-end", () => { }); }); - it("deletes the resolved `if` block (line 2) end-to-end via `DEL.BLK`", async () => { + it("deletes the resolved `if` block (line 2) end-to-end via `CUT.BLK`", async () => { await withTempDir(async tempDir => { const session = makeSession(tempDir); const { filePath, header } = await seedFile(tempDir, session, "x.ts", TS_SOURCE); - const input = `${header}\nDEL.BLK 2`; + const input = `${header}\nCUT.BLK 2`; await executeHashlineSingle(executeOptions(tempDir, input, session)); @@ -166,17 +166,17 @@ describe("SWAP.BLK — native tree-sitter resolution end-to-end", () => { }); }); - it("echoes the resolved span in the result text for DEL.BLK", async () => { + it("echoes the resolved span in the result text for CUT.BLK", async () => { await withTempDir(async tempDir => { const session = makeSession(tempDir); const { header } = await seedFile(tempDir, session, "x.ts", TS_SOURCE); - const input = `${header}\nDEL.BLK 2`; + const input = `${header}\nCUT.BLK 2`; const result = await executeHashlineSingle(executeOptions(tempDir, input, session)); const text = result.content.map(part => (part.type === "text" ? part.text : "")).join("\n"); // `if (y) {` opens on line 2; resolves lines 2-3. - expect(text).toContain("DEL.BLK 2 → resolved lines 2-3 (2 lines)"); + expect(text).toContain("CUT.BLK 2 → resolved lines 2-3 (2 lines)"); }); }); @@ -256,13 +256,13 @@ const MD_PLAN = [ ].join("\n"); describe("block ops on markdown headings — whole-section resolution end-to-end", () => { - it("DEL.BLK at a `## H2` deletes the entire section, including nested subsections", async () => { + it("CUT.BLK at a `## H2` deletes the entire section, including nested subsections", async () => { await withTempDir(async tempDir => { const session = makeSession(tempDir); // Line 4 is `## Context`; its section runs through `### Detail` and // the trailing blank, up to `## Approach`. const { filePath, header } = await seedFile(tempDir, session, "plan.md", MD_PLAN); - const input = `${header}\nDEL.BLK 4`; + const input = `${header}\nCUT.BLK 4`; const result = await executeHashlineSingle(executeOptions(tempDir, input, session)); const text = result.content.map(part => (part.type === "text" ? part.text : "")).join("\n"); @@ -270,7 +270,7 @@ describe("block ops on markdown headings — whole-section resolution end-to-end expect(await Bun.file(filePath).text()).toBe( ["# Plan", "intro", "", "## Approach", "step one", ""].join("\n"), ); - expect(text).toContain("DEL.BLK 4 → resolved lines 4-10 (7 lines)"); + expect(text).toContain("CUT.BLK 4 → resolved lines 4-10 (7 lines)"); }); }); diff --git a/packages/coding-agent/test/edit-diff.test.ts b/packages/coding-agent/test/edit-diff.test.ts index 76438bdd6..6d9b119a2 100644 --- a/packages/coding-agent/test/edit-diff.test.ts +++ b/packages/coding-agent/test/edit-diff.test.ts @@ -301,7 +301,7 @@ describe("computeHashlineDiff", () => { const tag = snapshotStore.record(sourcePath, text); // Mirror the streaming-strategy contract: the session register is forked // once per preview frame; sections then thread the fork in patch order. - const sessionRegister = { lines: ["carried"], pendingCut: "CUT 5" }; + const sessionRegister = { lines: ["carried"] }; const result = await computeHashlineDiff( { input: `${formatHashlineHeader(sourcePath, tag)}\nPASTE.TAIL` }, tempDir, @@ -312,7 +312,7 @@ describe("computeHashlineDiff", () => { if ("diff" in result) { expect(result.diff).toContain("|carried"); } - expect(sessionRegister.pendingCut).toBe("CUT 5"); + expect(sessionRegister.lines).toEqual(["carried"]); }); test("streams paste rows in the natural-order preview", async () => { diff --git a/packages/coding-agent/test/edit-streaming-preview.test.ts b/packages/coding-agent/test/edit-streaming-preview.test.ts index 9898e2b48..b7e4ce59b 100644 --- a/packages/coding-agent/test/edit-streaming-preview.test.ts +++ b/packages/coding-agent/test/edit-streaming-preview.test.ts @@ -305,12 +305,12 @@ describe("apply_patch streaming preview (trailing partial line)", () => { describe("matcherDigest", () => { test("hashline: digests stripped `+` body rows only, never headers or op lines", () => { - const input = ["[a.ts#AB12]", "SWAP 1.=2:", "+const x = 1;", "+const y = 2;", "DEL 5", ""].join("\n"); + const input = ["[a.ts#AB12]", "SWAP 1.=2:", "+const x = 1;", "+const y = 2;", "CUT 5", ""].join("\n"); expect(EDIT_MODE_STRATEGIES.hashline.matcherDigest({ input })).toBe("const x = 1;\nconst y = 2;"); }); test("hashline: grammar-only payload digests to empty, missing input to undefined", () => { - expect(EDIT_MODE_STRATEGIES.hashline.matcherDigest({ input: "[a.ts#AB12]\nDEL 3\n" })).toBe(""); + expect(EDIT_MODE_STRATEGIES.hashline.matcherDigest({ input: "[a.ts#AB12]\nCUT 3\n" })).toBe(""); expect(EDIT_MODE_STRATEGIES.hashline.matcherDigest({})).toBeUndefined(); }); diff --git a/packages/coding-agent/test/edit/seen-line-guard.test.ts b/packages/coding-agent/test/edit/seen-line-guard.test.ts index bc317dcd6..f387de660 100644 --- a/packages/coding-agent/test/edit/seen-line-guard.test.ts +++ b/packages/coding-agent/test/edit/seen-line-guard.test.ts @@ -262,7 +262,7 @@ describe("read → edit seen-line guard", () => { expect(seen?.has(1122)).toBe(true); await executeHashlineSingle( execOptions( - `[src/main.c#${tag}]\nINS.POST 1122:\n+\tbeep_3k8hz_on();\n+\tk_sleep(K_MSEC(300));\n+\tbeep_3k8hz_off();\nDEL 1288.=1291`, + `[src/main.c#${tag}]\nINS.POST 1122:\n+\tbeep_3k8hz_on();\n+\tk_sleep(K_MSEC(300));\n+\tbeep_3k8hz_off();\nCUT 1288.=1291`, session, ), ); @@ -313,7 +313,7 @@ describe("read → edit seen-line guard", () => { const tag = tagFromOutput(resultText(read)); // Anchor 60 unseen lines — deliberately over the 40-line cap. - const dels = Array.from({ length: 60 }, (_, i) => `DEL ${100 + i}`).join("\n"); + const dels = Array.from({ length: 60 }, (_, i) => `CUT ${100 + i}`).join("\n"); let message: string | undefined; try { await executeHashlineSingle(execOptions(`[long.txt#${tag}]\n${dels}`, session)); diff --git a/packages/hashline/CHANGELOG.md b/packages/hashline/CHANGELOG.md index 672a976e3..ea49810fb 100644 --- a/packages/hashline/CHANGELOG.md +++ b/packages/hashline/CHANGELOG.md @@ -4,13 +4,13 @@ ### Added -- Added clipboard ops: `CUT N.=M` / `COPY N.=M` capture lines into a register (`CUT` also deletes them), `CUT.BLK N` / `COPY.BLK N` capture tree-sitter blocks, and `PASTE.PRE|POST N` / `PASTE.HEAD|TAIL` / `PASTE.BLK.POST N` insert the captured lines without retyping. The register flows top-to-bottom across sections, so content moves between files in one patch; `PASTE` does not consume it and the last capture wins. -- Added `PatcherOptions.clipboard` for a host-owned register that persists across `Patcher.apply` batches. Batches work on a fork (`forkClipboard`) published per landed section (`commitClipboard`), so failed batches never poison the register and a mid-batch write failure still preserves content already cut from disk; un-pasted `CUT` content becomes a carry-forward warning instead of an error. -- Added clipboard safety guards: a `PASTE` with an empty register, a capture overwriting un-pasted `CUT` content, a batch-local `CUT` that is never pasted, and clipboard ops in same-path sections interleaved across another file's section are all rejected with targeted diagnostics. `CUT`/`COPY` ranges participate in overlap validation, the seen-lines guard, and drift recovery (every captured line must remap). +- Added clipboard ops: `CUT N.=M` captures lines into a register (and deletes them), `CUT.BLK N` captures tree-sitter blocks, and `PASTE.PRE|POST N` / `PASTE.HEAD|TAIL` / `PASTE.BLK.POST N` insert the captured lines without retyping. The register flows top-to-bottom across sections, so content moves between files in one patch; `PASTE` does not consume it and the last capture wins. +- Added `PatcherOptions.clipboard` for a host-owned register that persists across `Patcher.apply` batches. Batches work on a fork (`forkClipboard`) published per landed section (`commitClipboard`), so failed batches never poison the register and a mid-batch write failure still preserves content already cut from disk. +- Added clipboard safety guards: a `PASTE` with an empty register, a capture overwriting un-pasted `CUT` content, and clipboard ops in same-path sections interleaved across another file's section are all rejected with targeted diagnostics. `CUT` ranges participate in overlap validation, the seen-lines guard, and drift recovery (every captured line must remap). ### Changed -- Regrouped `grammar.lark` around shared shapes — one `target` rule (`N.=M` | `.BLK N`) for `DEL`/`CUT`/`COPY` and one `pos` rule (`PRE`/`POST`/`BLK.POST`/`HEAD`/`TAIL`) for `INS`/`PASTE` — collapsing twelve per-op hunk rules into seven. The accepted language is byte-identical. +- Regrouped `grammar.lark` around shared shapes — one `target` rule (`N.=M` | `.BLK N`) for `DEL`/`CUT` and one `pos` rule (`PRE`/`POST`/`BLK.POST`/`HEAD`/`TAIL`) for `INS`/`PASTE` — collapsing per-op hunk rules. The accepted language is byte-identical. ### Fixed diff --git a/packages/hashline/README.md b/packages/hashline/README.md index 728105da0..04f511fd6 100644 --- a/packages/hashline/README.md +++ b/packages/hashline/README.md @@ -49,11 +49,9 @@ session-aware recovery on mismatch. Inside a section: - `SWAP A.=B:` — replace lines A.=B with following `+TEXT` body rows. - `SWAP.BLK A:` — replace the syntactic block beginning on line A. -- `DEL A.=B` / `DEL.BLK A` — delete concrete lines or a resolved block. +- `CUT A.=B` / `CUT.BLK A` — delete concrete lines or a resolved block and capture them for `PASTE`. - `INS.PRE A:` / `INS.POST A:` / `INS.HEAD:` / `INS.TAIL:` — insert following body rows. - `INS.BLK.POST A:` — insert following body rows after the resolved block's last line. -- `CUT A.=B` / `COPY A.=B` — capture lines into the clipboard register (`CUT` also deletes them). -- `CUT.BLK A` / `COPY.BLK A` — capture the resolved block (`CUT.BLK` also deletes it). - `PASTE.PRE A` / `PASTE.POST A` / `PASTE.HEAD` / `PASTE.TAIL` / `PASTE.BLK.POST A` — insert the clipboard; no body rows. The register flows top-to-bottom across sections (cross-file moves) and can be host-persisted across batches via `PatcherOptions.clipboard`. - `REM` — delete the whole file named by the section header. - `MV DEST` — move/rename the section file to `DEST` (optionally after line edits). diff --git a/packages/hashline/src/apply.ts b/packages/hashline/src/apply.ts index b50de23af..3eeb589e5 100644 --- a/packages/hashline/src/apply.ts +++ b/packages/hashline/src/apply.ts @@ -1226,10 +1226,9 @@ function repairAfterInsertLandings( /** Optional knobs for {@link applyEdits}. */ export interface ApplyEditsOptions { /** - * Clipboard register filled by `copy` edits and read by `paste` edits. + * Clipboard register filled by `cut` edits and read by `paste` edits. * Thread one register through every section of a batch to move content - * across files; when omitted, the call gets a private register (same-file - * cut/paste still works). + * across files; omitted, the call gets a private register. */ clipboard?: Clipboard; /** `PASTE` with an empty register: `throw` (default) or `drop` (streaming previews). */ @@ -1247,8 +1246,8 @@ export function applyEdits(text: string, edits: readonly Edit[], options: ApplyE const fileLines = text.split("\n"); - // Clipboard pre-pass: capture `copy` ranges from the original lines and - // expand `paste` edits into plain inserts, in authored order. + // Clipboard pre-pass: capture `cut` ranges from the original lines and + // expand `paste` edits into plain inserts in authored order. const concrete = resolveClipboardEdits(edits, fileLines, options.clipboard ?? {}, { ...(options.onEmptyPaste === undefined ? {} : { onEmptyPaste: options.onEmptyPaste }), }); diff --git a/packages/hashline/src/block.ts b/packages/hashline/src/block.ts index 4cee0d09d..67cdd0728 100644 --- a/packages/hashline/src/block.ts +++ b/packages/hashline/src/block.ts @@ -1,16 +1,10 @@ /** - * Expand deferred block edits (`replace_block N:` / `delete_block N` / - * `insert_after_block N:`) into concrete inserts + deletes. + * Expand deferred block edits into concrete inserts, cuts, pastes, and deletes. * - * The hashline parser cannot expand a block edit on its own — the line span is - * unknown until file text + path (→ language) are available. This transform - * runs at every apply/preview boundary that has text: it calls the injected - * {@link BlockResolver} to resolve each block's `[start, end]` span, then emits - * the exact same edits the concrete form produces in the parser: `replace - * start.=end:` inserts + deletes for a replace, a pure range delete for a - * delete, and plain `after_anchor` inserts at `end` for an insert-after. After - * it runs, no `block` edits remain, so {@link applyEdits} (and recovery) only - * ever see resolved edits. + * The parser cannot expand a block edit until file text and language are + * available. This transform resolves each anchored span, then emits the same + * low-level edits as the corresponding concrete operation. After it runs, no + * `block` edits remain, so {@link applyEdits} and recovery see concrete edits. */ import { STRUCTURAL_CLOSER_RE } from "./apply"; import { @@ -70,15 +64,12 @@ function findEnclosingBlock( return null; } +/** Optional knobs for {@link resolveBlockEdits}. */ export interface ResolveBlockEditsOptions { /** - * How to handle a replace/delete block edit that cannot be resolved - * (missing resolver or a `null` span). `"throw"` (default) raises a - * `blockUnresolvedMessage` error — used by the authoritative apply + final - * preview paths. `"drop"` silently skips the edit — used by the streaming - * preview, where a half-written file or transient parse error must not - * throw. Unresolvable `insert_after_block N:` edits never reach this: they - * are lowered to plain `insert after N:` with a warning. + * How to handle a replace/cut block edit that cannot be resolved. `"throw"` + * (default) raises a block error; `"drop"` skips it for streaming previews. + * Unresolvable after-block edits lower to their plain after-line form. */ onUnresolved?: "throw" | "drop"; /** @@ -127,7 +118,7 @@ export function resolveBlockEdits( resolved.push(edit); continue; } - const op: BlockOp = edit.mode ?? (edit.payloads.length === 0 ? "delete" : "replace"); + const op: BlockOp = edit.mode ?? "replace"; const span = resolver ? resolver({ path, text, line: edit.anchor.line }) : null; if (span === null) { // `insert_after_block N:` never fails the patch — lower it to plain @@ -209,20 +200,16 @@ export function resolveBlockEdits( }); continue; } - if (op === "copy" || op === "cut") { - // Capture the resolved span; a cut also deletes it line-by-line, - // exactly like the parser's lowering of `CUT N.=M`. + if (op === "cut") { + // Capture the resolved span before deleting it line-by-line. resolved.push({ - kind: "copy", + kind: "cut", range: { start: { line: span.start }, end: { line: span.end } }, - cut: op === "cut", lineNum: edit.lineNum, index: synthIndex++, }); - if (op === "cut") { - for (let line = span.start; line <= span.end; line++) { - resolved.push({ kind: "delete", anchor: { line }, lineNum: edit.lineNum, index: synthIndex++ }); - } + for (let line = span.start; line <= span.end; line++) { + resolved.push({ kind: "delete", anchor: { line }, lineNum: edit.lineNum, index: synthIndex++ }); } continue; } @@ -245,10 +232,8 @@ export function resolveBlockEdits( } continue; } - // Mirror the parser's `replace start.=end:` expansion exactly: one - // `before_anchor` replacement insert per payload row at `span.start`, - // then one delete per line across `[span.start, span.end]`. An empty - // `payloads` (from `delete_block N`) emits no inserts — a pure deletion. + // Mirror `SWAP start.=end:`: replacement inserts at `span.start`, then + // one delete per line across the resolved span. for (const payload of edit.payloads) { const cursor: Cursor = { kind: "before_anchor", anchor: { line: span.start } }; resolved.push({ diff --git a/packages/hashline/src/clipboard.ts b/packages/hashline/src/clipboard.ts index 72f004714..bed55af25 100644 --- a/packages/hashline/src/clipboard.ts +++ b/packages/hashline/src/clipboard.ts @@ -1,43 +1,34 @@ /** - * Clipboard register support for `CUT` / `COPY` / `PASTE` ops. + * Clipboard register support for `CUT` / `PASTE` ops. * - * `CUT N.=M` / `COPY N.=M` (and their `.BLK` block-resolved forms) capture the - * range's current lines into a {@link Clipboard} register — cut additionally - * lowers to ordinary per-line deletes at parse/resolve time. `PASTE.PRE|POST N`, - * `PASTE.HEAD|TAIL`, and `PASTE.BLK.POST N` insert the captured lines at a - * cursor. The register is threaded through a whole patch application in source - * order — across sections — so content can move between files without being - * retyped: the last capture wins, and a `PASTE` does not consume the register, - * so the same content can land in several places. - * - * {@link resolveClipboardEdits} is the applier's pre-pass: it runs inside - * {@link applyEdits} against the exact text the edits apply to (after block - * resolution and recovery remapping), captures `copy` edits, and expands - * `paste` edits into plain inserts. + * `CUT` captures its current source lines before ordinary delete edits apply. + * `PASTE` expands the latest capture into inserts. One register flows through + * patch sections in authored order, so content moves across files; the latest + * cut wins and paste does not consume it. */ -import { HL_COPY_KEYWORD, HL_CUT_KEYWORD, HL_RANGE_SEP } from "./format"; -import { EMPTY_PASTE, overwrittenCutMessage, unusedCutMessage } from "./messages"; +import { HL_CUT_KEYWORD, HL_RANGE_SEP } from "./format"; +import { EMPTY_PASTE } from "./messages"; import { cloneCursor } from "./tokenizer"; import type { Clipboard, Edit } from "./types"; -type CopyEdit = Extract; +type CutEdit = Extract; -/** `CUT 5.=10` / `COPY 5` display form for diagnostics. */ -function describeCopyEdit(edit: CopyEdit): string { +function describeCutEdit(edit: CutEdit): string { const { start, end } = edit.range; const range = start.line === end.line ? `${start.line}` : `${start.line}${HL_RANGE_SEP}${end.line}`; - return `${edit.cut ? HL_CUT_KEYWORD : HL_COPY_KEYWORD} ${range}`; + return `${HL_CUT_KEYWORD} ${range}`; } -/** True when at least one edit reads or writes the clipboard register (including unresolved `.BLK` forms). */ +/** True when at least one edit reads or writes the clipboard register. */ export function hasClipboardEdit(edits: readonly Edit[]): boolean { return edits.some( edit => - edit.kind === "copy" || + edit.kind === "cut" || edit.kind === "paste" || - (edit.kind === "block" && (edit.mode === "copy" || edit.mode === "cut" || edit.mode === "paste_after")), + (edit.kind === "block" && (edit.mode === "cut" || edit.mode === "paste_after")), ); } + /** Optional knobs for {@link resolveClipboardEdits}. */ export interface ResolveClipboardEditsOptions { /** `PASTE` with an empty register: `throw` (default) or `drop` (streaming previews). */ @@ -45,16 +36,8 @@ export interface ResolveClipboardEditsOptions { } /** - * Expand clipboard edits against `fileLines` (the text the edit batch applies - * to): `copy` edits capture their range into `clipboard` and emit nothing; - * `paste` edits become one plain insert per captured line. Non-clipboard edits - * pass through untouched, and the fast path returns the input unchanged when - * there is nothing to resolve. Edits are processed in array order — the - * authored patch order — so a `PASTE` uses the most recent capture above it. - * - * Throws on an out-of-range capture, a capture that would overwrite un-pasted - * `CUT` content, and (unless `onEmptyPaste: "drop"`) a `PASTE` with an empty - * register. + * Resolve clipboard edits against the original file lines in authored order. + * Cuts fill the register and emit nothing; pastes become plain inserts. */ export function resolveClipboardEdits( edits: readonly Edit[], @@ -67,19 +50,14 @@ export function resolveClipboardEdits( const resolved: Edit[] = []; let synthIndex = 0; for (const edit of edits) { - if (edit.kind === "copy") { + if (edit.kind === "cut") { const { start, end } = edit.range; if (start.line < 1 || end.line > fileLines.length) { throw new Error( - `line ${edit.lineNum}: \`${describeCopyEdit(edit)}\` is out of range (file has ${fileLines.length} lines).`, + `line ${edit.lineNum}: \`${describeCutEdit(edit)}\` is out of range (file has ${fileLines.length} lines).`, ); } - if (clipboard.pendingCut !== undefined) { - throw new Error(overwrittenCutMessage(clipboard.pendingCut, edit.lineNum)); - } clipboard.lines = fileLines.slice(start.line - 1, end.line); - if (edit.cut) clipboard.pendingCut = describeCopyEdit(edit); - else delete clipboard.pendingCut; continue; } if (edit.kind === "paste") { @@ -88,7 +66,6 @@ export function resolveClipboardEdits( if (onEmptyPaste === "drop") continue; throw new Error(`line ${edit.lineNum}: ${EMPTY_PASTE}`); } - delete clipboard.pendingCut; for (const text of lines) { resolved.push({ kind: "insert", @@ -106,53 +83,28 @@ export function resolveClipboardEdits( return resolved; } -/** - * Shallow working copy of a register, for transactional batches: resolve the - * whole batch against the fork, then {@link commitClipboard} it back only - * after the batch's writes actually land. A failed batch leaves the source - * register untouched, so retries are never blocked by phantom captures and a - * failed `PASTE` never clears a real pending cut. - */ +/** Create a transactional working copy of a clipboard register. */ export function forkClipboard(source?: Clipboard): Clipboard { return source === undefined ? {} : { ...source }; } -/** Publish a fork's state back to its source register. */ +/** Publish a clipboard fork back to its source register. */ export function commitClipboard(fork: Clipboard, target: Clipboard): void { if (fork.lines === undefined) delete target.lines; else target.lines = fork.lines; - if (fork.pendingCut === undefined) delete target.pendingCut; - else target.pendingCut = fork.pendingCut; } /** - * Throw when the register still holds un-pasted `CUT` content. Called at the - * end of a batch by whoever created the register: a cut that never landed - * means the patch deleted lines it meant to move (the classic truncated-patch - * failure), so it is rejected rather than silently applied as a delete. - */ -export function assertClipboardConsumed(clipboard: Clipboard): void { - if (clipboard.pendingCut !== undefined) throw new Error(unusedCutMessage(clipboard.pendingCut)); -} - -/** - * Validate clipboard sequencing (a `PASTE` before any capture, a capture over - * un-pasted `CUT` content) without mutating `clipboard` or touching file text. - * The patcher runs this before its recovery path, where {@link applyEdits} - * failures are swallowed and re-surfaced as tag-mismatch errors — sequencing - * mistakes must keep their targeted message instead. + * Validate that every paste has a preceding or persisted capture without + * mutating the register or reading file content. */ export function validateClipboardSequence(edits: readonly Edit[], clipboard: Clipboard): void { let hasLines = clipboard.lines !== undefined; - let pendingCut = clipboard.pendingCut; for (const edit of edits) { - if (edit.kind === "copy") { - if (pendingCut !== undefined) throw new Error(overwrittenCutMessage(pendingCut, edit.lineNum)); + if (edit.kind === "cut") { hasLines = true; - pendingCut = edit.cut ? describeCopyEdit(edit) : undefined; - } else if (edit.kind === "paste") { - if (!hasLines) throw new Error(`line ${edit.lineNum}: ${EMPTY_PASTE}`); - pendingCut = undefined; + } else if (edit.kind === "paste" && !hasLines) { + throw new Error(`line ${edit.lineNum}: ${EMPTY_PASTE}`); } } } diff --git a/packages/hashline/src/format.ts b/packages/hashline/src/format.ts index 6692e96a8..f30de3106 100644 --- a/packages/hashline/src/format.ts +++ b/packages/hashline/src/format.ts @@ -15,8 +15,6 @@ export const HL_PAYLOAD_REPLACE = "+"; /** Hunk-header keyword for concrete line replacement. */ export const HL_REPLACE_KEYWORD = "SWAP"; -/** Hunk-header keyword for concrete line deletion. */ -export const HL_DELETE_KEYWORD = "DEL"; /** Hunk-header keyword for insertion operations. */ export const HL_INSERT_KEYWORD = "INS"; /** Insert position keyword for inserting before a concrete line. */ @@ -29,16 +27,10 @@ export const HL_INSERT_HEAD = "HEAD"; export const HL_INSERT_TAIL = "TAIL"; /** Hunk-header keyword: `SWAP.BLK N:` resolves N to a tree-sitter block range and replaces its span. */ export const HL_REPLACE_BLOCK_KEYWORD = "SWAP.BLK"; -/** Hunk-header keyword: `DEL.BLK N` resolves N to a tree-sitter block range and deletes its span. */ -export const HL_DELETE_BLOCK_KEYWORD = "DEL.BLK"; /** Hunk-header keyword: `INS.BLK.POST N:` inserts after the last line of the tree-sitter block at N. */ export const HL_INSERT_AFTER_BLOCK_KEYWORD = "INS.BLK.POST"; -/** Hunk-header keyword: `COPY N.=M` captures lines into the clipboard register. */ -export const HL_COPY_KEYWORD = "COPY"; /** Hunk-header keyword: `CUT N.=M` captures lines into the clipboard register and deletes them. */ export const HL_CUT_KEYWORD = "CUT"; -/** Hunk-header keyword: `COPY.BLK N` captures the tree-sitter block at N into the clipboard. */ -export const HL_COPY_BLOCK_KEYWORD = "COPY.BLK"; /** Hunk-header keyword: `CUT.BLK N` captures the tree-sitter block at N and deletes its span. */ export const HL_CUT_BLOCK_KEYWORD = "CUT.BLK"; /** Hunk-header keyword prefix: `PASTE.PRE|POST N` / `PASTE.HEAD|TAIL` inserts the clipboard. */ @@ -75,9 +67,9 @@ export function formatReplaceHeader(start: number, end: number): string { return `${HL_REPLACE_KEYWORD} ${start}${HL_RANGE_SEP}${end}${HL_HEADER_COLON}`; } -/** Format a concrete deletion hunk header. */ -export function formatDeleteHeader(start: number, end = start): string { - return start === end ? `${HL_DELETE_KEYWORD} ${start}` : `${HL_DELETE_KEYWORD} ${start}${HL_RANGE_SEP}${end}`; +/** Format a concrete cut hunk header. */ +export function formatCutHeader(start: number, end = start): string { + return start === end ? `${HL_CUT_KEYWORD} ${start}` : `${HL_CUT_KEYWORD} ${start}${HL_RANGE_SEP}${end}`; } /** Format an insertion hunk header for a cursor position. */ diff --git a/packages/hashline/src/grammar.lark b/packages/hashline/src/grammar.lark index 3c126fa38..e66c2afa5 100644 --- a/packages/hashline/src/grammar.lark +++ b/packages/hashline/src/grammar.lark @@ -7,12 +7,11 @@ file_header: "[" filename "#" file_hash "]" LF file_hash: /[0-9A-F]{4}/ filename: /[^#\r\n]+/ -hunk: swap_hunk | ins_hunk | del_hunk | copy_hunk | paste_hunk | rem_hunk | mv_hunk +hunk: swap_hunk | ins_hunk | cut_hunk | paste_hunk | rem_hunk | mv_hunk swap_hunk: "SWAP " header_range ":" LF body* | "SWAP.BLK " LID ":" LF body+ ins_hunk: "INS." pos ":" LF body+ -del_hunk: "DEL" target LF -copy_hunk: ("CUT" | "COPY") target LF +cut_hunk: "CUT" target LF paste_hunk: "PASTE." pos LF rem_hunk: "REM" LF mv_hunk: "MV " filename LF body* diff --git a/packages/hashline/src/input.ts b/packages/hashline/src/input.ts index 455dd1a1b..00fa9312a 100644 --- a/packages/hashline/src/input.ts +++ b/packages/hashline/src/input.ts @@ -10,7 +10,7 @@ import * as path from "node:path"; import { applyEdits } from "./apply"; import { resolveBlockEdits } from "./block"; -import { assertClipboardConsumed, hasClipboardEdit } from "./clipboard"; +import { hasClipboardEdit } from "./clipboard"; import { HL_FILE_HASH_EXAMPLES, HL_FILE_HASH_LENGTH, HL_FILE_HASH_SEP, HL_FILE_PREFIX, HL_FILE_SUFFIX } from "./format"; import { CLIPBOARD_INTERLEAVED_SECTIONS } from "./messages"; import { parsePatch, parsePatchStreaming } from "./parser"; @@ -308,27 +308,12 @@ export class PatchSection { if (edit.kind === "delete") return true; // A `replace_block N:` edit is anchored to concrete content on line N. if (edit.kind === "block") return true; - // A `COPY`/`CUT` range reads concrete content. - if (edit.kind === "copy") return true; + // A `CUT` range reads concrete content. + if (edit.kind === "cut") return true; return edit.cursor.kind === "before_anchor" || edit.cursor.kind === "after_anchor"; }); } - /** - * True when this section is a pure clipboard source: at least one edit, - * and every edit is a non-cut `COPY`/`COPY.BLK`. Only such a section may - * legitimately change nothing in its own file (it exists to fill the - * clipboard for a later `PASTE`), so only it is exempt from no-change - * validation — a section mixing COPY with mutating edits that all no-op'd - * still trips the guard. - */ - get isClipboardSource(): boolean { - const edits = this.edits; - return ( - edits.length > 0 && - edits.every(edit => (edit.kind === "copy" && !edit.cut) || (edit.kind === "block" && edit.mode === "copy")) - ); - } /** Anchor lines touched by this section, sorted ascending and deduplicated. */ collectAnchorLines(): readonly number[] { @@ -342,7 +327,7 @@ export class PatchSection { lines.add(edit.anchor.line); continue; } - if (edit.kind === "copy") { + if (edit.kind === "cut") { for (let line = edit.range.start.line; line <= edit.range.end.line; line++) lines.add(line); continue; } @@ -363,10 +348,8 @@ export class PatchSection { * `blockResolver` resolves any `replace_block N:` edits against `text`; an * unresolvable block throws (this is the final, authoritative preview path). * - * `clipboard` is the register shared by `CUT`/`COPY`/`PASTE` ops. Pass one - * when applying several sections of a batch so content can move across - * files; when omitted, a private register is used and un-pasted `CUT` - * content is rejected at the end of the call. + * `clipboard` is the register shared by `CUT`/`PASTE` ops. Pass one when + * applying several sections so content can move across files. */ applyTo(text: string, blockResolver?: BlockResolver, clipboard?: Clipboard): ApplyResult { const { edits, warnings } = this.parse(); @@ -375,9 +358,7 @@ export class PatchSection { onUnresolved: "throw", onWarning: warning => resolveWarnings.push(warning), }); - const register = clipboard ?? {}; - const result = applyEdits(text, resolved, { clipboard: register }); - if (clipboard === undefined) assertClipboardConsumed(register); + const result = applyEdits(text, resolved, { clipboard: clipboard ?? {} }); // Preserve parse warnings so consumers don't need to call `parse()` // separately. const merged = [...warnings, ...resolveWarnings, ...(result.warnings ?? [])]; @@ -395,8 +376,7 @@ export class PatchSection { * * `blockResolver` resolves any `replace_block N:` edits against `text`; an * unresolvable block is silently dropped so a half-written file does not - * throw mid-stream. A `PASTE` with an empty register is dropped for the - * same reason, and un-pasted `CUT` content is never rejected here. + * throw mid-stream. A `PASTE` with an empty register is dropped too. */ applyPartialTo(text: string, blockResolver?: BlockResolver, clipboard?: Clipboard): ApplyResult { const { edits, warnings } = parsePatchStreaming(this.diff); diff --git a/packages/hashline/src/messages.ts b/packages/hashline/src/messages.ts index 687c96f5b..71c6369f0 100644 --- a/packages/hashline/src/messages.ts +++ b/packages/hashline/src/messages.ts @@ -31,13 +31,11 @@ export function formatAnchoredContext(anchorLines: readonly number[], fileLines: return rows; } /** Concrete range operation rejected because its absolute end precedes its start. */ -export type AbsoluteRangeOp = "replace" | "delete" | "copy" | "cut"; +export type AbsoluteRangeOp = "replace" | "cut"; /** Header forms per concrete-range op, used to compose retry suggestions. */ const RANGE_OP_FORMS: Record = { replace: { keyword: "SWAP", colon: ":", blockKeyword: "SWAP.BLK" }, - delete: { keyword: "DEL", colon: "", blockKeyword: "DEL.BLK" }, - copy: { keyword: "COPY", colon: "", blockKeyword: "COPY.BLK" }, cut: { keyword: "CUT", colon: "", blockKeyword: "CUT.BLK" }, }; @@ -112,10 +110,10 @@ export const MINUS_ROW_REJECTED = "`-` rows are not valid; the range already names the lines being changed. For Markdown bullets or other literal `-` lines, prefix the literal row with `+`: `+- item`."; /** Replace hunk with no body. */ -export const EMPTY_REPLACE = `\`SWAP N${HL_RANGE_SEP}M:\` needs at least one \`+TEXT\` body row. To delete lines, use \`DEL N${HL_RANGE_SEP}M\`.`; +export const EMPTY_REPLACE = `\`SWAP N${HL_RANGE_SEP}M:\` needs at least one \`+TEXT\` body row. To delete lines, use \`CUT N${HL_RANGE_SEP}M\`.`; -/** `replace_block N:` hunk with no body. */ -export const EMPTY_BLOCK = "`SWAP.BLK N:` needs at least one `+TEXT` body row. To delete a block, use `DEL.BLK N`."; +/** `SWAP.BLK N:` hunk with no body. */ +export const EMPTY_BLOCK = "`SWAP.BLK N:` needs at least one `+TEXT` body row. To delete a block, use `CUT.BLK N`."; /** Optional source-aware suggestions appended to block-anchor diagnostics. */ export interface BlockDiagnosticSuggestions { @@ -126,12 +124,9 @@ export interface BlockDiagnosticSuggestions { } /** - * Block-anchored replace/delete could not resolve to a syntactic block - * (unsupported language, blank/out-of-range line, no node beginning on N, or - * parse error). Appends a {@link formatAnchoredContext} preview when - * `fileLines` is given. `insert_after_block N:` never reaches this — it is - * lowered to plain `insert after N:` instead (see - * {@link insertAfterBlockUnresolvedLoweredWarning}). + * A block-anchored replace/cut could not resolve to a syntactic block. + * Appends a {@link formatAnchoredContext} preview when `fileLines` is given. + * `INS.BLK.POST N:` never reaches this path; it lowers to `INS.POST N:`. */ export function blockUnresolvedMessage( line: number, @@ -170,9 +165,9 @@ export function blockUnresolvedMessage( return message; } -/** Block-anchored edit reached a path with no {@link BlockResolver} wired in — a host-configuration bug. */ +/** Block-anchored edit reached a path with no {@link BlockResolver} wired in. */ export const BLOCK_RESOLVER_UNAVAILABLE = - "Block ops (`SWAP.BLK`, `DEL.BLK`, `INS.BLK.POST`, `CUT.BLK`, `COPY.BLK`, `PASTE.BLK.POST`) are not available here (no block resolver configured). Use a concrete line range."; + "Block ops (`SWAP.BLK`, `INS.BLK.POST`, `CUT.BLK`, `PASTE.BLK.POST`) are not available here (no block resolver configured). Use a concrete line range."; /** * An after-block op anchored on a closing-delimiter line, lowered to its @@ -262,14 +257,12 @@ export function ambiguousCloserSpareMessage( } /** - * Internal invariant: `applyEdits` received an unresolved `replace_block N:` - * edit; `resolveBlockEdits` must run first. Wiring bug, not authored input. + * Internal invariant: `applyEdits` received an unresolved block edit; + * `resolveBlockEdits` must run first. */ export const UNRESOLVED_BLOCK_INTERNAL = - "internal error: unresolved `SWAP.BLK` edit reached the applier (resolveBlockEdits was not run)."; + "internal error: unresolved block edit reached the applier (resolveBlockEdits was not run)."; -/** Delete hunk received a body row. */ -export const DELETE_TAKES_NO_BODY = `\`DEL N${HL_RANGE_SEP}M\` does not take body rows. Remove the body, or use \`SWAP N${HL_RANGE_SEP}M:\`.`; /** `REM` received a body row or coexists with line edits. */ export const REM_TAKES_NO_BODY = @@ -279,11 +272,6 @@ export const REM_TAKES_NO_BODY = export const MOVE_TAKES_NO_BODY = "`MV DEST` does not take body rows. Put line edits above the `MV` row; the destination path follows `MV` on the same line."; -/** `delete_block N` hunk received a body row. */ -export const DELETE_BLOCK_TAKES_NO_BODY = "`DEL.BLK N` does not take body rows. Remove the body, or use `SWAP.BLK N:`."; - -/** `COPY N.=M` hunk received a body row. */ -export const COPY_TAKES_NO_BODY = `\`COPY N${HL_RANGE_SEP}M\` captures lines into the clipboard and takes no body rows.`; /** `CUT N.=M` hunk received a body row. */ export const CUT_TAKES_NO_BODY = `\`CUT N${HL_RANGE_SEP}M\` captures + deletes lines and takes no body rows. To replace lines with new content, use \`SWAP N${HL_RANGE_SEP}M:\`.`; @@ -293,22 +281,7 @@ export const PASTE_TAKES_NO_BODY = "`PASTE` inserts the clipboard content and takes no `+` body rows. To insert literal text, use `INS`."; /** `PASTE` ran with an empty clipboard register. */ -export const EMPTY_PASTE = `\`PASTE\` found nothing in the clipboard. Ops run top-to-bottom across the whole patch (sections included): put \`CUT N${HL_RANGE_SEP}M\` / \`COPY N${HL_RANGE_SEP}M\` (or \`CUT.BLK N\` / \`COPY.BLK N\`) above the \`PASTE\`.`; - -/** A `CUT` filled the register and the whole patch finished without a `PASTE`. */ -export function unusedCutMessage(cutForm: string): string { - return `\`${cutForm}\` deleted lines that were never pasted — no \`PASTE\` follows it in the patch. Add a \`PASTE.PRE|POST N\` / \`PASTE.HEAD|TAIL\` op, or use \`DEL\` to delete without moving.`; -} - -/** A later CUT/COPY overwrote a register whose CUT content was never pasted. */ -export function overwrittenCutMessage(cutForm: string, lineNum: number): string { - return `line ${lineNum}: the clipboard still holds \`${cutForm}\` content that was never pasted. \`PASTE\` it before capturing again, or use \`DEL\` if those lines should just be deleted.`; -} - -/** Batch ended with un-pasted `CUT` content in a session-persistent register. */ -export function pendingCutWarning(cutForm: string): string { - return `\`${cutForm}\` content is in the clipboard but was not pasted by this edit. It stays available — \`PASTE\` it in a follow-up edit; capturing again before pasting it will be rejected.`; -} +export const EMPTY_PASTE = `\`PASTE\` found nothing in the clipboard. Ops run top-to-bottom across the whole patch (sections included): put \`CUT N${HL_RANGE_SEP}M\` or \`CUT.BLK N\` above the \`PASTE\`.`; /** * Clipboard ops inside a same-path section that was merged across another @@ -316,7 +289,7 @@ export function pendingCutWarning(cutForm: string): string { * an interleaved layout would silently reorder the register sequence. */ export const CLIPBOARD_INTERLEAVED_SECTIONS = - "`CUT`/`COPY`/`PASTE` cannot be used in a file whose sections are interleaved with another file's: same-path sections merge into the first occurrence, which would reorder the clipboard sequence. Keep each file's ops under ONE `[path#TAG]` header, with every capture above its `PASTE`."; + "`CUT`/`PASTE` cannot be used in a file whose sections are interleaved with another file's: same-path sections merge into the first occurrence, which would reorder the clipboard sequence. Keep each file's ops under ONE `[path#TAG]` header."; /** Insert hunk with no body. */ export const EMPTY_INSERT = "`INS` needs at least one `+TEXT` body row."; @@ -483,23 +456,20 @@ export function unseenLinesMessage( } /** Op kind of a deferred block edit, for {@link blockSingleLineMessage}. */ -export type BlockOp = "replace" | "delete" | "insert_after" | "copy" | "cut" | "paste_after"; +export type BlockOp = "replace" | "insert_after" | "cut" | "paste_after"; /** Display forms per deferred-block op: block keyword, trailing colon, and single-line plain form. */ const BLOCK_OP_FORMS: Record string }> = { replace: { keyword: "SWAP.BLK", colon: ":", plain: line => `SWAP ${line}${HL_RANGE_SEP}${line}:` }, - delete: { keyword: "DEL.BLK", colon: "", plain: line => `DEL ${line}` }, insert_after: { keyword: "INS.BLK.POST", colon: ":", plain: line => `INS.POST ${line}:` }, - copy: { keyword: "COPY.BLK", colon: "", plain: line => `COPY ${line}` }, cut: { keyword: "CUT.BLK", colon: "", plain: line => `CUT ${line}` }, paste_after: { keyword: "PASTE.BLK.POST", colon: "", plain: line => `PASTE.POST ${line}` }, }; /** - * A `replace_block`/`delete_block`/`insert_after_block` anchor resolved to a - * single line: line N is a bare statement, not the opening line of a - * multi-line construct. The plain op is exact for one line, so reject and - * point at it (with the enclosing block as an alternative when known). + * A block-op anchor resolved to a single line: line N is a bare statement, + * not the opening line of a multi-line construct. The plain op is exact for + * one line, so reject and point at it. */ export function blockSingleLineMessage(line: number, op: BlockOp, enclosingBlock?: BlockSpan): string { const forms = BLOCK_OP_FORMS[op]; diff --git a/packages/hashline/src/parser.ts b/packages/hashline/src/parser.ts index 624b72aa7..b6d77a6b6 100644 --- a/packages/hashline/src/parser.ts +++ b/packages/hashline/src/parser.ts @@ -7,10 +7,7 @@ import { HL_PAYLOAD_REPLACE, HL_RANGE_SEP } from "./format"; import { type AbsoluteRangeOp, BARE_BODY_AUTO_PIPED_WARNING, - COPY_TAKES_NO_BODY, CUT_TAKES_NO_BODY, - DELETE_BLOCK_TAKES_NO_BODY, - DELETE_TAKES_NO_BODY, EMPTY_BLOCK, EMPTY_INSERT, invalidAbsoluteRangeMessage, @@ -84,13 +81,9 @@ function isSkippableCommentLine(line: string): boolean { */ function bodylessTargetMessage(target: BlockTarget): string | null { switch (target.kind) { - case "delete": - return DELETE_TAKES_NO_BODY; - case "delete_block": - return DELETE_BLOCK_TAKES_NO_BODY; - case "copy": - case "copy_block": - return target.cut ? CUT_TAKES_NO_BODY : COPY_TAKES_NO_BODY; + case "cut": + case "cut_block": + return CUT_TAKES_NO_BODY; case "paste": case "paste_after_block": return PASTE_TAKES_NO_BODY; @@ -126,13 +119,13 @@ function detectApplyPatchContamination(text: string, _hasPending: boolean): stri return ( `apply_patch sentinel ${JSON.stringify(preview)} is not valid in hashline. ` + "File sections start with `[path#HASH]` (no `Update File:` / `Add File:` keyword). " + - `Use \`SWAP N${HL_RANGE_SEP}M:\`, \`DEL N${HL_RANGE_SEP}M\`, or \`INS.PRE|POST|HEAD|TAIL:\` ops.` + `Use \`SWAP N${HL_RANGE_SEP}M:\`, \`CUT N${HL_RANGE_SEP}M\`, or \`INS.PRE|POST|HEAD|TAIL:\` ops.` ); } if (/^@@\s+[-+]?\d+,\d+\s+[-+]?\d+,\d+\s+@@/.test(trimmed)) { return ( "unified-diff hunk header (`@@ -N,M +N,M @@`) is not valid in hashline. " + - `Use \`SWAP N${HL_RANGE_SEP}M:\`, \`DEL N${HL_RANGE_SEP}M\`, or \`INS.PRE|POST|HEAD|TAIL:\` ops.` + `Use \`SWAP N${HL_RANGE_SEP}M:\`, \`CUT N${HL_RANGE_SEP}M\`, or \`INS.PRE|POST|HEAD|TAIL:\` ops.` ); } if (trimmed.startsWith("@@")) { @@ -142,9 +135,6 @@ function detectApplyPatchContamination(text: string, _hasPending: boolean): stri `Drop the \`@@ ... @@\` brackets and write a verb header such as \`SWAP N${HL_RANGE_SEP}M:\`.` ); } - if (/^DEL\s+[1-9]\d*(?:\s*(?:\.\.|\.=|-|…|\s)\s*[1-9]\d*)?\s*:/.test(trimmed)) { - return `\`DEL N${HL_RANGE_SEP}M\` has no colon and no body. Remove the colon and body rows.`; - } // Bare `PASTE` (optionally `PASTE 5` / `PASTE:`) — the op requires an // explicit position suffix; a bare form would otherwise surface as a // confusing body-row rejection under the preceding hunk. @@ -152,13 +142,13 @@ function detectApplyPatchContamination(text: string, _hasPending: boolean): stri return "`PASTE` needs a position: use `PASTE.PRE N` / `PASTE.POST N` / `PASTE.HEAD` / `PASTE.TAIL` / `PASTE.BLK.POST N`."; } if (/^[1-9]\d*\s*$/.test(trimmed)) { - return `hunk headers need a verb. Use \`SWAP ${trimmed}${HL_RANGE_SEP}${trimmed}:\` to replace, or \`DEL ${trimmed}\` to delete.`; + return `hunk headers need a verb. Use \`SWAP ${trimmed}${HL_RANGE_SEP}${trimmed}:\` to replace, or \`CUT ${trimmed}\` to delete.`; } const bareRange = /^([1-9]\d*)\s*[-. …=]+\s*([1-9]\d*)\s*:?$/.exec(trimmed); if (bareRange !== null) { return ( `bare range hunk header ${JSON.stringify(trimmed)} is not valid. ` + - `Hunk headers need a verb: write \`SWAP ${bareRange[1]}${HL_RANGE_SEP}${bareRange[2]}:\` or \`DEL ${bareRange[1]}${HL_RANGE_SEP}${bareRange[2]}\`.` + `Hunk headers need a verb: write \`SWAP ${bareRange[1]}${HL_RANGE_SEP}${bareRange[2]}:\` or \`CUT ${bareRange[1]}${HL_RANGE_SEP}${bareRange[2]}\`.` ); } return null; @@ -237,11 +227,11 @@ export class Executor { return; case "op-block": this.#discardPendingSkippableComments(); - if (token.target.kind === "replace" || token.target.kind === "delete") { - validateRange(token.target.range, token.lineNum, token.target.kind); + if (token.target.kind === "replace") { + validateRange(token.target.range, token.lineNum, "replace"); } - if (token.target.kind === "copy") { - validateRange(token.target.range, token.lineNum, token.target.cut ? "cut" : "copy"); + if (token.target.kind === "cut") { + validateRange(token.target.range, token.lineNum, "cut"); } if (token.target.kind === "rem") { this.#flushPending(); @@ -381,7 +371,7 @@ export class Executor { if (text.trim().length === 0) return; throw new Error( `line ${lineNum}: payload line has no preceding hunk header. ` + - `Use \`SWAP N${HL_RANGE_SEP}M:\`, \`DEL N${HL_RANGE_SEP}M\`, or \`INS.PRE|POST|HEAD|TAIL:\` above the body. Got ${JSON.stringify(text)}.`, + `Use \`SWAP N${HL_RANGE_SEP}M:\`, \`CUT N${HL_RANGE_SEP}M\`, or \`INS.PRE|POST|HEAD|TAIL:\` above the body. Got ${JSON.stringify(text)}.`, ); } @@ -486,26 +476,23 @@ export class Executor { for (let line = range.start.line; line <= range.end.line; line++) this.#pushDelete({ line }, lineNum); } - #pushCopy(range: ParsedRange, cut: boolean, lineNum: number): void { + #pushCut(range: ParsedRange, lineNum: number): void { this.#edits.push({ - kind: "copy", + kind: "cut", range: { start: { ...range.start }, end: { ...range.end } }, - cut, lineNum, index: this.#editIndex++, }); - // A CUT deletes its range exactly like `DEL N.=M`; the copy edit above - // only captures. Keeping the deletes as ordinary per-line edits lets - // overlap validation, recovery remapping, and the applier treat them - // identically to a plain delete. - if (cut) this.#pushDeleteRange(range, lineNum); + // Capture before ordinary per-line deletes are applied. Keeping deletion + // as low-level edits preserves overlap validation and recovery remapping. + this.#pushDeleteRange(range, lineNum); } #pushBlock( anchor: Anchor, payloads: readonly PayloadRow[], lineNum: number, - mode?: "insert_after" | "copy" | "cut" | "paste_after", + mode?: "insert_after" | "cut" | "paste_after", ): void { this.#edits.push({ kind: "block", @@ -528,21 +515,12 @@ export class Executor { this.#resolveMinusRows(payloads); this.#stripBarePrefixesIfUniform(payloads); this.#pending = undefined; - if (target.kind === "delete") { - this.#pushDeleteRange(target.range, lineNum); + if (target.kind === "cut") { + this.#pushCut(target.range, lineNum); return; } - if (target.kind === "delete_block") { - // A block edit with no payloads resolves to a pure block deletion. - this.#pushBlock(target.anchor, [], lineNum); - return; - } - if (target.kind === "copy") { - this.#pushCopy(target.range, target.cut, lineNum); - return; - } - if (target.kind === "copy_block") { - this.#pushBlock(target.anchor, [], lineNum, target.cut ? "cut" : "copy"); + if (target.kind === "cut_block") { + this.#pushBlock(target.anchor, [], lineNum, "cut"); return; } if (target.kind === "paste") { diff --git a/packages/hashline/src/patcher.ts b/packages/hashline/src/patcher.ts index bb9ec3031..f391809bc 100644 --- a/packages/hashline/src/patcher.ts +++ b/packages/hashline/src/patcher.ts @@ -25,7 +25,7 @@ import * as path from "node:path"; import { applyEdits } from "./apply"; import { hasBlockEdit, resolveBlockEdits } from "./block"; -import { assertClipboardConsumed, commitClipboard, forkClipboard, validateClipboardSequence } from "./clipboard"; +import { commitClipboard, forkClipboard, validateClipboardSequence } from "./clipboard"; import { computeFileHash, formatHashlineHeader } from "./format"; import type { Filesystem, WriteResult } from "./fs"; import { isNotFound } from "./fs"; @@ -34,7 +34,6 @@ import { HEADTAIL_DRIFT_WARNING, missingSnapshotTagMessage, pathRecoveredFromTagMessage, - pendingCutWarning, type RevealedLine, unseenLinesMessage, writeDriftWarning, @@ -86,10 +85,7 @@ export interface PatcherOptions { /** * Host-owned clipboard register shared across batches, so `CUT` content * can be `PASTE`d by a later {@link Patcher.apply} call. Each batch works - * on a fork and publishes it back only after every write lands; un-pasted - * `CUT` content at batch end becomes a warning instead of an error. - * Omitted, every batch gets its own register and un-pasted `CUT` content - * is rejected when the batch ends. + * on a fork and publishes it back only after writes land. */ clipboard?: Clipboard; } @@ -127,9 +123,8 @@ export interface PatchSectionResult { /** Destination path when this section includes `MV DEST`. */ moveDest?: string; /** - * Resolved spans for any `replace_block`/`delete_block` ops, present when the - * apply matched the tagged content. Undefined for patches with no block ops - * (and for resolutions routed through drift recovery, where numbers shift). + * Resolved spans for block ops, present when the apply matched the tagged + * content. Undefined for patches with no block ops and for drift recovery. */ blockResolutions?: BlockResolution[]; } @@ -169,8 +164,8 @@ function hasAnchorScopedEdit(edits: readonly Edit[]): boolean { if (edit.kind === "delete") return true; // A `replace_block N:` edit anchors to concrete content on line N. if (edit.kind === "block") return true; - // A `COPY`/`CUT` range reads concrete content. - if (edit.kind === "copy") return true; + // A `CUT` range reads concrete content. + if (edit.kind === "cut") return true; return edit.cursor.kind === "before_anchor" || edit.cursor.kind === "after_anchor"; }); } @@ -246,8 +241,8 @@ export class Patcher { * {@link PatchSectionResult} per section in the original patch order. */ async apply(patch: Patch): Promise { - // One register per batch: `CUT`/`COPY` in one section feeds `PASTE` in - // a later one, so content can move across files. A host-owned register + // One register per batch: `CUT` in one section feeds `PASTE` in a later + // one, so content can move across files. A host-owned register // (see PatcherOptions.clipboard) additionally persists across batches: // work on a fork and publish it per landed section, so a failed batch // never poisons the persistent register and a mid-batch failure still @@ -257,12 +252,8 @@ export class Patcher { // Single-section fast path. if (patch.sections.length === 1) { const prepared = await this.prepare(patch.sections[0], clipboard); - if (this.clipboard === undefined) assertClipboardConsumed(clipboard); const result = await this.commit(prepared); - if (this.clipboard !== undefined) { - commitClipboard(clipboard, this.clipboard); - if (clipboard.pendingCut !== undefined) result.warnings.push(pendingCutWarning(clipboard.pendingCut)); - } + if (this.clipboard !== undefined) commitClipboard(clipboard, this.clipboard); return { sections: [result] }; } @@ -278,12 +269,9 @@ export class Patcher { prepared.push(await this.prepare(section, clipboard)); sectionStates.push(forkClipboard(clipboard)); } - if (this.clipboard === undefined) assertClipboardConsumed(clipboard); assertUniqueCanonicalPaths(prepared); for (const entry of prepared) { - // A copy-only section legitimately changes nothing: it exists to - // fill the clipboard for a later `PASTE`. - if (entry.isNoop && !entry.section.isClipboardSource) { + if (entry.isNoop) { throw new Error(`Edits to ${entry.section.path} resulted in no changes being made.`); } } @@ -308,9 +296,6 @@ export class Patcher { } if (this.clipboard !== undefined) commitClipboard(sectionStates[index], this.clipboard); } - if (this.clipboard !== undefined && clipboard.pendingCut !== undefined) { - results[results.length - 1]?.warnings.push(pendingCutWarning(clipboard.pendingCut)); - } return { sections: results }; } @@ -323,10 +308,9 @@ export class Patcher { const clipboard = forkClipboard(this.clipboard); const prepared: PreparedSection[] = []; for (const section of patch.sections) prepared.push(await this.prepare(section, clipboard)); - if (this.clipboard === undefined) assertClipboardConsumed(clipboard); assertUniqueCanonicalPaths(prepared); for (const entry of prepared) { - if (entry.isNoop && !entry.section.isClipboardSource) { + if (entry.isNoop) { throw new Error(`Edits to ${entry.section.path} resulted in no changes being made.`); } } @@ -357,10 +341,8 @@ export class Patcher { * {@link PreparedSection} which can be fed to {@link commit} to land * the result on the filesystem. * - * `clipboard` is the register shared by `CUT`/`COPY`/`PASTE` ops. Pass the - * batch's register when preparing several sections so content can move - * across files; when omitted, a private register is used and un-pasted - * `CUT` content is rejected before this method returns. + * `clipboard` is the register shared by `CUT`/`PASTE` ops. Pass the batch + * register when preparing several sections so content can move across files. * * Throws on parse error, missing-file-for-anchored-edit, or unrecovered * tag mismatch ({@link MismatchError}). @@ -431,7 +413,6 @@ export class Patcher { edits: parsed.edits, clipboard: register, }); - if (clipboard === undefined) assertClipboardConsumed(register); return new PreparedSection( target, diff --git a/packages/hashline/src/prompt.md b/packages/hashline/src/prompt.md index 2eee092af..a24c7fd8a 100644 --- a/packages/hashline/src/prompt.md +++ b/packages/hashline/src/prompt.md @@ -1,4 +1,4 @@ -Line-anchored patch language: name original lines to replace, delete, or insert at, then list new content. A header ending in `:` takes `+` body rows; `DEL`, `CUT`/`COPY`, `PASTE`, `REM`, `MV` take none. +Line-anchored patch language: name original lines to replace, cut, or insert at, then list new content. A header ending in `:` takes `+` body rows; `CUT`, `PASTE`, `REM`, `MV` take none. Every file section starts `[PATH#TAG]`. `TAG` = 4-hex snapshot tag from your latest `read`/`search` — REQUIRED on every section. Create new files with `write`; hashline only edits existing files. @@ -7,14 +7,13 @@ Every file section starts `[PATH#TAG]`. `TAG` = 4-hex snapshot tag from your lat `SWAP N.=M:` — replace original lines N.=M (INCLUSIVE). `SWAP.BLK N:` — replace the whole syntactic block BEGINNING on line N; its closing line is resolved for you. -`DEL N.=M` / `DEL.BLK N` — delete lines N.=M / the block beginning at N. +`CUT N.=M` / `CUT.BLK N` — delete lines N.=M / the block beginning at N, and capture them for `PASTE`. `INS.PRE N:` / `INS.POST N:` — insert immediately before / after line N. `INS.BLK.POST N:` — insert after the END of the block beginning at N, outside it at sibling depth. Append inside a block → `INS.POST`. `INS.HEAD:` / `INS.TAIL:` — insert at the very start / end of the file. -`CUT N.=M` / `COPY N.=M` — capture lines N.=M into the clipboard (`CUT` also deletes); `.BLK N` forms capture the block. `PASTE.PRE N` / `PASTE.POST N` / `PASTE.HEAD` / `PASTE.TAIL` / `PASTE.BLK.POST N` — insert the clipboard at the position (the clipboard IS the body). `REM` — delete the whole section file. `MV DEST` — move/rename to `DEST` (quote paths with spaces); edits above `MV` land on the source first, final content written at `DEST`. -Single line: `SWAP N.=N:` / `DEL N`. Range = ORIGINAL lines touched; body length irrelevant (1 line → 10 is still `SWAP N.=N:`). +Single line: `SWAP N.=N:` / `CUT N`. Range = ORIGINAL lines touched; body length irrelevant (1 line → 10 is still `SWAP N.=N:`). @@ -30,11 +29,10 @@ Only under a `:` header. Every row is `+TEXT`, verbatim (leading whitespace kept - Ranges cover ONLY changed lines — never widen over keepers. Non-adjacent changes = separate hunks. - Whole construct → `SWAP.BLK N`; lines inside one → `SWAP N.=M`. - `SWAP.BLK` resolves EXACTLY the node at N: leading decorators/attributes/doc-comments are separate nodes — point N at the FIRST decorator to sweep both; standalone line-comments are never swept (use `SWAP N.=M`). -- Block ops anchor the OPENING line of a MULTI-LINE construct — never the closer, last line, or a bare inner statement; one statement → plain op (`SWAP N.=N:` / `DEL N` / `INS.POST N:`). Saw the closer? `INS.POST M:`. +- Block ops anchor the OPENING line of a MULTI-LINE construct — never the closer, last line, or a bare inner statement; one statement → plain op (`SWAP N.=N:` / `CUT N` / `INS.POST N:`). Saw the closer? `INS.POST M:`. - Markdown: a heading IS a block opener — block ops on `##`/`###` resolve the WHOLE section (through deeper nested headings, up to the next same-or-higher heading). `INS.BLK.POST` after a section: end the body with a blank line to keep the next heading separated. - Pure additions → `INS.PRE`/`INS.POST`/`INS.HEAD`/`INS.TAIL`, never a widened `SWAP`. -- Move code with `CUT`+`PASTE`, never retype. Clipboard: top-to-bottom across the whole patch (cross-file moves), persists across edit calls, last `CUT`/`COPY` wins, `PASTE` repeats freely, pastes verbatim with indentation — re-indent via `SWAP`. -- Paste `CUT` content before any new `CUT`/`COPY`. +- Move code with `CUT`+`PASTE`, never retype. Clipboard: top-to-bottom across the whole patch (cross-file moves), persists across edit calls, latest `CUT` wins, and `PASTE` repeats freely. Pasted indentation is verbatim; re-indent via `SWAP`. - NEVER format/restyle code with this tool; run the project formatter. @@ -65,12 +63,10 @@ INS.POST 2: + - nested task ``` -Move `greet` after line 4, copy line 4 to a sibling file — clipboard flows across sections: +Move `greet` to a sibling file — clipboard flows across sections: ``` [greet.py#A1B2] CUT.BLK 1 -PASTE.POST 4 -COPY 4.=4 [other.py#3C4D] PASTE.HEAD ``` @@ -94,7 +90,7 @@ SWAP.BLK 1: -# WRONG — empty `SWAP` to delete. RIGHT: DEL 4 +# WRONG — empty `SWAP` to delete. RIGHT: CUT 4 SWAP 4.=4: # WRONG — range sized to the post-edit content. RIGHT: SWAP 1.=1: (body length irrelevant) diff --git a/packages/hashline/src/recovery.ts b/packages/hashline/src/recovery.ts index a93e7f1ac..239c48695 100644 --- a/packages/hashline/src/recovery.ts +++ b/packages/hashline/src/recovery.ts @@ -17,7 +17,7 @@ export interface RecoveryArgs { currentText: string; fileHash: string; edits: readonly Edit[]; - /** Shared clipboard register for `copy`/`paste` edits, threaded into the replay apply. */ + /** Shared clipboard register for `cut`/`paste` edits, threaded into the replay apply. */ clipboard?: Clipboard; } @@ -43,9 +43,8 @@ function getEditAnchors(edit: Edit): Anchor[] { // Recovery only ever receives already-resolved edits (no `block`); this arm // exists for type-exhaustiveness over the full `Edit` union. if (edit.kind === "block") return [edit.anchor]; - if (edit.kind === "copy") { - // Every line of the captured range is an anchor: capturing a range - // whose interior changed would paste content the author never saw. + if (edit.kind === "cut") { + // Every captured line is an anchor: changed interior content is unsafe. const anchors: Anchor[] = []; for (let line = edit.range.start.line; line <= edit.range.end.line; line++) anchors.push({ line }); return anchors; @@ -222,11 +221,10 @@ function remapEditsToCurrent(previousText: string, currentText: string, edits: r remapped.push({ ...edit, anchor }); continue; } - if (edit.kind === "copy") { - // Map every line of the captured range, not just its endpoints: an - // unmapped interior line means the content drifted and the capture - // would carry text the author never saw. The uniform-offset rule - // below keeps the mapped range contiguous. + if (edit.kind === "cut") { + // Map every captured line; an unmapped interior line means the + // content drifted and cannot be moved safely. Uniform offsets keep + // the mapped range contiguous. const start = mapLine(edit.range.start.line); if (start === null) return null; let end = start; diff --git a/packages/hashline/src/tokenizer.ts b/packages/hashline/src/tokenizer.ts index a0533a8e8..616d7a1e9 100644 --- a/packages/hashline/src/tokenizer.ts +++ b/packages/hashline/src/tokenizer.ts @@ -10,12 +10,8 @@ */ import { describeAnchorExamples, - HL_COPY_BLOCK_KEYWORD, - HL_COPY_KEYWORD, HL_CUT_BLOCK_KEYWORD, HL_CUT_KEYWORD, - HL_DELETE_BLOCK_KEYWORD, - HL_DELETE_KEYWORD, HL_FILE_HASH_LENGTH, HL_FILE_HASH_SEP, HL_FILE_PREFIX, @@ -221,13 +217,11 @@ function scanHeaderRange(line: string, index = 0, end = trimEndIndex(line), allo export type BlockTarget = | { kind: "replace"; range: ParsedRange } | { kind: "block"; anchor: Anchor } - | { kind: "delete"; range: ParsedRange } - | { kind: "delete_block"; anchor: Anchor } | { kind: "insert_before"; anchor: Anchor } | { kind: "insert_after"; anchor: Anchor } | { kind: "insert_after_block"; anchor: Anchor } - | { kind: "copy"; range: ParsedRange; cut: boolean } - | { kind: "copy_block"; anchor: Anchor; cut: boolean } + | { kind: "cut"; range: ParsedRange } + | { kind: "cut_block"; anchor: Anchor } | { kind: "paste"; cursor: Cursor } | { kind: "paste_after_block"; anchor: Anchor } | { kind: "rem" } @@ -393,28 +387,6 @@ function scanHunkAnchor(line: string, start: number, end: number): TargetScan | nextIndex: consumeReplaceColon(line, range.nextIndex, end), }; } - // `delete_block N` — resolve N to a tree-sitter block range at apply time - // and delete its whole span. Like `delete N.=M`, it takes no body and no - // trailing colon. - const deleteBlockEnd = scanKeyword(line, cursor, end, HL_DELETE_BLOCK_KEYWORD); - if (deleteBlockEnd !== null) { - const anchor = scanLineNumber(line, skipWhitespace(line, deleteBlockEnd, end), end); - if (anchor === null) return null; - let next = skipWhitespace(line, anchor.nextIndex, end); - next = skipStrayDot(line, next, end); - if (next < end && line.charCodeAt(next) === CHAR_COLON) return null; - return { target: { kind: "delete_block", anchor: { line: anchor.line } }, nextIndex: next }; - } - // `delete N.=M` — like `delete_block N`, takes no body and no trailing - // colon; a colon here falls through to contamination detection. - const deleteEnd = scanKeyword(line, cursor, end, HL_DELETE_KEYWORD); - if (deleteEnd !== null) { - const range = scanHeaderRange(line, deleteEnd, end, true); - if (range === null) return null; - const next = skipStrayDot(line, range.nextIndex, end); - if (next < end && line.charCodeAt(next) === CHAR_COLON) return null; - return { target: { kind: "delete", range: range.range }, nextIndex: next }; - } // `insert_after_block N:` — insert after the last line of the tree-sitter // block at N. const insertAfterBlockEnd = scanKeyword(line, cursor, end, HL_INSERT_AFTER_BLOCK_KEYWORD); @@ -444,47 +416,26 @@ function scanHunkAnchor(line: string, start: number, end: number): TargetScan | if (scan === null) return null; return { target: { kind: "paste", cursor: scan.cursor }, nextIndex: scan.nextIndex }; } - // `CUT.BLK N` / `COPY.BLK N` — capture the tree-sitter block at N into the - // clipboard (cut also deletes its span). Scanned before the plain forms so - // the `.BLK` suffix is not consumed as a malformed range. + // `CUT.BLK N` captures and deletes the tree-sitter block beginning at N. + // Scan it before the plain form so `.BLK` is not parsed as a range. const cutBlockEnd = scanKeyword(line, cursor, end, HL_CUT_BLOCK_KEYWORD); if (cutBlockEnd !== null) { const anchor = scanLineNumber(line, skipWhitespace(line, cutBlockEnd, end), end); if (anchor === null) return null; return { - target: { kind: "copy_block", anchor: { line: anchor.line }, cut: true }, + target: { kind: "cut_block", anchor: { line: anchor.line } }, nextIndex: consumeOptionalColon(line, anchor.nextIndex, end), }; } - const copyBlockEnd = scanKeyword(line, cursor, end, HL_COPY_BLOCK_KEYWORD); - if (copyBlockEnd !== null) { - const anchor = scanLineNumber(line, skipWhitespace(line, copyBlockEnd, end), end); - if (anchor === null) return null; - return { - target: { kind: "copy_block", anchor: { line: anchor.line }, cut: false }, - nextIndex: consumeOptionalColon(line, anchor.nextIndex, end), - }; - } - // `CUT N.=M` / `COPY N.=M` — capture concrete lines (cut also deletes - // them). A trailing colon is tolerated and ignored; body rows are rejected - // by the parser. + // `CUT N.=M` captures and deletes concrete lines. A trailing colon is + // tolerated and ignored; body rows are rejected by the parser. const cutEnd = scanKeyword(line, cursor, end, HL_CUT_KEYWORD); if (cutEnd !== null) { const range = scanHeaderRange(line, cutEnd, end, true); if (range === null) return null; const next = skipStrayDot(line, range.nextIndex, end); return { - target: { kind: "copy", range: range.range, cut: true }, - nextIndex: consumeOptionalColon(line, next, end), - }; - } - const copyEnd = scanKeyword(line, cursor, end, HL_COPY_KEYWORD); - if (copyEnd !== null) { - const range = scanHeaderRange(line, copyEnd, end, true); - if (range === null) return null; - const next = skipStrayDot(line, range.nextIndex, end); - return { - target: { kind: "copy", range: range.range, cut: false }, + target: { kind: "cut", range: range.range }, nextIndex: consumeOptionalColon(line, next, end), }; } @@ -582,12 +533,10 @@ function classifyLine(line: string, lineNum: number): Token { const lead = skipWhitespace(line, 0); const isHunkLead = line.startsWith(HL_REPLACE_KEYWORD, lead) || - line.startsWith(HL_DELETE_KEYWORD, lead) || line.startsWith(HL_INSERT_KEYWORD, lead) || line.startsWith(HL_REM_KEYWORD, lead) || line.startsWith(HL_MOVE_KEYWORD, lead) || line.startsWith(HL_CUT_KEYWORD, lead) || - line.startsWith(HL_COPY_KEYWORD, lead) || line.startsWith(HL_PASTE_KEYWORD, lead); if (isHunkLead) { const hunk = tryParseHunkHeader(line); diff --git a/packages/hashline/src/types.ts b/packages/hashline/src/types.ts index 8f1f00a98..bf86e99b7 100644 --- a/packages/hashline/src/types.ts +++ b/packages/hashline/src/types.ts @@ -42,17 +42,13 @@ export type Edit = | { kind: "delete"; anchor: Anchor; lineNum: number; index: number; oldAssertion?: string } | { /** - * Clipboard capture (`COPY N.=M` / `CUT N.=M`, or the resolved form of - * `COPY.BLK N` / `CUT.BLK N`). Captures the range's current lines into - * the {@link Clipboard} register during the applier's clipboard - * pre-pass. Emits no text change itself — a `CUT` additionally lowers - * to one `delete` per range line at parse/resolve time, exactly like - * `DEL N.=M`. + * Clipboard cut (`CUT N.=M`, or the resolved form of `CUT.BLK N`). + * Captures the range's current lines into the {@link Clipboard} + * register during the applier's clipboard pre-pass and lowers to one + * `delete` per range line at parse/resolve time. */ - kind: "copy"; + kind: "cut"; range: ParsedRange; - /** True for `CUT` (capture + delete), false for `COPY` (capture only). */ - cut: boolean; lineNum: number; index: number; } @@ -73,23 +69,19 @@ export type Edit = } | { /** - * Deferred block edit (`replace_block N:` / `delete_block N` / - * `insert_after_block N:`). The exact line span is unknown at parse - * time — it is computed by {@link resolveBlockEdits} once file text + - * path (→ language) are available, then expanded into concrete edits: - * a non-empty `payloads` without `mode` (from `replace_block`) becomes - * the same `replacement` inserts + deletes that `replace start.=end:` - * produces; an empty `payloads` (from `delete_block`) becomes a pure - * range deletion; `mode: "insert_after"` becomes plain `after_anchor` - * inserts at the block's last line; `mode: "copy"`/`"cut"` becomes a - * `copy` edit over the resolved span (plus per-line deletes for cut); - * `mode: "paste_after"` becomes a `paste` edit anchored after the - * block's last line. `applyEdits` never sees this variant. + * Deferred block edit (`SWAP.BLK N:`, `INS.BLK.POST N:`, + * `CUT.BLK N`, or `PASTE.BLK.POST N`). The exact line span is + * unknown at parse time; {@link resolveBlockEdits} computes it once + * file text and language are available, then expands it into + * concrete edits. `mode: "insert_after"` becomes plain + * `after_anchor` inserts, `"cut"` becomes a clipboard cut plus + * per-line deletes, and `"paste_after"` becomes a paste after the + * resolved block. No mode denotes a block replacement. */ kind: "block"; anchor: Anchor; payloads: string[]; - mode?: "insert_after" | "copy" | "cut" | "paste_after"; + mode?: "insert_after" | "cut" | "paste_after"; lineNum: number; index: number; }; @@ -106,10 +98,9 @@ export interface ApplyResult { /** Diagnostic warnings collected by the parser, patcher, or recovery. */ warnings?: string[]; /** - * Resolved spans for each `replace_block`/`delete_block` op in this apply, - * in patch order. Present only when the apply matched the tagged content - * (the common no-drift path), so the line numbers line up with what the - * caller read. Absent when there were no block ops. + * Resolved spans for each block op in this apply, in patch order. Present + * only when the apply matched the tagged content, so the line numbers match + * what the caller read. Absent when there were no block ops. */ blockResolutions?: BlockResolution[]; } @@ -157,9 +148,7 @@ export interface CompactDiffOptions { maxUnchangedRun?: number; } -/** - * Resolved 1-indexed inclusive line span of a `replace_block N:` target. - */ +/** Resolved 1-indexed inclusive line span of a block target. */ export interface BlockSpan { /** First line of the block (1-indexed, inclusive). */ start: number; @@ -168,11 +157,9 @@ export interface BlockSpan { } /** - * One `replace_block N:` / `delete_block N` / `insert_after_block N:` anchor - * resolved to its concrete line span. Surfaced on {@link ApplyResult} so the - * host can echo "block N → lines start.=end" and let the model catch a wrong - * opener — e.g. a decorator or doc-comment that sits in a separate node - * outside the resolved block. + * One block-op anchor resolved to its concrete line span. Surfaced on + * {@link ApplyResult} so the host can echo the resolved range and let the + * model catch an anchor on the wrong opener. */ export interface BlockResolution { /** The 1-indexed line the block op was anchored on (the `N`). */ @@ -182,10 +169,10 @@ export interface BlockResolution { /** Last line of the resolved span (1-indexed, inclusive). */ end: number; /** Which block op produced this resolution. */ - op: "replace" | "delete" | "insert_after" | "copy" | "cut" | "paste_after"; + op: "replace" | "insert_after" | "cut" | "paste_after"; } -/** Request handed to a {@link BlockResolver} to resolve one `replace_block N:` anchor. */ +/** Request handed to a {@link BlockResolver} to resolve one block-op anchor. */ export interface BlockResolverRequest { /** Target file path (used to infer language by extension). */ path: string; @@ -196,29 +183,20 @@ export interface BlockResolverRequest { } /** - * Resolves a `replace_block N:` anchor to the line span of the syntactic block - * that begins on line N. Returns `null` when no block can be resolved - * (unrecognized language, blank/out-of-range line, no node begins there, or the - * resolved subtree has a syntax error). Pure seam: the hashline core declares - * the contract; the host injects a tree-sitter-backed implementation. + * Resolves a block-op anchor to the line span of the syntactic block beginning + * on that line. Returns `null` for an unsupported language, invalid line, absent + * opener, or syntax error. The host injects the tree-sitter-backed implementation. */ export type BlockResolver = (request: BlockResolverRequest) => BlockSpan | null; /** * Mutable clipboard register threaded through one patch application. Filled - * by `CUT`/`COPY` edits, read by `PASTE` edits, in patch source order — - * across sections, so content can move between files. Create one per batch - * (`{}`) and hand it to every {@link Patcher.prepare} / `applyTo` call in - * that batch; callers that omit it get a private per-call register. + * by `CUT` edits and read by `PASTE` edits in patch source order, across + * sections, so content can move between files. Create one per batch (`{}`) + * and hand it to every {@link Patcher.prepare} / `applyTo` call in that batch; + * callers that omit it get a private per-call register. */ export interface Clipboard { - /** Lines captured by the most recent `CUT`/`COPY`, or unset. */ + /** Lines captured by the most recent `CUT`, or unset. */ lines?: readonly string[]; - /** - * Human-readable form of the `CUT` that filled the register (e.g. - * `CUT 5.=10`), cleared by the first `PASTE`. A register that still has a - * pending cut at batch end (or when overwritten) is an authoring error: - * lines were deleted but never landed anywhere. - */ - pendingCut?: string; } diff --git a/packages/hashline/test/block.test.ts b/packages/hashline/test/block.test.ts index 7da7fa5ed..8d988322f 100644 --- a/packages/hashline/test/block.test.ts +++ b/packages/hashline/test/block.test.ts @@ -140,19 +140,19 @@ describe("resolveBlockEdits", () => { expect(error?.message).not.toContain("\n\n"); }); - it("fires onResolved with the resolved span for replace and delete blocks", () => { + it("fires onResolved with the resolved span for replace and cut blocks", () => { const seen: BlockResolution[] = []; // stubResolver maps line N → span [N, N+1]. resolveBlockEdits(parsePatch("SWAP.BLK 2:\n+A\n+B").edits, "ignored", PATH, stubResolver, { onResolved: resolution => seen.push(resolution), }); - resolveBlockEdits(parsePatch("DEL.BLK 5").edits, "ignored", PATH, stubResolver, { + resolveBlockEdits(parsePatch("CUT.BLK 5").edits, "ignored", PATH, stubResolver, { onResolved: resolution => seen.push(resolution), }); expect(seen).toEqual([ { anchorLine: 2, start: 2, end: 3, op: "replace" }, - { anchorLine: 5, start: 5, end: 6, op: "delete" }, + { anchorLine: 5, start: 5, end: 6, op: "cut" }, ]); }); @@ -305,11 +305,11 @@ describe("Patcher with a block resolver", () => { }); }); -describe("DEL.BLK", () => { +describe("CUT.BLK", () => { const text = "function x() {\n if (y) {\n }\n}\n"; - it("parses `DEL.BLK N` into a block edit with no payloads", () => { - const { edits } = parsePatch("DEL.BLK 2"); + it("parses `CUT.BLK N` into a cut block edit", () => { + const { edits } = parsePatch("CUT.BLK 2"); expect(edits).toHaveLength(1); const edit = edits[0]; @@ -317,38 +317,38 @@ describe("DEL.BLK", () => { if (edit?.kind !== "block") throw new Error("expected a block edit"); expect(edit.anchor.line).toBe(2); expect(edit.payloads).toEqual([]); + expect(edit.mode).toBe("cut"); }); - it("rejects body rows under `DEL.BLK N`", () => { - expect(() => parsePatch("DEL.BLK 2\n+X")).toThrow("`DEL.BLK N` does not take body rows"); + it("rejects body rows under `CUT.BLK N`", () => { + expect(() => parsePatch("CUT.BLK 2\n+X")).toThrow("`CUT N.=M` captures + deletes lines"); }); - it("resolveBlockEdits expands a delete-block edit into pure deletes", () => { - const edits = parsePatch("DEL.BLK 2").edits; - const resolved = resolveBlockEdits(edits, "ignored", PATH, stubResolver); + it("resolveBlockEdits expands a cut block into capture and deletes", () => { + const resolved = resolveBlockEdits(parsePatch("CUT.BLK 2").edits, "ignored", PATH, stubResolver); - expect(resolved.every(edit => edit.kind === "delete")).toBe(true); - expect(resolved.map(edit => (edit.kind === "delete" ? edit.anchor.line : -1))).toEqual([2, 3]); + expect(resolved.map(edit => edit.kind)).toEqual(["cut", "delete", "delete"]); + expect(resolved.flatMap(edit => (edit.kind === "delete" ? [edit.anchor.line] : []))).toEqual([2, 3]); }); it("applyTo deletes the resolved block span", () => { - const section = Patch.parseSingle(`[${PATH}#1A2B]\nDEL.BLK 2`); + const section = Patch.parseSingle(`[${PATH}#1A2B]\nCUT.BLK 2`); // stub span [2,3] → drop " if (y) {" and " }". expect(section.applyTo(text, stubResolver).text).toBe("function x() {\n}\n"); }); - it("applyPartialTo drops an unresolvable delete-block edit instead of throwing", () => { - const section = Patch.parseSingle(`[${PATH}#1A2B]\nDEL.BLK 2`); + it("applyPartialTo drops an unresolvable cut-block edit", () => { + const section = Patch.parseSingle(`[${PATH}#1A2B]\nCUT.BLK 2`); expect(section.applyPartialTo(text).text).toBe(text); }); - it("Patcher applies a delete-block edit on the hash-match path", async () => { + it("Patcher applies a cut-block edit on the hash-match path", async () => { const fs = new InMemoryFilesystem([[PATH, text]]); const snapshots = new InMemorySnapshotStore(); const tag = snapshots.record(PATH, text); const patcher = new Patcher({ fs, snapshots, blockResolver: stubResolver }); - const result = await patcher.apply(Patch.parse(`[${PATH}#${tag}]\nDEL.BLK 2`)); + const result = await patcher.apply(Patch.parse(`[${PATH}#${tag}]\nCUT.BLK 2`)); expect(result.sections[0]?.op).toBe("update"); expect(fs.get(PATH)).toBe("function x() {\n}\n"); diff --git a/packages/hashline/test/boundary-repair.test.ts b/packages/hashline/test/boundary-repair.test.ts index 6c53e9a06..f5d043203 100644 --- a/packages/hashline/test/boundary-repair.test.ts +++ b/packages/hashline/test/boundary-repair.test.ts @@ -400,11 +400,11 @@ describe("boundary-balance repair", () => { expect(warnings.filter(warning => /structural closing line/.test(warning))).toHaveLength(1); }); // #3142: the range's deleted `}` is matched by an opener another hunk deletes - // (`DEL 1`). The patch nets to balanced, so the closer must stay deleted — + // (`CUT 1`). The patch nets to balanced, so the closer must stay deleted — // the per-group repair wrongly kept it, leaving a stray `}`. it("does not keep a deleted closer when another hunk removes its opener (#3142)", () => { const file = ["if enabled {", '\tText("Old")', "}", '\tText("Tail")'].join("\n"); - const diff = ["DEL 1", "SWAP 2.=3:", '+Text("New")'].join("\n"); + const diff = ["CUT 1", "SWAP 2.=3:", '+Text("New")'].join("\n"); const { text, warnings } = apply(file, diff); expect(text).toBe(['Text("New")', '\tText("Tail")'].join("\n")); expect(warnings.filter(warning => /structural closing line/.test(warning))).toHaveLength(0); @@ -414,7 +414,7 @@ describe("boundary-balance repair", () => { // residual must be spent on the genuine hunk, not the wrapper-removed one. it("spends the missing-closer residual on the genuine hunk, not an earlier wrapper removal", () => { const file = ["if enabled {", '\tText("Old")', "}", "const config = {", "\ta: 1,", "};"].join("\n"); - const diff = ["DEL 1", "SWAP 2.=3:", '+Text("New")', "SWAP 6.=6:", "+\tb: 2,"].join("\n"); + const diff = ["CUT 1", "SWAP 2.=3:", '+Text("New")', "SWAP 6.=6:", "+\tb: 2,"].join("\n"); const { text, warnings } = apply(file, diff); expect(text).toBe(['Text("New")', "const config = {", "\ta: 1,", "\tb: 2,", "};"].join("\n")); expect(warnings.filter(warning => /structural closing line/.test(warning))).toHaveLength(1); @@ -470,7 +470,7 @@ describe("boundary-balance repair", () => { it("ignores non-contiguously deleted openers when choosing which closer to keep", () => { const file = ["if (a) {", "\told();", "\tmore();", "}", "const obj = {", "\ta: 1,", "};"].join("\n"); - const diff = ["DEL 1", "SWAP 3.=4:", "+\tnew();", "SWAP 7.=7:", "+\tb: 2,"].join("\n"); + const diff = ["CUT 1", "SWAP 3.=4:", "+\tnew();", "SWAP 7.=7:", "+\tb: 2,"].join("\n"); const { text, warnings } = apply(file, diff); expect(text).toBe(["\told();", "\tnew();", "const obj = {", "\ta: 1,", "\tb: 2,", "};"].join("\n")); expect(warnings.filter(warning => /structural closing line/.test(warning))).toHaveLength(1); diff --git a/packages/hashline/test/clipboard.test.ts b/packages/hashline/test/clipboard.test.ts index 2fce15816..9e84d4e1f 100644 --- a/packages/hashline/test/clipboard.test.ts +++ b/packages/hashline/test/clipboard.test.ts @@ -33,18 +33,14 @@ function taggedPatcher(files: Array<[string, string]>): { } describe("clipboard parsing", () => { - it("lowers `CUT N.=M` to a capture plus per-line deletes, `COPY N.=M` to a capture only", () => { + it("lowers `CUT N.=M` to a capture plus per-line deletes", () => { const cut = parsePatch("CUT 2.=3").edits; - expect(cut.map(edit => edit.kind)).toEqual(["copy", "delete", "delete"]); - expect(cut[0]).toMatchObject({ kind: "copy", cut: true, range: { start: { line: 2 }, end: { line: 3 } } }); - - const copy = parsePatch("COPY 2.=3").edits; - expect(copy.map(edit => edit.kind)).toEqual(["copy"]); - expect(copy[0]).toMatchObject({ kind: "copy", cut: false }); + expect(cut.map(edit => edit.kind)).toEqual(["cut", "delete", "delete"]); + expect(cut[0]).toMatchObject({ kind: "cut", range: { start: { line: 2 }, end: { line: 3 } } }); }); it("parses every PASTE position, tolerating a trailing colon", () => { - const cursors = parsePatch("COPY 1\nPASTE.PRE 2\nPASTE.POST 3:\nPASTE.HEAD\nPASTE.TAIL:").edits.flatMap(edit => + const cursors = parsePatch("CUT 1\nPASTE.PRE 2\nPASTE.POST 3:\nPASTE.HEAD\nPASTE.TAIL:").edits.flatMap(edit => edit.kind === "paste" ? [edit.cursor] : [], ); expect(cursors).toEqual([ @@ -56,26 +52,25 @@ describe("clipboard parsing", () => { }); it("rejects bare `PASTE` without a position", () => { - expect(() => parsePatch("COPY 1\nPASTE")).toThrow(/`PASTE` needs a position/); + expect(() => parsePatch("PASTE")).toThrow(/`PASTE` needs a position/); }); it("rejects body rows under clipboard ops", () => { expect(() => parsePatch("CUT 1.=2\n+x")).toThrow(/`CUT N.=M` captures \+ deletes/); - expect(() => parsePatch("COPY 1.=2\n+x")).toThrow(/`COPY N.=M` captures lines/); - expect(() => parsePatch("COPY 1\nPASTE.POST 1\n+x")).toThrow(/`PASTE` inserts the clipboard content/); + expect(() => parsePatch("CUT 1\nPASTE.POST 1\n+x")).toThrow(/`PASTE` inserts the clipboard content/); }); it("rejects a CUT range overlapping another hunk's range", () => { expect(() => parsePatch("CUT 2.=4\nSWAP 3.=3:\n+x")).toThrow(/already targeted by another hunk/); }); - it("reports inverted CUT/COPY ranges with op-specific retry forms", () => { + it("reports inverted CUT ranges with op-specific retry forms", () => { expect(() => parsePatch("CUT 5.=2")).toThrow(/`CUT 5`.*`CUT 5.=6`/); }); it("flushes a trailing bodyless clipboard op in streaming mode", () => { - const { edits } = parsePatchStreaming("COPY 1\nPASTE.TAIL"); - expect(edits.map(edit => edit.kind)).toEqual(["copy", "paste"]); + const { edits } = parsePatchStreaming("CUT 1\nPASTE.TAIL"); + expect(edits.map(edit => edit.kind)).toEqual(["cut", "delete", "paste"]); }); }); @@ -85,9 +80,9 @@ describe("clipboard apply semantics", () => { expect(section.applyTo("l1\nl2\nl3\nl4\nl5\n").text).toBe("l1\nl4\nl5\nl2\nl3\n"); }); - it("duplicates COPY content to several places; PASTE does not consume", () => { - const section = Patch.parseSingle(`[${PATH}#1A2B]\nCOPY 2.=2\nPASTE.HEAD\nPASTE.TAIL`); - expect(section.applyTo("l1\nl2\nl3\n").text).toBe("l2\nl1\nl2\nl3\nl2\n"); + it("repeats CUT content without consuming the clipboard", () => { + const section = Patch.parseSingle(`[${PATH}#1A2B]\nCUT 2.=2\nPASTE.HEAD\nPASTE.TAIL`); + expect(section.applyTo("l1\nl2\nl3\n").text).toBe("l2\nl1\nl3\nl2\n"); }); it("swaps two regions with sequential CUT/PASTE pairs on original coordinates", () => { @@ -105,18 +100,18 @@ describe("clipboard apply semantics", () => { expect(section.applyPartialTo("l1\nl2\n").text).toBe("l1\nl2\n"); }); - it("rejects a CUT that is never pasted when the call owns the register", () => { + it("allows a CUT without a following PASTE", () => { const section = Patch.parseSingle(`[${PATH}#1A2B]\nCUT 2.=2`); - expect(() => section.applyTo("l1\nl2\nl3\n")).toThrow(/never pasted/); + expect(section.applyTo("l1\nl2\nl3\n").text).toBe("l1\nl3\n"); }); - it("rejects capturing over un-pasted CUT content", () => { + it("allows consecutive CUTs and pastes the latest capture", () => { const section = Patch.parseSingle(`[${PATH}#1A2B]\nCUT 1.=1\nCUT 3.=3\nPASTE.TAIL`); - expect(() => section.applyTo("l1\nl2\nl3\n")).toThrow(/still holds `CUT 1` content/); + expect(section.applyTo("l1\nl2\nl3\n").text).toBe("l2\nl3\n"); }); it("rejects an out-of-range capture", () => { - const section = Patch.parseSingle(`[${PATH}#1A2B]\nCOPY 8.=9\nPASTE.HEAD`); + const section = Patch.parseSingle(`[${PATH}#1A2B]\nCUT 8.=9\nPASTE.HEAD`); expect(() => section.applyTo("l1\nl2\n")).toThrow(/out of range \(file has 3 lines\)/); }); @@ -133,8 +128,8 @@ describe("clipboard block ops", () => { it("expands CUT.BLK to a span capture plus per-line deletes", () => { const edits = parsePatch("CUT.BLK 2\nPASTE.TAIL").edits; const resolved = resolveBlockEdits(edits, "l1\nl2\nl3\nl4", PATH, stubResolver); - expect(resolved.map(edit => edit.kind)).toEqual(["copy", "delete", "delete", "paste"]); - expect(resolved[0]).toMatchObject({ kind: "copy", cut: true, range: { start: { line: 2 }, end: { line: 3 } } }); + expect(resolved.map(edit => edit.kind)).toEqual(["cut", "delete", "delete", "paste"]); + expect(resolved[0]).toMatchObject({ kind: "cut", range: { start: { line: 2 }, end: { line: 3 } } }); }); it("moves a block after another block via PASTE.BLK.POST", () => { @@ -145,10 +140,10 @@ describe("clipboard block ops", () => { it("echoes clipboard block resolutions with their op", () => { const seen: string[] = []; - resolveBlockEdits(parsePatch("COPY.BLK 2\nPASTE.TAIL").edits, "l1\nl2\nl3", PATH, stubResolver, { + resolveBlockEdits(parsePatch("CUT.BLK 2\nPASTE.TAIL").edits, "l1\nl2\nl3", PATH, stubResolver, { onResolved: resolution => seen.push(resolution.op), }); - expect(seen).toEqual(["copy"]); + expect(seen).toEqual(["cut"]); }); it("rejects a single-line CUT.BLK resolution with the plain-op retry", () => { @@ -159,10 +154,10 @@ describe("clipboard block ops", () => { it("lowers an unresolvable PASTE.BLK.POST to a plain paste with a warning", () => { const warnings: string[] = []; - const resolved = resolveBlockEdits(parsePatch("COPY 1\nPASTE.BLK.POST 2").edits, "a\nb\nc", PATH, () => null, { + const resolved = resolveBlockEdits(parsePatch("CUT 1\nPASTE.BLK.POST 2").edits, "a\nb\nc", PATH, () => null, { onWarning: warning => warnings.push(warning), }); - expect(resolved.map(edit => edit.kind)).toEqual(["copy", "paste"]); + expect(resolved.map(edit => edit.kind)).toEqual(["cut", "delete", "paste"]); expect(warnings.some(warning => warning.includes("`PASTE.BLK.POST 2`"))).toBe(true); }); }); @@ -183,48 +178,16 @@ describe("clipboard across sections and batches", () => { expect(fs.get("b.ts")).toBe("b1\nmove1\nmove2\n"); }); - it("allows a copy-only section to be a no-op clipboard source", async () => { - const a = "shared\n"; - const b = "b1\n"; - const { fs, patcher, tags } = taggedPatcher([ - ["a.ts", a], - ["b.ts", b], - ]); - const result = await patcher.apply( - Patch.parse(`[a.ts#${tags.get("a.ts")}]\nCOPY 1.=1\n[b.ts#${tags.get("b.ts")}]\nPASTE.HEAD`), - ); - - expect(result.sections[0]?.op).toBe("noop"); - expect(fs.get("a.ts")).toBe(a); - expect(fs.get("b.ts")).toBe("shared\nb1\n"); - }); - - it("still rejects a no-op section that mixes COPY with mutating edits", async () => { - const a = "l1\nl2\n"; - const b = "b1\n"; - const { patcher, tags } = taggedPatcher([ - ["a.ts", a], - ["b.ts", b], - ]); - - // The SWAP restates the existing line, so the section changes nothing; - // the COPY beside it must not shield it from the no-change guard. - const patch = Patch.parse( - `[a.ts#${tags.get("a.ts")}]\nCOPY 1.=1\nSWAP 2.=2:\n+l2\n[b.ts#${tags.get("b.ts")}]\nPASTE.TAIL`, - ); - await expect(patcher.apply(patch)).rejects.toThrow(/no changes/); - }); - - it("rejects the whole batch when a batch-local CUT is never pasted", async () => { + it("applies a batch-local CUT without requiring PASTE", async () => { const a = "l1\nl2\n"; const { fs, patcher, tags } = taggedPatcher([["a.ts", a]]); - await expect(patcher.apply(Patch.parse(`[a.ts#${tags.get("a.ts")}]\nCUT 1.=1`))).rejects.toThrow(/never pasted/); - expect(fs.get("a.ts")).toBe(a); + await patcher.apply(Patch.parse(`[a.ts#${tags.get("a.ts")}]\nCUT 1.=1`)); + expect(fs.get("a.ts")).toBe("l2\n"); }); - it("persists a host-owned register across apply calls with a carry-forward warning", async () => { + it("persists a host-owned register across apply calls", async () => { const a = "l1\nl2\n"; const b = "b1\n"; const fs = new InMemoryFilesystem([ @@ -239,12 +202,12 @@ describe("clipboard across sections and batches", () => { const first = await patcher.apply(Patch.parse(`[a.ts#${tagA}]\nCUT 1.=1`)); expect(fs.get("a.ts")).toBe("l2\n"); - expect(first.sections[0]?.warnings.some(warning => warning.includes("in the clipboard"))).toBe(true); - expect(clipboard).toMatchObject({ lines: ["l1"], pendingCut: "CUT 1" }); + expect(first.sections[0]?.warnings).toEqual([]); + expect(clipboard).toEqual({ lines: ["l1"] }); await patcher.apply(Patch.parse(`[b.ts#${tagB}]\nPASTE.TAIL`)); expect(fs.get("b.ts")).toBe("b1\nl1\n"); - expect(clipboard.pendingCut).toBeUndefined(); + expect(clipboard).toEqual({ lines: ["l1"] }); }); it("does not publish register changes from a failed batch", async () => { @@ -266,7 +229,6 @@ describe("clipboard across sections and batches", () => { expect(fs.get("a.ts")).toBe(a); expect(clipboard.lines).toBeUndefined(); - expect(clipboard.pendingCut).toBeUndefined(); }); it("recovers clipboard anchors when the file drifted by a uniform offset", async () => { @@ -289,9 +251,11 @@ describe("clipboard across sections and batches", () => { }); it("still merges interleaved same-path sections without clipboard ops", () => { - const patch = Patch.parse(`[a.ts#1A2B]\nDEL 1\n[b.ts#3C4D]\nDEL 1\n[a.ts#1A2B]\nDEL 3`); + const patch = Patch.parse( + `[a.ts#1A2B]\nSWAP 1.=1:\n+a1\n[b.ts#3C4D]\nSWAP 1.=1:\n+b1\n[a.ts#1A2B]\nSWAP 3.=3:\n+a3`, + ); expect(patch.sections).toHaveLength(2); - expect(patch.sections[0]?.edits.map(edit => edit.kind)).toEqual(["delete", "delete"]); + expect(patch.sections[0]?.edits.map(edit => edit.kind)).toEqual(["insert", "delete", "insert", "delete"]); }); it("surfaces a targeted sequencing error instead of a mismatch on the drift path", async () => { diff --git a/packages/hashline/test/core-contracts.test.ts b/packages/hashline/test/core-contracts.test.ts index 2d44ae747..12b92bd48 100644 --- a/packages/hashline/test/core-contracts.test.ts +++ b/packages/hashline/test/core-contracts.test.ts @@ -93,7 +93,7 @@ describe("hashline parser — range-anchor contracts", () => { expect(section.applyTo("aaa\nbbb\nccc").text).toBe("aaa\nbbb\ntail\nccc"); }); - it("applies replace/delete/insert operations against concrete anchors", () => { + it("applies replace/cut/insert operations against concrete anchors", () => { const diff = [ `INS.PRE ${tag(2)}:`, repl("before b"), @@ -105,8 +105,8 @@ describe("hashline parser — range-anchor contracts", () => { repl("tail"), ].join("\n"); expect(applyDiff(content, diff)).toBe("top\naaa\nbefore b\nbbb\nafter b\nccc\ntail"); - expect(applyDiff(content, `DEL ${tag(2)}`)).toBe("aaa\nccc"); - expect(applyDiff(content, `DEL ${tag(2)}..${tag(3)}`)).toBe("aaa"); + expect(applyDiff(content, `CUT ${tag(2)}`)).toBe("aaa\nccc"); + expect(applyDiff(content, `CUT ${tag(2)}..${tag(3)}`)).toBe("aaa"); expect(applyDiff(content, `${sameLineRange(tag(2))}\n${repl("BBB")}`)).toBe("aaa\nBBB\nccc"); }); @@ -283,10 +283,10 @@ describe("hashline abort sentinel", () => { }); }); -describe("hashline parser — delete and blank payload semantics", () => { - it("applies inline delete and empty replace operations", () => { - expect(applyDiff("line1\nline2\nline3\n", splitHashlineInput("[a.ts]\nDEL 2\n").diff)).toBe("line1\nline3\n"); - expect(applyDiff("line1\nline2\nline3\nline4\n", splitHashlineInput("[a.ts]\nDEL 2.=3\n").diff)).toBe( +describe("hashline parser — cut and blank payload semantics", () => { + it("applies inline cut and empty replace operations", () => { + expect(applyDiff("line1\nline2\nline3\n", splitHashlineInput("[a.ts]\nCUT 2\n").diff)).toBe("line1\nline3\n"); + expect(applyDiff("line1\nline2\nline3\nline4\n", splitHashlineInput("[a.ts]\nCUT 2.=3\n").diff)).toBe( "line1\nline4\n", ); expect(applyDiff("line1\nline2\nline3\n", splitHashlineInput("[a.ts]\nSWAP 2.=2:\n").diff)).toBe( diff --git a/packages/hashline/test/format-v2.test.ts b/packages/hashline/test/format-v2.test.ts index 672b247fe..a2647daa2 100644 --- a/packages/hashline/test/format-v2.test.ts +++ b/packages/hashline/test/format-v2.test.ts @@ -15,17 +15,17 @@ describe("hashline format v4", () => { it("deletes a single source line", () => { const text = "a\nb\nc"; - expect(applyPatch(text, "DEL 2")).toBe("a\nc"); + expect(applyPatch(text, "CUT 2")).toBe("a\nc"); }); it("deletes a concrete range", () => { const text = "a\nb\nc\nd"; - expect(applyPatch(text, "DEL 2.=3")).toBe("a\nd"); + expect(applyPatch(text, "CUT 2.=3")).toBe("a\nd"); }); it("accepts a single dot between integer range endpoints", () => { const text = "a\nb\nc\nd"; - expect(applyPatch(text, "DEL 2.3")).toBe("a\nd"); + expect(applyPatch(text, "CUT 2.3")).toBe("a\nd"); expect(applyPatch(text, "SWAP 2.3:\n+middle")).toBe("a\nmiddle\nd"); }); @@ -47,8 +47,13 @@ describe("hashline format v4", () => { expect(() => parsePatch("INS.HEAD:")).toThrow(/needs at least one/); }); - it("rejects body rows under delete", () => { - expect(() => parsePatch("DEL 2\n+replacement")).toThrow(/does not take body rows/); + it("rejects body rows under cut", () => { + expect(() => parsePatch("CUT 2\n+replacement")).toThrow(/takes no body rows/); + }); + + it("does not recognize removed DEL or COPY headers", () => { + expect(() => parsePatch("DEL 2")).toThrow(/payload line has no preceding hunk header/); + expect(() => parsePatch("COPY 2")).toThrow(/payload line has no preceding hunk header/); }); it("auto-pipes bare body rows as literal text", () => { @@ -85,14 +90,14 @@ describe("hashline format v4", () => { ); }); - it("ignores deleting the trailing blank sentinel of a newline-terminated file", () => { + it("ignores cutting the trailing blank sentinel of a newline-terminated file", () => { // "a\nb\n" splits into ["a", "b", ""]; line 3 is the phantom sentinel. - const edits = parsePatch("DEL 3").edits; + const edits = parsePatch("CUT 3").edits; expect(applyEdits("a\nb\n", edits).text).toBe("a\nb\n"); }); - it("treats a delete range ending at the trailing sentinel as ending at the last real line", () => { - const edits = parsePatch("DEL 2.=3").edits; + it("treats a cut range ending at the trailing sentinel as ending at the last real line", () => { + const edits = parsePatch("CUT 2.=3").edits; expect(applyEdits("a\nb\n", edits).text).toBe("a\n"); }); @@ -106,9 +111,9 @@ describe("hashline format v4", () => { expect(applyEdits("a\nb\n", edits).text).toBe("a\nb\n\ntail"); }); - it("still deletes a genuine empty last line of a non-newline-terminated file", () => { + it("still cuts a genuine last line of a non-newline-terminated file", () => { // "a\nb" has no sentinel; line 2 is real content. - const edits = parsePatch("DEL 2").edits; + const edits = parsePatch("CUT 2").edits; expect(applyEdits("a\nb", edits).text).toBe("a"); }); diff --git a/packages/hashline/test/landing-shift.test.ts b/packages/hashline/test/landing-shift.test.ts index 1b41ddc09..99e0fcac0 100644 --- a/packages/hashline/test/landing-shift.test.ts +++ b/packages/hashline/test/landing-shift.test.ts @@ -85,8 +85,8 @@ describe("after-insert landing shift", () => { }); it("refuses to cross a line targeted by another hunk", () => { - const { text, warnings } = apply(FILE, "INS.POST 3:\n+ c();\nDEL 4"); - // The closer on line 4 is owned by the delete; the insert stays put. + const { text, warnings } = apply(FILE, "INS.POST 3:\n+ c();\nCUT 4"); + // The closer on line 4 is owned by the cut; the insert stays put. expect(text).toBe(["function f() {", " if (x) {", " a();", " c();", " b();", "}", ""].join("\n")); expect(warnings).toHaveLength(0); }); diff --git a/packages/hashline/test/leniency.test.ts b/packages/hashline/test/leniency.test.ts index 2138a2ce9..3f009fa9b 100644 --- a/packages/hashline/test/leniency.test.ts +++ b/packages/hashline/test/leniency.test.ts @@ -48,7 +48,7 @@ describe("hashline section headers", () => { it("reports bracket syntax with a 4-hex example when the header is missing", () => { try { - Patch.parse("DEL 38.=40"); + Patch.parse("CUT 38.=40"); throw new Error("expected missing-header error"); } catch (error) { const message = error instanceof Error ? error.message : String(error); @@ -68,18 +68,18 @@ describe("hashline core — verb header forms", () => { expect(() => parsePatch("2 3\n+X")).toThrow(/Hunk headers need a verb/); }); - it("accepts canonical replace/delete/insert forms", () => { + it("accepts canonical replace/cut/insert forms", () => { expect(applyPatch(FILE, "SWAP 2.=3:\n+X")).toBe("a\nX\nd\ne"); - expect(applyPatch(FILE, "DEL 2.=3")).toBe("a\nd\ne"); + expect(applyPatch(FILE, "CUT 2.=3")).toBe("a\nd\ne"); expect(applyPatch(FILE, "INS.PRE 2:\n+X")).toBe("a\nX\nb\nc\nd\ne"); expect(applyPatch(FILE, "INS.POST 2:\n+X")).toBe("a\nb\nX\nc\nd\ne"); expect(applyPatch(FILE, "INS.HEAD:\n+X")).toBe("X\na\nb\nc\nd\ne"); expect(applyPatch(FILE, "INS.TAIL:\n+X")).toBe("a\nb\nc\nd\ne\nX"); }); - it("accepts single-number replace and delete shorthand", () => { + it("accepts single-number replace and cut shorthand", () => { expect(applyPatch(FILE, "SWAP 2:\n+X")).toBe("a\nX\nc\nd\ne"); - expect(applyPatch(FILE, "DEL 2")).toBe("a\nc\nd\ne"); + expect(applyPatch(FILE, "CUT 2")).toBe("a\nc\nd\ne"); }); it("accepts alternate replace range separators and missing colon", () => { @@ -103,8 +103,8 @@ describe("hashline core — verb header forms", () => { // `INS.POST 2.:` instead of `INS.POST 2:` expect(applyPatch(FILE, "INS.POST 2.:\n+X")).toBe("a\nb\nX\nc\nd\ne"); expect(applyPatch(FILE, "INS.PRE 2.:\n+X")).toBe("a\nX\nb\nc\nd\ne"); - // `DEL 2.=3.` instead of `DEL 2.=3` (stray dot, no colon) - expect(applyPatch(FILE, "DEL 2.=3.")).toBe("a\nd\ne"); + // `CUT 2.=3.` instead of `CUT 2.=3` + expect(applyPatch(FILE, "CUT 2.=3.")).toBe("a\nd\ne"); // `INS.HEAD.:` and `INS.TAIL.:` with stray dot expect(applyPatch(FILE, "INS.HEAD.:\n+X")).toBe("X\na\nb\nc\nd\ne"); expect(applyPatch(FILE, "INS.TAIL.:\n+X")).toBe("a\nb\nc\nd\ne\nX"); @@ -202,12 +202,8 @@ describe("hashline body contracts", () => { expect(() => parsePatch("INS.TAIL:")).toThrow(/`INS` needs/); }); - it("rejects delete with a body", () => { - expect(() => parsePatch("DEL 2\n+X")).toThrow(/does not take body rows/); - }); - - it("rejects delete with a colon", () => { - expect(() => parsePatch("DEL 2:\n+X")).toThrow(/has no colon/); + it("rejects cut with a body", () => { + expect(() => parsePatch("CUT 2\n+X")).toThrow(/takes no body rows/); }); }); diff --git a/packages/hashline/test/patcher.test.ts b/packages/hashline/test/patcher.test.ts index 10436845b..4d9c6d3b3 100644 --- a/packages/hashline/test/patcher.test.ts +++ b/packages/hashline/test/patcher.test.ts @@ -337,7 +337,7 @@ describe("Patcher seen-line provenance", () => { const patcher = new Patcher({ fs, snapshots }); // Anchor 60 unseen lines — over the 40-line inline reveal cap. - const dels = Array.from({ length: 60 }, (_, i) => `DEL ${100 + i}`).join("\n"); + const dels = Array.from({ length: 60 }, (_, i) => `CUT ${100 + i}`).join("\n"); let message: string | undefined; try { await patcher.apply(Patch.parse(`[${PATH}#${tag}]\n${dels}`)); diff --git a/packages/metaharness/adapters/edit/runner.ts b/packages/metaharness/adapters/edit/runner.ts index 397c55caf..ef7e962ed 100644 --- a/packages/metaharness/adapters/edit/runner.ts +++ b/packages/metaharness/adapters/edit/runner.ts @@ -288,10 +288,6 @@ function hashlineOpLabel(target: HashlineBlockTarget): string { return "SWAP"; case "block": return "SWAP.BLK"; - case "delete": - return "DEL"; - case "delete_block": - return "DEL.BLK"; case "insert_before": return "INS.PRE"; case "insert_after": @@ -302,10 +298,10 @@ function hashlineOpLabel(target: HashlineBlockTarget): string { return "INS.TAIL"; case "insert_after_block": return "INS.BLK.POST"; - case "copy": - return target.cut ? "CUT" : "COPY"; - case "copy_block": - return target.cut ? "CUT.BLK" : "COPY.BLK"; + case "cut": + return "CUT"; + case "cut_block": + return "CUT.BLK"; case "paste": switch (target.cursor.kind) { case "before_anchor": @@ -317,7 +313,6 @@ function hashlineOpLabel(target: HashlineBlockTarget): string { case "eof": return "PASTE.TAIL"; } - break; case "paste_after_block": return "PASTE.BLK.POST"; case "rem": @@ -328,7 +323,7 @@ function hashlineOpLabel(target: HashlineBlockTarget): string { } /** - * Count hashline op headers (`SWAP`, `DEL.BLK`, `CUT`, `PASTE.POST`, …) in an + * Count hashline op headers (`SWAP`, `CUT.BLK`, `PASTE.POST`, …) in an * edit call's patch input. Returns `null` when the args carry no hashline * patch — non-hashline edit variants and malformed calls contribute nothing. */ @@ -883,7 +878,7 @@ export interface TaskRunResult { editFailures: EditFailure[]; editWarnings: string[]; editAutocorrectCount: number; - /** Hashline op counts (`SWAP`, `DEL.BLK`, `CUT`, …) — present when edit calls carried hashline patches. */ + /** Hashline op counts (`SWAP`, `CUT.BLK`, `PASTE.POST`, …) — present when edit calls carried hashline patches. */ hashlineEditSubtypes?: Record; mutationIntentMatched?: boolean; mutationIntentReason?: string; From fcddf46e12c23768ae2e93698f5db1ab49e38f96 Mon Sep 17 00:00:00 2001 From: can1357 Date: Thu, 30 Jul 2026 07:42:55 +0200 Subject: [PATCH 12/19] infra(scope): configured burstable runner resources and scale-up - Increased maximum concurrent runner pods from 4 to 8. - Configured burstable runner resource requests and limits to improve bin-packing. - Updated documentation to reflect the new runner sizing and scale limits. --- infra/docs/04-arc-and-caching.md | 14 ++++++++---- infra/docs/README.md | 2 +- infra/reload-runner.sh | 39 +++++++++++++++++++++----------- 3 files changed, 36 insertions(+), 19 deletions(-) diff --git a/infra/docs/04-arc-and-caching.md b/infra/docs/04-arc-and-caching.md index 59ec20097..504ebff46 100644 --- a/infra/docs/04-arc-and-caching.md +++ b/infra/docs/04-arc-and-caching.md @@ -161,7 +161,7 @@ githubConfigUrl: "https://github.com//" githubConfigSecret: arc-github runnerScaleSetName: omp-kata minRunners: 0 -maxRunners: 4 +maxRunners: 8 # none: each job runs inside the runner container, which itself lives in a Kata microVM containerMode: type: "" @@ -220,10 +220,14 @@ Field by field: - **`githubConfigSecret: arc-github`** - the auth secret from [step 1](#1-github-app-and-the-arc-github-secret). - **`runnerScaleSetName: omp-kata`** - the runner label. This is the string that goes in a workflow's `runs-on:`. -- **`minRunners: 0` / `maxRunners: 4`** - **scale-to-zero**. With no queued jobs - there are zero runner microVMs. Each admitted runner gets an honest 8-vCPU, - 24-GiB request and limit; excess jobs queue instead of ten 16-vCPU guests - fighting over the reference host's 32 physical CPUs. +- **`minRunners: 0` / `maxRunners: 8`** - **scale-to-zero**. With no queued jobs + there are zero runner microVMs. Runner pods are **burstable**: a small + request (3 vCPU / 10 GiB) bin-packs eight runners onto the reference host, + while the limit (8 vCPU / 14 GiB) is each Kata VM's hotplug ceiling, so a + lone heavy job still gets 8 vCPUs. Keep the sum of memory *limits* under + host RAM — host OOM under Kata kills VMs unpredictably. (The original + guaranteed sizing, 4 x 8 vCPU / 24 GiB requests=limits, reserved the whole + host and queued every >4-job workflow fan-out for minutes.) - **`containerMode.type: ""`** - **none**. The default chart offers `dind` (Docker-in-Docker sidecar) or `kubernetes` mode for job-container isolation; both are unnecessary here because the *whole runner pod* is already isolated in diff --git a/infra/docs/README.md b/infra/docs/README.md index 4c4e95ef4..132fd99d5 100644 --- a/infra/docs/README.md +++ b/infra/docs/README.md @@ -47,7 +47,7 @@ flowchart LR Key properties baked into this design: - **One job = one VM.** Runner pods are ephemeral and JIT-registered; there is no VM templating or pooling, so a job never inherits state from a previous job. -- **Scale-to-zero.** `minRunners: 0` / `maxRunners: 4` — when no jobs are queued, zero runner pods (and zero microVMs) exist. +- **Scale-to-zero.** `minRunners: 0` / `maxRunners: 8` — when no jobs are queued, zero runner pods (and zero microVMs) exist. Runners are burstable (3-vCPU/10-GiB requests, 8-vCPU/14-GiB limits) so a full workflow fan-out runs 8-wide while a lone heavy job still bursts to 8 vCPUs. - **Host-kernel isolation.** Jobs see the microVM's guest kernel, not the host kernel, so a kernel exploit in a job does not reach the host. - **No external registry.** The runner image is built on the host and imported straight into k3s' containerd. - **Shared, in-cluster cache.** bazel-remote stores Bazel action results and CAS blobs (Rust compilation, tests, native `.node` addons) behind TLS + htpasswd auth, with a public read-mostly NodePort for GitHub-hosted runners; the runner-cache PVC stores Bun/Cargo downloads. Cache traffic stays on the host. diff --git a/infra/reload-runner.sh b/infra/reload-runner.sh index 58be241ab..87f7704ea 100755 --- a/infra/reload-runner.sh +++ b/infra/reload-runner.sh @@ -32,9 +32,20 @@ # CONTAINERD_SOCKET_REMOTE remote containerd socket [/run/k3s/containerd/containerd.sock] # NERDCTL_VERSION nerdctl release to bootstrap on demand [2.1.6] # BUILDKIT_VERSION BuildKit release to bootstrap on demand [0.25.1] -# RUNNER_MAX_RUNNERS maximum concurrent Kata runner pods [4] -# RUNNER_CPU requested and limited CPU cores per runner [8] -# RUNNER_MEMORY requested and limited memory per runner [24Gi] +# RUNNER_MAX_RUNNERS maximum concurrent Kata runner pods [8] +# RUNNER_CPU_REQUEST requested CPU cores per runner [3] +# RUNNER_CPU_LIMIT CPU-core limit per runner (Kata hotplug ceiling) [8] +# RUNNER_MEMORY_REQUEST requested memory per runner [10Gi] +# RUNNER_MEMORY_LIMIT memory limit per runner (Kata hotplug ceiling) [14Gi] +# +# Runner pods are deliberately BURSTABLE, not guaranteed: requests size the +# scheduler's bin-packing (8 x 3 cpu / 10Gi fits the 32-vCPU / 125 GiB host +# with headroom), while limits set each Kata VM's hotplug ceiling so a lone +# native build still gets 8 vCPUs. requests==limits previously capped the +# host at 4 runners and queued every >4-job workflow fan-out for minutes. +# Worst-case sum of memory limits (8 x 14Gi = 112Gi) stays under the host's +# 125 GiB because host OOM under Kata kills VMs unpredictably — keep it that +# way when retuning. set -euo pipefail : "${CI_HOST:?set CI_HOST to the ssh target of your CI host, e.g. CI_HOST=my-ci-host}" @@ -48,9 +59,11 @@ BUILD_BACKEND="${BUILD_BACKEND:-auto}" CONTAINERD_SOCKET_REMOTE="${CONTAINERD_SOCKET_REMOTE:-/run/k3s/containerd/containerd.sock}" NERDCTL_VERSION="${NERDCTL_VERSION:-2.1.6}" BUILDKIT_VERSION="${BUILDKIT_VERSION:-0.25.1}" -RUNNER_MAX_RUNNERS="${RUNNER_MAX_RUNNERS:-4}" -RUNNER_CPU="${RUNNER_CPU:-8}" -RUNNER_MEMORY="${RUNNER_MEMORY:-24Gi}" +RUNNER_MAX_RUNNERS="${RUNNER_MAX_RUNNERS:-8}" +RUNNER_CPU_REQUEST="${RUNNER_CPU_REQUEST:-3}" +RUNNER_CPU_LIMIT="${RUNNER_CPU_LIMIT:-8}" +RUNNER_MEMORY_REQUEST="${RUNNER_MEMORY_REQUEST:-10Gi}" +RUNNER_MEMORY_LIMIT="${RUNNER_MEMORY_LIMIT:-14Gi}" arg="${1:-$(date +%Y-%m-%d-%H%M%S)}" case "$arg" in *:*) IMAGE="$arg";; *) IMAGE="omp-kata-runner:$arg";; esac @@ -70,12 +83,12 @@ scp -q "$here/runner.Dockerfile" "${CI_HOST}:${REMOTE_CTX}/Dockerfile" ssh "$CI_HOST" bash -s -- \ "$IMAGE" "$REMOTE_CTX" "$ARC_VALUES" "$ARC_RELEASE" "$ARC_NAMESPACE" "$ARC_CHART_VERSION" \ "$KUBECONFIG_REMOTE" "$BUILD_BACKEND" "$CONTAINERD_SOCKET_REMOTE" "$NERDCTL_VERSION" "$BUILDKIT_VERSION" \ - "$RUNNER_MAX_RUNNERS" "$RUNNER_CPU" "$RUNNER_MEMORY" <<'REMOTE' + "$RUNNER_MAX_RUNNERS" "$RUNNER_CPU_REQUEST" "$RUNNER_CPU_LIMIT" "$RUNNER_MEMORY_REQUEST" "$RUNNER_MEMORY_LIMIT" <<'REMOTE' set -euo pipefail IMAGE="$1"; REMOTE_CTX="$2"; ARC_VALUES="$3"; ARC_RELEASE="$4"; ARC_NAMESPACE="$5"; ARC_CHART_VERSION="$6" export KUBECONFIG="$7" BUILD_BACKEND="$8"; CONTAINERD_SOCKET="$9"; NERDCTL_VERSION="${10}"; BUILDKIT_VERSION="${11}" -RUNNER_MAX_RUNNERS="${12}"; RUNNER_CPU="${13}"; RUNNER_MEMORY="${14}" +RUNNER_MAX_RUNNERS="${12}"; RUNNER_CPU_REQUEST="${13}"; RUNNER_CPU_LIMIT="${14}"; RUNNER_MEMORY_REQUEST="${15}"; RUNNER_MEMORY_LIMIT="${16}" cd "$REMOTE_CTX" TOOLS_DIR="$REMOTE_CTX/.containerd-build-tools" @@ -244,10 +257,10 @@ if ! grep -q 'name: bazel-remote-ci' "$ARC_VALUES"; then fi helm upgrade "$ARC_RELEASE" --namespace "$ARC_NAMESPACE" --version "$ARC_CHART_VERSION" \ -f "$ARC_VALUES" \ - --set-string "template.spec.containers[0].resources.requests.cpu=$RUNNER_CPU" \ - --set-string "template.spec.containers[0].resources.limits.cpu=$RUNNER_CPU" \ - --set-string "template.spec.containers[0].resources.requests.memory=$RUNNER_MEMORY" \ - --set-string "template.spec.containers[0].resources.limits.memory=$RUNNER_MEMORY" \ + --set-string "template.spec.containers[0].resources.requests.cpu=$RUNNER_CPU_REQUEST" \ + --set-string "template.spec.containers[0].resources.limits.cpu=$RUNNER_CPU_LIMIT" \ + --set-string "template.spec.containers[0].resources.requests.memory=$RUNNER_MEMORY_REQUEST" \ + --set-string "template.spec.containers[0].resources.limits.memory=$RUNNER_MEMORY_LIMIT" \ oci://ghcr.io/actions/actions-runner-controller-charts/gha-runner-scale-set >/dev/null echo "==> [5/5] verifying rollout" @@ -256,7 +269,7 @@ live="$(kubectl get autoscalingrunnerset "$ARC_RELEASE" -n "$ARC_NAMESPACE" \ live_max="$(kubectl get autoscalingrunnerset "$ARC_RELEASE" -n "$ARC_NAMESPACE" -o jsonpath='{.spec.maxRunners}')" live_resources="$(kubectl get autoscalingrunnerset "$ARC_RELEASE" -n "$ARC_NAMESPACE" \ -o jsonpath='{.spec.template.spec.containers[0].resources.requests.cpu}/{.spec.template.spec.containers[0].resources.limits.cpu} {.spec.template.spec.containers[0].resources.requests.memory}/{.spec.template.spec.containers[0].resources.limits.memory}')" -expected_resources="$RUNNER_CPU/$RUNNER_CPU $RUNNER_MEMORY/$RUNNER_MEMORY" +expected_resources="$RUNNER_CPU_REQUEST/$RUNNER_CPU_LIMIT $RUNNER_MEMORY_REQUEST/$RUNNER_MEMORY_LIMIT" echo "ARC runner image/resources: $live | max=$live_max | $live_resources" [ "$live" = "$IMAGE" ] || { echo "MISMATCH: expected image $IMAGE"; exit 1; } [ "$live_max" = "$RUNNER_MAX_RUNNERS" ] || { echo "MISMATCH: expected maxRunners $RUNNER_MAX_RUNNERS"; exit 1; } From 9856f904d71928c2380e1e82b3780a03bccba21b Mon Sep 17 00:00:00 2001 From: can1357 Date: Thu, 30 Jul 2026 07:43:15 +0200 Subject: [PATCH 13/19] feat(typescript-edit-benchmark): introduced empirical edit mutation planning - Add new structural, multi-edit, and block-level mutation classes with updated category mappings. - Introduce hunk extraction, placement, rendering, and solver utilities along with unit tests. - Implement size-based mutation planning, prompt validation logic, and new prompt markdown templates. - Update benchmark generation scripts and package configurations to support empirical edit shape statistics. --- packages/coding-agent/CHANGELOG.md | 4 + .../coding-agent/src/edit/hashline/execute.ts | 1 - packages/hashline/CHANGELOG.md | 6 +- packages/hashline/src/input.ts | 1 - packages/hashline/src/messages.ts | 2 - packages/hashline/test/clipboard.test.ts | 1 - packages/hashline/test/format-v2.test.ts | 5 +- .../adapters/edit/prompts/benchmark-system.md | 9 +- .../typescript-edit-benchmark/fixtures.tar.gz | Bin 217622 -> 280200 bytes .../typescript-edit-benchmark/package.json | 3 +- .../src/edit-shape-stats.ts | 317 ++++++++++++ .../typescript-edit-benchmark/src/generate.ts | 468 +++++++++++++++--- .../typescript-edit-benchmark/src/hunks.ts | 264 ++++++++++ .../src/mutations.ts | 464 +++++++++++------ .../src/prompts/identifier-task.md | 9 + .../src/prompts/mutation-task.md | 85 ++++ .../src/prompts/structural-task.md | 37 ++ .../test/hunks.test.ts | 96 ++++ 18 files changed, 1543 insertions(+), 229 deletions(-) create mode 100755 packages/typescript-edit-benchmark/src/edit-shape-stats.ts create mode 100644 packages/typescript-edit-benchmark/src/hunks.ts create mode 100644 packages/typescript-edit-benchmark/src/prompts/identifier-task.md create mode 100644 packages/typescript-edit-benchmark/src/prompts/mutation-task.md create mode 100644 packages/typescript-edit-benchmark/src/prompts/structural-task.md create mode 100644 packages/typescript-edit-benchmark/test/hunks.test.ts diff --git a/packages/coding-agent/CHANGELOG.md b/packages/coding-agent/CHANGELOG.md index 724ed5adb..58524dfd2 100644 --- a/packages/coding-agent/CHANGELOG.md +++ b/packages/coding-agent/CHANGELOG.md @@ -2,6 +2,10 @@ ## [Unreleased] +### Breaking Changes + +- Removed the `DEL`, `DEL.BLK`, `COPY`, and `COPY.BLK` hashline edit operations. Use `CUT` / `CUT.BLK` for deletion; removed content remains available to `PASTE`. + ### Added - Added server-name autocomplete for `/mcp` commands (`enable`, `disable`, `test`, `remove`, `reconnect`, `reauth`, `unauth`) using configured and runtime-discovered MCP servers. diff --git a/packages/coding-agent/src/edit/hashline/execute.ts b/packages/coding-agent/src/edit/hashline/execute.ts index a000c8737..a2cfde969 100644 --- a/packages/coding-agent/src/edit/hashline/execute.ts +++ b/packages/coding-agent/src/edit/hashline/execute.ts @@ -210,7 +210,6 @@ function renderSection( }; } - export async function executeHashlineSingle( options: ExecuteHashlineSingleOptions, ): Promise> { diff --git a/packages/hashline/CHANGELOG.md b/packages/hashline/CHANGELOG.md index ea49810fb..ee81caf3c 100644 --- a/packages/hashline/CHANGELOG.md +++ b/packages/hashline/CHANGELOG.md @@ -2,6 +2,10 @@ ## [Unreleased] +### Breaking Changes + +- Removed `DEL`, `DEL.BLK`, `COPY`, and `COPY.BLK` from the patch language. Use `CUT` / `CUT.BLK` for deletion; a cut does not require a following `PASTE` and leaves the removed content available to later pastes. + ### Added - Added clipboard ops: `CUT N.=M` captures lines into a register (and deletes them), `CUT.BLK N` captures tree-sitter blocks, and `PASTE.PRE|POST N` / `PASTE.HEAD|TAIL` / `PASTE.BLK.POST N` insert the captured lines without retyping. The register flows top-to-bottom across sections, so content moves between files in one patch; `PASTE` does not consume it and the last capture wins. @@ -10,7 +14,7 @@ ### Changed -- Regrouped `grammar.lark` around shared shapes — one `target` rule (`N.=M` | `.BLK N`) for `DEL`/`CUT` and one `pos` rule (`PRE`/`POST`/`BLK.POST`/`HEAD`/`TAIL`) for `INS`/`PASTE` — collapsing per-op hunk rules. The accepted language is byte-identical. +- Simplified `grammar.lark` around shared target and position shapes, collapsing the concrete and block `CUT` forms plus the `INS` / `PASTE` position variants into their common grammar rules. ### Fixed diff --git a/packages/hashline/src/input.ts b/packages/hashline/src/input.ts index 00fa9312a..fc918f113 100644 --- a/packages/hashline/src/input.ts +++ b/packages/hashline/src/input.ts @@ -314,7 +314,6 @@ export class PatchSection { }); } - /** Anchor lines touched by this section, sorted ascending and deduplicated. */ collectAnchorLines(): readonly number[] { const lines = new Set(); diff --git a/packages/hashline/src/messages.ts b/packages/hashline/src/messages.ts index 71c6369f0..673a7d7fa 100644 --- a/packages/hashline/src/messages.ts +++ b/packages/hashline/src/messages.ts @@ -263,7 +263,6 @@ export function ambiguousCloserSpareMessage( export const UNRESOLVED_BLOCK_INTERNAL = "internal error: unresolved block edit reached the applier (resolveBlockEdits was not run)."; - /** `REM` received a body row or coexists with line edits. */ export const REM_TAKES_NO_BODY = "`REM` deletes the whole file and takes no body rows or line ops. Issue it alone under the header."; @@ -272,7 +271,6 @@ export const REM_TAKES_NO_BODY = export const MOVE_TAKES_NO_BODY = "`MV DEST` does not take body rows. Put line edits above the `MV` row; the destination path follows `MV` on the same line."; - /** `CUT N.=M` hunk received a body row. */ export const CUT_TAKES_NO_BODY = `\`CUT N${HL_RANGE_SEP}M\` captures + deletes lines and takes no body rows. To replace lines with new content, use \`SWAP N${HL_RANGE_SEP}M:\`.`; diff --git a/packages/hashline/test/clipboard.test.ts b/packages/hashline/test/clipboard.test.ts index 9e84d4e1f..7b755b6bf 100644 --- a/packages/hashline/test/clipboard.test.ts +++ b/packages/hashline/test/clipboard.test.ts @@ -178,7 +178,6 @@ describe("clipboard across sections and batches", () => { expect(fs.get("b.ts")).toBe("b1\nmove1\nmove2\n"); }); - it("applies a batch-local CUT without requiring PASTE", async () => { const a = "l1\nl2\n"; const { fs, patcher, tags } = taggedPatcher([["a.ts", a]]); diff --git a/packages/hashline/test/format-v2.test.ts b/packages/hashline/test/format-v2.test.ts index a2647daa2..007b68b40 100644 --- a/packages/hashline/test/format-v2.test.ts +++ b/packages/hashline/test/format-v2.test.ts @@ -52,8 +52,9 @@ describe("hashline format v4", () => { }); it("does not recognize removed DEL or COPY headers", () => { - expect(() => parsePatch("DEL 2")).toThrow(/payload line has no preceding hunk header/); - expect(() => parsePatch("COPY 2")).toThrow(/payload line has no preceding hunk header/); + for (const header of ["DEL 2", "DEL.BLK 2", "COPY 2", "COPY.BLK 2"]) { + expect(() => parsePatch(header)).toThrow(/payload line has no preceding hunk header/); + } }); it("auto-pipes bare body rows as literal text", () => { diff --git a/packages/metaharness/adapters/edit/prompts/benchmark-system.md b/packages/metaharness/adapters/edit/prompts/benchmark-system.md index 992e4487c..6881ea6b0 100644 --- a/packages/metaharness/adapters/edit/prompts/benchmark-system.md +++ b/packages/metaharness/adapters/edit/prompts/benchmark-system.md @@ -3,13 +3,12 @@ You are participating in a code-edit benchmark inside a repository with {{#if mu This benchmark is scored on exactness. Get the edit right. ## Important constraints -- Make the minimum change necessary. Do not refactor, improve, or clean up other code. -- If you see multiple similar patterns, only change the ONE that is buggy (there is only one intended mutation). -- Preserve exact code structure. Do not rearrange statements or change formatting. +- Make exactly the change the task specifies — nothing more. Do not refactor, improve, or clean up other code. +- Tasks range from single-token fixes to multi-hunk block rewrites. When the task shows replacement code, reproduce it byte-for-byte: indentation, tabs vs spaces, and blank lines included. +- If the file contains multiple similar regions, change only the one(s) the task identifies. - Your output is verified by exact text diff against an expected fixture. Equivalent code, reordered imports, reordered object keys, or formatting changes will fail. -- Prefer copying the original line(s) and changing only the specific token(s) required. Do not rewrite whole statements. - Never modify comments or license headers unless the task explicitly asks. -- Re-read the changed region after editing to confirm you only touched the intended line(s). +- Re-read the changed region after editing to confirm it matches the task exactly. {{#if multiFile}}- Only modify the file(s) referenced by the task or follow-up messages. Leave all other files unchanged. {{/if}} ## Process diff --git a/packages/typescript-edit-benchmark/fixtures.tar.gz b/packages/typescript-edit-benchmark/fixtures.tar.gz index 324f11bb4368e5f3de158cd5b6f1c5a2a6707b48..0080f0d40ab4324ba0f6c893877d5dead6858bd6 100644 GIT binary patch literal 280200 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

uuNZ{M^`U~ z7(qA+##DY6ZUrI;C={&41JYzFx7dZO&??->AVLzx8neDiw_wu`T2?biRB+Kd{4clU zqlR~KLXE3K#3e|S5hr7}vmp_|-EhR-KT_`n&>Wa*MSuqP%@?EFY%yTPH}Iw!EVl}{ zdG{Q2NjC_1WLBC7LVg?lZ`dVL0lroUX&|p@0Tr%7)s!>gdw0AZA$Rlh?%T+lkiUz0 z!gJ8=s}NyBUD|C>ZTK?~Wv+J{n1u>(syTof|FASOk$vmu(L9L+=*ulJa#}bjB9d@7 za~bt-%xq;V%n$_JangSK+{D(_SJe=`2AG)J$&FH9@nT78VphU(N#^!aY+-gTsht45 zi$7A>KPPy0Sy)Lx7J5>S6l9YHoUZzT9KV20_V#c0Mysn_!{3SjUNMvFxvVz^I{Qn# zlQLZ*LwpNto`ciSfHirp$!-ex?Ha?lNHrYTZ5WO}VRJ&bxlXxF&7N zLlS9g=MnKwMj|P{50Y9%`vux z=ycz(&cw(Z;7k9KuR2CUenA9`0ln@crc_v^=}9>tJv2Y{Bw^{T>>?F1=n5fmu_?lD z@OiS)%@0r>hd44ns?hmqAwG*K+eOI+TABrDm=!H<(8}4iUYsJ58K*v3y)L z8%99m$cle+VWQg|>$RR}Sqj(Z7*ho%&`JsO<0c7lGg(M9m?tcgVTY&A4@vZdiQ-Vp zYp(3G%4;HGmadSkP81oILoRnpUTt?J=i+A1gUy419b;ml#(|A&aH8I6E#6N&<#+oK z8VPlhv=wi|Rn}RZP~}(G76=&IW@)STqa9W((p%vKCyxzo^pXo&tIn$+5EgiL`pshK z*s$0C-O*rn5fw@AE*|y#qUNPQpRkF|B145*Z9>mRZSNJpuBP-DvId>VioDkDEp}=5 zy%%0-IPg^|dUJr-V_Ahi?yp;;vuv3~aTrd)47CmZW~%d$cvxjtfZD)J+b)sPZkK?B zn_RCwEx*D2tQ@EN8=|N(J9I){sj4?{sNi?1XiN+#f(oM{;B;P)MG|hzFqLk&`C{w2 zXt;mGIrbqP$PIy)p#jmHDRqpRbD~Z3a1) zE#O}SD+RbmxE}m^eG?11|0DMChRu7}d#EtV3{mgU5LCQLrfmgH4oZZQep^wHN+rc4 z!UM*4t%kF#*Z>^Q@af}yP|n-d=GAXzz(7c_I&IEvLB8S~b-tXQRX(w9&QhJ3m8Rz5 zOSHuZ0EvgWr9haLeslq|GFvAclg7gsa%-3Av?6|O{0#1|`$i9%WRD#fb%fA)Ub)is zuZz*E@;BxK%&LZi#X?S8OP`{La#VKByKZR3zN4;GX0k+({K#q`-eAsdvC6b88d8r^ zQd(%O-G@;_AfQKkirhE^O2i{S<^fya@A49Yo9BW8zcR;aNC2P1{QF;6vqAqiyz1ow z3B$pSxj`cS0{}*(;D3>QGm!Qfz_mXY8Mna3F3hif!lV1|{vL3_&Hx!Hlp<+S@v+2& z%LBB8IAI`-?j;Q_r<$UbC-vS8rVz&6_H#|D=y%|7!ne>>%5&kI|0Qr!f57r2$l&o= zsOFBh78vPW{oT)x+mVPepn+uki!MIAiX`~9uhMGdt(Ohh8Q`j&aCmvY?t|Y15T*W% z|87*TG~^0ycv!sHAq{4dwI77Oe0`Z725P|U1w9>Zb_ASTX?`W9*QEe&PyV@Acf^Tt z!25QgYtveoMW@iTasz1zwO&SM6Ah6HTAZX}YSjS(iA8FtJ6;-d{FqE(k$}mj6z8j? z+qW-}i}b!N2IUIaY7!*5#tk%SJ?v|6Ho1}?5tklj>LnMR=FUj9O{-{;1CcD=QY_M+ zAe#Dy#>^lbFeu~2@F)uKptRQ3jR~!U?IVFdys)`1tA)=9ET4W&EwpZ{fZpwK{N82U z4W(sF%>_5nZlp6uNr0+>uAP!yipQVQW+4Ps$qO0xv=w?qoif@-l#F3auB+gb!HoMra-tmA)m1Q(7#491 zN3!r}&ZSEa#P@R_pBZ^$mN53>yq7>u;cPDUhOWc^=~#<<#0*`rm8_s2pcL2yoWcS5 zp(p3E2ELy+PQN9@6zIs~t2a51?uWr9nFH322c`O?sY7rv(yyAVl-ua zer7=xP8Sgf3mv6bt6uQ%epi1O?AovjyZeb}_ds0p;yd6A|Nay#6b?kgnrMbR8w2|h zM!|9+dJ5wKwqhMwQAkK|@Z1MP4~l-zq)#jgs8yV}K|$O%a&7`eg^gIWi9U7L`ou^z zA;3diVYo4M+bAQ?>^v;NrT0?K`JDzHoAx0gb8G9DV$biWHUsDV{4kl0Wyu5*$ThL~ z(Z_Yx0|)GC?}_2=v3*|VSisc5EoBcazT6o#o}Fm>3xx-2XWR#ot- zXnCU~`)i;=ZqU@XTb_Pw!TlFJUBR-XL;0>oK9B;OZ{mX05p>LVqbMI!8S&)MV=Ho! zhqA?2v0!G~G$shl;kvrqzWW#6u=r{rHmo*7xMT+hMIhJc1!qrSOtQN8hW)DCr1P13 zVBKY}k`Qhwal(1Cg=^BV=ZW^^N~{~m2#0y6Lk&tu&9Sj%)jsRskTY{|knUSTk=>K; z-LZiIwH`wAASiw`$n|1G4x((h99P;a)j}^4C?>;B$KKfUA+6~C7zI|~pIIg|0^i68 z-2wQJOkW4&9E*LMShXXS$%D}d(l&3LI;U2S3257O|G$-o@gedV)j_K+b#c>Z9J27} zYflQWCp;6WZ;$5W+5HN478y0*CZx7E zG6Z-bWwI5~!&Z0mjT_k8s zeY3(vkuC;%S4=fpor5_P)TW3$T81@wj<*B+=a(E@0I?hP3W=;+7Yiezi@Eq#8`}jr!WHd3dY{i~TdQoKAge{%Ex0uM!f*Ec_$A z_nN_TZ68PKDJNef-o`dk2f%rovKN#hB?pha-|PPOg*au=gVpTIE_1^er?HOYaQz0} zjfqv|U#zWLjjye8$leUHZqf=;ih9fbGG^`MIZk^7x*Fn{NEUUcO}(F{tsBKWE@a-I zqVkK^O=%UR%<2urtB>N_0*+ww?dJ3jE#yf&}#U1KNka8zOxiZ|(tO zaVP`$*K6IN4*_N-wlI6qb^(&VcVy&`e+^x-Hs>;B-2~|GXr~)pPvQLvdXM$LG~7`p z@f<#mztf%zd%G<(f*=G*Te>2@U_yt{ra?AtASSp(2)(2KyuDbBC;)o63H(QsicBYC zdJWwA_5q$PU2X%v+<$wy-(6N@`h9ly2l@v5Gi_(mm6%DX0#5j3K%lvSPVe;s_q~Sx z;kSzrPQYJJSr5<8Q>A!D{hs}egy4qBU>>Rm60}a3a2wIzhA;CU zg=XmUJHH)FQGU0@Y}!o7>+mV^`+(3KzNf*hV2e;jhli1EGJ(4a=?$k;iig8SrVf}_ zG^o+fu6nRedW~#~Eba!h_H0UV91{y*Mlu0o#6X8?K-Kg|jIbxmO)BgO4 zezi=_pdlzLpGN-0(MUaGK2xBrv_StLa+&#v z8t0BjM;C$pq_6T93B>~`^(*%1M+&6zE8kbeEUu0vhK3w&EaDZDiS! zswUfF7G1I7#63>)*loXpQuj-V(mzDJkhCBDK__% zfhAyF<2>vn3zQ3Oai0hKg(T2q4v?;dv`~V6e>KcJrS!?~oGP+dEO|_A&KEC-aeBhk zvF846hz93+{>s3SZ1GqMqD(pZVR2Km+yyA zB>^)u$_7$%-KsYHl8C9GGI+D47p75%0Wo$53881IIm$DFTwPjyZSI~?Q_FChyv6HJ z!pTGxaF+C?Nua^HbYMSE*!+@D6*#C>qEWGX# zMBFBSW-*|i<=%@WgQeKU(Cfr8vnoelF|hI&?(1>Ym~SQvO1nr%+Z5a)9Dwgo zZw-K=PGfX_b|9xr2J^5uD3Hk??1%ZC`lEw(9TuLQd-z9Zk}QyisYHVkdZSGc%U4{$#b=oe91*5j~gh+ZPd5RTgKU zN5q;v8!8~x;D#c;2LU?E07^y>o$+vYFaK2dF**|9KcDIUd0V73LI6x>!2bpSgQuVw z%XwhFa|~Ahoo!fG-W)3uFy;~#daIal}AFAL$CVz5mKw}$}e?`&*3c?3R>CH|*oa|}`BmGrWa zaCw$e0RNq*=5Vmk?;D@{m}mPzVDg1#ej~F*SYn>ZW^BfyE(PDDlE*fx*}4xTJU9m5 z6>g&(Nt7lHC(_N_kd%H?*WWcz`t`1QSQZwImH-5Ft94htqD9U3To8~}= zztm+v+ZTkF8#C)h92q^Gudv{t??h&I^*Gn_u(%LP^@^ZAb7-iXkW}67*Xym&(49|V zDE~LuXQ=Im&^3$SZeZPqrz^mWsHMlT%WN`dY9d@E8$=fS4-c&^Hz=m{AoqMOpv06eiz97zvPF4sRfV6}a+Gk zjN%EoAqgi2t}&u)%85!#Zs3m>fdqayTiJUBTR;41z(?|PK}6g%xyH;KgfHcFvp6Bx zX)yW^oL{42PW0S!x@8iBR||PNUD;|=2q*R8@EUY&5^^Q25UJ&6?bno6!(J}X3=zM#A52JHt1FYlvB?wu9ABH2GhrUt)d4mOv$`V+!*Z`P zMydpiXR7Gu#mPXjY571?5o}PqHNlOFi~np`9%5Tn=A>9DB0FYcO`KbWiRep0xmj2) zHD|9P4IB3OwqF0WkK&OLJs?J1Au-H$p|&6)GF&o|>%=>2!2NfWlhGy}A~ zR4SWC3DN?|A$1N9&r~TMl$8^jeyUAG-$f_$kD_}yMQX{(c{-u;&oQN&={)jRuN?VS zuE{lkX89g7`;vHRP}WTfl(-RLuDR}#|s^AUKM zjsiS2$#(`Ip923EVC{e1V!-|H;lBkZ0btPO+t9mEF7WoU^Y|SY_$Ac7IteHk1YU{| z?gCSvd3P_KY#_mIhxbEd2Tz2Y5boa7t5*Vx9@&nCdK%6c)_~t{L5^?t{cD_BqF+F0 zA4kF=pqnJ|-7_un{K`3Dp&QeEm0^(^TaHbBaUl_fmP%a@O{u59Al1Sx6<_qhcb_fM zLTi;^F&(C0u^!%vVDaUk)KlWuKg-_*$&Z%#^Jy9GQvgCh1D!qJC*Lzgk2`oa3K%+M z7!7RrXReA6+TikpRAD+DFTsadgpmuFEdX%+AT|!`s%OQp?{t zO`pe!4Z)8>W(Jlau$iy(2q?saxI6J+gjPdV@&!9gZO$sVfNT&(lnywb`mQr4ckaQV zQq(X$+Bewj=vl=qEvBFjWz0iBZ%$+; zS#Ji#Ijz2P^?jA=?$c3GDN>XTmn_O;(R6j%A*2lnw}HbPz~E@*OPpn$P>o4z^fFZ% zD@|}eihGT|B1vAtr;?yL^U4@RpQ!9o-VLZt;NJClX`V5I-a3X}P&G$1p z^;jcTF*K){F*UW5R?1l(zOWD%l-U}`>Qq;Jl;i18R=@NV%iv9Dmas;sbg~#EiO1ey zYi){qY^J`l-JB|@oS5|utDOGFjChMI{@erzqeFR?w76|y`RR8XedX^mRR=yD)|=rh zGPLIS9(kH5IL2%u(8Pwaf#-IW5U@c4*U(fn3aEur5%fr5FZ?)&QBL)#b6ov6XJcqmkK4JzKvb*qBzwL9qZ@| zM3vz__RdrWV)wYbMiAd7FY!tH2}oJeY#16;yg}NIw$7iYpH4uf*tvhUeBUJJ!B^5rNR8SF2c=YP66Ry!cY) zniI(LV9xQ#Q&S&S{yKk!<~~aXd3uE*YcN4Bc@h!E@JK8-|I}M``^sQU zAbgo;BnP!Cb10x(;wuiptAKRuP}K6(aW3bq)uFczj2E;L{9-yZw7N~ZS2j$^uHcw9 zB)?uocX~`(%td70Dz<<0pF>ACUSCO*CEP zjA%ps#*Lx$v8cZ>rIwWWh_>gMN(EI@xY52ytfTx`5KuDpF0Wz3WkiVo2Vd_PoLLlZ z>&8aMPCD#ZUu@g9ZKH!PPCDw?wrx8d+wRylzT11>bMD!@_NlvmjH#=$*4ktlG#sRJWf4QdfoTY&Vq{jA~jtE~-}3@FwDu zK*07T4c}jRUnyrrdbKFcS_38^kOe2VjEi3eB?R&)RwtLj$W>ab-S!iU=!_#G%m~FG zNj5L$q~|M$jD*K8r{7fq2cx}-rI8YY0*Z1|xF+*>Dbs~Yvdw#*cP_ehT?wS;sas~= zuo$YR^GLyW_2&Z$+LFYkZV0wC4lXVTBV{>$QLWMab09;KwG-NLecY^}`QIG+j-p7u z^rND@kEOy&uEyRZ0>{75kEN?IG`N^?$#5q2KwIAYb0m>Bv?UJMHe`nm%jfZxcE+ zF;ps9ppCw?z?;sJG%#fzx=KXvjZ_v30XA9DaVn!6uX{L{>}E+SL42%)Fm|m<%~Q!; z1IRN?h|32MR!XEk2348LRc&b>OF@KXzwGB*%yVRqHFv4Brh();(U4b!amt*+DE^YT z+u1_y^y8k$6b$k-QYuR@6V>#`CTo)kY%x;W3Nq{s00&1PZ|m*g(o`*5hz&V&QXW14r|>6|Yv%5pR?bp(I51u8y=FH+AyfZrfLx zN?DElBT|@eBn)k417jufaMy>`ofY&^9vUKWY@-rW-_y?T?#{n1pycM&*U?BbX}zmw zg(2ekP(SgVUgDE4gx(>s@=O*FCw1zNvdmybd67V!J*@H7t90 zTQqfA+LDennN7Sx!F?$Xv-*CRJ9*22cCm#_p$>`?@Y0^(=NOC4xfFq$pLV#K} zG!s8Jm^RE;Lj3fKoOPVxwx{P#9ZqmGa=HJv-Q6b?IY9{+JdAWjZG>kqDC*UE6;*^ zXkS5ZDXkYR+XO>vhm^#OA|F4iV4Bv{w8r_BH~yE;2?K%E*ob><1$BE^@=ty>8pn?3 zwLy!koT;1AzZ4K+@W?zmAr2VJykB@8vgl*BCJWk|mJ1-8R*-FZKy3|3Uq|QWsh7aJ z>ucp4*!}-2jv^r4=QqPz(BuCrJGu2=&pInT4}i#$Px`_r_nfjx@xnNV{(hqqWcYt9Iw0|NV)9d6loPH9S{mU3s+dWiD0o%p_$Z%ts)EJrhrT!x`syVsJ$RO=> zV0Bz2#t=AN1#u>j?rM4w`15=lR~2XZBc>i0WQqM%JMeYyT~ITFkvsY&2y%Mu4-WbS z4sU=Q5744Et>0(Twe}|;zPK}Oe}uahc{+Zq)!#M$Eo{O9@}4wtb_Sa{)f#J#8IDRSTL( zXI1<(Uy@($@=JR9i}TskxE0mGJ15N*p+H}0#Bz~l9!DsSE-F=pwOS^ZKOY8Gok$k2HnfwB`(=e~xEhv>>9@M(Ms=qq;5r4KqW*q85 zmpLyJMUJ0kGQ`gN7jyY%j0Z;aX`%3+a^EXI51>Nj4$WC2?M|LN|2rvOR@k8xgM@4Y z?SgP`SI$XQWc}b>Azt!S3fUaHESpBV&m=|aY-8##was6i@EsBYeiQlG z+tx{dXbm2vF)H`~6lE>zw1b6?ID+gr(ucQOXBUTB_ewzt-f|-~$`|Z`DRqWPg)1MF zPu2ixULrtH2RnrRnQB;GfNu|r9A$nCc~dVg{=jb3YGoCk-NXCb@c!R~QoH)%A#r#U z%kNA-^dLA(7h9f#p^uLOjkf zc!c@6UN9;xJ1o|Wv2KgnxIn~Fx9U&GmR*w07cWow_k;B)w%v>#va{Dh-GCDq?r|?~ zJE_+R1xpAOyIjvK#oFsU;`od6Jq=FQ-f7utR0){l(cG%&*05$zBO%AkPU2rcEzm|% zWktj;?$~H^NWKGO!8#DM?Efvh%z~Adq6Yb<2kSfMOx{R@iiWqb4`$zQ?bO$j;P;Md z?ilUKY6>;;8~`q9eZ($0o05)yIFn%gzFx+5X*aVarc!rruZ468_kv9hC-0U8RnsUU zs8S~9+sjY@+DD`%Ycb*0I%@G@HGWAo7eE+HM z^W2|l30FSq{%ZEVV)0r29Ils+NU-G(q&vj9xkU}3gSWgPf%&-R@HvgfsD@@t#p!YS z^;GRLDyfQp167M<=>MP%``;_xPnLk@o&{@)Av!v~EWQ2vkAYqBqvyb`um2;*stNKlK&yE;(U##z%THxoo&#uL{1mT^H-3g296WmsiX*mo0C$K6UxIIVJ_G~q{R`d z=M7zsS{LZ~;1Lx1*?UZa{n?xP`PTdE_zv+6s3`q@>;4OttCR4zGg$9>LC)^2A3F@7 zF^ZE4JYR3r+#+Gkw^KbfcII@W`lFd>=PLZLXY0(q-SIh_Ot5#~uNye``v{aL7M{FW zL(-aPpf6@h_dLoR_3qw|=o7j~@*uYdl0`%eeHWy=7XZD-@U0g-vq7_u0g_R>vAZJQ zNOVrMTSu_D9uwJ}FvygU!#win)XKQj#hVWgQb%z<4D0dlPM@Zp8bgbVKY^g5$D^;O z>5)z%HKT4pL$1x>l}du^nPU2;r^D6K3Hv zhjy*HW%3~tk<7Y>%so%0erab3 z-cOw**1_5%xhru{;7!)^rV+&s?4rQt#xH^CjOUGyzQ~gV6Ezu7;l)!8;}sxTcR*RV zPZ@#dI9N!c(Y#1ovF_?cJAdhi(gh0wo_Ww0>`wc<&(sgVbnuWnOUzSUObn7r3romi zE0VV_rcI|0$y~c?1#5Levps}lrdPx*yn91vwn;Q|1CKjjCKN;7>HJD2fa}la>twrb zuS~fhPiN!Tz*LaK-`l&~R8ZH)@u8sq*Xe;E=S2z*sO#mJz%-OgK#BqJf z4GoVH09{Y zUGoP5qCTIEzrIk_Zf-#i2Q;mqbus4t7dp0kZ4)2^(~^Tc{O6;##^a)pQEoW5{+JaK zJ(R)1V^PFprIMIJjJClgYZTFIAS)bD0nqSvmJy%aza9?vZZ5F!(i{0HP6J+J^O9^S z^HuvAnhXI7C&>Zr3>9Lze{$LEQ}9{`cAVs09KrC&&sCRRV@qd~Nw<)q9ox3M2`OV6 zy?TBm?$1^FlBE&n9S2QWB8yNxe|Dzw(wMtCMWVdhcbY9nO?NoH)4+&%NGzuD4($7P zkM0nL?mySI=5%|bz@D`d%y6*$nBBa3-~0F&`FP(Wo3zgUTI&Nb_Vj^j`hcmsgWH?Z zYm}-N2iT0n?+G*~Si#x;^YH70_P!3YzY{pdV=PPSAo6#V?wJKf9vJoA8mxZ+i(^^? zWh9~Ru(T=&yz@fe};&tU}H|<-1~srHX@Y@?-C0N*%DKJNZTjlBJ~gfK zB$qG}I_w_`b8MCf;BoLm0+Agwi=nD25p)$Y&u%t1hH@-{gASev^_E8;5;rz9kpbs z;Wh8jrk1MzMATYG6N>GZMniK6A;#v`AnXc1JZ2JQfTLF%Z4L@dx~^WjXEg6p;IX;0 zz5689N>ScGG6tm|!O)!06Z9{X&CqzW4#uW!bMeAkLIv=I*wIHLk&~V>gOSqMq>?j? z8T^$Tz@>qA@x3#CKF zZ*@1Lo{py8lqFa`$2~jsJIrhmY3s8(42QoG0oj8N#S^*bZ9L4p@Yyr@tf}M`eLG0G zeB)AU14RNMFNr6XHoJu>n0igPu4-F9T4w7C!a(?)U^c8{Igu74k?PuLGw+MT(u%gv zc9Z@G7z}LEPPoxOrbeeqPH1XpyBGGLu9>uUwUiHa^)ISA$qrR7Y7-(($5U!$#NSWS@l;-tK=H)o9Yhf z7I7accSY*uu&{F(Lvqw?$JSfjLSe+Kmd{}WSJ;@5EmKU$b3$h8<G99MYXUY|QLe6Q~$GGn}h!@m=}fXjiNDMG;ZLCse`l;_DO z+qOjK#F>Xj(C{^IQqZ?fs|&QZ58VFa`Wku#)FXe|882D|atkouVuw$u)u44L*7v28 zJuxu&23BID%GT)c=}`CD)brg|3=>6>r-q#^oD1@ZtkuQ7&HZ-Ho>}cf38<&?AmpNS z6&0SnpSD2GvH|(DWzB%P|2~5jy;<%&LAwE ze&WgN!H8Wjv-Fk_gl$r^)uUE|*?&C$ot48=L)a)0rC& zQ7C!CM;z~dT!H0W_#cS6p)`a@0O-Z#SR=?%Bdvl?-JLs(7HT=z8AkAi(@}xHhLT?7<@3DgxoC4lNj~& z?5%S|Sp&B`+z2hXz;ID;3}q(h(Bom+kGHfTOQWx7;~V(JOI1>#yE@PLa0?x?tVXI| zQZzhJ;!4;la50#F0r7(HNi_a!O=y;l@Kd@aEcE8-{m{($)9{PTiD0zv z&AMV-;|Er`q*lrH*yLGLWrqg^2TmZci3(p~KBv4BOjcE#+YjTPK$@DHXdRc7nF|!`b zL6hz=YMo@lo(j9)Z>a>`v{-=kXN8t11N(NOLIH<*!1lu13B{IEPd!Ao7Sex^B07k~ z>eV&UqXkMa8M3EF$x zx}pW2lEjfk1K=4g3e292ktnWTvypdzM+T>nGNvs6uZ^fU&wwHjvXw$;)q08>d|`V_ z1H($NUD|{8Gr5ia5F88QqHa(; zOxj0Dv16XTfIwW574bVJ6jf)geBwc4(PlD_C>xH4UkId4*X+9lFizv%PsA>PEZM%@~K68#U?gU7&2Y4-0yCu6XQ~- zK5Y>EDw;b*;fZ2mx-aBPE-y+F=rG|q7=9q0Q~nVjqL_0np1Iy0CR%32WkJ}+KVLno zNC{{nz~yGPmyj$K!C+=kc0!ssP>Y3R<0}XdTy9m4nv+n6LN5A3awj`!fvyD%I1Cz- z3A4k7S~YXg}hM%(5GP1ObDc^a(xMWkZ} z_OQ+Y^MNvjmh#Ho%q-Zy-M3fH&k#-NTdhw74#Wk|<*v?=ly>(#fLq2Og7T9p?#X_}LXZXHsKjX@Jv#l(o4L`v zIg$D=shEe(}~)85IYLa6!>XyG}iGYzsw? zV|I!IQNQncbkIYWl9DKkhh=768HPZP)Bh(+1i%!IME*2R<%IhDnLz0WKVu$GS<%*| zFd~m0xGEwj0KSrM&)F?EJBWp#1A};vgz7tV*6UJ4a!NT8!2`JaNF};;jHxU15LTY8 z2wf4UXwAUSHgcGGbiM>4JbD65fj~B4CHx-NCkk|ea}T|<30RZN2&S--Id%_+{d=<; zByzaeTVgJeC{Kd7W3hDAf23DT_LYd^)>o&Dj~4p$N0!aoHTVXVM`Rq6|05c(AvGoJ0(>Ek?Ak}rOQ z^X>DbAdn6#szC%P*tc&nOsGnEhaL7Ng1KQwC%};4<#_{B%GmVVG%o@#qq>dC$~0DJ z!~L-t9qI*+@|XA=$911~bSQRgY10#wED;F_Fb3OP6?L01Wrd!N8{N+NB}Il^(&DqI zF|h}#i z1F4EMuFlVXsE8H$<63r_?cGb>^Uto}ywTJMXu+&)5O4E85w@K{(lT0tm5Ee{=K>5F9z z8bZh3zU7da{$dLl7NWXtzfQwv>uM{Azbk%Mr?bPER+3{bA^u+ZDDoSgp_+q9X)lvd_WF{Q z@H?PsUGqH2I{^>CX5`NXQ|ioV_J-%uDV4*=mF1W;vIpJc)v< zu)RbZ0Z*B#w5hIUU(oWqTF5AMCG%H|P(0)EP!hy>6KNWBEJnvx1$4%mwqN63A6M{W zU;2KYbT<liL|rkJ=Ynfq>W);(&Ub_pRhm8tL#i zbOf$?oL*Rsg0;h^&aT3xV89XXu+D&lV5~*^P4%$`6%q%YYl2C}Txr{^op9^~x;?gy z?4L`t=iu3Gg5_Xn+?_66ed${YY+EJ8$Yc4t3U=Ow#J>uf5Umex5!l}8$r6Qou{!C} z?!5?1IR=4D7O=q36F`6uub$uCly;)HX340}k_JJk)^v@LcX z5pxXe3lbbS|6GsljNu2`bNcBc!k9q93E{_VNZ)ZNnOCdAa=8E+2WXUeS+I?7_kSHv zA}k8YR90kAXR)LH^+#+Xd)SoRIc%vfb%XJ%4_n4*{AF8)hGnwQ592QlM3JU%$PdNT zzERyg;El&OSY!->HFq4}$kuD|#Gk!v`F z529LRSyx@@lshvL$V&o7)Q&2XM3=Kfe~Ca`@l(RX+44^;dkq3R45bgFI0+-=&>CFE zab(DT)`KOK#X|CiMt_%)4X}YGq)CyIl~3J8!0GiD7YqMsroyU;&(4{UDBUdW_&uJt z~2%s~G9L}nv2^*G+Rnsz$)uhl`hWK zLjc!x7;R0(xeT5b#R4IXWh?0Hy;qY1T=Czb_dSq--|J>} z1L*ko_Q}u@^!VRp$#!Q0*!`)=LhJa?(;C|f`uSe_f066j#jnmQ_rr^E66@Ru%H<{3z8G#O;egEjt&6{b%>SJ!bjSZ|@{a=36JVc&t8u|$tnxUxq2!$X6yfhwjEFD> z+fIDzjI^!>+9(QSW7((CXUv_2i(NjmZuQj0HFfR&Te{+VO=`PKN?*Bg`PB2nR)*L1^t zlLU4EKmg}4@e<@0u}_SkkI8_uXy5<$16Ik+FTi2fvh0!N%F>Q_AQbSj+vx#Z!&ZpSy0o~ zUyEk^WWGAR&eJYKt(g9>rbgGlER;8)QsHX+IoF&n}! z@|)lmL|tHfSsFBT4pjUa7I8i&TM)<6Tv-rT!f`R=aec?J;Lgq@Khf)FW9kj{7nKo_ zPj{Y^xWPdXM2hH(=lJOrD{EQ)$;l1i2-a2nT)}(H)_%UY)U^{k!)Vc!$xY{$)*w-i z71=Xo6K`J|Gld!!NqH1GahIYNSa&ou9cI6_RyZD zX&T$^BE*lBIx@snoj40B;b1=(h=V1O@bDs^ERCf3Sa&8f*lTe=s_NZ3)VJ7$sT#4h zZB5|=a5N+S{+_D!&>$*=lL0!oj?sJAE)}_WXAF7nO!Ea zRtWtD9;U&JOvr&)NFOw;m2W!lk+vm?38u#W-Dc{xf4U@AtPoDFJ#VEUWZw$F&x$m( zxTO~oJ)-{z{&%2O3fZj@{=nX%LR$BOT%+y7`HhDqdnT{72<0!aCv3J{LvB^!U;+0Or7LY zw;P=c;Z6(k!d)Z9-*U2?BfxAizRu)m*|^lKSke_g<>f1z8WoUWA}}gg_GZ29ipn%Dv4|&63rCtvxC-uDKDvq zB%~Q_(El8-i9vPP0RxxRfC-F@)BM~2`;p6zT z&}=e0vW@w;Q9h%R2qJc#f=b*LwXDR?h;|7u->@|zA>#2q7vusmX3Sj(N%%2oCHOL! zDA#4A?JOhpO&uF3T?!vD{aZszWQsoxWn4zkW&<8jUg6PP0z8)knH&L)Mq3-YFELK>K?%2uS z{P#cBTa06Qx=WJDr2SH8BYBVK&AVb6k)mI0(dpuJQjS8O)&?~C_^P|@#5;Fwl>OeUXEauq5#$zzEQq(nOF>G z$TVXdXptK!k*a!EpLQIL%V0&vSbem)d2Lm=-a-to{ODH>Mge3genV78Zc|tk)lxz7 zQ=jDQx$gH@yGt=6Jhgx%(j2I;H#wRiywXWuw(mNO#gurNKgUl|+dM^P96=OFX0@J7 z4x)diL>C?#x6al}qBG)OJ@WpE!`lR9io*SZ#BG~jLiwgI682Ytdl?WhL&1lg z%u^E=glUHC(W?ZV85m*JBJQ66=3wRsE*!+U#DRgVdJEyrb@WTbEtNV_r9J(~Xv;;f zppv!sc4mrC^|AMD{rOS7Z)FxFp!f7j;&5>LUx+Bf|74?V9x#%68p*f+2T!%M|JZ8) z`iDq;czxCadp-c_AfHcL!?$z~(0TtyP$fv;>*gkK1+@Jqu@|IXvd7!zZhK4*P4i*4 z3f?1)(;>7v;vSp8jV{mRAV2fc{Xw03`!4Hk5YvhKRIKpUySZVmx&nHv{pV_5|EwJz zPTqV2zJOsD8G<-(l6F8Yr$z(AO!TgYO*<3Ke~W7mC7Z`QdwOQ)vt67o5LwEkS7z)o z2R5rD($W*6m?qj!8x15>4YMb#=nN+|D)l4=zpH+2uOSPn{_~%_PjTdTn4-PNJ%NTp zVJGgP-$9~Gpshcq;s&XvoM#<2v|Vp>#ptZPte^jO^q*0dLJVH(6W#uqEs2GQ7=C_P zL|m3LTS7HIbV~Xnu>?8vx=j0qcZv}GWez$nsjDY7UCW4cgS4vr?cK#rk+Nc?j|@;y?1_f)_%X|2HFJp6+dq%+!%H}L}8@VDPy}2 z5(ayinhug!bd`!nIW1`zgnv)G`6ay?wDR6*wba8biss_c;H_O%0#-gQ4L6DPVU+Qa^My;mWBNk=4Z{Ag`*_okH2&V%SHB$Y%L3prA9Kxw8RR&8H|elP6u_=%zt@oS-Oht-80U2QF2>!nF75rS0UgLhvX)I{P+~clQjFy z(-33bHr`cWCldC2d9@^yhQYxYA1bf6=OJ6*Yl`%C>Gdtl&N~?`KMM0V2iv8_+5t}D z7?T49`lVq|`}{1_373}5hnk|x4>^|w5?1Eym~t62`IvguSRR3Rdr9Mt)vecYr5_Wf|%iz_3|F7 z(&%KxG>B0j-ahu#v&QV03&~Lp?Rj6+X)U7!OJ(yY&Qxy3AnePu1r~7usFvSBXFA`|- zT+_od6U7VdR>Y$kKq76$rgmw}KX+Vsfb4P6(A|C%DMwu1H2D)e!3GvNVdThluAMN~ zo3Cbf0_fTAGDW_@h1I05zLBWKSFXe&P933ObX=MPpImIv9dwRY=KrM&PpIqa$I`tA zTza~SAh99IAoFQ^uTz5%Hd%VJ@iiT}l8H4GNG-ET6O9g&1&J?-!;KgBl|DbN^+GNgsjT#nw3L-WF~0ft)aT7%|FO~WSsVF{ z+)99x(}3Tv9sb@sfVlR+XH16Uo92aS-2OT3r0%rBCTfzjV!qve3Nzf3T9_-&U}45d zUmZ^iQ(5S6juooa#EyHxd*j2X3o|S?ZVSRfBL~<8r^A-W3{OSx>u8K6Z-Hy5!RJ$J zKd1F#PxCt@HgDMIHl2O~?BY)5hQuq?A>UYAb-hu2`Cs?w> z>YsH{UlWogLNN{OW6${KBwws@Z!GUcyFgN#)5x4iMZDE;_-qrFo+Aty| zS4I6QeIZ?ljS1pJ$JynQouwUA;F< zuAO>k_G6uc)$W+st&^E)SIW{i)%mPGJSdsAuO((#t0Hi?o%~ia!hB)|jbnG`XMeg3 z)F&_FYxgGe{S1|Pan7?{wS11yZuG}9{%;KR^L?bJ2;KASp`vBMjY)|=si@Hv#@)OD z5v=G~E!@g@S}7v+i|eXv>r%wx?+tpAnRA4>wj1&7Wt{uZl#vXN{qv&Wvfqi4-`JF< zD=^uaHoCAVmJSntg3fZX+@Xfl;ZJK} z=N&w&5CPLmWJ~oG!TW1h)Y?YPC${Ip_Ug39Yt%}x=YYGRB1)6a1088${F1R60H7$i zGqpH#3GSNLzDbDo0CLhd%BgEJk^nSF69FG_Lw*E|cBV?QBNK7DY_ya&0Ce#0SguHWyfNK{Q-h zL#0N@`T=j<_bD98F_lRiH;$>MQd7oC{%j&bp%tkrLt7 zwJlsG!5VGg5R{QM%{KFEv;hKdO)=KuONzpw=jn8k6)aa378n>l)B+Ehm$@k!bSO5@ zYsxzv*Di7AMYjhef;HFN;x>JL1gD(}SAA+c7T{gjS^^ZtUkOM{EaIc^%g^fR>bAMF zgxsSs)}4QNaYK#>E$~AYgwlJ3xKJ7jpBGQfAFlHI$Z8Bq-%33&zdb0n?Hl83AWpI= zY~07_g`}N&H;CyPboeh`3Y7W`I`jIkqq{G| z|23sH_8IhlM*n5O|9-jE1WFa~UeC<^pYv*N!pmVAm-;Wg* z1Ajnxz%YQNzktk(f{!|R61C|dCyKyU+^#z;j_W8vNSkkU=10(%OJVPH-IpWT*ZBt| z3FwjJLC-(^rItwP1BKU=yw9ahlM~|N@BB*hEvb>umEl^F<(J3f=&KGg!^@MJ-$xULofRhyhjaSZNe+;ntMiWpppRhU zDbN};>*YOhKn{9dT@l|)Ncu=7U8*YF{+W6sJK+svP+v-`GYN46>x^Wxg zTgZ{K#3-Ut1$Opn>$fj}wbO`Q!FT6oK`G_8ji=IU*$Po;L~hryXU|!~ySfI#Q|FZo za>)ShD)m<1YT2PPnK&LQrrd(WS&16aiWq{vU3%^X@{MMVwJ()lQ++MQ`(QLPxff^mu#fvV1P@ zLBt8H9t%0>^C|RbE^G)KPz(5XL9N0dLr2V>KnL)-qHJQVs9)t@m~D63n2rc5G$LUk zM?&m8#m*U-h#WIM5j-EgIzOaNg}o4JZTs%X zQ|Ic#G{{{P$;P0JJ#u6BiU*P$E$dQuSCmUz6J|FLRAk5Au37s&fU8@J!Q676{XEIc z=80j?ob(gvw66bF$tKf+3adn5+b8lDADKBf47SM3loPn`B3UlUkXIO7(c)O?FFFdd z7i8lgca0%kWWERgYHE=Mzo)4UQcjejBxsr^^EiMNwkEENT$U& z_+ZB-U1wfp1s%Da>5`FaXRICgM0I{X2__1VzLO~#U}2ovmVwXHrQAhYbFI)3 zedOrvn8z;*M7DO)1DaVbXI9UcTnteC8BrGt&DO8ML(&ErGCVABsru;@w4Y|JnDv$D zy0CR@wq@D5sUv#OFnN4V*#W-~8OuvE6lTtLg7k9mrh#uTFYdnsR=7Z~AC8<4FZa2E zpx67Infs5{o~s$)*T?aHm*>~qe~WT2z&Vycw*K7zlJOc&J_Q{P#@>Ng(=V{C4)#zY zD0OD!an#fY;RQH7SFE-OH{w5_UrJZSMmpW}6-T}(d7b?R0E2HJGt@fkFGECGMDEWS zzK_clkUSs8M{fuWl^2jEs(B(eT|ui3X_{NcxT@paxWE!C<|CP_`*xWpxNA*Q& zjjSL~&(0@h+s#su(7xE}?Bc?crgL#R{C#>PNynk8>t`hX+#q!n34QSRJp?RzNVqdE zKO#p5Zb^A6p?U)tVoP8)ic;h2v4QX1yYV8-6*tUX;j4-~4{9ow4V%vLP=pRKsgt6^ zS_WZZlcoA$n6QUPX#3nt6gg3@6!Wvb6{>+Rza(z5&@G7B(9n@82OYj|o~sh6PR zOeT&VV0$CTX8-rQB5-qUGb|fh2kd@f;Nx$@M`18g*}UWS-|hkXXg$f5Pu<^9N%vxI zrjcH0U^X22T(uF@8N(<`n`6V?Ra+2#eGGumOno)i)|^0#AAxIh=@K2T3ZX6e;T$DV zt_W7kBXBiE;Njt-NR)F(J>erH%2g>k;1IY(GQ307Lk@fLybxmG_E1*MEK=fhs(a<; zF$pRWvn7sALDNo9>!f)%l;vk4v}Nq7dczt#u}P$`3^9C;xWy5VA$iPv3NW-@XrWb5 zu7L2m&~yYHu!u<%yiv5>nmP_RQg&SGC*FN9$2>JLW~49bv%l?^-+~>?(0jkZtD}Ky zNW$${3QZ354|vwmOn%nYe^$s~V}_ZjrNtPXYbDFG{tI;_A&+Z9+2Gpt36i*qwE>%r zNdSy;2JnZAm>CU~_K-@^x6TG&c;`BvlNEpoMphiNv6%J`OVmOB92&$-Dt0skimtw< zwr1}9VV8_fjSuJ#WM2QZZf^y*uPZb~i7y0WAr}2D8Rk2g$pikP3_6&~R*Ok=w;29L z?~P4g#l)ey`k%-HQzTeRtwK>Pn&rvB-Snp5(ECu`eS2p=atlZI;h?YYL zyllaB*b2-z^y+Bk%YH7~fM)E~i%PDPkCk+j!&;9q$2 z@X|Vc#@aYm=3PyhdX56qpUH4y%8Nsa>YEwj$9TeR&(qBxW7hND`t0!(W`d#QjF&_H zHakUELh@m^^5nQwNI&@_L|0HRou1m%#FZ$u4yLFt!#oWYBLaZjMngSsR!=CR#|zzj z0o+1;w0s7+kW0yGrzy$J9Us$Xm6VS^aE7y zr4b>4KagQX9YVMlh_KE)WcJ_T=rMOo$X{AabP*-rn6Q%6TFovBN84)FITF--Y;x-Z zxlyp^AtMK&wf0}4hEUYaPV@`-&rg&QiK`cb!ta}npuhBUc2qx`$p|XljpqFGqp2J+ zm(AxX?^wHFIqX_l)(a8>S9xFabqd6<-J``Z1IrjE zm!m?BpM)7c|F$P%S$I^mdS$meqnDWWA0FOFq_0lJ8LsET zHyIYP9o(vrKQmo)g?zQP3@4DmZcJKxQfz@RQ0)^coXuzcD}#V)ZXbDrJWs-91QPw0 zB6AZu`Z97v*mY2#AK||YC7XW=aSwv*}ge>W9#zNozIJpQx4{ilyu{(ns3 zd~H7m_I~_pVM7B!=OhpR?8M2ZFSTCKRTNNOYis@~aJ!nG)ij;h9*>agwa2Wh|84=C z*a7Ki(QJZr?#@9HITK9opmTh*K9Z@GksYwkJF*<7>+^BDLz&j@iwHqR^6bO$m4U%x z{NArD&mK&<1Hdv+u2$@XDgDT^EgwO2tkp z72CFL+qUggY@=e^wryK8c2aTX&ik(Q?Y+*v&biK?KIUv=wD!06G1~Lojj6UDz-bkA zkcR|yh2%8BX9;GqqqxM07er7Vdw?${ii)}lconc@+h;)(Pf7ZXtKh&uF{nn`ASQ~B zq#Oi0qa$E(b#AT5aLrO?PvO-M4Ab=Cu_0L`6V}8ZoK+}UcsvRjn)myG$k>Q?LLeHD zoKJSRpv_Sfd$e}+qR@tj@TPzu>*VmoFEhJOg6W@z1epjnm~&AStno81(2bx96p^KA znfXWRi*d?D@2`CYVUB3|!Z_F_VE})N1A$_uEJyoaN`wUk;el$1*4+Jb0^2G-5rlM`y!nC)oIl7*XNy#Xc>mE@ESGW0 z66nxflW>%TV(4yN3ruowV+z6mhCnUm<-fmMj0m%8L2#Z!NMohL79rzim`KM_%+jV4 zH$h@unZBrlpyDhY<|!Ju%S8*rs)V=C)L@nVc=oNRR-YQ#q}_5A6c&$|&m}Kn93c&M zuhfsYeR?;H-pGZmUKY-8?jb)FE+?K#LBK0b)FjJ+3-SNOS z=quh>GKeynQzS$|uY080cse}Jvj3-VqnKzKxoeUi`Z&Ip#^v4s8WP(Be_DN?Dv{xI zt2E#v*Dx7lfUdK-)wh^t|JS$m)dzSrGBX3{T-{8pbG+uI3+Qxa{d|5GJN)}GGe^WX zwzA7E!~^r`g5tWtuiFOfBp~Z99- zMg+NSXRpu8t&+7F;CdlK%W&_y%{bXmgQ}JYbs62D7G{C4wc$tdPhdgW(GtOxy{OD% zKwY3~*W>km8aZp0IuE*PY_BRkJm)f`0O4Dz^0Y?;!#GR)g`hk=vFP1_t)fnEK+V_kL5gmPXXp#803Uzb#5akl}6jf}uQbmWA zA|y<5kL$uP&w2xR?|Km4)aZ+i;Dj*~IfR4BnL|FME`B8{_kjP08y&GS(+5E_trOSS!TKA1?Pwhr)Xx>0scI zxl&O%Z&OS#-ja)k+cG=dMfoBGXr;f6f5UOfnrWus44c!S`=2MeiGxK5%Bv!J8Ur8XIIq*wD0GWe**dHkpk_^b?d#! zr!2w1L!5aiDVILila;6*LF>crfQh%3$3pc%+cWZ+$LV)6!m-Lli1d$yy&zTRP9uWs z91O_8N@+j0wl@*$${dNliSi|7qfKUB_rx@o(F;bN<3J0H`2|Mk za1s#R0qbA?p_3($r>OI%@md8Fm4=N$k7!Uycc}Lj!>Qw< zxR`R5-Oh-w3i*5kc*>nZ#F$~25Yszz$AOb7RcGpR{hhV7Sh#i9rvF2ZD3Os)w;hCJ zBc>TyXsuFcH@VW1>9-m2&3gR4aJ&#bJy?w9gVerO$z@yP3SfP1iccGt7c=n;D7c zsD;zgTKqXQD3aZ5qyjh7So)X`oi5U#E(j=`8{36O6SrOQLULQ9MvtCzzhwV`5%MS8 zM}1LmA2_E&`TwSogfQa&pEMHvb+W)my;9@ZQCFU4vti+S@1JS`HJ(Iaq>LO^LKYn=*ci2tHDDp*^&wLsjobc^$r9oxlqm@ zoN|2di|^?fDi9FTRdmkALb_v_&ezQ$SC*GQsMrNWuKQ4i55gNd&Z8cdRX0R`l{IkG zDh1$Z5Sb$+L21AXVxtjsMa9JnYm?X*8SJ>lT1F$ysh4|aXWAVPrk)5I|8xpwMpDzG z6jB^2S&W*k0xq}q)zpCXgnd2l4}jMKyCc5+^8XK!Wc1Ac#{08&73lT{QF^Ps`r2CI0rvz>$^>E|1_AQM}shL zA85V)Y;99vqkG0k^YTua()DPa-Ce)`k80l(bkH;aYH~fvU-lRn6$OtB_u8A<^$9d1 zSWRtDFoi8o*ORFoRq)QiB@5sdOeB*Cgkab)D*E%~r%6wn?zoHkOaL?3 zwv@1a@o@*+@P(N0LOeA|*QQ4^<o6 z>A|8o5Acn;t(h^GGP!a!kqhu@8XDRueiayJ9I#3^=n`^Hk?yG++VlD)cuc}78ro@f zS8e5uz7r4+Rp z*j;X%7&TysOOdyNz??%kZ(xhbIr#cWqk-w!eqktHX3trve<0LO&=qTx>WgfZZJqR| znluarjw0N-bTSk|#rz4RD$SOv0^O4UDI->#EXAYvnIy>zMi|m$H-=7;@Ura^9Rb+f z-snM>ld-e?{0(%fk)Ih*Bho2!e~1olQ2BPb>$-@Xap?j&$dk1_|J)v(JB}KiHr7Fl z<`_HD0?kF1?aFN_0!O@?0HoD?{JH@Nwz7X;=!l_GQXN`d77Fa)xYEEIq@^3pkck&m z`18jouUXdA8An*2AqP2#xj|h2Rp+mGliRCX1`nvJk{l$2(FRNWy3>Q~l*@3PzM?rLQH3@2h0-zF0zqr{(^bU({k*O zGPUK0E7RXz1ml(_7WF0S$d4BsoS?5I$1-5Q=)@Cd4aB)F#j%+VUSBy)Mh?6JK*xgW zvY`H0UI;aR!nKV1EwNo)Je6|=3L43V>o~<6~l@)mXdu5$E_}0_IpCEHEuzV=lQ*{Ey^3cA}qcN zpCB=(WRMN&50V?ERX^eLHN<`^H@7`FQJ6rPuRdju>=&P|*FiuhCjIV*!mTwG z9ECG1Cy529h+6h9+A5WJE;!ev15s_&9E?;l+5VjYC3Hc?ifVu*Z@O%dS{T@F#1~u= zkj3t4|1zq1RGM5VbU1{_r-Z$k<^_%<=6R2v$i`*94m9*aHbhnT4}bbet@&-GkE9TG zQR?<{^~R2`;M<%0O{4dXu-|i!mg}2g1oc?iEb6HsMMGjJV$?I+b;_kHSQ2S6(FfUe zpHbnPvFV@Z>UX6Jym?Tge&`AY)n5v>fp~`O3R~Ctkb;4%COhN7bxFTy1N0z&|Ea>; zU;O8YIT^~<)MPOC!pGw4#c!ytPj7Q!Cu=$R6YsvL^jSFA%w2z4ogxjSr~-qy&t>b6 zYH&)a4M0g59`4AV!|){KzQHzYC*`U^iLF)IIH%ql%cwS6$z`xfQVRjb-7@pQ+bYt0 zqf)vYti>PRb*a|3ylr-EO?@y0r>!!GH&1(%#E$yB)#+WGtq2X7mgVZc9XU{Qo8E9{ zOfZ07eN~#V&l@}$YI0vOkso<+A-fB=yuLz~CLP`Z7o2H0!+SHf0|Vvq8rmBH1UP~C zg}Y@RXihk|Fvwa_f??B$d7Vf{UrtGy4tkrL3QGU*zz_NkEe7ka-Js%{<53Eu;WZ@?U7f4`1^7Y-_EVNoOH%X!LQxVf^iPdTb zH1;$&&jHpi(v&&lo>qkq?}&AxHh%vG*J2Ai%A-F)hF2{<)X-q$===|u$@3-GOH zliq=0Iz!`62wp}_i_9EBC`NEr0e?lJ2Iz-Yu>A-0~+YQdK z3w$!YE+zvTJ!@4K8>rM%_jSk8r{x9ED%ygVM&6Y z@CP>wEyBT!t8_~FT(CO>JAhZGv{P#D(e`c?v})TQTU=t!0>>m(0E`-zb`U9eI%8jb z9syWtlHLNGsKmDtL?a0A{%(?R~R7FeY%2EN?EY` zbvC^&?y4y68nGlM28R=3RDv__4Z_Czq!cnT5gQHBMJrX~-Flp`N>*!7;VsRme@9U`g)vU8V%23VCSH=67KsV$#%(wG=MuvAJ$`u4y z;W2JAxe0QvncbHYzxQKAI+jo=sbhc)Q``7O*l-!cwn!+IDg#O=mEo-Z@)mIOEB;X` zwz5s5^Ll+Oz4?s7CWrha+;p{?8qvo@x?$B)ofsW+V7ez zm%1V=NM{SmO~XlN5&a7B+3)&F5dt28{t=sJL*V}X0X@E93E?G35}(`3aAd=e7NUN| zB+uQLX12Yoj2}UR?c|`p2x>v*5#>w{JILYe;cI>Fm0Q})F6;s)>Gnk;W@mLR!v>~f zqswt}hU=*P2RIr=CUD`QBh|PleF|_H{{C9w}??6u={|)fu6W9g(?(RSQ@8J5_zyJQ){+1H#lD`AbDF4_0|BuJ# zJ->6MhmZb~tAF|bs__3V`}LY^ZU*e7#{$0g-wz6XoIrl}`o+G50_KyQ4~xS5g;Np% zjd{4@MT_tjm4>f~#Va}i7Tj|WX))M}INEQMndN@5{T1eVKz)X1s9;${|>OTA>K%XWOpr@IE2D+h{zp7b~w0c?;zYtn-;~Q8qX{;hXuJbJzzzu>T zZ^XYfhZFtWyP*FO=~ez4?Wu4WoiOqZ^Pj~R|0S6PXnCc-JiS+*a`7C{g)SpFg{Mtv z&HPhl9N5*?a7#oFq<#M&WPdn~u5tl4!S#GswAJxi*)m0mP6yg9L9-+dVB)u0|3xx?7+-$e1UXso^KwPY|D3$94KTeP{82`9%J>x9sLWVa) z7lvsUmmU@63&7rKj@LPjm+fTCWbVf|)r<;%C>;MPPL@i$-K`jL=0WdYog9dCC^a!e z#G(ZAF5Hcy8yIL>4H|cTEs^fyK4MW}iZC!+kG}Q7_(zUH%fdCAZ?4EjF=G~EmQcf| zfF$Dd_na)G6?U>7nik? zvKnMAA}ThXKTzN*fax`ZaTGUC7SkJZus{Dv<2Wa^hDS4{q*$hZz^QN*n*qj(;ob$7J^!;RsbSTx6_X`+ zn>S>@y7gOtIw;*(+$LOxU6OtAG$sXUr@Bk8ww2avb(#>I#a#?x=1?g{?OV>bYGP8D zSidP9SmPHU5GZ=us0A&DuYs5rn1kl4T5muD6?vDSNk~TqnhF_w@sP_UqD4P< z;n3M{%TRQi0Oy-?Z44*FVq)PUd=(`9^efaHA?P8PE8dJoh*%qyyMQ+FY!^)^Q`esv zNip<3~at2#qP=z}Juy8Y`QRdkU zse33S)J3EZW@!qvWwo=HXJX3vLE8%et|0*fbOiW>qvFBxJ0tb=STyU|+H>boV@RBw z!QD>*a30jj1m^v@jvl8=@ot@K)u}Js684iyIoi(SyB;@7?`DlI?8gnL4F!uoDyjn;om9?Tw4E7gVn;PE39(k$Hs8@-7I3a7iNz>rBh?)1GPP6je`Q zVc&X@aD|YMzfk^yu-ho!|yGxC_N}_Ckw04^Z1p_LKn>x)P`oIwuWeDTK`^0&q;A`kM zCURDy8Z0G753rTovew)sX73-bF*%eROi^itwOh;i+UcbA6K8LcmOr3W{t*n<&nS zOALDREa!WB$6WA8ejzd$*af|lTBXe)w51OEgQ}YQGBBsc({9&r;66J_$Vym7!|4$ zq?VimxOM`QhgfP**&#LL)6l3nzertu3ZmEB>I&ogJn=w(AiSSy_~PF`C+A(f_MbUf z1s;6d4>Ww+W$tuRcYrPt-+mc+N)5LsR2ErGV|qWj#8zyvu)Ax%O z*P;H<1;`P^uWbMWPi3pHv(c;gZVW7$ufW7B=X?S6U>6lQFU69=K#k6?=*khJ^^|4Y zWBt^=ONh2~)A5J>vljV8HRvPRmx|lpXxKX&NW4h*aT4vF=s4!6VmnG}MW-O{MhU8G zUbczX-Dnzc_$!smhAbmQ5)z=z9@GLU2U%+r&ZYC0k>1#KL%fhiI_~FI&zdgy@;g*K zh{L6+MGp3#eoWuBSS~cH$my+-o_afW{RolnnRmAEi{MCQgJ)r%e7_s)q)v3g3sM;u z!&K6_&f_0}x~s4kf60C4P)d>)VAD;+mcRywTfZk8W+3m$Bs6I=bed2FJ`eh(`b1Ms zu_mVJ%AdgQWlF3InAIlIkbn(^&C^5SiW%gT0rNw}tf?f15`6^(p~FLs3i6Q=Ypsi1 zOdeDu%;&%#N;9z84=^vzo9huePvm66;3O3KSm9*?-^vvbqhf$-kgf_TBH5 z*x!ul2^p_BXcf(^vLIJbNRwLRH7cZv#gs>&wV5ST71)^iDBXZqA^oYwW_9E_)8EQo z>QO@*SuEznU!%>F7Ap#;DL&Y>kpz~k0EsVAO_s9_lxwFEf=ZNy^I9#@v8BXDD_`iF zHI`6TYc?_(6KB~Wed+2OsU5(I`w0?ecnPP07XBVWNq!h>mf&9@Pq;O9Q0T<>s!DXT zX%$K&W08r-EeoAsw2dTOi<2+VH5U!gRONC#!(CTS$AT zRzdTf;V8p5viRb`FGU?f5poMQx0XQLH?$wHOmW58NS|?z($wkk*n@l+38i>k4+#nQ zj5wHDMFamzBlE0&( zA&@YTp!UXT(1Ed9EkRW}L2tJX2zyx?#m@dRP!dKZm6?=0EzJ$uR56TJ0l*EYCr@KJ zTnpT_i!@ThnB_VyUx3DHKZUQfwgAtHigWc{9V|qBpIOs@PpQuQT+B$!#ypKnc~cc^ z&3wL+n_LY8i7hypb$?Z%&9#zQN$`!grjyMPO3R=taq9{H$Pev>(Q)^5`!8I5!CS9tyU2P2gRci z+5B-Q{80!hU54sJ^@lB+iG~zU;K!(0B{*VffUmfruMK0LmFR5JCunSCN3YjLHqz;A z41yfDBZodb!IXB@j1Ok*8~MvNs1xBEOmtV_P7d&_t>cWt$MY= zx75r{BTRXZ`RUPzB!|J*=Ns;-YZFN`$(eLx(Y zdxW>ay*wFx?5`?YA@<=m_7h%v zh}|7{jdwL*rar!*=%ytEb?a4EEMXXHJ;rfKB?48KT&GrNMIZYO!R8_bDXu*gLIVzdD24Jh)GOxw;8 zf5pX(_#7E}pPOY=$gzRg_yx3HH8;LeQXF`()VWCbr?P?zxjHS=(L&tab$tbgz5gnr zn(c(b7Lv6Dd*JRFhAXL6!^Vqqri-w~&&Ja!`dFdbUIQjpLPN0V zSc~T$H5#dJQ>0G|9)jzD;IcY~#OqO&`}&_L&kHpD`ikCg`OaTn&mk?vfy7S;BNmN6 zG)WP1js&b(%ciGw72qs{SDW_@Cfnr=OqN?1bvg+u47^DcOBp z7p3l>|8vu8RsMh9`k&xK6wyqlpAxdP&t=!e$;o-j|9)8c>h-_n{*Mg*o;l_yAUWzi zW;C#eM?V^P{U2y)QXFu``Ks+jj~#=Di|)r-^iQq?l0BlU@+}1qlNr(IRg~@05oa2x zz}zFS)57jJU$bxVJI~kqfE44`d*Xjjy?*sCH#u!72>&ss@Ry;J^wING#YBPd8+yhe zKG``ZD6u&;r(cs+Ii`+XN5v5=|HqAT*^|e&nZHdqO+Tj1-t=D3^_0K;ndHp^Ov~y1 zOF+1aOn+|4Ub01q_nxDJ{=O>lDL;$$)!Wci7oP?spnLz|XTNWYICk&Zby9jpPSP29 z%h4(EOfu|oKm~kjrY-p9;aRVGiM`2BDn^X&#n{ho4PUTOtp>)Qy;uH#dE*D5h0%qc zQhR4MjX9zd!T)X-8dzSLo_A9v>g_|`LYcEFRDnlmLR^tH@He0r^feKQ2_8@bpN6QY z_($dZVBFZU{|bnTxzWGA?Dc59vvS6rT}bH##sML*;P!HXe}S+5FS)?1@5^g0FbVjY z`+W%ozRrFJ8^Czo`|Z1T)_tD;#H78~*2RcFRK~_RMMu~h3Uwssf1$Y`3QHkpmOs7- zZlHDxtw?vclu|0Kx#9W739#o-rceA8QI2k0x*#W1wC@ie=?}`-8V1?dNntJvZXgw| zpN#ZND3wB!@#N61HoL_MiSl2!yZlC44o@A_xUDZ?lga+tsfWyC&B6ixct!>##CIX? zqg|tul8AbrU2xm*pSLX#tGYQ|nVSBkDk>ART2}DHkT>Ex&OW_{Eoj;HCftPE5UC(G z-uW86eKf%AHb==*Vyz=akEcO)Or3+~`U}N$P;U#FTHqGGS>V-t54(y{q_U5pey8nl z0PXJ#d}R?g1;tqpMJkKv<-dc#Yp=3DqRA0}96V2Ij(>jT zmDstKn%&M75I!q|Jd)iER^}svJ$mI1T!saF<62^pJ)?~?b*^=vC z?)h3?Zi0-=@$Tt$V+*zXt|P<8RbA?S*?BCmS3-A&+C`pOELV&k;kD|mJ&n%4bg(QY zmpi;zNbG)3Q)>LR(pK{A8-g}4C~?jtgoNI3oxN2;BNU>j2#mSbOLe%I^Hcwp_(+~XtaTKDzc^x;xC|_Q?N8!y^3yr~5?e>1w?DL9gpR97tyFWMl{L>;Ty-Uy_Wr~0 zDWeVipSo(_g@KbhU;fPU?Z7nRAlM##Ax6_4eaB?o=%){@Ds+kS8R=5L&XBnN@_oI zhQMq7U^-U29W{lkV&L}wv-ApkMn2M@p3ht+63~I4cZr8|q!#ogSkbbIKL`(;l%?Oh zr~CvsnGj%^fgtOFCy~7iE=|uI@FCe>r`CrOwc3wjHN{ks?+TO7hgrgp-v}&2l`a?Q z@=L!HHni(0#r@nMD+pw)48Jo~CiXqNTKNqlPFZ1eag=AXY4*3omn%Dp&)*Hk$an3_ z(cAoC`D@eNUaxx_6us{o%M%Z#CFXUG?llkdAbZbv4b@f&%bSO>Pm&k$J2aCj@}NE-eqtmdb<1%u;&cveFZ!qi6bait3>@LdSZG%3dA~GK3{h;XoGj+PKkOW` zSo@G{P1qer;AFYOlDi)=H~Z2S$4LBw+_Kh><~;p=L+*3GJ>#fzICnN=t6)J}{6WWl z9Fl`*F#V;VWNx36=FglSVqHrd%n7@#c30~Mo`S4hokmaij(6|_gjjOSv-nOBbGlRT z$YT#-zfX+ELkx@%Qbrr$6ByTir1)hv$jp9_72r?b=$Eu)AYH7tT4@oti0}($wzq&$ zP<|6m|034OKNuN{7;xir@GJ8WYKdKC1aE`fy7F{Y4&J4$>^_nF>j*Uujlg51NT<}$ zDhG}{xec_2amOqtwZ6(U^%^WPIZ!`bV@!wWYzIPm+LfTf{`NwOBJbJY2Ql$K)S$#O z5y{c|f@cuWf*cS^ae<~Ers)P0wm%UQrhTHpLjqEHxL~s2t82)V(LySYH!IHmg<$BH zLf}?;IA+=0s#}`cAtC(}Fg;wSphNqpsQE+qukd=lTqSMn=OdiGgzzj=8Pvla)w$5I zA9(ts@*Cdy%$}~XjkPdqXomnbQ$VqC8jhR|h@I>i-klm#mtTVzaODE2pvu9oV#lt* zJpP-h&G3kSr`BOlKj;R~2s}3-|0#4^u&+Um&?dz{{Da;?Hf+E_A;2H!B{tvs5wPcM zN)wfN>+Zk+)`Z%Vp8cA~La*Aw?oC zBxQsukOtosB?Hn*B&EG(JZ)H(2j>Cr-{I+?$M1~ZW&P`OIu>rv6wDI!mT>BtXZOJx z+QE5@;nBIhcUp7ZlL2w5xL5%+IqtY8r(xsWBnF5cjY41SmW5B`Kdf`Hl0I!8LCGV1 zDp zbVqvraMV=*1VcJcXuu0Xl5th2Rk;^3Hs(%1lf7vE8P+jSlcnC7m0_b;u+@VuKtQ8YywQ6B7&U06yfDE@Q$iKDjf0n|Kdg;XOfcV;aF2G0CMf%Rn7N)UZjNC z+VgiA?stT1hvG}%VP9Hs22NX4G2yta18yN(!V+WpKlMiDY_;aBIh&~2436D}53K%a zN1CAn*27{91;J3Ux=Kn&O-!smEfbOr^3*aS~9`NMJUk^wg_ul~leqH~GelPru{ELtN>`uVL zeX0Gg(S|snH;Me$7j&g(t=H=y+!OATWM|-l3b|#oLK35N*Y4i=4$)yvu+E*r>qQSd zlkMm3*k>H{@H-(j-`8jiPn!PG*J$!u?>90DG5*++U7)6=s#FKqhEtj0@;taw9NZk8 z+`694mSb7z3KXJ}AmQ6YW_o>wyo!gxC};+{>|ZJrW5%JRP~=5J^jpbqInKrJFi6)n%T=E$ zCFvTB1FHP)=?v~p7-ON<&K(ws#;7adIFhn$CdLdW#&|N9a<&>0JBVM3#tH(krhEnd z)z3Ja);J{(PY&r#+G;Fl9O#l0meG%n=|KQyrL$nw1%=ql{k(iES25A9bu^w3IAWah zbP9ebXBg$rvEkXe`N}VyW_S*g#-NWPgT)(?9MbJLMehDFvi5i~yvwmK9u&hcmm_IL zD}-SRr@o{5R<$}Zr7)qV?E=QtTL}1=?KiZh`h(v_@NJ)O9f>JPN(B0@yntFCnOMQ2+ZPGn4qHVo_$3G;6z|LyN8 zhHDY>&qooJD^*0qJ(dEsi*?GGFg4C!It%1XdBz|^BW2%S2x>-M4G4pmQ#*zY=BdcW zN4EY;qF`)%6>Fl(pd7jKs_MIR&43*WxFr)mZr((&Loi6$0yN$A0&-qGJTiODeW7M8 zwSlJYw^>YUfYp8OKd7!m7!Sl(d(-t%|MrB@Nq@bshyNMN)SFxXQ3|gk{>3fDFZso6 z3p_vWz0eFUUH4BTm^nG>4NXBO1YU>{m;$eUYp#$yC-uqjYlb)%@MVO(-=RqUIOQ~2 zE@HSU`4_0i2@RSai~J~f4gyN=SmN;`$j%mzaIrqf=ep6X?miELC;bnQUJL3F>t8-R z$7FpkQx`~yW$gf_EU>Qav2PdHkx;tz zr7Z=DD$`%`VIBe1c5hHX+eU;U!}1T~QJh)ZnX!oQEok6?;hFc6$e(kCBP!;(e*%-? zPLFhHw}JicZInlSA4r9>N8J8zHP8_$4BJl`B^00So?sk&u6Sx%I|}zk7oq3d@V`#JY>~ciV|bPHLV zL6$o^YNFTgU2`ZsH;)y#WOw#R!eZanujrjFY1mVdEQgoA>m!2s2>F>J82bIjx#_QD z80Xs24Skqst@LtI(N(fP?)~PiY6-}jJ#mamXvd(*e8ykX;u@S`S47^SR|NMF%tA*{ zYkr?e4yk}&{`gZwpVLQ=@j@PbxmQ^WbKl05O(k58e2H=_@q204s-HR@87JqIC%ZNV zQU|(f1!S`T|K-T>98k+32R?;g!kYW4SRs!JWtj&UDKmfleO}(as!(Q_AkjAJii`Mk zXB#aD9#jw(>VkZ&$F;=W;a#5Bm)jQpA{=a5rr_ETNy@sWNH76<{K|BZbDhr54gNW+ zIVojrOv^LUZz+|*A;1duM^h!j*T&}^uw0_$^Y~g>3l=aCq0&J36N{jyMopLXu7CGh zPpRI`2~8RHPO@l*(NR*7LTy7AFzQiTrMb6YnnM`L^^-m#d#K{;`6YF^R!7EUgD{}A z)V$1l80-S^`RT2roj2vZB;IkeI#7MH4f+=Ia~?#NsT|`T(+o{H7$fLO3JDkb<=-`F z0#SSJAEdhT)7|OqZiMZYlOV{o(#jaYH?Roi?Alnqv>ruH-LiDl?f^Wzz7triITy{ypvopPsEyA{7Y>k~xoK7|ST8@mQ4qDHc4Quq zVoi3m(DniH!guhSAYw$tOqS4e^D&u)YW+b;AzyA3b#(7$d6?e3>tTYyyPL;yxF-d- z(e}p`5Bh{!!MX6+!@@eJ#61po>MbU^1}}V@Wph_pM#XhuX&l>94x$%u1+#!POgdM6 zXR=xZfQ5t+g{xV2KRph^NGz;K{-K(L6x4jK#VGCGT+0NGB5H^yS{L~+b$Gb+@;ir7?oFHXql~p9QQ&%QjpSg4Sn)e zVN8^Erx8^cNeNC*t<(ce^kQNav;^O&V3?6kwwpa4b|^T?v@%xlZf_KNhNE*rLACSXtVl%YH%pB)gDHaMlA()o3h>Q||TFkGU>!cW~!o*g#lr9d*q zGeX%R&V-OKu=Qi+vTTTWQ;E0$u!S@DVMznpEs_L1!_67mB40@|DWES z|MBzuucWWn3_kTmpkMyG{-kv1yFMTAd75YO#y>{!N&lE2U9IDmm*I*hqZgX(t|Cn} zs@4m;?5kq6Ik&PJNbd}^wlwYW_>UR5>zj@Zb?q-30oB2vPpt>4o$Uj88Fjk6>mED~ z6%z40)e|o5Et#g1`%fNDmMg4z7Om3dSTROFO~*v|GudZ)+gLk!_4s*Bul6#=S|!cU0dz>rp2ZNI(8rTZQWzUK@|##01pW(eiv@_}*%KKAyjs*wOQBa+K*0 zT#g1Oeh`kAzs62+$90@PT7O%)+!Oni{0_rc0UNPooRJw z(SyPbeR|uRuD0(PUJ8S!KL4CqX}tL!5Ovt;N#PR}cE_?jZ&`kNX%_HV^3 zuILrg)@Lbtc&TfCD&|{9ZbZZ&hBY(r{lUaCmW!t!(!#(tBy=<#7+Az5f7B&D19#iuEgxe+Bchw%a0Ivwi|@e$(Q6{A>ti zAwb_SBFP+MloF+H<4b6g~%<{fAl7BI{f*c3Bs$kO3Ir5v63dMzy}|sX5WE) zk5Bfpov7y-s_N5nGc--dW{Df{(Qnk}=1#)m2YGBPL;T}vgL4Ivo%qAu<6+TuBH%maRo05H_m@c3sIIHwOVbVmWe#M*P&P&?umpncQs6MV#pvw; z?Agb(81WvK7n=aqMLod7pGqVVp;TaLAY32^A>laKlIUg@%*h1s$invqA_L}DTiCQM z$HbZ;ak~H};ES-bm+J>N6-92{;$Z9BpvLh=Yxk-Iaj-shw#HBHZXz4TwWAb9Bhxs{#6Zy$7M^S2oMmOPyNu_iF%+2jG{m#L#XowaC(J4K{funS8N6GR3P5p0mVi#VGIPfK{N3jJAIm!4-Y9 zvG`7HW3)nbe&Y2(_sm`A86=T+%q_pKV$>tc2_Lh*JOL`F-y0suXFOb^!SQ=;vtB%8 z{s~?F&S${8rgyv6Hz)meZge(mcbkttxc=oOqdx4}uAkrbajy+) zVx!lea26)%Ib7O^j=1o=`iya3?0lYEJw86Y%opq*yl8*mhWH8}Nn9(4LScyIRze(b zBrGmHEPs~sq`sp2O-inhQibna>ofkw6g^q%Yj53a4x!Qxblm1i7TkdH`L*-C0HYnd zgmg`+qsoy7#_d-=ud1n@GcYW_j+!p)HPjo~W8_v9qN80&EX)b@{Y?m1=}Q08O0%?f zetHAA^XI9EN;ht`CdEZ9Za#|m1BBsr)~+kZgOtm@J!ai5Tvn(Eva_MgkIz@-ggasW z1vA@z`{KfRjFlYDCJAAia|a466ir$4vv2#=t{Eg0`RX*gn!8@Vf}hIrz=4_-U75#> zY9r2DNdUz4j85g=9x(Ju{niesbdgq+hfGUopi#CE>M8IA`S#2?k-xqF_8po&W2gGz za9~(dn8T9dj0;oWx4Q{Z)R1es6Q_nZ?)jp7!_hJ0v)rTkBfuxCjb2)CqO>#Ay3(m% z2}V~nTG8MZc`1ly^rlJvzEQ_jacD3$HT-8W36amB(BEnSH-IaD1VD8I-hjE5a(!si zRwgWJ8rj%T9^A7)KLD>GJff1?&~dZW(8wF80I<~u0g{BoilGS|AdRG2L7`{3Cx?G- zGM~K);V}8-KA*&>o4DTKk>82}BBA^>e-X=Y%;>=0J)qDU?_e=vjrxnxnRL(WcM6R? zNAJ$IkNoH952(~kW%=EGjGyHz*V{7Z} zeWlv_h1+>HRJ!zBmn(;in|fe_mB?lb$Ezcu=qi~vP^ddIoYtIT_6@_g=h7@{eh=3`W~)G>@RAVS zjG;-L?9VMK;8UmOHpkA9C=@gaq?GQ6?LRkclyh5X4LRI$NEQz?%P#q}zIR~@nI|_B6YQa`CeaK3u6ef> zq`H}eJ3XG4kjcgkh4}`;5o-yoNk{h!JIgIn_rGhkllwRfNfa|pq1Eb1v`-+?;VzQ8 z=%k3zPZc&&R2krM6>C$Q%h;7vcBQHwSUB;VTYu+se=nr!3f5l(I$Ahy4g|Kw4!#6> z0Oc=$$M1ZvoNd6uhridq_B@>Z53F$qU}f<0`_4DV>!SlGEZF}?>pv9hz1jbt_fJb& z@Y8qxzr)U`{lf(PZ+@-L(ddW2{5{}P_-+R?4fby5@0|Js*RyQYU!$&91NxO7Lki)A z9{Fb-+NIvgp5hHm9^&J7$3OFbRDkcEk>3{sJ>TPxeW2>OzV)&3+w|UC=bW{4PsUJ3+Ov!L%7-V$iG90} zauKQ_|4%NtPAD#!jf%6$eFAH@PMK&Nur^Cjq2+(n#m_dzI>}fs+pmNVwVu;ZS$Vc> zr{E!_aItQ!=Ixf$U`_%Trs>OyZ7BU?b1_uqF5?$}fsanM&b$%zw|7f`%^U#p==prB zivqXy#sB*4Sy1AFp)E2Z23pz&QP9>|RXsK(1ph|MYFHJ4(yKqxGkWz%R~JCsD{#5r z7BCu2<-vWqAKOHrY6BkLuocV=Lc8bv9?6}p!rOlGj+_Bc@yq$eVU;fop83~9d-+aZ znEzga|H%&D=5InFs0JErD#(vu;)=b7@HOy?5pLi=2C4K-k$!R;iD6sii|K~&`1G4; zLdEWj1VJD_Y8<)_U053No~^y8uN}k`E%x9O6HQ%aK@QKXqlA2;NA5G_LT41CeS7yI!OwP#UPRJ!2Wuw1Hyl4+KM3BpBlKOpkzOQGl5G;(JR#Z2MoP`pTBZuD z*+ONLuAyyDTN)2^W_II$_GsyYY!GyuG987CUJ6>6uohp$3}oP>@%Mxs)p*BTqeQG; z>HDSO$3BCT;Y8?{py;+Dvc~`ob0a*{Nk_XGGYt_nS z-mLGmmSRNc(56@Ik-AMQmr*O%0lMI(40F;ik!>|_B$iiS#3}V2#t?xsH0Y7~pLI+? z$<%$?hzQr4Js|=T?u*NKnUO6dvXv4CH|ZRgt|48aL-78r_J*VA`t{Vgf^01^*ai1) zsKJ3NQUAB}zH_tLsyXYL(AuEP=Pg$b-ZIjw&R4daa}`<=(UX=EKGG6UvqUr`4*}ko z>nczS((Sh|xCRa(LzdYI^6`5W+mvCvXD@QB^eS6GrO73}nRpHd>VAl0IC6wFgXyYT zuTt1)DyD9>~!wluk&PK670Lz(`lM4(p+t9$~${NtIcZO*>a;NYtHu9qd5W3~V4B5~_ z(^$|DEQKBwjI!n;1Wy^W4V6Pf8j!_WL--|rTG%;Nwz?eU5_u}18~Fsz$$nxitaKNft;o3)!ufo{dew%70Ut^=N@tK~W; ziK~^rWCYzYpJxf(XK*I#o`aBD;!?xkuo*6_bkCcF6p@>ff$;8894^1>C@BSb9dmok znm#qKyG!hSG22ZtE@G2CY`3YQlkx|OzY0BA84X_O`ofZiK<@jSN=<|qijjX`E-{88 zp4!d={$Q&r1~nMY8{T2JuTGnU+3NWyMMr?uZd!NoYazAZX))q=J>a!!YY;`}Z{<`O zoi}El(b?8Af@bab@-LD$FfWf8yi`vKBU$1BUrANTW|PO-$`A>FO(4fylX8>OsL(02L+}E5 z7z>4l{OldDf3`HKz<94}1!|Fz<9gf(fwawz%Uok96i>&XR3cf})5O732=wMk;hI3; zx&h;m%qD-`w}4xIZKUP`RGRi>n8{>Fp*Wz4)a_UOO0HPAB%8B6gqjk=uB~{kMPKZF zr63pBkOdcze!qK8ptHN+Hb%kwy&N=&9N9knP)xqC|MmGSC??x*scqi0s*>&roC7}A zR{%{)fVV0uJAo-`<3#RyM2dPdIoz;H4DC>4WCE)iiQUcz3lp#QD|D^Ci4$_?@P zUU_&+t7-X*YL>Y*hJIo;UQYpLfFgX?l`+#4J8MX@o;Y@pqk0aMQ43-0fwx}=)~!Bp z_)JPeqZOjuLkkRFk)tv4c2`W49ld)9XymUV82JQGZ4@qBCH&>>sUYvT1*eOzNOr^Q zJ5Rz@b7Xk!7Yd(;?f%(V$2`v&kV>0HgCLJ-um6Wz;zJkQd8ZCsM{IVP;9E6tZDV7Z zvP*JUdqEQ&-w$kYvm09Ub0zQ+C0D;HEy3VT=}m+}sMx;z!%Y}98F444bk7Nw*n{w&8WeI$O%)N1_{^d;nCq0!FGRQj1O zZ+m&{Xk)Hp!4ZUNG>E2);`%u1n$ri*!O~C_y&%vgOxW#!X*)0#i*?~xYO&a z-z1Sjur^9!ITg7@;VHpH(c_|Oz||pM3CVxbsBd2gg|l43?RTRkalM~N8yP$YCuuSE4-0d?oNvRzZGsov+xF!NBk&x3#d$F4hcHyACr$ zfRC={-wj{RG((A{^7*E_ih49IL%w_3yG}(>IxR%?yD}`(Glp79mx**O7Ca1YP^Yne z0-crx!n}ue`)c``J2y<_QP`)j+0~7R)vnU{9VFLRoq21paf=>?VDC4d+lDYqK=0++ z{b*Y_=SCqS*?01VkD407IuWvLl39d-AUAeP# z$_Ja4nU{0|e# zrX_@^0JH*>Y0M54oQk;LY)&>H!1(R@}Cm(dUVOZ(hS*<2j1UN%>Q z9Y>r`M#BX>*-(NDEUj}Ai<#|Yz0ys&Rn*hofjf*r8e)VHj^+_%jvu65?cg7+2xNkJqX0SzV~~P_<$_4 zNxqBkKH1Uh3a&`1>+>sG3QgSB$jbZ*NS#Nb&qLFbUV}yo8>@1fe2qp(LqHHpt>yA( zt;#6#yV;zN8jHH?{_v{BeA#7`T$=1JP9*=miG+Cj9cLy2(=&_?dDOf=6aKr6IQ&C3 z3z>$ONc3=bs7{2XO#3Jzj1U>1V(AsTVqb==8p4K+DJk6kvI*dUViGVgj?q)bW2W&; zD0yO5yalE}l0(RCv*7l!V1*=gank@1~n@4W-%0C%ebU+>|x!K@iXiV zKT3ZgEerI4F`FH-9bF&=^?_CRqV14QK=dgO2~Mt^1l7Pfv7Lo9`FPxR&XZX5To2gu zS?srteKTw&uk;)&to-?{GfI~X?}Rl>vvSx=3K4RmO*Nuj2i>jcTM&^WO3)C}%qX*d z5tTHNY~@r$XGJ@I5hXl$EtxzF+S3%ltD406xv9 zIkt#1fc+?aL&r~uB`7eiZrkMru$&@qlS?5OB!R(rkp(O4X_WF#wbQ5Mww{0I&sIU z3gbbND1VtHanDK08qxNM@#t6Wvo;WKR^_#q7IO4?(SJGJZ7?N{%esJ=E4?S8Myae}Q6}%2l%W@3 zwYcIuJycd%9*LgsDPR`q;?gRavDEhm9y_xjn zC8JW9mV8VBgY9yr;zG`n&*E&cB9VwP{yGolTc33n-KrG{axTEP1**R=u1mB^lS)Vd z?bDK)tejiw(L^s6?jr&VO|&>3L)fASTDfcH?3deqK$g4e^jtFL2k%C9LF>eKS(U2W zULwuz{9s)pPlHVe~3meFLQIA<>_y2 z2$7IRJoe^xM57RWWl3th<%n2#A0i zFTWDHY4G;+adiEbd8u)Kdaihh-(FifT4MsEk?wk5bm#Tjz|d^4y}Yb5YbI{z z&z;K%14<#`3g*H*?uFs`&O!M2uTl_#{JQz|=`~!A80q z+I}=7+XH;zZo>6-=adIr%~=hPn%3cNvu6(e1C$beF>nboHf8Qt;z@WK932~_aU7Pe zNh?(jwJPTLhUZoxq`Wk6wmbC)ybN7$JT@;|lWTb`EB1`ZhFtPpl&o_S8y&VB(XOSP z&5T$kx)yGU%_^l58Xdt2ELH11kVtChT`B<$^mNIOj=~iZAVVeRU&AT==)VIPr?aXB zK#)(`@`rP8A!ut>;d5ZC@qIQ~F&_9a!8J_i$5$L)PF=Z4gjj`Ht2?U&(75y5Pil>8 zZBGz!$3~%xln9SJ%<}=27HppqUXVNT#oN|M3DpMz*Oxx_cmDZ@jj!<-fW&;~AK%4p zqph#;`DgzijU>wR`vTgZ643z5JHo$>!~QM*@|^qM;6XZMar3{?q;fohe|(2|{`srE zj$hAQ{+IV?+CSXLe@AeHJ~I5@5$|A!q^1OLb^hP24kUm-e_Wt^Ze|#+3UPlI6JvQg zeU5fQ+uadP|K|UneBl0OKB#O7$F7k?fsFq= zoLJz&Ma=5J5V-{l;fw|t2o)I>5@bEVucL4U!_9U}Y~J!?2SV(?Yh`U}!M zZvGw?8E-br2fy&Qx%l|2IrRKzJ5LXwaM!P7Xq!ZV72pg$>uH1Eq|ODptS!D4m_4h6 zwv&D2NjyV{@Fj#p_R9V!abUVX((-yA71(T1E7I0>C$}5^NFz(R!m59fkh^trw?g$S z;dct5K?hc^4?-qDjiYD-^~4`p^<8NzkB(rX;UEs`6+~@wVP3=j0uEC;VI$-K-2;mK zx|En4cy0Li=IyN;`vM=AG-WDLPD2}Pd`6D3eVsU>R!}8v!!uL)uYtG*dXRIw6#iWg z!5&w032&T=*?$nZDDhwfLL8SQD~U2_J*Pt4)Q4qj?*v~gp5LnS)gA$M8;IprNhSmW zI`^6NfOhtFHv_aM!1Z<8(%&*91kDSpQQ zFzrffc}>ChdgYoHO8a{oPwyjk&^31k4ShVFTKv6cySV)qwr+Ao{#@PM%ui2WA9uNU zJ3Bjr0?r5XH^OgEuJ^iJES#Mm;-62=z#|x-Ji%a(Q;G?0$GUEMNiiD*h=E;=6f7wl zFCZO^b7Q|kny44M%S0k-l853Ewxrpn^-ea>s%3 zJFSRFcJ@fR<3raY@nEXl4juAp- z^l$JC&f)&<$&~$bwn=tC35NnzJPWzoM^RJZYWcfFEDSkBNBALQjBFSxKqL+ds?n7M zgUQW;A%f()%RYjz9>&OvZoBxtEKBs0PF*|B;1G2bS zjMpxQM4G$>unfN|5R;RmzYDc1Bmgvf>MP#xSj+`YS5?mq2wcHPeH=Fc{)W;i+>dpj{EKw zr=uQ07sewfiMV2ZfM2L6KO+Gd*1@uzh!4uY{mz64_Aio3H+ovLI$0au0kr43jo5A^d$s7R6 z_~dO!RN3|ny!@aQ=OlunLy+L`u%&83$k2KV6^OQMm1CcaA6$A5z`LO~_sLEM29p)B ze66__y65=I-;{Ot?pN-%fv9yfb(oaxcV`G}Xx30s+Yje-{CaFe`_=q+`KXWDgs+VR zy+obXj1O5EgaZDqsuo9TGe)h?_iW|hftB0>&V|xyp$%SX4cw*YxsiNtRUXnmQctI- ziA`rA+u7~i{Eu@Z;UO#gcYEfDS;q|3k$D&inN0kTsaavkcrrY--PK5Kus(ITnTo4W zFsknX?5*=Zl!Ll=U47j`vMHh{&1>Z0m(@h-y36hmNK^12F*gk!Io`7_c;Y0(^+%o7 zfiBdRxfXr+VN(?AWdj+1LXv>XH3aQb1t~i)2`j`MinRzl$RFff#8OJoA5Ro@G`jfA)#cYIg#wT5-QnVC=$z<8hm!EjamU?+AW^a7Hz@8j+_x!mp_v**TS0ANk&DYF2;Qtu@=&yRyrKV>A;og|9 znFb-PkNj4^f17>NEC1#17yr*1bAWfrXME3(Y`|S;-tZgY{9>2%dpP&o?Iq$-=*VHb zZR+P7KEhm)EaPg2$g`XF;V@!!ldy{yFSY1_rL(ZQhq?|RJ{i#1p_2%>8>|DAdu$5` zeM7pg`TCxZs*9bEMiXj3WfID4x}2DL&>>ScD^p0A=fi7WBkEA(n%F>Q>*oFmEUP^C ziJR_t!(*UX;ClZ1>&5I_E^)@vu*e?06Zonr0=$TRL&|@{C+6pU;qSaRWUhDxW4`*o zJh!#MzWX!qplW{s&=jtjLMH*dH?%+DwHl)@$y}4EV-7BLF%FMt6S7~)gcwIj;C}-$ zbXHb;J8-xIoesEZLgg8%Go>G!%97}z$$)VF45Te~O>4G71(@RnER9MWggX&hc;U1D zGzYT`=I^0}3b5q?{k1dYRBKJ_H7-8o&rxmquJ$TFkOTEyeK0m%gHuqf)H~5Wn2?28 zRcZ5`gB{+~_fRF>t%1pkBL@V;Xq29i6zSPyZO>Od44K8yTkVFDI}Q5gmgCgZ{4k; zP1pj2Ti~KTAMa0om;^mjQhyZ7x z?{w2L29#efTHx^rNFx61W!RY+Q=6P2Zpd-7vUSv-v=3N8u!?BHPPefO-6`JiU!fF> zF4n&o)zE^OvbxP6J$dfOfz$FGu*{A(rZ@)82K-3{z_ic|?9{gXk9NgofJ82|w+AvC z|2|@#bq`UxtnNuO4h#Ij#ro5eDZ6sc$%gUGlUU6wk5RDvIxLz3db{vV#6EwY7UG&n zg2ZScP9?SY<2aRwS|o8*B}vhrrkmG+`V?ZvYa@twW5MX$N5It-;@6+WH9)#UH&sl- z^!X!ri`L34I7jGi^xT4o%yUzdvrl!idE%$wEGv@Fbq&@Iv#hphsk5oL-G5y7jCSL; zgBG%csNLU-SzTlpUh;z;3_6B8g_F(D6)64gN%LeeD|wSLgDeRCFs^ZaDikUip4IMJ zRt&`4;E{J&W|_+^Kn7o6a{zgae!z2KN3*;nDe-e`63d4Bz&t=9xU7f2ti$vxS%Oj| zFM7{ILM)Ehu{YLJ!!LchNYGoR#7O;~3T<9Y;hw@#Vyh)9M5xRP@KHW{?^K!H(S~ka z>OD_s-|;yg=Xx<&Cgx0t^!ps!#u-H}5r`;TJb*G;^ZtC_jlbby3tsh6J`8LI#iP4o z5%rlz3|cJ4+*iA*d-WD!SnKaJY7u2qidflAuxm>5qyhF^eB6xRErtsS(WvHjycRc# z6<3Wy7d!^G@Wbl*JRn_zC$7fae6StMxbq7#=o_D?KI3;ixHK5>ExQjeG@2KtODvRM za$#eApN-dQ`d#NjPdlaL`)=QN6h%F4X($XrUJ7B95NS?25ah_abmS4fP8tm8 zjBMjX@T3ipGajhQL}G$+^yC{Xn%dQT=suy)@&xJA&yG@6wg?ra*rR;K4+ig*l?8Ex z-#c$;7*$|mllKZxda4oHzd`5G)k67+!8U#uc5IjyZ^5rnrQi6iXEyRZdp*Pl>(~E* zt+{F)HSr$Fd%Mbjm{`=og>YRzKOechX>Zu^IQiS05}vf&HT$J-o8NX?+uXu$h>ICE8lPcOZW zLG#D>H;0M=3%Uhj)z~FcTF+{h+KZVMIOLLA0i#@%3@xF{2?3fVF^Z18#Zz1&p7C!T z98|Pr6bblH!KEszlsMRE@_m$nU#ISaUb#JmrQ=COAf>o2wg+u~*+Uf=*WW?`8in*9 zp*|>JH@)sLGr?xb!71RG|B3C2cRhsb3iN7aWb`a;3V^sO+LWwq~sx3GKO` zsgE);TBBpEe8{LUH|xSaxkUqU`&E<`2tqmxc4Ap-Dp85omq=JTn>lV9TYOYSJm~V$ z&5_kKb@P%co(dw1H=J>78$BmgQ4wb`?@Da2fYa;2WD)n&h-jz|dS{uLV+TQN%O!3; z;`wuO)jp9Vi6@pLc62J=Ib*EM_c7Vig*`Hugwf&&elDL+QIF!8f`|K(Lz=uDs2K}~ z8rBjo?`+iKIc}OFe{%6yx5Cz-d9==43(FtUVY$+5dV<2ZEXHaL;Dl;$gq7T-_Bdu9 z!DufR>C+r4(Sgl!KYLKtRrRHeF##+RdVfqB?T47vUL=n%;!n^?j`G;5-0(M|Dj4gY zfBi9PCD21-M@aYXsNp6{I{(O|)l%mNxlcktZrvVr-1LZO3RNp1Z@2HV*%P(8xJb{> zITnwk!7B{4it$3~%KM638DX6`QW3z#JQHQj%-qETl&2IA=G>=BY3I&0GJ7SPS-dY4 z$}@{bQ}|th>BY9(kqM(h`%xqZQfs#^NjPKkY%XZXsJSj}2mdTC|r4wCMY7 zs}B1tOYo4^YHxjSyt^HFERq{!%O|G&Q$$ciIh!+&dD?kG#bYn!q5B{=rB1H!S)Kl( zdAao=Gu?yxLUM9@%P7t)kcGU))H+`4Nz;Zd)w+g)^sg!`MIE1cGz+)~O&aMzHnlKx zi$C)+r%DjH_9oNw6i#qPdE&FS01Qr77QnzC(1QYI2oC_&okc3hw?W55$-mev;Hh~>aI4E6 ze3lkT;pzdE^PXNTg|AeHE+;)&t9|BlYrbI)_2cQlzj_RS8U-jpu$oakhDS zilm?u-kYwzx$zOeCHV-~OK`vN;>MsP(8rSR3YH~n4VjMK2MTh8cs+%mKt2v>g^i!UYqlf>2AwN=-%(TwZon^{s`#wqIj94Vq*sk~{mj?$6 zR}TNeF{{V+BXP1M8-775c5$Q260|$iS^5`z)&yf3&4ot_!o6z;G(YN%ElUXw^e%uB)a^)R=z~;p~TKrQ<-7oA28*;gwf%h6+@L ziAHx-n-Xye{-(Y*G%#FjBDi5i3_yH?t1R?#%%7ml+&(bMA*R~YpZ}n5PzY~%X$9u1 z(}-O-S~N!Kwa$^q(#jBuH*WhShsXFUIcR%0g>y!kCK*kvk1E-y15N4t%Y45ANWC#b z6mQR)F?hM-Af}HKz1*i+z4fpSkH$v;OZp@vFC48hIEhK6>j&*wJ^z8&xM9u z7?nyX;`eH>B!(C>t+bqo8bco8xD67v=%vPb#p%lsU8U~#Lz5DQX{@Let$fpR1XP03 zf`)5+H4?*xDW-+KNcDH`FC~2N3YTZ9R=9Voiyaa&yf6rMh{b^^cArN%jtW+%jmx$6d07F))F75i0J!;uTG8j42R zRN*Yba;SSv!^o+TgcTuUU{K*AXU*%ETk%?)K;ULhVBC1ubo=%~(5_h#j8D7RR4CTy zZD{T0QQTxras1q`*D1LR{&}u=wE>+7+1lsqdZ5vQ*NP(HivQ4~!{>5OdyMtq5piob zkmD!~pI0A9XI|?|n&)&&vC|^riMv+*j6^8y;iwe$0A6pHX*BIq z;kS0lTfvppi~vjb$VI)TmV?nZPY1L^reJz56ok86nGe^7uU_yKM6f0C^XHMxu=Eu4 zQWw!>bAYpyK-GNT;Gnfu?{i)oAhlW6!JNMI0dxeL@TG9Z-5}d>bP)v3+Hk4#o!?MsSmWo;)|QAe!ULqaFpTQOvNBX^!lFfkg&QNqBtU| zPRsjze~u?j6$)1>V@U`}(fl=uemaa`X0T{CW|PpV9HGoetVlfNWeSDYl>Yt@LQ}tB zR6@vjZl}ovCTzcURBewPTK_meI7uO`*iM(9?D~og(xh5ezZ06XD*#^H%V)K&23Lot zF$HGB8z((SQb7tA=e!$zUX>cE#eIoj?X$-XRO0+Y&6_)JNJ>DN8kG=(^N_AEuCMl4 z60<$MLIdNzPR_M}yCyB>w|6ZZcvq?|JTyW{Et`Y|D7wW7ZA>j3sZ>92vz6{XWWUIj zU&G+kQAUNLc}k)KO@Us3w7Jx!E1ku%8~k`e64w;Jxfa*hk^AzH(G>J5+HMuM7k=;h zh!O?$+v;28?7=U@uQq=IWn^y<{Lm?Q4_nEsK|nOteictx zt6S)zT%>(B9ERujE&Cd5<=UYHtQATcO=2=NKj? z9q}aDEs>D-Y4beyK&;%lYU};e~`o)Jh_{ZHU>Kaih zKDcYAL4=@F`ZsfVXj%EXTP0tcD!yn{aw5|4W)L7^fP1?6?MBPZb#@Q12Q*nPbc650 z=skR*jA2&-y3jEeQ%h(-7&Uo0{sZ=Uz*s;oFoHl0fJdv6IXVfaaL{Vnnj+(xh@JTB zYcD$soPzWz@6lIk8k+JT7{S0JI}zXOBrj*PO5ZeZ+@wLhsV1_#O3iSs8^hd$%d3dz z;;lL}eSI}=gnzr>QCwkJx>`EXQ58zf{nTcon#No&iY*&zh7zhT8E1u(g{qx;S6gb< z!!?!^ba+6*s(lGBp0}$sXYU$M668VKN4pUlGOCeI}*W3Derd@;kXj$WOhrJ;gp~5UTAuQp^eeVt&y?h?Y^ zlQ^$6e;o@xcH9g)K6bu~EZ)BCQO=wHgxbqi?#kK28MQ5=+wbFdZ^XWw(7SG2Hvg^A z_1F7ZU+u=<`L$lcvzLGH%Rb$Rpw{(cL!sXP`NH1crp1T99KH;({%3Ui$o*#&C~u z>2vk|u4$0@(az?BNM=SHjYzy1PPD*ceSsIg zQYg)Qw2vJ*!v|kwlvBX%nfs!WasUCBDp!=8_P^`7zK0_-EDIJG2@T#2ozhqb@;D}1 z!~uVjR8<4t)o6i*vGk|N0y+xFs^u`oNg%{5SPMr>OCnku5d?g&a`Acv?yb_al6vJ> z8810yD92L@jplSX@ZjPUB=K5aO?{H482-7Q+0 zn}@Qy@qM_t2=IE@)-M~yQ4TZEg2%zkL4;O{(aPjlpgUI1s>jlMperc6yD36wOE1Y;yn@7>z6DM1!B)c6N>u zYoES0GDRlDL2tN6l;pau2_(qTvR->_?c)N;_b(T)+Vb6;84&!Q`nq9nYAvgIqB9#h zA-ZH%89TWZd;{5w@mX@G)KJ+8WIvLq%E%ialCwRc6ZY$<4&LgElJ^C}O06Wqo0R*rEkv9q77t7(@*Q zRfpr!jE5ls@_q9xr=t(q4TyCB94GY6wn!NCO+DyEL8d>gnvV(0f*tqjeITc;Et4JW_iK$d&3IqM65bBNaT5)qiPSE|$>=To(c1B#Zj>oH4}R%J9@Ud=YXXWj<-@n?$q9c*;J+Y~XzcQ_RYhy4Ut~)Bn;c8?Ey(aKIN5kUj53FZ#WEEnXMF5k-hW;$e%$BR z(muSq`nO-h-E90?T=-!Ysd03NP|ZD{>?Mnb?zF%h|E&hme{cR44l!W-vevAR*ps`v zhgqRXl+Is<1LEc3=kUgo^Py<^(olm2Ju!imC|t?NJHs@+k5JyJkXtv>PgAua%91lQ zfcYU^8#+bszI5j1sg^rKuzC}f(60$rIwJ&YSCSMnMB?T1JbAZ9KKNLIszJXyh_dWi zHXfLI(cCgiGT#J#E`L>vv;hJiY|P2@MOxwqo`#)p#N!nOR@SIXR0A}y4d3yT?a~h% zp1hFJUfKLnFHShg)tbrJM7Mt(P6&#g%tVIvJyxDQH)>i%1vQg9`gzR@Kx!uD8i}$)Tz!X$F(xKusPUn z`PdlHeu{uPyU~TV)rCw9!-YL6)Dnzfmt6C!K)_Pb>hCdn7rzM(m)j~ zhjD|&`wM>O7%wNk3ELV{$k&4(iihrDIQHJf&}rW&WYa>B0+J_S<18T60^xk5wRhb3 z4x>A>a!s&A@ec*SedWP$ERw+Cw>vA9V1Qnec;EYL@A|&+iL)@tWtvt=8wv5B=&-Ur z8OdM5L+M&%+KyT(td|uwwt>x~8~bELi(YACFhVwCIZw-sI&bXIHyf5b7LiqCWG+>< zFd*iyuv6q}vLoO^^K`QOAcqd%M8X3X3a`s-tATY$zhCebNOzdxm4mJ@veEhXjWUl8 z5hPydJ^1mErz!KMb!Yo6%4}3NjFT}3Zll)~ht8mKPA%4H3@B%db+cj!j5#$$iUZBan!dR8&OJ2jx=@laD32IMN+|h0Vk{y=%Rua}Y`Nn!QNn z!z<{nyl@gjVu_cIgmcVV3ayl%KVl8Y2G=B<^Mj4Gf~2`FjbfdYF(8gg=+ac=CyL~` zs9}Y)sO~((HCuc$n>+H+1^t6jQFi<|qj6PkwXg|iqGCF1`^?q@W?@|DEPsmYw8XAZ zq-GTIFQSEFs<)Ngc2-8O}ye z4EbQ14A1Kv%XnKLqA(*X)5Rcb=LS3lFD8D=>6JVuIxCS?Hb=)2^>JI6stXkxvl<+$|r%rxZMZ*NfS zlur-*hu(?XrKjqe;Q;BUix`p^9)`_^G05!_lvisp4DEn^Yo{JlD{N!a-ytl&iT;ea z0<)6ZSEH9XQSW`hOp6O)ObI=%>~`n^tc`?yfQ=}$STev}k}t?O!sQ3BBd>p)bsDgT zW_XqbPE#F>8-%a_&<#%)jt|7=yt-KeR;!-8Bt31N^^Yw5LZi-5lS*F^_6V~1Dr~)B zpQoY1Ltt&FUIs5XAWWC1EpDPf7X!UeCRapA{N|is{~sGDHr~RagSYgasRNm%C?)ei zG>VpH(N<8YW0fe92eZOPZ+yOtTdLfcxaaVK)k*mi18IPR%+tCnOB=Qs)LC7vh|5!B z51GZm{z%q4?1l8HKjplfM!5a=%oP3%Of^+(;jI;D7 z&DBA4bnB->m2;Dj{DfVi2q_J=5I*0L&`8b^Xey4tc*iA4fc@wjhd?vT{V#gvXDV zlOMQDPb}|gZxWtUd)Xm+=bv3w^_+bkqBw;cYr9bSq+We$Zt5!SYFMZTU#wGBpd+JB z?6J(A!x>e}$@*#%Z12HQ^lwMzxmo0u(&Z0YIW{Ny)^$@et;WBO1)aNL`Htq(54RWt z{dE4j)|ge)vBgYsC6iH8kX>u3n4qw-;w<0q{`^Qr3uDOx%Kl=$d&9IBdhmDpLhh8w ze3texGaix?G~6*wntYAEs63INS~LRDD~83Qb7&jjr#pQi&o^qCfq!7w2Vs?uJsRirZDqMHKJ}5(NyhOMUC02Fv6fd}s z7w*W!+Upoq4r3ntquVERrkI?oAZEH*(KnpLlJCOvmq58vPF)Ts+=nE^N2*ie6t8x+8$Rho zIaw!Z7E2>Ll;P$vTI|9^@7=an5+Wg2a%R@{LQbO*W4@vB@an8n0{^ei)82M;q}X5SuwYC6M~8la*e}rUsJ{lb@M&)rLSD} zl8jq=VH@gY_La}>6Quvr+uiii`z4(F=H3QkpgfRfL1x|bg5NZptlWX%TJtz--ho)% zH6E_f`fwwu{NdhPALH>nUCfbn+Icy`wZ##y|Ed0sV!}o#jZW|VIjJqLdT)WN17PYv z=iXEOFgoqtgUtDA^R>{bAsBJ7H6^nHRemh9ezHey{2NzL|i%CfrgT1=MqU>kKLc^Ikx!s*T+`jH^j-F3kF%%=cj2DH|LJ5y5O2lg|Lz@{b~Kne0!uIqZn2 zs~~#BYl7~XKWV!0*hpU%?R>lT?171ccCWnnzBL`Mjmf?CKIVRAjq`Mmp$S{UDB$W| z0GYc#nanzftV7BSL5C-If2fM((*@%{zf-FGsd?gZ5R0(lgMrMrUN%qljz@)02zlW@ z?BeBjsyK4CHeq#E|M775csP{L*HXOk9RG0kdfQdqRQt-Q*WNaWTE(15BCkRkX5P`N zBHnT?un`T%7O40K1xBPMH{BwskI^uzJuo9IEBa@?+8v6z zTvOa1$Vw71C03VA$y_6p^uoU%5GT7uG2bTI^;q|VWEvQE%rl735s@-JZUhCuzPh@Q z4IkTm6`cBovk@rtO>A&~piMFK!ShqFpRu9^_Gm%X8KH*4ieA(ATW^*6Tp-9oz zH3j+XiPQNAAYWk!$V_x_h^oBDetx~37A_i@Dde|yg_3rluM zLwDC2|C67mttw%DE%vUe>~~j;KCUtId7jyNlBeH?9Mw|?t-&4~6U24AHD^jSE9Tvh z`HP~;Mxs5qZib#0YPEw}yP`gs2QD;T3H}qbXP-o6uSRuG&6`b;X=q_#9$e8aek0Pm zc24{zP?kJ96`OS}nKBOFz|i<&a7o{LQB@G7PXl*LG)V4o;IR0oh4-CWM(v9YAqN}* z%ms5q;w2w~@olde@2Vc~JQeHh=gdq%3oy39_!r7?x+{m}4{5oQAcpR}l{dxZNlUpY ze4&S6W*IiF3ySb5fi`=2XG9;(#b01a8TbP{30NN7y`97k%Va=pA;8>#ag+ec6f7vnO zBLwo$WH*1))<6WOlVCO`ZI8Jh5R=`p$J?`if#JxZZrMt%)qY8oqOxRTxBPt4d{FjY zq56XM>92mZR|f9Jd1+LO{_2KAe-+Jgq1cxt_p}KeL6t+$s1@OC)r zJ*y-mS_4lVCc~9Gz%USv1d9<`x%5%8O z{kKKG#tj4LfhKn(Q6SCF6NPY4*;X60KRuW!_;*AwEwC{Np>JRfVDZrY>hFBupf}Ew z8|=?s1AFzmTw%ZiXuWgexGCoQXSPB9cvxTr_=9<;+trdo^Oo@e{zA!>i){dkB0ZY8 z;U&-8&H5IvG%N-yH>-5kqG{syY_}JA_sUKSk}X=`i84wWXbZPF;)V=#v1 zqv`EW&AdC`Ac`OFFEQbNPgf662$;L#dS*(IKStU>1lPthND&)yt8eTi8WX$xQikny z4JlH(1_r3vvj&K_{jdWV@b3_moc+c{Nv3yid9fr*_u5YHZ!PAIoL;M(Q!8IwgAxXY zpMo);{IDQigAKS_&;%`LR5>1)K>}+{@4AUW+i-73>wk|mqmaDq zI&c(L`0j>S%Zr-JYcMu@{5vX6tr<<^MVmd}n<03vJDn*QqeEss_!@pnhNYwT+Qc4Y zfcEJCv4KPGFZd0l!=&&5g2++>0`NvxaqAx3`wZBvaj9-uExPtVHtIwEQv zPoh^tB+vI_7N)~z`B^w|h*K~viYZ@lFS)8O41WbX&`! z6{$$mj#fnn)6WX6B!PNo zW*u{#F7M>VFfL6s+_|VwoCiS{wl=ZUn7>R!l}8(rDR@7s8c>>t$7rn+^3A}LCGj z>LT6uF25Q~++BX&FtSZ4xs$?p(2$Tr^4X4!NP(d~aVQ}<=Ds7dfoaNw>vebMP3RKd zHcuZp^+iQO0t4gP|K(KP_OeuJRDA$&xC~oLKS4M=U0=D5X3_Cj=GIp8BMh%L*cv9H zel?+>s5R0F%;low*5rlGkj3^0Z$;E+IuMM{S)ZQwDK5=PvJTJ!hFfcvxf;p*4nmI- zwsTPd|EJaI2S(xhF!df5QvfLChAOC@W9qmsmJ7Y;edFsIF2 zd)*)zf>MtK@)j8jN=9_}CFM~Pk>^M48196NsRyL}>IpWt2$DJOBk0)}eTbzeB*y5` z+_gms;a2$;fZ0&3!+d6F``UU`cgJSBr0O|U73RS`?22aEw#=}&M$mLe|M(YWB-`63 z?FSePMFM04o9d}Y-V0SF0~^qAh6MsudLcAmm(kvw30^3MsxK=>8m_8RWlfR_%*I`K(q?#kSBBVXO^?hw zVQbF70#_U5)=t(`^PW94MlOG{zYSdW1!OEv**CNlyq(NRls3_1yFM;$t3WdezH!qW z5!zG0z<~kw!A)M-6&s|cbS-pTkb0y4&owbFE{Nl0!s&RjiR$|O}+N8I#yT%i5ZL2pK)9|;0l3t zWNJl$)y@$yW6@lgcRy_1oCx$V6lsN<+Ff|S|2%|nShv!6)*xTU4Mly{gWVX~QMa3Y zi&6)NCH@05D1#DX5u{ZWgLfzXQu2Jc;jvH5qq91%OpTD2Y)`_zWKBg!O@pKVQQ-il zPK>mK!c*lLRLSiXWKy8@)7_isf#c`4*X^$8GzW1@EAMJ$#Pi!b`H~`Gd36DR8fO z70kWPP>;w<+*^SK3u|t=NwqZ9yOL%{Kqln2`~tEt=X+J8=`ojjr6YW>bU}t~F7^KT z--497tWxPC?_Ac|`+yAbRR=SPbLFwx6Qys31_UdlwREGl5A|B?@)Mr;TVwmlt+Gip zu$yXH^~>7*7N$iiZ{k~`DY*@k(423{{B0Zr2p033FZuKhAFeB))4Pr>IQ z{R?7U{+%{7U=@@ko9EgVQIVr{1%hTqxC21NVjE6KCA3bKKTsUrj&v@zJ5k3EXlfcP zf42QS)nKpQ{ns9E!`Q{&DQTxjfSg888`Jn@wMjp6*TZ9PbNlcgsukxC?3+JN-x4#ziC z@>9hgY~@#5Zn`uQU(Tg6mRm-F*>v%w^iDSqS?B}%^zg#A8M7M3L7pl9_swFDYqs$| zoL9_(YaAJ&!!Is;X=q+f$ofOQ)aR;kR=I+v$bz7N=^os6PSht-!X1R zA<=)VH?!g*Pr=Qp#t*GZ=VJ<$%=b1qiH*X02gRawB&3_9mgPRR$%SEX(|fsX%(skP zf1g}(bA6D?qmz!eE}w0PFGn7G)qXCJonfoGKeEzSm3);c$v#{U^CVRBksOw-w7C-{ z$uNHDcMl8EKK&T*=P`taJs{3m^lG}*PQphax75gmYWT$tf3AS%{maIJTIksz*IS1Y++oo~cv|L8n7;viX#fjQmi@@91vQoN*vA|vt6{P%O7a4rz zbbeI?a+=%a^(@ZgYn2Cu^Xv}ie4^v$H0a}=$EB_b-|DJWe0SggJf1C{`t<$7YPW3C z*8%FNMiTMF{6a}g-kFC_a$wrd+*RnKko6OhQ2g{4rGY z_8!vAT+04C#iSyXK*-vR(0y@u6h*A(F-J!zua2|^I4AjI?Or@a=wjJn&OsNJvqs^Z zmhYtu&6j)T%*LV!1)JjS@~QaF}qW zpl`S$a_MtB9>w4pxiqtPPfgSA0;W!;% z=3xXx*uK7O#$X&Zzn2H}^VJ3ofxZURYHHHytz!FSO4i(UQj`Zhe9Ky6Jn{ zf1o?M-h$)Z15w6QQ*1ksi%ndH0z8g9-rrkh75*L`;;FaaVp}F&n*U3m>xKxMxK2ub z<c`k5gTgjfCa@^lLaklA0_TU5oqb2u?Ka>u3z1eH(Q#=#_ ze)~F7X3p?_U5=n5p9eX9I*Yo@$|(uUoCMUR9(OAWFg|3le^2*;U>4{ThbI) z*qHTasW*EKF@ZEF)$aW2H}+kcU7p<6%1sQuOXRvh$s_{BbzzkWwSED|ESz3bbf4EN z)8=GDMk@6ohF_V7a!+9)g=n+bvzfQI^eP@f%pX1_%?djUGx=+%{ehCIg3QE#LS6Ri z0Tc-PVI5|(-{kIfm1EqE*83_G0TUY8*NOyF3&I~zE_Zz8Yh`6KU=ZOem9Rqs^*ltqsYeG?GI=zzQEt#b>x#|;+_)Lncbd`aUY^L7J&}pkN z9itW_N+bPizHRs zgbGv}j4#%=Ob8EJ*wbf#;Xjslw*=^BNY}7$V;t$zYc`CX^JX&4;X7`2t47C zN!6^CgD(k7`D6IXV3L}D_dY@|5lmbX8bvC3X_nwiTC zkpz1yGu%?a*bQ=#3k&s0Y+fjq{D0Q7s=)T;C_D-X);W>#9L+Oy0s7<9nHYS*Jf+Bt z#Fm{{O{`u_QbV?{-AC`n{3!7iVN)HzWe(`ez=EQ4{edKEYg~-k=ovcq9$kY{)R?Z- z?H2E~z1_-m^6&@~z=D+aFXd#U^x5%9avQ~kKd8Rc2cO|zlIu6#1dKwgmPh2w0nwB{ z0T;hdDVFXvS$8sCD-aETC(Ia|NF3k>;tbADa(PpI+{C>A0XK7`dzzMB5@Aq5zSl*P z^;0E-6P%sZL?+MH;FK+JUsiLs@keT`M*|Fc?kJ2>G2rL8$V#s$Nx@e{KZclbS}~UA z3!Le@#)EWp4sEzqzzsq>M4$7q7JIhn2mDM?Z7vx+Mv?nGi-mwR)f-7E@;EHl`7&Ki z1iDA@oaUViQ%AAj4ZeLm+1-bEvZ;>)%@rX#*?77|e+h5hr_U1xM=$MRzh{{=r3av* zbo=jLBI(A|*L+ML{3=1v0GZuT%#ccH;>S4M(|jcR`Z&`4Mi)dJf3Qo>+aYsFM{`Sq zqdawr(u)k5Q)#_L?4|KV$HUz+=4GYRq0L)%Z&z5$QlLHhe$&ydZVQfQJF6tk>TI}L z1gwFqP8?eaRzc^t8j?hEK@RbYg0uoGVZpg6cr_%C46xHy>b-$sp9-;DR?-AtUG847 zzTbKi7xdawTh}Efc9nmP6e0u>Z?R1NXjn$wi)AEg2!Y+tEmHaBq-dAC<+6Z_KXd5r z(xczc^|(!(f3DPgP>+X_n^*jGy?pcdD_eiKqIa$w1Vyh#(xcP{3k(_n^fEyWZM~xE z$bG&@X2yAahB=`BYluPlqkz*plK+de4HAw6%^e6nzM}F2MgK2yotrRXygjYB?bzI5Ca3W8W#rzKk;~$2L&H*Q9@17@p0z+su>+XB#)Zu^|jo zGx9*7cuubTvmy!(s`h7G1x9lto$@bMbv=q7o>T_lGQq1$d?>3cDAJ9?k9QjzrmW?^ zMy;}|qJ_BAWmi`E5S~V@$$!GpdE@x*-EO*Q7jrGeorx!BKb+9d%)2|Jj*hP*-@YMa z&*dNNxr2V}5q|(iD&cI;Nj+eE-QyfbfjgU<)>j}Z9fglC5Ca4p_(h|5NX9(86#Rur z%e5xN1tc96Mb61^OiJec(D=F*t6mW{rM{T>X0#v;c)ywN6eo#Mq*G_3fO%X?3o|EE z;sZt0LQ-Omu#jCZppoG5;T2UwdNceSs>L0`T}SaRUxpvJlLPxSdLJ~njf5Esk#HKk zhBySZk`pOy&15OEDoIP5fVmFAEDTn5GS!fmXLR|+;U}3g&6z2}x4S16Z|Z_c)6^m* zr@&D96xzyYbQ_2gD{`Ov%kuEyb*Y9wCfjo9c&9};9#qPFAt>(S5f`to<-i(LzdmdzIqU z1*IW+*rpw8*dYBT?pZgR&EfMIG4@NB{TcObSzMn2M8^Bq6Fs28m-t6sqJipi7h#-4 zJXLTAru+lm7HOagq$+If%6--05A8O*u308<(<8*$I_n&@wr?`(w*W>DEnzY&Ro7We zwPwSPqLjvQnWQEbZ|FY5;b6U6>SO4DNKHp&0Nwp0#qqGdoAiqcqiI$982jORF(NJ^ z{#F{Au77k0IUHyxw-Y)pUn3!;>qulMn6E@Uct!fetbu@))e85c##~!wqor zbvF*QafIFWnIOsK_w4u?%>~%Tw;#4B9n8(O=fe~5>v}Ww>Ugs4xO-r$jo|xzdp~%` zMAb`3NF<6q6Tv?5+0xtT-r#-fb#v$e+S=|9J4h<*-U@oDjRWgEX8B0qU$^AEZ4GL5 zxZBvhZB28Cxr{R#8SL%_tnu=wbMyo)NfKO23JtE$wQmz%6MY39FAa7d41V!XJ^R=p zp9D$FXv0AODb!7@1>kj)yDUfa?#X`2jJbX0OQli-w9_1=sNpLqFcv$ju3$1?fCIjU*yEu4q%V&ayOMnbUd?&5n3UF(~X& zJwS_*F2MmIh|<#PNWleWT9I$!u~LR(j)R-Gxg$AkIfw&9rk+7l2P{Y#i9C;%fp`I zHS>bQ9lg1J_j%uYqvrkcZ){l+n%Gk?SB+Tz54h5F&|{ll{;YN zSs_rWTu$^A@0aEm2pW7h>L#>3_%gjUhRWm+7+(OVfBoB(rtm)Fn_c=GS=X6! z^AB@4%^j0+ye@uviNWINZ3O0L8}k~)7f9!@P!nC}G!1CHJvyUkUZ_y`Nmz(4oQ0{3 zgD=S;f*B9h46WWAd!MhYHra0?d|)X4)YnWa`Q*c}5o7F=j-@m#2$4^3zW@bnRiiD6W^K2}I+G)X z3GhdL^xu#1SGMn7lE`cHWWs2$QRXax;HeTCVfZPP;P*TItFG?yjJp;dT4DuIuJqt2 z{8N-cD;|jo5BdUm#Nqy{hVY*xyv@qF_;rd0wuw1aFrKh)a}n#Jp~7j|bofIY8^FKw zNJ{)McWcm?q720rLOfUbdP?qGur>KHf=B4@^TsBz_|ATVE?%iGyh>Ndiu4%4;l9*U za*rFoSyeem*W{`(g|QL?#M+nGTb~@~UY>qmDA~Vs@E};#35Q#V zF4j{oK{H@rz1DXwkPPjAypN$eyb7x#70b%TM(0i(Lpehha|pP*l#o0X4vZyNf;Hxn zuB46)7{yZ@TAFoDymZYIf7XU;^on@Rlg2`^u#6#OLq9UY< zJtxWnYomR-%pNCSCoQ3g*;swdRflaFj(v2gZes7`yo5IwV~Cfq3&zVam(7!usANj1 zvRQt$5C!YPMzPn!*`%RnwVN@Rd6ozEOo`kH(SO6V-{ISCV#L%rDajD}pcZZ$gGq?f!|C!^$=ZL(T~>8`rbRBLO7S<0sy~{?Q=YoYu3o^tS#eq~tCMtW9(}na_ZPQ>OxD6&5>Y-! z6N@dWPX_(?VW~Q3tmlQVv9R#oEi;_O3f0Vo=9j+HNq<8u>Ud;3wzsH+h7-h2G&(qd zi3_p6uO*wpbWK7mxLZq$y~0DdtJq=@z4`{ma7pn!-}9R2f$wLQYMZR?g*V{-=ZP5hLnVik#NgRyl9#5JOr2gfuE(hG>t zZ!t389+WMnM%f9YRt$-VM&_fHM+YnSZz#qHvFuw5U&vj%gf-3UF0mGU5}*6S z^zk;?xU~}fxZYWAN`oLAyc8ngY9?adSx*@~@Y&Ch=uuOWI;R;(+6xs>_b^R*Plw{u zAq2=8mNpTQG>nhjY9=PsPDS`O(8T%7k@})$e^qLP%Z;EI+3AW1y0%*M4y*J*0S@mgV3ePU6#il`{V z(qb>b2jxvhK_NOnv?L))U;Y4R zq9cel3170JUz)p6wxKzzRrt$cp_nw#3YAfeZ0cVyLJMAk=L!G43O=8`NC1;JVc&0% zn(eIlbDcRu){6x#GBtCSx!z^yp|AI8Nf8QloBT zTNX%!Q+bz^6N!LdP~S=#XI4V;2)=3TY&T_JS2zw9A^df`7t1#n8VMmd4L)ES8`*Jg zge%X`@T^P4L-xWGj%Z9N4w*?J{(Eb^i{LuyD>8@U6W|Kman4hu=6VIi2L4z7zkC0$5V_d@X1=tZfV|C06aJ6x z|B|iiPMNa(|55zk)_NB#kU={Hlc3wD)xX7`sBv6Dpc^|rdm!xJ)(`asAzeUS;5h~Q z>a3iJ!OdfrS@I(pe(`uwIw|Sp56Fr1jF^HwTjuGJAa)Udta%Xd1texAnAw1Y#ainQ z)gDA`wng1rKZR*?3Hs-vu3K*dWFUxg*XwZ9-gWkgT6p&1{NVD0@l zbEJU+ZM7#o?Kr&cAE-BVkXWM8Hr!Hig2XiCOl47=N86WckiLP*dpN^W`bnHe!M)hp z8F{K{-0r^A819{dhk6Mp&I}l~XzRtvYyW)j#5q9fD{7Eak} z1z0DWOK>a*u>VmYn@TX*mT=nOu@k3yGmOvWvM@<+=c9>4dR$hKEhvok7VlR3mGLJ= zUWh9Qa=9={EhIMMsNaZ)PyxY(G0K`d5?@6+U;rsGaMBC*95sc%3D1s*bqnrWFMtGO zCwCw4=vVyg?)p(7v*gL_4-v0Oo5qv@O2F0SpDRRSlSw@Wq+&Io zTbrPA+7Ey7xA61Nl97}+@zKktM?yZf4DKgWwwX|Rfcze9S*01ZwE{rKr0M<5`pP$r zaSdt2&+|51n8~%Jg%uN4oS~b;9$j)Mr(bHxm@g>g{wcRBdtbEoB^!OXd4AqH z)qy^fa+HBLwAVDpZ@-&>7LVwEO2@B zY#r?1MU3Sfn_ZMM*Qs2_QZ!hQozxaUVZq&lX`$Eq{-K?(_mZt93(y zPFgF_d~m;hE$^->zrbw!~6dEqeHvPE; zdrN7sToKjS8KhdQ77e@3{_oX-09M$Q7u{EuJmbEHY`6A%53h*;R-+i^jVqj3QcngC z5r$|N=?>6l(@XJYh~yph{AEMA8YXRagz#N4f}?&CKx8ZI!cV__q&E=7C6u<=!Kw+@ zvq>Olvc2-Wmo3rM4DWQr+3D3#QvLCwHQ4tFjzJ#=AyW0V8nmJjcD2IJP*Ts)-9V{q zMDWx>-UTH(*RbGPKcwNAhw)^zWawejlj8vVEmEwtrCUw0`S3*a zqw>)3?Ie^do(}i&_bg0w-hvX@IR)v%#QwelXKTl$^REx|`DAs@b7b?crf{2Vx4(IH z=UMJ+R;_odX;E(pWC7up3#HWIh`HA@k1zFHQg(l2n^qvpJKsJk%7_elE+5xUJu>Z&7cyyTKd3eReuj zH2K3jUqRg`at?8d?sn(q@e-2#bc9mNv?8ZA;Zsn1Bz@)VJ+ZPXTwMKYU`5WJ2M?-9SsWiA( zXue!c?(%f|$QdeI5-?SoFyy@rjVe9r4(=>#qba@;4{G`X=%G8df4(%+f%p-CfYt}7 zH>NRwFz};#4Df3WZr=b66!?lW)cYL>ea93I5dQ3Jcx{dSbpH)B$gKHnZN@w7{p+a< zs%@|Z=*1eu$3T12s2-<~&nmeVMVPp*`5(bx2OB^d zx1g?+llzjd-q3$XCUPYc$boBu(J+paAWFCIwMOrB-3&bho3Dj>&>$VEX1}Vr*|j+H zd4go}ruu2^q`LX+WyOnPN8Q85)6(vC86mC&H0;89A!m_fI!8Z~5TH-3Jj1_+gxas`-=yFW|xNJr{T}X=h22oX)o6rwm)k*}Cnj zY&h29t;`J&hWqNjcii%k z)uwWVYNV&fe9-{i3=bx>IFdijRjbM5DVegAqtmKpSx-&~)9}@zg69@VSllZx zpnL#D}_^@ltYcaxpu-n_eBB__)jf9izHxP zX2o`f?PdBDeSKrff9MRHDi7HrxVi!!%2No+lt)Qj!MwtD4Gl?{?XW+>$$HjAX~8K` z^W-xA$V5keD(Bq^KwRKdmZ7z47h`Y4Nb z@W=GlBV&u0g31x(iM`DkRww=nQQulOo=HEvP}ai3NR~>V6${adwF_BG3)(uHHJvkE z00R0J74xC_Cev1_ob19ZWcuU#3X-vDwxAs=(K1-9L$KB}ku5v6!(U}Aj|1TIiLJz2 z-&b2Oj6N+<;c+Q(+OQXx@Pf;-PjNiuZ-UD*RQL5^k6@4kQTkl&Ht0$T5?rpNVSjF3JJc0mvzoY&qy5Hyep;d7_Sjq&3Q-K)+?D%D~V zRgWtZ!&~#9Jt5vPnV!VN)(jXEHy8K@v~XvYd5G&sPRnn8ZuXP2O>YDdtA8*%Ty z(*+#yvKPj61qE!s5ooW54_MvwB9Ta0*{i%9PeC3-LDn1g`h1mczQdhf^}Dz`7P+Vw zl>Ok+{}0JB^{?Uw2s?NA4AjyDio`4vl%lFk_q)@Q{ReJNBH;8Uc=vD1=}Z|VD>sf3 zgtS}giEkJh0o-YQBD?HewY~6>pbQU88Zh<929z8YzId~07T!SqpiefKQV_4~4GA_X z^y9S5IZ09ow5{0uR)oQpHvPCe_dB(Ec`3e3~lA>k<(uA^4v+fJ*|7ci%$ z!GxU^esoDROKPbOUjh1aquW1g$^7Ooz>9&4B)6@$vCKYktBW^PWO;;iIDxIIwuz68 zT6dI<8LUkCbDKTPYy`geMTfL8fz#F?qvwvtcf>)r{5(G!zubsiGFjCNB zHJ>mD=Mf+bN`v|`m;-(NJpNGM$3dLn74pPeK2o z1A#ZIFI9!0&iW6MIGHyClF-ka)`zwi!D#CjS`9&;1+zCl$!1lL#a3=&z#s$!P(pm~ zq8qPa2H0EvL824aBJ(2HBJx?PuX^Y3*?cJSvb>8b<10($H|jGDH4zL>S0 z4jAE>G`sV0^ss0Y6@t^mk;?UGdUi2g#SeID!)@)xXIF?4sAyC3d?m%UsLH2cZT=-B z;Cv$URW5?U?tzl5kOYg4d{U)nu0x;?FGN4?=bc&-ew0TLC$R|ylz1)Y%PPxq-2J~+zqyEmnYreZT@<)s!%(+)1t?~99i#ZyIj2&GWqt4>ZjDcITJk%Bqs zbu^@|6CBg>GU0V)g8A`yy^}=15469$9p`x^?t8ljxdfVtP^j}EhI#ZL2Ib$uFw`rRdF#&O!*Qu7eb#Rl3s&!D zUlOR=2K;MZ7u}QpE_P?TgL`49VQb@Is4v%@Uxc$m3*DE4yCBw}B1S+M=z~`!!uora z*fVOsb7PaFS+P0Kh}5?!h)KaJ zB8|reNn_(umgn9s!k&Y2hX5~V)EsR3T6W8O*w(Vf*AUYZ1)UrHuy;+UHhSvk$wPTW z9Q3xjA%f@!B|B8%m3QvRxKce(L8A0JLet+Q5ufxGgj|b7R{S%}f4|w@x>e=`+C#Ny zT+S%H9O)1c?MrYz8`K{qeqy@m6 zf*B~uPIu$kxeia3LO|R){HEGa9t_&!{oC`SB&eIvG;IEw(J(~GbiCeN*Q8>Hvvnc} zASgnl3}R~Z$+#BX&W^+zBN$9`MsGl00aKkH|FiqG{#Zl`P(>>yq>|!)fHn8NYl6&TZ1O_(z;^=CC5%M+k{KJpW#6N zqzX#Cmc$~h3L|7&wuwH13N34Ple$Se6APc#uzJxMDh871Se)Icx1$ zPNB@#p}XUqmHv+2OS8EMlcQykYGi|y8x?!XPuDX_t@-m-909wlOeKWdP~x^h*=mD{ z{VGMTkG}&0?r~Fw@oVK|5GxZm;0YSK^~pUp^8@x|cpGHRdUS^GX?hG7Py zjP8#Zw2Kk5*U_`w#8$_JaGB#m*6QN~>5;D*$0^!h2a7}W^_V2YA4(PQtSORI`XV58 z^Rye`gY2yprFiSIq(!kYOl;*X;~RpfG|gZPRzrlnsbrSrt+!WwAKocQknVp!e9&JY z^2fbp`w3sFG8w9U^RopsAF}xhE`?ttv40vv``2*fUZ)O*{#l5n(aH^P1>NRF}dcU3McMR^H;YZ(CTKH4zt|Z{;6~>f5(8& zr@n4q;qj=iP?J-Ve||vNRtCF=t) z_gwrVvD>bghmm8uF6tRytPof|l!c^HXIH1HqNAgtvMPVr1E9YIt}6WN6wA#2O%Kgg(CL-hREb?`^O7n}{Hd)M zU{uMfvKwlGRyizz&qS7<*xRhw%1A2MgVWacb7e2nq32~{H{r%8-BijnGJA~B7sEqE zs(b2qdC*K8bW;McPx+_CS=jZWS>v@FxG~)5wA|UZ!9UH30uaJV?z;4ZRl}Fzs|yxG zgYYfF10)v`QO5qhMp3Q32EF4@m|MW+w>V$2F@U*wB*JQr=sxN>`@!?i?zsiJHT$|j zaDK^4c0?4qzcyWB4gU~Q%_I?^MfpMaRNo-P?qHo|`XJh95`dAsEu3i($yd_jJhKAy z_DYBo*`MWAcZsPeCHXNVIVZfEi8>7)G-(lKT|fi-`4fwCGU@*st1hDx{>n7lJE9-# z&tHP))$OtVY*aS9Dm>5gqPhSrrecG#uMgg&mwgc+(tCB+$}B=UnE@vv;R-fCTBMZM zE~U%wwA~F38*=SWaBJ;x7Nyp}hnKiBntx>R@8(l#$~)UjB9N_O-tgb%& zCv4qcV+=)p!ej}}Q)==gf3eKbGr@{hWLqBQ42*&%PCl5t_J}LAwk%F2&fF)lsvJs{ zvy(1Q-oRax!m=XZL#Y?8^pcKNc~osuKcM4NyxOIS zH^)hDO7t$f4*o9CFy(fT4M-W#U7^(FkF$of8io}?vi=3i2Q=PbYi_=)L?ULbd;;CW zitf96lEMKsS8t&3GS;G8Q`IPvrK$MJ56;V0Vz{V_DzJ- zuH}9?2I>Sgm@`C(kd9KP0M%?~EnDs>#Wq{gj)J=i$idi|Dg=Dr0>W=}2R7g1&#?6h z(kS)rUZl+-5V+km?23StfBL{TnFc??bqDs2PfIS_g)j z2s)N;ps988lz9RgMukb^&W8N7F0Z&fn(FlX7R_2~Ma}d^;|$mBsS#6`aO|4=+H3fh zH8hIgx5QExc^UhlYD4|os@9xn(%4Yv0*mtH8_96u$hZfUci(u7ZOL?u3wJWaSRA5vep3|Ri`E?`q3 z-g?fo4}TANxm;P~tHH^t-`QQAgPiWW-#)u&vd32x&Mfwvju|K35qLh>BV`T5rm>Ix zQNn~!+8~Vg)_^{Uly)2Gs#BB6FpnM2i5@+XVU;*wBNJ!3n*jkW4LYg3p_74E8>bK|(5Hj3%gf ziwTB0ovqysf6zivRIk3}xd535Ejtx744UB?zy=nWV+QtqdQ^g=PMP8f(dgJO-;dSfLq$T#2ZZv{rWs!obfcH2yrX6 zXLq~uY()RU;fTI$)7?~4@bnrsGjJ!J7zbI!OHIgO9xviC1@&iAC55QQ7oDXZJtf@( z^_TF@ww;A?=p9u2Z#^tg+Pj5t%kAa6Ijx5GZkd1EEUeDXC`M$)8F?VZ4r>+UgMMi% zhmL`ShyMEsCg11VZMb|KYeqh z32T5H1`JHehBv;6xB^Mp2Kr?W)ymqV?pf=R@Ffjl$@l^taPDR|m0s(~vD1dxWyT)9 z?EqGuI;QQuVI4TRNN&j~JDZwUMcYh7h|z`3#TtsiYP0 zL}`{cV7{e!Zo)h^w)=@%5Bh-20=0xl)8~qh!1o8jp{~N>Pjn*Ha^1<~us}Z{IfB+* z{N7Ig;^_>6QO|(s?W>P-U}}M&`6BAixg>mAZ@e;1S)*5BUn^KD^GF}CNx8dnq4R`o z#JPI0hEk9dl|=62f^D4-rO5W4X$030>hQ{Z7*#Ja_gSNZs*-py&X}^tpJ13|k8!nq?AQ-(mX$8iB5mO=pCm5>Itc zEg(D`MfJe(Y8}zO1wO&zW!=%kQ7WfXZl{6!czb|`s8E+2S3=n4;#Q2Rlvay) zEM=Qbf8hO~WGNiDrqI5odD>y0JC=ODyo{RdAASzAkt#y=_;y-a(N{y)TFkspr+Q<=lce*it=Yp7x@<$b~kdUC6q&bU+qh0`!nTM>rMcF4@7EgnFtRG7ZRX=-Lo>#hX_}EkW%V_M`st9n@eL| z@`%gTH?^^1L~b@ZT*VZ+s-nFxgp9WDHR^}Q7@NswLFGvhx9Pvc#HLeS( z#8O>W>9)Kw4N1ZWUbrQ9W0DYpqxUaLGz<|cr9y!{0|vVhS`!gf*{QJ0KKrmwzjk(Q zeM(|Ubb*odu>8qHsz9tsV$PI z`1slnH2c!>ymP{7IcFs5jvdUIUq(=_=Z&!RkHNQSK%AyN*+3ppq50iAPo|5eGl~xS z$ZC@4U8)H&j>kywO*;f$75k+jN6A`5LS~C|U+m9tF*1Nh7XT36P*5+63GOjsC!`0~{?8ehu}VyCw(j%Ab@i7w*5 z#Uj-Xt&5RSRzHC0t!02>qFt6+sHV-M6pN;1ri@Tkky2Z{r0uze%_Gd%R*-L^E^oig_gf0!8?^!&$*+#~%DUt1y# z&Ak$O!Czd8=(DxU!JI2J(d)znhYb{#J&k03JsoUDtrl3%lnRSo!!WZ^nH?sv?1ZX3 zuSChkPeKfo5zn-7(&*UpYGD2CXHNsdeBlV02!RG?`aRZ?)Uw>tUz~Bp`pl4+%tA2I z3xR&6>;K?wS1PS4oJ!)6we0WOaHaG_wr9aZ0$JPcHUD~~5c4XBMM%1~U#espN5+Bg zfuEVH0gV!)s(~Pt1ayc~yyr2%TDA1pC-nHi@ArgygDyZh9KjhHLTDcyq<0nMi?J?u z6=&cB4FVRD)X;1+^HfC2FCF}BHEE+fSimU31eVkqF%S>%J^OXpi`c~4(3KCh&tPS6 zM@u$4Y+bFK8Y{7V$}^7CBysUm=5RxonJKoaKo>Z%ZaWN{bZKa{sNIhmlP=)N6I=^gr(hIvhPl<|d z?r4UDZR=`%K7?hsL?HqD2W2X7c}zl^BYBC`k=amJlVySc9ve49x$BlBzCW(3J)GBS z>U`SC;ph<+Z=t%wWuj*-N@89d9#3~u;S+mn2FG<~kHS};kAuF`Y9b&hX6ueg=tV^r zLe4k6bB&3QOV8(OL^(LeR>9S3FunF_pg33Nh?6b`p}^xiN2d8eiYozqF4J@~aZA&2 zCUvCj)D^ZZwfxT2=k2s(^;Pqzp>+{&f z^(&fz*$e8f8k~Bm5R`1^E6nhuj{IayesZZrKrcpgM141wa#DTMRq8R2m$A$4*^UAJ zchmy`P6!!7Hu-|}Q3N%-zo+IWyVhkKRI(Upn8L`YI9o+04y_${ll5`shmExD7(|16 zYzqkUv%gC*jCZ|jDk3%3v`!vp)$cDSQp;~tlB@04QmraUVmkSusewp}!gVMBp^V)I zm<2A%epR`E!}-B!3L?O$4KEQuVhn)v;7du)as+^U7ZCo5jRPDq{|`^{KWt!j`+tiE ze-Zp2y`V3G#W=u!3)L_|_kyU60roGksY*eV{$rOBRhtDcdH_oh*%zsLVrVS;-XNZa83kDnCTqKh(^{|W;kmk|5GcMkGv2IBwt+A<#qUhsG6zTXh} zuP8xt|KnKEGWkFEwh$YocDVn<|KH&x9icw>Vs^*l8~-PgviJYv@LzZTUlxMzKTaG5 z@0tYvuh0x@mH+9A{p*S$+dpGz6#ohBpYQ)`RQ{W7_+Q%Ypxyf{DbDog4AqA!BZVs;X-!26HKB_D!q#zmU|H7k*GG;Hy~>Fi~vsa z(Z<1w5AOngFxTvVi`$yg6^V;~*t7n4xQ6dYsjfN%evPH}T`c4j3j zxvIGL6NSOS5g^a~y&M~*^{Y&QObarJI&2C%aW{`TcT$ii|BWvTBTYI%puC%*k#(1{P*wpk|)ZA;8I zO@X1IRS1uUJm!<|{3q}nV0NqFxj7d7o~2)Zk0BLKd}&IPY>W|>jjzM8D&i>QzzAzx zT$~hrq-*GUtYZJY8@X>48tYBjlFTmQgVaQ7Hb%sS>lnhq`Wl%F_VH>({dybSt(STN z6k^q~d>d`(uuyyO=bJlvU^&7BsM@){fIXp4YqBLwlMd0QMrbGafyTGv?v!+Uc4eR6 zO=D?|xN<;l>NUui2Ru;8>ZQZ}~WP@s3>Q zWBl0!O96wqb@g-|ID8@QciScw9KxHrw4{BWC=9~8`p*nw)XC~V@&`W5N`H}`8U44W zviFa`7DC}N_ojZ_G-*_yrmz;t%VwkW&n^yJXec&-09L|#6yO?f;>LDC_7-406Ug4F zM1KBjJx|gKra{U*ulYNbA=i_kTR-J~NZ;cI#oQ*8{HSwhUeanw_o90#>=ff zmOS1S=R;4hM8;lJ$dn^tYS0{>@kOq*1*7Z)&sP>X2+KRh8D|CylG8t)@Ce}xXPx`1 zZskX|_n=AL`yXB!90mKefbtFS{CY=K zk4BCopnC2L#iUm39FXux45%&VWAT1I)FH;17oU&Fr>@-7 z1?tUY50^)FU{9*k=tY{TXbT(JJw{kSCa?B1U($n_XCp4<56#iZImFt1SjlA4(?93Y zVU_M$j19EzVOa<>cb|AaVYARek`VjKK$ss_C$9pm7nqEjc6`?uI)iAQc5Uqx;PFKF zVok6q`nB`lo6&fSbCDBI%kANs;{MjA7lcLj3w^}7Iv+wZkzr@cQQN*uRM z?vb3g+0s!X9?RyHtJ%>A27V(IZkMWoRBO;&&G2zEMa*$cf=G%pDd~!}Kt0y9M77s! zC7KOhY)C>H5lHn9gnu?2pl)o%Qs!j+ZPcQp)hWe8|Kibz`=)pQ?x6e;6py~~iA>CE zm~~U9u@2sFeMe~c!?vj;1vfQb4F~)vz7F0CW`o}7S)3$XDLBsli$)mv7cxP)e{4#t zq4KK}41LI9g`vp(>+>{pler>}qFk^7z(~hDmQEDhSUtdgKxnCtvK7>O{}I;v9B?ul zo*kXnJqUg|H6lsb1Ojh_W^9e>zq3HGs}_)@#K?t3>TvZ`H!iyJJ`6oUg}zpr=I=d{ zpF+3_Mo05E;xW^NA_2rSI*+DZ{#F&ZCax9?gpWdu>;~Ig-E?5!y_X*60vmS-l@>;c z?jn!c1Yd`}yHRKdb8;Vn(gtFnNCOXEaTk6>d$>hxLQK!fQxC_FU&I1TG}VudF*W*0 zhI3LcKCA%;{>AE0I@A-tm^5EL)X#$)oJ#!i8Z}PUKG)oVyeYFUZL3-&pq3j~vFnCL zNmbTdN23+l-cpb^T0K)IVsx$!OkX{0G8U8?R4w@D16c=N!L0v7Gymk|P6|XPeKW{? zsII!*tFo?&8_tJt0!#8CP`Vq-d14|JKACrCZ5R&QOGo~rJR2wHHzp*U-8Wws$-xPi z4|)kp-FbbE;sk>9T&yYQv^frj$zZI6#8ob5@m?4c=TD_qBv7^`z4@%PJbiWjm&YiH zgfN~ZYX-*eYZ46t3=`1#?=EA7XB)WXelCb#EHCu?7^*T*;c2H#wiZx5Kq-@(j5HBG9pl^i&pojaKm>`hBC=!ZAF%^HH4=b5Jt6_d7?~oIzdF$YS!e?k z3g`~tc$flj@dB#{V_@&*v619Lde~czJ&B-JSz-=Kgr_{1^5TOCKNmK7J#=LwR2dS@ zhRV{w^e0$8q*VG~!%~eMFxM3!gYB<+Q6S5lzb3f&6vz7~4f1yC13;6dA)6zO@Rqk4 z?y~A#aYBK`8Om1E>BAZLy6xexOObq-Cr)sh_MFc{SxLbQxOLzkrKUc;9f=JJ&OO=% zK}AzRr*?ehdq5-(TH@piPt9Kz(ziu1CYR;}i~m#}pU28hqZu{ib7qEb|Oq}Z=hZx@llyyz3JeOAR#RaUy(NJfu=0xX5}Nya#} zT*octBR=BVsC6D*UKMijnBKs@l8lEclTh{zhZop^`LLia4|Tut>a?&uGb}YS4CLbl z*2c;sHD&zoH$mn_Tl^G+lu-T@Fy1%XQf#P|= zUHYUgB339jvZ99(!NX|!uPXmY17 zfRTzoYoczv_KL$A}m{SEQ{8iB28YX#EK{XJU8fywUK# z9isuCUH9e9{vIVsce1vT_`jrCx&F(>KS^OTz&+>!`wM}>F~G)|k@2hd*<#!5cDahM0*lx1|NPPFjiG~H(dAI(!CfxW` z0a^_=odGL2cukXAy?g^5G%l#E(;iiaJo2XHE;^&np}rQ4v$5yg@@<8KIfpw>!Lgjn zPFpxX%kD9s2_Zp_wZOt6$58eZxy0Y%dv4zd_*xR|0pE`o)?pP~rJwM^x@23XeyujHWakoZOdv zcCazn<7}V|9NlC%LGEg2Ps_t>`+h{Wtkqa#lR5E6DToh)3lO*uC=`G3@^`vwe;kL1 zr*(QdG%5j?n+YNVOC(XJ>e}b%1&J(xV!9zSq_V;yS%);WmOjv^iP8EyOHFrI-^3qNwM$qRq6#@u~VFPr4S z;PdC*%aReU6rd3erxi8vONI6JxiT00MeOP=t~tVT&w$hFo=*V_M67jSC7W7P*~zV3 zf=E#M(1@EvLT-KHjgZoN=kJY2d4yN-+=Kafo~CIz~NW#Eh*N$FYElxCz~MJ*WA)0uOAnG^M%=*Dyu-J;ahC=MSaP? zFGKm<*F)F)`_;4CUmMUVsZa|b^68*j0x-(ORsgW-(gejWalU^W_Y_g}KG&j38jr+`o$0Lsw)v=#C+k-TU1YqxE2C#+-lvo0^1sB@A+W>4qXnmjGiD) zW-HRT; zmy3}*Srw;)wnPjV7HHrtQr-y${7v88i4Ls17U`}_1GO;U9$Lol57@V4)wMMi zu+&vPoL`8sE1`@zuBUn7mLkw1jTfx`;tsb?3nQ)?3RRCxBPOq3(mVz zeU1uDf@*NVziS@E9noD38T`r9*!NWGxz7Y&AzfIfemyu;_dHrSNO^%+G9+k931sIU zjy^hlyn8&xts9{|$(j)R$$BmT$>W4|e>eD;K)ynSF0!D1GV^wzJ^%G5aY5|%`EXC$ z>(YwF8)Bm#6Xz7f0DU)dc&1sDX@Ll+xp~f0wDG8Kmg!{f<=^-cO_p^z+;e3v@hA#QmD>=8x~qRbfb7@^p`zx^cdKAq22_mDQP#Q+T2NK+YqqnI#&I>-M)svYG&q_xbx+eyBp;%;*+HN)&i2( z2wM0`w?CBuYcyOv;vlUVd$Rewbe8s}Q(f1&hT{K91#(W;ohg(T5wNNFnecF8p)b)i zj@Mbe1Q%FX4=={bhkna6$kf7xGP+2xYVofAJ$u579%{r{d}yKmJL_2>Ej;y zbbzopAKwB@19A`m_E5bLV*m&G2Y(nQs(+^DF-ZVV-pfs313%J6X&%p{--$~divqg{no11H@x#S;#VNWrMMK{jV zL-RZ3I};)U>RN)+<))E{q<{cZ`W_`bMX2mdvFHl947+kPB-sX&+ru~J2H&o5Y@=y(TluGrO(!L9_%mB)m&)xF5|>rosGIy$up zuyJ5iKPG6Orhw*i4{LK9G+ z@voiPk(TRJ4^pyhk$KG`!V4xT#~sz@Pr#uPNvoFKx-{sjB>dR7tBl!=)jp0JrXXiS zv}Xw;fDmg7$j$}fOm+9toPp1Z7CGp2=!D4Rr4Ify8&XKEUp;X}TQ9HL6hDR3NAo|* z_g=+Jnp07)&W|^;i?}|VG(7f24rxx?>*a}Bb@!?vpJ1O9V+~3|Oxm*KX<8;}@n~*3 z&I<88*uyLQ9yNm&3#6UatRF>*e&7{==xsbu0f~e%g|cwGo3%2m7`Q#1WqBV&Zuo5( zxpwXppHxnyM;Zju!B0(2hUrkyN=u?iF39Aa+P`+pp890yOR3`euCaJxWQL3c89+Kj zFbo4_42xAYfluWan#T=cM0nKzQlE>uxpM&*X_H=2uQ08l*SD43-ds1>!j= zkuYNmzx-g8rbn7$!iLC*zclh;@5d>m>I@dD>%j}^dq0YIDf;yg>2^`e*XTx$Y#iHX zh9oSt#7%IZ6itR~+uKR7vph`L9?|J6e3U`@{c%cCXHi@LuR3v%Kp)fAr|l#7+lYoQ z3x%rSjtG9z+~*Z1D+9be+C#dCuIuLvT5vEG-fpqXnc31-S^b{kz3af0w%?w@xINd( zU8i<+t-iHy2{>8e*apOdYmG(__|lb|>ZxnMMFs1yhXE!xQZp%7?BZ=2N6Awa*%z@< zJ$r`v{Kpu3IZHfJJ`=%sW6BW6(n!^ZqvU~CEywdcfqMBGDp7d`t|2Q@4cmUm$krz+ z1$){9lzkVoGn$=gEhJOlrPy7ZWVzXm#u5Y%UU(Z{L_~5S#9wPlN8NxRsQRYe9rE$* z)aS++uzH{S>I}TK`vWjyAM)j$p;!Y1ehd8XWRw;51u)tQ5a>$)Fy;!?0chmmUH}xt zYkKv8Ti;Jo86e!{oALNi|`gohp8kG7fbilyzx z=^?HxKH2x9-X$RO*muVC7EnbO^bEkv&9ut_xTCiwJ~n!q`V9ooC`bc$pMqqi!Ft>V zb5Z?j`c+x)`rH4udmffnoAs*X&NOH|HE*NgvHWSoow!0e z8+Bg&Vc(lsbg(o~<=dm3^q&aOrX zogN9T{@5wqW@FWu(WCQ0Xz8p>ZG3wbll8^8yS2{z5r1n%zkdzPYW>~RFSLTqHVg5_ zY0EJqIARMTa?>B9dPLG}lSD;T8up;OJ7(2-_MCAAzprLGRI}Khvl;o;y2v$$k9<1T z6D#4_b#YnI=x2v0Tqk4DE2#3v2Y-m-7ym-c^%zm)u0+Dkle~#)o%ELwuiSzMg5RL| zbwX>!sL*W@VM>z>|E3+E4O#dNE?g-A_T{f$eW+{FbJUVwjWCaTgt(*2T0vU5t2@_G zm)Fev__EvEopLv{QoGr3sCWG3|0)iJ_xJu)1lAQR z<#mIvtgns00BQMvl&6}k54@}@%j-W2vHrq_OD39U`Io_}nrONBT0U(fv+HZ+jZl8@ z-o4O+BUa@-TYH)gg%U%qDmp}kLEQDjj^{$^v!p%R3FhC;;=fG!u!B;Uo`Zyrqei(4wB9M4d%wZY8&=BY z&WIXk`zAEOc7D^CyjH88mDjPOm0e-nD}DW^zeUx`D=i~)+SouR#D)|4vDn*gNgxYk z<+#=MNvgiJqMa8==Qjx{pIu2hMTCiIsz8)%W*9%7@L5NmzJ=?^Ms^yYwT;Cw+d;8xMY%kh-h|F$$!`G;$o+YGqUd$!^ zB2R2jK#%8p3A>J7ul%xcm_En2Mu(O*&z;}<@*Dw=>j`LR;bNoXl-s~|5CbifkZ7rn zl;$T>70ZNl87q40C>#{472Bh06THB!CO8x4c;KG_6#edB*bW~1*NrE-zOd76I9@MV zxzpODi&59h-XksMTZj!Dr7#|q*swOeYT{-nXJpOllJN~`xjaC2qLrRIF^dJ;$rSxg z9nBaO3E3$GBM~4fnF%U{?H9m3sbFP~I;h(qe-#||FISBmV98UCdIZQt*S)-c!l>JL zdw5ShQ0_%yH`_d%W;j*YdRMxtlD9dWNXKirS1d+aIk)dnVI&cl z5-ZpS@Gv8WmAus?VD3TPI+q6aUeEZUHUwnZh0LZedZg7Fetps;411eGP8DglPcwP9 z!Rl&LuY)cW5eF^%^eb5!5Bd_I9$6aqckip8vSa`P>^BAh*9ky-yX@C#Bq9JnnVWfk z4@dy*nU2gwcO3Y^KqnXfR&W8!#=N{;`dVNicDYFNc?_UvSCU6-7Eu2LSNd%3s{0nJ z6MtCr>|PI_Qry>-2Y?FvOVV&*0cK16CMfxFoc#kA%klaXj|Cti>cQzE(~_!q^8|&zg!F6Ih*fHoLxJ+Y7Tzf8uq^k ztrwYA9eT~&gBX;+lk3kA^NeB)x^`gn=qm5k;Izd&C399ZNRBsQOVfz;OICdx4}EL< zoJ`VM(?9QZXdE8d{QB(_Q=p)BM4peGR~j&3Fa(u zl38MdwKiR?k+n>phq5m}6L=tXr5lIjCi*d9r4WoxEg|DTWIf-U*g09o6;~2KFDvwU zbkkd|VX?pY2FR?MCb@Q$dcO8BDZSv&2-)t1;kaw4a4i^HGw^vhlikoZu(tO}>!lqs z7+=6*X?%HZ4}oJm|6!tqEi6iNcifDSl~CH=q@_irI^Hc)zz&t9x9B0=cAfrQ3??Ss zs9GRfPYMp}zaY@&(yuf^FUibyt_+jV6eudrChP!&yT0APTv87b>tClNO&)48l<+&u z$1s$~Dn7^kU0!pp)^wKq5!&G}TbYZ6jR9W4f((-&r)yI7ZRIX_MRTsB8W5)2s{5TF z9*a-6x6r$qk`@Lf3NT|+sm>+Pp3`A{$zA=71233oj<_8#l4$g1Bc*>R0-He+Wx}+N z|BRh;^{Q`D`Lm_a{k6*>C@nMzsuZa&_j8$#Q25kkBrZzQs!fT|iP(zyx;;n!DGM{( zTX6&bIkjw-wq`vGB!}F>b19e5Jcnq=;jO&&d24EKX@cY~|?CuZ0K(7KzbW!=IvC2dhlf*a{&3 z-Z5ph=1CAN+Aa!~S+(qF>W}7V<4Uh~Afx6~M6GHR~;k`*azlG*4A7S`&<5%C%5ez47 z|KU&Zy#moZ{Y>UMS1P8L{98}7p18f*3?-;D^IQdQ_*?}!f#fd$o=(@8R|wwZiEJQ{ zOgctA%SWXJ67Etha>=1bN`JM0v3wF2vrF4EhS;gb!<;88^;7bq0q8oO8IoqOnTQa3 zcD1d}QTx5GaIP&SLC(?t?C6BCX%k^UUiA+@qBhYfYSSan(TK{SB{>t!IU=Bu-_=Se z`ma*%)+`(24bh5s9XJ2UxbQ<+p5->7P4;WX-y ze#Q)JxcY7fQ*THOvCM48Sqx2BoX93SP|uBxo4-mRfPP_ARiDzus*?phMqnW&bo&#K z+twFHRSXLIm13D%WJSZbOJG?hy}e}Un2y=bgk2bw)rhJ_Be{qWgd?7MtNHMTv9BfM z%(c3=11a;$(CD+eMWTBV+4_wA)c7&y5|OkP^kB->3Rw z4Sq-M=4zrP&1olq9@B<0CpKbGd8=v;Ac+NTzV(P!ze-W<1ZxwQ!+ls$uAJ&^jP}?R zEFFTLFU^4O7%$U!TcAm*z%vLkLP8=GiqNkR%xE-{VqqFsWwbsi8b+uRcK!2L(D}*V z(1W653nv_eX!T#&nyv=*(#7bQ^FeNS!nu__AoXWep3@t)VB&1qT$4DZSRmQ?f?FS< zb91!2%qVDxv%7YO7xwxXW~6N%<|*MG1@4&;{Wk=8W|vFPfV4AxnO1AD zx|C{d2c>u57}C5vIwDVt?*dT|7<#iMhZ#i;&(is%g8M{_#ss}t39mpy{ryacCO~9=(2F%W48n-)D`=tkQ*4>v~0ryVrJJB2`A6%4g@JX;7^LqwxR4z_3;uohzkV}mSe>ZX?sHri2$vUqqD0oShhRf)C$ zP6)_$EwyM)rMQ(EaJLQ|(<@Vx8e^oy1NI7!{$L72$3(m;^B7@h`@ln>=X<$<);>u} zW&``=%VKW7asG|PYJgkI^D*W1o3nkb>M#WMM*@CjQ%xz02EV!(QK*TYaKy}(Tgbe2 z>5CVe2o|yAjb?pj_N!4Yg^vY@vMl<{Ldu4Z?>c#XIb9{RGn%;JFkIz_3)dS{G^))N zr724^<_;Z=mV%tBT}{=6UN{;j-!lE6YPxH?nq{~2AOViKzheXR4X3?F_DO^3e8Hb} zj_}U8DUC%1Oa>Cyq=PW{1aUZmmrr*k*AFjRw9TKpsM3ERi=PI?7lDCL9kFKzq zjyV$Kkam=muL2|UF>e_%&gB2$sB%bSO+>knyTwiA^m891P{!>o+x7YdsQLQM-b>o@ zjXXk)D-vL-9=Dh%OdkQ8u01P>lX_0$sDS5xDe)n;GNqmGG#?mqF!)C_Rk(Ke(mJX0vcm!d!Bs3?IZIGzwn29 z&-$0PMGv|*=f<-$%HDWNSGltnc}-9BM=jhw!Kxp{-l5VJ|J5RvrRpo~D$eDhE5^LH#m!>d3K z>?J^npJVstXSA^`J1aN38`!Zv>mT_Mb6nfN3FkkE8m+V$g+GEW9T3aT@Aw-1*JE};C!=1a zN(f{3uWeA7;((wm&U6h2)l$bD8Lc@ppRD&>Ab)a9G7iv9*;Y-HSu`n0X2NB8O`nAtLVMLjg=$Vv_}bA3tKY;h zbmoq6cN#kq`bRuy({tY2QMvYUI2zMlQEwrRe% zNbK>k_IfjiGhqv10VRZA>ICz=qrxR5W=$J1ATh6G!XpC34}WU%-LVsQBSTfH1NlI*6vf_Q;~~69*NQ-s{4_F9OFYX=AP3I7Nq^6ARs`RZS_=d7P?m19U zyydiYfhkg~mMW|{sFQ9d!eU2r_o!sRMWP}q za!jNjX(8*)-?TA$Dl&dd8-FC`zX(aeK$N3Y1WeDQ(yT6F_8h_h^q0WI;xj=9!&T%T zvnX49za}s%R&WI;q5~mkjPFMz>z29rn<7V8U3(y=wA(jc7}#>iSXxb~x%+SuHM1$q zECUv^Zy1<$6*aiq|~NED6Ss4dv@<4KTMFp(Ni zr{Hu-GpGh#)rmQktdVVCvDt^O;t(guyCL--LWPt)F^P2E%O*-Xz$SNeaEyYgKhh#AEbW=V%uEs<^zMEz&ACl zMJvVmCRs!>y7^-7FxA9uacHO@(!^g?PvW9}*4G|>?-<*lON4_6EBNnmYS-xJam-AB zpg5cBapX;;z{OIlq|=!V>7`&SABd?RRARKGsP0-66-d?^9;bGw9Zx2;SCovyn<4d~ z^FOYBdmQ^pB=^p$_4x8T-FY4VY2kJKwEna1-g^|gM{j2aS*bKps4x@Ro^t{IUaPh= z9H9ar*Sot!8}0R@b=AqbGWKXp{fF~&y2^>ahDuhm)K%gfTX zGWX!dAe9N^EHO~^x>2NTc|rIoM|wp1qimhD`K$NlEv8%qqfs+k2E0d(1tc{c;Y?l#PCERLq*^a~VeaQ3fkWZ-tK(hVEzDEtu#10r zjKp{Jk14Mg!k03wMK0!T>>fg;GgHEgO>lzth{s^n`@G05F>M96p#J-iNkG732VeR} zbNB@+A-c;lmZiG}|u5?iE1*8nuu z2z63@@D3VWXI<+R!7rP}H z8kQEnf@KG(E&Q~V*5Z44k{EyEy)s0UR*g8pF4%}+u&GIT@JvM^Ek(uRLPR(;2Pbgq zD(leuG!|4!ItNF8@hu5;lSGOoit~JTtlf;RB&t9(vR$}d(lUnU#;o!+av&9`-VZd} zZ3y}nE-*9ddg)5XJ`IHNkZ6H8D#z3GpXLI4os;O_ytiU}o;43#hWe%7h7Z}$FR7KV zv(-g+oD=ZnTvc}}8o>nnM2W0q-Vah#WeJ_l<)M@=T*ANGXi9sUClta0`2@|eyJXL_ptC_?aI6-L zUua%Fj8L=VjF5GoP@2Jomi+5Md4{7Z5;&&3$nVMC1V+LZ>kIDAGAHBkW#kQ{iEu?q zc2{+IY2qp0ukoka>2G7!H^`$;gdjb=<(vN&x){5PnA&uM`dB$gu*__Vj zV2wohk`?gjWu^a4<040G<}SnqBn*{YQJ8<@b(-~n{t8saTzo|T7@9cf#Qe@F@$&)s zpyKuvb$XsP$hV7EBr(ej?92%H|M+^x_)daoTQqhuv2EL&Boo`VZD(RlY}>YN+qP{d z|C@8}IT!Eu-utqvYuB#o>i*DO-L>{w1aC0NLj>p?$JW9jF4npWn}+`iTk_?ljZ*XG zC_yk9wa3XmisQ-94Cyvq8V<5#aUl)^srfxZ9g|fH$g+pCepMyp*=Bh0CsGJ2jqwp| zV`Hh^JDdb>?K%(M;RJWgdqeDu?VNvFUZ1*W2%q`KyG(4HhP1;ki_fziBCl76=_T{3 z{`~uH2V*f|*WT=i%B5Vy2}PUg@dQa$7+-Q%kr@J54-{-Gu}D|e%{f<8Af3ht zv2aadvAMJ6#f&QMs>92EpeeoU30{*ESe0vHv1JL>J7H+wFL^Qd+)4XvrOx{3?!#HM z5^i|Y1ONAgkRiF{7Fdj5CqqQ(mTJbYnL3jDqPv0o(t&filEWvxQ1kIp)!f%SA{vUI z4@F>g{FQJGvA0F<{O|RDL@*@v!7LqLWo=z9tKI+yn+BiOwq`W}Z5^*3g`KJ!w&s>} zOduS+a8q9DYooBqhQ#~`sFVJNLb@LPR&QTQ-^Ln2ZnCQOugm7JHi&!ehrdB&@rac&~VSNjtYjSvkHaWP7(ueRN{P6nR zVhTlgEx9vcy=4*f9$@*tpA8pzN*M(9Q_qCg{#)InDsv}KO)EW@Nsk;mEi?xFL*S5p zOj(Kas{12}1CboR`U<$WaiEFQzLW4?TS9LaOxRpJUm);%D-JRvf=Gqz>~C^W0!&ag zAnEcZ4dfxk%We8AsTpAJct-Z54}+;ILy7%p-^?II;k^c?ctWFt0;Cn^3l3F1WU)|R znn^_E;&`&wsRC_wbS}KmrWKm;_vRt+fl^|j!+DTXN+d3nFHD^UVd#MR(3E9qW0Uuh zJy$lem@#>bK10K(2mH!gNeAb+BnZ}Kkhb{4vGQ&i5^ui|bN*CW;bf5nZA$FZpLLT+ zV^JaJ=?A9QOixQG=fZ{`_yOcah9Wc#OdCG1ZRjg;N%U2NCorAZjo}dK+kU@#LgAn| z`#yd$a$N*8ehXPrb{zs71vdS+ZqANZ*#Z!)39fTWm#3z(I>@@Fwb^$^{Th z;5<-y)YrS*Hg8pEW~j}WYN%nV3T6y`A)Q(C$%z;X1A&@uC5{;9C~M5Pe;UnbSFS$Y z7qf*mu5YWD_$2>U`5Pr#GhENl>5PhsekL8lGh+lHGtL8Oc;+nTDQejAubs`(0w!(c zcJz&}btH17MiX}xDX@0q*Fzp!Urx`3pl`8c+(2v!uDJWZi0VCBnd&QAnGS=dwwA5~ z2X7*9`QRfac=iiluFZ|_hjrBjyJ4RF)sP$Z<{f}X!Q7@6wvvIF+lSGC4rrL~tB;qJ zosE_C)Uj*-@0k*TDK7t4r}n$i+={m)&JtGk4qe^Y%#7mV?SQME&-v zC98mtoy%fM6|cVoJo$5r!p{3GbS<`8x5ke8&h{1J&Gx=55kv%#LlXLefAcN)-{(xIXZnv>2&4_7{(sD(d&sQ(v&Zh^ z`$W^mmguJljs?765&*ttd_qnJQv`fb29E76p61T7Zep@C0NY;vj~paXL4aTD-e+`6 z(@?sTX1e}S$KyMD7nK7i**Rs0fEFLXONHk1*UsKoP0W4Uo9hiAgszb9`D&-B&GGqZ z$BDso!mSJNp__m6Z3pT0C6u6xfKT=)X+IhL$T4N13&{`Y@^pErdE>t2dWv><`MV2y zf7Z1Pd3_`owBiq-@hOh|xw#)bB+}_UGhRJQX7!&rTB%uHM-zbHw>3fl!2wCktxKks zy{&f1KC1`yxjPhweURuAC;!ii6up&yder|m#VsSZaH6qd(gydoVT8ll+cK4g*DyA! z%XPj=`#Dr^Aq{vNDwfkt%WsL*mHx07@>6Zw7+BWqGQI1{u-lalAPE;w<5*$Cy5r#E zs=v91Dqi|*;8ortzhHtFWg= zb8{d-W&YTs_H-egtqO};Ajc$dfE5 zB197BKCoZ?-5*3(82$-_VSBBZE(ODh>~Z=i|?0NUzricR|oxg<9kei$aDZDrBD}-T)T}0#sIE0LOVYeIeG@JQI-qsH_%Lk z=j{iitSc+KW4LlSNwBbsfv9~hr^Mq?Q%mI8*~7_t?95@nk%7LZL<06Pns6tGJ1OOE z1u!ub5W(GJByyira;Pxkxi;*@hk~MdyY*YMmOZnKM%+9%BBJeV6j#C!?;l!-fx`e0 z+yt`4gybr*#5W%#7p7MTum0N873xeni0k8h4njjp*C^ptYbYiO3^J3;_~>*7FUd=o z`9GKbsu>9!;ZRN_AvB^k8Qd}J<|L}hMQMH>e9PbE z;>UW?#_BzgY1SBy9=pj>PH9qOHvUcueioDygJwxWqGQS!qt>v{B%3J(4WS<@O|XovV~v+NGsQ)_4~$4aMy;AViPa1#*!NNI z91MumPoT*t8Y64b(HH{(gErw?U@0iqbh213gdtPYy)9ck^`kJ8s^pRQQC zc@C|oB3TVs-d*@@XAPLw?%&<7LQeZ+CC41J6-v>&v-LpNF)*@=yp?&*$8=gFyFq$& zeiL8fqC(GCjS%{)QZRqjfU^owZtX-}&M(y>=7^0d3_^E))%;rB-LbZcJoPRob60nV zM~&BN0R*e@kngx6Smaoak$fe2Ha6Wzk_fbg^u912;5BJa24>fajzH$<8ly!Qq*$y) z;^$4C5=(B+dDoI`){Q!9U4@MfNp}$UL-Co4FV#)#t%WXPXdG=_{8byoWwS*L*R4GM zXa|ceW>0z2PDWdG0XOPpdsaWrat)=n&Tj997|4GK*5G=7$Q1c;Q4cChGvEe9LU&28 zUnqm~+g%u=)L&0Qqex!7H*9}{%NLd$YUTD#!_IJ}T|Vr&R=|(xXd0S8?NQl%Z8%p~ zjr@{rJ1GBJ-E}=slkq&i#d+DMI#BFvvIX-uhN|Znj3hJ)o z#-j*8OOOly#=bN{;yJ?f6w3~aoB@?!+TX?)D2i`*ye}>SA7g?Vsd@qgh<~pjT^$_t z6}I6VHa!njP2w7B$g7IALS1g9Jx9*L;JME82s^!^#tW`=>JLz!0dsFoV0DeNe`@*=*R>)qK|-J>klF%9prX=%1beDr+(0zCNs z;50`7pA>+Ho6i|vRD@(adFmx71DSc7vVfAc`;qCJ2F}HJ^z!)q!rT&_6qXPYCDVu5&^wGu@iX?#wYBpypr*(gY;tRmW3s-xMen(kLf zVzJ=3v~JL<=L!}A(G$vzEv-9CRlh(%)BTAB41x}(m~q_xi0kkqYxogwaQsUNy)EGk z?!O4P#?9%4?q4-}$$paWEf1V{SN9gu7zb^zeH-4ya{gcbZcvTlK`YP!N|q3i*-I~- z%?MqTm|OTgMYsNF_NCB!s*WK>ak3iJj>S{OiB`tmt@{>Mn^3-TYRshA73S|z8TH{i zi%K+KrXBK^90o2{)(I|@&l#;7l{@=i_J{KtZi;JNous4xcu7mLwK%1KvijM zl0YjBX$PFlOyQoE&7r?fR$}t|j%KPq+p|$P3o;V1OqG^FuWP;sS_K_XZ{TUUg{Zgh zc*k=Mu_rnE6K`i3AGmx2#h0-SmW<#WSZT1IaEr|T4K6H1i3giDlc}aqrJWv|(|DW1 z#5rgrP4>doukgr}rvMq}X8c=$dBkv+A|;LPiJe)(k|2~gK_MT6r$Q!Qeq<@V+@J2k zRtCvHT+p}rf}xHfqyL*$0~$=Hf4iZEs&;Pbz$>AW4u?yLN@MB~#?;t#+%Le1_>4ji zCNGYVAf{829~_`E*{G&ANVwMaM32;?sFm%idOs?ch|hxb=6odWt#DgBA_PsnUS3&n zcQi9huInrZw+68j*pykm((1{Vt-Oq1xjVDO1`jp0a({9$nduR@80H1PS3=(rh}IT- zD9SydF)*d8dBUhN{pZX!BWr8y*X%zRW(33~xLfGfI zNR3FW{NoRZCBly^gs|f=hzxMlhKC7VDbehe8J{Le?y~I;bJPy&G~TOU2|Y%Gu4>Q4 z7lb;S)4CCB=ib>eRD3eroUdpLHO}J9lgQhDS3z=8_24?`tvDelhS=ej7hPsVmz!;3 z#6!3Ackl2D(kAfW8z;oG$7Bdz64wzvNPZ_+*|{AGYr^E2kyC8)GfC| zAih{RU`R)-UpvIL5OVa+SX914eE=5&iodVN0i{#jkM{yUXelDVfx^${Q($(`=MP5& z(!Ibq(GOF^581^3to<4NVb~z}zg(?9JM<6pf5qK-O#*rwet-;~&tY76YeC4|fPL5&G81yTjDKy^a+kis?V~+H zgBIc#&}YPta{pNn=?wPq7e)j*$L%~Gj%f6wfWC?&j24gXS!{>>q!@3Y+F z8unfQ4v2q283(Mu^6>fylH2w~S=8$_CKdQr9+;R(LbaCHKk^w1^^(0UjYF!dr2#Iz z{n)^%1&9dOuY-F5dP5I6_mjPV6qE0sXGYon?ST94Y(5xo7=Rr;9Rt^APj{#GA;2eo z1Yw(hzlFN(yl~WJ2Wr!Gp!+23bsNTx<}zxRt@QnES1e~PKn>~l(hSMtPEDDw|~;N{O)KN9Me!ggafwb9*?Z*3TYuX%KeR3Z2{M zWc|sW4Xl}BbGPWF3r$guMx|M_=tQ=iX`7M(2XoZ@*@%5AT*z2=O%^M2ompdv>{-{U zd&!elVtP<>7*Uh1$GnLeN%*j=cTr;Qoqg>4K-^%W=;dfnq#b*-^?=}d&_3a^(;3Y~ zTG&~SOhwMlS!WweJ6_F<9VyQ3=w4EIE)T>SkOMUo!F3-awsRZO=47YABu^n;a&W&!eP`6Hp7i6k2j39f`>x)#*&wV1!3KT}f=o zar|;h%w3B#1)isLDM55e0vF3tPICEL|Ils!Pe_UQl}Yg}X5zfRP~sy4WC_y%7pUSM zTTFiLz=#2?)8V zrLDsVl>XmA`9+^lJ+QxQ0R?6UL^+`?!;b>t*Ngm!WiAqGd9~o^q?hA2Ztc9Lg2)ZG z#Wn7}x+{y+?4IabCY8xHpl6xm+4QyzC=0@$*+mz<*<)x41>7i>%5}dF@XPfu(YY^` zd3eNM2^;Jw*~0oSat~%h-7>jy*C+AXn%g?mP1r6h%}jw8j&X!HC;-@X%`xPss4k69 z2861PXu$&$H0!N8vd@!X@#|1K?ML>$F&dnau|~xW(g&8(Oka1romKGzEl2u$Lbi3) zzSA9-ZJH9wij&xPCV@qJspu42Lo-D%JReWZu0Glqct*RX+#aM$b4KpYLL%o++i4Mb zO-i}BrwSElk*J!qaDSygOf({Q$cH(QtUj%J z3f=3fY_t6~(zzz;Nt1wL>m{-85YsWk!@(>f2FP>HLKGrA$fKfcI9WVmv0IUhPEe)f z^CW|l9OqdU-t=|=&n7}488UIhtt<6 z{48eZ4Zy$&nDHWCX*fE21ple-e59Ry0$RU&B50}sYBnZC8k>M`(wLuop}AXWSFr4? zjlVkGy?4rHyD7~Kw?+@Hj^k__HFV1?)1&Age=#|>)0P27AHLO#4c|FK@4oRTNM8bN z1UperfXb5}Aq8))p)aR-M`YW~X4n(;ompr<{OLEA0ZFqvkg6r@m|gJlZcW|XDQ||^ zVs9-@e;?QxxX&J{F9E7z=j%g(g*SlYLKL8!p?Wd-=UIsw!{$-q0Jt*x&@fk?inO&#*o5k?REYmsbp>_Ui0ay=)+1bKjak1rK$G84#k2jO<&Tihf=jfz&_ zx5>XIYqFfJOVdpRkgaFK;3S_-4>d_IGGHADj3Nzcg3C@XHR8qLB+aVY`I!x^k2QAN z*EjuQ(PsXzpCKzaYAnAb_CJ@ zGOHCRZEU+dI=-$)UU&q){=N*1bbSH1IC`03n6>oGqL@DdJ+cR(73fG}MY%vl^1A8_D(hD&8~s_f&4rQ+*y&57+RcTX zB{=3L*@<}g+Q1c{`WSQ&!ANvMfkc#KXV{#Ocp4@ej>g>E*1}>#vh7yok z-SR*gmvuK~%?Ll*fUL%?$Cq>31}~kXsjhnfp8Xb`OfcSPd(vj1(-+U%<9G{Wbve`o zQ&{AZy{1*~e14Kxp9^jE;6HNQz^T~pKNxBN>P}XB{Iw;wbMWknGUuH6oJ};9hb=L# z@c7BPbBqM3SuGi25SRzu@cynjJLDRXY6@#Mv3=)(3MM)$ZwJ3n7HLwt*N&fRijd0xbdpE`P zje=9HP?z<-bodB#&52*hoCpT2q{$akKH%gTDj}>%^XW8T7YZ(DF5tGdYnPeg7{NvW z$C_PRU(~Rx3&RCGdEz-(QWi3Eq^2%McdoTHruO_Pd8y)(+fkjE#%|F3-EKG&ZH2Z> zC{e!rCqQ{s@v9K~abwFMbR>H%exTb)lP#spFf&9#cRR@FT3m4!O+@Yx;yu&j88V*m zaOBBlygE7bUtjadNDx#;%#81Wgdl!Ic7!9!T?N~O(Zo`fPpP488JPxkhs7~tJml2{ z?Uz<2eXw;Sxl~%+zUe07KLu!DnD|~qa2HO4#Z~KF|PYqOD>ZDse ziQ@Z^N)XxbzRmS&LP(h*mXX=%zhcs5oQ(nrp&kW=ZfUzDNiFG6X;&-`i1KhM^z9(L z?lkuR-nC=+ZIVCfBa8;qg@C#59=&3abUlEQ7WKYw&N0=afK~8!$t(c%Jx2(jbm|N9 zC6@>I@dkgNP(2Cwc7=~9bINcAqW!Pt8IDrGk5Y{)Hi$I;j1Sp#IADV z1>@!!V2iLj6|(31b;K+?T-Wh7e}CbFDRE?w*%xt=;bpoHh`9pj*`a>}eCHm*z5#sO z&>>xQNI*1PNI+9Z|B!%Kvd}2nzqQDijP;Xwa+G|15!ZKLF?z&*cSkm{S(EpC4=st^ zUep|MJ=ZKJJK}xdpx}J~L}3bg(7L~NmJ>z*cEsvmxp~;nJU#+~{6Ny05WtxqcWC73 zU1tp1!FwlZ)_n`FzD8wx+ki!D*8hC+cIuhKhM)=W+Pz=$!O?7VKY4*ldkE=q@bmzu z-Fimq{yMam&)#tk`ZN8pLRdE-hy^aUjZe%{Hm;d-+K=-Y;g6q4XRkVy#_!w_>ohjs z+}>{P9Fy77Zc`nfxZNl3UaY)BGU^zIWVl`U z(zGXSi@qG^g6zc&tFu?Q<%-Ug!oK+1cwv8W?Pbi};dywYAZX7|b_^b=P`5#s67A+i zq-TFbedoT;)xW8kF>Fc`dbJNV(ODQFQ6qm%PXKzhU_V!KQT_FkuSt*oyhGt}{{%?G zy5&p(Vx!hT`7P5q$pIW`Hrw;8kRgB*k*!a}*i7q?H(Q8~l~FTzloON7H8IS zm^Lr5Ouc_4ypH2|gQPjd!LfL>v5%iu^OlwbSSk7@kbT{9pN6U(`|N3MRdjj+JPi#A zef!2!ETx5A%tW6?tH$~ENjNfU5r@ef8oj+CMHa%Ot^mp6>rBTI4BL}pHrL1xLJ~y} z$>W%~oh_k=I``Ex@Np{KR$x;>pFTIia&jPc@^Qw`;-jIcDNhaV!`bsoi|bxKup456 z6UxP3V%{S3p$g*CO)_@UcS2J!3Bnwc!yxCP5PJgCTJM2;_%U$7x-1|k(((YOTjKQj zH}Q`3_qJ?`n3JAT)O5XkL=KGMB7&sCVuL(vTp8G{J|!?RpB1@i8kQjciMX?U#C?}Q z(rv??L%Va=V3t$X1m2Q3=@Q!X)_<8OwO|AO!VWqUGe6?T!+$6z4O)mPY$S3VSTxkzfA%Wygc8End<+ zJ6UA{^YISvty(oO_4_H)3vz;r^vILi1a{MZ?rFM8-#ueILqbHMpOF^;Kix-Wt=1`G zrnTuj(KsL2jYR?~P6F1SDw*QK=OD-GKX~U3I-r0J+8;w7%Gdce>kpdq?lTi)3*w$E zsQ?7T_aV}OjXeqF+AC;yISMXsKy4L*MPr#8U_Z?2zX`$MgZkJXpmI0f+MU$J&fnbM8{UOjpwUTr3DQtbyht$w82FbxgnA$aXGnDEb|W5GkcLzBKu?R=G`PeaVuvs= zaZ5P|R6U~uwi~5a{}S(kVy4o)JAw*P$~fkYjiu=wbsci7F_Mc^_fN@Sm`36eg~T2j zX;m1+nz4bon}05)UN1KJkf-ZT`;DoSMlCKp8+cMkOGx=fHgY~(B4bM}Oc|Gw3epEd zluv*O5)xgL7feM7EF+)yvSF}ik{}JX+%_g4MHn#7d43XnKb+}@Q&hV_5#DBb%l(NQ zNLV;7qgsU!a+l=REc>(C!RQgf)6`_^683ns^8E@{xR%!RAzR^?%gz&2**0H<*kip+ zY{6OSHR(Vd$sSh8*jqGnfBgE^U6G%X7dB(v3}_Ye^6Dso+z8Eajgb|w{yun|`j`q7 z&Sikwh_EvK4EF8w1;Lvkf(Jfb>a^VVixelUP1 zKm?3j6%HF17?Q>J?1sY3Q-nYg*`c}PL-6EAXwPCc7^SuK36l)AZrnfl4~xO-nBGzN z`KQb(#fX>p1=TFKpvt!;zCNy;Db>cj3_~}oamFgDhC~v%5gci>d^b z{Ly?E`!O#S<5gzbdWg1>lD`b;b8KqjWWc1Ty!`LwM1shuol{>3Pilnp*&g{stqE{o zTBzL1I9gZ;gwg?{m_eR`R!I%V&$j+*Idi*Uwr7tg_aX$*~B=CWtG)4Bf*+7z$ z(U+GpZI1iyo|Mz5aWnF^>@wddDzgQij<{W;so|+dDAJ1g&Bi^<4vFx-QS;?gNYos|-SIS+UdXYZ&ZXYWhPp>;@Jh@%JL`dFqP zo)!B)RnUtKUhxoF9TX?dKg9D1UZcI~AjAZNDO~)M)qsU>J*Ntwk~2X1l!zK&MV zhks1z6ae$3mj|GE^bP*5nFXM|_Xq*h{=>PW{obRz!%@;av-~8p_=v{cEi|Hb`U-=m zmv=zp>>V6^Bbc-HGiWRI`B<&eDN>vQN`#fFU?sJAvr&}BU`QE z3^RFt0=VB1G#yKle;14b-dJb8NJf0U`^e-gB9iWq2piQ!PKS6aRJ5N+Q!aS#2t>Ue znmBiY70djEGgeI7RV*b;tb9f(W6<7~!tdS7s$+v+cxWr1Iu_F}xXS)fKv zx;LS@@9h=58K%77#20l@tWc$63auMgDz`0AJp~%na)#rZB|Y79ldjg#l3O);IAN4z z$-!ZNwk=g~MQCzsNsOAm4=DG&J7PA%f!Rvz*c-1XVG3XlkW3d}wH1Pz({q`Xa*>A^ z`x*B_fxjbGtPlMB=fOK>4uTxRaf5UG-wrYcd4$k%%Ld7-+WM6(g z^IsBR1u?PLZbHc5$V!@8lof@Htl2&_*2}=Za?gPI-#DSAlh<2Du;C%W4R}D3>QMIT zBLHCxvcOGBeukAG?Iq-1k}B#Y-Nfie?P@`@j?f4i>-e8<#Wq&B=PSUea#*xd9ICfE zYQr4+b8r7Ht{IGT+Pp);lw0_V$n{BClseyM?7Wa*PT?1(pb(Vs01^`FHk9{Eko?SK z$Hfi+ z@TX+*huHOR8>X(yYR#=o@j(s)j0*|M03CB~>Q#O2*#!_4psNbX%h0V`W}qotP(J#Y zM27Ivx$)Zi#B@6@sPsaIi>F!eqMZ=EFcvvm&REbfuCP}ZLX|w{Rqhe(EK=vtM~w5L?M6TzRicV)F2Cj75#aKukO{5-+(J6aKJF1_k|Og>kwF(P zR8PX>VWV3ih=qu)#P8M{oOJ^U6U~RH7#O0MHfmc=6)lC>{6T28Cvu>CEg25RX{ zRnzI5t?VxAN*^BorK_vIhw&;1H0+@Cyj+r*eoK(ZCaht1_6X8YFx%lu!CtaW(e~f* zkJ$pEiOgDu$0|fiZvz(~{g3`F@wWu`?|UG!L>Zlg z-y?mBUnQQz35$PJ!(Wla*if=_#8tn7xU7u_6b8xH z%RndgLR~0|p{r(X#7dzAH~Q2sC^)GB2g+doF{8if{@MC>g@>9U?yB~OP+Sz!(2Whm zoaFa3!m8{I_+iYYaV=l4 zzNojHUYlPqNe!a)(>Lswe9mB{GUay;z+~_2$o#dx821IFNDY^{gHxC@?rIkVd-aDV<9Cuk&d=T9KOJl6~58EVCfl+E7ikP^75%F0Ta_=K9j!O%-o$5Uv#FNYQ~D~ zXql%R3xJMmKQ2kcA?yjl)H*R)5jfE~$r#{m*Eer~*Ee+aM<(V)8(V08AX4@9pJ?|5u_+sf|5AZ!K*ljRCA0o{w7p(tIwMu_fZ>T~8P3!inAP{4<&HAiT>|Uh0L(Hcl8QGvX`3gHZ zLLpl2$AyBxatJErqkyx9x;L~vYC;zKXF0OQak=lMZX>;I#Hz%1L&nF_Jpe(RQj7oM zUwUz~qwEs1Cc7${=kD$x3&pz=_<2&>w_^K=j9nl>0Rtd$?Z&ert*Ry?%J8`VT*_;- zNf!+6RIN{B-&vkl)tB8kba)C@EUeJCxRDwCdlWek6_w8zt>SppzGI7f_4D=kt8BL5 z8>D>UYU-C(N2&<`j-@hhreJa2ztbqYU_Inn(To!%l))borb$h{`CXbBN?Xg>{=@gV zy1C2-7s~fU&3t?cyp=STRoX&xJalo*%e)OMgiD$jd4|lDUe=v!-1nwiyq(FBGM*FFZ>G)e;^ z_CO2Dt@E8j#Pp=Ms2#7FzVFY&uXSd+~d z{@tdMQZ3GD7Lloh;1JxLshtQMEhxas3iAEg-Ugn%xkmq(2Z`4*An#C-;BM+#_J~u% zauK|TrU)G~_Blb=Oy8Rpxr|f= zpQ%8DugsY%!Rk-YOVGPvCJf`A%F=(dT>x>uYA#3 z$7WA#kd{JV<$$;VA{?O8wm48pM@`@{i=scJm_JawRX>mF-rMV_LcpAl!;Bjpsbi$I zDk?LuYFQjJCEXdCv*QXKwnJ={+}%vPv^-QFC}ZnfD>R5FZ7O1YvPnNGJ|#`m0jtFQ zL%Aof9tRkd{iPb*DaiHDpOh%sDRJ&?h>LZhtgtrZGQuFZ_WZEm#C4`;cXe}3O|Y6z zmVOe0JFTde54P*&_3MXmesP7j#wJlNTt7=9$4t2S~|s}Z$L zCAE;^a8iDl=_a6rta0+XCFe`0gLB5{Vc#)A;Iv*_!jZ!*bq8`#L~%{8K+n$4 z!7f8dRhgM3iAXG&6*YxDM^X2*@zkYAC3ULMKaapR--~bM1y-{zXX%?z)2p`VOCJ zp5G|&AvnK#s|S3K?f@B8$s@j76GwM?_<;Y*ki-D)Um5;S1lOPCfTKsdkQj<`3vpu zua*1k$WEN~_YH#1mM25MJMJJ3f!jvtfYm=KAADk5?P506a6S6^(dk3wRbM zH}uC+d`V7#1Y^9rD%P>Pl<+}Sr0aGD$W8G=U0oj3qxwIygzC+!;e*8nBe|-yg>mO` zg4VF+%rN)IsuvUE9A58#)P3}LlxzPKbk^}83LHX0uFwZ8r$8XH$%tHs4bT8*B;m9a zsFo}pqF6Ph)_8)%{J{tp{ktPOe@dROc(5LoN9x{P+_-cz_3595;AnZ)27AktG_QAn68Q{sotx5xfwa5GDg z*!)$@JchC2Vc9@=In1YV$U3YiGp4_^V8i@dEuHyb>l4OX{1U1qv z3IrQvlxyX;H6z6^{k0RI}#HSaZU=jrve zfPhD{*QeGA=6&`Py}6s-m5lsH@*m;C*3#Xfh3h`Mtw0Kjk1VyUuLQFWvAoWk8K!{Z zF=B!`JkkP{v5CMFv8=A^nyu-BSz5%zlRu)He5d>yTP?5(%!jK2pIbg1zOOvVSG?EV z-l~-0Ww+lJFJnp{bcJkcwtXIXL(jiqqA6TY=d3e7K{qK6w_GbfIJJ;uBLZ&59Zy>+ zSC}+V9I`^tF92<(;yO*mR#l)D7q0HHDz``uPzJJ#?5yvNi`1-^q9>sq+FoLA4x^Ot zRjN*saYi0GtqzMg_2_7P{{9?8Ar|0uo8{?x3u}cKZ6YdZ5(N>Y#^_x71I6$J_+yvC zj-IhSM_&1r?rD!E%xUhdGi^++-c@Cahw6=mx{Ew9F?T|Ld7j)_4>rWvg}|OJE!g4L zT(!z&?*$w$j7Kd|wTdWtX4a+OS3bGf!r}6o(BKR?i2;uZ+BS(m z3g~77kF40;oN|;3FSL`wWIs|Ps9VyBvdqfT^YmcH{xpq1VJ?${LZ%7=?Wz4+_02q$ z>Q-|iAlE89jx?J?JM|~!h~5wVa|oKJ@J!xTA>jst9A_QL+kOJc~RcG0ltm2VRWpN^ZgbvgafnCHp;v7YA##)nN&E7ynCwPEi#M!pdQD%NM{N;$x^A_ ztagLIo&C62tVo-w(^G~KML*RCA*cYz&T^G(chPfTnEtyshbyEKGI>I$m6+#d@UBKV zG~so|Z}ReHU|@OblKa!q(pwG!-%uawKK@mEK(b`B!idm{C2~jJ?86ZWF6C!V^Oj@3 zoRWw7mDnOgnOG1KpHcCo+^`ZC9bm-9IH4akiwt@;AY~WjyxgIg-J=4`7*GT3;c#Cp zx$$-Dz{tu4g&aZORjF@)R9F-wE543R#o&~rHdWvL!OgYiJo*cabyAaALDsBnAA`@P zNp)LKP+35_pH&`>=Xe1Iv}?j>9}l`sY2^^SSQgVso1ZzqU|OET%Ct0a(gE5yzYeO3xq zk5`^2=8e%tFx=aD8V*2aPb#geS4=uRELMyY9YR$%c~jfdwHj_|8>qJ7UP?co#j8($ zmMX&&qWk^0yrkk(fYe~@tywJ;QL>mVzb=yHk&-nFgL06b%oWj?INeKLC}mOg+(c<^ z4?|@)nKzEBLF#*nW(LR}!E-XzElhsE0Z9>T`fH;`Q?N{lPp-|~@E%Y`t$L&ho3Dr9 zlKI9d-fEt<5z$HTt0c}Tj-h3+E}N0Ue694@2W*H<;T;&2J*KFb<(u;hS*c9zp(aiA z^}YLrN}I_SOCSl3YZi53NUk;f_R%6=>B+{RTfFfyq_z_E@rWb#h-0vZ|GjN~szgzr zo~Bl|(SwLaFgPQ(9MWF~WAFO4e&n$8Jfy>{9utA`#xxJZChV080TTqsPR^%u+9mk*Vw+D2&F7<9-k|i! z#>>QZN62Ju(RtvF1fz`fw}TGpmpqR79bY7|@%5YmkYB;HxnoGVAFcCk4Pkm_o?;jr z1(-6JPg2Y+@!Q3QVU!@^V%7)vvE$pL-1Lzpqe0`S;4Xw>O{}f9b zguUij9GhJfElk(?N+DQ5G+2(yS#mjrYAJ|7A@G}*^($1y^YO~$uoXMPivtM_nly{D z>t`#xRK`(KCXU_28^Y*#Sj9v{SnzmJGCdb{Xy+6f5C%3+Dn(2vukvc)G#hC&$%hVV z!ogR;>|JHDcLwzyHz3R!HGMo%P1b>!qwv@{Y zg#NnVT_x&dz!z+*{Z1>ehdEIZ+fP?A$waB^yYkDoI?)V`feu5H=Tv6BZfxdq7y#^hixiJ%}(s$mWflr4r%i& zySE_(i@^#6h2Vp3Y`Z%F5*;$eAljz*n|QC4v=BXXv+ z(Uf994ie6!Sl-~F2zyyKuytY~e?Ff;*qpy2Vmu%2i}(Fb>_~Um76-Vvm7nCUMv9#3 zqg-7}%Pmh^f5TK}`P|VxYZAp_%ygF7q@qnSQ^@*Y4QgBST;Rl>I~lG6 zMu#33u4_;1N74eCJJw6Z0@NLzwcR-LuYbj+@moKVPmaNq2E+a2h>O&VRBCpJV6*UJ z7fx2wF4uhjm?#tpTTOtPA)BL^cJIy8;7+`VO?9kq)gBV@$ME zP=7(xg1M@9sgvEVIy08`nK@)w%Snsah zo9t+8Jt1aAWJVNIkNd*?g0#F)T5`y~gP?;1efO&93;=vu6EdCTu7?@@jX-znh$UlBER@OUV1j)~E`gpawKZHS6wlgwZZ%>AR_1$kh z@h%ghj^y>a2VPq;)Pgx;4ccWP=Ye>T#sR*6=@q(3XQ)2j6H}Q+@yW$(Z@=ituT%0B z^32iBmGgsDEr3-tX?2a@JfHDg|9041mNQTcYziyC=6(~$52=HW7d|VzWw=KzE61*g z`P!tIFcBB8Mq>%0UE*EexIF{8Nhs&CZQ#9xH27p*l~XC>jUP#O^?6qdI;boJm3p6$ zwa7Fpq5oCt39*x%6@LF8e7$3ICPB0=9NV@taWb)O+nQ)%+s*_N+n(6AZQHh;yzk99 z>zwc0Z>@XppWVBk+O>c5s$N}PRnN0ML?XHMDO!Z>i=E4Zr94d@Q>R{#6$5D?ZVoCc zt1)e)n8Szo+gM25S2wX`Qxqz1&QP%jBzZAvjv;Vzve?JX z(l1%BBvfrJUskR6hiaUuMLe-HWcb-~Ve|)89ocOdv$5*s^l}&w-K;z{WxrUnAdm#% zUXlpAG0XjX(y3S`*`jH`2y|F~Ke(3%8gvon3@@C@19$MRh;{qerbi1EZBAS$SckXD zTLuK}wj1%>-n@8y7TVwHgqKdUI~eM*PQLj9_K0!vJ0qGP-4vDlYzr-v&Q(X4wf%1N z+Fj3wx3^<{C#El_7CjwQwR4T(nL3Hu9r*@k8<$Ae@(-HTXZ6=e-}AnJWc*GZknp7D zt~i>5sc72zh6a*)7|2C(Au2w_KVKdqUzkS~j2`hD1pb~?l<@kD)q;M0Un7MrFGOQQ zQu>Z6EBC&JV%u3o^AmYX1F5l~3O7AG-b_~V1Jd2hJwa{aOQtG@ zhZw8tc2%8dn11}5Jdf+6PTOZ~!kLB@ z@{}1ZF>^#&UySRP8&F9mtzIUr$tQIjPju$Nay-oEP0^Qj%LwC68zvWnfB^qKyS-Jt zNu7@smqR;N%~@E>K*zxnDL_-cKrKC|KG_;avujgzrey8D6Qv7|>Wwp38`{F2-Iokn3k0`tmlWjHLC4 z7jqhmOkA`Ak??MJ`X2Ep;9HT4Vu%Eczwi8vePB_^4;|;gR>NrdS_fgce?TYVmdjUc z&)S>ti0N0q$O%h_`Z>PixN13_E<2bUS~BBorxpmLIJxwqXB;YrJ(zf&Dl6>lVMcmH zaAhMyyAHCFpgLBxadRnLMC~V``v5?tQDHWE`SB4~8H-srjIv{2 z**|Rt;%e6=^9Q<(nv@?=pT;vFY%5Z-H+qWG8RN@Com^beV=VeI0bLT_PsRxe;SA73 zatmLNqI_#nyFqnf471oztGTnJkyICS2;LpqSErQET$(%3v(V?h^P2Y@ZHmjK5XU-% z5^+@=f{HBBW)gu0Rmi@5(8@pJ*x|BJVP>tyNKXCM2aaIBer5LYWcl)Mu;$j zfp*Y7uw;QRqXDb0sTQ;rZ1mRR|TH8Z-!RaFVTQi$(51B8BjGB&HXOo zhUeeg7yy+xJJy$BCW&lK#wOk}23jL)Zefa|*!N^)eqR+7_nzR$5*Y@^kPM=>fJ`es zSJ3SL+EE`bo7LmTg0CGK|A8e7o)eyL$#9X;VN#EmVOCzYx@Byht*^dB3Kbc@aO$7` z(h@qha%GlG<$AY|g3@ZLYyC&Ow<63bCQi1G9<38gzSC7!4~6W z&W69ph5~V6S7FLX9T)Rje`l z%4_Td2o__%o68`qrm$Nj-e;CzZm`Db9RAc|@(@jgq zQJ1p7&Im?zTF>9y?}*3K=>Kdyk6q)8-Tn^X_c}l`dH65X>+zf4Um2wq{U52i;|!BO zG%(Nky-fE1Bd+j&dfR30)&FN2ug769^Sl4){a-0frgiwdOh5;w3%|=JOZ*pDn3w!N z8U8o;f57vy|4!=v*2?E~;Qp*O;*a4s(pL%`sGsrq9BF!Ls$z!+I%ZROe~#GSed2$x zzl}a6mo%^{33fO1@$XbsUe+7&rTycJcrwYkK{!OvBFE;V981%oAsuzt4S=5Cmcp#Qt0`dA*zbaac4W|2E-YC!0?B$NBn#L^qKA1 z#~kXHq}(OM2lwN};V%{p8kBUOlhtR(vA+P1Wa&GMc+_=vOM5u@l(&H#JHz~!#4EjYvp-(hR(J4icpwLsl7B?Rn3 zB4_5uFb}7&V@3zlhe*z*!c={DkBxU+FyxItj--c=6fA6f!FND-1yJvQP}tcSS@B4} zx}hT~);sod2GXdV?f-_#^<(`#UD8`R!NRz|h{wJUD5$pl_@(Wg>~(Y6b2>tTJ504Z z2Fl+W?se0*xEz_F!Ex5qs^1B+$`BcUwpac5596tq&6MwIZ}_(=1=ZRZMR&Mk>Fsm% zwVj)0C(oHM1^VO$PqFzJHLgS=I)wqiE6U(uieJ_tv=UOcoJJ3P7b7;EbD0{~Yg}Cv z<(VwD?2{eBEo$Kc8Sr*kLJRbt?Z0inB0K+Gsu0W6*4+*E`9TKgY3u%d&|`0BYwHC7 zG7yFK(C>a>p5L1V>DVFWrC*?XB_6U}-+oh;s1GM;>)m=czpjBUgG=rK%L5z&Y_i1oH=5xFpXI8t z(XIBbNC?>Q;m~;vrv76v-c`DYrxC%_VcR$t;S$U)yD<;qptQOhL40<}394ZBeIYsm zOxNeH0OKm5`8A3dP$ZpIrPn(+vfzx<8*uYd!+F(|?2?9j`hji!(DBUM3m0^wC?Xamq}H2#~N46-lJSV_x`Es zxBZ9~2w>-X*i;BC9SOPuXXeRv!QSjmtZgT{fqw)I03TSfsld+97s3gD_~I^~7P>?S z0;g?vs-rT7xAlaJM$TmD_7D=urk-SnyIk4<-*$)>?t9&`$KNv2GHT8o+O+?C>*J0w z=3GGKu_qqAIV0;=38dvljdB?R)pvkB8DH)uUx5RFj_Vho{oU&GPJzQqC_^v4^-eOV zhsjhe@cnD}hSRTyX2ZU-r+4SNtQ+Xh{{ehoA1L_RxdHARzO6q4(}=HR&m*hA&C60aZgde^mmOfHK$8z#nnBcYT)w9z4M<(*5zT+Qz9dyRU0cn&Z zP-q9Uw_NRu)HR%4y98;TFmg!2AmkbihaQZ<;}2`($6k+}?8x!H4%+ia##W4<656~0 z|3LE#Uyofl{!wEF=RJYxzbc>d5v^R1%d1va36Z?P?1N5V6?CH&V@<7{?iENJ1!b)m zM>42Pw@sx#9NM5@-*qkz8e>=JTf%5o%AWWKKhfPOXYiyX{7ww)l-e z-9NkAQ+B^GeW4`2i5l49fu_n1)~sdJzwv;iJVHKEchD+^3K;sRdJv2`9)dsRGYE}5 zy$8cEYuVYDu$Q>ml^HKgwS_7KyO=JVRNsa*S4Rjv{v!U-Wm=vL!47Q?Jr4b_SKdq` zR9S>Z=cfQnSbwj%zo&@7o3n_L3cFhpqFCcQ5!wP3eeP9O1)+3xvxTjQY}nnaEp~f?v83)GT+>>ReUbxG zYtD1Lbf>AQM;xXzP$8t@0n^g5pH`|;{XrmZB0$l)z4~c@J&?&O3UWW7S=( zpyh(=nE&Y_)zU>aAE)3rjeA4g93;3a+x(TAfRNVUwlk~wYiM2aB(kdICa)FA?nB?QyN4{70M3W*wEiLa>qw;6KUI*-@pYunHW}kdh$)hcP3TC` z{4J;r9m+T3_>K_hMMxOHk6h~upX+z3XM)q&Uv{868hpO@#~VU)miwUDOOLFezHqn< z&O7uVAPJAWPpMoAcP&SdxSudbWTNi}vPVJnQy$ z_S_rMjsN~v<&&2YaOBx$?HWU4DxWsc7HMlXOg#02C$plepwDO61tjB_(+KPXEp?}B z38|C0#qKK3D=wHs0$TkO@;J-!bgvl*nYf?>F<0GfPB1uCDdsVTVt}{V`FfjN%G2)B zeRrGA=GicDn7eag2Rfha@7QHy;K)ZDsV&|uA+`LvrD0RxvgG5MI@Za6q!X&y4By_cJ)yDMkz{v!hQM0^)5knUhJbrKw7d&!5Ny(c<%i`w~*BfQ>dY zJxm$->&^VAOet<(`|C`vA122%Nbn zbVz0!C}?6xm(s;}45Zl9)FEOyy7cN&VtHIaO-l;4hR$>SWH=}=AvA{nhYU5{h3-(*KL41s}$mz8FcpKB}1_*5Nu*z(=xP=b1pqyk4c}&E>!*)rKC@D-5au zbL>64%wQ5BwQe9Ij>Y&qvgjq>m8b{~Kiz`G_gw#6AcPe=U~KeN)S<&eARkrS@yDFz zY^I~^-!nhbD#$*B;zz+C82wvt09&W=*$f&1@hquG4dc=PrV(z%3z? zo`Z*IbEoY=#BQ#H2iV}DP>L+_uRc^}*DGGJr{`b3@osa01OEzY`7=$J(4vx7;qyLJZsUb=8(5_rLl})34iOg^zs@)p7kpQ|kVmpe z*B$OWH&$f$XM7Y-*UyL!8$HHKQ+hy^-|BYd#Y&~5{+v0T-|3-z*w+9vsi=4#sT^v_ z;q)Anz~gW_sj^Jqsp{etLfoLH##BC97Hvg+1s#s(u;)djuW?egZx5qdv#TEU@T~~z z;Tg_>LaC80?x_f+Ap%R^p2lu`Gb(&h7&J3 zwQY_M$3wTR9j{YM-9FpfD)$%nPba2_8k19dRf|)5yAe0;Se_>o4P#bL{M-@Kcp___Z(B0^A(u z^|>k`4SLZMX5ECejydLJdotTgL6~zJqdxPSQMpG)lx7QViSfmT!Ov^`7g)J+J5rl- zx)JIUEPYXxGIuqvT;3LIuwbrVXolM*hBB|jW)4ve#x@}`gSF6Lewt!*hu3L-shhpb zJYVn^@$@#cX;I`JG110V!MoklN{dFoZ^Gh&|Dns#)h=C1RH7p4H&>^4;0^a&M@y&$0~yBEPjT$w?PO`pN53QOz1-!-b{-Yd8!UBDUzHWuYrPHOc6n52 z(gmpEnX7_X4RrC83P!6kvGTN#&56{B3T-28r@cX4S+l5dw$x*lv!$bVch?9s14Bh= zP%7QL)_ta$XJywJZ>xl!EBwyo5&yvtU^fO>JsPkseh6rP#YO=*&}NJP#=Ro{r`f}l z`usEK|Nk%}G8ke1dw>sS-Y|Mu@@uR=E8t+xBDPp7R+5Cj8)GkCet1XRU5w+7+F>Na zx)W`ll$7uYQ%r=1qDa(W=e0=ya4_~t%!$7d%?B(z^!H1l8v&+4z4(~jk4#;)>|lJ5 zODlqY6}k}TPWmPx1nsOg`F#LgKK*rhH@E?U5kT*piv{!tU|nIJEG~$9xhIs+Jhi5# zDu|yp`4r4Yq^_m#@k`^>RmJgfk&VIkAIQp%VG)ZB~IS@cwlaiuKZ03>$3TQPl#`%8^DuR zu9$0{Lz3wWj7{`eeST`2bAwoPtrgEI ziBNbuYruNExwJ!3!|B_yMP5QCgiy&0PbjSn&_6wGF!ogYq6c`ZaAk7!4jh3j~2A)RdF2j)2k-pdlWv#2%7&iSmj) zNI(+ZTuOksbd1=kY*1I&3N=EC=$aINlF$*Oyv4`)t1{*agFf4rhgYU~rF*%cdv$_F z*i!$s?{b}j{hk|%NA8=!97n?tK+CQj-hjv?FqTu+rEgMZ@**0)#sMuW-$Z?QqvqeR z|6>-%ffUlSQ*%4%`ePc@&e&i=)*LLf*eX2p^TZ{Mfv3(7!fd)Rh=jOHc_T8_84jFt?gjkh>j1rK6pks}bH z&G6Wtv#zuEIOg9d(eI*!K}w z>|YX#QcNxpBBbGj6ywkFr^OauvZKzZsy2Zg_4G|e$NnV`{Ho9ULKI_)sI%uG&Xsyv&&sE9!Nzg%toi6X?W3vwSKSx%NxT!h;S1# z{fMKP^%w)Y+Ax+Meu!wIcz80Vj(7MvM3uD|jiL1@AwzLLkTZ4*4QN}CfbuFjK`L6v zCNk`~=RCfn#!3;jTFvDL>}X^b!cy)L`O>%$;S{LmC=k071K98tPw_#a8E+>+^$*cn2d?OZlZm9-5wQ(Se*c2ZWkN`_Zx8ciBfqZ9-r5<)`6<>Nw|7*UQ> zr)e{5z0e$I1R-ldp?Ge+%5*;#z{b1c(cP#|kEz2}huK%H9i-VRIy%u((TU8fS_9O8 zLTMW2?{bmpkdLwn$pn?jr>xEWGq2y8>=%IQ5pdabkU&sbZG3W%5T;#Ine!(6IOvyT^kx+4(k zdlj`Y5^y#GHb1vtR+f&3--p}9j5JWsA|jIiiO6u`@fV=Un|;ab%(sy`5gsmav2v`6 zkw+F$p2|^s%$~J;-h0OSAgqxX2|KhiUwSLrO%X+NM6Ew=uW{cbKhU^wzgsQtU8L41 z9Jx*R#B}24Y-a8+$W$iG>xJ7(8lN(D`YrGt*APJ>ss&zU=8n?X_vPowHXf7V$ zhwO1tZ~CD$>5AtnF(+Qnth22Jq7pbxbSSx1h&U;*d>Z`;gTdXTu3zZ>>B}G|nc+oF zi&3&S?C*rn3GzXnRlt7kmo~z6IAI)sZko&tb;6Gqid~#2*eG1;h7$2H7u-A7-WDUW zH}|)Hv=P1pku82d?U6qD_h=IPuT@Ldc_IvrHAHRI+}A_{zqf!|DHoq1>N)xINP1>k zS(-uQ^}q`yzXZ94b(eN98UWz>Rlau)f*3JxL3ZDU4YcE`!pPZ@Jaq-@#u~Kbh!w9} z!Y9LSSQ|3|RNJ;HJM1XU>zhN8Y%wXyE2BrRQVa8HGn8Bg^M03GtxpMeMLzKiLI-K_LKxiNO@}o_K=1;L|A=3br@w-ZixO7|a{KY`l zluc@S#QVY|hA$ecuCrVhP4#J{XhH%{aPh^2k|sgX-c9r^dG6-;by_4iPZa5KH{5Z* zKm^(5=_FZ4VTWr>W%dlm4WfS>qwdAyiaU+(nLf1l$e$6ak`F4$LvW=ZF@mzBWkP2C zJ9t{9=n;~y5q^-V3xl`^C2fgat&dW47%qXXkhuZ&pCy+wuP0BTodBTf8q(3HgPk;s zXml1CSu`Yn9`)%S&U<~HA$3aT{hag6ww?6?kf~TeAZiW|{zvx`z~PQvlF#)G;@;u?Zf@{ z&8@5YVD`;Y^IFa916d8GN*&B*l&(ph8`>3a8aX0ol~!Y%ntyA1>B3I`bdxRGEf%1W zMX`J|mERk&&1oY+K2v;aa1M1}tr?sZYtnl172S@H4p5&g(C=bJWpC!~b@|KVw`uX+ zrMf#O>mU+I+A(+6^siYUTz;tht}di&je=!v7pbO}fw}CbY~f4>%_gS`sn+h^z8=qv z0?uJ&H)=g*KYy9<>Y8ve${S$6z$yXbxw8f6bC=Z?N?Lg*?rAa z0BVgiP!QegblAdPPG_Rr8Y~|vM~LSko78F&TlvJfj7;-{*U@W(HtE@O{6d6A@iLlZ z&K(=ZFh@7Y{pOns6OleRC6J&>PLnjl&ny`df+F$%d2*&tZG<*Aa-HL!F|auqh^IxT zc_(X_v^1qBLRSbcDHLdU&g)2V?(B;N`D~odWz})xN-sEiQK^wdCCX&PEC`&bU=gSP zjF;UP7=N8c4bmcOCT}6X{eg-}*hrm$`w`ySg;bz`f439I@smL9VtL4!=8i~NAih8{ z%%hn1^pQ@Km>y>dTvc3|3Dtu2RjKsnUSEe4ZBlkR_#n4&sT2mu@_55YWK>9B6(OUC z;({;~)L)313w^)4FjRoqFBY-U590FJlAr9!hN~QULG;`YmwZbaxhdwc{dTFfQ8}YR zHG6xZ?rz;;j~3|Tt0HsDGBBIDglIX$g*TL`n$MrvN zz72qi6z0YFmiQs_TY22!2FO^Asq$?B6WcAeP4TAiIp*DDM0>0Cgq{b(BRd- zlbH>$a?V*-5hGaQ_T$DUr=>t?WlrjL%zsyTW~aW@1A^W{=C&PYxZ{iC>c+D>-_D>;5k0u2t`ppt0IZI^Erq{P%1pUQM7-k;CIA|t-y=2|q>3f*3>qNDF`H)ua!{@!lL zyy}E*188%_&w$7*fEKr19g^!7uj^Z&uCD&X2+*MF6PR;4SMAq@VKHJvFnddWC7N>K z2yPd(KSe#Bb_Mv8<8Q=@d6OyC{mar}?~#hNzztg9&`Yd1`0f+DgC!Ge-#xv=WvrJK zXBZTxi#@!q&pK|;tXJi(#1?mj z0#MmdP=eNmHpsx{4RLn|vGQ+mM3!FaU!=!n#}lyVqIUhD7Ug|)vUcL@8oXNroxjtz zDl(|p+6w`-6LCv9y8dn0$moI%nZi|=3$VX#Kz?bP=juNX)CPnw9uW-IaHlHcywwYV zVN(t!Fegi{mvJm8Q9_?0$I4!VCS-9VFME^k} za*`xgiv33kPDxxQRriJ@o79{*PBxXGVHc6LDJppX!HO5xut5;X5(>rgQ{d=97sc#1 z8|iFQRMH_=%s_vLE|&(z*cgW$RY`&v40}P=UnR^yP9=eGNh6`@Xrv(VSrs8qCbN^q zAtr4nhdp2N2ac61p9zuMA3a)lF1s}H2|MJ8N7!nsN1>+V{bxoOpu`r66n`~F1Iv&l z`!_`YX~?IoHne`+LcQ+(qL(%WWfZt10H)iJwmnf~Kc6G2SW_a1!NR}+^7BAFC(sz} z;!lT^l+T7icX*19sV*NAVw8`)rAK7+I@;KjpPa=!1jpy=HY5m+ZDyGE>SJY_ux6HE%F77O<{UJUb*hIaX81?sQ!MnIK^E zb>!2-9nugfz?kHAyRoz~UKY2BUj1g0!@;6I=jHR$wz|gGhRWUn_dlr-8cw&!(UfkO z<5ng_xA0zm!)mx7Mq^F|rr9Gp$*Qd57ia0uA@MY@32BIbs~FlhZkVcQQoF386EABQL|pWQtM%8Cq$&qM3mSSe-1-wpurtSu&)wlW)K+;cMYZ8cz*l!}QB1 z^{+tWoM_#e2*8qYe~?UcS@%}IS>ToSIq#=Fhfq@b!lc4!7v->#)s3*Evd`6$Fq64V z^WdQ~T~gpyr2iEwcYTT;TMi9L83K(0eBH-v@%UJ{jhXRGkhy!-kkZ6;%QhPK(-Q$^ zyz%qlb-*(tDD1KX!RzKW-LD8{Yu)oBdlBMS0uV3!604XAjh;t51D|5L9$!fEC^bZO zJTL*#-M=urJjH%eXcB|T3ULzBSOMx&4`Ref3hsWJ{{BAg?zeZ-iQRTMt;94ImD#dj zT&+PHoGP%jsJJs?L~ny-zb*pM$R;G~19RiU3%bIIv0ybTFwT54e2e_JKC;BcWC?U? zbc3v26$q_ucO~~leUNAMQD+h2^OX=S)3g_vpy8gRI&T7dl@z-WM;VSoZ%`JwmS8G* z(xSt7#&}B&?ND0XZzqX=5E@@Cj_E1+PUFgnHFI^g%W%)WS@c?=I047=PbDhvsMqr) ziVNt`^l^#CX7b_cm9XJKSRQX8-XEgg2NZEYP|Ska6trq+pr@m%(h)5qR~99cib+T| zA*u=T*~=lB#&>v3hd?l5>pv@UcJOCo7m*voHG96e#Y4NEc%oPZ`NGK4teF|HV*5nb zhm$Th%B{WJ4N_hN(ZOJY9~26;fqe~JZ&JQQ!S?K*)cY+ieUY(Yfk|{P)PX}(M@qGk zf%vzfNiq=>mq(F%Rg9lRLlgO(Z{-povO;iywY8<(MWT6b^|<@u%sNX6A^&P+EEfx1 zE%21Q!p&OPEw_{8uVOr~kYR}*{vt*E?7(mxtU!MKy|JmkX>~s@*Q>>326|Lq?c-l$ zVDEnK9;xhtJG3%)!3Pa%48rK1n^zMQu6x5%Q8MQGEdy*y6&I&(9)!Ud26Sn>=CXufoih!0KKjhHF>NJg>o8G?TD{1ARSqX|B^5l#ehq|87I9e8VZ={cCu=cAFtrDg- zoKh_qZJ7#U0aTGu62H?{Th#X)!)TEjE3RBvCcI^AjV`RB;o(xF5pp2AQy>wN$0{yE z#$H$HJe9B|J3yqgK6&hd6<1|Q&V>&5F7UA2Jc5&-I|r(AHOxQ;u?YnKy7c^s@549q zqLI`uSQ_po4&C!_#d1jTx)1H%xcn7sz%j?9TZtN@jk{8P_SUlz>qtTDbheO9{06Mu zL6*%+vuP%*)@X`Vm-=gCmws9x>NAR+0e!Lk#0=dIOoRO z414!OW2sQEX*;pTIdw$cB#G_SR57w0#s%A(%IHtaZbNe2t%XE6Mg$>zZe}}v7aFHJ zC++3=H!;P#9a`;VUKjYLe|FPDE-Bpx^DqOwoN26>z=$pRlXIp8C3Y2C|Ed_?U12%VI`hyWr#y0 zAU9DIrHE9**G3untwLJkJLd`sv02|#Dv8Hjwg^R90kLAkbNg+bg$53dO}9974-rEl zGv-MVM?maj9oOeysB1+IvkU4+opDH9HBo>tl;<0z2c@cx!W-1Co~ltoeI_nC-&fx*5gle_lXn)7b?!@7XzBr zII?K<>OVkGy+uH+teq-Rk!_tJ7=U!l>bI2urvbO)af1P?m8if2wA6*0Ny$P4rhT&; zp3~Cl!OVO!hPkm!MUQER^GJ{N5m$2#R;8BZo%`?8=6$6SCnE5$DqMJPC!|Z{P1RY) zL`(DReBvdx^wKi$+Xxzb((0VQ_#)a4Z;Cx6=38&N8!Fiz=h;>CjItfE>&R#mvIpo& z0r+nbbEPW|yeCtcsPN$X)*+@euBIv~6PX*n`}5Xpn9$w?cDQ~x<7KenomNu55Nkd0 z)wr|WEQJMxuMiqjhu$nYq*E({BfuDqyBl?n8e)&0u$vW_yJ=OybHot0VZ$;Lc&6J6 z_z=`Y7H;s-zASGxMNtpfc zD%KH8Hy6Bu_p5rDp<({J6I1BSjg2oDo)+T0-ZRc2tSws ztDPi|L)yG#+7vaMr^1O9G(-Ab0E;AHXXj2(1p1477BAvOv)zj1KP4}6519f4S0m%9 z+TCnib%OlrGOC(@03}9LTGJ^Oi4tE&6VRH@+1z98O@Qi&e`^cuDdBT&1wKAL_s2|A z6LvE2C6O=r%iIj8z2>j+ocn)sOZegcyGfwwtHgxfA+@Qb?x{1|Xf?uw9KCG8VA0Jv z=ID3C*6(R6R{I9++Ex07RQjf5`j(}nl#F44h5B)qjp?THE5_t;RcnEppG{eo7H9M^ zyUc^#2zER6?H^x&jh004K)RC$K|5ndmB#zjjpl-aeU{9Zy70 ze6_vbT#vr3<&ke$5+YD#=Uq`86l)0y-L4ZQQ zClj|3Db1xUfU>y``P9?z3=iZJLn78^7VkYE7ja&PQWu4*GI+?)to~Dm9Hr{RrTWW8 zV|j#Kbzn)sPu7@%FsXmi+O^(czA0?}K98qa z*lR7Cl15GCk1ov-m9$Ka7T^9jC=6tVDHunplK(;(W}i_Dr1o{Ko2)+9kBM_cc(D{- zRcIa|Yp4q1S#!Y-R|9U_Hp4u5sTS-Z)T*^0LRk9p-6M=;n>Pif4$EjQx=7aA2!VlR zp%Czav@CY1XmM=EDw5v#C9bJ(;5Y^uWWjF^f$3BEC4FrsXYRv&wyWN zU%qAh8af70RDbhpT;>s?)0uGO+m=p!k%A?8;4m7uKu7OP0_sl4!TP*FQo*s>K5AQ6 zl$qxU{bhPj`gA5lSk~~1X+}v<5oLS!?ZoP8bF zmp|Vd@O)TD8DMzkpL^(O^CtN8=JD?nC|>sJAM*$_VAHV%xfU(DNhf~>+-~9*gkr*| z;Yd63LP%Y68A=t`zQf>!x}}Tcf9Ybt?IIhNp%Ptc#{p^@i$4u(s{UzRJ9@RioFcvV z%o$8f01Yc!48I=>4bhbb;at*Fc!nBEJB1^J50)1wP7PVo!_S-$KpJ{(2!aTr9(9MP zWhXsXlPr%w>=zqJy#LU=ZSAGwFdcK6YlbZ#- zH8~EaAme-T(%dZBtRa z*j`aZ2IC%egcKi)8UqKdy0hv|CdL2&HLmsPcf+qzRsnD=& z`)fuTin-e7YT?iG!p$Ex)2v(hUb-Sr)zj?fDr$xkAoIIOln-2EtEwEqBhYH(bVLH8 z5stty5-X0$P_}YvIE9w#*7QJ<69F*QuuO_EkAz$Z@%Q3r3ci|`L7b{lbmZR?181R< zRJW5%8*6y+AYF+Xtd4k%PseA4x~?K~Yjc0kGs-8)Dq-!<+uqOBdQ zt-de=vw1Xpz#~L<`>8iOOiJ)w^iDRU((r_Yq+-d$kn9srR?o@}TPlc(N@1KGzSdi@ z2|9#e!sD_1>4)_x7fdtU`Q{h1J$LKT^6CYYX_VupQs1RoR7u&@jPY~xobS6W&{ z3hxfvZd=H}vP-SX<+6n<6E! z>`?Fvz-2vptV$>oGL5gPG&n1 z7OpAc?orHWc>Mz2UG{7+Jpcs17X{D1D|skx13J`NA9^)*FDeX^F<;-y%^(#3bhUMc z>4;8GpN=#8k3iI`9>c>k;P}Ki;Knj%q!}3Ym$7iKi@tY7TrJHB{#N{~fu(sG_4M-s zH52E(+1U(<@Ba3)+~N5j-ceA z=0&~;ZiF7iV+Ylr4r0!@wt@s%L|wig*SlYUf8#;nLoNwIeA*oHweo8)Qq~$)B)xsu zRrG$?h6^q$&}*Tu2voP9XeMG0rj}zeAs8cj)ly>60RshfuC6rl#^~anp6Q>X^@6d} zcl>u26+2dO_HVt4Ou?paWUp9a1t;|P3wPcfl%)}CHv90MevxEx$uW@oSP0+s0hP1$ z&!g=^>~(dNEi9-eE%4qPW-Bh$SUw?xW|%h&cz&Ebk}1%D+JU2q)|Mh?81w*1i?J_< z1LZr>l-s@pR>(Wvv3B&U8rQ4bf_>=x_L*>K4heU&ej8VAV}|f>T8Y#ZPcji0OPI-7 z%O+D_f%y%Q6P}FdEQUU6{T?=$$m+lj-2XNBxWovC`=uslI3*Y7W3L!bqu=ZECu>)e z8vO02wF;{hX`LG-UFw0zZZBa6dMT_M2nH%V+wFoiR@+`Q3Z_y|X5jm%o%C-=`9DmC zi=!N6Z?~v`>$vqPWF|$!?%DXHM?anpm<-JsJ4&CpYmsJtOOXW7b&Q{lEP}RA{&V+U zvcD{Q5w+Rc-@e&8%pI99VhzO6SYU4%;?@=Z7^BiPo>K)R-N#d;J?Bk+MiGH-W0vAJ zke{$lj(D@cdxYx%532EG1+W*QSA z7ar~4Nrc?ug-JEhe#AnpCnAB&-!k6=W!n2!q3LZe?RH(ROj6h^=%K+mI8T~+zp8D= zSkEZ=B+r1BK~H}$b>*h8$^2I>cg?|sP+4f|bg9>%V!nl|KaMk!rD|~0Q}mpsI}DqCz3AlphQb<0e>h^x3LnU=RT2#C-*oLm1tx8Q}^X-cAl-lMmflq z?KSSpvJ-|9(A;N$2VTcj3sDp4D~3eI88KIxs)C*`sgt?r6S#oJAupbgP~Co%JX6B= zKVDc$ECtfe$ylPj^Pe*SpRC$Ibrq@t_&p0ryGPHX5&>ri9iM+IGLb1h9waO+s>wi) zw8s{Mb9@3Lh>Pj9P zZ&A~P)?=o8LKGUPugW4wim+ljKRE>#oM%9xQ-X-2FAys{nLE6$ciSmT`z4d}X$idJ zevQenY{v01$kqDpASyz;2Ox7Vq%CV za@8S5b~B5gE76$DNoj{ga+p5T)|<&z^Qj`P!YKI+tj3JM>Pcin=wrnXSBeXzn`L?? ze(N8eX8F5OX<;u+S_R|tE#9&pw7Q3(KKT5+fIcY67eafUp)StZP2_>3IjZ0+jDpYT=BPNNaVY>DXAJHZ<5~9frTxA~%(LS?o?6^0m$3(P!+;V$t(DSg|$uV_|7$9WF}*0rljA z-uo<`;zrW=rlUbfMh{bvofb>fElsCH|9TKknkE&k9XQ+GjtZ7ZG-kfHcdnN&{dz32 z#w4)0{+im}Uuq1{qEP6}LMKEg2u%55x%Zd|st2@xOdsS;JcO@(tu?q@=AGSnEfajqk%qxP#H|&e7t#I0 z;~BPL0u7D4&z2$5uUIc`r9Z0OBpu@EpsK)V*=>?ng*{SlmBjWUm$@Ic1Z&wH&3wMm z!q^IH!TlN#wnvz#%u4A9%Cj)*L;U^A=vcMa`5rgin}4(|0X@9f`_||$>P-$IfTV42 zXn*0u831Or>t|(ih(`IPw6YjfDmv~dM3%4Um2^+q1nuJULP#@uy=SJ3<6|<`EkDwf>}FlH zRBfvR#u$KYt`1Z6zu0=mD9yocTeNK3wyiGP)n#_swr$(CZFbqVZL`Z&@2$PhKIgml zjQb1to>&o@S{6Kmo{yP2`ok~go$NoA2!R8U zPW*~1jK6uk@nR9b98vtnEmV{Qypu??lK`qqKdwM+9Jp#oCKC)sSC-2x6IyJU38Ll0 z%DnJw;>DVCjFGl>L0*3jM$uWl>aeB2QtXtKs5VLb*N2_*E(vj|o`$$GT zjSP{uKq#9pa&1=}tw|-T!YTn)h;QMqZB9~d93~c!vTovFgE=b}aTrXf;5tw%i;=qVN?|w#LW#(hkltzuuaA(3`KMb+NMq-RuEwM5S{gr>zRrP&*qQ zMS$1KEFG>pdqsGokJ?Q;+6I)i z@+)F^jV4-qD|F-_{^Q^p9iY_F=yya>g|+VRcYvk)>sJ@JIK~7y*?~|+k5ZlJFLvbY%o`w?nWij z`}MnGAIKDPQ^~qY7wr{4;}0`BEO@^3q!c6rmypx8i2kuAP>Uejxd-1r5SP7`={fKE zo|4}27IlppwbkRsS?^9J4z$*8B zqip!Gw&85BX{CB&M!-phvgOYL1itT+=V3Y9d9J=&j5x~FrK?y<)J{}P91U=?#RonD z2Ypb|_{@hxy$_mD%5(Mb(?9^^5Y`EW(ccP@TKHnDpYYTAi4~hL1ncy9%BUkY3mdWdf7#Gj$w%`Ypa<$t|kYW z+hT^IftN!BI4}o43eWiCiGm)=K$*^jc)L=NX7aEo3VNuGR~4uRvK)+zfSMW3925kk+L8@Qq=1PioV=D z6oSAdN+THU$@UkCl5(9w;` zxJQ;f0LniFXaI2&fTI7v!z#^*6oAArK=I8_<(n`C5Qb&(pPm0@*QoyU-=?!v+W$n~ z>;oFQWsj36dVmu~9I`(LP)wF6wutu-ig1)Q)C}#Tu|7#B z$8hryEwevgzfsw$ao`On?hWY-{~B#hNX~Fre0<$dwX#O`=q;H|B9q^S+TYT3mD$UErpIr@wP z6@WK2_0vJlAlQD2tD+^LKC1qVLv#_1`iw^O7LOA5dm-lIq$H;`E&klb&ooXM!`h-1 zJEk%sW^@l>Obm6rR=9+}eOQFIsvJp6TqX0%k2-z{Kt zxIhi0Gnoa*ditq4kKoOtAA+B;q-TXF1c@{@7dUj zH#k%aZk?nf;iDHlC?K;l>?`uL|-JBz-tejHndWeb7MOtv6!C(&E-Dszh; zym%JvL)q{E(aDcfO=wVMpKMtKWwZPUS#X3aLb(W85K$7o z@vXn%<}Cs-Jn+Sz6zYvA3KtzJKn~F|i{2HvpM@RjcH>d9O^8<`#NZL&CAn2g^ivi{ zxgHv4lhk(W=2W+;uSU>yi~iNqWf4L}BK{Cb?GMotlR;{-J0QDqbK56?8mp-ogS6wn zx%zJQ>+W@XHz@P!_S@jwd2_Fp{)yiNFgKljfACf9!Jz3Rb`3i!CQks(nPE+xuFzRh zQ^9j#7cTzId*kA#y&9;k-bhj9r7~XkUQyXBuSOcM`eKc2Dm`lq9i`LVu)ml)6FlpD z>FV;BW$!A)=oU7qro|@{oajlcGY5`W{{2dnw0_FhNRAQ5gr_n8^W$zCw2Al^mlo)8V{DWO9)w(Oj7STyYS!A(II)NP%GeuMk&d3xWR^hlG9X`ltcCW3ewAXK zgi#8^%$JIGgI|840c^s06Lpn(kDjuCeNsP-)r_1ALrh|On-`{cN@PDx%lAM|LZX|q ztEgw&_HPkl@v`NWSgTe)#IC(31gzs23kUZeb2$NI_nz@Du7} zBlCHgFN;3kUm}e%r@jrT6Qat^Ka)W&Y;{GXW{O4*j>thQKttI^M6`4lVQ6Gz)fNlR;i)w=)_i384$NDJDj_OdQa!VF86|sIw&tr4(WtR>~;( zy`=%SG8J&OsBYQiC8P9m-OtlMb7*~<8uaqSvL3S>i63~A2=e&4wr_9b<$vzt26udT z6Taeo*^Eg)G-Y(+|17n#>9R0-NUWli?}iAAU?zz7s*b_3=ctejz4h`FpuXm!yEJ20q9Ul6m)$os_Wj6B2ZY?4kTI|ou@EOo7#i(E=cX{KAHX;$WpF?I$OaeRzIto6se zz6iNi-mCa|(D|7|j9H5D1-6m7eN;@~q_qC90C3l#I4@0ra z52k=^*~Ba}1%lusU(NU<9uekb1c<=CRr05y5AVgD@=a%T?eqx-0YCn#!AfU=m3&c!@5wl)CyLW)0(} z7z*QYZVHCE+`jQrynpOba_#}dNo(K-c2dS5#xK5G1w=;6L^Y&VW)-@=R(OI8rR0hlbmPt^%i$#(!Dz*R`zDhc08^h z=*{dax89eYlQEXh}a*(~F31I4MRE1mqnfe%t& zUEf`Lu-YR(aqGiX)(YKVb;WY>0#pN>IFKFE2K z5j6z6$vxs%2-xK6uC-R01BeOn7dV|LxGIu(d0AThxIE+eEAO*%y9*F2O!x-oSO6{y zOdxY+#HQ|ro(yqOH@73iAJjP~XjU=%xo~}pC|{i5e??sA%se%r&j_8r!t4-yKbt`p zMs99q!oC)_i+a9n@#}=g5+;x&fxyML98MNcwvaGHF-oWy4x!+AuK^?t?ai;ht_5+ z2)*IvaEaR(amxP*jsjU2rcOk)5rTK13pt>|G_WNfH)Bc!#As;LuFR}$Gy*xPS8pIA z_b9IF^u)*y-MlrPCx^A>U=CHn@#XBrNN#PPVtf|D5V*LVV(=<~cWt+HfD4oddUb7g zfGb!%(78z;D~iDNV62D>K5#gR`ST03g{OPYC|~GxGE&MM`<;3=P{&h~eIPp-`i;35 zzvZu^O&U^c8AL+l2{1OtlUi>FY~|ViQ$WEI4ROT(08XG0c z1oxNOagPj;;*=Aj99H&*`EL6l@b*AMTe z&N?!xFG_hv0^hKQjxViWe8k5=u9O}QadbqM591~;&u0m;a2%#mwoTS&hhi#Tn>c6U zFpCBK=Md&g0!iZjjoL3r>>^!yfN9yAiFKV}9w@VYx2z(x)%C3x5%$a%k-YPywrM^ePx`G?tmJ9Z`DAkec)u- zUm)){jivcw)izprdMchxS$OgsGiYq%ose?|DBha~PoaeN(3q*$vMUv7iVcC;S{n1~w|Me% zvuWDGNeG{1tWel{vRxTg7_nuKW95#>y&Q@`NZsoJUafJ7L}%{P?@}AoOR6%;wvso` z{mHaRDu`L$a%yUvIE}|}!bb%Am*Kmi>XhX;rS-z@1=s#rnE zsJb9R=tO9CFi?G|)S>n1hbAx(LtH=@=j%1`h6Y1I5@Ou1hK|js1XooFE#X*r2 zl#+4LJQv)=mR0s!&GqWdR95wQ8CkD>^G3K7I5S%%O<-fGsVsc+ru|N=!3$`%9KgA^ zT=TBkFQoFjoMu&Xg_6O=kb-b=fQ<@uLItE&3;WP3u$oC_&+5UO>lwWvX#Di6irhHa zq9uyzXGS6V$KnBr=jUfpX;QHK-Lu9{wAih*8I@FnTYIurLxxbjMk&T@?WEC(^ftTQ zF*?^+e$r()7#X;Jbo@ot1Zyo=O%J3tG8|_o{r<@V1;?5?zcR%OwC({mV3hec>S0UD z%lGl8nJIx#*`4{l2?)HgZWC6ysOzPv<pIxYY4{&nVWT2_P`}b zp1!-76YL!?C4AUGaOdo}YPbO3M}9gpiRSH#Qf(;c9q}rtT6TLk*OYZLU1mwH31CCF zS*!NEK5g@a4@yfw(17j89vvD6AfL6%C51ucT)lX>vO=;+J?pvcbvu3Vd1HN^`%dCT z7;Y2Wb_U@9Lj>lCt(h6G?FKF|KyN;BGj>0(bmjO^5=@i6`K@AS#Qv`&8i=a#EsH`< zxZu}PxCop3jiE1D@iu$$gOTwJ@B=PWfKjNd^8x?a$m_CsWByV~-y}!OD7T7%RD_7) zla!L4+HB9KpY!*uR~OLsF`%h2cNXx&g{xcf`J=`Av!VgyO#prd%<~d#RsXX`iKuoA zP<{ibd<&!i6#j3>>whWvf7|}s6LJ1m;RE0&r6c_jl=lC}g|r5N_P^?kUX(ll-X^9V z3Hy)${nK|YlaEuB5Hv!W63W9g)oE)&`KZ#(@(&?uZz~sGAzq72< z5alWaB%GApXfD!acHe#%dA#0F$$(|XV4VP_8sMVHzP%ebDDNqW%6M;2FSfe#a7`=( z^ge%QK0k(aSP1O9QZUd19`e4ZivXXVogdu4ASF^M4$?WxjI~UGatOK?n_9=4&Y%C# zfu7+%`MDSw@!bOS<^hzR#Zl}y?pujD!R%wivh~l6w)BIXJ1Ds;3%^0OPZ>+MI;p0* z>am`S=11|B5Lv6?(@Z-)AV`_a7maYsP)i}+BtL|IL@m**(L?B{qA$sfj- zq9&0mLdkLOIi|Cd;iB zxaw)5UVon`vMF~^c&tXc4!jkxagx|}6l7>F2pb=nrO8NKSA~U!J{}g-=Ex;c-sEDv zV8nou5P^}*U}&w9ix;I)`-LhS?2S0YR~51}SC?j5cjG`Qg^g?56?Fnn5uRObaX_oN*38QcjXuxi0W>u_51 zFlxRHHS2?-J4=3q3b)Z~E>todjUp^78`ai=c`lWuVKonzHoQq}_$@L^$3mZXiGXa* zK&)*6Zjf>BHDA3^RV{#;FS~2N^) zqf}=Hs5@MXzue$6f;|SsePdCGNrOJ3g8pli6y-G_DR^Xbz5uIJktdF^Ev1*ZN|qqW zEw(&7ZF%BQw<3+hr~kxOoWT%wITK$WdfIS4&>uBM)joU_8wqptFOj|0gR@Gr3B9}g zlXdprr56D~*VmEXgw}`zt?xg*ZYQ65L10@vpkrT8jwTOwZNx8}YkxA{yE1k}gsoYJ z!%(s;{-#*`)xPX@so>Bv-JltH6VGUss6w@Ab}QyyT+z$2xa2h6@ZIoPOSiae%V@oQ z>+JX@EdSI?{TUvSoS6uVa*hMlt^zg@-3Zmb0NdBw9N%t~X*@|j)sQLpu*eN*DEFEF z)?oQdjJmStqTDrXkq0+@&kRfNO^+H4zwUL;04;XIxVgru1A zI1r7}_7AcplzGCvX4WrPA!Vt#ZgYkD5Q?fX4P}Utcm|UBt^i-yPJpg$z!1xQ#ApRv z5j+!8F;tgeBX%CB1LAGop*!CluQbq!jtdVTW>j)c6!;{Vkei*C;FOZYh3dB2=_z*X zX=w1}5Cp*oC0vB4Rm1xzODq-ToikKvzbt9;#{HTv+?n{I1@sm;n{CX#5yFT}Ayw<8 z1qLOanO+}zFgJ6skw7F_X({hxq88Rckugi6og)3(by6c)wj2t-a#{4TBxcVOkSNEa zg&agYZ~#X@?*1553HmydX}vnrgErf{w)>e0wNzvsl8j4Ov{*8`YJG269!PyHE&LNL z)9=wzqikCN8EPivQat1fN8S(e*xN&{e~W`Y$`^H8kX-}iZAjx~&Q=)DBP9N{kCePK zFeLS5jJkh4-@pIekM}S7cVn_T5${hf> zFQA|Bu0_g_6HV`<*+w6eCov|YKtx)~3|V2%m!E-gaY#A~Vk4&pXxZiX8P8ek&KSYq zH=R^`pHu^Dyn%;GmMHD{gn{H`2Ot)~0|8!~9{sEW(Ms43$>w>_*v|3ZhP&ya2hGkw zcO$uj>hq70#nQs>@}e&^6TrcjIpBWQgDI~fk9Kdk>fr247Z;1X}xmpd`ZnAp)bZ6fOF6K z1shf(wU#i5=LuC&jIE$=8(tJW{GE)LktBL*as{A#BK-cX7R+NNOkhnt_atXpFVLzC(Uc-5Q%y}f3b9}I7kcJ+Y1h7lwlaS8 zRo|C^$D3c@{jBh)Ao|jN5UaZw)FQSPYxSZ>$XcP4<4FB%UYG)XvrBjPuv2`F1g#}u zsIV28+|}P(AaX^@TT%y_<{F#FO~5#&c+ZZQvrHs&d|uVW7(W3F!-&X zHQFS|lG?1@y4GFfO$%l+WQH*fjTJc2G^Rq~CZ`b^zf-SF62ph^EjV)C42FV;z3jme zWbZq&q4i?vbWmhM{o;!bOr*G6Wa8)G;oc3Oy?svTta?C3Hm$|=1496GhyZhe1;;WM z27d5v?V2qdpqL@NPS5_>z;z zQY!Y8<-8sxuRm|CeEp9Z?>H@RS@=?q3#@F0Ygd6R>{3y-^XBQut{r)9{1^_5oUrR9 zaD}wRz7dyNmcGon{+fwOWlYn4F*&hmn<+X(I+(_1uROly9V%VJv>J%w*)W)Pvxb2f z%pc;KOH-&Q+)>P(6`_daE_9ID+53E6z(pscMqYuMaWOG9XKkdy%X&TOlRYq6#RpAl zEG|Lp=h!}6p_n`hQc}8fZu<|RZ^8GaD;x~#z~`o29rX5&c6=F6+49%2*gF($)^X!3 ziTb*tRgvB!+9k&9F;;Nuix)I*`H?dE(w8o2s=~1BS91!kA*r%BF$e5&v7d3HEtr%1 z+`4M)TA~HQfql959*vaA`F`yI7 zXB?O-BG52FAd0^b>PR7KUA!HC4U7hyEYC`}=eu}%1cpEog{l4#y6-+>RxOvF^}}B# z%0`jvAe(c(?+U2JaesBhlEpmg^w0|W_bV$V2Mx-~*_du1<)sTPG2`tm$QvD_Gz@0Z zvBUICI<&QKV4l;utU7dNOd2WpZ6o9(ywlc#P7alwZHnE-(q0ty28)966KtJ;ZtHnk|EDrXj)m?PQ#Aw)iup-9_p@sU}EeOkXRVbnRpZ z9IswN+ydh~k-uk&J_%h$57vqdl>hD*z%RyhjGSr}r7An`3+#lnP*qyH^Io8VMFV9h zwzYK0E&q)3p^O#@orb~ylEZ9nVYPEFr`UbAWcg#nu< zew&|mSpZe_EPzS%|F~7v{^x+rWAA_B|F`#-pI+9HUoZCeY##2NpX=u5?H?W0PeN7$ z7fXN@F;I=d+ZNti88iBWoT85_j7lDd-9PpRHFo>F?STC|@r+^&$g`+AxhFu|0ASs> zS$hz$ZgKB-bJY2M@+zQA5d3&94VIr{iw|rrv12U^q*WIXaQGXksj)=vz*zZCzsR&S zz|(i}u|tIEw1EwxF8WoOXKWjNS_0gjjq8HSqTSG5CiULsQuN(|4>e57`}((l zmuh();fa>tr(M*mfNkQ+c~CU{U&_1)Ky#*CmHYRuyjd9!;82JGVHt-KubBNu1@d!F zVK(C>L5nvE#&*KrSSkoY&@26&(>5rvp_kX#y$JZ9Cw{D=dgJh)Vm?o@GB;E=UxFNu zSPq9%Y3og3R%nPLK$Eidu%^UO#--39AP%u5;18i*G=p7D$lnX!s{O1px>5CcH-0xz zs+)BYtht2lI+6Vx{ALDt^Xm%;G(wFkg68!gnS-?up`;EB252U7S^}>bkEe+oD+hJ8 zg-Kg{hb)1F6wC}C%q4;!OpD>0^DDNo{7n+KcaO47aOLb)o&AK7qIi2sgS(!Z!%6xvk-HV( z%xs?eE<9_AxsJC~FNQI=vpH!gCyfUtx$gzuXJHS-C*qupwPKEsse3jf?EVDiW1hGk zXLCTXgoRnK749tT^BLnO1YT!~78kGPdXDgS@uE$jVN8J#<{12#6->X`6`R!Wqw~B2 zPi1Y;vrLNg>S(iIqUtONmiqfqV)b#^5E1$UMAkwW*j&hNP5-h`x?WfLq-3cdoe1I^ z_D^?m_9{;iis17m_?fx*x`K5qz4Z_I5BcZM#ZgH0LB`95C0=o8sOLZl*|&*Dp2$7O zAhuV=LDq7wC8nDS>1B3==IL~)T^YdGq&j@3Z8)`BupY%8OH#MnWK%%4ZsJgVUfQ~#>be;ahQK;dfyRH2A>IT7=Z%#2AJWrhQ zSIS!~a0NbX<2YLXv$cTi!V9W^OV^&L;@*bA&yPw<5w_OyBV8Ar!< zwq?u#;!02)=q4$dR4!47c}JSmP?cEOQoY2XD?!Y4WKu1@!Q%AB4n%%DK}dj|-Rbr5 zl0;MmII{KNP#OmZs2KS%~ zXj*b+=y~r&KDpV|K+v)%PNn<0p>N&U2H*6s4!U5s=w}?wMATj;1wD1-HyHt)Deam3FX!Ej-Od<3v$<}ayROvkCI-w!L}|9aYjQf) z9XKYo@=m)LU{iFyDsW{*PMlKg&Pm-SXTpm58#bR=*3 zJuW3lJ8R4{7~`liFX2)3%3gZiz>_$lxzGC~L)b7A{=@^u+zuy>$c|8fjp2NKd{_{z zo8+}7tZkWGlA=Xv#N|Wy;`frdUjyF)X$K?;@>?BJw4CE!0y*X_qwIgmzE8teYd0v> z%_FO=2b|l~n{glzNJEMxfOFGT5}P$8d76@r_@2mKPWjdfxFu_L>x9%x+NLRrRzVR7 zmvx`@@|Gf}V#Be$04%Ihy>S`l+&l9E*4u_bduA(9_Qfr(PvEVER{`$__?wO4w*58Q z7sRmsHJcH?^nh+WM7+6wKFv_@W^!i&=lXCN0dDW3kX}?k@IjgPas7wYW0__k*NG3kT zH;??VfJKb(TdZM{!p8R!=+S_`w^mRo!^W_=wmN{Led~=b%tXZ}Le!vksPux_*x3ra zXZkFyZ{_#1Q;}LFO&_4RVM$U0ocU2xtH4)-F+%@o>xq03d>n}WTe~CW4k!%@yHZu| z+k38?Zr-qkyd2vdCzE8aEG%AC&L90rD;Ac4qt@tSo^C%4zJw7+U#e&FGqU1*g`S*| z-5XA>Rq566{k{mc_bmrXAe^_gat@T94qFkXQGQKFs(&E#MbiDMz#O?RTdv9SE#OsI zSFjrr<lI%@Iz7aa)TeqiB$nCI~}4|BlA{N5uVnCczmqb_Sz;1lBd12K3$)>m_P#);O%`s>-2i)@D^ znXt32lr(e^lT{>kS-lr>oTvwm{H>~X|6y0%DY zVsNbnxxh3=*rMXdUMtn)?r-o;@(EC+nUi=5C#peyrqhSKSN=ZOsLCPefuXF&WK{3w z62S(y+Iw@0Z^en2#}n^_u|QFx(72Rk1OSm9+Pswj+eS}k+Z1tJK8nHGr(%tucf-@__a>;vlp_%w%7A>H3C0QP2A6hJ?8kXj=svM zIuh{iCVM$CR&%MX3J2pAr#Vc9yRqC7G;~m1jpouTudiWMXT$W61_!r^BI}f3a9qU^ z0r!!#kSd@`Y)JU@^K!epf3H`RfxF?$=bEI6Msf4CuXl?L*j$nC`eA9CnX&!%^+JTX zdvR}i68g1z;BRNSUoyBf>mEfo$`x1-v~@ewp}2m&m)wEeCFP8dxLr()PTs}pH+#*3 z4e{(u;XO%t6N6j+A!{Ee6<JC^5Sxs)#2qBjT0`c zS48<~)uP;~_l(LUcOLoDyW+D^-{e~P$j~b=o5^)xNy4ORp2{rnpenX$6`bgZs`{vmVxKA8+i)>o`d7E?*H0!$ zIZ3+ytEq%d$#UGY;Vfx_hb8wuCjoE@{(Xcnp~<59i-U+ z6E|G?k*f71?NMfoMIqfZgSsm+~e=2C-1ve7M4S+L& zJx43Ow;R&=o(@JB$G|)ZY*pNVrjh7e3pK_q9+Vyyo^5!>0I5?q9&g&m>SDt%DIo&= zk&{rT9h=~nQeWJ*F-w>EMzy?h9P?-A8oz)DIDs$r?U@enkOhzO9lK3=e8@oYofQuG zgZBPq+%FygLYoz-%UL|*nz-V#?>?8s2r6x1EP_m3b^61sB(_)dt^un)qx&3olHrHh z_F~YE`PwaE90Fo&oP=4>ci4`io4x!q^YtRPoFyT6j}_Fxax-YyP9$KT5cKNux|Jx& zk%z1>UoM@@|~Hc-gaySHc2*-EP9$luO<~=c5^8Z&cAlG8@jNn9lz6t zGuDjFw%7gnz{B+}=;lom@YLhFZH2oK>o9;MiAi zU`Bu``ycj?MvIO^)7sWCj0rp;({H*`1R6US>?s9MNBb30b?4a2Op>Enw*$@#7*$ao zwgOj2c_Y~kClBaY?Z;Jj24JOobI$P$E4{C9iHA7xTs$mBVtke`yZG55pt9AM1hZ~y z>-ueytr{Rf85I+8L4OSJCa^5u6ICw%)XUACsR9SNij_v4pn~Egix{!e0i1yGr>8VpGXg1QD63C$(4ybr0aKFR^R z+;AEt{w~&pi3T)fg$j7SC#1Tu_J`~*%S7rQ+?^Q1Z>Ux3w(B*`zya{9TUvqk`<8-h zoc)s0v_DvEW0|uZtXw7Oqv_5z#sT7nmFfQJE zYIy#ZRbC$0qEe$|Bgwyn`WueHIbYLC1_$y`@7w|j+a6YzI>n?Z19E2dS*L(A*=0bg zhZ=K~AOQ`ayRJqsy&-P)vPD*_r6OtK_)Z;b-}8GZ5)m?_hnT!?L4Cin!D{7h?ciM` zIMhN%&MRI+-`N^bq?f*aALSv=c)DjgJhAE~j7OQuC$Av2i;vUvfW^%v_fnbBW6@4N zw9sAv|E1ZXM%)FjJ)75h{E0uARYyxXiT%XpdV`;qY6Op)F(X7#Bf)dVVrbiS2LJ_xHgMw9W2oI@)|qZBgq5J~QBTn4R&*(%|q;WP0X6Ea1T zYaCYs9whY}l0rhbV`Yy(W*HTTSRBe(;A$u>kczDiZvEUV9YLf$Nsy65nI>l;a^dyW zKY(pe{FKCm+G_rdw3n){$}?UQxYa|yB20~>w4w`PpQ}f`Peq<=?E}tR?|?J+`FRtN zU49tz*;fW}PBoRBF%T_wh^Nn+7p%!^66*LBH<`lr@p9o{Iq@yDFee?XC4y$=-f?hG zUwP6HSVbw(hrxOcPq{GWmWy#`BG;R_^>StuFwYIBk)!rcGd7A-kE0JS|2WL;n6N|(lqU+e6v(Us8N;Za;(d9OUk{O6WN7dbp zhiw`2mq>0^x(UD!3=GiNkO}ZPsV4u2e~~X@%p?;YQVoqsyrj7G3yRrsE+s`}KXAEG zk>FLh(Z~=B+FDkyb}-x(@mC)b+bh`Afh3OcMEmB{%?wcSU*$s+SVJQsiZs;YG4x}$ zM>=>0G4*UxHM8^IaTLi*8mhG7whIMq_#Twgg*yX@eCrV09tMOl*HB>&%w64J^i1xv z5Pvx#!ShA3v0?i5xS`FE?$6m{Bqd4pSD3@|Tdb)*tpHZhmHZ5Hj2HAJ-gcT^UKo`9 zXabY5KSI}vcGQdyACgT%lIv}t()1l2vJFwsjq&wNDcU!Sgmh&=yvEk+6bD-2s;x-o zoEJL$hcGZ|R(7Ck9x+c7)q}L-^*ACAgV6O_wErv@E=9($m7pL>y7nm0f9Z0|WCYc| z!W0Q5@qiYPD8A$@W$ksku+@SWO7x44W5{0T&3Be=>4~?1W_uaHncKE^Prh@{1FPup68 ziOg%r!vSkDlKgtRw-jkWspL}&@6xjI+1X0X&FLPD8?i~^wCRimz7OVJ*Y%=aq4^Uy zEzeyUf(vHHJ}@~5;~6aG;4T|#;iy<*oeZLI&B0wTpB}l*NQ68as7&Oq>?LnKN!iaH zL$X>B9JW4+i!HBQ4U{K5?s!Zyd3?|e_R1&@@fxbw0%m@XhXi*1hZ__A4(mT=3En8=OcB zfytUuEgcb6Q!}Gjk*uazw9*WkI26Y#Rjy1nPQ@9$YJ8ClQh*(fT16QNC0!ySO<_No z=A{Oia?J-MuLxmnO1_d@x3TiBmXRayb-{(BbIW>BJw}H#N7Yu$XGi$z`AOf?9G(XB zvc17&e}1P~-;4Ca`Zn28IV$x81y*+hcX4UU=$?2tusMK8eC>nEg#Gpo7jh@d%_JV& zGGQ&yVj4t;G>>mQ_=~bcFoU4(OlK`YU6nHJy^ng~FYg1}AMpylj;T?>azUpV6de7; zLVC^JSb{9m)U^U+l0wrFh%7#x-@qfXBnSQmu-i19)zoc8FgF?;w$*!asmH`hITSge z`motzDs`2|ph}n2bUjMdVRhxMsRQctITnzXk8q!Ke2!)M?cmC>7pkfF0$Nv5WXZ@! zDE2XR3NsU_a+v{Xby}9dYVnyIGeBm9el(8MTPBLZhXWXAg)q16Kll8Pc8S9H*@^u7 z4I-R}ezHn?cf*jJmC-=+v5jw#9R%{*1?_t|iv!GT3W;Rvga(3o%m5dLcoFm>?h1 zMw9&u))QX*jo?~ppVIs8^~TrG{&A#_CX=*`|QZm-EFn>njJyT9fasxJHZQP9zzXw^0R zJG&#hYsj;n_zS~*Ze(!Za$8ji+`mG{hGHz)4q~RYN`@$f04Dy+XN=dq)2LZ(E>G?f;}zXbbyEpZ`D60=CZoyB?zv zkjd@;PvxKEO5HyNR6q6pQ{e}`2)tLL0$wEFcH3NYZ!sQv?QT`>f7rZ_9(%2Xe-ZM2 zd1XNT1J~T`9U6a9T z_U1c86(zt9aIAEV?IPef_Y|f)X%kQnTPMFyF-UyATc7O7?g;0hoxRWgcC5}?Y6PxN-eVH>zCkPqqVO#v*BWQdPNZOcg@KSH$q=b?Yu z$Znddx8OhtOECcolS^URcrY(%&cj$lg0d)LVg(z*g`ozD?Nhyno;?B%ke)vE*^hvf*FyDhZu{6Lv-DTIflkr(ryl* zo|?Wo?15n+_pgV$eB_<3c_LTGDp44rva|4WN)er7A0?x|eYW1lV(Rw6D;F;ModzNE ziiqkNR*lz3t?W+P%qG)TG<5sIS@JM^lt*}M0Wua;ebbom62ZWCEBSmg(UOYjr>689 zS0(7F3NfmN6FXu-yqjBF#^OnxuFMooL(sO~MF|;<(HvrNh8=h1=u*7Y>_=>>*^yWR z`^n)4NFudc&NSb1sFoKaPZGXept$ll-eiWr2Sd!A}7&*J`tvLhNBCp5bQD2+= zI8ZJ;%DG%@U_ZW2vgcu*$fJ7$B;6Dx=3?2X2tfBclA$i6ijT~KvM64UN{aBJWArZj zf+g$Wo6_xXcD%|s;xSd}z6C4089i6H0mol@R*gWHd4O5YJR7xBfHLp$8-VE4Pb?r! zaW9gua;>Otl;Eqvb0W`W1~A$Pu({>0yYkaJAKwJ9l|72A16FuR)!QIyojQ3d@9nH4 zHuh;k_x7;@1N)smLWUj-8&AGU&G6p=8qd8o+ckw>bqfIg@yFL^0n6b>rH|d%k?*z^ zWlMl|Qf1&U{5Z|0Mnr9@7RV~G#$>g7rTx0DBCqanYun?XQTj7mYR~p|uXltA^**US(~-}MjRW)h zz{msrB%+~)PCRHnGmlv~DJ{u6Lwb#NPjEp+^E6?hGORVm(ndFFf7UTdwJ}2oebuR{ z!u`y4`=Go)c`C5tbea(j;x13>ARu?-kk$&>|A(%30MaDr)&|?Qr)}G|-92q<+O}=m znzn7*_Oxx=@Ah~1-o5|E##TgTRGvC{GNU3YQTd$bgkZ*q*6k5CWgPT)>jy^4R^tkD zHlf!=d0}rpFVcd2z|ik@Jnkw}y^6IqA7S<%co{I-n*IV~Z`hfU&gyZ;2~vJve=;xO zZNPQI$ZO9ye}6J{2BHV<2ZmI?KlT6$w#|C!+wBYjPE>EeAgm;Kr!4qEO*7LhGCg4F zJfqjH;asZdnmN?B#`V$`0$0w^LksKrz0e203aVX0Rsb+q5rjWf54nvy9P@6)sPJI? zIDYdfq{h=uX4L*mIhyJ)*|a@0S&lBjzrHVWpUt-ZfHEiV?7Ow}nVrtVgeX#`{O zA)z#NU1kkt2|8D%9<6Vzoe^H((gaab{^flA$G_hpaMig8Q>>T*?oDSP2+g35NeU}a zOv!D^%q1;hR%}Lc5r^bZhQfa2--+|*zu&t~`1*NKPTxA|19})o1$P&O?+)qPn$@mg zX=+8aL*1G+eo`d&2-OsL_wqdqw5Tv%IaA6#G_-hX%&>pj6P+)WD@--jUw@dcTUv3i zn=r!w7qf1Dd^dS5YdCfD_s37ev){c-(^OtT+N+cjll2#i*pe;MddZg{TjP|xslFz8 z27XXr+D2s-CDVG`yw;7@XmAvhq5Utzo(GCOTbqL4DtvysW_WMcrkEh{{QjS-vU%Y&&0{svMuYsHEL(m&YK*N1@b*{@P!1xVddu@yP>E~AQ zI!obkjlTs*+X~e_2kzRU^aQeNv@1u#=dwi!`(4$;I+WFx1eM0ldh_Z_o#bUT{ z5Yc8!t=b>!Y^M9PB3MXL*ZE9pFEo>QeW^JZhedWxfxH1s{md>qM?Y_>*H-KAMpwau zI~(Y(<9ly&XLEZ-D}ZmO>J>oYv2NqI{xydeu6@BIObeBTuTv%sxu$;OK%?@DjR=Zn?v5HO##Md69}K4J%c~iwc+^?hDqZdQ;wp-z~eECfh}V zBhc1r8|}}2j_W8~Jt=%>yf(aXspTR3_~Zu-@>YnJsavOF`zU4$(wS}y+S_R82+!u5 zO5AB4VZA>FbG!)*cf;mvdb(-*vV_2Hx8i{DmgNN1v}b1&1L@_=*_!O5_esNa*+t_;FNeER^E}12Enw(rPk(d4c+C+qul7&#q{&e1Rm-BjJD5NKOI8qiQ*A+B&S`5U zQYJL#zS>zWUyGmggsYR#bFy&z=d$1$p5^|-KhxN_MbE8meJFc&V*tnfJ_&Iw%L#UgAY?lf!?6<(h~ zuBCOjjp%89d@}=msS@I5KZ)OT0Op)$_4;=2jG)>|=idYigSYWHpAAI=G#%*}uJ`2= z$)`X9lxpKmBG8Z>lyqbsPG!*ThMZ*Y661Q&u9rh*ZHswbbf!P%IWO~`Vm}7wv$k)q zKGboEEK&npwL1xEi_5M;)r5@+A(nbWgW1?gS+ZKi_z$8q2MnSu7M^N7O2)V&YBw3l zZH4K}Y^IH?SRCedyv$J|dZ z%-sZ{F@3IM0^WyU_FzyX7ptT`hao_Wtw4HB(%YiMN4pm}98uXca`f%Wc7}9#rso>H z%ide_I!e7|%|;29#jR-M53zB;+@}1>ij11{<)ZW1c{p~t? z*}-*_2pj!+k?>Gdx}{mddIY3;883$GiKwW8`<3H##Mlf-5 zo_7nZ5+;+eA4=jq?jUvseUjE#nEbA_XrHc6nZvP)<-Cg7#)az?!22Xo|3XDL${T)q zGm%oDY}r*jsq+KVuBco2%^^=L`Dl~CgQ*9CGTtwQ~b z3g*iTje`3q)$8Z^-6BBSmzV;^=`%cT&FlKb6uwN(wB2*864Bk|OcIH2NY1490lqYh%b{Fm9bH1dDNrG_$&CE|zl4$(X9r=~!ySm%rY*EoC@t z&5+KOmW!_R_@_{5v*~+qyOpjrfi&u>v8RA7SA$iY5bCx7mMSvT{g*=+N;?pn7Py2^ zi+{pT*r`IKvz`F0lQ8uOo=chBjn7-q^^2;@ZP>kescDZkS zc!!DVpZ{E@f59wmcp2ZBxr<`8M9{h|o=)^LX4e|hT>_Oe%vE33QH^Aojp$jwLtiL(K<)!Yp?e;p2`$@w|&5 zA}P7f#0pCq(!9dA@FQ*#SN;qy{{ldzDHAIV00I>2(MU^ zXT1dLdwu<49eL_3qf6DAu^^$9vn^7AJ|xMEmI9tmpQ{YBs}a)Fk6!aF#1ij`c>H7! zoCiJs;~qZpuEp5L6ufnch$$33gF(8RDo~ATc^%FvB2{bH4l+vLx2|+w1LoILCzAu;Kvide1`{#SW_&-ZA-8yb*KuvAz{OtZGF3{cF?W_j50rZshy~TtTqVM z)I@K(-G>ru$bN7PO49~91UE|h0CtKy_V8TRMY4CFyn9rCBs0jyp}`OSKs_sfRhc$% z9XaqvDpOnny^o|JwpOxFHC-Zpbuiv93E}8^i#K)vJl!rCUNZ;?d)8;*c*>@YI7|a{ zXTa7%xskgo(KA>j^z8y9v!We0?Hk&JGeZL=Utf-{6=;QAsK{*d#<5J>j+Au5;o8!r_gS3JNK%nls#BVqazTrd zzK1%i#%RzG>Otx;A~`5gG=Y22`;UsC|Mh9Nyo(rJGOwq4@gr0*d3c7;+?q1tB!olY z3GLyMGPbHH0+>4+EGal@B8g|}Df~WbM4-raZ6H)*44##^ZQ&MwHVWcHicrfyUoHyL zSB!k$r#vTYc(;NonDgGphvM0_Zu^aVqKJl2{l@0o^vHT{Jip?|WNngqCbmOo{T8N% zF4eA<>&FHUEezG2#C&iNERt-D&^^Py)YJs9r)2ztB?DE~7q{GGSuP@dF*lSiVDej= zOkYud^N%nvDSm~F@FGf~|mE3jqOP*srAF*fNPHyj9h?5#jEBU&_AVrL%) zP!h_^&-N;FG^WSOD(qTxRaqRR8T^kZtZ3v3^#n=PJo&Nz~5^>{YCJ@_iqB&rx39lfCEn63*h#fU>h*_ z;U|ea@Zq7>!)!CkvqWg&Ft*kOK54vit#()P%67k`_6TqYqyA$xst_x-o6bNe)trw+;lnF5u6QKCWKnr1&rUWS` znN>g!c%0V>NfIyvTL>dwjTGc&I7rl^069|!{|!h%l=1ws^ZW)V4grQVx%0m705op^ z9iN)qJ-|aV*DS#9pz&*9*_b_Mt2*+VEO%AYxW%xiOTBuAm>@6a&phj_&8NJ-^ZL&LA;1HPqUbr6yeZFb&Oc*I|jYF^==aoqXvg&P|&C-5q^e!a~-^P*mX5XCxJ z)|{T<3`x?AxG#ESg$G-PfGtM(Md^6_ms!!8GsQe8NY7@gY$V?W8}94SN2~Gv>_R-G z1}60C1`pe+aMH!i8w_ijB|fm5M8#V!M~>ru|Hd=X+y zC5N^TiBB}e_H3@oJ9eJ}Jt^+bchKePf~yne_+HU~$-(oo-YtQsFe@eOu##VSal{2W zY-jZfk{aBR5?2Sil+qmzr79(NW)sngNo@l7=zm`Jk>3eYZlhIN5*AyONb;B`3?#A2 z$O2*PEAD=4UBq?bakGV!pN_0J;M%XPJBLpR z7a)izz6pMFSumd?GN_n8?Y{o{g>ktvSMV%4UG zdWSO71r10L{h&pDS$-6Pc`wSd zlK2)Hok07#L)(WkF=GG9>)d8Q=YzV=)zl@`^jw0G9JPM@2TzgNCN@#N15;8-D#!ly@woKGca~+h zCby22v?&cf%q-iq#(hAm9zuiQr;g~Z!8ETR7lFf0khzUWk!>r6E$f3AmVjM!iOMpFr}RT7{_=dCfWBi__F@=TF7kmCaRovBxHJ=>PH zTG$XWm*8&nPq?O?gGbqi6GBQqOGJD;+}31Qg^;~GA(5PkXsVK|$Z6~c_iDxfEGnbH zC-8mdhXu4Q%I{V1%ljl{1m;MMr5LR$``7@h?x}dZQxB|j)g6d?C!L(!?AqBy2`QFY zrT(&|jns5ixUHskLSKtU>@o+gAZoD$*>buq9XM%S1f0rVZK;?gYG}s8LsrP1-6^?C zR|r`?hYQzn_%I$jy?Ik54*s-q_=H^*HzZx8exmm~U#p#$RhrfTx+O%IO9xL)GfY#L zcq2?CkrRt@>4cum%LmNz4nsa7*j5erVToR)&nF#$O&NTO3Ho)d0GP8e!negtXN(c? zm$n1sj1EUHo_=#F{>2~~OcNo8DJ!aQ?D(QFWq|m^h^{Md9s8j98h?pUiQ(&q18Bg|^Vcp(l@}HIOBI zdqF!y4h8eJqd~}C;eB}qu8@0Yq;&thO<)|vci9OGkn>Gs1Ri_72|J;qUc>Oo$LMt- z=FNY$pm*l1l4+)NeCnM7S>W)2yooZx7b?>#L2A_lg#Hu#KQ1<4?F|C?D0A|@(@Ez3FH-)q zDRLg;C30omcJ{2)dUAV1(o2Qa9F-$GG9|vOORCXwD#F4~n2URMmRyET%BA;Ros?SzbMvhHXuuArZf+uRvLXC)>NLC50G4CNoYkowQ3=g zF~+zWIS=Py+nifdIFqvrL{t91@@84lci07GXrimbuIcFFXK9~IDUTT>UK3lc%Tz@` zn$9EOBDm5P^(S09JvsE7I9lj68i9#dYqADX#4uA|9+r^ z!^$*GrW_Ukx%hge&!OlS*x)_wdy*VZp58Z2O7cQ5>Nc%JX>tSoFg_WqR!s-E{*c}7 z^VzY=OP8!&;B%#nd=2#VM;jVCy){7@}FqImXVc8>U4&L6)Tx z+SKhsqnKk+w0n_wGMh9-pg#Jvuy2B3ftiiEUr~TXHM@L6InEFUY-g76tlz0S-zVfb zyomX&+}A~O*7(+=$TlGEtq0)ogAy>*mpY6~&AQU-L)!VKxkdV(^?ID$juO=^T}C+N zWGX$Vj0O*$(I3gCa}oKs4&zt7coVWXB#sLen2+G%Zv~Musxr4HmJNkZx`s($oOvjg za5c)NmN?=h@Tf>plT;m$qvF^Owu4E?XF{#0Wk!kzU#k=pV_A~bS)w%=rj9GoF?u&e za+?fJE12uZjxBfFV{vAyPtgN^h<~3HW#Ub<@ZNEF9AW>CsnOF?C8Rc^WUj=a&iDFb zhn4>5(%U9N(1l-xZ(cR|2cPL)9vH$2VC?A_5xgJeipR%-}>8t$qzpd0K?7C(MfL? zAnm_|5UHIDHe>&%Tz!{O;s!w04>)a+|(MMJeu1V zu;GhGrEUsKEIU?NH=paC$dmKtF@5={?1)BfzuUg_^l`|pJa43JhF9G%z>do2&U;rJ z;G?()kpmy_!int)QwUhGO0j;`H|R(yc*qa^8*~H@!z?g=|zt`wDI(vNDJWsq0Qgq7GM?a;GoxD z!Y67TTZuwa!i1+uYu`)tw)!BgACV-SW{un=WY%&Scs!&ib87(geM4I_*m!oUTj~8w z?z52Qv1H~J&MI=^Cwk=_B*DEYB!6%O%-`2G8Zt*7 zDY!r$jCBkV>FXx6`_N!I&grQ_&qbC_>>lUKL`1Q(x<2TNAIQUBV{%q>WwF}JgMR#k zJ~W?JQDGRE0YMo)Lf#%ZrJCOw*=AWA7@IQZ8)uR{MMlWhco#83PqA_Z+~ zLCJrT^+Bu*$Po9}vVbNlavpZi)DejW9Rh`iTEE`*c1YQuC@;76317kW2^>E!RUu+D z5$RJ~1lqW*dC=;|H(&5E-E7SnO0J46hCrVOd6sJk1Qa0EEIA9)0Rnh27;e%t{}}!i z;_{beCAYDZWMny*pPv#LUH#^$&cRe=-U$N%A*iB-q$zcHh=r`7bh4)c*ugVhxXe5k zx@aKKBtFJ4F`O8PE-PXwRVtmRp4Nza@yhluHG@%Nk9wPc0~Z5;G%o&V7R+ijkf%Zs z@m9LOq8*ga87rq4)L0)VIl!QbR{Qm;(PZ85a70jyfHS1(PZMz5b?Ydtda7odk(0rL zn}SFi@s_ClsfGhIT}ZxQ9u}EflJ!J%@l0|up>vsO@-kHGg}Poh!g*AI+tJ}rhhKtD z9&e?nR5wk%YpR79^-GBwJ`j0+eRI5pm`rP(yO=(@&y`?}OJs+P4ig4J{}7}#);BaW zQo+BUHtf{VcJXca?}~0LA2FOgmD6if-LoMDj#{NdNcK*GyYe*jWbnp$PI;8rzz|g% z7aH_|9DF9B7pkQ|6VYwNYa|R3=X5RS!%C9*1W17^E#8c%E&(`cbqW10uI#eUZQ?1mqpZlUi1K_7YmCz`x8 zK=-FW&L_Z_>}A&3_x8T`KZ2VhKL&u;+s-6F;Jq{U)9?4UfJ^+FE+DU6i~+DSa`Fxs zE8IG{2V_vb%iRD!9+>oIxgam#3lBRwj`;ntov(Q+E;ha)d6@jH83fq|h9v{b|Om!>I>n+Qlr(TYwEOnHNE>{s;#fpmsGFpisIakT5&0usVYN2@tC8IlTqE zaWk6yY+CnFJF1^@a!#t!LBzDNgNvpHGD;%&>9Z<`SHi1A$m{l0pvre_y7U9uVUm#+Ub(?ug`~KWp#Euo`fj~#t&EY8tdB~>g3AVD4M0pUBFwL zg`l074V@~-sUDdB6gID{g*3H8QXdU(L-dtb5_`pz%Jh?f7sLYLuLOGC?tE&e@S2gg zs@`{HY$}bznmSe`Voo2DqXnrrLYg}2k_oUTJ{d>Kd9C5W87ao16#$=%SiKoP-J=?Yxf^(1!xQA7 zyZBFtIjFTcEd}9~E0_3S4|3s_wwHMESx+9A3__Y@L^}pHZubOKi8L&a3o*G_0(5x2|llc zhv;nn&!@epa^&2*k++|bB$>hyqzrJUKx7esEnYaEp7H0E$mBmd86HTmy^{rzbLay_YIK+QK-qCYB+5q zf(G#GvzdPlPs;F+Y4yUe3;B9mDLsfTOgz+0Sv5;5_YLg}PC+QDDy<%@!AL3iGD zmchd%xAr!~DqD-OCgCZC8qJg_hSgaZ`RCLviO&i0^nN#2$swyyw(Dm8#L4zqbI@ms zL?5V6U}6L9+;ZTCbsXX(Lv@B>uffWc{zfuW8{jkZsY#B6iaBh=rDyrA5>&*o zT)NuGP{v|SJaL`DS4zSFgC%xjDLy}Gh!&qNl*;$8c^R@8vkJb|*4BZ8>9N%|b^~!> z4mkxI{d1#< zdoFglo%a>?xhO#BO0pHiEqrea#Dr~~4m2FdIobTxBMBNa>uFWQZ2!Hf-A0U1UQY0$ zBw6}iasqJK11P)~WE8n!?}5Ks(Do(00YJh(T*3ehOZZECfZiB|wPr2O^8VEHrCmJ! z;Ll2b1enrD=4r>Dd1+hi;PKiCtrt*tc5bHe z7|5rZTie-maRNO+sW$yyb!}m4)@x1DHn>R*AH0hx9_}$YOGUpy*BqPF zHo0f{ShpvE-75kktJ?j=k^ebBjyZD@m6yQatd~c!&ADZRJgoY6oWXdWwA86 z!o(OdHAhQ22(rv6PE!jWVm+z`qeW;PsW{@Km;_2V;3d76-6M)wy%K0*G#d+ogXZ(Sk&)C?KQ>jHX75s5c@KSH{Gs|L>x4-{ud;|@Y*vtKe`2%Go@ojLWD0R+P#8h3SjAS%3P+N zg@i6F2l-Yev)7eF`Zq>>QE)RvWREWcMkj$eiGo9}ayFguergOaZwZ}+Z}b zTKen+ZMt%zRgOu`UH8PHoW?OifdjT%)t0y^QOhb}#vwi=B?DW~ce_6$G=exwneR1^`_v$eX z=@kDMsr@VG=q{f*_qM>E$U4ZoJ60M)P-f~(nJg>x1I?s%bpN!;XN?|cR zO06*t(}vgG zqM8cgK=`Kdrqsm_PF&shzznVW|OE0bh^GD=6% zPBV?Ya4%g;pVV^H?snv-_LJJPh-7L7C2az>e5SO!^*IOF4viJFL5_d@uqL0|@aPow zG(%|j*d)0oi{0XwFryk1`XIh^gxkM~g-s zZ_BVwvuJ!nCZteF9_eg!RTWVBMDh(HiBle`}vqbU|>dc z8}DpksKvj~DWq=PfRbl@q!_ByDvw3|*(7Gy+7ZZUs3lH1m~pXdt7t7LjwiqV{cCCg zy>BlJ&8;$NnHBhU&|+kPgOvEd8irJ=HNbQL@+O%j0tbIOOnG%R-phM7KXK31-pn1ClfSKEfi5@asm<%ls8^_F7a+2_aw4 zgqx>y$H~uB8i!h^-u()9qrhh>W*71@Md4_dnF%2_XCF;H>&&24))OTWD3`0Pys4{- zad{CLM-8QV!AKHNjI9wu(=LG)l0c5t-)Az!rU@Yl52gsRKB;yqujZ^I2Kt+FgDa-P z9u8)5L}v`fkvO;R2X1TFqPIeP(G?{y50wio=JXMYAODTJ(6*cYD!1z#f!7tNgS;5; zD@I53FriNXhw(_2Qt!zOQfo5 z9bDxiARjn!c~UYxb%>Pqg?e5Etfmx+{fuHu7VYk*MJ++@{Pu|Ll7?ZYwOG=BsG|)g zc9$Xf9ykpqhj6P(YPTnZE!ZyH_t6HJXr&BI#|f!DdLr=jWoK4)&+X_-j6L-)D~ZZ9zyY-s&aPP;V)%`T?p7Gd+ibR72lYsN>t$!r z+pyMJ!R(I5sPLhEg8+PO;b3;6Mt+xp=W-APKzuG)NZN)yRkeC!_1odw>z zFybfBWIL>KHG)G;b5ZNcnIU@gM@thkNKDg$&YWfiuV5_apk$8NISxPZZ4BSM#7^$m z$sEfnS>=%8JuY$;Kz)}#1Gwsc{j$N)MQEMK!D!dkKdmG}@xfQz@_Y~;seE-oO zd669}370sN!9b`@@e1wc{q&~e7DW$XrX1(^nte1X-tk&dt6FN>7iiJRgNJOo@gN!s;gM9-Ul9fKe0Uk!Mr zDRI`zO#+T=O(@9@Na^%b2U}W94`zTx%^zZp^OI`#gr_rhx~F3mLsG`zuM!8g$ewjSV;`bxR<^Ty%pMDl0X2@W88e zJ4xkh(VV9WN(=4oiwRdkYhw~gTQ6>AZnv#ig?4-b9jd5(QC>0Nva6Pw!uik4L_1@q z2FCflz4TpNk2~ICGWJsIYe9iKPn9mHXef4-oboB&_7+FQB?}+URv;2(%u7Qf4;bFw z)dC(a5P?n=Dv>5g8Vm3->=UD)`BUREOG|P zy8E@KzGvRL|J&0-jtS51#b3clZm*9Dh|wpEE;Drsx${z3xQ7OqPo^fcK;ej<)aVms z>A4&v<(wwQ-_cDK*S! z8;Y5lD~HW%3i8+7VRp-?IAF#RE$Mr50v?G<8rBVgS@G;(=i3iDICtUa{Ve_@V+(@$ z;zlb<#9#77VuIg$vmj#vAlVAw_j%y)ey@lGfM-An@DF016ms+nFHByiTv*#c?AqKG zJ=deg_#9FsK$wND&?0$hk2gDYAhA7$GABRRu1>D$8HD4_mkAiR3N#dDi z^Gh}RlFU01M=Yb$JZrc=RrOph-|sK-cn3Gco5w_>&Ok6FWEW>uMA-QYiNwA$ERiQs zwD1x07#dRkt595l!*pHbLO30%-EfMiR9C+#VOtx$Xkc!sUtGsGvrW3Cyy`J%q4SCO zv9;^wAL*lVT`G?$p$j7g^| zoQjVOE?5xlS&P*sK&k%!AB8+P6VwBpN&uW^$0(nB2koWXfOhCS!|j%I^vGxBRk z+lurdrBazEx%$UjRtMsIC?`F2TdI=QGlA2Q7D~>PxhXA62!sx zgcOc;T}ekdn&mbb;%39Nd+uu9Ui>EP9Xs61?(MC<#sHsXZwNY6cTn}<;j1Bu`8KQI zQFusuS~dn)C$pd9Ft4I(VAHz=gV1g1x9SvJ)8gbCkP&*PeRR zeyF|dz`p!RGEcp&&0o4C39q232d)A}SqPsp(yARh*&wZsTX(mrZ^5ak&$7wx_)mi2 z1O-mh5GPjMSF0tvf4BYGOrhcx!U6T10yhVK zn;58Gw=V?G*Vt10Qsly0;4xSz%PhCE{MW&sT1|p z5Asn!+49XQX7($A%j?D{pe^QR$KU3OH+#&0!p-JCo(o8&lN&-%=ObA} zA=c>n&r?o>nNS}jNy$y^0x;?Uw*^I&zjZ`m>iWL~;I>C}fl>wlb=pI}2j7EX=fjrs z!Byntq7B@6E6#IxVo1;$nSQB>hkS>}#!_C&`748MzYF|I8i06Se#K=!z8*$d!g&rD zZpd$TCqO|!M3gvlo`=jYgWug7BnJ8}`BL~Q;gdUlIQ5~82nsfEKsNftegFiwSS^HkeaQkyWm^V}iRh)mmQ~b4ETLSoTi*#z{3Ioh8pIm!=`{5AKch|~~ z2zCiRL$(F?XuuL}Bn^OG$DESd0YCBr>pg3RJ!(61t3<#^7lMSRX> z0lt4)j2XcP()zG9b4mhMJ{@=mR&;gfKZ)6KXn)JpRD?5aZGZS$c^60R944XC41oM4 zb*E^Ev^3w%s#Xu;q!{64urR+;HOcGVIUWZob~HbLI;c|nWN0bG2waeFDd@UkzZ9R0 zM7|$K2aZq#k|nS6Wsb>hG(adcP%|LWewQyYic(6|S~s`HGq@&~+rNO_9YUuO2985U zacA#B5EQY_( z@FH$NN{NNMV?@i?50?yuH3^ffk&lxWN45pAQ(E}>7gN#S0!&64_~*}~`;An1V15f$ z_m$hO4$pP>&C{$WqgiJkRw8R?;7GYIWx1OeWkTG((g&xg592Llpk!4X&-mr7Me+zk z*jAlR>M=ZL2i}X}gmfoQbvFvE#ieg5eK`qNgHsp2yo?bQr*~wwJ5;DJc+Whw^b9RNhFFxa(A2@VoYjd~ic-KcqAclF6BIl# z@2%nb~MZypJa#*S8^Id$@q=5z@V$dlZme6E_>K;lW)*?0NA6q^> z8x~ZU;5n*T5{S*hdILMIFl_mPs8*(IZt>p>pfyMOyi%WVlmjY+WaTEoo9GQ|8A&qG zinN0_{N_IqSi$UW2>whIc)$V_y`j)tV4J}u(!jMo?kIg>!e+nck-@Rub3-M#blR$n zmMx7$jIH9tSbr4?f?wwMV?u+Z1nN*J_+Qh%9^*_#+dM}UWD!Q+H=IxQ*16eq+iWPd z&3>V?V)U_}Q_D4Wb3Q~HT`(4&n&$r-RD_EnhK*v^2h;8*y7T=IypQKCl9YDrh7*d@ zLy_siO*oOxjeD;wYYVIU&HCDZ-Z6Z#!;7N%s)U*BV zw+E*8j%;p`b|x*b?;~CQ_H<52Hi}KzYi6~X>#I*zjCkCgEgwPQG_!)^;DBI_ zWR&kq-?4SPnraU7A8%^b9ALhZwN^zEyVqa%pdCABvbgq1Er0&z?*sWs@%$3~LgXxOWsQs#x5wr%UO_fH=t{DTO9tsDxt@Rxma_eue}p-Ezz3jJ2^@%0_9A;ba> zEUMp=c=!)PY@rh{Ap?mCEZl=d>wV$en}Y{j$fOes3OI-E^ zs8v|9M^qEEYehE|S^TretTu7=JOo)(lNz4K7AFwHNo$m49?GMw+$p6})E!CAlRcv1 z!P-a@Tu!)@#V0uIITQP;-{XeVSWB1>{|IXJzDvfE#d7ox<+jS|kCgTOZ(<;{ZTW;< zrvfX>{N$4wI8&_3y&Z!A!w(16%Pd4t3| zx^IP}A%Hr*=fqz9LDwN=>3?;`MOYFOt)HZEw(_qKw|qy+GzT^aq?*&A{qm`|;L|8s zeRGUV1xZ%7>qcGCr^b|c?PPnd3Sh~RrGZT;zuy*ZX>v9krm?;n#*iXK@BzQ7#S6tw zKTgczPWwj{R`4smf4$FoB7mbu2s%vf+pPgn2+9bZKHs|y3g92Y6Fem!=V!IzOn7tV zmP4a|;3QHAq!pgMGeN#hM3AQRxPHRh=0h6gouTetZ4oZT@Mzd`J0i@&)_`IgSh`VO zn&=?Ax<$ghLa^`B|?OyjxbknL0I4-z93zl*^u+;dyQB0Nkc6Wn13 zKfilgGg9b8%-TlwF6S%1aIO6LE?>%4$(X-BJyx#Ny;}2+Qsj1i_*tPTgx|J-rkY&I z&7#pbG};t5Lw>Z*;w9omk;h|zMrH*=sxQZB8n{57F#nuKgRIL8CeUf0!pT_4hXUg2I%T-IgT$s^*jz>W4p|+);V6VcQVUKqh~; zd$(Cl2!}P3e9HM$(OKdkFBIrCDOz(e031){aT!fZWk>k0-sycMG1D05`NONak48K` zN6$Q`R*Pt>ItX&V)kB&WWa|{TR{$AiXY8F!mQes@1t2qKwT~pCm}Z(q#ETVfnY>c? zcCX>cgFH1d&MkrPLGeUO7O#gW=$4EFOoyCetVvbnOxc9~dUqv{5k-LmrwS>?gO1AW z!?#TJC*GwXgmomFVXg0+ubDgS) zE@lMiU{TJP@iwIBD`)n_HF;a+kf~AOj$cFa(Vp4j*r{-?o=0^Oy z0yVYBRgX5DHq|3PkzVub`vsL}FGEx)&^+q(reK2;mUVikS$yXXO4Hb11Pn&Dj}@w) zN{ky?*|a1K9?aV=I0SO-TTNv<{>1_oETaVIFz|FRCz)hNa+_S5v^uot_$XGTcw?`^ zmE6Pa#n!FJ)TkfK^%xuBShdqHsaD4AMaQ`MOoB^FnvcxK5#iyEwW31z!`32VWyjXn zA)8&vR5W}prfFMN!F9WBejqwatw*ygOPL%DlDb6VCb70=oxNQ57RWR34H~QG--5>r z5|pgib753lc-3Yyzi!MqHsmD+EgkwGBd^e#wlYTa23fgQ_}Pd>yIa1^f#sodu&>s1F`#=Y`CB3~kAL!8s^HSQ0(t^Qo#X9;uRumu_crfs zR2esT9vx&I58&bJ>MQ>``|&esO1&x!__4F1OCz8!LjitmkdS^->QYqI7ZKr*eaJz8kG3I0|2?;5;3 zb#4aGUH;f}Pt<>oQOe7%vg-F0!}{*iie%m7Zh<58`?gFy+S#~RX#J~iNc2Ts?4M26 zNTC59HbI!X{PoQi6mtKF_$W@v{;|&PAG2qG82>Thm{;ffyB)eVQdOEXyDwf^y?x!k zroVq4H{KsVe9m~a_Zab`<7@G>_xUTmau1bS?`7)C8v;Mn)p!Bt zcHaS1xg@K9pv@4LV=KN9tlkyIL*LqU?z%f)oJ+aNGsJkXssdjha1*Ls;TcA`Q5Vb^ z4ZCLNNiKlBYk=_x&sTiR0H&DdxLh6f-Nv*gPJub(g#l*gimhLFf5p3Xm^Q_;zT%e9 z$|JaK2=gFiRy85@D|nSN|Dcu73RJA!4Qp4(B+_chEyq-YV(}B;E74rm=S9yN;5KAg z{RCL>=jc$o1Z)sjI-q^U{{k3OCjh3CLeEgX&aPd!bQRz6a~_XfqyUXALSN7C-8JQa zYyQ8j-=r6&Mil=Be5;OG+J!&t}};b+x}z-1?k zTQGdWyllb8k<`$Wyc4&RUzR7{j|^Y-rlp_s%A*bcBapglKB_^aq8X~QTb`$j_*BSP754WFo=zg?b|cH@BlJy{Hr*1DiNUm18)oJwdoIc^ABbQ9t_5X?Rs`n zY$S?WT+@P(yP9RogW(}b`$*oEG5dn2{cOggE?32nD@zM{5*5sXM(&oI&@zNKf$s1f zbEy0oGEJ7fF}M;vrj?v6@QmEjx*B1W3(p;wDk6fQ8N7Gx7xZ-(tCdrXUb$oRb=_Lk zC4kCRFT6@0+M9kY^T|;!08$OGF4p*#y9BuCv3geRto6yQKKtq|zkHrM`|M>t!Nq*{ zHJ@#MnNiEI1SFsRO!J+Hs%igu4zf!@#8E==dJvQDk4YRC2>5tpR|aZZ72IdY5FF>8 z{A$H8gpm{8uZM+lgzYw=qi=_`-^s%fA~I}_wp1F6>70*RzovXA!EoFzysbZb|K9Oh z5&T`h^cyKZ(fahIu3r5zukwrj%;JWKY`8P>8y4)-e%X~RiEWU1924OBOG^NM%<_&{@t$E_~hgD%Z8r+LKNw>snF z8u~pKpKCA?Z?Lg~V%G6>`w}7NVd@RhTN_}=Ei0}RL)1Fv$d}s?J52TlkLQkx+hV61 zI;bkm1Lb&ewqOY~J(J!KX@vG&rb`vg0OH!c#*FoWk$TG>WP(AM3dQ`HAc?q$1pV;` zm=y8JFA-wty(D4nX-auC_jhYkYe^LD4-1*4y)J-VHeBghZyHsCJ{za&#&4 zXv!c~B9cvVq-q-3HM*dttb``RV7z#Yg$!Xd5aK-H=hP^PHjf%~b_y=n&v<&Yo$n;! zu^`77bTTmFa?H+$B&j-Tf8$8NBSW^5^79G{R3QT^DXr>G5KoKEf|QI#qZMP09G<$; zD9j@mQShaSR|2AXvyeUEVg}`vf&V6f-0iu9^{Lnko1H}L0way6zTe83e|EVNIw%y0 zUfgt|6zBvYm!P7IFe`J4;G)_2PkN(~)JvD)g@&6T5>2BgY*^~H>j@d%YXxE3Z^Bi; z^wA5@n7@@cAYgKEdo1&c^GAuv?Al=mxjuk$r}u`KC8(I(rI}MD>ZE77w~RG8|EUvC zGhVkU!J?ri)EI8^GE5(?OVS0Oq%uHLM-JhXyV;LOmQ{dg(j#e81@e}(&vUXF0Krm%$gyQF%Wg^Q-qMlj|&OPdLsTzPZJn!Ro3I+mI9 z;UV`Liq+aM{X1H8F&`+^bs?u!uyMDu<-zV>Yl&J71{*SavuJ+=kI#|;VG=}MdPCc> z>V{9|PfRMQIb9~KXp2*XFDJ}e1GY>-y>#lez9AWGY1dz@gc2ILFxa|rm=7>a#*Nwz zr;uk5D|TOjM~UQ$c@Je2^E`zIgsK-dl6D%JJ(N_2e3Jp&5J)#vAFV6Qmw?Z}z?>o9 z);XFl>)UN11g(#iy)%IrfOVM`w!O3efHoeOlZ<5P}I2o7wa6@yUi@zZzorB<&ucLrd6 z$**nc_I=nP>PYrmF|t8-092iA?>Y@E@VZK;4mM{?2;Foie;kt@CmFn>FbL><$tsnD z#il=&lXH8pdqJ7@#K%P!NeG`LwZvBlrwF)z{DFyH?j&e^(=r5WO%i zH-S{5J+3DlQn3#v9o^G__Ff>TJ7EFFi#hjqB$_)gDK~6$476YN`^>ddD^ee9+IbS< zk_epkGw=mb(kEc~Gqu}J+m@OW<$<}kpy<*9h!&_zQYDj}Hq)r{G)0R^vU&5*QCw&r zp@+;y6sW?1LRi}Bs{O_OV94d)=+%+Uk?u(z+sT!OR2jW9pEJL_jrq1qAqtT^I!#s0 z?^n8}Cgv%}r^_;)t_&zYc46oMF7=Ra{iEaY%Sz`AVh;+Ak*VR7+?SR4Glu@pF!=fh zjbi)@TVL-FM}3~Go)fahY;$6PrBzGbmN)uz;uh!eEBHy93 zPbvLmjTO64Bdsyl%jzlE2HgoNBnVFH)G*R!hY94DiV};vu_2<_cUl=}fwDo@%BH7g zB7-|Lsv=2=@RD%n2@~M`i~1?z$+Iu0mMVr>TZ=y zt?q6g8#wUIe*OMan$5&7(m$)Z0pSzxtn8zZ{()lgQAw9j@7o@2@rQU+9Siv*3W=1L z{Y3PF4c%pW;tQ?!K4@o(!x@iPTXocf?*b7*^Lj%l7O9k_{k0;?)RvE2x8CtbbsC&0%r67G34IqtnW#tN8Ze7^6{(5i?$Ozv=R z5D={v&##G3>5`HvrCzr}7=8_oNp-2d5Dbw)Y~DSIyA1gPsF9SWOG^Z{ee5U2>ys&A zl(M=v^b!`KFrvzlYHCwFLg^7F)df{S6r2A>kL#(@=809pK%T>gFx72pJLn zKAR)%%OG4rY%n&>2G@UrAU0JFZ{%S{YDW}vy}zL_W!8=V%o7)0 z|NBb?-N>tR`#Nr8ANa7?Y>ppeXEv@Dq7Wja?IIE2mk_c*eeglp?jaY}Drsjj)_5W( zYFnB!KpcO#X<>Q?FH=6A=D>8=AyqTacF5m2Zj`fc#ffdcdg(A66`M1^z&cc#8v%J_ zu3Rn1uS+L<9xMu0t@pwVzH;$Rr$#dybr$8o3q#*%TZhR`aaiq&Ri(aO98)1Psz#np z@NhyK3CoUTWQX1hXug=rVja*7=kK7?7FvxFYfZw`s%5vO9ZmIhg}G99`?<1~YMwV( zah@p_=$Oaid7Kt9idi>=&3n>k&nc;smuMMQZ6q*HzIxndq@=s_9V9D{46$?}f6jqx zfi^6gP7##Uv8akao<9r?b+!|x@MKVH?n2b6z`VMl{)4CrQLNbNMatsTL7`c)=+L~* zTEbF*_S)iW;uyWgv`l7|xALKt^iGD9TS(d-7fkF1W*X&_!F(gCcGHdbdvIvzSoLJHGJ;&6X$z?eyx# z@~WU*XM}p;1qzSxS!nZQu|aj>#u$0zcXi5X_V$*D)c3A?!$Cxu)T-K*EL2A}xs*%K zTDb5|DiPVABHfWWY+A7r8hOSU+^K58B8Y%Ev76?euD7{q^zxZh{8r3z6W-mxU;4=m zspj20NgAklC0lH)dW_86^6KFqE_5$0PTEIR^_9M9o|&uQbN?L}X^O~*1>J9kS2NSO z#NO?@ZgCiUSx;IuWulaYV;)o^vOgx9!PdZh%ZApSR0~#bx?#_usl|nE-n|_L?{PKZ zxn$O8DKEl~m4?+>W7$GMO}gAC1KOodh0NE2IS~T24&oG-E?5p& z5Ka67Fj$BT8*iF#=!N_DcRx!uNsPJbm)UxcdI=+7m$V0U?7f9~(x(qB@dZS~g{MRr zB4Hcz=+tUg);*&#_A#Jl&F=H{I@5zEHKXf|5OEDD*po(8#8K z75@<(-(9qFS#`p# zXgtv6LHd!Xh!A%i#n~|_r1w6);*1wi|Fn+mTMuksH|PjahNanuwP`C zEnLKH;D@KM)gC6OnmPjTwz@R*xIZ1K%M5uOsWtx>Ql&kH*41%csIh%u*n$$ROPU~n z&RO3Z9O`F~rMm=a5Baiq@#U7WyrE%ls<{~21y!k7w~;YwVu29B)7Rw z_?~dG>Ic>dO+_lC&pw8v9&a_4_qOP~wVP6hiK6Jt!p$ZkFKHQ^cyZ)2s?QMub6ZztmVWl-<6ayYO$=49qtbfp^X%~#Kgs8;pOALha~^nu20<_*DP|d z;5?^(iP%1gAQ-oVT*UJ0hO@MaP`UY^Mf&Q+J%MQ|9?kr@xOvZUgC`}etb%Q0{!YHD zfKNlg%A*7ai}T;l(?^ZtEc*?#%mw-El3rVOij-Foq(X^uPv7XOC$A@=H&TQy>db`* z+ciH?Y;;}-v5i0Tk>^6jjF@Hq=8A~z5@NM``r{WHt+!i>e$YTYSd|NKV{;d@w7|Ae zh+|4c^;_$u{qVNqW^^=>fJ@W^&1OXzZYCk<`(2KyiyK7-c@JvSFm*yGs*bM(e#E*a zMudtBJPNd2Pp=*iug;l|W2XGexze-ARD}zl%z~a~w`t{GfVQ1Prb*kfk!5ve(*ogk zk^Ru&d_;9-QCBK;@lwY@TSn6IZzZjJ+R=VX&F)-&+G;l#vEl}+$S)R-#~L($?CLUo z5K3_Wb2r#(G9BF@n%jV*<)>j)7v81of2mcAf2dWLQfzbqJ9Dv)O0_{m-xvA5bG&lL z8~8N+M0y?-(*L1WmAdjzKoxFspF)3mlo8*VFNG#eS`@1w_lLjieuw)fY6CqWb|5eP zT{{Tn|H@6&((NkNPpKNur=UrSX;6ej_PiUToz_l97jA9?Dn~`u%c_Jj-R`u%{zX~yuJLLN&S78<-so`N(WPy;- z=>H*CK>})ZS_~_`-U0KNEkLUy^ZjKUdysz!;N;`D^2D(ns05?+KbH$BLWJu+P-f10|$d4LGN5jz%I!>2J{kohSWAz=@N#`8v?w3<%fj}~ACs5&^pHN)NN_R}`i)lls0N?DnhtIH9kO3Hu0RrZ)1Su7rGAu6p8 zr&b-yyhhyOB7mbKIFYFJZjB&B#m7ylZ?)g7^6U2xb~k_zXm<=dVfqV8fv8E>X)5q_ z`iwHl51RE1ez#2$=leFp|8WYK0U2D_qeO^#=SIkGQ_61X>sXunpyIjL8CgbDBZawa z3Mf%j46SA95LQ$#B2u>_5w(Th&fa~VrG$>gE?0-4PRjZRTrH7B;SUg#+|aKinM}I% zc_{@b-FlKvmE!>vA? zl)`V0>Y!TNOGuk{+{V|LL=YX)+3l^|C1=zcWwJ?6Ah9kgay zHBi9ss0{3h&f^{Tbk9^eqo2)VQ5-Hu<@DJ{LZ96U_40e@15&I*s_ohQ>t)~~*xW*{ zjnlxp%iE#YHfi`A@F)#;yS{lDsP46$`~q~l4*rjI-w36%}nzi{CJ5TbDV(e6x4hdD`d&L<^@FJ6sniEU(2oBBaqwOTYnn;aWsql#oW(-M!I^Y z7(i)xqqcDY!B_pn2;{cz4(OelCvcFv!?o!pj8nqeh=&L!N%xNeRtzJu;~&1|^Vo()9F2C{Cgh*C>9eVQ z|AAQ1VAgD|qk8y*K0qdJ!TII{FdkNOrt^6mchq{0+oP~z3OFBRQry!Yz8Ti}Kq#h? zHd}PJA5M=m-B6lPnbomj?o*0v#X5{Qm>k5!b7)^|*rJKlBg89ch|K3Q{%Iw@xftvI zwtN@VhE`Qz+NF`>Pymm3IEtWIUYdZ1_P6Pmy!uXji!Xmh(PrTQX2iL_k!pnoRX`Ub zjzK9F$J@hG9qHPe%B51I&fsAOK`*_|xPe^om}tjLG+U7qo1yHdOS6G~3u+A!i2Ag~ zamv0#)NwY?J%FrvE(n*QV*H^RfV2r2itnrWN7g(VP_*sq8H=RgHt4IRp`}C91!(%Q z@9UE!9|ica&p-4c&-kSr1z3!{%{@W=&luG^`Zm|-qZAWBIqVy8n>#KGVI^n$|BU}@ z>fdg;fKCd#!neMl|JCrVkp#|!YycB5Mu)S{Px|j32S)7ws;hbpyUi8(KeqobOaAXJ zdZ5u@9wsA&7+eH$pwY$vwh@pO?dkuF{%hiYyM#2Bgb+h7lHYHfw@GY(F_4ZigO%$# ze<#4)^CLDmm|Pyc>jfWH9^LpOHumln(LlQ!9U6CXdM@<72x;rk#P({32u%d~_YB++ zA`G}AQ|8*W2m!UEfjmz4ltE;m844HS=MADS5H#>UHBh1*Xes_i7)_|m$1)~KopEH* z()e26VaA>Z3~g~R%t?cNdI{(_kOw+w;`w1UP_(m9v61wN%zgEW&VNXKK`}ILtl$Dir()a-8J2llUL#M173Wj@n&;t>r)@K%z$zpTj zP7$EfhcZ_i3&)N%fVAf-L(sJt z^RWo7?ay#FBeuL%r8>vl>p@H!2lct5eYJnbJ<(XMLjb&Eanhp8%jdz3AqMy-xK3|@ zkNg#JsqD{ zjs?*3>W1BIi@%-_SUS6YadrRwwLUlJ%+o|R%`3-6WnePfrtkb#nzzg-LZ~qV5^6f> zv*jCkOEF(W{R8qxHCRxu>v~0E;5-%Zqcp4r(l7dgOa%YuT;eE?;&TTgq0@|3Tv6lF zZ2w`khlI+DEWtd5G$AUl;DV##aQ=5;4ll&}ubZj7hKg#)A)AZWMG*S=#<@ihuM;b_ z=D}J)eot~t8fSKj4ZxEkQ*Yyk)NkN>j^a_EqqZN-X`JBo zzfi7Q4T-x8k(KQ|ecN%3?8*Ez?9u%oKRaiCrBaJ?V2;w4nsi^K?mBE(KUdQ{97%Yc zGFU_J%@O7QVpngbsE0lyzKB6gV7|Y#WXB1<7aOzW07cZ_wLM_?LZ=sQrOuke#SkN7 zUIRXh(=;4!V9HHh0nZ1U4&H3oC|Z%?=5i`nnus8z+G_Eafu$)z2W9FwLGtyCfoY9G z@{f|LsO(j9$Z}oJBP;I3Z5^E#;AckfnE%2&DXZTMM7^!+uCYPRH_EgojT18HV-?4G@E4DXaxdHGp=`PS<-LRpX;Z&uo?4T4TemO1^#S5 zaZ}z5HIZsGuqLfml$*V>NMH{(2&6PAf11ZyE4<5J-uUF1MQ?Rbfo8pxE{i%gsG=?8 z$OEVPnbK-{SzjEzyCG|NqY{voFWUX{1yH@~PI0YzsJ$!&l=$#Si>BY)j1caRmmNYm0|8vdK({l$l#01lvDS2HZ5b z;DU-Z@DYso;l$wH@Kad@S?25m`Jw?Pcu?cKaQ zVD1orgf7suXN{V+<-z}gx5^J`TF`?Sx37l=mGfl<9;i%4nne9sR?O#sah8QS7X)j8 zL28|=DJXWw$)No+Lp7Mb?>FJ6oA2uiJ>7S&S?8;k=HRrt0t7kqtH6B_s+zM=6-+G~ zvbTC14Vw`%`7eb<=7fAUm3J3(B#yI(I;uDIBz!A$$WqkBC)g%okv_|b?j7?39(0aE z34W42Zl3*tMw|U;!blJ8D9Y%yGK>?ody0(+@qq*E63EA&ujUR>!7&;Vk?G^Z})v_i>iGpG78JGqGdVO!3-A`{9x+7^wWVfosjduz$sM5z=h3 z6^b!XI-MlxyIKfqmzXM;i%0r8duNkWI6l@y9lm-5-WUlZWnMcn$T)+!6rzg^A=`*- z-uXy&)gey1y`UaDxndwM!!y8{!ZZcuOt(ctX^cUKAaSd5)yfS$xu&@;D;!W%3YR#C z-Ya3eWbY7Frj0J#%I!_I5llS?@NC=?sxmt@#D6vEusUvJ=7%YUrY?icy$PRryS!ebkX3xY@8 zWdg~q*|24^k-NFESg+7#(366?X{oNj(fUkbjKY$D-ZUTQ=eSXv?!2D&`+#%?N@JFM zmNb*@cSE*jfgF1-p0S1~Lr=`4JL>`Q*`<>GBu|Klw#{r_bdGZh$MP!DLnN81$dKp= z6%T&2Y(b4xfr&?RS5|zUe*8qpu}iNi%$^<1gS4s+9x<|e#)gq{l>LSO(&R=c{HN*vlA%09%KhAvSWh(QcM&x0?AU8iVE+G1hUm<9?$Z zj1Urap|j3R(quYb-&<~2g_9n_btBLa)GY@^sp?Qzam1jb)>lP?DN2bb>OS<2?yN-M zRqU2PP|_w3dPxdGdDt6HS_9QePtKoNvVy@+9#Lnhv`S~o)0@jyf9NU`{{#xbTA2yS z?&s)&sXfXNCj_vX!N&1bus>9N;lF+MKHCGgPXP9Bjkf`I9Ma0FXcVzlH6XsQnWEZ!;sktpIW7k+3Vwxu3)x#v*P} zCo#yIj3&wdeiU#Iv)Ir5+%Nr1Ujpn04*OCM0{n`G{@vB*gMFp@czVZ3uxHu1;$#O*zaw}t|*V+C~+W<*+gH= zk&WDf&{}%^y?Vz(U>-i(^6+x(BKO5e+(bK}!!59WEFEiFfs-c-?gR^I;dPSbh~FUd z`t2j&ynOozxuY+3`-;o$@(1i+8@qtct}cZzz^e)68^9+i_6d+|x4Zjp>hgr-m43vD zU6llT;|u1GATz943ha72@!KbkHKD43ja*P6Tf08^5AA2g)Dh3e07?ohqeRZn-!g{I zz(z*CQFcsW%1A{j_MQ%0U;_)_J$*It9^rvfyygcWLoLZ8jvurs< z1zLLomHSz|>S_A{WX)d%K~*~)Y>Ar7SVVn-z85qaYJwUXia(;|q2BZ6bFjTx5in$) zGs}$`qjJPxXN<`;r=A}rAies)_x11#ij=_da5Ezh8EKG^4W5!KA-14(DsC@v5IxAE zmsS>Kiubt6Bi$2t8guNC*D?y~NOF>>qrViKMqc^@WaavSnOb{|hrnrH2 z%vIIo_gLYUhme<1H*gFEQ&lo(Q6E_uvH@g&RxzSuMd%QLEHWUWntrVOoi#Y1T~aSd zxKDdn2ZEgmV*^3XDq${j@=LMam0jWvGux(V?mB}-6!mk=JDw2r9mNfxni&kJJgpuR zJJNfyX)A76sLe#7cXZv87GTGKd>}`hlKzk%YVC9URc$(4wV@P?WCu47&*M=3y1p7X6$m zRNB3ryQyohZ=$>6ZQW-=7=9km*ktj5mGD+EH-qf!wgXr)el>z58_ z>m(@b8qx@2?KnR9_H!Mrt}v@Ge0EhjdkTVHx2Ho_Ya`%j=+Es$^){}ZZ*y~K%$qbp zZH*=ZtA}IC7fKV)2MT?UtaGyS@M(on=l4yXPM#ReU;w6FGK65bmr2pW`W4R3tCF_>*ijjY{cO` zJr%DtjFQ3omz+W{cJ_}aNfKktgQu+`pkeLj?sjOvQ%-S4on32 zyQ(59iG51G64xijAQ*axIzf7lRn1DEl9U>`^U1~MN6A~oTr*Yp+mkml7v*f6r^U!<$6 z@FC)#aXR>RZ+BRK;Jsu(!F4$|8(s3w!vWH0icH`jSDluHomL{f5+HtVxPgKidq(Ie ziqv4X8y!T%Q&#}OONvZ*?InQ1cWT%9kA;2BngJ&-^w)+U9RpvDb>F9ZKwDEA%C_%2 zMXm)P{OSL*$(SxXjrym7i`lIeTi~qxx*pg9Xwz%}w4<(leUoB+0rKT;rJEnr+ikuD z&tEB*UcSE6?0^^M^EW`=Gav{3%9ntu0B28QKa{Qgd!3l1OpK@fkcknm_-GKj1<#gHUFYo)M=LQ-$ zGT<(LQ+vRS1JI9u27J@(B8h_ez*#L~jeq^G>i{)XRWHxIsp@#*UjRkEoLkqprMW5! za*tNG<=V*9PuI2dC79opLJKx-Oszzie(|@3Tg;a%Cgp^gftz{?-QA4N`I#xI#~TWl zv?|hR=F+1{18nBpAKh37)+7hD{y6=v3X%|iZ%sWxU6~a*hvE@p#Xl#SLYF+Q-Fxm2 z(Q^)ZR{yT8|K;X$e|(%~AE9^a<=lFmI^XQRj?piWa`6!SO{Rt(quHp%pyCxBh*lig zKx>PbIvc;FaD7u3W_(M7qiJ{S83%8tcQljK(TLeG2inSv8!!*uLXtM3b5px6V3R}h zOy!g83ZdGHs%OvS;aWW(6F`cH5mUtUi>IS3OrF0O7sRn`RFjMb2NU)(Y8<>towA4x zoAeX|ZSid}z#$||H#o!?$IBtakY-8_(B*j-LNknM%80t^0Wk*zV`(7bFBV9lShbKV z>#z!xvf3MfI;l`qX_qM;{3fFcUr?dxZ@@L_Ok7-!etyY_qXYDT8%Nx@~ zMnd)$9A0*I*3lte=Z_*>3W)2^=%5?&^O#Pdn7s!v(ZXLa=I-_gGLQ^Kwt5&hwc6r{ zNOhGt$a7?v`)vpYoy|v*vgbpBhA9)M#uzFRE@am{pf~{>@yzxCMAO?fZfXl6(R$yDr)~$fW1**`jCTDEZ5ypxt6k$o)(_nV3z3rITk$P1mz#qG!oD zSUzORYQoJn5h~#24FfBUL3B{r{iK6?mObBR$-Saq*;mVRX>i3^N$V*&vohp zEf^|f@YsfM(pEzMu)ZKc?;F0}d9Lyp&Z%WAv!I(gX-{`q9`c4LHNI3BRrWLjQ(o26 zz|5~$h-)Y6ul)7(Q_W|(og-eq5DYAG=DdFbv0qH>D6H~mqFSaA4m^xvoQp=PMshYM zf`8yP8$bPFWj)%E8w&~A@-zT~fTS>W1yPtOijFK2c<{UMO3{t?19e2`$Z*w+6)MBY)sNF53WnpXgSghrQ*+$n1oPIcHC+zp zl0FUj(<4$=d$s^X%lYImFRbkXp_S`eRhEiNbmmm|CZKd-=23wwAC7mW)xj#Q#R$bM zu%b_$(#8beX+9bgcu-w3fufYxg0TEg9@J48A~(rn z23NOyHIZJHdrkEAcJrtXV!)Yx%)QsA^g`n0JG`0H*e2pz)>APO#xC~8hBn_XV zzYj+X0a~rnNz>*QVpCa;fJmo5xC%MdxA%RSB?imd3OWNszn3RHtEbztkCw(Waog2k zMF0{?SG1uV;%P;oIP>Gy-2@JiIiHEpA6`wVOIS7qV=c4YM$yHx|0=bym%@=+GI zzhK;!FBb_!Qpyekx|3^1i8~?Hjc*Uih8w(ZcMO`&OKhy!PX0At1Uj2%^q0B>GZ=px z*OY%f71im?*W_p=aT!tCEgt?)UDl9P=3 zEDr)QF$l`@rSY14xyxCB4YZ@{J;SbqE)s*bGYY>Vzt)}GvJWhq&64yx2uZtnt@|ne zTp<)5`mqR~@#OI=ZRT`ro!$G6WTal-i!U7!pVu8M?mb12lRrnPiQ&!!MI%rmg0fZd z?Uz?6498{jv};yM@v<7$Ql@U5H|V1}`Gs3k)s(lD_-wF>;@P3Yy~~1B$27tC^*2Zg zESIS3*{2qrqE-l5Oo0@ccbHob9a^h;pzBPO2!tz*B9}YxPIru6)23T=b3u`pXcJ_a zOk?HB#WWF|leF}mI-Eb!g^=?>M-02c8A15m7sh~fUc^F#^pTrf!D$2a7p5z6f5_rH zJCIa*JL04YjENFbVJykpUV;lA zD|?Cd&kGNm#n&9>!euF3V9?OfRQdoR&T3u)-oBo_+JH6;0lp1w7w^8jdY;(-xH0lg z0P%O<|6k3vHCy2){~F+*hN`fdX^jfjn)5%s{bTx5=E~1!;bDNL=G|p4><#srFaPjJ zEC7|^S{@dhMYaDkTnto8v%UcM6Kii+o+xbg-z#!}rsrE5CV;#K5PR4DnRn~kVabi- zCQS_Ft%oQAq@`J&Dh}icIMl%AI*Bpn5=ZEG=G+7$>3A0O)>_R+w~yTN7!bh+F;yBR zwJsSI&PDz5Js1_1H>tt#u+S{oqP|lof8rLyf1BeY{Mx?MFOFs#Ia$>1D}VzIa+tk- z{+Q7H@|BiH$MF6FJUAQx@DB?&pTY<)i9_v{hJe2m_?*+6)_M_oAMVh^`3Ky~Tq4G1 zu1r!^wnn?&3b2Lumkegx{{m|TRBXqY!d1mw{=)KshiMW#vX0gR>Rml0oEc!T!ld3s zwD`F{T{>f^zq{J&dX|X?uI?KR;U;rk&W7+t-!ll7_lkTWR07;kkgxRXMzmKuml-ce z;ue0RdqXe|EQ;8N@_9%DsGDXjGKLnf#6_pZDPr-McdTD*G=Teol?p-S|F_(9lwB% zwcA%o5KlpniTpS?ILlQ@2&q6P;x`3D3A@RIP;uG6y5JO$v@}@1GnJOO;_c@B5J(wl z%moS>%(<*XgcCaP5O4b;z_|YaYFO63JW5X8`fWglFsQc+v9h#!L70#B@NkbE7fk9*^qp!@ zV&!bjaw2>xD4lSnoE0z&Yp!c=M~T{3^x^=A+%BnEvkivkS6&pC0&{X}PNhyv%y$~g<_mV>he z#1DQ68Q`?%oYUKIj+cPW${L|+Q=Z7;K|g-(I@Kx7VU4%*mrYc@H6AJig@Js$eSh5g&M5&F<0LW%LNEQ8XPxdxTaVJ za#>AOxq&2!yv!GCkYUK*lMGnLaRbwci8s-HzQ)&Do;a=k_A~F)P!9!75t*sFeVJ26 znGm7~zt9~b9+U=~L`Q5)=FtvKq6q-qX;_K{cs?x->_9FJlo7Z+Ap^1Zc{gsZ6!P1Q zuEwI}8!QEq({HnBxINsU-)@4;Z>tG7&0oDx*1tFA82FqzgG2D?Qad$o=+@ed_<&eZ z*vk!tOD+4cPFx4m85o5{5fw*mNRco16iJ-0?ZrF#+eIomcu+SD^wr<5rnCL4JXJ72 ztU5Ue8v&j;q2q%hB}MKhvk7AeXq?1H3L7%WXz1u{7xWf-6^6|e1k~I>+E&$d42RIU zP+>C*E+YwBb6e@xnVZ9#Np}e)xqam%0o*w6drUBv;lY!mUPJqFo0gC7KVFa~ZSwJU zrD`TsE!)v;E(eH~56_|o@G>Q1DXg`;W5)AIkj@w<$H^n^gc|<-bw?_TfNd75h@aLbTqL&Y3eYlCAS;}Y&~e5(P4THy zWxs7esw7CR7(adi`F^aK?~3?Hyt?wTJV{=!g4o>0dl*u?6UgECSC+k0RV_wU`INZr zIgfy{I48hFW1k_)`cX}BdYsRxf$ec4MOfc*g&F5WGOX%5uHk3amI2`^sP|5sUIcXVUEMCj-P9SIzUaC#NS3#ad~ZrI6plnOR$z)J!IB-a zow@^nzA1;;Y`myB+(VG}wqF~VXyAYpV5I|wSf5QsSH>=_l@2=6tX}zO-16ecyW0b< zw5==NC5T#sK^Ip`ibz`0vod^;F#@(x$uZPykdAjX0fmem56` zmtVVv?P4i&llPZ1K!jw^Svu&ivh~~<`Ujk}W<#J2YF#S)RDm32sxmL&8@=ms=6At< zGrIrAp8V;X$zGa=PR1LcQBKCQ2K)*N^Og?iA$AYg+F^a7FR40 zx_|-OYhdnZ0RD>)jYhzkJK&nzBM0Zw_ng_l8r9&>)bD&?d+sV6pjO0z!>3+qEW*EA zM9cF0>=5s%n6P$zOsQCR=;&R>La?{X%Nm;z%@=O5)vA}imc3pH-L&i1Ym3nrZkc`b zb{+37yw>-C!pSc;juZ#59-p1KwjA_Xn9tn6#KL_T0KaW3cMjls&q2lU=I#wQ)g;>AY2!mv{n(4jB3$bH9gb7%yEY6SSW&7pLk)TxIIgz4rTWUfytZ{vB9 z8_9T&Gz;Un6dDY&3uAmVPfiS9ovn>WTc4h;j`zd2g;#KJWKQS6(1R7V7fUvDV3?8< z5AI&`%3x^!AF`iIy7ObDq9YuB&yDGcvE&LJs=GUpH`o&#RZp=$)M6QaV zUTEf6+blXJ;Pqot=2YQ|9zq zTY{u)^IA`1zCr4hi^Q#juIrzryRATAiPrWybtxo+I3i5(5v3sUu)NY(xGkgnoQYO6 zKnu|X3=xYrR1v}Te1rUq%*&D;_|ic1WhaD?K?jjC?>meXl7wnL4CWcWq?dqzq~`^o%SR>@8Hx=D^$o5SDHtih z-aq_$f7x-b9ils3W^Lk-UB(aK{TmN7o}bSFL5vrOx{E1v`a87t3boItPuB)SmE0(o z92HrR7+jABafJC12_$F$ZC`lSCGvO`$U>sIFn<;6$AH7p5%K-AjFCM8_c%)r4N~Glh3{%-Ps#8vf-lv@)YbHkX;R2;y&9GQ@U;0O7*KKjKN!@UGaPDElyOZ5oo;Hr zHe(IKj^Lh7tMUf5#Y8RCDRdq9COX zY+ruOuFUm6?h(|v(ki09!yR!56QshNuXVp`OsV z-2Uzvw~*!`o-hZ*pQ?qaiTG{2#`W%}O0%IK1f|Z0UXF$>mxv$|2g60-;#$wDPcs{t zwh5O(Ml=XOW0Q)1#KDvC&!)pOV+MFQ*!p%$=-=2#RlYZBv7;Z-tND>eIEC%9<& zvgdzsVIusDp#PZ)Q=bDUS&ZuM<8fwsfGn;ikVvj z|78Cr=C8Whe-f5z?%c*BtBa42J-E*&cM^y-l6?zajv~RD%3)#;6@i0aGDE>PD_X8u z76=7YE{PdGuQDJud4|2}Ie^{968CK%`gwKhCIS3Xt0DkwcfI7_t3!ayS3OjK)q$Vv zXYGHL3tsW17{sL zPkU1gI}tHKQhKWa6(?p%0oN)Ajr)hM>c4pHUTXejVz$rNOT~87cDAUncWl)*lArw2 z;eG{BQ~}Pf0BcKtPx)1Tc^$w*AF{t4NGr%$4J~ZtU!Y2-rjCVECZ3x470k8`_+eq( zoO8L;AC|M94X#sleJ+DABhKkc|FE+4dyE#wp!~fi8$Zy) zR33ZG5i$BimRm=RcMyNJ7C7-uodwcqTuKd&K!wY$TGRn$#liRG=;G_;_;`3cdp&r6 z91Ff)9^Ko#LKE(i0ujN)HrAP?%1~Of03ILVep)iON}&AQ;c;L^y*D658RkeWn|YQ_ zw0fDR5F+|EF^xC^ZjKiB?k59DoLVj|{H55eCqAGQ4XiNTxc`m9o~&RI5jpS*b5QFK z&Gv>=PcKOlzghSL=-b8Yn=}}B@c~vumX1Ig zddz^eTnHwmzma#IZ~fb5r-hZM4{rw3zdax#>WU zXM57;<78mm-@))O!mE_|8nYM>6qvzvYp$95)2aCS=YG0*B; zaGB0XVE{zyMqm>pr^mz48kK%knh{GUF+J;nHx#()-&vuK|IPOU_oS-7oI1}XQ@>Kieef}k%Ue(UBQ%()&?``1m3nSIj+*j!%0_b2XeG6ik51R6E80tn}Vr>i~1Mb zMU*&(mJ`Ool^e?B;RcZ*uC|t5ECf}5<1VYs@|i*qr(Fnw^2xw3sY&x$865*#W#;7}jp8G>-+Js4>Aj_cQj-4~UITrwys(shbQG|-S0|^Jnv(+=^vk$*Xud$-e@*ky!E{Ev$ zc!rj->wj7Mt;b@#>d|;>n5vg+p1LO}L%nLn1{*x_+$$F*%kk6YLen$BXN8t{ zj(X6WAp#WX>d9W4n^nuI%IAS(Acs?(1Sx(B9~IC+-V&hwt4DpaVKR^*%h7VOzOC8#D2^XxNY8&Fr5!{Az5w$(&+R6r{N>*(>_{dAyo zrD5tEXPJGe7MRmGm?Y(&Eo}|!K|X27mSyjGL;?~ewWe~iEO<8L#r$_*(IG`AP#WeQ z8RLFM>Kmv&EU#6l_A1F^`)YLZnJE1!N?j~iKD*o5xU_gOpqi3}jYco@U#kIz1Ai=~ zC1a!&o9N0FI*F1HAwGbnO5nwSJ0to5arsOW)u&uP4UWV{qhcRYIY`1usp|MI@^_O=%0~CmS{ecKggQa|BY0oN=&P3Z!@L5IF8U240@uT<40FvWLad6u{-i z49C6XdBKr>)S?h8l?1RvA`ftOh~Z)3uczy*h}ziQp_LLolVpoXRH_S|#t%}e%F!4% zDDDN7P5KV=UTM)$hN&+dvG5M*t~A)d;s&lOZL9jwr$yOc_m7W9XK(v79eYwM1&8K& zj9MZ}19u*`90ac1r#*<&8>pk>hm=_o9pz2Ay>yI!Nr!1_06t^ zUWOUlF~|^alL<|nj13@D^W-q#9gz``|w1dVw zm>_LB8Kz7ggkl~f7G+D)jt{Ff{n z#v@F6EV^5oOCPy$$9iXspN+ROuIxfYYHF%_#h;8Nuhx2hd2WZO}>h5h+|18;!#o^>h`=a%k?qZ7Q3XT0^#Rh(Kmo`p_%ZO{L3y(+NgU~ z3ZSP!MS(dfM4PE0-0|(Ci2_%PWH4e%kSitWzu29_m0BS!&(vLK!^O}397)zTYI+{Q zSr&?;jKFX*3@HrhC_rmQ#r1bacRGLx%CkangJS+UFo6TEbn}$9gBfY29yPtVy;E&` zmO!@;yA7x2_i~i+cKfjERUt+4cW$n(RL@WYXT0=kw7Zdad@*n*eKP>)--rYXn4zYR z=0;`WOFJvXhkIUmPHNG377@ZIL}L0ei?hYHtIj0oM!yj!#F_CuPNOz_Bfm3!F?-WaAzm5q0mr3Cbr*MfFFv2Ewn2dItg?PTw%1w+!17)%&gY*XfaR?o z{CCxVlnhmA6fo>d|95?q$3T6*AJsklx3q8hcCtA9_XWFW>;HIg8U68txwIGf&DcgH zy=qq%`FJ%OqH0_n;Kz1b3-K)~4+?M``5WMe4*yy8U)_nuX*=-uh1W13L|L~UbDTg_|#W+y*af#b~(nKJy^M-lEw+q&8B z59=+n-~AZ?kXiT@zzqh#<1}pB^7Ayu^s6`O^q<$LAHnFlxy9q@6=9*}>*>{YuV~c) zKcLrY7snyP&WLw#Z~lV8oOX!4$vR%1swO!xS|5ypNaC;n4~<;4qX;?Lb%aavt-)F{IdyKl5}BikoI&JR=T%fB4OS}Kokrq zE3sEF$}qhW6XBdWOjA2YPeS3 zrRscH;Rn!LO7VB|l9_Ujoqrg=0pWbDu&>u%g5ySZ+enNHq7eKyUA0Q7?A^~{&a5xx z?>;{6<4GV{>cZfBEq6O$aWhz6_hdfPVHWI_CnaFI?33&JjP0N3K0Ke*Fc;e=<0WbQ zhobC%&~zVu4vZ*tFynj8xVm1mJ7*j-M#fnIMgp_*XtR*L6-Jj5jQC-Du*I3fb8C`B zr?`zUB^fcua~YY1gK?gSGQ;xp=$OOoo=@b@UVgWx+mEPD`M7=A1ZeC6q<|0Poh;=uer zxJ8Rr$9Bg*M;_x3*MlF3Zrc;Re0X?--8gs%a(aATE}oAkN3YY+fgwlucZfEpeGb{A zH^DI0k&x7~9%a)A|v08I(@HY!=ueUMAaxYPCo?c~R zx|8)Vbh`||AMzb&*VFe}_O{g0vzyltua$QIC5FZGHK+3X6~?6?$EpMQidu+uB0H;A zOS6Bj#SVLHO2>$MPqf#`Ok@|~0tZ?cB<|HOu2&^r5%L>hdee_CJCB{Dyz2$hU&i9y z1tLZP&z4*)jK=AQX7Q(7pg2<#o5T&@9+dk}ud<^A=h2H-q;MopO1?qf# z5f4YJyS{_#wQA?4bF0uh`+XuI&i|*A9a_P&%Em0vt%USkf{UxSBobUPP;C~!h}{d_ zvO1x|{~PPZ)=UMJYmgHGD)nqJyObA4pq`iDc=%cbfZM70ZAWWs1Y>-3w&(paeZBiK z8}}mr!k`5CZ}g|_lXkszqU6D4Kbgjs3=yH`>B0P6;o{Vm6J_O%^#;}a<$yi>u< zN$rZ+Q8cq|2m@VFenh;!H9zyP+_trn)TX|t8m88@?lhC`Hf`mv4HH^R?wdwu{TW-G(W+lHJ4T$0a4%8<_V{F~AVlU9po;#ax<8e?--Q~k9|#(d{}NbZ{!_lg;DYq+`KlGAN9 zWa6L7C-UFxFsr-ACxzp@T|E4{MY#Dm2TV9$^N0lm=ADX+l2!YP+yjPx8n81Hfoeoc z%b;zPt^+u))=q5D1Dl>eegQXFEXxX2(?zwNIs?&3XJip5Dv1bceS=8&6jyDS^j<35 zqAexEtY&4ZG$_B4MNuIT>e(XmiDLgbWdjV#iPruSZGY6tAmlrCYUD&KGaf@8il`BH1RY zq7H$W3m_3~qMr|Cg137zt@=L;NoZ(6=zkEE?^FIlYwUs`SmS^+KT<+)$MSfZlWa_G zsg8$-ZbV9<>$~(8GB&5pTmH`1m2B)*h+AA)K_rD2q*}r`Xm*fL%Rp0H8i~9eJmD3% zv4UQ)r;3lM!sMv2TvcDZcpY%uR^JqtlP*cy3uiV+&b4-$hAsOT&=Y)==(`~z=YoH2 zQHWo-xR+qX?8n++gXv2Mgp_!c5H=7B@6{nrKP>H zhJi6TP1nzt$4UAlz?NFf1x4FJ`6?r+?!(MEIQz(CbO@8mIXTJv2BWa$-{(W4J{#4XpVrvQK^tvEu3JAy!=s(8=CAI<+R!w)V}_6UkS*-i?J)8L^` zGl$1WUGmDB{0-;`2a@HU-qvpH!NP19^4vA#D*W}!MwgWuiyM3KA}8K{7M)q|7&v<3 zA*cR+KtS`+aV2Kbq8HI}kFtzRTAXDLXoM{H9*#y4q52y`l1coqMlsPr$9 z#hbVRnWh$e(~FkulhS!K<+bs4B{P8@l2Z(3)v_l~4URCYUVgk6yN!o4+P_`ffR)8(Al z-Q^dq{w}qT0qeN$K3a+Ouxe=v;NaP3V8D$kx2W^~fV#4iNT`zv5eK5RWa}p|%cPXd zBXIRP+GIM@TDIl}no&DGf2G4UphlAU1Sz^=$H;|A78IjWU0zY{Rb`TwDE>PXwXCt- zJc3Y|SY=E-*lLaLXp9ywby-h@Oq*JCi(9&Abh>FW&rBiFL z+)QTcL$W!9a(&9fuCS!lGd>1aj^T@>eu2l#ux?XfBy&N4nZBYxUwKi|r`#%yV8NHq z+#I5=S_CBrj4{Iu%HW&$CHBA*Q6cf9UX5j4lMak0H0`Vra_nsJM!|{Q2VPVKoj(5X z+O05A0G{j@)t|#}rm?*fEw;YA$XcvpLZ?GW0haTI1Qi{w{*(~YGveK<<0CZHUxcMj71SGuyZEf`?y2GNXu(4h>j<>`rLM(@ET?Pu3gz*RG_1xq zfMvbjtU(e4%CQb(K@yGJBouZz$S5;VHv%52chh3CEtS#+v^$~6$*jyE2P$JUp~X*P zTD6jX;hp8u806~)c9{l_r{$}iUV3~*!X}jd*`1EOx96fx8mBCHv*DphN@v*#o!(O; zAVqgmTM8ZELH`4-+=YVyl3XZ=zw|He%tbo;m}9G~|0Gq-IFUjlH<_g~U7u7zEic(B ztDhY2k(vCK zj>m!R2Sak~3C5k@{detVC=h)tz{_$J(7pBe;>SC7cnI+R%!>m&-1+f+&yE7#Uik?D zr~iMHyqT}PVbK(K^`U$#bE7y1c4R=7iQd%(actgX^`Q^~gx{xw0Poj4M8LzoAKxd# z^MB-Q7~t);cj>>9J3I}!YWqJ;{{PcA$=~OHhFItR@4;~&?V_K%KHGqA>p>Sl=g<3! z_|YD~HuC1WGx{fpd~|L5?$@`>ql>%4aYTL=kXChoSVh}{C)Ejd-#2W`DwHLwF_I3)28?VJDyX{XV=Bp zwZl?(-f~T8;N~ozG?XH0kb&Fr+qW$ax8qGj{g1OB;PO`wTkRPJrrXQbALp0Gt=-8l zGmq3#K$bh;W${KdorBU;T=A{>jX(FVU5~r%DPYaJeg7OF%!BoJ&<62HMdlpFpmz5c zX$Qo~LHgJ_`7vXl09Bn5>XK$c6|t;j;&-Z#n7GISI=Z?!2kbpl12p5phbfS*_}2YG zf}Omn1!u9z0=EH`2*QFd1R+!4GZsr!*DMJf7xr8t@P_o7d@6o0qC_;Lt`SR^A`X0h z?ikVSZi>ElI6!`(UlUA#I7^@vHU@NX@@pTBnNiJe=sl2_Z^pM}J-_xqfnx`vyDFWV zPkik~fe;EXf!Xj5Fn2Bz( z0Ll%lHm}R9ykKbtzGhD!b&Cwa8N#1Vfk*U<%5!fkpAI2(aYuCvo?H@>d)_2q1~95y z-#>v!voJTlSEmB9me|yYex=HkNvFn#JFlM%zfr@h8iT3u1*KKR3>zE~FsF%Au6$B~ zq}fHg7&qE9;ZEGJr$PZSWH z^5mbb6doJ6`ipKNB?gGNys+yl3gI=$!nP4)bC0vCRN z*Ss8q3QQy%B-5nXJed0UC*u9xq7^<_UbHn~e;9^A43+p8AKU1?GV)~mh&O3iB(c%c ztyqM9(noQ$-qiqOK)dFNL@`Wu7{T;?h|Jr{0WkUbe;a^W`2oLIe|LSp5XJHTyrKDg z5uef_V9KrV9Fj@l2LLKh0p05WU2AKVOFxF(w+8?*!RGhr$yKI||75Peo)K&pe8@Y9 z)h;u|^!7TSczCK2JubDTT%Bt*rQktr^w{XP;ZET9Zr+z&;{o9AzN8F*c)!*86(=@a zz4Cp^3h2IE(g38EMC$i9j*)a}#?r57ex*_n%3=uUv|KJ&Nx;B$GJIA^?s!OkaIAfuUVV+h*+dxGd6eWR5H=;eRO2mhmGez%Zk`SNSIdu+b~)PE0L z00>S5zjo=(1RNYQU~2SXLYdY2PCA6k@?BM4HRx+$#4Gs4& z0Pk+cdJ(&y40l+!hQ~5G8x8s{LGN4L$4e%0xf~f|5foUmICA?`QPc0EN|PC)i^D5X zqlpmCJ`1Pa8v1hIpC^VccGdE^j_p_|p0Zxb*Ru~=C`@p^pyv4E7IqpM!GC*+Y!c)4)q)lKcfT21(5 z1B6+2pUaBoXRE>E-&`L}o18 zzjy1lR>z;H^&`UzZ|<$59k#hOdrzL6`W0e%d0XFSB5vg24 z{}Uga*oUhyDi($v&Z|Ei-T`ALAF3e9U!MpK6gkr>&X3uY+F6cvpbi;lWhMwN7Nr`P zpgAFHBn8{JZekf4ffdNLRtz|Y)_754d}{&$-Zbn1_d6QT0{6}v2aL@k4D+q zjSLeBWO4!A@0hyd9pr8W=Op*xW-a;G$!p@y#WA|zpTem}9;U7CVup#3hSu5~3hxDn zb2@wYnz`+P@z;i*3(D)5AM;@dQ~eox_mYZ6eo=LsPm$fvjLf{cxk!N>;lqh#^L5Fh z&V43XYi<<_)=FbrBcQuKSw?;KCJP^joDeF1zY7gEurXY*4ifBZn-2|1SsZCTUr~3T zsg$dY7NaqrDy#{RJmCUoKPE;Etg!?7wT}HRlA&3l;>nbIw0?MdEtp4=(;sTy1y^l$ zGXpxIOulZjESf;URReAEiCOOo+)kwHLAD}@WFbtp;n(>?NT=74`)8X`Q6g{40|&o$c$M) zyu&V>+|By47+eA=+AR}zMQ{l<@PMzdP`MWlNsoQq;cFc3X@O(HHF|qzb`!=h8AmqV zh2qSOz7)=fPc{I!OO#{6w2%FlH0{uh{Vgs;hj>7TR_S#!NGZ zq&zj$D0%#3^FEqzP~KYkx(j)-GWGFfH?Hcbt+a269tNszFC2hih2uaD3zkbIP$p`5 z9F9+o3){?+Hr?#sHBDRzz*I~1Zh#c~*Frf+bKj&&vQ;w}T=sa3nL)qHt)H1c;WX`B z*5*+<+GACj0mgyz?0p>Z{Ey5Jbg+4CH$p{K+LY+FN}Hy*JU2gvJmS=xo0n8YlzUb6 zLt>c)`6wkgnSczx25Kw9)*hTjy@0az5T=JcxZVycV$Mb}U!yN_HjZixBMz4fmfUy; zq9#oFEf`4Ly)ADC$fz2}JwBnwWvgZxw3UBZ*Z47T*ac5YItd1T!0)~?QRn5(1zy$p zS`id`=dR->i81Gz%o2iDzoix$HYXi#B_u2qofj{I6)$;z1z`{aZ&5oyxmh2vfYUUC zWiueZjfzsB*KZHA5_VwskfD3;?Z^?|WPq0Qvk`T#P95!T;2JyGyDL7Ebl8hjK zq<-Xf40yVKbIJnjuDM@-^%5K*Q*pMh4$C{cBDsxmPQs8VrKxycCsakV-!!Mbo zn$sBE1{@Ryo=|Yn2=Q6oa|1AQ=u|4PrWM6B4y(T@&+I{mn66AbXc;10(Y?A=K`Yj# z7kruRh32^{tiJR%`4q}}@v;F;fQ!u_L@!7}U!HyugBr(7Fjlz<+OX(U(Nq94uuF49 z^osMsKlKX7bdiy&`19i7Cwo8MahN4wANh|Gl}cRySxwT{72+D*jJRCw z$W81E+=Jsk5;|I=N9+iEALTSgD_9iUo4Y{rTd~q_Yq7Ycc6T^l@xyuftAI^v=0=@Wb+@YAW-m=UlLHiAhX7TT*svPSC! zI)%JyJIforrHA94w7rq{nJwGcGO|C;GctYV9s;mOi@5nbJE$ zAsCQ{Q0U|efnAhPKK1RsNEtP`#-UWoiAnC0P&MJfBhJH9o!zjGVHrV+=*Si0xR4u0 z`zTo@j@s@DG;OjU8Zj6s)6_3@4O3P=pqdLD)|RG)`3`M#B^^na=9ZvalG3nwo%Q?A z3YOJb7eWr!f>z`0gzhRTu;XA4e=LpzQuVFv~8Z#Azh^x>`d)c&M!-^a@%0 zjxU;OmIVH=Wi(D~XFq3+Y3%r}Rt5S3DPbd$35Qbh1b43r7c~*PDPZpC#UW(@J}ruWxfOyrK@>ATP&?udN0#h_w2(1ur}B1#ro0;kMb*@Y3i9 zzOd>f%9d>HAx&*J>#(&_>yU`rS^Gk;N>M7RE+(AdNp`&E^0k|1T8Bg=NEdNc+P)Vy zG!Wab@2|nAOx|BO?130Yy1ZBCDPwLkVKmTi8d)^Za3OUS)}URIM6flu*gu8UG&(7- zO-(OS*==jwt*?#;$;-{QHOSs%J9KuF%$4g8?&aEVZhERf&LYJa_p@;%hax_T)rsSN zrX4Af$%Abr5{Pp{aCe4(2^uKvKxVIl&6KRGR@w@T(E!gZgb6$uGZ_z(h<+as{Z093sqM zMjW99;8Kcr9;sdzArQQ8au)h^8mjSeygkhWg_GxTLtgMVBPZghoex1-GC?>k7O`^)`9MI^EMb!wsSu-R=B(N0Bg2PDsqZ>Fj4Fo&FGSZT`elMR(&|oG zAd{50ei@sI?{+&LIPR>)S_|58a$XDU{?-Jq$%=M6#EdC-bTjnZ*t@uBLf+SEvH(%S z%rm`2lxiWq^#uk)#Wuz}cEseNjhH{(ehg@sTea`OfS)o+5vH+6R*SP%{XGc{EB`xs zAv+b<{<~dhXIu`NDe`-B1A3ioTZwZ$JF~5QRG&)2oSthJ2%?rnQhqsYW6)te7>OtkEJbwzcvvJZ0HYo%J!g6WyOqPH!W3`%7wQ?F`6UL_eSf2M1 zkr?S(-1wEGqT$XM*a-4|!EO3LWX$|Ks)fIcYBc4z?{%rMT<>4I1vfrC(DuMkmCw$( zY+%;IS!8GCL=P2TZ?1wl~9>UHAc1v7 zS&O3CX{B)j*Qw1P9R((hTA_c+(sM`$m9pAswtM=+QmN@+q{*&3hO|kV($Oap?k6Bz zI2ge1tKDW)tEMtw%chD5r}EIB*Be6>#F$`(Kozs1>F^mfnZsyVYq(BTM)F&)hwKex z(ugAQEZ+Ap4sr*PaqWbSqsj0$QIo|bslH8aXzgCsSd=6xvELRi1o6OG>wsn{*i6w- zi4PZ4gnN{f)NX?KB77ho1I%<$*A; z@}^OC0I>5JUiae}`ST1g+jy371m;-(Ve|Y1_NAuFnsnR4)7<%Rq-xW3KXXc@n`s!< zXjvQnoM||guCxB3ir3Ml=84`}&6#f}|ElWcy!Jyp12{GR11!Gzc_rUGGdu&vd3`dk z`SadfcK9iFGx|zSo1{^bGn}m|UBI~@udQEnk{2Q!^^*2w`En^9`Y_0zp@Jp6Rf&Kz?C@XoV9b$fob#QXK zbRaP(8BU;7K=xf2k?w=_olIth`!ox^RQ?_Ml2|iX-1tNyR*(Q`7Oyeg+uxx-$Q?xf zh6Ey#gxJ^7?q)ujgyh6AGZ@Qx>+2*}+4hGYWbq}*GT|nSa2aERx19ZlcOzxvU2jXXxkkk`x02p< zGq-2Ga$06Hsj?lczXx*D9^|s@dPU01GDyyRswF}iUY2liXdX_3*LK6rvtEXEH?Gz- zY|8sXWBaubqCvRz^VNTcW2GDW0IV6pIgp53i%7(pS$F%CdKXhO^H+t6OwNUVtort{ zAX)@`^@Ck&u}YTA->R7Oyg`1jq6=Q+ZVatpu=O==xmFN|sC{sE64|Ff5Six$J+LAx z*m6v$b$sSLfSCa9qVXA508mTQ7Y)v77rAlNZT4*$NIRZ>i4O~CQY;pca|xOJt6*K2 zXr##u7IcfdhRip2@nG`3!lF2l-5Iu9H~ZVKBKNYz`2*{Pt4Zx8JBh?ZmRK1Z57oy^ zGaFf&!KY8=B*dw&9YuMe*v5a@;0r{b;R{)Rw;ko)MbH zQ3742WQ;no16iHIEmxEF(^wG=0{6kBdvdMO@#aY^28~Pb!FK*$Sg|&w(|qMZLX6}(=xdv|wkZ+KZ}wy5rGwiGa9TF2*U-JQk=J7fEMkHd#jg^7+ZYHR z62E_-?E6FU9|}R#P%nM;9jH?wg1xyM6L= z`nw@fN}?TyUWWQFiVDvKin=mG2<4 zF|VqzM1IlV`C-a~P>$4z^UUc^eawHP4?+ZTal?)sOH|lGThW>wn2iu0jfUf`+q*35 z7rQ`)%dGh$4tu!tI1svCkN1}E`Y&F7cJtVdBQV4Olu4HfLIye{_ZjU37B=rH?+L5I zidV@Z>R|I%wSCd{(8S;6_Z`uN8$HBK^Y4_<+A5-*>9D0nX^9n)>~G40txFp*s4$a}s?aYnZbqQ6v5yvmzL34wE{Tm>MDv7FOJ?9*LUz$1CC`pkFj2kq+xf%T-Y@ zX8MD}v2hQ(1@L13nJFZ*@llAwoU?T5Y2_a*HxZ-?-@=feYl zzfKY}t)Hy7z+pz2xM6!1<&16ou{s$3q&_n|?_bD2cxdnILf3tMl97LbwvJ;CK8-56 zr?jybf^(DyKpVf}F|lt)nRRFxPkfue3(ri9wwv)MQ-hB0(5ZxI(jbamV_y15qn0Ut zEuS`1>{>>}9{y6A*+II4bx!;v+nma6gQK@kLL!Rl0{B!8D=?9@>Ar~T7HMF}YF~61 z34Sq&A8*z3Qe=ikFNRptnuMu@< zW`&Ugx1jqoruFY*T|dKX(=OAU;G;E+Mi)Poft{bNChMh`W;M zbA1`IDoClzx6$zf=b~hK(s6_8QY{H3xk*S|kHY;!aoXYqvCGMRLsMbCliL0=H}%R) zA;lYSmRyisBSa{4D~C*QWzWU7uuPS}?w}gPu)?y@(a?eySExh+RP~TfHzCsHoQW8K&+|p1bpsO9sI!N#>!l1+)ZF>db4!Aj^npxOU(r`8B!(LrpIM=+$oNxW9>W zWAyhX&cdKhz3DDt@~__1Agp4uUN z+=N8}mNoRW{*C}Not}5&?otl@s5ZYP3wp1`pFTN>2TW1;rqB_s35KtIz`-t@)l?;N zJ_0I~Px4Srk3&EYmHvH96yoDgV6h0e5&g`AyX*KByPQD~AXfmelBSuJdh~OtIK2LW=2_;U zuj__MH$Siag{Rl>3L5pnAZCzvBDO%|32sBR={NYQ$17BzF#{neH%t_pgs9>tv!IK2 zOgn*L!gS~Cuh;jy)5W&~SiSow+9rIC1AKkIPS1YS#*JZU=)C*tSdth|()ef>#T zuMZZy5$)G^$I^b-i9=;dZ;$STY~T_R4?2Wr*!Yw$+23!~Rs8yc5jHN~&@P&qJOXhQ z57FOj7Q4xixeAvVSmiI;?;$ddfnuU{LB}1;s|aJAgLFX0&B|s0Plyx6%ZAqL+h%Dl z+j)ydKe-=8R0NWCy%?Jdl~QCeYGH|FH~Fl>i4WJGXp+2OTL8JF^wwThANLWkB?A{QQ^+v~1cF!(1rA#opU+7FZ*`iB= z;Y?@2jTKVX2gT}m3XVxTGvEnIog0HR)uJnWuGkV>1ZGz5ptT=_t3%tPF7sb>npC{qO3B`VI z49sx`ODIsBA?yg$c%uB&yvIPwLaK9c;qM-3GB$0~IoQzG@bAFmzEGo};9=}^wjY+~ z5mrGl#7U8^YPg{h>JlP~6n*i%6r$K<>*V8c0lZ}H?SJ#@mjgdgI-9tbZC&{|>p2B4 z{p@|#7}g9zp2*RK+AVOBVmJPLmDm2mc4BY#WV1VT3mTfbbaEL`il$Z3+9%#w^7$ZO z55L8u9FZ>{z&1I3lvuUrgnhlSVg22U1Q?E_xPQGy9oagtXV~!2#f&g4+mT@1>Z`f1 zw@RhJCpz8KH=@Q6{&zx^`$⩔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 z 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%0Ah>e{xu*0jTw>NP;8AM+h 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%0D;17v@(eHa4auw!eB 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�#aV$1b^SXt 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 B@ZJCb diff --git a/packages/typescript-edit-benchmark/package.json b/packages/typescript-edit-benchmark/package.json index 8ec81cceb..f286c6020 100644 --- a/packages/typescript-edit-benchmark/package.json +++ b/packages/typescript-edit-benchmark/package.json @@ -26,7 +26,8 @@ "test": "bun test --parallel", "fix": "biome check --write --unsafe .", "fmt": "biome format --write .", - "generate": "bun run src/generate.ts --typescript-dir /tmp/pi-mono-source --count-per-type 4" + "generate": "bun run src/generate.ts --typescript-dir /tmp/pi-mono-source", + "edit-shapes": "bun run src/edit-shape-stats.ts" }, "dependencies": { "@babel/generator": "catalog:", diff --git a/packages/typescript-edit-benchmark/src/edit-shape-stats.ts b/packages/typescript-edit-benchmark/src/edit-shape-stats.ts new file mode 100755 index 000000000..1b724deff --- /dev/null +++ b/packages/typescript-edit-benchmark/src/edit-shape-stats.ts @@ -0,0 +1,317 @@ +#!/usr/bin/env bun +/** + * Measure the empirical shape of real agent edits from session logs. + * + * Scans session JSONL files for successful `edit`/`apply_patch` tool calls and + * parses the diff in each tool result (both the numbered ` NNN|` format and + * unified `@@` diffs) into change runs — maximal runs of `-`/`+` rows with no + * context row between them — so unchanged context never counts as changed and + * every run counts as its own hunk. + * + * Shapes are reported at two levels: + * - per tool call — one sample per edit call; + * - per user request — all edit calls between one user message and the next + * grouped into one sample (one benchmark fixture ≙ one prompt, and the + * runner allows multiple edit calls per prompt). Retried/overlapping edits + * within a request are summed, so request sizes lean high, and a request + * spans every file a long agentic turn touched — an upper bound for + * single-file fixtures. + * + * Parse coverage is printed so a format skew cannot silently bias the numbers. + * Reference measurement (2026-07, 2,000 newest sessions against this repo, + * 99.9% coverage): + * + * per request: changed lines: 1 → 6% 2-5 → 11% 6-20 → 20% 21-60 → 25% 61+ → 39% + * hunks: 1 → 11% 2 → 8% 3+ → 81% (median 40 changed lines) + * per call: changed lines: 1 → 23% 2-5 → 30% 6-20 → 29% 21-60 → 14% 61+ → 5% + * hunks: 1 → 48% 2 → 21% 3+ → 31% (median 5 changed lines) + * op mix (both levels): replace 55% insert 32% delete 12% + * + * `generate.ts` fixtures are single-file, single-prompt tasks: the suite is + * calibrated to sit between the two levels — per-call shapes for token fixes, + * request-leaning shapes (large blocks, multi-hunk composites) for the rest. + */ +import * as fs from "node:fs/promises"; +import * as path from "node:path"; +import { parseArgs } from "node:util"; +import { computeDefaultSessionDir } from "@oh-my-pi/pi-coding-agent/session/session-paths"; +import { FileSessionStorage } from "@oh-my-pi/pi-coding-agent/session/session-storage"; + +const EDIT_TOOL_NAMES: Record = { edit: true, apply_patch: true }; +const SIZE_BUCKETS: Array<[string, number]> = [ + ["1", 1], + ["2-5", 5], + ["6-20", 20], + ["21-60", 60], + ["61+", Number.POSITIVE_INFINITY], +]; + +/** One maximal run of removed/added rows with no context row in between. */ +interface ChangeRun { + oldCount: number; + newCount: number; +} + +interface Args { + sessionsDir: string; + maxSessions: number; +} + +function parseArguments(): Args { + const { values } = parseArgs({ + options: { + "sessions-dir": { type: "string" }, + repo: { type: "string", default: path.resolve(import.meta.dir, "../../..") }, + "max-sessions": { type: "string", default: "2000" }, + }, + }); + const repo = path.resolve(values.repo ?? "."); + return { + sessionsDir: values["sessions-dir"] ?? computeDefaultSessionDir(repo, new FileSessionStorage()), + maxSessions: parseInt(values["max-sessions"] ?? "2000", 10), + }; +} + +const ROW_PIPE_RE = /^([ +-])\s*\d+\|/; +const ROW_SPACE_RE = /^([ +-])\s*\d+( |$)/; + +/** Collects change runs; a context row or elision closes the current run. */ +class RunCollector { + runs: ChangeRun[] = []; + #current: ChangeRun | null = null; + + mark(kind: string): void { + if (kind === " ") { + this.flush(); + return; + } + this.#current ??= { oldCount: 0, newCount: 0 }; + if (kind === "-") this.#current.oldCount++; + else this.#current.newCount++; + } + + flush(): void { + if (this.#current && (this.#current.oldCount > 0 || this.#current.newCount > 0)) { + this.runs.push(this.#current); + } + this.#current = null; + } + + finish(): ChangeRun[] | null { + this.flush(); + return this.runs.length > 0 ? this.runs : null; + } +} + +/** + * Parse the numbered diff format emitted in edit tool-result details + * (` NNN|context`, `-NNN|removed`, `+NNN|added`; older space-delimited rows). + * Elisions appear as blank rows or `...` rows. Returns null when any row is + * unparseable. + */ +function runsFromNumberedDiff(diff: string): ChangeRun[] | null { + const lines = diff.split("\n"); + const usesPipe = lines.slice(0, 10).some(line => ROW_PIPE_RE.test(line)); + const collector = new RunCollector(); + for (const line of lines) { + const row = ROW_PIPE_RE.exec(line) ?? (usesPipe ? null : ROW_SPACE_RE.exec(line)); + if (row) { + collector.mark(row[1]); + } else if (line.trim() === "" || line.trim() === "..." || line.trim() === "…" || line.trim().endsWith("|...")) { + collector.flush(); + } else { + return null; + } + } + return collector.finish(); +} + +/** + * Parse a unified diff (standard `@@ -a,b +c,d @@` hunks or anchor-style `@@` + * headers): `-` old, `+` new, leading space or blank = context. + */ +function runsFromUnifiedDiff(diff: string): ChangeRun[] | null { + const collector = new RunCollector(); + for (const line of diff.split("\n")) { + if (line.startsWith("@@")) { + collector.flush(); + } else if (line.startsWith("--- ") || line.startsWith("+++ ") || line.startsWith("Index:")) { + // File headers. + } else if (line.startsWith("-") || line.startsWith("+")) { + collector.mark(line[0]); + } else if (line.startsWith(" ") || line === "") { + collector.mark(" "); + } else { + return null; + } + } + return collector.finish(); +} + +/** Parse a tool-result diff in whichever format it uses. */ +function runsFromDiff(diff: string): { runs: ChangeRun[] | null; format: "numbered" | "unified" } { + const head = diff.trimStart(); + if (head.startsWith("@@") || head.startsWith("--- ")) { + return { runs: runsFromUnifiedDiff(diff), format: "unified" }; + } + return { runs: runsFromNumberedDiff(diff), format: "numbered" }; +} + +/** Per-session parse results: change runs per edit call and per user request, plus coverage counters. */ +interface SessionScan { + edits: ChangeRun[][]; + /** All edit-call runs between one user message and the next, concatenated. */ + requests: ChangeRun[][]; + formats: Map; + skipped: number; +} + +/** Extract change runs for every successful edit in one session JSONL file. */ +async function collectSessionEdits(sessionFile: string): Promise { + const scan: SessionScan = { edits: [], requests: [], formats: new Map(), skipped: 0 }; + const stream = Bun.file(sessionFile).stream(); + const decoder = new TextDecoder(); + let buffer = ""; + let currentRequest: ChangeRun[] = []; + + const flushRequest = (): void => { + if (currentRequest.length > 0) scan.requests.push(currentRequest); + currentRequest = []; + }; + + const handleRecord = (record: unknown): void => { + if (!record || typeof record !== "object") return; + const rec = record as Record; + if (rec.type !== "message" || !rec.message || typeof rec.message !== "object") return; + const message = rec.message as Record; + // A user message starts a new request; everything until the next one + // belongs to the same prompt (one benchmark fixture ≙ one request). + if (message.role === "user") { + flushRequest(); + return; + } + if (message.role !== "toolResult" || !EDIT_TOOL_NAMES[String(message.toolName)] || message.isError) return; + const details = + message.details && typeof message.details === "object" + ? (message.details as Record) + : undefined; + const diff = details && typeof details.diff === "string" ? details.diff : null; + const op = details && typeof details.op === "string" ? details.op : null; + if (!diff || (op && op !== "update")) return; + const { runs, format } = runsFromDiff(diff); + if (runs) { + scan.edits.push(runs); + currentRequest.push(...runs); + scan.formats.set(format, (scan.formats.get(format) ?? 0) + 1); + } else { + scan.skipped++; + } + }; + + for await (const chunk of stream) { + buffer += decoder.decode(chunk, { stream: true }); + const parsed = Bun.JSONL.parseChunk(buffer); + for (const value of parsed.values) handleRecord(value); + buffer = buffer.slice(parsed.read); + } + for (const value of Bun.JSONL.parse(`${buffer}\n`)) handleRecord(value); + flushRequest(); + return scan; +} + +function sizeBucket(changedLines: number): string { + for (const [label, max] of SIZE_BUCKETS) { + if (changedLines <= max) return label; + } + return SIZE_BUCKETS[SIZE_BUCKETS.length - 1][0]; +} + +function printDistribution(title: string, counts: Map, order?: string[]): void { + const total = [...counts.values()].reduce((a, b) => a + b, 0); + const keys = order ?? [...counts.keys()].sort(); + console.log(title); + for (const key of keys) { + const count = counts.get(key) ?? 0; + console.log(` ${key.padEnd(6)} ${String(count).padStart(6)} ${((count / total) * 100).toFixed(1)}%`); + } +} + +async function main(): Promise { + const args = parseArguments(); + const sessionFiles = (await fs.readdir(args.sessionsDir)) + .filter(name => name.endsWith(".jsonl")) + .sort() + .reverse() + .slice(0, args.maxSessions > 0 ? args.maxSessions : undefined) + .map(name => path.join(args.sessionsDir, name)); + console.log(`Scanning ${sessionFiles.length} session files in ${args.sessionsDir}`); + + interface ShapeCounters { + sizes: Map; + hunks: Map; + ops: Map; + changed: number[]; + } + const newCounters = (): ShapeCounters => ({ sizes: new Map(), hunks: new Map(), ops: new Map(), changed: [] }); + const accumulate = (counters: ShapeCounters, runs: ChangeRun[]): void => { + const changed = runs.reduce((sum, run) => sum + Math.max(run.oldCount, run.newCount), 0); + counters.changed.push(changed); + counters.sizes.set(sizeBucket(changed), (counters.sizes.get(sizeBucket(changed)) ?? 0) + 1); + const hunkKey = runs.length >= 3 ? "3+" : String(runs.length); + counters.hunks.set(hunkKey, (counters.hunks.get(hunkKey) ?? 0) + 1); + for (const run of runs) { + const op = run.oldCount === 0 ? "insert" : run.newCount === 0 ? "delete" : "replace"; + counters.ops.set(op, (counters.ops.get(op) ?? 0) + 1); + } + }; + const report = (label: string, counters: ShapeCounters): void => { + counters.changed.sort((a, b) => a - b); + const median = counters.changed[Math.floor(counters.changed.length / 2)] ?? 0; + console.log(`\n=== ${label}: ${counters.changed.length} samples, median changed lines: ${median}`); + printDistribution( + "changed lines:", + counters.sizes, + SIZE_BUCKETS.map(([bucketLabel]) => bucketLabel), + ); + printDistribution("hunks:", counters.hunks, ["1", "2", "3+"]); + printDistribution("op mix:", counters.ops, ["replace", "insert", "delete"]); + }; + + const perCall = newCounters(); + const perRequest = newCounters(); + const formatCounts = new Map(); + let skipped = 0; + + let next = 0; + const workers = Array.from({ length: 16 }, async () => { + while (next < sessionFiles.length) { + const file = sessionFiles[next++]; + const scan = await collectSessionEdits(file).catch( + (): SessionScan => ({ edits: [], requests: [], formats: new Map(), skipped: 0 }), + ); + skipped += scan.skipped; + for (const [format, count] of scan.formats) { + formatCounts.set(format, (formatCounts.get(format) ?? 0) + count); + } + for (const runs of scan.edits) accumulate(perCall, runs); + for (const runs of scan.requests) accumulate(perRequest, runs); + } + }); + await Promise.all(workers); + + if (perCall.changed.length === 0) { + console.error("No parseable edits found."); + return 1; + } + const parsedTotal = [...formatCounts.values()].reduce((a, b) => a + b, 0); + const coverage = parsedTotal + skipped > 0 ? parsedTotal / (parsedTotal + skipped) : 0; + const formatSummary = [...formatCounts.entries()].map(([format, count]) => `${format}=${count}`).join(", "); + console.log( + `\nParse coverage: ${parsedTotal}/${parsedTotal + skipped} diff results (${(coverage * 100).toFixed(1)}%; ${formatSummary})`, + ); + report("per user request (calibration target)", perRequest); + report("per tool call", perCall); + return 0; +} + +process.exit(await main()); diff --git a/packages/typescript-edit-benchmark/src/generate.ts b/packages/typescript-edit-benchmark/src/generate.ts index 96ddf71d7..d970ac0a5 100644 --- a/packages/typescript-edit-benchmark/src/generate.ts +++ b/packages/typescript-edit-benchmark/src/generate.ts @@ -12,20 +12,38 @@ * - Dense code: Minimal whitespace makes context harder to read * - Deep nesting: Whitespace-sensitive edits at high indent levels * - * Difficulty modes control both FILE SELECTION and PROMPT DETAIL: - * - easy: Short files, unique lines, line number given - * - medium: Medium files, function context given + * Difficulty modes control both FILE SELECTION and PROMPT DETAIL. Every prompt + * fully determines the byte-exact fix (before/after blocks, validated by + * re-solving them against the expected output); tiers vary how much locating + * the model must do: + * - easy: Short files, unique lines, exact line number given + * - medium: Medium files, containing function given * - hard: Long files with similar blocks, no location hint - * - nightmare: Long files where target line repeats, minimal info + * - nightmare: Long files where nearly identical regions repeat, no location hint */ import * as fs from "node:fs"; import * as path from "node:path"; import { parseArgs } from "node:util"; -import { TempDir } from "@oh-my-pi/pi-utils"; +import { prompt, TempDir } from "@oh-my-pi/pi-utils"; import { $ } from "bun"; import { diffLines } from "diff"; import { formatContent } from "./formatter"; +import { + commonPrefixLength, + commonSuffixLength, + LANGUAGE_BY_EXTENSION, + mergeNearbyPlacements, + type Placement, + pickFence, + placementsFromDiff, + type RenderedHunk, + renderHunks, + solveRenderedHunks, +} from "./hunks"; import { ALL_MUTATIONS, CATEGORY_MAP, type Mutation, type MutationInfo } from "./mutations"; +import identifierTaskTemplate from "./prompts/identifier-task.md" with { type: "text" }; +import mutationTaskTemplate from "./prompts/mutation-task.md" with { type: "text" }; +import structuralTaskTemplate from "./prompts/structural-task.md" with { type: "text" }; const SUPPORTED_EXTENSIONS = new Set([".js", ".jsx", ".ts", ".tsx"]); using DEFAULT_SOURCE_REPO_DIR = TempDir.createSync("@pi-mono-source"); @@ -64,6 +82,7 @@ interface CaseResult { filePath: string; formattedMutatedContent: string; formattedOriginalContent: string; + prompt: string; difficulty: Difficulty; difficultyScore: number; } @@ -71,7 +90,7 @@ interface CaseResult { interface Args { typescriptDir: string; output: string; - countPerType: number; + countScale: number; seed: number; categories: string | null; difficulty: string; @@ -84,7 +103,7 @@ function parseArguments(): Args { options: { "typescript-dir": { type: "string", default: DEFAULT_SOURCE_REPO_DIR.path() }, output: { type: "string", default: DEFAULT_OUTPUT }, - "count-per-type": { type: "string", default: "20" }, + "count-scale": { type: "string", default: "1" }, seed: { type: "string", default: "42" }, categories: { type: "string" }, difficulty: { type: "string", default: "easy,medium,hard,nightmare" }, @@ -96,7 +115,7 @@ function parseArguments(): Args { return { typescriptDir: values["typescript-dir"] ?? DEFAULT_SOURCE_REPO_DIR.path(), output: values.output ?? DEFAULT_OUTPUT, - countPerType: parseInt(values["count-per-type"] ?? "20", 10), + countScale: Number.parseFloat(values["count-scale"] ?? "1"), seed: parseInt(values.seed ?? "42", 10), categories: values.categories ?? null, difficulty: values.difficulty ?? "easy,medium,hard,nightmare", @@ -105,6 +124,59 @@ function parseArguments(): Args { }; } +/** Target changed-line range for a generated case. */ +type SizeRange = [number, number]; + +/** + * Per-mutation case counts and changed-line targets, calibrated against the + * empirical edit-shape distribution measured from real agent sessions + * (`edit-shape-stats.ts`): 1 → 27%, 2-5 → 30%, 6-20 → 26%, 21-60 → 13%, + * 61+ → 4%. Token-level mutations supply the 1-line mass; small structural and + * multi-site mutations the 2-5 band; block-level mutations cycle through the + * larger bands via `sizes`. + */ +interface MutationPlan { + count: number; + sizes?: SizeRange[]; +} + +const BLOCK_SIZES: SizeRange[] = [ + [6, 20], + [6, 20], + [21, 60], + [6, 20], + [21, 60], + [6, 20], + [61, 150], + [21, 60], +]; + +const MUTATION_PLANS: Record = { + "swap-comparison": { count: 2 }, + "swap-equality": { count: 2 }, + "swap-logical": { count: 2 }, + "remove-negation": { count: 2 }, + "swap-increment-decrement": { count: 2 }, + "swap-arithmetic": { count: 2 }, + "flip-boolean": { count: 2 }, + "remove-optional-chain": { count: 2 }, + "swap-call-args": { count: 2 }, + "swap-nullish": { count: 2 }, + "swap-regex-quantifier": { count: 2 }, + "unicode-hyphen": { count: 2 }, + "off-by-one": { count: 2 }, + "swap-adjacent-lines": { count: 6 }, + "duplicate-line-flip": { count: 6 }, + "identifier-multi-edit": { count: 8 }, + "swap-if-else": { count: 6 }, + "wrap-redundant-if": { count: 12, sizes: BLOCK_SIZES }, + "swap-sibling-blocks": { count: 12, sizes: BLOCK_SIZES }, + "duplicate-block": { count: 6, sizes: BLOCK_SIZES }, + "move-distant-block": { count: 14, sizes: BLOCK_SIZES }, + "remove-case-label": { count: 8 }, + "composite-multi-edit": { count: 14 }, +}; + async function ensureSourceRepo(typescriptDir: string): Promise { if (fs.existsSync(typescriptDir)) { const packagesDir = path.join(typescriptDir, "packages"); @@ -378,69 +450,295 @@ function recordRegion(usedLines: Map, filePath: string, lineNu usedLines.set(filePath, used); } +function escapeRegExp(value: string): string { + return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); +} + +/** Where a bug sits for medium prompts: containing function, else file-third region. */ +function locateBug( + content: string, + lineNumber: number, + lineCount: number, +): { functionName?: string; region?: "top" | "middle" | "end" } { + for (const [name, start, end] of findFunctionRanges(content)) { + if (lineNumber >= start && lineNumber <= end) return { functionName: name }; + } + const ratio = lineCount > 0 ? lineNumber / lineCount : 0; + return { region: ratio < 0.33 ? "top" : ratio < 0.66 ? "middle" : "end" }; +} + +/** + * Rename-style prompt for identifier-multi-edit: names the misspelled and + * correct identifiers so "replace every occurrence" admits exactly one + * byte-exact answer. Returns null when a plain word-boundary rename does not + * reproduce the expected file (e.g. the misspelling collides with other text). + */ +function buildIdentifierPrompt( + filePath: string, + info: MutationInfo, + difficulty: Difficulty, + input: string, + expected: string, +): string | null { + const pair = info.identifier; + if (!pair) return null; + const wordRe = new RegExp(`(? { + if (wordRe.test(line)) affectedLines.push(index + 1); + wordRe.lastIndex = 0; + }); + if (affectedLines.length === 0) return null; + + return prompt.render(identifierTaskTemplate, { + filename: path.basename(filePath), + correct: pair.correct, + misspelled: pair.misspelled, + count: affectedLines.length, + affectedLines: difficulty === "easy" ? affectedLines : undefined, + }); +} + +/** Mutations whose fixtures read as natural instructions instead of raw before/after patches. */ +type StructuralKind = + | "case-label" + | "duplicate-block" + | "move-block" + | "wrap-if" + | "swap-blocks" + | "swap-lines" + | "swap-if-else"; + +const STRUCTURAL_KINDS: Record = { + "remove-case-label": "case-label", + "duplicate-block": "duplicate-block", + "move-distant-block": "move-block", + "wrap-redundant-if": "wrap-if", + "swap-sibling-blocks": "swap-blocks", + "swap-adjacent-lines": "swap-lines", + "swap-if-else": "swap-if-else", +}; + +function countTrimmedLine(lines: string[], needle: string): number { + let count = 0; + for (const line of lines) { + if (line.trim() === needle) count++; + } + return count; +} + +/** Whether a line is a usable prose anchor (contains an identifier, not just punctuation like `);`). */ +function isAnchorLine(line: string): boolean { + return /[A-Za-z_$]{2,}/.test(line); +} + +function firstNonEmptyTrimmed(lines: string[]): string { + for (const line of lines) { + const trimmed = line.trim(); + if (trimmed) return trimmed; + } + return ""; +} + +/** A placement reduced to its changed core (shared context trimmed away). */ +function trimPlacement( + inputLines: string[], + placement: Placement, +): { start: number; oldCore: string[]; newCore: string[] } { + const old = inputLines.slice(placement.start, placement.start + placement.oldLen); + const fresh = placement.newLines; + const prefix = commonPrefixLength(old, fresh); + const suffix = commonSuffixLength(old, fresh, Math.min(old.length, fresh.length) - prefix); + return { + start: placement.start + prefix, + oldCore: old.slice(prefix, old.length - suffix), + newCore: fresh.slice(prefix, fresh.length - suffix), + }; +} + +/** Nearest non-blank line trimmed, scanning from `index` in `direction`. */ +function nearestVisibleLine(lines: string[], index: number, direction: 1 | -1): string { + for (let i = index; i >= 0 && i < lines.length; i += direction) { + const trimmed = lines[i].trim(); + if (trimmed) return trimmed; + } + return ""; +} + +/** + * Derive instruction data for a structural mutation from its placements. + * Every referenced anchor line is validated to occur exactly the expected + * number of times, so the instruction identifies a unique edit; returns null + * when the instruction would be ambiguous (the caller then rejects the + * candidate and retries — structural kinds never ship raw-patch fallbacks). + */ +function structuralPromptData( + kind: StructuralKind, + inputLines: string[], + placements: Placement[], +): Record | null { + const cores = placements.map(placement => trimPlacement(inputLines, placement)); + const visible = (lines: string[]): string[] => lines.filter(line => line.trim() !== ""); + + switch (kind) { + case "case-label": { + if (cores.length !== 1) return null; + const { start, oldCore, newCore } = cores[0]; + const added = visible(newCore); + if (visible(oldCore).length !== 0 || added.length !== 1) return null; + const label = added[0].trim(); + const before = nearestVisibleLine(inputLines, start + oldCore.length, 1); + if (!label.startsWith("case") || !(before.startsWith("case") || before.startsWith("default"))) return null; + if (countTrimmedLine(inputLines, before) !== 1) return null; + return { label, before }; + } + case "duplicate-block": { + if (cores.length !== 1) return null; + const { oldCore, newCore } = cores[0]; + if (visible(newCore).length !== 0 || visible(oldCore).length === 0) return null; + const head = firstNonEmptyTrimmed(oldCore); + if (!head || countTrimmedLine(inputLines, head) !== 2) return null; + return { head }; + } + case "move-block": { + if (cores.length !== 2) return null; + const insert = cores.find(core => visible(core.oldCore).length === 0); + const remove = cores.find(core => visible(core.newCore).length === 0); + if (!insert || !remove || insert === remove) return null; + if (visible(remove.oldCore).join("\n") !== visible(insert.newCore).join("\n")) return null; + const head = firstNonEmptyTrimmed(remove.oldCore); + const destination = nearestVisibleLine(inputLines, insert.start + insert.oldCore.length, 1); + const currentPrev = nearestVisibleLine(inputLines, remove.start - 1, -1); + if (![head, destination, currentPrev].every(isAnchorLine)) return null; + for (const anchor of [head, destination, currentPrev]) { + if (countTrimmedLine(inputLines, anchor) !== 1) return null; + } + return { head, destination, currentPrev }; + } + case "wrap-if": { + if (cores.length !== 1) return null; + const { start, oldCore } = cores[0]; + const relative = oldCore.findIndex(line => line.trim() === "if (true) {"); + if (relative < 0) return null; + return { wrapperLine: start + relative + 1 }; + } + case "swap-blocks": + case "swap-lines": { + const merged = mergeNearbyPlacements(inputLines, placements, 2); + let firstHead = ""; + let secondHead = ""; + if (merged.length === 1) { + const { oldCore, newCore } = trimPlacement(inputLines, merged[0]); + firstHead = firstNonEmptyTrimmed(oldCore); + secondHead = firstNonEmptyTrimmed(newCore); + } else if (cores.length === 2) { + // jsdiff renders `A,B -> B,A` as insert-A-before-B plus delete-A-after-B, + // with all of B as unchanged context in between; match the moved body. + const insert = cores.find(core => visible(core.oldCore).length === 0); + const remove = cores.find(core => visible(core.newCore).length === 0); + if (!insert || !remove || insert === remove) return null; + if (visible(remove.oldCore).join("\n") !== visible(insert.newCore).join("\n")) return null; + secondHead = firstNonEmptyTrimmed(insert.newCore); + firstHead = nearestVisibleLine(inputLines, insert.start + insert.oldCore.length, 1); + } else { + return null; + } + if (!firstHead || !secondHead || firstHead === secondHead) return null; + if (!isAnchorLine(firstHead) || !isAnchorLine(secondHead)) return null; + if (countTrimmedLine(inputLines, firstHead) !== 1 || countTrimmedLine(inputLines, secondHead) !== 1) + return null; + return { firstHead, secondHead }; + } + case "swap-if-else": { + if (cores.length > 2) return null; + const condition = nearestVisibleLine(inputLines, cores[0].start - 1, -1); + if (!condition.startsWith("if") && !condition.includes(" if ")) return null; + if (countTrimmedLine(inputLines, condition) !== 1) return null; + return { condition }; + } + } +} + +/** + * Build the task prompt for a mutation case, or null when no uniquely solvable + * prompt exists (the caller then retries with a different candidate). + * + * Structural mutations render as natural instructions ("move X back before Y") + * with the expected after-state as reference; identifier renames as a + * replace-every-occurrence instruction; everything else as explicit + * before/after blocks. All variants are validated by re-solving the hunks + * against the expected output, so every prompt admits exactly one byte-exact + * answer. Difficulty only controls location detail. + */ function buildPrompt( filePath: string, mutation: Mutation, info: MutationInfo, difficulty: Difficulty, - entry: FileEntry, -): string { - const header = `# Fix the bug in \`${path.basename(filePath)}\``; - - const isStructural = mutation.category === "structural"; - const isMultiEdit = mutation.name === "identifier-multi-edit"; - - if (difficulty === "easy") { - const detail = mutation.describe(info); - const location = isStructural - ? `The issue starts around line ${info.lineNumber}.` - : `The issue is on line ${info.lineNumber}.`; - return [header, detail, location, mutation.fixHint].join("\n\n"); + input: string, + expected: string, +): string | null { + if (mutation.name === "identifier-multi-edit") { + return buildIdentifierPrompt(filePath, info, difficulty, input, expected); } - if (difficulty === "medium") { - const detail = mutation.describe(info); - const funcName = findContainingFunction(entry, info.lineNumber); - let location: string; - if (funcName) { - location = `The issue is in the \`${funcName}\` function.`; - } else { - const ratio = entry.lineCount ? info.lineNumber / entry.lineCount : 0; - if (ratio < 0.33) location = "The issue is near the top of the file."; - else if (ratio < 0.66) location = "The issue is around the middle of the file."; - else location = "The issue is near the end of the file."; - } - if (isMultiEdit) { - location += " The same error appears in multiple places."; - } - return [header, detail, location, mutation.fixHint].join("\n\n"); + const inputLines = input.replace(/\n$/, "").split("\n"); + const placements = placementsFromDiff(input, expected); + if (placements.length === 0 || placements.length > 5) return null; + const hunks = renderHunks(inputLines, placements); + if (!hunks) return null; + const solved = solveRenderedHunks(inputLines, hunks); + if (!solved || ensureTrailingNewline(solved.join("\n")) !== expected) return null; + + const language = LANGUAGE_BY_EXTENSION[path.extname(filePath).toLowerCase()] ?? ""; + const fence = pickFence(hunks); + const hunkContext = (hunk: RenderedHunk): { startLine: number | undefined } => ({ + startLine: !hunk.unique || difficulty === "easy" ? hunk.startLine : undefined, + }); + + const structuralKind = STRUCTURAL_KINDS[mutation.name]; + if (structuralKind) { + // Structural tasks read as natural instructions; a candidate whose + // instruction would be ambiguous is rejected so the caller retries — + // never downgraded to a raw before/after patch. + const data = structuralPromptData(structuralKind, inputLines, placements); + if (!data) return null; + const rendered = prompt.render(structuralTaskTemplate, { + filename: path.basename(filePath), + kind: structuralKind, + ...data, + fence, + language, + hunkCount: hunks.length, + hunks: hunks.map(hunk => ({ + // After-state regions are only interpretable with a position. + startLine: hunk.startLine, + newCode: hunk.newBlock.join("\n"), + })), + }); + return rendered.length <= 20_000 ? rendered : null; } - if (difficulty === "hard") { - const detail = mutation.describe(info); - if (isMultiEdit) { - return [header, detail, "Find and fix all occurrences of this issue."].join("\n\n"); - } - if (isStructural) { - return [header, detail, "The fix may involve multiple lines."].join("\n\n"); - } - return [header, detail, "Find and fix this issue."].join("\n\n"); - } - - // nightmare - if (isStructural) { - return [header, "There is a structural bug in this file.", "Track it down and fix it with a minimal edit."].join( - "\n\n", - ); - } - if (isMultiEdit) { - return [ - header, - "An identifier is consistently misspelled throughout this file.", - "Find all occurrences and fix them.", - ].join("\n\n"); - } - return [header, "There is a subtle bug in this file.", "Track it down and fix it with a minimal edit."].join("\n\n"); + const location = difficulty === "medium" ? locateBug(input, hunks[0].startLine, inputLines.length) : {}; + const rendered = prompt.render(mutationTaskTemplate, { + filename: path.basename(filePath), + name: mutation.name, + functionName: location.functionName, + region: location.region, + nightmare: difficulty === "nightmare", + fence, + language, + hunkCount: hunks.length, + hunks: hunks.map(hunk => ({ + ...hunkContext(hunk), + isDelete: hunk.newBlock.length === 0, + oldCode: hunk.oldBlock.join("\n"), + newCode: hunk.newBlock.join("\n"), + })), + }); + return rendered.length <= 20_000 ? rendered : null; } function createSeededRng(seed: number): () => number { @@ -625,6 +923,7 @@ function resolveFormattedMutationInfo( lineNumber, originalSnippet: snippetFromChangedLines(chosen.removedLines, originalLines, Math.max(1, chosen.oldStart)), mutatedSnippet: snippetFromChangedLines(chosen.addedLines, mutatedLines, lineNumber), + identifier: fallbackInfo.identifier, }; if (resolved.originalSnippet && !originalContent.includes(resolved.originalSnippet)) return null; @@ -640,6 +939,7 @@ async function generateCase( usedLines: Map, difficulty: Difficulty, minScore: number | null, + sizeRange: SizeRange | null, attemptLimit = 100, ): Promise { let candidates = getCandidatesForDifficulty(files, difficulty); @@ -676,12 +976,15 @@ async function generateCase( const positionalHunks = countPositionalLineHunks(entry.content, mutatedContent); const positionalChanges = countPositionalLineChanges(entry.content, mutatedContent); const isStructural = mutation.category === "structural"; - const isMultiEdit = mutation.name === "identifier-multi-edit"; + const isMultiEdit = mutation.multiHunk === true; if (!isStructural && !isMultiEdit) { if (changedHunks !== 1) continue; if (positionalHunks !== 1) continue; if (changedLines > 30 || positionalChanges > 30) continue; } + // Coarse pre-format lower bound: removed+added always >= the run-based + // metric, so anything below the minimum can be rejected before Prettier. + if (sizeRange && changedLines < sizeRange[0]) continue; if (!regionAvailable(usedLines, entry.path, rawInfo.lineNumber)) continue; @@ -707,6 +1010,26 @@ async function generateCase( const finalInfo = resolveFormattedMutationInfo(normalizedOriginal, normalizedMutated, rawInfo); if (!finalInfo) continue; + // Enforce the size target with the same metric edit-shape-stats.ts uses: + // sum of max(old, new) per change run, on the formatted input/expected. + if (sizeRange) { + const finalChanged = placementsFromDiff(normalizedMutated, normalizedOriginal).reduce( + (sum, placement) => sum + Math.max(placement.oldLen, placement.newLines.length), + 0, + ); + if (finalChanged < sizeRange[0] || finalChanged > sizeRange[1]) continue; + } + + const taskPrompt = buildPrompt( + entry.path, + mutation, + finalInfo, + difficulty, + normalizedMutated, + normalizedOriginal, + ); + if (!taskPrompt) continue; + recordRegion(usedLines, entry.path, rawInfo.lineNumber); return { caseId: "", @@ -715,6 +1038,7 @@ async function generateCase( filePath: entry.path, formattedMutatedContent: normalizedMutated, formattedOriginalContent: normalizedOriginal, + prompt: taskPrompt, difficulty, difficultyScore: diffScore, }; @@ -760,7 +1084,6 @@ async function buildCaseEntries(result: CaseResult, typescriptDir: string): Prom }; const isRepeated = entry.repeatedLines.has(lineContent); - const prompt = buildPrompt(result.filePath, result.mutation, result.finalInfo, result.difficulty, entry); const metadata = { mutation_type: result.mutation.name, @@ -796,7 +1119,7 @@ async function buildCaseEntries(result: CaseResult, typescriptDir: string): Prom return [ { name: `${caseDir}/input/${filename}`, content: result.formattedMutatedContent }, { name: `${caseDir}/expected/${filename}`, content: result.formattedOriginalContent }, - { name: `${caseDir}/prompt.md`, content: prompt }, + { name: `${caseDir}/prompt.md`, content: result.prompt }, { name: `${caseDir}/metadata.json`, content: JSON.stringify(metadata, null, 2) }, ]; } @@ -856,17 +1179,20 @@ async function main(): Promise { const fallbackOrder: Difficulty[] = ["hard", "medium", "easy"]; for (const mutation of mutations) { - const difficultiesForType = chooseDifficulties(difficulties, args.countPerType); + const plan = MUTATION_PLANS[mutation.name] ?? { count: 4 }; + const count = Math.max(1, Math.round(plan.count * args.countScale)); + const difficultiesForType = chooseDifficulties(difficulties, count); let generated = 0; - for (let index = 0; index < args.countPerType; index++) { + for (let index = 0; index < count; index++) { const difficulty = difficultiesForType[index]; - let result = await generateCase(rng, mutation, files, usedLines, difficulty, args.minScore); + const sizeRange = plan.sizes ? plan.sizes[index % plan.sizes.length] : null; + let result = await generateCase(rng, mutation, files, usedLines, difficulty, args.minScore, sizeRange); if (!result) { for (const fallback of fallbackOrder) { if (fallback === difficulty) continue; - result = await generateCase(rng, mutation, files, usedLines, fallback, 0); + result = await generateCase(rng, mutation, files, usedLines, fallback, 0, sizeRange); if (result) { console.log(`Note: ${mutation.name} case ${index + 1} fell back from ${difficulty} to ${fallback}`); break; @@ -889,8 +1215,8 @@ async function main(): Promise { if (generated === 0) { console.log(`Warning: No cases generated for ${mutation.name} (mutation may be too rare)`); - } else if (generated < args.countPerType) { - console.log(`Note: Only ${generated}/${args.countPerType} cases generated for ${mutation.name}`); + } else if (generated < count) { + console.log(`Note: Only ${generated}/${count} cases generated for ${mutation.name}`); } } diff --git a/packages/typescript-edit-benchmark/src/hunks.ts b/packages/typescript-edit-benchmark/src/hunks.ts new file mode 100644 index 000000000..bc04c15af --- /dev/null +++ b/packages/typescript-edit-benchmark/src/hunks.ts @@ -0,0 +1,264 @@ +/** + * Shared hunk machinery for fixture generation. + * + * `generate.ts` expresses every task as "replace these exact blocks in the + * input file". This module locates changed blocks, prepares prompt-visible + * before/after blocks whose old side occurs exactly once in the input + * (re-padding with context, or falling back to an explicit line number), and + * re-solves prepared hunks to prove a prompt admits exactly one byte-exact + * answer. Prompt prose itself lives in the Handlebars templates under + * `src/prompts/`; this module only supplies the block data. + */ +import { diffLines } from "diff"; + +/** Replace `oldLen` lines at `start` (0-based index into the input) with `newLines`. */ +export interface Placement { + start: number; + oldLen: number; + newLines: string[]; +} + +/** A prompt-visible change: replace (or delete) `oldBlock`, verbatim, with `newBlock`. */ +export interface RenderedHunk { + oldBlock: string[]; + newBlock: string[]; + /** 1-based line where `oldBlock` starts in the input file. */ + startLine: number; + /** Whether `oldBlock` occurs exactly once in the input; when false, prompts must state `startLine`. */ + unique: boolean; +} + +const MAX_UNIQUENESS_EXTENSION = 10; + +export function findBlockOccurrences(lines: string[], block: string[]): number[] { + if (block.length === 0 || block.length > lines.length) return []; + const hits: number[] = []; + const first = block[0]; + outer: for (let i = 0; i <= lines.length - block.length; i++) { + if (lines[i] !== first) continue; + for (let j = 1; j < block.length; j++) { + if (lines[i + j] !== block[j]) continue outer; + } + hits.push(i); + } + return hits; +} + +export function applyPlacements(lines: string[], placements: Placement[]): string[] { + const out: string[] = []; + let cursor = 0; + for (const placement of placements) { + out.push(...lines.slice(cursor, placement.start), ...placement.newLines); + cursor = placement.start + placement.oldLen; + } + out.push(...lines.slice(cursor)); + return out; +} + +export function commonPrefixLength(a: string[], b: string[]): number { + let n = 0; + while (n < a.length && n < b.length && a[n] === b[n]) n++; + return n; +} + +export function commonSuffixLength(a: string[], b: string[], maxLength: number): number { + let n = 0; + while (n < maxLength && a[a.length - 1 - n] === b[b.length - 1 - n]) n++; + return n; +} + +function splitDiffValue(value: string): string[] { + const lines = value.split("\n"); + if (lines.length > 0 && lines[lines.length - 1] === "") lines.pop(); + return lines; +} + +/** + * Compute placements that transform `inputText` into `expectedText` via a + * line diff. Adjacent removed/added runs merge into one placement. + */ +export function placementsFromDiff(inputText: string, expectedText: string): Placement[] { + const placements: Placement[] = []; + let inputLine = 0; + let pendingStart = -1; + let pendingOldLen = 0; + let pendingNewLines: string[] = []; + + const flush = (): void => { + if (pendingStart < 0) return; + placements.push({ start: pendingStart, oldLen: pendingOldLen, newLines: pendingNewLines }); + pendingStart = -1; + pendingOldLen = 0; + pendingNewLines = []; + }; + + for (const change of diffLines(inputText, expectedText)) { + const lines = splitDiffValue(change.value); + if (!change.added && !change.removed) { + flush(); + inputLine += lines.length; + continue; + } + if (pendingStart < 0) pendingStart = inputLine; + if (change.removed) { + pendingOldLen += lines.length; + inputLine += lines.length; + } else { + pendingNewLines.push(...lines); + } + } + flush(); + return placements; +} + +/** + * Merge placements separated by at most `maxGap` context lines into one, so a + * moved statement renders as a single natural replace instead of a delete plus + * a re-insert whose blocks end on invisible blank lines. + */ +export function mergeNearbyPlacements(inputLines: string[], placements: Placement[], maxGap: number): Placement[] { + const merged: Placement[] = []; + for (const placement of placements) { + const previous = merged[merged.length - 1]; + const gap = previous ? placement.start - (previous.start + previous.oldLen) : -1; + if (previous && gap >= 0 && gap <= maxGap) { + const bridge = inputLines.slice(previous.start + previous.oldLen, placement.start); + previous.oldLen += gap + placement.oldLen; + previous.newLines = [...previous.newLines, ...bridge, ...placement.newLines]; + continue; + } + merged.push({ ...placement }); + } + return merged; +} + +/** + * Turn placements into prompt-visible hunks. Each hunk's blocks are trimmed to + * the changed core, anchored on context when either side would be empty, then + * re-padded with context lines until the old block occurs exactly once in the + * input; when the input has no room to disambiguate, the hunk is marked + * non-unique and prompts must state its start line. Blocks never start or end + * on a blank line when a visible context line is available — a blank line at a + * fence edge is invisible. Returns null when a hunk cannot be rendered at all. + */ +export function renderHunks(inputLines: string[], placements: Placement[]): RenderedHunk[] | null { + const merged = mergeNearbyPlacements(inputLines, placements, 2); + const hunks: RenderedHunk[] = []; + let previousEnd = -1; + + for (let index = 0; index < merged.length; index++) { + const placement = merged[index]; + const nextStart = index + 1 < merged.length ? merged[index + 1].start : inputLines.length; + const old = inputLines.slice(placement.start, placement.start + placement.oldLen); + const fresh = placement.newLines; + const prefix = commonPrefixLength(old, fresh); + const suffix = commonSuffixLength(old, fresh, Math.min(old.length, fresh.length) - prefix); + let shownStart = placement.start + prefix; + let oldBlock = old.slice(prefix, old.length - suffix); + let newBlock = fresh.slice(prefix, fresh.length - suffix); + if (oldBlock.length === 0 && newBlock.length === 0) continue; + + const takeAbove = (): boolean => { + const above = shownStart - 1; + if (above < 0 || above <= previousEnd) return false; + shownStart = above; + oldBlock = [inputLines[above], ...oldBlock]; + newBlock = [inputLines[above], ...newBlock]; + return true; + }; + const takeBelow = (): boolean => { + const below = shownStart + oldBlock.length; + if (below >= nextStart || below >= inputLines.length) return false; + oldBlock = [...oldBlock, inputLines[below]]; + newBlock = [...newBlock, inputLines[below]]; + return true; + }; + + // Pure insertion or pure deletion: anchor on a context line so neither + // block is empty. Prefer a non-blank anchor. + if (oldBlock.length === 0 || newBlock.length === 0) { + const aboveIndex = shownStart - 1; + const aboveVisible = aboveIndex >= 0 && aboveIndex > previousEnd && inputLines[aboveIndex].trim() !== ""; + if (aboveVisible) { + takeAbove(); + } else if (!takeBelow() && !takeAbove()) { + return null; + } + } + + let unique = true; + for (let extension = 0; findBlockOccurrences(inputLines, oldBlock).length > 1; extension++) { + if (extension >= MAX_UNIQUENESS_EXTENSION || !takeAbove()) { + unique = false; + break; + } + } + + // Pad blank fence edges with visible context (bounded; best effort). + for (let guard = 0; guard < 2 && (oldBlock[0].trim() === "" || newBlock[0]?.trim() === ""); guard++) { + if (!takeAbove()) break; + } + for ( + let guard = 0; + guard < 2 && (oldBlock[oldBlock.length - 1].trim() === "" || newBlock[newBlock.length - 1]?.trim() === ""); + guard++ + ) { + if (!takeBelow()) break; + } + + previousEnd = placement.start + placement.oldLen - 1; + hunks.push({ oldBlock, newBlock, startLine: shownStart + 1, unique }); + } + return hunks.length > 0 ? hunks : null; +} + +/** + * Re-solve the prompt from scratch: locate every hunk's old block in the input + * (unique occurrence, or the stated start line) and apply the replacements. + * Guarantees the prompt admits exactly one byte-exact answer. + */ +export function solveRenderedHunks(inputLines: string[], hunks: RenderedHunk[]): string[] | null { + const placements: Placement[] = []; + for (const hunk of hunks) { + const occurrences = findBlockOccurrences(inputLines, hunk.oldBlock); + let start: number; + if (hunk.unique) { + if (occurrences.length !== 1) return null; + start = occurrences[0]; + } else { + start = hunk.startLine - 1; + if (!occurrences.includes(start)) return null; + } + placements.push({ start, oldLen: hunk.oldBlock.length, newLines: hunk.newBlock }); + } + placements.sort((a, b) => a.start - b.start); + let previousEnd = -1; + for (const placement of placements) { + if (placement.start <= previousEnd) return null; + previousEnd = placement.start + placement.oldLen - 1; + } + return applyPlacements(inputLines, placements); +} + +export const LANGUAGE_BY_EXTENSION: Record = { + ".ts": "ts", + ".tsx": "tsx", + ".js": "js", + ".jsx": "jsx", + ".mjs": "js", + ".md": "markdown", + ".rs": "rust", + ".py": "python", + ".json": "json", + ".yml": "yaml", + ".yaml": "yaml", + ".toml": "toml", +}; + +/** Fence that safely wraps every block in `hunks` (upgrades when content embeds triple backticks). */ +export function pickFence(hunks: RenderedHunk[]): string { + const hasTripleBacktick = hunks.some(hunk => + [...hunk.oldBlock, ...hunk.newBlock].some(line => line.includes("```")), + ); + return hasTripleBacktick ? "````" : "```"; +} diff --git a/packages/typescript-edit-benchmark/src/mutations.ts b/packages/typescript-edit-benchmark/src/mutations.ts index c7eb1fb83..27d308e55 100644 --- a/packages/typescript-edit-benchmark/src/mutations.ts +++ b/packages/typescript-edit-benchmark/src/mutations.ts @@ -21,16 +21,18 @@ export interface MutationInfo { lineNumber: number; originalSnippet: string; mutatedSnippet: string; + /** Correct/misspelled rename pair; set by identifier-multi-edit for rename-style prompts. */ + identifier?: { correct: string; misspelled: string }; } export interface Mutation { name: string; category: string; - fixHint: string; + /** Whether this mutation intentionally produces multiple separated hunks. */ + multiHunk?: boolean; canApply(content: string): boolean; mutate(content: string, rng: () => number): [string, MutationInfo]; - describe(info: MutationInfo): string; } type Candidate = { @@ -234,12 +236,6 @@ function isLengthMemberExpression(node: t.Node): node is t.MemberExpression { abstract class BaseAstMutation implements Mutation { abstract name: string; abstract category: string; - abstract fixHint: string; - abstract description: string; - - describe(_info: MutationInfo): string { - return this.description; - } abstract collectCandidates(parsed: Parsed): Candidate[]; abstract applyCandidate(parsed: Parsed, candidate: Candidate, rng: () => number): MutationInfo; @@ -281,8 +277,6 @@ abstract class BaseAstMutation implements Mutation { class SwapComparisonMutation extends BaseAstMutation { name = "swap-comparison"; category = "operator"; - fixHint = "Swap the comparison operator to the correct variant."; - description = "A comparison operator is subtly wrong."; #swap: Record = { "<=": "<", @@ -310,8 +304,6 @@ class SwapComparisonMutation extends BaseAstMutation { class SwapEqualityMutation extends BaseAstMutation { name = "swap-equality"; category = "operator"; - fixHint = "Fix the equality comparison operator."; - description = "An equality operator is inverted."; #swap: Record = { "===": "!==", @@ -339,8 +331,6 @@ class SwapEqualityMutation extends BaseAstMutation { class SwapLogicalMutation extends BaseAstMutation { name = "swap-logical"; category = "operator"; - fixHint = "Use the intended boolean operator."; - description = "A boolean operator is incorrect."; collectCandidates(parsed: Parsed): Candidate[] { const out: Candidate[] = []; @@ -364,8 +354,6 @@ class SwapLogicalMutation extends BaseAstMutation { class RemoveNegationMutation extends BaseAstMutation { name = "remove-negation"; category = "operator"; - fixHint = "Add back the missing logical negation (`!`)."; - description = "A logical negation (`!`) was accidentally removed."; collectCandidates(parsed: Parsed): Candidate[] { const out: Candidate[] = []; @@ -393,8 +381,6 @@ class RemoveNegationMutation extends BaseAstMutation { class SwapIncDecMutation extends BaseAstMutation { name = "swap-increment-decrement"; category = "operator"; - fixHint = "Replace the increment/decrement operator with the intended one."; - description = "An increment/decrement operator points the wrong direction."; collectCandidates(parsed: Parsed): Candidate[] { const out: Candidate[] = []; @@ -417,8 +403,6 @@ class SwapIncDecMutation extends BaseAstMutation { class SwapArithmeticMutation extends BaseAstMutation { name = "swap-arithmetic"; category = "operator"; - fixHint = "Correct the arithmetic operator."; - description = "An arithmetic operator was swapped."; #swap: Record = { "+": "-", "-": "+", "*": "/", "/": "*" }; @@ -441,8 +425,6 @@ class SwapArithmeticMutation extends BaseAstMutation { class BooleanLiteralFlipMutation extends BaseAstMutation { name = "flip-boolean"; category = "literal"; - fixHint = "Flip the boolean literal to the intended value."; - description = "A boolean literal is inverted."; collectCandidates(parsed: Parsed): Candidate[] { const out: Candidate[] = []; @@ -465,9 +447,6 @@ class BooleanLiteralFlipMutation extends BaseAstMutation { class OptionalChainRemovalMutation extends BaseAstMutation { name = "remove-optional-chain"; category = "access"; - fixHint = - "Restore the optional chaining operator (`?.`) at the ONE location where it was removed. Do not add optional chaining elsewhere."; - description = "Optional chaining was removed from a property access."; collectCandidates(parsed: Parsed): Candidate[] { const out: Candidate[] = []; @@ -498,8 +477,6 @@ class OptionalChainRemovalMutation extends BaseAstMutation { class CallArgumentSwapMutation extends BaseAstMutation { name = "swap-call-args"; category = "call"; - fixHint = "Swap the two arguments to their original order."; - description = "Two arguments in a call are swapped."; collectCandidates(parsed: Parsed): Candidate[] { const out: Candidate[] = []; @@ -563,8 +540,6 @@ class CallArgumentSwapMutation extends BaseAstMutation { class NullishCoalescingSwapMutation extends BaseAstMutation { name = "swap-nullish"; category = "operator"; - fixHint = "Use the intended nullish/logical operator."; - description = "A nullish coalescing operator was swapped."; collectCandidates(parsed: Parsed): Candidate[] { const out: Candidate[] = []; @@ -588,8 +563,6 @@ class NullishCoalescingSwapMutation extends BaseAstMutation { class RegexQuantifierSwapMutation extends BaseAstMutation { name = "swap-regex-quantifier"; category = "regex"; - fixHint = "Fix the ONE regex quantifier that was swapped (between `+` and `*`). Do not modify other quantifiers."; - description = "A regex quantifier was swapped, changing whitespace matching."; collectCandidates(parsed: Parsed): Candidate[] { const out: Candidate[] = []; @@ -650,8 +623,6 @@ class RegexQuantifierSwapMutation extends BaseAstMutation { class UnicodeHyphenMutation extends BaseAstMutation { name = "unicode-hyphen"; category = "unicode"; - fixHint = "Replace the unicode dash with a plain ASCII hyphen."; - description = "A string literal contains a lookalike unicode dash."; collectCandidates(parsed: Parsed): Candidate[] { const out: Candidate[] = []; @@ -690,8 +661,7 @@ class UnicodeHyphenMutation extends BaseAstMutation { class IdentifierMultiEditMutation extends BaseAstMutation { name = "identifier-multi-edit"; category = "identifier"; - fixHint = "Restore the identifier to its original spelling in all affected locations."; - description = "An identifier is misspelled in multiple separate locations."; + multiHunk = true; #keywords = new Set([ "await", @@ -850,6 +820,7 @@ class IdentifierMultiEditMutation extends BaseAstMutation { lineNumber: selectedPaths[0]?.node.loc?.start.line ?? 0, originalSnippet: chosen.name, mutatedSnippet: mutated, + identifier: { correct: chosen.name, misspelled: mutated }, }, ]; } @@ -928,6 +899,7 @@ class IdentifierMultiEditMutation extends BaseAstMutation { lineNumber: selectedPaths[0]?.node.loc?.start.line ?? 0, originalSnippet: chosen.name, mutatedSnippet: mutated, + identifier: { correct: chosen.name, misspelled: mutated }, }; } } @@ -935,8 +907,6 @@ class IdentifierMultiEditMutation extends BaseAstMutation { class DuplicateLineLiteralFlipMutation extends BaseAstMutation { name = "duplicate-line-flip"; category = "duplicate"; - fixHint = "Fix the literal or operator on the duplicated line."; - description = "A duplicated line contains a subtle literal/operator change."; collectCandidates(parsed: Parsed): Candidate[] { const out: Candidate[] = []; @@ -1025,8 +995,6 @@ class DuplicateLineLiteralFlipMutation extends BaseAstMutation { class SwapAdjacentLinesMutation extends BaseAstMutation { name = "swap-adjacent-lines"; category = "structural"; - fixHint = "Swap the two adjacent lines back to their original order."; - description = "Two adjacent statements are in the wrong order."; collectCandidates(parsed: Parsed): Candidate[] { const out: Candidate[] = []; @@ -1134,8 +1102,6 @@ class SwapAdjacentLinesMutation extends BaseAstMutation { class SwapIfElseBranchesMutation extends BaseAstMutation { name = "swap-if-else"; category = "structural"; - fixHint = "Swap the if and else branch bodies back to their original positions."; - description = "The if and else branches are swapped."; collectCandidates(parsed: Parsed): Candidate[] { const out: Candidate[] = []; @@ -1163,29 +1129,31 @@ class SwapIfElseBranchesMutation extends BaseAstMutation { } } -class RemoveEarlyReturnMutation extends BaseAstMutation { - name = "remove-early-return"; +/** + * Remove one label from a fall-through `case A: case B:` pair. The fix inserts + * the missing label back — a deterministic pure-insertion task whose content + * is dictated by the visible sibling label, not by hidden deleted code. + */ +class RemoveCaseLabelMutation extends BaseAstMutation { + name = "remove-case-label"; category = "structural"; - fixHint = - "Restore the missing guard clause (if statement with early return). Add back the exact 3-line pattern: if condition, return statement, closing brace."; - description = "A guard clause (early return) was removed."; - collectCandidates(parsed: Parsed): Candidate[] { - const out: Candidate[] = []; + collectCandidates(parsed: Parsed): Candidate[] { + const out: Candidate[] = []; traverse(parsed.ast, { - IfStatement: path => { + SwitchCase: path => { const node = path.node; - if (node.alternate) return; - if (!t.isBlockStatement(node.consequent)) return; - if (node.consequent.body.length !== 1) return; - if (!t.isReturnStatement(node.consequent.body[0])) return; + if (!node.test || node.consequent.length > 0) return; + if (!t.isSwitchStatement(path.parent)) return; + const index = path.parent.cases.indexOf(node); + if (index < 0 || index >= path.parent.cases.length - 1) return; out.push({ path }); }, }); return out; } - applyCandidate(parsed: Parsed, candidate: Candidate): MutationInfo { + applyCandidate(parsed: Parsed, candidate: Candidate): MutationInfo { const node = candidate.path.node; const before = snippetFromSource(parsed.code, node, snippetFromNode(node)); candidate.path.remove(); @@ -1193,131 +1161,331 @@ class RemoveEarlyReturnMutation extends BaseAstMutation { } } -class SwapNamedImportsMutation extends BaseAstMutation { - name = "swap-named-imports"; - category = "import"; - fixHint = - "Swap ONLY the two imported names that are in the wrong order. Do not reorder other imports or modify other import statements."; - description = "Two named imports are swapped in a destructuring import."; +/** + * Wrap a block's body in a redundant `if (true) { ... }`. The fix removes the + * wrapper and dedents — an indentation-shifting multi-line edit whose entire + * content stays visible in the buggy file (no invisible-code reconstruction). + */ +class WrapRedundantIfMutation extends BaseAstMutation { + name = "wrap-redundant-if"; + category = "structural"; - collectCandidates(parsed: Parsed): Candidate[] { - const out: Candidate[] = []; + #lineSpan(node: t.Node): number { + if (!node.loc) return 0; + return node.loc.end.line - node.loc.start.line + 1; + } + + collectCandidates(parsed: Parsed): Candidate[] { + const out: Candidate[] = []; traverse(parsed.ast, { - ImportDeclaration: path => { - const named = path.node.specifiers - .map((spec, idx) => ({ spec, idx })) - .filter((entry): entry is { spec: t.ImportSpecifier; idx: number } => t.isImportSpecifier(entry.spec)) - .filter(({ spec }) => t.isIdentifier(spec.imported) && t.isIdentifier(spec.local)) - .filter( - ({ spec }) => - t.isIdentifier(spec.imported) && - t.isIdentifier(spec.local) && - spec.imported.name === spec.local.name, - ); - if (named.length < 2) return; - for (let i = 0; i < named.length; i++) { - for (let j = i + 1; j < named.length; j++) { - out.push({ path, meta: { i: named[i]!.idx, j: named[j]!.idx } }); - } - } + BlockStatement: path => { + const span = this.#lineSpan(path.node); + if (span < 4 || span > 160) return; + if (path.node.body.length === 0) return; + if (path.node.directives.length > 0) return; + // Don't wrap a body that is itself just an `if (true)` (repeated mutation noise). + if (path.node.body.length === 1 && t.isIfStatement(path.node.body[0])) return; + out.push({ path }); }, }); return out; } + applyCandidate(_parsed: Parsed, candidate: Candidate): MutationInfo { + const node = candidate.path.node; + const line = nodeLine(node); + node.body = [t.ifStatement(t.booleanLiteral(true), t.blockStatement(node.body))]; + return { lineNumber: line, originalSnippet: "", mutatedSnippet: "if (true) {" }; + } +} + +/** + * Swap two adjacent multi-line sibling statements (functions, if-chains, + * loops). The fix swaps them back — a large contiguous replace whose content + * is fully visible. + */ +class SwapSiblingBlocksMutation implements Mutation { + name = "swap-sibling-blocks"; + category = "structural"; + + #collect(parsed: Parsed): Array<{ left: t.Statement; right: t.Statement }> { + const out: Array<{ left: t.Statement; right: t.Statement }> = []; + const lineSpan = (node: t.Node): number => (node.loc ? node.loc.end.line - node.loc.start.line + 1 : 0); + + const considerList = (body: Array): void => { + for (let i = 0; i < body.length - 1; i++) { + const left = body[i]; + const right = body[i + 1]; + if (!left || !right || !t.isStatement(left) || !t.isStatement(right)) continue; + if (!left.loc || !right.loc) continue; + if (t.isImportDeclaration(left) || t.isImportDeclaration(right)) continue; + const leftSpan = lineSpan(left); + const rightSpan = lineSpan(right); + // At least one true block; bounded total so prompts stay readable. + if (Math.max(leftSpan, rightSpan) < 3) continue; + if (leftSpan > 80 || rightSpan > 80 || leftSpan + rightSpan > 120) continue; + const gap = right.loc.start.line - left.loc.end.line; + if (gap > 2) continue; + const leftText = snippetFromSource(parsed.code, left, "").trim(); + const rightText = snippetFromSource(parsed.code, right, "").trim(); + if (!leftText || !rightText || leftText === rightText) continue; + out.push({ left, right }); + } + }; + + traverse(parsed.ast, { + Program: path => considerList(path.node.body), + BlockStatement: path => considerList(path.node.body), + }); + return out; + } + + canApply(content: string): boolean { + const parsed = parseCode(content); + return parsed !== null && this.#collect(parsed).length > 0; + } + mutate(content: string, rng: () => number): [string, MutationInfo] { const parsed = parseCode(content); if (!parsed) return [content, noopInfo()]; - const candidates = this.collectCandidates(parsed); + const candidates = this.#collect(parsed); if (candidates.length === 0) return [content, noopInfo()]; - const chosen = randomChoice(candidates, rng); - const node = chosen.path.node; - const indices = chosen.meta; - if (!indices) return [content, noopInfo()]; - const { i, j } = indices; - if (i < 0 || j < 0 || i >= node.specifiers.length || j >= node.specifiers.length) return [content, noopInfo()]; - - const left = node.specifiers[i]; - const right = node.specifiers[j]; - if (!left || !right) return [content, noopInfo()]; + const { left, right } = randomChoice(candidates, rng); const leftRange = nodeRange(left); const rightRange = nodeRange(right); - const importRange = nodeRange(node); - if (!leftRange || !rightRange || !importRange) return [content, noopInfo()]; - if (leftRange.end > rightRange.start) return [content, noopInfo()]; + if (!leftRange || !rightRange || leftRange.end > rightRange.start) return [content, noopInfo()]; - const leftText = content.slice(leftRange.start, leftRange.end); - const rightText = content.slice(rightRange.start, rightRange.end); + const between = content.slice(leftRange.end, rightRange.start); + const swapped = `${content.slice(rightRange.start, rightRange.end)}${between}${content.slice(leftRange.start, leftRange.end)}`; const mutated = applySourceEdits(content, [ - { start: leftRange.start, end: leftRange.end, replacement: rightText }, - { start: rightRange.start, end: rightRange.end, replacement: leftText }, + { start: leftRange.start, end: rightRange.end, replacement: swapped }, ]); if (!mutated || mutated === content) return [content, noopInfo()]; return [ mutated, { - lineNumber: nodeLine(node), - originalSnippet: content.slice(importRange.start, importRange.end).trim(), - mutatedSnippet: mutated.slice(importRange.start, importRange.end).trim(), + lineNumber: left.loc?.start.line ?? 0, + originalSnippet: `lines ${left.loc?.start.line ?? 0}-${right.loc?.end.line ?? 0}`, + mutatedSnippet: "[swapped]", }, ]; } - - applyCandidate(parsed: Parsed, candidate: Candidate): MutationInfo { - const node = candidate.path.node; - const indices = candidate.meta; - if (!indices) return noopInfo(); - const before = snippetFromSource(parsed.code, node, snippetFromNode(node)); - const { i, j } = indices; - if (i < 0 || j < 0 || i >= node.specifiers.length || j >= node.specifiers.length) return noopInfo(); - [node.specifiers[i], node.specifiers[j]] = [node.specifiers[j]!, node.specifiers[i]!]; - return { - lineNumber: nodeLine(node), - originalSnippet: before.trim(), - mutatedSnippet: snippetFromNode(node).trim(), - }; - } } -class DeleteStatementMutation extends BaseAstMutation { - name = "delete-statement"; +/** + * Duplicate a multi-line statement right after itself (a copy-paste accident). + * The fix deletes the second copy — a large deletion where the surviving copy + * stays visible, so the task is deterministic without revealing hidden code. + */ +class DuplicateBlockMutation implements Mutation { + name = "duplicate-block"; category = "structural"; - fixHint = "Restore the deleted statement."; - description = "A critical statement was deleted from the code."; - collectCandidates(parsed: Parsed): Candidate[] { - const out: Candidate[] = []; + #collect(parsed: Parsed): t.Statement[] { + const out: t.Statement[] = []; + const consider = (statement: t.Statement | t.ModuleDeclaration): void => { + if (!t.isStatement(statement) || !statement.loc) return; + const span = statement.loc.end.line - statement.loc.start.line + 1; + if (span < 3 || span > 120) return; + // Duplicating lexical declarations or exports produces parse/redeclaration + // errors; stick to statements that stay syntactically valid twice. + if ( + !t.isIfStatement(statement) && + !t.isExpressionStatement(statement) && + !t.isForStatement(statement) && + !t.isForOfStatement(statement) && + !t.isWhileStatement(statement) && + !t.isTryStatement(statement) && + !t.isSwitchStatement(statement) + ) { + return; + } + out.push(statement); + }; traverse(parsed.ast, { - Statement: path => { - if (!path.node.loc) return; - if (t.isVariableDeclaration(path.node)) { - out.push({ path: path as NodePath }); - return; - } - if (!t.isExpressionStatement(path.node)) return; - if (t.isAssignmentExpression(path.node.expression) || t.isUpdateExpression(path.node.expression)) { - out.push({ path: path as NodePath }); - } + Program: path => { + for (const statement of path.node.body) consider(statement); + }, + BlockStatement: path => { + for (const statement of path.node.body) consider(statement); }, }); return out; } - applyCandidate(parsed: Parsed, candidate: Candidate): MutationInfo { - const node = candidate.path.node; - const before = snippetFromSource(parsed.code, node, snippetFromNode(node)); - candidate.path.remove(); - return { lineNumber: nodeLine(node), originalSnippet: before.trim(), mutatedSnippet: "[removed]" }; + canApply(content: string): boolean { + const parsed = parseCode(content); + return parsed !== null && this.#collect(parsed).length > 0; + } + + mutate(content: string, rng: () => number): [string, MutationInfo] { + const parsed = parseCode(content); + if (!parsed) return [content, noopInfo()]; + const candidates = this.#collect(parsed); + if (candidates.length === 0) return [content, noopInfo()]; + + const statement = randomChoice(candidates, rng); + const range = nodeRange(statement); + if (!range) return [content, noopInfo()]; + + const text = content.slice(range.start, range.end); + const mutated = applySourceEdits(content, [{ start: range.end, end: range.end, replacement: `\n\n${text}` }]); + if (!mutated || mutated === content) return [content, noopInfo()]; + // Reject mutations that no longer parse (e.g. duplicated declarations). + if (!parseCode(mutated)) return [content, noopInfo()]; + + return [ + mutated, + { + lineNumber: statement.loc?.start.line ?? 0, + originalSnippet: text.split("\n")[0]?.trim() ?? "", + mutatedSnippet: text.split("\n")[0]?.trim() ?? "", + }, + ]; + } +} + +/** + * Move a multi-line statement to a distant position in the same statement + * list. The fix moves it back — one delete hunk plus one insert hunk, the two + * dominant hunk shapes in real edits — with the moved content fully visible. + */ +class MoveDistantBlockMutation implements Mutation { + name = "move-distant-block"; + category = "structural"; + multiHunk = true; + + #collect(parsed: Parsed): Array<{ moved: t.Statement; next: t.Statement; target: t.Statement }> { + const out: Array<{ moved: t.Statement; next: t.Statement; target: t.Statement }> = []; + + const considerList = (body: Array): void => { + if (body.length < 5) return; + for (let from = 0; from < body.length - 1; from++) { + const moved = body[from]; + const next = body[from + 1]; + if (!moved || !next || !t.isStatement(moved) || !t.isStatement(next)) continue; + if (!moved.loc || t.isImportDeclaration(moved)) continue; + const span = moved.loc.end.line - moved.loc.start.line + 1; + if (span < 3 || span > 60) continue; + for (let to = from + 3; to < body.length; to++) { + const target = body[to]; + if (!target || !t.isStatement(target) || !target.loc) continue; + out.push({ moved, next, target }); + } + } + }; + + traverse(parsed.ast, { + Program: path => considerList(path.node.body), + BlockStatement: path => considerList(path.node.body), + }); + return out; + } + + canApply(content: string): boolean { + const parsed = parseCode(content); + return parsed !== null && this.#collect(parsed).length > 0; + } + + mutate(content: string, rng: () => number): [string, MutationInfo] { + const parsed = parseCode(content); + if (!parsed) return [content, noopInfo()]; + const candidates = this.#collect(parsed); + if (candidates.length === 0) return [content, noopInfo()]; + + const { moved, next, target } = randomChoice(candidates, rng); + const movedRange = nodeRange(moved); + const nextRange = nodeRange(next); + const targetRange = nodeRange(target); + if (!movedRange || !nextRange || !targetRange) return [content, noopInfo()]; + if (movedRange.end > nextRange.start || nextRange.start > targetRange.end) return [content, noopInfo()]; + + const movedText = content.slice(movedRange.start, movedRange.end); + const mutated = applySourceEdits(content, [ + // Cut the statement together with its trailing separator... + { start: movedRange.start, end: nextRange.start, replacement: "" }, + // ...and splice it back in after the distant target statement. + { start: targetRange.end, end: targetRange.end, replacement: `\n\n${movedText}` }, + ]); + if (!mutated || mutated === content) return [content, noopInfo()]; + if (!parseCode(mutated)) return [content, noopInfo()]; + + return [ + mutated, + { + lineNumber: moved.loc?.start.line ?? 0, + originalSnippet: movedText.split("\n")[0]?.trim() ?? "", + mutatedSnippet: movedText.split("\n")[0]?.trim() ?? "", + }, + ]; + } +} + +/** + * Apply several independent token-level mutations in one file — the multi-hunk + * edit shape that dominates real sessions. Each constituent bug is a + * single-line change fully specified by the task's before/after blocks. + */ +class CompositeMultiEditMutation implements Mutation { + name = "composite-multi-edit"; + category = "multi"; + multiHunk = true; + + #parts: Mutation[]; + + constructor(parts: Mutation[]) { + this.#parts = parts; + } + + canApply(content: string): boolean { + let applicable = 0; + for (const part of this.#parts) { + try { + if (part.canApply(content)) applicable++; + } catch { + // Unparseable for this part; skip. + } + if (applicable >= 2) return true; + } + return false; + } + + mutate(content: string, rng: () => number): [string, MutationInfo] { + const applicable = this.#parts.filter(part => { + try { + return part.canApply(content); + } catch { + return false; + } + }); + if (applicable.length < 2) return [content, noopInfo()]; + + const target = Math.min(3 + Math.floor(rng() * 3), applicable.length); + const parts = randomSample(applicable, target, rng); + let current = content; + let firstInfo: MutationInfo | null = null; + let applied = 0; + for (const part of parts) { + try { + const [next, info] = part.mutate(current, rng); + if (next === current || info.lineNumber === 0) continue; + current = next; + firstInfo ??= info; + applied++; + } catch { + // A part failing on already-mutated content just shrinks the composite. + } + } + if (applied < 2 || !firstInfo) return [content, noopInfo()]; + return [current, firstInfo]; } } class OffByOneMutation extends BaseAstMutation { name = "off-by-one"; category = "literal"; - fixHint = "Fix the off-by-one error in the numeric literal or comparison."; - description = "A numeric boundary has an off-by-one error."; collectCandidates(parsed: Parsed): Candidate[] { const out: Candidate[] = []; @@ -1386,7 +1554,8 @@ class OffByOneMutation extends BaseAstMutation { } } -export const ALL_MUTATIONS: Mutation[] = [ +/** Single-line token mutations; also the constituent parts of the composite. */ +const TOKEN_MUTATIONS: Mutation[] = [ new SwapComparisonMutation(), new SwapEqualityMutation(), new SwapLogicalMutation(), @@ -1399,14 +1568,21 @@ export const ALL_MUTATIONS: Mutation[] = [ new NullishCoalescingSwapMutation(), new RegexQuantifierSwapMutation(), new UnicodeHyphenMutation(), + new OffByOneMutation(), +]; + +export const ALL_MUTATIONS: Mutation[] = [ + ...TOKEN_MUTATIONS, new IdentifierMultiEditMutation(), new DuplicateLineLiteralFlipMutation(), new SwapAdjacentLinesMutation(), new SwapIfElseBranchesMutation(), - new RemoveEarlyReturnMutation(), - new SwapNamedImportsMutation(), - new DeleteStatementMutation(), - new OffByOneMutation(), + new WrapRedundantIfMutation(), + new SwapSiblingBlocksMutation(), + new DuplicateBlockMutation(), + new MoveDistantBlockMutation(), + new RemoveCaseLabelMutation(), + new CompositeMultiEditMutation(TOKEN_MUTATIONS), ]; export const CATEGORY_MAP: Record = { @@ -1419,5 +1595,5 @@ export const CATEGORY_MAP: Record = { identifier: ALL_MUTATIONS.filter(m => m.category === "identifier").map(m => m.name), duplicate: ALL_MUTATIONS.filter(m => m.category === "duplicate").map(m => m.name), structural: ALL_MUTATIONS.filter(m => m.category === "structural").map(m => m.name), - import: ALL_MUTATIONS.filter(m => m.category === "import").map(m => m.name), + multi: ALL_MUTATIONS.filter(m => m.category === "multi").map(m => m.name), }; diff --git a/packages/typescript-edit-benchmark/src/prompts/identifier-task.md b/packages/typescript-edit-benchmark/src/prompts/identifier-task.md new file mode 100644 index 000000000..34c0e1515 --- /dev/null +++ b/packages/typescript-edit-benchmark/src/prompts/identifier-task.md @@ -0,0 +1,9 @@ +# Fix a misspelled identifier in `{{filename}}` + +A recent edit misspelled the identifier `{{correct}}` as `{{misspelled}}` in {{#when count "==" 1}}one place{{else}}{{count}} places{{/when}}. +{{#if affectedLines}} + +Affected line{{#when count ">" 1}}s{{/when}}: {{join affectedLines ", "}}. +{{/if}} + +Replace every occurrence of `{{misspelled}}` with `{{correct}}`. Do not change anything else. diff --git a/packages/typescript-edit-benchmark/src/prompts/mutation-task.md b/packages/typescript-edit-benchmark/src/prompts/mutation-task.md new file mode 100644 index 000000000..e009de7e7 --- /dev/null +++ b/packages/typescript-edit-benchmark/src/prompts/mutation-task.md @@ -0,0 +1,85 @@ +# Fix a bug in `{{filename}}` + +{{#when name "==" "swap-comparison"}} +A comparison operator is subtly wrong. +{{/when}} +{{#when name "==" "swap-equality"}} +An equality operator is inverted. +{{/when}} +{{#when name "==" "swap-logical"}} +A boolean operator is incorrect. +{{/when}} +{{#when name "==" "remove-negation"}} +A logical negation (`!`) was accidentally removed. +{{/when}} +{{#when name "==" "swap-increment-decrement"}} +An increment/decrement operator points the wrong direction. +{{/when}} +{{#when name "==" "swap-arithmetic"}} +An arithmetic operator was swapped. +{{/when}} +{{#when name "==" "flip-boolean"}} +A boolean literal is inverted. +{{/when}} +{{#when name "==" "remove-optional-chain"}} +Optional chaining was removed from a property access. +{{/when}} +{{#when name "==" "swap-call-args"}} +Two arguments in a call are swapped. +{{/when}} +{{#when name "==" "swap-nullish"}} +A nullish coalescing operator was swapped. +{{/when}} +{{#when name "==" "swap-regex-quantifier"}} +A regex quantifier was swapped, changing whitespace matching. +{{/when}} +{{#when name "==" "unicode-hyphen"}} +A string literal contains a lookalike unicode dash. +{{/when}} +{{#when name "==" "off-by-one"}} +A numeric boundary has an off-by-one error. +{{/when}} +{{#when name "==" "duplicate-line-flip"}} +One copy of a line that repeats elsewhere in this file was altered. +{{/when}} +{{#when name "==" "composite-multi-edit"}} +This file contains several small, unrelated single-line bugs. +{{/when}} +{{#if functionName}} + +The bug is in the `{{functionName}}` function. +{{/if}} +{{#when region "==" "top"}} + +The bug is near the top of the file. +{{/when}} +{{#when region "==" "middle"}} + +The bug is around the middle of the file. +{{/when}} +{{#when region "==" "end"}} + +The bug is near the end of the file. +{{/when}} +{{#each hunks}} +{{#when ../hunkCount ">" 1}} + +## Change {{add @index 1}} +{{/when}} + +{{#if isDelete}}Delete this block{{#if startLine}} (starting on line {{startLine}}){{/if}}:{{else}}Replace this{{#if startLine}} (starting on line {{startLine}}){{/if}}:{{/if}} + +{{../fence}}{{../language}} +{{oldCode}} +{{../fence}} +{{#unless isDelete}} + +with: + +{{../fence}}{{../language}} +{{newCode}} +{{../fence}} +{{/unless}} +{{/each}} + +{{#if nightmare}}This file contains near-identical code in multiple places — edit exactly the block shown and nothing else.{{else}}Make exactly this change; do not modify anything else.{{/if}} diff --git a/packages/typescript-edit-benchmark/src/prompts/structural-task.md b/packages/typescript-edit-benchmark/src/prompts/structural-task.md new file mode 100644 index 000000000..3792f45eb --- /dev/null +++ b/packages/typescript-edit-benchmark/src/prompts/structural-task.md @@ -0,0 +1,37 @@ +# Fix a bug in `{{filename}}` + +{{#when kind "==" "case-label"}} +In this file's `switch`, the value in `{{label}}` must be handled exactly like the case after it: add a fall-through `{{label}}` label directly before `{{before}}`. +{{/when}} +{{#when kind "==" "duplicate-block"}} +The block starting with `{{head}}` appears twice in a row — the second copy is a copy-paste accident. Delete the second copy and keep the first. +{{/when}} +{{#when kind "==" "move-block"}} +The block starting with `{{head}}` was moved to the wrong place — it currently sits after `{{currentPrev}}`. Move it back so it comes directly before `{{destination}}`. +{{/when}} +{{#when kind "==" "wrap-if"}} +A leftover debugging wrapper is redundant: remove the `if (true) {` on line {{wrapperLine}} together with its closing brace, and dedent the wrapped body one level. +{{/when}} +{{#when kind "==" "swap-blocks"}} +Two adjacent blocks are in the wrong order: the block starting with `{{secondHead}}` belongs before the block starting with `{{firstHead}}`. Swap the two blocks. +{{/when}} +{{#when kind "==" "swap-lines"}} +Two adjacent statements are in the wrong order: `{{secondHead}}` belongs before `{{firstHead}}`. Swap the two statements. +{{/when}} +{{#when kind "==" "swap-if-else"}} +The branch bodies of `{{condition}}` are swapped: the current `else` body belongs under the `if`, and vice versa. Swap the two branch bodies. +{{/when}} + +After the fix, the affected {{#when hunkCount ">" 1}}regions must{{else}}region must{{/when}} read exactly: +{{#each hunks}} +{{#if startLine}} + +Around line {{startLine}}: +{{/if}} + +{{../fence}}{{../language}} +{{newCode}} +{{../fence}} +{{/each}} + +Make exactly this change; do not modify anything else. diff --git a/packages/typescript-edit-benchmark/test/hunks.test.ts b/packages/typescript-edit-benchmark/test/hunks.test.ts new file mode 100644 index 000000000..4518da59b --- /dev/null +++ b/packages/typescript-edit-benchmark/test/hunks.test.ts @@ -0,0 +1,96 @@ +import { describe, expect, it } from "bun:test"; +import { + placementsFromDiff, + type RenderedHunk, + renderHunks, + solveRenderedHunks, +} from "@oh-my-pi/typescript-edit-benchmark/hunks"; + +/** Round-trip an input/expected pair through the prompt machinery. */ +function roundTrip(input: string, expected: string): { hunks: RenderedHunk[]; solved: string } { + const inputLines = input.replace(/\n$/, "").split("\n"); + const placements = placementsFromDiff(input, expected); + const hunks = renderHunks(inputLines, placements); + if (!hunks) throw new Error("renderHunks returned null"); + const solved = solveRenderedHunks(inputLines, hunks); + if (!solved) throw new Error("solveRenderedHunks returned null"); + return { hunks, solved: `${solved.join("\n")}\n` }; +} + +describe("hunk round-trip", () => { + it("reproduces the expected file for a block replacement", () => { + const input = "const a = 1;\nfunction f() {\n\treturn a;\n}\nexport { f };\n"; + const expected = "const a = 1;\nfunction f() {\n\treturn a + 1;\n}\nexport { f };\n"; + const { hunks, solved } = roundTrip(input, expected); + expect(solved).toBe(expected); + expect(hunks).toHaveLength(1); + expect(hunks[0].unique).toBe(true); + }); + + it("reproduces the expected file for a pure insertion, anchored on a non-blank line", () => { + const input = "function f() {\n\n\treturn 1;\n}\n"; + const expected = "function f() {\n\n\tconst x = 0;\n\treturn 1;\n}\n"; + const { hunks, solved } = roundTrip(input, expected); + expect(solved).toBe(expected); + // The line directly above the insertion is blank; the anchor must be visible. + expect(hunks[0].oldBlock.some(line => line.trim().length > 0)).toBe(true); + }); + + it("reproduces the expected file for a pure deletion, anchored on context", () => { + const input = "a();\nb();\nc();\n"; + const expected = "a();\nc();\n"; + const { hunks, solved } = roundTrip(input, expected); + expect(solved).toBe(expected); + // Deletions keep a context anchor so the replacement is never an empty fence. + expect(hunks[0].newBlock.length).toBeGreaterThan(0); + expect(hunks[0].oldBlock.length).toBeGreaterThan(hunks[0].newBlock.length); + }); +}); + +describe("uniqueness handling", () => { + it("extends a repeated block with context until it is unique", () => { + const input = "start();\nif (x) {\n\tstop();\n}\nif (y) {\n\tstop();\n}\n"; + const expected = "start();\nif (x) {\n\tstop();\n}\nif (y) {\n\thalt();\n}\n"; + const { hunks, solved } = roundTrip(input, expected); + expect(solved).toBe(expected); + expect(hunks[0].unique).toBe(true); + // `\tstop();` alone is ambiguous; the block must carry the `if (y) {` context. + expect(hunks[0].oldBlock.length).toBeGreaterThan(1); + }); + + it("marks a hunk non-unique with its start line when context cannot disambiguate", () => { + const line = "value += 1;"; + const input = `${Array.from({ length: 4 }, () => line).join("\n")}\n`; + const expected = `${[line, line, "value += 2;", line].join("\n")}\n`; + const inputLines = input.replace(/\n$/, "").split("\n"); + const hunks = renderHunks(inputLines, placementsFromDiff(input, expected)); + if (!hunks) throw new Error("renderHunks returned null"); + expect(hunks[0].unique).toBe(false); + // startLine must locate a real occurrence of the (extended) old block, so + // a solver that trusts it lands on the right copy. + expect(inputLines.slice(hunks[0].startLine - 1, hunks[0].startLine - 1 + hunks[0].oldBlock.length)).toEqual( + hunks[0].oldBlock, + ); + const solved = solveRenderedHunks(inputLines, hunks); + expect(solved ? `${solved.join("\n")}\n` : null).toBe(expected); + }); +}); + +describe("placement merging", () => { + it("renders two adjacent swapped statements as a single hunk", () => { + const input = "setup();\nsecond();\nfirst();\nteardown();\n"; + const expected = "setup();\nfirst();\nsecond();\nteardown();\n"; + const { hunks, solved } = roundTrip(input, expected); + expect(solved).toBe(expected); + expect(hunks).toHaveLength(1); + }); + + it("keeps distant changes as separate hunks", () => { + const filler = Array.from({ length: 10 }, (_, i) => `line${i}();`).join("\n"); + const input = `alpha();\n${filler}\nomega();\n`; + const expected = `alpha2();\n${filler}\nomega2();\n`; + const { hunks, solved } = roundTrip(input, expected); + expect(solved).toBe(expected); + expect(hunks).toHaveLength(2); + }); +}); From 38ebd3033776ff105e3b7e746118548cac61751a Mon Sep 17 00:00:00 2001 From: can1357 Date: Thu, 30 Jul 2026 07:48:46 +0200 Subject: [PATCH 14/19] chore: update stale tests --- .gitignore | 2 + docs/tools/edit.md | 64 +++++++------ .../test/export-html-template.test.ts | 14 ++- .../controllers/resume-preflight.test.ts | 3 +- .../src/edit-shape-stats.ts | 93 +++++++++++++------ .../typescript-edit-benchmark/src/generate.ts | 49 +++++----- packages/utils/test/logger-contract.test.ts | 3 + packages/utils/test/postmortem-epipe.test.ts | 11 +-- 8 files changed, 144 insertions(+), 95 deletions(-) diff --git a/.gitignore b/.gitignore index c9968f970..3266d9634 100644 --- a/.gitignore +++ b/.gitignore @@ -26,6 +26,8 @@ target/ # OS *.tmp +# Bun compile temp artifacts, left in cwd if a `Bun.build({ compile })` run is killed mid-write +*.bun-build .DS_Store # Logs & profiling diff --git a/docs/tools/edit.md b/docs/tools/edit.md index 7e02ca064..3339cca28 100644 --- a/docs/tools/edit.md +++ b/docs/tools/edit.md @@ -8,7 +8,7 @@ - Key collaborators: - `packages/coding-agent/src/utils/edit-mode.ts` — selects active edit mode - `packages/hashline/src/grammar.lark` — canonical constrained-decoding grammar - - `packages/hashline/src/format.ts` — sigils and header constants (`[`, `]`, `#`, `+`, `SWAP`, `DEL`, `INS`) + - `packages/hashline/src/format.ts` — sigils and header constants (`[`, `]`, `#`, `+`, `SWAP`, `CUT`, `INS`, `PASTE`) - `packages/hashline/src/input.ts` — parses `[PATH#TAG]` sections - `packages/hashline/src/tokenizer.ts` / `packages/hashline/src/parser.ts` — tokenizes and parses ops - `packages/hashline/src/apply.ts` — applies parsed edits to file text @@ -30,18 +30,21 @@ Patch language inside `input`: - **Operations**: - `SWAP N.=M:` — replace original lines N.=M with the body rows below. - `SWAP.BLK N:` — replace the whole tree-sitter block beginning on line N (its header line through its closing line) with the body rows. The line span is resolved at apply time from the file's parse tree; point N at the line that opens the construct. The resolved span is exactly the node that begins on line N — a leading decorator, attribute, or doc-comment is a separate node and is not included; point N at the first decorator line (Python wraps `@dec` + `def` as one block) or fall back to `SWAP N.=M:` to take a leading line-comment that parses as its own node (e.g. Rust `///`). On success the result echoes the matched span (`SWAP.BLK N → resolved lines A-B`). Errors (and steers to `SWAP N.=M:`) when the language is unsupported, line N is blank or a closing delimiter, no node begins there, or the resolved block has a syntax error. - - `DEL N.=M` — delete original lines N.=M. No body. - - `DEL.BLK N` — delete the whole tree-sitter block beginning on line N (resolved like `SWAP.BLK N`, with the same decorator/comment caveat). No body. On success the result echoes the matched span (`DEL.BLK N → resolved lines A-B`). Same resolution failure modes and `DEL N.=M` fallback. + - `CUT N.=M` — delete original lines N.=M and capture them in the clipboard. No body. A standalone cut is valid; the latest cut replaces the clipboard contents. + - `CUT.BLK N` — delete and capture the whole tree-sitter block beginning on line N (resolved like `SWAP.BLK N`, with the same decorator/comment caveat). No body. On success the result echoes the matched span (`CUT.BLK N → resolved lines A-B`). Same resolution failure modes and `CUT N.=M` fallback. - `INS.PRE N:` — insert body rows immediately before line N. - `INS.POST N:` — insert body rows immediately after line N. - `INS.BLK.POST N:` — insert body rows after the last line of the tree-sitter block beginning on line N. Point N at the line that opens the construct, never its closing delimiter / last visible line; if you can see the last line already, use plain `INS.POST M:`. An anchor that can't resolve to a block is lowered to plain `INS.POST N:` with a warning instead of failing the patch. - - **Markdown sections**: tree-sitter-md nests a heading and its body (including deeper subsections) in one `section` node, so all three block ops anchored on a `#`/`##`/`###` heading line resolve the whole section — heading through every nested deeper heading, up to the next same-or-higher heading. `DEL.BLK` drops the section, `SWAP.BLK` rewrites it, `INS.BLK.POST` lands after it. A heading with no body resolves to a single line and falls back to the plain op like any other single-line block. + - **Markdown sections**: tree-sitter-md nests a heading and its body (including deeper subsections) in one `section` node, so all four block ops anchored on a `#`/`##`/`###` heading line resolve the whole section — heading through every nested deeper heading, up to the next same-or-higher heading. `CUT.BLK` drops and captures the section, `SWAP.BLK` rewrites it, and `INS.BLK.POST` / `PASTE.BLK.POST` land after it. A heading with no body resolves to a single line and is rejected with guidance to use the corresponding plain line op. - `INS.HEAD:` — insert body rows at the start of the file. - `INS.TAIL:` — insert body rows at the end of the file. + - `PASTE.PRE N` / `PASTE.POST N` / `PASTE.HEAD` / `PASTE.TAIL` — insert the clipboard at that position. No body. An empty clipboard is an error. + - `PASTE.BLK.POST N` — insert the clipboard after the resolved block's last line. An unresolvable anchor lowers to `PASTE.POST N` with a warning, matching `INS.BLK.POST`. + - **Clipboard**: operations execute top-to-bottom across all patch sections. The latest `CUT` wins; `PASTE` does not consume the clipboard and may be repeated. The coding agent persists the register across edit calls in the same session, enabling cross-file moves. Keep each path under one header when clipboard operations would otherwise be interleaved around another file's section. - **Body rows**: - Only body-bearing headers end in `:`. - Every body row is `+TEXT`; `+` alone adds a blank line. - - `DEL` never has body rows. + - `CUT` and `PASTE` never have body rows. - There is no repeat row kind. To keep a line, leave it out of every range; split edits into multiple hunks when needed. - `-` rows are invalid. Literal Markdown bullets or text beginning with `-` / `+` must be written as `+- item` / `++ item`. @@ -52,7 +55,7 @@ Anchors come from `read`/`grep` output. `read` emits a `[PATH#TAG]` header from The canonical grammar is strict, but the hand parser accepts a few non-dangerous variants: - `SWAP N:` — accepted as `SWAP N.=N:`. -- `DEL N` — accepted as single-line delete. +- `CUT N` — accepted as a single-line cut/delete. - Missing trailing colon on `SWAP` or `INS` — accepted. - `SWAP N-M:`, `SWAP N…M:`, `SWAP N M:`, and legacy `SWAP N..M:` — accepted as `SWAP N.=M:`. - Bare body rows with no `+` prefix are auto-prepended with `+` and a `BARE_BODY_AUTO_PIPED_WARNING` is appended. @@ -61,16 +64,17 @@ The canonical grammar is strict, but the hand parser accepts a few non-dangerous - Some malformed bracketed headers are recovered after stripping apply-patch path noise such as `Update File:` / `Add File:` and extra `***`, but the recovered header still needs a valid four-hex tag for the patcher to apply it. - `*** Update File:` / `*** Add File:` / `*** Delete File:` / `*** Move to:` apply_patch sentinels inside the diff body throw an `apply_patch sentinel … is not valid in hashline` error. - `@@`-bracketed hunk headers are rejected with guidance to write a verb header. -- Bare `N` and bare `N M` / `N.=M` headers are rejected with guidance to write `SWAP` or `DEL`. -- `DEL N.=M:` and any body rows under `DEL` / `DEL.BLK` are rejected. -- Empty `INS` / `SWAP.BLK` hunks are rejected; an empty `SWAP N.=M:` (no body rows) is treated as `DEL N.=M`. +- Bare `N` and bare `N M` / `N.=M` headers are rejected with guidance to write `SWAP` or `CUT`. +- A trailing colon on `CUT N.=M:` / `CUT.BLK N:` is tolerated and ignored, but body rows under `CUT`, `CUT.BLK`, or any `PASTE` form are rejected. +- Bare `PASTE` is rejected because the insertion position is required. +- Empty `INS` / `SWAP.BLK` hunks are rejected; an empty `SWAP N.=M:` deletes the range, though `CUT N.=M` is the canonical deletion form. - `-` body rows are rejected with `MINUS_ROW_REJECTED` unless the hunk is unambiguously a Markdown bullet list (see Tolerated input shapes). -- `SWAP.BLK N:` / `DEL.BLK N` / `INS.BLK.POST N:` require a wired tree-sitter resolver; `SWAP.BLK` and `INS.BLK.POST` additionally need at least one `+TEXT` body row, while `DEL.BLK` takes none. An unresolvable block (unsupported language, blank/closing-delimiter line, no node beginning on N, or a syntax error in the resolved block) rejects a `SWAP.BLK` / `DEL.BLK` on the apply/final-preview path (the streaming preview silently drops it instead). `INS.BLK.POST N:` is never rejected this way — it is lowered to plain `INS.POST N:` with a warning: a closing-delimiter-anchor warning when line N is a pure closer (inserting after that end is exactly what the plain form does), a generic unresolved-anchor warning otherwise. +- `SWAP.BLK N:` / `CUT.BLK N` / `INS.BLK.POST N:` / `PASTE.BLK.POST N` consult the wired tree-sitter resolver. `SWAP.BLK` and `INS.BLK.POST` need at least one `+TEXT` body row; `CUT.BLK` and `PASTE.BLK.POST` take none. A null resolution rejects `SWAP.BLK` / `CUT.BLK` on the apply or final-preview path (the streaming preview silently drops it), while `INS.BLK.POST` / `PASTE.BLK.POST` lower to the corresponding plain `POST` form with a warning. A single-line resolution rejects every block form with guidance to use its plain line equivalent. ## Outputs - Single-shot tool result; hashline mode does not use the staged preview/apply devices (`/xdev/resolve`, `/xdev/reject`). - `content` contains one text block per call. For a successful single-file edit it is the post-edit `[path#TAG]` section header (a fresh snapshot tag for the written content), followed by a compact diff preview from `packages/hashline/src/diff-preview.ts` when one is emitted. -- When the patch used `SWAP.BLK`/`DEL.BLK`/`INS.BLK.POST` ops (and the apply matched the tagged content), one `SWAP.BLK N → resolved lines A-B (K lines)` line per block op (single-line spans render `resolved line A (1 line)`; INS.BLK.POST appends `; body lands after line B`) is inserted between the `[PATH#TAG]` header and the diff preview, so the caller can confirm tree-sitter resolved the construct it intended. +- When the patch used `SWAP.BLK` / `CUT.BLK` / `INS.BLK.POST` / `PASTE.BLK.POST` ops (and the apply matched the tagged content), one ` N → resolved lines A-B (K lines)` line per block op is inserted between the `[PATH#TAG]` header and the diff preview. Single-line spans render `resolved line A (1 line)`; `INS.BLK.POST` appends `body lands after line B`, and `PASTE.BLK.POST` appends `clipboard lands after line B`. - Parse, apply, or recovery warnings are appended as: ```text @@ -126,11 +130,11 @@ INS.PRE 5: +console.log(X + Y); ``` -Delete lines 4.=5 entirely: +Delete lines 4.=5 entirely and leave them in the clipboard: ```text [a.ts#0A3B] -DEL 4.=5 +CUT 4.=5 ``` Insert at start and end of file: @@ -143,20 +147,19 @@ INS.TAIL: +// trailer ``` -Multi-file: +Move line 4 from `src/a.ts` to after line 20 in `src/b.ts`: ```text [src/a.ts#0A3B] -SWAP 4.=4: -+const enabled = true; +CUT 4 [src/b.ts#1F7C] -DEL 20 +PASTE.POST 20 ``` ## Limits & Caps - File snapshot tags are exactly four uppercase-hex chars — content-derived hashes (`computeFileHash()`) recorded in the per-session snapshot store. - The visible mismatch report shows 2 lines of context on each side (`MISMATCH_CONTEXT`) in `packages/hashline/src/messages.ts`. - Stale-anchor recovery uses `fuzzFactor: 0` in `packages/hashline/src/recovery.ts`. -- `HL_FILE_PREFIX` is `[`, `HL_FILE_SUFFIX` is `]`, `HL_PAYLOAD_REPLACE` is `+`, `HL_RANGE_SEP` is `.=`, `HL_FILE_HASH_SEP` is `#`, and hunk keyword constants are `SWAP` / `DEL` / `INS` (`packages/hashline/src/format.ts`). +- `HL_FILE_PREFIX` is `[`, `HL_FILE_SUFFIX` is `]`, `HL_PAYLOAD_REPLACE` is `+`, `HL_RANGE_SEP` is `.=`, `HL_FILE_HASH_SEP` is `#`, and line/clipboard hunk keyword constants are `SWAP` / `CUT` / `INS` / `PASTE` (`packages/hashline/src/format.ts`). ## Errors - Missing section header: @@ -164,28 +167,29 @@ DEL 20 - Missing tag for any section: - `Missing hashline snapshot tag for ; use \`[#tag]\` from your latest read/search output. To create a new file, use the write tool.` - Stray payload line: - - `line N: payload line has no preceding hunk header. Use \`SWAP N.=M:\`, \`DEL N.=M\`, or \`INS.PRE|POST|HEAD|TAIL:\` above the body. Got "...".` + - `line N: payload line has no preceding hunk header. Use \`SWAP N.=M:\`, \`CUT N.=M\`, or \`INS.PRE|POST|HEAD|TAIL:\` above the body. Got "...".` - Minus row (unless auto-piped as an unambiguous Markdown bullet — see Tolerated input shapes): - ``line N: `-` rows are not valid; the range already names the lines being changed. For Markdown bullets or other literal `-` lines, prefix the literal row with `+`: `+- item`.`` - Empty body-bearing hunk: - `line N: \`INS\` needs at least one \`+TEXT\` body row.` - - `line N: \`SWAP.BLK N:\` needs at least one \`+TEXT\` body row. To delete a block, use \`DEL.BLK N\`.` -- Unresolvable block anchor — `SWAP.BLK` / `DEL.BLK` only (apply / final-preview path; the streaming preview silently drops the op instead): - - `line N: \`SWAP.BLK X:\` could not resolve a syntactic block beginning on line X (unsupported language, blank/closer line, or parse error). Use \`SWAP X.=M:\` with explicit lines.` — followed by a blank line and numbered `*`-marked context rows around line X (same shape as the mismatch preview). `DEL.BLK X` produces the same message with a `DEL X.=M` fallback. - - `INS.BLK.POST X:` never reaches this error — an unresolvable anchor is lowered to plain `INS.POST X:` with a warning (see Tolerated input shapes). -- Delete with body: - - `line N: \`DEL N.=M\` does not take body rows. Remove the body, or use \`SWAP N.=M:\`.` - - `line N: \`DEL.BLK N\` does not take body rows. Remove the body, or use \`SWAP.BLK N:\`.` + - `line N: \`SWAP.BLK N:\` needs at least one \`+TEXT\` body row. To delete a block, use \`CUT.BLK N\`.` +- Unresolvable block anchor — `SWAP.BLK` / `CUT.BLK` only (apply / final-preview path; the streaming preview silently drops the op instead): + - `line N: \`SWAP.BLK X:\` could not resolve a syntactic block beginning on line X (unsupported language, blank/closer line, or parse error). Use \`SWAP X.=M:\` with explicit lines.` — followed by numbered context and, when available, a nearby block suggestion. `CUT.BLK X` produces the corresponding message with a `CUT X.=M` fallback. + - `INS.BLK.POST X:` and `PASTE.BLK.POST X` never reach this error when no block resolves — they lower to plain `INS.POST X:` / `PASTE.POST X` with a warning. +- Clipboard operation errors: + - `line N: \`CUT N.=M\` captures + deletes lines and takes no body rows. To replace lines with new content, use \`SWAP N.=M:\`.` + - `line N: \`PASTE\` inserts the clipboard content and takes no \`+\` body rows. To insert literal text, use \`INS\`.` + - `line N: \`PASTE\` found nothing in the clipboard. Ops run top-to-bottom across the whole patch (sections included): put \`CUT N.=M\` or \`CUT.BLK N\` above the \`PASTE\`.` - Range out of order: - `line N: range A.=B ends before it starts.` - Overlapping hunks on the same anchor: - `line N: anchor line X is already targeted by another hunk on line Y. Issue ONE hunk per range; payload is only the final desired content, never a before/after pair.` - apply_patch / unified-diff contamination: - - `line N: apply_patch sentinel "*** …" is not valid in hashline. File sections start with \`[path#HASH]\` (no \`Update File:\` / \`Add File:\` keyword). Use \`SWAP N.=M:\`, \`DEL N.=M\`, or \`INS.PRE|POST|HEAD|TAIL:\` ops.` - - `line N: unified-diff hunk header (\`@@ -N,M +N,M @@\`) is not valid in hashline. Use \`SWAP N.=M:\`, \`DEL N.=M\`, or \`INS.PRE|POST|HEAD|TAIL:\` ops.` + - `line N: apply_patch sentinel "*** …" is not valid in hashline. File sections start with \`[path#HASH]\` (no \`Update File:\` / \`Add File:\` keyword). Use \`SWAP N.=M:\`, \`CUT N.=M\`, or \`INS.PRE|POST|HEAD|TAIL:\` ops.` + - `line N: unified-diff hunk header (\`@@ -N,M +N,M @@\`) is not valid in hashline. Use \`SWAP N.=M:\`, \`CUT N.=M\`, or \`INS.PRE|POST|HEAD|TAIL:\` ops.` - `line N: \`@@\`-bracketed hunk header "@@ …" is not valid in hashline. Drop the \`@@ ... @@\` brackets and write a verb header such as \`SWAP N.=M:\`.` - - `line N: hunk headers need a verb. Use \`SWAP N.=N:\` to replace, or \`DEL N\` to delete.` - - `line N: bare range hunk header "N M" is not valid. Hunk headers need a verb: write \`SWAP ${bareRange[1]}.=${bareRange[2]}:\` or \`DEL ${bareRange[1]}.=${bareRange[2]}\`.` + - `line N: hunk headers need a verb. Use \`SWAP N.=N:\` to replace, or \`CUT N\` to delete.` + - `line N: bare range hunk header "N M" is not valid. Hunk headers need a verb: write \`SWAP ${bareRange[1]}.=${bareRange[2]}:\` or \`CUT ${bareRange[1]}.=${bareRange[2]}\`.` - Out-of-range anchor: - `Line N does not exist (file has M lines)` - Stale snapshot tag: the `Patcher` first attempts snapshot-based recovery. When recovery cannot prove a valid result it throws `MismatchError`, which distinguishes recognized-but-drifted hashes from never-recorded hashes. The error includes the current file hash plus context around each anchor. diff --git a/packages/coding-agent/test/export-html-template.test.ts b/packages/coding-agent/test/export-html-template.test.ts index f1261ceb8..2ff61a5b0 100644 --- a/packages/coding-agent/test/export-html-template.test.ts +++ b/packages/coding-agent/test/export-html-template.test.ts @@ -19,9 +19,9 @@ interface TemplateProbeResult { } const expectedTemplate: TemplateProbeResult = { - chars: 377_268, - bytes: 377_446, - sha256: "023cf3773498db52ff0ec508b22ef2c002710f9e9fcb90fea361659d5b0205df", + chars: 377_286, + bytes: 377_464, + sha256: "6598b2d74f905e3105474ea8033c938e92df4c33035421603ea363d72d1c81c1", stableCache: true, assetsRemoved: 0, }; @@ -78,6 +78,7 @@ function composeExpectedTemplate(): string { async function runProbe(command: string[]): Promise { const proc = Bun.spawn(command, { cwd: unrelatedCwd, + stdin: "ignore", stderr: "pipe", stdout: "pipe", }); @@ -149,8 +150,9 @@ describe("HTML export template", () => { fs.writeFileSync(staleAssetPath, "stale"); const build = Bun.spawn([process.execPath, "run", "gen:bundle"], { cwd: packageDir, - stderr: "pipe", + stdin: "ignore", stdout: "pipe", + stderr: "pipe", }); const [buildStdout, buildStderr, buildExitCode] = await Promise.all([ new Response(build.stdout).text(), @@ -162,8 +164,9 @@ describe("HTML export template", () => { const proc = Bun.spawn([process.execPath, "pm", "pack", "--dry-run", "--ignore-scripts"], { cwd: packageDir, - stderr: "pipe", + stdin: "ignore", stdout: "pipe", + stderr: "pipe", }); const [stdout, stderr, exitCode] = await Promise.all([ new Response(proc.stdout).text(), @@ -195,6 +198,7 @@ describe("HTML export template", () => { test("does not retain source asset strings during a static import", async () => { const proc = Bun.spawn([process.execPath, heapProbePath], { + stdin: "ignore", stderr: "pipe", stdout: "pipe", }); diff --git a/packages/coding-agent/test/modes/controllers/resume-preflight.test.ts b/packages/coding-agent/test/modes/controllers/resume-preflight.test.ts index c9d177d2b..7633d575b 100644 --- a/packages/coding-agent/test/modes/controllers/resume-preflight.test.ts +++ b/packages/coding-agent/test/modes/controllers/resume-preflight.test.ts @@ -220,8 +220,9 @@ describe("SelectorController.handleResumeSession preflight flush", () => { selector!.handleInput("\n"); expect(selectionPromise).toBeDefined(); - await expect(selectionPromise!).rejects.toBe(switchError); + await selectionPromise; + expect(ctx.showError).toHaveBeenCalledWith("switch failed"); expect(ctx.settings.flush).toHaveBeenCalledTimes(1); expect(switchSession).toHaveBeenCalledWith(session.path); expect(hide).toHaveBeenCalledTimes(1); diff --git a/packages/typescript-edit-benchmark/src/edit-shape-stats.ts b/packages/typescript-edit-benchmark/src/edit-shape-stats.ts index 1b724deff..5184b9882 100755 --- a/packages/typescript-edit-benchmark/src/edit-shape-stats.ts +++ b/packages/typescript-edit-benchmark/src/edit-shape-stats.ts @@ -9,27 +9,25 @@ * every run counts as its own hunk. * * Shapes are reported at two levels: - * - per tool call — one sample per edit call; - * - per user request — all edit calls between one user message and the next - * grouped into one sample (one benchmark fixture ≙ one prompt, and the - * runner allows multiple edit calls per prompt). Retried/overlapping edits - * within a request are summed, so request sizes lean high, and a request - * spans every file a long agentic turn touched — an upper bound for - * single-file fixtures. + * - per tool call — one sample per edit call. Fixtures are scored on the + * final input→expected diff, and a single call's diff is the closest + * measured proxy for a net diff, so **this is the calibration reference** + * for `generate.ts`. + * - per request × file — all edit calls to one file between one user message + * and the next, concatenated. This double-counts retries, overlapping + * edits, and reversals (no per-file net reconstruction), so treat it as an + * **upper bound** on how much a single-prompt fixture could plausibly ask + * for, not as a target. * * Parse coverage is printed so a format skew cannot silently bias the numbers. * Reference measurement (2026-07, 2,000 newest sessions against this repo, * 99.9% coverage): * - * per request: changed lines: 1 → 6% 2-5 → 11% 6-20 → 20% 21-60 → 25% 61+ → 39% - * hunks: 1 → 11% 2 → 8% 3+ → 81% (median 40 changed lines) - * per call: changed lines: 1 → 23% 2-5 → 30% 6-20 → 29% 21-60 → 14% 61+ → 5% - * hunks: 1 → 48% 2 → 21% 3+ → 31% (median 5 changed lines) + * per call: changed lines: 1 → 23% 2-5 → 30% 6-20 → 29% 21-60 → 14% 61+ → 5% + * hunks: 1 → 48% 2 → 21% 3+ → 31% (median 5 changed lines) + * request×file: changed lines: 1 → 18% 2-5 → 28% 6-20 → 28% 21-60 → 17% 61+ → 9% + * hunks: 1 → 37% 2 → 21% 3+ → 43% (median 7; upper bound) * op mix (both levels): replace 55% insert 32% delete 12% - * - * `generate.ts` fixtures are single-file, single-prompt tasks: the suite is - * calibrated to sit between the two levels — per-call shapes for token fixes, - * request-leaning shapes (large blocks, multi-hunk composites) for the rest. */ import * as fs from "node:fs/promises"; import * as path from "node:path"; @@ -157,26 +155,46 @@ function runsFromDiff(diff: string): { runs: ChangeRun[] | null; format: "number return { runs: runsFromNumberedDiff(diff), format: "numbered" }; } -/** Per-session parse results: change runs per edit call and per user request, plus coverage counters. */ +/** Per-session parse results: change runs per edit call and per request×file, plus coverage counters. */ interface SessionScan { edits: ChangeRun[][]; - /** All edit-call runs between one user message and the next, concatenated. */ - requests: ChangeRun[][]; + /** All edit-call runs targeting one file between one user message and the next, concatenated. */ + requestFiles: ChangeRun[][]; formats: Map; skipped: number; } +/** Resolve the edited file path from tool-call args across edit-tool variants. */ +function extractCallPath(args: Record): string | null { + if (typeof args.path === "string" && args.path) return args.path; + if (typeof args.input === "string") { + const header = + args.input.match(/^\u00b6([^#\n]+)#/) ?? + args.input.match(/^\[([^#\]\n]+)#/) ?? + args.input.match(/^@@ ([^\n]+)$/m); + if (header) return header[1].trim(); + } + if (Array.isArray(args.edits) && args.edits.length > 0 && args.edits[0] && typeof args.edits[0] === "object") { + const nested = (args.edits[0] as Record).path; + if (typeof nested === "string" && nested) return nested; + } + return null; +} + /** Extract change runs for every successful edit in one session JSONL file. */ async function collectSessionEdits(sessionFile: string): Promise { - const scan: SessionScan = { edits: [], requests: [], formats: new Map(), skipped: 0 }; + const scan: SessionScan = { edits: [], requestFiles: [], formats: new Map(), skipped: 0 }; const stream = Bun.file(sessionFile).stream(); const decoder = new TextDecoder(); let buffer = ""; - let currentRequest: ChangeRun[] = []; + const callPaths = new Map(); + let currentRequest = new Map(); const flushRequest = (): void => { - if (currentRequest.length > 0) scan.requests.push(currentRequest); - currentRequest = []; + for (const runs of currentRequest.values()) { + if (runs.length > 0) scan.requestFiles.push(runs); + } + currentRequest = new Map(); }; const handleRecord = (record: unknown): void => { @@ -185,11 +203,23 @@ async function collectSessionEdits(sessionFile: string): Promise { if (rec.type !== "message" || !rec.message || typeof rec.message !== "object") return; const message = rec.message as Record; // A user message starts a new request; everything until the next one - // belongs to the same prompt (one benchmark fixture ≙ one request). + // belongs to the same prompt (one benchmark fixture ≙ one prompt on one file). if (message.role === "user") { flushRequest(); return; } + if (message.role === "assistant" && Array.isArray(message.content)) { + for (const block of message.content) { + if (!block || typeof block !== "object") continue; + const call = block as Record; + if (call.type !== "toolCall" || !EDIT_TOOL_NAMES[String(call.name)]) continue; + const args = + call.arguments && typeof call.arguments === "object" ? (call.arguments as Record) : {}; + const callPath = extractCallPath(args); + if (typeof call.id === "string" && callPath) callPaths.set(call.id, callPath); + } + return; + } if (message.role !== "toolResult" || !EDIT_TOOL_NAMES[String(message.toolName)] || message.isError) return; const details = message.details && typeof message.details === "object" @@ -201,7 +231,12 @@ async function collectSessionEdits(sessionFile: string): Promise { const { runs, format } = runsFromDiff(diff); if (runs) { scan.edits.push(runs); - currentRequest.push(...runs); + // Unknown path → each call is its own group (conservative: no false merging). + const callId = typeof message.toolCallId === "string" ? message.toolCallId : `#${scan.edits.length}`; + const fileKey = callPaths.get(callId) ?? `call:${callId}`; + const group = currentRequest.get(fileKey) ?? []; + group.push(...runs); + currentRequest.set(fileKey, group); scan.formats.set(format, (scan.formats.get(format) ?? 0) + 1); } else { scan.skipped++; @@ -278,7 +313,7 @@ async function main(): Promise { }; const perCall = newCounters(); - const perRequest = newCounters(); + const perRequestFile = newCounters(); const formatCounts = new Map(); let skipped = 0; @@ -287,14 +322,14 @@ async function main(): Promise { while (next < sessionFiles.length) { const file = sessionFiles[next++]; const scan = await collectSessionEdits(file).catch( - (): SessionScan => ({ edits: [], requests: [], formats: new Map(), skipped: 0 }), + (): SessionScan => ({ edits: [], requestFiles: [], formats: new Map(), skipped: 0 }), ); skipped += scan.skipped; for (const [format, count] of scan.formats) { formatCounts.set(format, (formatCounts.get(format) ?? 0) + count); } for (const runs of scan.edits) accumulate(perCall, runs); - for (const runs of scan.requests) accumulate(perRequest, runs); + for (const runs of scan.requestFiles) accumulate(perRequestFile, runs); } }); await Promise.all(workers); @@ -309,8 +344,8 @@ async function main(): Promise { console.log( `\nParse coverage: ${parsedTotal}/${parsedTotal + skipped} diff results (${(coverage * 100).toFixed(1)}%; ${formatSummary})`, ); - report("per user request (calibration target)", perRequest); - report("per tool call", perCall); + report("per tool call (calibration reference)", perCall); + report("per request × file (cumulative activity — upper bound)", perRequestFile); return 0; } diff --git a/packages/typescript-edit-benchmark/src/generate.ts b/packages/typescript-edit-benchmark/src/generate.ts index d970ac0a5..41617e46a 100644 --- a/packages/typescript-edit-benchmark/src/generate.ts +++ b/packages/typescript-edit-benchmark/src/generate.ts @@ -127,14 +127,7 @@ function parseArguments(): Args { /** Target changed-line range for a generated case. */ type SizeRange = [number, number]; -/** - * Per-mutation case counts and changed-line targets, calibrated against the - * empirical edit-shape distribution measured from real agent sessions - * (`edit-shape-stats.ts`): 1 → 27%, 2-5 → 30%, 6-20 → 26%, 21-60 → 13%, - * 61+ → 4%. Token-level mutations supply the 1-line mass; small structural and - * multi-site mutations the 2-5 band; block-level mutations cycle through the - * larger bands via `sizes`. - */ +/** How many cases to generate for a mutation, and which changed-line bands to cycle through. */ interface MutationPlan { count: number; sizes?: SizeRange[]; @@ -151,30 +144,40 @@ const BLOCK_SIZES: SizeRange[] = [ [21, 60], ]; +/** + * Per-mutation case counts and changed-line targets, calibrated against the + * per-tool-call edit-shape distribution measured from real agent sessions + * (`edit-shape-stats.ts`, calibration reference): 1 → 23%, 2-5 → 30%, + * 6-20 → 29%, 21-60 → 14%, 61+ → 5%. The request×file cumulative numbers form + * an upper bound; the suite deliberately sits at or slightly above the + * per-call sizes. Token-level mutations supply the 1-line mass; small + * structural and multi-site mutations the 2-5 band; block-level mutations + * cycle through the larger bands via `sizes`. + */ const MUTATION_PLANS: Record = { - "swap-comparison": { count: 2 }, - "swap-equality": { count: 2 }, - "swap-logical": { count: 2 }, - "remove-negation": { count: 2 }, - "swap-increment-decrement": { count: 2 }, - "swap-arithmetic": { count: 2 }, - "flip-boolean": { count: 2 }, - "remove-optional-chain": { count: 2 }, - "swap-call-args": { count: 2 }, - "swap-nullish": { count: 2 }, - "swap-regex-quantifier": { count: 2 }, - "unicode-hyphen": { count: 2 }, - "off-by-one": { count: 2 }, + "swap-comparison": { count: 1 }, + "swap-equality": { count: 1 }, + "swap-logical": { count: 1 }, + "remove-negation": { count: 1 }, + "swap-increment-decrement": { count: 1 }, + "swap-arithmetic": { count: 1 }, + "flip-boolean": { count: 1 }, + "remove-optional-chain": { count: 1 }, + "swap-call-args": { count: 1 }, + "swap-nullish": { count: 1 }, + "swap-regex-quantifier": { count: 1 }, + "unicode-hyphen": { count: 1 }, + "off-by-one": { count: 1 }, "swap-adjacent-lines": { count: 6 }, "duplicate-line-flip": { count: 6 }, - "identifier-multi-edit": { count: 8 }, + "identifier-multi-edit": { count: 10 }, "swap-if-else": { count: 6 }, "wrap-redundant-if": { count: 12, sizes: BLOCK_SIZES }, "swap-sibling-blocks": { count: 12, sizes: BLOCK_SIZES }, "duplicate-block": { count: 6, sizes: BLOCK_SIZES }, "move-distant-block": { count: 14, sizes: BLOCK_SIZES }, "remove-case-label": { count: 8 }, - "composite-multi-edit": { count: 14 }, + "composite-multi-edit": { count: 16 }, }; async function ensureSourceRepo(typescriptDir: string): Promise { diff --git a/packages/utils/test/logger-contract.test.ts b/packages/utils/test/logger-contract.test.ts index 58881d43e..e714d1f5b 100644 --- a/packages/utils/test/logger-contract.test.ts +++ b/packages/utils/test/logger-contract.test.ts @@ -53,6 +53,9 @@ async function runScenario(scenario: string): Promise { XDG_DATA_HOME: "", XDG_STATE_HOME: "", XDG_CACHE_HOME: "", + // Empty XDG_CACHE_HOME makes Bun's transpiler cache path relative, + // spewing bun/@t@/*.pile into the repo root (the child's cwd) — disable it. + BUN_RUNTIME_TRANSPILER_CACHE_PATH: "0", OMP_LOGGER_TEST_NOW: fixedNow, TZ: "Etc/GMT+5", }, diff --git a/packages/utils/test/postmortem-epipe.test.ts b/packages/utils/test/postmortem-epipe.test.ts index 373eb47e2..79e84b469 100644 --- a/packages/utils/test/postmortem-epipe.test.ts +++ b/packages/utils/test/postmortem-epipe.test.ts @@ -21,16 +21,13 @@ if (childFlagIndex >= 0) { } else if (process.argv.includes(raceChildFlag)) { const marker = process.argv[process.argv.indexOf(raceChildFlag) + 1]; if (!marker) throw new Error("Missing cleanup marker path"); - let cleanupComplete = false; - process.on("exit", () => { - fs.writeFileSync(marker, cleanupComplete ? "after cleanup" : "before cleanup"); - }); + fs.writeFileSync(marker, "before cleanup"); postmortem.registerStdioDisconnectHandling(); postmortem.register("stdio-epipe-race-test", async () => { process.stderr.write("cleanup started\n"); void Promise.reject(Object.assign(new Error("broken pipe"), { code: "EPIPE", syscall: "write" })); await new Response(Bun.stdin.stream()).text(); - cleanupComplete = true; + fs.writeFileSync(marker, "after cleanup"); }); let rejectionCount = 0; process.on("unhandledRejection", () => { @@ -63,7 +60,7 @@ describe("postmortem broken-pipe handling", () => { it("awaits cleanup and exits successfully when a registered stdio peer disconnects", async () => { const marker = `/tmp/omp-postmortem-stdio-${process.pid}-${Date.now()}`; - const child = Bun.spawn([process.execPath, import.meta.path, childFlag, marker], { + const child = Bun.spawn([process.execPath, "run", import.meta.path, childFlag, marker], { stdin: "pipe", stdout: "pipe", stderr: "pipe", @@ -93,7 +90,7 @@ describe("postmortem broken-pipe handling", () => { it("keeps waiting for active cleanup when another stdio EPIPE arrives", async () => { const marker = `/tmp/omp-postmortem-stdio-race-${process.pid}-${Date.now()}`; - const child = Bun.spawn([process.execPath, import.meta.path, raceChildFlag, marker], { + const child = Bun.spawn([process.execPath, "run", import.meta.path, raceChildFlag, marker], { stdin: "pipe", stdout: "pipe", stderr: "pipe", From a4773c0baaa315ac6a73bdb7efd4348b4398c8ba Mon Sep 17 00:00:00 2001 From: can1357 Date: Thu, 30 Jul 2026 07:57:44 +0200 Subject: [PATCH 15/19] refactor(typescript-edit-benchmark): updated mutation plans - Update benchmark fixtures archive file. - Adjust mutation plan block sizes and counts in generator script. - Remove postmortem quit test. --- .../typescript-edit-benchmark/fixtures.tar.gz | Bin 280200 -> 247664 bytes .../typescript-edit-benchmark/src/generate.ts | 10 +++---- packages/utils/CHANGELOG.md | 4 --- packages/utils/test/postmortem-quit.test.ts | 25 ------------------ 4 files changed, 5 insertions(+), 34 deletions(-) delete mode 100644 packages/utils/test/postmortem-quit.test.ts diff --git a/packages/typescript-edit-benchmark/fixtures.tar.gz b/packages/typescript-edit-benchmark/fixtures.tar.gz index 0080f0d40ab4324ba0f6c893877d5dead6858bd6..16e68e207f0c1af6a7953194162a2ec7e6920330 100644 GIT binary patch literal 247664 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 +811qHuyVTi_M8IP9l-Ks@#BK9 zzh3fW%F(G^U%Z{0cd=t3EOi*s%5svxSWu?YJPm*|OGl#Ov{30ZRUgI$Z^H|$S_rb| zs&?MgNF4-stjf%%i?`IG$W)%enwVLi8J1om>7ZIPli3h!LtW_>6Tn@bkz8aI);CUj zB$9PS+J|i5kl>;*V1x1tO^K!G+VTj)|vloj zO}H^T=$-?}>3^=vms)WerrTP_BuQ+B-EL2qZx#BnO)U9fM0h2I6SJ1ce z6t!mH!5rAnv;p0bX}9Q$q-u zN4!E^suQ(3u(G=Sm(M`V38yc`9<<_KJdRFZjQZ6FGZTmQXb1K2y8JY;t9j=+juLPE z!31RGLaJ%7Xrs|A0g?oVp8t4|9E%jd1Txck4xNa+P#!|Ed$G~mChGNw*`+WgXL--P zMMA|-e`)}vCD=gGf*(>m+jt``z1)BHm|yvXLV9V&FP4*4(Ehm!dbq%SBy7jQ?TL5#*0j0psefj-?5xxc<1v2PIq6K0 zlZMe>-8prg9H1Rw9Ri|2aL6fWPap#)f|1 zO=eR!e0sQ=j@p3D^BdZe+B*jAvw#21j9^Uy|gzw`&+fk8xS#c%;zCv~p3VI$-b zCSZ$BFfw5C#*uA$Ldhetja zrZ+ePj2K{>n{uoJ=4Hmls)N9X^x|YniSNF*D^lryGRnQ&S^> zwgrw=qw8d+&_7YX*UYuvY|3_)+Jb5HKyCrqI??u^o*fX|(+Xf?DZOnH@N=lz_baP` zdjInK(TsZTzWCRGpggJwupbi;a$#Qq%fo@u2>>%%z|OQ8zCCE&GiELJ$i;%oD^G7( zYInluu)r{cFZ3s&TH&6jY(BP*+N)m*^^tOK#S>cVZYI|#Nf(wk?#+fXQ!np8jkbNe z+64*ibAp3o(o+MG)B_sXEQQ}R#CRJ;&EG~etg8(-$fEm&C>`{rm|*JAbo~~5A7*VP zPEN0$H(*rpXs;oC?_aQv#0Puf5I~;2u71wH*(b$241uylC-9NO3xE3a6a>+=5w9+4 zR31OVy3Cap6%vixR$h&4@Wd35$l-4TFb@SWf+);rhv8KU=N45w*9g>NWbtB*U@K8s zp;mcuoEGpK^Lw+)!f?e()#b67MD%9GsYbb;N6ah9@HG^wu%(g{*1Id0ATudPA9?(P z2B<7sEDv;KO+x>-_?Z_n!By}=fm4Y}%sqm?s4?5knv8k}VX=xsg3(C8$cV%okYJZth${=K=0Q{*@Wty)nl5lP!oxl{aDEuTdfd}CwmjlYgfj4c%N zEV6c(Gb76)&~yiUGsV1y3jN%Eg~#6Tt;l=G3RcsdqUK6H`1b){&oXAuU4F<&CKOWk zHDG7{A@{OZ+@{@sB0DQ-sr-Zak%(SUxAe)?*jnw<<915HYjh9n^3b5*mOipcEdSP9 zmJ%vPMA-j<|McSZsTv26{+uZ%+Ep9%`_+8@0I2eA`c#|vsh02OXDoQ(Mzy(ouSW}5 zy4U;C0kr)6bTfJeM2BJ@z4%?P-0#?UcYp1yaiM*=+%GiJ$rN?>%c& zS^)ONL;=DJe#SY;#Lx4}`_w(PhjG1-hsjTZw{7Yi;Z(+Z{>^q^?4Idlw(pS__P=c3 zZ)D%^M>+hfEi`}~^_3fdG-RN0!k3$;%?rPcO>g{W3&4)I^6iI_5q06rGVN**o6D?7 zN|f<_2@O<<(N(eoG02rcsbC(ZXFdLqQJ05@L)+*aaF^mn0FGglX6$}}Co+-2V8c>$!qiY^~7B~+3J zA6equs;G%0y)##yVIvLXE(-!TMhk3tKzXSuf>35RPY3rb){P@N0`%Qj#lm`?P43b$ zf#{~VQ4BU};K}XjmEP;oYoQQKBb3NZHW~LvP?@9^d2q)dzjfl z20Nz|xCfBS>phlb>&7HOx2_=zIM>v5*L?gQXvWS{wRdU@8Xuz2)jHfzc+LaB4i-)ABo<`9(%1K&Q>gk7t`fj*eIr@BBfiJ?XnAdR>914 zRuP4_YSRTWA(%#m5+a+MmUSMBPl3?8x?|yw=HGJ;nBQXKDnRx^kLa~Xi}?a;e3a)c zW-}?pn~Ad!m>-@)Y0UCZXmCzQWRQr22m@_r7sL(`D!Spvz?wtJ?>(eyujW~~HYT2h z&9n)jGt0Oigkw0Xkdjd@)`hpxhLFm`h5aL!d9LiGg))Bc)>fY`Z(;2X0}bCYNtYYI zW>BJ^uk;knE8GfqSK}Amjf|Rl&ghbyVy?fH)&!pTh;@o7Az5Rah0+nYbTOXLUbcB% zGJs4_kRy;t+cE6!m5tNKb}w9DMsB&=6J3hT>N-?v!fKmjG0OI+S72RA_wUx$x%WFv zvJX!LguIijyN3lgGtWfQU%x+A8f<%VTFRczd-uwfdys*8c75|18|n5>!5p;+D;bOy zj>J$ma_}Upi-e0sXiLg338GGSnRA2V`{{i&hZa*(A>x~|sgQC65Yme{VH4#OTp&PS zsaYJi#MDYC@?7DRYTj^P?MBY?{HZaRS%K;!XIGe~1$)7O7A&eIxw(|ZoR1|^n{NdU zB5f}mI7=e>83+6B_rGGJA^{wbxTFY+KJ|v)g`~-n=7jGTv9+fhj-`=cIh=ZkzTZ!eTFsiyy`2GT~&-?usr zjEmkdwI~ROPb8{1I&Yx;uaOzC+!tK<1;tS>wa5W$Ew=r-<7OTtk^m=6F{)T2Ari1m zO>6wX2(mL*g=bq4kA(o%Q_8(B35o0xHW$GqSSw8x-dg`pZzE55X8}^&=v;LnNm`^C zbOt%A^ej+4H&wZErs9^zuypDt1QgX-RyLHtOt917!32Wpf+rxw9^D}+J)0C;2Xx{ zX9-hmd<8sm(>?t-wF44N*SR~W74K@2EA%l$k|^kIyYHm>FIemj69-<3;Srd2pYV{? zHoXke`eOE$)w~4~Keyd!vv*69QgmJ%*soJaArho#NGNt^Tv34b|xm|mzj&F%&FG8bq zPSU$%>NE~Bu!&y*pM3lRCJSi*eXZ-xu9f8za?nNr0Y!O-V7J@qGMz|4>c$TJB z1g0qc-0{8Lmmg(B8q+6w^#WWx2hy)nrv6*_lUV`~A0q;!{%yk+u8!;WaoN4i4`d>P z)S`Sr@WYgS-e@(ps-DXP`{^5k^U8# zjkq8CwhMo;NsNMqhT@>Cvz@pUEG+qO&z8p7TLHCjo9#+Fs1F~Xs^up?WO-q z>HH7RLtg%0w&%P1T&wTfN$C!dfqilG0l;6p`|*1vUjxvayN31vdIcvv-`u8s_mZYTX$kz>@SpRATCuP0!Tk=oURe;^)cj(mA#}D&! z{^4hP($RVLfsfV+s9mDk0jevj4u;wSx_jy%<9n!e-%ySfOnROIca!y|^~-S!4tf-9 zgM`D3o#g!N!{Kr3tWELcGZfN$wa-$MGEcj=3>W)#UP0QOOg{)%Qc|(nB9U8pH;2^$ zC7W8|N93)35-YfK*#g||?gjqvHg*qtfsm|#p6HwHU;LZlzG1Eon#7r^i0=tRM6s+c ziv={QJ#*aE3yBMJjpjy8ExFe-g6H^$?nwuKerzd1ad^ORcnR73euC4a`jD9jUZrfI z=`Yt9HC)evkx|fDeT~i#Qf04R_&ab)zpm1(58LfdQ56*wGX60*sd)`GUejD{L7iXc zBo~P_JzJaKJPj3rNLY;sojmIu%|O{8_Y0Stu|I8odLo2{{2o~gm-wAkva{-R0(ng% z`xlFa?2K<6xcSDw&9U1f%|;Dos+c`=4e^)!Ibn0mXzqjmhy860(l=~wnl1t?mump) z`0p4;Tq5ckMN|vgY9dquaM@uoKQCUd&l8`>%iBfF(NJbDu2C2s?SnEVYLum0@u(-- zxz(tpFApHT8xANRIWBA4e5LeEx~V_pEVMtA^*p38u3%#5Bj~NZHLh|H(hiamP(~-g z0{+mY*O%jG<|DD{`IA1?=r46j8|r-g9P#aBP&Ogkv%osM6uh+ej9El#j~JZ**izK&A_))|yYvWA<>sL*zrrP`2Z(&(8g$RgA?tfr1qLx*Y(f zb=Z~3!bc%}LB2>1@??fjM-dp0QzY;ppCh;4L;m}%oF?)iu_AJ7hMBa_WhXZC0V;2e zi&H>X!7lk=P+*S92eaUllE*ycv3&E;(3w=W!>U9LFLyPDD0d-NW)RHF@VB>oyupC| zX?*}yf+iyiNKD;0YMm~v5*$`ePW!V%*Tnch<;%jVebH9g9gHDH`CI5Hnm1UyDjbB< z#kf+*@EBW0tnIkvsk{8H$^1Zw`|!ENI&|^(Twy6(5J*HxmsZxy=-Zd52HZk5Ag+5v zy2j(BcdO#ys#&eTt&3RghDd;PUH1GJs7vFOYX+pmx~A)ue3T14i!cHb(1u>e)nq5@ zOm~Y$NV8VFIW%>t+g@@V;@xj-V$!7@LyiJl$}&q;MR3aml?>0bAOZ(` zOm(T)!h$@C(}#=VLk*;A%FJ{B-b>M|d<_EyX*CbQvEYC$`&1|{_f(Tb^&LYy)c|wD zu_AjFU*8UAy@#hF)o+*!oyw;Ry_TMfCW90qeLHQL^;&ouEg8c6eG1XC{;;ArIc;;@ zrq*`d#sLBNAy9IF{&p{e;#(w`DhTxc*PO&MxD_(ar03jRa5CU@Q8fV~c~;$&*>hg- zL(N#iuO^~zGVdfs=?litgtSBvWuU8CU-Vo(DluBEy8|Vv4u1Nz*@f{uI}yIe<=TO5 zEV4zMLyky(IDYP7yUYBB1zd>y+RY=rd_{e-k~Fw}LadH!gv7lRIFV!8gPw~Y{L3!r z0zS*4Et&D0H-y}&Riv`3vDWGI)ot|ZoQvDWc^eFr4su_BTu)|>BPMB{5r-xefx_>T z5_jnRYwm5`nZ}dQD`3Bt?>UxGIOHfkYbK&&~c#$?4w zwPc6Lf<}-ZCo0%V8I^HYcvoM9I+dI4tIs{ta$8uW$Q5x}THIWC_a4`>2~(qm=r$jw zhnLCWWvasA16P*qFgGOOUt^B=Yy?lC>jcXlLVDeZh6<{90ykN&=%VEa=B27pOQl+ zMa6K8I*n$BxNf6+d+2S+pS7cA2bhR zuw^hVIbF5CUUYyUhM&ysz#%>Sc2JP;xODxjH6g`gyP$kmX2>6JK8dc{&6IHS-zM5F_b7D|f|=;)P&cDmSr; z1DYApn$SiIx=uZ-0pSUnW;jq0R$HN|1GgOGsk$C-&nD9>gaiZ`bSAW`f7m{*On6ct z+=+VF0R{{yf#FjBd6JL&t?7DFFW$VaAqq4gGs_(x_f<&y47iUMwPCXCE8lcG@aXb5 zPNsZkapUB?M}tfm6+QTTHYP{A4#FW;X4o#?tmtUTOqWM4T=I!78;D+h&i)yq5*zV95>WCJ(FyqlGU`$RF@Y?8G@!U~F}BPE7~yK2kXF(G~xBEuHx(L{E3dy{iQ>#Dpw&8wDV=PZ*^_I-(n-Wy7zE0K;wn7( z?`HMB3Y~ItA}%H^fqO^OQQkUkq^g4BF;z1g6O(&aCMPzJ9o{rUT@Aj0Yvf>*it#Sn zK4}Bg)7(&ODkfMdGpK+8@16$}oU$22z_~PZl8Y_fIPO1>wJ{pG6YUKYv1#>D6&Ut- zoHt}{+ybL;)!n+d&Qnyy#^4QYur(x` zkVu7gx{lU46Ej9jaJnwnnHpN2-PIN_rf$^{&jkHdtI_Z5^DWTWFcKRv1k>=fANC2b zI@yYdL=?+-Fe(NaBC5ap#J*VPf3166&i+bz|EapzmWcq2TjWufqA2Vew6ZATG0#76 zd?xb^O+`>3>@4_#VE3Gzdu-%w%0f?xUbcykka0?9@ga!Py5jEgk+z z1mfzHv=(>XWp3{rQiXw2cIn}(kZS{iC-Fff-C1sl_zkI!?2@`nNMbMVx=(ZB-aGww z>n^l$UG-f|>rahVg!aGnc_FbV`>VC|%D(E+i@x()qmp?Ki}QcTOSuc1{w}t~wII;D zRn-RO<7*6XW1TnUO)%heY6$|irahTHNaIpR2f2T_ux%$1*TVsqdQT;TSENY=j=&zyy#+G}x!-k!{tJw#shMozNw-YOCq}BW=VNrJN>Iai*=_ zE9}fqF)Zve(W{5w3_s?2+{JmlS0~4?a6mo}S8)$#Nq^(jo%1Xf{EK;jxRpPKRfs(t z7+L3cRBOEUP^_O;E%8@&hP(CVd0*XQ3FSOr)w=0)erGDH*+AAEA9(~Ny*OM2^G%4F z<&cSDsW;HR_CwdXTkco$-(v~`ADiE~Kx2(j5GyJx9nHp863=QuJG6)`vvr+%SJ$Z5 zaVuFObo!DS;=)LU?8nniEwnh{>VsnPAl5llX?}f%&hdV{6OP|#-&*vV1CDKxDjSAl z&<>bmdmHGugQCTiPT`uDn|jTw7TP*CLv*^eoo$qI4Z#UfRMO+n8&7N$BAyW%CZKSa z!wWsUYMO#N>0h6CnhN57R4tmLkVuUQWfzOon{THlt37t~Gmv$u3p4h{_f*v9k7`%v zXDGixG%mB0Sfk@{N@NxbYAGMKyjo|hbKZ)B=u%U|gc|(2)ft$TD{ku-On(te6%Ny= zbaxD~3f`g_zkry?`BWfBkqckCW)&KcKGUu;95$=lp~nro^{rs{%Gd%`+&SAF+eS77 z-WQJE8%1qo_6Yfar)tHl(C8B*5Z7VN=4SCM;*3my)17t=XI1cc>ny*8p)GYRBNc!u7g_5!C_xvNN&3r#P-*CkMc6})hEbKW?114Gs+A^7Jd(;j# z4c*?ZXb`@S9lPBpmsZmX^AH*9TyW0itQ&dQT&C?2RZo9OS4CNt)(W}dGF#uZShKl; z@kc+EIMKi4!d{xuQF%UI`Duh8MPDxY9hA}T0;(xXkm*Ken-0uS9-bdKIq2yl;`e1$ z3gn?NVo10jHc7u7TD4KFXkcI+t&o)#?~xGRCP<2a8G zm9W&nbtJi9KD%rPrt5cOD@__Et~StUBDq3t|0f>jC*-74HIH$wGe{N$Z}*EPwn6>* zAz~a#%}ej@)S`+U?7p(RVQ!DABfB1cRL7L$yELQk)>lZ% z!tUgD2f!jvB=j79t?sHYeE)e|Yk0Fq6;vY>zk){Y7=C|zH zaz|86Z%EFT;$+$?C|W3`cHC{+HT zzdzMJ>V*&W;Wkj+44~Q6%D|~{&2EH4uw5h#-7Z3$l>@TGIGYrnHX~oqN~j#KFI^WH zA+ov(sALK1XEw;`A{U8^aAm|yEYQx3uiLmN6UFRU^0|Q`e7IJQEY@q}ryO=!i*7!V zSh_|dM*Bjz;=)xfbCg6>4=oQK(U-@;zo2xUHhD5f?m~iR2q9b>kj-38FrLtyV9oSgIjaqz|yP05WTlT-%TIDHy6@ zs8b7pI6^@IG^rh=_w^dudCU*wN_@DHPla_SCl(>&DfM%BXk70i@ak;+8d?up$WtY;*k-m4 zhp-EGR*69hPg=(Gz-EQZWG|X?$jLSaSY?Kk(llT1l=L(i3KKO|$)R~N-981oi<(z# zRyGX_6X2efp@CBwaoTcatv91zW=+vz-CO3PNjL2C0fG5XjPAZ%wN(uARH||4h~7pm*}=M6v$rFCx@631vymk z<5mB4idNYglF~~3{m^x!Ulm*vR{x}m znHUqAq`@avZChe3&(8DvZRYdlJoW)HaO0dbd6{{8$m5tyW_<_sJlm$vRf6ADI`cnz>_NGnK1v#w06Qbpy8PHS{YI&mhL~> z`F{$&7U+;(#8JcR(RP?*CqX{lAOp=7 z57=?~0*J2pfPf-m-wOl=LBIeM01O2u-zF{pd0Br{eKb`` z7XYj)%hK$gE~*a%0*V1Ywf1O>5diGkX+AL?1P1Yn=bQ%(C!p_d=dhsCObQ0EIx+$t z0KEHz|8v~x_%b5KF2Ku|*Ge85u67QPG6VJ>=>HFk?!Wgsiu?zk~e5rg3WJl_x8u`Ka_p4C|c1oRRgL;vTM(>kqXw?oRoUpxUiwha8_ z=Kwd|xR2rhKlD9#?K@6})=2VR@Kw^*KpTt|kirpS3@7|w#I;X0%34y2{0#h}DwV!M z3(K0TZcup0)vY!h&J>(4oHiW|`nNnoWuy z9)mtgn{BX%@h|ZjZff2a?$XkBF|4F`8$lWiXp;GeeGI*(pX2mi^~k5J}Q=KJ~a=bto)NR?qt>`Fy--T}3W__o*33Zb!*71i5N#sn;DNSG z&O_Y};I*|U(PIhtC@}`O{oekZ4KJv58WDjU0uAdO!kGf&IEjz4MeDaH!<|QcQ2@Ni zjgl4vOsz?fTFs*ih$JMu$f|<}?I&?)%;4kO_|VmhDEdTbx`cmP$mtHwcfidpxs__( zQhr5eFT}LkJLvW^((ch6cOMc>;iA^h%(o&ue1Rnt>dc_)+4|w?=m5U)w)+Spi%Ocg zL(L@aOJ?u^o!>`aC)n<46@XKYu26Fz91|FJ)oZ0)h3#j218AC*Y;Y;4M|^ycJHqeO zu7exP4e{+A?}#ZKT~gL&xJC&lG7>Rp3lBm<;Dye?+o(8n8bc{A2{QTf8{h1IUzB4I zis>sa)8E8M>sxDEbCZ|Xlb4hB7@2T=+#%;K4v5nVD-x%BoSQdh7c&auQloq^C|0$Q zrv4qn2}fz7W*qF;&1-m;3S4TGeq^0;QhMhefd;aeQPf3`fA4!`=&AOmMd~hKCh*tM z8uI7~+wOr+!!46oG;*B-ejzZfNM*~D{+Y!D!ZYV`S%Q4zDeC)kRLjO3wt|S)JM!^a zEwO?1Cy?`CzwvGHt`n=L^4?s!Al)Wl1Wp^BPKpoFjr`9j` znji>I#a~0o?uUe3>32aiaZs{M=#uCCrVBZdFrmGJ_Dc{_ z>^p^kC1#_!19rCl(eySrDDxL8Ty;W9-w3DExO#vWw>hx6Tsv11DpzINz?8`IR1sOLHnum=QWnq^4jsA;b6H9Vrs({N6>XU|~vB&!(n87fzr z5+QLH!dx3KM^E|N3t*xLR-2{}8~zd;Qy$XPfKP)6c^XeQa*6tWyVa~J0wFXZPq01> z9U%Gn1YHixP(U2I###Fvw^MaEOTgW6`(S|L=(e=`&VU(B&^ybud_#v%Swb9HBo%$ikYrzLMuXKAe+xyii zY+i7Y>l+#xCLzbMw}?Cp9q%dG8lLxccsynVpI4pn0v|$GLyqYLAR|=5Vl(Elk6HpQ zyi*4QWgIO;3}N+cSc}3P2UxIT=MhSqQs}^=FKt?jnM>JO?ng4by2P>h-_W-BzwGGV zPD?l3ENh6)AR=`_;SOa3zo5|xBpwl2Hgp2&+^u$&9lgE2a>fC^W~jT-?>!?&pEnf~ z)cmxMemnauvw)uw_G{-4;Qu#eHbopN31@u_R<+MVWl08xtf7NPt0qS-EcK03MkvDzb{@j+LxG1|HrK9|mHVyNZ?>VG)do6O?o?j&HLjK7^32z+yL_iH?3}g}0DdTd zpN09`2(ItL8{qEzJaLH$0BCG)|ADzfh7MyJ@raLVbg{f(@^6%tf|Js_N5ZjSg3AJx zve4E4ZG%=DhgCj6xjAenlu;Z6?O{s1SeYqmU;akUY5~DW^Jam<7Rd5mV%C(WCHa9A z6|mQX=n8G}YpGzslTUVT8FHitO_4u&e6hLylL!VQmOh^*92lVksvZjAR=MMW6p3XhIKL%&*~94n8BsfXwK9D!#?K{)Q9v~Dnr2Hx=g$DFm#rO)CiL~ zGz-O~&kJtkLVOV2d#EnIKss%DZAP>aqmrs9F?aBs$0Aj#OdK?Ms`^jq9%M_ttE`kUJKiot_pXX9ynCgUkjrp8_Hz(NGu=%{>N; z7Y}B+{WSC`{ES#er4$w@J9FVY)K`88V9}~hK$~@tu3=IRC!H@uJiG*^D1rYFFF;1w zWOpM|5%uqttpyXTH!NKC0nMR@6nH%!JN&X#6xX(RL5OEH?3AXOfB}*{MtRIXA0CX5 z0|WWnDUuR&j`t0LHM~A!7iR)*4ZLY==?)qI)f&B12T-yt;_Cqk6#oU&zU#Sns`aWfA0+wXfUn`-7VeYCGRGDn1uJUEipb)Sd79 z?>pI(%aI=+Cb}JW&fd+$*7Qh)+)0nYG5ggTDdkNP3IbANyCq#Xk*d zu-_8(r*74sd|VwhE!(Q;&`YuV&ivA%RgtK`;0-iXP+nT}EicV%++BfPR~Z3_U}^T$ zD4F>LS9aIk8|#o560XZ+qSxRSi-DxSqPVVDr1UQ&{eJ|kDToH$c7U13Yz6q=`)>Je};^2Mh z!#>7N+2sii>DZW}aO%}=t0@zDNw?B|;WTkV&1xRKcgs!jY{GqDidEEZaCt9sSuvEH zDZ^;0&sLyR@_VjYGK}0s@jUQARGJx*5tuZeMq5Q8Pxm2S$4Gj=?<5znQz88I&J|ik z`h9;V!FcG)&voFj$Mw-;%c6$Q?|=oh)c7hMwBsNBdpJ+(W;?#XP;y*?E$U9jbbWg% z|3Z>!dc&o{U(oAlXn>?1bBh{oyso;HeSe4` zz`pxKoD&QsrpG2amo(W@Ja1dhkmav#17qtePNIua_~01qo^=4lU8Hbnao1QKNKtK@ z#J!e$^IYI9XzMazLZ+LbZrrz=q^f2r;#N%UIpQf@r`4=+Ob{sSj|u*aflB*C53M0T zESV9`84Vi&#*4Hbd!M5w?%CF@hd7RH7dZWLmDOpmIuDvpPBw#6FdZS-rz=?2f1bi8 z;jw1j#E;rynPcK_YaEM#OpBTPC{KTW4Q&n*@_lRuloVnF+BO;MsCwhRQUu~F1jv^# zI7E%Q6jvHknqI>B?*(b6#(#+8HXOAVVC6_;clE2z7wbSFI*yG6gaVVxJU0fkO)${U zTvP6RrPTYW7D;!V=tDLJq637LD*co&7&bVGc7oOzTak`VH1G|?%%7NE!pTn;RY0W;o@#Ww6Gh=RZq0wX3sB2NU$$0hOzT6?6<`Hhcu2e zwlZfR^1-tW9dqu_elpuHzMkeyXKaSfg$h#m<4c&Gqg@~P z6at%rO5g**zw^QBF$!q=38hPGVDR7~fvIu^x3gu5X2E2OYBkR27>_US{0-x{@O!^f z@mk&$1m*Z4-~6+E$K0v1L&l(aZ4PsOIc9gEXRkcgCq5#BE<^g>!;t)ak7N^*H99kw zL7)vHydoJpaiC&Tu=~468=a<@5g(|BeqVn{qUYX>>2D_(h$@!N6^%MpZ26AH+{A#+ zV4MXxCA;_N&uU$Y=MK?p1C;v}f#oAe1Tl5vTrG33jO#HT4HZ6H#0pSL3ujuP(LvoF~DR13u z4e*3a^()po@&DrM9HS%ax;USXZFg*^W81cEbZn>Nj%_C$+fK!{(Xnl#CeJhPylZC7 ztoib*eQNKs&;3xV>fCc{|F_hF0F2Y;{;)OJO4)s(;5o4+a-rpbkwL*(j~BVjj#i4~ z(OlEqpy`k;jBuYct=6U3%}8HV!4MWxh#Z~z^Ry#k#cxn(`LJ2Z0Luf zA51UDnkwiYYBvf)(UGK4Sv70O4&v52Bp~ZbJmwOwF3#JJuqlsspxkhqBv z?^v3vPhCj^#Y*uHEck=tC`1GG$B6h#i7wLw`EZod8A6GWz9+NsO5KTJM(a*L9u|fx z=_mZe>BQ}@wd7I}nS#`vzGi2APq@h1WhZT}fCLk*;L_foDcvSj(BDOEpm{Ep{VC2Q z=GIN?j;d%Z52v}_hxu{XQ2MEs-UMpGzJ8iJ+QTV73Yek!U30pIEMj7tnEPO_>}S^b zqq{iaxB25hO&$@k|4*0@QTTY7WC+!S2x;kqmp==933@oyy(_`1=PHM3YY-q&G1`I4 zP6>jEJwZ~xTJ$hv_bpvihe&NW4$}rI)*QdVg9cU<+rHeW>d5+m5+J&r&2>tPl3J97 zsw%|S`w+m2V$}R)Pu;U_=$P0IKo}mdjkYoNzkM6+O?_)yd_p&8w?O350!tPN+J{r& zrzQ6V6$5cqlD`uD?p^mPS7iF4ODrB*Mwkw+Jo!rYK2z4pK09y200V1>Mv$^7(aYt%8U*GF7 zDLe_EwE1fRRa@++sk95Gt=<-+mmqi-eQ9H*Fg$mL3F;mtW!pv`Kz%SW(89sF`xvZ`H)pl%+y)P= zL3)q!EaOl*YfTxFh6xkJ-yUI+R^o%zFA`1e8v^X?WeQ#QD8zi>ajsq8_P=^hy^ICs ztEA%0^UBYh|BOW|t#Q1GB8r7xR0(#qjDzwQnGK?L*}0b911MpOfRRTo5{mk$;ESb+ z9lsKfMRBM?6uB_w7MP(Q5!K1u5uu2{8ZEyl1M5(unwZ|aKP6Za5! z(?IV1=2qLh+d}3p-4batyW4zR5M~!ypb1`wIvQRZgRl9>c0vs7%G$YBODH6BYj(%? z4JVEH`kmn-u?R&15?|5ovSv~^d=JH)7nD%i^2Jp9dK zh^XT1lwm3I_SVYnYALXpM0P+I2v*|M`bT7tk83Cgx}qSIe9=x&z}0ea>9!r&F# zwO%nulm3DKmaNcCMYe2k{ym%H#U7fIHs&@}Zz!EG1c%ijjlooVG`yXmk}pRRN`^)O zU(~(KhIXTlq&&K&4NKD9m=*NyxjsME`sBCJn?`Um*Fn~A&d80lUC+P-U z?E@6~>9n~*+)1rfHVL5th6r}%elee6CW-y*oLzj-Ax)fw!)G0h`8sr-JR z6TlV^vZUgUdus`1p%h|y>$Y^~({g^$yi8h27axUE-%tm1vzMydCd0a1xk|u`4Q6Fg zw)EwwJ=acIP|Gtj?}a{aT2G%Bo0=$Cu$db`pV1+1jNB_lvxcO9xP~zFmE{zI@Hqdj zN>AcQUJOg0DKT}$m$QJwk=CeRnFC{T(xl!~v%nyl^JWD5!_g>!%Yo@ZtkzUw=xPsE zo{0ck1qM5~*i`v>Q`hI7@J!ALwfeSfOrKzO7%|^8xykT{)-J;Uv~`T|^A_bmC22Ni zdMa~kcyZqQ3Fau5g{N|%*mqIC+zmH#uqs94L+&%RU3(d#uCJxLHsXQ*iQ?g}J}E%i zl~(({_k;NrtWH;@vj+5+o7@qfsrZB634~MJ$8R3jXxckLdhUHj2}qV1IbttW2bWA8 zGawAkGt!wV?eOtC;Re^kcieROx+_5 zCj_4JSb)2oKo&S^IX;=RAX1r-h^=A1MU6R1vDt zruHd(`nh~|UeWD4Q8o{z+X+h+&T~qyOjRhlEri^uO*KVmoa1J3TMFNgkE02onS=Y=K0o}Fq-*Ph=3AqDly)bE$Vee|j ztBSYsY#DVp_9CB-DKkF~_V!atWk76vOT6MFRUf=nF;%;qGHHbSm9Ci=Xj?i-23mel zn<+bz9br?_^m2OoEc6x2uUp8&T$-JI2b)js6;YHM^>KNhgRUbjAM(CKikf2^ zA#&Gre^mS)ig>F!4U(IxAo9DEJLVxEf z6)( zl4C`Z=g1p%*q&rX0F=lcw(?BHw%8fH9NJQOc%rDY1?z9fF@++OLqR@i2S><$sZgdR zk}Sk|%&n`%ptJfR1eDD|-W)6K7v04eLOOFVrws;6b+&dUG0__c-51WW!-bcxA?fVFm{RT z6Iq~#$(Ijy;>3WNdaB#v`G**et<$Ik-*~u*4FuGTWe_uux^2?efg*$C7{B%6>U8^> zj(C4gHIJaV!+JYEna&uksyPU+Gl<*U!m)z^WN|9JfGX86^A`EjtAk;HlN%jBS^cE= zA&n?6*THBG1Yl{vdjaHbKo@%5%$M8xPVoBTJ)57~>yD0qw1LdQg%3=hR{4F1h(a@u znJF8ui5H!X+Mln@hWm|qiTmrSPOZJ zIsp)|w94qX61qVI1O2_&hJkEH{`@$g&rI)INg9o#vkV&oVES< zWZVPVT^PR`3<1slpV->6e%gFJ4fxL#9H53w|1%&8IR0NmV(kH$|H;!%#%Lul1a!5+ z25PJv{kzNw^)NC^EOR6l}1S*WffgaRP`HQd&J2?gMwYd+_o z0fL1B+@lk8u6|GBpttJIWBe2FZ}|U0#rV$Wg`yA+dYVwcha_?kC_w+nSaBP_SL6^L zwo`0D1rlO2hXDtDr9)Vzb@I?u(GU{C{2zQ`vd0PqjN%XE^6B~Ucz2M)=+(UwdI6SMX;QFkQZi}#+<51{g-vd6rNdy`F0_U1??N=i$QS zPE(hIV(fZ!EON(o0coODOVrF^?s9iL-+#QN%fv8>j|y`Gb^^bpZMrpD~)&SrmhIV)1jqqwIxj(s^?al%_Wq2r@o5Q z#*CN}5{1?6*;q&8=j6k0u1Y}=j-DFdliSz2V_n0qrcCuiu527T0^RPJ5)|k zqVxmc=-lvB;ED|}Oaf?jWv#Q$8F=jujDQ2z0ac@KwCW{BX>3%q%p)r{m@_meP^na% zYvUe`k-Fa+@4T2gpQ=LNYfM@)K;4+?o}9YmcyaQ%l5qtnY!T<-;=FI*= z6>r8W_U-ZS+&UZxxc1`2LW7Kxt_@U0+{2{zaGZx~fp6B`?bTR!)GcsK$LOE<+PMC! zdP_f(s7BN$#k1pLb;a*xVYcobA(6B&WjlEZRVefqTOym)W8LH{INSQyZGPb~ES;7b zGB5iY4|`;*h0skOCK=Li9!4P)a2;E)#6{~zt8{Ssg&_hBt4`KZrs6bwE1PNG@x)mM zH(!QOj&b>HS@mTHp;2<}HGIhr`Ae-!FW4R9*(`b*wEF^fMcyJ1_vkGDz!=u<*A z%7!(iy#vHA7a_-cMH3yl4_M4&6W>B~-zs~a1iN^+Y3_VGbeGO4Af^;1jDe)*OB3mT zk=!XD9!q_|$1A)xI3w9LSsS7|vI?#F{Jl?75zLfFbeo-#kgo;3cbx7$X1mLB9mbCu%h}CVwrkup4bZ2a&ZDb3qOEYl zmXrnfXQ5J|YunH=0<}1^B!rEe&uSWtFpb$l!y4@H@g9D)DX@}XUC>hD?hErvO40x{hG|z*x_=s{WmF>GHIG0*NT!A&oUVZ z5_}XNUK?~SGl&S()#SV6IjUWL>o$V4D)d&AUo~r4otQ93 zjeiWK>s!0ZYT%V5zX79CEdp?gl}ODqMEFLcx}y^wezt#C3t@mg-)7a2_3H+CO(L!Q zMF(vhlj#@Qeo+3SfQYZykFh_F8tMm466IE6*CJCc2Z{T8g4{;>euNKjIo$ziA{w9XJEDCYZ=U;%AoZ$Akq#Ma8!K9aKLn9cJt znt=3^ACJxWP3~DiyiVk^>+?DlwR<_6;%XmUk1lI9CzsXU86vn+OZqiui<#qhG3P&4 zjTo54P|>%uCzxbO11CUu-^QRltU-sgyjJ-*Q{pid4aIeag7`fJm?uuaa^!?a-cKMn zc;wWN0JVE0e`{XV>^{s{0CrSnfJGKn`D%%ySx-(@wb_C)3n95O0&+qVlJm*8aj*4W z5D*Fdy(1*0YqOc(Z6s>bx^4t`=inQ4gNbe)0`Co5xH~pcst=8(lD@{*9>JajMAJt8Ro1<)~0{mHl8&xV&h=*_&dFT=`BPg1Gh!CM@jl+l)^tqBc z#`Nz4aprJIE!m&hjhtbeg&bii!=k$M)v~VG;e~FoaLnZKal<{c=8BOQmbhf{Eoc0B zzk6i{&I@ED#>9%r{b8LgHi<@%waC-&WhXXSC^r=FEZ}+6m^t13HQNe_mXDuSB=tfL z`fVaj|#a6iSZ55hawI?O4Woqpe%Y7K1Q@zhHFSdVtPvTf^xS zX$iUUN(>7=2vt-nQd{w-$y~tMqxnQH_)`Ha%95Jk$2C|ZegTf#Qw;__Ypd+erox%q zOJ|o*EQS5dQ4hPo0_h55e#ErSqX#BJE2LUPAKWu*RNoK%+d!<|pAo`kWqx>L2j1~i z^Z38S(wziw&H6|PlI@(}uNuTDAI@{sA5bo7YS_*L+%N~Jv17TG85p{t zC9Gl_Mv29Kk#RfmxAWYqw3vhVVwEcpMPv1jvf^)bBooGjp;z|8;6>V>LPaIpZ1|e! zO?4nn*`1t_G>lM35PU8)1ivn zQ$5HO_!}Kp{gRCjVJsENf9_S@*(|J1&e$)7tJB=HvXP_C6KwQ+ zsZo@$kkG!)9&WT6?(=vae7RI{Us=9Y1Ae70-~8@{<_dAn8(VPuR)$iuZgnWnA1RBC zB0JltpH}cOK09e$hHt)^b+Hm7)>T&~Gj(H;R!9@0P{d;2?L2-r>_P8#n`_Z_k8rU> z3p1IJ-HoSn1P`ducp(2S-1WDK=^k+TZtwUm@WCAa-gc$}a<~g5wDo!hhGm`we3hF6 zegTo5f&ZfFKV}Vx!lYU(=%>Io5bVE@>H$K%`~M4l`5s{6FCc)_a{me!s4#-JEMf?u z>QA8gZ9FS107KCQ8cJQz5CZ&vL(gA&ids-mTB3ho_^HKO3!24+ulX$i1Nr~N^+!D@ z<}h$;`$GZZ9k{kP`L#}Ru0K!(qHV8zS!h+oBOOb)?PWJZ!;xHdHnHVTWd2evZ#_fk zt9H#UejBy*&5M7~moN-J-Cy9n1K-4#a<1Oy^@jq}clZX!q`6a>Jod~%nY^z#c2fZG zu^ijvWx>hz>u?JxT!dp9pzi?lT0|m&-hq|IM>c@L03ECC%xZ76kb<9~?Ti|rxd1pl z3GmW&Tukil9&I~48AW@z*Vf>h6g>;6$o)J8h%E!dPCqHxV;~#Zq!Jkpd^QIaPB|<- z{2S{IYk=RsBQ5v6`hOSbpFF3yvB)s@-m?@m&^1jWB!9cy)}|-AeNI#DFuc8E&(;c0TEW%0BTa%c;auI)8uPN75uAN-Jen|GSK|Z5i)X z((ke6AX6-~mJg^T1qqy0w=~L8oMy3~d0kYIuyp9`#S#R1$;iT?bW^QfAj~|u; za-X5lCKj$uX3m6L*5%4bVqcfLe@{}_DYDtX>0O^#JUggf)v0gYI=eY-#oSDl(A;vt zx_cijt@Fg<=qMshyiC~iVmeU&I<_Re=W!w0;kd4K%gt4CVmDybC6psD4RGI7oq0ek zNt8-3FK>fWmF2>=l~J)u#I0Tok1qVCmpuTsm1fknT8@GG{!=-5+W?JQbCre+yVg%E z@Y`9ckH5SEB?ipY$%*M;Q)BCv70rp-MY($9v)Es9v2Ryj8LCpF3(QBUte0@{>vJhg zhE7!c=?ac#$HIyURHPNgx6IckPu4?+deNP4uvt5)x_@F^ioNJ+6023bSky zk9m!?1`G5Ax<;rtl3z0A4;P8Cn(ZId0~b${=BE}Ga1GZmZ71jCUxIB|BmJCYhqX|F zeY=&L3W;@Wv`$w{qY3p^D#H3_C8KHYFO+sP>+9=eGGpQTr>i90U zk|}Y73=R9`zPF?LkzMgzb?OH{qhy3p8y-__Y^HkX8QvfB9-ipxZR_o@Hu?PR+@SqO zG93>l+3YJ1Nof^MW9|L>XV@(pj4G){EBNX}+DBa$NF5X6RXPOfgGGbSJWJf2zCPrt z_&jTr*4T&hArDd;_N`|lgOeQgbxl@3kxVyRAFcQivW~P#UX$b78(Q{s)(I=6r$1bB zR;0mOYL8vU3oo6N~ zcAAW1BrKbgjZc|X0PK3sy-$#w4T!CkZ{%PrvL}PyJzK20>3O31vTwc_&2LuB)o=4< zvr`HEbY?es-A=fUua?e5J6Ej9DwEI`)@LzXs-OLSk!L`P&-o@f5a$PAGy?GRsOcd( z54bhNcnlN*wr~{W0f9~T{y^`teRpXBs0zVaSn&U%bRtNNNE0GZZM)_}M;8c?dOr#x z`Mgt_`4S*K+7s~In{o}vZBD6^-7d+z`a;nx9n4MJ4k&+Wp4A4*{gLY-5Mftfc^US3 zdJ@X$b8G18HuNT!br&mnW;$$=>>RnCi!z%b1#{5i|qW&p1ELJT?Q z49PTl93^MTXd}#{x@`CWc{=R0D(L!Mimwy1$2lgQM35J7wpDNjBn<(IQi#B%!=EFy z;Z59qn`{G`e9W%3UjaQk+i;e?zEG{O5Km)qejJ=&N&QSlghG>{0Y+vDAX%p9pNkjH zS}pM15nNG{E_GQhnQx%<^$hRn3)X|d-F|1a+V9SPwC?DFHE>wIO8RO(nDEsE1MM@# z(br%^sa&&&rsMshIv+vRkJvNhuucud%+8UvfaWSG;*rxiT>6F`qr;Qj*4a5Ro-G4e zvrsCbp%}AK1zdb9ExRIV#RK&3g$N|@qowabD;<{5&DL5@k3VF z52nh?N~uRwu8`t2sTK07Bdd1;`d(dv$zxhCIWDrLL=%q_c#yW=0WZkBMOxyf764RT4HSft2ueT!fZ-_0p# zr6u7>3Bfrpy`5dzaoqKFdnX4pBF zJ-Je`d?xx9UvOa@Np{2pB`|?}-Z}auLM}bnGpm7-z7w=#TdeEqS{JJ(oP248ZooTl zkkH*hH znoCZAHlQNVNO6}Q9s6OCNNnFl%fIo)lm*IB(0bym&37;q3L^mDp9D#4g~JNn84|8w zU4+>MlOx^YWbiJ=w}58<@8S_-I(-e7#W;3V#yA z9~JjKK@%N3Uvsc5n>ie)Q$9JfAXURIx}t@Q`2+pA>ITt|tUpt_jUg_abXZ>jD-V>2F)Y|)2d$EvfU8Fomy`(3K`^)XpkF%648$XWQCi4NeGKY(qXI> z%d-`w+6x3TUln50C00QK-Y3xP=~xy=K|n^ zAf&K^$(Tc$Bv=VdMdnD(bb{k8)=h0AYt?1oU_?uB*9pWsb4qy4DeGZ|#15ASsi6Ry z%DI>Y(3zHai|cVWA){_4`!&YS(TznNu+vi9*hHeN3&7wRQNIv9f2N^BniDuJ!t9cZ zy<}=!nojhX$oFe~10|tC{_;xojD0j3I04=AiRwRQtw=*w_^Q%`!bKv873epCE{)!* zZ1TfD!bG&QF48M>T+FFM3LApC79;NRIH6{a%(v42#ArLDNI0qnpIEg@G=K)1=s)8N z;315xhQGzOV2)a9Bga5m_zq?ZFa2@9bx2b!GP00uN5x=9vJOo*hHM5bclMgp16zlm zO@rf5j+kgLKKG)csizBWL;;qZi;M_edujmLAa!N6lY74J4zi(^qWZIT@gc3)-HkM= zx3?q*vl)Q6?@C&|o^5d8EKYkw7+$LgG^S!+eU#)%AqypLl@ImtZbdEnMbsx~6`KKY zM*^OB#txX(J9_NGXuBY3w=?CSr-p)aT6~I@U_&v`AN_5Qi}iJ_26d( zJ$S2(Pwtw3k;Ql~&T{0iW7kMC%j7I5VZE?}@Z(@T zrVHxq%<%X3tlBy7qMF#Br|Owa2nuFiY3)NS&i?xP^=uU*EcF!q`RiB;$CWv&chd-K zCrI``jUa;evS#g{h}EeWKg#r|+7y=71lsiM&N1iHkhBEuaDNM2ks#P8F1B7Hdfo~+ zOP5V-^;Tr)%BHeqC;jFey!3Xgy>oj?jkP>_KN|iB(%`Yz@AMOE9xW*(hS1|xQ)gXs zzR#*Q(_4saQI4r4a5%=BOKSf4Iu-OMHUi_2QU$c$u%e#9&^#pLe9R2>N9>p!*tdxb z*>Ajx%7kf-W4__&!JX!$(2sM~i<{07Ck7u^Q= z?jtvmNwfUDN@&qk#a?iH-f6QiHB~JzkIBmGVRNj)#?K@&6UJd(;QDEa+7}wql)>VL zRE3bf8)jL}`3--pz))zM2vDvI`?Hvj-z?$vAP!NZUTn>;D9s?3DA-|^2XA0an7N~O z3GNfzPt%R4v6FDlFgeGl?rklKo2Hpi^8&9M7qV6E$9NlqH|?Gz5~M_+27q~ ze}qoU&}qDem|2pnTL#b7nAWPKS6xJRjG=73%*s?j5^DaHnc8tv#xdOTeLc!G{pd|> zYHH$5@8YoWPH+4>X1nO*h>m5fRWYYhrbK@+X)goTGC87r1hKNY#LFV*qz;&{htT$n z3?f*vULWb2YwV&joWA)>I83=;UU#s9Ctg^0!(%B+&y6oPh#M0%DeVJ3Z{P8kQmv() zO~PP(#%f*KY+--*STHC=AZ;Ri<X9y>JM!@UBy49~5}{doBsXU*!T(W*juFMZefKN=r2GlPXSg#W9TX2^ z0v8N>OCvY7r*DRsww9;*mp;+F^@R>XA0pS1(QggIM@>T1=MEE&!&A``_6Xas&ZHI% z@+0mT{>{nk*p8%IDO6``rT`kBt_Q8N1@av%-oia!t?VgTtlFZRWSP^k{qPDx90`NQ zmb2cqL$nW}MUthFVSe`N$p%v=LDHN7kD+LJ@^Y&|9eB$O+$l&tMy=K}3bT31YWfx? zlknHXN<;1j&-A|9a`W^wEs^w-hcgTLN!l1ofk#sIK<&(@+)n9Ts2^wL>ks-Htbwi_ z%&A_j2r54lraUq=iQ+rEPV;3G{k2_dKb8C&%r4N(#U9m7+Vq~G1HG!l4j?{Dr3k7` zn)Q<#Ojd%k!JaI;ypL^!)a}vkN`yeEZpPo|MbDlL2Y&0eZi}AUrhx zgB`}6eo$Vz{|_#id2Jlum%oCNy+nYBg@>m*rL6LPi)zZaS5R{Vixt3nnvOxw4eat(i4&mAc^gPvmV z==U9nm#D=GE;$?cQ3`VW1dYg!7&}4AzJf(-o$N6yTJAw+fZRA`s4{^can&{%M>UDm zQg?oNOCF3Miv1#iHTDBY5iyu*HD&ReFC`dPvWm&?_=Y@+X`G;6Zu(66lETD@Vsy7X zI8?2chW-NT<=dBN5#JtHFbrIE^%4{mHyu6oZg>{74m-a__Asv)tZKNi0mhJ}4qK+7+PpnSDs*1}d>@U0PW#|n>J3QokxPx{Oz9cAqI@iU4Vjc+&#RCi* z1Ce(W-7!!B3*fV&JA+h0xsy8-=U4G8<#|`ekrEDFvS@N?*S4uMpmB;!=qf^Vo@UgG zv@q6KZ|+xRpgt8@vO5{Qv#8of;Fa<>78I`#c_5apG?RKhY#c|R2L*6??6_JaTEV7D z;*OUHqG^>bF&ogm=u%A!6k{g{k@8bRjA?q@EwIa+g8nXLCg*?T+;9A^b{C zo)pa3AfCW_vJzQV&YkOnn$Qeq>9E}%8X9oHQBxXO%eky?2q73SKfd?*7kkO!7qfX)#?gmMq@F9QT2x1b zZ#w$cIf4}H)DbG!bkA%p9jlc!MBayfSH5T3=u&= zhwCa<1MjnDvL9B$;`2X7dUPW(l3u5&l+erXjtk`UL4(dOI!HM!WhI04wRuY;R@tMy z<88EL{z&#{<^*nZ@nrOgCY!bsn^Esq;L>*U6_Fs7t5I!a00Z>=Y$#M@uEa#MYr^lN zo3?`y1sQJYjmXC#W=J|BR18Hmu;wrxxJzgmRG>vIEDFR(Z#jh#xBt@BgR=-u<1v;n z(QrL~D3OvQAOHLjM}wYHLrkWYOQ~-3Ef%e9`N*3WUbM(E)0`o>DOe0hrykiyg(<^U z&uvo2Ge%9m#K?s^c$|_}6Y98#DW%Y`A`h3CZ9bP(d%E=0*B3`2wRGBmK7-ch)x#W| z-fPMiJC}pU=xb?HlU4VMwI`qd`+ZTV#&l$05l%}9^`NuDpXKNj*M?RG4_7kHxd?Mt zEdL!b4h=#WSI{J~1yWwWFrA5z>Q-rBBXophnTxIbF}GQ_Or=NT`1~?D$kM z@F5#jIkCQq4ON{Mk1E`W%-K73;Wjn$gYDUpqfZQNmyg#3P1Qi9ZLEJO`#Vd%Z9J6$ z9{)kz%yAn{kf8b7=BQ0Q_>Vq>GOA8WSg|C#u>ra~*!FDFx8#YcQ+3Dfv0A8?!jM** zhO(bO8rZxiZMcdW*-}dnvzoKJPA@8uY7k@dCa?4X=s;^wVerSVq5%|nWp>mOac0wW zUeH%AI4Dynq3XzCp%tBemi=Hn5T(#oH7yf3|J7Qn@ibM zkVjKz%i?RUhR!{^^g~l28I8W73`{=-*?-vkOS%=paGG6gx<-%IcWTn1_=%E~DGR4u z3I0@JSAExg4!->%-e#xC!7IV(6|hrE+=L(rj|{eBKblBhHzD9aZy)uOy8SXbW*b}# z+JIV?lj-bFbBK?0*;Y;o9U9*sIUD0ql*My7O48cLo>@D6lN6b)0V8)wF(E!Sxv4?W z>abI;W6ksh>p?*IlC8JhUn}9#&7=pWWj&aPpF9rK52ssk;r21|Tqb-T?l_GLo;5NuR}?5ezJ}AwSZmmBAynAKOLWb}ePFe)ioEP8o-I zerxW;)NJ5Cl0ajb8UMaa@TRG9+uj&Fbz7ZA6JXgdn9A{~!&P^KwBtPF z{}&xg^NsBx4DLrza)fdAgi~mZ;wJf^JKa#x!NY-ZOL6s;#+xqyuHc4*&Sd$@37p?l zvu%fThti(dEjBx*RP6zt9Rv(AQC@J9pyVIm(HOe;K+!DoaP#x<#H zsTgwzn1b}8Hj0^LT*!d6lzk7*9;goaf)MLi#5?OdS@zH^UP-zwCaf8Tg?%OwVTS~N zLn+>NgjU3Lw5UEg}=KXI*= z0r9IRDJYwVZgENPLQI+i4LDw@?@D*#+mVaVjvYZX!5w_8a2pKixoK_2UkYp-Mwzc9 zX!e`B?C76Gy6BKMG&lmNRiAkoxB(GUKGrVIhA%6gog5+2v?d&!j&N-pdvFiavjo&&X?o zU?9mm*8hCFCK~O({{Q%tSO4SxI~)vLqx~FDDt$Mn-|2(K5^w#{7lOhdOZG4AP5ya_ zaxlvLcl>1p!;$J@{}WiO%JyITKa>7-7dEyu@_+seyDhoByjuMv*9uhCC?hX1wq3A zz2+h_`T^|{r%H|nwqZWdK(B1Z1o}Zgd_TUZfj!$HKfaVU`Say&FX=i1YTK-(E}(+x zyGBqiee$Q>``Io4F(wwWpXl>!7Ooxm6t64V%<9!izgIuQc^)a2&;x-|2SV^)hxYz^N@Upq@-p8WhNgQMAdu{8JdrsfZ)!fxWtf$AHaOPvHaqszc$|;Q&Td!0yV?joTYJ)_giPE`mO+cruqY!A$Rxc z>1Yq-&B7-#|Az%JOeBi9=E)gl=R2|g0D-Xdn~OPZbk<@MqxG@fp3T__!y_A0M|OA>y-6~3307?%MHobDQz}+BC6ihZ~D1R>YU}-&wM2DaEhc3EoSNtYwZm> zKn%-Hb(iGYOy1OatwOFW2A6$f=!7#Zrv+NoVbU=)Tb*38XLnk!x{x_^cm1+;3nLjF z!q%ftRn;V`P*Fx^OHX<&>&Y81vhE$utMs>GtJRzO1cQ4w*y}+cP%-1C zs-C{$BiZ;N?rsYX7X8w`6Dlxl-#D4w00Hi<8;8i|Ep{zB8=)RNKO}gSgQEWuOW$b? zA5vx*TJ1yu5P}Ko4&MFm-tDF+Nf(4e++o0nm6O2MMfub5N)t`_a*FO;FfBCIQ?~Ni z5**vJjJW3S%_I1L5X^mv9*Id?G}Cg=e}C6I=&0B-JxYD&X8N4O9_#l69bN1G?Kzf8 zev4l1i6|n*^4THz!v5e?TcMAKPq+cDUnNa7Zx`}+X8Tuc&MzV9pcIF56c5eKEs7UW z4Ruo#1Zdn}d&L^^&*Up19yN z5I)6c4k;aJvL3KJjq$fjbR#hvVgnwq%nQ$(o&K(+VH9-tUfp)A+IkY|9$ie8>MOey zQx2HRfpSqw{5sR>UtrGgIgYfuts`xD=(IYaZ2oobY)4H-%K@#c=;uzI>9%hiqFa;T zp~f%2_Wa0>mMhXeBC=LJEVqOI6TLg29k2ddR5<87xXgZJaW4sxpZmBN_s{+=6hkU{ zLK`UX5=NgBRET2eMVfb&$S!Lt{mB(Dfc{K$KMQT;@gJ{s>P1qRILxeI7us-QPZ69;juPVO%e znevfS_i8UwKNTH+-+|oJhmBsl0cUH&;H`wL%uGV74XI-=-OM!o8*$VcvhlW#j+OOJ z+rjKW)zS>L)Ke}U156f(8fr#(Vs}=Ioyq>4eNr@DJDIMJtKJpKa`ANL^0dNYYvB0p z_xG?wZ;j41D`Nwze1%C}g{j{;+IUrCXuG9)g3<<$<~_lUd6v;O*hy8Xs5iTdx5k?K zGHu<*BZ*xIS$8E%=hF^|lQJL`n?*ihezJbMM7_pxzxZGIps1V4ZbVraD_fUNkzskX51zL@@wZ}67b;3(lI(&7 zWMz>&5hz;1ywR}s>ukeE9(zCGOnvRKj6l6TqL;(37E?>mPanQd32c5|*Hq_ubGO;c z1bUywuX`vRo9#~#TbFScQVepqV~3oYR7vl2r7~xZ%DT~rg97v5@;^+L>pZ?~$CRHc z?|cfo=afn5O=vW)&T)Ely# zUE)5Ie#aef#s6yqwkp{VAlQ<{Q2M0=EWQcD&BGEoQ)UwMEFTTGU~F|Z#v@NCj&kTU z&{MI!)kmJ!HF70hIxQr@BD7)^3b*!G^SVdOZ#kI(QpYG{w*$NL-hjYkeQnsN$+!Bq zWDtwN-#vLN`&*t`=P|I?&_o1xkXc+2eTb5(#-OEgSNt+%CSLm7Qzg#eRM*oG4FgyV zIkoY8W`GiE^1)J^nAxbgl`3XsvV>a8rCuGWUgPB?&z>B&bxn?Uan&o)rFOH8ALPD8 zq#;k+R&2aX4ZFk!P746tMCzCES?L=JUw$Tm9R0nXmhWxBp$e6-k?m#&{aF@X!V-%2 zZknfxfk~w>m_FN*mNq(wO%k6TL_4lTSOFvjEkfqr9%oM~M#J)w*SHuYMu4 zC{Z0GKGf8;>})?VY*L43TA#etkhfFXeocN#c#L6dNGxj=1$gx+ZH2J;9u3Q6Ru}uI z=7XQ=76d80cPznoPiaFluK25^IjOR8ZhJzd*1S75BtL6QBxcWkk`R6Sj7LB|BnAB#6N-iK!tx`|4Iz>{~7{N04Dzl0=^%`y#qz&8UK^&-+cdq zqaOReiGb!>N$y0hOTkazo21`+ z39Q3#@l7rbL%c0yVEMW5-(U=subRcWqBzC=y;Mob(kk6*?{Ju=&zFCu7XJ90N7?az zO!#O2XEo)!VR1vUN(a4g{Y++!2&(3oL4bi!PIV{dlgP`+Z)%l}H+AO-DwIFqpBTLr z`*SduTPZ#xE=`fwt776oSQug7gqKX!V9>MPM7WEWD_(&k0!EG4NJY0)z+vtQXp^2y z9h^E1=La$XG|fs0>(Vz6_m@7hN*`Lyzg@6}ekW7u{}4ESc-#CCz$2Ld0Hp5k3QSw% zt^7isB<{Q$KFC`p#Er7BuFbChY>CY519cvX%q)N%^JHjFfERX0tY&{-QoRJ}q*k0P z*6I_H|)4ip~;>)Tk=JD{+1qC~vXG8_N8nX>N>Hmbi1z&_DxKYu%J1;Jsu# z?NNF1q$?f#jS1(C+t@#7Wgb}@&sYHt#ziUV{Nd?H`e*2w z^zx2OL8{*()Uat=XE6=-F#2Ye5xue6jL=0IITtUoJyK|~pdDR1cotP|RpxROS+D5g z<31{X5LxGd!^-z-bDp``N+GWPc#|QrOl9S!QISRP^q5XbU)=$rUW`NLkmDf9x8F+= zO@GI|OQ!7NUWdB)b7&8kS&}6EN3|K)(mtEg2{inj6sd;2n&@xCi>Rw$m5PFL*7#y$1?=7S#f{RnToc z1SpIEIH+4)-@T6WzUqG8)gc3(zxDrf{EY2t%tO}cbNW@W`#b{9Igq}KJqK;+(X)sb zF(GXueN(X&?1<_{o?L!HDcUUS8*4TL&QS@lBfNT>inyGu>*xZZ@kb#Qw|gOv7=w=` zoVJJbs~5GKauBJ-Ab(4B8tu5k8nNG|AO#q7mLTH%+_<#`QJTEpC1?6(hgUoD{{|WS zA$S5ycn6xOCB*;!Ieo2X+=#KWJ6(J0bqo(Q8$JZuX{|>gXiXg~;qICECHwU2)1Ui; z>{32H-JV{*`oWZGPU5&VeFL|_m40Kv91JQbq`Y8@U!LKMZGFx;P5+a{Wz*>BF1hgi z0gT4LqDdKpqKqM)KgUg=kL%<16a#RX=bmMWi&yq2{{yI=m|Dv;5VB}DG{Dt8K_GL?baUSk4Sv=jDM-+_!2&Nx`s+}(;tPfaxoOfI8ZhIdkqd&jwZ zV8TSw4n&p1C5H!)Feu2WF{Ikds7 zT=GKuo#yFLbczn2L(vaC`J4SM2$^~jDmr>3YGfyb4JLf>MMrabuc0?%cS z;FB?tHkVhUkNVxsz#Bl7-E<8>*sLNns!!UVW4>e-Xi~iD6X;X}jS!2r>5N0e%DoW& zYe4!qw9w8{iU1tFTk5{5vnwnt-MLazkgWz;(OJ^2iEwi*0Q7P6U!>uD&@6touZ9Dq^JFy)=nPvVQ!C{4HbB>@$ZE1DBcH9Cja6*>F{SU-#G;Ty8~5@akKr+yHut-(Wd0W$>O zi@Ul{r@pQ@-1f^~AO1<~MYYBJxG*IXRn`N~8h3Sg*2}yXRi-Z?3^cfhzkv_od!Wdp zXXm3lG#~zWuQ9LEoQyAs;wX>Z5tZn(*QobYX?2`dPcwXT6~c$HkDRk(Soqi{Xtqke zkYVkNN(n=$(A(rlnOA9W%#snTQB~*4*#Og_a4FFwTD&)6@nIAP?(boFV=>4nA1vg= z5x(~}4=Lzy?Jqjur<2F>d#go62mCecG7gJQVg;%|-<(0waKrRJ{LK}}%jbG+=Lu5c z9H*Tllmw;=`b(}?u@I2ZRr{sAPv67KyRVYfuU3ss&XCfh=WeJ*I>rGwlK+^04z!1< zSoEgsWI;m?0j^=LFYvJWq>)kX>ZJ?V(=|;og$^%SmB8p3w(AA4q{42?K>KusQ-+Nh zK*&JlM@0HvTgh7@q3b~%tMqCeNoH~W2k4Uck)_*zh;cO8O^%}kc|Mg?5?NqRs9J?1 zYi+cEUi)M%+DVBlJUYhKRm~|_svE!C*&zv-U|-GuJ@!IcB{DQ{JaB=g_WIkig|9m7lyj0JLNArR18yC!nwJ_nOmep`6$O9HY+ zf(u^qxanZk49$P}RThca>H2lANLO&Xfpb72F5O@qNH&_{(ipeo)r;f=syt+F7Mxo5dVhcrL9p{)RF0yPI(}aPPdYWCEe#v6vP>G zvSJ2~d9l}W@XU(VfPK`H41HpASx8~48)+B2D4s5nR31pb2eW6hqor^5q z7t@h@q9bQ)2=GbH3{#WzkE3Lr3~wza>{P2XErUgIT@!2WgOf2)VQE<)=$XmFEkhCg zp3a7-jgjKNziT<)V`m`1aa~}@M?De<;@f9P)ff1%p+>^Z_1!F_8h5c+GGpfnTUFBi zAmQ)@*x+h-EXp9uO(!jGm^FmCuL!~Pp%WdLF3{1MpBE`zMFuIxf7$w}Q2-;JZZ)Vk zQV(hxm)_^LL**B$>QoTYj)T9_u=V_D?@V#5&^Rz=!iL6JUUfw84#6cO@D9~=bQ6{4 zbW9pQLnii9c)J1H2o58!m7kRC%LOW~PiUqtIKxu~hdh6m@w1bHx{Y7jAu>k=*_{wK znd*G1ZjcdXMH%)0G4?rySUM#%DCqg5q`i#*(ke{$<``x=YmN?jGs^Clu!FZONQpIv ze?!P4ZcKgq2Y8U3>L*H8Ih?=Q=m!Nz?8&B|YsssluzgnU1MR;<`r(6Kfpi;D>YsPb zoMDy^EQx|G8Rohya87z{66&O6-k3Y0E)#JGu|?A_;4s28rpt>u^M)Y?<&LbD@-CM;62W|BiTf`K4(#i2w1GjJu; z0iAK1Uu%_S8Ge>Z)goNpSS}So@X41Rx#9buc3;WYkM02Olj>7^Q*-)v3(7Y_cEs68 z2F(;MhOZq2R{WHkA{Vf9bT})`ap;>>FYSM-zdQWr#zcwPJ(VW2rysu^Ojd?a^>Jz) z0Y9b9ngsCBcEU%zsln{lRx$3LDUkE-i?<~JS1g2loJ_Z8S|l;m#^&YXnHZ{+fxaa` z@}3j3XzW*wx014qN|TbDQ8XP%Py{h;i1CAES)LpeTc3E!2qlzUkY={&eUdwwGMrN* z*J-TtE;2m_3daL(ybfh_fLVN-`SGDoqj7}Y%AVQ6n4K9{Ro<>^)nocrX~4H>s7wMG z1smQ}?hyPnGTC}>aPo5sD%{`uZ=C=39}D6aLcH?DTOIdLRUDx5u&0D@?%|v9VA7rdOkSRA0t0y|U3 zCjhaS*|oASwBIhoRIZf1bVxuLL-kwWgu)7?Jp^}J8-dri)U%Iu8}DdQC<{CDQXD*| zbz<*Z6RC>Z4-RAL96TlsL(Ltan!M|6vS885O>$%KLzll8b@AbNvRkm!Rl}oW!8<4; zUoz&z@2LhT41RWM|7Fkc%mBWs6XyU|kN!JTZoXyj`Qb%-o|;*}S-tlcrUCY>)~Q$q zez{eD%t-_FMLBk85t=Q>P;{ZG=#3L$=WQ;j!5{5P19lP=YUchW+D?>Sqt3^2aTP?* zMe)Nuy?WA>0`e!n=JJyXFP=0O?;SBo_x=CuyXbSycfaLZT-N>=7`%P}{OHjnl@`LZ zp79t(KW~S^udWR$e!Rv*-+d$o?Q^#v8#op9R;V9)tCUeWNFQf;m{`DtXos6QQ(=3*w@|?S3 zr_n+!l!9YLVeLTs<8s3S_g-?)o0TBDnIdRp5JE5{eyD>0f)OGhZrVR{J@>AtgJm=E zhc5DpJH@*%uWj(JKP_(EulwKU3%3$uU7ux;;RG)Tac~2Mil`IK^}6g_Q@OU{sL+QjJpE^i3cdjS|sSuAYutmQKK(b zx4=G+dKnzUcuds$g>ORG35gKX31p!I`05B*19X+MDTw&V{Oekx_d+p_mW*+fXjN6! z7D$Mi%cIq%sP}hh57|m;q0T8~?ss!7OTVghOCh1#O<5wPu7mWse}88X@em956oFBU zfv*=sU?x=_dR_G@$tBlu(ET-*nThF607V)Xo?`Ay(vKIn{D(kG+(tuzC`dVinq+Tb z+ia{+g-Fa9B{2|il8rMk?2fj%WLvp1ohiH>38^Tr%+xz+xriQy!$;c>wti0Ggo<#$ z(ht$ViA0YxQ6VnVQAwM8f8%-CSxR4~3T zn95rUs;b1Q7+9<6JKr@f5`CT}FQz4Qg(5a$Oisz2x*{v4^TWHAyp2s!=KvR^ln)jR z5mcID79;vhhiEa&zJE;Nz6Dc+YJ{WD>aOX%C?d@0foq_8X~PY5jx%mfW^*a^`#uA^ zyqU)7rzU#Ju|71;l#N;%V$MlF@REWuB`eqPn{Q8E zMC@&S&i3+%Cdzi$IS@2>XrNjBc#3txMfjq~92^(zS^mK{b9qG>v7T5I8+vsoHVJ3# z%YGOFgwETLhw%#VZQ26njV6-?Rn>pfY@};coBC{e$A0RXKeDea3fAD0(9~s!qgLoV zjAzuE`1w#bz}%6VTpLB5hRNDGGZ%WLmiREo`_GDm*tW=xw@D7k;&iZ6yRN;H;bS%O_ z9W5ta#+XS4r_}#NmCbdiO=CZ}waiylD_k2)E%*tM6i7GX*$h`y1@{g7qRbM%nneH` z8AdZE9usTzs-q8GC|U1-X+rx8z6Ohj?$?<%T#7}lD-^s;z6?YIVI|K^eId(UOIAj1 zyI8cKuMw*!CQG|$d^ueOrtEqufW#c!gQP?Zbf3=l3T>DCcWcoivr8@<=JkaV_rVnvmSH*AEZTPyJ9n~1iRn{} z!jei&tCpN5*zQ5U?L^&9BNGon=8u{)DMKxC+v+(xy{H(P#d8qo1@2WgsNV!+*-?2C z?f3%dl+OaF^mO39sMUhYg~%m3gol>L5idVnvA%8JWN;o0j18gu$|NmuC1?D)*_^H!tO#HN%roz%MV)-6AjggD18vfb_K@XgXi-HPt&GPhYG71hX zZ5?OKC2t+#&GVQM?bh7>h?kjJS;ad2E_2W~mXUyPEydd#U7%-x2z#x6mHuYxllToQA2MBYEqW%nCExWN&f1dcD})MCO_2NIW90z1(o|?r19go(bOE+Exzfbf$b*#p;(~=rzL7Zdz^L-}lyHlWq;r4q zSlYuc@n@tZz^;77qXabxHYEW$TQr2%FBe{M^VU??zo@&4xkTuf4_KGvt&IcSk8#Sr zC5Sk^am0}9@C7y!AitQfMUnJ=k(jkb{=4Arhgy6 zokVlzdij#mbCgZsKbjZ7ThWb4G}SZmnx7^)IV!h-w0A?7j@tO~mP7dBMw{s^{Dxb5 z-N$;AUFoGJc|~fln$ffUP=P5n{a%QANM(HwG%sNu!m{UTT1N5sEh}@$67gBpJ-H#> zW0uQcpzn#HW2gX-jEx3B;Gb>DSDNTAIxMM*G z0?vc+oUY;BylPL(mYn#lJ}8vR_v5_Nu^~&CcR{@^Isv&^#beY8Wd?`dER!LGnxXnn zJw%tucmYl5*Lf<{`&z>6@O9LAU$KTlPTOA3ypgPiVeUW-)4X`t$`2GRqFgIj)gdx2 zY<)F%Zn~JL8N=i}WigYMXA1ut`v%Uq9_C2$1vB699?GF^>fIA@oN_IldP(oz1udT& z-O>&oApdx^|H~GB_$uH@nF=01H<^L zN453I0E$TFsQ^6sy7sD0Q#qO1xT%a*RbL|+Re1*ePG)1Zs>n=S;)U$TGLIRVG)slw zLYzRg&yNc5$xk5Doe%Ec=(!U2qTHlurQGF<_8H4kQI64Agh|ys59DbR`gB{G0_wN6 z*q0%z<8kbx$Ae;+s!hR~>idW4M1}?0;v399gOfrw&DwmZS_vzknt)|VV5%P`sOHRA zg0C9!=1NVu`f6w0yjv1{8>O%GS-=+tq2c4bK^6RuO>x7?q5sYC!y7|9;QwFM6^{9P zeWm|z6&&Ax+=gD6FO7ezAA@^?jh#b>NWjA#1H%8THlO~#PHeBY^l<;bXWFO$xA6CT z90i=Y$M^hvudg*^05dcR4!~4#}o3 zx5DsaWf{`=KppuF>(Lc z-CEjZc?8?t;bx`DcTAJigrY|7asU9Jf&1X}Qq9 z`QEsUf_@zi!+=gh%iLobGv&|k27Dtycq`pS;`BFENju8fmM{LjMN z)cCQ~M6J1ml}AdXGjQvXe@)=;e|L5k=}CBFYx}sS@Pgn60K+xU_IUm*4(@S?&v)C$ zTW{*?x1axuBNzl(#Dv2!oG)6OuNQMSM#zLQOAH1_g}z0z(=3C4t}HENb))-&1qp zv~frR%3r>pfg>jCfM8wJ#yV&=-Ct0o8gAKiUjr$lx&3H^F|r8v(BScf%-SN)1tpfK2{^w(iu(q8O2YAWkMTg?I5sy+wyX5q^{l>riC=A}c!Mmc_Rp}lfoFsyx zdiBKb%YUNglKIna>pK-oXRZykEfp*zg3*Cu`_^*_Y=PveIeN<*|g&s z)3NV(rxl;B$X-Nb#Ez-_HRNM}?>@QQw$Tcx}Gc1>%=d$Hi?R|e>4Q(2*N zi_vj?GrgJsSY^zmcIo*h_04(Ydg_l6-fS$)l<#dWFO3=SpUgomv2zqH98Vx#A+6X4 zshbN9e?#IHaC^-XbSZ14rmzKd?!|#s`(lQylv$Nkf3X3ekU=Yst4wqp1 z&l=5OT!q=5^7{sb!~A6<+|hgCd+R&@LHI;!`!lzrwc8 z-b4MnJ^%MXDv}K!!VCao6O2IBPOr%-gpBjNQkJWawGCb`xbMV%5)B1Eqs4oHkOW$< zFKXDg3ZoUhK={!M6_%L4V&B_(Y&DBEptLYw*YAmR{OW#_&42x(x3(@?U|N|QICG}7h(pqtcNk2jR>qqXJLy=;2v}K$+2o(SX z^)n2eKXxkk0tHEU+Nrlx(7RbcFM;`q9V}NMi0N#a|x2d+Sc1Ht)^; z^8Pq@Ir$2gJ{L?4zB%D!WcP4>PKhyDdLVnws0@=3EPhkCqK8FyWsIi0z71o!P;|Aw z@_Ogp%&cF|rfO13Cnuw%QjaTZjL`Hqm1zmDMi@@#N$Zxe&<-Kw_~1ps)*giCx7!zRpq^kL`x{$k=-y<^0=REg3p6}p_uES@6U13%rG&drid&d(a2RyB znJS{)ykVi2H9^sQVz&2$ArMBi!vMTRQgn24{+?0rJ!Zwv5^UU**pex;?0tw2bHI{j zvgp@q&1`9e%ed)^DVzwnTuqIgdO}VfNLfBbC#szGkn6B*Hl6*0a)=I!NB^GL9(%S> zxdL*A;h<7#rg{ckW8`m#cST;rL?WchHV41-RJ)j z7tiP(`yrG>x&g=jtXT(X=Yw>J(RL4~;xODPCU(`;<~b!JO6=$q8N1-S^L%ffVY(GQ zoGK&%cjDcEbb$Y3<^4~(KXa_5X?FB0;GxbzP-C^)J`zu42lWYeA3s0|1F-6}FYKc+KL;G6ty>w(D6Yu_U7@g!z<3r z3CK9Ty*}2_^RL+8Fm-X65f!9X6k@G(`5AK>xCsV8n~$X5yZ-*2&mWBg^(t7R)@*sQ; ze27tNJAmW--G2q=k3@nF`ixDY_D$A_OewT-Th+kN`?tZ*RRABbG#&7-Z}^~G((m&7 zAHWwaswAl*RXtEZ7$V%4vp;9vtd&xHYd_Sy3}*ntwtrP=NNUtNM6$0fIh2IT_wwVl zQ<_|h582ojDlY!Zx_l^GAaydUawBZ0^5OAK)y)q{ii9H!!`djcUrb#|3E`CxhPO`D zFbd8=06YFD5JV18P%E*%Pn*AIaAAQCk7^B-nFktcR80@y-Tz;iyY>Ic|5tXsA7OUk zn_N~KzHjjRMH{`Y@5I%S$CuqL!TKgj6Z|f)e;xN}(53*?kB|*m&=JZ*?fO(Nx!$}A zmphN!@oP5~D}w_sInh{u6s?oUBk$-3Hm9mB1S@!i#YiL+U1;6&JrG10E-xo!lT=s8 z_@J?Et5|FnxX(NUy8U_@URGY>0gSr-Tgb8EDxsW@Y~0n{RwG;N1t;8>-kMU(PmHZt z77}LUkuO*cH56A5F^}UlN494fT~fcJpUr1;SS0Wc+q*vh{@gDR7~BlOME_dDz9J^- z7Q_3!LbVvPCV*XrM{yN~h&zP;V3(zkJb@p2DGFAyV&+mGh@LrOUge)W`BO)Brx+zP)*4o53TY7TEXR~})Dr<9b z?oeq(<27Hk%p_5ACwh@fzZm=I^voLZwWyMl*W|vcl89p0r*@kJ6_s4^M2|mcn-Hb2 z3mS4L)#BYU^~tGi>PTQa6KT|FZx3bGv;@IG=23jX!f~=zfiVJ)&)sIrd2f|lM6RzL z?!ZAUBp72ESu=eW$tC}zL@run$t|OEfSL3_M(6Z(^M`Ctv~7sX+})U%mco$4cm|a8 zg~H1USkn}u@LZMfvw91ew|*~p39}JDAvA15{T!>zZjw@RLWq~SHRU`V#bNKDP3IksaD^r~!!B6IyE z`+feOdEPvZi+7i8`>bE}7&XZ^0AGQs2|yS1f4J}l>T&@7hcBboL0^3?9!+V0{6i-N z2Rvy75!hB<-%V>$x4bykGqU@H{6*sY&0;XsBB?^=h)n)ewzE6~UgOd_&d@GDr>+3@ zksZ}9lh={QvPD$F^bkKC_0Y|D3Z{^~z1F-cY_l%g7F4$yPBLj^yqTVJTgR?s)6nTNLry zjVm_j3CUl75pvf`;qKsqzy(qfICe1)M*Ui9fpZI~xO6k2@xLwwus(6_8n`ywbw+Is zeGMHMXcKCrIHU_jV58dr7ufZ76a0 z1}Q169Ql%E&EGB+4sb+c*vc70W$w4VM%Ku`p(s{`2C z+3(ao_s!iee;CvNRz7wO;(sWfvsz~QAioh11M^n@+db#-Qe6q~6$SuCzq@e60RFy! zQwuL2K%e@pKp}wO(1lz@vyB-oqwQI3>HglYyoL0N>1V#BZF30!Z1nomo`ZS@-;Dk( zD)j+HH>U663-IS>mq$ko;Lrp3q@62!29P`PGq`>Gq1}D$^!5$k>+tiWy#-8J98BIA zwwL39s6IYVv|GRuRdEL0+NFL5`mcPh-|hk)Kye2ET(lq`grGL? zF>}5`oe@ZN8X)^M`Xm3#t?fVW787|-+r-nBsUI;JM3z&tT-{%Ne+z>tp*C|tGnQtq zmvs)ukleMNAjfp1YAgw?(Z8vtuPOPnrRRcdf8xY>H~qUmFU}Y4r-p(py2AZ=cYfbL ztu&pIPn=%Uhhk)g%nySQ(RU~#xd08Z0 zRl`lVrFDU6=AMXSM_F&7sSjX$H+njxxe#fr?NP@s4Z6=94@(IX+-+FHtvg4xZ%S_P3X1R~w z>B;-^OrTXI{>Gkb+IRwAq>;!WEyI+Ro8sxViabujR%x4Rq*b<7u%I%MrmS*y%Zjf_ z z=Qb({(y{~?vLUMRa#f7V_E50y{~`Wa zU!?$lH2uKDi7mf&RBj-2Zl$QC91OHfidYM=FHW&nXe!$fW8R3~S0yIfBt8W9y-2Gf zQJid+IYrp}%EI@u8dngvwx&!LvcGpN4NPVe2RVNjq&#LJn>Qms6)3e*rvqDrnUBEB zBq{cD8^jq8%Bq-dzWB;_jor8?;>ec$1B*4yR=(1>Hy_1UE-U5YNS%&k%rU7`TfQ~e z?$0Fq!0Ttjl9T$1_EJA>!*~aeNutxb5{1SF_Jp|wiYIz(JcqLievtq2{BRZXOIiQ1 zWEnVGMsSz~4ITblex9{d*{6Sz#>v=@Xbv4yXuqPhZO}RNgJ)dQ=8H94pn=HDbLzV@ zq^g_YS>onu!Gf6&KMk`H{x5YuwL`{2f-*N22=S+3rc1zbD=4HyAA9?FpC>h3YCcFx z7i8e-29xsiX+V;A85Cm$m21*3z8RsgM%5%A)Ye>u4E2-pDat|3LadD3`Y^nAg7q(i z+yfyUcD`+-vP?KUi2%A)GB?3)H1Q6!43w~37%md`Pv4PCkXA81=UADKxTHUI@~-<% zOjFd0RFv-Sv?9LW1wm@v10|)dVK_uZ*&2ZxM7~+kZfeLuotC`|Pr=Iq(h{J&Wm@DA znJJ|G{@hmTC8Ukq?nl=b#L?A!NqwOd?>*Z%12JH{T4mdA{QrW#q*A;*h^Y>4bV$0s zda$E0RS0V%qosJm%=SZ^x%PxH6^^qTu&O;M>{8_w+GrcX^k@@1;5I;ebmMloHORUY z`(g7k+=_Wb^2_{~+b@Ja#gC+I-0W>AxVy7-z;-wlllBYpjd z%v9dj{M>P6Zg26Jp+DRSd|kJs@isvcjE5-#l9qQyB2Tue_3Da4@A*g1UD3a=c&4Tp z)Fg@7q_6l~WO};yHB7E80R(LU^8uWXmPGuzDw{? zt`2-w)wBI8kfppWNUyyF$tCH^G9lSiGLD$yIzhDTA0f>?Q{vhtdL^QlPnPVdb{kmQ zs~{h&j&U@X66|8UX|n6hUnO>FSFScLRsL4GDno6S8G3zdmb6M$EAC2sO4fz!Yz@)n z(B&pv?@5fPly0bc{ca<>>;!gxTj>Uq*hYJ?EI0d(VM9T*MQPJ_5;(1SRg&HUa}Ze^ z$_>gc=7EW*&P`Q1>%C62&uH+4(9xrzu|qk<4cfwm);{x8+u+#qcm^~Lked5OiN$cG z#@HWmZre|Bwvt;yE4$h%@aM?ZFQ#Pq(1^;`kXDrUC#ED(4Og<{!84_-Av^nZlT9e$ zqHg7m?tp%5j^CJ_48)N4Y3IH!RA_8y+@dVMWw0MTC9$0k$qeAIuTX0Lp1+3j`dib} z1=MGnj=>1-GkjxvzBAo?b?x)(xUeT{1F^@<+;ts}jjQm<&beFW{JCrJEPCy}TsJs6 zO7iBP_j2`Jw|>(iELckbaQba?>4yin=lbVR6vqMnc@!6K@&5-gW%t;D?&nY(59k30 zB48Y^0}iOdF!jHNd&YJDmkl|6|K|=5lSll0HoqJKKX-3d?g{b_skQ-Owk1Qq`T2k4 zxPBmA>1GuRg7$AUgjw}55Sf>~VF(($54PV)jaHgka|ESoba7pi%-ySPlf4eK?i+AG zZ&yA7l281%+EsP|&p3P<`K*8~ML$lQH1mM2Eo$?Ct?l+T?L3g#{3RMv|6hJcvmfNK z#Ti#MWh9Eu3|CI6ISx9n)bxOly+00}%m1bpj_sb^6?cEs1lGL&^TVU|!x6LjmU;{5 zY;vok1l(>{+yXvm<58w)Mh2Eh`A4eigxp=vqg=m!JFrhQMZ(M*hw7bwr3okZaAlE3 zf)oyU17whcNhtBE^-PmJ-aj}?QnGC75jinr%F*{fJe;oUESj4A{rVodni2c9zpV)0 z@wSaA8d4@M974xgN?te{W*)k>qwUkWc&x-0UWK0eG9_=~1Pyl?`;0YRG{PknVChuD9^L}HWIF=37>w7l#XJ@lvmUY7(Q4WVz z@Rnfww8|-mXR+$r0+1S(9Pd_X`ei(Na4|=mZ!94pJI6yw zI+(JN+i)e5yP|?s7`2TFEnbEEUsc^9E*%proEyt~eUVNdmF9K^2QZN#=%kGFB@il4oHImIl@DDI=Ic47^eQ zLOzY#4$PX(FjSGkm;;V(_U=D7v^3OZ@?JD*hE2;N9)vxR#| z8g-S6TIM~DbAa9FN`gAw(;V9xQAlcfh%>9gr|tYmjiqP0t80DWL=p-#A*FaiN1w!7+`rkVZJZW|4+9mn*%0d2 z|G9wKURMSW@1~zrK=}RDWIL}wju>SFgmCC2>a-M_E8g_I%WTE#AQ?^ZsX8nBM%o*( zRPhH0xrOdq%7n|RS>r>_191MclSn?|1cRdZL$Jk_=F&@6@L?H6#@KP}zf|~CD%l5< zvT!XPk6^&d!nn*Cd7FPlaKkc=oQ~J<`IVR;fRHC5i+Q_U^d6=PASa@pVKu;jG7+yP z+q`Zihj`g2u>;GcAf7OgEL(e!!0{#md?V#77@cg0m9f)>L4H&AbBXmDeeKJd8bfhW zSe~<{NJ;bzR5SPkQA8)^z&eysEsR zIJk{ryTUDs<;c+d@}B&SX-NC;?s6=hgM!m_NVN9FE(Qa zj(bKA2KSFHgPenp8#W&@`qiQ6>uY9%J<(w}J@78%ZdPUoEF+SUv>G}f5dHWq)1j6& z|1!HM1jup@E|n5W;~5m;N`4a#{4-i>1w=`^ERK9#j!Ud;ZbNdI(kSuJvJxoJA^Dob=rK| zj;`V59ckMzo$b&2J0_N3ZJ~oI(&isD zjqPq`L?*={#G!Jj`p)+8tyIr5dr;|$HK^**0kSkuSovV_MEV_lQb`g7B{>ESviO|> zeu|C>Ay8^#+SH;v1!f7R=Y$CjGfH`^(&7Z;gM=vQbY$v!Y@~K^AspyyA{lkOWA0MC z{JfHw=R3Ryed(#Ej;Wt>tl?Y4wZ;C@&<=-Elb>Y0vxQIQxk;p$k#hMCJN7c1$symw| znQIAM-N3q0Dd*aE>j`&zDm!dYHK+v?!FA`ft8(JUS(=Q_jv+ZKc)NBX^wyJGr%$ z?=GhDu#O=RevVR)?}iJ4aYxSkgQ>RB$&8*Q%Fapi{jy`^5*OmmyTFGo!hXifh3#pw zh^R+vfdXGYAbRKs#9JV&%mNWg5jYvEgYMDPR9=1|FH^5Fmj)b&IqfuP$++;s%rdd} z5pJIrqTsp|g#?QR#`Iq8%^5i}C;x`;H3GE-gAwKh6z#yHC@PTQ#65eh$I(xgEcJSn z5{d8ZG(tuk2ycSmJZ>xV$&dp$0hEW@S*?$m zcsiMA1)}tOoRIYm+e4$pltH{g)^X~EHRuP$%ed2cB_?{>MrPrJoqYMZ30nE`u}$x> z&J;JVsXbCUIe)Gls?TV96W9E6LUZFQ9A2#pqpCA}4{bMN zenqQMLixXj8X-!~CcZ4gBuEjxEL;tE7zX0CRxt$;C%1dY+Q@?80B8S-nw>^NwicPw zuY%;_-;U6>3w|C1kth*gYtyAfjkB{qU}Wf#I!A{Wv8_a{BEFx9(vJ$Wdb~aa#~=ZNPkp$SBd- z_))~s(Y6R4don;fGW4k{4XjU8Es;~HNe%boBpim;94v9^#hW&im~b4NP~gn~p22l8 zW7yAVq;Jl@b5vClbZ$gauf}0$ySf!Icqw-#K5v>27%zNM%qC&J?;*rE>J;UqlBc}jzVgjl~ zD6)W^V{dFzn+Ov1j9ni{)09=-rjx{&=G14Rm#*IB(-6>b%4yCXfvn-=q@rAZLU|QS z#&_-Fr_9iymyp=Y$Uf2|R&tzpz*MM0%e)kMs4U(g<(y~U^tEyE``74$vl*1loA|wn zJw{JDl>fl8_ir#wVt!6;8Hrm$VNm6r?$oHimy7CKg$Ob0YD*Vb%jXfuP~A!Ufp|`8 zJ8GvWCW7H-kThEuL`nXK_6=WBd+O{s+4Tj_Rkt5qx&8Q(c5#}RMrM0<6YUjv2J1QN zd6TWqjpyRS>xs!Y{m;a_iQ>BW@g^s}l!_7pl@)0KYQv+@aQ8~>gH7Zm;Mm28AQL!v z{chVoTXfB%grOzsR*15aZojhBYYFN!YI}bFi{VimRXQ3$-n72>a6qFHQHusOnyP0g zd@c3RCyMHBy=Yh>^Ox+lJbM_hwK}R}sf^WNAh^cA4qv&w`ALM<2_P#YP7?_XWx5j? zmN7SJO2W&$4Dy$Xiiu;Q4;!sA8=4VT5f5QLd0EeHZ}Tx2Y~PA}(mdfs#0O2!LS$1w zr&=h5h`wcmNh?s_#5t#HBVFw|{52+Rq9)bd@&*()l{nSiPd#O8CW}7LU$s85UY>b~ z-C~fg0wNQS0-|_kyl`Ept>kUjbkybSABz`NM1xJd$pnozhSiC#pS;~$6Y}a`@8K>N zyQPSE!rdnf$I``!Lns(vXJ|yJVrk*NWw+m&Y>7u!&gnktOgRk?=y4(4NHZmKe;aSS zzK0u5veQZ{DK38HebHUC<(_jv_~;9_o&7hLV*_i>3y(Z_nviP+g`Xv%UAvJPo}$~_ zs3Ghn&{;^re(*U#T*H$~mRV>_#xYxYB2`ZKEVG|M!#0iWJJegw+-4?VGpxyer$vvJdsu(97-BTBJ9IKTuH0wM z%^B@9bES42eRlC38@I7Jh(Y-qgP7Z#g@L$OWNq~t1)5|Ahl|_hMzJ@>AXn{tz&C4t zc|xTX))wT>$7}+2MKn)ZlD?q+m|Tq*rlMskchonYgotJ0>3Suq$6fNiRHu0PdY$Sg zRO1kCmZ!~_vSDk7*t)y%7zFDHdpr`)!6x)*&6>=cDkq+cHr$+s=Amst)U**T?vOjX zuihx9eix-CBy}gJ+qiMie$i(K9Lsr>h{&AAYuNP_+PDbo-g&3JbkWBHcty$S=tHV7 zjVadL0PUkHr~TIH9zt~!g5@b}caWdb`m6jyD(B5Cnr$Y``ERRgu}8X)Yo-8V&($$R zr%acj?-J(gIBa3%tTIT62K>FeMH<{7boqBka5Dg3cEF&5X_t47)baF_aPaoQh{{|BAj@{#z8jRmP*pcoW!2?6F3;h10nA^=qIKvX~|fCLioISUZ_cSSI| zMgo8Z6GC`Z_66i|IiLa_vjKrS-J<`OB`IJmwHZhP`yW@c7JEnl!`8w73PSoHUs!<3 zrPBWio<#N^Y{<{ltV9zTz$*-n`YkZUhy;Tp29ksVKnixoff{&mA3!C|pHq~1*gtWw z>HDSV;}hUByANvO`{*14X^*tX%)AkvWtNf;kT1;MDtt;DUSuG!hN9+>#E?)(pn~~* zLyEvzWQMfX7!ZjIMP+^vX#tzC8(HU5RzEV{V|i(*gNOZ0vz@wm5+7l?8Hnyx8b$%Te5cV7L*}7z-VVH z9aGQczE7=^!QRI(a!>&4!g8`e{iqe#4Nn>ME#TT?EdX;Q-OJz|IAdOXi#-G*-a*IP zE?reIC4z5hZva-?gK|+O1ERQfv~4RdK%1S6AUmJayy#C5D<`u;#-TOc;fA--Cr4+| z`A_KSlw^)PTKwVhA7-iPYVUz4Vf<;o%jMci#{0H+(F5&%x{v#$14JbhRJgT|D=m}akZcI831LO`QOu$o$3mgGT!)5I4C2?msl2qJ4MVh0 zCJ2FM5*wXVv*DrT++kKVMsj(%wkiTMfyz6)r1Fg3aG5m6%tf4?W>SN4!P{!q-6S~@ zjx{Yi46kWn?B{-PhkI0t+l%E8Sa6J$z1?1pb=5BuHorwCx(K^9QLgy$o>-?ORLg%R z8FvJ42KZL4f_irk=FKwfqYrSV_^VluT5Ut_ZLq8`L5+=#hmWA_ZNer{Y6GsTRJ*@R zK2(wAT!?tN%6qd#k$(vsVPg{Iw-rxP{86YVg@9?4I?NDgRJG=!YP2Xhic`&RbIfVK z@4u1RfeD)Ok1O2AZwDjSkvPdH7a$2w373?j?*t2qIBKOR2(pl}m#U?FDO9W#H=%yL zWev6Z_9YnN5T1RsCxymLvKzbFIx8N>xNPfV`TU{RykcBdrwF*X2eA|W(W0Bu&(XVQ zJdWW;o;Au@E(?quxJQz2EEO6zLs>w9nTZ@+KK;iyM}JPl9TGWDDwt(pw<@Vf z@c?|(1#i|s^X&>VT9%Otis9ig*jb_o*av8|MRXo}=<^0nQsl-`FaPA6F`1jWEyw6?!`Qpu)2@H+s47O3GaLc*tg~^Y`j!eB2^5WV>ZZ?4TiUaxtN&NEJKelVe!P6W4n$j!ezz z$mY72f3y@*QB(N}G4)Q`nAWL&2e?t;oq~O|OjrQVBKSy8!{7I9;4bnQ_pg+3`oEGFhn~hMvYAH3nFiZ8yrmwuT#g9sAlq<)p`U|FLCCqAj zh>E{xlX)Yh0Ho^l_?5^j_WfN#H=h2qH{JA(TGMr~-1sV+wP?SXLz#NjHtBKzVG@Vz zg0cGtfl{{bvBG6ykE;(}+Q+H`vW?$RWI}fe;dsIlG0FpqXu>v~7?7GPB}*~|4WC<)0){H8tZ;{k5n@O;^t z?$_)!=(5pjh>0U4%^=z`I)>zt3HBQ%1kM2>gO9I*`?k=vvvT*#EAFpC`MjZxGd1Ur zAMy)d;wAQXST&1HlqLyMC*>tQB%_a6M>$YVQ(g>crh4k7mCr~F{3OHa(I%q8X2-0u z0JdLrLZh0)Mjf~7#U}hnuT>64nS|#OgkF~Tj*O6u$8=%$bEI7fN@c8)C8peBfa=(a z#MH#P(H{-9KEz&OO~2ISPu6vB?asSPV#oh7ve4Tn91Ze}<}{8RV=`EJX)M&Cf(WRY zy`8AqZb&o6!{^!O%V%YYDrj$=YvH29(8;Vr`RU+T?w(PO)s{%cxxRCDZOvW0^t8?yNGKN+Io!&?A=~(U=lMYE)dkYR26Em zNq3h`U}=mQi{4fg*1Y~n_RXqyDTi?(4jYS6V|qC_Hi3mj@7D@S`HwskTGx|pcOfnu zoYlH2)P>?t#KbPySAS|)0W}o74k0|G@80IWgp~zbhSqyE&s%gbxqK#h!p1_#3$Sv( zEX#tNKC+5+j z%Tf!OMy%Oz?-T71A{Hy0EFzLm_4K}@woDn0D4K)CG^zHUVC)P%wrB4*zBSZsoUOYH zudS@Ke?XaiK;4D3`WL&oY!Yde!xN;6NUO>?kyE#Z+%G-6LWL6$423sFL)JO0hu6^o z%r?ygWO0YUwTgxmq?7hvV6Sme8;Wk|Q3M3cmL)TgIq{foLLk*y+e^bX7MH+)g5!^1n>P#v(itwx5^h`Gg()p16KaZn=Y z&sw=V{Wrk2>N3R>O>lnOoi0F-dy8Hzg}1RW;U#*^pBbi-((;v&(%3_=&Z^!LZpEXu z>r}40G3xTR&Rd$SH|6b{QHR=i5{j>uHNDtn>l!*Na;`_dSm>_~Jb^MYnrAX4=uMA9 ziN`Y$TKV51nSK(J5m=U^Q+HeSYS%5v;^vICWd5H2#=o_z660! zzfb6GOfi?yn0k_eF0CZA8o^=0m_ZtAC&`3JXEbN*L%6V6MBjVBfUIcuOq=(3TaUKq^N+E{y6Sqv8w0i`@`$u z?FAgG!fwv<%r=~u*YT9AsXAK>^B-oM^PTx&{mfeUJdv3k^^frDXOu~fyNl0(k`0f= z&wltHRhLGi0!DraDVv`+>+q%7z1FgNrWILklv+&ZB!6b-**X?V-{Aw(WWL%(;tgLC zE{-zc@rOisBQ;mZvKq)#0xjwk1KZww4dT;oe@UDLm&Ce@A19cmEyy+)0TTPO+is!G z-9m$YiZAm92+f$~VZ4u97J%(-x?yt2J%&ThvcjoNeW!XuEhe2$;q6>?Ma~pGXd*`s z&pD6G`IDg!zBec}Ys?QH%r3i>JwU0%`HGfo?Jw-LrifJvd6;R8!dfWqHvQ>0PQX;| z(m{_OwUAMYc#7CIA@_4YLkdgtT;PpSGID+Qq~v!Wa#%8*gdVfseGL?F8jt zKb1s^JT>dw5n}@Q3Ky;R!ZB?B&rb4NF~iM56J)kp=VNZulxc}}s19++Qz;6FsbvR- zEihUBN2kL&O39+5ZD=MQQI=LXV;xLD@ap8$S?o&;uuq%*L`Y8swf#hC^`8WpghLX!M2E5J(Ae`&i5euQDd-Zl~|Dh2W?CxO5H=d z@ZJfpv@K`__9E9j6j3qGYm?Zvh~RYK-5B>CcF84d2w$Sn=}T#u4BU1wtKtbR3a)!vp@0NAjG3P9Z4rx3R4E|4Ygj0bKOG67n(br*g@i)WJOH9_PaD*4uivACkuPT zq^u-IfNYh+Fh%hh>km<#{5adgfxchVgc|$0-uf-g*o3&^_eodrK?b2#$`CY-z{N`$ z_NTPIPHo@nK4WfkZO3vwtl84>GUk`OBuo(pYlzS9eF?q%hp7@|FWDGJVln9%JFdJT zRgQI+h)oR<_>?i>Aqs}!nFiDBJqH{A=&(!fmS?R>BUIePBNLh%Vlq}CJgG$-emO=$ zw-PDK)J^nnY(h2XuI8!KLRDPT+4uUl{=E-U`c?&vbNa8_8LqLk$mFSR;#Yq4EJ~+p zwDkRPYSCR!<=7Z>>Z-YTDYfUuXf`DOv6gRLWKj8bm%{=5u5t`SH}sXtpWsDwdIbmA z5(%+hQIiDb^3KqHRQ@75%>W#M`9ZE0f@LP7KC;p@h9!6=K}%ajRxe|6j7m1OS*SeY zeE3;4Li(uX%+>+s8p$(1v}~n&D8rnHb{mv=cWo>MxK#xGafRN$MyYQx4zKs!oEKa_OC)x zxvl1AZTrb(^Yq8(zeR8&$d}tY=Jxy}Qp6ydpmy&)5t>RPH=?$`46Fk?i?;6>?QJ~} z^yVm^04FM7ANP0|w{Re#GtS>ZXxOeSR7bL!TUzy{;aT#@F37OptNY#`fxl0Zp!y=2 zwO=LGC?gC6@X#hI;21>i?F^QdUb7Pz32YD4L)m*F<@4-`oi<8JQen1MHpC~gL6dz0-aga@X=%NhwAayYeCy0Pi5(Rr z1ifB`VYj>+rjH}tb{@c2>Jy<*DBhy znxW<4(#$7(m3|m)jl|{v-8IQlT&6*r0vN4%7q-cteD>mvt9_7T+*z)!MD)=V5^{@H zHRHw~!7YAjw$z^7Xcv50szV=+a}|C?>`VDlV(pI`AJQF07ZhtG*0TY67b@x35N|?_LFoK%<8sPattD=v0QUePA^=TuosSq63cySt=7W?7Fa`m*Yd-)B{0rIJ4*~E3kVs;C1M(&y z0OO~%ETIe!sdtJ0Kor2ye`DYS&iWz#x8nORD0)rbf4%-UHgD&x==mReifLmMfZBgu zDHz573k?OV_|yI`L)5$foaNu<|Fsy}{QIBqs7n7m;Xic!$MJsvrLS>7AklxF|7U;C z|NR}r$g(5xxZ3p+Bn$?XVv$UL$39o_JP*GkkxdSq>&f3mP0jD8SZTb*7(809qBucg%Q693*zS6&h9362e~N&2O#c4b<9#!g6UI_ z1VQgyVA&#P>iktIF=u^;yc2LkGkwTRll=w6hfb=m=>Y;qjpbjt6H1eUll&jHotDvG zyFT|rBLSO&TbmE>AX9!Lr)#-WOkM?reMl#2GCoF@wR1e}{fSv_rW#T{i-Q|-O4+9*4NPzn#Zq5frCm{;2F7<-r{*h!II6xP>K` zLS-u-!SDP%Q%2+iE}x^ae=3L}i#d;%&__q9szqL0uO8TmG$t7D{{5x+Y=(RF12%B5 zD^|Q>ZW?uiZZ(H+ZMB$o_vgW@11G3=XIRR*4*Yv)(3S9M@=r(Ne07?O{eG)asFJm*q;%l>5(;HeE)Z1=m0Y@K?HhDB}iSuJI7I3;6#yX))gVSKZU!H@WS zYhx4^RCJp48^4q_WLxB5c68OTc62t4)CJ$2kQ_t=j1Tbzv?1k|s!$&NEdFYGStSlm zu8|A!DGgaIA#d&tdq9ih+5D?yAP!WVPmGE4wsGG0%JPw|qFX~6S+Q)6nf7&A<%>*o zP`N|orDMTcR`))NG>eTxTf;6la&>0N=MO$ngOMYHf;>?W>7`H>%a+nn8Av+lyqLno z4tZn&2B)Q_HQiQa9&kU_2acsjx2c;@GSQn-Jqi!DXcDSb0fay`K z?-e~@$-XxSCn@8k|7p|?b4naAeOdo*_yGEfq1|h}1ZnuyK2?EwhyMvs*E^^CpI06yIwX^KHB-4@VBmk76ICotn0_!&btPL`u= zjvv^aM3taiRFECJ4ivDpebsXXw0q#K159l{@Mn13q!aeXuZ|wONu~W8&3%_D&z@;y z?t-ae>T$->FBVNXiKN_6v(c{IqUU9 z2E=s%59)+Mc{GM=gqbS`RgJe5R_exZF#VQ(6~+_3fL^FPR@JL1;c} zKYUgP(|l({0)jbNs+}Ec-2uM5l)p~BiO|6XB!C?UQ2x4~BZrblc2v`cJ4_+=4qHF? z{zfy+C^EY}?qXc)OzRIdUg$4B{UmV6tgzsy(x!@@U!Uz>oE?doPaWm;6gDGV43EGK z2MD%7zc>z;@F(D}lb6iQ8hN+~c2LKb>HbwTB882DkbyZ!kK+5A9*7^H5>Z4hr;d5i zwJLanwEHJa@a2ompDz>{2-qF8C+rE6=r&NC@ZY*5*3bH*_NEB^xnp(P!bSAlVOctg z^V1R=LRK<40D(vbBye_=9gmqfaY;cBHk+2t7{^cMgdb+N3s?#b@Cx-OivZcW{-ev|4X>vG|+#)hFE z3XyMhM|}RV=ih#CK6X)7CMj=BvR3-QqH@X?628LgxRN7a=gt zz`$x2yqlm8IXLzew&{S^ko91AimfC`5<%qplGdVj!>G_YI{61jz#}t~C`O+?{F0I_ z$#S%JybFln(G%HY6mfut1>zxmHU*TW*iZS7#{l@8Q;(g)!>Z^D@}kZABTK0f8Nw9- zo3{r*Nc1?Q!q>=&&Gio0Ln~6HRZLx4dTT$~R!;anGBT{xG#~yra1!;}W8Y8UHv%5` zipFsH@{r?IFx9m~fmr)1Y?4hH^Jo%nv`ZQS=1>!Mn?dD^YN^fld9QWstI}WzziK`T zT80v)n+ARKVqPsG5z$i)ru6f`8h3(%L_>yAa*%NW+da`~v8dy7W*}h{x*EHxcewXT1(-s3maAKAB+G6j|S;Cab`8^fgm0lnn7hV3j z^2_FXWHwp{y)>50ln!1?a8cH6tbe%ZgsE_x2Yqrrty?!aAzuNvSNe9Iz8sWaR=v65 z8M;Rul3kdm(~>P+>yGe>rraCIA*{BycdZ)hFId?l&swGC;YdL=5SD85_pIdA3!l(`w~XeG=#Sgz5<`r-WJC^;a%t?C4^;~SwxR#GoUXIBJvoBeXT7TPX~o$ z-QtJfClPfNT~6gr)AAf+PFj(>=&P8#ID}A&{;{SlKWT7XS0RGhwIst>VgGsEzVLX@ z(Uf)Xnz$3sr&4I*d7<=52{kUw?S76`abYpCuvVSF?K0zYX7^b(zWGRRD zav#l$?_yp>c99vgLE$MmE46H!kd63r%H~N$L!V&|-=GG)Le9M*!RBJZtz3Jg3BM6) z32GgY{*27eKnk8*_Rj8GQ9+f&y8OL?IyHIn30V2l?0#Y^73MGZ(0x2)yq?Xkj1+yShElb-D1M0jMQ1|my z)an|l2#I>-Q!4j!&yA;r`}6)frEK?GB%L~fiH_P}WJp#!zxg?hrJIRrOGQI|O;UNP zVfaymmT%wL-slmqg^v?Hue_$%l z!HKyj-H`oL<>j11rRDfeaf=KqD zN#g-CT@|yKIXyaWTQ;PDK5Jbwbz$k zSqnFnymnkAOrMVW$>^64qiVGduu12;3I^{EA3JM6roG0>K%^crEkPsMEbMlzCmBn? zTlVwVZ2%ipN4DS2nw<`-iOd$;$oI<+I%B^XR&!?#w$IIMa!LUP?Poj`8<)W&GaWh$ zCQ%B(QbuGiwrzrxPTPZ5<|UTnNl(q@_lVGWAs8=Yr?Xpxo)USK$$M3H zh?FB)GMwClw_nyGy@hNXPpdaY_X`xqO%5>xa*x(2=JfI465TyP1^nliTnA@uVAybg)_+77JgDCC zDCB=>|Aqd)MAtVEnr!=Uz!d@LE_*m2j?hk53pg6ndP4s-cp&)yif0S6|D_y)eu37g zLA&GQ);XZr``(`M<|z=@?z|IIH{8xQF15{sm-WE@?v;CdBIHI&24OVOofN(;CT??! zx@$#;NVw0In4_+}$23h)M{(PEEpmny{D7Z9<^`zx9z?k60t_fcs{EIizPr={0}jG_ zk`V)usAmD5&KFe{fGq{5+WpVXnKE1FaJeCB@G@$&#!RL6WxQR!gF8l^&zp&X9k=skaDUD6E z@sQpwelVEmThS=vIBHld8kV$`5Y7_5H*mde*Sq=GEuiz&ar<8lv`4Sr=i1-r+FJV> z?@#wupVey*M(=L-mlR-KNqp`w(bYDhub7!0^fC(s_W>jGLAz>d7;R4Y?;-;}bVo8Y z>tRyTkY9{K`ON+>xq7ZObVXc2sIca75sqr-sL7301HvdNY!_jSuLPppSy6*bQs=C% zJVhvu*9!VE(W6q5=j0G$y<<<*syApWlH5}~`TMJ=i?S&XX+8|#3|>mxP>aYe;^|tK`(JU z`i2ip&OJJ8-ACP56!_Z=haa4L(1;hw_g;vHe;&#Uer@cDxK8&CPuw9mJkf|g78fh_ zmLcd3)u@P zc#~4N{w?ejLYX~VApspjmhfF53|P8KK)y+IzNcPoc0}glp{bjyDi`%d38RC}Jr(5d z{UeQ|pAk~KfXXHkOg}`Tk0n{+$Q{tcnJsixg->j-0CL*=s1=qov}*<5C90Ec#HC=~ zkZVXd1UeK^S-nCsV8t`o$oe?JdT26LT`SJ{tp4(CJ%2S|p6RYpwTk6LS5zeH^p+^W44N}$4vUG7Y zVLt0dRhTNuO*a0Hz`mnVp+PKXC2XKB$Bvo6SJHWMoPczKY;A-wS~Pc>zUAox{JUzn znSMDEz!NdYfA(g72dm&gcnw=?jiC@UF5+uP& zSv?j{P_$lX+)Gt2No-UtUxJ5K$C+lYmb~yU_zQdR7XZq8R#fXaLqnNzbEXng5hQHL z+Efo3zVHr(Wl?fU_}mjY2wq$bVAA?6doZwP1P#MU%?8QqB`5+_RRwNXke5uhHpz_W z(H4{4V00{Q-t!miOM|}QEkxZ&35Aw8|7whUa`FBGo?W57T(E?jS~*bJUapIvkeg zzqJ@D25_J5cwvg;0VR0^4cH`C?(eNR%V8~l`K~YV7bVhFY$%%3D8>nLN~$*M1g)Mr zwA4DJ4_clXGMx}gVZTz@e>Z6|eO&4cxwZ{*MZCfACM?4^CI4_vWav=P(N_c9+&Z^h zQX@e29V-s%+?Y8xF7QMmmud}BZky>z4I3ovErGUURK#zYfeC$TZ}g_7GYMVW3B^&%J1ra6`F`lp9k_C==Zm+oh?uzdhQ|d( z7CKf?DZ$+SAwmblMLTI1xOvBni7lJ+lXP0>s7VwP^4A+hly;f+T4qOtQRM*1X?@(1 zmU_)A@Km-0^>rd-GSlRaBdx<@95zNQqvy~O!AQ(}QpQu;s;w)MSJk3%b20qvHzLN4 z{vb33#6AAoKhi7CW?W05QQ6r8TL#QS6(xPE*WI~B%fWyuem2# zY|X^+39)6p%NaSri#a>G5;7&l~CMVT~&hIIc^C z!9JbH3We26O$i;5ZO;|!m3Vha4cZhCO#Q6IPR@$)PwON&U^EGx(#6u_cq;fPFH_cw z%TaKu>(9vv@9%#wltVP`NRIspP-~nbXL*ko+lK3&@90V5o_Gb6C)-)_vXSkwT&Z`H zLc0PYogpPZwmCN*6k!LYg1HSSzq3H9F)Q$BkgrR2o&v&aS80!eOhG>+vKegQ=Ou7! z^&{y`&Lj&?q@zr-(>SB+Ja%hBy}n!ZdS8Kmlr-aD+aP-DlX73LLvGqHy_Um2V5;gk zp+9Nb`Zo7!B1F;!4q(C)h~=Yq?+v!gjr*7Ne`o#qs-OjLFO=yln)v$Dq)fAox^=9W zF)ihX&}2o8cN-@#zxhLPIjOdDaxsEPhO|0g4O+gf3$YvVf-)xQE8IcsEV=b`+j zk-%c$`5&I9nI-9_sS|1-oWZ*5@;77++}ch5*5oc{#{q9&^cJ(&CNqt)tco||P3yxr zc}YciGsuv#^U_z%lA+^*Tn%*0?WVQ7pAAL#psTg|pL^>PV|Z@XLeFxT1#dVOcM#vn zt%@E>Ba;r}{zz~cYcJZH1S3h#9pxLqO`2RxxDDIV(nmAXpl5yJ#I#0vWk6C_Im5KOG zT+qX*g;veEA9+HE{R(?9@!MFq9!lhgYO#LQDhFZt>!nFb-w)`1M+pnamRe-g-gC$> zBZT3`EW0CP+NAiykaGCHSXy_ocQhq?iKU8$DQvHxXr4RQz0b+ znkSXUm02#x`&$E`ah_hQlwgJBdzZ-%-SmRj2+7uGLBVaylFZj zFh68mG)hu|_)OJUa0!d3?apap_C^AhY9+p>Kx zd#?M&v@TV?KDR-T*MW1;2vH5rL5D zup5SOpisF0wE6J%+eN;}=;%3QdJ&v*PzA>R0Nn)y0=8p8<%fbF-94iL0u!@`|K9&b z|Nn?m0>R$-LN$URfv4#u{GX{HPzW&*(ff&*hjCth&Q!OWL7KA~HLX4B$o|ACtE6 z(^;%8J^8qd9eX2QEMX-Lh2>SY{W!V*_>nI`*7({7H| zlEsCI=G!RCgyi>7xnoevE2Er$g?}L2Ftw*=uRnQTV&pknm!1crhrvn#dP z6q)QL`qYUW@hG_cU+dv!!ev1LIh*9rSE0o7<|2Z6V@7Li>yTsEqU2C7O`jKeer6RD39>}1?G+i=AFOUzl} zEn>ROR}E^jTlL1c-EIET^M+%6J@U*!g}GNIA1VHrzfo05MmwXu%EO*lyETc(_=HwC zK+{*jAJo9kCTX`*$y^~d!RK(dy{}2mv^3q&peo%{XS=LT?5YZmpROWf$;4jYnu@ee zN@VKfWHs_}K{fpvBcAd0RXsQNe;JnljMHg>iCE`InrSIEz)S|jehoRn3UMBi*3P3J zp4|Uy2Y|XPu!f5TGl0#-qZ)J3C0ERLJXDpZYT$t#&|@@OAOh7p{<8Zy9oX?JRl2#} zh=m%%%iRGk7p$jRbT9mzW%<`Tbq>|O*0E3gAU-WG0)iVHg$q0uZWwMK)or?K8(TgW z*002{5gp=FlIIij0o!dJao0Ctj^dKjS?_ML$&Zcb!ur|_$_}*hVk4*7Le#4=HZYpQ z4xNH_?v}aa11WOSiI>6}!dO6&PeU5!W5{U=>JfO`Jib_1(@!kP`kB1VgAUZRF%cFdg^xdk1Z?)P{3 zKO}Q#$lsThVLqxE`I=@#`;%>{t=$fpT{um#WX_ny))bfgIXeOl-MtZ2yfE{Oz z8XOV&cZBHg6Bi|!AN=iX8qA(YT6--4(HJpVX!^0WN6ar#CuW|K)$fcL zVbyAT0>_%8dLZ}OQkJ!InYVK%|F-2+1s0dm_HMD^jb3BX9Be`|wY z)Iolc)+8VB^cT7SlY8+Jse3S<-*22{m zMi!B*=0Le(>2ix|ruC@7FmKg;N35=hMHxf({RKCULLqlY#%D{oWF?p}aT-OC&pj3w zRQX)KpkzK&GquvKFzSq;wU2#Rt9_;AB?$m?#o_|Rj~`W{vV9L1g9|(u(c7>|D3HIZ z#TfC@2T?8f*7C;Bk>g{%vRwm(OJv7~Sh1BPEeW~D=6WD`2ns%e zd(LebT6ZBN(p*u+7WWQ<3V{F}hX}1Sm>x%=+P*s*66x##dZqsE%*BM!$)=UjHg{*C zizCbjE%Zm79l<0eGsoaTe4S4?T#FE#{IBmp8X85?`6G!;>J}GdKBhIad1e(gN|WqR zIbFEgqbl^e&gBM%vYb56t!QGCVr&1X?Ysh*1n0FIT#e#6!CvAL+! z1aw;I=UwOgG-&~DH-4OnX=?h^@b^4Zw~CXPRCi-p5n)1_k4;JRin7nMM&%FPk7}}a z8XQB@>HA1`OoSY+OrI|~<^ok!asHtkG4Q!4tS^u5sMsEI_?qttdMwzxDImY102YXb zI*2km?NZgIH==1vqhqMcO&I(l2=CuP_U~vNZ1#KSq80y2{H@j-Y~jc`FnF?~sJVMh zvJ7iL5t>nhutVQFIF#ZzxWD_R7HUlGx3`oN2;}ah_LJM(xa+{s^{)X70G2|6DGWD+ zm9w9pAyceTB@T?s+z)OuWYuhnH*)2n5x6#+ zWtnEnhE*JEtQd5~=h#0rRGn~8HXbE7HIu0;RvQc|LwQBYQt>Tkh7sg1-JBQ~r>IJy zb=J)|7C4&;ire`4r0=KXH(XOY?i2-&&qsQXroMd6`zIPG`wv@xYgAADOi$F|S-es5 z)KP0FOpkY_rbtf+^;B4r7Sk#>{QD7=w%XPCLMdW(y}(^pYcSt_((D35vHU2(rbx*o z+#@~y?M#DkNQOyVpkUe-*!8>^PDTSf>T`LRJHUvf^_s(R9G8W z5za6yeA&8?$d#cakvK;I_>}wN^UXp;VeuQVRtnjrd~0n5&m{YVVzp(=?z)ep;xzK} zbTTY(bIRFZCc76hExGND^XIWMm=f7Peuh8jV=mkS9lpTYo>{$>30g!K0EG~!x;pUw)-YB&rfOWL@A=o{|gJ_!^+18pEi4Zu0LglR}sdye&2}Kmw z`vLiQj|{Rw#woBB!A7kc%^ z@-V8rmmT)(J<(eMV~#^c9}DWyU!<9N>hv?zR~bj~lT)1`&(d9(0e!>8)UHusoG1Us zFU9N}y!ao)F3$dDvu?PIYADxlkAkz@9E2OHzrm(at|K;KS?9hg-+^Pf&i4T!hXLR} zqQYBsX@h*Frc9?+gb!ReUhFXrw=PUx-8Qio#-Ot7yvl`gi_ zGsW2TN%J;|*j6UgJvpYiv!}kXc5t?<3FCx=0rrU?NovZkuz$&D_g6sbWR6r;r5GTZ zhlHmifWwCzYKB0zlr0M!Q4q@8$yfzUG>Iy@$uhB7KTA?-K9*uZHKWM(M&@A@Jtm3w zxAeuyNy{M?824`)l^Fy8PMZa#>PEN(R#rlqM;tO;Tktm@c`bcwXcB^qG??`0auf^V zaPL`LiE%2STsoG^Y}`qMiMZF&l3AX)(UuJXt+HNx#!O<*yuNp|JeNN7_680RaMbNW z;g+vZ35%#DRYagH1m{GfghbCWl*we7?4@tJm(+#z^z1RNfdi%96I%`1N*9_kK?S6B z3ei2G370+0!)a~G&pBGk_E3-g;9tYL;oDR*J+|&pMh-8|Gn#2IXe|_C;KSWxMBJyr zBHpoz&2P+V$}_S-&=c&%`+E4sBY&{ea;I*zfk8H_{*gdcg&tA7+7zo=KyNyZ{k;y< zK9>jLEho~7t4`i~)cPs7z|W>S zi#b?4Eg4-2AF@|=GiYX8&PJ5X-wjaAQAP1uxQqFWnQV+%g|!q6#(fwAZv?ngk7cCn z$v7u^6bf~aW{|6+;Ys^w90{b?8q;HxAJC6NlR`mf+)P+A_Ye4o;~_mKic^97~16sVq37kdH*mdr`=V{byz;B zT|Q3EAdvE^ia=X22IhVE!Amyj=AM_Bz+cd z0iMn(8zAD`=Z3UFL%q^gPDsqS=m5 z>VLe3Qs(ZPrz-gNDV+9U&!;KE2YphglIbzKVtXuH6ly7vCQll{n{B!LHp*zzsiU!u z_aPmS4YwJXXU!3Zb9Ds^UscZsXtj2FK~5@AuOiyF7Wd@N-Ur3W+J*O;%1jl{+Cw6x zLB>ZPSNguocghw=tQ<}6_L!m;(oSb!DrT5nqb?@HmkpB0DCwa>Jq?V}V*9xWi=ExfnD$`bb5ZTih%M1#QJZR|4%4R4g9C^oQzB^O36{y2$Jm1;a;0`>yRGWyh5NMee|&Gy^= z<=o&#NddVPQ`6YADIxu!kSOj<(xtq9<75-j`5u5e--;gZ2p62zMEf=XNF;Ij{olJ) zS^UpA2Ka1;Md;^LVIPVUWud7e>C7$8htH()E5?Ig3Fpec)nod^BBG~8OiPS~5J=xA z`>xJ!-Hr}UItXR!_lySX5`*%(9CempQvtlOF-fqe5%TONrjBNcC0ELWaZ9-u)rI<& z##!I${-3_yDLT`jX&Zf_iEVRY+sVYn#I`23ZQHhOPi))C#J2J5yzlp||KA6D?LMgP zRb5?u)qQlY?yjrir9L`hhDMXNeoKYO5=f`yeHzNzCYi0yvihY*u9AK++x-&!Q*`{d zyZp}4c$Q%r=Ymx{1OAO`??-H-TM}{hhv)#87*%KSZ924P%J8^5yB>e2RfALl{M*4s z6opxv!WQ`*l*P*gKs>D)?~78o;?_Sdg5hXzH}Ct5(FV8Vf$%BEn#*Q$_5Pw(P+5y7 zX(nuY!ahN`w!lH#C3&X4n||Z{z@hpCJ8CdZSWY6QIfAeD)z8bYhinNG0FRUvY3!*s zR`y#1u_juquybz9Ty-0Sm_IS~2K4rB6v;@UU7*xRXQW#wTMsQiik@Ox21TO^#ZB$tIO%LW}Rf)6E=r z?%w8}HqL6t117HJf-_FyRo@9~7-0-$+Ntdg6`tH7uuZ+xV>yu48R7?F!TC9L?s1XS<{k^kT-nOEU~Dl`_G*r9w&xMR~2vnchm`%h0rs;ivmPdU&nGt znHbMqVfSH$@z#^s#cFBLWcrlLcB|MzS5Z;uyGdMUtRXrKN9MF>hyACPKJ6A$7YNW$ zbLS0Cs?t7@Cbv_DT5h_SCKpY65hxy0k`jgAWzoQX>ZQ_@2MaTVn3$e7fMX4Uav`vT z7Dpl8!e?4oOvH$V$nD)Qamve5)kCGtr@$cn+4qr{9bW%QYm^dZOho+BJh?oNxP(fG z8w7E_Txau?_?QH@a&E7pm(f%N)J@*7;P3js3WElEt+^)3)ap=_$2LcIBnnoWJY0{2 zZz4e6vSkW-dAk;kckv%KD9wZGW4v^B@LVYvsEIV>+1fG?Kvw3(pB9qVbCONH`i^_oDplt6kdK~;=)P?j-a&frH{NcSox8<-HhnZ!M?<;#ba(U}6T5^4J z&VuoZs=~5GX5S>6HiPoWqTI-m7dtWBI7+n=M|RG%CScO!pTi6ljREH@->PYZ8AueI zzC7wRuggMe(bS*7X*4EVcaMcQ%s?lKl2Cr|@SpKAl;B-I`TE0~uuIA%_M^!#Pa7c= z#XN?}*qiR#n82tsbefk1+1A!OhZ@^&T9Z^s(10Zm0 zY#Ru)4FCGplfQ+3+xgCTZ@mM*2i-v5Yv9g1FtFkl{ubyv{NcOfeg7`-&vkLP2l$+xh$zs+{!EI%mp<+ zQVg(n-C^}F;0(+nUHPHLzDJ65PSEF^UBQcT~7)Ya|X~VW>YH(&QXPT@xaFc@ZkJ#&g8Y*@iv=p^d1+n ztFP_&ynVNAUz7(oLzx>w?ZbyVHG+J9umhI(ZrlPpb-!90YA`o^-YryO{0L1o!I9!i_wHZu+Vrp6ICm}BZ5Fk5oNvZSKgzg*4w#$u@&6yS3VVoLp zEl=J%(uCrWK2}7f3PE6L7urejic;|SQjF=CZGMm>J6cB&-`R5)b85l`kZb3|WBccu z>+&&hGye2jDZK&f({4)YBVYBhaNE~yTI4K|Mw5wuWDni6)3DN7|5r6WA+r@qd7An% zfSB^T!er3Q5Eg+&vP2+k3voB0#|=jU-_yl}R(cd30`M6o&BI2 zjo>G<#iweu6&NPXQPXkBq->uI2G*2a%-)+sGWM+4ZU0HGR7%@J3*o=K$me78HgJ2P zU7~t+R}r8(E-m-qRe}&rQZBTydM&eOsE8~8X9N~d3>p&;i?>cD-J;~G*}3~x($Qp5 zhao}?Y>GhM_l1k3M9bxtSLBa@796L_Ht+4GM@#!Gl)}{j;B@|+{0<>p-go-CurBPC`X0Ju(5x6TX?{C*dl=Ug<@lIrS9=kPZM-C{o1}Pvllt2~>NP2fk z^7Ikez48*fs-02cb-C9vWwIwU9F-BMe*l~&L(D&UJX{Sqixx{1GqiQJ!re5KT8u}c z^|4K=6Aq@7#b6&=WO#J)wKjISsHC)vNKJy{tF|#6>_B#rv2SCnjn2G)S{w}Fy-w+i zf2xw81vSHX@dP_&6r$pW8yxfv)1w54Gx@`xzn%TzUUfWFU8kj?DD!4T#TasVG-=_* z0)+UA{2kv|Q9K>MfP%~gWg1Em-|P7Jn3(^}skL>!bLG7LSLOTW_@2p+J9mPT65VNm zYZGAIiA?gN#!#Kwa0mKzG} zDm%K|pRwDO!JC0e!~B^{nK2A$cXxeAff~XyMz!y3i{roKM9~Hm5E)53Fa}Ihxp|e( zIMsLf7U25sE6j${%ZHxjYW?hD=2~G7U9ZX@k3H@X4s|vx-e_yLnzQt-D}t_=UVrjI z2Jvy&rtEd0FRc;J^naIjqmk%%(Am}6XsN_(MH|S?%gt;juiE9c&0UUWXOCYl zfYsV;FCbvMl}H<*H^tO>ZQ+LhsGjYm z?vSbw#Pqke=t*-uMo{=!laTL3DHj2A9foJAw)eOqf!uaXe^#*+Y6!AHyQtKAap;ag zBI&X!iHrK8(0O9`O8}_MjU4TY{B`Jzq-|CkDfm)$zW#h)A-JM_zGJfcZO^$?n?#v z<+?7BCZ+Uusb zQn873sq{$6AjO4KB(A_3HIVW4Vqkz~t??cEpiyw-@Cj&iHUi)eC>w6oex76mgZ6A+4;LTpi}nI zngo$K<$U3DCJMMGx*QjAMO#D0lmd73Xz4Rol~ zdZ0kNEU0>-{R+3#b$R^9Z@wyn?jYbX$RpUJg=Ci$)JHx6+$7r*2zR=wH16Co8Pq2N z55$FjlmAT&d{@IkVg3*#u=Lfe3OrJrErEpZ@j}EA9b%`0V0iOy7r-y1Kmo_aN=x|ycjO7kHx3B9AN4T!Zj9UMxOokJ>Vo7%C%~)dT zG`#BW&!)LOx@Q^J>NA-K(DniyI%-#&vK(TgXos(KZT*!7m7sWZ<5mDns2#(1DJn<> zeE&{xOL>&tt6X28xSyPnRvM2G%w@rI76^LdQ+j)pouLp0shinPt6a_i(hIIY%CeJb zkoSWzCAdH1ouEAim-NH&qVDJU!rCeKrC>zgIblvB$WXqz7>7xQdQgU3MQonIIHI0w zE*=Q)Eho&8!W!I9vq_SG@`zl)^qwc^#c{!>0KK~{-!Jv{d@+^Hu7=x@XQCt)~LlV{<51ctWJme(n3)*+uqhL<#$Ua za;cilp_LH15Wsjc#jb{%+XT3}@6!r3bxFs?ojSy5YF?Ui<%@m^Gk0Ej6rASDPi@xy zz>M*eyprDt4TIr^=vOZeAjlMj^(*9va&Q9CB6XiB z=g^`pI-;_UOlRrK$p}dDPvtVY-V%<1e;q^BGQq)OO{7w%MP%T3ejAMj17%lJ z8zYB;UH0<#X*$K@169uq>|6y#2|854v>E~hwg_uWAH|VHP$5ohTXshB@i!k2g7Vxu zTONJ93+U9hI_TF6pypTh)b#_3T$*! z#mzaJRDZ!CiMB=b`j^5A%Nyjic3j3hSp85$06yQ1m{m+oJTrch*lLcx%nB*wfb|JN zazQh|>d5g`URgW)Q?YJ!al&=P$!KSLz#4>MX{epS=+2>|n`aeYIl)i`&wUfA)NCv= z=K8lUs=r;8iy0~ZAdjBX5+wWyZb8MLLQ4!VD2!!fsh2>;)s|()CFZLB$-YYyd@4A- z^r9oYNkIUkMdT#xnHMGOaCXY=+02N6;}_MAE{hteI@5s9EsEz$ z0scfe9qovfId8jxyOOzayxHB7a-NaJ)K6 z$eT8jzwZUlB~r&N{GlWm>H0*KML6g9QaUVEj3YiB%Z7ECX?fYvrI{Q*_Vk_lM$;SA z!8L;n&1PXwV^E_L`s@9Mta%c;A;}I#l83E;Ai(>9HY#ya?3teV2dOy#pr#ErJ4Ix@48HfrLa+v<8<;RuHZ_@e3G>Qu z1xf=lW`=5&7PzbF&b4j*6vPblsY|#e`^CF<8_qMsWtU-NtK!17DGqA z)RsV7nfbK$tj3W3m9*`W2q}%hCSshDiN?^5%;jgfV2tZ7kwV+J#*2sATl91q8`L1g zmBYK?^>rDkHJ}~vyrd0c<4Ha2+|FkA(0VfK9R7=YQDn*ZL`C5(acqs15lb!EWrZb7 z2Lu<|8iKSgMXKq~01Zp9rM?iZ zqmh@sx=1Y<6*nUM?uPX-{Ift0g*#0_mB&qg;|!dw%I4K0DQ8{RYW6%j-#YB%=AyMY)~3r2bT!zki4e>l*?I1D}+7G3DazB z;3i!YWMI?U7y(VQQ|Fq5Ri7MA-;Pm{7_!E7H8F+kNzSjCNw@~WY@3I$yblLG{2L3c z(TrxuIegyhFB=yBP1_q9^*J(0UO~>{*_2fUS^04*@4TwtbooD{vhF>(x8}=d&mYEC zAN!$XY=av-j6NE|sIg~xIm|ynK+2s(ir7)+Pey`|r1QN=e|n0Kic>N0W^GI4xI~}F${tn&~2U53y;&bHn>973FMjATFwyFF=HqI;DV8T`DQhLM0T^B zTH}U-+D*TqBT_4{DvgArj^LMt;xVTU036dTs@tBF04&bfG|8^bcK{DH8vG6O3sR$Nr* z^o%twysP5d`T#eOPM><@B=4QS{ za>-yxy?hbs>#H87*(8Hojq+`knXT;JKn@-un+8+AIb<~syK!}^6z7+|)_&5x)?wE% zl=Z!~T4vg9aCZ&%2J0pjMTr(mjnUY`^dEVin{5=^;aCrYcrc zriz3DaTx4;u;+!4)zLb(|k2ZCEl$0bzx* zN73$AY2^mK)TMJ6Ez9IuBUSFbJGL0IIq~6>sw$9X73azAhejn?^9gn1G6p3{Ibu?$ zMkU(e{JBO3_e@95l_O6(P~j|D0M7+gwG?k1r(J^Mnfy_xz3bV=zLUvzAs&rgxS6q#<}jTxMXP*o1z_@RmDX8L-h}+Q)a!JUImSDqs0#ojFpH=2I{2^m$UK?E}C(Zo*JTRHUl=& z^Ru5y-ofKlCP{)|){9`}p=!-tpV3J_lAb0|f z2``|U>xt$Ohg@R${mxVh3dka919l`N-%sz}I|rhb)(JA_$Iacve6pTn5~_ z6odH+90iJh0r#hv4@9o1&FFQ$fHM?^alqIQ-vb~i5QskEd;kQ#Yzlt)BL0u9?>^$y z)qf4Xr5@3LJdOfa5MF`KQU}0HE)Ajf3trfe|5^Uuxo`K|*69D)M&J$@|398l4}b%( zhd{#r0`j~7{m)+C#<9b8;GW(3|FP{I@MWGP`9G_AYc1Bgg9M(7nn8j_fk5n=ng8OJ zR_?IU2>1X3_Z|E{eBC}E0Ixu;F`NUSz|LEQC25BCYP--S$+V}#eTqVZl! zPsG!LM_?}eE5X%6f7K5?TC09{i|8# zki&S*ir~C6m)U7lF6AX*7eQ1GGnGaKsT~ z#JY-SFO%B)W!+b1#65Sw5Ou#+d5D1*xW(*L^Fy6-iG#y2a< z3PldW4)0CCrW-t$91$hhxTXvzyOS4kCe=BJuS>!(0PoGYPXU3_V4AiNbH7DRnV)U) z4IwedV^Fie7PF)7hHcS@9vk_n%tTOem$T4h+_s?jL@dmIIP@Nvr#g&>q;61#Q0K;_ z!54@kvg-R6)IaLscLmXLc>p{~D_*PMO_?xjcwEribe;h2+1VY90~h*k;0}RGoUd+6 z3^#=KBkNi02_HVaLgfzVBz=C_7nj-XWa3sLm{9Fo8#1>Uln^UYrtfN>L{@Y>|IYi*h{#7nWA<1oZYgl0n8bT`Ve3IUhs4evugyfO@?5V^> zrA_iOCH=7O7oKyO6Tl8RUS)(}2={6W1EAU4Hjy|N3=zi_q+i+M+B>12fFns%$(^@F-rRZA>TUkpq{k+&u{49 zSv}#%IzySH^EduuDfeVm#Ty*Yr|xr;H#7HjF8(7=VBd*RspB^Psn1!I2bfZBy&#R@0_s(acT&Lb<^P1G7b#891lNe0@ zZks13p0nKEubTIj?3L;*kw@MWxQ@^1Z}+a8AD~L_cY9S^0)luUX76Scg#(FC$kTUf zYs5R?c6pHGU2V)*c#-P3DB3bV(lC1;(cNPp{q5E;720oN@A(gu%w`A65U zxnn9N0qf$=26zF6q}X?84@6;K|ENawJOVBQ*XomwPkyYqdLHqt{AI@Y>@=$%2Ag~& z+_F2{_CR&r(D29ffwOOF6SC-RXilYs6osap9l(g}Ew;?91ipaj@Lqk*J-hO})OHIIaBCu%w`N>C}30nM8uKL>4UBEuc*_a%6HC$N{BwAY(+iBg#Cp?<&*s>^JR-23zhv18g&73-n= zJm=*BDi;)8bV;0vTLqHs2PUb|#o&;=Dt$C2{iU*ekw1hoXINbZRCay?0SGzlp>`nF zQW2b+)3TDGkR44&TB&qW(4cS{NZ&s09PC`5KBZICF})9X*k1N3;&oNuE>^JWF3N^I z-f{7x{0D}G0bSNRK??W<*Yh@sh5|3xo-DMu=XkTx(+QmJ;F7W)qJ(rdk6-s8H*(2G zy1^$=J%aLb0GLwJDPETpxL)9=D2O%D#C~2E2vqI!ol{wO{bHcipfLT^F_f}P_LgWh z62{zLwNn*&hV%H&c^YmAUasXI47KIP;kmQ{SZYa%=HZx%ZmAyBNa>w*WbwM9C{dJb z63o9(<>z<6lQO$Z%_PX7odv=Tqo(prK->1#Hx8V{M3G8pB8A6)NUTHH^@l=cR+$BQ zu{s8=1wOALgHT9MhIz~0RA515g}DBOfI}dRCahA56f9=ycr>)Vc-7||*ykFAe{Hu$ zaDt09ftGd))iNg7MrXzQYt)#J1r3F)k>3>%an9T)PT?n8!NZYMBxr1+Bm<_xNZ?Ae zr8*1Z_#5H@UL8)V3ReOE_NFq6-Ke>{UHVLhfbl~EBx|dRtxxAkEB7kZh3Kur-FV6~PEuGt;zdTH@1rP3pR^EiFJK&pkb69DzxWzwZ!FvU5 z9(tH%(O=vFmJYCLQqq+3f)GUyQ%C6!ui1Njhlx)`+yg%6M{vqRamC|$#K!s>Vm!(; zas7OL(7fg^+A~*Jw^XKIirp%w{7u%LyGQ;7<&yj-ZQ!1~@F9zW$gk8y6Xz_xu5K5q zhIc726aS5I5D6S@xNa|-Q-csv%3v#gst?O4;d4$d)MhX=#Tc3pe<87)b^`9qR z6L?JvK|a0-tGpKwHta{|o44n=qP7RhwZ|@d)__Q#g(gI?kJQ;WcVQ#-l+-Urg4(=8 z%8fftaDSy$*4RMIJQuy1+rPnFa*?=t7D5tR*eMNP-)XWED;dtsQoMd`5y&<3mEEV$ z9fZ1iryIQwwO!uiC{*>i=7@#y(Oe~FqK{iH+6OA)T7XBzd@H~6*>kg4O*uY7xc@{AK?#1@RgTY9E~IG z-TzMj%^!TDrJwHx$I!+b{>Iz&N9~d5I)j`&0(;nKFci(zgpjj6ijjG5A6a7E#jocR z$7d%XmWs9jc;BcRnDHlG@Eh#|UHr%M@2y zKQ|-=S3aw_vI~tUaPzHM{n$7Dm$d0aWj;$y23v+*DpVRu2ID0q8!ggQbCCeX8!gz9yuiS5{-NN&VOzlq${U z>4d&Z#Lm^$;ksW6OH*O2^geF0N7B@DBw}Fk{^e+c88g2^rqn7;x>n2wT_16~0^RWW zIeqx-)ZkJ6!iV>_h~(#&-a!_uBb0PmC|x=5*S9kVGz|{*FlTQv`ny4gz{x;P6R%!b zO$0EIkS*aLN!?7xYC9RoEj$vfvS0}nDCZdn(!hu(M@Eq9L8F{&2VRPVyax;m_G$!n znRy$W?gY=l3x?n1p=Ju}Z$9}`UAN)ZV=4Wv4jFfxQqmnqguCIBg^V+j|EgF@5S zqW;I|0Ix(94CZK26|ZC0l1|x}V(Q{X)+-!lb|R-lK>!-V16Rmnd|XhR?1O#;Aa;fg zCDVuuWs%Ul44yQrfsWuk_|49|Rn2W%#`3O&$=G07oD{ji`q=ZiiS$?z^EU$D=(^7Y!SS(EB3Ptmk% zlkDGe{DbG2@#eBwN7u(>&v2H|t_X))YKCPfln(m9@J%K;MWs19Gh(0M6|zxLnmF>< z;;w`ApPr`Lq^tTzNe4vAwc=QVP`d z%%+OwoglQEL7SLDF25g55zL1lLMP6n9?}9_(Crl)Q@w_zuIaO-3f2k`95555zz|-b z5X3xW34SRv0dgwiN;hwW`Xjht>3(TXbpC2|f``!j_kcVAWsGOkqscr`NaE?XKPCs+ z`O)#$pb%V6miV_U$-hZ(mAZMRIY8FD=ZDM2I!I2MM|~rf=L&R$OTLi5?sRf!{Tw}O zLip|&Y79Y8nnS{%eW2|lYmj^wHBa|kHlB<>9@I1RL!=@!nA5Hryqt4d)iv*~@~;0A z-^9R?Bz(c{=2*6@sA{l1FPcpEx^&;_@ta?>MS}ld%SkhNs}sUXx#ji2VEnG zovMgy*>}5yb-5Mbma@+|uk*z(WW($pjNLLJroA#RvR9Kv8p%{yT4rU7SAtK2x;3A9 z>f2C;t>Sk1+eS0|cwS(7p__NfkzA3fT8X*8Z6E;|Z3c%KwVZ`5(BY!mi0es-TTroV zbaSa3J84TD2${u&mDvB3&YLTwNl5hbpxgrU&NTcHfeP{kcTdeoHK9c$(ZuULxGoKEj}Cr-jJH0cuY zkF^YeD$Fon){oluT{t(ju1WjeiD}+$b)!)_EOc)<)lM@%bY{F{gY+ITk^XkeU$2Qv zrn=8hZ<22}IT6n(Up{H!%BWenJ|v(=pe&&RikzHoWiDS87#8$Ck%;7{bWdk#4B!jI zS~rrlh^3G&WE+PBWt}<+^N!kVbMzIfCdU{I0O`PJ`=RMc#K+}D^GTzyEsmKxYDAJk zy-@psw<2)m2yG3hKaMpUy==2K112gEOQ!f^<+Z=kiTgBV^mm52Q;PPRVagoF_Df;- zw_iK85BY9}kP9{o`0+cX@d;j)#gUT<6Nqj~lb(}4A@xw(-g|q9`F#G*ZyG;4hlKf8i6k ze<2lmQ-MmRn1|DeqL3`DGr~QPz6F0KTuolkyQXry{w|aZVF(%8T6@2^noJ+~RQh|H z-%F|`HO;vfj*7tZ!B~hQF^AHxfkNJIcitUtmsV(eI5x_jZb&%kj_f1D8{$9u6#JJL zE+(Id43`+17kxqa0fO~MXx}J*Bx)Lt6bzb(Hto7oIZrH!yzUQ6-g7f)163pp#=Vi2 z0%;gxthc|k*9ht@;QtPY5YmV5T`2wggeXRqUw&bo%I!t&l;7@yD_!z+1gYxEZeDmg zTnfU$Aem3zqh!HM5Bfnwv|gyuk=IsSLGD3bJq9(?*(UtrRLkfgE?%m{i6jdNbVxD* z7E#;YOep!U4)u#Bw2pMx;8>E{^2l<9Rm>5yceXbnRP9K&%lSeFdAs0f^5hN=P)TR> zp&pjMYA1G^Z4c-WN+Y*`Arj&DsUpIHAK8&)dB0q`Yf|ecBN)ZQ^KP`~rM$Mn!5h~I zvie&(_B_w%`Qm0=&Ty`SeCcTW7BtDm(KBI_@QK1ut2D|Wt3^isO1Tw>@u&UbJ4wB( zK9PoS$muPLo^7a8(P1g_SF_zi=PbnCV6L=WWb#xcFMBA3I_6_#_<;a05TbbR04*(T z$2(0|e?bOl8{8y^_Cv^&8Pu-*%e8iS7_2;pIo420+|7p6nQ#S-zL)4fXG_sZImVo$i<+^%gqWGPNY0 z3Cw&@{5N1UvkJyBxBwRuVS%(fsaDlj&l@KEceBxU%E+xi8Fy}8j7sI1*+Cm`S23J= z5iU;`GcRDa_Ixm$hzIzBYR%o2&e%?bj-|Hw;f&5Tz7?X7&Q-!_O^qAHj&ZV7BQ{qg zfK@Pt5H=a&ywnSCyflX8`fiLSKggXk!n05?`L6HRZ3forJj6PhoJA%DJcQDZVoP@| z{eS)Vp2b`0OA-6~TNRqE;mHPsW=$r+yD@D<2UDlP?Wax;vsQ&Iy=YTZU{oZK(I)ar zVD!5g;qa`%H)Lk#FNP~NUD1dRGE%Q-pJA2qZ`skiOsyCp*Da3S!P@kN>T0+Wie+^x zUB2qgE%~`B_aoJgd|r!X4Uu>?7rTf`epaXjgHSGkq`?k362b_&L7m%?R`@>m4Z@)< zN_yXwUMXLG@Sac;gE>L}T0sNFwzpTbL>HWusTQ4h)If0W+%Ru~1d`1pIzzjcI%fvu}!|Kx34frF}9*%GS_m(Ox? z7tUx*12c)mUPJ!x!ky;DJ(jHE=(^~Q0wx0`cpv`*RA6;4zp6_x($=#n@~`XQThMD* z37pIdIF~}{z=tAMiZZnpt&)&H4hZ#Q%+8b897cHH$JM7Kq^`gvVfxT2v2U}9;CuvV z%ubiD=)X`>x*l@PnbqdoW}&dtV3zvc?1W!xZGaZ!!FZ;sHTof)0|NE%`!K8gQ82FY^0W(z$n z$?l1HAXnEokhb7{srn(bL61_E%&a{HUm{e5_|$l)CifQ)3Oz6Cz{Eu8Y+>p|m)oum zp|6B6k7(8N7q8Yu*i#h@D3oES=1jFAB}ElE&Ql4-@#BJS)_$y|04D_G8AJY&qv=n5 z=*8-M)lzsL`F5p-zV@a8BmW~R!DlBv^d^BrA9{-n|Ly*-&_e;L<-3ssj6fMp3*B2%>(f z$f*xn_ePQqxbSc`1!W`$G-7am7fW2(`0pnFUt(jOIUPXTLx_W$0r=nfr(SYEr=!X_ zdpz{tE=vnJa)9IcIJmwHKs9ORKixOn?=iLCf3Xt$HxQqid#edxa@D>{!lUXvv(@1r;*Dd?y^}Ek0=yIlG-Dm=G)W@j@LmJpWA9i@;Km_61 zf$y~M-%iwj@18&IsYHwvFNCpXd`1Sy@v954IOQ&U|mO`%PM&wQ$4{ zYo1w8fd;_vLLlS-#ZJRlZ!9E2?Bx=~$RmN+in>WZ96LNPh zq?uWt6{_hA2@J-B6`Ric)r38F1{zq`WjeD4$d zs1ThuE{PE|!GoDw>vtqq)z=i=XtP^#P(^AboT>o34uZn@6-Nyz29vlGRCkQyl7xkmc@`M4g+PF-2f&u)W=EljO L-=6>wBn13F#LUL} literal 280200 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

uuNZ{M^`U~ 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⩔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 tyyfLJO#xZ(_$|Zu`P = { "swap-adjacent-lines": { count: 6 }, "duplicate-line-flip": { count: 6 }, "identifier-multi-edit": { count: 10 }, - "swap-if-else": { count: 6 }, - "wrap-redundant-if": { count: 12, sizes: BLOCK_SIZES }, - "swap-sibling-blocks": { count: 12, sizes: BLOCK_SIZES }, + "swap-if-else": { count: 8 }, + "wrap-redundant-if": { count: 14, sizes: BLOCK_SIZES }, + "swap-sibling-blocks": { count: 14, sizes: BLOCK_SIZES }, "duplicate-block": { count: 6, sizes: BLOCK_SIZES }, - "move-distant-block": { count: 14, sizes: BLOCK_SIZES }, + "move-distant-block": { count: 10, sizes: BLOCK_SIZES }, "remove-case-label": { count: 8 }, "composite-multi-edit": { count: 16 }, }; diff --git a/packages/utils/CHANGELOG.md b/packages/utils/CHANGELOG.md index cf399705c..f70371acf 100644 --- a/packages/utils/CHANGELOG.md +++ b/packages/utils/CHANGELOG.md @@ -2,10 +2,6 @@ ## [Unreleased] -### Added - -- Added a `postmortem.quit` configuration option to safely handle shutdown paths when the terminal output has already disconnected. - ## [17.1.8] - 2026-07-28 ### Added diff --git a/packages/utils/test/postmortem-quit.test.ts b/packages/utils/test/postmortem-quit.test.ts deleted file mode 100644 index 3ac960495..000000000 --- a/packages/utils/test/postmortem-quit.test.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { describe, expect, it } from "bun:test"; -import * as postmortem from "../src/postmortem"; - -const childFlag = "--quit-without-drain-child"; - -if (process.argv.includes(childFlag)) { - Object.defineProperty(process.stdout, "writableLength", { value: 1, configurable: true }); - await postmortem.quit(23, { drainStdout: false }); -} - -describe("postmortem quit", () => { - it("exits without waiting for pending stdout when draining is disabled", async () => { - const child = Bun.spawn([process.execPath, import.meta.path, childFlag], { - stdout: "pipe", - stderr: "pipe", - }); - const timeout = Bun.sleep(500).then(() => "timeout" as const); - try { - expect(await Promise.race([child.exited, timeout])).toBe(23); - } finally { - child.kill(); - await child.exited; - } - }); -}); From 3d6b5b7ac83a79adfc06e11961831add74537ce8 Mon Sep 17 00:00:00 2001 From: can1357 Date: Thu, 30 Jul 2026 07:58:50 +0200 Subject: [PATCH 16/19] chore: bump version to 17.2.0 --- Cargo.lock | 55 +++++++------- Cargo.toml | 2 +- bun.lock | 100 +++++++++++--------------- crates/pi-natives/src/lib.rs | 2 +- package.json | 24 +++---- packages/agent/CHANGELOG.md | 2 + packages/agent/package.json | 2 +- packages/ai/CHANGELOG.md | 2 + packages/ai/package.json | 2 +- packages/catalog/CHANGELOG.md | 2 + packages/catalog/package.json | 2 +- packages/coding-agent/CHANGELOG.md | 10 +-- packages/coding-agent/package.json | 2 +- packages/collab-web/CHANGELOG.md | 2 + packages/hashline/CHANGELOG.md | 2 + packages/hashline/package.json | 2 +- packages/mnemopi/package.json | 2 +- packages/natives/CHANGELOG.md | 2 + packages/natives/native/index.d.ts | 2 +- packages/natives/native/index.js | 2 +- packages/natives/package.json | 2 +- packages/snapcompact/package.json | 2 +- packages/stats/package.json | 2 +- packages/swarm-extension/package.json | 2 +- packages/tui/CHANGELOG.md | 2 + packages/tui/package.json | 2 +- packages/utils/package.json | 2 +- packages/wire/package.json | 2 +- 28 files changed, 119 insertions(+), 118 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ff178c6c4..b179f4520 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1065,9 +1065,9 @@ dependencies = [ [[package]] name = "clang-sys" -version = "1.8.1" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +checksum = "157a8ba7b480713b56f4c09fd13fc3e0a22a5dfab8097ba61cbc5feef950788a" dependencies = [ "glob", "libc", @@ -1439,9 +1439,9 @@ dependencies = [ [[package]] name = "ctor" -version = "1.0.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9bb72bb94fdc1bd619f4c18cc91ecf6302aeb333d31b3c6ec0bb841cd920209" +checksum = "2d83cb7e7a873830708d6b02a78cd36a592c6fa14bf267b68725103b85c0d77f" [[package]] name = "ctr" @@ -1692,13 +1692,13 @@ dependencies = [ [[package]] name = "displaydoc" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f" +checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.3", ] [[package]] @@ -2202,9 +2202,9 @@ checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" [[package]] name = "fontdue" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e57e16b3fe8ff4364c0661fdaac543fb38b29ea9bc9c2f45612d90adf931d2b" +checksum = "7894823fa221401399e2598f8b63f81ac77ff5c63248b7656779bff1632d7d3d" dependencies = [ "ttf-parser", ] @@ -4732,7 +4732,7 @@ dependencies = [ [[package]] name = "pi-ast" -version = "17.1.8" +version = "17.2.0" dependencies = [ "anyhow", "ast-grep-core", @@ -4801,7 +4801,7 @@ dependencies = [ [[package]] name = "pi-iso" -version = "17.1.8" +version = "17.2.0" dependencies = [ "async-trait", "libc", @@ -4813,7 +4813,7 @@ dependencies = [ [[package]] name = "pi-natives" -version = "17.1.8" +version = "17.2.0" dependencies = [ "anyhow", "arboard", @@ -4872,7 +4872,7 @@ dependencies = [ [[package]] name = "pi-shell" -version = "17.1.8" +version = "17.2.0" dependencies = [ "anyhow", "brush-builtins", @@ -4959,7 +4959,7 @@ dependencies = [ [[package]] name = "pi-voice" -version = "17.1.8" +version = "17.2.0" dependencies = [ "audiopus_sys", "bytes", @@ -4973,7 +4973,7 @@ dependencies = [ [[package]] name = "pi-walker" -version = "17.1.8" +version = "17.2.0" dependencies = [ "dashmap", "globset", @@ -5768,9 +5768,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.42" +version = "0.23.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c54fcab019b409d04215d3a17cb438fd7fbf192ee61461f20f4fe18704bc138" +checksum = "0283386ce02abc0151e1761d08802dfe86c173b0b494af5cbc086574e453da06" dependencies = [ "once_cell", "ring", @@ -6523,13 +6523,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.7.1" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6328af13490e73a9b4694030fafd93f8c8c6a9dede33e821c3fc63eddf8042ba" +checksum = "78773a2a397f451582ce068015985c33193cf6dea8b74d2a639fe457b2f07b0e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.3", ] [[package]] @@ -6552,9 +6552,9 @@ dependencies = [ [[package]] name = "toml" -version = "1.1.3+spec-1.1.0" +version = "1.1.4+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53c96ecdfa941c8fc4fcaed14f99ada8ebed502eef533015095a07e3301d4c3c" +checksum = "3aace63f4bbcdfc2c965b059de67119c89c4017a70d633be6c104910f67056f5" dependencies = [ "indexmap", "serde_core", @@ -6759,9 +6759,9 @@ dependencies = [ [[package]] name = "tree-sitter-elisp" -version = "1.6.1" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e2e9a6ab3cebf24ca41cdc1f985549b9b33f7ef25c19ac7d18e53a4ee24da09" +checksum = "5d68ec866ff7af14f1514f11b0eba7aa837adf2ad1837fa9b30c360461bff481" dependencies = [ "cc", "tree-sitter-language", @@ -7233,9 +7233,12 @@ checksum = "b40688ea6389c8171614b25491f71d4a27946e0c7ce2da1c6de27e25abf1a0ae" [[package]] name = "ttf-parser" -version = "0.21.1" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c591d83f69777866b9126b24c6dd9a18351f177e49d625920d19f989fd31cf8" +checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" +dependencies = [ + "core_maths", +] [[package]] name = "turn" diff --git a/Cargo.toml b/Cargo.toml index 79868c335..03d5bc81e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,7 @@ members = ["crates/pi-*", "crates/vendor/*"] resolver = "3" [workspace.package] -version = "17.1.8" +version = "17.2.0" edition = "2024" license = "MIT" authors = ["Can Boluk"] diff --git a/bun.lock b/bun.lock index 961f374ab..575bb17b0 100644 --- a/bun.lock +++ b/bun.lock @@ -1,5 +1,5 @@ { - "lockfileVersion": 1, + "lockfileVersion": 2, "configVersion": 1, "workspaces": { "": { @@ -21,7 +21,7 @@ }, "packages/agent": { "name": "@oh-my-pi/pi-agent-core", - "version": "17.1.8", + "version": "17.2.0", "dependencies": { "@oh-my-pi/pi-ai": "catalog:", "@oh-my-pi/pi-catalog": "catalog:", @@ -39,7 +39,7 @@ }, "packages/ai": { "name": "@oh-my-pi/pi-ai", - "version": "17.1.8", + "version": "17.2.0", "dependencies": { "@bufbuild/protobuf": "catalog:", "@oh-my-pi/pi-catalog": "catalog:", @@ -55,7 +55,7 @@ }, "packages/catalog": { "name": "@oh-my-pi/pi-catalog", - "version": "17.1.8", + "version": "17.2.0", "dependencies": { "@bufbuild/protobuf": "catalog:", "@oh-my-pi/pi-utils": "catalog:", @@ -69,7 +69,7 @@ }, "packages/coding-agent": { "name": "@oh-my-pi/pi-coding-agent", - "version": "17.1.8", + "version": "17.2.0", "bin": { "omp": "src/cli.ts", }, @@ -143,7 +143,7 @@ }, "packages/hashline": { "name": "@oh-my-pi/hashline", - "version": "17.1.8", + "version": "17.2.0", "dependencies": { "@oh-my-pi/pi-natives": "catalog:", "lru-cache": "catalog:", @@ -187,7 +187,7 @@ }, "packages/mnemopi": { "name": "@oh-my-pi/pi-mnemopi", - "version": "17.1.8", + "version": "17.2.0", "bin": { "mnemopi": "src/cli.ts", }, @@ -214,7 +214,7 @@ }, "packages/natives": { "name": "@oh-my-pi/pi-natives", - "version": "17.1.8", + "version": "17.2.0", "devDependencies": { "@napi-rs/cli": "catalog:", "@types/bun": "catalog:", @@ -222,7 +222,7 @@ }, "packages/snapcompact": { "name": "@oh-my-pi/snapcompact", - "version": "17.1.8", + "version": "17.2.0", "dependencies": { "@oh-my-pi/pi-ai": "catalog:", "@oh-my-pi/pi-natives": "catalog:", @@ -235,7 +235,7 @@ }, "packages/stats": { "name": "@oh-my-pi/omp-stats", - "version": "17.1.8", + "version": "17.2.0", "bin": { "omp-stats": "./src/index.ts", }, @@ -262,7 +262,7 @@ }, "packages/swarm-extension": { "name": "@oh-my-pi/swarm-extension", - "version": "17.1.8", + "version": "17.2.0", "bin": { "omp-swarm": "src/cli.ts", }, @@ -278,7 +278,7 @@ }, "packages/tui": { "name": "@oh-my-pi/pi-tui", - "version": "17.1.8", + "version": "17.2.0", "dependencies": { "@oh-my-pi/pi-natives": "catalog:", "@oh-my-pi/pi-utils": "catalog:", @@ -317,7 +317,7 @@ }, "packages/utils": { "name": "@oh-my-pi/pi-utils", - "version": "17.1.8", + "version": "17.2.0", "dependencies": { "@oh-my-pi/pi-natives": "catalog:", "handlebars": "catalog:", @@ -330,7 +330,7 @@ }, "packages/wire": { "name": "@oh-my-pi/pi-wire", - "version": "17.1.8", + "version": "17.2.0", "devDependencies": { "@types/bun": "catalog:", }, @@ -352,9 +352,9 @@ }, }, "patchedDependencies": { - "puppeteer-core@25.3.0": "patches/puppeteer-core@25.3.0.patch", - "@ark/schema@0.56.2": "patches/@ark%2Fschema@0.56.2.patch", "@agentclientprotocol/sdk@1.2.1": "patches/@agentclientprotocol%2Fsdk@1.2.1.patch", + "@ark/schema@0.56.2": "patches/@ark%2Fschema@0.56.2.patch", + "puppeteer-core@25.3.0": "patches/puppeteer-core@25.3.0.patch", }, "overrides": { "@ark/schema": "0.56.2", @@ -371,18 +371,18 @@ "@huggingface/transformers": "^4.2.0", "@mozilla/readability": "^0.6.0", "@napi-rs/cli": "3.7.2", - "@oh-my-pi/hashline": "17.1.8", - "@oh-my-pi/omp-stats": "17.1.8", - "@oh-my-pi/pi-agent-core": "17.1.8", - "@oh-my-pi/pi-ai": "17.1.8", - "@oh-my-pi/pi-catalog": "17.1.8", - "@oh-my-pi/pi-coding-agent": "17.1.8", - "@oh-my-pi/pi-mnemopi": "17.1.8", - "@oh-my-pi/pi-natives": "17.1.8", - "@oh-my-pi/pi-tui": "17.1.8", - "@oh-my-pi/pi-utils": "17.1.8", - "@oh-my-pi/pi-wire": "17.1.8", - "@oh-my-pi/snapcompact": "17.1.8", + "@oh-my-pi/hashline": "17.2.0", + "@oh-my-pi/omp-stats": "17.2.0", + "@oh-my-pi/pi-agent-core": "17.2.0", + "@oh-my-pi/pi-ai": "17.2.0", + "@oh-my-pi/pi-catalog": "17.2.0", + "@oh-my-pi/pi-coding-agent": "17.2.0", + "@oh-my-pi/pi-mnemopi": "17.2.0", + "@oh-my-pi/pi-natives": "17.2.0", + "@oh-my-pi/pi-tui": "17.2.0", + "@oh-my-pi/pi-utils": "17.2.0", + "@oh-my-pi/pi-wire": "17.2.0", + "@oh-my-pi/snapcompact": "17.2.0", "@opentelemetry/api": "^1.9.1", "@opentelemetry/api-logs": "^0.220.0", "@opentelemetry/context-async-hooks": "^2.9.0", @@ -524,7 +524,7 @@ "@emnapi/core": ["@emnapi/core@1.9.2", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" } }, "sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA=="], - "@emnapi/runtime": ["@emnapi/runtime@1.11.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw=="], + "@emnapi/runtime": ["@emnapi/runtime@1.11.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA=="], "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w=="], @@ -1044,7 +1044,7 @@ "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], - "baseline-browser-mapping": ["baseline-browser-mapping@2.11.1", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-HYXq73DDpCtNzOmrFsm9eSwCvWCql0RzqjpDzXN9EadiLJ4DNat0nsZ/Bzmy+Ud12mb4/zKDY0cQ805ZzN+i0A=="], + "baseline-browser-mapping": ["baseline-browser-mapping@2.11.4", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-s4+sLr9mZ/CyqeRritFeYV/Zx73OAtmaHn6kkBS1XRoJn1hrg3xIDUcpicAEX68tkcIN0iBCgti31C8zxtkhsQ=="], "before-after-hook": ["before-after-hook@4.0.0", "", {}, "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ=="], @@ -1322,7 +1322,7 @@ "lru-cache": ["lru-cache@11.5.2", "", {}, "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g=="], - "lucide-react": ["lucide-react@1.26.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-raglYVR2+VkMfJL158krjVmE+rV5ST2lzA/KQm1FRSjMHT4MnWaegHxoVEpmc2So3nOEhp9oGejJwAPX8MoAjg=="], + "lucide-react": ["lucide-react@1.27.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-rJicGl/3Fly/E0rOH1YmPZ6e49JCnKknh1ox1vpHnkfjujAkKA6sqUZvH3MTAaXXjgexyUwgNwTJzTtYuAFYJw=="], "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], @@ -1488,7 +1488,7 @@ "string-argv": ["string-argv@0.3.2", "", {}, "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q=="], - "string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], + "string-width": ["string-width@8.2.2", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg=="], "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], @@ -1574,7 +1574,7 @@ "yaml": ["yaml@2.9.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA=="], - "yargs": ["yargs@18.0.0", "", { "dependencies": { "cliui": "^9.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "string-width": "^7.2.0", "y18n": "^5.0.5", "yargs-parser": "^22.0.0" } }, "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg=="], + "yargs": ["yargs@18.1.0", "", { "dependencies": { "cliui": "^9.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "string-width": "^8.2.1", "y18n": "^5.0.5", "yargs-parser": "^22.0.0" } }, "sha512-2rAgRKu54VsHkqI0/tYkmluGXHD4KW7yZoycuqDQ15QOTnc2VVfy0nN/1eMhnQLO00A+dwtK20xuCnc1YGeUyg=="], "yargs-parser": ["yargs-parser@22.0.0", "", {}, "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw=="], @@ -1636,11 +1636,13 @@ "@rolldown/binding-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.11.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.2", "tslib": "^2.4.0" } }, "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ=="], - "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.11.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.2", "tslib": "^2.4.0" }, "bundled": true }, "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ=="], + "@rolldown/binding-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.11.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw=="], - "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.11.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw=="], + "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.11.3", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.3", "tslib": "^2.4.0" }, "bundled": true }, "sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg=="], - "@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.2", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA=="], + "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.11.3", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA=="], + + "@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.3", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g=="], "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.6", "", { "dependencies": { "@tybys/wasm-util": "^0.10.3" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" }, "bundled": true }, "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg=="], @@ -1654,6 +1656,8 @@ "cli-progress/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + "cliui/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], + "dom-serializer/domelementtype": ["domelementtype@3.0.0", "", {}, "sha512-umCQid3jKbDmVjx8jGaW7uUykm4DEUeyV21hPxNMo2nV955DhUThwqyOIDtreepP31hl84X7G5U9ZfsWvIB3Pg=="], "dom-serializer/entities": ["entities@8.0.0", "", {}, "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA=="], @@ -1686,7 +1690,7 @@ "string_decoder/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], - "vite/lightningcss": ["lightningcss@1.33.0", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.33.0", "lightningcss-darwin-arm64": "1.33.0", "lightningcss-darwin-x64": "1.33.0", "lightningcss-freebsd-x64": "1.33.0", "lightningcss-linux-arm-gnueabihf": "1.33.0", "lightningcss-linux-arm64-gnu": "1.33.0", "lightningcss-linux-arm64-musl": "1.33.0", "lightningcss-linux-x64-gnu": "1.33.0", "lightningcss-linux-x64-musl": "1.33.0", "lightningcss-win32-arm64-msvc": "1.33.0", "lightningcss-win32-x64-msvc": "1.33.0" } }, "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA=="], + "wrap-ansi/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], "@babel/helper-compilation-targets/lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], @@ -1714,28 +1718,6 @@ "jszip/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], - "vite/lightningcss/lightningcss-android-arm64": ["lightningcss-android-arm64@1.33.0", "", { "os": "android", "cpu": "arm64" }, "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg=="], - - "vite/lightningcss/lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.33.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg=="], - - "vite/lightningcss/lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.33.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ=="], - - "vite/lightningcss/lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.33.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg=="], - - "vite/lightningcss/lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.33.0", "", { "os": "linux", "cpu": "arm" }, "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ=="], - - "vite/lightningcss/lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.33.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg=="], - - "vite/lightningcss/lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.33.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ=="], - - "vite/lightningcss/lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.33.0", "", { "os": "linux", "cpu": "x64" }, "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg=="], - - "vite/lightningcss/lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.33.0", "", { "os": "linux", "cpu": "x64" }, "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw=="], - - "vite/lightningcss/lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.33.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA=="], - - "vite/lightningcss/lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.33.0", "", { "os": "win32", "cpu": "x64" }, "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA=="], - "@huggingface/transformers/onnxruntime-node/global-agent/matcher": ["matcher@3.0.0", "", { "dependencies": { "escape-string-regexp": "^4.0.0" } }, "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng=="], "@huggingface/transformers/onnxruntime-node/global-agent/serialize-error": ["serialize-error@7.0.1", "", { "dependencies": { "type-fest": "^0.13.1" } }, "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw=="], diff --git a/crates/pi-natives/src/lib.rs b/crates/pi-natives/src/lib.rs index 0c7db473f..fd1d0242b 100644 --- a/crates/pi-natives/src/lib.rs +++ b/crates/pi-natives/src/lib.rs @@ -260,7 +260,7 @@ fn create_windows_napi_tokio_runtime() -> Option { /// MUST stay in sync with `VERSION_SENTINEL_EXPORT` in /// `packages/natives/native/index.js` (which derives the name from /// `package.json#version`). -#[napi(js_name = "__piNativesV17_1_8")] +#[napi(js_name = "__piNativesV17_2_0")] pub const fn pi_natives_version_sentinel() {} /// Native module entry point: install crash diagnostics before any tool can diff --git a/package.json b/package.json index cea6799a3..b56e69151 100644 --- a/package.json +++ b/package.json @@ -26,18 +26,18 @@ "@huggingface/transformers": "^4.2.0", "@mozilla/readability": "^0.6.0", "@napi-rs/cli": "3.7.2", - "@oh-my-pi/hashline": "17.1.8", - "@oh-my-pi/omp-stats": "17.1.8", - "@oh-my-pi/pi-agent-core": "17.1.8", - "@oh-my-pi/pi-ai": "17.1.8", - "@oh-my-pi/pi-catalog": "17.1.8", - "@oh-my-pi/pi-coding-agent": "17.1.8", - "@oh-my-pi/pi-mnemopi": "17.1.8", - "@oh-my-pi/pi-natives": "17.1.8", - "@oh-my-pi/pi-tui": "17.1.8", - "@oh-my-pi/pi-utils": "17.1.8", - "@oh-my-pi/pi-wire": "17.1.8", - "@oh-my-pi/snapcompact": "17.1.8", + "@oh-my-pi/hashline": "17.2.0", + "@oh-my-pi/omp-stats": "17.2.0", + "@oh-my-pi/pi-agent-core": "17.2.0", + "@oh-my-pi/pi-ai": "17.2.0", + "@oh-my-pi/pi-catalog": "17.2.0", + "@oh-my-pi/pi-coding-agent": "17.2.0", + "@oh-my-pi/pi-mnemopi": "17.2.0", + "@oh-my-pi/pi-natives": "17.2.0", + "@oh-my-pi/pi-tui": "17.2.0", + "@oh-my-pi/pi-utils": "17.2.0", + "@oh-my-pi/pi-wire": "17.2.0", + "@oh-my-pi/snapcompact": "17.2.0", "@opentelemetry/api": "^1.9.1", "@opentelemetry/api-logs": "^0.220.0", "@opentelemetry/context-async-hooks": "^2.9.0", diff --git a/packages/agent/CHANGELOG.md b/packages/agent/CHANGELOG.md index e97272a65..cb2a34ddc 100644 --- a/packages/agent/CHANGELOG.md +++ b/packages/agent/CHANGELOG.md @@ -2,6 +2,8 @@ ## [Unreleased] +## [17.2.0] - 2026-07-30 + ### Fixed - Provider-native compaction failures now surface their transport error instead of silently switching to generic summarization; streaming V2 still falls back to native V1 when available. diff --git a/packages/agent/package.json b/packages/agent/package.json index 629db42fb..ac3f064e7 100644 --- a/packages/agent/package.json +++ b/packages/agent/package.json @@ -1,7 +1,7 @@ { "type": "module", "name": "@oh-my-pi/pi-agent-core", - "version": "17.1.8", + "version": "17.2.0", "description": "General-purpose agent with transport abstraction, state management, and attachment support", "homepage": "https://omp.sh", "author": "Can Boluk", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 000e05848..4464391c3 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -2,6 +2,8 @@ ## [Unreleased] +## [17.2.0] - 2026-07-30 + ### Added - Added first-class parentTurnId support for nested Codex requests, allowing stream options and metadata helpers to accept and safely propagate the initiating turn's ID. diff --git a/packages/ai/package.json b/packages/ai/package.json index e255f59bb..607412d37 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,7 +1,7 @@ { "type": "module", "name": "@oh-my-pi/pi-ai", - "version": "17.1.8", + "version": "17.2.0", "description": "Unified LLM API with automatic model discovery and provider configuration", "homepage": "https://omp.sh", "author": "Can Boluk", diff --git a/packages/catalog/CHANGELOG.md b/packages/catalog/CHANGELOG.md index 828694bdb..2627d6c20 100644 --- a/packages/catalog/CHANGELOG.md +++ b/packages/catalog/CHANGELOG.md @@ -2,6 +2,8 @@ ## [Unreleased] +## [17.2.0] - 2026-07-30 + ### Added - Regenerated the Cursor agent protobufs (`discovery/cursor-gen/agent_pb.ts`) against the modern `agent.proto`, adding the message and enum families current Cursor CLI builds emit: Pi tool exec frames, hook queries and responses, subagents, allowlist prechecks, MCP state, smart-mode classification, canvas diagnostics, conversation search, agent-store conflicts and git diff. Purely additive — no existing exported symbol changed shape. diff --git a/packages/catalog/package.json b/packages/catalog/package.json index 599c8a1ad..81f953db4 100644 --- a/packages/catalog/package.json +++ b/packages/catalog/package.json @@ -1,7 +1,7 @@ { "type": "module", "name": "@oh-my-pi/pi-catalog", - "version": "17.1.8", + "version": "17.2.0", "description": "Model catalog for omp: bundled model database, provider discovery descriptors, model identity, classification, and equivalence", "homepage": "https://omp.sh", "author": "Can Boluk", diff --git a/packages/coding-agent/CHANGELOG.md b/packages/coding-agent/CHANGELOG.md index 58524dfd2..74bcb76e0 100644 --- a/packages/coding-agent/CHANGELOG.md +++ b/packages/coding-agent/CHANGELOG.md @@ -2,6 +2,8 @@ ## [Unreleased] +## [17.2.0] - 2026-07-30 + ### Breaking Changes - Removed the `DEL`, `DEL.BLK`, `COPY`, and `COPY.BLK` hashline edit operations. Use `CUT` / `CUT.BLK` for deletion; removed content remains available to `PASTE`. @@ -25,10 +27,6 @@ - Optimized models configuration resource probing to run in a single child process, reducing startup contention. - Startup release notes now default to a compact change-count summary. Use `startup.changelogMode` (`summary` | `expanded` | `hidden`) to control them; legacy `collapseChangelog` choices migrate automatically ([#6771](https://github.com/can1357/oh-my-pi/issues/6771)). -### Removed - -- Removed the dangling `MCPManager.setOnNotification` single-slot setter, which had no callers in the runtime. Replaced by `MCPManager.addNotificationListener` — multi-listener, per-listener error isolation, returns an unsubscribe function. - ### Fixed - Fixed Anthropic prompt-cache cold misses on session resume with multiple OAuth accounts: the account that served a session is now recorded in the session file (as a `credential_pin` sha-256 of the account + org/project scope, so exports carry no plaintext identity) and re-pinned on resume with the session's effective last-use time, so a fresh process no longer re-ranks accounts by usage headroom — which systematically routed away from the just-used account and cold-missed the entire account-scoped cache prefix. Sticky routing was previously stored only in the auth store's KV cache, which is in-memory when a remote auth broker is configured. @@ -92,6 +90,10 @@ - Fixed advisor tools bypassing the approval gate. They are built straight from the builtin table, outside the loop that wraps every registry tool, and both the advisor's own agent loop and its Cursor exec bridge (`pi_write`, `pi_bash`) run those instances directly — so an advisor granted `write` or `bash` executed them regardless of a configured `ask` or `deny`. They now carry the same `ExtensionToolWrapper` as every other tool. - Added `mcp_notification` extension event and multi-listener `MCPManager.addNotificationListener` API. The runtime already received MCP server-initiated JSON-RPC notifications at the transport layer but had no path to forward them to extensions; every notification (including server-custom methods) is now delivered as `{ server, method, params }` after the manager's own list/update handling. For known list-change methods (`notifications/tools/list_changed`, `notifications/resources/list_changed`, `notifications/prompts/list_changed`) the internal refresh promise is awaited before fanout, so a listener acting on `tools/list_changed` sees fresh `getTools()`. Notifications received before any listener attaches are buffered (bounded FIFO, cap 100, drop-oldest — matches `IrcBus`'s `MAILBOX_CAP`) and drained into the first subscriber, so startup-time frames aren't lost even if the extension binds after MCP discovery. Extensions can use this to bridge push-capable MCP servers (e.g. peer messaging) into session behavior by injecting a mid-turn steer via `pi.sendMessage` / `pi.sendUserMessage`. +### Removed + +- Removed the dangling `MCPManager.setOnNotification` single-slot setter, which had no callers in the runtime. Replaced by `MCPManager.addNotificationListener` — multi-listener, per-listener error isolation, returns an unsubscribe function. + ## [17.1.8] - 2026-07-28 ### Breaking Changes diff --git a/packages/coding-agent/package.json b/packages/coding-agent/package.json index 781e865f3..3ccfe230d 100644 --- a/packages/coding-agent/package.json +++ b/packages/coding-agent/package.json @@ -1,7 +1,7 @@ { "type": "module", "name": "@oh-my-pi/pi-coding-agent", - "version": "17.1.8", + "version": "17.2.0", "description": "Coding agent CLI with read, bash, edit, write tools and session management", "homepage": "https://omp.sh", "author": "Can Boluk", diff --git a/packages/collab-web/CHANGELOG.md b/packages/collab-web/CHANGELOG.md index f59801390..db8f19482 100644 --- a/packages/collab-web/CHANGELOG.md +++ b/packages/collab-web/CHANGELOG.md @@ -2,6 +2,8 @@ ## [Unreleased] +## [17.2.0] - 2026-07-30 + ### Fixed - Fixed an issue where the agent would stop silently without a message by ensuring terminal auto-retry failures are properly surfaced as error notices. diff --git a/packages/hashline/CHANGELOG.md b/packages/hashline/CHANGELOG.md index ee81caf3c..23879f828 100644 --- a/packages/hashline/CHANGELOG.md +++ b/packages/hashline/CHANGELOG.md @@ -2,6 +2,8 @@ ## [Unreleased] +## [17.2.0] - 2026-07-30 + ### Breaking Changes - Removed `DEL`, `DEL.BLK`, `COPY`, and `COPY.BLK` from the patch language. Use `CUT` / `CUT.BLK` for deletion; a cut does not require a following `PASTE` and leaves the removed content available to later pastes. diff --git a/packages/hashline/package.json b/packages/hashline/package.json index e3ecde917..354c1e891 100644 --- a/packages/hashline/package.json +++ b/packages/hashline/package.json @@ -1,7 +1,7 @@ { "type": "module", "name": "@oh-my-pi/hashline", - "version": "17.1.8", + "version": "17.2.0", "description": "Hashline: a compact, line-anchored patch language and applier. Pluggable FS/IO so it works over disk, in-memory, or any custom backend.", "homepage": "https://omp.sh", "author": "Can Boluk", diff --git a/packages/mnemopi/package.json b/packages/mnemopi/package.json index 62e92457c..5fec03805 100644 --- a/packages/mnemopi/package.json +++ b/packages/mnemopi/package.json @@ -1,7 +1,7 @@ { "type": "module", "name": "@oh-my-pi/pi-mnemopi", - "version": "17.1.8", + "version": "17.2.0", "description": "Local SQLite memory engine for Oh My Pi agents", "homepage": "https://omp.sh", "author": "Can Boluk", diff --git a/packages/natives/CHANGELOG.md b/packages/natives/CHANGELOG.md index 57c8ba915..1b54462fb 100644 --- a/packages/natives/CHANGELOG.md +++ b/packages/natives/CHANGELOG.md @@ -2,6 +2,8 @@ ## [Unreleased] +## [17.2.0] - 2026-07-30 + ### Changed - Split the native voice engine (miniaudio capture/playback, WebRTC peer, Opus media) out of the `pi-natives` addon crate into a napi-free `pi-voice` rlib. The addon keeps thin `#[napi]` adapters, so the JS API is unchanged; the webrtc/opus/miniaudio dependency graph now compiles once into the library and no longer rebuilds with the addon leaf (which recompiles every release via its version-sentinel edit). diff --git a/packages/natives/native/index.d.ts b/packages/natives/native/index.d.ts index 55d86029a..df50fcd93 100644 --- a/packages/natives/native/index.d.ts +++ b/packages/natives/native/index.d.ts @@ -246,7 +246,7 @@ export declare function __ompInstallTokioRuntime(): void * `packages/natives/native/index.js` (which derives the name from * `package.json#version`). */ -export declare function __piNativesV17_1_8(): void +export declare function __piNativesV17_2_0(): void /** * Apply ast-grep rewrite rules to matching files; honors `dryRun` and returns diff --git a/packages/natives/native/index.js b/packages/natives/native/index.js index a28605375..0676478c7 100644 --- a/packages/natives/native/index.js +++ b/packages/natives/native/index.js @@ -28,7 +28,7 @@ export const Shell = nativeBindings.Shell; // functions export const __ompInstallTokioRuntime = nativeBindings.__ompInstallTokioRuntime; -export const __piNativesV17_1_8 = nativeBindings.__piNativesV17_1_8; +export const __piNativesV17_2_0 = nativeBindings.__piNativesV17_2_0; export const astEdit = nativeBindings.astEdit; export const astGrep = nativeBindings.astGrep; export const astMatch = nativeBindings.astMatch; diff --git a/packages/natives/package.json b/packages/natives/package.json index 03de3d365..7423af327 100644 --- a/packages/natives/package.json +++ b/packages/natives/package.json @@ -1,6 +1,6 @@ { "name": "@oh-my-pi/pi-natives", - "version": "17.1.8", + "version": "17.2.0", "description": "Native Rust bindings for audio, WebRTC, grep, clipboard, image processing, syntax highlighting, PTY, and shell operations via N-API", "type": "module", "homepage": "https://omp.sh", diff --git a/packages/snapcompact/package.json b/packages/snapcompact/package.json index 743a08569..9dbb1d9df 100644 --- a/packages/snapcompact/package.json +++ b/packages/snapcompact/package.json @@ -1,7 +1,7 @@ { "type": "module", "name": "@oh-my-pi/snapcompact", - "version": "17.1.8", + "version": "17.2.0", "description": "Bitmap-frame context compression for vision-capable LLMs", "homepage": "https://omp.sh", "author": "Can Boluk", diff --git a/packages/stats/package.json b/packages/stats/package.json index 07bcd00da..586e3650c 100644 --- a/packages/stats/package.json +++ b/packages/stats/package.json @@ -1,7 +1,7 @@ { "type": "module", "name": "@oh-my-pi/omp-stats", - "version": "17.1.8", + "version": "17.2.0", "description": "Local observability dashboard for pi AI usage statistics", "homepage": "https://omp.sh", "author": "Can Boluk", diff --git a/packages/swarm-extension/package.json b/packages/swarm-extension/package.json index e4d99127e..8ded5b31a 100644 --- a/packages/swarm-extension/package.json +++ b/packages/swarm-extension/package.json @@ -1,7 +1,7 @@ { "type": "module", "name": "@oh-my-pi/swarm-extension", - "version": "17.1.8", + "version": "17.2.0", "description": "Swarm orchestration extension for omp", "homepage": "https://omp.sh", "author": "Derek Rynd", diff --git a/packages/tui/CHANGELOG.md b/packages/tui/CHANGELOG.md index a6ccc3129..8fe3749e0 100644 --- a/packages/tui/CHANGELOG.md +++ b/packages/tui/CHANGELOG.md @@ -2,6 +2,8 @@ ## [Unreleased] +## [17.2.0] - 2026-07-30 + ### Added - Added response-level OSC 11 appearance subscriptions to help terminal consumers distinguish confirmed unchanged background classifications from missing replies. diff --git a/packages/tui/package.json b/packages/tui/package.json index 475092c09..9bf56eb2e 100644 --- a/packages/tui/package.json +++ b/packages/tui/package.json @@ -1,7 +1,7 @@ { "type": "module", "name": "@oh-my-pi/pi-tui", - "version": "17.1.8", + "version": "17.2.0", "description": "Terminal User Interface library with differential rendering for efficient text-based applications", "homepage": "https://omp.sh", "author": "Can Boluk", diff --git a/packages/utils/package.json b/packages/utils/package.json index e334b9fd8..358127c62 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,7 +1,7 @@ { "type": "module", "name": "@oh-my-pi/pi-utils", - "version": "17.1.8", + "version": "17.2.0", "description": "Shared utilities for pi packages", "homepage": "https://omp.sh", "author": "Can Boluk", diff --git a/packages/wire/package.json b/packages/wire/package.json index 1f2b30dcc..1f1fc9684 100644 --- a/packages/wire/package.json +++ b/packages/wire/package.json @@ -1,7 +1,7 @@ { "type": "module", "name": "@oh-my-pi/pi-wire", - "version": "17.1.8", + "version": "17.2.0", "description": "Shared wire protocol types for Oh My Pi packages", "homepage": "https://omp.sh", "author": "Can Boluk", From 38846a7e968ce6fc3af104e698e0cd65ba371948 Mon Sep 17 00:00:00 2001 From: can1357 Date: Thu, 30 Jul 2026 08:16:19 +0200 Subject: [PATCH 17/19] fix(build): regenerated bun.lock with the pinned bun 1.3.14 - The 17.2.0 bump regenerated the lockfile under a bun 1.4 canary, writing lockfileVersion 2, which the CI-pinned bun 1.3.x cannot parse: every job failed at bun install with UnknownLockfileVersion before running anything. - Resolutions are unchanged (490 installs across 637 packages, no changes); only the lockfile format fields moved back to version 1. --- bun.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bun.lock b/bun.lock index 575bb17b0..c8c73b575 100644 --- a/bun.lock +++ b/bun.lock @@ -1,5 +1,5 @@ { - "lockfileVersion": 2, + "lockfileVersion": 1, "configVersion": 1, "workspaces": { "": { @@ -352,9 +352,9 @@ }, }, "patchedDependencies": { - "@agentclientprotocol/sdk@1.2.1": "patches/@agentclientprotocol%2Fsdk@1.2.1.patch", - "@ark/schema@0.56.2": "patches/@ark%2Fschema@0.56.2.patch", "puppeteer-core@25.3.0": "patches/puppeteer-core@25.3.0.patch", + "@ark/schema@0.56.2": "patches/@ark%2Fschema@0.56.2.patch", + "@agentclientprotocol/sdk@1.2.1": "patches/@agentclientprotocol%2Fsdk@1.2.1.patch", }, "overrides": { "@ark/schema": "0.56.2", From 17ea2d65fabfa7f216990712a3ffc30b50ebe7af Mon Sep 17 00:00:00 2001 From: can1357 Date: Thu, 30 Jul 2026 08:16:19 +0200 Subject: [PATCH 18/19] docs(infra): reconciled runner sizing docs with burstable scale set - Updated the arc-omp-values example block and resources bullet to the live 3cpu/10Gi request + 8cpu/14Gi limit shape instead of the old guaranteed 8cpu/24Gi sizing. - Documented the Kata boot floor vs request vs hotplug-limit relationship in tune-kata-runtime.sh so boot defaults are kept at or below pod requests. --- infra/docs/04-arc-and-caching.md | 28 +++++++++++++++++----------- infra/tune-kata-runtime.sh | 9 +++++++-- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/infra/docs/04-arc-and-caching.md b/infra/docs/04-arc-and-caching.md index 504ebff46..6c20776e0 100644 --- a/infra/docs/04-arc-and-caching.md +++ b/infra/docs/04-arc-and-caching.md @@ -201,12 +201,15 @@ template: mountPath: /opt/bazel-repo-cache subPath: bazel-repo-cache resources: + # Burstable on purpose: requests bin-pack 8 runners onto the + # 32-vCPU / 125 GiB host; limits are each Kata VM's hotplug + # ceiling. Keep sum(memory limits) under host RAM. requests: - cpu: "8" - memory: "24Gi" + cpu: "3" + memory: "10Gi" limits: cpu: "8" - memory: "24Gi" + memory: "14Gi" volumes: - name: runner-cache persistentVolumeClaim: @@ -259,14 +262,17 @@ Field by field: mounts to the `arc-runners/runner-cache` PVC. `ReadWriteOnce` is enough on this single-node k3s host; use a RWX-capable storage class before spreading runners across nodes. -- **`resources`** - requests `8` CPU / `24Gi`, limits `8` CPU / `24Gi`. Kata reads - these and sizes the guest accordingly: the VM now boots at the same - guaranteed floor (`default_vcpus: 2`, `default_memory: 4096`) and only - hotplugs beyond that toward the limits, with `default_maxvcpus: 0` allowing up - to all host CPUs. Effectively the **requests are the boot-time VM size** and - the **limits are the hotplug ceiling**. See [02-kata-runtime.md](02-kata-runtime.md) - for the runtime knobs and [`infra/tune-kata-runtime.sh`](../tune-kata-runtime.sh) - for the SSH-driven patch helper. +- **`resources`** - requests `3` CPU / `10Gi`, limits `8` CPU / `14Gi` + (burstable; see the `maxRunners` bullet above). Kata sizes the guest from + these: every VM boots at the fixed floor from the runtime config + (`default_vcpus: 2`, `default_memory: 4096` — deliberately at or below the + pod request so boot stays cheap) and hotplugs beyond it toward the pod + **limits**, with `default_maxvcpus: 0` allowing up to all host CPUs. + Effectively the **boot shape is a fixed floor**, the **requests are the + scheduler's bin-packing unit**, and the **limits are the hotplug ceiling**. + See [02-kata-runtime.md](02-kata-runtime.md) for the runtime knobs and + [`infra/tune-kata-runtime.sh`](../tune-kata-runtime.sh) for the SSH-driven + patch helper. --- diff --git a/infra/tune-kata-runtime.sh b/infra/tune-kata-runtime.sh index 2766d7c24..9eda821e2 100755 --- a/infra/tune-kata-runtime.sh +++ b/infra/tune-kata-runtime.sh @@ -1,6 +1,11 @@ #!/usr/bin/env bash -# Patch the live Kata QEMU config to match the runner pod's guaranteed boot -# shape, raise guest and host open-file limits, and enlarge the virtiofsd worker pool. +# Patch the live Kata QEMU config: set the guest BOOT floor (default_vcpus / +# default_memory), raise guest and host open-file limits, and enlarge the +# virtiofsd worker pool. Runner pods are burstable (see reload-runner.sh): +# the boot floor stays deliberately at or below the pod's CPU/memory REQUEST +# so VMs boot small and fast, and Kata hotplugs each guest toward the pod +# LIMIT under load. Keep BOOT_VCPUS/BOOT_MEMORY_MIB <= the request when +# retuning either side. # The script runs over SSH, which keeps the desired values version-controlled. # It then smoke-tests a new kata-qemu pod. # From c3d1586740d923f3ff6a002af315d32349a98a22 Mon Sep 17 00:00:00 2001 From: can1357 Date: Thu, 30 Jul 2026 08:17:59 +0200 Subject: [PATCH 19/19] ci: triggered workflows on root dependency file changes - bun.lock, bunfig.toml, root package.json, and patches/** now trigger CI: a lockfile-only push previously shipped untested, and a release retagged onto such a commit never started its release run at all (the v17.2.0 lockfile-format fix hit exactly this). --- .github/workflows/ci.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 34ff5e1dd..84bc2e397 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,6 +18,13 @@ on: - "Cargo.lock" - "rust-toolchain.toml" - "rustfmt.toml" + # A root dependency change (lockfile/catalog/patches) affects every + # job; without these a lockfile-only push shipped untested — and a + # release retagged onto such a commit never triggered its run. + - "bun.lock" + - "bunfig.toml" + - "package.json" + - "patches/**" - ".github/**" pull_request: branches: [main] @@ -36,6 +43,10 @@ on: - "Cargo.lock" - "rust-toolchain.toml" - "rustfmt.toml" + - "bun.lock" + - "bunfig.toml" + - "package.json" + - "patches/**" - ".github/**" workflow_dispatch: inputs: