diff --git a/.bcr/README.md b/.bcr/README.md index 7e9f80e..197ab11 100644 --- a/.bcr/README.md +++ b/.bcr/README.md @@ -21,8 +21,9 @@ bazel run //tools:release -- --output /tmp/rules_layer_optimizer_release --verif ``` This creates a deterministic archive, `source.json`, and -`installation.MODULE.bazel`. Verification runs independent smoke and image -consumers against the archive. Archives use `git archive` and the exclusions in `.gitattributes`. Local +`installation.MODULE.bazel`. Verification runs the distroless contract and a +py_image example against the archive. Archives use `git archive` and the +exclusions in `.gitattributes`. Local preparation packages **committed HEAD**, excluding dirty and untracked changes. Commit changes before rehearsing a release. Release automation archives the version tag itself and reads its module version. Test consumers omit the version diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 0399316..4f4133a 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -60,18 +60,6 @@ jobs: - if: matrix.module == '.' name: Verify source archive installation run: bazel run //tools:release -- --output "$RUNNER_TEMP/rules_layer_optimizer_release" --verify - - if: matrix.module == 'examples' || matrix.module == 'e2e/minimum' - name: Run both Python adapters with both image backends - working-directory: ${{ matrix.module }} - run: | - bazel run //python_image:load - docker run --rm --network none rules-layer-optimizer-example:local | grep -F 'hello from reusable layers' - bazel run //python_image:img_load - docker run --rm --network none rules-layer-optimizer-aspect-img:local | grep -F 'hello from reusable layers' - bazel run //rules_python_image:load - docker run --rm --network none rules-layer-optimizer-rules-python:local | grep -F 'hello from reusable layers' - bazel run //rules_python_image:img_load - docker run --rm --network none rules-layer-optimizer-rules-python-img:local | grep -F 'hello from reusable layers' all-tests-passed: runs-on: ubuntu-24.04 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0993f44..60a9651 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -9,16 +9,21 @@ install both hook stages: pre-commit install --hook-type pre-commit --hook-type pre-push pre-commit run --all-files bazel test //... -(cd examples && bazel test //...) +(cd examples/py_image_with_rules_oci_and_aspect_rules_py && bazel test //...) +(cd examples/py_image_with_rules_img_and_rules_python && bazel test //...) +(cd e2e/layer_plan && bazel test //...) +(cd e2e/aspect_layers && bazel test //...) +(cd e2e/rules_python_layers && bazel test //...) +(cd e2e/image_backends && bazel test //...) (cd e2e/minimum && bazel test //...) -(cd e2e/smoke && bazel test //...) +(cd e2e/distroless && bazel test //...) (cd e2e/inference && bazel test //...) (cd e2e/rules_python && bazel test //...) ``` -The root contains focused unit and analysis tests. The examples module builds -real package and image archives; the smoke module exercises external-repository -inference with a small APT fixture. Behavioral tests must accompany rule changes. +The root contains focused unit and analysis tests. The example modules build +runnable images. Each package under `e2e/` checks one behavior. Behavioral +tests must accompany rule changes. After committing changes, rehearse archive installation with `bazel run //tools:release -- --output /tmp/rules_layer_optimizer_release --verify`. This packages committed HEAD, not working-tree edits. @@ -35,7 +40,8 @@ in that example's package, then review the full diff before committing. ## Releases -Maintainers update `MODULE.bazel` and the README installation version, then push a matching +Maintainers update `MODULE.bazel` and the README installation version, then +push a matching `vX.Y.Z` tag to trigger the [Release workflow](.github/workflows/release.yaml). GitHub tag protection limits release tags to maintainers and administrators. The shared Bazel workflow verifies the archive and publishes the GitHub release diff --git a/README.md b/README.md index e252143..1343340 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,18 @@ # rules_layer_optimizer -This Bazel ruleset provides building blocks for creating optimized application OCI images based on an executable entrypoint, e.g. a `py_binary` target. It provides dependency inference, reusable package layers, and size-aware OCI layer optimization. It provides everything you need to create your own efficient `py_image` macro. +This Bazel ruleset provides building blocks for creating optimized application +OCI images based on an executable entrypoint, e.g. a `py_binary` target. + +The following are provided: + +- Build separate image layers for each apt or python package, shared across all + consuming applications +- Sort layers by size +- Flatten the long-tail of small packages, to stay under a configurable layer + cap or size threshold +- Infer apt package dependencies and environment variables +- Examples for how to combine all of the above into a simple `py_image` macro, + for producing an OCI-compatible image from a `py_binary` ## Building blocks @@ -24,19 +36,48 @@ Add the dependency to your `MODULE.bazel`: bazel_dep(name = "rules_layer_optimizer", version = "0.1.0") ``` -Then, there are 3 basic steps. Each stage is modular, so hand-rolled replacements work fine too. +Then, there are 3 basic steps. Each stage is modular, so hand-rolled +replacements work fine too. ### 1. Produce layer candidates with size hints -This is the step with the most variability, as it depends on which dependencies your repo uses (`rules_oci` | `rules_img`, and `rules_python` | `aspect_rules_py`). Regardless of your choices, the goal remains the same: produce candidate image layers that are efficient and also accompanied by size hints via the `SizeHintInfo` provider: +This is the step with the most variability, as it depends on which dependencies +your repo uses (`rules_oci` | `rules_img`, and `rules_python` | +`aspect_rules_py`). Regardless of your choices, the goal remains the same: +produce candidate image layers that are efficient and also accompanied by size +hints via the `SizeHintInfo` provider: + +```starlark +load("@rules_layer_optimizer//python:aspect_rules_py.bzl", "py_image_layer") + +py_image_layer( + name = "app_layers", + binary = ":app", + interpreter_tar = ":interpreter", + python_toolchain = "@python_interpreters//:current_py_toolchain", + strip_prefix = "my/package/app", +) +``` + +With `rules_python`, load `python:rules_python.bzl` and omit `interpreter_tar` +and `python_toolchain`. Either adapter emits `:app_layers_pip` with +`LayerTarsInfo` and `SizeHintInfo`, plus unsized interpreter and source tars. A +hand-rolled rule should return the same providers: ```starlark -TODO +return [ + DefaultInfo(files = depset([tar])), + LayerTarsInfo(tars = [tar]), + SizeHintInfo(sizes = {tar: size_bytes}), +] ``` ### 2. Optimize the layers -From the layer candidates, group and optimize them with `optimized_layers`. Note that `SizeHintInfo` is not required on all candidates, the rule will use the hints when available but they only matter for groups where in-group reordering and flattening is desired: +From the layer candidates, group and optimize them with `optimized_layers`. Note +that `SizeHintInfo` is not required on all candidates, the rule will use the +hints when available but they only matter for groups where in-group reordering +and flattening is desired: ```starlark load("@rules_layer_optimizer//layers:defs.bzl", "layer_group") @@ -57,25 +98,46 @@ optimized_layers( ### 3. Build the image -The output of `optimized_layers` can be fed directly into `oci_image` or `image_manifest`: +The output of `optimized_layers` can be fed directly into `oci_image` or +`image_manifest`: ```starlark -TODO +load("@rules_oci//oci:defs.bzl", "oci_image") + +oci_image( + name = "image", + base = "@ubuntu", + entrypoint = ["/app"], + env = ":env", + tars = [":layers"], +) +``` + +`rules_img` takes the same archives as `layers` and the environment file as `env_file`: + +```starlark +load("@rules_img//img:image.bzl", "image_manifest") +load("@rules_img_images.bzl", "image") + +image_manifest( + name = "image", + base = image("ubuntu"), + entrypoint = ["/app"], + env_file = ":env", + layers = [":layers"], +) ``` ## Try it locally -The [examples module](examples/README.md) demonstrates tar optimization, Python OCI images, and -package-sharing checks. Both Python adapters are tested with `rules_oci` and -`rules_img`. +The [examples](examples/README.md) are two modules that wrap these pieces in a +macro taking only `name` and a `py_binary`: one with rules_oci and +aspect_rules_py, and one with rules_img and rules_python. ```sh bazel test //... -(cd examples && bazel test //...) -(cd e2e/minimum && bazel test //...) -(cd e2e/smoke && bazel test //...) -(cd e2e/inference && bazel test //...) -(cd e2e/rules_python && bazel test //...) +(cd examples/py_image_with_rules_oci_and_aspect_rules_py && bazel test //...) +(cd examples/py_image_with_rules_img_and_rules_python && bazel test //...) ``` Start with [configuration](docs/configuration.md) and the capability docs: @@ -83,3 +145,12 @@ Start with [configuration](docs/configuration.md) and the capability docs: [Python](python/README.md), and [APT](apt/README.md). See [compatibility](docs/compatibility.md) for supported dependency minimums and [CONTRIBUTING.md](CONTRIBUTING.md) for development checks. + +## Future work + +The optimizations provided by this ruleset are not useful only for Python. The +same strategy can be applied to any other language whose third-party packages +remain intact in the final runtime tree. A shared package directory, such as a +Java archive, a `node_modules` tree, or a Ruby gem, can be its own reusable +image layer. C++ and Rust are unsuitable: compilation folds dependencies into +the binary, so no package boundary remains to share across images. diff --git a/apt/README.md b/apt/README.md index 3e48fed..84c3759 100644 --- a/apt/README.md +++ b/apt/README.md @@ -5,9 +5,10 @@ `tars`. Consumers select distributions and package repositories themselves. Use `python:inference.bzl` for the variants that match logical pip packages. -`inferred_apt_deps` combines matched mappings with explicit `base_packages` and -`packages`. Outputs carry LayerTarsInfo plus SizeHintInfo for primary package -tars. Transitive package tars are retained and may remain unsized. Duplicate +`inferred_apt_deps` accepts `layer_inference_bundle` targets. It combines matched +mappings with explicit `base_packages` and `packages`. Outputs carry LayerTarsInfo +plus SizeHintInfo for primary package tars. Transitive package tars are retained +and may remain unsized. Duplicate files are removed and conflicting hints fail analysis. The adapter identifies a package's primary tar through its public `:data` @@ -21,7 +22,7 @@ generates v2 locks or supply an existing compatible lock. Tests use synthetic package repositories rather than live resolution. See [configuration](../docs/configuration.md) for module setup. The -[smoke module](../e2e/smoke/README.md) verifies the adapter contract without a +[distroless contract](../e2e/distroless/README.md) verifies the adapter contract without a production APT universe. Base packages, compatibility shims, dpkg status policy, and distribution selection are deliberately consumer-owned. @@ -33,6 +34,6 @@ registers a mapping and a private `_for_deps_test` that validates trigger The Python variant derives `for_keys` itself from the configured hub. `inferred_apt_deps(name, deps = [], inferences = [], base_packages = [], packages = [], **kwargs)` -collects base packages, matching mappings, then explicit packages in that order. +takes `layer_inference_bundle` targets in `inferences`. It collects base packages, matching mappings, then explicit packages in that order. It exposes `DefaultInfo`, `LayerTarsInfo`, and `SizeHintInfo`. Both APIs accept ordinary Bazel attributes such as `visibility` and `tags`. diff --git a/apt/defs.bzl b/apt/defs.bzl index c667302..703f875 100644 --- a/apt/defs.bzl +++ b/apt/defs.bzl @@ -1,6 +1,7 @@ """Public apt building blocks.""" -load("//apt/private:inferred_apt_deps.bzl", _apt_inference = "apt_inference", _inferred_apt_deps_rule = "inferred_apt_deps_rule") +load("//apt/private:inferred_apt_deps.bzl", _apt_inference = "apt_inference", _inferred_apt_deps_rule = "inferred_apt_deps_rule", _make_inferred_apt_deps = "make_inferred_apt_deps") apt_inference = _apt_inference inferred_apt_deps = _inferred_apt_deps_rule +make_inferred_apt_deps = _make_inferred_apt_deps diff --git a/apt/private/apt_size_hints.bzl b/apt/private/apt_size_hints.bzl index acf345f..c53565b 100644 --- a/apt/private/apt_size_hints.bzl +++ b/apt/private/apt_size_hints.bzl @@ -74,3 +74,27 @@ def render_apt_size_hints_bzl(size_hints): lines.append("}") return "\n".join(lines) + "\n" + +def _apt_size_hints_repository_impl(rctx): + size_hints = {} + for index in range(len(rctx.attr.locks)): + lock_hints = parse_apt_lock_size_hints( + rctx.read(rctx.attr.locks[index]), + rctx.attr.dependency_sets[index], + rctx.attr.repositories[index].repo_name, + ) + for package, size in lock_hints.items(): + previous_size = size_hints.get(package) + size_hints[package] = max(previous_size or 0, size) + + rctx.file("BUILD.bazel", "exports_files([\"size_hints.bzl\"])\n") + rctx.file("size_hints.bzl", render_apt_size_hints_bzl(size_hints)) + +apt_size_hints_repository = repository_rule( + implementation = _apt_size_hints_repository_impl, + attrs = { + "dependency_sets": attr.string_list(), + "locks": attr.label_list(allow_files = [".json"]), + "repositories": attr.label_list(), + }, +) diff --git a/apt/private/distroless.bzl b/apt/private/distroless.bzl index 55d9bcf..7704a93 100644 --- a/apt/private/distroless.bzl +++ b/apt/private/distroless.bzl @@ -1,9 +1,7 @@ """rules_distroless adapter for APT package layer metadata.""" load("//apt/private:apt_utils.bzl", "apt_package_size_hint") - -# buildifier: disable=bzl-visibility -load("//layers/private:layer_groups.bzl", "SizeHintInfo") +load("//layers:providers.bzl", "SizeHintInfo") def _primary_files_for_package(target, ctx): """Extract the primary tar exposed by a rules_distroless package target.""" diff --git a/apt/private/inferred_apt_deps.bzl b/apt/private/inferred_apt_deps.bzl index 2232488..b7b399d 100644 --- a/apt/private/inferred_apt_deps.bzl +++ b/apt/private/inferred_apt_deps.bzl @@ -7,15 +7,9 @@ mappings that matched. """ load("//apt/private:distroless.bzl", "apt_size_hint_aspect") - -# buildifier: disable=bzl-visibility -load("//inference/private:dependency_inference.bzl", "dependency_graph_aspect", "dependency_identities", "inference_matches", "validate_inference_triggers") - -# buildifier: disable=bzl-visibility -load("//inference/private:inferred_layers.bzl", "LayerInferenceBundleInfo", "LayerInferenceInfo") - -# buildifier: disable=bzl-visibility -load("//layers/private:layer_groups.bzl", "LayerTarsInfo", "SizeHintInfo", "merge_size_hints") +load("//inference:graph.bzl", "dependency_graph_aspect", "dependency_identities", "inference_matches", "validate_inference_triggers") +load("//inference:providers.bzl", "LayerInferenceBundleInfo", "LayerInferenceInfo") +load("//layers:providers.bzl", "LayerTarsInfo", "SizeHintInfo", "merge_size_hints") def _apt_inference_rule_impl(ctx): files = [p.files for p in ctx.attr.packages + ctx.attr.tars] @@ -149,7 +143,10 @@ def make_inferred_apt_deps(dependency_aspects = []): implementation = inferred_apt_deps_rule_impl, attrs = { "deps": attr.label_list(aspects = [dependency_graph_aspect] + dependency_aspects), - "inferences": attr.label_list(default = []), + "inferences": attr.label_list( + default = [], + providers = [LayerInferenceBundleInfo], + ), "base_packages": attr.label_list(default = [], aspects = [apt_size_hint_aspect]), "packages": attr.label_list(default = [], aspects = [apt_size_hint_aspect]), }, @@ -166,16 +163,5 @@ def _inference_triggers(for_deps): def _inference_entries(ctx): entries = [] for inference in ctx.attr.inferences: - if LayerInferenceBundleInfo in inference: - entries.extend(inference[LayerInferenceBundleInfo].entries) - elif LayerInferenceInfo in inference: - sizes = inference[SizeHintInfo].sizes if SizeHintInfo in inference else {} - entries.append(struct( - for_deps = tuple(inference[LayerInferenceInfo].for_deps), - for_keys = tuple(inference[LayerInferenceInfo].for_keys), - files = inference.files, - sizes = sizes, - )) - else: - fail("{} is not a layer_inference or layer_inference_bundle target".format(inference.label)) + entries.extend(inference[LayerInferenceBundleInfo].entries) return entries diff --git a/apt/size_hints.bzl b/apt/size_hints.bzl new file mode 100644 index 0000000..7daab4e --- /dev/null +++ b/apt/size_hints.bzl @@ -0,0 +1,5 @@ +"""Public APT lock size-hint repository rule.""" + +load("//apt/private:apt_size_hints.bzl", _apt_size_hints_repository = "apt_size_hints_repository") + +apt_size_hints_repository = _apt_size_hints_repository diff --git a/docs/README.md b/docs/README.md index e41a2df..f716a49 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,11 +1,11 @@ # Documentation -- [Configuration](configuration.md): module setup and package size metadata. +- [Configuration](configuration.md): module setup, package sizes, and apt and environment mappings. - [Compatibility](compatibility.md): supported dependencies and current limits. - [Layers](../layers/README.md): providers, ordering, and budget decisions. - [Inference](../inference/README.md): exact-label and Python-aware matching. - [Python](../python/README.md): reusable wheels and source layers. - [APT](../apt/README.md): package metadata and inference. -- [Inference-only consumer](../e2e/inference/README.md): package matching without size hints. -- [Examples](../examples/README.md): executable consumer configurations. +- [Examples](../examples/README.md): two-argument `py_image` modules. +- [End-to-end checks](../e2e/image_backends/README.md): one directory per behavior, including the [inference-only consumer](../e2e/inference/README.md). - [Release preparation](../.bcr/README.md): archive verification and release metadata. diff --git a/docs/compatibility.md b/docs/compatibility.md index d34d791..d91b753 100644 --- a/docs/compatibility.md +++ b/docs/compatibility.md @@ -14,9 +14,9 @@ use Bazel 9.2.0. Other execution platforms are not yet claimed as supported. | `rules_python` | **1.9.0** | 1.9.0 | | `aspect_rules_py` | **2.0.0-alpha.4** | 2.0.0-alpha.4 | -The minimum combination and current endpoints run the same -[consumer tests](../examples/README.md), including all four Python/image-backend -combinations in Docker. The [minimum module](../e2e/minimum/README.md) pins exact +The current [image backend checks](../e2e/image_backends/README.md) and the +[minimum module](../e2e/minimum/README.md) run all four Python/image-backend +combinations in Docker. The minimum module pins exact versions with root-only overrides and verifies the resolved module graph. This prevents transitive version upgrades from invalidating minimum-version coverage. These are supported floors, not a claim that every future release has been tested. diff --git a/docs/configuration.md b/docs/configuration.md index 8d9a0ed..7b9e625 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -1,61 +1,207 @@ # Configuration -See the [quickstart](../README.md#get-started) for installation and -[release preparation](../.bcr/README.md) for packaged installation. +`rules_layer_optimizer` involves multiple repository rules and aspect rules, so +there are a few pieces of configuration required outside of simply invoking +`optimized_layers`. -Layer planning, materialization, and generic inference work without root-module -configuration. Inference traverses `deps`, `src`, `srcs`, `data`, `actual`, and -`venv` by default. To replace that list, optionally configure the extension: +## Infer Apt packages + +The need to include an apt package in an application's image is usually tied to +some other library target which runs code dependent on that apt package; the +problem is that Bazel doesn't know about this dependency. + +First, declare the inferences once in a shared location: + +```starlark +load("@rules_layer_optimizer//inference:defs.bzl", "layer_inference_bundle") +load("@rules_layer_optimizer//python:inference.bzl", "apt_inference") + +# If a py_binary depends on this package, include the apt package. +apt_inference( + name = "pyusb_apt", + for_deps = ["@pip//pyusb"], + packages = ["@noble//libusb-1.0-0-dev"], +) + +# Bundle together multiple inferences, making them ready for `inferred_apt_deps`. +layer_inference_bundle( + name = "apt_inferences", + inferences = [":pyusb_apt"], + visibility = ["//visibility:public"], +) +``` + +Then, consume the inferences with `inferred_apt_deps` to walk the application's +dependency graph and produce a target containing all of the inferred +dependencies: + +```starlark +load("@rules_layer_optimizer//python:inference.bzl", "inferred_apt_deps") + +inferred_apt_deps( + name = "app_apt", + # Extra packages to include regardless of inference + base_packages = ["@noble//ca-certificates"], + # Application entrypoint + deps = [":app"], + # The bundle of inferences from above + inferences = ["//shared:apt_inferences"], +) +``` + +The result is a layer candidate. Group it with the binary's other tars in +`optimized_layers`. [APT layers](../apt/README.md) lists the remaining +arguments. + +## Infer environment variables + +Just like apt packages, the need to include an environment variable in an +application's image is usually tied to some other library target which runs +code dependent on that variable; the problem is that Bazel doesn't know about +this. + +First, declare the inferences once in a shared location: + +```starlark +load("@rules_layer_optimizer//inference:defs.bzl", "env_inference_bundle") +load("@rules_layer_optimizer//python:inference.bzl", "env_inference") + +# If a py_binary depends on this package, include the environment variable. +env_inference( + name = "colorama_env", + env = {"COLORAMA_AVAILABLE": "1"}, + for_deps = ["@pip//colorama"], +) + +env_inference_bundle( + name = "env_inferences", + inferences = [":colorama_env"], + visibility = ["//visibility:public"], +) +``` + +Then, consume the inferences with `env_file` to walk the application's +dependency graph and produce a target containing all of the inferred +environment variables: + +```starlark +load("@rules_layer_optimizer//python:inference.bzl", "env_file") + +env_file( + name = "app_env", + # Extra variables to include regardless of inference + base_env = {"PATH": "/usr/bin"}, + # Application entrypoint + deps = [":app"], + # The bundle of inferences from above + inferences = ["//shared:env_inferences"], +) +``` + +The result is a `KEY=VALUE` file. Pass it to `oci_image` as `env` or to +`image_manifest` as `env_file`. [Dependency inference](../inference/README.md) +lists the remaining arguments. + +## Repo-wide facts + +Extension configuration must also be set in `MODULE.bazel`. The sections below +describe the options. ```starlark inference = use_extension( "@rules_layer_optimizer//inference:extensions.bzl", "oci_image_inference", ) -inference.configure(dependency_attributes = ["deps", "src", "srcs", "actual", "venv"]) use_repo(inference, "oci_image_inference_config") ``` -To enable Python package identities, add `pip_hub` to a `configure` tag. -`dependency_attributes` can be omitted to keep the defaults: +### Which targets count as dependencies + +Inference walks the binary and follows `deps`, `src`, `srcs`, `data`, +`actual`, and `venv`. That list matches a normal `py_binary`. Replace it when +a rule in your repo carries dependencies on some other attribute. There is one +`configure` tag: + +```starlark +inference.configure( + dependency_attributes = ["deps", "src", "srcs", "actual", "venv"], +) +``` + +### Which pip package a dependency is + +Apt and environment mappings name a distribution, such as `@pip//colorama`. +The pip hub is what makes that label mean the same distribution for every +binary. Put `pip_hub` on the `configure` tag above. Leave +`dependency_attributes` unset to keep the default walk. + +An aspect_rules_py hub exposes its distributions from `defs.bzl`: + +```starlark +inference.configure(pip_hub = "@pip//:defs.bzl") +``` -- aspect_rules_py: `pip_hub = "@packages//:defs.bzl"` -- rules_python: `pip_hub = "@pip//:requirements.bzl"` +A rules_python hub exposes them from `requirements.bzl`: -Package identity inference does not require size hints. Package **layer production** -requires positive size estimates; configure at most one `inference.pip_size_hint` -tag when producing package layers. A uv lock works with either -adapter: `inference.pip_size_hint(lock = "//:uv.lock")`. aspect_rules_py selects -an exact wheel size by filename. rules_python uses the largest available wheel -size for each distribution, since its py_library does not expose that filename. +```starlark +inference.configure(pip_hub = "@pip//:requirements.bzl") +``` -Consumers using requirements.txt without uv can provide estimates directly: +Both arguments belong on that single tag when a repo needs a custom walk and a +hub: + +```starlark +inference.configure( + dependency_attributes = ["deps", "src", "srcs", "actual", "venv"], + pip_hub = "@pip//:requirements.bzl", +) +``` + +With the hub set, mappings loaded from `python:inference.bzl` match a binary +that depends on the distribution. The exact-label rules in `apt:defs.bzl` and +`inference:defs.bzl` stay available when the trigger is an ordinary target. + +### How large each pip package is + +Name matching is enough to decide that a variable or an apt package belongs in +the image. A separate layer per distribution also needs a size, so the +optimizer can fold small wheels together and keep large ones alone. Declare +`pip_size_hint` once. + +A `uv.lock` carries those sizes for either adapter: + +```starlark +inference.pip_size_hint(lock = "//:uv.lock") +``` + +aspect_rules_py uses the size of the wheel it selected. rules_python uses the +largest wheel recorded for that distribution, because the selected filename is +not available from the `py_library`. + +A requirements lock without `uv.lock` can supply positive byte counts as +strings: ```starlark inference.pip_size_hint(size_overrides = {"colorama": "25335"}) ``` -Values must be positive byte counts, supplied as strings. With a uv lock, -overrides are limited to source-built or unsized packages and act as fallbacks -for exact wheel sizes. Without a lock, they supply all package size estimates. -See the [standalone rules_python module](../e2e/rules_python/MODULE.bazel). +The tag takes a `lock`, `size_overrides`, or both. Alongside a lock, an +override fills in a source-built package or a wheel the lock left unsized. + +### How large each apt package is -The [APT adapter](../apt/README.md) takes hints from caller-supplied -rules_distroless v2 locks: +Deb packages need the same kind of size before they can share a flattened +layer. Read it from a rules_distroless v2 lock. Repeat `apt_size_hint` for +every package repository: ```starlark inference.apt_size_hint( - dependency_set = "debian", + dependency_set = "noble", lock = "//:apt.lock.json", - repository = "@my_debian_packages//:dpkg_status", + repository = "@noble//:dpkg_status", ) ``` -Repository labels respect Bzlmod mappings. The example smoke module deliberately -uses a differently named package repository and a small synthetic v2 lock. -See [APT layers](../apt/README.md) for resolver requirements. - -The root may supply at most one `configure` tag; other modules cannot override -its policy. Size hints may be supplied without a pip hub, and a pip hub may be -supplied without size hints. `apt_size_hint` tags can be repeated for multiple -package repositories. Each requires `dependency_set`, `lock`, and `repository`. +`dependency_set` selects that set inside the lock. `repository` is a label in +the set's repository, so a Bzlmod rename still resolves. These sizes are what +the apt layers above carry into the optimizer. diff --git a/e2e/aspect_layers/.bazelrc b/e2e/aspect_layers/.bazelrc new file mode 100644 index 0000000..6f46b0d --- /dev/null +++ b/e2e/aspect_layers/.bazelrc @@ -0,0 +1,7 @@ +import %workspace%/../../.bazelrc + +build --@packages//dep_group=layer-optimizer-examples + +# rules_python's own module defaults to 3.11. Pin 3.12 so it agrees with the +# aspect_rules_py interpreter. +build --@rules_python//python/config_settings:python_version=3.12 diff --git a/e2e/smoke/.bazelversion b/e2e/aspect_layers/.bazelversion similarity index 100% rename from e2e/smoke/.bazelversion rename to e2e/aspect_layers/.bazelversion diff --git a/e2e/aspect_layers/BUILD.bazel b/e2e/aspect_layers/BUILD.bazel new file mode 100644 index 0000000..b691229 --- /dev/null +++ b/e2e/aspect_layers/BUILD.bazel @@ -0,0 +1,26 @@ +load("@aspect_bazel_lib//lib:tar.bzl", "mtree_mutate", "mtree_spec", "tar") +load(":interpreter.bzl", "interpreter_path") + +exports_files([ + "pyproject.toml", + "uv.lock", +]) + +mtree_spec( + name = "interpreter_mtree", + srcs = ["@python_3_12_x86_64_unknown_linux_gnu//:files"], +) + +mtree_mutate( + name = "interpreter_paths", + mtree = ":interpreter_mtree", + package_dir = interpreter_path(), +) + +tar( + name = "interpreter", + srcs = ["@python_3_12_x86_64_unknown_linux_gnu//:files"], + compress = "gzip", + mtree = ":interpreter_paths", + visibility = ["//visibility:public"], +) diff --git a/e2e/aspect_layers/MODULE.bazel b/e2e/aspect_layers/MODULE.bazel new file mode 100644 index 0000000..1b3672d --- /dev/null +++ b/e2e/aspect_layers/MODULE.bazel @@ -0,0 +1,42 @@ +module(name = "aspect_layers") + +bazel_dep(name = "rules_layer_optimizer") +local_path_override( + module_name = "rules_layer_optimizer", + path = "../..", +) + +bazel_dep(name = "aspect_rules_py", version = "2.0.0-alpha.4") +bazel_dep(name = "aspect_bazel_lib", version = "2.22.0") +bazel_dep(name = "bazel_skylib", version = "1.9.0") +bazel_dep(name = "rules_python", version = "1.9.0") +bazel_dep(name = "rules_shell", version = "0.6.1") + +python = use_extension("@aspect_rules_py//py:extensions.bzl", "python_interpreters") +python.toolchain(python_version = "3.12") +use_repo(python, "python_3_12_x86_64_unknown_linux_gnu", "python_interpreters") + +register_toolchains("@python_interpreters//:all") + +uv = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv") +uv.declare_hub(hub_name = "packages") +uv.project( + hub_name = "packages", + lock = "//:uv.lock", + pyproject = "//:pyproject.toml", +) +use_repo(uv, "packages") + +inference = use_extension("@rules_layer_optimizer//inference:extensions.bzl", "oci_image_inference") +inference.configure( + dependency_attributes = [ + "deps", + "src", + "srcs", + "actual", + "venv", + ], + pip_hub = "@packages//:defs.bzl", +) +inference.pip_size_hint(lock = "//:uv.lock") +use_repo(inference, "oci_image_inference_config") diff --git a/e2e/smoke/MODULE.bazel.lock b/e2e/aspect_layers/MODULE.bazel.lock similarity index 100% rename from e2e/smoke/MODULE.bazel.lock rename to e2e/aspect_layers/MODULE.bazel.lock diff --git a/e2e/aspect_layers/README.md b/e2e/aspect_layers/README.md new file mode 100644 index 0000000..4260eb3 --- /dev/null +++ b/e2e/aspect_layers/README.md @@ -0,0 +1,8 @@ +# aspect_rules_py layer checks + +Each package checks one behavior of the aspect_rules_py adapter: + +- `wheel_reuse`: two consumers receive the same wheel archive and size. +- `package_inference`: a pip package selects the same tar through layer and apt inference. +- `source_layers`: source partitions, exclusions, and wheel files staying out of the source layer. +- `caller_tags`: generated targets keep the caller's tags. diff --git a/e2e/aspect_layers/caller_tags/BUILD.bazel b/e2e/aspect_layers/caller_tags/BUILD.bazel new file mode 100644 index 0000000..e4f0a67 --- /dev/null +++ b/e2e/aspect_layers/caller_tags/BUILD.bazel @@ -0,0 +1,46 @@ +load("@aspect_rules_py//py:defs.bzl", "py_binary") +load("@rules_layer_optimizer//python:defs.bzl", "py_image_layer") +load(":tags_test.bzl", "tags_test") + +py_binary( + name = "app", + srcs = ["app.py"], + deps = ["@packages//colorama"], +) + +py_image_layer( + name = "app_layers", + binary = ":app", + interpreter_tar = "//:interpreter", + python_toolchain = "@python_interpreters//:current_py_toolchain", + strip_prefix = "caller_tags/app", +) + +py_image_layer( + name = "tagged_layers", + binary = ":app", + interpreter_tar = "//:interpreter", + python_toolchain = "@python_interpreters//:current_py_toolchain", + strip_prefix = "caller_tags/app", + tags = [ + "caller-tag", + "manual", + "no-remote-cache", + ], +) + +tags_test( + name = "default_tags_test", + expected = [], + prefix = "app_layers", +) + +tags_test( + name = "caller_tags_test", + expected = [ + "manual", + "no-remote-cache", + "caller-tag", + ], + prefix = "tagged_layers", +) diff --git a/e2e/aspect_layers/caller_tags/app.py b/e2e/aspect_layers/caller_tags/app.py new file mode 100644 index 0000000..79161b6 --- /dev/null +++ b/e2e/aspect_layers/caller_tags/app.py @@ -0,0 +1 @@ +"""Binary used only to generate tagged layer targets.""" diff --git a/examples/python_image/tags_test.bzl b/e2e/aspect_layers/caller_tags/tags_test.bzl similarity index 100% rename from examples/python_image/tags_test.bzl rename to e2e/aspect_layers/caller_tags/tags_test.bzl diff --git a/examples/python_image/interpreter.bzl b/e2e/aspect_layers/interpreter.bzl similarity index 100% rename from examples/python_image/interpreter.bzl rename to e2e/aspect_layers/interpreter.bzl diff --git a/e2e/aspect_layers/package_inference/BUILD.bazel b/e2e/aspect_layers/package_inference/BUILD.bazel new file mode 100644 index 0000000..edc274e --- /dev/null +++ b/e2e/aspect_layers/package_inference/BUILD.bazel @@ -0,0 +1,55 @@ +load("@aspect_bazel_lib//lib:tar.bzl", "tar") +load("@rules_layer_optimizer//inference:defs.bzl", "layer_inference_bundle") +load("@rules_layer_optimizer//python:inference.bzl", "apt_inference", "inferred_apt_deps", "inferred_layers", "layer_inference") +load(":inference_test.bzl", "inference_test") + +tar( + name = "payload", + srcs = ["payload.txt"], +) + +filegroup( + name = "colorama", + srcs = ["@packages//colorama"], +) + +layer_inference( + name = "package_runtime", + for_deps = ["@packages//colorama"], + layers = [":payload"], +) + +layer_inference_bundle( + name = "layer_inferences", + inferences = [":package_runtime"], +) + +inferred_layers( + name = "runtime_layers", + inferences = [":layer_inferences"], + deps = [":colorama"], +) + +apt_inference( + name = "apt_runtime", + for_deps = ["@packages//colorama"], + tars = [":payload"], +) + +layer_inference_bundle( + name = "apt_inferences", + inferences = [":apt_runtime"], +) + +inferred_apt_deps( + name = "apt_layers", + inferences = [":apt_inferences"], + deps = [":colorama"], +) + +inference_test( + name = "inference_test", + apt = ":apt_layers", + expected = ":payload", + target_under_test = ":runtime_layers", +) diff --git a/examples/shared_dependencies/inference_test.bzl b/e2e/aspect_layers/package_inference/inference_test.bzl similarity index 100% rename from examples/shared_dependencies/inference_test.bzl rename to e2e/aspect_layers/package_inference/inference_test.bzl diff --git a/examples/basic_layers/payload.txt b/e2e/aspect_layers/package_inference/payload.txt similarity index 100% rename from examples/basic_layers/payload.txt rename to e2e/aspect_layers/package_inference/payload.txt diff --git a/examples/pyproject.toml b/e2e/aspect_layers/pyproject.toml similarity index 100% rename from examples/pyproject.toml rename to e2e/aspect_layers/pyproject.toml diff --git a/e2e/aspect_layers/source_layers/BUILD.bazel b/e2e/aspect_layers/source_layers/BUILD.bazel new file mode 100644 index 0000000..2a35bab --- /dev/null +++ b/e2e/aspect_layers/source_layers/BUILD.bazel @@ -0,0 +1,138 @@ +load("@aspect_rules_py//py:defs.bzl", "py_binary", "py_test") +load("@bazel_skylib//rules:write_file.bzl", "write_file") +load("@rules_layer_optimizer//inference:defs.bzl", "env_inference_bundle") +load("@rules_layer_optimizer//layers:defs.bzl", "layer_group") +load("@rules_layer_optimizer//layers:distroless.bzl", "optimized_layers") +load("@rules_layer_optimizer//python:defs.bzl", "py_image_layer") +load("@rules_layer_optimizer//python:inference.bzl", "env_file", "env_inference") +load("@rules_shell//shell:sh_test.bzl", "sh_test") + +py_binary( + name = "app", + srcs = ["app.py"], + data = [ + ":first_asset", + ":native_extension", + ":second_asset", + ":third_asset", + ], + deps = [ + "@packages//backports_strenum", + "@packages//backports_tarfile", + "@packages//colorama", + "@packages//google_crc32c", + ], +) + +write_file( + name = "first_asset", + out = "fixtures/first.txt", + content = ["first"], +) + +write_file( + name = "second_asset", + out = "fixtures/second.txt", + content = ["second"], +) + +write_file( + name = "third_asset", + out = "fixtures/third.txt", + content = ["third"], +) + +write_file( + name = "native_extension", + out = "fixtures/binding.so", + content = ["native payload"], +) + +py_image_layer( + name = "app_layers", + binary = ":app", + compress = "gzip", + interpreter_tar = "//:interpreter", + python_toolchain = "@python_interpreters//:current_py_toolchain", + strip_prefix = "source_layers/app", +) + +env_inference( + name = "colorama_env", + env = {"COLORAMA_AVAILABLE": "1"}, + for_deps = ["@packages//colorama"], +) + +env_inference_bundle( + name = "env_inferences", + inferences = [":colorama_env"], +) + +env_file( + name = "env", + inferences = [":env_inferences"], + runfiles_root = "/app.runfiles", + deps = [":app"], +) + +optimized_layers( + name = "optimized", + compress = "gzip", + groups = [ + layer_group( + name = "pip", + overflow = "flatten", + targets = [":app_layers_pip"], + ), + ], + layer_budget = 4, + size_bytes_threshold = 1, +) + +sh_test( + name = "source_entries_test", + srcs = ["source_entries_test.sh"], + args = [ + "$(rootpath :app_layers_source)", + "$(rootpath :env)", + "$(rootpath :optimized_optimization_plan)", + ], + data = [ + ":app_layers_source", + ":env", + ":optimized_optimization_plan", + ], +) + +py_image_layer( + name = "partitioned_layers", + binary = ":app", + compress = "gzip", + exclude_patterns = ["/fixtures/second[.]txt$"], + interpreter_tar = "//:interpreter", + python_toolchain = "@python_interpreters//:current_py_toolchain", + source_layers = { + "first": ["/fixtures/first[.]txt$"], + "assets": ["/fixtures/.*[.]txt$"], + "empty": ["/does_not_exist/"], + }, + strip_prefix = "source_layers/app", +) + +py_test( + name = "source_layers_test", + srcs = ["source_layers_test.py"], + args = [ + "$(rootpath :partitioned_layers_source)", + "$(rootpath :partitioned_layers_source_first)", + "$(rootpath :partitioned_layers_source_assets)", + "$(rootpath :partitioned_layers_source_empty)", + ], + data = [ + ":partitioned_layers_source", + ":partitioned_layers_source_assets", + ":partitioned_layers_source_empty", + ":partitioned_layers_source_first", + ], + main = "source_layers_test.py", +) diff --git a/e2e/aspect_layers/source_layers/app.py b/e2e/aspect_layers/source_layers/app.py new file mode 100644 index 0000000..a250d9d --- /dev/null +++ b/e2e/aspect_layers/source_layers/app.py @@ -0,0 +1 @@ +"""Binary whose runfiles are split into source layers.""" diff --git a/examples/python_image/layers_test.sh b/e2e/aspect_layers/source_layers/source_entries_test.sh similarity index 81% rename from examples/python_image/layers_test.sh rename to e2e/aspect_layers/source_layers/source_entries_test.sh index 58b6bdc..2fbf03f 100755 --- a/examples/python_image/layers_test.sh +++ b/e2e/aspect_layers/source_layers/source_entries_test.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -euo pipefail tar -tzf "$1" > "$TEST_TMPDIR/source_entries" -grep -q 'app.runfiles/_main/python_image/app.py' "$TEST_TMPDIR/source_entries" +grep -q 'app.runfiles/_main/source_layers/app.py' "$TEST_TMPDIR/source_entries" if grep -Eq '/site-packages/(colorama/|google_crc32c/|google_crc32c.libs/|backports/)' "$TEST_TMPDIR/source_entries"; then echo 'Wheel files leaked into the source layer' >&2 exit 1 diff --git a/examples/python_image/source_layers_test.py b/e2e/aspect_layers/source_layers/source_layers_test.py similarity index 100% rename from examples/python_image/source_layers_test.py rename to e2e/aspect_layers/source_layers/source_layers_test.py diff --git a/examples/uv.lock b/e2e/aspect_layers/uv.lock similarity index 100% rename from examples/uv.lock rename to e2e/aspect_layers/uv.lock diff --git a/e2e/aspect_layers/wheel_reuse/BUILD.bazel b/e2e/aspect_layers/wheel_reuse/BUILD.bazel new file mode 100644 index 0000000..78a6828 --- /dev/null +++ b/e2e/aspect_layers/wheel_reuse/BUILD.bazel @@ -0,0 +1,39 @@ +load("@rules_layer_optimizer//python:defs.bzl", "pip_layer_reducer") +load(":archive_test.bzl", "archive_test") +load(":sharing_test.bzl", "sharing_test") + +filegroup( + name = "first", + srcs = ["@packages//colorama"], +) + +filegroup( + name = "second", + srcs = ["@packages//colorama"], +) + +pip_layer_reducer( + name = "first_layers", + deps = [":first"], +) + +pip_layer_reducer( + name = "second_layers", + deps = [":second"], +) + +sharing_test( + name = "sharing_test", + other = ":second_layers", + target_under_test = ":first_layers", +) + +archive_test( + name = "wheel_contents_test", + archive = ":first_layers", + contains = [ + "colorama/__init__.py", + "colorama-0.4.6.dist-info/METADATA", + "colorama-0.4.6.dist-info/RECORD", + ], +) diff --git a/examples/archive_test.bzl b/e2e/aspect_layers/wheel_reuse/archive_test.bzl similarity index 100% rename from examples/archive_test.bzl rename to e2e/aspect_layers/wheel_reuse/archive_test.bzl diff --git a/examples/shared_dependencies/sharing_test.bzl b/e2e/aspect_layers/wheel_reuse/sharing_test.bzl similarity index 100% rename from examples/shared_dependencies/sharing_test.bzl rename to e2e/aspect_layers/wheel_reuse/sharing_test.bzl diff --git a/e2e/smoke/.bazelrc b/e2e/distroless/.bazelrc similarity index 100% rename from e2e/smoke/.bazelrc rename to e2e/distroless/.bazelrc diff --git a/examples/.bazelversion b/e2e/distroless/.bazelversion similarity index 100% rename from examples/.bazelversion rename to e2e/distroless/.bazelversion diff --git a/e2e/distroless/BUILD.bazel b/e2e/distroless/BUILD.bazel new file mode 100644 index 0000000..898518c --- /dev/null +++ b/e2e/distroless/BUILD.bazel @@ -0,0 +1 @@ +exports_files(["apt.lock.json"]) diff --git a/e2e/smoke/MODULE.bazel b/e2e/distroless/MODULE.bazel similarity index 93% rename from e2e/smoke/MODULE.bazel rename to e2e/distroless/MODULE.bazel index 42b0098..540c4ac 100644 --- a/e2e/smoke/MODULE.bazel +++ b/e2e/distroless/MODULE.bazel @@ -1,4 +1,4 @@ -module(name = "rules_layer_optimizer_smoke") +module(name = "distroless_contract") bazel_dep(name = "rules_layer_optimizer") local_path_override( diff --git a/e2e/distroless/MODULE.bazel.lock b/e2e/distroless/MODULE.bazel.lock new file mode 100644 index 0000000..29fb8fc --- /dev/null +++ b/e2e/distroless/MODULE.bazel.lock @@ -0,0 +1,1500 @@ +{ + "lockFileVersion": 28, + "registryFileHashes": { + "https://bcr.bazel.build/bazel_registry.json": "8a28e4aff06ee60aed2a8c281907fb8bcbf3b753c91fb5a5c57da3215d5b3497", + "https://bcr.bazel.build/modules/abseil-cpp/20210324.2/MODULE.bazel": "7cd0312e064fde87c8d1cd79ba06c876bd23630c83466e9500321be55c96ace2", + "https://bcr.bazel.build/modules/abseil-cpp/20211102.0/MODULE.bazel": "70390338f7a5106231d20620712f7cccb659cd0e9d073d1991c038eb9fc57589", + "https://bcr.bazel.build/modules/abseil-cpp/20230125.1/MODULE.bazel": "89047429cb0207707b2dface14ba7f8df85273d484c2572755be4bab7ce9c3a0", + "https://bcr.bazel.build/modules/abseil-cpp/20230802.0.bcr.1/MODULE.bazel": "1c8cec495288dccd14fdae6e3f95f772c1c91857047a098fad772034264cc8cb", + "https://bcr.bazel.build/modules/abseil-cpp/20230802.0/MODULE.bazel": "d253ae36a8bd9ee3c5955384096ccb6baf16a1b1e93e858370da0a3b94f77c16", + "https://bcr.bazel.build/modules/abseil-cpp/20230802.1/MODULE.bazel": "fa92e2eb41a04df73cdabeec37107316f7e5272650f81d6cc096418fe647b915", + "https://bcr.bazel.build/modules/abseil-cpp/20240116.1/MODULE.bazel": "37bcdb4440fbb61df6a1c296ae01b327f19e9bb521f9b8e26ec854b6f97309ed", + "https://bcr.bazel.build/modules/abseil-cpp/20240116.2/MODULE.bazel": "73939767a4686cd9a520d16af5ab440071ed75cec1a876bf2fcfaf1f71987a16", + "https://bcr.bazel.build/modules/abseil-cpp/20250127.1/MODULE.bazel": "c4a89e7ceb9bf1e25cf84a9f830ff6b817b72874088bf5141b314726e46a57c1", + "https://bcr.bazel.build/modules/abseil-cpp/20250512.1/MODULE.bazel": "d209fdb6f36ffaf61c509fcc81b19e81b411a999a934a032e10cd009a0226215", + "https://bcr.bazel.build/modules/abseil-cpp/20250814.1/MODULE.bazel": "51f2312901470cdab0dbdf3b88c40cd21c62a7ed58a3de45b365ddc5b11bcab2", + "https://bcr.bazel.build/modules/abseil-cpp/20250814.1/source.json": "cea3901d7e299da7320700abbaafe57a65d039f10d0d7ea601c4a66938ea4b0c", + "https://bcr.bazel.build/modules/apple_support/1.11.1/MODULE.bazel": "1843d7cd8a58369a444fc6000e7304425fba600ff641592161d9f15b179fb896", + "https://bcr.bazel.build/modules/apple_support/1.15.1/MODULE.bazel": "a0556fefca0b1bb2de8567b8827518f94db6a6e7e7d632b4c48dc5f865bc7c85", + "https://bcr.bazel.build/modules/apple_support/1.21.0/MODULE.bazel": "ac1824ed5edf17dee2fdd4927ada30c9f8c3b520be1b5fd02a5da15bc10bff3e", + "https://bcr.bazel.build/modules/apple_support/1.21.1/MODULE.bazel": "5809fa3efab15d1f3c3c635af6974044bac8a4919c62238cce06acee8a8c11f1", + "https://bcr.bazel.build/modules/apple_support/1.24.2/MODULE.bazel": "0e62471818affb9f0b26f128831d5c40b074d32e6dda5a0d3852847215a41ca4", + "https://bcr.bazel.build/modules/apple_support/1.24.2/source.json": "2c22c9827093250406c5568da6c54e6fdf0ef06238def3d99c71b12feb057a8d", + "https://bcr.bazel.build/modules/aspect_bazel_lib/2.14.0/MODULE.bazel": "2b31ffcc9bdc8295b2167e07a757dbbc9ac8906e7028e5170a3708cecaac119f", + "https://bcr.bazel.build/modules/aspect_bazel_lib/2.19.3/MODULE.bazel": "253d739ba126f62a5767d832765b12b59e9f8d2bc88cc1572f4a73e46eb298ca", + "https://bcr.bazel.build/modules/aspect_bazel_lib/2.22.0/MODULE.bazel": "7fe0191f047d4fe4a4a46c1107e2350cbb58a8fc2e10913aa4322d3190dec0bf", + "https://bcr.bazel.build/modules/aspect_bazel_lib/2.22.0/source.json": "369df5b7f2eae82f200fff95cf1425f90dee90a0d0948122060b48150ff0e224", + "https://bcr.bazel.build/modules/aspect_bazel_lib/2.8.1/MODULE.bazel": "812d2dd42f65dca362152101fbec418029cc8fd34cbad1a2fde905383d705838", + "https://bcr.bazel.build/modules/aspect_rules_py/2.0.0-alpha.4/MODULE.bazel": "4d9f393a947c01809556659cc4b07b76b25d98f25a8062280e506b5c296b89cf", + "https://bcr.bazel.build/modules/aspect_rules_py/2.0.0-alpha.4/source.json": "fcf828898c74224aff425d991755e5bc6346e9ff4da74e0b286f9bc19c5424c4", + "https://bcr.bazel.build/modules/aspect_tools_telemetry/0.3.3/MODULE.bazel": "37c764292861c2f70314efa9846bb6dbb44fc0308903b3285da6528305450183", + "https://bcr.bazel.build/modules/aspect_tools_telemetry/0.3.3/source.json": "605086bbc197743a0d360f7ddc550a1d4dfa0441bc807236e17170f636153348", + "https://bcr.bazel.build/modules/bazel_features/1.1.1/MODULE.bazel": "27b8c79ef57efe08efccbd9dd6ef70d61b4798320b8d3c134fd571f78963dbcd", + "https://bcr.bazel.build/modules/bazel_features/1.10.0/MODULE.bazel": "f75e8807570484a99be90abcd52b5e1f390362c258bcb73106f4544957a48101", + "https://bcr.bazel.build/modules/bazel_features/1.11.0/MODULE.bazel": "f9382337dd5a474c3b7d334c2f83e50b6eaedc284253334cf823044a26de03e8", + "https://bcr.bazel.build/modules/bazel_features/1.15.0/MODULE.bazel": "d38ff6e517149dc509406aca0db3ad1efdd890a85e049585b7234d04238e2a4d", + "https://bcr.bazel.build/modules/bazel_features/1.17.0/MODULE.bazel": "039de32d21b816b47bd42c778e0454217e9c9caac4a3cf8e15c7231ee3ddee4d", + "https://bcr.bazel.build/modules/bazel_features/1.18.0/MODULE.bazel": "1be0ae2557ab3a72a57aeb31b29be347bcdc5d2b1eb1e70f39e3851a7e97041a", + "https://bcr.bazel.build/modules/bazel_features/1.19.0/MODULE.bazel": "59adcdf28230d220f0067b1f435b8537dd033bfff8db21335ef9217919c7fb58", + "https://bcr.bazel.build/modules/bazel_features/1.20.0/MODULE.bazel": "8b85300b9c8594752e0721a37210e34879d23adc219ed9dc8f4104a4a1750920", + "https://bcr.bazel.build/modules/bazel_features/1.21.0/MODULE.bazel": "675642261665d8eea09989aa3b8afb5c37627f1be178382c320d1b46afba5e3b", + "https://bcr.bazel.build/modules/bazel_features/1.23.0/MODULE.bazel": "fd1ac84bc4e97a5a0816b7fd7d4d4f6d837b0047cf4cbd81652d616af3a6591a", + "https://bcr.bazel.build/modules/bazel_features/1.24.0/MODULE.bazel": "4796b4c25b47053e9bbffa792b3792d07e228ff66cd0405faef56a978708acd4", + "https://bcr.bazel.build/modules/bazel_features/1.27.0/MODULE.bazel": "621eeee06c4458a9121d1f104efb80f39d34deff4984e778359c60eaf1a8cb65", + "https://bcr.bazel.build/modules/bazel_features/1.28.0/MODULE.bazel": "4b4200e6cbf8fa335b2c3f43e1d6ef3e240319c33d43d60cc0fbd4b87ece299d", + "https://bcr.bazel.build/modules/bazel_features/1.3.0/MODULE.bazel": "cdcafe83ec318cda34e02948e81d790aab8df7a929cec6f6969f13a489ccecd9", + "https://bcr.bazel.build/modules/bazel_features/1.30.0/MODULE.bazel": "a14b62d05969a293b80257e72e597c2da7f717e1e69fa8b339703ed6731bec87", + "https://bcr.bazel.build/modules/bazel_features/1.33.0/MODULE.bazel": "8b8dc9d2a4c88609409c3191165bccec0e4cb044cd7a72ccbe826583303459f6", + "https://bcr.bazel.build/modules/bazel_features/1.34.0/MODULE.bazel": "e8475ad7c8965542e0c7aac8af68eb48c4af904be3d614b6aa6274c092c2ea1e", + "https://bcr.bazel.build/modules/bazel_features/1.38.0/MODULE.bazel": "f9b8a9c890ebd216b4049fd12a31d3c2602e3403c7af636b04fbbd7453edc9c9", + "https://bcr.bazel.build/modules/bazel_features/1.4.1/MODULE.bazel": "e45b6bb2350aff3e442ae1111c555e27eac1d915e77775f6fdc4b351b758b5d7", + "https://bcr.bazel.build/modules/bazel_features/1.42.1/MODULE.bazel": "275a59b5406ff18c01739860aa70ad7ccb3cfb474579411decca11c93b951080", + "https://bcr.bazel.build/modules/bazel_features/1.43.0/MODULE.bazel": "defa2226f06ba20550d6548c3a2ea2a7929634437a52973869c20c225450eb91", + "https://bcr.bazel.build/modules/bazel_features/1.43.0/source.json": "1c4207dc858d6de0eecef30026793616bbf420c74aac27b6bad212534a730437", + "https://bcr.bazel.build/modules/bazel_features/1.9.0/MODULE.bazel": "885151d58d90d8d9c811eb75e3288c11f850e1d6b481a8c9f766adee4712358b", + "https://bcr.bazel.build/modules/bazel_features/1.9.1/MODULE.bazel": "8f679097876a9b609ad1f60249c49d68bfab783dd9be012faf9d82547b14815a", + "https://bcr.bazel.build/modules/bazel_lib/3.0.0-beta.1/MODULE.bazel": "407729e232f611c3270005b016b437005daa7b1505826798ea584169a476e878", + "https://bcr.bazel.build/modules/bazel_lib/3.0.0-rc.0/MODULE.bazel": "d6e00979a98ac14ada5e31c8794708b41434d461e7e7ca39b59b765e6d233b18", + "https://bcr.bazel.build/modules/bazel_lib/3.0.0/MODULE.bazel": "22b70b80ac89ad3f3772526cd9feee2fa412c2b01933fea7ed13238a448d370d", + "https://bcr.bazel.build/modules/bazel_lib/3.0.0/source.json": "895f21909c6fba01d7c17914bb6c8e135982275a1b18cdaa4e62272217ef1751", + "https://bcr.bazel.build/modules/bazel_skylib/1.0.3/MODULE.bazel": "bcb0fd896384802d1ad283b4e4eb4d718eebd8cb820b0a2c3a347fb971afd9d8", + "https://bcr.bazel.build/modules/bazel_skylib/1.1.1/MODULE.bazel": "1add3e7d93ff2e6998f9e118022c84d163917d912f5afafb3058e3d2f1545b5e", + "https://bcr.bazel.build/modules/bazel_skylib/1.2.0/MODULE.bazel": "44fe84260e454ed94ad326352a698422dbe372b21a1ac9f3eab76eb531223686", + "https://bcr.bazel.build/modules/bazel_skylib/1.2.1/MODULE.bazel": "f35baf9da0efe45fa3da1696ae906eea3d615ad41e2e3def4aeb4e8bc0ef9a7a", + "https://bcr.bazel.build/modules/bazel_skylib/1.3.0/MODULE.bazel": "20228b92868bf5cfc41bda7afc8a8ba2a543201851de39d990ec957b513579c5", + "https://bcr.bazel.build/modules/bazel_skylib/1.4.1/MODULE.bazel": "a0dcb779424be33100dcae821e9e27e4f2901d9dfd5333efe5ac6a8d7ab75e1d", + "https://bcr.bazel.build/modules/bazel_skylib/1.4.2/MODULE.bazel": "3bd40978e7a1fac911d5989e6b09d8f64921865a45822d8b09e815eaa726a651", + "https://bcr.bazel.build/modules/bazel_skylib/1.5.0/MODULE.bazel": "32880f5e2945ce6a03d1fbd588e9198c0a959bb42297b2cfaf1685b7bc32e138", + "https://bcr.bazel.build/modules/bazel_skylib/1.6.1/MODULE.bazel": "8fdee2dbaace6c252131c00e1de4b165dc65af02ea278476187765e1a617b917", + "https://bcr.bazel.build/modules/bazel_skylib/1.7.0/MODULE.bazel": "0db596f4563de7938de764cc8deeabec291f55e8ec15299718b93c4423e9796d", + "https://bcr.bazel.build/modules/bazel_skylib/1.7.1/MODULE.bazel": "3120d80c5861aa616222ec015332e5f8d3171e062e3e804a2a0253e1be26e59b", + "https://bcr.bazel.build/modules/bazel_skylib/1.8.0/MODULE.bazel": "2fb3fb53675f6adfc1ca5bfbd5cfb655ae350fba4706d924a8ec7e3ba945671c", + "https://bcr.bazel.build/modules/bazel_skylib/1.8.1/MODULE.bazel": "88ade7293becda963e0e3ea33e7d54d3425127e0a326e0d17da085a5f1f03ff6", + "https://bcr.bazel.build/modules/bazel_skylib/1.8.2/MODULE.bazel": "69ad6927098316848b34a9142bcc975e018ba27f08c4ff403f50c1b6e646ca67", + "https://bcr.bazel.build/modules/bazel_skylib/1.9.0/MODULE.bazel": "72997b29dfd95c3fa0d0c48322d05590418edef451f8db8db5509c57875fb4b7", + "https://bcr.bazel.build/modules/bazel_skylib/1.9.0/source.json": "7ad77c1e8c1b84222d9b3f3cae016a76639435744c19330b0b37c0a3c9da7dc0", + "https://bcr.bazel.build/modules/buildozer/8.5.1/MODULE.bazel": "a35d9561b3fc5b18797c330793e99e3b834a473d5fbd3d7d7634aafc9bdb6f8f", + "https://bcr.bazel.build/modules/buildozer/8.5.1/source.json": "e3386e6ff4529f2442800dee47ad28d3e6487f36a1f75ae39ae56c70f0cd2fbd", + "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.1/MODULE.bazel": "cdf8cbe5ee750db04b78878c9633cc76e80dcf4416cbe982ac3a9222f80713c8", + "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.3/MODULE.bazel": "f1b7bb2dd53e8f2ef984b39485ec8a44e9076dda5c4b8efd2fb4c6a6e856a31d", + "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.7/MODULE.bazel": "1e5e03c383fa64ebbe0942a225c32168fd6ef6b270351bbec481d47d19d1b96d", + "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.7/source.json": "34a83d58ae2f1ef6731d1fc8a1b6f07825741aff3f5993b67b67ec21d2c2946e", + "https://bcr.bazel.build/modules/google_benchmark/1.8.2/MODULE.bazel": "a70cf1bba851000ba93b58ae2f6d76490a9feb74192e57ab8e8ff13c34ec50cb", + "https://bcr.bazel.build/modules/googletest/1.11.0/MODULE.bazel": "3a83f095183f66345ca86aa13c58b59f9f94a2f81999c093d4eeaa2d262d12f4", + "https://bcr.bazel.build/modules/googletest/1.14.0.bcr.1/MODULE.bazel": "22c31a561553727960057361aa33bf20fb2e98584bc4fec007906e27053f80c6", + "https://bcr.bazel.build/modules/googletest/1.14.0/MODULE.bazel": "cfbcbf3e6eac06ef9d85900f64424708cc08687d1b527f0ef65aa7517af8118f", + "https://bcr.bazel.build/modules/googletest/1.15.2/MODULE.bazel": "6de1edc1d26cafb0ea1a6ab3f4d4192d91a312fd2d360b63adaa213cd00b2108", + "https://bcr.bazel.build/modules/googletest/1.17.0/MODULE.bazel": "dbec758171594a705933a29fcf69293d2468c49ec1f2ebca65c36f504d72df46", + "https://bcr.bazel.build/modules/googletest/1.17.0/source.json": "38e4454b25fc30f15439c0378e57909ab1fd0a443158aa35aec685da727cd713", + "https://bcr.bazel.build/modules/hermetic_launcher/0.0.11/MODULE.bazel": "aba15d5a4745cedcb4750faf0c49f946d004ccb09475b6ade1dea4efe0399d82", + "https://bcr.bazel.build/modules/hermetic_launcher/0.0.11/source.json": "0c4d45a10e956dc30c7278de756c81d4b55612218b1a20fa55fc2988063ba4eb", + "https://bcr.bazel.build/modules/jq.bzl/0.1.0/MODULE.bazel": "2ce69b1af49952cd4121a9c3055faa679e748ce774c7f1fda9657f936cae902f", + "https://bcr.bazel.build/modules/jq.bzl/0.1.0/source.json": "746bf13cac0860f091df5e4911d0c593971cd8796b5ad4e809b2f8e133eee3d5", + "https://bcr.bazel.build/modules/jsoncpp/1.9.5/MODULE.bazel": "31271aedc59e815656f5736f282bb7509a97c7ecb43e927ac1a37966e0578075", + "https://bcr.bazel.build/modules/jsoncpp/1.9.6/MODULE.bazel": "2f8d20d3b7d54143213c4dfc3d98225c42de7d666011528dc8fe91591e2e17b0", + "https://bcr.bazel.build/modules/jsoncpp/1.9.6/source.json": "a04756d367a2126c3541682864ecec52f92cdee80a35735a3cb249ce015ca000", + "https://bcr.bazel.build/modules/libpfm/4.11.0/MODULE.bazel": "45061ff025b301940f1e30d2c16bea596c25b176c8b6b3087e92615adbd52902", + "https://bcr.bazel.build/modules/nlohmann_json/3.6.1/MODULE.bazel": "6f7b417dcc794d9add9e556673ad25cb3ba835224290f4f848f8e2db1e1fca74", + "https://bcr.bazel.build/modules/nlohmann_json/3.6.1/source.json": "f448c6e8963fdfa7eb831457df83ad63d3d6355018f6574fb017e8169deb43a9", + "https://bcr.bazel.build/modules/package_metadata/0.0.2/MODULE.bazel": "fb8d25550742674d63d7b250063d4580ca530499f045d70748b1b142081ebb92", + "https://bcr.bazel.build/modules/package_metadata/0.0.3/MODULE.bazel": "77890552ecea9e284b5424c9de827a58099348763a4359e975c359a83d4faa83", + "https://bcr.bazel.build/modules/package_metadata/0.0.3/source.json": "742075a428ad12a3fa18a69014c2f57f01af910c6d9d18646c990200853e641a", + "https://bcr.bazel.build/modules/platforms/0.0.10/MODULE.bazel": "8cb8efaf200bdeb2150d93e162c40f388529a25852b332cec879373771e48ed5", + "https://bcr.bazel.build/modules/platforms/0.0.11/MODULE.bazel": "0daefc49732e227caa8bfa834d65dc52e8cc18a2faf80df25e8caea151a9413f", + "https://bcr.bazel.build/modules/platforms/0.0.4/MODULE.bazel": "9b328e31ee156f53f3c416a64f8491f7eb731742655a47c9eec4703a71644aee", + "https://bcr.bazel.build/modules/platforms/0.0.5/MODULE.bazel": "5733b54ea419d5eaf7997054bb55f6a1d0b5ff8aedf0176fef9eea44f3acda37", + "https://bcr.bazel.build/modules/platforms/0.0.6/MODULE.bazel": "ad6eeef431dc52aefd2d77ed20a4b353f8ebf0f4ecdd26a807d2da5aa8cd0615", + "https://bcr.bazel.build/modules/platforms/0.0.7/MODULE.bazel": "72fd4a0ede9ee5c021f6a8dd92b503e089f46c227ba2813ff183b71616034814", + "https://bcr.bazel.build/modules/platforms/0.0.8/MODULE.bazel": "9f142c03e348f6d263719f5074b21ef3adf0b139ee4c5133e2aa35664da9eb2d", + "https://bcr.bazel.build/modules/platforms/0.0.9/MODULE.bazel": "4a87a60c927b56ddd67db50c89acaa62f4ce2a1d2149ccb63ffd871d5ce29ebc", + "https://bcr.bazel.build/modules/platforms/1.0.0/MODULE.bazel": "f05feb42b48f1b3c225e4ccf351f367be0371411a803198ec34a389fb22aa580", + "https://bcr.bazel.build/modules/platforms/1.1.0/MODULE.bazel": "1c0c09f5bdcf4b3f924720d2478a3711cb39f4977019ca5988685e5b7e18b3d2", + "https://bcr.bazel.build/modules/platforms/1.1.0/source.json": "fcf351c47596c939140ab0d333dfdd08ed1ea6ce33c2fe70c12493a301cf1344", + "https://bcr.bazel.build/modules/protobuf/21.7/MODULE.bazel": "a5a29bb89544f9b97edce05642fac225a808b5b7be74038ea3640fae2f8e66a7", + "https://bcr.bazel.build/modules/protobuf/27.0/MODULE.bazel": "7873b60be88844a0a1d8f80b9d5d20cfbd8495a689b8763e76c6372998d3f64c", + "https://bcr.bazel.build/modules/protobuf/27.1/MODULE.bazel": "703a7b614728bb06647f965264967a8ef1c39e09e8f167b3ca0bb1fd80449c0d", + "https://bcr.bazel.build/modules/protobuf/29.0-rc2/MODULE.bazel": "6241d35983510143049943fc0d57937937122baf1b287862f9dc8590fc4c37df", + "https://bcr.bazel.build/modules/protobuf/29.0-rc3/MODULE.bazel": "33c2dfa286578573afc55a7acaea3cada4122b9631007c594bf0729f41c8de92", + "https://bcr.bazel.build/modules/protobuf/29.1/MODULE.bazel": "557c3457560ff49e122ed76c0bc3397a64af9574691cb8201b4e46d4ab2ecb95", + "https://bcr.bazel.build/modules/protobuf/3.19.0/MODULE.bazel": "6b5fbb433f760a99a22b18b6850ed5784ef0e9928a72668b66e4d7ccd47db9b0", + "https://bcr.bazel.build/modules/protobuf/32.1/MODULE.bazel": "89cd2866a9cb07fee9ff74c41ceace11554f32e0d849de4e23ac55515cfada4d", + "https://bcr.bazel.build/modules/protobuf/33.4/MODULE.bazel": "114775b816b38b6d0ca620450d6b02550c60ceedfdc8d9a229833b34a223dc42", + "https://bcr.bazel.build/modules/protobuf/33.4/source.json": "555f8686b4c7d6b5ba731fbea13bf656b4bfd9a7ff629c1d9d3f6e1d6155de79", + "https://bcr.bazel.build/modules/pybind11_bazel/2.11.1/MODULE.bazel": "88af1c246226d87e65be78ed49ecd1e6f5e98648558c14ce99176da041dc378e", + "https://bcr.bazel.build/modules/pybind11_bazel/2.12.0/MODULE.bazel": "e6f4c20442eaa7c90d7190d8dc539d0ab422f95c65a57cc59562170c58ae3d34", + "https://bcr.bazel.build/modules/pybind11_bazel/2.12.0/source.json": "6900fdc8a9e95866b8c0d4ad4aba4d4236317b5c1cd04c502df3f0d33afed680", + "https://bcr.bazel.build/modules/re2/2023-09-01/MODULE.bazel": "cb3d511531b16cfc78a225a9e2136007a48cf8a677e4264baeab57fe78a80206", + "https://bcr.bazel.build/modules/re2/2024-07-02.bcr.1/MODULE.bazel": "b4963dda9b31080be1905ef085ecd7dd6cd47c05c79b9cdf83ade83ab2ab271a", + "https://bcr.bazel.build/modules/re2/2024-07-02.bcr.1/source.json": "2ff292be6ef3340325ce8a045ecc326e92cbfab47c7cbab4bd85d28971b97ac4", + "https://bcr.bazel.build/modules/re2/2024-07-02/MODULE.bazel": "0eadc4395959969297cbcf31a249ff457f2f1d456228c67719480205aa306daa", + "https://bcr.bazel.build/modules/rules_android/0.1.1/MODULE.bazel": "48809ab0091b07ad0182defb787c4c5328bd3a278938415c00a7b69b50c4d3a8", + "https://bcr.bazel.build/modules/rules_android/0.1.1/source.json": "e6986b41626ee10bdc864937ffb6d6bf275bb5b9c65120e6137d56e6331f089e", + "https://bcr.bazel.build/modules/rules_apple/3.16.0/MODULE.bazel": "0d1caf0b8375942ce98ea944be754a18874041e4e0459401d925577624d3a54a", + "https://bcr.bazel.build/modules/rules_apple/4.1.0/MODULE.bazel": "76e10fd4a48038d3fc7c5dc6e63b7063bbf5304a2e3bd42edda6ec660eebea68", + "https://bcr.bazel.build/modules/rules_apple/4.1.0/source.json": "8ee81e1708756f81b343a5eb2b2f0b953f1d25c4ab3d4a68dc02754872e80715", + "https://bcr.bazel.build/modules/rules_cc/0.0.1/MODULE.bazel": "cb2aa0747f84c6c3a78dad4e2049c154f08ab9d166b1273835a8174940365647", + "https://bcr.bazel.build/modules/rules_cc/0.0.10/MODULE.bazel": "ec1705118f7eaedd6e118508d3d26deba2a4e76476ada7e0e3965211be012002", + "https://bcr.bazel.build/modules/rules_cc/0.0.13/MODULE.bazel": "0e8529ed7b323dad0775ff924d2ae5af7640b23553dfcd4d34344c7e7a867191", + "https://bcr.bazel.build/modules/rules_cc/0.0.15/MODULE.bazel": "6704c35f7b4a72502ee81f61bf88706b54f06b3cbe5558ac17e2e14666cd5dcc", + "https://bcr.bazel.build/modules/rules_cc/0.0.16/MODULE.bazel": "7661303b8fc1b4d7f532e54e9d6565771fea666fbdf839e0a86affcd02defe87", + "https://bcr.bazel.build/modules/rules_cc/0.0.17/MODULE.bazel": "2ae1d8f4238ec67d7185d8861cb0a2cdf4bc608697c331b95bf990e69b62e64a", + "https://bcr.bazel.build/modules/rules_cc/0.0.2/MODULE.bazel": "6915987c90970493ab97393024c156ea8fb9f3bea953b2f3ec05c34f19b5695c", + "https://bcr.bazel.build/modules/rules_cc/0.0.6/MODULE.bazel": "abf360251023dfe3efcef65ab9d56beefa8394d4176dd29529750e1c57eaa33f", + "https://bcr.bazel.build/modules/rules_cc/0.0.8/MODULE.bazel": "964c85c82cfeb6f3855e6a07054fdb159aced38e99a5eecf7bce9d53990afa3e", + "https://bcr.bazel.build/modules/rules_cc/0.0.9/MODULE.bazel": "836e76439f354b89afe6a911a7adf59a6b2518fafb174483ad78a2a2fde7b1c5", + "https://bcr.bazel.build/modules/rules_cc/0.1.1/MODULE.bazel": "2f0222a6f229f0bf44cd711dc13c858dad98c62d52bd51d8fc3a764a83125513", + "https://bcr.bazel.build/modules/rules_cc/0.1.2/MODULE.bazel": "557ddc3a96858ec0d465a87c0a931054d7dcfd6583af2c7ed3baf494407fd8d0", + "https://bcr.bazel.build/modules/rules_cc/0.1.5/MODULE.bazel": "88dfc9361e8b5ae1008ac38f7cdfd45ad738e4fa676a3ad67d19204f045a1fd8", + "https://bcr.bazel.build/modules/rules_cc/0.2.0/MODULE.bazel": "b5c17f90458caae90d2ccd114c81970062946f49f355610ed89bebf954f5783c", + "https://bcr.bazel.build/modules/rules_cc/0.2.13/MODULE.bazel": "eecdd666eda6be16a8d9dc15e44b5c75133405e820f620a234acc4b1fdc5aa37", + "https://bcr.bazel.build/modules/rules_cc/0.2.16/MODULE.bazel": "9242fa89f950c6ef7702801ab53922e99c69b02310c39fb6e62b2bd30df2a1d4", + "https://bcr.bazel.build/modules/rules_cc/0.2.17/MODULE.bazel": "1849602c86cb60da8613d2de887f9566a6d354a6df6d7009f9d04a14402f9a84", + "https://bcr.bazel.build/modules/rules_cc/0.2.18/MODULE.bazel": "4460ec36adc8f722a6a2a4ac9374cb91f2acebadaa93fc37966129afb3dece87", + "https://bcr.bazel.build/modules/rules_cc/0.2.18/source.json": "abad668ff2fd63ada1ac49bf386d37e27048b89a3465a6fd968bb832b00a09d3", + "https://bcr.bazel.build/modules/rules_cc/0.2.4/MODULE.bazel": "1ff1223dfd24f3ecf8f028446d4a27608aa43c3f41e346d22838a4223980b8cc", + "https://bcr.bazel.build/modules/rules_cc/0.2.8/MODULE.bazel": "f1df20f0bf22c28192a794f29b501ee2018fa37a3862a1a2132ae2940a23a642", + "https://bcr.bazel.build/modules/rules_distroless/0.9.4/MODULE.bazel": "e098aab7f99a64d254bd4f425db6d7fb0818e2362f028d1672964ee130615567", + "https://bcr.bazel.build/modules/rules_distroless/0.9.4/source.json": "f4cc35c677da04b354d652a4b5835a7ad1dbd3d53043fbce163a050ae2af85d1", + "https://bcr.bazel.build/modules/rules_foreign_cc/0.9.0/MODULE.bazel": "c9e8c682bf75b0e7c704166d79b599f93b72cfca5ad7477df596947891feeef6", + "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/MODULE.bazel": "40c97d1144356f52905566c55811f13b299453a14ac7769dfba2ac38192337a8", + "https://bcr.bazel.build/modules/rules_java/4.0.0/MODULE.bazel": "5a78a7ae82cd1a33cef56dc578c7d2a46ed0dca12643ee45edbb8417899e6f74", + "https://bcr.bazel.build/modules/rules_java/5.3.5/MODULE.bazel": "a4ec4f2db570171e3e5eb753276ee4b389bae16b96207e9d3230895c99644b86", + "https://bcr.bazel.build/modules/rules_java/6.0.0/MODULE.bazel": "8a43b7df601a7ec1af61d79345c17b31ea1fedc6711fd4abfd013ea612978e39", + "https://bcr.bazel.build/modules/rules_java/6.3.0/MODULE.bazel": "a97c7678c19f236a956ad260d59c86e10a463badb7eb2eda787490f4c969b963", + "https://bcr.bazel.build/modules/rules_java/6.4.0/MODULE.bazel": "e986a9fe25aeaa84ac17ca093ef13a4637f6107375f64667a15999f77db6c8f6", + "https://bcr.bazel.build/modules/rules_java/6.5.2/MODULE.bazel": "1d440d262d0e08453fa0c4d8f699ba81609ed0e9a9a0f02cd10b3e7942e61e31", + "https://bcr.bazel.build/modules/rules_java/7.10.0/MODULE.bazel": "530c3beb3067e870561739f1144329a21c851ff771cd752a49e06e3dc9c2e71a", + "https://bcr.bazel.build/modules/rules_java/7.12.2/MODULE.bazel": "579c505165ee757a4280ef83cda0150eea193eed3bef50b1004ba88b99da6de6", + "https://bcr.bazel.build/modules/rules_java/7.2.0/MODULE.bazel": "06c0334c9be61e6cef2c8c84a7800cef502063269a5af25ceb100b192453d4ab", + "https://bcr.bazel.build/modules/rules_java/7.3.2/MODULE.bazel": "50dece891cfdf1741ea230d001aa9c14398062f2b7c066470accace78e412bc2", + "https://bcr.bazel.build/modules/rules_java/7.6.1/MODULE.bazel": "2f14b7e8a1aa2f67ae92bc69d1ec0fa8d9f827c4e17ff5e5f02e91caa3b2d0fe", + "https://bcr.bazel.build/modules/rules_java/8.3.2/MODULE.bazel": "7336d5511ad5af0b8615fdc7477535a2e4e723a357b6713af439fe8cf0195017", + "https://bcr.bazel.build/modules/rules_java/8.5.1/MODULE.bazel": "d8a9e38cc5228881f7055a6079f6f7821a073df3744d441978e7a43e20226939", + "https://bcr.bazel.build/modules/rules_java/8.6.0/MODULE.bazel": "9c064c434606d75a086f15ade5edb514308cccd1544c2b2a89bbac4310e41c71", + "https://bcr.bazel.build/modules/rules_java/8.6.1/MODULE.bazel": "f4808e2ab5b0197f094cabce9f4b006a27766beb6a9975931da07099560ca9c2", + "https://bcr.bazel.build/modules/rules_java/8.8.0/MODULE.bazel": "de589d0880911ac007abd521b9f0ddcd8b0dbd05c8553e6f8124a050b83acf7d", + "https://bcr.bazel.build/modules/rules_java/9.1.0/MODULE.bazel": "ee63f27e36a3fada80342869361182f120a9819c74320e8e65b1e04ba0cd7a9d", + "https://bcr.bazel.build/modules/rules_java/9.1.0/source.json": "da589573c1dee2c9ac4a568b301269a2e8191110ff0345c1a959fa7ea6c4dfd6", + "https://bcr.bazel.build/modules/rules_jvm_external/4.4.2/MODULE.bazel": "a56b85e418c83eb1839819f0b515c431010160383306d13ec21959ac412d2fe7", + "https://bcr.bazel.build/modules/rules_jvm_external/5.1/MODULE.bazel": "33f6f999e03183f7d088c9be518a63467dfd0be94a11d0055fe2d210f89aa909", + "https://bcr.bazel.build/modules/rules_jvm_external/5.2/MODULE.bazel": "d9351ba35217ad0de03816ef3ed63f89d411349353077348a45348b096615036", + "https://bcr.bazel.build/modules/rules_jvm_external/5.3/MODULE.bazel": "bf93870767689637164657731849fb887ad086739bd5d360d90007a581d5527d", + "https://bcr.bazel.build/modules/rules_jvm_external/6.1/MODULE.bazel": "75b5fec090dbd46cf9b7d8ea08cf84a0472d92ba3585b476f44c326eda8059c4", + "https://bcr.bazel.build/modules/rules_jvm_external/6.3/MODULE.bazel": "c998e060b85f71e00de5ec552019347c8bca255062c990ac02d051bb80a38df0", + "https://bcr.bazel.build/modules/rules_jvm_external/6.7/MODULE.bazel": "e717beabc4d091ecb2c803c2d341b88590e9116b8bf7947915eeb33aab4f96dd", + "https://bcr.bazel.build/modules/rules_jvm_external/6.7/source.json": "5426f412d0a7fc6b611643376c7e4a82dec991491b9ce5cb1cfdd25fe2e92be4", + "https://bcr.bazel.build/modules/rules_kotlin/1.9.0/MODULE.bazel": "ef85697305025e5a61f395d4eaede272a5393cee479ace6686dba707de804d59", + "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/MODULE.bazel": "d269a01a18ee74d0335450b10f62c9ed81f2321d7958a2934e44272fe82dcef3", + "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/source.json": "2faa4794364282db7c06600b7e5e34867a564ae91bda7cae7c29c64e9466b7d5", + "https://bcr.bazel.build/modules/rules_license/0.0.3/MODULE.bazel": "627e9ab0247f7d1e05736b59dbb1b6871373de5ad31c3011880b4133cafd4bd0", + "https://bcr.bazel.build/modules/rules_license/0.0.7/MODULE.bazel": "088fbeb0b6a419005b89cf93fe62d9517c0a2b8bb56af3244af65ecfe37e7d5d", + "https://bcr.bazel.build/modules/rules_license/1.0.0/MODULE.bazel": "a7fda60eefdf3d8c827262ba499957e4df06f659330bbe6cdbdb975b768bb65c", + "https://bcr.bazel.build/modules/rules_license/1.0.0/source.json": "a52c89e54cc311196e478f8382df91c15f7a2bfdf4c6cd0e2675cc2ff0b56efb", + "https://bcr.bazel.build/modules/rules_pkg/0.7.0/MODULE.bazel": "df99f03fc7934a4737122518bb87e667e62d780b610910f0447665a7e2be62dc", + "https://bcr.bazel.build/modules/rules_pkg/1.0.1/MODULE.bazel": "5b1df97dbc29623bccdf2b0dcd0f5cb08e2f2c9050aab1092fd39a41e82686ff", + "https://bcr.bazel.build/modules/rules_pkg/1.1.0/MODULE.bazel": "9db8031e71b6ef32d1846106e10dd0ee2deac042bd9a2de22b4761b0c3036453", + "https://bcr.bazel.build/modules/rules_pkg/1.1.0/source.json": "fef768df13a92ce6067e1cd0cdc47560dace01354f1d921cfb1d632511f7d608", + "https://bcr.bazel.build/modules/rules_proto/4.0.0/MODULE.bazel": "a7a7b6ce9bee418c1a760b3d84f83a299ad6952f9903c67f19e4edd964894e06", + "https://bcr.bazel.build/modules/rules_proto/5.3.0-21.7/MODULE.bazel": "e8dff86b0971688790ae75528fe1813f71809b5afd57facb44dad9e8eca631b7", + "https://bcr.bazel.build/modules/rules_proto/6.0.0-rc1/MODULE.bazel": "1e5b502e2e1a9e825eef74476a5a1ee524a92297085015a052510b09a1a09483", + "https://bcr.bazel.build/modules/rules_proto/6.0.2/MODULE.bazel": "ce916b775a62b90b61888052a416ccdda405212b6aaeb39522f7dc53431a5e73", + "https://bcr.bazel.build/modules/rules_proto/7.0.2/MODULE.bazel": "bf81793bd6d2ad89a37a40693e56c61b0ee30f7a7fdbaf3eabbf5f39de47dea2", + "https://bcr.bazel.build/modules/rules_proto/7.1.0/MODULE.bazel": "002d62d9108f75bb807cd56245d45648f38275cb3a99dcd45dfb864c5d74cb96", + "https://bcr.bazel.build/modules/rules_proto/7.1.0/source.json": "39f89066c12c24097854e8f57ab8558929f9c8d474d34b2c00ac04630ad8940e", + "https://bcr.bazel.build/modules/rules_python/0.10.2/MODULE.bazel": "cc82bc96f2997baa545ab3ce73f196d040ffb8756fd2d66125a530031cd90e5f", + "https://bcr.bazel.build/modules/rules_python/0.23.1/MODULE.bazel": "49ffccf0511cb8414de28321f5fcf2a31312b47c40cc21577144b7447f2bf300", + "https://bcr.bazel.build/modules/rules_python/0.25.0/MODULE.bazel": "72f1506841c920a1afec76975b35312410eea3aa7b63267436bfb1dd91d2d382", + "https://bcr.bazel.build/modules/rules_python/0.28.0/MODULE.bazel": "cba2573d870babc976664a912539b320cbaa7114cd3e8f053c720171cde331ed", + "https://bcr.bazel.build/modules/rules_python/0.31.0/MODULE.bazel": "93a43dc47ee570e6ec9f5779b2e64c1476a6ce921c48cc9a1678a91dd5f8fd58", + "https://bcr.bazel.build/modules/rules_python/0.33.2/MODULE.bazel": "3e036c4ad8d804a4dad897d333d8dce200d943df4827cb849840055be8d2e937", + "https://bcr.bazel.build/modules/rules_python/0.4.0/MODULE.bazel": "9208ee05fd48bf09ac60ed269791cf17fb343db56c8226a720fbb1cdf467166c", + "https://bcr.bazel.build/modules/rules_python/1.0.0/MODULE.bazel": "898a3d999c22caa585eb062b600f88654bf92efb204fa346fb55f6f8edffca43", + "https://bcr.bazel.build/modules/rules_python/1.3.0/MODULE.bazel": "8361d57eafb67c09b75bf4bbe6be360e1b8f4f18118ab48037f2bd50aa2ccb13", + "https://bcr.bazel.build/modules/rules_python/1.4.1/MODULE.bazel": "8991ad45bdc25018301d6b7e1d3626afc3c8af8aaf4bc04f23d0b99c938b73a6", + "https://bcr.bazel.build/modules/rules_python/1.6.0/MODULE.bazel": "7e04ad8f8d5bea40451cf80b1bd8262552aa73f841415d20db96b7241bd027d8", + "https://bcr.bazel.build/modules/rules_python/1.7.0/MODULE.bazel": "d01f995ecd137abf30238ad9ce97f8fc3ac57289c8b24bd0bf53324d937a14f8", + "https://bcr.bazel.build/modules/rules_python/1.9.0/MODULE.bazel": "afc3a05f29f09f2d3ee95ad99a145250dab41a2b2d8d6f82cc91936b3213282c", + "https://bcr.bazel.build/modules/rules_python/1.9.0/source.json": "3921ea0b65298d51aead5b9e4a82203d7be9b5918619b58b53f1c259f4e63169", + "https://bcr.bazel.build/modules/rules_shell/0.2.0/MODULE.bazel": "fda8a652ab3c7d8fee214de05e7a9916d8b28082234e8d2c0094505c5268ed3c", + "https://bcr.bazel.build/modules/rules_shell/0.3.0/MODULE.bazel": "de4402cd12f4cc8fda2354fce179fdb068c0b9ca1ec2d2b17b3e21b24c1a937b", + "https://bcr.bazel.build/modules/rules_shell/0.4.1/MODULE.bazel": "00e501db01bbf4e3e1dd1595959092c2fadf2087b2852d3f553b5370f5633592", + "https://bcr.bazel.build/modules/rules_shell/0.6.1/MODULE.bazel": "72e76b0eea4e81611ef5452aa82b3da34caca0c8b7b5c0c9584338aa93bae26b", + "https://bcr.bazel.build/modules/rules_shell/0.6.1/source.json": "20ec05cd5e592055e214b2da8ccb283c7f2a421ea0dc2acbf1aa792e11c03d0c", + "https://bcr.bazel.build/modules/rules_swift/1.16.0/MODULE.bazel": "4a09f199545a60d09895e8281362b1ff3bb08bbde69c6fc87aff5b92fcc916ca", + "https://bcr.bazel.build/modules/rules_swift/2.1.1/MODULE.bazel": "494900a80f944fc7aa61500c2073d9729dff0b764f0e89b824eb746959bc1046", + "https://bcr.bazel.build/modules/rules_swift/2.4.0/MODULE.bazel": "1639617eb1ede28d774d967a738b4a68b0accb40650beadb57c21846beab5efd", + "https://bcr.bazel.build/modules/rules_swift/3.1.2/MODULE.bazel": "72c8f5cf9d26427cee6c76c8e3853eb46ce6b0412a081b2b6db6e8ad56267400", + "https://bcr.bazel.build/modules/rules_swift/3.1.2/source.json": "e85761f3098a6faf40b8187695e3de6d97944e98abd0d8ce579cb2daf6319a66", + "https://bcr.bazel.build/modules/stardoc/0.5.1/MODULE.bazel": "1a05d92974d0c122f5ccf09291442580317cdd859f07a8655f1db9a60374f9f8", + "https://bcr.bazel.build/modules/stardoc/0.5.3/MODULE.bazel": "c7f6948dae6999bf0db32c1858ae345f112cacf98f174c7a8bb707e41b974f1c", + "https://bcr.bazel.build/modules/stardoc/0.5.6/MODULE.bazel": "c43dabc564990eeab55e25ed61c07a1aadafe9ece96a4efabb3f8bf9063b71ef", + "https://bcr.bazel.build/modules/stardoc/0.6.2/MODULE.bazel": "7060193196395f5dd668eda046ccbeacebfd98efc77fed418dbe2b82ffaa39fd", + "https://bcr.bazel.build/modules/stardoc/0.7.0/MODULE.bazel": "05e3d6d30c099b6770e97da986c53bd31844d7f13d41412480ea265ac9e8079c", + "https://bcr.bazel.build/modules/stardoc/0.7.1/MODULE.bazel": "3548faea4ee5dda5580f9af150e79d0f6aea934fc60c1cc50f4efdd9420759e7", + "https://bcr.bazel.build/modules/stardoc/0.7.2/MODULE.bazel": "fc152419aa2ea0f51c29583fab1e8c99ddefd5b3778421845606ee628629e0e5", + "https://bcr.bazel.build/modules/stardoc/0.7.2/source.json": "58b029e5e901d6802967754adf0a9056747e8176f017cfe3607c0851f4d42216", + "https://bcr.bazel.build/modules/swift_argument_parser/1.3.1.1/MODULE.bazel": "5e463fbfba7b1701d957555ed45097d7f984211330106ccd1352c6e0af0dcf91", + "https://bcr.bazel.build/modules/swift_argument_parser/1.3.1.2/MODULE.bazel": "75aab2373a4bbe2a1260b9bf2a1ebbdbf872d3bd36f80bff058dccd82e89422f", + "https://bcr.bazel.build/modules/swift_argument_parser/1.3.1.2/source.json": "5fba48bbe0ba48761f9e9f75f92876cafb5d07c0ce059cc7a8027416de94a05b", + "https://bcr.bazel.build/modules/tar.bzl/0.10.1/MODULE.bazel": "bf5fda5b5ccef8c3c4a5f4886144377386e0baa382972f257acb42dcf40ea908", + "https://bcr.bazel.build/modules/tar.bzl/0.10.1/source.json": "3f1beb35acf53c270a9de493cdc775a985551d7069cfcf24e136b42f683bbb10", + "https://bcr.bazel.build/modules/tar.bzl/0.2.1/MODULE.bazel": "52d1c00a80a8cc67acbd01649e83d8dd6a9dc426a6c0b754a04fe8c219c76468", + "https://bcr.bazel.build/modules/tar.bzl/0.5.1/MODULE.bazel": "7c2eb3dcfc53b0f3d6f9acdfd911ca803eaf92aadf54f8ca6e4c1f3aee288351", + "https://bcr.bazel.build/modules/tar.bzl/0.6.0/MODULE.bazel": "a3584b4edcfafcabd9b0ef9819808f05b372957bbdff41601429d5fd0aac2e7c", + "https://bcr.bazel.build/modules/toml.bzl/0.3.0/MODULE.bazel": "5016e5dd1ad2200e119a4b28b2b3935e276c4b480f2fe3e952bea7eeba88f578", + "https://bcr.bazel.build/modules/toml.bzl/0.3.0/source.json": "0cf7c878c419b37ddb55f3dd93dd7c0c409bd7c4efacb3da504e0748780b2fa9", + "https://bcr.bazel.build/modules/upb/0.0.0-20220923-a547704/MODULE.bazel": "7298990c00040a0e2f121f6c32544bab27d4452f80d9ce51349b1a28f3005c43", + "https://bcr.bazel.build/modules/with_cfg.bzl/0.14.6/MODULE.bazel": "6b6c543e415d2a502954766e50c6a6144a131687f2751b62157a9250e2b04982", + "https://bcr.bazel.build/modules/with_cfg.bzl/0.14.6/source.json": "12363ac76d821f6c7dabfebbd673615391da06e2e33f576402d31a96a7b56532", + "https://bcr.bazel.build/modules/yq.bzl/0.1.1/MODULE.bazel": "9039681f9bcb8958ee2c87ffc74bdafba9f4369096a2b5634b88abc0eaefa072", + "https://bcr.bazel.build/modules/yq.bzl/0.3.1/MODULE.bazel": "9bcb7151b3cd4681b89d350530eaf7b45e32a44dda94843b8932b0cb1cd4594a", + "https://bcr.bazel.build/modules/yq.bzl/0.3.1/source.json": "f0b0f204a2a6b0e34b4c9541efe8c04f2ef1af65948daa784eccea738b21dbd2", + "https://bcr.bazel.build/modules/zlib/1.2.11/MODULE.bazel": "07b389abc85fdbca459b69e2ec656ae5622873af3f845e1c9d80fe179f3effa0", + "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/MODULE.bazel": "eec517b5bbe5492629466e11dae908d043364302283de25581e3eb944326c4ca", + "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/source.json": "22bc55c47af97246cfc093d0acf683a7869377de362b5d1c552c2c2e16b7a806", + "https://bcr.bazel.build/modules/zlib/1.3.1/MODULE.bazel": "751c9940dcfe869f5f7274e1295422a34623555916eb98c174c1e945594bf198" + }, + "selectedYankedVersions": {}, + "moduleExtensions": { + "@@aspect_tools_telemetry+//:extension.bzl%telemetry": { + "general": { + "bzlTransitiveDigest": "cl5A2O84vDL6Tt+Qga8FCj1DUDGqn+e7ly5rZ+4xvcc=", + "usagesDigest": "kqQBy77VGMZA0qEiCyGKY3JKPhKrjzzyMVYd0SUIw30=", + "recordedInputs": [ + "REPO_MAPPING:aspect_tools_telemetry+,bazel_lib bazel_lib+", + "REPO_MAPPING:aspect_tools_telemetry+,bazel_skylib bazel_skylib+" + ], + "generatedRepoSpecs": { + "aspect_tools_telemetry_report": { + "repoRuleId": "@@aspect_tools_telemetry+//:extension.bzl%tel_repository", + "attributes": { + "deps": { + "aspect_rules_py": "2.0.0-alpha.4", + "aspect_tools_telemetry": "0.3.3" + } + } + } + } + } + }, + "@@rules_kotlin+//src/main/starlark/core/repositories:bzlmod_setup.bzl%rules_kotlin_extensions": { + "general": { + "bzlTransitiveDigest": "+Kp6j204mBZ3mxlIDDR0gBoP45BZ4jYRhRAcB8sU0qc=", + "usagesDigest": "QI2z8ZUR+mqtbwsf2fLqYdJAkPOHdOV+tF2yVAUgRzw=", + "recordedInputs": [ + "REPO_MAPPING:rules_kotlin+,bazel_tools bazel_tools" + ], + "generatedRepoSpecs": { + "com_github_jetbrains_kotlin_git": { + "repoRuleId": "@@rules_kotlin+//src/main/starlark/core/repositories:compiler.bzl%kotlin_compiler_git_repository", + "attributes": { + "urls": [ + "https://github.com/JetBrains/kotlin/releases/download/v1.9.23/kotlin-compiler-1.9.23.zip" + ], + "sha256": "93137d3aab9afa9b27cb06a824c2324195c6b6f6179d8a8653f440f5bd58be88" + } + }, + "com_github_jetbrains_kotlin": { + "repoRuleId": "@@rules_kotlin+//src/main/starlark/core/repositories:compiler.bzl%kotlin_capabilities_repository", + "attributes": { + "git_repository_name": "com_github_jetbrains_kotlin_git", + "compiler_version": "1.9.23" + } + }, + "com_github_google_ksp": { + "repoRuleId": "@@rules_kotlin+//src/main/starlark/core/repositories:ksp.bzl%ksp_compiler_plugin_repository", + "attributes": { + "urls": [ + "https://github.com/google/ksp/releases/download/1.9.23-1.0.20/artifacts.zip" + ], + "sha256": "ee0618755913ef7fd6511288a232e8fad24838b9af6ea73972a76e81053c8c2d", + "strip_version": "1.9.23-1.0.20" + } + }, + "com_github_pinterest_ktlint": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_file", + "attributes": { + "sha256": "01b2e0ef893383a50dbeb13970fe7fa3be36ca3e83259e01649945b09d736985", + "urls": [ + "https://github.com/pinterest/ktlint/releases/download/1.3.0/ktlint" + ], + "executable": true + } + }, + "rules_android": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "sha256": "cd06d15dd8bb59926e4d65f9003bfc20f9da4b2519985c27e190cddc8b7a7806", + "strip_prefix": "rules_android-0.1.1", + "urls": [ + "https://github.com/bazelbuild/rules_android/archive/v0.1.1.zip" + ] + } + } + } + } + }, + "@@rules_python+//python/uv:uv.bzl%uv": { + "general": { + "bzlTransitiveDigest": "yG9F6L2IZXKRbD/aIUa6sU7uITLUTBKOMWPbIvl1VdM=", + "usagesDigest": "6MjoD3H+netDdhklgMWks3NARpHVXxy8kfsMe9XXPa8=", + "recordedInputs": [ + "REPO_MAPPING:rules_python+,bazel_tools bazel_tools", + "REPO_MAPPING:rules_python+,platforms platforms" + ], + "generatedRepoSpecs": { + "uv": { + "repoRuleId": "@@rules_python+//python/uv/private:uv_toolchains_repo.bzl%uv_toolchains_repo", + "attributes": { + "toolchain_type": "'@@rules_python+//python/uv:uv_toolchain_type'", + "toolchain_names": [ + "none" + ], + "toolchain_implementations": { + "none": "'@@rules_python+//python:none'" + }, + "toolchain_compatible_with": { + "none": [ + "@platforms//:incompatible" + ] + }, + "toolchain_target_settings": {} + } + } + } + } + }, + "@@yq.bzl+//yq:extensions.bzl%yq": { + "general": { + "bzlTransitiveDigest": "61Uz+o5PnlY0jJfPZEUNqsKxnM/UCLeWsn5VVCc8u5Y=", + "usagesDigest": "oAQ5Hp6H1wlr4abmhh+iBqk43oSfdXw+++tKd5PKWHE=", + "recordedInputs": [], + "generatedRepoSpecs": { + "yq_darwin_amd64": { + "repoRuleId": "@@yq.bzl+//yq/toolchain:platforms.bzl%yq_platform_repo", + "attributes": { + "platform": "darwin_amd64", + "version": "4.45.1" + } + }, + "yq_darwin_arm64": { + "repoRuleId": "@@yq.bzl+//yq/toolchain:platforms.bzl%yq_platform_repo", + "attributes": { + "platform": "darwin_arm64", + "version": "4.45.1" + } + }, + "yq_linux_amd64": { + "repoRuleId": "@@yq.bzl+//yq/toolchain:platforms.bzl%yq_platform_repo", + "attributes": { + "platform": "linux_amd64", + "version": "4.45.1" + } + }, + "yq_linux_arm64": { + "repoRuleId": "@@yq.bzl+//yq/toolchain:platforms.bzl%yq_platform_repo", + "attributes": { + "platform": "linux_arm64", + "version": "4.45.1" + } + }, + "yq_linux_s390x": { + "repoRuleId": "@@yq.bzl+//yq/toolchain:platforms.bzl%yq_platform_repo", + "attributes": { + "platform": "linux_s390x", + "version": "4.45.1" + } + }, + "yq_linux_riscv64": { + "repoRuleId": "@@yq.bzl+//yq/toolchain:platforms.bzl%yq_platform_repo", + "attributes": { + "platform": "linux_riscv64", + "version": "4.45.1" + } + }, + "yq_linux_ppc64le": { + "repoRuleId": "@@yq.bzl+//yq/toolchain:platforms.bzl%yq_platform_repo", + "attributes": { + "platform": "linux_ppc64le", + "version": "4.45.1" + } + }, + "yq_windows_amd64": { + "repoRuleId": "@@yq.bzl+//yq/toolchain:platforms.bzl%yq_platform_repo", + "attributes": { + "platform": "windows_amd64", + "version": "4.45.1" + } + }, + "yq_toolchains": { + "repoRuleId": "@@yq.bzl+//yq/toolchain:toolchain.bzl%yq_toolchains_repo", + "attributes": { + "user_repository_name": "yq" + } + } + } + } + } + }, + "facts": { + "@@aspect_rules_py+//py:extensions.bzl%python_interpreters": { + "release_index_v1_20241002_https://github.com/astral-sh/python-build-standalone/releases/download": { + "3.10/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.10.15+20241002-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.10.15", + "sha256": "bcfdf8235cd4f84ca280f33a17030e65ba23e7905e70a8ed2ed2c83229ad136f" + }, + "3.10/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.10.15+20241002-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.10.15", + "sha256": "2e364a47cdbfcfaf56122b7656a3e8a7163babbda4f6bb6165aa644cbc65bd57" + }, + "3.10/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.10.15+20241002-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.10.15", + "sha256": "814561a8addee5f56a19223ecdd879a22b82d631bd5704eac7b2e98287e797a8" + }, + "3.10/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.10.15+20241002-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.10.15", + "sha256": "35678c2ba6d7aff56ca96f06ca735fe4bd09e4a5d3d40f552d76a1653c80a123" + }, + "3.10/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.10.15+20241002-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.10.15", + "sha256": "422fb92c310f030b05ca8e59a256c72ffde38f03382a006284d9e5e2a7b646f5" + }, + "3.10/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.10.15+20241002-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.10.15", + "sha256": "f17cba68a55dcd386be4cbb0002cf3037718019fc1585b2ff9a32efd3283557d" + }, + "3.10/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.10.15+20241002-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.10.15", + "sha256": "7b2baf761282600359d43e6f14b01437a8d0e517ba3a28f50688806dd8897b11" + }, + "3.11/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.11.10+20241002-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.11.10", + "sha256": "540225743ca9ca04d7e0de520e211ecafb379677c49fba4b89334e7248219cb2" + }, + "3.11/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.11.10+20241002-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.11.10", + "sha256": "047e687b561f8e38740819cc3e112e83ae349927cca846921a1c301e5d9cc873" + }, + "3.11/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.11.10+20241002-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.11.10", + "sha256": "d9e75d5028c8975c158f4b9c01ef820480249b3401dbde755c0f344e15feebf5" + }, + "3.11/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.11.10+20241002-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.11.10", + "sha256": "f498693f03fd672a4dc581ef0e1101102d33964352c35ecff21686a8d00744c9" + }, + "3.11/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.11.10+20241002-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.11.10", + "sha256": "d71cde066b614903e9f243c4babd179e7e978fcfa95702355566463e623abe6c" + }, + "3.11/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.11.10+20241002-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.11.10", + "sha256": "9c0197e72b2dd1ebf56eb562cb7a078052b4ab71d5666cd3be3b6e75db42c79e" + }, + "3.11/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.11.10+20241002-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.11.10", + "sha256": "fb86dce628d2008eefd3550193839fb9f283f5f6c25a09c8b676713ff4757156" + }, + "3.12/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.12.7+20241002-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.12.7", + "sha256": "5a9cdbb8536839a83edae3e41eb44161b640d78181fec083e07c668ba796a875" + }, + "3.12/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.12.7+20241002-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.12.7", + "sha256": "5481ca52e7ac8685c1e9d4e804a66e5c928879e0f44799aa6934735f66266643" + }, + "3.12/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.12.7+20241002-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.12.7", + "sha256": "8c62920e2fef022fc49d58cc999c77ea45318f96a5a5c0ba3bb155d33732d7f3" + }, + "3.12/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.12.7+20241002-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.12.7", + "sha256": "60eaf2c9a63926f5edfe7a0ecf4b2fbb37de6764f0c0100be245d098e3995da7" + }, + "3.12/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.12.7+20241002-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.12.7", + "sha256": "1c74dd0499ef7d993d8942ebe6692c90c50d09719e0335f8e210b91277f8e7c0" + }, + "3.12/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.12.7+20241002-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.12.7", + "sha256": "04ffccbbb1beedd0bc80347c061fe527833001681ee543c3ba85dac5134ed500" + }, + "3.12/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.12.7+20241002-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.12.7", + "sha256": "d4a8f2b3e422089475bcd6f2b855c9ed0e666af2de4f19df7c764362eb8c4aca" + }, + "3.13/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.13.0rc3+20241002-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.13.0rc3", + "sha256": "577e846eaf0a27342b3f80b5f292eb292b0eb6a9df3a0fa0c5925e86cfe046a3" + }, + "3.13/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.13.0rc3+20241002-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.13.0rc3", + "sha256": "48974ab9b4a6990b17e6740393492fc5557e6acc4ab02be9d9543e0e506e48a6" + }, + "3.13/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.13.0rc3+20241002-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.13.0rc3", + "sha256": "fa5e8195fa7a6b6d4df0bc92b36d38836b72c4f5fb41978d495abe5a454fed67" + }, + "3.13/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.13.0rc3+20241002-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.13.0rc3", + "sha256": "81a01923b25a4b2b68f517b07a4a4a9186d873e6518f060e4a004e77d7094687" + }, + "3.13/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.13.0rc3+20241002-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.13.0rc3", + "sha256": "319ecb727317868c4f3bfecd480f216b38275f5373f72c022d255318b650ebe2" + }, + "3.13/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.13.0rc3+20241002-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.13.0rc3", + "sha256": "a4b4e0a79b53938db050daf7f78dd09faf49d1e29dbba6cac87cf857c0a51fb4" + }, + "3.13/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.13.0rc3+20241002-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.13.0rc3", + "sha256": "56fac98fb5ed39f67cd7c0ce6e503a1e551ce727dc46796a0f16c09d26e845aa" + }, + "3.8/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.8.20+20241002-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.8.20", + "sha256": "2ddfc04bdb3e240f30fb782fa1deec6323799d0e857e0b63fa299218658fd3d4" + }, + "3.8/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.8.20+20241002-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.8.20", + "sha256": "9d8798f9e79e0fc0f36fcb95bfa28a1023407d51a8ea5944b4da711f1f75f1ed" + }, + "3.8/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.8.20+20241002-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.8.20", + "sha256": "06988218600fe3e2c02c3182d5629a1d4e596b3771ab32a9e99756c5904b5fac" + }, + "3.8/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.8.20+20241002-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.8.20", + "sha256": "68d060cd373255d2ca5b8b3441363d5aa7cc45b0c11bbccf52b1717c2b5aa8bb" + }, + "3.8/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.8.20+20241002-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.8.20", + "sha256": "41b6709fec9c56419b7de1940d1f87fa62045aff81734480672dcb807eedc47e" + }, + "3.8/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.8.20+20241002-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.8.20", + "sha256": "285e141c36f88b2e9357654c5f77d1f8fb29cc25132698fe35bb30d787f38e87" + }, + "3.8/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.8.20+20241002-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.8.20", + "sha256": "ea8d7f9dd35815cf88f5ed257b5d0206d97df5a9500f719b6a6031b8c7071db8" + }, + "3.9/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.9.20+20241002-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.9.20", + "sha256": "dc5f3b4c54deea7a42479b3f81b1c1b3a330f721aea3aff7df9833567bbfa8ea" + }, + "3.9/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.9.20+20241002-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.9.20", + "sha256": "0d84fa0884e843828312a1fcbfd8756abe3d6cf3c27086f79cd7352bad13ac4c" + }, + "3.9/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.9.20+20241002-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.9.20", + "sha256": "bd2c7cf4d7eba224ada44dfbccf5248d313ba5072462c71aa753c824354704f3" + }, + "3.9/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.9.20+20241002-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.9.20", + "sha256": "a07be8fddd5f6f6a0db7abd16f2b2a8a94a891e54091e4f45b64e822597e4d7d" + }, + "3.9/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.9.20+20241002-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.9.20", + "sha256": "94000af8e9d9f5aba6d2325963a6b3403afbf310f6790edff3dfe8becd8197de" + }, + "3.9/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.9.20+20241002-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.9.20", + "sha256": "fec849569158e5e46610621d7da91b02dca2cc5f66dd49cc0f85d7469c8f5a84" + }, + "3.9/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.9.20+20241002-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.9.20", + "sha256": "31f5e329f14ac8b79527712c4265edfea1cb6dff4bb04cf8c51cd809290e136c" + } + }, + "release_index_v1_20251031_https://github.com/astral-sh/python-build-standalone/releases/download": { + "3.10/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.10.19+20251031-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.10.19", + "sha256": "43bda24c2fc073bc308bf631203b917a72640d59b59fdad4ba14503d84727012" + }, + "3.10/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.10.19+20251031-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.10.19", + "sha256": "f77a8a8aa77f3f943126fa9215a25309da4bf20398fc8f4b4eec54b5fc7570ef" + }, + "3.10/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.10.19+20251031-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.10.19", + "sha256": "9b9deba652d98857ae99bd11b05fb560144aafbd9b9e8e01c8c6d56577a06a4d" + }, + "3.10/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.10.19+20251031-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.10.19", + "sha256": "0240edca85508661e20bb69562686965c85b8328727332d9ebfd57cceb7fb372" + }, + "3.10/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.10.19+20251031-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.10.19", + "sha256": "76c12e633c09c2a790f8a958a55df4495527e0718d1875310c836e757c0c7b55" + }, + "3.10/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.10.19+20251031-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.10.19", + "sha256": "cfa08a4caf2df1b43551b843c052d6a8814e2ea0c97268b021f0423646c244c3" + }, + "3.10/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.10.19+20251031-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.10.19", + "sha256": "fb1caac917d7b6497bb6f5950da5f1e48d05c43a498948dd97f85760c4382d9f" + }, + "3.10/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.10.19+20251031-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.10.19", + "sha256": "ba85013ed5ac7733fc6840168cc33ed19e9959b363dc80227d54f8fd9c92c0f4" + }, + "3.11/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.11.14+20251031-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.11.14", + "sha256": "6de5572b33c65af1c9b7caf00ec593fb04cffb7e14fa393a98261bb9bc464713" + }, + "3.11/aarch64-pc-windows-msvc/install_only": { + "filename": "cpython-3.11.14+20251031-aarch64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.11.14", + "sha256": "38d0d1466561e15965e8d2c20f5e5be649598f55c761ecab553d087fbd217337" + }, + "3.11/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.11.14+20251031-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.11.14", + "sha256": "510edb027527413c4249256194cb8ad2590b52dd93f7123b4cb341aff5d05894" + }, + "3.11/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.11.14+20251031-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.11.14", + "sha256": "27609ec2b0c6172d5d9f502115a6d48c20ee0a578bf5b0470cd1090be95c22aa" + }, + "3.11/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.11.14+20251031-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.11.14", + "sha256": "b4341ef60bc157f992a0d171f1be4e4c42dcfc537f3562f72aa7f1f9561935e0" + }, + "3.11/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.11.14+20251031-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.11.14", + "sha256": "4891cbf34e8652b7bd1054b9502395e4b7e048e2e517c040fbf6c8297cb954d6" + }, + "3.11/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.11.14+20251031-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.11.14", + "sha256": "5223b83ed9e2aa5e9e17d2ebcf767956e998876339b9cde1980a47e9d4655fb6" + }, + "3.11/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.11.14+20251031-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.11.14", + "sha256": "60f0bd473d861cc45d3401d9914e47ccb9fa037f88a91879ed517a62042b8477" + }, + "3.11/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.11.14+20251031-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.11.14", + "sha256": "25e82d1e85b90a8ab724ee633a1811b1921797f5c25ee69c6595052371b91a87" + }, + "3.12/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.12.12+20251031-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.12.12", + "sha256": "5e110cb821d2eb8246065d3b46faa655180c976c4e17250f7883c634a629bc63" + }, + "3.12/aarch64-pc-windows-msvc/install_only": { + "filename": "cpython-3.12.12+20251031-aarch64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.12.12", + "sha256": "b190fed7c2b0f6e1010f554a0d1fd191c0754c4c0718e69d9d795ae559613780" + }, + "3.12/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.12.12+20251031-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.12.12", + "sha256": "81b644d166e0bfb918615af8a2363f8fcf26eccdcc60a5334b6a62c088470bac" + }, + "3.12/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.12.12+20251031-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.12.12", + "sha256": "fc423af42f4eb454c99779d9eedc619141606572da3851f7980a8da719f0f8db" + }, + "3.12/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.12.12+20251031-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.12.12", + "sha256": "7d333e58a53edb1ba3c85bb35dc718ea3e599d0f6b58a0cbef35b2d8184a763e" + }, + "3.12/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.12.12+20251031-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.12.12", + "sha256": "687052a046d33be49dc95dd671816709067cf6176ed36c93ea61b1fe0b883b0f" + }, + "3.12/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.12.12+20251031-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.12.12", + "sha256": "cff398b3f520c442a1b085dd347126c10c1b03f01ccc0decd8c897a687e893f1" + }, + "3.12/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.12.12+20251031-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.12.12", + "sha256": "80c3882f14e15cef8260ef5257d198e8f4371ca265887431d939e0d561de3253" + }, + "3.12/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.12.12+20251031-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.12.12", + "sha256": "0a461330b9b89f2ea3088dde10d7a3f96aa65897b7c5ce2404fa3b5c4b8daa14" + }, + "3.13/aarch64-apple-darwin/freethreaded": { + "filename": "cpython-3.13.9+20251031-aarch64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.13.9", + "sha256": "eae1272a72ccce601590a10a9ca2a58199b5fcdf022aa603a527e3e2a04de9bc" + }, + "3.13/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.13.9+20251031-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.13.9", + "sha256": "1f3568d17383426d52350c2ef7c93c1a5a043198b860cb05e5d19b35f9c25cef" + }, + "3.13/aarch64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.13.9+20251031-aarch64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.13.9", + "sha256": "743ff69935ef28834621647dab30f032dfcd80315732917531eea333210941c7" + }, + "3.13/aarch64-pc-windows-msvc/install_only": { + "filename": "cpython-3.13.9+20251031-aarch64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.13.9", + "sha256": "20db43873d3c4c2175d866806545e4ad4ec6bb72ca95e60082a4df6c24567e8c" + }, + "3.13/aarch64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.13.9+20251031-aarch64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.13.9", + "sha256": "a6e72f9de5d9b46cf6968d6a492f2401a919f9b959f8da2d87f43484b80169ee" + }, + "3.13/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.13.9+20251031-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.13.9", + "sha256": "0a56d11b0fb1662e67f892b9d5d1717aef06f24dbb8362bc25b8f784e620d44e" + }, + "3.13/aarch64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.13.9+20251031-aarch64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.13.9", + "sha256": "ba6a8d199c9f2a7aa5b88fdf16132049d675ab483eb6250e176a90fa0726eac4" + }, + "3.13/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.13.9+20251031-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.13.9", + "sha256": "90c803b66f8483caeeb5655ca82b7f19068515826a569ed05414326a6ff8d06d" + }, + "3.13/i686-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.13.9+20251031-i686-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.13.9", + "sha256": "a6cb3d7df191cde663ebf5f0108a9d7742e33862676ecde97fd90184333e822d" + }, + "3.13/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.13.9+20251031-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.13.9", + "sha256": "c0b0a34a492465bd44e9512582ae4ca47c06f9696807048cd917cb71c03a8416" + }, + "3.13/x86_64-apple-darwin/freethreaded": { + "filename": "cpython-3.13.9+20251031-x86_64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.13.9", + "sha256": "e2bf5fa6a3ef443ade362e08b0a19bbc172f7bfe34dabe933ccaad31d53af5da" + }, + "3.13/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.13.9+20251031-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.13.9", + "sha256": "48c0f3ca5d31e90658ef99138dc21865bb62f388ab97a1ce72cac176da194ab0" + }, + "3.13/x86_64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.13.9+20251031-x86_64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.13.9", + "sha256": "318a9a1e43dd52054327de3bccc0c5b7afde7b7f2a398ccb4d38e03d28b05386" + }, + "3.13/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.13.9+20251031-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.13.9", + "sha256": "874593f641f31ea101440c70f81768c35d4d7d6df111fde63094db67465ef787" + }, + "3.13/x86_64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.13.9+20251031-x86_64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.13.9", + "sha256": "dcc29b069d0588fbd4ea29c6df840c8d1207d2a3bce8cd5cd57d1b85373b6048" + }, + "3.13/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.13.9+20251031-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.13.9", + "sha256": "6f05b91ee8c7e6dd0f9c60b95bb29130e2d623961de6578b643e80ddd83f96b6" + }, + "3.13/x86_64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.13.9+20251031-x86_64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.13.9", + "sha256": "4c5c9a251a45288ebd4a51900708eb2ada9197173ba56e5604b6b63727fb87ff" + }, + "3.13/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.13.9+20251031-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.13.9", + "sha256": "ad987197034185e628715da504a50613af213dc21ba6d5ccaeab3db2c464aa6c" + }, + "3.14/aarch64-apple-darwin/freethreaded": { + "filename": "cpython-3.14.0+20251031-aarch64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.14.0", + "sha256": "d9c7b430b25bd3837dbb03f945dbe6b7bc526c5940ca96f5db7cdc42f6b2b801" + }, + "3.14/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.14.0+20251031-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.14.0", + "sha256": "b4bcd3c6c24cab32ae99e1b05c89312b783b4d69431d702e5012fe1fdcad4087" + }, + "3.14/aarch64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.14.0+20251031-aarch64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.14.0", + "sha256": "40266e60f655e49cd1d5303295255909a4b593b08b88be6e6a55b2c9fe6ed13d" + }, + "3.14/aarch64-pc-windows-msvc/install_only": { + "filename": "cpython-3.14.0+20251031-aarch64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.14.0", + "sha256": "599a8b7e12439cd95a201dbdfe95cf363146b1ff91f379555dafd86b170caab9" + }, + "3.14/aarch64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.14.0+20251031-aarch64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.14.0", + "sha256": "f383ef50d1da6ca511212e5ae601923b56636b87351fd5fc847e0ea0a19fa9b3" + }, + "3.14/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.14.0+20251031-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.14.0", + "sha256": "128a9cbfb9645d5237ec01704d9d1d2ac5f084464cc43c37a4cd96aa9c3b1ad5" + }, + "3.14/aarch64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.14.0+20251031-aarch64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.14.0", + "sha256": "33c7aa105634102c61b8ad01c801dbaf1950e59c04a876b72004cf4fbcfc6e33" + }, + "3.14/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.14.0+20251031-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.14.0", + "sha256": "e850ffb10a13cf16fb6ee08989e53532b606e7e96045ee65f7a3f41a9de14010" + }, + "3.14/i686-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.14.0+20251031-i686-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.14.0", + "sha256": "c47e0e4fd3a2d334a9f3df1d40fd9a7a8f743572dbd798b68fe5a6361c399806" + }, + "3.14/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.14.0+20251031-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.14.0", + "sha256": "35703b8b813afd37036ec88973c0f5a7626ee0dd48544a1c69cddeee994b5274" + }, + "3.14/x86_64-apple-darwin/freethreaded": { + "filename": "cpython-3.14.0+20251031-x86_64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.14.0", + "sha256": "b3196f6b57bbb3dc2ee07f348f1d51117ffa376979eceafbf50c15f0f7980bf8" + }, + "3.14/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.14.0+20251031-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.14.0", + "sha256": "4e71a3ce973be377ef18637826648bb936e2f9490f64a9e4f33a49bcc431d344" + }, + "3.14/x86_64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.14.0+20251031-x86_64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.14.0", + "sha256": "b81de5fc9e783ea6dfcf1098c28a278c874999c71afbb0309f6a8b4276c769d0" + }, + "3.14/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.14.0+20251031-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.14.0", + "sha256": "39acfcb3857d83eab054a3de11756ffc16b3d49c31393b9800dd2704d1f07fdf" + }, + "3.14/x86_64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.14.0+20251031-x86_64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.14.0", + "sha256": "f4acbef0fbfaf7ab31ac63986da1d93dfa1c5cb797de1dcdc1a988aa18670120" + }, + "3.14/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.14.0+20251031-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.14.0", + "sha256": "3dec1ab70758a3467ac3313bbcdabf7a9b3016db5c072c4537e3cf0a9e6290f6" + }, + "3.14/x86_64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.14.0+20251031-x86_64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.14.0", + "sha256": "9e18302759734fb14694efb0418e7291c8d590d880abc2da1d7e6f14ac9a381d" + }, + "3.14/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.14.0+20251031-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.14.0", + "sha256": "d0a2a6d3b1bb00dce2105377fda8aa79675d187f8d6d7010a42f651af25018dc" + }, + "3.15/aarch64-apple-darwin/freethreaded": { + "filename": "cpython-3.15.0a1+20251031-aarch64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.15.0a1", + "sha256": "12f1b16be4017181ad67904caf9e59e525b9b5d62f49105017d837e27b832959" + }, + "3.15/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.15.0a1+20251031-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.15.0a1", + "sha256": "3acf7aa3559b746498b18929456c5cacb84bae4e09249834cbc818970d71de87" + }, + "3.15/aarch64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.15.0a1+20251031-aarch64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.15.0a1", + "sha256": "54ca78dae455ece6fefbd7f5f287cc55d5ce197caf51921f6d871d15069d9489" + }, + "3.15/aarch64-pc-windows-msvc/install_only": { + "filename": "cpython-3.15.0a1+20251031-aarch64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.15.0a1", + "sha256": "1508bcd7195008479ed156aad3afbb3a3793097ed530690f0304a8107f0e53e8" + }, + "3.15/aarch64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.15.0a1+20251031-aarch64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.15.0a1", + "sha256": "981fe8dfc6e7e1d0ffefa945a18d5c4c759bbe21722acf3a5cc7e62f16aa5f3c" + }, + "3.15/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.15.0a1+20251031-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.15.0a1", + "sha256": "d55c2aeece827e6bec83fd18515ee281d9ea0efaa3e2d20130db8f1c7cbb71c6" + }, + "3.15/aarch64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.15.0a1+20251031-aarch64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.15.0a1", + "sha256": "017cd58a8e6d93a8d60453899d4bac6f540414003ec9a73dc106c20045d542ee" + }, + "3.15/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.15.0a1+20251031-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.15.0a1", + "sha256": "abbd20235411d7cc24cba48ac519324b8bb71a52e05b26e7012de815e43d6e73" + }, + "3.15/i686-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.15.0a1+20251031-i686-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.15.0a1", + "sha256": "9f4bc934ef9c56e6d1d7263949430cecc19d301fa4cad74fcd36c9b3c6a7ba01" + }, + "3.15/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.15.0a1+20251031-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.15.0a1", + "sha256": "6ffdbe54c45d0a9c309498f65c5ddf3de587c84aee89a227836f42b4e7e25691" + }, + "3.15/x86_64-apple-darwin/freethreaded": { + "filename": "cpython-3.15.0a1+20251031-x86_64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.15.0a1", + "sha256": "64fc29e6c7a2f02a18645d968f1b3fc1d00d12a5ef3fcbb0d077fa8c62c08904" + }, + "3.15/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.15.0a1+20251031-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.15.0a1", + "sha256": "0ab19d3ac25f99da438b088751e5ec2421f9f6aa4292fd2dc0f8e49eb3e16bdf" + }, + "3.15/x86_64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.15.0a1+20251031-x86_64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.15.0a1", + "sha256": "34abc5603e1b4131f753d29b7deac865b9277912b851cbed5a149cf3e6745d3d" + }, + "3.15/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.15.0a1+20251031-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.15.0a1", + "sha256": "5f5d6bec2b381cfc771c49972d2a6f7b7e7ab6a1651d8fb6ef3983f3571722b3" + }, + "3.15/x86_64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.15.0a1+20251031-x86_64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.15.0a1", + "sha256": "0e0272186d9f5169394dbc4d4d72a3f4a5762a04c2e5ac2ab1e23aa41fc8538a" + }, + "3.15/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.15.0a1+20251031-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.15.0a1", + "sha256": "1f356288c2b2713619cb7a4e453d33bf8882f812af2987e21e01e7ae382fefba" + }, + "3.15/x86_64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.15.0a1+20251031-x86_64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.15.0a1", + "sha256": "621ac3b8b8afa1593d63fb130dadc6eec2bd9e3603d6c028efe60146e05ec430" + }, + "3.15/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.15.0a1+20251031-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.15.0a1", + "sha256": "caf5311f333eef082dd69a669ca65aceba09a08fc1e78aad602ad649106f294c" + }, + "3.9/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.9.25+20251031-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.9.25", + "sha256": "87275619c2706affa4d1090d2ca3dad354b6d69f8b85dbfafe38785870751b9a" + }, + "3.9/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.9.25+20251031-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.9.25", + "sha256": "6112d46355857680b81849764a6cf9f38cc4cd0d1cf29d432bc12fe5aeedf9d0" + }, + "3.9/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.9.25+20251031-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.9.25", + "sha256": "f4d8eb93c54cbf7dc37d5599748582d91c268c60008f17daf19c0ad183ec78ab" + }, + "3.9/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.9.25+20251031-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.9.25", + "sha256": "5056f28d59653a6bddcc8007f024af00147a7e6f82e797f073a59f16a5cacc19" + }, + "3.9/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.9.25+20251031-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.9.25", + "sha256": "ace63cfe27a9487c4d72e1cb518be01c1d985271da0b2158e813801f7d3e5503" + }, + "3.9/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.9.25+20251031-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.9.25", + "sha256": "4fb1b416482ce94d73cfa140317a670c596c830671d137b07c26afe8c461768a" + }, + "3.9/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.9.25+20251031-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.9.25", + "sha256": "42834f61eb6df43432c3dd6ab9ca3fdf8c06d10a404ebdb53d6902e6b9570b08" + }, + "3.9/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.9.25+20251031-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.9.25", + "sha256": "76593e8c889e81e82db5fe117fe15b69466f85100ab2ec0e4035aa86242b4e93" + } + }, + "release_index_v1_20260303_https://github.com/astral-sh/python-build-standalone/releases/download": { + "3.10/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.10.20+20260303-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.10.20", + "sha256": "b41060c26454b21990254fdc08a4988f4e325708d785f8a0b4b4533881cf5fd4" + }, + "3.10/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.10.20+20260303-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.10.20", + "sha256": "dcf3b9bd0062276866b4fc84c9e4c39be7ef161d22c769e5f4ee01c8e27100f4" + }, + "3.10/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.10.20+20260303-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.10.20", + "sha256": "92713c7f4a7bb77bf8593818e4c1da8db44d415f45b0b5b7a8eb741695c08303" + }, + "3.10/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.10.20+20260303-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.10.20", + "sha256": "9bc6cd476a2670a054dc8dbdd22c5b7c7642ac2f0ac810c5bb18aa39083a8a99" + }, + "3.10/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.10.20+20260303-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.10.20", + "sha256": "2fd25586216e5e6932d767034618b7bb97654c689f07513009d858398fe181f3" + }, + "3.10/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.10.20+20260303-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.10.20", + "sha256": "aa55177f1247cdac1ccdf0877cdf68e9d6718b0914e56f1083404b1dcbac847b" + }, + "3.10/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.10.20+20260303-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.10.20", + "sha256": "c830fc25bc6e318e7ad4961caadee6cc79c041c122884c90ecfad4fe02e20344" + }, + "3.10/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.10.20+20260303-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.10.20", + "sha256": "c781a93c1030c814bc0861dc424c476ca2e0083b429b968f557e1664f3ef223f" + }, + "3.11/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.11.15+20260303-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.11.15", + "sha256": "0d29ed7cb6711890b3c6da27b6258c4ad3b506bf8d5a381bff531ca8fa67417f" + }, + "3.11/aarch64-pc-windows-msvc/install_only": { + "filename": "cpython-3.11.15+20260303-aarch64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.11.15", + "sha256": "84afaa698da2bc12f05aa317ad1ad6bf6708461e737efd08ad7e95d9a8857c1b" + }, + "3.11/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.11.15+20260303-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.11.15", + "sha256": "4786f5ef8567c982517fcd7cb189a5ef4a712ed0aaf3034e839749794155ad4c" + }, + "3.11/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.11.15+20260303-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.11.15", + "sha256": "d37ebd873138f85603607a56bc821e07551f45e6938e02d36b04885a6eded7ff" + }, + "3.11/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.11.15+20260303-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.11.15", + "sha256": "1924013f72c36c8d19d6887979cded6ca7f2295667d591b88f74260f141e1fee" + }, + "3.11/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.11.15+20260303-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.11.15", + "sha256": "6ea2168c4e18cb31d9dc8486634dc375929bcc2adde0957399ce59d90b52297a" + }, + "3.11/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.11.15+20260303-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.11.15", + "sha256": "6f194e1ede02260fd3d758893bbf1d3bb4084652d436a8300a229da721c3ddf8" + }, + "3.11/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.11.15+20260303-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.11.15", + "sha256": "17e1f5b2c9668217ba554decd94db04adf3d085203d322c690fd44cde549d576" + }, + "3.11/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.11.15+20260303-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.11.15", + "sha256": "ee54c7baaa5a1fb65922505a646a2d097660b005e55bd35055d0a9c46a5ab916" + }, + "3.12/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.12.13+20260303-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.12.13", + "sha256": "2c01f29e9e4ddbd57e0319fedecf1f3e222558fce394a3ed4e39d0f750c11988" + }, + "3.12/aarch64-pc-windows-msvc/install_only": { + "filename": "cpython-3.12.13+20260303-aarch64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.12.13", + "sha256": "f003d15139e0baa39563388b7e29c44a6c4dda3987dbd7cec2050eca32450d4f" + }, + "3.12/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.12.13+20260303-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.12.13", + "sha256": "15c00b489fb89c7e3dc433800cd8b932ab3f8825870c1919fbe747f493edf81d" + }, + "3.12/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.12.13+20260303-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.12.13", + "sha256": "2e3e3fc934a597c5c0e95fe9093a89cd6d3e248f9d3f6a0e82dbfa923499bd9d" + }, + "3.12/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.12.13+20260303-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.12.13", + "sha256": "af220242f3d2bebff6b9a01666895bb7198d7e4be608752f7e4007dd0fddfa22" + }, + "3.12/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.12.13+20260303-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.12.13", + "sha256": "8ad52a15de26e67d53f5c14f338433c59d5a2711852adc59043a20ec8da71a52" + }, + "3.12/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.12.13+20260303-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.12.13", + "sha256": "43990976c8de6b72a7525cb509eedaf869a8dd116167e708af08bca50cd8ef00" + }, + "3.12/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.12.13+20260303-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.12.13", + "sha256": "4e5ac5a04afc4fe164e92e3844d6dbda03b33baeb62e032b5c9a8198280221e2" + }, + "3.12/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.12.13+20260303-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.12.13", + "sha256": "4099347cfb11427ceb6fe40d1b9f2af9fee3a3a8915df0e439e13dfbe948b91e" + }, + "3.13/aarch64-apple-darwin/freethreaded": { + "filename": "cpython-3.13.12+20260303-aarch64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.13.12", + "sha256": "d152a8ec3a31a7b49772e70ff7fed1e7f6ec721497151b104532957744703d86" + }, + "3.13/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.13.12+20260303-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.13.12", + "sha256": "267592285674e21982d84f2cd0b56e13e63ce60c3e85ffb0d67a842edaf5b5e9" + }, + "3.13/aarch64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.13.12+20260303-aarch64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.13.12", + "sha256": "33e4de818b5419f0b6c599ccfc98a0468c441f83e02d4e0ef18b4a632408dc57" + }, + "3.13/aarch64-pc-windows-msvc/install_only": { + "filename": "cpython-3.13.12+20260303-aarch64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.13.12", + "sha256": "4cb0d143eeaf51582fa8292d00061fc201e41bf3ce5e2de814d0b273f73d4c25" + }, + "3.13/aarch64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.13.12+20260303-aarch64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.13.12", + "sha256": "a2e320b8b7ec76f538f4414bb56927e0a35fb169a4748594b3b0946df0d8942b" + }, + "3.13/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.13.12+20260303-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.13.12", + "sha256": "3b88fc6dd6f0290f075353ca860b9dc48faca0d849a0a03c088883507ed63881" + }, + "3.13/aarch64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.13.12+20260303-aarch64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.13.12", + "sha256": "5c71151ce936e495b0dc49fe3bdd67a9ec332542e2fc250257cd76276481103c" + }, + "3.13/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.13.12+20260303-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.13.12", + "sha256": "c8f2e10261f327b3b9606c23c79788e1c909f0d703c4b06ebd59b318fa271c77" + }, + "3.13/i686-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.13.12+20260303-i686-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.13.12", + "sha256": "e27287866347dd2cc1dc766174bb67f6b459cbadfbeff74c981abe7fe6cf86ba" + }, + "3.13/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.13.12+20260303-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.13.12", + "sha256": "202a933d5435eced5e92f474fac9480a82959de2b3ea5555569de9bda6f4af4f" + }, + "3.13/x86_64-apple-darwin/freethreaded": { + "filename": "cpython-3.13.12+20260303-x86_64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.13.12", + "sha256": "d603daefc04db99a764942a835497e52beebeb8797f7ac828826969e6f8ea165" + }, + "3.13/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.13.12+20260303-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.13.12", + "sha256": "07833bcaf50c80065db8a21d7ae0459939d95e3cf399ce8f7df908ddfc4d275f" + }, + "3.13/x86_64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.13.12+20260303-x86_64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.13.12", + "sha256": "5703d1e5fcd43d0ac3bce24e65d03a5684f3fec3625794ca9a0a47ad2ecbd0a1" + }, + "3.13/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.13.12+20260303-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.13.12", + "sha256": "61d5f9750e6971cf3bc91a1c8e7ab2eed1c22a34067f0762917bfde12b121f9f" + }, + "3.13/x86_64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.13.12+20260303-x86_64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.13.12", + "sha256": "8f1a00de7342d161bfefcb6bb90f50076b0c49e1ac4d4faa7fb303015369f310" + }, + "3.13/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.13.12+20260303-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.13.12", + "sha256": "ee1d08c3e6149343077d410d7de835a7a7dda8e2cec80df94f393e858a300055" + }, + "3.13/x86_64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.13.12+20260303-x86_64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.13.12", + "sha256": "6bae3d9f3c03448efe7e72aaf7eba1c4af4531ee22964876b36c1569e5123159" + }, + "3.13/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.13.12+20260303-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.13.12", + "sha256": "36f73e0b72ac670bd56c927a078e3e2ef0b1fef1d89a792088766bf1236815b7" + }, + "3.14/aarch64-apple-darwin/freethreaded": { + "filename": "cpython-3.14.3+20260303-aarch64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.14.3", + "sha256": "cedbfdb352b7b0dbdfd2e4dba11244a64665402c44099f36af9e22dc269dd0c0" + }, + "3.14/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.14.3+20260303-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.14.3", + "sha256": "adce81b366416e8d1b95c9c5483607282ae43c98fc155677020d20076d333fec" + }, + "3.14/aarch64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.14.3+20260303-aarch64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.14.3", + "sha256": "5af1b60808d4e8df3838267086556e2518b24a71080a7c4dc0edf3ef6a5bd8c4" + }, + "3.14/aarch64-pc-windows-msvc/install_only": { + "filename": "cpython-3.14.3+20260303-aarch64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.14.3", + "sha256": "f64e500abf0ff11b320cba756114caae6ea733c62af1c9516d28d92cf4223d74" + }, + "3.14/aarch64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.14.3+20260303-aarch64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.14.3", + "sha256": "9ca5169b62fdedbbeb1e01429e5ed75d0c89efb0dffb3d5924c58f667f365863" + }, + "3.14/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.14.3+20260303-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.14.3", + "sha256": "80030e336255241a76cd05c874b70a8840fef24e344907a4ae89f0f6c3c7daf6" + }, + "3.14/aarch64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.14.3+20260303-aarch64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.14.3", + "sha256": "ff4076086f55f83746d680792f8346037060453cf078feba233ba28e4b2a3514" + }, + "3.14/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.14.3+20260303-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.14.3", + "sha256": "97b7e0182daf74f884456a4a24cf882d0296092c918939d25ed1e1f4edee0469" + }, + "3.14/i686-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.14.3+20260303-i686-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.14.3", + "sha256": "e3085abf12bdf84a91784915082eaffd4cac154acd9818aefc71a69e13bdaf24" + }, + "3.14/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.14.3+20260303-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.14.3", + "sha256": "d969b1807fe6a3ebe9c1468c55331859d329119951ab01dc6ec5b2853c217a66" + }, + "3.14/x86_64-apple-darwin/freethreaded": { + "filename": "cpython-3.14.3+20260303-x86_64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.14.3", + "sha256": "ff7ba9353fb4f6f923e5a0c30564e448cb678deb69ac58e7f4f3a78944b40806" + }, + "3.14/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.14.3+20260303-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.14.3", + "sha256": "29469be54c9e471b916f0375f83836811b4df29dc98e0b7452ae9ec483a500a0" + }, + "3.14/x86_64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.14.3+20260303-x86_64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.14.3", + "sha256": "7921cf0fa140f3714c4772b8af161ab463d0ad641ac35db0beff9d45273ab5f5" + }, + "3.14/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.14.3+20260303-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.14.3", + "sha256": "201d5c13ee115e029bf6caa6bb17af2bfb3e4a3baf14c7f31e9145e2aa6571ef" + }, + "3.14/x86_64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.14.3+20260303-x86_64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.14.3", + "sha256": "0629158c702d4ba732c722f24e5a775885e93915c7b04fe29cfb9c81e37f499f" + }, + "3.14/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.14.3+20260303-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.14.3", + "sha256": "8070ec22c0ea164b826a57102f1bf1fa0b360e143ab3378b3c5eb4178bc0c26b" + }, + "3.14/x86_64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.14.3+20260303-x86_64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.14.3", + "sha256": "dc478897cecef7b6dfcd089b8a425e959885883d123ba4ce3e3ec1fcf5f9637a" + }, + "3.14/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.14.3+20260303-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.14.3", + "sha256": "e72b682f652eb8ba71550a7aa4f267ddf3fe06b165a29acd4194dfff0b51ed4e" + }, + "3.15/aarch64-apple-darwin/freethreaded": { + "filename": "cpython-3.15.0a6+20260303-aarch64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.15.0a6", + "sha256": "c2c9679a505c94abb6e0dcbcb1a9ea2148fbcab5b443e9c8efac388e591233a8" + }, + "3.15/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.15.0a6+20260303-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.15.0a6", + "sha256": "7a6bb30a11361b58849ceeaf4d74f4085306f9b00de0c7f4703f9031cbb409ee" + }, + "3.15/aarch64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.15.0a6+20260303-aarch64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.15.0a6", + "sha256": "62890d115b54d2456a74db09d3026834faee19ba1be257c287025b0e8ae6ad16" + }, + "3.15/aarch64-pc-windows-msvc/install_only": { + "filename": "cpython-3.15.0a6+20260303-aarch64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.15.0a6", + "sha256": "aafd627b816dd83cb9ae670383482f3aa166e8f8910ca946278c5cc22f96bff6" + }, + "3.15/aarch64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.15.0a6+20260303-aarch64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.15.0a6", + "sha256": "93792d31d2232f6bf27e08fbfe6aec221aab1a4aa42463ac879540d399b54bc2" + }, + "3.15/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.15.0a6+20260303-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.15.0a6", + "sha256": "bc351efe2ef61f2d6fae1491b0d240f7616a7be28fcdad2d1644ce0429001ad6" + }, + "3.15/aarch64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.15.0a6+20260303-aarch64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.15.0a6", + "sha256": "497bbd7bc486a3092e003761f6a4fb9fd2c9854dea249042b330cb70d2ebf42a" + }, + "3.15/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.15.0a6+20260303-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.15.0a6", + "sha256": "55fabc3bfa81d6248db65da659c8f728fdfe8aa5dcd9551a5b1eaef09bc05cbd" + }, + "3.15/i686-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.15.0a6+20260303-i686-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.15.0a6", + "sha256": "4174719f384f3c6893c59e23ea88242c3ab9d84b7fffb9d1ed3a11e9d6a6a068" + }, + "3.15/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.15.0a6+20260303-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.15.0a6", + "sha256": "a49e43ea7971bb975e00f132bd45bc6834177997add3de7a07361a7449a10bda" + }, + "3.15/x86_64-apple-darwin/freethreaded": { + "filename": "cpython-3.15.0a6+20260303-x86_64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.15.0a6", + "sha256": "cf23826a427d19ea945965ba0e00a210b0cd96c3e7c2741ccf1174c18c37d5a6" + }, + "3.15/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.15.0a6+20260303-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.15.0a6", + "sha256": "3c25506d64f6b8e0c38bb66f8430332578a69343c1b27078b7f91d5919f2549a" + }, + "3.15/x86_64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.15.0a6+20260303-x86_64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.15.0a6", + "sha256": "8c3de05f4df81a3b482fd62daa14b7863df2b517a487b75661e37dfee845a4e6" + }, + "3.15/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.15.0a6+20260303-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.15.0a6", + "sha256": "42690076ba8f6311b737b884f56217cab7d7287f3374ab8c629fd446913534d6" + }, + "3.15/x86_64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.15.0a6+20260303-x86_64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.15.0a6", + "sha256": "9d95b1429958effe665c0dd7e2a9b8dfe1364b477637df87ddf372438adfa109" + }, + "3.15/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.15.0a6+20260303-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.15.0a6", + "sha256": "ac11f7e619c154e3d9b56186b461f52b4afc583a5524e7109686a7a9e1835b6d" + }, + "3.15/x86_64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.15.0a6+20260303-x86_64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.15.0a6", + "sha256": "2b5d35017190248ebbbf8b24432ec730e496dc68b911308a0cd4c21d8181d090" + }, + "3.15/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.15.0a6+20260303-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.15.0a6", + "sha256": "427675a1e0e79051540cce0f1b450ca0d11a8897486aba03796a8881cadf831f" + } + } + } + }, + "factsVersions": {} +} diff --git a/e2e/distroless/README.md b/e2e/distroless/README.md new file mode 100644 index 0000000..1166c09 --- /dev/null +++ b/e2e/distroless/README.md @@ -0,0 +1,7 @@ +# Distroless contract + +These packages use a synthetic apt repository and no pip hub. + +- `apt`: an inferred package keeps its lockfile size and appears in the archive. +- `env_merge`: base, inferred, and extra PATH entries join with a colon. +- `env_conflict`: the same variable from two sources fails analysis when it has no separator. diff --git a/e2e/smoke/apt.lock.json b/e2e/distroless/apt.lock.json similarity index 100% rename from e2e/smoke/apt.lock.json rename to e2e/distroless/apt.lock.json diff --git a/e2e/distroless/apt/BUILD.bazel b/e2e/distroless/apt/BUILD.bazel new file mode 100644 index 0000000..e687178 --- /dev/null +++ b/e2e/distroless/apt/BUILD.bazel @@ -0,0 +1,55 @@ +load("@rules_layer_optimizer//apt:defs.bzl", "apt_inference", "inferred_apt_deps") +load("@rules_layer_optimizer//inference:defs.bzl", "layer_inference_bundle") +load("@rules_layer_optimizer//layers:defs.bzl", "layer_group") +load("@rules_layer_optimizer//layers:distroless.bzl", "optimized_layers") +load("@rules_shell//shell:sh_test.bzl", "sh_test") +load(":apt_test.bzl", "apt_test") + +filegroup(name = "trigger") + +filegroup( + name = "app", + srcs = [":trigger"], +) + +apt_inference( + name = "bash_runtime", + for_deps = [":trigger"], + packages = ["@debs//bash"], +) + +layer_inference_bundle( + name = "runtime", + inferences = [":bash_runtime"], +) + +inferred_apt_deps( + name = "apt_layers", + inferences = [":runtime"], + packages = ["@debs//bash"], + deps = [":app"], +) + +apt_test( + name = "apt_metadata_test", + target_under_test = ":apt_layers", +) + +optimized_layers( + name = "optimized", + compress = "gzip", + groups = [layer_group( + name = "apt", + overflow = "flatten", + targets = [":apt_layers"], + )], + layer_budget = 2, + size_bytes_threshold = 100, +) + +sh_test( + name = "archive_test", + srcs = ["archive_test.sh"], + args = ["$(rootpath :optimized)"], + data = [":optimized"], +) diff --git a/e2e/smoke/contract_test.bzl b/e2e/distroless/apt/apt_test.bzl similarity index 59% rename from e2e/smoke/contract_test.bzl rename to e2e/distroless/apt/apt_test.bzl index c7d9700..db0ba3f 100644 --- a/e2e/smoke/contract_test.bzl +++ b/e2e/distroless/apt/apt_test.bzl @@ -1,4 +1,4 @@ -"""External-consumer checks for APT metadata and conflict handling.""" +"""APT metadata reaches the inferred layer.""" load("@bazel_skylib//lib:unittest.bzl", "analysistest", "asserts") load("@rules_layer_optimizer//layers:providers.bzl", "LayerTarsInfo", "SizeHintInfo") @@ -12,10 +12,3 @@ def _apt_test_impl(ctx): return analysistest.end(env) apt_test = analysistest.make(_apt_test_impl) - -def _conflict_test_impl(ctx): - env = analysistest.begin(ctx) - asserts.expect_failure(env, "Unsupported merge of environment variable 'MODE'") - return analysistest.end(env) - -conflict_test = analysistest.make(_conflict_test_impl, expect_failure = True) diff --git a/e2e/smoke/smoke_test.sh b/e2e/distroless/apt/archive_test.sh similarity index 53% rename from e2e/smoke/smoke_test.sh rename to e2e/distroless/apt/archive_test.sh index b07db8a..b8208fd 100755 --- a/e2e/smoke/smoke_test.sh +++ b/e2e/distroless/apt/archive_test.sh @@ -1,5 +1,3 @@ #!/usr/bin/env bash set -euo pipefail tar -tzf "$1" | grep -q 'bash/payload' -grep -qx 'PATH=/bin:/tools:/extra' "$2" -grep -qx 'MODE=test' "$2" diff --git a/e2e/smoke/apt_fixture.bzl b/e2e/distroless/apt_fixture.bzl similarity index 100% rename from e2e/smoke/apt_fixture.bzl rename to e2e/distroless/apt_fixture.bzl diff --git a/e2e/distroless/env_conflict/BUILD.bazel b/e2e/distroless/env_conflict/BUILD.bazel new file mode 100644 index 0000000..15e585b --- /dev/null +++ b/e2e/distroless/env_conflict/BUILD.bazel @@ -0,0 +1,34 @@ +load("@rules_layer_optimizer//inference:defs.bzl", "env_file", "env_inference", "env_inference_bundle") +load(":conflict_test.bzl", "conflict_test") + +filegroup(name = "trigger") + +filegroup( + name = "app", + srcs = [":trigger"], +) + +env_inference( + name = "matched_env", + env = {"MODE": "test"}, + for_deps = [":trigger"], +) + +env_inference_bundle( + name = "env_inferences", + inferences = [":matched_env"], +) + +env_file( + name = "conflict", + base_env = {"MODE": "other"}, + inferences = [":env_inferences"], + runfiles_root = "/app.runfiles", + tags = ["manual"], + deps = [":app"], +) + +conflict_test( + name = "env_conflict_test", + target_under_test = ":conflict", +) diff --git a/e2e/distroless/env_conflict/conflict_test.bzl b/e2e/distroless/env_conflict/conflict_test.bzl new file mode 100644 index 0000000..dd62c7a --- /dev/null +++ b/e2e/distroless/env_conflict/conflict_test.bzl @@ -0,0 +1,10 @@ +"""Conflicting environment values fail when no separator is configured.""" + +load("@bazel_skylib//lib:unittest.bzl", "analysistest", "asserts") + +def _conflict_test_impl(ctx): + env = analysistest.begin(ctx) + asserts.expect_failure(env, "Unsupported merge of environment variable 'MODE'") + return analysistest.end(env) + +conflict_test = analysistest.make(_conflict_test_impl, expect_failure = True) diff --git a/e2e/distroless/env_merge/BUILD.bazel b/e2e/distroless/env_merge/BUILD.bazel new file mode 100644 index 0000000..73d95d5 --- /dev/null +++ b/e2e/distroless/env_merge/BUILD.bazel @@ -0,0 +1,39 @@ +load("@rules_layer_optimizer//inference:defs.bzl", "env_file", "env_inference", "env_inference_bundle") +load("@rules_shell//shell:sh_test.bzl", "sh_test") + +filegroup(name = "trigger") + +filegroup( + name = "app", + srcs = [":trigger"], +) + +env_inference( + name = "matched_env", + env = { + "PATH": "/tools", + "MODE": "test", + }, + for_deps = [":trigger"], +) + +env_inference_bundle( + name = "env_inferences", + inferences = [":matched_env"], +) + +env_file( + name = "env", + base_env = {"PATH": "/bin"}, + extra_env = {"PATH": "/extra"}, + inferences = [":env_inferences"], + runfiles_root = "/app.runfiles", + deps = [":app"], +) + +sh_test( + name = "env_merge_test", + srcs = ["env_merge_test.sh"], + args = ["$(rootpath :env)"], + data = [":env"], +) diff --git a/e2e/distroless/env_merge/env_merge_test.sh b/e2e/distroless/env_merge/env_merge_test.sh new file mode 100755 index 0000000..19c5cfb --- /dev/null +++ b/e2e/distroless/env_merge/env_merge_test.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -euo pipefail +grep -qx 'PATH=/bin:/tools:/extra' "$1" +grep -qx 'MODE=test' "$1" diff --git a/examples/.bazelrc b/e2e/image_backends/.bazelrc similarity index 78% rename from examples/.bazelrc rename to e2e/image_backends/.bazelrc index c0ec44f..37f32a6 100644 --- a/examples/.bazelrc +++ b/e2e/image_backends/.bazelrc @@ -1,5 +1,4 @@ -import %workspace%/../.bazelrc +import %workspace%/../../.bazelrc build --@packages//dep_group=layer-optimizer-examples - build --@rules_python//python/config_settings:bootstrap_impl=script diff --git a/e2e/image_backends/.bazelversion b/e2e/image_backends/.bazelversion new file mode 100644 index 0000000..deeb3d6 --- /dev/null +++ b/e2e/image_backends/.bazelversion @@ -0,0 +1 @@ +9.2.0 diff --git a/e2e/image_backends/BUILD.bazel b/e2e/image_backends/BUILD.bazel new file mode 100644 index 0000000..959edaa --- /dev/null +++ b/e2e/image_backends/BUILD.bazel @@ -0,0 +1,5 @@ +exports_files([ + "pyproject.toml", + "requirements.txt", + "uv.lock", +]) diff --git a/examples/MODULE.bazel b/e2e/image_backends/MODULE.bazel similarity index 93% rename from examples/MODULE.bazel rename to e2e/image_backends/MODULE.bazel index ef1db1c..e367e04 100644 --- a/examples/MODULE.bazel +++ b/e2e/image_backends/MODULE.bazel @@ -1,16 +1,17 @@ -module(name = "rules_layer_optimizer_examples") +module(name = "image_backends") bazel_dep(name = "rules_layer_optimizer") local_path_override( module_name = "rules_layer_optimizer", - path = "..", + path = "../..", ) bazel_dep(name = "aspect_rules_py", version = "2.0.0-alpha.4") bazel_dep(name = "aspect_bazel_lib", version = "2.22.0") bazel_dep(name = "bazel_skylib", version = "1.9.0") bazel_dep(name = "rules_oci", version = "2.2.6") -bazel_dep(name = "rules_shell", version = "0.6.1") +bazel_dep(name = "rules_python", version = "1.9.0") +bazel_dep(name = "rules_img", version = "0.3.22") python = use_extension("@aspect_rules_py//py:extensions.bzl", "python_interpreters") python.toolchain(python_version = "3.12") @@ -41,15 +42,11 @@ inference.configure( inference.pip_size_hint(lock = "//:uv.lock") use_repo(inference, "oci_image_inference_config") -bazel_dep(name = "rules_python", version = "1.9.0") - rules_python = use_extension("@rules_python//python/extensions:python.bzl", "python") rules_python.defaults(python_version = "3.12") rules_python.toolchain(python_version = "3.12") oci = use_extension("@rules_oci//oci:extensions.bzl", "oci") - -# Ubuntu 24.04, pinned by its multi-platform digest. oci.pull( name = "ubuntu", digest = "sha256:008173c23f95b170204355c12626cb5a965d779a7e1283b09e9cffbb1bf33ca3", @@ -67,8 +64,6 @@ pip.parse( ) use_repo(pip, "pip") -bazel_dep(name = "rules_img", version = "0.3.22") - images = use_extension("@rules_img//img:extensions.bzl", "images") images.pull( name = "img_ubuntu", diff --git a/examples/MODULE.bazel.lock b/e2e/image_backends/MODULE.bazel.lock similarity index 99% rename from examples/MODULE.bazel.lock rename to e2e/image_backends/MODULE.bazel.lock index 92c88f2..457df3a 100644 --- a/examples/MODULE.bazel.lock +++ b/e2e/image_backends/MODULE.bazel.lock @@ -350,7 +350,7 @@ "@@rules_oci+//oci:extensions.bzl%oci": { "general": { "bzlTransitiveDigest": "BMV1I28TKo02Nc5GW49YhdjXtU8JukzWOSQHoszj1TI=", - "usagesDigest": "3ZUTavTCkN/naCEkG0lZodDMZ6esS3U/PMiYWYxRNuU=", + "usagesDigest": "AXrdGOTG7texMz42qcSdlMReZAo2P5G5WHWhiMeLSfY=", "recordedInputs": [ "REPO_MAPPING:aspect_bazel_lib+,bazel_tools bazel_tools", "REPO_MAPPING:bazel_features+,bazel_tools bazel_tools", diff --git a/e2e/image_backends/README.md b/e2e/image_backends/README.md new file mode 100644 index 0000000..7ff9299 --- /dev/null +++ b/e2e/image_backends/README.md @@ -0,0 +1,8 @@ +# Image backends + +Builds the same optimized tars with rules_oci and rules_img, for both Python +adapters, on top of a pinned Ubuntu base. The equivalence test compares layer +digests and the inferred environment. The image tests load each image into +Docker and run it. + +`e2e/minimum` rebuilds these packages at the oldest supported backend versions. diff --git a/e2e/image_backends/aspect/BUILD.bazel b/e2e/image_backends/aspect/BUILD.bazel new file mode 100644 index 0000000..cf7228c --- /dev/null +++ b/e2e/image_backends/aspect/BUILD.bazel @@ -0,0 +1,159 @@ +load("@aspect_bazel_lib//lib:tar.bzl", "mtree_mutate", "mtree_spec", "tar") +load("@aspect_rules_py//py:defs.bzl", "py_binary", "py_test") +load("@rules_img//img:image.bzl", "image_manifest") +load("@rules_img//img:load.bzl", "image_load") +load("@rules_img_images.bzl", "image") +load("@rules_layer_optimizer//inference:defs.bzl", "env_inference_bundle") +load("@rules_layer_optimizer//layers:defs.bzl", "layer_group") +load("@rules_layer_optimizer//layers:distroless.bzl", "optimized_layers") +load("@rules_layer_optimizer//python:defs.bzl", "py_image_layer") +load("@rules_layer_optimizer//python:inference.bzl", "env_file", "env_inference") +load("@rules_oci//oci:defs.bzl", "oci_image") +load("//:oci_load.bzl", "oci_load") +load(":interpreter.bzl", "interpreter_path") + +py_binary( + name = "app", + srcs = ["app.py"], + deps = [ + "@packages//backports_strenum", + "@packages//backports_tarfile", + "@packages//colorama", + "@packages//google_crc32c", + ], +) + +mtree_spec( + name = "interpreter_mtree", + srcs = ["@python_3_12_x86_64_unknown_linux_gnu//:files"], +) + +mtree_mutate( + name = "interpreter_paths", + mtree = ":interpreter_mtree", + package_dir = interpreter_path(), +) + +tar( + name = "interpreter", + srcs = ["@python_3_12_x86_64_unknown_linux_gnu//:files"], + compress = "gzip", + mtree = ":interpreter_paths", +) + +py_image_layer( + name = "app_layers", + binary = ":app", + compress = "gzip", + interpreter_tar = ":interpreter", + python_toolchain = "@python_interpreters//:current_py_toolchain", + strip_prefix = "aspect/app", +) + +optimized_layers( + name = "optimized", + compress = "gzip", + groups = [ + layer_group( + name = "interpreter", + targets = [":interpreter"], + ), + layer_group( + name = "pip", + overflow = "flatten", + targets = [":app_layers_pip"], + ), + layer_group( + name = "source", + targets = [":app_layers_source"], + ), + ], + layer_budget = 8, + size_bytes_threshold = 1, +) + +env_inference( + name = "colorama_env", + env = {"COLORAMA_AVAILABLE": "1"}, + for_deps = ["@packages//colorama"], +) + +env_inference_bundle( + name = "env_inferences", + inferences = [":colorama_env"], +) + +env_file( + name = "env", + inferences = [":env_inferences"], + runfiles_root = "/app.runfiles", + deps = [":app"], +) + +oci_image( + name = "image", + base = "@ubuntu", + entrypoint = ["/app"], + env = ":env", + tars = [":optimized"], +) + +oci_load( + name = "load", + image = ":image", + repo_tags = ["rules-layer-optimizer-aspect-oci:local"], +) + +image_manifest( + name = "img_image", + base = image("img_ubuntu"), + entrypoint = ["/app"], + env_file = ":env", + layers = [":optimized"], +) + +image_load( + name = "img_load", + image = ":img_image", + tag = "docker.io/library/rules-layer-optimizer-aspect-img:local", +) + +filegroup( + name = "img_layout", + srcs = [":img_image"], + output_group = "oci_layout", +) + +py_test( + name = "backend_equivalence_test", + srcs = ["backend_equivalence_test.py"], + args = [ + "$(rootpath :image)", + "$(rootpath :img_layout)", + ], + data = [ + ":image", + ":img_layout", + ], + main = "backend_equivalence_test.py", +) + +py_test( + name = "oci_image_test", + size = "medium", + srcs = ["image_test.py"], + args = ["$(rootpath :load)"], + data = [":load"], + main = "image_test.py", + tags = ["no-sandbox"], +) + +py_test( + name = "img_image_test", + size = "medium", + srcs = ["image_test.py"], + args = ["$(rootpath :img_load)"], + data = [":img_load"], + main = "image_test.py", + tags = ["no-sandbox"], +) diff --git a/examples/python_image/app.py b/e2e/image_backends/aspect/app.py similarity index 100% rename from examples/python_image/app.py rename to e2e/image_backends/aspect/app.py diff --git a/e2e/image_backends/aspect/backend_equivalence_test.py b/e2e/image_backends/aspect/backend_equivalence_test.py new file mode 120000 index 0000000..ed0b5be --- /dev/null +++ b/e2e/image_backends/aspect/backend_equivalence_test.py @@ -0,0 +1 @@ +../backend_equivalence_test.py \ No newline at end of file diff --git a/e2e/image_backends/aspect/image_test.py b/e2e/image_backends/aspect/image_test.py new file mode 120000 index 0000000..472bc5c --- /dev/null +++ b/e2e/image_backends/aspect/image_test.py @@ -0,0 +1 @@ +../image_test.py \ No newline at end of file diff --git a/e2e/image_backends/aspect/interpreter.bzl b/e2e/image_backends/aspect/interpreter.bzl new file mode 100644 index 0000000..7b98a9d --- /dev/null +++ b/e2e/image_backends/aspect/interpreter.bzl @@ -0,0 +1,5 @@ +"""Interpreter layout for the aspect_rules_py image.""" + +def interpreter_path(): + """Return the configured interpreter's destination in the image.""" + return "app.runfiles/" + Label("@python_3_12_x86_64_unknown_linux_gnu//:files").repo_name diff --git a/examples/backend_equivalence_test.py b/e2e/image_backends/backend_equivalence_test.py similarity index 100% rename from examples/backend_equivalence_test.py rename to e2e/image_backends/backend_equivalence_test.py diff --git a/e2e/image_backends/image_test.py b/e2e/image_backends/image_test.py new file mode 100644 index 0000000..cc14800 --- /dev/null +++ b/e2e/image_backends/image_test.py @@ -0,0 +1,37 @@ +"""Load an image into Docker and run its entrypoint.""" + +import subprocess +import sys + + +def _run(args: list[str]) -> subprocess.CompletedProcess[str]: + result = subprocess.run(args, check=False, capture_output=True, text=True) + sys.stdout.write(result.stdout) + sys.stderr.write(result.stderr) + return result + + +def _image_ref(load_stdout: str) -> str: + for line in load_stdout.splitlines(): + if line.startswith("Loaded image: "): + return line.removeprefix("Loaded image: ").strip() + if line.startswith("Loaded image ID: "): + return line.removeprefix("Loaded image ID: ").strip() + raise AssertionError("docker load did not report an image:\n{}".format(load_stdout)) + + +def _check(result: subprocess.CompletedProcess[str], what: str) -> None: + assert result.returncode == 0, "{} failed ({}):\n{}".format(what, result.returncode, result.stderr) + + +def test_image(load_script: str) -> None: + loaded = _run([load_script]) + _check(loaded, "docker load") + image = _image_ref(loaded.stdout) + ran = _run(["docker", "run", "--rm", "--network", "none", image]) + _check(ran, "image entrypoint") + assert "hello from reusable layers" in ran.stdout + + +if __name__ == "__main__": + test_image(sys.argv[1]) diff --git a/examples/oci_load.bzl b/e2e/image_backends/oci_load.bzl similarity index 100% rename from examples/oci_load.bzl rename to e2e/image_backends/oci_load.bzl diff --git a/e2e/image_backends/pyproject.toml b/e2e/image_backends/pyproject.toml new file mode 100644 index 0000000..229d7f9 --- /dev/null +++ b/e2e/image_backends/pyproject.toml @@ -0,0 +1,5 @@ +[project] +name = "layer-optimizer-examples" +version = "0.0.0" +requires-python = ">=3.12,<3.13" +dependencies = ["colorama==0.4.6", "google-crc32c==1.7.1", "backports.tarfile==1.2.0", "backports.strenum==1.2.8"] diff --git a/examples/requirements.txt b/e2e/image_backends/requirements.txt similarity index 100% rename from examples/requirements.txt rename to e2e/image_backends/requirements.txt diff --git a/e2e/image_backends/rules_python/BUILD.bazel b/e2e/image_backends/rules_python/BUILD.bazel new file mode 100644 index 0000000..6343505 --- /dev/null +++ b/e2e/image_backends/rules_python/BUILD.bazel @@ -0,0 +1,141 @@ +load("@rules_img//img:image.bzl", "image_manifest") +load("@rules_img//img:load.bzl", "image_load") +load("@rules_img_images.bzl", "image") +load("@rules_layer_optimizer//inference:defs.bzl", "env_inference_bundle") +load("@rules_layer_optimizer//layers:defs.bzl", "layer_group") +load("@rules_layer_optimizer//layers:distroless.bzl", "optimized_layers") +load("@rules_layer_optimizer//python:inference.bzl", "env_file", "env_inference") +load("@rules_layer_optimizer//python:rules_python.bzl", "py_image_layer") +load("@rules_oci//oci:defs.bzl", "oci_image") +load("@rules_python//python:py_binary.bzl", "py_binary") +load("@rules_python//python:py_test.bzl", "py_test") +load("//:oci_load.bzl", "oci_load") + +py_binary( + name = "app", + srcs = ["app.py"], + legacy_create_init = False, + deps = [ + "@pip//backports_strenum", + "@pip//backports_tarfile", + "@pip//colorama", + "@pip//google_crc32c", + ], +) + +py_image_layer( + name = "app_layers", + binary = ":app", + strip_prefix = "rules_python/app", +) + +optimized_layers( + name = "optimized", + compress = "gzip", + groups = [ + layer_group( + name = "interpreter", + targets = [":app_layers_interpreter"], + ), + layer_group( + name = "pip", + overflow = "flatten", + targets = [":app_layers_pip"], + ), + layer_group( + name = "source", + targets = [":app_layers_source"], + ), + ], + layer_budget = 8, + size_bytes_threshold = 1, +) + +env_inference( + name = "colorama_env", + env = {"COLORAMA_AVAILABLE": "1"}, + for_deps = ["@packages//colorama"], +) + +env_inference_bundle( + name = "env_inferences", + inferences = [":colorama_env"], +) + +env_file( + name = "env", + inferences = [":env_inferences"], + runfiles_root = "/app.runfiles", + deps = [":app"], +) + +oci_image( + name = "image", + base = "@ubuntu", + entrypoint = ["/app"], + env = ":env", + tars = [":optimized"], +) + +oci_load( + name = "load", + image = ":image", + repo_tags = ["rules-layer-optimizer-rules-python-oci:local"], +) + +image_manifest( + name = "img_image", + base = image("img_ubuntu"), + entrypoint = ["/app"], + env_file = ":env", + layers = [":optimized"], +) + +image_load( + name = "img_load", + image = ":img_image", + tag = "docker.io/library/rules-layer-optimizer-rules-python-img:local", +) + +filegroup( + name = "img_layout", + srcs = [":img_image"], + output_group = "oci_layout", +) + +py_test( + name = "backend_equivalence_test", + srcs = ["backend_equivalence_test.py"], + args = [ + "$(rootpath :image)", + "$(rootpath :img_layout)", + ], + data = [ + ":image", + ":img_layout", + ], + legacy_create_init = False, + main = "backend_equivalence_test.py", +) + +py_test( + name = "oci_image_test", + size = "medium", + srcs = ["image_test.py"], + args = ["$(rootpath :load)"], + data = [":load"], + legacy_create_init = False, + main = "image_test.py", + tags = ["no-sandbox"], +) + +py_test( + name = "img_image_test", + size = "medium", + srcs = ["image_test.py"], + args = ["$(rootpath :img_load)"], + data = [":img_load"], + legacy_create_init = False, + main = "image_test.py", + tags = ["no-sandbox"], +) diff --git a/examples/rules_python_image/app.py b/e2e/image_backends/rules_python/app.py similarity index 100% rename from examples/rules_python_image/app.py rename to e2e/image_backends/rules_python/app.py diff --git a/e2e/image_backends/rules_python/backend_equivalence_test.py b/e2e/image_backends/rules_python/backend_equivalence_test.py new file mode 120000 index 0000000..ed0b5be --- /dev/null +++ b/e2e/image_backends/rules_python/backend_equivalence_test.py @@ -0,0 +1 @@ +../backend_equivalence_test.py \ No newline at end of file diff --git a/e2e/image_backends/rules_python/image_test.py b/e2e/image_backends/rules_python/image_test.py new file mode 120000 index 0000000..472bc5c --- /dev/null +++ b/e2e/image_backends/rules_python/image_test.py @@ -0,0 +1 @@ +../image_test.py \ No newline at end of file diff --git a/e2e/image_backends/uv.lock b/e2e/image_backends/uv.lock new file mode 100644 index 0000000..173f2d9 --- /dev/null +++ b/e2e/image_backends/uv.lock @@ -0,0 +1,62 @@ +version = 1 +revision = 3 +requires-python = "==3.12.*" + +[[package]] +name = "backports-strenum" +version = "1.2.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/f1/611f9ce7f5ede2e8156d3bc6cd2c62a7f2ff07d73b948925da84785cf331/backports_strenum-1.2.8.tar.gz", hash = "sha256:4dd47365fd427ac8028aeb1ad3628ea38e67c4d0336ceebd5c0f113e0c487ce9", size = 7110, upload-time = "2023-09-19T16:10:33.042Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/d0/a70b2e038cdab32ed2dbbf06d292d010fc208508bb187714306a87384c54/backports_strenum-1.2.8-py3-none-any.whl", hash = "sha256:fc297cb26971f7d5e15a478a06a78575197f81daea47975771b1aae996dcccf4", size = 7862, upload-time = "2023-09-19T16:10:31.827Z" }, +] + +[[package]] +name = "backports-tarfile" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/86/72/cd9b395f25e290e633655a100af28cb253e4393396264a98bd5f5951d50f/backports_tarfile-1.2.0.tar.gz", hash = "sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991", size = 86406, upload-time = "2024-05-28T17:01:54.731Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/fa/123043af240e49752f1c4bd24da5053b6bd00cad78c2be53c0d1e8b975bc/backports.tarfile-1.2.0-py3-none-any.whl", hash = "sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34", size = 30181, upload-time = "2024-05-28T17:01:53.112Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "google-crc32c" +version = "1.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/19/ae/87802e6d9f9d69adfaedfcfd599266bf386a54d0be058b532d04c794f76d/google_crc32c-1.7.1.tar.gz", hash = "sha256:2bff2305f98846f3e825dbeec9ee406f89da7962accdb29356e4eadc251bd472", size = 14495, upload-time = "2025-03-26T14:29:13.32Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dd/b7/787e2453cf8639c94b3d06c9d61f512234a82e1d12d13d18584bd3049904/google_crc32c-1.7.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2d73a68a653c57281401871dd4aeebbb6af3191dcac751a76ce430df4d403194", size = 30470, upload-time = "2025-03-26T14:34:31.655Z" }, + { url = "https://files.pythonhosted.org/packages/ed/b4/6042c2b0cbac3ec3a69bb4c49b28d2f517b7a0f4a0232603c42c58e22b44/google_crc32c-1.7.1-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:22beacf83baaf59f9d3ab2bbb4db0fb018da8e5aebdce07ef9f09fce8220285e", size = 30315, upload-time = "2025-03-26T15:01:54.634Z" }, + { url = "https://files.pythonhosted.org/packages/29/ad/01e7a61a5d059bc57b702d9ff6a18b2585ad97f720bd0a0dbe215df1ab0e/google_crc32c-1.7.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19eafa0e4af11b0a4eb3974483d55d2d77ad1911e6cf6f832e1574f6781fd337", size = 33180, upload-time = "2025-03-26T14:41:32.168Z" }, + { url = "https://files.pythonhosted.org/packages/3b/a5/7279055cf004561894ed3a7bfdf5bf90a53f28fadd01af7cd166e88ddf16/google_crc32c-1.7.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6d86616faaea68101195c6bdc40c494e4d76f41e07a37ffdef270879c15fb65", size = 32794, upload-time = "2025-03-26T14:41:33.264Z" }, + { url = "https://files.pythonhosted.org/packages/0f/d6/77060dbd140c624e42ae3ece3df53b9d811000729a5c821b9fd671ceaac6/google_crc32c-1.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:b7491bdc0c7564fcf48c0179d2048ab2f7c7ba36b84ccd3a3e1c3f7a72d3bba6", size = 33477, upload-time = "2025-03-26T14:29:10.94Z" }, +] + +[[package]] +name = "layer-optimizer-examples" +version = "0.0.0" +source = { virtual = "." } +dependencies = [ + { name = "backports-strenum" }, + { name = "backports-tarfile" }, + { name = "colorama" }, + { name = "google-crc32c" }, +] + +[package.metadata] +requires-dist = [ + { name = "backports-strenum", specifier = "==1.2.8" }, + { name = "backports-tarfile", specifier = "==1.2.0" }, + { name = "colorama", specifier = "==0.4.6" }, + { name = "google-crc32c", specifier = "==1.7.1" }, +] diff --git a/e2e/inference/BUILD.bazel b/e2e/inference/BUILD.bazel index 6c86420..1767e28 100644 --- a/e2e/inference/BUILD.bazel +++ b/e2e/inference/BUILD.bazel @@ -1,3 +1,4 @@ +load("@rules_layer_optimizer//inference:defs.bzl", "env_inference_bundle") load("@rules_layer_optimizer//python:inference.bzl", "env_file", "env_inference") load("@rules_python//python:defs.bzl", "py_library", "py_test") @@ -12,11 +13,16 @@ env_inference( for_deps = ["@pip//colorama"], ) +env_inference_bundle( + name = "env_inferences", + inferences = [":flags"], +) + env_file( name = "env", base_env = {"FLAGS": "--first"}, env_separators = {"FLAGS": " "}, - inferences = [":flags"], + inferences = [":env_inferences"], deps = [":app"], ) diff --git a/e2e/layer_plan/.bazelrc b/e2e/layer_plan/.bazelrc new file mode 100644 index 0000000..eaa91b9 --- /dev/null +++ b/e2e/layer_plan/.bazelrc @@ -0,0 +1 @@ +import %workspace%/../../.bazelrc diff --git a/e2e/layer_plan/.bazelversion b/e2e/layer_plan/.bazelversion new file mode 100644 index 0000000..deeb3d6 --- /dev/null +++ b/e2e/layer_plan/.bazelversion @@ -0,0 +1 @@ +9.2.0 diff --git a/examples/basic_layers/BUILD.bazel b/e2e/layer_plan/BUILD.bazel similarity index 77% rename from examples/basic_layers/BUILD.bazel rename to e2e/layer_plan/BUILD.bazel index 42e1c1d..fcb1f0a 100644 --- a/examples/basic_layers/BUILD.bazel +++ b/e2e/layer_plan/BUILD.bazel @@ -1,5 +1,4 @@ load("@aspect_bazel_lib//lib:tar.bzl", "tar") -load("@aspect_bazel_lib//lib:write_source_files.bzl", "write_source_files") load("@rules_layer_optimizer//layers:defs.bzl", "layer_group") load("@rules_layer_optimizer//layers:distroless.bzl", "optimized_layers") load("@rules_shell//shell:sh_test.bzl", "sh_test") @@ -9,7 +8,6 @@ exports_files(["payload.txt"]) tar( name = "first", srcs = ["payload.txt"], - visibility = ["//visibility:public"], ) tar( @@ -33,7 +31,6 @@ optimized_layers( )], layer_budget = 2, size_bytes_threshold = 1024, - visibility = ["//visibility:public"], ) sh_test( @@ -48,8 +45,3 @@ sh_test( ":optimized_optimization_plan", ], ) - -write_source_files( - name = "write_optimization_plan", - files = {"optimization_plan.json": ":optimized_optimization_plan"}, -) diff --git a/e2e/layer_plan/MODULE.bazel b/e2e/layer_plan/MODULE.bazel new file mode 100644 index 0000000..cdd937c --- /dev/null +++ b/e2e/layer_plan/MODULE.bazel @@ -0,0 +1,10 @@ +module(name = "layer_plan") + +bazel_dep(name = "rules_layer_optimizer") +local_path_override( + module_name = "rules_layer_optimizer", + path = "../..", +) + +bazel_dep(name = "aspect_bazel_lib", version = "2.22.0") +bazel_dep(name = "rules_shell", version = "0.6.1") diff --git a/e2e/layer_plan/MODULE.bazel.lock b/e2e/layer_plan/MODULE.bazel.lock new file mode 100644 index 0000000..29fb8fc --- /dev/null +++ b/e2e/layer_plan/MODULE.bazel.lock @@ -0,0 +1,1500 @@ +{ + "lockFileVersion": 28, + "registryFileHashes": { + "https://bcr.bazel.build/bazel_registry.json": "8a28e4aff06ee60aed2a8c281907fb8bcbf3b753c91fb5a5c57da3215d5b3497", + "https://bcr.bazel.build/modules/abseil-cpp/20210324.2/MODULE.bazel": "7cd0312e064fde87c8d1cd79ba06c876bd23630c83466e9500321be55c96ace2", + "https://bcr.bazel.build/modules/abseil-cpp/20211102.0/MODULE.bazel": "70390338f7a5106231d20620712f7cccb659cd0e9d073d1991c038eb9fc57589", + "https://bcr.bazel.build/modules/abseil-cpp/20230125.1/MODULE.bazel": "89047429cb0207707b2dface14ba7f8df85273d484c2572755be4bab7ce9c3a0", + "https://bcr.bazel.build/modules/abseil-cpp/20230802.0.bcr.1/MODULE.bazel": "1c8cec495288dccd14fdae6e3f95f772c1c91857047a098fad772034264cc8cb", + "https://bcr.bazel.build/modules/abseil-cpp/20230802.0/MODULE.bazel": "d253ae36a8bd9ee3c5955384096ccb6baf16a1b1e93e858370da0a3b94f77c16", + "https://bcr.bazel.build/modules/abseil-cpp/20230802.1/MODULE.bazel": "fa92e2eb41a04df73cdabeec37107316f7e5272650f81d6cc096418fe647b915", + "https://bcr.bazel.build/modules/abseil-cpp/20240116.1/MODULE.bazel": "37bcdb4440fbb61df6a1c296ae01b327f19e9bb521f9b8e26ec854b6f97309ed", + "https://bcr.bazel.build/modules/abseil-cpp/20240116.2/MODULE.bazel": "73939767a4686cd9a520d16af5ab440071ed75cec1a876bf2fcfaf1f71987a16", + "https://bcr.bazel.build/modules/abseil-cpp/20250127.1/MODULE.bazel": "c4a89e7ceb9bf1e25cf84a9f830ff6b817b72874088bf5141b314726e46a57c1", + "https://bcr.bazel.build/modules/abseil-cpp/20250512.1/MODULE.bazel": "d209fdb6f36ffaf61c509fcc81b19e81b411a999a934a032e10cd009a0226215", + "https://bcr.bazel.build/modules/abseil-cpp/20250814.1/MODULE.bazel": "51f2312901470cdab0dbdf3b88c40cd21c62a7ed58a3de45b365ddc5b11bcab2", + "https://bcr.bazel.build/modules/abseil-cpp/20250814.1/source.json": "cea3901d7e299da7320700abbaafe57a65d039f10d0d7ea601c4a66938ea4b0c", + "https://bcr.bazel.build/modules/apple_support/1.11.1/MODULE.bazel": "1843d7cd8a58369a444fc6000e7304425fba600ff641592161d9f15b179fb896", + "https://bcr.bazel.build/modules/apple_support/1.15.1/MODULE.bazel": "a0556fefca0b1bb2de8567b8827518f94db6a6e7e7d632b4c48dc5f865bc7c85", + "https://bcr.bazel.build/modules/apple_support/1.21.0/MODULE.bazel": "ac1824ed5edf17dee2fdd4927ada30c9f8c3b520be1b5fd02a5da15bc10bff3e", + "https://bcr.bazel.build/modules/apple_support/1.21.1/MODULE.bazel": "5809fa3efab15d1f3c3c635af6974044bac8a4919c62238cce06acee8a8c11f1", + "https://bcr.bazel.build/modules/apple_support/1.24.2/MODULE.bazel": "0e62471818affb9f0b26f128831d5c40b074d32e6dda5a0d3852847215a41ca4", + "https://bcr.bazel.build/modules/apple_support/1.24.2/source.json": "2c22c9827093250406c5568da6c54e6fdf0ef06238def3d99c71b12feb057a8d", + "https://bcr.bazel.build/modules/aspect_bazel_lib/2.14.0/MODULE.bazel": "2b31ffcc9bdc8295b2167e07a757dbbc9ac8906e7028e5170a3708cecaac119f", + "https://bcr.bazel.build/modules/aspect_bazel_lib/2.19.3/MODULE.bazel": "253d739ba126f62a5767d832765b12b59e9f8d2bc88cc1572f4a73e46eb298ca", + "https://bcr.bazel.build/modules/aspect_bazel_lib/2.22.0/MODULE.bazel": "7fe0191f047d4fe4a4a46c1107e2350cbb58a8fc2e10913aa4322d3190dec0bf", + "https://bcr.bazel.build/modules/aspect_bazel_lib/2.22.0/source.json": "369df5b7f2eae82f200fff95cf1425f90dee90a0d0948122060b48150ff0e224", + "https://bcr.bazel.build/modules/aspect_bazel_lib/2.8.1/MODULE.bazel": "812d2dd42f65dca362152101fbec418029cc8fd34cbad1a2fde905383d705838", + "https://bcr.bazel.build/modules/aspect_rules_py/2.0.0-alpha.4/MODULE.bazel": "4d9f393a947c01809556659cc4b07b76b25d98f25a8062280e506b5c296b89cf", + "https://bcr.bazel.build/modules/aspect_rules_py/2.0.0-alpha.4/source.json": "fcf828898c74224aff425d991755e5bc6346e9ff4da74e0b286f9bc19c5424c4", + "https://bcr.bazel.build/modules/aspect_tools_telemetry/0.3.3/MODULE.bazel": "37c764292861c2f70314efa9846bb6dbb44fc0308903b3285da6528305450183", + "https://bcr.bazel.build/modules/aspect_tools_telemetry/0.3.3/source.json": "605086bbc197743a0d360f7ddc550a1d4dfa0441bc807236e17170f636153348", + "https://bcr.bazel.build/modules/bazel_features/1.1.1/MODULE.bazel": "27b8c79ef57efe08efccbd9dd6ef70d61b4798320b8d3c134fd571f78963dbcd", + "https://bcr.bazel.build/modules/bazel_features/1.10.0/MODULE.bazel": "f75e8807570484a99be90abcd52b5e1f390362c258bcb73106f4544957a48101", + "https://bcr.bazel.build/modules/bazel_features/1.11.0/MODULE.bazel": "f9382337dd5a474c3b7d334c2f83e50b6eaedc284253334cf823044a26de03e8", + "https://bcr.bazel.build/modules/bazel_features/1.15.0/MODULE.bazel": "d38ff6e517149dc509406aca0db3ad1efdd890a85e049585b7234d04238e2a4d", + "https://bcr.bazel.build/modules/bazel_features/1.17.0/MODULE.bazel": "039de32d21b816b47bd42c778e0454217e9c9caac4a3cf8e15c7231ee3ddee4d", + "https://bcr.bazel.build/modules/bazel_features/1.18.0/MODULE.bazel": "1be0ae2557ab3a72a57aeb31b29be347bcdc5d2b1eb1e70f39e3851a7e97041a", + "https://bcr.bazel.build/modules/bazel_features/1.19.0/MODULE.bazel": "59adcdf28230d220f0067b1f435b8537dd033bfff8db21335ef9217919c7fb58", + "https://bcr.bazel.build/modules/bazel_features/1.20.0/MODULE.bazel": "8b85300b9c8594752e0721a37210e34879d23adc219ed9dc8f4104a4a1750920", + "https://bcr.bazel.build/modules/bazel_features/1.21.0/MODULE.bazel": "675642261665d8eea09989aa3b8afb5c37627f1be178382c320d1b46afba5e3b", + "https://bcr.bazel.build/modules/bazel_features/1.23.0/MODULE.bazel": "fd1ac84bc4e97a5a0816b7fd7d4d4f6d837b0047cf4cbd81652d616af3a6591a", + "https://bcr.bazel.build/modules/bazel_features/1.24.0/MODULE.bazel": "4796b4c25b47053e9bbffa792b3792d07e228ff66cd0405faef56a978708acd4", + "https://bcr.bazel.build/modules/bazel_features/1.27.0/MODULE.bazel": "621eeee06c4458a9121d1f104efb80f39d34deff4984e778359c60eaf1a8cb65", + "https://bcr.bazel.build/modules/bazel_features/1.28.0/MODULE.bazel": "4b4200e6cbf8fa335b2c3f43e1d6ef3e240319c33d43d60cc0fbd4b87ece299d", + "https://bcr.bazel.build/modules/bazel_features/1.3.0/MODULE.bazel": "cdcafe83ec318cda34e02948e81d790aab8df7a929cec6f6969f13a489ccecd9", + "https://bcr.bazel.build/modules/bazel_features/1.30.0/MODULE.bazel": "a14b62d05969a293b80257e72e597c2da7f717e1e69fa8b339703ed6731bec87", + "https://bcr.bazel.build/modules/bazel_features/1.33.0/MODULE.bazel": "8b8dc9d2a4c88609409c3191165bccec0e4cb044cd7a72ccbe826583303459f6", + "https://bcr.bazel.build/modules/bazel_features/1.34.0/MODULE.bazel": "e8475ad7c8965542e0c7aac8af68eb48c4af904be3d614b6aa6274c092c2ea1e", + "https://bcr.bazel.build/modules/bazel_features/1.38.0/MODULE.bazel": "f9b8a9c890ebd216b4049fd12a31d3c2602e3403c7af636b04fbbd7453edc9c9", + "https://bcr.bazel.build/modules/bazel_features/1.4.1/MODULE.bazel": "e45b6bb2350aff3e442ae1111c555e27eac1d915e77775f6fdc4b351b758b5d7", + "https://bcr.bazel.build/modules/bazel_features/1.42.1/MODULE.bazel": "275a59b5406ff18c01739860aa70ad7ccb3cfb474579411decca11c93b951080", + "https://bcr.bazel.build/modules/bazel_features/1.43.0/MODULE.bazel": "defa2226f06ba20550d6548c3a2ea2a7929634437a52973869c20c225450eb91", + "https://bcr.bazel.build/modules/bazel_features/1.43.0/source.json": "1c4207dc858d6de0eecef30026793616bbf420c74aac27b6bad212534a730437", + "https://bcr.bazel.build/modules/bazel_features/1.9.0/MODULE.bazel": "885151d58d90d8d9c811eb75e3288c11f850e1d6b481a8c9f766adee4712358b", + "https://bcr.bazel.build/modules/bazel_features/1.9.1/MODULE.bazel": "8f679097876a9b609ad1f60249c49d68bfab783dd9be012faf9d82547b14815a", + "https://bcr.bazel.build/modules/bazel_lib/3.0.0-beta.1/MODULE.bazel": "407729e232f611c3270005b016b437005daa7b1505826798ea584169a476e878", + "https://bcr.bazel.build/modules/bazel_lib/3.0.0-rc.0/MODULE.bazel": "d6e00979a98ac14ada5e31c8794708b41434d461e7e7ca39b59b765e6d233b18", + "https://bcr.bazel.build/modules/bazel_lib/3.0.0/MODULE.bazel": "22b70b80ac89ad3f3772526cd9feee2fa412c2b01933fea7ed13238a448d370d", + "https://bcr.bazel.build/modules/bazel_lib/3.0.0/source.json": "895f21909c6fba01d7c17914bb6c8e135982275a1b18cdaa4e62272217ef1751", + "https://bcr.bazel.build/modules/bazel_skylib/1.0.3/MODULE.bazel": "bcb0fd896384802d1ad283b4e4eb4d718eebd8cb820b0a2c3a347fb971afd9d8", + "https://bcr.bazel.build/modules/bazel_skylib/1.1.1/MODULE.bazel": "1add3e7d93ff2e6998f9e118022c84d163917d912f5afafb3058e3d2f1545b5e", + "https://bcr.bazel.build/modules/bazel_skylib/1.2.0/MODULE.bazel": "44fe84260e454ed94ad326352a698422dbe372b21a1ac9f3eab76eb531223686", + "https://bcr.bazel.build/modules/bazel_skylib/1.2.1/MODULE.bazel": "f35baf9da0efe45fa3da1696ae906eea3d615ad41e2e3def4aeb4e8bc0ef9a7a", + "https://bcr.bazel.build/modules/bazel_skylib/1.3.0/MODULE.bazel": "20228b92868bf5cfc41bda7afc8a8ba2a543201851de39d990ec957b513579c5", + "https://bcr.bazel.build/modules/bazel_skylib/1.4.1/MODULE.bazel": "a0dcb779424be33100dcae821e9e27e4f2901d9dfd5333efe5ac6a8d7ab75e1d", + "https://bcr.bazel.build/modules/bazel_skylib/1.4.2/MODULE.bazel": "3bd40978e7a1fac911d5989e6b09d8f64921865a45822d8b09e815eaa726a651", + "https://bcr.bazel.build/modules/bazel_skylib/1.5.0/MODULE.bazel": "32880f5e2945ce6a03d1fbd588e9198c0a959bb42297b2cfaf1685b7bc32e138", + "https://bcr.bazel.build/modules/bazel_skylib/1.6.1/MODULE.bazel": "8fdee2dbaace6c252131c00e1de4b165dc65af02ea278476187765e1a617b917", + "https://bcr.bazel.build/modules/bazel_skylib/1.7.0/MODULE.bazel": "0db596f4563de7938de764cc8deeabec291f55e8ec15299718b93c4423e9796d", + "https://bcr.bazel.build/modules/bazel_skylib/1.7.1/MODULE.bazel": "3120d80c5861aa616222ec015332e5f8d3171e062e3e804a2a0253e1be26e59b", + "https://bcr.bazel.build/modules/bazel_skylib/1.8.0/MODULE.bazel": "2fb3fb53675f6adfc1ca5bfbd5cfb655ae350fba4706d924a8ec7e3ba945671c", + "https://bcr.bazel.build/modules/bazel_skylib/1.8.1/MODULE.bazel": "88ade7293becda963e0e3ea33e7d54d3425127e0a326e0d17da085a5f1f03ff6", + "https://bcr.bazel.build/modules/bazel_skylib/1.8.2/MODULE.bazel": "69ad6927098316848b34a9142bcc975e018ba27f08c4ff403f50c1b6e646ca67", + "https://bcr.bazel.build/modules/bazel_skylib/1.9.0/MODULE.bazel": "72997b29dfd95c3fa0d0c48322d05590418edef451f8db8db5509c57875fb4b7", + "https://bcr.bazel.build/modules/bazel_skylib/1.9.0/source.json": "7ad77c1e8c1b84222d9b3f3cae016a76639435744c19330b0b37c0a3c9da7dc0", + "https://bcr.bazel.build/modules/buildozer/8.5.1/MODULE.bazel": "a35d9561b3fc5b18797c330793e99e3b834a473d5fbd3d7d7634aafc9bdb6f8f", + "https://bcr.bazel.build/modules/buildozer/8.5.1/source.json": "e3386e6ff4529f2442800dee47ad28d3e6487f36a1f75ae39ae56c70f0cd2fbd", + "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.1/MODULE.bazel": "cdf8cbe5ee750db04b78878c9633cc76e80dcf4416cbe982ac3a9222f80713c8", + "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.3/MODULE.bazel": "f1b7bb2dd53e8f2ef984b39485ec8a44e9076dda5c4b8efd2fb4c6a6e856a31d", + "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.7/MODULE.bazel": "1e5e03c383fa64ebbe0942a225c32168fd6ef6b270351bbec481d47d19d1b96d", + "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.7/source.json": "34a83d58ae2f1ef6731d1fc8a1b6f07825741aff3f5993b67b67ec21d2c2946e", + "https://bcr.bazel.build/modules/google_benchmark/1.8.2/MODULE.bazel": "a70cf1bba851000ba93b58ae2f6d76490a9feb74192e57ab8e8ff13c34ec50cb", + "https://bcr.bazel.build/modules/googletest/1.11.0/MODULE.bazel": "3a83f095183f66345ca86aa13c58b59f9f94a2f81999c093d4eeaa2d262d12f4", + "https://bcr.bazel.build/modules/googletest/1.14.0.bcr.1/MODULE.bazel": "22c31a561553727960057361aa33bf20fb2e98584bc4fec007906e27053f80c6", + "https://bcr.bazel.build/modules/googletest/1.14.0/MODULE.bazel": "cfbcbf3e6eac06ef9d85900f64424708cc08687d1b527f0ef65aa7517af8118f", + "https://bcr.bazel.build/modules/googletest/1.15.2/MODULE.bazel": "6de1edc1d26cafb0ea1a6ab3f4d4192d91a312fd2d360b63adaa213cd00b2108", + "https://bcr.bazel.build/modules/googletest/1.17.0/MODULE.bazel": "dbec758171594a705933a29fcf69293d2468c49ec1f2ebca65c36f504d72df46", + "https://bcr.bazel.build/modules/googletest/1.17.0/source.json": "38e4454b25fc30f15439c0378e57909ab1fd0a443158aa35aec685da727cd713", + "https://bcr.bazel.build/modules/hermetic_launcher/0.0.11/MODULE.bazel": "aba15d5a4745cedcb4750faf0c49f946d004ccb09475b6ade1dea4efe0399d82", + "https://bcr.bazel.build/modules/hermetic_launcher/0.0.11/source.json": "0c4d45a10e956dc30c7278de756c81d4b55612218b1a20fa55fc2988063ba4eb", + "https://bcr.bazel.build/modules/jq.bzl/0.1.0/MODULE.bazel": "2ce69b1af49952cd4121a9c3055faa679e748ce774c7f1fda9657f936cae902f", + "https://bcr.bazel.build/modules/jq.bzl/0.1.0/source.json": "746bf13cac0860f091df5e4911d0c593971cd8796b5ad4e809b2f8e133eee3d5", + "https://bcr.bazel.build/modules/jsoncpp/1.9.5/MODULE.bazel": "31271aedc59e815656f5736f282bb7509a97c7ecb43e927ac1a37966e0578075", + "https://bcr.bazel.build/modules/jsoncpp/1.9.6/MODULE.bazel": "2f8d20d3b7d54143213c4dfc3d98225c42de7d666011528dc8fe91591e2e17b0", + "https://bcr.bazel.build/modules/jsoncpp/1.9.6/source.json": "a04756d367a2126c3541682864ecec52f92cdee80a35735a3cb249ce015ca000", + "https://bcr.bazel.build/modules/libpfm/4.11.0/MODULE.bazel": "45061ff025b301940f1e30d2c16bea596c25b176c8b6b3087e92615adbd52902", + "https://bcr.bazel.build/modules/nlohmann_json/3.6.1/MODULE.bazel": "6f7b417dcc794d9add9e556673ad25cb3ba835224290f4f848f8e2db1e1fca74", + "https://bcr.bazel.build/modules/nlohmann_json/3.6.1/source.json": "f448c6e8963fdfa7eb831457df83ad63d3d6355018f6574fb017e8169deb43a9", + "https://bcr.bazel.build/modules/package_metadata/0.0.2/MODULE.bazel": "fb8d25550742674d63d7b250063d4580ca530499f045d70748b1b142081ebb92", + "https://bcr.bazel.build/modules/package_metadata/0.0.3/MODULE.bazel": "77890552ecea9e284b5424c9de827a58099348763a4359e975c359a83d4faa83", + "https://bcr.bazel.build/modules/package_metadata/0.0.3/source.json": "742075a428ad12a3fa18a69014c2f57f01af910c6d9d18646c990200853e641a", + "https://bcr.bazel.build/modules/platforms/0.0.10/MODULE.bazel": "8cb8efaf200bdeb2150d93e162c40f388529a25852b332cec879373771e48ed5", + "https://bcr.bazel.build/modules/platforms/0.0.11/MODULE.bazel": "0daefc49732e227caa8bfa834d65dc52e8cc18a2faf80df25e8caea151a9413f", + "https://bcr.bazel.build/modules/platforms/0.0.4/MODULE.bazel": "9b328e31ee156f53f3c416a64f8491f7eb731742655a47c9eec4703a71644aee", + "https://bcr.bazel.build/modules/platforms/0.0.5/MODULE.bazel": "5733b54ea419d5eaf7997054bb55f6a1d0b5ff8aedf0176fef9eea44f3acda37", + "https://bcr.bazel.build/modules/platforms/0.0.6/MODULE.bazel": "ad6eeef431dc52aefd2d77ed20a4b353f8ebf0f4ecdd26a807d2da5aa8cd0615", + "https://bcr.bazel.build/modules/platforms/0.0.7/MODULE.bazel": "72fd4a0ede9ee5c021f6a8dd92b503e089f46c227ba2813ff183b71616034814", + "https://bcr.bazel.build/modules/platforms/0.0.8/MODULE.bazel": "9f142c03e348f6d263719f5074b21ef3adf0b139ee4c5133e2aa35664da9eb2d", + "https://bcr.bazel.build/modules/platforms/0.0.9/MODULE.bazel": "4a87a60c927b56ddd67db50c89acaa62f4ce2a1d2149ccb63ffd871d5ce29ebc", + "https://bcr.bazel.build/modules/platforms/1.0.0/MODULE.bazel": "f05feb42b48f1b3c225e4ccf351f367be0371411a803198ec34a389fb22aa580", + "https://bcr.bazel.build/modules/platforms/1.1.0/MODULE.bazel": "1c0c09f5bdcf4b3f924720d2478a3711cb39f4977019ca5988685e5b7e18b3d2", + "https://bcr.bazel.build/modules/platforms/1.1.0/source.json": "fcf351c47596c939140ab0d333dfdd08ed1ea6ce33c2fe70c12493a301cf1344", + "https://bcr.bazel.build/modules/protobuf/21.7/MODULE.bazel": "a5a29bb89544f9b97edce05642fac225a808b5b7be74038ea3640fae2f8e66a7", + "https://bcr.bazel.build/modules/protobuf/27.0/MODULE.bazel": "7873b60be88844a0a1d8f80b9d5d20cfbd8495a689b8763e76c6372998d3f64c", + "https://bcr.bazel.build/modules/protobuf/27.1/MODULE.bazel": "703a7b614728bb06647f965264967a8ef1c39e09e8f167b3ca0bb1fd80449c0d", + "https://bcr.bazel.build/modules/protobuf/29.0-rc2/MODULE.bazel": "6241d35983510143049943fc0d57937937122baf1b287862f9dc8590fc4c37df", + "https://bcr.bazel.build/modules/protobuf/29.0-rc3/MODULE.bazel": "33c2dfa286578573afc55a7acaea3cada4122b9631007c594bf0729f41c8de92", + "https://bcr.bazel.build/modules/protobuf/29.1/MODULE.bazel": "557c3457560ff49e122ed76c0bc3397a64af9574691cb8201b4e46d4ab2ecb95", + "https://bcr.bazel.build/modules/protobuf/3.19.0/MODULE.bazel": "6b5fbb433f760a99a22b18b6850ed5784ef0e9928a72668b66e4d7ccd47db9b0", + "https://bcr.bazel.build/modules/protobuf/32.1/MODULE.bazel": "89cd2866a9cb07fee9ff74c41ceace11554f32e0d849de4e23ac55515cfada4d", + "https://bcr.bazel.build/modules/protobuf/33.4/MODULE.bazel": "114775b816b38b6d0ca620450d6b02550c60ceedfdc8d9a229833b34a223dc42", + "https://bcr.bazel.build/modules/protobuf/33.4/source.json": "555f8686b4c7d6b5ba731fbea13bf656b4bfd9a7ff629c1d9d3f6e1d6155de79", + "https://bcr.bazel.build/modules/pybind11_bazel/2.11.1/MODULE.bazel": "88af1c246226d87e65be78ed49ecd1e6f5e98648558c14ce99176da041dc378e", + "https://bcr.bazel.build/modules/pybind11_bazel/2.12.0/MODULE.bazel": "e6f4c20442eaa7c90d7190d8dc539d0ab422f95c65a57cc59562170c58ae3d34", + "https://bcr.bazel.build/modules/pybind11_bazel/2.12.0/source.json": "6900fdc8a9e95866b8c0d4ad4aba4d4236317b5c1cd04c502df3f0d33afed680", + "https://bcr.bazel.build/modules/re2/2023-09-01/MODULE.bazel": "cb3d511531b16cfc78a225a9e2136007a48cf8a677e4264baeab57fe78a80206", + "https://bcr.bazel.build/modules/re2/2024-07-02.bcr.1/MODULE.bazel": "b4963dda9b31080be1905ef085ecd7dd6cd47c05c79b9cdf83ade83ab2ab271a", + "https://bcr.bazel.build/modules/re2/2024-07-02.bcr.1/source.json": "2ff292be6ef3340325ce8a045ecc326e92cbfab47c7cbab4bd85d28971b97ac4", + "https://bcr.bazel.build/modules/re2/2024-07-02/MODULE.bazel": "0eadc4395959969297cbcf31a249ff457f2f1d456228c67719480205aa306daa", + "https://bcr.bazel.build/modules/rules_android/0.1.1/MODULE.bazel": "48809ab0091b07ad0182defb787c4c5328bd3a278938415c00a7b69b50c4d3a8", + "https://bcr.bazel.build/modules/rules_android/0.1.1/source.json": "e6986b41626ee10bdc864937ffb6d6bf275bb5b9c65120e6137d56e6331f089e", + "https://bcr.bazel.build/modules/rules_apple/3.16.0/MODULE.bazel": "0d1caf0b8375942ce98ea944be754a18874041e4e0459401d925577624d3a54a", + "https://bcr.bazel.build/modules/rules_apple/4.1.0/MODULE.bazel": "76e10fd4a48038d3fc7c5dc6e63b7063bbf5304a2e3bd42edda6ec660eebea68", + "https://bcr.bazel.build/modules/rules_apple/4.1.0/source.json": "8ee81e1708756f81b343a5eb2b2f0b953f1d25c4ab3d4a68dc02754872e80715", + "https://bcr.bazel.build/modules/rules_cc/0.0.1/MODULE.bazel": "cb2aa0747f84c6c3a78dad4e2049c154f08ab9d166b1273835a8174940365647", + "https://bcr.bazel.build/modules/rules_cc/0.0.10/MODULE.bazel": "ec1705118f7eaedd6e118508d3d26deba2a4e76476ada7e0e3965211be012002", + "https://bcr.bazel.build/modules/rules_cc/0.0.13/MODULE.bazel": "0e8529ed7b323dad0775ff924d2ae5af7640b23553dfcd4d34344c7e7a867191", + "https://bcr.bazel.build/modules/rules_cc/0.0.15/MODULE.bazel": "6704c35f7b4a72502ee81f61bf88706b54f06b3cbe5558ac17e2e14666cd5dcc", + "https://bcr.bazel.build/modules/rules_cc/0.0.16/MODULE.bazel": "7661303b8fc1b4d7f532e54e9d6565771fea666fbdf839e0a86affcd02defe87", + "https://bcr.bazel.build/modules/rules_cc/0.0.17/MODULE.bazel": "2ae1d8f4238ec67d7185d8861cb0a2cdf4bc608697c331b95bf990e69b62e64a", + "https://bcr.bazel.build/modules/rules_cc/0.0.2/MODULE.bazel": "6915987c90970493ab97393024c156ea8fb9f3bea953b2f3ec05c34f19b5695c", + "https://bcr.bazel.build/modules/rules_cc/0.0.6/MODULE.bazel": "abf360251023dfe3efcef65ab9d56beefa8394d4176dd29529750e1c57eaa33f", + "https://bcr.bazel.build/modules/rules_cc/0.0.8/MODULE.bazel": "964c85c82cfeb6f3855e6a07054fdb159aced38e99a5eecf7bce9d53990afa3e", + "https://bcr.bazel.build/modules/rules_cc/0.0.9/MODULE.bazel": "836e76439f354b89afe6a911a7adf59a6b2518fafb174483ad78a2a2fde7b1c5", + "https://bcr.bazel.build/modules/rules_cc/0.1.1/MODULE.bazel": "2f0222a6f229f0bf44cd711dc13c858dad98c62d52bd51d8fc3a764a83125513", + "https://bcr.bazel.build/modules/rules_cc/0.1.2/MODULE.bazel": "557ddc3a96858ec0d465a87c0a931054d7dcfd6583af2c7ed3baf494407fd8d0", + "https://bcr.bazel.build/modules/rules_cc/0.1.5/MODULE.bazel": "88dfc9361e8b5ae1008ac38f7cdfd45ad738e4fa676a3ad67d19204f045a1fd8", + "https://bcr.bazel.build/modules/rules_cc/0.2.0/MODULE.bazel": "b5c17f90458caae90d2ccd114c81970062946f49f355610ed89bebf954f5783c", + "https://bcr.bazel.build/modules/rules_cc/0.2.13/MODULE.bazel": "eecdd666eda6be16a8d9dc15e44b5c75133405e820f620a234acc4b1fdc5aa37", + "https://bcr.bazel.build/modules/rules_cc/0.2.16/MODULE.bazel": "9242fa89f950c6ef7702801ab53922e99c69b02310c39fb6e62b2bd30df2a1d4", + "https://bcr.bazel.build/modules/rules_cc/0.2.17/MODULE.bazel": "1849602c86cb60da8613d2de887f9566a6d354a6df6d7009f9d04a14402f9a84", + "https://bcr.bazel.build/modules/rules_cc/0.2.18/MODULE.bazel": "4460ec36adc8f722a6a2a4ac9374cb91f2acebadaa93fc37966129afb3dece87", + "https://bcr.bazel.build/modules/rules_cc/0.2.18/source.json": "abad668ff2fd63ada1ac49bf386d37e27048b89a3465a6fd968bb832b00a09d3", + "https://bcr.bazel.build/modules/rules_cc/0.2.4/MODULE.bazel": "1ff1223dfd24f3ecf8f028446d4a27608aa43c3f41e346d22838a4223980b8cc", + "https://bcr.bazel.build/modules/rules_cc/0.2.8/MODULE.bazel": "f1df20f0bf22c28192a794f29b501ee2018fa37a3862a1a2132ae2940a23a642", + "https://bcr.bazel.build/modules/rules_distroless/0.9.4/MODULE.bazel": "e098aab7f99a64d254bd4f425db6d7fb0818e2362f028d1672964ee130615567", + "https://bcr.bazel.build/modules/rules_distroless/0.9.4/source.json": "f4cc35c677da04b354d652a4b5835a7ad1dbd3d53043fbce163a050ae2af85d1", + "https://bcr.bazel.build/modules/rules_foreign_cc/0.9.0/MODULE.bazel": "c9e8c682bf75b0e7c704166d79b599f93b72cfca5ad7477df596947891feeef6", + "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/MODULE.bazel": "40c97d1144356f52905566c55811f13b299453a14ac7769dfba2ac38192337a8", + "https://bcr.bazel.build/modules/rules_java/4.0.0/MODULE.bazel": "5a78a7ae82cd1a33cef56dc578c7d2a46ed0dca12643ee45edbb8417899e6f74", + "https://bcr.bazel.build/modules/rules_java/5.3.5/MODULE.bazel": "a4ec4f2db570171e3e5eb753276ee4b389bae16b96207e9d3230895c99644b86", + "https://bcr.bazel.build/modules/rules_java/6.0.0/MODULE.bazel": "8a43b7df601a7ec1af61d79345c17b31ea1fedc6711fd4abfd013ea612978e39", + "https://bcr.bazel.build/modules/rules_java/6.3.0/MODULE.bazel": "a97c7678c19f236a956ad260d59c86e10a463badb7eb2eda787490f4c969b963", + "https://bcr.bazel.build/modules/rules_java/6.4.0/MODULE.bazel": "e986a9fe25aeaa84ac17ca093ef13a4637f6107375f64667a15999f77db6c8f6", + "https://bcr.bazel.build/modules/rules_java/6.5.2/MODULE.bazel": "1d440d262d0e08453fa0c4d8f699ba81609ed0e9a9a0f02cd10b3e7942e61e31", + "https://bcr.bazel.build/modules/rules_java/7.10.0/MODULE.bazel": "530c3beb3067e870561739f1144329a21c851ff771cd752a49e06e3dc9c2e71a", + "https://bcr.bazel.build/modules/rules_java/7.12.2/MODULE.bazel": "579c505165ee757a4280ef83cda0150eea193eed3bef50b1004ba88b99da6de6", + "https://bcr.bazel.build/modules/rules_java/7.2.0/MODULE.bazel": "06c0334c9be61e6cef2c8c84a7800cef502063269a5af25ceb100b192453d4ab", + "https://bcr.bazel.build/modules/rules_java/7.3.2/MODULE.bazel": "50dece891cfdf1741ea230d001aa9c14398062f2b7c066470accace78e412bc2", + "https://bcr.bazel.build/modules/rules_java/7.6.1/MODULE.bazel": "2f14b7e8a1aa2f67ae92bc69d1ec0fa8d9f827c4e17ff5e5f02e91caa3b2d0fe", + "https://bcr.bazel.build/modules/rules_java/8.3.2/MODULE.bazel": "7336d5511ad5af0b8615fdc7477535a2e4e723a357b6713af439fe8cf0195017", + "https://bcr.bazel.build/modules/rules_java/8.5.1/MODULE.bazel": "d8a9e38cc5228881f7055a6079f6f7821a073df3744d441978e7a43e20226939", + "https://bcr.bazel.build/modules/rules_java/8.6.0/MODULE.bazel": "9c064c434606d75a086f15ade5edb514308cccd1544c2b2a89bbac4310e41c71", + "https://bcr.bazel.build/modules/rules_java/8.6.1/MODULE.bazel": "f4808e2ab5b0197f094cabce9f4b006a27766beb6a9975931da07099560ca9c2", + "https://bcr.bazel.build/modules/rules_java/8.8.0/MODULE.bazel": "de589d0880911ac007abd521b9f0ddcd8b0dbd05c8553e6f8124a050b83acf7d", + "https://bcr.bazel.build/modules/rules_java/9.1.0/MODULE.bazel": "ee63f27e36a3fada80342869361182f120a9819c74320e8e65b1e04ba0cd7a9d", + "https://bcr.bazel.build/modules/rules_java/9.1.0/source.json": "da589573c1dee2c9ac4a568b301269a2e8191110ff0345c1a959fa7ea6c4dfd6", + "https://bcr.bazel.build/modules/rules_jvm_external/4.4.2/MODULE.bazel": "a56b85e418c83eb1839819f0b515c431010160383306d13ec21959ac412d2fe7", + "https://bcr.bazel.build/modules/rules_jvm_external/5.1/MODULE.bazel": "33f6f999e03183f7d088c9be518a63467dfd0be94a11d0055fe2d210f89aa909", + "https://bcr.bazel.build/modules/rules_jvm_external/5.2/MODULE.bazel": "d9351ba35217ad0de03816ef3ed63f89d411349353077348a45348b096615036", + "https://bcr.bazel.build/modules/rules_jvm_external/5.3/MODULE.bazel": "bf93870767689637164657731849fb887ad086739bd5d360d90007a581d5527d", + "https://bcr.bazel.build/modules/rules_jvm_external/6.1/MODULE.bazel": "75b5fec090dbd46cf9b7d8ea08cf84a0472d92ba3585b476f44c326eda8059c4", + "https://bcr.bazel.build/modules/rules_jvm_external/6.3/MODULE.bazel": "c998e060b85f71e00de5ec552019347c8bca255062c990ac02d051bb80a38df0", + "https://bcr.bazel.build/modules/rules_jvm_external/6.7/MODULE.bazel": "e717beabc4d091ecb2c803c2d341b88590e9116b8bf7947915eeb33aab4f96dd", + "https://bcr.bazel.build/modules/rules_jvm_external/6.7/source.json": "5426f412d0a7fc6b611643376c7e4a82dec991491b9ce5cb1cfdd25fe2e92be4", + "https://bcr.bazel.build/modules/rules_kotlin/1.9.0/MODULE.bazel": "ef85697305025e5a61f395d4eaede272a5393cee479ace6686dba707de804d59", + "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/MODULE.bazel": "d269a01a18ee74d0335450b10f62c9ed81f2321d7958a2934e44272fe82dcef3", + "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/source.json": "2faa4794364282db7c06600b7e5e34867a564ae91bda7cae7c29c64e9466b7d5", + "https://bcr.bazel.build/modules/rules_license/0.0.3/MODULE.bazel": "627e9ab0247f7d1e05736b59dbb1b6871373de5ad31c3011880b4133cafd4bd0", + "https://bcr.bazel.build/modules/rules_license/0.0.7/MODULE.bazel": "088fbeb0b6a419005b89cf93fe62d9517c0a2b8bb56af3244af65ecfe37e7d5d", + "https://bcr.bazel.build/modules/rules_license/1.0.0/MODULE.bazel": "a7fda60eefdf3d8c827262ba499957e4df06f659330bbe6cdbdb975b768bb65c", + "https://bcr.bazel.build/modules/rules_license/1.0.0/source.json": "a52c89e54cc311196e478f8382df91c15f7a2bfdf4c6cd0e2675cc2ff0b56efb", + "https://bcr.bazel.build/modules/rules_pkg/0.7.0/MODULE.bazel": "df99f03fc7934a4737122518bb87e667e62d780b610910f0447665a7e2be62dc", + "https://bcr.bazel.build/modules/rules_pkg/1.0.1/MODULE.bazel": "5b1df97dbc29623bccdf2b0dcd0f5cb08e2f2c9050aab1092fd39a41e82686ff", + "https://bcr.bazel.build/modules/rules_pkg/1.1.0/MODULE.bazel": "9db8031e71b6ef32d1846106e10dd0ee2deac042bd9a2de22b4761b0c3036453", + "https://bcr.bazel.build/modules/rules_pkg/1.1.0/source.json": "fef768df13a92ce6067e1cd0cdc47560dace01354f1d921cfb1d632511f7d608", + "https://bcr.bazel.build/modules/rules_proto/4.0.0/MODULE.bazel": "a7a7b6ce9bee418c1a760b3d84f83a299ad6952f9903c67f19e4edd964894e06", + "https://bcr.bazel.build/modules/rules_proto/5.3.0-21.7/MODULE.bazel": "e8dff86b0971688790ae75528fe1813f71809b5afd57facb44dad9e8eca631b7", + "https://bcr.bazel.build/modules/rules_proto/6.0.0-rc1/MODULE.bazel": "1e5b502e2e1a9e825eef74476a5a1ee524a92297085015a052510b09a1a09483", + "https://bcr.bazel.build/modules/rules_proto/6.0.2/MODULE.bazel": "ce916b775a62b90b61888052a416ccdda405212b6aaeb39522f7dc53431a5e73", + "https://bcr.bazel.build/modules/rules_proto/7.0.2/MODULE.bazel": "bf81793bd6d2ad89a37a40693e56c61b0ee30f7a7fdbaf3eabbf5f39de47dea2", + "https://bcr.bazel.build/modules/rules_proto/7.1.0/MODULE.bazel": "002d62d9108f75bb807cd56245d45648f38275cb3a99dcd45dfb864c5d74cb96", + "https://bcr.bazel.build/modules/rules_proto/7.1.0/source.json": "39f89066c12c24097854e8f57ab8558929f9c8d474d34b2c00ac04630ad8940e", + "https://bcr.bazel.build/modules/rules_python/0.10.2/MODULE.bazel": "cc82bc96f2997baa545ab3ce73f196d040ffb8756fd2d66125a530031cd90e5f", + "https://bcr.bazel.build/modules/rules_python/0.23.1/MODULE.bazel": "49ffccf0511cb8414de28321f5fcf2a31312b47c40cc21577144b7447f2bf300", + "https://bcr.bazel.build/modules/rules_python/0.25.0/MODULE.bazel": "72f1506841c920a1afec76975b35312410eea3aa7b63267436bfb1dd91d2d382", + "https://bcr.bazel.build/modules/rules_python/0.28.0/MODULE.bazel": "cba2573d870babc976664a912539b320cbaa7114cd3e8f053c720171cde331ed", + "https://bcr.bazel.build/modules/rules_python/0.31.0/MODULE.bazel": "93a43dc47ee570e6ec9f5779b2e64c1476a6ce921c48cc9a1678a91dd5f8fd58", + "https://bcr.bazel.build/modules/rules_python/0.33.2/MODULE.bazel": "3e036c4ad8d804a4dad897d333d8dce200d943df4827cb849840055be8d2e937", + "https://bcr.bazel.build/modules/rules_python/0.4.0/MODULE.bazel": "9208ee05fd48bf09ac60ed269791cf17fb343db56c8226a720fbb1cdf467166c", + "https://bcr.bazel.build/modules/rules_python/1.0.0/MODULE.bazel": "898a3d999c22caa585eb062b600f88654bf92efb204fa346fb55f6f8edffca43", + "https://bcr.bazel.build/modules/rules_python/1.3.0/MODULE.bazel": "8361d57eafb67c09b75bf4bbe6be360e1b8f4f18118ab48037f2bd50aa2ccb13", + "https://bcr.bazel.build/modules/rules_python/1.4.1/MODULE.bazel": "8991ad45bdc25018301d6b7e1d3626afc3c8af8aaf4bc04f23d0b99c938b73a6", + "https://bcr.bazel.build/modules/rules_python/1.6.0/MODULE.bazel": "7e04ad8f8d5bea40451cf80b1bd8262552aa73f841415d20db96b7241bd027d8", + "https://bcr.bazel.build/modules/rules_python/1.7.0/MODULE.bazel": "d01f995ecd137abf30238ad9ce97f8fc3ac57289c8b24bd0bf53324d937a14f8", + "https://bcr.bazel.build/modules/rules_python/1.9.0/MODULE.bazel": "afc3a05f29f09f2d3ee95ad99a145250dab41a2b2d8d6f82cc91936b3213282c", + "https://bcr.bazel.build/modules/rules_python/1.9.0/source.json": "3921ea0b65298d51aead5b9e4a82203d7be9b5918619b58b53f1c259f4e63169", + "https://bcr.bazel.build/modules/rules_shell/0.2.0/MODULE.bazel": "fda8a652ab3c7d8fee214de05e7a9916d8b28082234e8d2c0094505c5268ed3c", + "https://bcr.bazel.build/modules/rules_shell/0.3.0/MODULE.bazel": "de4402cd12f4cc8fda2354fce179fdb068c0b9ca1ec2d2b17b3e21b24c1a937b", + "https://bcr.bazel.build/modules/rules_shell/0.4.1/MODULE.bazel": "00e501db01bbf4e3e1dd1595959092c2fadf2087b2852d3f553b5370f5633592", + "https://bcr.bazel.build/modules/rules_shell/0.6.1/MODULE.bazel": "72e76b0eea4e81611ef5452aa82b3da34caca0c8b7b5c0c9584338aa93bae26b", + "https://bcr.bazel.build/modules/rules_shell/0.6.1/source.json": "20ec05cd5e592055e214b2da8ccb283c7f2a421ea0dc2acbf1aa792e11c03d0c", + "https://bcr.bazel.build/modules/rules_swift/1.16.0/MODULE.bazel": "4a09f199545a60d09895e8281362b1ff3bb08bbde69c6fc87aff5b92fcc916ca", + "https://bcr.bazel.build/modules/rules_swift/2.1.1/MODULE.bazel": "494900a80f944fc7aa61500c2073d9729dff0b764f0e89b824eb746959bc1046", + "https://bcr.bazel.build/modules/rules_swift/2.4.0/MODULE.bazel": "1639617eb1ede28d774d967a738b4a68b0accb40650beadb57c21846beab5efd", + "https://bcr.bazel.build/modules/rules_swift/3.1.2/MODULE.bazel": "72c8f5cf9d26427cee6c76c8e3853eb46ce6b0412a081b2b6db6e8ad56267400", + "https://bcr.bazel.build/modules/rules_swift/3.1.2/source.json": "e85761f3098a6faf40b8187695e3de6d97944e98abd0d8ce579cb2daf6319a66", + "https://bcr.bazel.build/modules/stardoc/0.5.1/MODULE.bazel": "1a05d92974d0c122f5ccf09291442580317cdd859f07a8655f1db9a60374f9f8", + "https://bcr.bazel.build/modules/stardoc/0.5.3/MODULE.bazel": "c7f6948dae6999bf0db32c1858ae345f112cacf98f174c7a8bb707e41b974f1c", + "https://bcr.bazel.build/modules/stardoc/0.5.6/MODULE.bazel": "c43dabc564990eeab55e25ed61c07a1aadafe9ece96a4efabb3f8bf9063b71ef", + "https://bcr.bazel.build/modules/stardoc/0.6.2/MODULE.bazel": "7060193196395f5dd668eda046ccbeacebfd98efc77fed418dbe2b82ffaa39fd", + "https://bcr.bazel.build/modules/stardoc/0.7.0/MODULE.bazel": "05e3d6d30c099b6770e97da986c53bd31844d7f13d41412480ea265ac9e8079c", + "https://bcr.bazel.build/modules/stardoc/0.7.1/MODULE.bazel": "3548faea4ee5dda5580f9af150e79d0f6aea934fc60c1cc50f4efdd9420759e7", + "https://bcr.bazel.build/modules/stardoc/0.7.2/MODULE.bazel": "fc152419aa2ea0f51c29583fab1e8c99ddefd5b3778421845606ee628629e0e5", + "https://bcr.bazel.build/modules/stardoc/0.7.2/source.json": "58b029e5e901d6802967754adf0a9056747e8176f017cfe3607c0851f4d42216", + "https://bcr.bazel.build/modules/swift_argument_parser/1.3.1.1/MODULE.bazel": "5e463fbfba7b1701d957555ed45097d7f984211330106ccd1352c6e0af0dcf91", + "https://bcr.bazel.build/modules/swift_argument_parser/1.3.1.2/MODULE.bazel": "75aab2373a4bbe2a1260b9bf2a1ebbdbf872d3bd36f80bff058dccd82e89422f", + "https://bcr.bazel.build/modules/swift_argument_parser/1.3.1.2/source.json": "5fba48bbe0ba48761f9e9f75f92876cafb5d07c0ce059cc7a8027416de94a05b", + "https://bcr.bazel.build/modules/tar.bzl/0.10.1/MODULE.bazel": "bf5fda5b5ccef8c3c4a5f4886144377386e0baa382972f257acb42dcf40ea908", + "https://bcr.bazel.build/modules/tar.bzl/0.10.1/source.json": "3f1beb35acf53c270a9de493cdc775a985551d7069cfcf24e136b42f683bbb10", + "https://bcr.bazel.build/modules/tar.bzl/0.2.1/MODULE.bazel": "52d1c00a80a8cc67acbd01649e83d8dd6a9dc426a6c0b754a04fe8c219c76468", + "https://bcr.bazel.build/modules/tar.bzl/0.5.1/MODULE.bazel": "7c2eb3dcfc53b0f3d6f9acdfd911ca803eaf92aadf54f8ca6e4c1f3aee288351", + "https://bcr.bazel.build/modules/tar.bzl/0.6.0/MODULE.bazel": "a3584b4edcfafcabd9b0ef9819808f05b372957bbdff41601429d5fd0aac2e7c", + "https://bcr.bazel.build/modules/toml.bzl/0.3.0/MODULE.bazel": "5016e5dd1ad2200e119a4b28b2b3935e276c4b480f2fe3e952bea7eeba88f578", + "https://bcr.bazel.build/modules/toml.bzl/0.3.0/source.json": "0cf7c878c419b37ddb55f3dd93dd7c0c409bd7c4efacb3da504e0748780b2fa9", + "https://bcr.bazel.build/modules/upb/0.0.0-20220923-a547704/MODULE.bazel": "7298990c00040a0e2f121f6c32544bab27d4452f80d9ce51349b1a28f3005c43", + "https://bcr.bazel.build/modules/with_cfg.bzl/0.14.6/MODULE.bazel": "6b6c543e415d2a502954766e50c6a6144a131687f2751b62157a9250e2b04982", + "https://bcr.bazel.build/modules/with_cfg.bzl/0.14.6/source.json": "12363ac76d821f6c7dabfebbd673615391da06e2e33f576402d31a96a7b56532", + "https://bcr.bazel.build/modules/yq.bzl/0.1.1/MODULE.bazel": "9039681f9bcb8958ee2c87ffc74bdafba9f4369096a2b5634b88abc0eaefa072", + "https://bcr.bazel.build/modules/yq.bzl/0.3.1/MODULE.bazel": "9bcb7151b3cd4681b89d350530eaf7b45e32a44dda94843b8932b0cb1cd4594a", + "https://bcr.bazel.build/modules/yq.bzl/0.3.1/source.json": "f0b0f204a2a6b0e34b4c9541efe8c04f2ef1af65948daa784eccea738b21dbd2", + "https://bcr.bazel.build/modules/zlib/1.2.11/MODULE.bazel": "07b389abc85fdbca459b69e2ec656ae5622873af3f845e1c9d80fe179f3effa0", + "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/MODULE.bazel": "eec517b5bbe5492629466e11dae908d043364302283de25581e3eb944326c4ca", + "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/source.json": "22bc55c47af97246cfc093d0acf683a7869377de362b5d1c552c2c2e16b7a806", + "https://bcr.bazel.build/modules/zlib/1.3.1/MODULE.bazel": "751c9940dcfe869f5f7274e1295422a34623555916eb98c174c1e945594bf198" + }, + "selectedYankedVersions": {}, + "moduleExtensions": { + "@@aspect_tools_telemetry+//:extension.bzl%telemetry": { + "general": { + "bzlTransitiveDigest": "cl5A2O84vDL6Tt+Qga8FCj1DUDGqn+e7ly5rZ+4xvcc=", + "usagesDigest": "kqQBy77VGMZA0qEiCyGKY3JKPhKrjzzyMVYd0SUIw30=", + "recordedInputs": [ + "REPO_MAPPING:aspect_tools_telemetry+,bazel_lib bazel_lib+", + "REPO_MAPPING:aspect_tools_telemetry+,bazel_skylib bazel_skylib+" + ], + "generatedRepoSpecs": { + "aspect_tools_telemetry_report": { + "repoRuleId": "@@aspect_tools_telemetry+//:extension.bzl%tel_repository", + "attributes": { + "deps": { + "aspect_rules_py": "2.0.0-alpha.4", + "aspect_tools_telemetry": "0.3.3" + } + } + } + } + } + }, + "@@rules_kotlin+//src/main/starlark/core/repositories:bzlmod_setup.bzl%rules_kotlin_extensions": { + "general": { + "bzlTransitiveDigest": "+Kp6j204mBZ3mxlIDDR0gBoP45BZ4jYRhRAcB8sU0qc=", + "usagesDigest": "QI2z8ZUR+mqtbwsf2fLqYdJAkPOHdOV+tF2yVAUgRzw=", + "recordedInputs": [ + "REPO_MAPPING:rules_kotlin+,bazel_tools bazel_tools" + ], + "generatedRepoSpecs": { + "com_github_jetbrains_kotlin_git": { + "repoRuleId": "@@rules_kotlin+//src/main/starlark/core/repositories:compiler.bzl%kotlin_compiler_git_repository", + "attributes": { + "urls": [ + "https://github.com/JetBrains/kotlin/releases/download/v1.9.23/kotlin-compiler-1.9.23.zip" + ], + "sha256": "93137d3aab9afa9b27cb06a824c2324195c6b6f6179d8a8653f440f5bd58be88" + } + }, + "com_github_jetbrains_kotlin": { + "repoRuleId": "@@rules_kotlin+//src/main/starlark/core/repositories:compiler.bzl%kotlin_capabilities_repository", + "attributes": { + "git_repository_name": "com_github_jetbrains_kotlin_git", + "compiler_version": "1.9.23" + } + }, + "com_github_google_ksp": { + "repoRuleId": "@@rules_kotlin+//src/main/starlark/core/repositories:ksp.bzl%ksp_compiler_plugin_repository", + "attributes": { + "urls": [ + "https://github.com/google/ksp/releases/download/1.9.23-1.0.20/artifacts.zip" + ], + "sha256": "ee0618755913ef7fd6511288a232e8fad24838b9af6ea73972a76e81053c8c2d", + "strip_version": "1.9.23-1.0.20" + } + }, + "com_github_pinterest_ktlint": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_file", + "attributes": { + "sha256": "01b2e0ef893383a50dbeb13970fe7fa3be36ca3e83259e01649945b09d736985", + "urls": [ + "https://github.com/pinterest/ktlint/releases/download/1.3.0/ktlint" + ], + "executable": true + } + }, + "rules_android": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "sha256": "cd06d15dd8bb59926e4d65f9003bfc20f9da4b2519985c27e190cddc8b7a7806", + "strip_prefix": "rules_android-0.1.1", + "urls": [ + "https://github.com/bazelbuild/rules_android/archive/v0.1.1.zip" + ] + } + } + } + } + }, + "@@rules_python+//python/uv:uv.bzl%uv": { + "general": { + "bzlTransitiveDigest": "yG9F6L2IZXKRbD/aIUa6sU7uITLUTBKOMWPbIvl1VdM=", + "usagesDigest": "6MjoD3H+netDdhklgMWks3NARpHVXxy8kfsMe9XXPa8=", + "recordedInputs": [ + "REPO_MAPPING:rules_python+,bazel_tools bazel_tools", + "REPO_MAPPING:rules_python+,platforms platforms" + ], + "generatedRepoSpecs": { + "uv": { + "repoRuleId": "@@rules_python+//python/uv/private:uv_toolchains_repo.bzl%uv_toolchains_repo", + "attributes": { + "toolchain_type": "'@@rules_python+//python/uv:uv_toolchain_type'", + "toolchain_names": [ + "none" + ], + "toolchain_implementations": { + "none": "'@@rules_python+//python:none'" + }, + "toolchain_compatible_with": { + "none": [ + "@platforms//:incompatible" + ] + }, + "toolchain_target_settings": {} + } + } + } + } + }, + "@@yq.bzl+//yq:extensions.bzl%yq": { + "general": { + "bzlTransitiveDigest": "61Uz+o5PnlY0jJfPZEUNqsKxnM/UCLeWsn5VVCc8u5Y=", + "usagesDigest": "oAQ5Hp6H1wlr4abmhh+iBqk43oSfdXw+++tKd5PKWHE=", + "recordedInputs": [], + "generatedRepoSpecs": { + "yq_darwin_amd64": { + "repoRuleId": "@@yq.bzl+//yq/toolchain:platforms.bzl%yq_platform_repo", + "attributes": { + "platform": "darwin_amd64", + "version": "4.45.1" + } + }, + "yq_darwin_arm64": { + "repoRuleId": "@@yq.bzl+//yq/toolchain:platforms.bzl%yq_platform_repo", + "attributes": { + "platform": "darwin_arm64", + "version": "4.45.1" + } + }, + "yq_linux_amd64": { + "repoRuleId": "@@yq.bzl+//yq/toolchain:platforms.bzl%yq_platform_repo", + "attributes": { + "platform": "linux_amd64", + "version": "4.45.1" + } + }, + "yq_linux_arm64": { + "repoRuleId": "@@yq.bzl+//yq/toolchain:platforms.bzl%yq_platform_repo", + "attributes": { + "platform": "linux_arm64", + "version": "4.45.1" + } + }, + "yq_linux_s390x": { + "repoRuleId": "@@yq.bzl+//yq/toolchain:platforms.bzl%yq_platform_repo", + "attributes": { + "platform": "linux_s390x", + "version": "4.45.1" + } + }, + "yq_linux_riscv64": { + "repoRuleId": "@@yq.bzl+//yq/toolchain:platforms.bzl%yq_platform_repo", + "attributes": { + "platform": "linux_riscv64", + "version": "4.45.1" + } + }, + "yq_linux_ppc64le": { + "repoRuleId": "@@yq.bzl+//yq/toolchain:platforms.bzl%yq_platform_repo", + "attributes": { + "platform": "linux_ppc64le", + "version": "4.45.1" + } + }, + "yq_windows_amd64": { + "repoRuleId": "@@yq.bzl+//yq/toolchain:platforms.bzl%yq_platform_repo", + "attributes": { + "platform": "windows_amd64", + "version": "4.45.1" + } + }, + "yq_toolchains": { + "repoRuleId": "@@yq.bzl+//yq/toolchain:toolchain.bzl%yq_toolchains_repo", + "attributes": { + "user_repository_name": "yq" + } + } + } + } + } + }, + "facts": { + "@@aspect_rules_py+//py:extensions.bzl%python_interpreters": { + "release_index_v1_20241002_https://github.com/astral-sh/python-build-standalone/releases/download": { + "3.10/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.10.15+20241002-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.10.15", + "sha256": "bcfdf8235cd4f84ca280f33a17030e65ba23e7905e70a8ed2ed2c83229ad136f" + }, + "3.10/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.10.15+20241002-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.10.15", + "sha256": "2e364a47cdbfcfaf56122b7656a3e8a7163babbda4f6bb6165aa644cbc65bd57" + }, + "3.10/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.10.15+20241002-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.10.15", + "sha256": "814561a8addee5f56a19223ecdd879a22b82d631bd5704eac7b2e98287e797a8" + }, + "3.10/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.10.15+20241002-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.10.15", + "sha256": "35678c2ba6d7aff56ca96f06ca735fe4bd09e4a5d3d40f552d76a1653c80a123" + }, + "3.10/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.10.15+20241002-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.10.15", + "sha256": "422fb92c310f030b05ca8e59a256c72ffde38f03382a006284d9e5e2a7b646f5" + }, + "3.10/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.10.15+20241002-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.10.15", + "sha256": "f17cba68a55dcd386be4cbb0002cf3037718019fc1585b2ff9a32efd3283557d" + }, + "3.10/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.10.15+20241002-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.10.15", + "sha256": "7b2baf761282600359d43e6f14b01437a8d0e517ba3a28f50688806dd8897b11" + }, + "3.11/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.11.10+20241002-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.11.10", + "sha256": "540225743ca9ca04d7e0de520e211ecafb379677c49fba4b89334e7248219cb2" + }, + "3.11/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.11.10+20241002-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.11.10", + "sha256": "047e687b561f8e38740819cc3e112e83ae349927cca846921a1c301e5d9cc873" + }, + "3.11/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.11.10+20241002-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.11.10", + "sha256": "d9e75d5028c8975c158f4b9c01ef820480249b3401dbde755c0f344e15feebf5" + }, + "3.11/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.11.10+20241002-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.11.10", + "sha256": "f498693f03fd672a4dc581ef0e1101102d33964352c35ecff21686a8d00744c9" + }, + "3.11/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.11.10+20241002-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.11.10", + "sha256": "d71cde066b614903e9f243c4babd179e7e978fcfa95702355566463e623abe6c" + }, + "3.11/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.11.10+20241002-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.11.10", + "sha256": "9c0197e72b2dd1ebf56eb562cb7a078052b4ab71d5666cd3be3b6e75db42c79e" + }, + "3.11/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.11.10+20241002-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.11.10", + "sha256": "fb86dce628d2008eefd3550193839fb9f283f5f6c25a09c8b676713ff4757156" + }, + "3.12/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.12.7+20241002-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.12.7", + "sha256": "5a9cdbb8536839a83edae3e41eb44161b640d78181fec083e07c668ba796a875" + }, + "3.12/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.12.7+20241002-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.12.7", + "sha256": "5481ca52e7ac8685c1e9d4e804a66e5c928879e0f44799aa6934735f66266643" + }, + "3.12/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.12.7+20241002-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.12.7", + "sha256": "8c62920e2fef022fc49d58cc999c77ea45318f96a5a5c0ba3bb155d33732d7f3" + }, + "3.12/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.12.7+20241002-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.12.7", + "sha256": "60eaf2c9a63926f5edfe7a0ecf4b2fbb37de6764f0c0100be245d098e3995da7" + }, + "3.12/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.12.7+20241002-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.12.7", + "sha256": "1c74dd0499ef7d993d8942ebe6692c90c50d09719e0335f8e210b91277f8e7c0" + }, + "3.12/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.12.7+20241002-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.12.7", + "sha256": "04ffccbbb1beedd0bc80347c061fe527833001681ee543c3ba85dac5134ed500" + }, + "3.12/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.12.7+20241002-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.12.7", + "sha256": "d4a8f2b3e422089475bcd6f2b855c9ed0e666af2de4f19df7c764362eb8c4aca" + }, + "3.13/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.13.0rc3+20241002-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.13.0rc3", + "sha256": "577e846eaf0a27342b3f80b5f292eb292b0eb6a9df3a0fa0c5925e86cfe046a3" + }, + "3.13/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.13.0rc3+20241002-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.13.0rc3", + "sha256": "48974ab9b4a6990b17e6740393492fc5557e6acc4ab02be9d9543e0e506e48a6" + }, + "3.13/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.13.0rc3+20241002-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.13.0rc3", + "sha256": "fa5e8195fa7a6b6d4df0bc92b36d38836b72c4f5fb41978d495abe5a454fed67" + }, + "3.13/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.13.0rc3+20241002-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.13.0rc3", + "sha256": "81a01923b25a4b2b68f517b07a4a4a9186d873e6518f060e4a004e77d7094687" + }, + "3.13/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.13.0rc3+20241002-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.13.0rc3", + "sha256": "319ecb727317868c4f3bfecd480f216b38275f5373f72c022d255318b650ebe2" + }, + "3.13/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.13.0rc3+20241002-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.13.0rc3", + "sha256": "a4b4e0a79b53938db050daf7f78dd09faf49d1e29dbba6cac87cf857c0a51fb4" + }, + "3.13/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.13.0rc3+20241002-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.13.0rc3", + "sha256": "56fac98fb5ed39f67cd7c0ce6e503a1e551ce727dc46796a0f16c09d26e845aa" + }, + "3.8/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.8.20+20241002-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.8.20", + "sha256": "2ddfc04bdb3e240f30fb782fa1deec6323799d0e857e0b63fa299218658fd3d4" + }, + "3.8/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.8.20+20241002-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.8.20", + "sha256": "9d8798f9e79e0fc0f36fcb95bfa28a1023407d51a8ea5944b4da711f1f75f1ed" + }, + "3.8/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.8.20+20241002-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.8.20", + "sha256": "06988218600fe3e2c02c3182d5629a1d4e596b3771ab32a9e99756c5904b5fac" + }, + "3.8/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.8.20+20241002-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.8.20", + "sha256": "68d060cd373255d2ca5b8b3441363d5aa7cc45b0c11bbccf52b1717c2b5aa8bb" + }, + "3.8/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.8.20+20241002-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.8.20", + "sha256": "41b6709fec9c56419b7de1940d1f87fa62045aff81734480672dcb807eedc47e" + }, + "3.8/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.8.20+20241002-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.8.20", + "sha256": "285e141c36f88b2e9357654c5f77d1f8fb29cc25132698fe35bb30d787f38e87" + }, + "3.8/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.8.20+20241002-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.8.20", + "sha256": "ea8d7f9dd35815cf88f5ed257b5d0206d97df5a9500f719b6a6031b8c7071db8" + }, + "3.9/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.9.20+20241002-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.9.20", + "sha256": "dc5f3b4c54deea7a42479b3f81b1c1b3a330f721aea3aff7df9833567bbfa8ea" + }, + "3.9/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.9.20+20241002-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.9.20", + "sha256": "0d84fa0884e843828312a1fcbfd8756abe3d6cf3c27086f79cd7352bad13ac4c" + }, + "3.9/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.9.20+20241002-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.9.20", + "sha256": "bd2c7cf4d7eba224ada44dfbccf5248d313ba5072462c71aa753c824354704f3" + }, + "3.9/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.9.20+20241002-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.9.20", + "sha256": "a07be8fddd5f6f6a0db7abd16f2b2a8a94a891e54091e4f45b64e822597e4d7d" + }, + "3.9/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.9.20+20241002-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.9.20", + "sha256": "94000af8e9d9f5aba6d2325963a6b3403afbf310f6790edff3dfe8becd8197de" + }, + "3.9/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.9.20+20241002-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.9.20", + "sha256": "fec849569158e5e46610621d7da91b02dca2cc5f66dd49cc0f85d7469c8f5a84" + }, + "3.9/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.9.20+20241002-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.9.20", + "sha256": "31f5e329f14ac8b79527712c4265edfea1cb6dff4bb04cf8c51cd809290e136c" + } + }, + "release_index_v1_20251031_https://github.com/astral-sh/python-build-standalone/releases/download": { + "3.10/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.10.19+20251031-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.10.19", + "sha256": "43bda24c2fc073bc308bf631203b917a72640d59b59fdad4ba14503d84727012" + }, + "3.10/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.10.19+20251031-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.10.19", + "sha256": "f77a8a8aa77f3f943126fa9215a25309da4bf20398fc8f4b4eec54b5fc7570ef" + }, + "3.10/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.10.19+20251031-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.10.19", + "sha256": "9b9deba652d98857ae99bd11b05fb560144aafbd9b9e8e01c8c6d56577a06a4d" + }, + "3.10/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.10.19+20251031-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.10.19", + "sha256": "0240edca85508661e20bb69562686965c85b8328727332d9ebfd57cceb7fb372" + }, + "3.10/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.10.19+20251031-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.10.19", + "sha256": "76c12e633c09c2a790f8a958a55df4495527e0718d1875310c836e757c0c7b55" + }, + "3.10/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.10.19+20251031-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.10.19", + "sha256": "cfa08a4caf2df1b43551b843c052d6a8814e2ea0c97268b021f0423646c244c3" + }, + "3.10/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.10.19+20251031-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.10.19", + "sha256": "fb1caac917d7b6497bb6f5950da5f1e48d05c43a498948dd97f85760c4382d9f" + }, + "3.10/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.10.19+20251031-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.10.19", + "sha256": "ba85013ed5ac7733fc6840168cc33ed19e9959b363dc80227d54f8fd9c92c0f4" + }, + "3.11/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.11.14+20251031-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.11.14", + "sha256": "6de5572b33c65af1c9b7caf00ec593fb04cffb7e14fa393a98261bb9bc464713" + }, + "3.11/aarch64-pc-windows-msvc/install_only": { + "filename": "cpython-3.11.14+20251031-aarch64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.11.14", + "sha256": "38d0d1466561e15965e8d2c20f5e5be649598f55c761ecab553d087fbd217337" + }, + "3.11/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.11.14+20251031-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.11.14", + "sha256": "510edb027527413c4249256194cb8ad2590b52dd93f7123b4cb341aff5d05894" + }, + "3.11/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.11.14+20251031-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.11.14", + "sha256": "27609ec2b0c6172d5d9f502115a6d48c20ee0a578bf5b0470cd1090be95c22aa" + }, + "3.11/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.11.14+20251031-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.11.14", + "sha256": "b4341ef60bc157f992a0d171f1be4e4c42dcfc537f3562f72aa7f1f9561935e0" + }, + "3.11/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.11.14+20251031-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.11.14", + "sha256": "4891cbf34e8652b7bd1054b9502395e4b7e048e2e517c040fbf6c8297cb954d6" + }, + "3.11/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.11.14+20251031-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.11.14", + "sha256": "5223b83ed9e2aa5e9e17d2ebcf767956e998876339b9cde1980a47e9d4655fb6" + }, + "3.11/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.11.14+20251031-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.11.14", + "sha256": "60f0bd473d861cc45d3401d9914e47ccb9fa037f88a91879ed517a62042b8477" + }, + "3.11/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.11.14+20251031-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.11.14", + "sha256": "25e82d1e85b90a8ab724ee633a1811b1921797f5c25ee69c6595052371b91a87" + }, + "3.12/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.12.12+20251031-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.12.12", + "sha256": "5e110cb821d2eb8246065d3b46faa655180c976c4e17250f7883c634a629bc63" + }, + "3.12/aarch64-pc-windows-msvc/install_only": { + "filename": "cpython-3.12.12+20251031-aarch64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.12.12", + "sha256": "b190fed7c2b0f6e1010f554a0d1fd191c0754c4c0718e69d9d795ae559613780" + }, + "3.12/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.12.12+20251031-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.12.12", + "sha256": "81b644d166e0bfb918615af8a2363f8fcf26eccdcc60a5334b6a62c088470bac" + }, + "3.12/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.12.12+20251031-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.12.12", + "sha256": "fc423af42f4eb454c99779d9eedc619141606572da3851f7980a8da719f0f8db" + }, + "3.12/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.12.12+20251031-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.12.12", + "sha256": "7d333e58a53edb1ba3c85bb35dc718ea3e599d0f6b58a0cbef35b2d8184a763e" + }, + "3.12/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.12.12+20251031-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.12.12", + "sha256": "687052a046d33be49dc95dd671816709067cf6176ed36c93ea61b1fe0b883b0f" + }, + "3.12/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.12.12+20251031-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.12.12", + "sha256": "cff398b3f520c442a1b085dd347126c10c1b03f01ccc0decd8c897a687e893f1" + }, + "3.12/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.12.12+20251031-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.12.12", + "sha256": "80c3882f14e15cef8260ef5257d198e8f4371ca265887431d939e0d561de3253" + }, + "3.12/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.12.12+20251031-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.12.12", + "sha256": "0a461330b9b89f2ea3088dde10d7a3f96aa65897b7c5ce2404fa3b5c4b8daa14" + }, + "3.13/aarch64-apple-darwin/freethreaded": { + "filename": "cpython-3.13.9+20251031-aarch64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.13.9", + "sha256": "eae1272a72ccce601590a10a9ca2a58199b5fcdf022aa603a527e3e2a04de9bc" + }, + "3.13/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.13.9+20251031-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.13.9", + "sha256": "1f3568d17383426d52350c2ef7c93c1a5a043198b860cb05e5d19b35f9c25cef" + }, + "3.13/aarch64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.13.9+20251031-aarch64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.13.9", + "sha256": "743ff69935ef28834621647dab30f032dfcd80315732917531eea333210941c7" + }, + "3.13/aarch64-pc-windows-msvc/install_only": { + "filename": "cpython-3.13.9+20251031-aarch64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.13.9", + "sha256": "20db43873d3c4c2175d866806545e4ad4ec6bb72ca95e60082a4df6c24567e8c" + }, + "3.13/aarch64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.13.9+20251031-aarch64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.13.9", + "sha256": "a6e72f9de5d9b46cf6968d6a492f2401a919f9b959f8da2d87f43484b80169ee" + }, + "3.13/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.13.9+20251031-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.13.9", + "sha256": "0a56d11b0fb1662e67f892b9d5d1717aef06f24dbb8362bc25b8f784e620d44e" + }, + "3.13/aarch64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.13.9+20251031-aarch64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.13.9", + "sha256": "ba6a8d199c9f2a7aa5b88fdf16132049d675ab483eb6250e176a90fa0726eac4" + }, + "3.13/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.13.9+20251031-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.13.9", + "sha256": "90c803b66f8483caeeb5655ca82b7f19068515826a569ed05414326a6ff8d06d" + }, + "3.13/i686-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.13.9+20251031-i686-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.13.9", + "sha256": "a6cb3d7df191cde663ebf5f0108a9d7742e33862676ecde97fd90184333e822d" + }, + "3.13/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.13.9+20251031-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.13.9", + "sha256": "c0b0a34a492465bd44e9512582ae4ca47c06f9696807048cd917cb71c03a8416" + }, + "3.13/x86_64-apple-darwin/freethreaded": { + "filename": "cpython-3.13.9+20251031-x86_64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.13.9", + "sha256": "e2bf5fa6a3ef443ade362e08b0a19bbc172f7bfe34dabe933ccaad31d53af5da" + }, + "3.13/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.13.9+20251031-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.13.9", + "sha256": "48c0f3ca5d31e90658ef99138dc21865bb62f388ab97a1ce72cac176da194ab0" + }, + "3.13/x86_64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.13.9+20251031-x86_64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.13.9", + "sha256": "318a9a1e43dd52054327de3bccc0c5b7afde7b7f2a398ccb4d38e03d28b05386" + }, + "3.13/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.13.9+20251031-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.13.9", + "sha256": "874593f641f31ea101440c70f81768c35d4d7d6df111fde63094db67465ef787" + }, + "3.13/x86_64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.13.9+20251031-x86_64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.13.9", + "sha256": "dcc29b069d0588fbd4ea29c6df840c8d1207d2a3bce8cd5cd57d1b85373b6048" + }, + "3.13/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.13.9+20251031-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.13.9", + "sha256": "6f05b91ee8c7e6dd0f9c60b95bb29130e2d623961de6578b643e80ddd83f96b6" + }, + "3.13/x86_64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.13.9+20251031-x86_64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.13.9", + "sha256": "4c5c9a251a45288ebd4a51900708eb2ada9197173ba56e5604b6b63727fb87ff" + }, + "3.13/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.13.9+20251031-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.13.9", + "sha256": "ad987197034185e628715da504a50613af213dc21ba6d5ccaeab3db2c464aa6c" + }, + "3.14/aarch64-apple-darwin/freethreaded": { + "filename": "cpython-3.14.0+20251031-aarch64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.14.0", + "sha256": "d9c7b430b25bd3837dbb03f945dbe6b7bc526c5940ca96f5db7cdc42f6b2b801" + }, + "3.14/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.14.0+20251031-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.14.0", + "sha256": "b4bcd3c6c24cab32ae99e1b05c89312b783b4d69431d702e5012fe1fdcad4087" + }, + "3.14/aarch64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.14.0+20251031-aarch64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.14.0", + "sha256": "40266e60f655e49cd1d5303295255909a4b593b08b88be6e6a55b2c9fe6ed13d" + }, + "3.14/aarch64-pc-windows-msvc/install_only": { + "filename": "cpython-3.14.0+20251031-aarch64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.14.0", + "sha256": "599a8b7e12439cd95a201dbdfe95cf363146b1ff91f379555dafd86b170caab9" + }, + "3.14/aarch64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.14.0+20251031-aarch64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.14.0", + "sha256": "f383ef50d1da6ca511212e5ae601923b56636b87351fd5fc847e0ea0a19fa9b3" + }, + "3.14/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.14.0+20251031-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.14.0", + "sha256": "128a9cbfb9645d5237ec01704d9d1d2ac5f084464cc43c37a4cd96aa9c3b1ad5" + }, + "3.14/aarch64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.14.0+20251031-aarch64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.14.0", + "sha256": "33c7aa105634102c61b8ad01c801dbaf1950e59c04a876b72004cf4fbcfc6e33" + }, + "3.14/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.14.0+20251031-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.14.0", + "sha256": "e850ffb10a13cf16fb6ee08989e53532b606e7e96045ee65f7a3f41a9de14010" + }, + "3.14/i686-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.14.0+20251031-i686-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.14.0", + "sha256": "c47e0e4fd3a2d334a9f3df1d40fd9a7a8f743572dbd798b68fe5a6361c399806" + }, + "3.14/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.14.0+20251031-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.14.0", + "sha256": "35703b8b813afd37036ec88973c0f5a7626ee0dd48544a1c69cddeee994b5274" + }, + "3.14/x86_64-apple-darwin/freethreaded": { + "filename": "cpython-3.14.0+20251031-x86_64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.14.0", + "sha256": "b3196f6b57bbb3dc2ee07f348f1d51117ffa376979eceafbf50c15f0f7980bf8" + }, + "3.14/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.14.0+20251031-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.14.0", + "sha256": "4e71a3ce973be377ef18637826648bb936e2f9490f64a9e4f33a49bcc431d344" + }, + "3.14/x86_64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.14.0+20251031-x86_64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.14.0", + "sha256": "b81de5fc9e783ea6dfcf1098c28a278c874999c71afbb0309f6a8b4276c769d0" + }, + "3.14/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.14.0+20251031-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.14.0", + "sha256": "39acfcb3857d83eab054a3de11756ffc16b3d49c31393b9800dd2704d1f07fdf" + }, + "3.14/x86_64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.14.0+20251031-x86_64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.14.0", + "sha256": "f4acbef0fbfaf7ab31ac63986da1d93dfa1c5cb797de1dcdc1a988aa18670120" + }, + "3.14/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.14.0+20251031-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.14.0", + "sha256": "3dec1ab70758a3467ac3313bbcdabf7a9b3016db5c072c4537e3cf0a9e6290f6" + }, + "3.14/x86_64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.14.0+20251031-x86_64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.14.0", + "sha256": "9e18302759734fb14694efb0418e7291c8d590d880abc2da1d7e6f14ac9a381d" + }, + "3.14/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.14.0+20251031-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.14.0", + "sha256": "d0a2a6d3b1bb00dce2105377fda8aa79675d187f8d6d7010a42f651af25018dc" + }, + "3.15/aarch64-apple-darwin/freethreaded": { + "filename": "cpython-3.15.0a1+20251031-aarch64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.15.0a1", + "sha256": "12f1b16be4017181ad67904caf9e59e525b9b5d62f49105017d837e27b832959" + }, + "3.15/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.15.0a1+20251031-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.15.0a1", + "sha256": "3acf7aa3559b746498b18929456c5cacb84bae4e09249834cbc818970d71de87" + }, + "3.15/aarch64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.15.0a1+20251031-aarch64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.15.0a1", + "sha256": "54ca78dae455ece6fefbd7f5f287cc55d5ce197caf51921f6d871d15069d9489" + }, + "3.15/aarch64-pc-windows-msvc/install_only": { + "filename": "cpython-3.15.0a1+20251031-aarch64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.15.0a1", + "sha256": "1508bcd7195008479ed156aad3afbb3a3793097ed530690f0304a8107f0e53e8" + }, + "3.15/aarch64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.15.0a1+20251031-aarch64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.15.0a1", + "sha256": "981fe8dfc6e7e1d0ffefa945a18d5c4c759bbe21722acf3a5cc7e62f16aa5f3c" + }, + "3.15/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.15.0a1+20251031-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.15.0a1", + "sha256": "d55c2aeece827e6bec83fd18515ee281d9ea0efaa3e2d20130db8f1c7cbb71c6" + }, + "3.15/aarch64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.15.0a1+20251031-aarch64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.15.0a1", + "sha256": "017cd58a8e6d93a8d60453899d4bac6f540414003ec9a73dc106c20045d542ee" + }, + "3.15/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.15.0a1+20251031-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.15.0a1", + "sha256": "abbd20235411d7cc24cba48ac519324b8bb71a52e05b26e7012de815e43d6e73" + }, + "3.15/i686-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.15.0a1+20251031-i686-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.15.0a1", + "sha256": "9f4bc934ef9c56e6d1d7263949430cecc19d301fa4cad74fcd36c9b3c6a7ba01" + }, + "3.15/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.15.0a1+20251031-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.15.0a1", + "sha256": "6ffdbe54c45d0a9c309498f65c5ddf3de587c84aee89a227836f42b4e7e25691" + }, + "3.15/x86_64-apple-darwin/freethreaded": { + "filename": "cpython-3.15.0a1+20251031-x86_64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.15.0a1", + "sha256": "64fc29e6c7a2f02a18645d968f1b3fc1d00d12a5ef3fcbb0d077fa8c62c08904" + }, + "3.15/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.15.0a1+20251031-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.15.0a1", + "sha256": "0ab19d3ac25f99da438b088751e5ec2421f9f6aa4292fd2dc0f8e49eb3e16bdf" + }, + "3.15/x86_64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.15.0a1+20251031-x86_64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.15.0a1", + "sha256": "34abc5603e1b4131f753d29b7deac865b9277912b851cbed5a149cf3e6745d3d" + }, + "3.15/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.15.0a1+20251031-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.15.0a1", + "sha256": "5f5d6bec2b381cfc771c49972d2a6f7b7e7ab6a1651d8fb6ef3983f3571722b3" + }, + "3.15/x86_64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.15.0a1+20251031-x86_64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.15.0a1", + "sha256": "0e0272186d9f5169394dbc4d4d72a3f4a5762a04c2e5ac2ab1e23aa41fc8538a" + }, + "3.15/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.15.0a1+20251031-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.15.0a1", + "sha256": "1f356288c2b2713619cb7a4e453d33bf8882f812af2987e21e01e7ae382fefba" + }, + "3.15/x86_64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.15.0a1+20251031-x86_64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.15.0a1", + "sha256": "621ac3b8b8afa1593d63fb130dadc6eec2bd9e3603d6c028efe60146e05ec430" + }, + "3.15/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.15.0a1+20251031-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.15.0a1", + "sha256": "caf5311f333eef082dd69a669ca65aceba09a08fc1e78aad602ad649106f294c" + }, + "3.9/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.9.25+20251031-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.9.25", + "sha256": "87275619c2706affa4d1090d2ca3dad354b6d69f8b85dbfafe38785870751b9a" + }, + "3.9/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.9.25+20251031-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.9.25", + "sha256": "6112d46355857680b81849764a6cf9f38cc4cd0d1cf29d432bc12fe5aeedf9d0" + }, + "3.9/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.9.25+20251031-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.9.25", + "sha256": "f4d8eb93c54cbf7dc37d5599748582d91c268c60008f17daf19c0ad183ec78ab" + }, + "3.9/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.9.25+20251031-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.9.25", + "sha256": "5056f28d59653a6bddcc8007f024af00147a7e6f82e797f073a59f16a5cacc19" + }, + "3.9/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.9.25+20251031-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.9.25", + "sha256": "ace63cfe27a9487c4d72e1cb518be01c1d985271da0b2158e813801f7d3e5503" + }, + "3.9/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.9.25+20251031-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.9.25", + "sha256": "4fb1b416482ce94d73cfa140317a670c596c830671d137b07c26afe8c461768a" + }, + "3.9/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.9.25+20251031-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.9.25", + "sha256": "42834f61eb6df43432c3dd6ab9ca3fdf8c06d10a404ebdb53d6902e6b9570b08" + }, + "3.9/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.9.25+20251031-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.9.25", + "sha256": "76593e8c889e81e82db5fe117fe15b69466f85100ab2ec0e4035aa86242b4e93" + } + }, + "release_index_v1_20260303_https://github.com/astral-sh/python-build-standalone/releases/download": { + "3.10/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.10.20+20260303-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.10.20", + "sha256": "b41060c26454b21990254fdc08a4988f4e325708d785f8a0b4b4533881cf5fd4" + }, + "3.10/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.10.20+20260303-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.10.20", + "sha256": "dcf3b9bd0062276866b4fc84c9e4c39be7ef161d22c769e5f4ee01c8e27100f4" + }, + "3.10/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.10.20+20260303-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.10.20", + "sha256": "92713c7f4a7bb77bf8593818e4c1da8db44d415f45b0b5b7a8eb741695c08303" + }, + "3.10/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.10.20+20260303-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.10.20", + "sha256": "9bc6cd476a2670a054dc8dbdd22c5b7c7642ac2f0ac810c5bb18aa39083a8a99" + }, + "3.10/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.10.20+20260303-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.10.20", + "sha256": "2fd25586216e5e6932d767034618b7bb97654c689f07513009d858398fe181f3" + }, + "3.10/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.10.20+20260303-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.10.20", + "sha256": "aa55177f1247cdac1ccdf0877cdf68e9d6718b0914e56f1083404b1dcbac847b" + }, + "3.10/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.10.20+20260303-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.10.20", + "sha256": "c830fc25bc6e318e7ad4961caadee6cc79c041c122884c90ecfad4fe02e20344" + }, + "3.10/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.10.20+20260303-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.10.20", + "sha256": "c781a93c1030c814bc0861dc424c476ca2e0083b429b968f557e1664f3ef223f" + }, + "3.11/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.11.15+20260303-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.11.15", + "sha256": "0d29ed7cb6711890b3c6da27b6258c4ad3b506bf8d5a381bff531ca8fa67417f" + }, + "3.11/aarch64-pc-windows-msvc/install_only": { + "filename": "cpython-3.11.15+20260303-aarch64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.11.15", + "sha256": "84afaa698da2bc12f05aa317ad1ad6bf6708461e737efd08ad7e95d9a8857c1b" + }, + "3.11/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.11.15+20260303-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.11.15", + "sha256": "4786f5ef8567c982517fcd7cb189a5ef4a712ed0aaf3034e839749794155ad4c" + }, + "3.11/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.11.15+20260303-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.11.15", + "sha256": "d37ebd873138f85603607a56bc821e07551f45e6938e02d36b04885a6eded7ff" + }, + "3.11/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.11.15+20260303-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.11.15", + "sha256": "1924013f72c36c8d19d6887979cded6ca7f2295667d591b88f74260f141e1fee" + }, + "3.11/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.11.15+20260303-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.11.15", + "sha256": "6ea2168c4e18cb31d9dc8486634dc375929bcc2adde0957399ce59d90b52297a" + }, + "3.11/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.11.15+20260303-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.11.15", + "sha256": "6f194e1ede02260fd3d758893bbf1d3bb4084652d436a8300a229da721c3ddf8" + }, + "3.11/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.11.15+20260303-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.11.15", + "sha256": "17e1f5b2c9668217ba554decd94db04adf3d085203d322c690fd44cde549d576" + }, + "3.11/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.11.15+20260303-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.11.15", + "sha256": "ee54c7baaa5a1fb65922505a646a2d097660b005e55bd35055d0a9c46a5ab916" + }, + "3.12/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.12.13+20260303-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.12.13", + "sha256": "2c01f29e9e4ddbd57e0319fedecf1f3e222558fce394a3ed4e39d0f750c11988" + }, + "3.12/aarch64-pc-windows-msvc/install_only": { + "filename": "cpython-3.12.13+20260303-aarch64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.12.13", + "sha256": "f003d15139e0baa39563388b7e29c44a6c4dda3987dbd7cec2050eca32450d4f" + }, + "3.12/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.12.13+20260303-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.12.13", + "sha256": "15c00b489fb89c7e3dc433800cd8b932ab3f8825870c1919fbe747f493edf81d" + }, + "3.12/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.12.13+20260303-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.12.13", + "sha256": "2e3e3fc934a597c5c0e95fe9093a89cd6d3e248f9d3f6a0e82dbfa923499bd9d" + }, + "3.12/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.12.13+20260303-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.12.13", + "sha256": "af220242f3d2bebff6b9a01666895bb7198d7e4be608752f7e4007dd0fddfa22" + }, + "3.12/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.12.13+20260303-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.12.13", + "sha256": "8ad52a15de26e67d53f5c14f338433c59d5a2711852adc59043a20ec8da71a52" + }, + "3.12/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.12.13+20260303-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.12.13", + "sha256": "43990976c8de6b72a7525cb509eedaf869a8dd116167e708af08bca50cd8ef00" + }, + "3.12/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.12.13+20260303-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.12.13", + "sha256": "4e5ac5a04afc4fe164e92e3844d6dbda03b33baeb62e032b5c9a8198280221e2" + }, + "3.12/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.12.13+20260303-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.12.13", + "sha256": "4099347cfb11427ceb6fe40d1b9f2af9fee3a3a8915df0e439e13dfbe948b91e" + }, + "3.13/aarch64-apple-darwin/freethreaded": { + "filename": "cpython-3.13.12+20260303-aarch64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.13.12", + "sha256": "d152a8ec3a31a7b49772e70ff7fed1e7f6ec721497151b104532957744703d86" + }, + "3.13/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.13.12+20260303-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.13.12", + "sha256": "267592285674e21982d84f2cd0b56e13e63ce60c3e85ffb0d67a842edaf5b5e9" + }, + "3.13/aarch64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.13.12+20260303-aarch64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.13.12", + "sha256": "33e4de818b5419f0b6c599ccfc98a0468c441f83e02d4e0ef18b4a632408dc57" + }, + "3.13/aarch64-pc-windows-msvc/install_only": { + "filename": "cpython-3.13.12+20260303-aarch64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.13.12", + "sha256": "4cb0d143eeaf51582fa8292d00061fc201e41bf3ce5e2de814d0b273f73d4c25" + }, + "3.13/aarch64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.13.12+20260303-aarch64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.13.12", + "sha256": "a2e320b8b7ec76f538f4414bb56927e0a35fb169a4748594b3b0946df0d8942b" + }, + "3.13/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.13.12+20260303-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.13.12", + "sha256": "3b88fc6dd6f0290f075353ca860b9dc48faca0d849a0a03c088883507ed63881" + }, + "3.13/aarch64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.13.12+20260303-aarch64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.13.12", + "sha256": "5c71151ce936e495b0dc49fe3bdd67a9ec332542e2fc250257cd76276481103c" + }, + "3.13/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.13.12+20260303-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.13.12", + "sha256": "c8f2e10261f327b3b9606c23c79788e1c909f0d703c4b06ebd59b318fa271c77" + }, + "3.13/i686-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.13.12+20260303-i686-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.13.12", + "sha256": "e27287866347dd2cc1dc766174bb67f6b459cbadfbeff74c981abe7fe6cf86ba" + }, + "3.13/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.13.12+20260303-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.13.12", + "sha256": "202a933d5435eced5e92f474fac9480a82959de2b3ea5555569de9bda6f4af4f" + }, + "3.13/x86_64-apple-darwin/freethreaded": { + "filename": "cpython-3.13.12+20260303-x86_64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.13.12", + "sha256": "d603daefc04db99a764942a835497e52beebeb8797f7ac828826969e6f8ea165" + }, + "3.13/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.13.12+20260303-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.13.12", + "sha256": "07833bcaf50c80065db8a21d7ae0459939d95e3cf399ce8f7df908ddfc4d275f" + }, + "3.13/x86_64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.13.12+20260303-x86_64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.13.12", + "sha256": "5703d1e5fcd43d0ac3bce24e65d03a5684f3fec3625794ca9a0a47ad2ecbd0a1" + }, + "3.13/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.13.12+20260303-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.13.12", + "sha256": "61d5f9750e6971cf3bc91a1c8e7ab2eed1c22a34067f0762917bfde12b121f9f" + }, + "3.13/x86_64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.13.12+20260303-x86_64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.13.12", + "sha256": "8f1a00de7342d161bfefcb6bb90f50076b0c49e1ac4d4faa7fb303015369f310" + }, + "3.13/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.13.12+20260303-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.13.12", + "sha256": "ee1d08c3e6149343077d410d7de835a7a7dda8e2cec80df94f393e858a300055" + }, + "3.13/x86_64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.13.12+20260303-x86_64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.13.12", + "sha256": "6bae3d9f3c03448efe7e72aaf7eba1c4af4531ee22964876b36c1569e5123159" + }, + "3.13/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.13.12+20260303-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.13.12", + "sha256": "36f73e0b72ac670bd56c927a078e3e2ef0b1fef1d89a792088766bf1236815b7" + }, + "3.14/aarch64-apple-darwin/freethreaded": { + "filename": "cpython-3.14.3+20260303-aarch64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.14.3", + "sha256": "cedbfdb352b7b0dbdfd2e4dba11244a64665402c44099f36af9e22dc269dd0c0" + }, + "3.14/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.14.3+20260303-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.14.3", + "sha256": "adce81b366416e8d1b95c9c5483607282ae43c98fc155677020d20076d333fec" + }, + "3.14/aarch64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.14.3+20260303-aarch64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.14.3", + "sha256": "5af1b60808d4e8df3838267086556e2518b24a71080a7c4dc0edf3ef6a5bd8c4" + }, + "3.14/aarch64-pc-windows-msvc/install_only": { + "filename": "cpython-3.14.3+20260303-aarch64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.14.3", + "sha256": "f64e500abf0ff11b320cba756114caae6ea733c62af1c9516d28d92cf4223d74" + }, + "3.14/aarch64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.14.3+20260303-aarch64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.14.3", + "sha256": "9ca5169b62fdedbbeb1e01429e5ed75d0c89efb0dffb3d5924c58f667f365863" + }, + "3.14/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.14.3+20260303-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.14.3", + "sha256": "80030e336255241a76cd05c874b70a8840fef24e344907a4ae89f0f6c3c7daf6" + }, + "3.14/aarch64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.14.3+20260303-aarch64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.14.3", + "sha256": "ff4076086f55f83746d680792f8346037060453cf078feba233ba28e4b2a3514" + }, + "3.14/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.14.3+20260303-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.14.3", + "sha256": "97b7e0182daf74f884456a4a24cf882d0296092c918939d25ed1e1f4edee0469" + }, + "3.14/i686-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.14.3+20260303-i686-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.14.3", + "sha256": "e3085abf12bdf84a91784915082eaffd4cac154acd9818aefc71a69e13bdaf24" + }, + "3.14/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.14.3+20260303-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.14.3", + "sha256": "d969b1807fe6a3ebe9c1468c55331859d329119951ab01dc6ec5b2853c217a66" + }, + "3.14/x86_64-apple-darwin/freethreaded": { + "filename": "cpython-3.14.3+20260303-x86_64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.14.3", + "sha256": "ff7ba9353fb4f6f923e5a0c30564e448cb678deb69ac58e7f4f3a78944b40806" + }, + "3.14/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.14.3+20260303-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.14.3", + "sha256": "29469be54c9e471b916f0375f83836811b4df29dc98e0b7452ae9ec483a500a0" + }, + "3.14/x86_64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.14.3+20260303-x86_64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.14.3", + "sha256": "7921cf0fa140f3714c4772b8af161ab463d0ad641ac35db0beff9d45273ab5f5" + }, + "3.14/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.14.3+20260303-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.14.3", + "sha256": "201d5c13ee115e029bf6caa6bb17af2bfb3e4a3baf14c7f31e9145e2aa6571ef" + }, + "3.14/x86_64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.14.3+20260303-x86_64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.14.3", + "sha256": "0629158c702d4ba732c722f24e5a775885e93915c7b04fe29cfb9c81e37f499f" + }, + "3.14/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.14.3+20260303-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.14.3", + "sha256": "8070ec22c0ea164b826a57102f1bf1fa0b360e143ab3378b3c5eb4178bc0c26b" + }, + "3.14/x86_64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.14.3+20260303-x86_64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.14.3", + "sha256": "dc478897cecef7b6dfcd089b8a425e959885883d123ba4ce3e3ec1fcf5f9637a" + }, + "3.14/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.14.3+20260303-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.14.3", + "sha256": "e72b682f652eb8ba71550a7aa4f267ddf3fe06b165a29acd4194dfff0b51ed4e" + }, + "3.15/aarch64-apple-darwin/freethreaded": { + "filename": "cpython-3.15.0a6+20260303-aarch64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.15.0a6", + "sha256": "c2c9679a505c94abb6e0dcbcb1a9ea2148fbcab5b443e9c8efac388e591233a8" + }, + "3.15/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.15.0a6+20260303-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.15.0a6", + "sha256": "7a6bb30a11361b58849ceeaf4d74f4085306f9b00de0c7f4703f9031cbb409ee" + }, + "3.15/aarch64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.15.0a6+20260303-aarch64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.15.0a6", + "sha256": "62890d115b54d2456a74db09d3026834faee19ba1be257c287025b0e8ae6ad16" + }, + "3.15/aarch64-pc-windows-msvc/install_only": { + "filename": "cpython-3.15.0a6+20260303-aarch64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.15.0a6", + "sha256": "aafd627b816dd83cb9ae670383482f3aa166e8f8910ca946278c5cc22f96bff6" + }, + "3.15/aarch64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.15.0a6+20260303-aarch64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.15.0a6", + "sha256": "93792d31d2232f6bf27e08fbfe6aec221aab1a4aa42463ac879540d399b54bc2" + }, + "3.15/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.15.0a6+20260303-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.15.0a6", + "sha256": "bc351efe2ef61f2d6fae1491b0d240f7616a7be28fcdad2d1644ce0429001ad6" + }, + "3.15/aarch64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.15.0a6+20260303-aarch64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.15.0a6", + "sha256": "497bbd7bc486a3092e003761f6a4fb9fd2c9854dea249042b330cb70d2ebf42a" + }, + "3.15/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.15.0a6+20260303-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.15.0a6", + "sha256": "55fabc3bfa81d6248db65da659c8f728fdfe8aa5dcd9551a5b1eaef09bc05cbd" + }, + "3.15/i686-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.15.0a6+20260303-i686-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.15.0a6", + "sha256": "4174719f384f3c6893c59e23ea88242c3ab9d84b7fffb9d1ed3a11e9d6a6a068" + }, + "3.15/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.15.0a6+20260303-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.15.0a6", + "sha256": "a49e43ea7971bb975e00f132bd45bc6834177997add3de7a07361a7449a10bda" + }, + "3.15/x86_64-apple-darwin/freethreaded": { + "filename": "cpython-3.15.0a6+20260303-x86_64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.15.0a6", + "sha256": "cf23826a427d19ea945965ba0e00a210b0cd96c3e7c2741ccf1174c18c37d5a6" + }, + "3.15/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.15.0a6+20260303-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.15.0a6", + "sha256": "3c25506d64f6b8e0c38bb66f8430332578a69343c1b27078b7f91d5919f2549a" + }, + "3.15/x86_64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.15.0a6+20260303-x86_64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.15.0a6", + "sha256": "8c3de05f4df81a3b482fd62daa14b7863df2b517a487b75661e37dfee845a4e6" + }, + "3.15/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.15.0a6+20260303-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.15.0a6", + "sha256": "42690076ba8f6311b737b884f56217cab7d7287f3374ab8c629fd446913534d6" + }, + "3.15/x86_64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.15.0a6+20260303-x86_64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.15.0a6", + "sha256": "9d95b1429958effe665c0dd7e2a9b8dfe1364b477637df87ddf372438adfa109" + }, + "3.15/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.15.0a6+20260303-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.15.0a6", + "sha256": "ac11f7e619c154e3d9b56186b461f52b4afc583a5524e7109686a7a9e1835b6d" + }, + "3.15/x86_64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.15.0a6+20260303-x86_64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.15.0a6", + "sha256": "2b5d35017190248ebbbf8b24432ec730e496dc68b911308a0cd4c21d8181d090" + }, + "3.15/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.15.0a6+20260303-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.15.0a6", + "sha256": "427675a1e0e79051540cce0f1b450ca0d11a8897486aba03796a8881cadf831f" + } + } + } + }, + "factsVersions": {} +} diff --git a/e2e/layer_plan/README.md b/e2e/layer_plan/README.md new file mode 100644 index 0000000..b79ce77 --- /dev/null +++ b/e2e/layer_plan/README.md @@ -0,0 +1,4 @@ +# Layer plan + +Checks that an unsized pair of tars is flattened into one archive, and that the +archive keeps both the file and the empty directory. diff --git a/examples/basic_layers/archive_test.sh b/e2e/layer_plan/archive_test.sh similarity index 100% rename from examples/basic_layers/archive_test.sh rename to e2e/layer_plan/archive_test.sh diff --git a/e2e/layer_plan/payload.txt b/e2e/layer_plan/payload.txt new file mode 100644 index 0000000..00ae58f --- /dev/null +++ b/e2e/layer_plan/payload.txt @@ -0,0 +1 @@ +shared payload diff --git a/e2e/minimum/BUILD.bazel b/e2e/minimum/BUILD.bazel index 4b15d9e..f42b4f7 120000 --- a/e2e/minimum/BUILD.bazel +++ b/e2e/minimum/BUILD.bazel @@ -1 +1 @@ -../../examples/BUILD.bazel \ No newline at end of file +../image_backends/BUILD.bazel \ No newline at end of file diff --git a/e2e/minimum/README.md b/e2e/minimum/README.md index 065c269..ead2e10 100644 --- a/e2e/minimum/README.md +++ b/e2e/minimum/README.md @@ -1,25 +1,21 @@ # Minimum-version consumer -This module tests the oldest supported combination with the same fixtures as -[the current-version examples](../../examples/README.md). Source symlinks keep -package-sharing, source isolation, inferred environment, metadata, backend -layer equivalence, and Docker runtime coverage identical at both endpoints. +This module rebuilds [image_backends](../image_backends/README.md) at the oldest +supported rules_oci and rules_img versions. Source symlinks keep the image +targets identical. Bazel 8.7.0 is required because rules_oci 1.1.0 uses +`incompatible_use_toolchain_transition`, which Bazel 9 removed. -Run `bazel test //...` here. CI also runs all four image combinations in Docker. +Run `bazel test //...` here. That compares layer digests across backends and +runs each image in Docker. -`single_version_override` pins all four main dependencies to their exact tested -floors. Those overrides belong only to this test consumer. CI verifies the -resolved graph, so a transitive dependency cannot silently turn this into a test -of newer versions: +`single_version_override` pins the four main dependencies to their exact tested +floors. Those overrides belong only to this module. CI verifies the resolved +graph, so a transitive dependency cannot silently turn this into a test of +newer versions: ```sh bazel mod graph --output=json > /tmp/layer_optimizer_minimum_graph.json jq -e -f assert_versions.jq /tmp/layer_optimizer_minimum_graph.json ``` -See [compatibility](../../docs/compatibility.md) for the support matrix, -version-selection policy, and reasons earlier versions are outside support. - -This legacy combination uses Bazel 8.7.0: rules_oci 1.1.0 uses -`incompatible_use_toolchain_transition`, removed in Bazel 9. The root and -current-version consumers use Bazel 9.2.0. +See [compatibility](../../docs/compatibility.md) for the support matrix. diff --git a/e2e/minimum/archive_test.bzl b/e2e/minimum/archive_test.bzl deleted file mode 120000 index e9a9e3b..0000000 --- a/e2e/minimum/archive_test.bzl +++ /dev/null @@ -1 +0,0 @@ -../../examples/archive_test.bzl \ No newline at end of file diff --git a/e2e/minimum/aspect b/e2e/minimum/aspect new file mode 120000 index 0000000..6d0b03e --- /dev/null +++ b/e2e/minimum/aspect @@ -0,0 +1 @@ +../image_backends/aspect \ No newline at end of file diff --git a/e2e/minimum/backend_equivalence_test.py b/e2e/minimum/backend_equivalence_test.py deleted file mode 120000 index ea3c935..0000000 --- a/e2e/minimum/backend_equivalence_test.py +++ /dev/null @@ -1 +0,0 @@ -../../examples/backend_equivalence_test.py \ No newline at end of file diff --git a/e2e/minimum/basic_layers b/e2e/minimum/basic_layers deleted file mode 120000 index 12f70db..0000000 --- a/e2e/minimum/basic_layers +++ /dev/null @@ -1 +0,0 @@ -../../examples/basic_layers \ No newline at end of file diff --git a/e2e/minimum/oci_load.bzl b/e2e/minimum/oci_load.bzl index bd43be8..1950c47 120000 --- a/e2e/minimum/oci_load.bzl +++ b/e2e/minimum/oci_load.bzl @@ -1 +1 @@ -../../examples/oci_load.bzl \ No newline at end of file +../image_backends/oci_load.bzl \ No newline at end of file diff --git a/e2e/minimum/pyproject.toml b/e2e/minimum/pyproject.toml index 0356d0e..926f884 120000 --- a/e2e/minimum/pyproject.toml +++ b/e2e/minimum/pyproject.toml @@ -1 +1 @@ -../../examples/pyproject.toml \ No newline at end of file +../image_backends/pyproject.toml \ No newline at end of file diff --git a/e2e/minimum/python_image b/e2e/minimum/python_image deleted file mode 120000 index f87d723..0000000 --- a/e2e/minimum/python_image +++ /dev/null @@ -1 +0,0 @@ -../../examples/python_image \ No newline at end of file diff --git a/e2e/minimum/requirements.txt b/e2e/minimum/requirements.txt index 2b4114e..3428e98 120000 --- a/e2e/minimum/requirements.txt +++ b/e2e/minimum/requirements.txt @@ -1 +1 @@ -../../examples/requirements.txt \ No newline at end of file +../image_backends/requirements.txt \ No newline at end of file diff --git a/e2e/minimum/rules_python b/e2e/minimum/rules_python new file mode 120000 index 0000000..786386f --- /dev/null +++ b/e2e/minimum/rules_python @@ -0,0 +1 @@ +../image_backends/rules_python \ No newline at end of file diff --git a/e2e/minimum/rules_python_image b/e2e/minimum/rules_python_image deleted file mode 120000 index 84dc345..0000000 --- a/e2e/minimum/rules_python_image +++ /dev/null @@ -1 +0,0 @@ -../../examples/rules_python_image \ No newline at end of file diff --git a/e2e/minimum/shared_dependencies b/e2e/minimum/shared_dependencies deleted file mode 120000 index 89c639f..0000000 --- a/e2e/minimum/shared_dependencies +++ /dev/null @@ -1 +0,0 @@ -../../examples/shared_dependencies \ No newline at end of file diff --git a/e2e/minimum/uv.lock b/e2e/minimum/uv.lock index 9ce15d6..5cacfd9 120000 --- a/e2e/minimum/uv.lock +++ b/e2e/minimum/uv.lock @@ -1 +1 @@ -../../examples/uv.lock \ No newline at end of file +../image_backends/uv.lock \ No newline at end of file diff --git a/e2e/rules_python/BUILD.bazel b/e2e/rules_python/BUILD.bazel index 8108a56..6db47a9 100644 --- a/e2e/rules_python/BUILD.bazel +++ b/e2e/rules_python/BUILD.bazel @@ -1,4 +1,5 @@ load("@aspect_bazel_lib//lib:write_source_files.bzl", "write_source_files") +load("@rules_layer_optimizer//inference:defs.bzl", "env_inference_bundle") load("@rules_layer_optimizer//layers:defs.bzl", "layer_group") load("@rules_layer_optimizer//layers:distroless.bzl", "optimized_layers") load("@rules_layer_optimizer//python:inference.bzl", "env_file", "env_inference") @@ -54,11 +55,16 @@ env_inference( ], ) +env_inference_bundle( + name = "env_inferences", + inferences = [":colorama"], +) + env_file( name = "env", base_env = {}, extra_env = {}, - inferences = [":colorama"], + inferences = [":env_inferences"], runfiles_root = "/app.runfiles", deps = [":app"], ) diff --git a/e2e/rules_python/README.md b/e2e/rules_python/README.md index 0925a07..f88c48d 100644 --- a/e2e/rules_python/README.md +++ b/e2e/rules_python/README.md @@ -9,5 +9,5 @@ The runtime test extracts the optimized archive and executes its launcher, checking package imports, distribution metadata, and inferred environment. It also checks that the transitive `six` dependency gets its own layer without duplicating files across package archives. -The [examples matrix](../../examples/README.md) additionally validates both -image backends in Docker. +[Image backend checks](../image_backends/README.md) additionally run both +adapters on rules_oci and rules_img in Docker. diff --git a/e2e/rules_python_layers/.bazelrc b/e2e/rules_python_layers/.bazelrc new file mode 100644 index 0000000..684c43e --- /dev/null +++ b/e2e/rules_python_layers/.bazelrc @@ -0,0 +1,3 @@ +import %workspace%/../../.bazelrc + +build --@rules_python//python/config_settings:bootstrap_impl=script diff --git a/e2e/rules_python_layers/.bazelversion b/e2e/rules_python_layers/.bazelversion new file mode 100644 index 0000000..deeb3d6 --- /dev/null +++ b/e2e/rules_python_layers/.bazelversion @@ -0,0 +1 @@ +9.2.0 diff --git a/e2e/rules_python_layers/BUILD.bazel b/e2e/rules_python_layers/BUILD.bazel new file mode 100644 index 0000000..959edaa --- /dev/null +++ b/e2e/rules_python_layers/BUILD.bazel @@ -0,0 +1,5 @@ +exports_files([ + "pyproject.toml", + "requirements.txt", + "uv.lock", +]) diff --git a/e2e/rules_python_layers/MODULE.bazel b/e2e/rules_python_layers/MODULE.bazel new file mode 100644 index 0000000..2d99594 --- /dev/null +++ b/e2e/rules_python_layers/MODULE.bazel @@ -0,0 +1,38 @@ +module(name = "rules_python_layers") + +bazel_dep(name = "rules_layer_optimizer") +local_path_override( + module_name = "rules_layer_optimizer", + path = "../..", +) + +bazel_dep(name = "aspect_bazel_lib", version = "2.22.0") +bazel_dep(name = "bazel_skylib", version = "1.9.0") +bazel_dep(name = "rules_python", version = "1.9.0") + +python = use_extension("@rules_python//python/extensions:python.bzl", "python") +python.defaults(python_version = "3.12") +python.toolchain(python_version = "3.12") + +pip = use_extension("@rules_python//python/extensions:pip.bzl", "pip") +pip.parse( + enable_implicit_namespace_pkgs = True, + hub_name = "pip", + python_version = "3.12", + requirements_lock = "//:requirements.txt", +) +use_repo(pip, "pip") + +inference = use_extension("@rules_layer_optimizer//inference:extensions.bzl", "oci_image_inference") +inference.configure( + dependency_attributes = [ + "deps", + "src", + "srcs", + "actual", + "venv", + ], + pip_hub = "@pip//:requirements.bzl", +) +inference.pip_size_hint(lock = "//:uv.lock") +use_repo(inference, "oci_image_inference_config") diff --git a/e2e/rules_python_layers/MODULE.bazel.lock b/e2e/rules_python_layers/MODULE.bazel.lock new file mode 100644 index 0000000..29fb8fc --- /dev/null +++ b/e2e/rules_python_layers/MODULE.bazel.lock @@ -0,0 +1,1500 @@ +{ + "lockFileVersion": 28, + "registryFileHashes": { + "https://bcr.bazel.build/bazel_registry.json": "8a28e4aff06ee60aed2a8c281907fb8bcbf3b753c91fb5a5c57da3215d5b3497", + "https://bcr.bazel.build/modules/abseil-cpp/20210324.2/MODULE.bazel": "7cd0312e064fde87c8d1cd79ba06c876bd23630c83466e9500321be55c96ace2", + "https://bcr.bazel.build/modules/abseil-cpp/20211102.0/MODULE.bazel": "70390338f7a5106231d20620712f7cccb659cd0e9d073d1991c038eb9fc57589", + "https://bcr.bazel.build/modules/abseil-cpp/20230125.1/MODULE.bazel": "89047429cb0207707b2dface14ba7f8df85273d484c2572755be4bab7ce9c3a0", + "https://bcr.bazel.build/modules/abseil-cpp/20230802.0.bcr.1/MODULE.bazel": "1c8cec495288dccd14fdae6e3f95f772c1c91857047a098fad772034264cc8cb", + "https://bcr.bazel.build/modules/abseil-cpp/20230802.0/MODULE.bazel": "d253ae36a8bd9ee3c5955384096ccb6baf16a1b1e93e858370da0a3b94f77c16", + "https://bcr.bazel.build/modules/abseil-cpp/20230802.1/MODULE.bazel": "fa92e2eb41a04df73cdabeec37107316f7e5272650f81d6cc096418fe647b915", + "https://bcr.bazel.build/modules/abseil-cpp/20240116.1/MODULE.bazel": "37bcdb4440fbb61df6a1c296ae01b327f19e9bb521f9b8e26ec854b6f97309ed", + "https://bcr.bazel.build/modules/abseil-cpp/20240116.2/MODULE.bazel": "73939767a4686cd9a520d16af5ab440071ed75cec1a876bf2fcfaf1f71987a16", + "https://bcr.bazel.build/modules/abseil-cpp/20250127.1/MODULE.bazel": "c4a89e7ceb9bf1e25cf84a9f830ff6b817b72874088bf5141b314726e46a57c1", + "https://bcr.bazel.build/modules/abseil-cpp/20250512.1/MODULE.bazel": "d209fdb6f36ffaf61c509fcc81b19e81b411a999a934a032e10cd009a0226215", + "https://bcr.bazel.build/modules/abseil-cpp/20250814.1/MODULE.bazel": "51f2312901470cdab0dbdf3b88c40cd21c62a7ed58a3de45b365ddc5b11bcab2", + "https://bcr.bazel.build/modules/abseil-cpp/20250814.1/source.json": "cea3901d7e299da7320700abbaafe57a65d039f10d0d7ea601c4a66938ea4b0c", + "https://bcr.bazel.build/modules/apple_support/1.11.1/MODULE.bazel": "1843d7cd8a58369a444fc6000e7304425fba600ff641592161d9f15b179fb896", + "https://bcr.bazel.build/modules/apple_support/1.15.1/MODULE.bazel": "a0556fefca0b1bb2de8567b8827518f94db6a6e7e7d632b4c48dc5f865bc7c85", + "https://bcr.bazel.build/modules/apple_support/1.21.0/MODULE.bazel": "ac1824ed5edf17dee2fdd4927ada30c9f8c3b520be1b5fd02a5da15bc10bff3e", + "https://bcr.bazel.build/modules/apple_support/1.21.1/MODULE.bazel": "5809fa3efab15d1f3c3c635af6974044bac8a4919c62238cce06acee8a8c11f1", + "https://bcr.bazel.build/modules/apple_support/1.24.2/MODULE.bazel": "0e62471818affb9f0b26f128831d5c40b074d32e6dda5a0d3852847215a41ca4", + "https://bcr.bazel.build/modules/apple_support/1.24.2/source.json": "2c22c9827093250406c5568da6c54e6fdf0ef06238def3d99c71b12feb057a8d", + "https://bcr.bazel.build/modules/aspect_bazel_lib/2.14.0/MODULE.bazel": "2b31ffcc9bdc8295b2167e07a757dbbc9ac8906e7028e5170a3708cecaac119f", + "https://bcr.bazel.build/modules/aspect_bazel_lib/2.19.3/MODULE.bazel": "253d739ba126f62a5767d832765b12b59e9f8d2bc88cc1572f4a73e46eb298ca", + "https://bcr.bazel.build/modules/aspect_bazel_lib/2.22.0/MODULE.bazel": "7fe0191f047d4fe4a4a46c1107e2350cbb58a8fc2e10913aa4322d3190dec0bf", + "https://bcr.bazel.build/modules/aspect_bazel_lib/2.22.0/source.json": "369df5b7f2eae82f200fff95cf1425f90dee90a0d0948122060b48150ff0e224", + "https://bcr.bazel.build/modules/aspect_bazel_lib/2.8.1/MODULE.bazel": "812d2dd42f65dca362152101fbec418029cc8fd34cbad1a2fde905383d705838", + "https://bcr.bazel.build/modules/aspect_rules_py/2.0.0-alpha.4/MODULE.bazel": "4d9f393a947c01809556659cc4b07b76b25d98f25a8062280e506b5c296b89cf", + "https://bcr.bazel.build/modules/aspect_rules_py/2.0.0-alpha.4/source.json": "fcf828898c74224aff425d991755e5bc6346e9ff4da74e0b286f9bc19c5424c4", + "https://bcr.bazel.build/modules/aspect_tools_telemetry/0.3.3/MODULE.bazel": "37c764292861c2f70314efa9846bb6dbb44fc0308903b3285da6528305450183", + "https://bcr.bazel.build/modules/aspect_tools_telemetry/0.3.3/source.json": "605086bbc197743a0d360f7ddc550a1d4dfa0441bc807236e17170f636153348", + "https://bcr.bazel.build/modules/bazel_features/1.1.1/MODULE.bazel": "27b8c79ef57efe08efccbd9dd6ef70d61b4798320b8d3c134fd571f78963dbcd", + "https://bcr.bazel.build/modules/bazel_features/1.10.0/MODULE.bazel": "f75e8807570484a99be90abcd52b5e1f390362c258bcb73106f4544957a48101", + "https://bcr.bazel.build/modules/bazel_features/1.11.0/MODULE.bazel": "f9382337dd5a474c3b7d334c2f83e50b6eaedc284253334cf823044a26de03e8", + "https://bcr.bazel.build/modules/bazel_features/1.15.0/MODULE.bazel": "d38ff6e517149dc509406aca0db3ad1efdd890a85e049585b7234d04238e2a4d", + "https://bcr.bazel.build/modules/bazel_features/1.17.0/MODULE.bazel": "039de32d21b816b47bd42c778e0454217e9c9caac4a3cf8e15c7231ee3ddee4d", + "https://bcr.bazel.build/modules/bazel_features/1.18.0/MODULE.bazel": "1be0ae2557ab3a72a57aeb31b29be347bcdc5d2b1eb1e70f39e3851a7e97041a", + "https://bcr.bazel.build/modules/bazel_features/1.19.0/MODULE.bazel": "59adcdf28230d220f0067b1f435b8537dd033bfff8db21335ef9217919c7fb58", + "https://bcr.bazel.build/modules/bazel_features/1.20.0/MODULE.bazel": "8b85300b9c8594752e0721a37210e34879d23adc219ed9dc8f4104a4a1750920", + "https://bcr.bazel.build/modules/bazel_features/1.21.0/MODULE.bazel": "675642261665d8eea09989aa3b8afb5c37627f1be178382c320d1b46afba5e3b", + "https://bcr.bazel.build/modules/bazel_features/1.23.0/MODULE.bazel": "fd1ac84bc4e97a5a0816b7fd7d4d4f6d837b0047cf4cbd81652d616af3a6591a", + "https://bcr.bazel.build/modules/bazel_features/1.24.0/MODULE.bazel": "4796b4c25b47053e9bbffa792b3792d07e228ff66cd0405faef56a978708acd4", + "https://bcr.bazel.build/modules/bazel_features/1.27.0/MODULE.bazel": "621eeee06c4458a9121d1f104efb80f39d34deff4984e778359c60eaf1a8cb65", + "https://bcr.bazel.build/modules/bazel_features/1.28.0/MODULE.bazel": "4b4200e6cbf8fa335b2c3f43e1d6ef3e240319c33d43d60cc0fbd4b87ece299d", + "https://bcr.bazel.build/modules/bazel_features/1.3.0/MODULE.bazel": "cdcafe83ec318cda34e02948e81d790aab8df7a929cec6f6969f13a489ccecd9", + "https://bcr.bazel.build/modules/bazel_features/1.30.0/MODULE.bazel": "a14b62d05969a293b80257e72e597c2da7f717e1e69fa8b339703ed6731bec87", + "https://bcr.bazel.build/modules/bazel_features/1.33.0/MODULE.bazel": "8b8dc9d2a4c88609409c3191165bccec0e4cb044cd7a72ccbe826583303459f6", + "https://bcr.bazel.build/modules/bazel_features/1.34.0/MODULE.bazel": "e8475ad7c8965542e0c7aac8af68eb48c4af904be3d614b6aa6274c092c2ea1e", + "https://bcr.bazel.build/modules/bazel_features/1.38.0/MODULE.bazel": "f9b8a9c890ebd216b4049fd12a31d3c2602e3403c7af636b04fbbd7453edc9c9", + "https://bcr.bazel.build/modules/bazel_features/1.4.1/MODULE.bazel": "e45b6bb2350aff3e442ae1111c555e27eac1d915e77775f6fdc4b351b758b5d7", + "https://bcr.bazel.build/modules/bazel_features/1.42.1/MODULE.bazel": "275a59b5406ff18c01739860aa70ad7ccb3cfb474579411decca11c93b951080", + "https://bcr.bazel.build/modules/bazel_features/1.43.0/MODULE.bazel": "defa2226f06ba20550d6548c3a2ea2a7929634437a52973869c20c225450eb91", + "https://bcr.bazel.build/modules/bazel_features/1.43.0/source.json": "1c4207dc858d6de0eecef30026793616bbf420c74aac27b6bad212534a730437", + "https://bcr.bazel.build/modules/bazel_features/1.9.0/MODULE.bazel": "885151d58d90d8d9c811eb75e3288c11f850e1d6b481a8c9f766adee4712358b", + "https://bcr.bazel.build/modules/bazel_features/1.9.1/MODULE.bazel": "8f679097876a9b609ad1f60249c49d68bfab783dd9be012faf9d82547b14815a", + "https://bcr.bazel.build/modules/bazel_lib/3.0.0-beta.1/MODULE.bazel": "407729e232f611c3270005b016b437005daa7b1505826798ea584169a476e878", + "https://bcr.bazel.build/modules/bazel_lib/3.0.0-rc.0/MODULE.bazel": "d6e00979a98ac14ada5e31c8794708b41434d461e7e7ca39b59b765e6d233b18", + "https://bcr.bazel.build/modules/bazel_lib/3.0.0/MODULE.bazel": "22b70b80ac89ad3f3772526cd9feee2fa412c2b01933fea7ed13238a448d370d", + "https://bcr.bazel.build/modules/bazel_lib/3.0.0/source.json": "895f21909c6fba01d7c17914bb6c8e135982275a1b18cdaa4e62272217ef1751", + "https://bcr.bazel.build/modules/bazel_skylib/1.0.3/MODULE.bazel": "bcb0fd896384802d1ad283b4e4eb4d718eebd8cb820b0a2c3a347fb971afd9d8", + "https://bcr.bazel.build/modules/bazel_skylib/1.1.1/MODULE.bazel": "1add3e7d93ff2e6998f9e118022c84d163917d912f5afafb3058e3d2f1545b5e", + "https://bcr.bazel.build/modules/bazel_skylib/1.2.0/MODULE.bazel": "44fe84260e454ed94ad326352a698422dbe372b21a1ac9f3eab76eb531223686", + "https://bcr.bazel.build/modules/bazel_skylib/1.2.1/MODULE.bazel": "f35baf9da0efe45fa3da1696ae906eea3d615ad41e2e3def4aeb4e8bc0ef9a7a", + "https://bcr.bazel.build/modules/bazel_skylib/1.3.0/MODULE.bazel": "20228b92868bf5cfc41bda7afc8a8ba2a543201851de39d990ec957b513579c5", + "https://bcr.bazel.build/modules/bazel_skylib/1.4.1/MODULE.bazel": "a0dcb779424be33100dcae821e9e27e4f2901d9dfd5333efe5ac6a8d7ab75e1d", + "https://bcr.bazel.build/modules/bazel_skylib/1.4.2/MODULE.bazel": "3bd40978e7a1fac911d5989e6b09d8f64921865a45822d8b09e815eaa726a651", + "https://bcr.bazel.build/modules/bazel_skylib/1.5.0/MODULE.bazel": "32880f5e2945ce6a03d1fbd588e9198c0a959bb42297b2cfaf1685b7bc32e138", + "https://bcr.bazel.build/modules/bazel_skylib/1.6.1/MODULE.bazel": "8fdee2dbaace6c252131c00e1de4b165dc65af02ea278476187765e1a617b917", + "https://bcr.bazel.build/modules/bazel_skylib/1.7.0/MODULE.bazel": "0db596f4563de7938de764cc8deeabec291f55e8ec15299718b93c4423e9796d", + "https://bcr.bazel.build/modules/bazel_skylib/1.7.1/MODULE.bazel": "3120d80c5861aa616222ec015332e5f8d3171e062e3e804a2a0253e1be26e59b", + "https://bcr.bazel.build/modules/bazel_skylib/1.8.0/MODULE.bazel": "2fb3fb53675f6adfc1ca5bfbd5cfb655ae350fba4706d924a8ec7e3ba945671c", + "https://bcr.bazel.build/modules/bazel_skylib/1.8.1/MODULE.bazel": "88ade7293becda963e0e3ea33e7d54d3425127e0a326e0d17da085a5f1f03ff6", + "https://bcr.bazel.build/modules/bazel_skylib/1.8.2/MODULE.bazel": "69ad6927098316848b34a9142bcc975e018ba27f08c4ff403f50c1b6e646ca67", + "https://bcr.bazel.build/modules/bazel_skylib/1.9.0/MODULE.bazel": "72997b29dfd95c3fa0d0c48322d05590418edef451f8db8db5509c57875fb4b7", + "https://bcr.bazel.build/modules/bazel_skylib/1.9.0/source.json": "7ad77c1e8c1b84222d9b3f3cae016a76639435744c19330b0b37c0a3c9da7dc0", + "https://bcr.bazel.build/modules/buildozer/8.5.1/MODULE.bazel": "a35d9561b3fc5b18797c330793e99e3b834a473d5fbd3d7d7634aafc9bdb6f8f", + "https://bcr.bazel.build/modules/buildozer/8.5.1/source.json": "e3386e6ff4529f2442800dee47ad28d3e6487f36a1f75ae39ae56c70f0cd2fbd", + "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.1/MODULE.bazel": "cdf8cbe5ee750db04b78878c9633cc76e80dcf4416cbe982ac3a9222f80713c8", + "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.3/MODULE.bazel": "f1b7bb2dd53e8f2ef984b39485ec8a44e9076dda5c4b8efd2fb4c6a6e856a31d", + "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.7/MODULE.bazel": "1e5e03c383fa64ebbe0942a225c32168fd6ef6b270351bbec481d47d19d1b96d", + "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.7/source.json": "34a83d58ae2f1ef6731d1fc8a1b6f07825741aff3f5993b67b67ec21d2c2946e", + "https://bcr.bazel.build/modules/google_benchmark/1.8.2/MODULE.bazel": "a70cf1bba851000ba93b58ae2f6d76490a9feb74192e57ab8e8ff13c34ec50cb", + "https://bcr.bazel.build/modules/googletest/1.11.0/MODULE.bazel": "3a83f095183f66345ca86aa13c58b59f9f94a2f81999c093d4eeaa2d262d12f4", + "https://bcr.bazel.build/modules/googletest/1.14.0.bcr.1/MODULE.bazel": "22c31a561553727960057361aa33bf20fb2e98584bc4fec007906e27053f80c6", + "https://bcr.bazel.build/modules/googletest/1.14.0/MODULE.bazel": "cfbcbf3e6eac06ef9d85900f64424708cc08687d1b527f0ef65aa7517af8118f", + "https://bcr.bazel.build/modules/googletest/1.15.2/MODULE.bazel": "6de1edc1d26cafb0ea1a6ab3f4d4192d91a312fd2d360b63adaa213cd00b2108", + "https://bcr.bazel.build/modules/googletest/1.17.0/MODULE.bazel": "dbec758171594a705933a29fcf69293d2468c49ec1f2ebca65c36f504d72df46", + "https://bcr.bazel.build/modules/googletest/1.17.0/source.json": "38e4454b25fc30f15439c0378e57909ab1fd0a443158aa35aec685da727cd713", + "https://bcr.bazel.build/modules/hermetic_launcher/0.0.11/MODULE.bazel": "aba15d5a4745cedcb4750faf0c49f946d004ccb09475b6ade1dea4efe0399d82", + "https://bcr.bazel.build/modules/hermetic_launcher/0.0.11/source.json": "0c4d45a10e956dc30c7278de756c81d4b55612218b1a20fa55fc2988063ba4eb", + "https://bcr.bazel.build/modules/jq.bzl/0.1.0/MODULE.bazel": "2ce69b1af49952cd4121a9c3055faa679e748ce774c7f1fda9657f936cae902f", + "https://bcr.bazel.build/modules/jq.bzl/0.1.0/source.json": "746bf13cac0860f091df5e4911d0c593971cd8796b5ad4e809b2f8e133eee3d5", + "https://bcr.bazel.build/modules/jsoncpp/1.9.5/MODULE.bazel": "31271aedc59e815656f5736f282bb7509a97c7ecb43e927ac1a37966e0578075", + "https://bcr.bazel.build/modules/jsoncpp/1.9.6/MODULE.bazel": "2f8d20d3b7d54143213c4dfc3d98225c42de7d666011528dc8fe91591e2e17b0", + "https://bcr.bazel.build/modules/jsoncpp/1.9.6/source.json": "a04756d367a2126c3541682864ecec52f92cdee80a35735a3cb249ce015ca000", + "https://bcr.bazel.build/modules/libpfm/4.11.0/MODULE.bazel": "45061ff025b301940f1e30d2c16bea596c25b176c8b6b3087e92615adbd52902", + "https://bcr.bazel.build/modules/nlohmann_json/3.6.1/MODULE.bazel": "6f7b417dcc794d9add9e556673ad25cb3ba835224290f4f848f8e2db1e1fca74", + "https://bcr.bazel.build/modules/nlohmann_json/3.6.1/source.json": "f448c6e8963fdfa7eb831457df83ad63d3d6355018f6574fb017e8169deb43a9", + "https://bcr.bazel.build/modules/package_metadata/0.0.2/MODULE.bazel": "fb8d25550742674d63d7b250063d4580ca530499f045d70748b1b142081ebb92", + "https://bcr.bazel.build/modules/package_metadata/0.0.3/MODULE.bazel": "77890552ecea9e284b5424c9de827a58099348763a4359e975c359a83d4faa83", + "https://bcr.bazel.build/modules/package_metadata/0.0.3/source.json": "742075a428ad12a3fa18a69014c2f57f01af910c6d9d18646c990200853e641a", + "https://bcr.bazel.build/modules/platforms/0.0.10/MODULE.bazel": "8cb8efaf200bdeb2150d93e162c40f388529a25852b332cec879373771e48ed5", + "https://bcr.bazel.build/modules/platforms/0.0.11/MODULE.bazel": "0daefc49732e227caa8bfa834d65dc52e8cc18a2faf80df25e8caea151a9413f", + "https://bcr.bazel.build/modules/platforms/0.0.4/MODULE.bazel": "9b328e31ee156f53f3c416a64f8491f7eb731742655a47c9eec4703a71644aee", + "https://bcr.bazel.build/modules/platforms/0.0.5/MODULE.bazel": "5733b54ea419d5eaf7997054bb55f6a1d0b5ff8aedf0176fef9eea44f3acda37", + "https://bcr.bazel.build/modules/platforms/0.0.6/MODULE.bazel": "ad6eeef431dc52aefd2d77ed20a4b353f8ebf0f4ecdd26a807d2da5aa8cd0615", + "https://bcr.bazel.build/modules/platforms/0.0.7/MODULE.bazel": "72fd4a0ede9ee5c021f6a8dd92b503e089f46c227ba2813ff183b71616034814", + "https://bcr.bazel.build/modules/platforms/0.0.8/MODULE.bazel": "9f142c03e348f6d263719f5074b21ef3adf0b139ee4c5133e2aa35664da9eb2d", + "https://bcr.bazel.build/modules/platforms/0.0.9/MODULE.bazel": "4a87a60c927b56ddd67db50c89acaa62f4ce2a1d2149ccb63ffd871d5ce29ebc", + "https://bcr.bazel.build/modules/platforms/1.0.0/MODULE.bazel": "f05feb42b48f1b3c225e4ccf351f367be0371411a803198ec34a389fb22aa580", + "https://bcr.bazel.build/modules/platforms/1.1.0/MODULE.bazel": "1c0c09f5bdcf4b3f924720d2478a3711cb39f4977019ca5988685e5b7e18b3d2", + "https://bcr.bazel.build/modules/platforms/1.1.0/source.json": "fcf351c47596c939140ab0d333dfdd08ed1ea6ce33c2fe70c12493a301cf1344", + "https://bcr.bazel.build/modules/protobuf/21.7/MODULE.bazel": "a5a29bb89544f9b97edce05642fac225a808b5b7be74038ea3640fae2f8e66a7", + "https://bcr.bazel.build/modules/protobuf/27.0/MODULE.bazel": "7873b60be88844a0a1d8f80b9d5d20cfbd8495a689b8763e76c6372998d3f64c", + "https://bcr.bazel.build/modules/protobuf/27.1/MODULE.bazel": "703a7b614728bb06647f965264967a8ef1c39e09e8f167b3ca0bb1fd80449c0d", + "https://bcr.bazel.build/modules/protobuf/29.0-rc2/MODULE.bazel": "6241d35983510143049943fc0d57937937122baf1b287862f9dc8590fc4c37df", + "https://bcr.bazel.build/modules/protobuf/29.0-rc3/MODULE.bazel": "33c2dfa286578573afc55a7acaea3cada4122b9631007c594bf0729f41c8de92", + "https://bcr.bazel.build/modules/protobuf/29.1/MODULE.bazel": "557c3457560ff49e122ed76c0bc3397a64af9574691cb8201b4e46d4ab2ecb95", + "https://bcr.bazel.build/modules/protobuf/3.19.0/MODULE.bazel": "6b5fbb433f760a99a22b18b6850ed5784ef0e9928a72668b66e4d7ccd47db9b0", + "https://bcr.bazel.build/modules/protobuf/32.1/MODULE.bazel": "89cd2866a9cb07fee9ff74c41ceace11554f32e0d849de4e23ac55515cfada4d", + "https://bcr.bazel.build/modules/protobuf/33.4/MODULE.bazel": "114775b816b38b6d0ca620450d6b02550c60ceedfdc8d9a229833b34a223dc42", + "https://bcr.bazel.build/modules/protobuf/33.4/source.json": "555f8686b4c7d6b5ba731fbea13bf656b4bfd9a7ff629c1d9d3f6e1d6155de79", + "https://bcr.bazel.build/modules/pybind11_bazel/2.11.1/MODULE.bazel": "88af1c246226d87e65be78ed49ecd1e6f5e98648558c14ce99176da041dc378e", + "https://bcr.bazel.build/modules/pybind11_bazel/2.12.0/MODULE.bazel": "e6f4c20442eaa7c90d7190d8dc539d0ab422f95c65a57cc59562170c58ae3d34", + "https://bcr.bazel.build/modules/pybind11_bazel/2.12.0/source.json": "6900fdc8a9e95866b8c0d4ad4aba4d4236317b5c1cd04c502df3f0d33afed680", + "https://bcr.bazel.build/modules/re2/2023-09-01/MODULE.bazel": "cb3d511531b16cfc78a225a9e2136007a48cf8a677e4264baeab57fe78a80206", + "https://bcr.bazel.build/modules/re2/2024-07-02.bcr.1/MODULE.bazel": "b4963dda9b31080be1905ef085ecd7dd6cd47c05c79b9cdf83ade83ab2ab271a", + "https://bcr.bazel.build/modules/re2/2024-07-02.bcr.1/source.json": "2ff292be6ef3340325ce8a045ecc326e92cbfab47c7cbab4bd85d28971b97ac4", + "https://bcr.bazel.build/modules/re2/2024-07-02/MODULE.bazel": "0eadc4395959969297cbcf31a249ff457f2f1d456228c67719480205aa306daa", + "https://bcr.bazel.build/modules/rules_android/0.1.1/MODULE.bazel": "48809ab0091b07ad0182defb787c4c5328bd3a278938415c00a7b69b50c4d3a8", + "https://bcr.bazel.build/modules/rules_android/0.1.1/source.json": "e6986b41626ee10bdc864937ffb6d6bf275bb5b9c65120e6137d56e6331f089e", + "https://bcr.bazel.build/modules/rules_apple/3.16.0/MODULE.bazel": "0d1caf0b8375942ce98ea944be754a18874041e4e0459401d925577624d3a54a", + "https://bcr.bazel.build/modules/rules_apple/4.1.0/MODULE.bazel": "76e10fd4a48038d3fc7c5dc6e63b7063bbf5304a2e3bd42edda6ec660eebea68", + "https://bcr.bazel.build/modules/rules_apple/4.1.0/source.json": "8ee81e1708756f81b343a5eb2b2f0b953f1d25c4ab3d4a68dc02754872e80715", + "https://bcr.bazel.build/modules/rules_cc/0.0.1/MODULE.bazel": "cb2aa0747f84c6c3a78dad4e2049c154f08ab9d166b1273835a8174940365647", + "https://bcr.bazel.build/modules/rules_cc/0.0.10/MODULE.bazel": "ec1705118f7eaedd6e118508d3d26deba2a4e76476ada7e0e3965211be012002", + "https://bcr.bazel.build/modules/rules_cc/0.0.13/MODULE.bazel": "0e8529ed7b323dad0775ff924d2ae5af7640b23553dfcd4d34344c7e7a867191", + "https://bcr.bazel.build/modules/rules_cc/0.0.15/MODULE.bazel": "6704c35f7b4a72502ee81f61bf88706b54f06b3cbe5558ac17e2e14666cd5dcc", + "https://bcr.bazel.build/modules/rules_cc/0.0.16/MODULE.bazel": "7661303b8fc1b4d7f532e54e9d6565771fea666fbdf839e0a86affcd02defe87", + "https://bcr.bazel.build/modules/rules_cc/0.0.17/MODULE.bazel": "2ae1d8f4238ec67d7185d8861cb0a2cdf4bc608697c331b95bf990e69b62e64a", + "https://bcr.bazel.build/modules/rules_cc/0.0.2/MODULE.bazel": "6915987c90970493ab97393024c156ea8fb9f3bea953b2f3ec05c34f19b5695c", + "https://bcr.bazel.build/modules/rules_cc/0.0.6/MODULE.bazel": "abf360251023dfe3efcef65ab9d56beefa8394d4176dd29529750e1c57eaa33f", + "https://bcr.bazel.build/modules/rules_cc/0.0.8/MODULE.bazel": "964c85c82cfeb6f3855e6a07054fdb159aced38e99a5eecf7bce9d53990afa3e", + "https://bcr.bazel.build/modules/rules_cc/0.0.9/MODULE.bazel": "836e76439f354b89afe6a911a7adf59a6b2518fafb174483ad78a2a2fde7b1c5", + "https://bcr.bazel.build/modules/rules_cc/0.1.1/MODULE.bazel": "2f0222a6f229f0bf44cd711dc13c858dad98c62d52bd51d8fc3a764a83125513", + "https://bcr.bazel.build/modules/rules_cc/0.1.2/MODULE.bazel": "557ddc3a96858ec0d465a87c0a931054d7dcfd6583af2c7ed3baf494407fd8d0", + "https://bcr.bazel.build/modules/rules_cc/0.1.5/MODULE.bazel": "88dfc9361e8b5ae1008ac38f7cdfd45ad738e4fa676a3ad67d19204f045a1fd8", + "https://bcr.bazel.build/modules/rules_cc/0.2.0/MODULE.bazel": "b5c17f90458caae90d2ccd114c81970062946f49f355610ed89bebf954f5783c", + "https://bcr.bazel.build/modules/rules_cc/0.2.13/MODULE.bazel": "eecdd666eda6be16a8d9dc15e44b5c75133405e820f620a234acc4b1fdc5aa37", + "https://bcr.bazel.build/modules/rules_cc/0.2.16/MODULE.bazel": "9242fa89f950c6ef7702801ab53922e99c69b02310c39fb6e62b2bd30df2a1d4", + "https://bcr.bazel.build/modules/rules_cc/0.2.17/MODULE.bazel": "1849602c86cb60da8613d2de887f9566a6d354a6df6d7009f9d04a14402f9a84", + "https://bcr.bazel.build/modules/rules_cc/0.2.18/MODULE.bazel": "4460ec36adc8f722a6a2a4ac9374cb91f2acebadaa93fc37966129afb3dece87", + "https://bcr.bazel.build/modules/rules_cc/0.2.18/source.json": "abad668ff2fd63ada1ac49bf386d37e27048b89a3465a6fd968bb832b00a09d3", + "https://bcr.bazel.build/modules/rules_cc/0.2.4/MODULE.bazel": "1ff1223dfd24f3ecf8f028446d4a27608aa43c3f41e346d22838a4223980b8cc", + "https://bcr.bazel.build/modules/rules_cc/0.2.8/MODULE.bazel": "f1df20f0bf22c28192a794f29b501ee2018fa37a3862a1a2132ae2940a23a642", + "https://bcr.bazel.build/modules/rules_distroless/0.9.4/MODULE.bazel": "e098aab7f99a64d254bd4f425db6d7fb0818e2362f028d1672964ee130615567", + "https://bcr.bazel.build/modules/rules_distroless/0.9.4/source.json": "f4cc35c677da04b354d652a4b5835a7ad1dbd3d53043fbce163a050ae2af85d1", + "https://bcr.bazel.build/modules/rules_foreign_cc/0.9.0/MODULE.bazel": "c9e8c682bf75b0e7c704166d79b599f93b72cfca5ad7477df596947891feeef6", + "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/MODULE.bazel": "40c97d1144356f52905566c55811f13b299453a14ac7769dfba2ac38192337a8", + "https://bcr.bazel.build/modules/rules_java/4.0.0/MODULE.bazel": "5a78a7ae82cd1a33cef56dc578c7d2a46ed0dca12643ee45edbb8417899e6f74", + "https://bcr.bazel.build/modules/rules_java/5.3.5/MODULE.bazel": "a4ec4f2db570171e3e5eb753276ee4b389bae16b96207e9d3230895c99644b86", + "https://bcr.bazel.build/modules/rules_java/6.0.0/MODULE.bazel": "8a43b7df601a7ec1af61d79345c17b31ea1fedc6711fd4abfd013ea612978e39", + "https://bcr.bazel.build/modules/rules_java/6.3.0/MODULE.bazel": "a97c7678c19f236a956ad260d59c86e10a463badb7eb2eda787490f4c969b963", + "https://bcr.bazel.build/modules/rules_java/6.4.0/MODULE.bazel": "e986a9fe25aeaa84ac17ca093ef13a4637f6107375f64667a15999f77db6c8f6", + "https://bcr.bazel.build/modules/rules_java/6.5.2/MODULE.bazel": "1d440d262d0e08453fa0c4d8f699ba81609ed0e9a9a0f02cd10b3e7942e61e31", + "https://bcr.bazel.build/modules/rules_java/7.10.0/MODULE.bazel": "530c3beb3067e870561739f1144329a21c851ff771cd752a49e06e3dc9c2e71a", + "https://bcr.bazel.build/modules/rules_java/7.12.2/MODULE.bazel": "579c505165ee757a4280ef83cda0150eea193eed3bef50b1004ba88b99da6de6", + "https://bcr.bazel.build/modules/rules_java/7.2.0/MODULE.bazel": "06c0334c9be61e6cef2c8c84a7800cef502063269a5af25ceb100b192453d4ab", + "https://bcr.bazel.build/modules/rules_java/7.3.2/MODULE.bazel": "50dece891cfdf1741ea230d001aa9c14398062f2b7c066470accace78e412bc2", + "https://bcr.bazel.build/modules/rules_java/7.6.1/MODULE.bazel": "2f14b7e8a1aa2f67ae92bc69d1ec0fa8d9f827c4e17ff5e5f02e91caa3b2d0fe", + "https://bcr.bazel.build/modules/rules_java/8.3.2/MODULE.bazel": "7336d5511ad5af0b8615fdc7477535a2e4e723a357b6713af439fe8cf0195017", + "https://bcr.bazel.build/modules/rules_java/8.5.1/MODULE.bazel": "d8a9e38cc5228881f7055a6079f6f7821a073df3744d441978e7a43e20226939", + "https://bcr.bazel.build/modules/rules_java/8.6.0/MODULE.bazel": "9c064c434606d75a086f15ade5edb514308cccd1544c2b2a89bbac4310e41c71", + "https://bcr.bazel.build/modules/rules_java/8.6.1/MODULE.bazel": "f4808e2ab5b0197f094cabce9f4b006a27766beb6a9975931da07099560ca9c2", + "https://bcr.bazel.build/modules/rules_java/8.8.0/MODULE.bazel": "de589d0880911ac007abd521b9f0ddcd8b0dbd05c8553e6f8124a050b83acf7d", + "https://bcr.bazel.build/modules/rules_java/9.1.0/MODULE.bazel": "ee63f27e36a3fada80342869361182f120a9819c74320e8e65b1e04ba0cd7a9d", + "https://bcr.bazel.build/modules/rules_java/9.1.0/source.json": "da589573c1dee2c9ac4a568b301269a2e8191110ff0345c1a959fa7ea6c4dfd6", + "https://bcr.bazel.build/modules/rules_jvm_external/4.4.2/MODULE.bazel": "a56b85e418c83eb1839819f0b515c431010160383306d13ec21959ac412d2fe7", + "https://bcr.bazel.build/modules/rules_jvm_external/5.1/MODULE.bazel": "33f6f999e03183f7d088c9be518a63467dfd0be94a11d0055fe2d210f89aa909", + "https://bcr.bazel.build/modules/rules_jvm_external/5.2/MODULE.bazel": "d9351ba35217ad0de03816ef3ed63f89d411349353077348a45348b096615036", + "https://bcr.bazel.build/modules/rules_jvm_external/5.3/MODULE.bazel": "bf93870767689637164657731849fb887ad086739bd5d360d90007a581d5527d", + "https://bcr.bazel.build/modules/rules_jvm_external/6.1/MODULE.bazel": "75b5fec090dbd46cf9b7d8ea08cf84a0472d92ba3585b476f44c326eda8059c4", + "https://bcr.bazel.build/modules/rules_jvm_external/6.3/MODULE.bazel": "c998e060b85f71e00de5ec552019347c8bca255062c990ac02d051bb80a38df0", + "https://bcr.bazel.build/modules/rules_jvm_external/6.7/MODULE.bazel": "e717beabc4d091ecb2c803c2d341b88590e9116b8bf7947915eeb33aab4f96dd", + "https://bcr.bazel.build/modules/rules_jvm_external/6.7/source.json": "5426f412d0a7fc6b611643376c7e4a82dec991491b9ce5cb1cfdd25fe2e92be4", + "https://bcr.bazel.build/modules/rules_kotlin/1.9.0/MODULE.bazel": "ef85697305025e5a61f395d4eaede272a5393cee479ace6686dba707de804d59", + "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/MODULE.bazel": "d269a01a18ee74d0335450b10f62c9ed81f2321d7958a2934e44272fe82dcef3", + "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/source.json": "2faa4794364282db7c06600b7e5e34867a564ae91bda7cae7c29c64e9466b7d5", + "https://bcr.bazel.build/modules/rules_license/0.0.3/MODULE.bazel": "627e9ab0247f7d1e05736b59dbb1b6871373de5ad31c3011880b4133cafd4bd0", + "https://bcr.bazel.build/modules/rules_license/0.0.7/MODULE.bazel": "088fbeb0b6a419005b89cf93fe62d9517c0a2b8bb56af3244af65ecfe37e7d5d", + "https://bcr.bazel.build/modules/rules_license/1.0.0/MODULE.bazel": "a7fda60eefdf3d8c827262ba499957e4df06f659330bbe6cdbdb975b768bb65c", + "https://bcr.bazel.build/modules/rules_license/1.0.0/source.json": "a52c89e54cc311196e478f8382df91c15f7a2bfdf4c6cd0e2675cc2ff0b56efb", + "https://bcr.bazel.build/modules/rules_pkg/0.7.0/MODULE.bazel": "df99f03fc7934a4737122518bb87e667e62d780b610910f0447665a7e2be62dc", + "https://bcr.bazel.build/modules/rules_pkg/1.0.1/MODULE.bazel": "5b1df97dbc29623bccdf2b0dcd0f5cb08e2f2c9050aab1092fd39a41e82686ff", + "https://bcr.bazel.build/modules/rules_pkg/1.1.0/MODULE.bazel": "9db8031e71b6ef32d1846106e10dd0ee2deac042bd9a2de22b4761b0c3036453", + "https://bcr.bazel.build/modules/rules_pkg/1.1.0/source.json": "fef768df13a92ce6067e1cd0cdc47560dace01354f1d921cfb1d632511f7d608", + "https://bcr.bazel.build/modules/rules_proto/4.0.0/MODULE.bazel": "a7a7b6ce9bee418c1a760b3d84f83a299ad6952f9903c67f19e4edd964894e06", + "https://bcr.bazel.build/modules/rules_proto/5.3.0-21.7/MODULE.bazel": "e8dff86b0971688790ae75528fe1813f71809b5afd57facb44dad9e8eca631b7", + "https://bcr.bazel.build/modules/rules_proto/6.0.0-rc1/MODULE.bazel": "1e5b502e2e1a9e825eef74476a5a1ee524a92297085015a052510b09a1a09483", + "https://bcr.bazel.build/modules/rules_proto/6.0.2/MODULE.bazel": "ce916b775a62b90b61888052a416ccdda405212b6aaeb39522f7dc53431a5e73", + "https://bcr.bazel.build/modules/rules_proto/7.0.2/MODULE.bazel": "bf81793bd6d2ad89a37a40693e56c61b0ee30f7a7fdbaf3eabbf5f39de47dea2", + "https://bcr.bazel.build/modules/rules_proto/7.1.0/MODULE.bazel": "002d62d9108f75bb807cd56245d45648f38275cb3a99dcd45dfb864c5d74cb96", + "https://bcr.bazel.build/modules/rules_proto/7.1.0/source.json": "39f89066c12c24097854e8f57ab8558929f9c8d474d34b2c00ac04630ad8940e", + "https://bcr.bazel.build/modules/rules_python/0.10.2/MODULE.bazel": "cc82bc96f2997baa545ab3ce73f196d040ffb8756fd2d66125a530031cd90e5f", + "https://bcr.bazel.build/modules/rules_python/0.23.1/MODULE.bazel": "49ffccf0511cb8414de28321f5fcf2a31312b47c40cc21577144b7447f2bf300", + "https://bcr.bazel.build/modules/rules_python/0.25.0/MODULE.bazel": "72f1506841c920a1afec76975b35312410eea3aa7b63267436bfb1dd91d2d382", + "https://bcr.bazel.build/modules/rules_python/0.28.0/MODULE.bazel": "cba2573d870babc976664a912539b320cbaa7114cd3e8f053c720171cde331ed", + "https://bcr.bazel.build/modules/rules_python/0.31.0/MODULE.bazel": "93a43dc47ee570e6ec9f5779b2e64c1476a6ce921c48cc9a1678a91dd5f8fd58", + "https://bcr.bazel.build/modules/rules_python/0.33.2/MODULE.bazel": "3e036c4ad8d804a4dad897d333d8dce200d943df4827cb849840055be8d2e937", + "https://bcr.bazel.build/modules/rules_python/0.4.0/MODULE.bazel": "9208ee05fd48bf09ac60ed269791cf17fb343db56c8226a720fbb1cdf467166c", + "https://bcr.bazel.build/modules/rules_python/1.0.0/MODULE.bazel": "898a3d999c22caa585eb062b600f88654bf92efb204fa346fb55f6f8edffca43", + "https://bcr.bazel.build/modules/rules_python/1.3.0/MODULE.bazel": "8361d57eafb67c09b75bf4bbe6be360e1b8f4f18118ab48037f2bd50aa2ccb13", + "https://bcr.bazel.build/modules/rules_python/1.4.1/MODULE.bazel": "8991ad45bdc25018301d6b7e1d3626afc3c8af8aaf4bc04f23d0b99c938b73a6", + "https://bcr.bazel.build/modules/rules_python/1.6.0/MODULE.bazel": "7e04ad8f8d5bea40451cf80b1bd8262552aa73f841415d20db96b7241bd027d8", + "https://bcr.bazel.build/modules/rules_python/1.7.0/MODULE.bazel": "d01f995ecd137abf30238ad9ce97f8fc3ac57289c8b24bd0bf53324d937a14f8", + "https://bcr.bazel.build/modules/rules_python/1.9.0/MODULE.bazel": "afc3a05f29f09f2d3ee95ad99a145250dab41a2b2d8d6f82cc91936b3213282c", + "https://bcr.bazel.build/modules/rules_python/1.9.0/source.json": "3921ea0b65298d51aead5b9e4a82203d7be9b5918619b58b53f1c259f4e63169", + "https://bcr.bazel.build/modules/rules_shell/0.2.0/MODULE.bazel": "fda8a652ab3c7d8fee214de05e7a9916d8b28082234e8d2c0094505c5268ed3c", + "https://bcr.bazel.build/modules/rules_shell/0.3.0/MODULE.bazel": "de4402cd12f4cc8fda2354fce179fdb068c0b9ca1ec2d2b17b3e21b24c1a937b", + "https://bcr.bazel.build/modules/rules_shell/0.4.1/MODULE.bazel": "00e501db01bbf4e3e1dd1595959092c2fadf2087b2852d3f553b5370f5633592", + "https://bcr.bazel.build/modules/rules_shell/0.6.1/MODULE.bazel": "72e76b0eea4e81611ef5452aa82b3da34caca0c8b7b5c0c9584338aa93bae26b", + "https://bcr.bazel.build/modules/rules_shell/0.6.1/source.json": "20ec05cd5e592055e214b2da8ccb283c7f2a421ea0dc2acbf1aa792e11c03d0c", + "https://bcr.bazel.build/modules/rules_swift/1.16.0/MODULE.bazel": "4a09f199545a60d09895e8281362b1ff3bb08bbde69c6fc87aff5b92fcc916ca", + "https://bcr.bazel.build/modules/rules_swift/2.1.1/MODULE.bazel": "494900a80f944fc7aa61500c2073d9729dff0b764f0e89b824eb746959bc1046", + "https://bcr.bazel.build/modules/rules_swift/2.4.0/MODULE.bazel": "1639617eb1ede28d774d967a738b4a68b0accb40650beadb57c21846beab5efd", + "https://bcr.bazel.build/modules/rules_swift/3.1.2/MODULE.bazel": "72c8f5cf9d26427cee6c76c8e3853eb46ce6b0412a081b2b6db6e8ad56267400", + "https://bcr.bazel.build/modules/rules_swift/3.1.2/source.json": "e85761f3098a6faf40b8187695e3de6d97944e98abd0d8ce579cb2daf6319a66", + "https://bcr.bazel.build/modules/stardoc/0.5.1/MODULE.bazel": "1a05d92974d0c122f5ccf09291442580317cdd859f07a8655f1db9a60374f9f8", + "https://bcr.bazel.build/modules/stardoc/0.5.3/MODULE.bazel": "c7f6948dae6999bf0db32c1858ae345f112cacf98f174c7a8bb707e41b974f1c", + "https://bcr.bazel.build/modules/stardoc/0.5.6/MODULE.bazel": "c43dabc564990eeab55e25ed61c07a1aadafe9ece96a4efabb3f8bf9063b71ef", + "https://bcr.bazel.build/modules/stardoc/0.6.2/MODULE.bazel": "7060193196395f5dd668eda046ccbeacebfd98efc77fed418dbe2b82ffaa39fd", + "https://bcr.bazel.build/modules/stardoc/0.7.0/MODULE.bazel": "05e3d6d30c099b6770e97da986c53bd31844d7f13d41412480ea265ac9e8079c", + "https://bcr.bazel.build/modules/stardoc/0.7.1/MODULE.bazel": "3548faea4ee5dda5580f9af150e79d0f6aea934fc60c1cc50f4efdd9420759e7", + "https://bcr.bazel.build/modules/stardoc/0.7.2/MODULE.bazel": "fc152419aa2ea0f51c29583fab1e8c99ddefd5b3778421845606ee628629e0e5", + "https://bcr.bazel.build/modules/stardoc/0.7.2/source.json": "58b029e5e901d6802967754adf0a9056747e8176f017cfe3607c0851f4d42216", + "https://bcr.bazel.build/modules/swift_argument_parser/1.3.1.1/MODULE.bazel": "5e463fbfba7b1701d957555ed45097d7f984211330106ccd1352c6e0af0dcf91", + "https://bcr.bazel.build/modules/swift_argument_parser/1.3.1.2/MODULE.bazel": "75aab2373a4bbe2a1260b9bf2a1ebbdbf872d3bd36f80bff058dccd82e89422f", + "https://bcr.bazel.build/modules/swift_argument_parser/1.3.1.2/source.json": "5fba48bbe0ba48761f9e9f75f92876cafb5d07c0ce059cc7a8027416de94a05b", + "https://bcr.bazel.build/modules/tar.bzl/0.10.1/MODULE.bazel": "bf5fda5b5ccef8c3c4a5f4886144377386e0baa382972f257acb42dcf40ea908", + "https://bcr.bazel.build/modules/tar.bzl/0.10.1/source.json": "3f1beb35acf53c270a9de493cdc775a985551d7069cfcf24e136b42f683bbb10", + "https://bcr.bazel.build/modules/tar.bzl/0.2.1/MODULE.bazel": "52d1c00a80a8cc67acbd01649e83d8dd6a9dc426a6c0b754a04fe8c219c76468", + "https://bcr.bazel.build/modules/tar.bzl/0.5.1/MODULE.bazel": "7c2eb3dcfc53b0f3d6f9acdfd911ca803eaf92aadf54f8ca6e4c1f3aee288351", + "https://bcr.bazel.build/modules/tar.bzl/0.6.0/MODULE.bazel": "a3584b4edcfafcabd9b0ef9819808f05b372957bbdff41601429d5fd0aac2e7c", + "https://bcr.bazel.build/modules/toml.bzl/0.3.0/MODULE.bazel": "5016e5dd1ad2200e119a4b28b2b3935e276c4b480f2fe3e952bea7eeba88f578", + "https://bcr.bazel.build/modules/toml.bzl/0.3.0/source.json": "0cf7c878c419b37ddb55f3dd93dd7c0c409bd7c4efacb3da504e0748780b2fa9", + "https://bcr.bazel.build/modules/upb/0.0.0-20220923-a547704/MODULE.bazel": "7298990c00040a0e2f121f6c32544bab27d4452f80d9ce51349b1a28f3005c43", + "https://bcr.bazel.build/modules/with_cfg.bzl/0.14.6/MODULE.bazel": "6b6c543e415d2a502954766e50c6a6144a131687f2751b62157a9250e2b04982", + "https://bcr.bazel.build/modules/with_cfg.bzl/0.14.6/source.json": "12363ac76d821f6c7dabfebbd673615391da06e2e33f576402d31a96a7b56532", + "https://bcr.bazel.build/modules/yq.bzl/0.1.1/MODULE.bazel": "9039681f9bcb8958ee2c87ffc74bdafba9f4369096a2b5634b88abc0eaefa072", + "https://bcr.bazel.build/modules/yq.bzl/0.3.1/MODULE.bazel": "9bcb7151b3cd4681b89d350530eaf7b45e32a44dda94843b8932b0cb1cd4594a", + "https://bcr.bazel.build/modules/yq.bzl/0.3.1/source.json": "f0b0f204a2a6b0e34b4c9541efe8c04f2ef1af65948daa784eccea738b21dbd2", + "https://bcr.bazel.build/modules/zlib/1.2.11/MODULE.bazel": "07b389abc85fdbca459b69e2ec656ae5622873af3f845e1c9d80fe179f3effa0", + "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/MODULE.bazel": "eec517b5bbe5492629466e11dae908d043364302283de25581e3eb944326c4ca", + "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/source.json": "22bc55c47af97246cfc093d0acf683a7869377de362b5d1c552c2c2e16b7a806", + "https://bcr.bazel.build/modules/zlib/1.3.1/MODULE.bazel": "751c9940dcfe869f5f7274e1295422a34623555916eb98c174c1e945594bf198" + }, + "selectedYankedVersions": {}, + "moduleExtensions": { + "@@aspect_tools_telemetry+//:extension.bzl%telemetry": { + "general": { + "bzlTransitiveDigest": "cl5A2O84vDL6Tt+Qga8FCj1DUDGqn+e7ly5rZ+4xvcc=", + "usagesDigest": "kqQBy77VGMZA0qEiCyGKY3JKPhKrjzzyMVYd0SUIw30=", + "recordedInputs": [ + "REPO_MAPPING:aspect_tools_telemetry+,bazel_lib bazel_lib+", + "REPO_MAPPING:aspect_tools_telemetry+,bazel_skylib bazel_skylib+" + ], + "generatedRepoSpecs": { + "aspect_tools_telemetry_report": { + "repoRuleId": "@@aspect_tools_telemetry+//:extension.bzl%tel_repository", + "attributes": { + "deps": { + "aspect_rules_py": "2.0.0-alpha.4", + "aspect_tools_telemetry": "0.3.3" + } + } + } + } + } + }, + "@@rules_kotlin+//src/main/starlark/core/repositories:bzlmod_setup.bzl%rules_kotlin_extensions": { + "general": { + "bzlTransitiveDigest": "+Kp6j204mBZ3mxlIDDR0gBoP45BZ4jYRhRAcB8sU0qc=", + "usagesDigest": "QI2z8ZUR+mqtbwsf2fLqYdJAkPOHdOV+tF2yVAUgRzw=", + "recordedInputs": [ + "REPO_MAPPING:rules_kotlin+,bazel_tools bazel_tools" + ], + "generatedRepoSpecs": { + "com_github_jetbrains_kotlin_git": { + "repoRuleId": "@@rules_kotlin+//src/main/starlark/core/repositories:compiler.bzl%kotlin_compiler_git_repository", + "attributes": { + "urls": [ + "https://github.com/JetBrains/kotlin/releases/download/v1.9.23/kotlin-compiler-1.9.23.zip" + ], + "sha256": "93137d3aab9afa9b27cb06a824c2324195c6b6f6179d8a8653f440f5bd58be88" + } + }, + "com_github_jetbrains_kotlin": { + "repoRuleId": "@@rules_kotlin+//src/main/starlark/core/repositories:compiler.bzl%kotlin_capabilities_repository", + "attributes": { + "git_repository_name": "com_github_jetbrains_kotlin_git", + "compiler_version": "1.9.23" + } + }, + "com_github_google_ksp": { + "repoRuleId": "@@rules_kotlin+//src/main/starlark/core/repositories:ksp.bzl%ksp_compiler_plugin_repository", + "attributes": { + "urls": [ + "https://github.com/google/ksp/releases/download/1.9.23-1.0.20/artifacts.zip" + ], + "sha256": "ee0618755913ef7fd6511288a232e8fad24838b9af6ea73972a76e81053c8c2d", + "strip_version": "1.9.23-1.0.20" + } + }, + "com_github_pinterest_ktlint": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_file", + "attributes": { + "sha256": "01b2e0ef893383a50dbeb13970fe7fa3be36ca3e83259e01649945b09d736985", + "urls": [ + "https://github.com/pinterest/ktlint/releases/download/1.3.0/ktlint" + ], + "executable": true + } + }, + "rules_android": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "sha256": "cd06d15dd8bb59926e4d65f9003bfc20f9da4b2519985c27e190cddc8b7a7806", + "strip_prefix": "rules_android-0.1.1", + "urls": [ + "https://github.com/bazelbuild/rules_android/archive/v0.1.1.zip" + ] + } + } + } + } + }, + "@@rules_python+//python/uv:uv.bzl%uv": { + "general": { + "bzlTransitiveDigest": "yG9F6L2IZXKRbD/aIUa6sU7uITLUTBKOMWPbIvl1VdM=", + "usagesDigest": "6MjoD3H+netDdhklgMWks3NARpHVXxy8kfsMe9XXPa8=", + "recordedInputs": [ + "REPO_MAPPING:rules_python+,bazel_tools bazel_tools", + "REPO_MAPPING:rules_python+,platforms platforms" + ], + "generatedRepoSpecs": { + "uv": { + "repoRuleId": "@@rules_python+//python/uv/private:uv_toolchains_repo.bzl%uv_toolchains_repo", + "attributes": { + "toolchain_type": "'@@rules_python+//python/uv:uv_toolchain_type'", + "toolchain_names": [ + "none" + ], + "toolchain_implementations": { + "none": "'@@rules_python+//python:none'" + }, + "toolchain_compatible_with": { + "none": [ + "@platforms//:incompatible" + ] + }, + "toolchain_target_settings": {} + } + } + } + } + }, + "@@yq.bzl+//yq:extensions.bzl%yq": { + "general": { + "bzlTransitiveDigest": "61Uz+o5PnlY0jJfPZEUNqsKxnM/UCLeWsn5VVCc8u5Y=", + "usagesDigest": "oAQ5Hp6H1wlr4abmhh+iBqk43oSfdXw+++tKd5PKWHE=", + "recordedInputs": [], + "generatedRepoSpecs": { + "yq_darwin_amd64": { + "repoRuleId": "@@yq.bzl+//yq/toolchain:platforms.bzl%yq_platform_repo", + "attributes": { + "platform": "darwin_amd64", + "version": "4.45.1" + } + }, + "yq_darwin_arm64": { + "repoRuleId": "@@yq.bzl+//yq/toolchain:platforms.bzl%yq_platform_repo", + "attributes": { + "platform": "darwin_arm64", + "version": "4.45.1" + } + }, + "yq_linux_amd64": { + "repoRuleId": "@@yq.bzl+//yq/toolchain:platforms.bzl%yq_platform_repo", + "attributes": { + "platform": "linux_amd64", + "version": "4.45.1" + } + }, + "yq_linux_arm64": { + "repoRuleId": "@@yq.bzl+//yq/toolchain:platforms.bzl%yq_platform_repo", + "attributes": { + "platform": "linux_arm64", + "version": "4.45.1" + } + }, + "yq_linux_s390x": { + "repoRuleId": "@@yq.bzl+//yq/toolchain:platforms.bzl%yq_platform_repo", + "attributes": { + "platform": "linux_s390x", + "version": "4.45.1" + } + }, + "yq_linux_riscv64": { + "repoRuleId": "@@yq.bzl+//yq/toolchain:platforms.bzl%yq_platform_repo", + "attributes": { + "platform": "linux_riscv64", + "version": "4.45.1" + } + }, + "yq_linux_ppc64le": { + "repoRuleId": "@@yq.bzl+//yq/toolchain:platforms.bzl%yq_platform_repo", + "attributes": { + "platform": "linux_ppc64le", + "version": "4.45.1" + } + }, + "yq_windows_amd64": { + "repoRuleId": "@@yq.bzl+//yq/toolchain:platforms.bzl%yq_platform_repo", + "attributes": { + "platform": "windows_amd64", + "version": "4.45.1" + } + }, + "yq_toolchains": { + "repoRuleId": "@@yq.bzl+//yq/toolchain:toolchain.bzl%yq_toolchains_repo", + "attributes": { + "user_repository_name": "yq" + } + } + } + } + } + }, + "facts": { + "@@aspect_rules_py+//py:extensions.bzl%python_interpreters": { + "release_index_v1_20241002_https://github.com/astral-sh/python-build-standalone/releases/download": { + "3.10/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.10.15+20241002-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.10.15", + "sha256": "bcfdf8235cd4f84ca280f33a17030e65ba23e7905e70a8ed2ed2c83229ad136f" + }, + "3.10/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.10.15+20241002-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.10.15", + "sha256": "2e364a47cdbfcfaf56122b7656a3e8a7163babbda4f6bb6165aa644cbc65bd57" + }, + "3.10/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.10.15+20241002-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.10.15", + "sha256": "814561a8addee5f56a19223ecdd879a22b82d631bd5704eac7b2e98287e797a8" + }, + "3.10/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.10.15+20241002-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.10.15", + "sha256": "35678c2ba6d7aff56ca96f06ca735fe4bd09e4a5d3d40f552d76a1653c80a123" + }, + "3.10/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.10.15+20241002-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.10.15", + "sha256": "422fb92c310f030b05ca8e59a256c72ffde38f03382a006284d9e5e2a7b646f5" + }, + "3.10/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.10.15+20241002-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.10.15", + "sha256": "f17cba68a55dcd386be4cbb0002cf3037718019fc1585b2ff9a32efd3283557d" + }, + "3.10/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.10.15+20241002-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.10.15", + "sha256": "7b2baf761282600359d43e6f14b01437a8d0e517ba3a28f50688806dd8897b11" + }, + "3.11/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.11.10+20241002-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.11.10", + "sha256": "540225743ca9ca04d7e0de520e211ecafb379677c49fba4b89334e7248219cb2" + }, + "3.11/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.11.10+20241002-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.11.10", + "sha256": "047e687b561f8e38740819cc3e112e83ae349927cca846921a1c301e5d9cc873" + }, + "3.11/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.11.10+20241002-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.11.10", + "sha256": "d9e75d5028c8975c158f4b9c01ef820480249b3401dbde755c0f344e15feebf5" + }, + "3.11/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.11.10+20241002-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.11.10", + "sha256": "f498693f03fd672a4dc581ef0e1101102d33964352c35ecff21686a8d00744c9" + }, + "3.11/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.11.10+20241002-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.11.10", + "sha256": "d71cde066b614903e9f243c4babd179e7e978fcfa95702355566463e623abe6c" + }, + "3.11/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.11.10+20241002-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.11.10", + "sha256": "9c0197e72b2dd1ebf56eb562cb7a078052b4ab71d5666cd3be3b6e75db42c79e" + }, + "3.11/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.11.10+20241002-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.11.10", + "sha256": "fb86dce628d2008eefd3550193839fb9f283f5f6c25a09c8b676713ff4757156" + }, + "3.12/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.12.7+20241002-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.12.7", + "sha256": "5a9cdbb8536839a83edae3e41eb44161b640d78181fec083e07c668ba796a875" + }, + "3.12/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.12.7+20241002-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.12.7", + "sha256": "5481ca52e7ac8685c1e9d4e804a66e5c928879e0f44799aa6934735f66266643" + }, + "3.12/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.12.7+20241002-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.12.7", + "sha256": "8c62920e2fef022fc49d58cc999c77ea45318f96a5a5c0ba3bb155d33732d7f3" + }, + "3.12/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.12.7+20241002-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.12.7", + "sha256": "60eaf2c9a63926f5edfe7a0ecf4b2fbb37de6764f0c0100be245d098e3995da7" + }, + "3.12/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.12.7+20241002-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.12.7", + "sha256": "1c74dd0499ef7d993d8942ebe6692c90c50d09719e0335f8e210b91277f8e7c0" + }, + "3.12/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.12.7+20241002-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.12.7", + "sha256": "04ffccbbb1beedd0bc80347c061fe527833001681ee543c3ba85dac5134ed500" + }, + "3.12/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.12.7+20241002-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.12.7", + "sha256": "d4a8f2b3e422089475bcd6f2b855c9ed0e666af2de4f19df7c764362eb8c4aca" + }, + "3.13/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.13.0rc3+20241002-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.13.0rc3", + "sha256": "577e846eaf0a27342b3f80b5f292eb292b0eb6a9df3a0fa0c5925e86cfe046a3" + }, + "3.13/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.13.0rc3+20241002-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.13.0rc3", + "sha256": "48974ab9b4a6990b17e6740393492fc5557e6acc4ab02be9d9543e0e506e48a6" + }, + "3.13/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.13.0rc3+20241002-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.13.0rc3", + "sha256": "fa5e8195fa7a6b6d4df0bc92b36d38836b72c4f5fb41978d495abe5a454fed67" + }, + "3.13/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.13.0rc3+20241002-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.13.0rc3", + "sha256": "81a01923b25a4b2b68f517b07a4a4a9186d873e6518f060e4a004e77d7094687" + }, + "3.13/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.13.0rc3+20241002-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.13.0rc3", + "sha256": "319ecb727317868c4f3bfecd480f216b38275f5373f72c022d255318b650ebe2" + }, + "3.13/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.13.0rc3+20241002-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.13.0rc3", + "sha256": "a4b4e0a79b53938db050daf7f78dd09faf49d1e29dbba6cac87cf857c0a51fb4" + }, + "3.13/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.13.0rc3+20241002-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.13.0rc3", + "sha256": "56fac98fb5ed39f67cd7c0ce6e503a1e551ce727dc46796a0f16c09d26e845aa" + }, + "3.8/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.8.20+20241002-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.8.20", + "sha256": "2ddfc04bdb3e240f30fb782fa1deec6323799d0e857e0b63fa299218658fd3d4" + }, + "3.8/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.8.20+20241002-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.8.20", + "sha256": "9d8798f9e79e0fc0f36fcb95bfa28a1023407d51a8ea5944b4da711f1f75f1ed" + }, + "3.8/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.8.20+20241002-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.8.20", + "sha256": "06988218600fe3e2c02c3182d5629a1d4e596b3771ab32a9e99756c5904b5fac" + }, + "3.8/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.8.20+20241002-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.8.20", + "sha256": "68d060cd373255d2ca5b8b3441363d5aa7cc45b0c11bbccf52b1717c2b5aa8bb" + }, + "3.8/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.8.20+20241002-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.8.20", + "sha256": "41b6709fec9c56419b7de1940d1f87fa62045aff81734480672dcb807eedc47e" + }, + "3.8/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.8.20+20241002-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.8.20", + "sha256": "285e141c36f88b2e9357654c5f77d1f8fb29cc25132698fe35bb30d787f38e87" + }, + "3.8/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.8.20+20241002-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.8.20", + "sha256": "ea8d7f9dd35815cf88f5ed257b5d0206d97df5a9500f719b6a6031b8c7071db8" + }, + "3.9/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.9.20+20241002-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.9.20", + "sha256": "dc5f3b4c54deea7a42479b3f81b1c1b3a330f721aea3aff7df9833567bbfa8ea" + }, + "3.9/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.9.20+20241002-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.9.20", + "sha256": "0d84fa0884e843828312a1fcbfd8756abe3d6cf3c27086f79cd7352bad13ac4c" + }, + "3.9/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.9.20+20241002-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.9.20", + "sha256": "bd2c7cf4d7eba224ada44dfbccf5248d313ba5072462c71aa753c824354704f3" + }, + "3.9/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.9.20+20241002-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.9.20", + "sha256": "a07be8fddd5f6f6a0db7abd16f2b2a8a94a891e54091e4f45b64e822597e4d7d" + }, + "3.9/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.9.20+20241002-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.9.20", + "sha256": "94000af8e9d9f5aba6d2325963a6b3403afbf310f6790edff3dfe8becd8197de" + }, + "3.9/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.9.20+20241002-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.9.20", + "sha256": "fec849569158e5e46610621d7da91b02dca2cc5f66dd49cc0f85d7469c8f5a84" + }, + "3.9/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.9.20+20241002-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.9.20", + "sha256": "31f5e329f14ac8b79527712c4265edfea1cb6dff4bb04cf8c51cd809290e136c" + } + }, + "release_index_v1_20251031_https://github.com/astral-sh/python-build-standalone/releases/download": { + "3.10/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.10.19+20251031-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.10.19", + "sha256": "43bda24c2fc073bc308bf631203b917a72640d59b59fdad4ba14503d84727012" + }, + "3.10/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.10.19+20251031-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.10.19", + "sha256": "f77a8a8aa77f3f943126fa9215a25309da4bf20398fc8f4b4eec54b5fc7570ef" + }, + "3.10/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.10.19+20251031-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.10.19", + "sha256": "9b9deba652d98857ae99bd11b05fb560144aafbd9b9e8e01c8c6d56577a06a4d" + }, + "3.10/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.10.19+20251031-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.10.19", + "sha256": "0240edca85508661e20bb69562686965c85b8328727332d9ebfd57cceb7fb372" + }, + "3.10/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.10.19+20251031-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.10.19", + "sha256": "76c12e633c09c2a790f8a958a55df4495527e0718d1875310c836e757c0c7b55" + }, + "3.10/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.10.19+20251031-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.10.19", + "sha256": "cfa08a4caf2df1b43551b843c052d6a8814e2ea0c97268b021f0423646c244c3" + }, + "3.10/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.10.19+20251031-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.10.19", + "sha256": "fb1caac917d7b6497bb6f5950da5f1e48d05c43a498948dd97f85760c4382d9f" + }, + "3.10/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.10.19+20251031-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.10.19", + "sha256": "ba85013ed5ac7733fc6840168cc33ed19e9959b363dc80227d54f8fd9c92c0f4" + }, + "3.11/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.11.14+20251031-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.11.14", + "sha256": "6de5572b33c65af1c9b7caf00ec593fb04cffb7e14fa393a98261bb9bc464713" + }, + "3.11/aarch64-pc-windows-msvc/install_only": { + "filename": "cpython-3.11.14+20251031-aarch64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.11.14", + "sha256": "38d0d1466561e15965e8d2c20f5e5be649598f55c761ecab553d087fbd217337" + }, + "3.11/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.11.14+20251031-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.11.14", + "sha256": "510edb027527413c4249256194cb8ad2590b52dd93f7123b4cb341aff5d05894" + }, + "3.11/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.11.14+20251031-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.11.14", + "sha256": "27609ec2b0c6172d5d9f502115a6d48c20ee0a578bf5b0470cd1090be95c22aa" + }, + "3.11/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.11.14+20251031-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.11.14", + "sha256": "b4341ef60bc157f992a0d171f1be4e4c42dcfc537f3562f72aa7f1f9561935e0" + }, + "3.11/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.11.14+20251031-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.11.14", + "sha256": "4891cbf34e8652b7bd1054b9502395e4b7e048e2e517c040fbf6c8297cb954d6" + }, + "3.11/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.11.14+20251031-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.11.14", + "sha256": "5223b83ed9e2aa5e9e17d2ebcf767956e998876339b9cde1980a47e9d4655fb6" + }, + "3.11/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.11.14+20251031-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.11.14", + "sha256": "60f0bd473d861cc45d3401d9914e47ccb9fa037f88a91879ed517a62042b8477" + }, + "3.11/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.11.14+20251031-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.11.14", + "sha256": "25e82d1e85b90a8ab724ee633a1811b1921797f5c25ee69c6595052371b91a87" + }, + "3.12/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.12.12+20251031-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.12.12", + "sha256": "5e110cb821d2eb8246065d3b46faa655180c976c4e17250f7883c634a629bc63" + }, + "3.12/aarch64-pc-windows-msvc/install_only": { + "filename": "cpython-3.12.12+20251031-aarch64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.12.12", + "sha256": "b190fed7c2b0f6e1010f554a0d1fd191c0754c4c0718e69d9d795ae559613780" + }, + "3.12/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.12.12+20251031-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.12.12", + "sha256": "81b644d166e0bfb918615af8a2363f8fcf26eccdcc60a5334b6a62c088470bac" + }, + "3.12/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.12.12+20251031-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.12.12", + "sha256": "fc423af42f4eb454c99779d9eedc619141606572da3851f7980a8da719f0f8db" + }, + "3.12/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.12.12+20251031-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.12.12", + "sha256": "7d333e58a53edb1ba3c85bb35dc718ea3e599d0f6b58a0cbef35b2d8184a763e" + }, + "3.12/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.12.12+20251031-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.12.12", + "sha256": "687052a046d33be49dc95dd671816709067cf6176ed36c93ea61b1fe0b883b0f" + }, + "3.12/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.12.12+20251031-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.12.12", + "sha256": "cff398b3f520c442a1b085dd347126c10c1b03f01ccc0decd8c897a687e893f1" + }, + "3.12/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.12.12+20251031-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.12.12", + "sha256": "80c3882f14e15cef8260ef5257d198e8f4371ca265887431d939e0d561de3253" + }, + "3.12/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.12.12+20251031-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.12.12", + "sha256": "0a461330b9b89f2ea3088dde10d7a3f96aa65897b7c5ce2404fa3b5c4b8daa14" + }, + "3.13/aarch64-apple-darwin/freethreaded": { + "filename": "cpython-3.13.9+20251031-aarch64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.13.9", + "sha256": "eae1272a72ccce601590a10a9ca2a58199b5fcdf022aa603a527e3e2a04de9bc" + }, + "3.13/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.13.9+20251031-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.13.9", + "sha256": "1f3568d17383426d52350c2ef7c93c1a5a043198b860cb05e5d19b35f9c25cef" + }, + "3.13/aarch64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.13.9+20251031-aarch64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.13.9", + "sha256": "743ff69935ef28834621647dab30f032dfcd80315732917531eea333210941c7" + }, + "3.13/aarch64-pc-windows-msvc/install_only": { + "filename": "cpython-3.13.9+20251031-aarch64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.13.9", + "sha256": "20db43873d3c4c2175d866806545e4ad4ec6bb72ca95e60082a4df6c24567e8c" + }, + "3.13/aarch64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.13.9+20251031-aarch64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.13.9", + "sha256": "a6e72f9de5d9b46cf6968d6a492f2401a919f9b959f8da2d87f43484b80169ee" + }, + "3.13/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.13.9+20251031-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.13.9", + "sha256": "0a56d11b0fb1662e67f892b9d5d1717aef06f24dbb8362bc25b8f784e620d44e" + }, + "3.13/aarch64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.13.9+20251031-aarch64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.13.9", + "sha256": "ba6a8d199c9f2a7aa5b88fdf16132049d675ab483eb6250e176a90fa0726eac4" + }, + "3.13/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.13.9+20251031-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.13.9", + "sha256": "90c803b66f8483caeeb5655ca82b7f19068515826a569ed05414326a6ff8d06d" + }, + "3.13/i686-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.13.9+20251031-i686-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.13.9", + "sha256": "a6cb3d7df191cde663ebf5f0108a9d7742e33862676ecde97fd90184333e822d" + }, + "3.13/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.13.9+20251031-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.13.9", + "sha256": "c0b0a34a492465bd44e9512582ae4ca47c06f9696807048cd917cb71c03a8416" + }, + "3.13/x86_64-apple-darwin/freethreaded": { + "filename": "cpython-3.13.9+20251031-x86_64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.13.9", + "sha256": "e2bf5fa6a3ef443ade362e08b0a19bbc172f7bfe34dabe933ccaad31d53af5da" + }, + "3.13/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.13.9+20251031-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.13.9", + "sha256": "48c0f3ca5d31e90658ef99138dc21865bb62f388ab97a1ce72cac176da194ab0" + }, + "3.13/x86_64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.13.9+20251031-x86_64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.13.9", + "sha256": "318a9a1e43dd52054327de3bccc0c5b7afde7b7f2a398ccb4d38e03d28b05386" + }, + "3.13/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.13.9+20251031-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.13.9", + "sha256": "874593f641f31ea101440c70f81768c35d4d7d6df111fde63094db67465ef787" + }, + "3.13/x86_64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.13.9+20251031-x86_64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.13.9", + "sha256": "dcc29b069d0588fbd4ea29c6df840c8d1207d2a3bce8cd5cd57d1b85373b6048" + }, + "3.13/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.13.9+20251031-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.13.9", + "sha256": "6f05b91ee8c7e6dd0f9c60b95bb29130e2d623961de6578b643e80ddd83f96b6" + }, + "3.13/x86_64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.13.9+20251031-x86_64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.13.9", + "sha256": "4c5c9a251a45288ebd4a51900708eb2ada9197173ba56e5604b6b63727fb87ff" + }, + "3.13/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.13.9+20251031-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.13.9", + "sha256": "ad987197034185e628715da504a50613af213dc21ba6d5ccaeab3db2c464aa6c" + }, + "3.14/aarch64-apple-darwin/freethreaded": { + "filename": "cpython-3.14.0+20251031-aarch64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.14.0", + "sha256": "d9c7b430b25bd3837dbb03f945dbe6b7bc526c5940ca96f5db7cdc42f6b2b801" + }, + "3.14/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.14.0+20251031-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.14.0", + "sha256": "b4bcd3c6c24cab32ae99e1b05c89312b783b4d69431d702e5012fe1fdcad4087" + }, + "3.14/aarch64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.14.0+20251031-aarch64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.14.0", + "sha256": "40266e60f655e49cd1d5303295255909a4b593b08b88be6e6a55b2c9fe6ed13d" + }, + "3.14/aarch64-pc-windows-msvc/install_only": { + "filename": "cpython-3.14.0+20251031-aarch64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.14.0", + "sha256": "599a8b7e12439cd95a201dbdfe95cf363146b1ff91f379555dafd86b170caab9" + }, + "3.14/aarch64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.14.0+20251031-aarch64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.14.0", + "sha256": "f383ef50d1da6ca511212e5ae601923b56636b87351fd5fc847e0ea0a19fa9b3" + }, + "3.14/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.14.0+20251031-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.14.0", + "sha256": "128a9cbfb9645d5237ec01704d9d1d2ac5f084464cc43c37a4cd96aa9c3b1ad5" + }, + "3.14/aarch64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.14.0+20251031-aarch64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.14.0", + "sha256": "33c7aa105634102c61b8ad01c801dbaf1950e59c04a876b72004cf4fbcfc6e33" + }, + "3.14/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.14.0+20251031-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.14.0", + "sha256": "e850ffb10a13cf16fb6ee08989e53532b606e7e96045ee65f7a3f41a9de14010" + }, + "3.14/i686-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.14.0+20251031-i686-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.14.0", + "sha256": "c47e0e4fd3a2d334a9f3df1d40fd9a7a8f743572dbd798b68fe5a6361c399806" + }, + "3.14/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.14.0+20251031-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.14.0", + "sha256": "35703b8b813afd37036ec88973c0f5a7626ee0dd48544a1c69cddeee994b5274" + }, + "3.14/x86_64-apple-darwin/freethreaded": { + "filename": "cpython-3.14.0+20251031-x86_64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.14.0", + "sha256": "b3196f6b57bbb3dc2ee07f348f1d51117ffa376979eceafbf50c15f0f7980bf8" + }, + "3.14/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.14.0+20251031-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.14.0", + "sha256": "4e71a3ce973be377ef18637826648bb936e2f9490f64a9e4f33a49bcc431d344" + }, + "3.14/x86_64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.14.0+20251031-x86_64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.14.0", + "sha256": "b81de5fc9e783ea6dfcf1098c28a278c874999c71afbb0309f6a8b4276c769d0" + }, + "3.14/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.14.0+20251031-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.14.0", + "sha256": "39acfcb3857d83eab054a3de11756ffc16b3d49c31393b9800dd2704d1f07fdf" + }, + "3.14/x86_64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.14.0+20251031-x86_64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.14.0", + "sha256": "f4acbef0fbfaf7ab31ac63986da1d93dfa1c5cb797de1dcdc1a988aa18670120" + }, + "3.14/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.14.0+20251031-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.14.0", + "sha256": "3dec1ab70758a3467ac3313bbcdabf7a9b3016db5c072c4537e3cf0a9e6290f6" + }, + "3.14/x86_64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.14.0+20251031-x86_64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.14.0", + "sha256": "9e18302759734fb14694efb0418e7291c8d590d880abc2da1d7e6f14ac9a381d" + }, + "3.14/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.14.0+20251031-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.14.0", + "sha256": "d0a2a6d3b1bb00dce2105377fda8aa79675d187f8d6d7010a42f651af25018dc" + }, + "3.15/aarch64-apple-darwin/freethreaded": { + "filename": "cpython-3.15.0a1+20251031-aarch64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.15.0a1", + "sha256": "12f1b16be4017181ad67904caf9e59e525b9b5d62f49105017d837e27b832959" + }, + "3.15/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.15.0a1+20251031-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.15.0a1", + "sha256": "3acf7aa3559b746498b18929456c5cacb84bae4e09249834cbc818970d71de87" + }, + "3.15/aarch64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.15.0a1+20251031-aarch64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.15.0a1", + "sha256": "54ca78dae455ece6fefbd7f5f287cc55d5ce197caf51921f6d871d15069d9489" + }, + "3.15/aarch64-pc-windows-msvc/install_only": { + "filename": "cpython-3.15.0a1+20251031-aarch64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.15.0a1", + "sha256": "1508bcd7195008479ed156aad3afbb3a3793097ed530690f0304a8107f0e53e8" + }, + "3.15/aarch64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.15.0a1+20251031-aarch64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.15.0a1", + "sha256": "981fe8dfc6e7e1d0ffefa945a18d5c4c759bbe21722acf3a5cc7e62f16aa5f3c" + }, + "3.15/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.15.0a1+20251031-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.15.0a1", + "sha256": "d55c2aeece827e6bec83fd18515ee281d9ea0efaa3e2d20130db8f1c7cbb71c6" + }, + "3.15/aarch64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.15.0a1+20251031-aarch64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.15.0a1", + "sha256": "017cd58a8e6d93a8d60453899d4bac6f540414003ec9a73dc106c20045d542ee" + }, + "3.15/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.15.0a1+20251031-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.15.0a1", + "sha256": "abbd20235411d7cc24cba48ac519324b8bb71a52e05b26e7012de815e43d6e73" + }, + "3.15/i686-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.15.0a1+20251031-i686-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.15.0a1", + "sha256": "9f4bc934ef9c56e6d1d7263949430cecc19d301fa4cad74fcd36c9b3c6a7ba01" + }, + "3.15/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.15.0a1+20251031-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.15.0a1", + "sha256": "6ffdbe54c45d0a9c309498f65c5ddf3de587c84aee89a227836f42b4e7e25691" + }, + "3.15/x86_64-apple-darwin/freethreaded": { + "filename": "cpython-3.15.0a1+20251031-x86_64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.15.0a1", + "sha256": "64fc29e6c7a2f02a18645d968f1b3fc1d00d12a5ef3fcbb0d077fa8c62c08904" + }, + "3.15/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.15.0a1+20251031-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.15.0a1", + "sha256": "0ab19d3ac25f99da438b088751e5ec2421f9f6aa4292fd2dc0f8e49eb3e16bdf" + }, + "3.15/x86_64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.15.0a1+20251031-x86_64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.15.0a1", + "sha256": "34abc5603e1b4131f753d29b7deac865b9277912b851cbed5a149cf3e6745d3d" + }, + "3.15/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.15.0a1+20251031-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.15.0a1", + "sha256": "5f5d6bec2b381cfc771c49972d2a6f7b7e7ab6a1651d8fb6ef3983f3571722b3" + }, + "3.15/x86_64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.15.0a1+20251031-x86_64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.15.0a1", + "sha256": "0e0272186d9f5169394dbc4d4d72a3f4a5762a04c2e5ac2ab1e23aa41fc8538a" + }, + "3.15/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.15.0a1+20251031-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.15.0a1", + "sha256": "1f356288c2b2713619cb7a4e453d33bf8882f812af2987e21e01e7ae382fefba" + }, + "3.15/x86_64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.15.0a1+20251031-x86_64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.15.0a1", + "sha256": "621ac3b8b8afa1593d63fb130dadc6eec2bd9e3603d6c028efe60146e05ec430" + }, + "3.15/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.15.0a1+20251031-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.15.0a1", + "sha256": "caf5311f333eef082dd69a669ca65aceba09a08fc1e78aad602ad649106f294c" + }, + "3.9/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.9.25+20251031-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.9.25", + "sha256": "87275619c2706affa4d1090d2ca3dad354b6d69f8b85dbfafe38785870751b9a" + }, + "3.9/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.9.25+20251031-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.9.25", + "sha256": "6112d46355857680b81849764a6cf9f38cc4cd0d1cf29d432bc12fe5aeedf9d0" + }, + "3.9/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.9.25+20251031-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.9.25", + "sha256": "f4d8eb93c54cbf7dc37d5599748582d91c268c60008f17daf19c0ad183ec78ab" + }, + "3.9/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.9.25+20251031-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.9.25", + "sha256": "5056f28d59653a6bddcc8007f024af00147a7e6f82e797f073a59f16a5cacc19" + }, + "3.9/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.9.25+20251031-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.9.25", + "sha256": "ace63cfe27a9487c4d72e1cb518be01c1d985271da0b2158e813801f7d3e5503" + }, + "3.9/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.9.25+20251031-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.9.25", + "sha256": "4fb1b416482ce94d73cfa140317a670c596c830671d137b07c26afe8c461768a" + }, + "3.9/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.9.25+20251031-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.9.25", + "sha256": "42834f61eb6df43432c3dd6ab9ca3fdf8c06d10a404ebdb53d6902e6b9570b08" + }, + "3.9/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.9.25+20251031-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.9.25", + "sha256": "76593e8c889e81e82db5fe117fe15b69466f85100ab2ec0e4035aa86242b4e93" + } + }, + "release_index_v1_20260303_https://github.com/astral-sh/python-build-standalone/releases/download": { + "3.10/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.10.20+20260303-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.10.20", + "sha256": "b41060c26454b21990254fdc08a4988f4e325708d785f8a0b4b4533881cf5fd4" + }, + "3.10/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.10.20+20260303-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.10.20", + "sha256": "dcf3b9bd0062276866b4fc84c9e4c39be7ef161d22c769e5f4ee01c8e27100f4" + }, + "3.10/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.10.20+20260303-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.10.20", + "sha256": "92713c7f4a7bb77bf8593818e4c1da8db44d415f45b0b5b7a8eb741695c08303" + }, + "3.10/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.10.20+20260303-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.10.20", + "sha256": "9bc6cd476a2670a054dc8dbdd22c5b7c7642ac2f0ac810c5bb18aa39083a8a99" + }, + "3.10/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.10.20+20260303-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.10.20", + "sha256": "2fd25586216e5e6932d767034618b7bb97654c689f07513009d858398fe181f3" + }, + "3.10/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.10.20+20260303-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.10.20", + "sha256": "aa55177f1247cdac1ccdf0877cdf68e9d6718b0914e56f1083404b1dcbac847b" + }, + "3.10/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.10.20+20260303-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.10.20", + "sha256": "c830fc25bc6e318e7ad4961caadee6cc79c041c122884c90ecfad4fe02e20344" + }, + "3.10/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.10.20+20260303-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.10.20", + "sha256": "c781a93c1030c814bc0861dc424c476ca2e0083b429b968f557e1664f3ef223f" + }, + "3.11/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.11.15+20260303-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.11.15", + "sha256": "0d29ed7cb6711890b3c6da27b6258c4ad3b506bf8d5a381bff531ca8fa67417f" + }, + "3.11/aarch64-pc-windows-msvc/install_only": { + "filename": "cpython-3.11.15+20260303-aarch64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.11.15", + "sha256": "84afaa698da2bc12f05aa317ad1ad6bf6708461e737efd08ad7e95d9a8857c1b" + }, + "3.11/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.11.15+20260303-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.11.15", + "sha256": "4786f5ef8567c982517fcd7cb189a5ef4a712ed0aaf3034e839749794155ad4c" + }, + "3.11/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.11.15+20260303-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.11.15", + "sha256": "d37ebd873138f85603607a56bc821e07551f45e6938e02d36b04885a6eded7ff" + }, + "3.11/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.11.15+20260303-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.11.15", + "sha256": "1924013f72c36c8d19d6887979cded6ca7f2295667d591b88f74260f141e1fee" + }, + "3.11/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.11.15+20260303-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.11.15", + "sha256": "6ea2168c4e18cb31d9dc8486634dc375929bcc2adde0957399ce59d90b52297a" + }, + "3.11/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.11.15+20260303-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.11.15", + "sha256": "6f194e1ede02260fd3d758893bbf1d3bb4084652d436a8300a229da721c3ddf8" + }, + "3.11/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.11.15+20260303-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.11.15", + "sha256": "17e1f5b2c9668217ba554decd94db04adf3d085203d322c690fd44cde549d576" + }, + "3.11/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.11.15+20260303-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.11.15", + "sha256": "ee54c7baaa5a1fb65922505a646a2d097660b005e55bd35055d0a9c46a5ab916" + }, + "3.12/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.12.13+20260303-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.12.13", + "sha256": "2c01f29e9e4ddbd57e0319fedecf1f3e222558fce394a3ed4e39d0f750c11988" + }, + "3.12/aarch64-pc-windows-msvc/install_only": { + "filename": "cpython-3.12.13+20260303-aarch64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.12.13", + "sha256": "f003d15139e0baa39563388b7e29c44a6c4dda3987dbd7cec2050eca32450d4f" + }, + "3.12/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.12.13+20260303-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.12.13", + "sha256": "15c00b489fb89c7e3dc433800cd8b932ab3f8825870c1919fbe747f493edf81d" + }, + "3.12/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.12.13+20260303-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.12.13", + "sha256": "2e3e3fc934a597c5c0e95fe9093a89cd6d3e248f9d3f6a0e82dbfa923499bd9d" + }, + "3.12/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.12.13+20260303-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.12.13", + "sha256": "af220242f3d2bebff6b9a01666895bb7198d7e4be608752f7e4007dd0fddfa22" + }, + "3.12/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.12.13+20260303-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.12.13", + "sha256": "8ad52a15de26e67d53f5c14f338433c59d5a2711852adc59043a20ec8da71a52" + }, + "3.12/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.12.13+20260303-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.12.13", + "sha256": "43990976c8de6b72a7525cb509eedaf869a8dd116167e708af08bca50cd8ef00" + }, + "3.12/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.12.13+20260303-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.12.13", + "sha256": "4e5ac5a04afc4fe164e92e3844d6dbda03b33baeb62e032b5c9a8198280221e2" + }, + "3.12/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.12.13+20260303-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.12.13", + "sha256": "4099347cfb11427ceb6fe40d1b9f2af9fee3a3a8915df0e439e13dfbe948b91e" + }, + "3.13/aarch64-apple-darwin/freethreaded": { + "filename": "cpython-3.13.12+20260303-aarch64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.13.12", + "sha256": "d152a8ec3a31a7b49772e70ff7fed1e7f6ec721497151b104532957744703d86" + }, + "3.13/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.13.12+20260303-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.13.12", + "sha256": "267592285674e21982d84f2cd0b56e13e63ce60c3e85ffb0d67a842edaf5b5e9" + }, + "3.13/aarch64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.13.12+20260303-aarch64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.13.12", + "sha256": "33e4de818b5419f0b6c599ccfc98a0468c441f83e02d4e0ef18b4a632408dc57" + }, + "3.13/aarch64-pc-windows-msvc/install_only": { + "filename": "cpython-3.13.12+20260303-aarch64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.13.12", + "sha256": "4cb0d143eeaf51582fa8292d00061fc201e41bf3ce5e2de814d0b273f73d4c25" + }, + "3.13/aarch64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.13.12+20260303-aarch64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.13.12", + "sha256": "a2e320b8b7ec76f538f4414bb56927e0a35fb169a4748594b3b0946df0d8942b" + }, + "3.13/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.13.12+20260303-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.13.12", + "sha256": "3b88fc6dd6f0290f075353ca860b9dc48faca0d849a0a03c088883507ed63881" + }, + "3.13/aarch64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.13.12+20260303-aarch64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.13.12", + "sha256": "5c71151ce936e495b0dc49fe3bdd67a9ec332542e2fc250257cd76276481103c" + }, + "3.13/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.13.12+20260303-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.13.12", + "sha256": "c8f2e10261f327b3b9606c23c79788e1c909f0d703c4b06ebd59b318fa271c77" + }, + "3.13/i686-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.13.12+20260303-i686-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.13.12", + "sha256": "e27287866347dd2cc1dc766174bb67f6b459cbadfbeff74c981abe7fe6cf86ba" + }, + "3.13/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.13.12+20260303-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.13.12", + "sha256": "202a933d5435eced5e92f474fac9480a82959de2b3ea5555569de9bda6f4af4f" + }, + "3.13/x86_64-apple-darwin/freethreaded": { + "filename": "cpython-3.13.12+20260303-x86_64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.13.12", + "sha256": "d603daefc04db99a764942a835497e52beebeb8797f7ac828826969e6f8ea165" + }, + "3.13/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.13.12+20260303-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.13.12", + "sha256": "07833bcaf50c80065db8a21d7ae0459939d95e3cf399ce8f7df908ddfc4d275f" + }, + "3.13/x86_64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.13.12+20260303-x86_64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.13.12", + "sha256": "5703d1e5fcd43d0ac3bce24e65d03a5684f3fec3625794ca9a0a47ad2ecbd0a1" + }, + "3.13/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.13.12+20260303-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.13.12", + "sha256": "61d5f9750e6971cf3bc91a1c8e7ab2eed1c22a34067f0762917bfde12b121f9f" + }, + "3.13/x86_64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.13.12+20260303-x86_64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.13.12", + "sha256": "8f1a00de7342d161bfefcb6bb90f50076b0c49e1ac4d4faa7fb303015369f310" + }, + "3.13/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.13.12+20260303-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.13.12", + "sha256": "ee1d08c3e6149343077d410d7de835a7a7dda8e2cec80df94f393e858a300055" + }, + "3.13/x86_64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.13.12+20260303-x86_64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.13.12", + "sha256": "6bae3d9f3c03448efe7e72aaf7eba1c4af4531ee22964876b36c1569e5123159" + }, + "3.13/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.13.12+20260303-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.13.12", + "sha256": "36f73e0b72ac670bd56c927a078e3e2ef0b1fef1d89a792088766bf1236815b7" + }, + "3.14/aarch64-apple-darwin/freethreaded": { + "filename": "cpython-3.14.3+20260303-aarch64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.14.3", + "sha256": "cedbfdb352b7b0dbdfd2e4dba11244a64665402c44099f36af9e22dc269dd0c0" + }, + "3.14/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.14.3+20260303-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.14.3", + "sha256": "adce81b366416e8d1b95c9c5483607282ae43c98fc155677020d20076d333fec" + }, + "3.14/aarch64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.14.3+20260303-aarch64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.14.3", + "sha256": "5af1b60808d4e8df3838267086556e2518b24a71080a7c4dc0edf3ef6a5bd8c4" + }, + "3.14/aarch64-pc-windows-msvc/install_only": { + "filename": "cpython-3.14.3+20260303-aarch64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.14.3", + "sha256": "f64e500abf0ff11b320cba756114caae6ea733c62af1c9516d28d92cf4223d74" + }, + "3.14/aarch64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.14.3+20260303-aarch64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.14.3", + "sha256": "9ca5169b62fdedbbeb1e01429e5ed75d0c89efb0dffb3d5924c58f667f365863" + }, + "3.14/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.14.3+20260303-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.14.3", + "sha256": "80030e336255241a76cd05c874b70a8840fef24e344907a4ae89f0f6c3c7daf6" + }, + "3.14/aarch64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.14.3+20260303-aarch64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.14.3", + "sha256": "ff4076086f55f83746d680792f8346037060453cf078feba233ba28e4b2a3514" + }, + "3.14/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.14.3+20260303-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.14.3", + "sha256": "97b7e0182daf74f884456a4a24cf882d0296092c918939d25ed1e1f4edee0469" + }, + "3.14/i686-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.14.3+20260303-i686-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.14.3", + "sha256": "e3085abf12bdf84a91784915082eaffd4cac154acd9818aefc71a69e13bdaf24" + }, + "3.14/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.14.3+20260303-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.14.3", + "sha256": "d969b1807fe6a3ebe9c1468c55331859d329119951ab01dc6ec5b2853c217a66" + }, + "3.14/x86_64-apple-darwin/freethreaded": { + "filename": "cpython-3.14.3+20260303-x86_64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.14.3", + "sha256": "ff7ba9353fb4f6f923e5a0c30564e448cb678deb69ac58e7f4f3a78944b40806" + }, + "3.14/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.14.3+20260303-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.14.3", + "sha256": "29469be54c9e471b916f0375f83836811b4df29dc98e0b7452ae9ec483a500a0" + }, + "3.14/x86_64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.14.3+20260303-x86_64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.14.3", + "sha256": "7921cf0fa140f3714c4772b8af161ab463d0ad641ac35db0beff9d45273ab5f5" + }, + "3.14/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.14.3+20260303-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.14.3", + "sha256": "201d5c13ee115e029bf6caa6bb17af2bfb3e4a3baf14c7f31e9145e2aa6571ef" + }, + "3.14/x86_64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.14.3+20260303-x86_64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.14.3", + "sha256": "0629158c702d4ba732c722f24e5a775885e93915c7b04fe29cfb9c81e37f499f" + }, + "3.14/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.14.3+20260303-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.14.3", + "sha256": "8070ec22c0ea164b826a57102f1bf1fa0b360e143ab3378b3c5eb4178bc0c26b" + }, + "3.14/x86_64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.14.3+20260303-x86_64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.14.3", + "sha256": "dc478897cecef7b6dfcd089b8a425e959885883d123ba4ce3e3ec1fcf5f9637a" + }, + "3.14/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.14.3+20260303-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.14.3", + "sha256": "e72b682f652eb8ba71550a7aa4f267ddf3fe06b165a29acd4194dfff0b51ed4e" + }, + "3.15/aarch64-apple-darwin/freethreaded": { + "filename": "cpython-3.15.0a6+20260303-aarch64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.15.0a6", + "sha256": "c2c9679a505c94abb6e0dcbcb1a9ea2148fbcab5b443e9c8efac388e591233a8" + }, + "3.15/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.15.0a6+20260303-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.15.0a6", + "sha256": "7a6bb30a11361b58849ceeaf4d74f4085306f9b00de0c7f4703f9031cbb409ee" + }, + "3.15/aarch64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.15.0a6+20260303-aarch64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.15.0a6", + "sha256": "62890d115b54d2456a74db09d3026834faee19ba1be257c287025b0e8ae6ad16" + }, + "3.15/aarch64-pc-windows-msvc/install_only": { + "filename": "cpython-3.15.0a6+20260303-aarch64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.15.0a6", + "sha256": "aafd627b816dd83cb9ae670383482f3aa166e8f8910ca946278c5cc22f96bff6" + }, + "3.15/aarch64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.15.0a6+20260303-aarch64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.15.0a6", + "sha256": "93792d31d2232f6bf27e08fbfe6aec221aab1a4aa42463ac879540d399b54bc2" + }, + "3.15/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.15.0a6+20260303-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.15.0a6", + "sha256": "bc351efe2ef61f2d6fae1491b0d240f7616a7be28fcdad2d1644ce0429001ad6" + }, + "3.15/aarch64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.15.0a6+20260303-aarch64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.15.0a6", + "sha256": "497bbd7bc486a3092e003761f6a4fb9fd2c9854dea249042b330cb70d2ebf42a" + }, + "3.15/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.15.0a6+20260303-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.15.0a6", + "sha256": "55fabc3bfa81d6248db65da659c8f728fdfe8aa5dcd9551a5b1eaef09bc05cbd" + }, + "3.15/i686-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.15.0a6+20260303-i686-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.15.0a6", + "sha256": "4174719f384f3c6893c59e23ea88242c3ab9d84b7fffb9d1ed3a11e9d6a6a068" + }, + "3.15/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.15.0a6+20260303-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.15.0a6", + "sha256": "a49e43ea7971bb975e00f132bd45bc6834177997add3de7a07361a7449a10bda" + }, + "3.15/x86_64-apple-darwin/freethreaded": { + "filename": "cpython-3.15.0a6+20260303-x86_64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.15.0a6", + "sha256": "cf23826a427d19ea945965ba0e00a210b0cd96c3e7c2741ccf1174c18c37d5a6" + }, + "3.15/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.15.0a6+20260303-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.15.0a6", + "sha256": "3c25506d64f6b8e0c38bb66f8430332578a69343c1b27078b7f91d5919f2549a" + }, + "3.15/x86_64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.15.0a6+20260303-x86_64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.15.0a6", + "sha256": "8c3de05f4df81a3b482fd62daa14b7863df2b517a487b75661e37dfee845a4e6" + }, + "3.15/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.15.0a6+20260303-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.15.0a6", + "sha256": "42690076ba8f6311b737b884f56217cab7d7287f3374ab8c629fd446913534d6" + }, + "3.15/x86_64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.15.0a6+20260303-x86_64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.15.0a6", + "sha256": "9d95b1429958effe665c0dd7e2a9b8dfe1364b477637df87ddf372438adfa109" + }, + "3.15/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.15.0a6+20260303-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.15.0a6", + "sha256": "ac11f7e619c154e3d9b56186b461f52b4afc583a5524e7109686a7a9e1835b6d" + }, + "3.15/x86_64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.15.0a6+20260303-x86_64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.15.0a6", + "sha256": "2b5d35017190248ebbbf8b24432ec730e496dc68b911308a0cd4c21d8181d090" + }, + "3.15/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.15.0a6+20260303-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.15.0a6", + "sha256": "427675a1e0e79051540cce0f1b450ca0d11a8897486aba03796a8881cadf831f" + } + } + } + }, + "factsVersions": {} +} diff --git a/e2e/rules_python_layers/README.md b/e2e/rules_python_layers/README.md new file mode 100644 index 0000000..72bdda8 --- /dev/null +++ b/e2e/rules_python_layers/README.md @@ -0,0 +1,7 @@ +# rules_python layer checks + +Each package checks one behavior of the rules_python adapter: + +- `reuse`: two binaries receive the same wheel archives and sizes. +- `contents`: wheel archives contain importable code, and the source archive does not. +- `caller_tags`: generated targets keep the caller's tags. diff --git a/e2e/rules_python_layers/caller_tags/BUILD.bazel b/e2e/rules_python_layers/caller_tags/BUILD.bazel new file mode 100644 index 0000000..a44dae6 --- /dev/null +++ b/e2e/rules_python_layers/caller_tags/BUILD.bazel @@ -0,0 +1,43 @@ +load("@rules_layer_optimizer//python:rules_python.bzl", "py_image_layer") +load("@rules_python//python:py_binary.bzl", "py_binary") +load(":tags_test.bzl", "tags_test") + +py_binary( + name = "app", + srcs = ["app.py"], + legacy_create_init = False, + deps = ["@pip//colorama"], +) + +py_image_layer( + name = "app_layers", + binary = ":app", + strip_prefix = "caller_tags/app", +) + +py_image_layer( + name = "tagged_layers", + binary = ":app", + strip_prefix = "caller_tags/app", + tags = [ + "caller-tag", + "manual", + "no-remote-cache", + ], +) + +tags_test( + name = "default_tags_test", + expected = [], + prefix = "app_layers", +) + +tags_test( + name = "caller_tags_test", + expected = [ + "manual", + "no-remote-cache", + "caller-tag", + ], + prefix = "tagged_layers", +) diff --git a/e2e/rules_python_layers/caller_tags/app.py b/e2e/rules_python_layers/caller_tags/app.py new file mode 100644 index 0000000..79161b6 --- /dev/null +++ b/e2e/rules_python_layers/caller_tags/app.py @@ -0,0 +1 @@ +"""Binary used only to generate tagged layer targets.""" diff --git a/e2e/rules_python_layers/caller_tags/tags_test.bzl b/e2e/rules_python_layers/caller_tags/tags_test.bzl new file mode 100644 index 0000000..880fa2a --- /dev/null +++ b/e2e/rules_python_layers/caller_tags/tags_test.bzl @@ -0,0 +1,27 @@ +"""Check that image helpers preserve consumer tag policy.""" + +load("@bazel_skylib//lib:unittest.bzl", "asserts", "unittest") + +def _tags_test_impl(ctx): + env = unittest.begin(ctx) + asserts.true(env, bool(ctx.attr.observed)) + for name, tags in ctx.attr.observed.items(): + asserts.equals(env, ctx.attr.expected, tags, name) + return unittest.end(env) + +_tags_test = unittest.make(_tags_test_impl, attrs = { + "observed": attr.string_list_dict(), + "expected": attr.string_list(), +}) + +def tags_test(name, prefix, expected): + """Snapshot the generated targets' tags after invoking py_image_layer.""" + _tags_test( + name = name, + expected = sorted(expected), + observed = { + name: sorted(target.get("tags", [])) + for name, target in native.existing_rules().items() + if name.startswith(prefix) or name.startswith("_" + prefix) + }, + ) diff --git a/e2e/rules_python_layers/contents/BUILD.bazel b/e2e/rules_python_layers/contents/BUILD.bazel new file mode 100644 index 0000000..f28859e --- /dev/null +++ b/e2e/rules_python_layers/contents/BUILD.bazel @@ -0,0 +1,50 @@ +load("@rules_layer_optimizer//python:rules_python.bzl", "py_image_layer") +load("@rules_python//python:py_binary.bzl", "py_binary") +load(":archive_test.bzl", "archive_test") + +py_binary( + name = "app", + srcs = ["app.py"], + legacy_create_init = False, + deps = [ + "@pip//backports_strenum", + "@pip//backports_tarfile", + "@pip//colorama", + "@pip//google_crc32c", + ], +) + +py_image_layer( + name = "app_layers", + binary = ":app", + strip_prefix = "contents/app", +) + +archive_test( + name = "wheel_contents_test", + archive = ":app_layers_pip", + contains = [ + "colorama/__init__.py", + "colorama-0.4.6.dist-info/METADATA", + "colorama-0.4.6.dist-info/WHEEL", + "google_crc32c/_crc32c.cpython-312", + "google_crc32c.libs/libcrc32c-", + "backports/tarfile/__init__.py", + "backports/strenum/__init__.py", + ], +) + +archive_test( + name = "source_contents_test", + archive = ":app_layers_source", + contains = ["app.runfiles/_main/contents/app.py"], + excludes = [ + "colorama/__init__.py", + "/bin/python3.12", + "_crc32c.cpython-312", + "/libcrc32c-", + "backports/tarfile/__init__.py", + "backports/strenum/__init__.py", + "colorama-0.4.6.dist-info/METADATA", + ], +) diff --git a/e2e/rules_python_layers/contents/app.py b/e2e/rules_python_layers/contents/app.py new file mode 100644 index 0000000..4dd2ca4 --- /dev/null +++ b/e2e/rules_python_layers/contents/app.py @@ -0,0 +1 @@ +"""Binary whose runfiles are split into wheel and source archives.""" diff --git a/e2e/rules_python_layers/contents/archive_test.bzl b/e2e/rules_python_layers/contents/archive_test.bzl new file mode 100644 index 0000000..1c30302 --- /dev/null +++ b/e2e/rules_python_layers/contents/archive_test.bzl @@ -0,0 +1,20 @@ +"""Inspect real archives using the same declared tar toolchain as the library.""" + +load("@aspect_bazel_lib//lib:tar.bzl", "tar_lib") + +def _archive_test_impl(ctx): + toolchain = ctx.toolchains[tar_lib.toolchain_type] + tar = toolchain.tarinfo.binary + archives = ctx.attr.archive[DefaultInfo].files.to_list() + script = ctx.actions.declare_file(ctx.label.name + ".sh") + lines = ["#!/usr/bin/env bash", "set -euo pipefail", 'cd "$TEST_SRCDIR/$TEST_WORKSPACE"', ': > "$TEST_TMPDIR/entries"'] + for archive in archives: + lines.append('"{}" -tf "{}" >> "$TEST_TMPDIR/entries"'.format(tar.short_path, archive.short_path)) + for expected in ctx.attr.contains: + lines.append("grep -F -- '{}' \"$TEST_TMPDIR/entries\"".format(expected)) + for excluded in ctx.attr.excludes: + lines.append("if grep -F -- '{}' \"$TEST_TMPDIR/entries\"; then exit 1; fi".format(excluded)) + ctx.actions.write(script, "\n".join(lines) + "\n", is_executable = True) + return [DefaultInfo(executable = script, runfiles = ctx.runfiles(files = archives, transitive_files = toolchain.default.files))] + +archive_test = rule(implementation = _archive_test_impl, test = True, attrs = {"archive": attr.label(allow_files = True), "contains": attr.string_list(), "excludes": attr.string_list()}, toolchains = [tar_lib.toolchain_type]) diff --git a/e2e/rules_python_layers/pyproject.toml b/e2e/rules_python_layers/pyproject.toml new file mode 100644 index 0000000..229d7f9 --- /dev/null +++ b/e2e/rules_python_layers/pyproject.toml @@ -0,0 +1,5 @@ +[project] +name = "layer-optimizer-examples" +version = "0.0.0" +requires-python = ">=3.12,<3.13" +dependencies = ["colorama==0.4.6", "google-crc32c==1.7.1", "backports.tarfile==1.2.0", "backports.strenum==1.2.8"] diff --git a/e2e/rules_python_layers/requirements.txt b/e2e/rules_python_layers/requirements.txt new file mode 100644 index 0000000..592cf7b --- /dev/null +++ b/e2e/rules_python_layers/requirements.txt @@ -0,0 +1,22 @@ +# This file was autogenerated by uv via the following command: +# uv export --project examples --no-emit-project --format requirements-txt --output-file examples/requirements.txt +backports-strenum==1.2.8 \ + --hash=sha256:4dd47365fd427ac8028aeb1ad3628ea38e67c4d0336ceebd5c0f113e0c487ce9 \ + --hash=sha256:fc297cb26971f7d5e15a478a06a78575197f81daea47975771b1aae996dcccf4 + # via layer-optimizer-examples +backports-tarfile==1.2.0 \ + --hash=sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34 \ + --hash=sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991 + # via layer-optimizer-examples +colorama==0.4.6 \ + --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ + --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 + # via layer-optimizer-examples +google-crc32c==1.7.1 \ + --hash=sha256:19eafa0e4af11b0a4eb3974483d55d2d77ad1911e6cf6f832e1574f6781fd337 \ + --hash=sha256:22beacf83baaf59f9d3ab2bbb4db0fb018da8e5aebdce07ef9f09fce8220285e \ + --hash=sha256:2bff2305f98846f3e825dbeec9ee406f89da7962accdb29356e4eadc251bd472 \ + --hash=sha256:2d73a68a653c57281401871dd4aeebbb6af3191dcac751a76ce430df4d403194 \ + --hash=sha256:b6d86616faaea68101195c6bdc40c494e4d76f41e07a37ffdef270879c15fb65 \ + --hash=sha256:b7491bdc0c7564fcf48c0179d2048ab2f7c7ba36b84ccd3a3e1c3f7a72d3bba6 + # via layer-optimizer-examples diff --git a/e2e/rules_python_layers/reuse/BUILD.bazel b/e2e/rules_python_layers/reuse/BUILD.bazel new file mode 100644 index 0000000..3825f6b --- /dev/null +++ b/e2e/rules_python_layers/reuse/BUILD.bazel @@ -0,0 +1,43 @@ +load("@rules_layer_optimizer//python:rules_python.bzl", "pip_layer_reducer", "py_image_layer") +load("@rules_python//python:py_binary.bzl", "py_binary") +load(":sharing_test.bzl", "sharing_test") + +_DEPS = [ + "@pip//backports_strenum", + "@pip//backports_tarfile", + "@pip//colorama", + "@pip//google_crc32c", +] + +py_binary( + name = "app", + srcs = ["app.py"], + legacy_create_init = False, + deps = _DEPS, +) + +py_binary( + name = "other", + srcs = ["app.py"], + legacy_create_init = False, + main = "app.py", + deps = _DEPS, +) + +py_image_layer( + name = "app_layers", + binary = ":app", + strip_prefix = "reuse/app", +) + +pip_layer_reducer( + name = "other_layers", + deps = [":other"], +) + +sharing_test( + name = "sharing_test", + expected_count = 4, + other = ":other_layers", + target_under_test = ":app_layers_pip", +) diff --git a/e2e/rules_python_layers/reuse/app.py b/e2e/rules_python_layers/reuse/app.py new file mode 100644 index 0000000..b5b6998 --- /dev/null +++ b/e2e/rules_python_layers/reuse/app.py @@ -0,0 +1 @@ +"""Binary duplicated so two consumers can select the same wheels.""" diff --git a/e2e/rules_python_layers/reuse/sharing_test.bzl b/e2e/rules_python_layers/reuse/sharing_test.bzl new file mode 100644 index 0000000..4557c4b --- /dev/null +++ b/e2e/rules_python_layers/reuse/sharing_test.bzl @@ -0,0 +1,17 @@ +"""Check that two consumers reach exactly the same package artifact.""" + +load("@bazel_skylib//lib:unittest.bzl", "analysistest", "asserts") +load("@rules_layer_optimizer//layers:providers.bzl", "LayerTarsInfo", "SizeHintInfo") + +def _sharing_test_impl(ctx): + env = analysistest.begin(ctx) + first = analysistest.target_under_test(env) + second = ctx.attr.other + asserts.equals(env, ctx.attr.expected_count, len(first[LayerTarsInfo].tars)) + asserts.equals(env, first[LayerTarsInfo].tars, second[LayerTarsInfo].tars) + asserts.equals(env, first[SizeHintInfo].sizes, second[SizeHintInfo].sizes) + asserts.true(env, 25335 in first[SizeHintInfo].sizes.values()) + asserts.equals(env, ctx.attr.expected_count, len(first[SizeHintInfo].sizes)) + return analysistest.end(env) + +sharing_test = analysistest.make(_sharing_test_impl, attrs = {"other": attr.label(), "expected_count": attr.int(default = 1)}) diff --git a/e2e/rules_python_layers/uv.lock b/e2e/rules_python_layers/uv.lock new file mode 100644 index 0000000..173f2d9 --- /dev/null +++ b/e2e/rules_python_layers/uv.lock @@ -0,0 +1,62 @@ +version = 1 +revision = 3 +requires-python = "==3.12.*" + +[[package]] +name = "backports-strenum" +version = "1.2.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/f1/611f9ce7f5ede2e8156d3bc6cd2c62a7f2ff07d73b948925da84785cf331/backports_strenum-1.2.8.tar.gz", hash = "sha256:4dd47365fd427ac8028aeb1ad3628ea38e67c4d0336ceebd5c0f113e0c487ce9", size = 7110, upload-time = "2023-09-19T16:10:33.042Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/d0/a70b2e038cdab32ed2dbbf06d292d010fc208508bb187714306a87384c54/backports_strenum-1.2.8-py3-none-any.whl", hash = "sha256:fc297cb26971f7d5e15a478a06a78575197f81daea47975771b1aae996dcccf4", size = 7862, upload-time = "2023-09-19T16:10:31.827Z" }, +] + +[[package]] +name = "backports-tarfile" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/86/72/cd9b395f25e290e633655a100af28cb253e4393396264a98bd5f5951d50f/backports_tarfile-1.2.0.tar.gz", hash = "sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991", size = 86406, upload-time = "2024-05-28T17:01:54.731Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/fa/123043af240e49752f1c4bd24da5053b6bd00cad78c2be53c0d1e8b975bc/backports.tarfile-1.2.0-py3-none-any.whl", hash = "sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34", size = 30181, upload-time = "2024-05-28T17:01:53.112Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "google-crc32c" +version = "1.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/19/ae/87802e6d9f9d69adfaedfcfd599266bf386a54d0be058b532d04c794f76d/google_crc32c-1.7.1.tar.gz", hash = "sha256:2bff2305f98846f3e825dbeec9ee406f89da7962accdb29356e4eadc251bd472", size = 14495, upload-time = "2025-03-26T14:29:13.32Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dd/b7/787e2453cf8639c94b3d06c9d61f512234a82e1d12d13d18584bd3049904/google_crc32c-1.7.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2d73a68a653c57281401871dd4aeebbb6af3191dcac751a76ce430df4d403194", size = 30470, upload-time = "2025-03-26T14:34:31.655Z" }, + { url = "https://files.pythonhosted.org/packages/ed/b4/6042c2b0cbac3ec3a69bb4c49b28d2f517b7a0f4a0232603c42c58e22b44/google_crc32c-1.7.1-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:22beacf83baaf59f9d3ab2bbb4db0fb018da8e5aebdce07ef9f09fce8220285e", size = 30315, upload-time = "2025-03-26T15:01:54.634Z" }, + { url = "https://files.pythonhosted.org/packages/29/ad/01e7a61a5d059bc57b702d9ff6a18b2585ad97f720bd0a0dbe215df1ab0e/google_crc32c-1.7.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19eafa0e4af11b0a4eb3974483d55d2d77ad1911e6cf6f832e1574f6781fd337", size = 33180, upload-time = "2025-03-26T14:41:32.168Z" }, + { url = "https://files.pythonhosted.org/packages/3b/a5/7279055cf004561894ed3a7bfdf5bf90a53f28fadd01af7cd166e88ddf16/google_crc32c-1.7.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6d86616faaea68101195c6bdc40c494e4d76f41e07a37ffdef270879c15fb65", size = 32794, upload-time = "2025-03-26T14:41:33.264Z" }, + { url = "https://files.pythonhosted.org/packages/0f/d6/77060dbd140c624e42ae3ece3df53b9d811000729a5c821b9fd671ceaac6/google_crc32c-1.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:b7491bdc0c7564fcf48c0179d2048ab2f7c7ba36b84ccd3a3e1c3f7a72d3bba6", size = 33477, upload-time = "2025-03-26T14:29:10.94Z" }, +] + +[[package]] +name = "layer-optimizer-examples" +version = "0.0.0" +source = { virtual = "." } +dependencies = [ + { name = "backports-strenum" }, + { name = "backports-tarfile" }, + { name = "colorama" }, + { name = "google-crc32c" }, +] + +[package.metadata] +requires-dist = [ + { name = "backports-strenum", specifier = "==1.2.8" }, + { name = "backports-tarfile", specifier = "==1.2.0" }, + { name = "colorama", specifier = "==0.4.6" }, + { name = "google-crc32c", specifier = "==1.7.1" }, +] diff --git a/e2e/smoke/BUILD.bazel b/e2e/smoke/BUILD.bazel deleted file mode 100644 index 8de6188..0000000 --- a/e2e/smoke/BUILD.bazel +++ /dev/null @@ -1,99 +0,0 @@ -load("@aspect_bazel_lib//lib:write_source_files.bzl", "write_source_files") -load("@rules_layer_optimizer//apt:defs.bzl", "apt_inference", "inferred_apt_deps") -load("@rules_layer_optimizer//inference:defs.bzl", "env_file", "env_inference", "layer_inference_bundle") -load("@rules_layer_optimizer//layers:defs.bzl", "layer_group") -load("@rules_layer_optimizer//layers:distroless.bzl", "optimized_layers") -load("@rules_shell//shell:sh_test.bzl", "sh_test") -load(":contract_test.bzl", "apt_test", "conflict_test") - -filegroup(name = "trigger") - -filegroup( - name = "app", - srcs = [":trigger"], -) - -apt_inference( - name = "bash_runtime", - for_deps = [":trigger"], - packages = ["@debs//bash"], -) - -layer_inference_bundle( - name = "runtime", - inferences = [":bash_runtime"], -) - -inferred_apt_deps( - name = "apt_layers", - inferences = [":runtime"], - packages = ["@debs//bash"], - deps = [":app"], -) - -apt_test( - name = "apt_metadata_test", - target_under_test = ":apt_layers", -) - -optimized_layers( - name = "optimized", - compress = "gzip", - groups = [layer_group( - name = "apt", - overflow = "flatten", - targets = [":apt_layers"], - )], - layer_budget = 2, - size_bytes_threshold = 100, -) - -env_inference( - name = "matched_env", - env = { - "PATH": "/tools", - "MODE": "test", - }, - for_deps = [":trigger"], -) - -env_file( - name = "env", - base_env = {"PATH": "/bin"}, - extra_env = {"PATH": "/extra"}, - inferences = [":matched_env"], - runfiles_root = "/app.runfiles", - deps = [":app"], -) - -env_file( - name = "conflict", - base_env = {"MODE": "other"}, - inferences = [":matched_env"], - runfiles_root = "/app.runfiles", - tags = ["manual"], - deps = [":app"], -) - -conflict_test( - name = "env_conflict_test", - target_under_test = ":conflict", -) - -sh_test( - name = "smoke_test", - srcs = ["smoke_test.sh"], - args = [ - "$(rootpath :optimized)", - "$(rootpath :env)", - ], - data = [ - ":env", - ":optimized", - ], -) - -write_source_files( - name = "write_optimization_plan", - files = {"optimization_plan.json": ":optimized_optimization_plan"}, -) diff --git a/e2e/smoke/README.md b/e2e/smoke/README.md deleted file mode 100644 index c232674..0000000 --- a/e2e/smoke/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# External-consumer smoke tests - -Run `bazel test //...` here to test the library outside its root module with no -configured pip hub. Public entrypoints exercise graph matching, APT size-hint -propagation, duplicate package removal, environment merging and conflict errors, -and materialized archive contents. - -The `debs` repository is a small fixture with the public distroless `:data` -relationship. Its v2 lock supplies deterministic size metadata. This isolates -adapter and Bzlmod repository-mapping behavior; it is not a live APT resolver test. diff --git a/e2e/smoke/optimization_plan.json b/e2e/smoke/optimization_plan.json deleted file mode 100644 index f6e23a1..0000000 --- a/e2e/smoke/optimization_plan.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "groups": [ - { - "flattened_layer_count": 1, - "input_tar_count": 1, - "name": "apt", - "output_layer_count": 1, - "overflow": "flatten", - "separate_layer_count": 0 - } - ], - "layers": [ - { - "disposition": "flattened", - "group": "apt", - "inputs": [ - { - "path": "../+apt_fixture+debs/bash/data.tar.gz", - "reason": "below_size_threshold", - "size_hint_bytes": 42 - } - ], - "known_input_size_bytes": 42, - "unknown_input_count": 0 - } - ], - "policy": { - "flatten_all": false, - "layer_budget": 2, - "size_threshold_bytes": 100 - }, - "schema_version": 1, - "summary": { - "flattened_layer_count": 1, - "input_tar_count": 1, - "output_layer_count": 1, - "separate_layer_count": 0, - "size_eligible_input_count": 0, - "size_eligible_inputs_kept_separate": 0 - }, - "target": "@@//:optimized_all_tars" -} diff --git a/examples/BUILD.bazel b/examples/BUILD.bazel deleted file mode 100644 index dcd33ff..0000000 --- a/examples/BUILD.bazel +++ /dev/null @@ -1,30 +0,0 @@ -load("@rules_python//python:py_test.bzl", "py_test") - -filegroup( - name = "library_readme", - srcs = ["@rules_layer_optimizer//:README.md"], -) - -[ - py_test( - name = backend + "_backend_test", - srcs = ["backend_equivalence_test.py"], - args = [ - "$(rootpath //" + backend + ":image)", - "$(rootpath //" + backend + ":img_layout)", - ], - data = [ - "//" + backend + ":image", - "//" + backend + ":img_layout", - "//basic_layers:optimized", - "//basic_layers:optimized_optimization_plan", - "//basic_layers:optimized_packages_flat_tars", - "//python_image:partitioned_layers_source_first", - ], - main = "backend_equivalence_test.py", - ) - for backend in [ - "python_image", - "rules_python_image", - ] -] diff --git a/examples/README.md b/examples/README.md index dd76379..6d3dddd 100644 --- a/examples/README.md +++ b/examples/README.md @@ -1,49 +1,24 @@ # Examples -This separate Bazel module demonstrates the public entrypoints with complete -dependency and image configurations. -Run `bazel test //...` from this directory. +These are the user-facing image examples. Each one is a separate Bazel module +whose call site is only `name` and a `py_binary`. -- [basic_layers](basic_layers/BUILD.bazel): flatten real tars and inspect the - archive and optimization plan. -- [python_image](python_image/BUILD.bazel): create a Python OCI image with a - digest-pinned Ubuntu base, explicitly packaged interpreter, shared wheel, - source layer, and inferred environment. Source inspection tests build the - image without requiring Docker. Both rules_oci and rules_img consume the same - optimized tars. -- [rules_python_image](rules_python_image/BUILD.bazel): the same image matrix - using rules_python, with reusable wheels and automatic interpreter splitting. -- [shared_dependencies](shared_dependencies/BUILD.bazel): assert that two - consumers reach the identical wheel artifact and selected-wheel size, and - inspect the archive's package code and metadata. - -The example's `.bazelrc` selects the uv dependency group from `pyproject.toml`. -The interpreter and base image target Linux x86-64. - -To load and run the image locally when Docker is available: +- [py_image_with_rules_oci_and_aspect_rules_py](py_image_with_rules_oci_and_aspect_rules_py/app/BUILD.bazel) + uses rules_oci and aspect_rules_py. The [shared package](py_image_with_rules_oci_and_aspect_rules_py/shared/BUILD.bazel) + supplies base apt packages, the interpreter, and the inference bundles. +- [py_image_with_rules_img_and_rules_python](py_image_with_rules_img_and_rules_python/app/BUILD.bazel) + uses rules_img and rules_python. The [shared package](py_image_with_rules_img_and_rules_python/shared/BUILD.bazel) + supplies base apt packages and the inference bundles. ```sh -bazel run //python_image:load -docker run --rm --network none rules-layer-optimizer-example:local -bazel run //python_image:img_load -docker run --rm --network none rules-layer-optimizer-aspect-img:local -bazel run //rules_python_image:load -docker run --rm --network none rules-layer-optimizer-rules-python:local -bazel run //rules_python_image:img_load -docker run --rm --network none rules-layer-optimizer-rules-python-img:local +(cd py_image_with_rules_oci_and_aspect_rules_py && bazel test //...) +docker run --rm --network none rules-layer-optimizer-py-image:local +(cd py_image_with_rules_img_and_rules_python && bazel test //...) +docker run --rm --network none rules-layer-optimizer-py-image-rules-python:local ``` -This assembly is an example of caller-owned policy, not a supported `py_image` -API. It can be wrapped in a macro inside your own repository. - -The backend-equivalence tests compare ordered layer digests, filesystem diff IDs, -and inferred environment across backends. Runtime checks import package metadata, execute the native `google-crc32c` -extension (including its bundled shared library), and import both `backports.tarfile` -and `backports.strenum` from separately installed distributions sharing a namespace. See [the standalone consumer](../e2e/rules_python/README.md) for a -rules_python-only toolchain and requirements.txt setup. - -The [minimum-version module](../e2e/minimum/README.md) reuses these fixtures with -exact dependency pins. CI runs the same archive, analysis, backend-equivalence, -and Docker checks at both the supported minimums and current example versions. -The local `oci_load.bzl` helper uses the public rule API that spans the upstream -`oci_tarball` to `oci_load` macro rename. +[py_image.bzl](py_image_with_rules_oci_and_aspect_rules_py/shared/py_image.bzl) +and +[py_image.bzl](py_image_with_rules_img_and_rules_python/shared/py_image.bzl) are +caller-owned wrappers. The ruleset does not export a `py_image` rule. Focused +checks for individual behaviors live under [e2e](../e2e). diff --git a/examples/basic_layers/optimization_plan.json b/examples/basic_layers/optimization_plan.json deleted file mode 100644 index 464bf8f..0000000 --- a/examples/basic_layers/optimization_plan.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "groups": [ - { - "flattened_layer_count": 1, - "input_tar_count": 2, - "name": "packages", - "output_layer_count": 1, - "overflow": "flatten", - "separate_layer_count": 0 - } - ], - "layers": [ - { - "disposition": "flattened", - "group": "packages", - "inputs": [ - { - "path": "basic_layers/first.tar", - "reason": "missing_size_hint" - }, - { - "path": "basic_layers/second.tar", - "reason": "missing_size_hint" - } - ], - "known_input_size_bytes": 0, - "unknown_input_count": 2 - } - ], - "policy": { - "flatten_all": false, - "layer_budget": 2, - "size_threshold_bytes": 1024 - }, - "schema_version": 1, - "summary": { - "flattened_layer_count": 1, - "input_tar_count": 2, - "output_layer_count": 1, - "separate_layer_count": 0, - "size_eligible_input_count": 0, - "size_eligible_inputs_kept_separate": 0 - }, - "target": "@@//basic_layers:optimized_all_tars" -} diff --git a/examples/py_image_with_rules_img_and_rules_python/.bazelrc b/examples/py_image_with_rules_img_and_rules_python/.bazelrc new file mode 100644 index 0000000..9ab4685 --- /dev/null +++ b/examples/py_image_with_rules_img_and_rules_python/.bazelrc @@ -0,0 +1,4 @@ +import %workspace%/../../.bazelrc + +# Launch binaries with the in-build interpreter instead of a system Python. +build --@rules_python//python/config_settings:bootstrap_impl=script diff --git a/examples/py_image_with_rules_img_and_rules_python/.bazelversion b/examples/py_image_with_rules_img_and_rules_python/.bazelversion new file mode 100644 index 0000000..deeb3d6 --- /dev/null +++ b/examples/py_image_with_rules_img_and_rules_python/.bazelversion @@ -0,0 +1 @@ +9.2.0 diff --git a/examples/py_image_with_rules_img_and_rules_python/BUILD.bazel b/examples/py_image_with_rules_img_and_rules_python/BUILD.bazel new file mode 100644 index 0000000..959edaa --- /dev/null +++ b/examples/py_image_with_rules_img_and_rules_python/BUILD.bazel @@ -0,0 +1,5 @@ +exports_files([ + "pyproject.toml", + "requirements.txt", + "uv.lock", +]) diff --git a/examples/py_image_with_rules_img_and_rules_python/MODULE.bazel b/examples/py_image_with_rules_img_and_rules_python/MODULE.bazel new file mode 100644 index 0000000..6501754 --- /dev/null +++ b/examples/py_image_with_rules_img_and_rules_python/MODULE.bazel @@ -0,0 +1,74 @@ +module(name = "rules_layer_optimizer_py_image_rules_python") + +bazel_dep(name = "rules_layer_optimizer") +local_path_override( + module_name = "rules_layer_optimizer", + path = "../..", +) + +bazel_dep(name = "aspect_bazel_lib", version = "2.22.0") +bazel_dep(name = "rules_distroless", version = "0.9.4") +bazel_dep(name = "rules_img", version = "0.3.22") +bazel_dep(name = "rules_python", version = "1.9.0") + +python = use_extension("@rules_python//python/extensions:python.bzl", "python") +python.defaults(python_version = "3.12") +python.toolchain(python_version = "3.12") +use_repo(python, "python_3_12_x86_64-unknown-linux-gnu") + +apt = use_extension("@rules_distroless//apt:extensions.bzl", "apt") +apt.sources_list( + architectures = ["amd64"], + components = ["main"], + suites = ["noble"], + types = ["deb"], + uris = ["https://snapshot.ubuntu.com/ubuntu/20240601T000000Z"], +) +apt.install( + dependency_set = "noble", + packages = [ + "base-files", + "bash", + "ca-certificates", + "coreutils", + "gawk", + "grep", + "libssl3t64", + "libstdc++6", + "netbase", + "openssl", + "sed", + "tzdata", + ], + suites = ["noble"], +) +apt.lock(into = "//shared:apt.lock.json") +use_repo(apt, "noble") + +pip = use_extension("@rules_python//python/extensions:pip.bzl", "pip") +pip.parse( + enable_implicit_namespace_pkgs = True, + hub_name = "pip", + python_version = "3.12", + requirements_lock = "//:requirements.txt", +) +use_repo(pip, "pip") + +inference = use_extension("@rules_layer_optimizer//inference:extensions.bzl", "oci_image_inference") +inference.configure( + dependency_attributes = [ + "deps", + "src", + "srcs", + "actual", + "venv", + ], + pip_hub = "@pip//:requirements.bzl", +) +inference.pip_size_hint(lock = "//:uv.lock") +inference.apt_size_hint( + dependency_set = "noble", + lock = "//shared:apt.lock.json", + repository = "@noble//:dpkg_status", +) +use_repo(inference, "oci_image_inference_config") diff --git a/examples/py_image_with_rules_img_and_rules_python/MODULE.bazel.lock b/examples/py_image_with_rules_img_and_rules_python/MODULE.bazel.lock new file mode 100644 index 0000000..b384969 --- /dev/null +++ b/examples/py_image_with_rules_img_and_rules_python/MODULE.bazel.lock @@ -0,0 +1,2375 @@ +{ + "lockFileVersion": 28, + "registryFileHashes": { + "https://bcr.bazel.build/bazel_registry.json": "8a28e4aff06ee60aed2a8c281907fb8bcbf3b753c91fb5a5c57da3215d5b3497", + "https://bcr.bazel.build/modules/abseil-cpp/20210324.2/MODULE.bazel": "7cd0312e064fde87c8d1cd79ba06c876bd23630c83466e9500321be55c96ace2", + "https://bcr.bazel.build/modules/abseil-cpp/20211102.0/MODULE.bazel": "70390338f7a5106231d20620712f7cccb659cd0e9d073d1991c038eb9fc57589", + "https://bcr.bazel.build/modules/abseil-cpp/20230125.1/MODULE.bazel": "89047429cb0207707b2dface14ba7f8df85273d484c2572755be4bab7ce9c3a0", + "https://bcr.bazel.build/modules/abseil-cpp/20230802.0.bcr.1/MODULE.bazel": "1c8cec495288dccd14fdae6e3f95f772c1c91857047a098fad772034264cc8cb", + "https://bcr.bazel.build/modules/abseil-cpp/20230802.0/MODULE.bazel": "d253ae36a8bd9ee3c5955384096ccb6baf16a1b1e93e858370da0a3b94f77c16", + "https://bcr.bazel.build/modules/abseil-cpp/20230802.1/MODULE.bazel": "fa92e2eb41a04df73cdabeec37107316f7e5272650f81d6cc096418fe647b915", + "https://bcr.bazel.build/modules/abseil-cpp/20240116.1/MODULE.bazel": "37bcdb4440fbb61df6a1c296ae01b327f19e9bb521f9b8e26ec854b6f97309ed", + "https://bcr.bazel.build/modules/abseil-cpp/20240116.2/MODULE.bazel": "73939767a4686cd9a520d16af5ab440071ed75cec1a876bf2fcfaf1f71987a16", + "https://bcr.bazel.build/modules/abseil-cpp/20250127.1/MODULE.bazel": "c4a89e7ceb9bf1e25cf84a9f830ff6b817b72874088bf5141b314726e46a57c1", + "https://bcr.bazel.build/modules/abseil-cpp/20250512.1/MODULE.bazel": "d209fdb6f36ffaf61c509fcc81b19e81b411a999a934a032e10cd009a0226215", + "https://bcr.bazel.build/modules/abseil-cpp/20250814.1/MODULE.bazel": "51f2312901470cdab0dbdf3b88c40cd21c62a7ed58a3de45b365ddc5b11bcab2", + "https://bcr.bazel.build/modules/abseil-cpp/20250814.1/source.json": "cea3901d7e299da7320700abbaafe57a65d039f10d0d7ea601c4a66938ea4b0c", + "https://bcr.bazel.build/modules/apple_support/1.11.1/MODULE.bazel": "1843d7cd8a58369a444fc6000e7304425fba600ff641592161d9f15b179fb896", + "https://bcr.bazel.build/modules/apple_support/1.15.1/MODULE.bazel": "a0556fefca0b1bb2de8567b8827518f94db6a6e7e7d632b4c48dc5f865bc7c85", + "https://bcr.bazel.build/modules/apple_support/1.21.0/MODULE.bazel": "ac1824ed5edf17dee2fdd4927ada30c9f8c3b520be1b5fd02a5da15bc10bff3e", + "https://bcr.bazel.build/modules/apple_support/1.21.1/MODULE.bazel": "5809fa3efab15d1f3c3c635af6974044bac8a4919c62238cce06acee8a8c11f1", + "https://bcr.bazel.build/modules/apple_support/1.24.2/MODULE.bazel": "0e62471818affb9f0b26f128831d5c40b074d32e6dda5a0d3852847215a41ca4", + "https://bcr.bazel.build/modules/apple_support/1.24.2/source.json": "2c22c9827093250406c5568da6c54e6fdf0ef06238def3d99c71b12feb057a8d", + "https://bcr.bazel.build/modules/aspect_bazel_lib/2.14.0/MODULE.bazel": "2b31ffcc9bdc8295b2167e07a757dbbc9ac8906e7028e5170a3708cecaac119f", + "https://bcr.bazel.build/modules/aspect_bazel_lib/2.19.3/MODULE.bazel": "253d739ba126f62a5767d832765b12b59e9f8d2bc88cc1572f4a73e46eb298ca", + "https://bcr.bazel.build/modules/aspect_bazel_lib/2.22.0/MODULE.bazel": "7fe0191f047d4fe4a4a46c1107e2350cbb58a8fc2e10913aa4322d3190dec0bf", + "https://bcr.bazel.build/modules/aspect_bazel_lib/2.22.0/source.json": "369df5b7f2eae82f200fff95cf1425f90dee90a0d0948122060b48150ff0e224", + "https://bcr.bazel.build/modules/aspect_bazel_lib/2.8.1/MODULE.bazel": "812d2dd42f65dca362152101fbec418029cc8fd34cbad1a2fde905383d705838", + "https://bcr.bazel.build/modules/aspect_rules_py/2.0.0-alpha.4/MODULE.bazel": "4d9f393a947c01809556659cc4b07b76b25d98f25a8062280e506b5c296b89cf", + "https://bcr.bazel.build/modules/aspect_rules_py/2.0.0-alpha.4/source.json": "fcf828898c74224aff425d991755e5bc6346e9ff4da74e0b286f9bc19c5424c4", + "https://bcr.bazel.build/modules/aspect_tools_telemetry/0.3.3/MODULE.bazel": "37c764292861c2f70314efa9846bb6dbb44fc0308903b3285da6528305450183", + "https://bcr.bazel.build/modules/aspect_tools_telemetry/0.3.3/source.json": "605086bbc197743a0d360f7ddc550a1d4dfa0441bc807236e17170f636153348", + "https://bcr.bazel.build/modules/bazel_features/1.1.1/MODULE.bazel": "27b8c79ef57efe08efccbd9dd6ef70d61b4798320b8d3c134fd571f78963dbcd", + "https://bcr.bazel.build/modules/bazel_features/1.10.0/MODULE.bazel": "f75e8807570484a99be90abcd52b5e1f390362c258bcb73106f4544957a48101", + "https://bcr.bazel.build/modules/bazel_features/1.11.0/MODULE.bazel": "f9382337dd5a474c3b7d334c2f83e50b6eaedc284253334cf823044a26de03e8", + "https://bcr.bazel.build/modules/bazel_features/1.15.0/MODULE.bazel": "d38ff6e517149dc509406aca0db3ad1efdd890a85e049585b7234d04238e2a4d", + "https://bcr.bazel.build/modules/bazel_features/1.17.0/MODULE.bazel": "039de32d21b816b47bd42c778e0454217e9c9caac4a3cf8e15c7231ee3ddee4d", + "https://bcr.bazel.build/modules/bazel_features/1.18.0/MODULE.bazel": "1be0ae2557ab3a72a57aeb31b29be347bcdc5d2b1eb1e70f39e3851a7e97041a", + "https://bcr.bazel.build/modules/bazel_features/1.19.0/MODULE.bazel": "59adcdf28230d220f0067b1f435b8537dd033bfff8db21335ef9217919c7fb58", + "https://bcr.bazel.build/modules/bazel_features/1.20.0/MODULE.bazel": "8b85300b9c8594752e0721a37210e34879d23adc219ed9dc8f4104a4a1750920", + "https://bcr.bazel.build/modules/bazel_features/1.21.0/MODULE.bazel": "675642261665d8eea09989aa3b8afb5c37627f1be178382c320d1b46afba5e3b", + "https://bcr.bazel.build/modules/bazel_features/1.23.0/MODULE.bazel": "fd1ac84bc4e97a5a0816b7fd7d4d4f6d837b0047cf4cbd81652d616af3a6591a", + "https://bcr.bazel.build/modules/bazel_features/1.24.0/MODULE.bazel": "4796b4c25b47053e9bbffa792b3792d07e228ff66cd0405faef56a978708acd4", + "https://bcr.bazel.build/modules/bazel_features/1.27.0/MODULE.bazel": "621eeee06c4458a9121d1f104efb80f39d34deff4984e778359c60eaf1a8cb65", + "https://bcr.bazel.build/modules/bazel_features/1.28.0/MODULE.bazel": "4b4200e6cbf8fa335b2c3f43e1d6ef3e240319c33d43d60cc0fbd4b87ece299d", + "https://bcr.bazel.build/modules/bazel_features/1.3.0/MODULE.bazel": "cdcafe83ec318cda34e02948e81d790aab8df7a929cec6f6969f13a489ccecd9", + "https://bcr.bazel.build/modules/bazel_features/1.30.0/MODULE.bazel": "a14b62d05969a293b80257e72e597c2da7f717e1e69fa8b339703ed6731bec87", + "https://bcr.bazel.build/modules/bazel_features/1.33.0/MODULE.bazel": "8b8dc9d2a4c88609409c3191165bccec0e4cb044cd7a72ccbe826583303459f6", + "https://bcr.bazel.build/modules/bazel_features/1.34.0/MODULE.bazel": "e8475ad7c8965542e0c7aac8af68eb48c4af904be3d614b6aa6274c092c2ea1e", + "https://bcr.bazel.build/modules/bazel_features/1.38.0/MODULE.bazel": "f9b8a9c890ebd216b4049fd12a31d3c2602e3403c7af636b04fbbd7453edc9c9", + "https://bcr.bazel.build/modules/bazel_features/1.4.1/MODULE.bazel": "e45b6bb2350aff3e442ae1111c555e27eac1d915e77775f6fdc4b351b758b5d7", + "https://bcr.bazel.build/modules/bazel_features/1.42.1/MODULE.bazel": "275a59b5406ff18c01739860aa70ad7ccb3cfb474579411decca11c93b951080", + "https://bcr.bazel.build/modules/bazel_features/1.43.0/MODULE.bazel": "defa2226f06ba20550d6548c3a2ea2a7929634437a52973869c20c225450eb91", + "https://bcr.bazel.build/modules/bazel_features/1.47.0/MODULE.bazel": "e34df3cb35b1684cfa69923a61ae3803595babd3942cd306a488d51400886b30", + "https://bcr.bazel.build/modules/bazel_features/1.47.0/source.json": "4ba0b5138327f2d73352a51547a4e49a0a828ef400e046b15334d8905bf6b7ff", + "https://bcr.bazel.build/modules/bazel_features/1.9.0/MODULE.bazel": "885151d58d90d8d9c811eb75e3288c11f850e1d6b481a8c9f766adee4712358b", + "https://bcr.bazel.build/modules/bazel_features/1.9.1/MODULE.bazel": "8f679097876a9b609ad1f60249c49d68bfab783dd9be012faf9d82547b14815a", + "https://bcr.bazel.build/modules/bazel_lib/3.0.0-beta.1/MODULE.bazel": "407729e232f611c3270005b016b437005daa7b1505826798ea584169a476e878", + "https://bcr.bazel.build/modules/bazel_lib/3.0.0-rc.0/MODULE.bazel": "d6e00979a98ac14ada5e31c8794708b41434d461e7e7ca39b59b765e6d233b18", + "https://bcr.bazel.build/modules/bazel_lib/3.0.0/MODULE.bazel": "22b70b80ac89ad3f3772526cd9feee2fa412c2b01933fea7ed13238a448d370d", + "https://bcr.bazel.build/modules/bazel_lib/3.0.0/source.json": "895f21909c6fba01d7c17914bb6c8e135982275a1b18cdaa4e62272217ef1751", + "https://bcr.bazel.build/modules/bazel_skylib/1.0.3/MODULE.bazel": "bcb0fd896384802d1ad283b4e4eb4d718eebd8cb820b0a2c3a347fb971afd9d8", + "https://bcr.bazel.build/modules/bazel_skylib/1.1.1/MODULE.bazel": "1add3e7d93ff2e6998f9e118022c84d163917d912f5afafb3058e3d2f1545b5e", + "https://bcr.bazel.build/modules/bazel_skylib/1.2.0/MODULE.bazel": "44fe84260e454ed94ad326352a698422dbe372b21a1ac9f3eab76eb531223686", + "https://bcr.bazel.build/modules/bazel_skylib/1.2.1/MODULE.bazel": "f35baf9da0efe45fa3da1696ae906eea3d615ad41e2e3def4aeb4e8bc0ef9a7a", + "https://bcr.bazel.build/modules/bazel_skylib/1.3.0/MODULE.bazel": "20228b92868bf5cfc41bda7afc8a8ba2a543201851de39d990ec957b513579c5", + "https://bcr.bazel.build/modules/bazel_skylib/1.4.1/MODULE.bazel": "a0dcb779424be33100dcae821e9e27e4f2901d9dfd5333efe5ac6a8d7ab75e1d", + "https://bcr.bazel.build/modules/bazel_skylib/1.4.2/MODULE.bazel": "3bd40978e7a1fac911d5989e6b09d8f64921865a45822d8b09e815eaa726a651", + "https://bcr.bazel.build/modules/bazel_skylib/1.5.0/MODULE.bazel": "32880f5e2945ce6a03d1fbd588e9198c0a959bb42297b2cfaf1685b7bc32e138", + "https://bcr.bazel.build/modules/bazel_skylib/1.6.1/MODULE.bazel": "8fdee2dbaace6c252131c00e1de4b165dc65af02ea278476187765e1a617b917", + "https://bcr.bazel.build/modules/bazel_skylib/1.7.0/MODULE.bazel": "0db596f4563de7938de764cc8deeabec291f55e8ec15299718b93c4423e9796d", + "https://bcr.bazel.build/modules/bazel_skylib/1.7.1/MODULE.bazel": "3120d80c5861aa616222ec015332e5f8d3171e062e3e804a2a0253e1be26e59b", + "https://bcr.bazel.build/modules/bazel_skylib/1.8.0/MODULE.bazel": "2fb3fb53675f6adfc1ca5bfbd5cfb655ae350fba4706d924a8ec7e3ba945671c", + "https://bcr.bazel.build/modules/bazel_skylib/1.8.1/MODULE.bazel": "88ade7293becda963e0e3ea33e7d54d3425127e0a326e0d17da085a5f1f03ff6", + "https://bcr.bazel.build/modules/bazel_skylib/1.8.2/MODULE.bazel": "69ad6927098316848b34a9142bcc975e018ba27f08c4ff403f50c1b6e646ca67", + "https://bcr.bazel.build/modules/bazel_skylib/1.9.0/MODULE.bazel": "72997b29dfd95c3fa0d0c48322d05590418edef451f8db8db5509c57875fb4b7", + "https://bcr.bazel.build/modules/bazel_skylib/1.9.0/source.json": "7ad77c1e8c1b84222d9b3f3cae016a76639435744c19330b0b37c0a3c9da7dc0", + "https://bcr.bazel.build/modules/buildozer/8.5.1/MODULE.bazel": "a35d9561b3fc5b18797c330793e99e3b834a473d5fbd3d7d7634aafc9bdb6f8f", + "https://bcr.bazel.build/modules/buildozer/8.5.1/source.json": "e3386e6ff4529f2442800dee47ad28d3e6487f36a1f75ae39ae56c70f0cd2fbd", + "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.1/MODULE.bazel": "cdf8cbe5ee750db04b78878c9633cc76e80dcf4416cbe982ac3a9222f80713c8", + "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.3/MODULE.bazel": "f1b7bb2dd53e8f2ef984b39485ec8a44e9076dda5c4b8efd2fb4c6a6e856a31d", + "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.7/MODULE.bazel": "1e5e03c383fa64ebbe0942a225c32168fd6ef6b270351bbec481d47d19d1b96d", + "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.7/source.json": "34a83d58ae2f1ef6731d1fc8a1b6f07825741aff3f5993b67b67ec21d2c2946e", + "https://bcr.bazel.build/modules/google_benchmark/1.8.2/MODULE.bazel": "a70cf1bba851000ba93b58ae2f6d76490a9feb74192e57ab8e8ff13c34ec50cb", + "https://bcr.bazel.build/modules/googletest/1.11.0/MODULE.bazel": "3a83f095183f66345ca86aa13c58b59f9f94a2f81999c093d4eeaa2d262d12f4", + "https://bcr.bazel.build/modules/googletest/1.14.0.bcr.1/MODULE.bazel": "22c31a561553727960057361aa33bf20fb2e98584bc4fec007906e27053f80c6", + "https://bcr.bazel.build/modules/googletest/1.14.0/MODULE.bazel": "cfbcbf3e6eac06ef9d85900f64424708cc08687d1b527f0ef65aa7517af8118f", + "https://bcr.bazel.build/modules/googletest/1.15.2/MODULE.bazel": "6de1edc1d26cafb0ea1a6ab3f4d4192d91a312fd2d360b63adaa213cd00b2108", + "https://bcr.bazel.build/modules/googletest/1.17.0/MODULE.bazel": "dbec758171594a705933a29fcf69293d2468c49ec1f2ebca65c36f504d72df46", + "https://bcr.bazel.build/modules/googletest/1.17.0/source.json": "38e4454b25fc30f15439c0378e57909ab1fd0a443158aa35aec685da727cd713", + "https://bcr.bazel.build/modules/hermetic_launcher/0.0.10/MODULE.bazel": "d4203a9442a3fbee02d2188b584a84a4af015f1810b2502e3bb45b758625981b", + "https://bcr.bazel.build/modules/hermetic_launcher/0.0.11/MODULE.bazel": "aba15d5a4745cedcb4750faf0c49f946d004ccb09475b6ade1dea4efe0399d82", + "https://bcr.bazel.build/modules/hermetic_launcher/0.0.11/source.json": "0c4d45a10e956dc30c7278de756c81d4b55612218b1a20fa55fc2988063ba4eb", + "https://bcr.bazel.build/modules/jq.bzl/0.1.0/MODULE.bazel": "2ce69b1af49952cd4121a9c3055faa679e748ce774c7f1fda9657f936cae902f", + "https://bcr.bazel.build/modules/jq.bzl/0.1.0/source.json": "746bf13cac0860f091df5e4911d0c593971cd8796b5ad4e809b2f8e133eee3d5", + "https://bcr.bazel.build/modules/jsoncpp/1.9.5/MODULE.bazel": "31271aedc59e815656f5736f282bb7509a97c7ecb43e927ac1a37966e0578075", + "https://bcr.bazel.build/modules/jsoncpp/1.9.6/MODULE.bazel": "2f8d20d3b7d54143213c4dfc3d98225c42de7d666011528dc8fe91591e2e17b0", + "https://bcr.bazel.build/modules/jsoncpp/1.9.6/source.json": "a04756d367a2126c3541682864ecec52f92cdee80a35735a3cb249ce015ca000", + "https://bcr.bazel.build/modules/libpfm/4.11.0/MODULE.bazel": "45061ff025b301940f1e30d2c16bea596c25b176c8b6b3087e92615adbd52902", + "https://bcr.bazel.build/modules/nlohmann_json/3.6.1/MODULE.bazel": "6f7b417dcc794d9add9e556673ad25cb3ba835224290f4f848f8e2db1e1fca74", + "https://bcr.bazel.build/modules/nlohmann_json/3.6.1/source.json": "f448c6e8963fdfa7eb831457df83ad63d3d6355018f6574fb017e8169deb43a9", + "https://bcr.bazel.build/modules/package_metadata/0.0.10/MODULE.bazel": "cb66e0ce830e01bc00cd9edc984963704f2759ca893a649996e2b1c5c1ea7271", + "https://bcr.bazel.build/modules/package_metadata/0.0.10/source.json": "8fc6bece244828a69b3cc608f381118d67fa3cc2aa1a2851dfe8d99a8076d7d0", + "https://bcr.bazel.build/modules/package_metadata/0.0.2/MODULE.bazel": "fb8d25550742674d63d7b250063d4580ca530499f045d70748b1b142081ebb92", + "https://bcr.bazel.build/modules/package_metadata/0.0.3/MODULE.bazel": "77890552ecea9e284b5424c9de827a58099348763a4359e975c359a83d4faa83", + "https://bcr.bazel.build/modules/platforms/0.0.10/MODULE.bazel": "8cb8efaf200bdeb2150d93e162c40f388529a25852b332cec879373771e48ed5", + "https://bcr.bazel.build/modules/platforms/0.0.11/MODULE.bazel": "0daefc49732e227caa8bfa834d65dc52e8cc18a2faf80df25e8caea151a9413f", + "https://bcr.bazel.build/modules/platforms/0.0.4/MODULE.bazel": "9b328e31ee156f53f3c416a64f8491f7eb731742655a47c9eec4703a71644aee", + "https://bcr.bazel.build/modules/platforms/0.0.5/MODULE.bazel": "5733b54ea419d5eaf7997054bb55f6a1d0b5ff8aedf0176fef9eea44f3acda37", + "https://bcr.bazel.build/modules/platforms/0.0.6/MODULE.bazel": "ad6eeef431dc52aefd2d77ed20a4b353f8ebf0f4ecdd26a807d2da5aa8cd0615", + "https://bcr.bazel.build/modules/platforms/0.0.7/MODULE.bazel": "72fd4a0ede9ee5c021f6a8dd92b503e089f46c227ba2813ff183b71616034814", + "https://bcr.bazel.build/modules/platforms/0.0.8/MODULE.bazel": "9f142c03e348f6d263719f5074b21ef3adf0b139ee4c5133e2aa35664da9eb2d", + "https://bcr.bazel.build/modules/platforms/0.0.9/MODULE.bazel": "4a87a60c927b56ddd67db50c89acaa62f4ce2a1d2149ccb63ffd871d5ce29ebc", + "https://bcr.bazel.build/modules/platforms/1.0.0/MODULE.bazel": "f05feb42b48f1b3c225e4ccf351f367be0371411a803198ec34a389fb22aa580", + "https://bcr.bazel.build/modules/platforms/1.1.0/MODULE.bazel": "1c0c09f5bdcf4b3f924720d2478a3711cb39f4977019ca5988685e5b7e18b3d2", + "https://bcr.bazel.build/modules/platforms/1.1.0/source.json": "fcf351c47596c939140ab0d333dfdd08ed1ea6ce33c2fe70c12493a301cf1344", + "https://bcr.bazel.build/modules/protobuf/21.7/MODULE.bazel": "a5a29bb89544f9b97edce05642fac225a808b5b7be74038ea3640fae2f8e66a7", + "https://bcr.bazel.build/modules/protobuf/27.0/MODULE.bazel": "7873b60be88844a0a1d8f80b9d5d20cfbd8495a689b8763e76c6372998d3f64c", + "https://bcr.bazel.build/modules/protobuf/27.1/MODULE.bazel": "703a7b614728bb06647f965264967a8ef1c39e09e8f167b3ca0bb1fd80449c0d", + "https://bcr.bazel.build/modules/protobuf/29.0-rc2/MODULE.bazel": "6241d35983510143049943fc0d57937937122baf1b287862f9dc8590fc4c37df", + "https://bcr.bazel.build/modules/protobuf/29.0-rc3/MODULE.bazel": "33c2dfa286578573afc55a7acaea3cada4122b9631007c594bf0729f41c8de92", + "https://bcr.bazel.build/modules/protobuf/29.1/MODULE.bazel": "557c3457560ff49e122ed76c0bc3397a64af9574691cb8201b4e46d4ab2ecb95", + "https://bcr.bazel.build/modules/protobuf/3.19.0/MODULE.bazel": "6b5fbb433f760a99a22b18b6850ed5784ef0e9928a72668b66e4d7ccd47db9b0", + "https://bcr.bazel.build/modules/protobuf/32.1/MODULE.bazel": "89cd2866a9cb07fee9ff74c41ceace11554f32e0d849de4e23ac55515cfada4d", + "https://bcr.bazel.build/modules/protobuf/33.4/MODULE.bazel": "114775b816b38b6d0ca620450d6b02550c60ceedfdc8d9a229833b34a223dc42", + "https://bcr.bazel.build/modules/protobuf/33.4/source.json": "555f8686b4c7d6b5ba731fbea13bf656b4bfd9a7ff629c1d9d3f6e1d6155de79", + "https://bcr.bazel.build/modules/pybind11_bazel/2.11.1/MODULE.bazel": "88af1c246226d87e65be78ed49ecd1e6f5e98648558c14ce99176da041dc378e", + "https://bcr.bazel.build/modules/pybind11_bazel/2.12.0/MODULE.bazel": "e6f4c20442eaa7c90d7190d8dc539d0ab422f95c65a57cc59562170c58ae3d34", + "https://bcr.bazel.build/modules/pybind11_bazel/2.12.0/source.json": "6900fdc8a9e95866b8c0d4ad4aba4d4236317b5c1cd04c502df3f0d33afed680", + "https://bcr.bazel.build/modules/re2/2023-09-01/MODULE.bazel": "cb3d511531b16cfc78a225a9e2136007a48cf8a677e4264baeab57fe78a80206", + "https://bcr.bazel.build/modules/re2/2024-07-02.bcr.1/MODULE.bazel": "b4963dda9b31080be1905ef085ecd7dd6cd47c05c79b9cdf83ade83ab2ab271a", + "https://bcr.bazel.build/modules/re2/2024-07-02.bcr.1/source.json": "2ff292be6ef3340325ce8a045ecc326e92cbfab47c7cbab4bd85d28971b97ac4", + "https://bcr.bazel.build/modules/re2/2024-07-02/MODULE.bazel": "0eadc4395959969297cbcf31a249ff457f2f1d456228c67719480205aa306daa", + "https://bcr.bazel.build/modules/rules_android/0.1.1/MODULE.bazel": "48809ab0091b07ad0182defb787c4c5328bd3a278938415c00a7b69b50c4d3a8", + "https://bcr.bazel.build/modules/rules_android/0.1.1/source.json": "e6986b41626ee10bdc864937ffb6d6bf275bb5b9c65120e6137d56e6331f089e", + "https://bcr.bazel.build/modules/rules_apple/3.16.0/MODULE.bazel": "0d1caf0b8375942ce98ea944be754a18874041e4e0459401d925577624d3a54a", + "https://bcr.bazel.build/modules/rules_apple/4.1.0/MODULE.bazel": "76e10fd4a48038d3fc7c5dc6e63b7063bbf5304a2e3bd42edda6ec660eebea68", + "https://bcr.bazel.build/modules/rules_apple/4.1.0/source.json": "8ee81e1708756f81b343a5eb2b2f0b953f1d25c4ab3d4a68dc02754872e80715", + "https://bcr.bazel.build/modules/rules_cc/0.0.1/MODULE.bazel": "cb2aa0747f84c6c3a78dad4e2049c154f08ab9d166b1273835a8174940365647", + "https://bcr.bazel.build/modules/rules_cc/0.0.10/MODULE.bazel": "ec1705118f7eaedd6e118508d3d26deba2a4e76476ada7e0e3965211be012002", + "https://bcr.bazel.build/modules/rules_cc/0.0.13/MODULE.bazel": "0e8529ed7b323dad0775ff924d2ae5af7640b23553dfcd4d34344c7e7a867191", + "https://bcr.bazel.build/modules/rules_cc/0.0.15/MODULE.bazel": "6704c35f7b4a72502ee81f61bf88706b54f06b3cbe5558ac17e2e14666cd5dcc", + "https://bcr.bazel.build/modules/rules_cc/0.0.16/MODULE.bazel": "7661303b8fc1b4d7f532e54e9d6565771fea666fbdf839e0a86affcd02defe87", + "https://bcr.bazel.build/modules/rules_cc/0.0.17/MODULE.bazel": "2ae1d8f4238ec67d7185d8861cb0a2cdf4bc608697c331b95bf990e69b62e64a", + "https://bcr.bazel.build/modules/rules_cc/0.0.2/MODULE.bazel": "6915987c90970493ab97393024c156ea8fb9f3bea953b2f3ec05c34f19b5695c", + "https://bcr.bazel.build/modules/rules_cc/0.0.6/MODULE.bazel": "abf360251023dfe3efcef65ab9d56beefa8394d4176dd29529750e1c57eaa33f", + "https://bcr.bazel.build/modules/rules_cc/0.0.8/MODULE.bazel": "964c85c82cfeb6f3855e6a07054fdb159aced38e99a5eecf7bce9d53990afa3e", + "https://bcr.bazel.build/modules/rules_cc/0.0.9/MODULE.bazel": "836e76439f354b89afe6a911a7adf59a6b2518fafb174483ad78a2a2fde7b1c5", + "https://bcr.bazel.build/modules/rules_cc/0.1.1/MODULE.bazel": "2f0222a6f229f0bf44cd711dc13c858dad98c62d52bd51d8fc3a764a83125513", + "https://bcr.bazel.build/modules/rules_cc/0.1.2/MODULE.bazel": "557ddc3a96858ec0d465a87c0a931054d7dcfd6583af2c7ed3baf494407fd8d0", + "https://bcr.bazel.build/modules/rules_cc/0.1.5/MODULE.bazel": "88dfc9361e8b5ae1008ac38f7cdfd45ad738e4fa676a3ad67d19204f045a1fd8", + "https://bcr.bazel.build/modules/rules_cc/0.2.0/MODULE.bazel": "b5c17f90458caae90d2ccd114c81970062946f49f355610ed89bebf954f5783c", + "https://bcr.bazel.build/modules/rules_cc/0.2.13/MODULE.bazel": "eecdd666eda6be16a8d9dc15e44b5c75133405e820f620a234acc4b1fdc5aa37", + "https://bcr.bazel.build/modules/rules_cc/0.2.16/MODULE.bazel": "9242fa89f950c6ef7702801ab53922e99c69b02310c39fb6e62b2bd30df2a1d4", + "https://bcr.bazel.build/modules/rules_cc/0.2.17/MODULE.bazel": "1849602c86cb60da8613d2de887f9566a6d354a6df6d7009f9d04a14402f9a84", + "https://bcr.bazel.build/modules/rules_cc/0.2.18/MODULE.bazel": "4460ec36adc8f722a6a2a4ac9374cb91f2acebadaa93fc37966129afb3dece87", + "https://bcr.bazel.build/modules/rules_cc/0.2.18/source.json": "abad668ff2fd63ada1ac49bf386d37e27048b89a3465a6fd968bb832b00a09d3", + "https://bcr.bazel.build/modules/rules_cc/0.2.4/MODULE.bazel": "1ff1223dfd24f3ecf8f028446d4a27608aa43c3f41e346d22838a4223980b8cc", + "https://bcr.bazel.build/modules/rules_cc/0.2.8/MODULE.bazel": "f1df20f0bf22c28192a794f29b501ee2018fa37a3862a1a2132ae2940a23a642", + "https://bcr.bazel.build/modules/rules_distroless/0.9.4/MODULE.bazel": "e098aab7f99a64d254bd4f425db6d7fb0818e2362f028d1672964ee130615567", + "https://bcr.bazel.build/modules/rules_distroless/0.9.4/source.json": "f4cc35c677da04b354d652a4b5835a7ad1dbd3d53043fbce163a050ae2af85d1", + "https://bcr.bazel.build/modules/rules_foreign_cc/0.9.0/MODULE.bazel": "c9e8c682bf75b0e7c704166d79b599f93b72cfca5ad7477df596947891feeef6", + "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/MODULE.bazel": "40c97d1144356f52905566c55811f13b299453a14ac7769dfba2ac38192337a8", + "https://bcr.bazel.build/modules/rules_img/0.3.22/MODULE.bazel": "71d9fd40eacdc1b597541e2774679292193e89869bed2c8b53d6fa77d7b5dc2d", + "https://bcr.bazel.build/modules/rules_img/0.3.22/source.json": "5a42658e570888c80f6053c4ea7b0aae0e7c8b7387bc3716b0f77e7d50df4f86", + "https://bcr.bazel.build/modules/rules_java/4.0.0/MODULE.bazel": "5a78a7ae82cd1a33cef56dc578c7d2a46ed0dca12643ee45edbb8417899e6f74", + "https://bcr.bazel.build/modules/rules_java/5.3.5/MODULE.bazel": "a4ec4f2db570171e3e5eb753276ee4b389bae16b96207e9d3230895c99644b86", + "https://bcr.bazel.build/modules/rules_java/6.0.0/MODULE.bazel": "8a43b7df601a7ec1af61d79345c17b31ea1fedc6711fd4abfd013ea612978e39", + "https://bcr.bazel.build/modules/rules_java/6.3.0/MODULE.bazel": "a97c7678c19f236a956ad260d59c86e10a463badb7eb2eda787490f4c969b963", + "https://bcr.bazel.build/modules/rules_java/6.4.0/MODULE.bazel": "e986a9fe25aeaa84ac17ca093ef13a4637f6107375f64667a15999f77db6c8f6", + "https://bcr.bazel.build/modules/rules_java/6.5.2/MODULE.bazel": "1d440d262d0e08453fa0c4d8f699ba81609ed0e9a9a0f02cd10b3e7942e61e31", + "https://bcr.bazel.build/modules/rules_java/7.10.0/MODULE.bazel": "530c3beb3067e870561739f1144329a21c851ff771cd752a49e06e3dc9c2e71a", + "https://bcr.bazel.build/modules/rules_java/7.12.2/MODULE.bazel": "579c505165ee757a4280ef83cda0150eea193eed3bef50b1004ba88b99da6de6", + "https://bcr.bazel.build/modules/rules_java/7.2.0/MODULE.bazel": "06c0334c9be61e6cef2c8c84a7800cef502063269a5af25ceb100b192453d4ab", + "https://bcr.bazel.build/modules/rules_java/7.3.2/MODULE.bazel": "50dece891cfdf1741ea230d001aa9c14398062f2b7c066470accace78e412bc2", + "https://bcr.bazel.build/modules/rules_java/7.6.1/MODULE.bazel": "2f14b7e8a1aa2f67ae92bc69d1ec0fa8d9f827c4e17ff5e5f02e91caa3b2d0fe", + "https://bcr.bazel.build/modules/rules_java/8.3.2/MODULE.bazel": "7336d5511ad5af0b8615fdc7477535a2e4e723a357b6713af439fe8cf0195017", + "https://bcr.bazel.build/modules/rules_java/8.5.1/MODULE.bazel": "d8a9e38cc5228881f7055a6079f6f7821a073df3744d441978e7a43e20226939", + "https://bcr.bazel.build/modules/rules_java/8.6.0/MODULE.bazel": "9c064c434606d75a086f15ade5edb514308cccd1544c2b2a89bbac4310e41c71", + "https://bcr.bazel.build/modules/rules_java/8.6.1/MODULE.bazel": "f4808e2ab5b0197f094cabce9f4b006a27766beb6a9975931da07099560ca9c2", + "https://bcr.bazel.build/modules/rules_java/8.8.0/MODULE.bazel": "de589d0880911ac007abd521b9f0ddcd8b0dbd05c8553e6f8124a050b83acf7d", + "https://bcr.bazel.build/modules/rules_java/9.1.0/MODULE.bazel": "ee63f27e36a3fada80342869361182f120a9819c74320e8e65b1e04ba0cd7a9d", + "https://bcr.bazel.build/modules/rules_java/9.1.0/source.json": "da589573c1dee2c9ac4a568b301269a2e8191110ff0345c1a959fa7ea6c4dfd6", + "https://bcr.bazel.build/modules/rules_jvm_external/4.4.2/MODULE.bazel": "a56b85e418c83eb1839819f0b515c431010160383306d13ec21959ac412d2fe7", + "https://bcr.bazel.build/modules/rules_jvm_external/5.1/MODULE.bazel": "33f6f999e03183f7d088c9be518a63467dfd0be94a11d0055fe2d210f89aa909", + "https://bcr.bazel.build/modules/rules_jvm_external/5.2/MODULE.bazel": "d9351ba35217ad0de03816ef3ed63f89d411349353077348a45348b096615036", + "https://bcr.bazel.build/modules/rules_jvm_external/5.3/MODULE.bazel": "bf93870767689637164657731849fb887ad086739bd5d360d90007a581d5527d", + "https://bcr.bazel.build/modules/rules_jvm_external/6.1/MODULE.bazel": "75b5fec090dbd46cf9b7d8ea08cf84a0472d92ba3585b476f44c326eda8059c4", + "https://bcr.bazel.build/modules/rules_jvm_external/6.3/MODULE.bazel": "c998e060b85f71e00de5ec552019347c8bca255062c990ac02d051bb80a38df0", + "https://bcr.bazel.build/modules/rules_jvm_external/6.7/MODULE.bazel": "e717beabc4d091ecb2c803c2d341b88590e9116b8bf7947915eeb33aab4f96dd", + "https://bcr.bazel.build/modules/rules_jvm_external/6.7/source.json": "5426f412d0a7fc6b611643376c7e4a82dec991491b9ce5cb1cfdd25fe2e92be4", + "https://bcr.bazel.build/modules/rules_kotlin/1.9.0/MODULE.bazel": "ef85697305025e5a61f395d4eaede272a5393cee479ace6686dba707de804d59", + "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/MODULE.bazel": "d269a01a18ee74d0335450b10f62c9ed81f2321d7958a2934e44272fe82dcef3", + "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/source.json": "2faa4794364282db7c06600b7e5e34867a564ae91bda7cae7c29c64e9466b7d5", + "https://bcr.bazel.build/modules/rules_license/0.0.3/MODULE.bazel": "627e9ab0247f7d1e05736b59dbb1b6871373de5ad31c3011880b4133cafd4bd0", + "https://bcr.bazel.build/modules/rules_license/0.0.7/MODULE.bazel": "088fbeb0b6a419005b89cf93fe62d9517c0a2b8bb56af3244af65ecfe37e7d5d", + "https://bcr.bazel.build/modules/rules_license/1.0.0/MODULE.bazel": "a7fda60eefdf3d8c827262ba499957e4df06f659330bbe6cdbdb975b768bb65c", + "https://bcr.bazel.build/modules/rules_license/1.0.0/source.json": "a52c89e54cc311196e478f8382df91c15f7a2bfdf4c6cd0e2675cc2ff0b56efb", + "https://bcr.bazel.build/modules/rules_pkg/0.7.0/MODULE.bazel": "df99f03fc7934a4737122518bb87e667e62d780b610910f0447665a7e2be62dc", + "https://bcr.bazel.build/modules/rules_pkg/1.0.1/MODULE.bazel": "5b1df97dbc29623bccdf2b0dcd0f5cb08e2f2c9050aab1092fd39a41e82686ff", + "https://bcr.bazel.build/modules/rules_pkg/1.1.0/MODULE.bazel": "9db8031e71b6ef32d1846106e10dd0ee2deac042bd9a2de22b4761b0c3036453", + "https://bcr.bazel.build/modules/rules_pkg/1.1.0/source.json": "fef768df13a92ce6067e1cd0cdc47560dace01354f1d921cfb1d632511f7d608", + "https://bcr.bazel.build/modules/rules_proto/4.0.0/MODULE.bazel": "a7a7b6ce9bee418c1a760b3d84f83a299ad6952f9903c67f19e4edd964894e06", + "https://bcr.bazel.build/modules/rules_proto/5.3.0-21.7/MODULE.bazel": "e8dff86b0971688790ae75528fe1813f71809b5afd57facb44dad9e8eca631b7", + "https://bcr.bazel.build/modules/rules_proto/6.0.0-rc1/MODULE.bazel": "1e5b502e2e1a9e825eef74476a5a1ee524a92297085015a052510b09a1a09483", + "https://bcr.bazel.build/modules/rules_proto/6.0.2/MODULE.bazel": "ce916b775a62b90b61888052a416ccdda405212b6aaeb39522f7dc53431a5e73", + "https://bcr.bazel.build/modules/rules_proto/7.0.2/MODULE.bazel": "bf81793bd6d2ad89a37a40693e56c61b0ee30f7a7fdbaf3eabbf5f39de47dea2", + "https://bcr.bazel.build/modules/rules_proto/7.1.0/MODULE.bazel": "002d62d9108f75bb807cd56245d45648f38275cb3a99dcd45dfb864c5d74cb96", + "https://bcr.bazel.build/modules/rules_proto/7.1.0/source.json": "39f89066c12c24097854e8f57ab8558929f9c8d474d34b2c00ac04630ad8940e", + "https://bcr.bazel.build/modules/rules_python/0.10.2/MODULE.bazel": "cc82bc96f2997baa545ab3ce73f196d040ffb8756fd2d66125a530031cd90e5f", + "https://bcr.bazel.build/modules/rules_python/0.23.1/MODULE.bazel": "49ffccf0511cb8414de28321f5fcf2a31312b47c40cc21577144b7447f2bf300", + "https://bcr.bazel.build/modules/rules_python/0.25.0/MODULE.bazel": "72f1506841c920a1afec76975b35312410eea3aa7b63267436bfb1dd91d2d382", + "https://bcr.bazel.build/modules/rules_python/0.28.0/MODULE.bazel": "cba2573d870babc976664a912539b320cbaa7114cd3e8f053c720171cde331ed", + "https://bcr.bazel.build/modules/rules_python/0.31.0/MODULE.bazel": "93a43dc47ee570e6ec9f5779b2e64c1476a6ce921c48cc9a1678a91dd5f8fd58", + "https://bcr.bazel.build/modules/rules_python/0.33.2/MODULE.bazel": "3e036c4ad8d804a4dad897d333d8dce200d943df4827cb849840055be8d2e937", + "https://bcr.bazel.build/modules/rules_python/0.4.0/MODULE.bazel": "9208ee05fd48bf09ac60ed269791cf17fb343db56c8226a720fbb1cdf467166c", + "https://bcr.bazel.build/modules/rules_python/1.0.0/MODULE.bazel": "898a3d999c22caa585eb062b600f88654bf92efb204fa346fb55f6f8edffca43", + "https://bcr.bazel.build/modules/rules_python/1.3.0/MODULE.bazel": "8361d57eafb67c09b75bf4bbe6be360e1b8f4f18118ab48037f2bd50aa2ccb13", + "https://bcr.bazel.build/modules/rules_python/1.4.1/MODULE.bazel": "8991ad45bdc25018301d6b7e1d3626afc3c8af8aaf4bc04f23d0b99c938b73a6", + "https://bcr.bazel.build/modules/rules_python/1.6.0/MODULE.bazel": "7e04ad8f8d5bea40451cf80b1bd8262552aa73f841415d20db96b7241bd027d8", + "https://bcr.bazel.build/modules/rules_python/1.7.0/MODULE.bazel": "d01f995ecd137abf30238ad9ce97f8fc3ac57289c8b24bd0bf53324d937a14f8", + "https://bcr.bazel.build/modules/rules_python/1.9.0/MODULE.bazel": "afc3a05f29f09f2d3ee95ad99a145250dab41a2b2d8d6f82cc91936b3213282c", + "https://bcr.bazel.build/modules/rules_python/1.9.0/source.json": "3921ea0b65298d51aead5b9e4a82203d7be9b5918619b58b53f1c259f4e63169", + "https://bcr.bazel.build/modules/rules_runfiles_group/0.1.0/MODULE.bazel": "bb7adb77a1ff532651c392981490cb8e7e369c7d0642511729bedadc05c3f4ad", + "https://bcr.bazel.build/modules/rules_runfiles_group/0.1.0/source.json": "37bf3d25c835b283cfebed6432bacbc27b97b56e762bfa2b50f5d9fe1b4d2ed8", + "https://bcr.bazel.build/modules/rules_shell/0.2.0/MODULE.bazel": "fda8a652ab3c7d8fee214de05e7a9916d8b28082234e8d2c0094505c5268ed3c", + "https://bcr.bazel.build/modules/rules_shell/0.3.0/MODULE.bazel": "de4402cd12f4cc8fda2354fce179fdb068c0b9ca1ec2d2b17b3e21b24c1a937b", + "https://bcr.bazel.build/modules/rules_shell/0.4.1/MODULE.bazel": "00e501db01bbf4e3e1dd1595959092c2fadf2087b2852d3f553b5370f5633592", + "https://bcr.bazel.build/modules/rules_shell/0.6.1/MODULE.bazel": "72e76b0eea4e81611ef5452aa82b3da34caca0c8b7b5c0c9584338aa93bae26b", + "https://bcr.bazel.build/modules/rules_shell/0.6.1/source.json": "20ec05cd5e592055e214b2da8ccb283c7f2a421ea0dc2acbf1aa792e11c03d0c", + "https://bcr.bazel.build/modules/rules_swift/1.16.0/MODULE.bazel": "4a09f199545a60d09895e8281362b1ff3bb08bbde69c6fc87aff5b92fcc916ca", + "https://bcr.bazel.build/modules/rules_swift/2.1.1/MODULE.bazel": "494900a80f944fc7aa61500c2073d9729dff0b764f0e89b824eb746959bc1046", + "https://bcr.bazel.build/modules/rules_swift/2.4.0/MODULE.bazel": "1639617eb1ede28d774d967a738b4a68b0accb40650beadb57c21846beab5efd", + "https://bcr.bazel.build/modules/rules_swift/3.1.2/MODULE.bazel": "72c8f5cf9d26427cee6c76c8e3853eb46ce6b0412a081b2b6db6e8ad56267400", + "https://bcr.bazel.build/modules/rules_swift/3.1.2/source.json": "e85761f3098a6faf40b8187695e3de6d97944e98abd0d8ce579cb2daf6319a66", + "https://bcr.bazel.build/modules/sha256.bzl/0.0.1/MODULE.bazel": "95bc89b9618718bf23154563ff6f2e15151429aff0b2872ae944906935683fc7", + "https://bcr.bazel.build/modules/sha256.bzl/0.0.1/source.json": "fcfc3c116d11521311940b995151878c03b51ea822a9774583c021b5be5b2b26", + "https://bcr.bazel.build/modules/stardoc/0.5.1/MODULE.bazel": "1a05d92974d0c122f5ccf09291442580317cdd859f07a8655f1db9a60374f9f8", + "https://bcr.bazel.build/modules/stardoc/0.5.3/MODULE.bazel": "c7f6948dae6999bf0db32c1858ae345f112cacf98f174c7a8bb707e41b974f1c", + "https://bcr.bazel.build/modules/stardoc/0.5.6/MODULE.bazel": "c43dabc564990eeab55e25ed61c07a1aadafe9ece96a4efabb3f8bf9063b71ef", + "https://bcr.bazel.build/modules/stardoc/0.6.2/MODULE.bazel": "7060193196395f5dd668eda046ccbeacebfd98efc77fed418dbe2b82ffaa39fd", + "https://bcr.bazel.build/modules/stardoc/0.7.0/MODULE.bazel": "05e3d6d30c099b6770e97da986c53bd31844d7f13d41412480ea265ac9e8079c", + "https://bcr.bazel.build/modules/stardoc/0.7.1/MODULE.bazel": "3548faea4ee5dda5580f9af150e79d0f6aea934fc60c1cc50f4efdd9420759e7", + "https://bcr.bazel.build/modules/stardoc/0.7.2/MODULE.bazel": "fc152419aa2ea0f51c29583fab1e8c99ddefd5b3778421845606ee628629e0e5", + "https://bcr.bazel.build/modules/stardoc/0.7.2/source.json": "58b029e5e901d6802967754adf0a9056747e8176f017cfe3607c0851f4d42216", + "https://bcr.bazel.build/modules/swift_argument_parser/1.3.1.1/MODULE.bazel": "5e463fbfba7b1701d957555ed45097d7f984211330106ccd1352c6e0af0dcf91", + "https://bcr.bazel.build/modules/swift_argument_parser/1.3.1.2/MODULE.bazel": "75aab2373a4bbe2a1260b9bf2a1ebbdbf872d3bd36f80bff058dccd82e89422f", + "https://bcr.bazel.build/modules/swift_argument_parser/1.3.1.2/source.json": "5fba48bbe0ba48761f9e9f75f92876cafb5d07c0ce059cc7a8027416de94a05b", + "https://bcr.bazel.build/modules/tar.bzl/0.10.1/MODULE.bazel": "bf5fda5b5ccef8c3c4a5f4886144377386e0baa382972f257acb42dcf40ea908", + "https://bcr.bazel.build/modules/tar.bzl/0.10.1/source.json": "3f1beb35acf53c270a9de493cdc775a985551d7069cfcf24e136b42f683bbb10", + "https://bcr.bazel.build/modules/tar.bzl/0.2.1/MODULE.bazel": "52d1c00a80a8cc67acbd01649e83d8dd6a9dc426a6c0b754a04fe8c219c76468", + "https://bcr.bazel.build/modules/tar.bzl/0.5.1/MODULE.bazel": "7c2eb3dcfc53b0f3d6f9acdfd911ca803eaf92aadf54f8ca6e4c1f3aee288351", + "https://bcr.bazel.build/modules/tar.bzl/0.6.0/MODULE.bazel": "a3584b4edcfafcabd9b0ef9819808f05b372957bbdff41601429d5fd0aac2e7c", + "https://bcr.bazel.build/modules/toml.bzl/0.3.0/MODULE.bazel": "5016e5dd1ad2200e119a4b28b2b3935e276c4b480f2fe3e952bea7eeba88f578", + "https://bcr.bazel.build/modules/toml.bzl/0.3.0/source.json": "0cf7c878c419b37ddb55f3dd93dd7c0c409bd7c4efacb3da504e0748780b2fa9", + "https://bcr.bazel.build/modules/upb/0.0.0-20220923-a547704/MODULE.bazel": "7298990c00040a0e2f121f6c32544bab27d4452f80d9ce51349b1a28f3005c43", + "https://bcr.bazel.build/modules/with_cfg.bzl/0.14.6/MODULE.bazel": "6b6c543e415d2a502954766e50c6a6144a131687f2751b62157a9250e2b04982", + "https://bcr.bazel.build/modules/with_cfg.bzl/0.14.6/source.json": "12363ac76d821f6c7dabfebbd673615391da06e2e33f576402d31a96a7b56532", + "https://bcr.bazel.build/modules/yq.bzl/0.1.1/MODULE.bazel": "9039681f9bcb8958ee2c87ffc74bdafba9f4369096a2b5634b88abc0eaefa072", + "https://bcr.bazel.build/modules/yq.bzl/0.3.1/MODULE.bazel": "9bcb7151b3cd4681b89d350530eaf7b45e32a44dda94843b8932b0cb1cd4594a", + "https://bcr.bazel.build/modules/yq.bzl/0.3.1/source.json": "f0b0f204a2a6b0e34b4c9541efe8c04f2ef1af65948daa784eccea738b21dbd2", + "https://bcr.bazel.build/modules/zlib/1.2.11/MODULE.bazel": "07b389abc85fdbca459b69e2ec656ae5622873af3f845e1c9d80fe179f3effa0", + "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/MODULE.bazel": "eec517b5bbe5492629466e11dae908d043364302283de25581e3eb944326c4ca", + "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/source.json": "22bc55c47af97246cfc093d0acf683a7869377de362b5d1c552c2c2e16b7a806", + "https://bcr.bazel.build/modules/zlib/1.3.1/MODULE.bazel": "751c9940dcfe869f5f7274e1295422a34623555916eb98c174c1e945594bf198" + }, + "selectedYankedVersions": {}, + "moduleExtensions": { + "@@aspect_tools_telemetry+//:extension.bzl%telemetry": { + "general": { + "bzlTransitiveDigest": "cl5A2O84vDL6Tt+Qga8FCj1DUDGqn+e7ly5rZ+4xvcc=", + "usagesDigest": "kqQBy77VGMZA0qEiCyGKY3JKPhKrjzzyMVYd0SUIw30=", + "recordedInputs": [ + "REPO_MAPPING:aspect_tools_telemetry+,bazel_lib bazel_lib+", + "REPO_MAPPING:aspect_tools_telemetry+,bazel_skylib bazel_skylib+" + ], + "generatedRepoSpecs": { + "aspect_tools_telemetry_report": { + "repoRuleId": "@@aspect_tools_telemetry+//:extension.bzl%tel_repository", + "attributes": { + "deps": { + "aspect_rules_py": "2.0.0-alpha.4", + "aspect_tools_telemetry": "0.3.3" + } + } + } + } + } + }, + "@@rules_distroless+//apt:extensions.bzl%apt": { + "general": { + "bzlTransitiveDigest": "omzIXX2jNzQRBI12IBENt3ZsLWKCt1ooWcbYgrB+Jgw=", + "usagesDigest": "4I1u2HmE9LCOuwgz5oEyDtr7CbPKrrqwdtgjgoPc8ss=", + "recordedInputs": [ + "REPO_MAPPING:rules_distroless+,bazel_lib bazel_lib+", + "REPO_MAPPING:rules_distroless+,bazel_tools bazel_tools" + ], + "generatedRepoSpecs": { + "noble": { + "repoRuleId": "@@rules_distroless+//apt/private:translate_dependency_set.bzl%translate_dependency_set", + "attributes": { + "depset_name": "noble", + "lock_content": "{\n\t\"dependency_sets\": {\n\t\t\"noble\": {\n\t\t\t\"sets\": {\n\t\t\t\t\"amd64\": {\n\t\t\t\t\t\"/noble/base-files:amd64\": \"13ubuntu10\",\n\t\t\t\t\t\"/noble/bash:amd64\": \"5.2.21-2ubuntu4\",\n\t\t\t\t\t\"/noble/ca-certificates:amd64\": \"20240203\",\n\t\t\t\t\t\"/noble/coreutils:amd64\": \"9.4-3ubuntu6\",\n\t\t\t\t\t\"/noble/gawk:amd64\": \"1:5.2.1-2build3\",\n\t\t\t\t\t\"/noble/grep:amd64\": \"3.11-4build1\",\n\t\t\t\t\t\"/noble/libssl3t64:amd64\": \"3.0.13-0ubuntu3\",\n\t\t\t\t\t\"/noble/libstdc++6:amd64\": \"14-20240412-0ubuntu1\",\n\t\t\t\t\t\"/noble/netbase:amd64\": \"6.4\",\n\t\t\t\t\t\"/noble/openssl:amd64\": \"3.0.13-0ubuntu3\",\n\t\t\t\t\t\"/noble/sed:amd64\": \"4.9-2build1\",\n\t\t\t\t\t\"/noble/tzdata:amd64\": \"2024a-2ubuntu1\"\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\t\"facts\": {\n\t\t\"noble/main/amd64/Packages/https://snapshot.ubuntu.com/ubuntu/20240601T000000Z\": \"sha256-KmoZnhAxpcJ5yzRmRtWUmT81scA91KgqqgMjmA3ZJFE=\"\n\t},\n\t\"packages\": {\n\t\t\"/noble/base-files:amd64=13ubuntu10\": {\n\t\t\t\"architecture\": \"amd64\",\n\t\t\t\"depends_on\": [\n\t\t\t\t\"/noble/libcrypt1:amd64=1:4.4.36-4build1\",\n\t\t\t\t\"/noble/libc6:amd64=2.39-0ubuntu8\",\n\t\t\t\t\"/noble/libgcc-s1:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/gcc-14-base:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/mawk:amd64=1.3.4.20240123-1build1\"\n\t\t\t],\n\t\t\t\"filename\": \"pool/main/b/base-files/base-files_13ubuntu10_amd64.deb\",\n\t\t\t\"name\": \"base-files\",\n\t\t\t\"section\": \"admin\",\n\t\t\t\"sha256\": \"cd06729c776397bb74779773f4dece372a1a3f795e5992804022bffab0278ffb\",\n\t\t\t\"size\": 73634,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"13ubuntu10\"\n\t\t},\n\t\t\"/noble/bash:amd64=5.2.21-2ubuntu4\": {\n\t\t\t\"architecture\": \"amd64\",\n\t\t\t\"depends_on\": [\n\t\t\t\t\"/noble/debianutils:amd64=5.17build1\",\n\t\t\t\t\"/noble/libc6:amd64=2.39-0ubuntu8\",\n\t\t\t\t\"/noble/libgcc-s1:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/gcc-14-base:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/base-files:amd64=13ubuntu10\",\n\t\t\t\t\"/noble/libcrypt1:amd64=1:4.4.36-4build1\",\n\t\t\t\t\"/noble/mawk:amd64=1.3.4.20240123-1build1\",\n\t\t\t\t\"/noble/libtinfo6:amd64=6.4+20240113-1ubuntu2\"\n\t\t\t],\n\t\t\t\"filename\": \"pool/main/b/bash/bash_5.2.21-2ubuntu4_amd64.deb\",\n\t\t\t\"name\": \"bash\",\n\t\t\t\"section\": \"shells\",\n\t\t\t\"sha256\": \"73de311a21e094e29ac01527d2b52226cc87fde0a5b57032902251b426d92c66\",\n\t\t\t\"size\": 794086,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"5.2.21-2ubuntu4\"\n\t\t},\n\t\t\"/noble/ca-certificates:amd64=20240203\": {\n\t\t\t\"architecture\": \"all\",\n\t\t\t\"depends_on\": [\n\t\t\t\t\"/noble/debconf:amd64=1.5.86ubuntu1\",\n\t\t\t\t\"/noble/openssl:amd64=3.0.13-0ubuntu3\",\n\t\t\t\t\"/noble/libssl3t64:amd64=3.0.13-0ubuntu3\",\n\t\t\t\t\"/noble/libc6:amd64=2.39-0ubuntu8\",\n\t\t\t\t\"/noble/libgcc-s1:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/gcc-14-base:amd64=14-20240412-0ubuntu1\"\n\t\t\t],\n\t\t\t\"filename\": \"pool/main/c/ca-certificates/ca-certificates_20240203_all.deb\",\n\t\t\t\"name\": \"ca-certificates\",\n\t\t\t\"section\": \"misc\",\n\t\t\t\"sha256\": \"641de77d8f142cfd62a1a6f964ba67b20754d3337c480efb529d086075a06c9a\",\n\t\t\t\"size\": 159378,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"20240203\"\n\t\t},\n\t\t\"/noble/coreutils:amd64=9.4-3ubuntu6\": {\n\t\t\t\"architecture\": \"amd64\",\n\t\t\t\"depends_on\": [\n\t\t\t\t\"/noble/libssl3t64:amd64=3.0.13-0ubuntu3\",\n\t\t\t\t\"/noble/libc6:amd64=2.39-0ubuntu8\",\n\t\t\t\t\"/noble/libgcc-s1:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/gcc-14-base:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/libselinux1:amd64=3.5-2ubuntu2\",\n\t\t\t\t\"/noble/libpcre2-8-0:amd64=10.42-4ubuntu2\",\n\t\t\t\t\"/noble/libgmp10:amd64=2:6.3.0+dfsg-2ubuntu6\",\n\t\t\t\t\"/noble/libattr1:amd64=1:2.5.2-1build1\",\n\t\t\t\t\"/noble/libacl1:amd64=2.3.2-1build1\"\n\t\t\t],\n\t\t\t\"filename\": \"pool/main/c/coreutils/coreutils_9.4-3ubuntu6_amd64.deb\",\n\t\t\t\"name\": \"coreutils\",\n\t\t\t\"section\": \"utils\",\n\t\t\t\"sha256\": \"0d19c3e94f04ff1aafde46701fe1783da0a068a4904adc3794c30140f1aaeb8f\",\n\t\t\t\"size\": 1412418,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"9.4-3ubuntu6\"\n\t\t},\n\t\t\"/noble/debconf:amd64=1.5.86ubuntu1\": {\n\t\t\t\"architecture\": \"all\",\n\t\t\t\"depends_on\": [],\n\t\t\t\"filename\": \"pool/main/d/debconf/debconf_1.5.86ubuntu1_all.deb\",\n\t\t\t\"name\": \"debconf\",\n\t\t\t\"section\": \"admin\",\n\t\t\t\"sha256\": \"bb390da466a7461bfc87aa3e6b7cd145dae84af3e26bf437f2c0c218ba226294\",\n\t\t\t\"size\": 124096,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"1.5.86ubuntu1\"\n\t\t},\n\t\t\"/noble/debianutils:amd64=5.17build1\": {\n\t\t\t\"architecture\": \"amd64\",\n\t\t\t\"depends_on\": [\n\t\t\t\t\"/noble/libc6:amd64=2.39-0ubuntu8\",\n\t\t\t\t\"/noble/libgcc-s1:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/gcc-14-base:amd64=14-20240412-0ubuntu1\"\n\t\t\t],\n\t\t\t\"filename\": \"pool/main/d/debianutils/debianutils_5.17build1_amd64.deb\",\n\t\t\t\"name\": \"debianutils\",\n\t\t\t\"section\": \"utils\",\n\t\t\t\"sha256\": \"1047a9a57018e18531f76e5b00e226a68554b6f1d147f2a5c1b32518c7b20636\",\n\t\t\t\"size\": 89890,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"5.17build1\"\n\t\t},\n\t\t\"/noble/gawk:amd64=1:5.2.1-2build3\": {\n\t\t\t\"architecture\": \"amd64\",\n\t\t\t\"depends_on\": [\n\t\t\t\t\"/noble/libsigsegv2:amd64=2.14-1ubuntu2\",\n\t\t\t\t\"/noble/libc6:amd64=2.39-0ubuntu8\",\n\t\t\t\t\"/noble/libgcc-s1:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/gcc-14-base:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/libreadline8t64:amd64=8.2-4build1\",\n\t\t\t\t\"/noble/libtinfo6:amd64=6.4+20240113-1ubuntu2\",\n\t\t\t\t\"/noble/readline-common:amd64=8.2-4build1\",\n\t\t\t\t\"/noble/libmpfr6:amd64=4.2.1-1build1\",\n\t\t\t\t\"/noble/libgmp10:amd64=2:6.3.0+dfsg-2ubuntu6\"\n\t\t\t],\n\t\t\t\"filename\": \"pool/main/g/gawk/gawk_5.2.1-2build3_amd64.deb\",\n\t\t\t\"name\": \"gawk\",\n\t\t\t\"section\": \"interpreters\",\n\t\t\t\"sha256\": \"4b662062e90f62ece26ca7adfcd3a33207c7862f3dc77b8df515b5680ee00ca9\",\n\t\t\t\"size\": 462772,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"1:5.2.1-2build3\"\n\t\t},\n\t\t\"/noble/gcc-14-base:amd64=14-20240412-0ubuntu1\": {\n\t\t\t\"architecture\": \"amd64\",\n\t\t\t\"depends_on\": [],\n\t\t\t\"filename\": \"pool/main/g/gcc-14/gcc-14-base_14-20240412-0ubuntu1_amd64.deb\",\n\t\t\t\"name\": \"gcc-14-base\",\n\t\t\t\"section\": \"libs\",\n\t\t\t\"sha256\": \"bc5a682c694a1ce5af50772b7c737a21e9a74f0f0edaae98e97bc9c4af583fef\",\n\t\t\t\"size\": 47612,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"14-20240412-0ubuntu1\"\n\t\t},\n\t\t\"/noble/grep:amd64=3.11-4build1\": {\n\t\t\t\"architecture\": \"amd64\",\n\t\t\t\"depends_on\": [\n\t\t\t\t\"/noble/libpcre2-8-0:amd64=10.42-4ubuntu2\",\n\t\t\t\t\"/noble/libc6:amd64=2.39-0ubuntu8\",\n\t\t\t\t\"/noble/libgcc-s1:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/gcc-14-base:amd64=14-20240412-0ubuntu1\"\n\t\t\t],\n\t\t\t\"filename\": \"pool/main/g/grep/grep_3.11-4build1_amd64.deb\",\n\t\t\t\"name\": \"grep\",\n\t\t\t\"section\": \"utils\",\n\t\t\t\"sha256\": \"fc0fdc5983ea3d3579ccf335e51dec69684a0dd9bb915734999c5733add9507a\",\n\t\t\t\"size\": 162040,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"3.11-4build1\"\n\t\t},\n\t\t\"/noble/libacl1:amd64=2.3.2-1build1\": {\n\t\t\t\"architecture\": \"amd64\",\n\t\t\t\"depends_on\": [\n\t\t\t\t\"/noble/libc6:amd64=2.39-0ubuntu8\",\n\t\t\t\t\"/noble/libgcc-s1:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/gcc-14-base:amd64=14-20240412-0ubuntu1\"\n\t\t\t],\n\t\t\t\"filename\": \"pool/main/a/acl/libacl1_2.3.2-1build1_amd64.deb\",\n\t\t\t\"name\": \"libacl1\",\n\t\t\t\"section\": \"libs\",\n\t\t\t\"sha256\": \"892dd9edaded972367e19713e5b0a3144409d9ef6613da5b7734a56f8e8f582b\",\n\t\t\t\"size\": 16794,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"2.3.2-1build1\"\n\t\t},\n\t\t\"/noble/libattr1:amd64=1:2.5.2-1build1\": {\n\t\t\t\"architecture\": \"amd64\",\n\t\t\t\"depends_on\": [\n\t\t\t\t\"/noble/libc6:amd64=2.39-0ubuntu8\",\n\t\t\t\t\"/noble/libgcc-s1:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/gcc-14-base:amd64=14-20240412-0ubuntu1\"\n\t\t\t],\n\t\t\t\"filename\": \"pool/main/a/attr/libattr1_2.5.2-1build1_amd64.deb\",\n\t\t\t\"name\": \"libattr1\",\n\t\t\t\"section\": \"libs\",\n\t\t\t\"sha256\": \"204e45dde86d1cf762114bd91fdab9d820de08e3da8216c7b25382924a96aa9f\",\n\t\t\t\"size\": 11326,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"1:2.5.2-1build1\"\n\t\t},\n\t\t\"/noble/libc6:amd64=2.39-0ubuntu8\": {\n\t\t\t\"architecture\": \"amd64\",\n\t\t\t\"depends_on\": [\n\t\t\t\t\"/noble/libgcc-s1:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/gcc-14-base:amd64=14-20240412-0ubuntu1\"\n\t\t\t],\n\t\t\t\"filename\": \"pool/main/g/glibc/libc6_2.39-0ubuntu8_amd64.deb\",\n\t\t\t\"name\": \"libc6\",\n\t\t\t\"section\": \"libs\",\n\t\t\t\"sha256\": \"af36c7ac770770fe3d3c10e85d6bc538e76e57570ba7db7d397fb9f654783ef3\",\n\t\t\t\"size\": 3264806,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"2.39-0ubuntu8\"\n\t\t},\n\t\t\"/noble/libcrypt1:amd64=1:4.4.36-4build1\": {\n\t\t\t\"architecture\": \"amd64\",\n\t\t\t\"depends_on\": [\n\t\t\t\t\"/noble/libc6:amd64=2.39-0ubuntu8\",\n\t\t\t\t\"/noble/libgcc-s1:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/gcc-14-base:amd64=14-20240412-0ubuntu1\"\n\t\t\t],\n\t\t\t\"filename\": \"pool/main/libx/libxcrypt/libcrypt1_4.4.36-4build1_amd64.deb\",\n\t\t\t\"name\": \"libcrypt1\",\n\t\t\t\"section\": \"libs\",\n\t\t\t\"sha256\": \"9474785cd6f398512bf8c305c3901dbb111569dccb6f5832002373c0a8ac5832\",\n\t\t\t\"size\": 82302,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"1:4.4.36-4build1\"\n\t\t},\n\t\t\"/noble/libgcc-s1:amd64=14-20240412-0ubuntu1\": {\n\t\t\t\"architecture\": \"amd64\",\n\t\t\t\"depends_on\": [\n\t\t\t\t\"/noble/libc6:amd64=2.39-0ubuntu8\",\n\t\t\t\t\"/noble/gcc-14-base:amd64=14-20240412-0ubuntu1\"\n\t\t\t],\n\t\t\t\"filename\": \"pool/main/g/gcc-14/libgcc-s1_14-20240412-0ubuntu1_amd64.deb\",\n\t\t\t\"name\": \"libgcc-s1\",\n\t\t\t\"section\": \"libs\",\n\t\t\t\"sha256\": \"a39efdcaa2245f026dc3254ce14fcff255fc430a17064632b6ba7c5da974a912\",\n\t\t\t\"size\": 78484,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"14-20240412-0ubuntu1\"\n\t\t},\n\t\t\"/noble/libgmp10:amd64=2:6.3.0+dfsg-2ubuntu6\": {\n\t\t\t\"architecture\": \"amd64\",\n\t\t\t\"depends_on\": [\n\t\t\t\t\"/noble/libc6:amd64=2.39-0ubuntu8\",\n\t\t\t\t\"/noble/libgcc-s1:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/gcc-14-base:amd64=14-20240412-0ubuntu1\"\n\t\t\t],\n\t\t\t\"filename\": \"pool/main/g/gmp/libgmp10_6.3.0+dfsg-2ubuntu6_amd64.deb\",\n\t\t\t\"name\": \"libgmp10\",\n\t\t\t\"section\": \"libs\",\n\t\t\t\"sha256\": \"649a5ee5f74f0aa1e1b9c4f169eabbae56a79aa5aac51ef733eb9e18700bd8fc\",\n\t\t\t\"size\": 253448,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"2:6.3.0+dfsg-2ubuntu6\"\n\t\t},\n\t\t\"/noble/libmpfr6:amd64=4.2.1-1build1\": {\n\t\t\t\"architecture\": \"amd64\",\n\t\t\t\"depends_on\": [\n\t\t\t\t\"/noble/libgmp10:amd64=2:6.3.0+dfsg-2ubuntu6\",\n\t\t\t\t\"/noble/libc6:amd64=2.39-0ubuntu8\",\n\t\t\t\t\"/noble/libgcc-s1:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/gcc-14-base:amd64=14-20240412-0ubuntu1\"\n\t\t\t],\n\t\t\t\"filename\": \"pool/main/m/mpfr4/libmpfr6_4.2.1-1build1_amd64.deb\",\n\t\t\t\"name\": \"libmpfr6\",\n\t\t\t\"section\": \"libs\",\n\t\t\t\"sha256\": \"a25c2f5f123829ab144f31ddb22f4363b7206eb21bf821bfbecca5753ccfc6be\",\n\t\t\t\"size\": 355358,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"4.2.1-1build1\"\n\t\t},\n\t\t\"/noble/libpcre2-8-0:amd64=10.42-4ubuntu2\": {\n\t\t\t\"architecture\": \"amd64\",\n\t\t\t\"depends_on\": [\n\t\t\t\t\"/noble/libc6:amd64=2.39-0ubuntu8\",\n\t\t\t\t\"/noble/libgcc-s1:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/gcc-14-base:amd64=14-20240412-0ubuntu1\"\n\t\t\t],\n\t\t\t\"filename\": \"pool/main/p/pcre2/libpcre2-8-0_10.42-4ubuntu2_amd64.deb\",\n\t\t\t\"name\": \"libpcre2-8-0\",\n\t\t\t\"section\": \"libs\",\n\t\t\t\"sha256\": \"bb38c38adb4ef548f2851b5cf7f70bbdbcb27d582c17550aa053edb9e4098d84\",\n\t\t\t\"size\": 226574,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"10.42-4ubuntu2\"\n\t\t},\n\t\t\"/noble/libreadline8t64:amd64=8.2-4build1\": {\n\t\t\t\"architecture\": \"amd64\",\n\t\t\t\"depends_on\": [\n\t\t\t\t\"/noble/libtinfo6:amd64=6.4+20240113-1ubuntu2\",\n\t\t\t\t\"/noble/libc6:amd64=2.39-0ubuntu8\",\n\t\t\t\t\"/noble/libgcc-s1:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/gcc-14-base:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/readline-common:amd64=8.2-4build1\"\n\t\t\t],\n\t\t\t\"filename\": \"pool/main/r/readline/libreadline8t64_8.2-4build1_amd64.deb\",\n\t\t\t\"name\": \"libreadline8t64\",\n\t\t\t\"section\": \"libs\",\n\t\t\t\"sha256\": \"563977a16df03b611f5239cc1e9a0426e86479fcc616b5c9e200ea32063119e5\",\n\t\t\t\"size\": 152856,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"8.2-4build1\"\n\t\t},\n\t\t\"/noble/libselinux1:amd64=3.5-2ubuntu2\": {\n\t\t\t\"architecture\": \"amd64\",\n\t\t\t\"depends_on\": [\n\t\t\t\t\"/noble/libpcre2-8-0:amd64=10.42-4ubuntu2\",\n\t\t\t\t\"/noble/libc6:amd64=2.39-0ubuntu8\",\n\t\t\t\t\"/noble/libgcc-s1:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/gcc-14-base:amd64=14-20240412-0ubuntu1\"\n\t\t\t],\n\t\t\t\"filename\": \"pool/main/libs/libselinux/libselinux1_3.5-2ubuntu2_amd64.deb\",\n\t\t\t\"name\": \"libselinux1\",\n\t\t\t\"section\": \"libs\",\n\t\t\t\"sha256\": \"c0fe6dfac61d458f3e65c4a2bf6a920030a97d2429e33d0b405a8c4a63ef2864\",\n\t\t\t\"size\": 79578,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"3.5-2ubuntu2\"\n\t\t},\n\t\t\"/noble/libsigsegv2:amd64=2.14-1ubuntu2\": {\n\t\t\t\"architecture\": \"amd64\",\n\t\t\t\"depends_on\": [\n\t\t\t\t\"/noble/libc6:amd64=2.39-0ubuntu8\",\n\t\t\t\t\"/noble/libgcc-s1:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/gcc-14-base:amd64=14-20240412-0ubuntu1\"\n\t\t\t],\n\t\t\t\"filename\": \"pool/main/libs/libsigsegv/libsigsegv2_2.14-1ubuntu2_amd64.deb\",\n\t\t\t\"name\": \"libsigsegv2\",\n\t\t\t\"section\": \"libs\",\n\t\t\t\"sha256\": \"889f338bea4ebfd999939d946da4ac0a45668264a5aae78e023feeb0529505b8\",\n\t\t\t\"size\": 15042,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"2.14-1ubuntu2\"\n\t\t},\n\t\t\"/noble/libssl3t64:amd64=3.0.13-0ubuntu3\": {\n\t\t\t\"architecture\": \"amd64\",\n\t\t\t\"depends_on\": [\n\t\t\t\t\"/noble/libc6:amd64=2.39-0ubuntu8\",\n\t\t\t\t\"/noble/libgcc-s1:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/gcc-14-base:amd64=14-20240412-0ubuntu1\"\n\t\t\t],\n\t\t\t\"filename\": \"pool/main/o/openssl/libssl3t64_3.0.13-0ubuntu3_amd64.deb\",\n\t\t\t\"name\": \"libssl3t64\",\n\t\t\t\"section\": \"libs\",\n\t\t\t\"sha256\": \"6cde53feabd28f26586a4db2ffb9fc84e7b0598aee15b33bee907b6392a92d24\",\n\t\t\t\"size\": 1936306,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"3.0.13-0ubuntu3\"\n\t\t},\n\t\t\"/noble/libstdc++6:amd64=14-20240412-0ubuntu1\": {\n\t\t\t\"architecture\": \"amd64\",\n\t\t\t\"depends_on\": [\n\t\t\t\t\"/noble/libgcc-s1:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/libc6:amd64=2.39-0ubuntu8\",\n\t\t\t\t\"/noble/gcc-14-base:amd64=14-20240412-0ubuntu1\"\n\t\t\t],\n\t\t\t\"filename\": \"pool/main/g/gcc-14/libstdc++6_14-20240412-0ubuntu1_amd64.deb\",\n\t\t\t\"name\": \"libstdc++6\",\n\t\t\t\"section\": \"libs\",\n\t\t\t\"sha256\": \"4863e880d6ee538e4734c430c5579c1ac933b88a42c25bc9980d0f148c54b21e\",\n\t\t\t\"size\": 795158,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"14-20240412-0ubuntu1\"\n\t\t},\n\t\t\"/noble/libtinfo6:amd64=6.4+20240113-1ubuntu2\": {\n\t\t\t\"architecture\": \"amd64\",\n\t\t\t\"depends_on\": [\n\t\t\t\t\"/noble/libc6:amd64=2.39-0ubuntu8\",\n\t\t\t\t\"/noble/libgcc-s1:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/gcc-14-base:amd64=14-20240412-0ubuntu1\"\n\t\t\t],\n\t\t\t\"filename\": \"pool/main/n/ncurses/libtinfo6_6.4+20240113-1ubuntu2_amd64.deb\",\n\t\t\t\"name\": \"libtinfo6\",\n\t\t\t\"section\": \"libs\",\n\t\t\t\"sha256\": \"53e1e1753729d04cf65b05e6e58abe06e2bb76cc07eff0e1b2a638a638ca209b\",\n\t\t\t\"size\": 107794,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"6.4+20240113-1ubuntu2\"\n\t\t},\n\t\t\"/noble/mawk:amd64=1.3.4.20240123-1build1\": {\n\t\t\t\"architecture\": \"amd64\",\n\t\t\t\"depends_on\": [\n\t\t\t\t\"/noble/libc6:amd64=2.39-0ubuntu8\",\n\t\t\t\t\"/noble/libgcc-s1:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/gcc-14-base:amd64=14-20240412-0ubuntu1\"\n\t\t\t],\n\t\t\t\"filename\": \"pool/main/m/mawk/mawk_1.3.4.20240123-1build1_amd64.deb\",\n\t\t\t\"name\": \"mawk\",\n\t\t\t\"section\": \"utils\",\n\t\t\t\"sha256\": \"dc7f7f4dad4b48f6012ea65de3198d8376604afef39f06d65ec6167740e203c9\",\n\t\t\t\"size\": 127222,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"1.3.4.20240123-1build1\"\n\t\t},\n\t\t\"/noble/netbase:amd64=6.4\": {\n\t\t\t\"architecture\": \"all\",\n\t\t\t\"depends_on\": [],\n\t\t\t\"filename\": \"pool/main/n/netbase/netbase_6.4_all.deb\",\n\t\t\t\"name\": \"netbase\",\n\t\t\t\"section\": \"admin\",\n\t\t\t\"sha256\": \"8cdbc9c3dca01e660759bf9d840f72e45ac72faf5d19ca1faecacaf6a60c1a87\",\n\t\t\t\"size\": 13112,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"6.4\"\n\t\t},\n\t\t\"/noble/openssl:amd64=3.0.13-0ubuntu3\": {\n\t\t\t\"architecture\": \"amd64\",\n\t\t\t\"depends_on\": [\n\t\t\t\t\"/noble/libssl3t64:amd64=3.0.13-0ubuntu3\",\n\t\t\t\t\"/noble/libc6:amd64=2.39-0ubuntu8\",\n\t\t\t\t\"/noble/libgcc-s1:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/gcc-14-base:amd64=14-20240412-0ubuntu1\"\n\t\t\t],\n\t\t\t\"filename\": \"pool/main/o/openssl/openssl_3.0.13-0ubuntu3_amd64.deb\",\n\t\t\t\"name\": \"openssl\",\n\t\t\t\"section\": \"utils\",\n\t\t\t\"sha256\": \"9c79333ab21bce0fb8dd92304cd76b3b1c427b0f2fedc897257fb5cced37c39e\",\n\t\t\t\"size\": 1001730,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"3.0.13-0ubuntu3\"\n\t\t},\n\t\t\"/noble/readline-common:amd64=8.2-4build1\": {\n\t\t\t\"architecture\": \"all\",\n\t\t\t\"depends_on\": [],\n\t\t\t\"filename\": \"pool/main/r/readline/readline-common_8.2-4build1_all.deb\",\n\t\t\t\"name\": \"readline-common\",\n\t\t\t\"section\": \"utils\",\n\t\t\t\"sha256\": \"879bfd7f8a9bc4c0f7cdc777cdd8bc6de5f8c4a2ac80c060322a1b22f13504bb\",\n\t\t\t\"size\": 56484,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"8.2-4build1\"\n\t\t},\n\t\t\"/noble/sed:amd64=4.9-2build1\": {\n\t\t\t\"architecture\": \"amd64\",\n\t\t\t\"depends_on\": [\n\t\t\t\t\"/noble/libselinux1:amd64=3.5-2ubuntu2\",\n\t\t\t\t\"/noble/libpcre2-8-0:amd64=10.42-4ubuntu2\",\n\t\t\t\t\"/noble/libc6:amd64=2.39-0ubuntu8\",\n\t\t\t\t\"/noble/libgcc-s1:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/gcc-14-base:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/libacl1:amd64=2.3.2-1build1\"\n\t\t\t],\n\t\t\t\"filename\": \"pool/main/s/sed/sed_4.9-2build1_amd64.deb\",\n\t\t\t\"name\": \"sed\",\n\t\t\t\"section\": \"utils\",\n\t\t\t\"sha256\": \"a09b856849cf36190f8cd39da33486b14bcaf81b592530b2f3236da17daaad2f\",\n\t\t\t\"size\": 193410,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"4.9-2build1\"\n\t\t},\n\t\t\"/noble/tzdata:amd64=2024a-2ubuntu1\": {\n\t\t\t\"architecture\": \"all\",\n\t\t\t\"depends_on\": [\n\t\t\t\t\"/noble/debconf:amd64=1.5.86ubuntu1\"\n\t\t\t],\n\t\t\t\"filename\": \"pool/main/t/tzdata/tzdata_2024a-2ubuntu1_all.deb\",\n\t\t\t\"name\": \"tzdata\",\n\t\t\t\"section\": \"libs\",\n\t\t\t\"sha256\": \"f5bca0c788a4fc465c435f7e8a54b2594e9cbf1a22abb263a59e393f1cb666e1\",\n\t\t\t\"size\": 273318,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"2024a-2ubuntu1\"\n\t\t}\n\t},\n\t\"sources\": {\n\t\t\"noble\": {\n\t\t\t\"architectures\": [\n\t\t\t\t\"amd64\"\n\t\t\t],\n\t\t\t\"components\": [\n\t\t\t\t\"main\"\n\t\t\t],\n\t\t\t\"types\": [\n\t\t\t\t\"deb\"\n\t\t\t],\n\t\t\t\"uris\": [\n\t\t\t\t\"https://snapshot.ubuntu.com/ubuntu/20240601T000000Z\"\n\t\t\t]\n\t\t}\n\t},\n\t\"version\": 2\n}" + } + }, + "noble_tzdata-amd64_2024a-2ubuntu1_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_tzdata-amd64_2024a-2ubuntu1": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_tzdata-amd64_2024a-2ubuntu1", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/t/tzdata/tzdata_2024a-2ubuntu1_all.deb" + ], + "sha256": "f5bca0c788a4fc465c435f7e8a54b2594e9cbf1a22abb263a59e393f1cb666e1", + "mergedusr": false, + "depends_on": [ + "/noble/debconf:amd64=1.5.86ubuntu1" + ], + "dep_filemaps": [ + "@@rules_distroless++apt+noble_debconf-amd64_1.5.86ubuntu1_filemap//:filemap.json" + ], + "package_name": "tzdata" + } + }, + "noble_debconf-amd64_1.5.86ubuntu1_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_debconf-amd64_1.5.86ubuntu1": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_debconf-amd64_1.5.86ubuntu1", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/d/debconf/debconf_1.5.86ubuntu1_all.deb" + ], + "sha256": "bb390da466a7461bfc87aa3e6b7cd145dae84af3e26bf437f2c0c218ba226294", + "mergedusr": false, + "depends_on": [], + "dep_filemaps": [], + "package_name": "debconf" + } + }, + "noble_sed-amd64_4.9-2build1_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_sed-amd64_4.9-2build1": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_sed-amd64_4.9-2build1", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/s/sed/sed_4.9-2build1_amd64.deb" + ], + "sha256": "a09b856849cf36190f8cd39da33486b14bcaf81b592530b2f3236da17daaad2f", + "mergedusr": false, + "depends_on": [ + "/noble/libselinux1:amd64=3.5-2ubuntu2", + "/noble/libpcre2-8-0:amd64=10.42-4ubuntu2", + "/noble/libc6:amd64=2.39-0ubuntu8", + "/noble/libgcc-s1:amd64=14-20240412-0ubuntu1", + "/noble/gcc-14-base:amd64=14-20240412-0ubuntu1", + "/noble/libacl1:amd64=2.3.2-1build1" + ], + "dep_filemaps": [ + "@@rules_distroless++apt+noble_libselinux1-amd64_3.5-2ubuntu2_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libpcre2-8-0-amd64_10.42-4ubuntu2_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libc6-amd64_2.39-0ubuntu8_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libgcc-s1-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_gcc-14-base-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libacl1-amd64_2.3.2-1build1_filemap//:filemap.json" + ], + "package_name": "sed" + } + }, + "noble_libselinux1-amd64_3.5-2ubuntu2_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_libselinux1-amd64_3.5-2ubuntu2": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_libselinux1-amd64_3.5-2ubuntu2", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/libs/libselinux/libselinux1_3.5-2ubuntu2_amd64.deb" + ], + "sha256": "c0fe6dfac61d458f3e65c4a2bf6a920030a97d2429e33d0b405a8c4a63ef2864", + "mergedusr": false, + "depends_on": [ + "/noble/libpcre2-8-0:amd64=10.42-4ubuntu2", + "/noble/libc6:amd64=2.39-0ubuntu8", + "/noble/libgcc-s1:amd64=14-20240412-0ubuntu1", + "/noble/gcc-14-base:amd64=14-20240412-0ubuntu1" + ], + "dep_filemaps": [ + "@@rules_distroless++apt+noble_libpcre2-8-0-amd64_10.42-4ubuntu2_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libc6-amd64_2.39-0ubuntu8_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libgcc-s1-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_gcc-14-base-amd64_14-20240412-0ubuntu1_filemap//:filemap.json" + ], + "package_name": "libselinux1" + } + }, + "noble_libpcre2-8-0-amd64_10.42-4ubuntu2_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_libpcre2-8-0-amd64_10.42-4ubuntu2": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_libpcre2-8-0-amd64_10.42-4ubuntu2", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/p/pcre2/libpcre2-8-0_10.42-4ubuntu2_amd64.deb" + ], + "sha256": "bb38c38adb4ef548f2851b5cf7f70bbdbcb27d582c17550aa053edb9e4098d84", + "mergedusr": false, + "depends_on": [ + "/noble/libc6:amd64=2.39-0ubuntu8", + "/noble/libgcc-s1:amd64=14-20240412-0ubuntu1", + "/noble/gcc-14-base:amd64=14-20240412-0ubuntu1" + ], + "dep_filemaps": [ + "@@rules_distroless++apt+noble_libc6-amd64_2.39-0ubuntu8_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libgcc-s1-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_gcc-14-base-amd64_14-20240412-0ubuntu1_filemap//:filemap.json" + ], + "package_name": "libpcre2-8-0" + } + }, + "noble_libc6-amd64_2.39-0ubuntu8_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_libc6-amd64_2.39-0ubuntu8": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_libc6-amd64_2.39-0ubuntu8", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/g/glibc/libc6_2.39-0ubuntu8_amd64.deb" + ], + "sha256": "af36c7ac770770fe3d3c10e85d6bc538e76e57570ba7db7d397fb9f654783ef3", + "mergedusr": false, + "depends_on": [ + "/noble/libgcc-s1:amd64=14-20240412-0ubuntu1", + "/noble/gcc-14-base:amd64=14-20240412-0ubuntu1" + ], + "dep_filemaps": [ + "@@rules_distroless++apt+noble_libgcc-s1-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_gcc-14-base-amd64_14-20240412-0ubuntu1_filemap//:filemap.json" + ], + "package_name": "libc6" + } + }, + "noble_libgcc-s1-amd64_14-20240412-0ubuntu1_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_libgcc-s1-amd64_14-20240412-0ubuntu1": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_libgcc-s1-amd64_14-20240412-0ubuntu1", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/g/gcc-14/libgcc-s1_14-20240412-0ubuntu1_amd64.deb" + ], + "sha256": "a39efdcaa2245f026dc3254ce14fcff255fc430a17064632b6ba7c5da974a912", + "mergedusr": false, + "depends_on": [ + "/noble/libc6:amd64=2.39-0ubuntu8", + "/noble/gcc-14-base:amd64=14-20240412-0ubuntu1" + ], + "dep_filemaps": [ + "@@rules_distroless++apt+noble_libc6-amd64_2.39-0ubuntu8_filemap//:filemap.json", + "@@rules_distroless++apt+noble_gcc-14-base-amd64_14-20240412-0ubuntu1_filemap//:filemap.json" + ], + "package_name": "libgcc-s1" + } + }, + "noble_gcc-14-base-amd64_14-20240412-0ubuntu1_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_gcc-14-base-amd64_14-20240412-0ubuntu1": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_gcc-14-base-amd64_14-20240412-0ubuntu1", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/g/gcc-14/gcc-14-base_14-20240412-0ubuntu1_amd64.deb" + ], + "sha256": "bc5a682c694a1ce5af50772b7c737a21e9a74f0f0edaae98e97bc9c4af583fef", + "mergedusr": false, + "depends_on": [], + "dep_filemaps": [], + "package_name": "gcc-14-base" + } + }, + "noble_libacl1-amd64_2.3.2-1build1_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_libacl1-amd64_2.3.2-1build1": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_libacl1-amd64_2.3.2-1build1", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/a/acl/libacl1_2.3.2-1build1_amd64.deb" + ], + "sha256": "892dd9edaded972367e19713e5b0a3144409d9ef6613da5b7734a56f8e8f582b", + "mergedusr": false, + "depends_on": [ + "/noble/libc6:amd64=2.39-0ubuntu8", + "/noble/libgcc-s1:amd64=14-20240412-0ubuntu1", + "/noble/gcc-14-base:amd64=14-20240412-0ubuntu1" + ], + "dep_filemaps": [ + "@@rules_distroless++apt+noble_libc6-amd64_2.39-0ubuntu8_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libgcc-s1-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_gcc-14-base-amd64_14-20240412-0ubuntu1_filemap//:filemap.json" + ], + "package_name": "libacl1" + } + }, + "noble_openssl-amd64_3.0.13-0ubuntu3_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_openssl-amd64_3.0.13-0ubuntu3": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_openssl-amd64_3.0.13-0ubuntu3", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/o/openssl/openssl_3.0.13-0ubuntu3_amd64.deb" + ], + "sha256": "9c79333ab21bce0fb8dd92304cd76b3b1c427b0f2fedc897257fb5cced37c39e", + "mergedusr": false, + "depends_on": [ + "/noble/libssl3t64:amd64=3.0.13-0ubuntu3", + "/noble/libc6:amd64=2.39-0ubuntu8", + "/noble/libgcc-s1:amd64=14-20240412-0ubuntu1", + "/noble/gcc-14-base:amd64=14-20240412-0ubuntu1" + ], + "dep_filemaps": [ + "@@rules_distroless++apt+noble_libssl3t64-amd64_3.0.13-0ubuntu3_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libc6-amd64_2.39-0ubuntu8_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libgcc-s1-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_gcc-14-base-amd64_14-20240412-0ubuntu1_filemap//:filemap.json" + ], + "package_name": "openssl" + } + }, + "noble_libssl3t64-amd64_3.0.13-0ubuntu3_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_libssl3t64-amd64_3.0.13-0ubuntu3": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_libssl3t64-amd64_3.0.13-0ubuntu3", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/o/openssl/libssl3t64_3.0.13-0ubuntu3_amd64.deb" + ], + "sha256": "6cde53feabd28f26586a4db2ffb9fc84e7b0598aee15b33bee907b6392a92d24", + "mergedusr": false, + "depends_on": [ + "/noble/libc6:amd64=2.39-0ubuntu8", + "/noble/libgcc-s1:amd64=14-20240412-0ubuntu1", + "/noble/gcc-14-base:amd64=14-20240412-0ubuntu1" + ], + "dep_filemaps": [ + "@@rules_distroless++apt+noble_libc6-amd64_2.39-0ubuntu8_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libgcc-s1-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_gcc-14-base-amd64_14-20240412-0ubuntu1_filemap//:filemap.json" + ], + "package_name": "libssl3t64" + } + }, + "noble_netbase-amd64_6.4_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_netbase-amd64_6.4": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_netbase-amd64_6.4", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/n/netbase/netbase_6.4_all.deb" + ], + "sha256": "8cdbc9c3dca01e660759bf9d840f72e45ac72faf5d19ca1faecacaf6a60c1a87", + "mergedusr": false, + "depends_on": [], + "dep_filemaps": [], + "package_name": "netbase" + } + }, + "noble_libstdc--6-amd64_14-20240412-0ubuntu1_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_libstdc--6-amd64_14-20240412-0ubuntu1": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_libstdc--6-amd64_14-20240412-0ubuntu1", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/g/gcc-14/libstdc++6_14-20240412-0ubuntu1_amd64.deb" + ], + "sha256": "4863e880d6ee538e4734c430c5579c1ac933b88a42c25bc9980d0f148c54b21e", + "mergedusr": false, + "depends_on": [ + "/noble/libgcc-s1:amd64=14-20240412-0ubuntu1", + "/noble/libc6:amd64=2.39-0ubuntu8", + "/noble/gcc-14-base:amd64=14-20240412-0ubuntu1" + ], + "dep_filemaps": [ + "@@rules_distroless++apt+noble_libgcc-s1-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libc6-amd64_2.39-0ubuntu8_filemap//:filemap.json", + "@@rules_distroless++apt+noble_gcc-14-base-amd64_14-20240412-0ubuntu1_filemap//:filemap.json" + ], + "package_name": "libstdc++6" + } + }, + "noble_grep-amd64_3.11-4build1_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_grep-amd64_3.11-4build1": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_grep-amd64_3.11-4build1", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/g/grep/grep_3.11-4build1_amd64.deb" + ], + "sha256": "fc0fdc5983ea3d3579ccf335e51dec69684a0dd9bb915734999c5733add9507a", + "mergedusr": false, + "depends_on": [ + "/noble/libpcre2-8-0:amd64=10.42-4ubuntu2", + "/noble/libc6:amd64=2.39-0ubuntu8", + "/noble/libgcc-s1:amd64=14-20240412-0ubuntu1", + "/noble/gcc-14-base:amd64=14-20240412-0ubuntu1" + ], + "dep_filemaps": [ + "@@rules_distroless++apt+noble_libpcre2-8-0-amd64_10.42-4ubuntu2_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libc6-amd64_2.39-0ubuntu8_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libgcc-s1-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_gcc-14-base-amd64_14-20240412-0ubuntu1_filemap//:filemap.json" + ], + "package_name": "grep" + } + }, + "noble_gawk-amd64_1-5.2.1-2build3_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_gawk-amd64_1-5.2.1-2build3": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_gawk-amd64_1-5.2.1-2build3", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/g/gawk/gawk_5.2.1-2build3_amd64.deb" + ], + "sha256": "4b662062e90f62ece26ca7adfcd3a33207c7862f3dc77b8df515b5680ee00ca9", + "mergedusr": false, + "depends_on": [ + "/noble/libsigsegv2:amd64=2.14-1ubuntu2", + "/noble/libc6:amd64=2.39-0ubuntu8", + "/noble/libgcc-s1:amd64=14-20240412-0ubuntu1", + "/noble/gcc-14-base:amd64=14-20240412-0ubuntu1", + "/noble/libreadline8t64:amd64=8.2-4build1", + "/noble/libtinfo6:amd64=6.4+20240113-1ubuntu2", + "/noble/readline-common:amd64=8.2-4build1", + "/noble/libmpfr6:amd64=4.2.1-1build1", + "/noble/libgmp10:amd64=2:6.3.0+dfsg-2ubuntu6" + ], + "dep_filemaps": [ + "@@rules_distroless++apt+noble_libsigsegv2-amd64_2.14-1ubuntu2_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libc6-amd64_2.39-0ubuntu8_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libgcc-s1-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_gcc-14-base-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libreadline8t64-amd64_8.2-4build1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libtinfo6-amd64_6.4-20240113-1ubuntu2_filemap//:filemap.json", + "@@rules_distroless++apt+noble_readline-common-amd64_8.2-4build1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libmpfr6-amd64_4.2.1-1build1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libgmp10-amd64_2-6.3.0-dfsg-2ubuntu6_filemap//:filemap.json" + ], + "package_name": "gawk" + } + }, + "noble_libsigsegv2-amd64_2.14-1ubuntu2_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_libsigsegv2-amd64_2.14-1ubuntu2": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_libsigsegv2-amd64_2.14-1ubuntu2", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/libs/libsigsegv/libsigsegv2_2.14-1ubuntu2_amd64.deb" + ], + "sha256": "889f338bea4ebfd999939d946da4ac0a45668264a5aae78e023feeb0529505b8", + "mergedusr": false, + "depends_on": [ + "/noble/libc6:amd64=2.39-0ubuntu8", + "/noble/libgcc-s1:amd64=14-20240412-0ubuntu1", + "/noble/gcc-14-base:amd64=14-20240412-0ubuntu1" + ], + "dep_filemaps": [ + "@@rules_distroless++apt+noble_libc6-amd64_2.39-0ubuntu8_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libgcc-s1-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_gcc-14-base-amd64_14-20240412-0ubuntu1_filemap//:filemap.json" + ], + "package_name": "libsigsegv2" + } + }, + "noble_libreadline8t64-amd64_8.2-4build1_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_libreadline8t64-amd64_8.2-4build1": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_libreadline8t64-amd64_8.2-4build1", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/r/readline/libreadline8t64_8.2-4build1_amd64.deb" + ], + "sha256": "563977a16df03b611f5239cc1e9a0426e86479fcc616b5c9e200ea32063119e5", + "mergedusr": false, + "depends_on": [ + "/noble/libtinfo6:amd64=6.4+20240113-1ubuntu2", + "/noble/libc6:amd64=2.39-0ubuntu8", + "/noble/libgcc-s1:amd64=14-20240412-0ubuntu1", + "/noble/gcc-14-base:amd64=14-20240412-0ubuntu1", + "/noble/readline-common:amd64=8.2-4build1" + ], + "dep_filemaps": [ + "@@rules_distroless++apt+noble_libtinfo6-amd64_6.4-20240113-1ubuntu2_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libc6-amd64_2.39-0ubuntu8_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libgcc-s1-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_gcc-14-base-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_readline-common-amd64_8.2-4build1_filemap//:filemap.json" + ], + "package_name": "libreadline8t64" + } + }, + "noble_libtinfo6-amd64_6.4-20240113-1ubuntu2_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_libtinfo6-amd64_6.4-20240113-1ubuntu2": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_libtinfo6-amd64_6.4-20240113-1ubuntu2", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/n/ncurses/libtinfo6_6.4+20240113-1ubuntu2_amd64.deb" + ], + "sha256": "53e1e1753729d04cf65b05e6e58abe06e2bb76cc07eff0e1b2a638a638ca209b", + "mergedusr": false, + "depends_on": [ + "/noble/libc6:amd64=2.39-0ubuntu8", + "/noble/libgcc-s1:amd64=14-20240412-0ubuntu1", + "/noble/gcc-14-base:amd64=14-20240412-0ubuntu1" + ], + "dep_filemaps": [ + "@@rules_distroless++apt+noble_libc6-amd64_2.39-0ubuntu8_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libgcc-s1-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_gcc-14-base-amd64_14-20240412-0ubuntu1_filemap//:filemap.json" + ], + "package_name": "libtinfo6" + } + }, + "noble_readline-common-amd64_8.2-4build1_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_readline-common-amd64_8.2-4build1": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_readline-common-amd64_8.2-4build1", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/r/readline/readline-common_8.2-4build1_all.deb" + ], + "sha256": "879bfd7f8a9bc4c0f7cdc777cdd8bc6de5f8c4a2ac80c060322a1b22f13504bb", + "mergedusr": false, + "depends_on": [], + "dep_filemaps": [], + "package_name": "readline-common" + } + }, + "noble_libmpfr6-amd64_4.2.1-1build1_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_libmpfr6-amd64_4.2.1-1build1": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_libmpfr6-amd64_4.2.1-1build1", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/m/mpfr4/libmpfr6_4.2.1-1build1_amd64.deb" + ], + "sha256": "a25c2f5f123829ab144f31ddb22f4363b7206eb21bf821bfbecca5753ccfc6be", + "mergedusr": false, + "depends_on": [ + "/noble/libgmp10:amd64=2:6.3.0+dfsg-2ubuntu6", + "/noble/libc6:amd64=2.39-0ubuntu8", + "/noble/libgcc-s1:amd64=14-20240412-0ubuntu1", + "/noble/gcc-14-base:amd64=14-20240412-0ubuntu1" + ], + "dep_filemaps": [ + "@@rules_distroless++apt+noble_libgmp10-amd64_2-6.3.0-dfsg-2ubuntu6_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libc6-amd64_2.39-0ubuntu8_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libgcc-s1-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_gcc-14-base-amd64_14-20240412-0ubuntu1_filemap//:filemap.json" + ], + "package_name": "libmpfr6" + } + }, + "noble_libgmp10-amd64_2-6.3.0-dfsg-2ubuntu6_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_libgmp10-amd64_2-6.3.0-dfsg-2ubuntu6": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_libgmp10-amd64_2-6.3.0-dfsg-2ubuntu6", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/g/gmp/libgmp10_6.3.0+dfsg-2ubuntu6_amd64.deb" + ], + "sha256": "649a5ee5f74f0aa1e1b9c4f169eabbae56a79aa5aac51ef733eb9e18700bd8fc", + "mergedusr": false, + "depends_on": [ + "/noble/libc6:amd64=2.39-0ubuntu8", + "/noble/libgcc-s1:amd64=14-20240412-0ubuntu1", + "/noble/gcc-14-base:amd64=14-20240412-0ubuntu1" + ], + "dep_filemaps": [ + "@@rules_distroless++apt+noble_libc6-amd64_2.39-0ubuntu8_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libgcc-s1-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_gcc-14-base-amd64_14-20240412-0ubuntu1_filemap//:filemap.json" + ], + "package_name": "libgmp10" + } + }, + "noble_coreutils-amd64_9.4-3ubuntu6_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_coreutils-amd64_9.4-3ubuntu6": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_coreutils-amd64_9.4-3ubuntu6", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/c/coreutils/coreutils_9.4-3ubuntu6_amd64.deb" + ], + "sha256": "0d19c3e94f04ff1aafde46701fe1783da0a068a4904adc3794c30140f1aaeb8f", + "mergedusr": false, + "depends_on": [ + "/noble/libssl3t64:amd64=3.0.13-0ubuntu3", + "/noble/libc6:amd64=2.39-0ubuntu8", + "/noble/libgcc-s1:amd64=14-20240412-0ubuntu1", + "/noble/gcc-14-base:amd64=14-20240412-0ubuntu1", + "/noble/libselinux1:amd64=3.5-2ubuntu2", + "/noble/libpcre2-8-0:amd64=10.42-4ubuntu2", + "/noble/libgmp10:amd64=2:6.3.0+dfsg-2ubuntu6", + "/noble/libattr1:amd64=1:2.5.2-1build1", + "/noble/libacl1:amd64=2.3.2-1build1" + ], + "dep_filemaps": [ + "@@rules_distroless++apt+noble_libssl3t64-amd64_3.0.13-0ubuntu3_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libc6-amd64_2.39-0ubuntu8_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libgcc-s1-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_gcc-14-base-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libselinux1-amd64_3.5-2ubuntu2_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libpcre2-8-0-amd64_10.42-4ubuntu2_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libgmp10-amd64_2-6.3.0-dfsg-2ubuntu6_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libattr1-amd64_1-2.5.2-1build1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libacl1-amd64_2.3.2-1build1_filemap//:filemap.json" + ], + "package_name": "coreutils" + } + }, + "noble_libattr1-amd64_1-2.5.2-1build1_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_libattr1-amd64_1-2.5.2-1build1": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_libattr1-amd64_1-2.5.2-1build1", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/a/attr/libattr1_2.5.2-1build1_amd64.deb" + ], + "sha256": "204e45dde86d1cf762114bd91fdab9d820de08e3da8216c7b25382924a96aa9f", + "mergedusr": false, + "depends_on": [ + "/noble/libc6:amd64=2.39-0ubuntu8", + "/noble/libgcc-s1:amd64=14-20240412-0ubuntu1", + "/noble/gcc-14-base:amd64=14-20240412-0ubuntu1" + ], + "dep_filemaps": [ + "@@rules_distroless++apt+noble_libc6-amd64_2.39-0ubuntu8_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libgcc-s1-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_gcc-14-base-amd64_14-20240412-0ubuntu1_filemap//:filemap.json" + ], + "package_name": "libattr1" + } + }, + "noble_ca-certificates-amd64_20240203_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_ca-certificates-amd64_20240203": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_ca-certificates-amd64_20240203", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/c/ca-certificates/ca-certificates_20240203_all.deb" + ], + "sha256": "641de77d8f142cfd62a1a6f964ba67b20754d3337c480efb529d086075a06c9a", + "mergedusr": false, + "depends_on": [ + "/noble/debconf:amd64=1.5.86ubuntu1", + "/noble/openssl:amd64=3.0.13-0ubuntu3", + "/noble/libssl3t64:amd64=3.0.13-0ubuntu3", + "/noble/libc6:amd64=2.39-0ubuntu8", + "/noble/libgcc-s1:amd64=14-20240412-0ubuntu1", + "/noble/gcc-14-base:amd64=14-20240412-0ubuntu1" + ], + "dep_filemaps": [ + "@@rules_distroless++apt+noble_debconf-amd64_1.5.86ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_openssl-amd64_3.0.13-0ubuntu3_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libssl3t64-amd64_3.0.13-0ubuntu3_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libc6-amd64_2.39-0ubuntu8_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libgcc-s1-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_gcc-14-base-amd64_14-20240412-0ubuntu1_filemap//:filemap.json" + ], + "package_name": "ca-certificates" + } + }, + "noble_bash-amd64_5.2.21-2ubuntu4_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_bash-amd64_5.2.21-2ubuntu4": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_bash-amd64_5.2.21-2ubuntu4", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/b/bash/bash_5.2.21-2ubuntu4_amd64.deb" + ], + "sha256": "73de311a21e094e29ac01527d2b52226cc87fde0a5b57032902251b426d92c66", + "mergedusr": false, + "depends_on": [ + "/noble/debianutils:amd64=5.17build1", + "/noble/libc6:amd64=2.39-0ubuntu8", + "/noble/libgcc-s1:amd64=14-20240412-0ubuntu1", + "/noble/gcc-14-base:amd64=14-20240412-0ubuntu1", + "/noble/base-files:amd64=13ubuntu10", + "/noble/libcrypt1:amd64=1:4.4.36-4build1", + "/noble/mawk:amd64=1.3.4.20240123-1build1", + "/noble/libtinfo6:amd64=6.4+20240113-1ubuntu2" + ], + "dep_filemaps": [ + "@@rules_distroless++apt+noble_debianutils-amd64_5.17build1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libc6-amd64_2.39-0ubuntu8_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libgcc-s1-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_gcc-14-base-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_base-files-amd64_13ubuntu10_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libcrypt1-amd64_1-4.4.36-4build1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_mawk-amd64_1.3.4.20240123-1build1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libtinfo6-amd64_6.4-20240113-1ubuntu2_filemap//:filemap.json" + ], + "package_name": "bash" + } + }, + "noble_debianutils-amd64_5.17build1_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_debianutils-amd64_5.17build1": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_debianutils-amd64_5.17build1", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/d/debianutils/debianutils_5.17build1_amd64.deb" + ], + "sha256": "1047a9a57018e18531f76e5b00e226a68554b6f1d147f2a5c1b32518c7b20636", + "mergedusr": false, + "depends_on": [ + "/noble/libc6:amd64=2.39-0ubuntu8", + "/noble/libgcc-s1:amd64=14-20240412-0ubuntu1", + "/noble/gcc-14-base:amd64=14-20240412-0ubuntu1" + ], + "dep_filemaps": [ + "@@rules_distroless++apt+noble_libc6-amd64_2.39-0ubuntu8_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libgcc-s1-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_gcc-14-base-amd64_14-20240412-0ubuntu1_filemap//:filemap.json" + ], + "package_name": "debianutils" + } + }, + "noble_base-files-amd64_13ubuntu10_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_base-files-amd64_13ubuntu10": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_base-files-amd64_13ubuntu10", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/b/base-files/base-files_13ubuntu10_amd64.deb" + ], + "sha256": "cd06729c776397bb74779773f4dece372a1a3f795e5992804022bffab0278ffb", + "mergedusr": false, + "depends_on": [ + "/noble/libcrypt1:amd64=1:4.4.36-4build1", + "/noble/libc6:amd64=2.39-0ubuntu8", + "/noble/libgcc-s1:amd64=14-20240412-0ubuntu1", + "/noble/gcc-14-base:amd64=14-20240412-0ubuntu1", + "/noble/mawk:amd64=1.3.4.20240123-1build1" + ], + "dep_filemaps": [ + "@@rules_distroless++apt+noble_libcrypt1-amd64_1-4.4.36-4build1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libc6-amd64_2.39-0ubuntu8_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libgcc-s1-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_gcc-14-base-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_mawk-amd64_1.3.4.20240123-1build1_filemap//:filemap.json" + ], + "package_name": "base-files" + } + }, + "noble_libcrypt1-amd64_1-4.4.36-4build1_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_libcrypt1-amd64_1-4.4.36-4build1": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_libcrypt1-amd64_1-4.4.36-4build1", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/libx/libxcrypt/libcrypt1_4.4.36-4build1_amd64.deb" + ], + "sha256": "9474785cd6f398512bf8c305c3901dbb111569dccb6f5832002373c0a8ac5832", + "mergedusr": false, + "depends_on": [ + "/noble/libc6:amd64=2.39-0ubuntu8", + "/noble/libgcc-s1:amd64=14-20240412-0ubuntu1", + "/noble/gcc-14-base:amd64=14-20240412-0ubuntu1" + ], + "dep_filemaps": [ + "@@rules_distroless++apt+noble_libc6-amd64_2.39-0ubuntu8_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libgcc-s1-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_gcc-14-base-amd64_14-20240412-0ubuntu1_filemap//:filemap.json" + ], + "package_name": "libcrypt1" + } + }, + "noble_mawk-amd64_1.3.4.20240123-1build1_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_mawk-amd64_1.3.4.20240123-1build1": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_mawk-amd64_1.3.4.20240123-1build1", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/m/mawk/mawk_1.3.4.20240123-1build1_amd64.deb" + ], + "sha256": "dc7f7f4dad4b48f6012ea65de3198d8376604afef39f06d65ec6167740e203c9", + "mergedusr": false, + "depends_on": [ + "/noble/libc6:amd64=2.39-0ubuntu8", + "/noble/libgcc-s1:amd64=14-20240412-0ubuntu1", + "/noble/gcc-14-base:amd64=14-20240412-0ubuntu1" + ], + "dep_filemaps": [ + "@@rules_distroless++apt+noble_libc6-amd64_2.39-0ubuntu8_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libgcc-s1-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_gcc-14-base-amd64_14-20240412-0ubuntu1_filemap//:filemap.json" + ], + "package_name": "mawk" + } + } + }, + "moduleExtensionMetadata": { + "useAllRepos": "NO", + "reproducible": false + } + } + }, + "@@rules_kotlin+//src/main/starlark/core/repositories:bzlmod_setup.bzl%rules_kotlin_extensions": { + "general": { + "bzlTransitiveDigest": "+Kp6j204mBZ3mxlIDDR0gBoP45BZ4jYRhRAcB8sU0qc=", + "usagesDigest": "QI2z8ZUR+mqtbwsf2fLqYdJAkPOHdOV+tF2yVAUgRzw=", + "recordedInputs": [ + "REPO_MAPPING:rules_kotlin+,bazel_tools bazel_tools" + ], + "generatedRepoSpecs": { + "com_github_jetbrains_kotlin_git": { + "repoRuleId": "@@rules_kotlin+//src/main/starlark/core/repositories:compiler.bzl%kotlin_compiler_git_repository", + "attributes": { + "urls": [ + "https://github.com/JetBrains/kotlin/releases/download/v1.9.23/kotlin-compiler-1.9.23.zip" + ], + "sha256": "93137d3aab9afa9b27cb06a824c2324195c6b6f6179d8a8653f440f5bd58be88" + } + }, + "com_github_jetbrains_kotlin": { + "repoRuleId": "@@rules_kotlin+//src/main/starlark/core/repositories:compiler.bzl%kotlin_capabilities_repository", + "attributes": { + "git_repository_name": "com_github_jetbrains_kotlin_git", + "compiler_version": "1.9.23" + } + }, + "com_github_google_ksp": { + "repoRuleId": "@@rules_kotlin+//src/main/starlark/core/repositories:ksp.bzl%ksp_compiler_plugin_repository", + "attributes": { + "urls": [ + "https://github.com/google/ksp/releases/download/1.9.23-1.0.20/artifacts.zip" + ], + "sha256": "ee0618755913ef7fd6511288a232e8fad24838b9af6ea73972a76e81053c8c2d", + "strip_version": "1.9.23-1.0.20" + } + }, + "com_github_pinterest_ktlint": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_file", + "attributes": { + "sha256": "01b2e0ef893383a50dbeb13970fe7fa3be36ca3e83259e01649945b09d736985", + "urls": [ + "https://github.com/pinterest/ktlint/releases/download/1.3.0/ktlint" + ], + "executable": true + } + }, + "rules_android": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "sha256": "cd06d15dd8bb59926e4d65f9003bfc20f9da4b2519985c27e190cddc8b7a7806", + "strip_prefix": "rules_android-0.1.1", + "urls": [ + "https://github.com/bazelbuild/rules_android/archive/v0.1.1.zip" + ] + } + } + } + } + }, + "@@rules_python+//python/uv:uv.bzl%uv": { + "general": { + "bzlTransitiveDigest": "yG9F6L2IZXKRbD/aIUa6sU7uITLUTBKOMWPbIvl1VdM=", + "usagesDigest": "6MjoD3H+netDdhklgMWks3NARpHVXxy8kfsMe9XXPa8=", + "recordedInputs": [ + "REPO_MAPPING:rules_python+,bazel_tools bazel_tools", + "REPO_MAPPING:rules_python+,platforms platforms" + ], + "generatedRepoSpecs": { + "uv": { + "repoRuleId": "@@rules_python+//python/uv/private:uv_toolchains_repo.bzl%uv_toolchains_repo", + "attributes": { + "toolchain_type": "'@@rules_python+//python/uv:uv_toolchain_type'", + "toolchain_names": [ + "none" + ], + "toolchain_implementations": { + "none": "'@@rules_python+//python:none'" + }, + "toolchain_compatible_with": { + "none": [ + "@platforms//:incompatible" + ] + }, + "toolchain_target_settings": {} + } + } + } + } + }, + "@@yq.bzl+//yq:extensions.bzl%yq": { + "general": { + "bzlTransitiveDigest": "61Uz+o5PnlY0jJfPZEUNqsKxnM/UCLeWsn5VVCc8u5Y=", + "usagesDigest": "oAQ5Hp6H1wlr4abmhh+iBqk43oSfdXw+++tKd5PKWHE=", + "recordedInputs": [], + "generatedRepoSpecs": { + "yq_darwin_amd64": { + "repoRuleId": "@@yq.bzl+//yq/toolchain:platforms.bzl%yq_platform_repo", + "attributes": { + "platform": "darwin_amd64", + "version": "4.45.1" + } + }, + "yq_darwin_arm64": { + "repoRuleId": "@@yq.bzl+//yq/toolchain:platforms.bzl%yq_platform_repo", + "attributes": { + "platform": "darwin_arm64", + "version": "4.45.1" + } + }, + "yq_linux_amd64": { + "repoRuleId": "@@yq.bzl+//yq/toolchain:platforms.bzl%yq_platform_repo", + "attributes": { + "platform": "linux_amd64", + "version": "4.45.1" + } + }, + "yq_linux_arm64": { + "repoRuleId": "@@yq.bzl+//yq/toolchain:platforms.bzl%yq_platform_repo", + "attributes": { + "platform": "linux_arm64", + "version": "4.45.1" + } + }, + "yq_linux_s390x": { + "repoRuleId": "@@yq.bzl+//yq/toolchain:platforms.bzl%yq_platform_repo", + "attributes": { + "platform": "linux_s390x", + "version": "4.45.1" + } + }, + "yq_linux_riscv64": { + "repoRuleId": "@@yq.bzl+//yq/toolchain:platforms.bzl%yq_platform_repo", + "attributes": { + "platform": "linux_riscv64", + "version": "4.45.1" + } + }, + "yq_linux_ppc64le": { + "repoRuleId": "@@yq.bzl+//yq/toolchain:platforms.bzl%yq_platform_repo", + "attributes": { + "platform": "linux_ppc64le", + "version": "4.45.1" + } + }, + "yq_windows_amd64": { + "repoRuleId": "@@yq.bzl+//yq/toolchain:platforms.bzl%yq_platform_repo", + "attributes": { + "platform": "windows_amd64", + "version": "4.45.1" + } + }, + "yq_toolchains": { + "repoRuleId": "@@yq.bzl+//yq/toolchain:toolchain.bzl%yq_toolchains_repo", + "attributes": { + "user_repository_name": "yq" + } + } + } + } + } + }, + "facts": { + "@@aspect_rules_py+//py:extensions.bzl%python_interpreters": { + "release_index_v1_20241002_https://github.com/astral-sh/python-build-standalone/releases/download": { + "3.10/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.10.15+20241002-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.10.15", + "sha256": "bcfdf8235cd4f84ca280f33a17030e65ba23e7905e70a8ed2ed2c83229ad136f" + }, + "3.10/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.10.15+20241002-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.10.15", + "sha256": "2e364a47cdbfcfaf56122b7656a3e8a7163babbda4f6bb6165aa644cbc65bd57" + }, + "3.10/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.10.15+20241002-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.10.15", + "sha256": "814561a8addee5f56a19223ecdd879a22b82d631bd5704eac7b2e98287e797a8" + }, + "3.10/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.10.15+20241002-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.10.15", + "sha256": "35678c2ba6d7aff56ca96f06ca735fe4bd09e4a5d3d40f552d76a1653c80a123" + }, + "3.10/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.10.15+20241002-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.10.15", + "sha256": "422fb92c310f030b05ca8e59a256c72ffde38f03382a006284d9e5e2a7b646f5" + }, + "3.10/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.10.15+20241002-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.10.15", + "sha256": "f17cba68a55dcd386be4cbb0002cf3037718019fc1585b2ff9a32efd3283557d" + }, + "3.10/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.10.15+20241002-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.10.15", + "sha256": "7b2baf761282600359d43e6f14b01437a8d0e517ba3a28f50688806dd8897b11" + }, + "3.11/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.11.10+20241002-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.11.10", + "sha256": "540225743ca9ca04d7e0de520e211ecafb379677c49fba4b89334e7248219cb2" + }, + "3.11/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.11.10+20241002-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.11.10", + "sha256": "047e687b561f8e38740819cc3e112e83ae349927cca846921a1c301e5d9cc873" + }, + "3.11/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.11.10+20241002-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.11.10", + "sha256": "d9e75d5028c8975c158f4b9c01ef820480249b3401dbde755c0f344e15feebf5" + }, + "3.11/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.11.10+20241002-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.11.10", + "sha256": "f498693f03fd672a4dc581ef0e1101102d33964352c35ecff21686a8d00744c9" + }, + "3.11/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.11.10+20241002-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.11.10", + "sha256": "d71cde066b614903e9f243c4babd179e7e978fcfa95702355566463e623abe6c" + }, + "3.11/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.11.10+20241002-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.11.10", + "sha256": "9c0197e72b2dd1ebf56eb562cb7a078052b4ab71d5666cd3be3b6e75db42c79e" + }, + "3.11/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.11.10+20241002-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.11.10", + "sha256": "fb86dce628d2008eefd3550193839fb9f283f5f6c25a09c8b676713ff4757156" + }, + "3.12/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.12.7+20241002-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.12.7", + "sha256": "5a9cdbb8536839a83edae3e41eb44161b640d78181fec083e07c668ba796a875" + }, + "3.12/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.12.7+20241002-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.12.7", + "sha256": "5481ca52e7ac8685c1e9d4e804a66e5c928879e0f44799aa6934735f66266643" + }, + "3.12/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.12.7+20241002-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.12.7", + "sha256": "8c62920e2fef022fc49d58cc999c77ea45318f96a5a5c0ba3bb155d33732d7f3" + }, + "3.12/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.12.7+20241002-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.12.7", + "sha256": "60eaf2c9a63926f5edfe7a0ecf4b2fbb37de6764f0c0100be245d098e3995da7" + }, + "3.12/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.12.7+20241002-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.12.7", + "sha256": "1c74dd0499ef7d993d8942ebe6692c90c50d09719e0335f8e210b91277f8e7c0" + }, + "3.12/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.12.7+20241002-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.12.7", + "sha256": "04ffccbbb1beedd0bc80347c061fe527833001681ee543c3ba85dac5134ed500" + }, + "3.12/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.12.7+20241002-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.12.7", + "sha256": "d4a8f2b3e422089475bcd6f2b855c9ed0e666af2de4f19df7c764362eb8c4aca" + }, + "3.13/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.13.0rc3+20241002-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.13.0rc3", + "sha256": "577e846eaf0a27342b3f80b5f292eb292b0eb6a9df3a0fa0c5925e86cfe046a3" + }, + "3.13/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.13.0rc3+20241002-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.13.0rc3", + "sha256": "48974ab9b4a6990b17e6740393492fc5557e6acc4ab02be9d9543e0e506e48a6" + }, + "3.13/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.13.0rc3+20241002-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.13.0rc3", + "sha256": "fa5e8195fa7a6b6d4df0bc92b36d38836b72c4f5fb41978d495abe5a454fed67" + }, + "3.13/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.13.0rc3+20241002-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.13.0rc3", + "sha256": "81a01923b25a4b2b68f517b07a4a4a9186d873e6518f060e4a004e77d7094687" + }, + "3.13/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.13.0rc3+20241002-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.13.0rc3", + "sha256": "319ecb727317868c4f3bfecd480f216b38275f5373f72c022d255318b650ebe2" + }, + "3.13/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.13.0rc3+20241002-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.13.0rc3", + "sha256": "a4b4e0a79b53938db050daf7f78dd09faf49d1e29dbba6cac87cf857c0a51fb4" + }, + "3.13/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.13.0rc3+20241002-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.13.0rc3", + "sha256": "56fac98fb5ed39f67cd7c0ce6e503a1e551ce727dc46796a0f16c09d26e845aa" + }, + "3.8/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.8.20+20241002-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.8.20", + "sha256": "2ddfc04bdb3e240f30fb782fa1deec6323799d0e857e0b63fa299218658fd3d4" + }, + "3.8/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.8.20+20241002-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.8.20", + "sha256": "9d8798f9e79e0fc0f36fcb95bfa28a1023407d51a8ea5944b4da711f1f75f1ed" + }, + "3.8/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.8.20+20241002-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.8.20", + "sha256": "06988218600fe3e2c02c3182d5629a1d4e596b3771ab32a9e99756c5904b5fac" + }, + "3.8/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.8.20+20241002-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.8.20", + "sha256": "68d060cd373255d2ca5b8b3441363d5aa7cc45b0c11bbccf52b1717c2b5aa8bb" + }, + "3.8/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.8.20+20241002-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.8.20", + "sha256": "41b6709fec9c56419b7de1940d1f87fa62045aff81734480672dcb807eedc47e" + }, + "3.8/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.8.20+20241002-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.8.20", + "sha256": "285e141c36f88b2e9357654c5f77d1f8fb29cc25132698fe35bb30d787f38e87" + }, + "3.8/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.8.20+20241002-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.8.20", + "sha256": "ea8d7f9dd35815cf88f5ed257b5d0206d97df5a9500f719b6a6031b8c7071db8" + }, + "3.9/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.9.20+20241002-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.9.20", + "sha256": "dc5f3b4c54deea7a42479b3f81b1c1b3a330f721aea3aff7df9833567bbfa8ea" + }, + "3.9/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.9.20+20241002-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.9.20", + "sha256": "0d84fa0884e843828312a1fcbfd8756abe3d6cf3c27086f79cd7352bad13ac4c" + }, + "3.9/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.9.20+20241002-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.9.20", + "sha256": "bd2c7cf4d7eba224ada44dfbccf5248d313ba5072462c71aa753c824354704f3" + }, + "3.9/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.9.20+20241002-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.9.20", + "sha256": "a07be8fddd5f6f6a0db7abd16f2b2a8a94a891e54091e4f45b64e822597e4d7d" + }, + "3.9/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.9.20+20241002-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.9.20", + "sha256": "94000af8e9d9f5aba6d2325963a6b3403afbf310f6790edff3dfe8becd8197de" + }, + "3.9/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.9.20+20241002-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.9.20", + "sha256": "fec849569158e5e46610621d7da91b02dca2cc5f66dd49cc0f85d7469c8f5a84" + }, + "3.9/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.9.20+20241002-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.9.20", + "sha256": "31f5e329f14ac8b79527712c4265edfea1cb6dff4bb04cf8c51cd809290e136c" + } + }, + "release_index_v1_20251031_https://github.com/astral-sh/python-build-standalone/releases/download": { + "3.10/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.10.19+20251031-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.10.19", + "sha256": "43bda24c2fc073bc308bf631203b917a72640d59b59fdad4ba14503d84727012" + }, + "3.10/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.10.19+20251031-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.10.19", + "sha256": "f77a8a8aa77f3f943126fa9215a25309da4bf20398fc8f4b4eec54b5fc7570ef" + }, + "3.10/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.10.19+20251031-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.10.19", + "sha256": "9b9deba652d98857ae99bd11b05fb560144aafbd9b9e8e01c8c6d56577a06a4d" + }, + "3.10/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.10.19+20251031-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.10.19", + "sha256": "0240edca85508661e20bb69562686965c85b8328727332d9ebfd57cceb7fb372" + }, + "3.10/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.10.19+20251031-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.10.19", + "sha256": "76c12e633c09c2a790f8a958a55df4495527e0718d1875310c836e757c0c7b55" + }, + "3.10/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.10.19+20251031-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.10.19", + "sha256": "cfa08a4caf2df1b43551b843c052d6a8814e2ea0c97268b021f0423646c244c3" + }, + "3.10/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.10.19+20251031-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.10.19", + "sha256": "fb1caac917d7b6497bb6f5950da5f1e48d05c43a498948dd97f85760c4382d9f" + }, + "3.10/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.10.19+20251031-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.10.19", + "sha256": "ba85013ed5ac7733fc6840168cc33ed19e9959b363dc80227d54f8fd9c92c0f4" + }, + "3.11/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.11.14+20251031-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.11.14", + "sha256": "6de5572b33c65af1c9b7caf00ec593fb04cffb7e14fa393a98261bb9bc464713" + }, + "3.11/aarch64-pc-windows-msvc/install_only": { + "filename": "cpython-3.11.14+20251031-aarch64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.11.14", + "sha256": "38d0d1466561e15965e8d2c20f5e5be649598f55c761ecab553d087fbd217337" + }, + "3.11/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.11.14+20251031-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.11.14", + "sha256": "510edb027527413c4249256194cb8ad2590b52dd93f7123b4cb341aff5d05894" + }, + "3.11/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.11.14+20251031-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.11.14", + "sha256": "27609ec2b0c6172d5d9f502115a6d48c20ee0a578bf5b0470cd1090be95c22aa" + }, + "3.11/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.11.14+20251031-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.11.14", + "sha256": "b4341ef60bc157f992a0d171f1be4e4c42dcfc537f3562f72aa7f1f9561935e0" + }, + "3.11/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.11.14+20251031-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.11.14", + "sha256": "4891cbf34e8652b7bd1054b9502395e4b7e048e2e517c040fbf6c8297cb954d6" + }, + "3.11/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.11.14+20251031-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.11.14", + "sha256": "5223b83ed9e2aa5e9e17d2ebcf767956e998876339b9cde1980a47e9d4655fb6" + }, + "3.11/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.11.14+20251031-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.11.14", + "sha256": "60f0bd473d861cc45d3401d9914e47ccb9fa037f88a91879ed517a62042b8477" + }, + "3.11/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.11.14+20251031-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.11.14", + "sha256": "25e82d1e85b90a8ab724ee633a1811b1921797f5c25ee69c6595052371b91a87" + }, + "3.12/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.12.12+20251031-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.12.12", + "sha256": "5e110cb821d2eb8246065d3b46faa655180c976c4e17250f7883c634a629bc63" + }, + "3.12/aarch64-pc-windows-msvc/install_only": { + "filename": "cpython-3.12.12+20251031-aarch64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.12.12", + "sha256": "b190fed7c2b0f6e1010f554a0d1fd191c0754c4c0718e69d9d795ae559613780" + }, + "3.12/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.12.12+20251031-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.12.12", + "sha256": "81b644d166e0bfb918615af8a2363f8fcf26eccdcc60a5334b6a62c088470bac" + }, + "3.12/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.12.12+20251031-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.12.12", + "sha256": "fc423af42f4eb454c99779d9eedc619141606572da3851f7980a8da719f0f8db" + }, + "3.12/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.12.12+20251031-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.12.12", + "sha256": "7d333e58a53edb1ba3c85bb35dc718ea3e599d0f6b58a0cbef35b2d8184a763e" + }, + "3.12/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.12.12+20251031-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.12.12", + "sha256": "687052a046d33be49dc95dd671816709067cf6176ed36c93ea61b1fe0b883b0f" + }, + "3.12/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.12.12+20251031-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.12.12", + "sha256": "cff398b3f520c442a1b085dd347126c10c1b03f01ccc0decd8c897a687e893f1" + }, + "3.12/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.12.12+20251031-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.12.12", + "sha256": "80c3882f14e15cef8260ef5257d198e8f4371ca265887431d939e0d561de3253" + }, + "3.12/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.12.12+20251031-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.12.12", + "sha256": "0a461330b9b89f2ea3088dde10d7a3f96aa65897b7c5ce2404fa3b5c4b8daa14" + }, + "3.13/aarch64-apple-darwin/freethreaded": { + "filename": "cpython-3.13.9+20251031-aarch64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.13.9", + "sha256": "eae1272a72ccce601590a10a9ca2a58199b5fcdf022aa603a527e3e2a04de9bc" + }, + "3.13/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.13.9+20251031-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.13.9", + "sha256": "1f3568d17383426d52350c2ef7c93c1a5a043198b860cb05e5d19b35f9c25cef" + }, + "3.13/aarch64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.13.9+20251031-aarch64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.13.9", + "sha256": "743ff69935ef28834621647dab30f032dfcd80315732917531eea333210941c7" + }, + "3.13/aarch64-pc-windows-msvc/install_only": { + "filename": "cpython-3.13.9+20251031-aarch64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.13.9", + "sha256": "20db43873d3c4c2175d866806545e4ad4ec6bb72ca95e60082a4df6c24567e8c" + }, + "3.13/aarch64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.13.9+20251031-aarch64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.13.9", + "sha256": "a6e72f9de5d9b46cf6968d6a492f2401a919f9b959f8da2d87f43484b80169ee" + }, + "3.13/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.13.9+20251031-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.13.9", + "sha256": "0a56d11b0fb1662e67f892b9d5d1717aef06f24dbb8362bc25b8f784e620d44e" + }, + "3.13/aarch64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.13.9+20251031-aarch64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.13.9", + "sha256": "ba6a8d199c9f2a7aa5b88fdf16132049d675ab483eb6250e176a90fa0726eac4" + }, + "3.13/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.13.9+20251031-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.13.9", + "sha256": "90c803b66f8483caeeb5655ca82b7f19068515826a569ed05414326a6ff8d06d" + }, + "3.13/i686-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.13.9+20251031-i686-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.13.9", + "sha256": "a6cb3d7df191cde663ebf5f0108a9d7742e33862676ecde97fd90184333e822d" + }, + "3.13/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.13.9+20251031-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.13.9", + "sha256": "c0b0a34a492465bd44e9512582ae4ca47c06f9696807048cd917cb71c03a8416" + }, + "3.13/x86_64-apple-darwin/freethreaded": { + "filename": "cpython-3.13.9+20251031-x86_64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.13.9", + "sha256": "e2bf5fa6a3ef443ade362e08b0a19bbc172f7bfe34dabe933ccaad31d53af5da" + }, + "3.13/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.13.9+20251031-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.13.9", + "sha256": "48c0f3ca5d31e90658ef99138dc21865bb62f388ab97a1ce72cac176da194ab0" + }, + "3.13/x86_64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.13.9+20251031-x86_64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.13.9", + "sha256": "318a9a1e43dd52054327de3bccc0c5b7afde7b7f2a398ccb4d38e03d28b05386" + }, + "3.13/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.13.9+20251031-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.13.9", + "sha256": "874593f641f31ea101440c70f81768c35d4d7d6df111fde63094db67465ef787" + }, + "3.13/x86_64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.13.9+20251031-x86_64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.13.9", + "sha256": "dcc29b069d0588fbd4ea29c6df840c8d1207d2a3bce8cd5cd57d1b85373b6048" + }, + "3.13/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.13.9+20251031-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.13.9", + "sha256": "6f05b91ee8c7e6dd0f9c60b95bb29130e2d623961de6578b643e80ddd83f96b6" + }, + "3.13/x86_64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.13.9+20251031-x86_64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.13.9", + "sha256": "4c5c9a251a45288ebd4a51900708eb2ada9197173ba56e5604b6b63727fb87ff" + }, + "3.13/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.13.9+20251031-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.13.9", + "sha256": "ad987197034185e628715da504a50613af213dc21ba6d5ccaeab3db2c464aa6c" + }, + "3.14/aarch64-apple-darwin/freethreaded": { + "filename": "cpython-3.14.0+20251031-aarch64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.14.0", + "sha256": "d9c7b430b25bd3837dbb03f945dbe6b7bc526c5940ca96f5db7cdc42f6b2b801" + }, + "3.14/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.14.0+20251031-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.14.0", + "sha256": "b4bcd3c6c24cab32ae99e1b05c89312b783b4d69431d702e5012fe1fdcad4087" + }, + "3.14/aarch64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.14.0+20251031-aarch64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.14.0", + "sha256": "40266e60f655e49cd1d5303295255909a4b593b08b88be6e6a55b2c9fe6ed13d" + }, + "3.14/aarch64-pc-windows-msvc/install_only": { + "filename": "cpython-3.14.0+20251031-aarch64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.14.0", + "sha256": "599a8b7e12439cd95a201dbdfe95cf363146b1ff91f379555dafd86b170caab9" + }, + "3.14/aarch64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.14.0+20251031-aarch64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.14.0", + "sha256": "f383ef50d1da6ca511212e5ae601923b56636b87351fd5fc847e0ea0a19fa9b3" + }, + "3.14/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.14.0+20251031-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.14.0", + "sha256": "128a9cbfb9645d5237ec01704d9d1d2ac5f084464cc43c37a4cd96aa9c3b1ad5" + }, + "3.14/aarch64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.14.0+20251031-aarch64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.14.0", + "sha256": "33c7aa105634102c61b8ad01c801dbaf1950e59c04a876b72004cf4fbcfc6e33" + }, + "3.14/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.14.0+20251031-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.14.0", + "sha256": "e850ffb10a13cf16fb6ee08989e53532b606e7e96045ee65f7a3f41a9de14010" + }, + "3.14/i686-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.14.0+20251031-i686-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.14.0", + "sha256": "c47e0e4fd3a2d334a9f3df1d40fd9a7a8f743572dbd798b68fe5a6361c399806" + }, + "3.14/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.14.0+20251031-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.14.0", + "sha256": "35703b8b813afd37036ec88973c0f5a7626ee0dd48544a1c69cddeee994b5274" + }, + "3.14/x86_64-apple-darwin/freethreaded": { + "filename": "cpython-3.14.0+20251031-x86_64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.14.0", + "sha256": "b3196f6b57bbb3dc2ee07f348f1d51117ffa376979eceafbf50c15f0f7980bf8" + }, + "3.14/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.14.0+20251031-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.14.0", + "sha256": "4e71a3ce973be377ef18637826648bb936e2f9490f64a9e4f33a49bcc431d344" + }, + "3.14/x86_64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.14.0+20251031-x86_64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.14.0", + "sha256": "b81de5fc9e783ea6dfcf1098c28a278c874999c71afbb0309f6a8b4276c769d0" + }, + "3.14/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.14.0+20251031-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.14.0", + "sha256": "39acfcb3857d83eab054a3de11756ffc16b3d49c31393b9800dd2704d1f07fdf" + }, + "3.14/x86_64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.14.0+20251031-x86_64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.14.0", + "sha256": "f4acbef0fbfaf7ab31ac63986da1d93dfa1c5cb797de1dcdc1a988aa18670120" + }, + "3.14/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.14.0+20251031-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.14.0", + "sha256": "3dec1ab70758a3467ac3313bbcdabf7a9b3016db5c072c4537e3cf0a9e6290f6" + }, + "3.14/x86_64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.14.0+20251031-x86_64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.14.0", + "sha256": "9e18302759734fb14694efb0418e7291c8d590d880abc2da1d7e6f14ac9a381d" + }, + "3.14/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.14.0+20251031-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.14.0", + "sha256": "d0a2a6d3b1bb00dce2105377fda8aa79675d187f8d6d7010a42f651af25018dc" + }, + "3.15/aarch64-apple-darwin/freethreaded": { + "filename": "cpython-3.15.0a1+20251031-aarch64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.15.0a1", + "sha256": "12f1b16be4017181ad67904caf9e59e525b9b5d62f49105017d837e27b832959" + }, + "3.15/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.15.0a1+20251031-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.15.0a1", + "sha256": "3acf7aa3559b746498b18929456c5cacb84bae4e09249834cbc818970d71de87" + }, + "3.15/aarch64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.15.0a1+20251031-aarch64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.15.0a1", + "sha256": "54ca78dae455ece6fefbd7f5f287cc55d5ce197caf51921f6d871d15069d9489" + }, + "3.15/aarch64-pc-windows-msvc/install_only": { + "filename": "cpython-3.15.0a1+20251031-aarch64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.15.0a1", + "sha256": "1508bcd7195008479ed156aad3afbb3a3793097ed530690f0304a8107f0e53e8" + }, + "3.15/aarch64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.15.0a1+20251031-aarch64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.15.0a1", + "sha256": "981fe8dfc6e7e1d0ffefa945a18d5c4c759bbe21722acf3a5cc7e62f16aa5f3c" + }, + "3.15/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.15.0a1+20251031-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.15.0a1", + "sha256": "d55c2aeece827e6bec83fd18515ee281d9ea0efaa3e2d20130db8f1c7cbb71c6" + }, + "3.15/aarch64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.15.0a1+20251031-aarch64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.15.0a1", + "sha256": "017cd58a8e6d93a8d60453899d4bac6f540414003ec9a73dc106c20045d542ee" + }, + "3.15/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.15.0a1+20251031-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.15.0a1", + "sha256": "abbd20235411d7cc24cba48ac519324b8bb71a52e05b26e7012de815e43d6e73" + }, + "3.15/i686-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.15.0a1+20251031-i686-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.15.0a1", + "sha256": "9f4bc934ef9c56e6d1d7263949430cecc19d301fa4cad74fcd36c9b3c6a7ba01" + }, + "3.15/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.15.0a1+20251031-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.15.0a1", + "sha256": "6ffdbe54c45d0a9c309498f65c5ddf3de587c84aee89a227836f42b4e7e25691" + }, + "3.15/x86_64-apple-darwin/freethreaded": { + "filename": "cpython-3.15.0a1+20251031-x86_64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.15.0a1", + "sha256": "64fc29e6c7a2f02a18645d968f1b3fc1d00d12a5ef3fcbb0d077fa8c62c08904" + }, + "3.15/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.15.0a1+20251031-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.15.0a1", + "sha256": "0ab19d3ac25f99da438b088751e5ec2421f9f6aa4292fd2dc0f8e49eb3e16bdf" + }, + "3.15/x86_64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.15.0a1+20251031-x86_64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.15.0a1", + "sha256": "34abc5603e1b4131f753d29b7deac865b9277912b851cbed5a149cf3e6745d3d" + }, + "3.15/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.15.0a1+20251031-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.15.0a1", + "sha256": "5f5d6bec2b381cfc771c49972d2a6f7b7e7ab6a1651d8fb6ef3983f3571722b3" + }, + "3.15/x86_64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.15.0a1+20251031-x86_64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.15.0a1", + "sha256": "0e0272186d9f5169394dbc4d4d72a3f4a5762a04c2e5ac2ab1e23aa41fc8538a" + }, + "3.15/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.15.0a1+20251031-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.15.0a1", + "sha256": "1f356288c2b2713619cb7a4e453d33bf8882f812af2987e21e01e7ae382fefba" + }, + "3.15/x86_64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.15.0a1+20251031-x86_64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.15.0a1", + "sha256": "621ac3b8b8afa1593d63fb130dadc6eec2bd9e3603d6c028efe60146e05ec430" + }, + "3.15/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.15.0a1+20251031-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.15.0a1", + "sha256": "caf5311f333eef082dd69a669ca65aceba09a08fc1e78aad602ad649106f294c" + }, + "3.9/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.9.25+20251031-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.9.25", + "sha256": "87275619c2706affa4d1090d2ca3dad354b6d69f8b85dbfafe38785870751b9a" + }, + "3.9/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.9.25+20251031-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.9.25", + "sha256": "6112d46355857680b81849764a6cf9f38cc4cd0d1cf29d432bc12fe5aeedf9d0" + }, + "3.9/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.9.25+20251031-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.9.25", + "sha256": "f4d8eb93c54cbf7dc37d5599748582d91c268c60008f17daf19c0ad183ec78ab" + }, + "3.9/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.9.25+20251031-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.9.25", + "sha256": "5056f28d59653a6bddcc8007f024af00147a7e6f82e797f073a59f16a5cacc19" + }, + "3.9/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.9.25+20251031-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.9.25", + "sha256": "ace63cfe27a9487c4d72e1cb518be01c1d985271da0b2158e813801f7d3e5503" + }, + "3.9/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.9.25+20251031-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.9.25", + "sha256": "4fb1b416482ce94d73cfa140317a670c596c830671d137b07c26afe8c461768a" + }, + "3.9/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.9.25+20251031-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.9.25", + "sha256": "42834f61eb6df43432c3dd6ab9ca3fdf8c06d10a404ebdb53d6902e6b9570b08" + }, + "3.9/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.9.25+20251031-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.9.25", + "sha256": "76593e8c889e81e82db5fe117fe15b69466f85100ab2ec0e4035aa86242b4e93" + } + }, + "release_index_v1_20260303_https://github.com/astral-sh/python-build-standalone/releases/download": { + "3.10/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.10.20+20260303-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.10.20", + "sha256": "b41060c26454b21990254fdc08a4988f4e325708d785f8a0b4b4533881cf5fd4" + }, + "3.10/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.10.20+20260303-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.10.20", + "sha256": "dcf3b9bd0062276866b4fc84c9e4c39be7ef161d22c769e5f4ee01c8e27100f4" + }, + "3.10/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.10.20+20260303-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.10.20", + "sha256": "92713c7f4a7bb77bf8593818e4c1da8db44d415f45b0b5b7a8eb741695c08303" + }, + "3.10/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.10.20+20260303-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.10.20", + "sha256": "9bc6cd476a2670a054dc8dbdd22c5b7c7642ac2f0ac810c5bb18aa39083a8a99" + }, + "3.10/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.10.20+20260303-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.10.20", + "sha256": "2fd25586216e5e6932d767034618b7bb97654c689f07513009d858398fe181f3" + }, + "3.10/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.10.20+20260303-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.10.20", + "sha256": "aa55177f1247cdac1ccdf0877cdf68e9d6718b0914e56f1083404b1dcbac847b" + }, + "3.10/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.10.20+20260303-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.10.20", + "sha256": "c830fc25bc6e318e7ad4961caadee6cc79c041c122884c90ecfad4fe02e20344" + }, + "3.10/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.10.20+20260303-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.10.20", + "sha256": "c781a93c1030c814bc0861dc424c476ca2e0083b429b968f557e1664f3ef223f" + }, + "3.11/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.11.15+20260303-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.11.15", + "sha256": "0d29ed7cb6711890b3c6da27b6258c4ad3b506bf8d5a381bff531ca8fa67417f" + }, + "3.11/aarch64-pc-windows-msvc/install_only": { + "filename": "cpython-3.11.15+20260303-aarch64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.11.15", + "sha256": "84afaa698da2bc12f05aa317ad1ad6bf6708461e737efd08ad7e95d9a8857c1b" + }, + "3.11/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.11.15+20260303-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.11.15", + "sha256": "4786f5ef8567c982517fcd7cb189a5ef4a712ed0aaf3034e839749794155ad4c" + }, + "3.11/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.11.15+20260303-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.11.15", + "sha256": "d37ebd873138f85603607a56bc821e07551f45e6938e02d36b04885a6eded7ff" + }, + "3.11/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.11.15+20260303-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.11.15", + "sha256": "1924013f72c36c8d19d6887979cded6ca7f2295667d591b88f74260f141e1fee" + }, + "3.11/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.11.15+20260303-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.11.15", + "sha256": "6ea2168c4e18cb31d9dc8486634dc375929bcc2adde0957399ce59d90b52297a" + }, + "3.11/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.11.15+20260303-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.11.15", + "sha256": "6f194e1ede02260fd3d758893bbf1d3bb4084652d436a8300a229da721c3ddf8" + }, + "3.11/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.11.15+20260303-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.11.15", + "sha256": "17e1f5b2c9668217ba554decd94db04adf3d085203d322c690fd44cde549d576" + }, + "3.11/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.11.15+20260303-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.11.15", + "sha256": "ee54c7baaa5a1fb65922505a646a2d097660b005e55bd35055d0a9c46a5ab916" + }, + "3.12/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.12.13+20260303-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.12.13", + "sha256": "2c01f29e9e4ddbd57e0319fedecf1f3e222558fce394a3ed4e39d0f750c11988" + }, + "3.12/aarch64-pc-windows-msvc/install_only": { + "filename": "cpython-3.12.13+20260303-aarch64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.12.13", + "sha256": "f003d15139e0baa39563388b7e29c44a6c4dda3987dbd7cec2050eca32450d4f" + }, + "3.12/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.12.13+20260303-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.12.13", + "sha256": "15c00b489fb89c7e3dc433800cd8b932ab3f8825870c1919fbe747f493edf81d" + }, + "3.12/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.12.13+20260303-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.12.13", + "sha256": "2e3e3fc934a597c5c0e95fe9093a89cd6d3e248f9d3f6a0e82dbfa923499bd9d" + }, + "3.12/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.12.13+20260303-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.12.13", + "sha256": "af220242f3d2bebff6b9a01666895bb7198d7e4be608752f7e4007dd0fddfa22" + }, + "3.12/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.12.13+20260303-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.12.13", + "sha256": "8ad52a15de26e67d53f5c14f338433c59d5a2711852adc59043a20ec8da71a52" + }, + "3.12/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.12.13+20260303-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.12.13", + "sha256": "43990976c8de6b72a7525cb509eedaf869a8dd116167e708af08bca50cd8ef00" + }, + "3.12/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.12.13+20260303-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.12.13", + "sha256": "4e5ac5a04afc4fe164e92e3844d6dbda03b33baeb62e032b5c9a8198280221e2" + }, + "3.12/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.12.13+20260303-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.12.13", + "sha256": "4099347cfb11427ceb6fe40d1b9f2af9fee3a3a8915df0e439e13dfbe948b91e" + }, + "3.13/aarch64-apple-darwin/freethreaded": { + "filename": "cpython-3.13.12+20260303-aarch64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.13.12", + "sha256": "d152a8ec3a31a7b49772e70ff7fed1e7f6ec721497151b104532957744703d86" + }, + "3.13/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.13.12+20260303-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.13.12", + "sha256": "267592285674e21982d84f2cd0b56e13e63ce60c3e85ffb0d67a842edaf5b5e9" + }, + "3.13/aarch64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.13.12+20260303-aarch64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.13.12", + "sha256": "33e4de818b5419f0b6c599ccfc98a0468c441f83e02d4e0ef18b4a632408dc57" + }, + "3.13/aarch64-pc-windows-msvc/install_only": { + "filename": "cpython-3.13.12+20260303-aarch64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.13.12", + "sha256": "4cb0d143eeaf51582fa8292d00061fc201e41bf3ce5e2de814d0b273f73d4c25" + }, + "3.13/aarch64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.13.12+20260303-aarch64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.13.12", + "sha256": "a2e320b8b7ec76f538f4414bb56927e0a35fb169a4748594b3b0946df0d8942b" + }, + "3.13/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.13.12+20260303-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.13.12", + "sha256": "3b88fc6dd6f0290f075353ca860b9dc48faca0d849a0a03c088883507ed63881" + }, + "3.13/aarch64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.13.12+20260303-aarch64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.13.12", + "sha256": "5c71151ce936e495b0dc49fe3bdd67a9ec332542e2fc250257cd76276481103c" + }, + "3.13/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.13.12+20260303-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.13.12", + "sha256": "c8f2e10261f327b3b9606c23c79788e1c909f0d703c4b06ebd59b318fa271c77" + }, + "3.13/i686-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.13.12+20260303-i686-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.13.12", + "sha256": "e27287866347dd2cc1dc766174bb67f6b459cbadfbeff74c981abe7fe6cf86ba" + }, + "3.13/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.13.12+20260303-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.13.12", + "sha256": "202a933d5435eced5e92f474fac9480a82959de2b3ea5555569de9bda6f4af4f" + }, + "3.13/x86_64-apple-darwin/freethreaded": { + "filename": "cpython-3.13.12+20260303-x86_64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.13.12", + "sha256": "d603daefc04db99a764942a835497e52beebeb8797f7ac828826969e6f8ea165" + }, + "3.13/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.13.12+20260303-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.13.12", + "sha256": "07833bcaf50c80065db8a21d7ae0459939d95e3cf399ce8f7df908ddfc4d275f" + }, + "3.13/x86_64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.13.12+20260303-x86_64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.13.12", + "sha256": "5703d1e5fcd43d0ac3bce24e65d03a5684f3fec3625794ca9a0a47ad2ecbd0a1" + }, + "3.13/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.13.12+20260303-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.13.12", + "sha256": "61d5f9750e6971cf3bc91a1c8e7ab2eed1c22a34067f0762917bfde12b121f9f" + }, + "3.13/x86_64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.13.12+20260303-x86_64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.13.12", + "sha256": "8f1a00de7342d161bfefcb6bb90f50076b0c49e1ac4d4faa7fb303015369f310" + }, + "3.13/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.13.12+20260303-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.13.12", + "sha256": "ee1d08c3e6149343077d410d7de835a7a7dda8e2cec80df94f393e858a300055" + }, + "3.13/x86_64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.13.12+20260303-x86_64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.13.12", + "sha256": "6bae3d9f3c03448efe7e72aaf7eba1c4af4531ee22964876b36c1569e5123159" + }, + "3.13/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.13.12+20260303-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.13.12", + "sha256": "36f73e0b72ac670bd56c927a078e3e2ef0b1fef1d89a792088766bf1236815b7" + }, + "3.14/aarch64-apple-darwin/freethreaded": { + "filename": "cpython-3.14.3+20260303-aarch64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.14.3", + "sha256": "cedbfdb352b7b0dbdfd2e4dba11244a64665402c44099f36af9e22dc269dd0c0" + }, + "3.14/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.14.3+20260303-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.14.3", + "sha256": "adce81b366416e8d1b95c9c5483607282ae43c98fc155677020d20076d333fec" + }, + "3.14/aarch64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.14.3+20260303-aarch64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.14.3", + "sha256": "5af1b60808d4e8df3838267086556e2518b24a71080a7c4dc0edf3ef6a5bd8c4" + }, + "3.14/aarch64-pc-windows-msvc/install_only": { + "filename": "cpython-3.14.3+20260303-aarch64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.14.3", + "sha256": "f64e500abf0ff11b320cba756114caae6ea733c62af1c9516d28d92cf4223d74" + }, + "3.14/aarch64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.14.3+20260303-aarch64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.14.3", + "sha256": "9ca5169b62fdedbbeb1e01429e5ed75d0c89efb0dffb3d5924c58f667f365863" + }, + "3.14/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.14.3+20260303-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.14.3", + "sha256": "80030e336255241a76cd05c874b70a8840fef24e344907a4ae89f0f6c3c7daf6" + }, + "3.14/aarch64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.14.3+20260303-aarch64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.14.3", + "sha256": "ff4076086f55f83746d680792f8346037060453cf078feba233ba28e4b2a3514" + }, + "3.14/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.14.3+20260303-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.14.3", + "sha256": "97b7e0182daf74f884456a4a24cf882d0296092c918939d25ed1e1f4edee0469" + }, + "3.14/i686-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.14.3+20260303-i686-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.14.3", + "sha256": "e3085abf12bdf84a91784915082eaffd4cac154acd9818aefc71a69e13bdaf24" + }, + "3.14/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.14.3+20260303-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.14.3", + "sha256": "d969b1807fe6a3ebe9c1468c55331859d329119951ab01dc6ec5b2853c217a66" + }, + "3.14/x86_64-apple-darwin/freethreaded": { + "filename": "cpython-3.14.3+20260303-x86_64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.14.3", + "sha256": "ff7ba9353fb4f6f923e5a0c30564e448cb678deb69ac58e7f4f3a78944b40806" + }, + "3.14/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.14.3+20260303-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.14.3", + "sha256": "29469be54c9e471b916f0375f83836811b4df29dc98e0b7452ae9ec483a500a0" + }, + "3.14/x86_64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.14.3+20260303-x86_64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.14.3", + "sha256": "7921cf0fa140f3714c4772b8af161ab463d0ad641ac35db0beff9d45273ab5f5" + }, + "3.14/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.14.3+20260303-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.14.3", + "sha256": "201d5c13ee115e029bf6caa6bb17af2bfb3e4a3baf14c7f31e9145e2aa6571ef" + }, + "3.14/x86_64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.14.3+20260303-x86_64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.14.3", + "sha256": "0629158c702d4ba732c722f24e5a775885e93915c7b04fe29cfb9c81e37f499f" + }, + "3.14/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.14.3+20260303-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.14.3", + "sha256": "8070ec22c0ea164b826a57102f1bf1fa0b360e143ab3378b3c5eb4178bc0c26b" + }, + "3.14/x86_64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.14.3+20260303-x86_64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.14.3", + "sha256": "dc478897cecef7b6dfcd089b8a425e959885883d123ba4ce3e3ec1fcf5f9637a" + }, + "3.14/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.14.3+20260303-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.14.3", + "sha256": "e72b682f652eb8ba71550a7aa4f267ddf3fe06b165a29acd4194dfff0b51ed4e" + }, + "3.15/aarch64-apple-darwin/freethreaded": { + "filename": "cpython-3.15.0a6+20260303-aarch64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.15.0a6", + "sha256": "c2c9679a505c94abb6e0dcbcb1a9ea2148fbcab5b443e9c8efac388e591233a8" + }, + "3.15/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.15.0a6+20260303-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.15.0a6", + "sha256": "7a6bb30a11361b58849ceeaf4d74f4085306f9b00de0c7f4703f9031cbb409ee" + }, + "3.15/aarch64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.15.0a6+20260303-aarch64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.15.0a6", + "sha256": "62890d115b54d2456a74db09d3026834faee19ba1be257c287025b0e8ae6ad16" + }, + "3.15/aarch64-pc-windows-msvc/install_only": { + "filename": "cpython-3.15.0a6+20260303-aarch64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.15.0a6", + "sha256": "aafd627b816dd83cb9ae670383482f3aa166e8f8910ca946278c5cc22f96bff6" + }, + "3.15/aarch64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.15.0a6+20260303-aarch64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.15.0a6", + "sha256": "93792d31d2232f6bf27e08fbfe6aec221aab1a4aa42463ac879540d399b54bc2" + }, + "3.15/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.15.0a6+20260303-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.15.0a6", + "sha256": "bc351efe2ef61f2d6fae1491b0d240f7616a7be28fcdad2d1644ce0429001ad6" + }, + "3.15/aarch64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.15.0a6+20260303-aarch64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.15.0a6", + "sha256": "497bbd7bc486a3092e003761f6a4fb9fd2c9854dea249042b330cb70d2ebf42a" + }, + "3.15/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.15.0a6+20260303-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.15.0a6", + "sha256": "55fabc3bfa81d6248db65da659c8f728fdfe8aa5dcd9551a5b1eaef09bc05cbd" + }, + "3.15/i686-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.15.0a6+20260303-i686-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.15.0a6", + "sha256": "4174719f384f3c6893c59e23ea88242c3ab9d84b7fffb9d1ed3a11e9d6a6a068" + }, + "3.15/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.15.0a6+20260303-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.15.0a6", + "sha256": "a49e43ea7971bb975e00f132bd45bc6834177997add3de7a07361a7449a10bda" + }, + "3.15/x86_64-apple-darwin/freethreaded": { + "filename": "cpython-3.15.0a6+20260303-x86_64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.15.0a6", + "sha256": "cf23826a427d19ea945965ba0e00a210b0cd96c3e7c2741ccf1174c18c37d5a6" + }, + "3.15/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.15.0a6+20260303-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.15.0a6", + "sha256": "3c25506d64f6b8e0c38bb66f8430332578a69343c1b27078b7f91d5919f2549a" + }, + "3.15/x86_64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.15.0a6+20260303-x86_64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.15.0a6", + "sha256": "8c3de05f4df81a3b482fd62daa14b7863df2b517a487b75661e37dfee845a4e6" + }, + "3.15/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.15.0a6+20260303-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.15.0a6", + "sha256": "42690076ba8f6311b737b884f56217cab7d7287f3374ab8c629fd446913534d6" + }, + "3.15/x86_64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.15.0a6+20260303-x86_64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.15.0a6", + "sha256": "9d95b1429958effe665c0dd7e2a9b8dfe1364b477637df87ddf372438adfa109" + }, + "3.15/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.15.0a6+20260303-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.15.0a6", + "sha256": "ac11f7e619c154e3d9b56186b461f52b4afc583a5524e7109686a7a9e1835b6d" + }, + "3.15/x86_64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.15.0a6+20260303-x86_64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.15.0a6", + "sha256": "2b5d35017190248ebbbf8b24432ec730e496dc68b911308a0cd4c21d8181d090" + }, + "3.15/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.15.0a6+20260303-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.15.0a6", + "sha256": "427675a1e0e79051540cce0f1b450ca0d11a8897486aba03796a8881cadf831f" + } + } + }, + "@@rules_distroless+//apt:extensions.bzl%apt": { + "formats": { + "noble/main/amd64/Contents/https://snapshot.ubuntu.com/ubuntu/20240601T000000Z": "unavailable", + "noble/main/amd64/Packages/https://snapshot.ubuntu.com/ubuntu/20240601T000000Z": ".xz" + }, + "indices": { + "noble/main/amd64/Packages/https://snapshot.ubuntu.com/ubuntu/20240601T000000Z": "sha256-KmoZnhAxpcJ5yzRmRtWUmT81scA91KgqqgMjmA3ZJFE=" + } + } + }, + "factsVersions": {} +} diff --git a/examples/py_image_with_rules_img_and_rules_python/app/BUILD.bazel b/examples/py_image_with_rules_img_and_rules_python/app/BUILD.bazel new file mode 100644 index 0000000..58062bb --- /dev/null +++ b/examples/py_image_with_rules_img_and_rules_python/app/BUILD.bazel @@ -0,0 +1,48 @@ +load("@aspect_bazel_lib//lib:write_source_files.bzl", "write_source_files") +load("@rules_img//img:load.bzl", "image_load") +load("@rules_python//python:py_binary.bzl", "py_binary") +load("@rules_python//python:py_test.bzl", "py_test") +load("//shared:interpreter.bzl", "interpreter_runfiles_dir") +load("//shared:py_image.bzl", "py_image") + +py_binary( + name = "app", + srcs = ["app.py"], + legacy_create_init = False, + deps = [ + "@pip//backports_strenum", + "@pip//backports_tarfile", + "@pip//colorama", + "@pip//google_crc32c", + ], +) + +py_image( + name = "image", + binary = ":app", +) + +py_test( + name = "image_test", + size = "medium", + srcs = ["image_test.py"], + args = [ + "$(rootpath :load)", + "/" + interpreter_runfiles_dir() + "/bin/python3", + ], + data = [":load"], + legacy_create_init = False, + main = "image_test.py", + tags = ["no-sandbox"], +) + +image_load( + name = "load", + image = ":image", + tag = "docker.io/library/rules-layer-optimizer-py-image-rules-python:local", +) + +write_source_files( + name = "write_optimization_plan", + files = {"optimization_plan.json": ":image_optimized_optimization_plan"}, +) diff --git a/examples/py_image_with_rules_img_and_rules_python/app/app.py b/examples/py_image_with_rules_img_and_rules_python/app/app.py new file mode 100644 index 0000000..fefdc4a --- /dev/null +++ b/examples/py_image_with_rules_img_and_rules_python/app/app.py @@ -0,0 +1,24 @@ +"""Small application packaged by the two-argument py_image macro.""" + +import importlib.metadata +import os + +import backports.strenum +import backports.tarfile +import colorama +import google_crc32c + + +def main() -> None: + assert importlib.metadata.version("colorama") == "0.4.6" + assert google_crc32c.implementation == "c" + assert google_crc32c.value(b"123456789") == 0xE3069283 + assert backports.tarfile.TarInfo("fixture").name == "fixture" + assert issubclass(backports.strenum.StrEnum, str) + assert importlib.metadata.version("google-crc32c") == "1.7.1" + assert os.environ["COLORAMA_AVAILABLE"] == "1" + print(colorama.Fore.GREEN + "hello from py_image" + colorama.Style.RESET_ALL) + + +if __name__ == "__main__": + main() diff --git a/examples/py_image_with_rules_img_and_rules_python/app/image_test.py b/examples/py_image_with_rules_img_and_rules_python/app/image_test.py new file mode 100644 index 0000000..df7767b --- /dev/null +++ b/examples/py_image_with_rules_img_and_rules_python/app/image_test.py @@ -0,0 +1,53 @@ +"""Load the py_image into Docker and run its Python entrypoint.""" + +import subprocess +import sys + + +def _run(args: list[str]) -> subprocess.CompletedProcess[str]: + result = subprocess.run(args, check=False, capture_output=True, text=True) + sys.stdout.write(result.stdout) + sys.stderr.write(result.stderr) + return result + + +def _image_ref(load_stdout: str) -> str: + for line in load_stdout.splitlines(): + if line.startswith("Loaded image: "): + return line.removeprefix("Loaded image: ").strip() + if line.startswith("Loaded image ID: "): + return line.removeprefix("Loaded image ID: ").strip() + raise AssertionError("docker load did not report an image:\n{}".format(load_stdout)) + + +def _check(result: subprocess.CompletedProcess[str], what: str) -> None: + assert result.returncode == 0, "{} failed ({}):\n{}".format(what, result.returncode, result.stderr) + + +def test_image(load_script: str, python: str) -> None: + loaded = _run([load_script]) + _check(loaded, "docker load") + image = _image_ref(loaded.stdout) + + ran = _run(["docker", "run", "--rm", "--network", "none", image]) + _check(ran, "image entrypoint") + assert "hello from py_image" in ran.stdout + + printed = _run([ + "docker", + "run", + "--rm", + "--network", + "none", + "--entrypoint", + python, + image, + "-c", + "print('py_image python ok')", + ]) + _check(printed, "python -c") + assert printed.stdout.strip() == "py_image python ok" + + +if __name__ == "__main__": + test_image(sys.argv[1], sys.argv[2]) diff --git a/examples/py_image_with_rules_img_and_rules_python/app/optimization_plan.json b/examples/py_image_with_rules_img_and_rules_python/app/optimization_plan.json new file mode 100644 index 0000000..3862b39 --- /dev/null +++ b/examples/py_image_with_rules_img_and_rules_python/app/optimization_plan.json @@ -0,0 +1,257 @@ +{ + "groups": [ + { + "flattened_layer_count": 1, + "input_tar_count": 29, + "name": "apt", + "output_layer_count": 3, + "overflow": "flatten", + "separate_layer_count": 2 + }, + { + "flattened_layer_count": 0, + "input_tar_count": 1, + "name": "interpreter", + "output_layer_count": 1, + "overflow": "individual", + "separate_layer_count": 1 + }, + { + "flattened_layer_count": 1, + "input_tar_count": 4, + "name": "pip", + "output_layer_count": 1, + "overflow": "flatten", + "separate_layer_count": 0 + }, + { + "flattened_layer_count": 0, + "input_tar_count": 1, + "name": "source", + "output_layer_count": 1, + "overflow": "individual", + "separate_layer_count": 1 + } + ], + "layers": [ + { + "disposition": "separate", + "group": "apt", + "inputs": [ + { + "path": "../rules_distroless++apt+noble_libssl3t64-amd64_3.0.13-0ubuntu3/content.tar.gz", + "reason": "above_size_threshold", + "size_hint_bytes": 1936306 + } + ], + "known_input_size_bytes": 1936306, + "unknown_input_count": 0 + }, + { + "disposition": "separate", + "group": "apt", + "inputs": [ + { + "path": "../rules_distroless++apt+noble_coreutils-amd64_9.4-3ubuntu6/content.tar.gz", + "reason": "above_size_threshold", + "size_hint_bytes": 1412418 + } + ], + "known_input_size_bytes": 1412418, + "unknown_input_count": 0 + }, + { + "disposition": "flattened", + "group": "apt", + "inputs": [ + { + "path": "../rules_distroless++apt+noble_libcrypt1-amd64_1-4.4.36-4build1/content.tar.gz", + "reason": "missing_size_hint" + }, + { + "path": "../rules_distroless++apt+noble_libc6-amd64_2.39-0ubuntu8/content.tar.gz", + "reason": "missing_size_hint" + }, + { + "path": "../rules_distroless++apt+noble_libgcc-s1-amd64_14-20240412-0ubuntu1/content.tar.gz", + "reason": "missing_size_hint" + }, + { + "path": "../rules_distroless++apt+noble_gcc-14-base-amd64_14-20240412-0ubuntu1/content.tar.gz", + "reason": "missing_size_hint" + }, + { + "path": "../rules_distroless++apt+noble_mawk-amd64_1.3.4.20240123-1build1/content.tar.gz", + "reason": "missing_size_hint" + }, + { + "path": "../rules_distroless++apt+noble_base-files-amd64_13ubuntu10/content.tar.gz", + "reason": "below_size_threshold", + "size_hint_bytes": 73634 + }, + { + "path": "../rules_distroless++apt+noble_debconf-amd64_1.5.86ubuntu1/content.tar.gz", + "reason": "missing_size_hint" + }, + { + "path": "../rules_distroless++apt+noble_openssl-amd64_3.0.13-0ubuntu3/content.tar.gz", + "reason": "below_size_threshold", + "size_hint_bytes": 1001730 + }, + { + "path": "../rules_distroless++apt+noble_ca-certificates-amd64_20240203/content.tar.gz", + "reason": "below_size_threshold", + "size_hint_bytes": 159378 + }, + { + "path": "../rules_distroless++apt+noble_netbase-amd64_6.4/content.tar.gz", + "reason": "below_size_threshold", + "size_hint_bytes": 13112 + }, + { + "path": "../rules_distroless++apt+noble_libstdc--6-amd64_14-20240412-0ubuntu1/content.tar.gz", + "reason": "below_size_threshold", + "size_hint_bytes": 795158 + }, + { + "path": "../rules_distroless++apt+noble_tzdata-amd64_2024a-2ubuntu1/content.tar.gz", + "reason": "below_size_threshold", + "size_hint_bytes": 273318 + }, + { + "path": "../rules_distroless++apt+noble_debianutils-amd64_5.17build1/content.tar.gz", + "reason": "missing_size_hint" + }, + { + "path": "../rules_distroless++apt+noble_libtinfo6-amd64_6.4-20240113-1ubuntu2/content.tar.gz", + "reason": "missing_size_hint" + }, + { + "path": "../rules_distroless++apt+noble_bash-amd64_5.2.21-2ubuntu4/content.tar.gz", + "reason": "below_size_threshold", + "size_hint_bytes": 794086 + }, + { + "path": "../rules_distroless++apt+noble_libselinux1-amd64_3.5-2ubuntu2/content.tar.gz", + "reason": "missing_size_hint" + }, + { + "path": "../rules_distroless++apt+noble_libpcre2-8-0-amd64_10.42-4ubuntu2/content.tar.gz", + "reason": "missing_size_hint" + }, + { + "path": "../rules_distroless++apt+noble_libgmp10-amd64_2-6.3.0-dfsg-2ubuntu6/content.tar.gz", + "reason": "missing_size_hint" + }, + { + "path": "../rules_distroless++apt+noble_libattr1-amd64_1-2.5.2-1build1/content.tar.gz", + "reason": "missing_size_hint" + }, + { + "path": "../rules_distroless++apt+noble_libacl1-amd64_2.3.2-1build1/content.tar.gz", + "reason": "missing_size_hint" + }, + { + "path": "../rules_distroless++apt+noble_libsigsegv2-amd64_2.14-1ubuntu2/content.tar.gz", + "reason": "missing_size_hint" + }, + { + "path": "../rules_distroless++apt+noble_libreadline8t64-amd64_8.2-4build1/content.tar.gz", + "reason": "missing_size_hint" + }, + { + "path": "../rules_distroless++apt+noble_readline-common-amd64_8.2-4build1/content.tar.gz", + "reason": "missing_size_hint" + }, + { + "path": "../rules_distroless++apt+noble_libmpfr6-amd64_4.2.1-1build1/content.tar.gz", + "reason": "missing_size_hint" + }, + { + "path": "../rules_distroless++apt+noble_gawk-amd64_1-5.2.1-2build3/content.tar.gz", + "reason": "below_size_threshold", + "size_hint_bytes": 462772 + }, + { + "path": "../rules_distroless++apt+noble_sed-amd64_4.9-2build1/content.tar.gz", + "reason": "below_size_threshold", + "size_hint_bytes": 193410 + }, + { + "path": "../rules_distroless++apt+noble_grep-amd64_3.11-4build1/content.tar.gz", + "reason": "below_size_threshold", + "size_hint_bytes": 162040 + } + ], + "known_input_size_bytes": 3928638, + "unknown_input_count": 17 + }, + { + "disposition": "separate", + "group": "interpreter", + "inputs": [ + { + "path": "app/image_layers_interpreter.tar.gz", + "reason": "fixed" + } + ], + "known_input_size_bytes": 0, + "unknown_input_count": 1 + }, + { + "disposition": "flattened", + "group": "pip", + "inputs": [ + { + "path": "../rules_python++pip+pip_312_google_crc32c/pip_tars/google_crc32c.tar.gz", + "reason": "below_size_threshold", + "size_hint_bytes": 33477 + }, + { + "path": "../rules_python++pip+pip_312_backports_tarfile/pip_tars/backports_tarfile.tar.gz", + "reason": "below_size_threshold", + "size_hint_bytes": 30181 + }, + { + "path": "../rules_python++pip+pip_312_colorama/pip_tars/colorama.tar.gz", + "reason": "below_size_threshold", + "size_hint_bytes": 25335 + }, + { + "path": "../rules_python++pip+pip_312_backports_strenum/pip_tars/backports_strenum.tar.gz", + "reason": "below_size_threshold", + "size_hint_bytes": 7862 + } + ], + "known_input_size_bytes": 96855, + "unknown_input_count": 0 + }, + { + "disposition": "separate", + "group": "source", + "inputs": [ + { + "path": "app/image_layers_source.tar.gz", + "reason": "fixed" + } + ], + "known_input_size_bytes": 0, + "unknown_input_count": 1 + } + ], + "policy": { + "flatten_all": false, + "layer_budget": 127, + "size_threshold_bytes": 1048576 + }, + "schema_version": 1, + "summary": { + "flattened_layer_count": 2, + "input_tar_count": 35, + "output_layer_count": 6, + "separate_layer_count": 4, + "size_eligible_input_count": 2, + "size_eligible_inputs_kept_separate": 2 + }, + "target": "@@//app:image_optimized_all_tars" +} diff --git a/examples/py_image_with_rules_img_and_rules_python/pyproject.toml b/examples/py_image_with_rules_img_and_rules_python/pyproject.toml new file mode 100644 index 0000000..c5f8838 --- /dev/null +++ b/examples/py_image_with_rules_img_and_rules_python/pyproject.toml @@ -0,0 +1,10 @@ +[project] +name = "py-image" +version = "0.0.0" +requires-python = ">=3.12,<3.13" +dependencies = [ + "backports-strenum==1.2.8", + "backports-tarfile==1.2.0", + "colorama==0.4.6", + "google-crc32c==1.7.1", +] diff --git a/examples/py_image_with_rules_img_and_rules_python/requirements.txt b/examples/py_image_with_rules_img_and_rules_python/requirements.txt new file mode 100644 index 0000000..8f1ddec --- /dev/null +++ b/examples/py_image_with_rules_img_and_rules_python/requirements.txt @@ -0,0 +1,22 @@ +# This file was autogenerated by uv via the following command: +# uv export --no-emit-project --format requirements-txt --output-file requirements.txt +backports-strenum==1.2.8 \ + --hash=sha256:4dd47365fd427ac8028aeb1ad3628ea38e67c4d0336ceebd5c0f113e0c487ce9 \ + --hash=sha256:fc297cb26971f7d5e15a478a06a78575197f81daea47975771b1aae996dcccf4 + # via py-image +backports-tarfile==1.2.0 \ + --hash=sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34 \ + --hash=sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991 + # via py-image +colorama==0.4.6 \ + --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ + --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 + # via py-image +google-crc32c==1.7.1 \ + --hash=sha256:19eafa0e4af11b0a4eb3974483d55d2d77ad1911e6cf6f832e1574f6781fd337 \ + --hash=sha256:22beacf83baaf59f9d3ab2bbb4db0fb018da8e5aebdce07ef9f09fce8220285e \ + --hash=sha256:2bff2305f98846f3e825dbeec9ee406f89da7962accdb29356e4eadc251bd472 \ + --hash=sha256:2d73a68a653c57281401871dd4aeebbb6af3191dcac751a76ce430df4d403194 \ + --hash=sha256:b6d86616faaea68101195c6bdc40c494e4d76f41e07a37ffdef270879c15fb65 \ + --hash=sha256:b7491bdc0c7564fcf48c0179d2048ab2f7c7ba36b84ccd3a3e1c3f7a72d3bba6 + # via py-image diff --git a/examples/py_image_with_rules_img_and_rules_python/shared/BUILD.bazel b/examples/py_image_with_rules_img_and_rules_python/shared/BUILD.bazel new file mode 100644 index 0000000..ca180c9 --- /dev/null +++ b/examples/py_image_with_rules_img_and_rules_python/shared/BUILD.bazel @@ -0,0 +1,34 @@ +load("@rules_layer_optimizer//inference:defs.bzl", "env_inference_bundle", "layer_inference_bundle") +load("@rules_layer_optimizer//python:inference.bzl", "apt_inference", "env_inference") + +exports_files(["apt.lock.json"]) + +# Example of mapping a python package to an environment variable that will be +# inferred by the image macro. If a py_binary transitively depends on this +# package, the image macro will include the environment variable in the image. +env_inference( + name = "colorama_env", + env = {"COLORAMA_AVAILABLE": "1"}, + for_deps = ["@pip//colorama"], +) + +env_inference_bundle( + name = "env_inferences", + inferences = [":colorama_env"], + visibility = ["//visibility:public"], +) + +# Example of mapping a python package to an apt package that will be +# inferred by the image macro. If a py_binary transitively depends on this +# package, the image macro will include the apt package in the image. +apt_inference( + name = "google_crc32c_apt", + for_deps = ["@pip//google_crc32c"], + packages = ["@noble//libstdc++6"], +) + +layer_inference_bundle( + name = "apt_inferences", + inferences = [":google_crc32c_apt"], + visibility = ["//visibility:public"], +) diff --git a/examples/py_image_with_rules_img_and_rules_python/shared/apt.lock.json b/examples/py_image_with_rules_img_and_rules_python/shared/apt.lock.json new file mode 100644 index 0000000..75ee7c1 --- /dev/null +++ b/examples/py_image_with_rules_img_and_rules_python/shared/apt.lock.json @@ -0,0 +1,43 @@ +{ + "version": 2, + "dependency_sets": { + "noble": { + "sets": { + "amd64": { + "/noble/base-files:amd64": "13ubuntu10", + "/noble/bash:amd64": "5.2.21-2ubuntu4", + "/noble/ca-certificates:amd64": "20240203", + "/noble/coreutils:amd64": "9.4-3ubuntu6", + "/noble/gawk:amd64": "1:5.2.1-2build3", + "/noble/gcc-14-base:amd64": "14-20240412-0ubuntu1", + "/noble/grep:amd64": "3.11-4build1", + "/noble/libc6:amd64": "2.39-0ubuntu8", + "/noble/libgcc-s1:amd64": "14-20240412-0ubuntu1", + "/noble/libssl3t64:amd64": "3.0.13-0ubuntu3", + "/noble/libstdc++6:amd64": "14-20240412-0ubuntu1", + "/noble/netbase:amd64": "6.4", + "/noble/openssl:amd64": "3.0.13-0ubuntu3", + "/noble/sed:amd64": "4.9-2build1", + "/noble/tzdata:amd64": "2024a-2ubuntu1" + } + } + } + }, + "packages": { + "/noble/base-files:amd64=13ubuntu10": {"name": "base-files", "size": 73634, "version": "13ubuntu10"}, + "/noble/bash:amd64=5.2.21-2ubuntu4": {"name": "bash", "size": 794086, "version": "5.2.21-2ubuntu4"}, + "/noble/ca-certificates:amd64=20240203": {"name": "ca-certificates", "size": 159378, "version": "20240203"}, + "/noble/coreutils:amd64=9.4-3ubuntu6": {"name": "coreutils", "size": 1412418, "version": "9.4-3ubuntu6"}, + "/noble/gawk:amd64=1:5.2.1-2build3": {"name": "gawk", "size": 462772, "version": "1:5.2.1-2build3"}, + "/noble/gcc-14-base:amd64=14-20240412-0ubuntu1": {"name": "gcc-14-base", "size": 47612, "version": "14-20240412-0ubuntu1"}, + "/noble/grep:amd64=3.11-4build1": {"name": "grep", "size": 162040, "version": "3.11-4build1"}, + "/noble/libc6:amd64=2.39-0ubuntu8": {"name": "libc6", "size": 3264806, "version": "2.39-0ubuntu8"}, + "/noble/libgcc-s1:amd64=14-20240412-0ubuntu1": {"name": "libgcc-s1", "size": 78484, "version": "14-20240412-0ubuntu1"}, + "/noble/libssl3t64:amd64=3.0.13-0ubuntu3": {"name": "libssl3t64", "size": 1936306, "version": "3.0.13-0ubuntu3"}, + "/noble/libstdc++6:amd64=14-20240412-0ubuntu1": {"name": "libstdc++6", "size": 795158, "version": "14-20240412-0ubuntu1"}, + "/noble/netbase:amd64=6.4": {"name": "netbase", "size": 13112, "version": "6.4"}, + "/noble/openssl:amd64=3.0.13-0ubuntu3": {"name": "openssl", "size": 1001730, "version": "3.0.13-0ubuntu3"}, + "/noble/sed:amd64=4.9-2build1": {"name": "sed", "size": 193410, "version": "4.9-2build1"}, + "/noble/tzdata:amd64=2024a-2ubuntu1": {"name": "tzdata", "size": 273318, "version": "2024a-2ubuntu1"} + } +} diff --git a/examples/py_image_with_rules_img_and_rules_python/shared/interpreter.bzl b/examples/py_image_with_rules_img_and_rules_python/shared/interpreter.bzl new file mode 100644 index 0000000..85ca59e --- /dev/null +++ b/examples/py_image_with_rules_img_and_rules_python/shared/interpreter.bzl @@ -0,0 +1,18 @@ +"""Interpreter path inside images built by the py_image macro. + +rules_python's py_image_layer archives the binary's interpreter at its +runfiles path. This helper names that directory for the image test. +""" + +_TOOLCHAIN_FILES = "@python_3_12_x86_64-unknown-linux-gnu//:files" + +def interpreter_runfiles_dir(): + """Return the interpreter directory inside the image. + + This is the canonical repository name of the registered toolchain, beneath + /app.runfiles. + + Returns: + The runfiles directory of the rules_python toolchain. + """ + return "app.runfiles/" + Label(_TOOLCHAIN_FILES).repo_name diff --git a/examples/py_image_with_rules_img_and_rules_python/shared/py_image.bzl b/examples/py_image_with_rules_img_and_rules_python/shared/py_image.bzl new file mode 100644 index 0000000..a1c1a84 --- /dev/null +++ b/examples/py_image_with_rules_img_and_rules_python/shared/py_image.bzl @@ -0,0 +1,95 @@ +"""Caller-owned py_image macro with a two-argument call site. + +The ruleset does not export this macro. Repositories own the base apt packages, +budget, and apt and environment mappings in //shared. +""" + +load("@rules_img//img:image.bzl", "image_manifest") +load("@rules_layer_optimizer//layers:defs.bzl", "MAX_DOCKER_LAYERS", "layer_group") +load("@rules_layer_optimizer//layers:distroless.bzl", "optimized_layers") +load("@rules_layer_optimizer//python:inference.bzl", "env_file", "inferred_apt_deps") +load("@rules_layer_optimizer//python:rules_python.bzl", "py_image_layer") + +# Installed instead of an OCI base image. Enough for a py_binary to run. +_BASE_APT_PACKAGES = [ + "@noble//base-files", + "@noble//ca-certificates", + "@noble//netbase", + "@noble//libssl3t64", + "@noble//openssl", + "@noble//libstdc++6", + "@noble//tzdata", + "@noble//bash", + "@noble//coreutils", + "@noble//gawk", + "@noble//sed", + "@noble//grep", +] + +def py_image(name, binary): + """Build an OCI image from a rules_python py_binary. + + Args: + name: Image target name. + binary: py_binary to package. Its main-repo path is `package/name`. + """ + layers = "{}_layers".format(name) + py_image_layer( + name = layers, + binary = binary, + compress = "gzip", + strip_prefix = _binary_path(binary), + ) + + inferred_apt_deps( + name = "{}_apt_layers".format(name), + base_packages = _BASE_APT_PACKAGES, + deps = [binary], + inferences = ["//shared:apt_inferences"], + ) + + optimized_layers( + name = "{}_optimized".format(name), + compress = "gzip", + groups = [ + layer_group( + name = "apt", + overflow = "flatten", + targets = [":{}_apt_layers".format(name)], + ), + layer_group( + name = "interpreter", + targets = [":{}_interpreter".format(layers)], + ), + layer_group( + name = "pip", + overflow = "flatten", + targets = [":{}_pip".format(layers)], + ), + layer_group( + name = "source", + targets = [":{}_source".format(layers)], + ), + ], + layer_budget = MAX_DOCKER_LAYERS, + size_bytes_threshold = 1024 * 1024, + ) + + env_file( + name = "{}_env".format(name), + deps = [binary], + inferences = ["//shared:env_inferences"], + ) + + image_manifest( + name = name, + cmd = [], + entrypoint = ["/app"], + env_file = ":{}_env".format(name), + layers = [":{}_optimized".format(name)], + visibility = ["//visibility:public"], + ) + +def _binary_path(binary): + label = native.package_relative_label(binary) + return label.package + "/" + label.name if label.package else label.name diff --git a/examples/py_image_with_rules_img_and_rules_python/uv.lock b/examples/py_image_with_rules_img_and_rules_python/uv.lock new file mode 100644 index 0000000..c93c147 --- /dev/null +++ b/examples/py_image_with_rules_img_and_rules_python/uv.lock @@ -0,0 +1,62 @@ +version = 1 +revision = 3 +requires-python = "==3.12.*" + +[[package]] +name = "backports-strenum" +version = "1.2.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/f1/611f9ce7f5ede2e8156d3bc6cd2c62a7f2ff07d73b948925da84785cf331/backports_strenum-1.2.8.tar.gz", hash = "sha256:4dd47365fd427ac8028aeb1ad3628ea38e67c4d0336ceebd5c0f113e0c487ce9", size = 7110, upload-time = "2023-09-19T16:10:33.042Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/d0/a70b2e038cdab32ed2dbbf06d292d010fc208508bb187714306a87384c54/backports_strenum-1.2.8-py3-none-any.whl", hash = "sha256:fc297cb26971f7d5e15a478a06a78575197f81daea47975771b1aae996dcccf4", size = 7862, upload-time = "2023-09-19T16:10:31.827Z" }, +] + +[[package]] +name = "backports-tarfile" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/86/72/cd9b395f25e290e633655a100af28cb253e4393396264a98bd5f5951d50f/backports_tarfile-1.2.0.tar.gz", hash = "sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991", size = 86406, upload-time = "2024-05-28T17:01:54.731Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/fa/123043af240e49752f1c4bd24da5053b6bd00cad78c2be53c0d1e8b975bc/backports.tarfile-1.2.0-py3-none-any.whl", hash = "sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34", size = 30181, upload-time = "2024-05-28T17:01:53.112Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "google-crc32c" +version = "1.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/19/ae/87802e6d9f9d69adfaedfcfd599266bf386a54d0be058b532d04c794f76d/google_crc32c-1.7.1.tar.gz", hash = "sha256:2bff2305f98846f3e825dbeec9ee406f89da7962accdb29356e4eadc251bd472", size = 14495, upload-time = "2025-03-26T14:29:13.32Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dd/b7/787e2453cf8639c94b3d06c9d61f512234a82e1d12d13d18584bd3049904/google_crc32c-1.7.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2d73a68a653c57281401871dd4aeebbb6af3191dcac751a76ce430df4d403194", size = 30470, upload-time = "2025-03-26T14:34:31.655Z" }, + { url = "https://files.pythonhosted.org/packages/ed/b4/6042c2b0cbac3ec3a69bb4c49b28d2f517b7a0f4a0232603c42c58e22b44/google_crc32c-1.7.1-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:22beacf83baaf59f9d3ab2bbb4db0fb018da8e5aebdce07ef9f09fce8220285e", size = 30315, upload-time = "2025-03-26T15:01:54.634Z" }, + { url = "https://files.pythonhosted.org/packages/29/ad/01e7a61a5d059bc57b702d9ff6a18b2585ad97f720bd0a0dbe215df1ab0e/google_crc32c-1.7.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19eafa0e4af11b0a4eb3974483d55d2d77ad1911e6cf6f832e1574f6781fd337", size = 33180, upload-time = "2025-03-26T14:41:32.168Z" }, + { url = "https://files.pythonhosted.org/packages/3b/a5/7279055cf004561894ed3a7bfdf5bf90a53f28fadd01af7cd166e88ddf16/google_crc32c-1.7.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6d86616faaea68101195c6bdc40c494e4d76f41e07a37ffdef270879c15fb65", size = 32794, upload-time = "2025-03-26T14:41:33.264Z" }, + { url = "https://files.pythonhosted.org/packages/0f/d6/77060dbd140c624e42ae3ece3df53b9d811000729a5c821b9fd671ceaac6/google_crc32c-1.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:b7491bdc0c7564fcf48c0179d2048ab2f7c7ba36b84ccd3a3e1c3f7a72d3bba6", size = 33477, upload-time = "2025-03-26T14:29:10.94Z" }, +] + +[[package]] +name = "py-image" +version = "0.0.0" +source = { virtual = "." } +dependencies = [ + { name = "backports-strenum" }, + { name = "backports-tarfile" }, + { name = "colorama" }, + { name = "google-crc32c" }, +] + +[package.metadata] +requires-dist = [ + { name = "backports-strenum", specifier = "==1.2.8" }, + { name = "backports-tarfile", specifier = "==1.2.0" }, + { name = "colorama", specifier = "==0.4.6" }, + { name = "google-crc32c", specifier = "==1.7.1" }, +] diff --git a/examples/py_image_with_rules_oci_and_aspect_rules_py/.bazelrc b/examples/py_image_with_rules_oci_and_aspect_rules_py/.bazelrc new file mode 100644 index 0000000..287c50e --- /dev/null +++ b/examples/py_image_with_rules_oci_and_aspect_rules_py/.bazelrc @@ -0,0 +1,7 @@ +import %workspace%/../../.bazelrc + +build --@pip//dep_group=py-image + +# rules_python's own module defaults to 3.11. Pin 3.12 so it agrees with the +# aspect_rules_py interpreter. +build --@rules_python//python/config_settings:python_version=3.12 diff --git a/examples/py_image_with_rules_oci_and_aspect_rules_py/.bazelversion b/examples/py_image_with_rules_oci_and_aspect_rules_py/.bazelversion new file mode 100644 index 0000000..deeb3d6 --- /dev/null +++ b/examples/py_image_with_rules_oci_and_aspect_rules_py/.bazelversion @@ -0,0 +1 @@ +9.2.0 diff --git a/examples/py_image_with_rules_oci_and_aspect_rules_py/BUILD.bazel b/examples/py_image_with_rules_oci_and_aspect_rules_py/BUILD.bazel new file mode 100644 index 0000000..7154579 --- /dev/null +++ b/examples/py_image_with_rules_oci_and_aspect_rules_py/BUILD.bazel @@ -0,0 +1,4 @@ +exports_files([ + "pyproject.toml", + "uv.lock", +]) diff --git a/examples/py_image_with_rules_oci_and_aspect_rules_py/MODULE.bazel b/examples/py_image_with_rules_oci_and_aspect_rules_py/MODULE.bazel new file mode 100644 index 0000000..ebfa04b --- /dev/null +++ b/examples/py_image_with_rules_oci_and_aspect_rules_py/MODULE.bazel @@ -0,0 +1,77 @@ +module(name = "rules_layer_optimizer_py_image") + +bazel_dep(name = "rules_layer_optimizer") +local_path_override( + module_name = "rules_layer_optimizer", + path = "../..", +) + +bazel_dep(name = "aspect_rules_py", version = "2.0.0-alpha.4") +bazel_dep(name = "aspect_bazel_lib", version = "2.22.0") +bazel_dep(name = "bazel_skylib", version = "1.9.0") +bazel_dep(name = "rules_distroless", version = "0.9.4") +bazel_dep(name = "rules_oci", version = "2.2.6") +bazel_dep(name = "rules_python", version = "1.9.0") + +python = use_extension("@aspect_rules_py//py:extensions.bzl", "python_interpreters") +python.toolchain(python_version = "3.12") +use_repo(python, "python_3_12_x86_64_unknown_linux_gnu", "python_interpreters") + +register_toolchains("@python_interpreters//:all") + +apt = use_extension("@rules_distroless//apt:extensions.bzl", "apt") +apt.sources_list( + architectures = ["amd64"], + components = ["main"], + suites = ["noble"], + types = ["deb"], + uris = ["https://snapshot.ubuntu.com/ubuntu/20240601T000000Z"], +) +apt.install( + dependency_set = "noble", + packages = [ + "base-files", + "bash", + "ca-certificates", + "coreutils", + "gawk", + "grep", + "libssl3t64", + "libstdc++6", + "netbase", + "openssl", + "sed", + "tzdata", + ], + suites = ["noble"], +) +apt.lock(into = "//shared:apt.lock.json") +use_repo(apt, "noble") + +uv = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv") +uv.declare_hub(hub_name = "pip") +uv.project( + hub_name = "pip", + lock = "//:uv.lock", + pyproject = "//:pyproject.toml", +) +use_repo(uv, "pip") + +inference = use_extension("@rules_layer_optimizer//inference:extensions.bzl", "oci_image_inference") +inference.configure( + dependency_attributes = [ + "deps", + "src", + "srcs", + "actual", + "venv", + ], + pip_hub = "@pip//:defs.bzl", +) +inference.pip_size_hint(lock = "//:uv.lock") +inference.apt_size_hint( + dependency_set = "noble", + lock = "//shared:apt.lock.json", + repository = "@noble//:dpkg_status", +) +use_repo(inference, "oci_image_inference_config") diff --git a/examples/py_image_with_rules_oci_and_aspect_rules_py/MODULE.bazel.lock b/examples/py_image_with_rules_oci_and_aspect_rules_py/MODULE.bazel.lock new file mode 100644 index 0000000..7279f91 --- /dev/null +++ b/examples/py_image_with_rules_oci_and_aspect_rules_py/MODULE.bazel.lock @@ -0,0 +1,2504 @@ +{ + "lockFileVersion": 28, + "registryFileHashes": { + "https://bcr.bazel.build/bazel_registry.json": "8a28e4aff06ee60aed2a8c281907fb8bcbf3b753c91fb5a5c57da3215d5b3497", + "https://bcr.bazel.build/modules/abseil-cpp/20210324.2/MODULE.bazel": "7cd0312e064fde87c8d1cd79ba06c876bd23630c83466e9500321be55c96ace2", + "https://bcr.bazel.build/modules/abseil-cpp/20211102.0/MODULE.bazel": "70390338f7a5106231d20620712f7cccb659cd0e9d073d1991c038eb9fc57589", + "https://bcr.bazel.build/modules/abseil-cpp/20230125.1/MODULE.bazel": "89047429cb0207707b2dface14ba7f8df85273d484c2572755be4bab7ce9c3a0", + "https://bcr.bazel.build/modules/abseil-cpp/20230802.0.bcr.1/MODULE.bazel": "1c8cec495288dccd14fdae6e3f95f772c1c91857047a098fad772034264cc8cb", + "https://bcr.bazel.build/modules/abseil-cpp/20230802.0/MODULE.bazel": "d253ae36a8bd9ee3c5955384096ccb6baf16a1b1e93e858370da0a3b94f77c16", + "https://bcr.bazel.build/modules/abseil-cpp/20230802.1/MODULE.bazel": "fa92e2eb41a04df73cdabeec37107316f7e5272650f81d6cc096418fe647b915", + "https://bcr.bazel.build/modules/abseil-cpp/20240116.1/MODULE.bazel": "37bcdb4440fbb61df6a1c296ae01b327f19e9bb521f9b8e26ec854b6f97309ed", + "https://bcr.bazel.build/modules/abseil-cpp/20240116.2/MODULE.bazel": "73939767a4686cd9a520d16af5ab440071ed75cec1a876bf2fcfaf1f71987a16", + "https://bcr.bazel.build/modules/abseil-cpp/20250127.1/MODULE.bazel": "c4a89e7ceb9bf1e25cf84a9f830ff6b817b72874088bf5141b314726e46a57c1", + "https://bcr.bazel.build/modules/abseil-cpp/20250512.1/MODULE.bazel": "d209fdb6f36ffaf61c509fcc81b19e81b411a999a934a032e10cd009a0226215", + "https://bcr.bazel.build/modules/abseil-cpp/20250814.1/MODULE.bazel": "51f2312901470cdab0dbdf3b88c40cd21c62a7ed58a3de45b365ddc5b11bcab2", + "https://bcr.bazel.build/modules/abseil-cpp/20250814.1/source.json": "cea3901d7e299da7320700abbaafe57a65d039f10d0d7ea601c4a66938ea4b0c", + "https://bcr.bazel.build/modules/apple_support/1.11.1/MODULE.bazel": "1843d7cd8a58369a444fc6000e7304425fba600ff641592161d9f15b179fb896", + "https://bcr.bazel.build/modules/apple_support/1.15.1/MODULE.bazel": "a0556fefca0b1bb2de8567b8827518f94db6a6e7e7d632b4c48dc5f865bc7c85", + "https://bcr.bazel.build/modules/apple_support/1.21.0/MODULE.bazel": "ac1824ed5edf17dee2fdd4927ada30c9f8c3b520be1b5fd02a5da15bc10bff3e", + "https://bcr.bazel.build/modules/apple_support/1.21.1/MODULE.bazel": "5809fa3efab15d1f3c3c635af6974044bac8a4919c62238cce06acee8a8c11f1", + "https://bcr.bazel.build/modules/apple_support/1.24.2/MODULE.bazel": "0e62471818affb9f0b26f128831d5c40b074d32e6dda5a0d3852847215a41ca4", + "https://bcr.bazel.build/modules/apple_support/1.24.2/source.json": "2c22c9827093250406c5568da6c54e6fdf0ef06238def3d99c71b12feb057a8d", + "https://bcr.bazel.build/modules/aspect_bazel_lib/2.14.0/MODULE.bazel": "2b31ffcc9bdc8295b2167e07a757dbbc9ac8906e7028e5170a3708cecaac119f", + "https://bcr.bazel.build/modules/aspect_bazel_lib/2.19.3/MODULE.bazel": "253d739ba126f62a5767d832765b12b59e9f8d2bc88cc1572f4a73e46eb298ca", + "https://bcr.bazel.build/modules/aspect_bazel_lib/2.22.0/MODULE.bazel": "7fe0191f047d4fe4a4a46c1107e2350cbb58a8fc2e10913aa4322d3190dec0bf", + "https://bcr.bazel.build/modules/aspect_bazel_lib/2.22.0/source.json": "369df5b7f2eae82f200fff95cf1425f90dee90a0d0948122060b48150ff0e224", + "https://bcr.bazel.build/modules/aspect_bazel_lib/2.7.2/MODULE.bazel": "780d1a6522b28f5edb7ea09630748720721dfe27690d65a2d33aa7509de77e07", + "https://bcr.bazel.build/modules/aspect_bazel_lib/2.8.1/MODULE.bazel": "812d2dd42f65dca362152101fbec418029cc8fd34cbad1a2fde905383d705838", + "https://bcr.bazel.build/modules/aspect_rules_py/2.0.0-alpha.4/MODULE.bazel": "4d9f393a947c01809556659cc4b07b76b25d98f25a8062280e506b5c296b89cf", + "https://bcr.bazel.build/modules/aspect_rules_py/2.0.0-alpha.4/source.json": "fcf828898c74224aff425d991755e5bc6346e9ff4da74e0b286f9bc19c5424c4", + "https://bcr.bazel.build/modules/aspect_tools_telemetry/0.3.3/MODULE.bazel": "37c764292861c2f70314efa9846bb6dbb44fc0308903b3285da6528305450183", + "https://bcr.bazel.build/modules/aspect_tools_telemetry/0.3.3/source.json": "605086bbc197743a0d360f7ddc550a1d4dfa0441bc807236e17170f636153348", + "https://bcr.bazel.build/modules/bazel_features/1.1.1/MODULE.bazel": "27b8c79ef57efe08efccbd9dd6ef70d61b4798320b8d3c134fd571f78963dbcd", + "https://bcr.bazel.build/modules/bazel_features/1.10.0/MODULE.bazel": "f75e8807570484a99be90abcd52b5e1f390362c258bcb73106f4544957a48101", + "https://bcr.bazel.build/modules/bazel_features/1.11.0/MODULE.bazel": "f9382337dd5a474c3b7d334c2f83e50b6eaedc284253334cf823044a26de03e8", + "https://bcr.bazel.build/modules/bazel_features/1.15.0/MODULE.bazel": "d38ff6e517149dc509406aca0db3ad1efdd890a85e049585b7234d04238e2a4d", + "https://bcr.bazel.build/modules/bazel_features/1.17.0/MODULE.bazel": "039de32d21b816b47bd42c778e0454217e9c9caac4a3cf8e15c7231ee3ddee4d", + "https://bcr.bazel.build/modules/bazel_features/1.18.0/MODULE.bazel": "1be0ae2557ab3a72a57aeb31b29be347bcdc5d2b1eb1e70f39e3851a7e97041a", + "https://bcr.bazel.build/modules/bazel_features/1.19.0/MODULE.bazel": "59adcdf28230d220f0067b1f435b8537dd033bfff8db21335ef9217919c7fb58", + "https://bcr.bazel.build/modules/bazel_features/1.20.0/MODULE.bazel": "8b85300b9c8594752e0721a37210e34879d23adc219ed9dc8f4104a4a1750920", + "https://bcr.bazel.build/modules/bazel_features/1.21.0/MODULE.bazel": "675642261665d8eea09989aa3b8afb5c37627f1be178382c320d1b46afba5e3b", + "https://bcr.bazel.build/modules/bazel_features/1.23.0/MODULE.bazel": "fd1ac84bc4e97a5a0816b7fd7d4d4f6d837b0047cf4cbd81652d616af3a6591a", + "https://bcr.bazel.build/modules/bazel_features/1.24.0/MODULE.bazel": "4796b4c25b47053e9bbffa792b3792d07e228ff66cd0405faef56a978708acd4", + "https://bcr.bazel.build/modules/bazel_features/1.27.0/MODULE.bazel": "621eeee06c4458a9121d1f104efb80f39d34deff4984e778359c60eaf1a8cb65", + "https://bcr.bazel.build/modules/bazel_features/1.28.0/MODULE.bazel": "4b4200e6cbf8fa335b2c3f43e1d6ef3e240319c33d43d60cc0fbd4b87ece299d", + "https://bcr.bazel.build/modules/bazel_features/1.3.0/MODULE.bazel": "cdcafe83ec318cda34e02948e81d790aab8df7a929cec6f6969f13a489ccecd9", + "https://bcr.bazel.build/modules/bazel_features/1.30.0/MODULE.bazel": "a14b62d05969a293b80257e72e597c2da7f717e1e69fa8b339703ed6731bec87", + "https://bcr.bazel.build/modules/bazel_features/1.33.0/MODULE.bazel": "8b8dc9d2a4c88609409c3191165bccec0e4cb044cd7a72ccbe826583303459f6", + "https://bcr.bazel.build/modules/bazel_features/1.34.0/MODULE.bazel": "e8475ad7c8965542e0c7aac8af68eb48c4af904be3d614b6aa6274c092c2ea1e", + "https://bcr.bazel.build/modules/bazel_features/1.38.0/MODULE.bazel": "f9b8a9c890ebd216b4049fd12a31d3c2602e3403c7af636b04fbbd7453edc9c9", + "https://bcr.bazel.build/modules/bazel_features/1.4.1/MODULE.bazel": "e45b6bb2350aff3e442ae1111c555e27eac1d915e77775f6fdc4b351b758b5d7", + "https://bcr.bazel.build/modules/bazel_features/1.42.1/MODULE.bazel": "275a59b5406ff18c01739860aa70ad7ccb3cfb474579411decca11c93b951080", + "https://bcr.bazel.build/modules/bazel_features/1.43.0/MODULE.bazel": "defa2226f06ba20550d6548c3a2ea2a7929634437a52973869c20c225450eb91", + "https://bcr.bazel.build/modules/bazel_features/1.43.0/source.json": "1c4207dc858d6de0eecef30026793616bbf420c74aac27b6bad212534a730437", + "https://bcr.bazel.build/modules/bazel_features/1.9.0/MODULE.bazel": "885151d58d90d8d9c811eb75e3288c11f850e1d6b481a8c9f766adee4712358b", + "https://bcr.bazel.build/modules/bazel_features/1.9.1/MODULE.bazel": "8f679097876a9b609ad1f60249c49d68bfab783dd9be012faf9d82547b14815a", + "https://bcr.bazel.build/modules/bazel_lib/3.0.0-beta.1/MODULE.bazel": "407729e232f611c3270005b016b437005daa7b1505826798ea584169a476e878", + "https://bcr.bazel.build/modules/bazel_lib/3.0.0-rc.0/MODULE.bazel": "d6e00979a98ac14ada5e31c8794708b41434d461e7e7ca39b59b765e6d233b18", + "https://bcr.bazel.build/modules/bazel_lib/3.0.0/MODULE.bazel": "22b70b80ac89ad3f3772526cd9feee2fa412c2b01933fea7ed13238a448d370d", + "https://bcr.bazel.build/modules/bazel_lib/3.0.0/source.json": "895f21909c6fba01d7c17914bb6c8e135982275a1b18cdaa4e62272217ef1751", + "https://bcr.bazel.build/modules/bazel_skylib/1.0.3/MODULE.bazel": "bcb0fd896384802d1ad283b4e4eb4d718eebd8cb820b0a2c3a347fb971afd9d8", + "https://bcr.bazel.build/modules/bazel_skylib/1.1.1/MODULE.bazel": "1add3e7d93ff2e6998f9e118022c84d163917d912f5afafb3058e3d2f1545b5e", + "https://bcr.bazel.build/modules/bazel_skylib/1.2.0/MODULE.bazel": "44fe84260e454ed94ad326352a698422dbe372b21a1ac9f3eab76eb531223686", + "https://bcr.bazel.build/modules/bazel_skylib/1.2.1/MODULE.bazel": "f35baf9da0efe45fa3da1696ae906eea3d615ad41e2e3def4aeb4e8bc0ef9a7a", + "https://bcr.bazel.build/modules/bazel_skylib/1.3.0/MODULE.bazel": "20228b92868bf5cfc41bda7afc8a8ba2a543201851de39d990ec957b513579c5", + "https://bcr.bazel.build/modules/bazel_skylib/1.4.1/MODULE.bazel": "a0dcb779424be33100dcae821e9e27e4f2901d9dfd5333efe5ac6a8d7ab75e1d", + "https://bcr.bazel.build/modules/bazel_skylib/1.4.2/MODULE.bazel": "3bd40978e7a1fac911d5989e6b09d8f64921865a45822d8b09e815eaa726a651", + "https://bcr.bazel.build/modules/bazel_skylib/1.5.0/MODULE.bazel": "32880f5e2945ce6a03d1fbd588e9198c0a959bb42297b2cfaf1685b7bc32e138", + "https://bcr.bazel.build/modules/bazel_skylib/1.6.1/MODULE.bazel": "8fdee2dbaace6c252131c00e1de4b165dc65af02ea278476187765e1a617b917", + "https://bcr.bazel.build/modules/bazel_skylib/1.7.0/MODULE.bazel": "0db596f4563de7938de764cc8deeabec291f55e8ec15299718b93c4423e9796d", + "https://bcr.bazel.build/modules/bazel_skylib/1.7.1/MODULE.bazel": "3120d80c5861aa616222ec015332e5f8d3171e062e3e804a2a0253e1be26e59b", + "https://bcr.bazel.build/modules/bazel_skylib/1.8.0/MODULE.bazel": "2fb3fb53675f6adfc1ca5bfbd5cfb655ae350fba4706d924a8ec7e3ba945671c", + "https://bcr.bazel.build/modules/bazel_skylib/1.8.1/MODULE.bazel": "88ade7293becda963e0e3ea33e7d54d3425127e0a326e0d17da085a5f1f03ff6", + "https://bcr.bazel.build/modules/bazel_skylib/1.8.2/MODULE.bazel": "69ad6927098316848b34a9142bcc975e018ba27f08c4ff403f50c1b6e646ca67", + "https://bcr.bazel.build/modules/bazel_skylib/1.9.0/MODULE.bazel": "72997b29dfd95c3fa0d0c48322d05590418edef451f8db8db5509c57875fb4b7", + "https://bcr.bazel.build/modules/bazel_skylib/1.9.0/source.json": "7ad77c1e8c1b84222d9b3f3cae016a76639435744c19330b0b37c0a3c9da7dc0", + "https://bcr.bazel.build/modules/buildozer/8.5.1/MODULE.bazel": "a35d9561b3fc5b18797c330793e99e3b834a473d5fbd3d7d7634aafc9bdb6f8f", + "https://bcr.bazel.build/modules/buildozer/8.5.1/source.json": "e3386e6ff4529f2442800dee47ad28d3e6487f36a1f75ae39ae56c70f0cd2fbd", + "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.1/MODULE.bazel": "cdf8cbe5ee750db04b78878c9633cc76e80dcf4416cbe982ac3a9222f80713c8", + "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.3/MODULE.bazel": "f1b7bb2dd53e8f2ef984b39485ec8a44e9076dda5c4b8efd2fb4c6a6e856a31d", + "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.7/MODULE.bazel": "1e5e03c383fa64ebbe0942a225c32168fd6ef6b270351bbec481d47d19d1b96d", + "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.7/source.json": "34a83d58ae2f1ef6731d1fc8a1b6f07825741aff3f5993b67b67ec21d2c2946e", + "https://bcr.bazel.build/modules/google_benchmark/1.8.2/MODULE.bazel": "a70cf1bba851000ba93b58ae2f6d76490a9feb74192e57ab8e8ff13c34ec50cb", + "https://bcr.bazel.build/modules/googletest/1.11.0/MODULE.bazel": "3a83f095183f66345ca86aa13c58b59f9f94a2f81999c093d4eeaa2d262d12f4", + "https://bcr.bazel.build/modules/googletest/1.14.0.bcr.1/MODULE.bazel": "22c31a561553727960057361aa33bf20fb2e98584bc4fec007906e27053f80c6", + "https://bcr.bazel.build/modules/googletest/1.14.0/MODULE.bazel": "cfbcbf3e6eac06ef9d85900f64424708cc08687d1b527f0ef65aa7517af8118f", + "https://bcr.bazel.build/modules/googletest/1.15.2/MODULE.bazel": "6de1edc1d26cafb0ea1a6ab3f4d4192d91a312fd2d360b63adaa213cd00b2108", + "https://bcr.bazel.build/modules/googletest/1.17.0/MODULE.bazel": "dbec758171594a705933a29fcf69293d2468c49ec1f2ebca65c36f504d72df46", + "https://bcr.bazel.build/modules/googletest/1.17.0/source.json": "38e4454b25fc30f15439c0378e57909ab1fd0a443158aa35aec685da727cd713", + "https://bcr.bazel.build/modules/hermetic_launcher/0.0.11/MODULE.bazel": "aba15d5a4745cedcb4750faf0c49f946d004ccb09475b6ade1dea4efe0399d82", + "https://bcr.bazel.build/modules/hermetic_launcher/0.0.11/source.json": "0c4d45a10e956dc30c7278de756c81d4b55612218b1a20fa55fc2988063ba4eb", + "https://bcr.bazel.build/modules/jq.bzl/0.1.0/MODULE.bazel": "2ce69b1af49952cd4121a9c3055faa679e748ce774c7f1fda9657f936cae902f", + "https://bcr.bazel.build/modules/jq.bzl/0.1.0/source.json": "746bf13cac0860f091df5e4911d0c593971cd8796b5ad4e809b2f8e133eee3d5", + "https://bcr.bazel.build/modules/jsoncpp/1.9.5/MODULE.bazel": "31271aedc59e815656f5736f282bb7509a97c7ecb43e927ac1a37966e0578075", + "https://bcr.bazel.build/modules/jsoncpp/1.9.6/MODULE.bazel": "2f8d20d3b7d54143213c4dfc3d98225c42de7d666011528dc8fe91591e2e17b0", + "https://bcr.bazel.build/modules/jsoncpp/1.9.6/source.json": "a04756d367a2126c3541682864ecec52f92cdee80a35735a3cb249ce015ca000", + "https://bcr.bazel.build/modules/libpfm/4.11.0/MODULE.bazel": "45061ff025b301940f1e30d2c16bea596c25b176c8b6b3087e92615adbd52902", + "https://bcr.bazel.build/modules/nlohmann_json/3.6.1/MODULE.bazel": "6f7b417dcc794d9add9e556673ad25cb3ba835224290f4f848f8e2db1e1fca74", + "https://bcr.bazel.build/modules/nlohmann_json/3.6.1/source.json": "f448c6e8963fdfa7eb831457df83ad63d3d6355018f6574fb017e8169deb43a9", + "https://bcr.bazel.build/modules/package_metadata/0.0.2/MODULE.bazel": "fb8d25550742674d63d7b250063d4580ca530499f045d70748b1b142081ebb92", + "https://bcr.bazel.build/modules/package_metadata/0.0.3/MODULE.bazel": "77890552ecea9e284b5424c9de827a58099348763a4359e975c359a83d4faa83", + "https://bcr.bazel.build/modules/package_metadata/0.0.3/source.json": "742075a428ad12a3fa18a69014c2f57f01af910c6d9d18646c990200853e641a", + "https://bcr.bazel.build/modules/platforms/0.0.10/MODULE.bazel": "8cb8efaf200bdeb2150d93e162c40f388529a25852b332cec879373771e48ed5", + "https://bcr.bazel.build/modules/platforms/0.0.11/MODULE.bazel": "0daefc49732e227caa8bfa834d65dc52e8cc18a2faf80df25e8caea151a9413f", + "https://bcr.bazel.build/modules/platforms/0.0.4/MODULE.bazel": "9b328e31ee156f53f3c416a64f8491f7eb731742655a47c9eec4703a71644aee", + "https://bcr.bazel.build/modules/platforms/0.0.5/MODULE.bazel": "5733b54ea419d5eaf7997054bb55f6a1d0b5ff8aedf0176fef9eea44f3acda37", + "https://bcr.bazel.build/modules/platforms/0.0.6/MODULE.bazel": "ad6eeef431dc52aefd2d77ed20a4b353f8ebf0f4ecdd26a807d2da5aa8cd0615", + "https://bcr.bazel.build/modules/platforms/0.0.7/MODULE.bazel": "72fd4a0ede9ee5c021f6a8dd92b503e089f46c227ba2813ff183b71616034814", + "https://bcr.bazel.build/modules/platforms/0.0.8/MODULE.bazel": "9f142c03e348f6d263719f5074b21ef3adf0b139ee4c5133e2aa35664da9eb2d", + "https://bcr.bazel.build/modules/platforms/0.0.9/MODULE.bazel": "4a87a60c927b56ddd67db50c89acaa62f4ce2a1d2149ccb63ffd871d5ce29ebc", + "https://bcr.bazel.build/modules/platforms/1.0.0/MODULE.bazel": "f05feb42b48f1b3c225e4ccf351f367be0371411a803198ec34a389fb22aa580", + "https://bcr.bazel.build/modules/platforms/1.1.0/MODULE.bazel": "1c0c09f5bdcf4b3f924720d2478a3711cb39f4977019ca5988685e5b7e18b3d2", + "https://bcr.bazel.build/modules/platforms/1.1.0/source.json": "fcf351c47596c939140ab0d333dfdd08ed1ea6ce33c2fe70c12493a301cf1344", + "https://bcr.bazel.build/modules/protobuf/21.7/MODULE.bazel": "a5a29bb89544f9b97edce05642fac225a808b5b7be74038ea3640fae2f8e66a7", + "https://bcr.bazel.build/modules/protobuf/27.0/MODULE.bazel": "7873b60be88844a0a1d8f80b9d5d20cfbd8495a689b8763e76c6372998d3f64c", + "https://bcr.bazel.build/modules/protobuf/27.1/MODULE.bazel": "703a7b614728bb06647f965264967a8ef1c39e09e8f167b3ca0bb1fd80449c0d", + "https://bcr.bazel.build/modules/protobuf/29.0-rc2/MODULE.bazel": "6241d35983510143049943fc0d57937937122baf1b287862f9dc8590fc4c37df", + "https://bcr.bazel.build/modules/protobuf/29.0-rc3/MODULE.bazel": "33c2dfa286578573afc55a7acaea3cada4122b9631007c594bf0729f41c8de92", + "https://bcr.bazel.build/modules/protobuf/29.1/MODULE.bazel": "557c3457560ff49e122ed76c0bc3397a64af9574691cb8201b4e46d4ab2ecb95", + "https://bcr.bazel.build/modules/protobuf/3.19.0/MODULE.bazel": "6b5fbb433f760a99a22b18b6850ed5784ef0e9928a72668b66e4d7ccd47db9b0", + "https://bcr.bazel.build/modules/protobuf/32.1/MODULE.bazel": "89cd2866a9cb07fee9ff74c41ceace11554f32e0d849de4e23ac55515cfada4d", + "https://bcr.bazel.build/modules/protobuf/33.4/MODULE.bazel": "114775b816b38b6d0ca620450d6b02550c60ceedfdc8d9a229833b34a223dc42", + "https://bcr.bazel.build/modules/protobuf/33.4/source.json": "555f8686b4c7d6b5ba731fbea13bf656b4bfd9a7ff629c1d9d3f6e1d6155de79", + "https://bcr.bazel.build/modules/pybind11_bazel/2.11.1/MODULE.bazel": "88af1c246226d87e65be78ed49ecd1e6f5e98648558c14ce99176da041dc378e", + "https://bcr.bazel.build/modules/pybind11_bazel/2.12.0/MODULE.bazel": "e6f4c20442eaa7c90d7190d8dc539d0ab422f95c65a57cc59562170c58ae3d34", + "https://bcr.bazel.build/modules/pybind11_bazel/2.12.0/source.json": "6900fdc8a9e95866b8c0d4ad4aba4d4236317b5c1cd04c502df3f0d33afed680", + "https://bcr.bazel.build/modules/re2/2023-09-01/MODULE.bazel": "cb3d511531b16cfc78a225a9e2136007a48cf8a677e4264baeab57fe78a80206", + "https://bcr.bazel.build/modules/re2/2024-07-02.bcr.1/MODULE.bazel": "b4963dda9b31080be1905ef085ecd7dd6cd47c05c79b9cdf83ade83ab2ab271a", + "https://bcr.bazel.build/modules/re2/2024-07-02.bcr.1/source.json": "2ff292be6ef3340325ce8a045ecc326e92cbfab47c7cbab4bd85d28971b97ac4", + "https://bcr.bazel.build/modules/re2/2024-07-02/MODULE.bazel": "0eadc4395959969297cbcf31a249ff457f2f1d456228c67719480205aa306daa", + "https://bcr.bazel.build/modules/rules_android/0.1.1/MODULE.bazel": "48809ab0091b07ad0182defb787c4c5328bd3a278938415c00a7b69b50c4d3a8", + "https://bcr.bazel.build/modules/rules_android/0.1.1/source.json": "e6986b41626ee10bdc864937ffb6d6bf275bb5b9c65120e6137d56e6331f089e", + "https://bcr.bazel.build/modules/rules_apple/3.16.0/MODULE.bazel": "0d1caf0b8375942ce98ea944be754a18874041e4e0459401d925577624d3a54a", + "https://bcr.bazel.build/modules/rules_apple/4.1.0/MODULE.bazel": "76e10fd4a48038d3fc7c5dc6e63b7063bbf5304a2e3bd42edda6ec660eebea68", + "https://bcr.bazel.build/modules/rules_apple/4.1.0/source.json": "8ee81e1708756f81b343a5eb2b2f0b953f1d25c4ab3d4a68dc02754872e80715", + "https://bcr.bazel.build/modules/rules_cc/0.0.1/MODULE.bazel": "cb2aa0747f84c6c3a78dad4e2049c154f08ab9d166b1273835a8174940365647", + "https://bcr.bazel.build/modules/rules_cc/0.0.10/MODULE.bazel": "ec1705118f7eaedd6e118508d3d26deba2a4e76476ada7e0e3965211be012002", + "https://bcr.bazel.build/modules/rules_cc/0.0.13/MODULE.bazel": "0e8529ed7b323dad0775ff924d2ae5af7640b23553dfcd4d34344c7e7a867191", + "https://bcr.bazel.build/modules/rules_cc/0.0.15/MODULE.bazel": "6704c35f7b4a72502ee81f61bf88706b54f06b3cbe5558ac17e2e14666cd5dcc", + "https://bcr.bazel.build/modules/rules_cc/0.0.16/MODULE.bazel": "7661303b8fc1b4d7f532e54e9d6565771fea666fbdf839e0a86affcd02defe87", + "https://bcr.bazel.build/modules/rules_cc/0.0.17/MODULE.bazel": "2ae1d8f4238ec67d7185d8861cb0a2cdf4bc608697c331b95bf990e69b62e64a", + "https://bcr.bazel.build/modules/rules_cc/0.0.2/MODULE.bazel": "6915987c90970493ab97393024c156ea8fb9f3bea953b2f3ec05c34f19b5695c", + "https://bcr.bazel.build/modules/rules_cc/0.0.6/MODULE.bazel": "abf360251023dfe3efcef65ab9d56beefa8394d4176dd29529750e1c57eaa33f", + "https://bcr.bazel.build/modules/rules_cc/0.0.8/MODULE.bazel": "964c85c82cfeb6f3855e6a07054fdb159aced38e99a5eecf7bce9d53990afa3e", + "https://bcr.bazel.build/modules/rules_cc/0.0.9/MODULE.bazel": "836e76439f354b89afe6a911a7adf59a6b2518fafb174483ad78a2a2fde7b1c5", + "https://bcr.bazel.build/modules/rules_cc/0.1.1/MODULE.bazel": "2f0222a6f229f0bf44cd711dc13c858dad98c62d52bd51d8fc3a764a83125513", + "https://bcr.bazel.build/modules/rules_cc/0.1.2/MODULE.bazel": "557ddc3a96858ec0d465a87c0a931054d7dcfd6583af2c7ed3baf494407fd8d0", + "https://bcr.bazel.build/modules/rules_cc/0.1.5/MODULE.bazel": "88dfc9361e8b5ae1008ac38f7cdfd45ad738e4fa676a3ad67d19204f045a1fd8", + "https://bcr.bazel.build/modules/rules_cc/0.2.0/MODULE.bazel": "b5c17f90458caae90d2ccd114c81970062946f49f355610ed89bebf954f5783c", + "https://bcr.bazel.build/modules/rules_cc/0.2.13/MODULE.bazel": "eecdd666eda6be16a8d9dc15e44b5c75133405e820f620a234acc4b1fdc5aa37", + "https://bcr.bazel.build/modules/rules_cc/0.2.16/MODULE.bazel": "9242fa89f950c6ef7702801ab53922e99c69b02310c39fb6e62b2bd30df2a1d4", + "https://bcr.bazel.build/modules/rules_cc/0.2.17/MODULE.bazel": "1849602c86cb60da8613d2de887f9566a6d354a6df6d7009f9d04a14402f9a84", + "https://bcr.bazel.build/modules/rules_cc/0.2.18/MODULE.bazel": "4460ec36adc8f722a6a2a4ac9374cb91f2acebadaa93fc37966129afb3dece87", + "https://bcr.bazel.build/modules/rules_cc/0.2.18/source.json": "abad668ff2fd63ada1ac49bf386d37e27048b89a3465a6fd968bb832b00a09d3", + "https://bcr.bazel.build/modules/rules_cc/0.2.4/MODULE.bazel": "1ff1223dfd24f3ecf8f028446d4a27608aa43c3f41e346d22838a4223980b8cc", + "https://bcr.bazel.build/modules/rules_cc/0.2.8/MODULE.bazel": "f1df20f0bf22c28192a794f29b501ee2018fa37a3862a1a2132ae2940a23a642", + "https://bcr.bazel.build/modules/rules_distroless/0.9.4/MODULE.bazel": "e098aab7f99a64d254bd4f425db6d7fb0818e2362f028d1672964ee130615567", + "https://bcr.bazel.build/modules/rules_distroless/0.9.4/source.json": "f4cc35c677da04b354d652a4b5835a7ad1dbd3d53043fbce163a050ae2af85d1", + "https://bcr.bazel.build/modules/rules_foreign_cc/0.9.0/MODULE.bazel": "c9e8c682bf75b0e7c704166d79b599f93b72cfca5ad7477df596947891feeef6", + "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/MODULE.bazel": "40c97d1144356f52905566c55811f13b299453a14ac7769dfba2ac38192337a8", + "https://bcr.bazel.build/modules/rules_java/4.0.0/MODULE.bazel": "5a78a7ae82cd1a33cef56dc578c7d2a46ed0dca12643ee45edbb8417899e6f74", + "https://bcr.bazel.build/modules/rules_java/5.3.5/MODULE.bazel": "a4ec4f2db570171e3e5eb753276ee4b389bae16b96207e9d3230895c99644b86", + "https://bcr.bazel.build/modules/rules_java/6.0.0/MODULE.bazel": "8a43b7df601a7ec1af61d79345c17b31ea1fedc6711fd4abfd013ea612978e39", + "https://bcr.bazel.build/modules/rules_java/6.3.0/MODULE.bazel": "a97c7678c19f236a956ad260d59c86e10a463badb7eb2eda787490f4c969b963", + "https://bcr.bazel.build/modules/rules_java/6.4.0/MODULE.bazel": "e986a9fe25aeaa84ac17ca093ef13a4637f6107375f64667a15999f77db6c8f6", + "https://bcr.bazel.build/modules/rules_java/6.5.2/MODULE.bazel": "1d440d262d0e08453fa0c4d8f699ba81609ed0e9a9a0f02cd10b3e7942e61e31", + "https://bcr.bazel.build/modules/rules_java/7.10.0/MODULE.bazel": "530c3beb3067e870561739f1144329a21c851ff771cd752a49e06e3dc9c2e71a", + "https://bcr.bazel.build/modules/rules_java/7.12.2/MODULE.bazel": "579c505165ee757a4280ef83cda0150eea193eed3bef50b1004ba88b99da6de6", + "https://bcr.bazel.build/modules/rules_java/7.2.0/MODULE.bazel": "06c0334c9be61e6cef2c8c84a7800cef502063269a5af25ceb100b192453d4ab", + "https://bcr.bazel.build/modules/rules_java/7.3.2/MODULE.bazel": "50dece891cfdf1741ea230d001aa9c14398062f2b7c066470accace78e412bc2", + "https://bcr.bazel.build/modules/rules_java/7.6.1/MODULE.bazel": "2f14b7e8a1aa2f67ae92bc69d1ec0fa8d9f827c4e17ff5e5f02e91caa3b2d0fe", + "https://bcr.bazel.build/modules/rules_java/8.3.2/MODULE.bazel": "7336d5511ad5af0b8615fdc7477535a2e4e723a357b6713af439fe8cf0195017", + "https://bcr.bazel.build/modules/rules_java/8.5.1/MODULE.bazel": "d8a9e38cc5228881f7055a6079f6f7821a073df3744d441978e7a43e20226939", + "https://bcr.bazel.build/modules/rules_java/8.6.0/MODULE.bazel": "9c064c434606d75a086f15ade5edb514308cccd1544c2b2a89bbac4310e41c71", + "https://bcr.bazel.build/modules/rules_java/8.6.1/MODULE.bazel": "f4808e2ab5b0197f094cabce9f4b006a27766beb6a9975931da07099560ca9c2", + "https://bcr.bazel.build/modules/rules_java/8.8.0/MODULE.bazel": "de589d0880911ac007abd521b9f0ddcd8b0dbd05c8553e6f8124a050b83acf7d", + "https://bcr.bazel.build/modules/rules_java/9.1.0/MODULE.bazel": "ee63f27e36a3fada80342869361182f120a9819c74320e8e65b1e04ba0cd7a9d", + "https://bcr.bazel.build/modules/rules_java/9.1.0/source.json": "da589573c1dee2c9ac4a568b301269a2e8191110ff0345c1a959fa7ea6c4dfd6", + "https://bcr.bazel.build/modules/rules_jvm_external/4.4.2/MODULE.bazel": "a56b85e418c83eb1839819f0b515c431010160383306d13ec21959ac412d2fe7", + "https://bcr.bazel.build/modules/rules_jvm_external/5.1/MODULE.bazel": "33f6f999e03183f7d088c9be518a63467dfd0be94a11d0055fe2d210f89aa909", + "https://bcr.bazel.build/modules/rules_jvm_external/5.2/MODULE.bazel": "d9351ba35217ad0de03816ef3ed63f89d411349353077348a45348b096615036", + "https://bcr.bazel.build/modules/rules_jvm_external/5.3/MODULE.bazel": "bf93870767689637164657731849fb887ad086739bd5d360d90007a581d5527d", + "https://bcr.bazel.build/modules/rules_jvm_external/6.1/MODULE.bazel": "75b5fec090dbd46cf9b7d8ea08cf84a0472d92ba3585b476f44c326eda8059c4", + "https://bcr.bazel.build/modules/rules_jvm_external/6.3/MODULE.bazel": "c998e060b85f71e00de5ec552019347c8bca255062c990ac02d051bb80a38df0", + "https://bcr.bazel.build/modules/rules_jvm_external/6.7/MODULE.bazel": "e717beabc4d091ecb2c803c2d341b88590e9116b8bf7947915eeb33aab4f96dd", + "https://bcr.bazel.build/modules/rules_jvm_external/6.7/source.json": "5426f412d0a7fc6b611643376c7e4a82dec991491b9ce5cb1cfdd25fe2e92be4", + "https://bcr.bazel.build/modules/rules_kotlin/1.9.0/MODULE.bazel": "ef85697305025e5a61f395d4eaede272a5393cee479ace6686dba707de804d59", + "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/MODULE.bazel": "d269a01a18ee74d0335450b10f62c9ed81f2321d7958a2934e44272fe82dcef3", + "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/source.json": "2faa4794364282db7c06600b7e5e34867a564ae91bda7cae7c29c64e9466b7d5", + "https://bcr.bazel.build/modules/rules_license/0.0.3/MODULE.bazel": "627e9ab0247f7d1e05736b59dbb1b6871373de5ad31c3011880b4133cafd4bd0", + "https://bcr.bazel.build/modules/rules_license/0.0.7/MODULE.bazel": "088fbeb0b6a419005b89cf93fe62d9517c0a2b8bb56af3244af65ecfe37e7d5d", + "https://bcr.bazel.build/modules/rules_license/1.0.0/MODULE.bazel": "a7fda60eefdf3d8c827262ba499957e4df06f659330bbe6cdbdb975b768bb65c", + "https://bcr.bazel.build/modules/rules_license/1.0.0/source.json": "a52c89e54cc311196e478f8382df91c15f7a2bfdf4c6cd0e2675cc2ff0b56efb", + "https://bcr.bazel.build/modules/rules_oci/2.2.6/MODULE.bazel": "2ba6ddd679269e00aeffe9ca04faa2d0ca4129650982c9246d0d459fe2da47d9", + "https://bcr.bazel.build/modules/rules_oci/2.2.6/source.json": "94e7decb8f95d9465b0bbea71c65064cd16083be1350c7468f131818641dc4a5", + "https://bcr.bazel.build/modules/rules_pkg/0.7.0/MODULE.bazel": "df99f03fc7934a4737122518bb87e667e62d780b610910f0447665a7e2be62dc", + "https://bcr.bazel.build/modules/rules_pkg/1.0.1/MODULE.bazel": "5b1df97dbc29623bccdf2b0dcd0f5cb08e2f2c9050aab1092fd39a41e82686ff", + "https://bcr.bazel.build/modules/rules_pkg/1.1.0/MODULE.bazel": "9db8031e71b6ef32d1846106e10dd0ee2deac042bd9a2de22b4761b0c3036453", + "https://bcr.bazel.build/modules/rules_pkg/1.1.0/source.json": "fef768df13a92ce6067e1cd0cdc47560dace01354f1d921cfb1d632511f7d608", + "https://bcr.bazel.build/modules/rules_proto/4.0.0/MODULE.bazel": "a7a7b6ce9bee418c1a760b3d84f83a299ad6952f9903c67f19e4edd964894e06", + "https://bcr.bazel.build/modules/rules_proto/5.3.0-21.7/MODULE.bazel": "e8dff86b0971688790ae75528fe1813f71809b5afd57facb44dad9e8eca631b7", + "https://bcr.bazel.build/modules/rules_proto/6.0.0-rc1/MODULE.bazel": "1e5b502e2e1a9e825eef74476a5a1ee524a92297085015a052510b09a1a09483", + "https://bcr.bazel.build/modules/rules_proto/6.0.2/MODULE.bazel": "ce916b775a62b90b61888052a416ccdda405212b6aaeb39522f7dc53431a5e73", + "https://bcr.bazel.build/modules/rules_proto/7.0.2/MODULE.bazel": "bf81793bd6d2ad89a37a40693e56c61b0ee30f7a7fdbaf3eabbf5f39de47dea2", + "https://bcr.bazel.build/modules/rules_proto/7.1.0/MODULE.bazel": "002d62d9108f75bb807cd56245d45648f38275cb3a99dcd45dfb864c5d74cb96", + "https://bcr.bazel.build/modules/rules_proto/7.1.0/source.json": "39f89066c12c24097854e8f57ab8558929f9c8d474d34b2c00ac04630ad8940e", + "https://bcr.bazel.build/modules/rules_python/0.10.2/MODULE.bazel": "cc82bc96f2997baa545ab3ce73f196d040ffb8756fd2d66125a530031cd90e5f", + "https://bcr.bazel.build/modules/rules_python/0.23.1/MODULE.bazel": "49ffccf0511cb8414de28321f5fcf2a31312b47c40cc21577144b7447f2bf300", + "https://bcr.bazel.build/modules/rules_python/0.25.0/MODULE.bazel": "72f1506841c920a1afec76975b35312410eea3aa7b63267436bfb1dd91d2d382", + "https://bcr.bazel.build/modules/rules_python/0.28.0/MODULE.bazel": "cba2573d870babc976664a912539b320cbaa7114cd3e8f053c720171cde331ed", + "https://bcr.bazel.build/modules/rules_python/0.31.0/MODULE.bazel": "93a43dc47ee570e6ec9f5779b2e64c1476a6ce921c48cc9a1678a91dd5f8fd58", + "https://bcr.bazel.build/modules/rules_python/0.33.2/MODULE.bazel": "3e036c4ad8d804a4dad897d333d8dce200d943df4827cb849840055be8d2e937", + "https://bcr.bazel.build/modules/rules_python/0.4.0/MODULE.bazel": "9208ee05fd48bf09ac60ed269791cf17fb343db56c8226a720fbb1cdf467166c", + "https://bcr.bazel.build/modules/rules_python/1.0.0/MODULE.bazel": "898a3d999c22caa585eb062b600f88654bf92efb204fa346fb55f6f8edffca43", + "https://bcr.bazel.build/modules/rules_python/1.3.0/MODULE.bazel": "8361d57eafb67c09b75bf4bbe6be360e1b8f4f18118ab48037f2bd50aa2ccb13", + "https://bcr.bazel.build/modules/rules_python/1.4.1/MODULE.bazel": "8991ad45bdc25018301d6b7e1d3626afc3c8af8aaf4bc04f23d0b99c938b73a6", + "https://bcr.bazel.build/modules/rules_python/1.6.0/MODULE.bazel": "7e04ad8f8d5bea40451cf80b1bd8262552aa73f841415d20db96b7241bd027d8", + "https://bcr.bazel.build/modules/rules_python/1.7.0/MODULE.bazel": "d01f995ecd137abf30238ad9ce97f8fc3ac57289c8b24bd0bf53324d937a14f8", + "https://bcr.bazel.build/modules/rules_python/1.9.0/MODULE.bazel": "afc3a05f29f09f2d3ee95ad99a145250dab41a2b2d8d6f82cc91936b3213282c", + "https://bcr.bazel.build/modules/rules_python/1.9.0/source.json": "3921ea0b65298d51aead5b9e4a82203d7be9b5918619b58b53f1c259f4e63169", + "https://bcr.bazel.build/modules/rules_shell/0.2.0/MODULE.bazel": "fda8a652ab3c7d8fee214de05e7a9916d8b28082234e8d2c0094505c5268ed3c", + "https://bcr.bazel.build/modules/rules_shell/0.3.0/MODULE.bazel": "de4402cd12f4cc8fda2354fce179fdb068c0b9ca1ec2d2b17b3e21b24c1a937b", + "https://bcr.bazel.build/modules/rules_shell/0.4.1/MODULE.bazel": "00e501db01bbf4e3e1dd1595959092c2fadf2087b2852d3f553b5370f5633592", + "https://bcr.bazel.build/modules/rules_shell/0.6.1/MODULE.bazel": "72e76b0eea4e81611ef5452aa82b3da34caca0c8b7b5c0c9584338aa93bae26b", + "https://bcr.bazel.build/modules/rules_shell/0.6.1/source.json": "20ec05cd5e592055e214b2da8ccb283c7f2a421ea0dc2acbf1aa792e11c03d0c", + "https://bcr.bazel.build/modules/rules_swift/1.16.0/MODULE.bazel": "4a09f199545a60d09895e8281362b1ff3bb08bbde69c6fc87aff5b92fcc916ca", + "https://bcr.bazel.build/modules/rules_swift/2.1.1/MODULE.bazel": "494900a80f944fc7aa61500c2073d9729dff0b764f0e89b824eb746959bc1046", + "https://bcr.bazel.build/modules/rules_swift/2.4.0/MODULE.bazel": "1639617eb1ede28d774d967a738b4a68b0accb40650beadb57c21846beab5efd", + "https://bcr.bazel.build/modules/rules_swift/3.1.2/MODULE.bazel": "72c8f5cf9d26427cee6c76c8e3853eb46ce6b0412a081b2b6db6e8ad56267400", + "https://bcr.bazel.build/modules/rules_swift/3.1.2/source.json": "e85761f3098a6faf40b8187695e3de6d97944e98abd0d8ce579cb2daf6319a66", + "https://bcr.bazel.build/modules/stardoc/0.5.1/MODULE.bazel": "1a05d92974d0c122f5ccf09291442580317cdd859f07a8655f1db9a60374f9f8", + "https://bcr.bazel.build/modules/stardoc/0.5.3/MODULE.bazel": "c7f6948dae6999bf0db32c1858ae345f112cacf98f174c7a8bb707e41b974f1c", + "https://bcr.bazel.build/modules/stardoc/0.5.4/MODULE.bazel": "6569966df04610b8520957cb8e97cf2e9faac2c0309657c537ab51c16c18a2a4", + "https://bcr.bazel.build/modules/stardoc/0.5.6/MODULE.bazel": "c43dabc564990eeab55e25ed61c07a1aadafe9ece96a4efabb3f8bf9063b71ef", + "https://bcr.bazel.build/modules/stardoc/0.6.2/MODULE.bazel": "7060193196395f5dd668eda046ccbeacebfd98efc77fed418dbe2b82ffaa39fd", + "https://bcr.bazel.build/modules/stardoc/0.7.0/MODULE.bazel": "05e3d6d30c099b6770e97da986c53bd31844d7f13d41412480ea265ac9e8079c", + "https://bcr.bazel.build/modules/stardoc/0.7.1/MODULE.bazel": "3548faea4ee5dda5580f9af150e79d0f6aea934fc60c1cc50f4efdd9420759e7", + "https://bcr.bazel.build/modules/stardoc/0.7.2/MODULE.bazel": "fc152419aa2ea0f51c29583fab1e8c99ddefd5b3778421845606ee628629e0e5", + "https://bcr.bazel.build/modules/stardoc/0.7.2/source.json": "58b029e5e901d6802967754adf0a9056747e8176f017cfe3607c0851f4d42216", + "https://bcr.bazel.build/modules/swift_argument_parser/1.3.1.1/MODULE.bazel": "5e463fbfba7b1701d957555ed45097d7f984211330106ccd1352c6e0af0dcf91", + "https://bcr.bazel.build/modules/swift_argument_parser/1.3.1.2/MODULE.bazel": "75aab2373a4bbe2a1260b9bf2a1ebbdbf872d3bd36f80bff058dccd82e89422f", + "https://bcr.bazel.build/modules/swift_argument_parser/1.3.1.2/source.json": "5fba48bbe0ba48761f9e9f75f92876cafb5d07c0ce059cc7a8027416de94a05b", + "https://bcr.bazel.build/modules/tar.bzl/0.10.1/MODULE.bazel": "bf5fda5b5ccef8c3c4a5f4886144377386e0baa382972f257acb42dcf40ea908", + "https://bcr.bazel.build/modules/tar.bzl/0.10.1/source.json": "3f1beb35acf53c270a9de493cdc775a985551d7069cfcf24e136b42f683bbb10", + "https://bcr.bazel.build/modules/tar.bzl/0.2.1/MODULE.bazel": "52d1c00a80a8cc67acbd01649e83d8dd6a9dc426a6c0b754a04fe8c219c76468", + "https://bcr.bazel.build/modules/tar.bzl/0.5.1/MODULE.bazel": "7c2eb3dcfc53b0f3d6f9acdfd911ca803eaf92aadf54f8ca6e4c1f3aee288351", + "https://bcr.bazel.build/modules/tar.bzl/0.6.0/MODULE.bazel": "a3584b4edcfafcabd9b0ef9819808f05b372957bbdff41601429d5fd0aac2e7c", + "https://bcr.bazel.build/modules/toml.bzl/0.3.0/MODULE.bazel": "5016e5dd1ad2200e119a4b28b2b3935e276c4b480f2fe3e952bea7eeba88f578", + "https://bcr.bazel.build/modules/toml.bzl/0.3.0/source.json": "0cf7c878c419b37ddb55f3dd93dd7c0c409bd7c4efacb3da504e0748780b2fa9", + "https://bcr.bazel.build/modules/upb/0.0.0-20220923-a547704/MODULE.bazel": "7298990c00040a0e2f121f6c32544bab27d4452f80d9ce51349b1a28f3005c43", + "https://bcr.bazel.build/modules/with_cfg.bzl/0.14.6/MODULE.bazel": "6b6c543e415d2a502954766e50c6a6144a131687f2751b62157a9250e2b04982", + "https://bcr.bazel.build/modules/with_cfg.bzl/0.14.6/source.json": "12363ac76d821f6c7dabfebbd673615391da06e2e33f576402d31a96a7b56532", + "https://bcr.bazel.build/modules/yq.bzl/0.1.1/MODULE.bazel": "9039681f9bcb8958ee2c87ffc74bdafba9f4369096a2b5634b88abc0eaefa072", + "https://bcr.bazel.build/modules/yq.bzl/0.3.1/MODULE.bazel": "9bcb7151b3cd4681b89d350530eaf7b45e32a44dda94843b8932b0cb1cd4594a", + "https://bcr.bazel.build/modules/yq.bzl/0.3.1/source.json": "f0b0f204a2a6b0e34b4c9541efe8c04f2ef1af65948daa784eccea738b21dbd2", + "https://bcr.bazel.build/modules/zlib/1.2.11/MODULE.bazel": "07b389abc85fdbca459b69e2ec656ae5622873af3f845e1c9d80fe179f3effa0", + "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/MODULE.bazel": "eec517b5bbe5492629466e11dae908d043364302283de25581e3eb944326c4ca", + "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/source.json": "22bc55c47af97246cfc093d0acf683a7869377de362b5d1c552c2c2e16b7a806", + "https://bcr.bazel.build/modules/zlib/1.3.1/MODULE.bazel": "751c9940dcfe869f5f7274e1295422a34623555916eb98c174c1e945594bf198" + }, + "selectedYankedVersions": {}, + "moduleExtensions": { + "@@aspect_tools_telemetry+//:extension.bzl%telemetry": { + "general": { + "bzlTransitiveDigest": "cl5A2O84vDL6Tt+Qga8FCj1DUDGqn+e7ly5rZ+4xvcc=", + "usagesDigest": "kqQBy77VGMZA0qEiCyGKY3JKPhKrjzzyMVYd0SUIw30=", + "recordedInputs": [ + "REPO_MAPPING:aspect_tools_telemetry+,bazel_lib bazel_lib+", + "REPO_MAPPING:aspect_tools_telemetry+,bazel_skylib bazel_skylib+" + ], + "generatedRepoSpecs": { + "aspect_tools_telemetry_report": { + "repoRuleId": "@@aspect_tools_telemetry+//:extension.bzl%tel_repository", + "attributes": { + "deps": { + "aspect_rules_py": "2.0.0-alpha.4", + "aspect_tools_telemetry": "0.3.3" + } + } + } + } + } + }, + "@@rules_distroless+//apt:extensions.bzl%apt": { + "general": { + "bzlTransitiveDigest": "omzIXX2jNzQRBI12IBENt3ZsLWKCt1ooWcbYgrB+Jgw=", + "usagesDigest": "zelz552FSIVANQgGmkLskIS3+Xxye6xZPsoiJA9EXFU=", + "recordedInputs": [ + "REPO_MAPPING:rules_distroless+,bazel_lib bazel_lib+", + "REPO_MAPPING:rules_distroless+,bazel_tools bazel_tools" + ], + "generatedRepoSpecs": { + "noble": { + "repoRuleId": "@@rules_distroless+//apt/private:translate_dependency_set.bzl%translate_dependency_set", + "attributes": { + "depset_name": "noble", + "lock_content": "{\n\t\"dependency_sets\": {\n\t\t\"noble\": {\n\t\t\t\"sets\": {\n\t\t\t\t\"amd64\": {\n\t\t\t\t\t\"/noble/base-files:amd64\": \"13ubuntu10\",\n\t\t\t\t\t\"/noble/bash:amd64\": \"5.2.21-2ubuntu4\",\n\t\t\t\t\t\"/noble/ca-certificates:amd64\": \"20240203\",\n\t\t\t\t\t\"/noble/coreutils:amd64\": \"9.4-3ubuntu6\",\n\t\t\t\t\t\"/noble/gawk:amd64\": \"1:5.2.1-2build3\",\n\t\t\t\t\t\"/noble/grep:amd64\": \"3.11-4build1\",\n\t\t\t\t\t\"/noble/libssl3t64:amd64\": \"3.0.13-0ubuntu3\",\n\t\t\t\t\t\"/noble/libstdc++6:amd64\": \"14-20240412-0ubuntu1\",\n\t\t\t\t\t\"/noble/netbase:amd64\": \"6.4\",\n\t\t\t\t\t\"/noble/openssl:amd64\": \"3.0.13-0ubuntu3\",\n\t\t\t\t\t\"/noble/sed:amd64\": \"4.9-2build1\",\n\t\t\t\t\t\"/noble/tzdata:amd64\": \"2024a-2ubuntu1\"\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\t\"facts\": {\n\t\t\"noble/main/amd64/Packages/https://snapshot.ubuntu.com/ubuntu/20240601T000000Z\": \"sha256-KmoZnhAxpcJ5yzRmRtWUmT81scA91KgqqgMjmA3ZJFE=\"\n\t},\n\t\"packages\": {\n\t\t\"/noble/base-files:amd64=13ubuntu10\": {\n\t\t\t\"architecture\": \"amd64\",\n\t\t\t\"depends_on\": [\n\t\t\t\t\"/noble/libcrypt1:amd64=1:4.4.36-4build1\",\n\t\t\t\t\"/noble/libc6:amd64=2.39-0ubuntu8\",\n\t\t\t\t\"/noble/libgcc-s1:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/gcc-14-base:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/mawk:amd64=1.3.4.20240123-1build1\"\n\t\t\t],\n\t\t\t\"filename\": \"pool/main/b/base-files/base-files_13ubuntu10_amd64.deb\",\n\t\t\t\"name\": \"base-files\",\n\t\t\t\"section\": \"admin\",\n\t\t\t\"sha256\": \"cd06729c776397bb74779773f4dece372a1a3f795e5992804022bffab0278ffb\",\n\t\t\t\"size\": 73634,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"13ubuntu10\"\n\t\t},\n\t\t\"/noble/bash:amd64=5.2.21-2ubuntu4\": {\n\t\t\t\"architecture\": \"amd64\",\n\t\t\t\"depends_on\": [\n\t\t\t\t\"/noble/debianutils:amd64=5.17build1\",\n\t\t\t\t\"/noble/libc6:amd64=2.39-0ubuntu8\",\n\t\t\t\t\"/noble/libgcc-s1:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/gcc-14-base:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/base-files:amd64=13ubuntu10\",\n\t\t\t\t\"/noble/libcrypt1:amd64=1:4.4.36-4build1\",\n\t\t\t\t\"/noble/mawk:amd64=1.3.4.20240123-1build1\",\n\t\t\t\t\"/noble/libtinfo6:amd64=6.4+20240113-1ubuntu2\"\n\t\t\t],\n\t\t\t\"filename\": \"pool/main/b/bash/bash_5.2.21-2ubuntu4_amd64.deb\",\n\t\t\t\"name\": \"bash\",\n\t\t\t\"section\": \"shells\",\n\t\t\t\"sha256\": \"73de311a21e094e29ac01527d2b52226cc87fde0a5b57032902251b426d92c66\",\n\t\t\t\"size\": 794086,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"5.2.21-2ubuntu4\"\n\t\t},\n\t\t\"/noble/ca-certificates:amd64=20240203\": {\n\t\t\t\"architecture\": \"all\",\n\t\t\t\"depends_on\": [\n\t\t\t\t\"/noble/debconf:amd64=1.5.86ubuntu1\",\n\t\t\t\t\"/noble/openssl:amd64=3.0.13-0ubuntu3\",\n\t\t\t\t\"/noble/libssl3t64:amd64=3.0.13-0ubuntu3\",\n\t\t\t\t\"/noble/libc6:amd64=2.39-0ubuntu8\",\n\t\t\t\t\"/noble/libgcc-s1:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/gcc-14-base:amd64=14-20240412-0ubuntu1\"\n\t\t\t],\n\t\t\t\"filename\": \"pool/main/c/ca-certificates/ca-certificates_20240203_all.deb\",\n\t\t\t\"name\": \"ca-certificates\",\n\t\t\t\"section\": \"misc\",\n\t\t\t\"sha256\": \"641de77d8f142cfd62a1a6f964ba67b20754d3337c480efb529d086075a06c9a\",\n\t\t\t\"size\": 159378,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"20240203\"\n\t\t},\n\t\t\"/noble/coreutils:amd64=9.4-3ubuntu6\": {\n\t\t\t\"architecture\": \"amd64\",\n\t\t\t\"depends_on\": [\n\t\t\t\t\"/noble/libssl3t64:amd64=3.0.13-0ubuntu3\",\n\t\t\t\t\"/noble/libc6:amd64=2.39-0ubuntu8\",\n\t\t\t\t\"/noble/libgcc-s1:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/gcc-14-base:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/libselinux1:amd64=3.5-2ubuntu2\",\n\t\t\t\t\"/noble/libpcre2-8-0:amd64=10.42-4ubuntu2\",\n\t\t\t\t\"/noble/libgmp10:amd64=2:6.3.0+dfsg-2ubuntu6\",\n\t\t\t\t\"/noble/libattr1:amd64=1:2.5.2-1build1\",\n\t\t\t\t\"/noble/libacl1:amd64=2.3.2-1build1\"\n\t\t\t],\n\t\t\t\"filename\": \"pool/main/c/coreutils/coreutils_9.4-3ubuntu6_amd64.deb\",\n\t\t\t\"name\": \"coreutils\",\n\t\t\t\"section\": \"utils\",\n\t\t\t\"sha256\": \"0d19c3e94f04ff1aafde46701fe1783da0a068a4904adc3794c30140f1aaeb8f\",\n\t\t\t\"size\": 1412418,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"9.4-3ubuntu6\"\n\t\t},\n\t\t\"/noble/debconf:amd64=1.5.86ubuntu1\": {\n\t\t\t\"architecture\": \"all\",\n\t\t\t\"depends_on\": [],\n\t\t\t\"filename\": \"pool/main/d/debconf/debconf_1.5.86ubuntu1_all.deb\",\n\t\t\t\"name\": \"debconf\",\n\t\t\t\"section\": \"admin\",\n\t\t\t\"sha256\": \"bb390da466a7461bfc87aa3e6b7cd145dae84af3e26bf437f2c0c218ba226294\",\n\t\t\t\"size\": 124096,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"1.5.86ubuntu1\"\n\t\t},\n\t\t\"/noble/debianutils:amd64=5.17build1\": {\n\t\t\t\"architecture\": \"amd64\",\n\t\t\t\"depends_on\": [\n\t\t\t\t\"/noble/libc6:amd64=2.39-0ubuntu8\",\n\t\t\t\t\"/noble/libgcc-s1:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/gcc-14-base:amd64=14-20240412-0ubuntu1\"\n\t\t\t],\n\t\t\t\"filename\": \"pool/main/d/debianutils/debianutils_5.17build1_amd64.deb\",\n\t\t\t\"name\": \"debianutils\",\n\t\t\t\"section\": \"utils\",\n\t\t\t\"sha256\": \"1047a9a57018e18531f76e5b00e226a68554b6f1d147f2a5c1b32518c7b20636\",\n\t\t\t\"size\": 89890,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"5.17build1\"\n\t\t},\n\t\t\"/noble/gawk:amd64=1:5.2.1-2build3\": {\n\t\t\t\"architecture\": \"amd64\",\n\t\t\t\"depends_on\": [\n\t\t\t\t\"/noble/libsigsegv2:amd64=2.14-1ubuntu2\",\n\t\t\t\t\"/noble/libc6:amd64=2.39-0ubuntu8\",\n\t\t\t\t\"/noble/libgcc-s1:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/gcc-14-base:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/libreadline8t64:amd64=8.2-4build1\",\n\t\t\t\t\"/noble/libtinfo6:amd64=6.4+20240113-1ubuntu2\",\n\t\t\t\t\"/noble/readline-common:amd64=8.2-4build1\",\n\t\t\t\t\"/noble/libmpfr6:amd64=4.2.1-1build1\",\n\t\t\t\t\"/noble/libgmp10:amd64=2:6.3.0+dfsg-2ubuntu6\"\n\t\t\t],\n\t\t\t\"filename\": \"pool/main/g/gawk/gawk_5.2.1-2build3_amd64.deb\",\n\t\t\t\"name\": \"gawk\",\n\t\t\t\"section\": \"interpreters\",\n\t\t\t\"sha256\": \"4b662062e90f62ece26ca7adfcd3a33207c7862f3dc77b8df515b5680ee00ca9\",\n\t\t\t\"size\": 462772,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"1:5.2.1-2build3\"\n\t\t},\n\t\t\"/noble/gcc-14-base:amd64=14-20240412-0ubuntu1\": {\n\t\t\t\"architecture\": \"amd64\",\n\t\t\t\"depends_on\": [],\n\t\t\t\"filename\": \"pool/main/g/gcc-14/gcc-14-base_14-20240412-0ubuntu1_amd64.deb\",\n\t\t\t\"name\": \"gcc-14-base\",\n\t\t\t\"section\": \"libs\",\n\t\t\t\"sha256\": \"bc5a682c694a1ce5af50772b7c737a21e9a74f0f0edaae98e97bc9c4af583fef\",\n\t\t\t\"size\": 47612,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"14-20240412-0ubuntu1\"\n\t\t},\n\t\t\"/noble/grep:amd64=3.11-4build1\": {\n\t\t\t\"architecture\": \"amd64\",\n\t\t\t\"depends_on\": [\n\t\t\t\t\"/noble/libpcre2-8-0:amd64=10.42-4ubuntu2\",\n\t\t\t\t\"/noble/libc6:amd64=2.39-0ubuntu8\",\n\t\t\t\t\"/noble/libgcc-s1:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/gcc-14-base:amd64=14-20240412-0ubuntu1\"\n\t\t\t],\n\t\t\t\"filename\": \"pool/main/g/grep/grep_3.11-4build1_amd64.deb\",\n\t\t\t\"name\": \"grep\",\n\t\t\t\"section\": \"utils\",\n\t\t\t\"sha256\": \"fc0fdc5983ea3d3579ccf335e51dec69684a0dd9bb915734999c5733add9507a\",\n\t\t\t\"size\": 162040,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"3.11-4build1\"\n\t\t},\n\t\t\"/noble/libacl1:amd64=2.3.2-1build1\": {\n\t\t\t\"architecture\": \"amd64\",\n\t\t\t\"depends_on\": [\n\t\t\t\t\"/noble/libc6:amd64=2.39-0ubuntu8\",\n\t\t\t\t\"/noble/libgcc-s1:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/gcc-14-base:amd64=14-20240412-0ubuntu1\"\n\t\t\t],\n\t\t\t\"filename\": \"pool/main/a/acl/libacl1_2.3.2-1build1_amd64.deb\",\n\t\t\t\"name\": \"libacl1\",\n\t\t\t\"section\": \"libs\",\n\t\t\t\"sha256\": \"892dd9edaded972367e19713e5b0a3144409d9ef6613da5b7734a56f8e8f582b\",\n\t\t\t\"size\": 16794,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"2.3.2-1build1\"\n\t\t},\n\t\t\"/noble/libattr1:amd64=1:2.5.2-1build1\": {\n\t\t\t\"architecture\": \"amd64\",\n\t\t\t\"depends_on\": [\n\t\t\t\t\"/noble/libc6:amd64=2.39-0ubuntu8\",\n\t\t\t\t\"/noble/libgcc-s1:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/gcc-14-base:amd64=14-20240412-0ubuntu1\"\n\t\t\t],\n\t\t\t\"filename\": \"pool/main/a/attr/libattr1_2.5.2-1build1_amd64.deb\",\n\t\t\t\"name\": \"libattr1\",\n\t\t\t\"section\": \"libs\",\n\t\t\t\"sha256\": \"204e45dde86d1cf762114bd91fdab9d820de08e3da8216c7b25382924a96aa9f\",\n\t\t\t\"size\": 11326,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"1:2.5.2-1build1\"\n\t\t},\n\t\t\"/noble/libc6:amd64=2.39-0ubuntu8\": {\n\t\t\t\"architecture\": \"amd64\",\n\t\t\t\"depends_on\": [\n\t\t\t\t\"/noble/libgcc-s1:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/gcc-14-base:amd64=14-20240412-0ubuntu1\"\n\t\t\t],\n\t\t\t\"filename\": \"pool/main/g/glibc/libc6_2.39-0ubuntu8_amd64.deb\",\n\t\t\t\"name\": \"libc6\",\n\t\t\t\"section\": \"libs\",\n\t\t\t\"sha256\": \"af36c7ac770770fe3d3c10e85d6bc538e76e57570ba7db7d397fb9f654783ef3\",\n\t\t\t\"size\": 3264806,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"2.39-0ubuntu8\"\n\t\t},\n\t\t\"/noble/libcrypt1:amd64=1:4.4.36-4build1\": {\n\t\t\t\"architecture\": \"amd64\",\n\t\t\t\"depends_on\": [\n\t\t\t\t\"/noble/libc6:amd64=2.39-0ubuntu8\",\n\t\t\t\t\"/noble/libgcc-s1:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/gcc-14-base:amd64=14-20240412-0ubuntu1\"\n\t\t\t],\n\t\t\t\"filename\": \"pool/main/libx/libxcrypt/libcrypt1_4.4.36-4build1_amd64.deb\",\n\t\t\t\"name\": \"libcrypt1\",\n\t\t\t\"section\": \"libs\",\n\t\t\t\"sha256\": \"9474785cd6f398512bf8c305c3901dbb111569dccb6f5832002373c0a8ac5832\",\n\t\t\t\"size\": 82302,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"1:4.4.36-4build1\"\n\t\t},\n\t\t\"/noble/libgcc-s1:amd64=14-20240412-0ubuntu1\": {\n\t\t\t\"architecture\": \"amd64\",\n\t\t\t\"depends_on\": [\n\t\t\t\t\"/noble/libc6:amd64=2.39-0ubuntu8\",\n\t\t\t\t\"/noble/gcc-14-base:amd64=14-20240412-0ubuntu1\"\n\t\t\t],\n\t\t\t\"filename\": \"pool/main/g/gcc-14/libgcc-s1_14-20240412-0ubuntu1_amd64.deb\",\n\t\t\t\"name\": \"libgcc-s1\",\n\t\t\t\"section\": \"libs\",\n\t\t\t\"sha256\": \"a39efdcaa2245f026dc3254ce14fcff255fc430a17064632b6ba7c5da974a912\",\n\t\t\t\"size\": 78484,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"14-20240412-0ubuntu1\"\n\t\t},\n\t\t\"/noble/libgmp10:amd64=2:6.3.0+dfsg-2ubuntu6\": {\n\t\t\t\"architecture\": \"amd64\",\n\t\t\t\"depends_on\": [\n\t\t\t\t\"/noble/libc6:amd64=2.39-0ubuntu8\",\n\t\t\t\t\"/noble/libgcc-s1:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/gcc-14-base:amd64=14-20240412-0ubuntu1\"\n\t\t\t],\n\t\t\t\"filename\": \"pool/main/g/gmp/libgmp10_6.3.0+dfsg-2ubuntu6_amd64.deb\",\n\t\t\t\"name\": \"libgmp10\",\n\t\t\t\"section\": \"libs\",\n\t\t\t\"sha256\": \"649a5ee5f74f0aa1e1b9c4f169eabbae56a79aa5aac51ef733eb9e18700bd8fc\",\n\t\t\t\"size\": 253448,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"2:6.3.0+dfsg-2ubuntu6\"\n\t\t},\n\t\t\"/noble/libmpfr6:amd64=4.2.1-1build1\": {\n\t\t\t\"architecture\": \"amd64\",\n\t\t\t\"depends_on\": [\n\t\t\t\t\"/noble/libgmp10:amd64=2:6.3.0+dfsg-2ubuntu6\",\n\t\t\t\t\"/noble/libc6:amd64=2.39-0ubuntu8\",\n\t\t\t\t\"/noble/libgcc-s1:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/gcc-14-base:amd64=14-20240412-0ubuntu1\"\n\t\t\t],\n\t\t\t\"filename\": \"pool/main/m/mpfr4/libmpfr6_4.2.1-1build1_amd64.deb\",\n\t\t\t\"name\": \"libmpfr6\",\n\t\t\t\"section\": \"libs\",\n\t\t\t\"sha256\": \"a25c2f5f123829ab144f31ddb22f4363b7206eb21bf821bfbecca5753ccfc6be\",\n\t\t\t\"size\": 355358,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"4.2.1-1build1\"\n\t\t},\n\t\t\"/noble/libpcre2-8-0:amd64=10.42-4ubuntu2\": {\n\t\t\t\"architecture\": \"amd64\",\n\t\t\t\"depends_on\": [\n\t\t\t\t\"/noble/libc6:amd64=2.39-0ubuntu8\",\n\t\t\t\t\"/noble/libgcc-s1:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/gcc-14-base:amd64=14-20240412-0ubuntu1\"\n\t\t\t],\n\t\t\t\"filename\": \"pool/main/p/pcre2/libpcre2-8-0_10.42-4ubuntu2_amd64.deb\",\n\t\t\t\"name\": \"libpcre2-8-0\",\n\t\t\t\"section\": \"libs\",\n\t\t\t\"sha256\": \"bb38c38adb4ef548f2851b5cf7f70bbdbcb27d582c17550aa053edb9e4098d84\",\n\t\t\t\"size\": 226574,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"10.42-4ubuntu2\"\n\t\t},\n\t\t\"/noble/libreadline8t64:amd64=8.2-4build1\": {\n\t\t\t\"architecture\": \"amd64\",\n\t\t\t\"depends_on\": [\n\t\t\t\t\"/noble/libtinfo6:amd64=6.4+20240113-1ubuntu2\",\n\t\t\t\t\"/noble/libc6:amd64=2.39-0ubuntu8\",\n\t\t\t\t\"/noble/libgcc-s1:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/gcc-14-base:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/readline-common:amd64=8.2-4build1\"\n\t\t\t],\n\t\t\t\"filename\": \"pool/main/r/readline/libreadline8t64_8.2-4build1_amd64.deb\",\n\t\t\t\"name\": \"libreadline8t64\",\n\t\t\t\"section\": \"libs\",\n\t\t\t\"sha256\": \"563977a16df03b611f5239cc1e9a0426e86479fcc616b5c9e200ea32063119e5\",\n\t\t\t\"size\": 152856,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"8.2-4build1\"\n\t\t},\n\t\t\"/noble/libselinux1:amd64=3.5-2ubuntu2\": {\n\t\t\t\"architecture\": \"amd64\",\n\t\t\t\"depends_on\": [\n\t\t\t\t\"/noble/libpcre2-8-0:amd64=10.42-4ubuntu2\",\n\t\t\t\t\"/noble/libc6:amd64=2.39-0ubuntu8\",\n\t\t\t\t\"/noble/libgcc-s1:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/gcc-14-base:amd64=14-20240412-0ubuntu1\"\n\t\t\t],\n\t\t\t\"filename\": \"pool/main/libs/libselinux/libselinux1_3.5-2ubuntu2_amd64.deb\",\n\t\t\t\"name\": \"libselinux1\",\n\t\t\t\"section\": \"libs\",\n\t\t\t\"sha256\": \"c0fe6dfac61d458f3e65c4a2bf6a920030a97d2429e33d0b405a8c4a63ef2864\",\n\t\t\t\"size\": 79578,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"3.5-2ubuntu2\"\n\t\t},\n\t\t\"/noble/libsigsegv2:amd64=2.14-1ubuntu2\": {\n\t\t\t\"architecture\": \"amd64\",\n\t\t\t\"depends_on\": [\n\t\t\t\t\"/noble/libc6:amd64=2.39-0ubuntu8\",\n\t\t\t\t\"/noble/libgcc-s1:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/gcc-14-base:amd64=14-20240412-0ubuntu1\"\n\t\t\t],\n\t\t\t\"filename\": \"pool/main/libs/libsigsegv/libsigsegv2_2.14-1ubuntu2_amd64.deb\",\n\t\t\t\"name\": \"libsigsegv2\",\n\t\t\t\"section\": \"libs\",\n\t\t\t\"sha256\": \"889f338bea4ebfd999939d946da4ac0a45668264a5aae78e023feeb0529505b8\",\n\t\t\t\"size\": 15042,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"2.14-1ubuntu2\"\n\t\t},\n\t\t\"/noble/libssl3t64:amd64=3.0.13-0ubuntu3\": {\n\t\t\t\"architecture\": \"amd64\",\n\t\t\t\"depends_on\": [\n\t\t\t\t\"/noble/libc6:amd64=2.39-0ubuntu8\",\n\t\t\t\t\"/noble/libgcc-s1:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/gcc-14-base:amd64=14-20240412-0ubuntu1\"\n\t\t\t],\n\t\t\t\"filename\": \"pool/main/o/openssl/libssl3t64_3.0.13-0ubuntu3_amd64.deb\",\n\t\t\t\"name\": \"libssl3t64\",\n\t\t\t\"section\": \"libs\",\n\t\t\t\"sha256\": \"6cde53feabd28f26586a4db2ffb9fc84e7b0598aee15b33bee907b6392a92d24\",\n\t\t\t\"size\": 1936306,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"3.0.13-0ubuntu3\"\n\t\t},\n\t\t\"/noble/libstdc++6:amd64=14-20240412-0ubuntu1\": {\n\t\t\t\"architecture\": \"amd64\",\n\t\t\t\"depends_on\": [\n\t\t\t\t\"/noble/libgcc-s1:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/libc6:amd64=2.39-0ubuntu8\",\n\t\t\t\t\"/noble/gcc-14-base:amd64=14-20240412-0ubuntu1\"\n\t\t\t],\n\t\t\t\"filename\": \"pool/main/g/gcc-14/libstdc++6_14-20240412-0ubuntu1_amd64.deb\",\n\t\t\t\"name\": \"libstdc++6\",\n\t\t\t\"section\": \"libs\",\n\t\t\t\"sha256\": \"4863e880d6ee538e4734c430c5579c1ac933b88a42c25bc9980d0f148c54b21e\",\n\t\t\t\"size\": 795158,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"14-20240412-0ubuntu1\"\n\t\t},\n\t\t\"/noble/libtinfo6:amd64=6.4+20240113-1ubuntu2\": {\n\t\t\t\"architecture\": \"amd64\",\n\t\t\t\"depends_on\": [\n\t\t\t\t\"/noble/libc6:amd64=2.39-0ubuntu8\",\n\t\t\t\t\"/noble/libgcc-s1:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/gcc-14-base:amd64=14-20240412-0ubuntu1\"\n\t\t\t],\n\t\t\t\"filename\": \"pool/main/n/ncurses/libtinfo6_6.4+20240113-1ubuntu2_amd64.deb\",\n\t\t\t\"name\": \"libtinfo6\",\n\t\t\t\"section\": \"libs\",\n\t\t\t\"sha256\": \"53e1e1753729d04cf65b05e6e58abe06e2bb76cc07eff0e1b2a638a638ca209b\",\n\t\t\t\"size\": 107794,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"6.4+20240113-1ubuntu2\"\n\t\t},\n\t\t\"/noble/mawk:amd64=1.3.4.20240123-1build1\": {\n\t\t\t\"architecture\": \"amd64\",\n\t\t\t\"depends_on\": [\n\t\t\t\t\"/noble/libc6:amd64=2.39-0ubuntu8\",\n\t\t\t\t\"/noble/libgcc-s1:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/gcc-14-base:amd64=14-20240412-0ubuntu1\"\n\t\t\t],\n\t\t\t\"filename\": \"pool/main/m/mawk/mawk_1.3.4.20240123-1build1_amd64.deb\",\n\t\t\t\"name\": \"mawk\",\n\t\t\t\"section\": \"utils\",\n\t\t\t\"sha256\": \"dc7f7f4dad4b48f6012ea65de3198d8376604afef39f06d65ec6167740e203c9\",\n\t\t\t\"size\": 127222,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"1.3.4.20240123-1build1\"\n\t\t},\n\t\t\"/noble/netbase:amd64=6.4\": {\n\t\t\t\"architecture\": \"all\",\n\t\t\t\"depends_on\": [],\n\t\t\t\"filename\": \"pool/main/n/netbase/netbase_6.4_all.deb\",\n\t\t\t\"name\": \"netbase\",\n\t\t\t\"section\": \"admin\",\n\t\t\t\"sha256\": \"8cdbc9c3dca01e660759bf9d840f72e45ac72faf5d19ca1faecacaf6a60c1a87\",\n\t\t\t\"size\": 13112,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"6.4\"\n\t\t},\n\t\t\"/noble/openssl:amd64=3.0.13-0ubuntu3\": {\n\t\t\t\"architecture\": \"amd64\",\n\t\t\t\"depends_on\": [\n\t\t\t\t\"/noble/libssl3t64:amd64=3.0.13-0ubuntu3\",\n\t\t\t\t\"/noble/libc6:amd64=2.39-0ubuntu8\",\n\t\t\t\t\"/noble/libgcc-s1:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/gcc-14-base:amd64=14-20240412-0ubuntu1\"\n\t\t\t],\n\t\t\t\"filename\": \"pool/main/o/openssl/openssl_3.0.13-0ubuntu3_amd64.deb\",\n\t\t\t\"name\": \"openssl\",\n\t\t\t\"section\": \"utils\",\n\t\t\t\"sha256\": \"9c79333ab21bce0fb8dd92304cd76b3b1c427b0f2fedc897257fb5cced37c39e\",\n\t\t\t\"size\": 1001730,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"3.0.13-0ubuntu3\"\n\t\t},\n\t\t\"/noble/readline-common:amd64=8.2-4build1\": {\n\t\t\t\"architecture\": \"all\",\n\t\t\t\"depends_on\": [],\n\t\t\t\"filename\": \"pool/main/r/readline/readline-common_8.2-4build1_all.deb\",\n\t\t\t\"name\": \"readline-common\",\n\t\t\t\"section\": \"utils\",\n\t\t\t\"sha256\": \"879bfd7f8a9bc4c0f7cdc777cdd8bc6de5f8c4a2ac80c060322a1b22f13504bb\",\n\t\t\t\"size\": 56484,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"8.2-4build1\"\n\t\t},\n\t\t\"/noble/sed:amd64=4.9-2build1\": {\n\t\t\t\"architecture\": \"amd64\",\n\t\t\t\"depends_on\": [\n\t\t\t\t\"/noble/libselinux1:amd64=3.5-2ubuntu2\",\n\t\t\t\t\"/noble/libpcre2-8-0:amd64=10.42-4ubuntu2\",\n\t\t\t\t\"/noble/libc6:amd64=2.39-0ubuntu8\",\n\t\t\t\t\"/noble/libgcc-s1:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/gcc-14-base:amd64=14-20240412-0ubuntu1\",\n\t\t\t\t\"/noble/libacl1:amd64=2.3.2-1build1\"\n\t\t\t],\n\t\t\t\"filename\": \"pool/main/s/sed/sed_4.9-2build1_amd64.deb\",\n\t\t\t\"name\": \"sed\",\n\t\t\t\"section\": \"utils\",\n\t\t\t\"sha256\": \"a09b856849cf36190f8cd39da33486b14bcaf81b592530b2f3236da17daaad2f\",\n\t\t\t\"size\": 193410,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"4.9-2build1\"\n\t\t},\n\t\t\"/noble/tzdata:amd64=2024a-2ubuntu1\": {\n\t\t\t\"architecture\": \"all\",\n\t\t\t\"depends_on\": [\n\t\t\t\t\"/noble/debconf:amd64=1.5.86ubuntu1\"\n\t\t\t],\n\t\t\t\"filename\": \"pool/main/t/tzdata/tzdata_2024a-2ubuntu1_all.deb\",\n\t\t\t\"name\": \"tzdata\",\n\t\t\t\"section\": \"libs\",\n\t\t\t\"sha256\": \"f5bca0c788a4fc465c435f7e8a54b2594e9cbf1a22abb263a59e393f1cb666e1\",\n\t\t\t\"size\": 273318,\n\t\t\t\"suite\": \"noble\",\n\t\t\t\"version\": \"2024a-2ubuntu1\"\n\t\t}\n\t},\n\t\"sources\": {\n\t\t\"noble\": {\n\t\t\t\"architectures\": [\n\t\t\t\t\"amd64\"\n\t\t\t],\n\t\t\t\"components\": [\n\t\t\t\t\"main\"\n\t\t\t],\n\t\t\t\"types\": [\n\t\t\t\t\"deb\"\n\t\t\t],\n\t\t\t\"uris\": [\n\t\t\t\t\"https://snapshot.ubuntu.com/ubuntu/20240601T000000Z\"\n\t\t\t]\n\t\t}\n\t},\n\t\"version\": 2\n}" + } + }, + "noble_tzdata-amd64_2024a-2ubuntu1_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_tzdata-amd64_2024a-2ubuntu1": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_tzdata-amd64_2024a-2ubuntu1", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/t/tzdata/tzdata_2024a-2ubuntu1_all.deb" + ], + "sha256": "f5bca0c788a4fc465c435f7e8a54b2594e9cbf1a22abb263a59e393f1cb666e1", + "mergedusr": false, + "depends_on": [ + "/noble/debconf:amd64=1.5.86ubuntu1" + ], + "dep_filemaps": [ + "@@rules_distroless++apt+noble_debconf-amd64_1.5.86ubuntu1_filemap//:filemap.json" + ], + "package_name": "tzdata" + } + }, + "noble_debconf-amd64_1.5.86ubuntu1_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_debconf-amd64_1.5.86ubuntu1": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_debconf-amd64_1.5.86ubuntu1", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/d/debconf/debconf_1.5.86ubuntu1_all.deb" + ], + "sha256": "bb390da466a7461bfc87aa3e6b7cd145dae84af3e26bf437f2c0c218ba226294", + "mergedusr": false, + "depends_on": [], + "dep_filemaps": [], + "package_name": "debconf" + } + }, + "noble_sed-amd64_4.9-2build1_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_sed-amd64_4.9-2build1": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_sed-amd64_4.9-2build1", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/s/sed/sed_4.9-2build1_amd64.deb" + ], + "sha256": "a09b856849cf36190f8cd39da33486b14bcaf81b592530b2f3236da17daaad2f", + "mergedusr": false, + "depends_on": [ + "/noble/libselinux1:amd64=3.5-2ubuntu2", + "/noble/libpcre2-8-0:amd64=10.42-4ubuntu2", + "/noble/libc6:amd64=2.39-0ubuntu8", + "/noble/libgcc-s1:amd64=14-20240412-0ubuntu1", + "/noble/gcc-14-base:amd64=14-20240412-0ubuntu1", + "/noble/libacl1:amd64=2.3.2-1build1" + ], + "dep_filemaps": [ + "@@rules_distroless++apt+noble_libselinux1-amd64_3.5-2ubuntu2_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libpcre2-8-0-amd64_10.42-4ubuntu2_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libc6-amd64_2.39-0ubuntu8_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libgcc-s1-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_gcc-14-base-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libacl1-amd64_2.3.2-1build1_filemap//:filemap.json" + ], + "package_name": "sed" + } + }, + "noble_libselinux1-amd64_3.5-2ubuntu2_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_libselinux1-amd64_3.5-2ubuntu2": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_libselinux1-amd64_3.5-2ubuntu2", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/libs/libselinux/libselinux1_3.5-2ubuntu2_amd64.deb" + ], + "sha256": "c0fe6dfac61d458f3e65c4a2bf6a920030a97d2429e33d0b405a8c4a63ef2864", + "mergedusr": false, + "depends_on": [ + "/noble/libpcre2-8-0:amd64=10.42-4ubuntu2", + "/noble/libc6:amd64=2.39-0ubuntu8", + "/noble/libgcc-s1:amd64=14-20240412-0ubuntu1", + "/noble/gcc-14-base:amd64=14-20240412-0ubuntu1" + ], + "dep_filemaps": [ + "@@rules_distroless++apt+noble_libpcre2-8-0-amd64_10.42-4ubuntu2_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libc6-amd64_2.39-0ubuntu8_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libgcc-s1-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_gcc-14-base-amd64_14-20240412-0ubuntu1_filemap//:filemap.json" + ], + "package_name": "libselinux1" + } + }, + "noble_libpcre2-8-0-amd64_10.42-4ubuntu2_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_libpcre2-8-0-amd64_10.42-4ubuntu2": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_libpcre2-8-0-amd64_10.42-4ubuntu2", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/p/pcre2/libpcre2-8-0_10.42-4ubuntu2_amd64.deb" + ], + "sha256": "bb38c38adb4ef548f2851b5cf7f70bbdbcb27d582c17550aa053edb9e4098d84", + "mergedusr": false, + "depends_on": [ + "/noble/libc6:amd64=2.39-0ubuntu8", + "/noble/libgcc-s1:amd64=14-20240412-0ubuntu1", + "/noble/gcc-14-base:amd64=14-20240412-0ubuntu1" + ], + "dep_filemaps": [ + "@@rules_distroless++apt+noble_libc6-amd64_2.39-0ubuntu8_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libgcc-s1-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_gcc-14-base-amd64_14-20240412-0ubuntu1_filemap//:filemap.json" + ], + "package_name": "libpcre2-8-0" + } + }, + "noble_libc6-amd64_2.39-0ubuntu8_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_libc6-amd64_2.39-0ubuntu8": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_libc6-amd64_2.39-0ubuntu8", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/g/glibc/libc6_2.39-0ubuntu8_amd64.deb" + ], + "sha256": "af36c7ac770770fe3d3c10e85d6bc538e76e57570ba7db7d397fb9f654783ef3", + "mergedusr": false, + "depends_on": [ + "/noble/libgcc-s1:amd64=14-20240412-0ubuntu1", + "/noble/gcc-14-base:amd64=14-20240412-0ubuntu1" + ], + "dep_filemaps": [ + "@@rules_distroless++apt+noble_libgcc-s1-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_gcc-14-base-amd64_14-20240412-0ubuntu1_filemap//:filemap.json" + ], + "package_name": "libc6" + } + }, + "noble_libgcc-s1-amd64_14-20240412-0ubuntu1_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_libgcc-s1-amd64_14-20240412-0ubuntu1": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_libgcc-s1-amd64_14-20240412-0ubuntu1", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/g/gcc-14/libgcc-s1_14-20240412-0ubuntu1_amd64.deb" + ], + "sha256": "a39efdcaa2245f026dc3254ce14fcff255fc430a17064632b6ba7c5da974a912", + "mergedusr": false, + "depends_on": [ + "/noble/libc6:amd64=2.39-0ubuntu8", + "/noble/gcc-14-base:amd64=14-20240412-0ubuntu1" + ], + "dep_filemaps": [ + "@@rules_distroless++apt+noble_libc6-amd64_2.39-0ubuntu8_filemap//:filemap.json", + "@@rules_distroless++apt+noble_gcc-14-base-amd64_14-20240412-0ubuntu1_filemap//:filemap.json" + ], + "package_name": "libgcc-s1" + } + }, + "noble_gcc-14-base-amd64_14-20240412-0ubuntu1_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_gcc-14-base-amd64_14-20240412-0ubuntu1": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_gcc-14-base-amd64_14-20240412-0ubuntu1", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/g/gcc-14/gcc-14-base_14-20240412-0ubuntu1_amd64.deb" + ], + "sha256": "bc5a682c694a1ce5af50772b7c737a21e9a74f0f0edaae98e97bc9c4af583fef", + "mergedusr": false, + "depends_on": [], + "dep_filemaps": [], + "package_name": "gcc-14-base" + } + }, + "noble_libacl1-amd64_2.3.2-1build1_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_libacl1-amd64_2.3.2-1build1": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_libacl1-amd64_2.3.2-1build1", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/a/acl/libacl1_2.3.2-1build1_amd64.deb" + ], + "sha256": "892dd9edaded972367e19713e5b0a3144409d9ef6613da5b7734a56f8e8f582b", + "mergedusr": false, + "depends_on": [ + "/noble/libc6:amd64=2.39-0ubuntu8", + "/noble/libgcc-s1:amd64=14-20240412-0ubuntu1", + "/noble/gcc-14-base:amd64=14-20240412-0ubuntu1" + ], + "dep_filemaps": [ + "@@rules_distroless++apt+noble_libc6-amd64_2.39-0ubuntu8_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libgcc-s1-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_gcc-14-base-amd64_14-20240412-0ubuntu1_filemap//:filemap.json" + ], + "package_name": "libacl1" + } + }, + "noble_openssl-amd64_3.0.13-0ubuntu3_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_openssl-amd64_3.0.13-0ubuntu3": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_openssl-amd64_3.0.13-0ubuntu3", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/o/openssl/openssl_3.0.13-0ubuntu3_amd64.deb" + ], + "sha256": "9c79333ab21bce0fb8dd92304cd76b3b1c427b0f2fedc897257fb5cced37c39e", + "mergedusr": false, + "depends_on": [ + "/noble/libssl3t64:amd64=3.0.13-0ubuntu3", + "/noble/libc6:amd64=2.39-0ubuntu8", + "/noble/libgcc-s1:amd64=14-20240412-0ubuntu1", + "/noble/gcc-14-base:amd64=14-20240412-0ubuntu1" + ], + "dep_filemaps": [ + "@@rules_distroless++apt+noble_libssl3t64-amd64_3.0.13-0ubuntu3_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libc6-amd64_2.39-0ubuntu8_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libgcc-s1-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_gcc-14-base-amd64_14-20240412-0ubuntu1_filemap//:filemap.json" + ], + "package_name": "openssl" + } + }, + "noble_libssl3t64-amd64_3.0.13-0ubuntu3_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_libssl3t64-amd64_3.0.13-0ubuntu3": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_libssl3t64-amd64_3.0.13-0ubuntu3", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/o/openssl/libssl3t64_3.0.13-0ubuntu3_amd64.deb" + ], + "sha256": "6cde53feabd28f26586a4db2ffb9fc84e7b0598aee15b33bee907b6392a92d24", + "mergedusr": false, + "depends_on": [ + "/noble/libc6:amd64=2.39-0ubuntu8", + "/noble/libgcc-s1:amd64=14-20240412-0ubuntu1", + "/noble/gcc-14-base:amd64=14-20240412-0ubuntu1" + ], + "dep_filemaps": [ + "@@rules_distroless++apt+noble_libc6-amd64_2.39-0ubuntu8_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libgcc-s1-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_gcc-14-base-amd64_14-20240412-0ubuntu1_filemap//:filemap.json" + ], + "package_name": "libssl3t64" + } + }, + "noble_netbase-amd64_6.4_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_netbase-amd64_6.4": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_netbase-amd64_6.4", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/n/netbase/netbase_6.4_all.deb" + ], + "sha256": "8cdbc9c3dca01e660759bf9d840f72e45ac72faf5d19ca1faecacaf6a60c1a87", + "mergedusr": false, + "depends_on": [], + "dep_filemaps": [], + "package_name": "netbase" + } + }, + "noble_libstdc--6-amd64_14-20240412-0ubuntu1_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_libstdc--6-amd64_14-20240412-0ubuntu1": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_libstdc--6-amd64_14-20240412-0ubuntu1", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/g/gcc-14/libstdc++6_14-20240412-0ubuntu1_amd64.deb" + ], + "sha256": "4863e880d6ee538e4734c430c5579c1ac933b88a42c25bc9980d0f148c54b21e", + "mergedusr": false, + "depends_on": [ + "/noble/libgcc-s1:amd64=14-20240412-0ubuntu1", + "/noble/libc6:amd64=2.39-0ubuntu8", + "/noble/gcc-14-base:amd64=14-20240412-0ubuntu1" + ], + "dep_filemaps": [ + "@@rules_distroless++apt+noble_libgcc-s1-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libc6-amd64_2.39-0ubuntu8_filemap//:filemap.json", + "@@rules_distroless++apt+noble_gcc-14-base-amd64_14-20240412-0ubuntu1_filemap//:filemap.json" + ], + "package_name": "libstdc++6" + } + }, + "noble_grep-amd64_3.11-4build1_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_grep-amd64_3.11-4build1": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_grep-amd64_3.11-4build1", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/g/grep/grep_3.11-4build1_amd64.deb" + ], + "sha256": "fc0fdc5983ea3d3579ccf335e51dec69684a0dd9bb915734999c5733add9507a", + "mergedusr": false, + "depends_on": [ + "/noble/libpcre2-8-0:amd64=10.42-4ubuntu2", + "/noble/libc6:amd64=2.39-0ubuntu8", + "/noble/libgcc-s1:amd64=14-20240412-0ubuntu1", + "/noble/gcc-14-base:amd64=14-20240412-0ubuntu1" + ], + "dep_filemaps": [ + "@@rules_distroless++apt+noble_libpcre2-8-0-amd64_10.42-4ubuntu2_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libc6-amd64_2.39-0ubuntu8_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libgcc-s1-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_gcc-14-base-amd64_14-20240412-0ubuntu1_filemap//:filemap.json" + ], + "package_name": "grep" + } + }, + "noble_gawk-amd64_1-5.2.1-2build3_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_gawk-amd64_1-5.2.1-2build3": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_gawk-amd64_1-5.2.1-2build3", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/g/gawk/gawk_5.2.1-2build3_amd64.deb" + ], + "sha256": "4b662062e90f62ece26ca7adfcd3a33207c7862f3dc77b8df515b5680ee00ca9", + "mergedusr": false, + "depends_on": [ + "/noble/libsigsegv2:amd64=2.14-1ubuntu2", + "/noble/libc6:amd64=2.39-0ubuntu8", + "/noble/libgcc-s1:amd64=14-20240412-0ubuntu1", + "/noble/gcc-14-base:amd64=14-20240412-0ubuntu1", + "/noble/libreadline8t64:amd64=8.2-4build1", + "/noble/libtinfo6:amd64=6.4+20240113-1ubuntu2", + "/noble/readline-common:amd64=8.2-4build1", + "/noble/libmpfr6:amd64=4.2.1-1build1", + "/noble/libgmp10:amd64=2:6.3.0+dfsg-2ubuntu6" + ], + "dep_filemaps": [ + "@@rules_distroless++apt+noble_libsigsegv2-amd64_2.14-1ubuntu2_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libc6-amd64_2.39-0ubuntu8_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libgcc-s1-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_gcc-14-base-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libreadline8t64-amd64_8.2-4build1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libtinfo6-amd64_6.4-20240113-1ubuntu2_filemap//:filemap.json", + "@@rules_distroless++apt+noble_readline-common-amd64_8.2-4build1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libmpfr6-amd64_4.2.1-1build1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libgmp10-amd64_2-6.3.0-dfsg-2ubuntu6_filemap//:filemap.json" + ], + "package_name": "gawk" + } + }, + "noble_libsigsegv2-amd64_2.14-1ubuntu2_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_libsigsegv2-amd64_2.14-1ubuntu2": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_libsigsegv2-amd64_2.14-1ubuntu2", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/libs/libsigsegv/libsigsegv2_2.14-1ubuntu2_amd64.deb" + ], + "sha256": "889f338bea4ebfd999939d946da4ac0a45668264a5aae78e023feeb0529505b8", + "mergedusr": false, + "depends_on": [ + "/noble/libc6:amd64=2.39-0ubuntu8", + "/noble/libgcc-s1:amd64=14-20240412-0ubuntu1", + "/noble/gcc-14-base:amd64=14-20240412-0ubuntu1" + ], + "dep_filemaps": [ + "@@rules_distroless++apt+noble_libc6-amd64_2.39-0ubuntu8_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libgcc-s1-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_gcc-14-base-amd64_14-20240412-0ubuntu1_filemap//:filemap.json" + ], + "package_name": "libsigsegv2" + } + }, + "noble_libreadline8t64-amd64_8.2-4build1_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_libreadline8t64-amd64_8.2-4build1": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_libreadline8t64-amd64_8.2-4build1", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/r/readline/libreadline8t64_8.2-4build1_amd64.deb" + ], + "sha256": "563977a16df03b611f5239cc1e9a0426e86479fcc616b5c9e200ea32063119e5", + "mergedusr": false, + "depends_on": [ + "/noble/libtinfo6:amd64=6.4+20240113-1ubuntu2", + "/noble/libc6:amd64=2.39-0ubuntu8", + "/noble/libgcc-s1:amd64=14-20240412-0ubuntu1", + "/noble/gcc-14-base:amd64=14-20240412-0ubuntu1", + "/noble/readline-common:amd64=8.2-4build1" + ], + "dep_filemaps": [ + "@@rules_distroless++apt+noble_libtinfo6-amd64_6.4-20240113-1ubuntu2_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libc6-amd64_2.39-0ubuntu8_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libgcc-s1-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_gcc-14-base-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_readline-common-amd64_8.2-4build1_filemap//:filemap.json" + ], + "package_name": "libreadline8t64" + } + }, + "noble_libtinfo6-amd64_6.4-20240113-1ubuntu2_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_libtinfo6-amd64_6.4-20240113-1ubuntu2": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_libtinfo6-amd64_6.4-20240113-1ubuntu2", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/n/ncurses/libtinfo6_6.4+20240113-1ubuntu2_amd64.deb" + ], + "sha256": "53e1e1753729d04cf65b05e6e58abe06e2bb76cc07eff0e1b2a638a638ca209b", + "mergedusr": false, + "depends_on": [ + "/noble/libc6:amd64=2.39-0ubuntu8", + "/noble/libgcc-s1:amd64=14-20240412-0ubuntu1", + "/noble/gcc-14-base:amd64=14-20240412-0ubuntu1" + ], + "dep_filemaps": [ + "@@rules_distroless++apt+noble_libc6-amd64_2.39-0ubuntu8_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libgcc-s1-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_gcc-14-base-amd64_14-20240412-0ubuntu1_filemap//:filemap.json" + ], + "package_name": "libtinfo6" + } + }, + "noble_readline-common-amd64_8.2-4build1_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_readline-common-amd64_8.2-4build1": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_readline-common-amd64_8.2-4build1", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/r/readline/readline-common_8.2-4build1_all.deb" + ], + "sha256": "879bfd7f8a9bc4c0f7cdc777cdd8bc6de5f8c4a2ac80c060322a1b22f13504bb", + "mergedusr": false, + "depends_on": [], + "dep_filemaps": [], + "package_name": "readline-common" + } + }, + "noble_libmpfr6-amd64_4.2.1-1build1_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_libmpfr6-amd64_4.2.1-1build1": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_libmpfr6-amd64_4.2.1-1build1", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/m/mpfr4/libmpfr6_4.2.1-1build1_amd64.deb" + ], + "sha256": "a25c2f5f123829ab144f31ddb22f4363b7206eb21bf821bfbecca5753ccfc6be", + "mergedusr": false, + "depends_on": [ + "/noble/libgmp10:amd64=2:6.3.0+dfsg-2ubuntu6", + "/noble/libc6:amd64=2.39-0ubuntu8", + "/noble/libgcc-s1:amd64=14-20240412-0ubuntu1", + "/noble/gcc-14-base:amd64=14-20240412-0ubuntu1" + ], + "dep_filemaps": [ + "@@rules_distroless++apt+noble_libgmp10-amd64_2-6.3.0-dfsg-2ubuntu6_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libc6-amd64_2.39-0ubuntu8_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libgcc-s1-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_gcc-14-base-amd64_14-20240412-0ubuntu1_filemap//:filemap.json" + ], + "package_name": "libmpfr6" + } + }, + "noble_libgmp10-amd64_2-6.3.0-dfsg-2ubuntu6_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_libgmp10-amd64_2-6.3.0-dfsg-2ubuntu6": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_libgmp10-amd64_2-6.3.0-dfsg-2ubuntu6", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/g/gmp/libgmp10_6.3.0+dfsg-2ubuntu6_amd64.deb" + ], + "sha256": "649a5ee5f74f0aa1e1b9c4f169eabbae56a79aa5aac51ef733eb9e18700bd8fc", + "mergedusr": false, + "depends_on": [ + "/noble/libc6:amd64=2.39-0ubuntu8", + "/noble/libgcc-s1:amd64=14-20240412-0ubuntu1", + "/noble/gcc-14-base:amd64=14-20240412-0ubuntu1" + ], + "dep_filemaps": [ + "@@rules_distroless++apt+noble_libc6-amd64_2.39-0ubuntu8_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libgcc-s1-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_gcc-14-base-amd64_14-20240412-0ubuntu1_filemap//:filemap.json" + ], + "package_name": "libgmp10" + } + }, + "noble_coreutils-amd64_9.4-3ubuntu6_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_coreutils-amd64_9.4-3ubuntu6": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_coreutils-amd64_9.4-3ubuntu6", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/c/coreutils/coreutils_9.4-3ubuntu6_amd64.deb" + ], + "sha256": "0d19c3e94f04ff1aafde46701fe1783da0a068a4904adc3794c30140f1aaeb8f", + "mergedusr": false, + "depends_on": [ + "/noble/libssl3t64:amd64=3.0.13-0ubuntu3", + "/noble/libc6:amd64=2.39-0ubuntu8", + "/noble/libgcc-s1:amd64=14-20240412-0ubuntu1", + "/noble/gcc-14-base:amd64=14-20240412-0ubuntu1", + "/noble/libselinux1:amd64=3.5-2ubuntu2", + "/noble/libpcre2-8-0:amd64=10.42-4ubuntu2", + "/noble/libgmp10:amd64=2:6.3.0+dfsg-2ubuntu6", + "/noble/libattr1:amd64=1:2.5.2-1build1", + "/noble/libacl1:amd64=2.3.2-1build1" + ], + "dep_filemaps": [ + "@@rules_distroless++apt+noble_libssl3t64-amd64_3.0.13-0ubuntu3_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libc6-amd64_2.39-0ubuntu8_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libgcc-s1-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_gcc-14-base-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libselinux1-amd64_3.5-2ubuntu2_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libpcre2-8-0-amd64_10.42-4ubuntu2_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libgmp10-amd64_2-6.3.0-dfsg-2ubuntu6_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libattr1-amd64_1-2.5.2-1build1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libacl1-amd64_2.3.2-1build1_filemap//:filemap.json" + ], + "package_name": "coreutils" + } + }, + "noble_libattr1-amd64_1-2.5.2-1build1_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_libattr1-amd64_1-2.5.2-1build1": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_libattr1-amd64_1-2.5.2-1build1", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/a/attr/libattr1_2.5.2-1build1_amd64.deb" + ], + "sha256": "204e45dde86d1cf762114bd91fdab9d820de08e3da8216c7b25382924a96aa9f", + "mergedusr": false, + "depends_on": [ + "/noble/libc6:amd64=2.39-0ubuntu8", + "/noble/libgcc-s1:amd64=14-20240412-0ubuntu1", + "/noble/gcc-14-base:amd64=14-20240412-0ubuntu1" + ], + "dep_filemaps": [ + "@@rules_distroless++apt+noble_libc6-amd64_2.39-0ubuntu8_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libgcc-s1-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_gcc-14-base-amd64_14-20240412-0ubuntu1_filemap//:filemap.json" + ], + "package_name": "libattr1" + } + }, + "noble_ca-certificates-amd64_20240203_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_ca-certificates-amd64_20240203": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_ca-certificates-amd64_20240203", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/c/ca-certificates/ca-certificates_20240203_all.deb" + ], + "sha256": "641de77d8f142cfd62a1a6f964ba67b20754d3337c480efb529d086075a06c9a", + "mergedusr": false, + "depends_on": [ + "/noble/debconf:amd64=1.5.86ubuntu1", + "/noble/openssl:amd64=3.0.13-0ubuntu3", + "/noble/libssl3t64:amd64=3.0.13-0ubuntu3", + "/noble/libc6:amd64=2.39-0ubuntu8", + "/noble/libgcc-s1:amd64=14-20240412-0ubuntu1", + "/noble/gcc-14-base:amd64=14-20240412-0ubuntu1" + ], + "dep_filemaps": [ + "@@rules_distroless++apt+noble_debconf-amd64_1.5.86ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_openssl-amd64_3.0.13-0ubuntu3_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libssl3t64-amd64_3.0.13-0ubuntu3_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libc6-amd64_2.39-0ubuntu8_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libgcc-s1-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_gcc-14-base-amd64_14-20240412-0ubuntu1_filemap//:filemap.json" + ], + "package_name": "ca-certificates" + } + }, + "noble_bash-amd64_5.2.21-2ubuntu4_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_bash-amd64_5.2.21-2ubuntu4": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_bash-amd64_5.2.21-2ubuntu4", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/b/bash/bash_5.2.21-2ubuntu4_amd64.deb" + ], + "sha256": "73de311a21e094e29ac01527d2b52226cc87fde0a5b57032902251b426d92c66", + "mergedusr": false, + "depends_on": [ + "/noble/debianutils:amd64=5.17build1", + "/noble/libc6:amd64=2.39-0ubuntu8", + "/noble/libgcc-s1:amd64=14-20240412-0ubuntu1", + "/noble/gcc-14-base:amd64=14-20240412-0ubuntu1", + "/noble/base-files:amd64=13ubuntu10", + "/noble/libcrypt1:amd64=1:4.4.36-4build1", + "/noble/mawk:amd64=1.3.4.20240123-1build1", + "/noble/libtinfo6:amd64=6.4+20240113-1ubuntu2" + ], + "dep_filemaps": [ + "@@rules_distroless++apt+noble_debianutils-amd64_5.17build1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libc6-amd64_2.39-0ubuntu8_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libgcc-s1-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_gcc-14-base-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_base-files-amd64_13ubuntu10_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libcrypt1-amd64_1-4.4.36-4build1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_mawk-amd64_1.3.4.20240123-1build1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libtinfo6-amd64_6.4-20240113-1ubuntu2_filemap//:filemap.json" + ], + "package_name": "bash" + } + }, + "noble_debianutils-amd64_5.17build1_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_debianutils-amd64_5.17build1": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_debianutils-amd64_5.17build1", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/d/debianutils/debianutils_5.17build1_amd64.deb" + ], + "sha256": "1047a9a57018e18531f76e5b00e226a68554b6f1d147f2a5c1b32518c7b20636", + "mergedusr": false, + "depends_on": [ + "/noble/libc6:amd64=2.39-0ubuntu8", + "/noble/libgcc-s1:amd64=14-20240412-0ubuntu1", + "/noble/gcc-14-base:amd64=14-20240412-0ubuntu1" + ], + "dep_filemaps": [ + "@@rules_distroless++apt+noble_libc6-amd64_2.39-0ubuntu8_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libgcc-s1-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_gcc-14-base-amd64_14-20240412-0ubuntu1_filemap//:filemap.json" + ], + "package_name": "debianutils" + } + }, + "noble_base-files-amd64_13ubuntu10_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_base-files-amd64_13ubuntu10": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_base-files-amd64_13ubuntu10", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/b/base-files/base-files_13ubuntu10_amd64.deb" + ], + "sha256": "cd06729c776397bb74779773f4dece372a1a3f795e5992804022bffab0278ffb", + "mergedusr": false, + "depends_on": [ + "/noble/libcrypt1:amd64=1:4.4.36-4build1", + "/noble/libc6:amd64=2.39-0ubuntu8", + "/noble/libgcc-s1:amd64=14-20240412-0ubuntu1", + "/noble/gcc-14-base:amd64=14-20240412-0ubuntu1", + "/noble/mawk:amd64=1.3.4.20240123-1build1" + ], + "dep_filemaps": [ + "@@rules_distroless++apt+noble_libcrypt1-amd64_1-4.4.36-4build1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libc6-amd64_2.39-0ubuntu8_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libgcc-s1-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_gcc-14-base-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_mawk-amd64_1.3.4.20240123-1build1_filemap//:filemap.json" + ], + "package_name": "base-files" + } + }, + "noble_libcrypt1-amd64_1-4.4.36-4build1_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_libcrypt1-amd64_1-4.4.36-4build1": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_libcrypt1-amd64_1-4.4.36-4build1", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/libx/libxcrypt/libcrypt1_4.4.36-4build1_amd64.deb" + ], + "sha256": "9474785cd6f398512bf8c305c3901dbb111569dccb6f5832002373c0a8ac5832", + "mergedusr": false, + "depends_on": [ + "/noble/libc6:amd64=2.39-0ubuntu8", + "/noble/libgcc-s1:amd64=14-20240412-0ubuntu1", + "/noble/gcc-14-base:amd64=14-20240412-0ubuntu1" + ], + "dep_filemaps": [ + "@@rules_distroless++apt+noble_libc6-amd64_2.39-0ubuntu8_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libgcc-s1-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_gcc-14-base-amd64_14-20240412-0ubuntu1_filemap//:filemap.json" + ], + "package_name": "libcrypt1" + } + }, + "noble_mawk-amd64_1.3.4.20240123-1build1_filemap": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_filemap.bzl%deb_filemap", + "attributes": { + "files": "[]" + } + }, + "noble_mawk-amd64_1.3.4.20240123-1build1": { + "repoRuleId": "@@rules_distroless+//apt/private:deb_import.bzl%deb_import", + "attributes": { + "target_name": "noble_mawk-amd64_1.3.4.20240123-1build1", + "urls": [ + "https://snapshot.ubuntu.com/ubuntu/20240601T000000Z/pool/main/m/mawk/mawk_1.3.4.20240123-1build1_amd64.deb" + ], + "sha256": "dc7f7f4dad4b48f6012ea65de3198d8376604afef39f06d65ec6167740e203c9", + "mergedusr": false, + "depends_on": [ + "/noble/libc6:amd64=2.39-0ubuntu8", + "/noble/libgcc-s1:amd64=14-20240412-0ubuntu1", + "/noble/gcc-14-base:amd64=14-20240412-0ubuntu1" + ], + "dep_filemaps": [ + "@@rules_distroless++apt+noble_libc6-amd64_2.39-0ubuntu8_filemap//:filemap.json", + "@@rules_distroless++apt+noble_libgcc-s1-amd64_14-20240412-0ubuntu1_filemap//:filemap.json", + "@@rules_distroless++apt+noble_gcc-14-base-amd64_14-20240412-0ubuntu1_filemap//:filemap.json" + ], + "package_name": "mawk" + } + } + }, + "moduleExtensionMetadata": { + "useAllRepos": "NO", + "reproducible": false + } + } + }, + "@@rules_kotlin+//src/main/starlark/core/repositories:bzlmod_setup.bzl%rules_kotlin_extensions": { + "general": { + "bzlTransitiveDigest": "+Kp6j204mBZ3mxlIDDR0gBoP45BZ4jYRhRAcB8sU0qc=", + "usagesDigest": "QI2z8ZUR+mqtbwsf2fLqYdJAkPOHdOV+tF2yVAUgRzw=", + "recordedInputs": [ + "REPO_MAPPING:rules_kotlin+,bazel_tools bazel_tools" + ], + "generatedRepoSpecs": { + "com_github_jetbrains_kotlin_git": { + "repoRuleId": "@@rules_kotlin+//src/main/starlark/core/repositories:compiler.bzl%kotlin_compiler_git_repository", + "attributes": { + "urls": [ + "https://github.com/JetBrains/kotlin/releases/download/v1.9.23/kotlin-compiler-1.9.23.zip" + ], + "sha256": "93137d3aab9afa9b27cb06a824c2324195c6b6f6179d8a8653f440f5bd58be88" + } + }, + "com_github_jetbrains_kotlin": { + "repoRuleId": "@@rules_kotlin+//src/main/starlark/core/repositories:compiler.bzl%kotlin_capabilities_repository", + "attributes": { + "git_repository_name": "com_github_jetbrains_kotlin_git", + "compiler_version": "1.9.23" + } + }, + "com_github_google_ksp": { + "repoRuleId": "@@rules_kotlin+//src/main/starlark/core/repositories:ksp.bzl%ksp_compiler_plugin_repository", + "attributes": { + "urls": [ + "https://github.com/google/ksp/releases/download/1.9.23-1.0.20/artifacts.zip" + ], + "sha256": "ee0618755913ef7fd6511288a232e8fad24838b9af6ea73972a76e81053c8c2d", + "strip_version": "1.9.23-1.0.20" + } + }, + "com_github_pinterest_ktlint": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_file", + "attributes": { + "sha256": "01b2e0ef893383a50dbeb13970fe7fa3be36ca3e83259e01649945b09d736985", + "urls": [ + "https://github.com/pinterest/ktlint/releases/download/1.3.0/ktlint" + ], + "executable": true + } + }, + "rules_android": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "sha256": "cd06d15dd8bb59926e4d65f9003bfc20f9da4b2519985c27e190cddc8b7a7806", + "strip_prefix": "rules_android-0.1.1", + "urls": [ + "https://github.com/bazelbuild/rules_android/archive/v0.1.1.zip" + ] + } + } + } + } + }, + "@@rules_oci+//oci:extensions.bzl%oci": { + "general": { + "bzlTransitiveDigest": "BMV1I28TKo02Nc5GW49YhdjXtU8JukzWOSQHoszj1TI=", + "usagesDigest": "/O1PwnnkqSBmI9Oe08ZYYqjM4IS8JR+/9rjgzVTNDaQ=", + "recordedInputs": [ + "REPO_MAPPING:aspect_bazel_lib+,bazel_tools bazel_tools", + "REPO_MAPPING:bazel_features+,bazel_tools bazel_tools", + "REPO_MAPPING:rules_oci+,aspect_bazel_lib aspect_bazel_lib+", + "REPO_MAPPING:rules_oci+,bazel_features bazel_features+", + "REPO_MAPPING:rules_oci+,bazel_skylib bazel_skylib+" + ], + "generatedRepoSpecs": { + "oci_crane_darwin_amd64": { + "repoRuleId": "@@rules_oci+//oci:repositories.bzl%crane_repositories", + "attributes": { + "platform": "darwin_amd64", + "crane_version": "v0.18.0" + } + }, + "oci_crane_darwin_arm64": { + "repoRuleId": "@@rules_oci+//oci:repositories.bzl%crane_repositories", + "attributes": { + "platform": "darwin_arm64", + "crane_version": "v0.18.0" + } + }, + "oci_crane_linux_arm64": { + "repoRuleId": "@@rules_oci+//oci:repositories.bzl%crane_repositories", + "attributes": { + "platform": "linux_arm64", + "crane_version": "v0.18.0" + } + }, + "oci_crane_linux_armv6": { + "repoRuleId": "@@rules_oci+//oci:repositories.bzl%crane_repositories", + "attributes": { + "platform": "linux_armv6", + "crane_version": "v0.18.0" + } + }, + "oci_crane_linux_i386": { + "repoRuleId": "@@rules_oci+//oci:repositories.bzl%crane_repositories", + "attributes": { + "platform": "linux_i386", + "crane_version": "v0.18.0" + } + }, + "oci_crane_linux_s390x": { + "repoRuleId": "@@rules_oci+//oci:repositories.bzl%crane_repositories", + "attributes": { + "platform": "linux_s390x", + "crane_version": "v0.18.0" + } + }, + "oci_crane_linux_amd64": { + "repoRuleId": "@@rules_oci+//oci:repositories.bzl%crane_repositories", + "attributes": { + "platform": "linux_amd64", + "crane_version": "v0.18.0" + } + }, + "oci_crane_windows_armv6": { + "repoRuleId": "@@rules_oci+//oci:repositories.bzl%crane_repositories", + "attributes": { + "platform": "windows_armv6", + "crane_version": "v0.18.0" + } + }, + "oci_crane_windows_amd64": { + "repoRuleId": "@@rules_oci+//oci:repositories.bzl%crane_repositories", + "attributes": { + "platform": "windows_amd64", + "crane_version": "v0.18.0" + } + }, + "oci_crane_toolchains": { + "repoRuleId": "@@rules_oci+//oci/private:toolchains_repo.bzl%toolchains_repo", + "attributes": { + "toolchain_type": "@rules_oci//oci:crane_toolchain_type", + "toolchain": "@oci_crane_{platform}//:crane_toolchain" + } + }, + "oci_regctl_darwin_amd64": { + "repoRuleId": "@@rules_oci+//oci:repositories.bzl%regctl_repositories", + "attributes": { + "platform": "darwin_amd64" + } + }, + "oci_regctl_darwin_arm64": { + "repoRuleId": "@@rules_oci+//oci:repositories.bzl%regctl_repositories", + "attributes": { + "platform": "darwin_arm64" + } + }, + "oci_regctl_linux_arm64": { + "repoRuleId": "@@rules_oci+//oci:repositories.bzl%regctl_repositories", + "attributes": { + "platform": "linux_arm64" + } + }, + "oci_regctl_linux_s390x": { + "repoRuleId": "@@rules_oci+//oci:repositories.bzl%regctl_repositories", + "attributes": { + "platform": "linux_s390x" + } + }, + "oci_regctl_linux_amd64": { + "repoRuleId": "@@rules_oci+//oci:repositories.bzl%regctl_repositories", + "attributes": { + "platform": "linux_amd64" + } + }, + "oci_regctl_windows_amd64": { + "repoRuleId": "@@rules_oci+//oci:repositories.bzl%regctl_repositories", + "attributes": { + "platform": "windows_amd64" + } + }, + "oci_regctl_toolchains": { + "repoRuleId": "@@rules_oci+//oci/private:toolchains_repo.bzl%toolchains_repo", + "attributes": { + "toolchain_type": "@rules_oci//oci:regctl_toolchain_type", + "toolchain": "@oci_regctl_{platform}//:regctl_toolchain" + } + } + }, + "moduleExtensionMetadata": { + "explicitRootModuleDirectDeps": [], + "explicitRootModuleDirectDevDeps": [], + "useAllRepos": "NO", + "reproducible": false + } + } + }, + "@@rules_python+//python/uv:uv.bzl%uv": { + "general": { + "bzlTransitiveDigest": "yG9F6L2IZXKRbD/aIUa6sU7uITLUTBKOMWPbIvl1VdM=", + "usagesDigest": "6MjoD3H+netDdhklgMWks3NARpHVXxy8kfsMe9XXPa8=", + "recordedInputs": [ + "REPO_MAPPING:rules_python+,bazel_tools bazel_tools", + "REPO_MAPPING:rules_python+,platforms platforms" + ], + "generatedRepoSpecs": { + "uv": { + "repoRuleId": "@@rules_python+//python/uv/private:uv_toolchains_repo.bzl%uv_toolchains_repo", + "attributes": { + "toolchain_type": "'@@rules_python+//python/uv:uv_toolchain_type'", + "toolchain_names": [ + "none" + ], + "toolchain_implementations": { + "none": "'@@rules_python+//python:none'" + }, + "toolchain_compatible_with": { + "none": [ + "@platforms//:incompatible" + ] + }, + "toolchain_target_settings": {} + } + } + } + } + }, + "@@yq.bzl+//yq:extensions.bzl%yq": { + "general": { + "bzlTransitiveDigest": "61Uz+o5PnlY0jJfPZEUNqsKxnM/UCLeWsn5VVCc8u5Y=", + "usagesDigest": "oAQ5Hp6H1wlr4abmhh+iBqk43oSfdXw+++tKd5PKWHE=", + "recordedInputs": [], + "generatedRepoSpecs": { + "yq_darwin_amd64": { + "repoRuleId": "@@yq.bzl+//yq/toolchain:platforms.bzl%yq_platform_repo", + "attributes": { + "platform": "darwin_amd64", + "version": "4.45.1" + } + }, + "yq_darwin_arm64": { + "repoRuleId": "@@yq.bzl+//yq/toolchain:platforms.bzl%yq_platform_repo", + "attributes": { + "platform": "darwin_arm64", + "version": "4.45.1" + } + }, + "yq_linux_amd64": { + "repoRuleId": "@@yq.bzl+//yq/toolchain:platforms.bzl%yq_platform_repo", + "attributes": { + "platform": "linux_amd64", + "version": "4.45.1" + } + }, + "yq_linux_arm64": { + "repoRuleId": "@@yq.bzl+//yq/toolchain:platforms.bzl%yq_platform_repo", + "attributes": { + "platform": "linux_arm64", + "version": "4.45.1" + } + }, + "yq_linux_s390x": { + "repoRuleId": "@@yq.bzl+//yq/toolchain:platforms.bzl%yq_platform_repo", + "attributes": { + "platform": "linux_s390x", + "version": "4.45.1" + } + }, + "yq_linux_riscv64": { + "repoRuleId": "@@yq.bzl+//yq/toolchain:platforms.bzl%yq_platform_repo", + "attributes": { + "platform": "linux_riscv64", + "version": "4.45.1" + } + }, + "yq_linux_ppc64le": { + "repoRuleId": "@@yq.bzl+//yq/toolchain:platforms.bzl%yq_platform_repo", + "attributes": { + "platform": "linux_ppc64le", + "version": "4.45.1" + } + }, + "yq_windows_amd64": { + "repoRuleId": "@@yq.bzl+//yq/toolchain:platforms.bzl%yq_platform_repo", + "attributes": { + "platform": "windows_amd64", + "version": "4.45.1" + } + }, + "yq_toolchains": { + "repoRuleId": "@@yq.bzl+//yq/toolchain:toolchain.bzl%yq_toolchains_repo", + "attributes": { + "user_repository_name": "yq" + } + } + } + } + } + }, + "facts": { + "@@aspect_rules_py+//py:extensions.bzl%python_interpreters": { + "release_index_v1_20241002_https://github.com/astral-sh/python-build-standalone/releases/download": { + "3.10/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.10.15+20241002-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.10.15", + "sha256": "bcfdf8235cd4f84ca280f33a17030e65ba23e7905e70a8ed2ed2c83229ad136f" + }, + "3.10/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.10.15+20241002-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.10.15", + "sha256": "2e364a47cdbfcfaf56122b7656a3e8a7163babbda4f6bb6165aa644cbc65bd57" + }, + "3.10/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.10.15+20241002-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.10.15", + "sha256": "814561a8addee5f56a19223ecdd879a22b82d631bd5704eac7b2e98287e797a8" + }, + "3.10/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.10.15+20241002-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.10.15", + "sha256": "35678c2ba6d7aff56ca96f06ca735fe4bd09e4a5d3d40f552d76a1653c80a123" + }, + "3.10/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.10.15+20241002-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.10.15", + "sha256": "422fb92c310f030b05ca8e59a256c72ffde38f03382a006284d9e5e2a7b646f5" + }, + "3.10/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.10.15+20241002-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.10.15", + "sha256": "f17cba68a55dcd386be4cbb0002cf3037718019fc1585b2ff9a32efd3283557d" + }, + "3.10/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.10.15+20241002-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.10.15", + "sha256": "7b2baf761282600359d43e6f14b01437a8d0e517ba3a28f50688806dd8897b11" + }, + "3.11/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.11.10+20241002-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.11.10", + "sha256": "540225743ca9ca04d7e0de520e211ecafb379677c49fba4b89334e7248219cb2" + }, + "3.11/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.11.10+20241002-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.11.10", + "sha256": "047e687b561f8e38740819cc3e112e83ae349927cca846921a1c301e5d9cc873" + }, + "3.11/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.11.10+20241002-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.11.10", + "sha256": "d9e75d5028c8975c158f4b9c01ef820480249b3401dbde755c0f344e15feebf5" + }, + "3.11/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.11.10+20241002-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.11.10", + "sha256": "f498693f03fd672a4dc581ef0e1101102d33964352c35ecff21686a8d00744c9" + }, + "3.11/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.11.10+20241002-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.11.10", + "sha256": "d71cde066b614903e9f243c4babd179e7e978fcfa95702355566463e623abe6c" + }, + "3.11/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.11.10+20241002-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.11.10", + "sha256": "9c0197e72b2dd1ebf56eb562cb7a078052b4ab71d5666cd3be3b6e75db42c79e" + }, + "3.11/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.11.10+20241002-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.11.10", + "sha256": "fb86dce628d2008eefd3550193839fb9f283f5f6c25a09c8b676713ff4757156" + }, + "3.12/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.12.7+20241002-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.12.7", + "sha256": "5a9cdbb8536839a83edae3e41eb44161b640d78181fec083e07c668ba796a875" + }, + "3.12/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.12.7+20241002-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.12.7", + "sha256": "5481ca52e7ac8685c1e9d4e804a66e5c928879e0f44799aa6934735f66266643" + }, + "3.12/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.12.7+20241002-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.12.7", + "sha256": "8c62920e2fef022fc49d58cc999c77ea45318f96a5a5c0ba3bb155d33732d7f3" + }, + "3.12/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.12.7+20241002-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.12.7", + "sha256": "60eaf2c9a63926f5edfe7a0ecf4b2fbb37de6764f0c0100be245d098e3995da7" + }, + "3.12/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.12.7+20241002-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.12.7", + "sha256": "1c74dd0499ef7d993d8942ebe6692c90c50d09719e0335f8e210b91277f8e7c0" + }, + "3.12/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.12.7+20241002-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.12.7", + "sha256": "04ffccbbb1beedd0bc80347c061fe527833001681ee543c3ba85dac5134ed500" + }, + "3.12/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.12.7+20241002-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.12.7", + "sha256": "d4a8f2b3e422089475bcd6f2b855c9ed0e666af2de4f19df7c764362eb8c4aca" + }, + "3.13/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.13.0rc3+20241002-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.13.0rc3", + "sha256": "577e846eaf0a27342b3f80b5f292eb292b0eb6a9df3a0fa0c5925e86cfe046a3" + }, + "3.13/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.13.0rc3+20241002-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.13.0rc3", + "sha256": "48974ab9b4a6990b17e6740393492fc5557e6acc4ab02be9d9543e0e506e48a6" + }, + "3.13/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.13.0rc3+20241002-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.13.0rc3", + "sha256": "fa5e8195fa7a6b6d4df0bc92b36d38836b72c4f5fb41978d495abe5a454fed67" + }, + "3.13/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.13.0rc3+20241002-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.13.0rc3", + "sha256": "81a01923b25a4b2b68f517b07a4a4a9186d873e6518f060e4a004e77d7094687" + }, + "3.13/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.13.0rc3+20241002-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.13.0rc3", + "sha256": "319ecb727317868c4f3bfecd480f216b38275f5373f72c022d255318b650ebe2" + }, + "3.13/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.13.0rc3+20241002-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.13.0rc3", + "sha256": "a4b4e0a79b53938db050daf7f78dd09faf49d1e29dbba6cac87cf857c0a51fb4" + }, + "3.13/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.13.0rc3+20241002-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.13.0rc3", + "sha256": "56fac98fb5ed39f67cd7c0ce6e503a1e551ce727dc46796a0f16c09d26e845aa" + }, + "3.8/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.8.20+20241002-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.8.20", + "sha256": "2ddfc04bdb3e240f30fb782fa1deec6323799d0e857e0b63fa299218658fd3d4" + }, + "3.8/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.8.20+20241002-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.8.20", + "sha256": "9d8798f9e79e0fc0f36fcb95bfa28a1023407d51a8ea5944b4da711f1f75f1ed" + }, + "3.8/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.8.20+20241002-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.8.20", + "sha256": "06988218600fe3e2c02c3182d5629a1d4e596b3771ab32a9e99756c5904b5fac" + }, + "3.8/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.8.20+20241002-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.8.20", + "sha256": "68d060cd373255d2ca5b8b3441363d5aa7cc45b0c11bbccf52b1717c2b5aa8bb" + }, + "3.8/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.8.20+20241002-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.8.20", + "sha256": "41b6709fec9c56419b7de1940d1f87fa62045aff81734480672dcb807eedc47e" + }, + "3.8/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.8.20+20241002-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.8.20", + "sha256": "285e141c36f88b2e9357654c5f77d1f8fb29cc25132698fe35bb30d787f38e87" + }, + "3.8/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.8.20+20241002-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.8.20", + "sha256": "ea8d7f9dd35815cf88f5ed257b5d0206d97df5a9500f719b6a6031b8c7071db8" + }, + "3.9/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.9.20+20241002-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.9.20", + "sha256": "dc5f3b4c54deea7a42479b3f81b1c1b3a330f721aea3aff7df9833567bbfa8ea" + }, + "3.9/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.9.20+20241002-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.9.20", + "sha256": "0d84fa0884e843828312a1fcbfd8756abe3d6cf3c27086f79cd7352bad13ac4c" + }, + "3.9/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.9.20+20241002-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.9.20", + "sha256": "bd2c7cf4d7eba224ada44dfbccf5248d313ba5072462c71aa753c824354704f3" + }, + "3.9/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.9.20+20241002-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.9.20", + "sha256": "a07be8fddd5f6f6a0db7abd16f2b2a8a94a891e54091e4f45b64e822597e4d7d" + }, + "3.9/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.9.20+20241002-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.9.20", + "sha256": "94000af8e9d9f5aba6d2325963a6b3403afbf310f6790edff3dfe8becd8197de" + }, + "3.9/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.9.20+20241002-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.9.20", + "sha256": "fec849569158e5e46610621d7da91b02dca2cc5f66dd49cc0f85d7469c8f5a84" + }, + "3.9/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.9.20+20241002-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.9.20", + "sha256": "31f5e329f14ac8b79527712c4265edfea1cb6dff4bb04cf8c51cd809290e136c" + } + }, + "release_index_v1_20251031_https://github.com/astral-sh/python-build-standalone/releases/download": { + "3.10/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.10.19+20251031-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.10.19", + "sha256": "43bda24c2fc073bc308bf631203b917a72640d59b59fdad4ba14503d84727012" + }, + "3.10/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.10.19+20251031-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.10.19", + "sha256": "f77a8a8aa77f3f943126fa9215a25309da4bf20398fc8f4b4eec54b5fc7570ef" + }, + "3.10/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.10.19+20251031-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.10.19", + "sha256": "9b9deba652d98857ae99bd11b05fb560144aafbd9b9e8e01c8c6d56577a06a4d" + }, + "3.10/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.10.19+20251031-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.10.19", + "sha256": "0240edca85508661e20bb69562686965c85b8328727332d9ebfd57cceb7fb372" + }, + "3.10/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.10.19+20251031-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.10.19", + "sha256": "76c12e633c09c2a790f8a958a55df4495527e0718d1875310c836e757c0c7b55" + }, + "3.10/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.10.19+20251031-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.10.19", + "sha256": "cfa08a4caf2df1b43551b843c052d6a8814e2ea0c97268b021f0423646c244c3" + }, + "3.10/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.10.19+20251031-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.10.19", + "sha256": "fb1caac917d7b6497bb6f5950da5f1e48d05c43a498948dd97f85760c4382d9f" + }, + "3.10/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.10.19+20251031-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.10.19", + "sha256": "ba85013ed5ac7733fc6840168cc33ed19e9959b363dc80227d54f8fd9c92c0f4" + }, + "3.11/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.11.14+20251031-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.11.14", + "sha256": "6de5572b33c65af1c9b7caf00ec593fb04cffb7e14fa393a98261bb9bc464713" + }, + "3.11/aarch64-pc-windows-msvc/install_only": { + "filename": "cpython-3.11.14+20251031-aarch64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.11.14", + "sha256": "38d0d1466561e15965e8d2c20f5e5be649598f55c761ecab553d087fbd217337" + }, + "3.11/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.11.14+20251031-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.11.14", + "sha256": "510edb027527413c4249256194cb8ad2590b52dd93f7123b4cb341aff5d05894" + }, + "3.11/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.11.14+20251031-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.11.14", + "sha256": "27609ec2b0c6172d5d9f502115a6d48c20ee0a578bf5b0470cd1090be95c22aa" + }, + "3.11/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.11.14+20251031-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.11.14", + "sha256": "b4341ef60bc157f992a0d171f1be4e4c42dcfc537f3562f72aa7f1f9561935e0" + }, + "3.11/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.11.14+20251031-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.11.14", + "sha256": "4891cbf34e8652b7bd1054b9502395e4b7e048e2e517c040fbf6c8297cb954d6" + }, + "3.11/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.11.14+20251031-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.11.14", + "sha256": "5223b83ed9e2aa5e9e17d2ebcf767956e998876339b9cde1980a47e9d4655fb6" + }, + "3.11/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.11.14+20251031-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.11.14", + "sha256": "60f0bd473d861cc45d3401d9914e47ccb9fa037f88a91879ed517a62042b8477" + }, + "3.11/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.11.14+20251031-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.11.14", + "sha256": "25e82d1e85b90a8ab724ee633a1811b1921797f5c25ee69c6595052371b91a87" + }, + "3.12/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.12.12+20251031-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.12.12", + "sha256": "5e110cb821d2eb8246065d3b46faa655180c976c4e17250f7883c634a629bc63" + }, + "3.12/aarch64-pc-windows-msvc/install_only": { + "filename": "cpython-3.12.12+20251031-aarch64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.12.12", + "sha256": "b190fed7c2b0f6e1010f554a0d1fd191c0754c4c0718e69d9d795ae559613780" + }, + "3.12/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.12.12+20251031-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.12.12", + "sha256": "81b644d166e0bfb918615af8a2363f8fcf26eccdcc60a5334b6a62c088470bac" + }, + "3.12/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.12.12+20251031-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.12.12", + "sha256": "fc423af42f4eb454c99779d9eedc619141606572da3851f7980a8da719f0f8db" + }, + "3.12/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.12.12+20251031-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.12.12", + "sha256": "7d333e58a53edb1ba3c85bb35dc718ea3e599d0f6b58a0cbef35b2d8184a763e" + }, + "3.12/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.12.12+20251031-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.12.12", + "sha256": "687052a046d33be49dc95dd671816709067cf6176ed36c93ea61b1fe0b883b0f" + }, + "3.12/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.12.12+20251031-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.12.12", + "sha256": "cff398b3f520c442a1b085dd347126c10c1b03f01ccc0decd8c897a687e893f1" + }, + "3.12/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.12.12+20251031-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.12.12", + "sha256": "80c3882f14e15cef8260ef5257d198e8f4371ca265887431d939e0d561de3253" + }, + "3.12/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.12.12+20251031-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.12.12", + "sha256": "0a461330b9b89f2ea3088dde10d7a3f96aa65897b7c5ce2404fa3b5c4b8daa14" + }, + "3.13/aarch64-apple-darwin/freethreaded": { + "filename": "cpython-3.13.9+20251031-aarch64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.13.9", + "sha256": "eae1272a72ccce601590a10a9ca2a58199b5fcdf022aa603a527e3e2a04de9bc" + }, + "3.13/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.13.9+20251031-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.13.9", + "sha256": "1f3568d17383426d52350c2ef7c93c1a5a043198b860cb05e5d19b35f9c25cef" + }, + "3.13/aarch64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.13.9+20251031-aarch64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.13.9", + "sha256": "743ff69935ef28834621647dab30f032dfcd80315732917531eea333210941c7" + }, + "3.13/aarch64-pc-windows-msvc/install_only": { + "filename": "cpython-3.13.9+20251031-aarch64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.13.9", + "sha256": "20db43873d3c4c2175d866806545e4ad4ec6bb72ca95e60082a4df6c24567e8c" + }, + "3.13/aarch64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.13.9+20251031-aarch64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.13.9", + "sha256": "a6e72f9de5d9b46cf6968d6a492f2401a919f9b959f8da2d87f43484b80169ee" + }, + "3.13/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.13.9+20251031-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.13.9", + "sha256": "0a56d11b0fb1662e67f892b9d5d1717aef06f24dbb8362bc25b8f784e620d44e" + }, + "3.13/aarch64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.13.9+20251031-aarch64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.13.9", + "sha256": "ba6a8d199c9f2a7aa5b88fdf16132049d675ab483eb6250e176a90fa0726eac4" + }, + "3.13/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.13.9+20251031-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.13.9", + "sha256": "90c803b66f8483caeeb5655ca82b7f19068515826a569ed05414326a6ff8d06d" + }, + "3.13/i686-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.13.9+20251031-i686-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.13.9", + "sha256": "a6cb3d7df191cde663ebf5f0108a9d7742e33862676ecde97fd90184333e822d" + }, + "3.13/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.13.9+20251031-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.13.9", + "sha256": "c0b0a34a492465bd44e9512582ae4ca47c06f9696807048cd917cb71c03a8416" + }, + "3.13/x86_64-apple-darwin/freethreaded": { + "filename": "cpython-3.13.9+20251031-x86_64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.13.9", + "sha256": "e2bf5fa6a3ef443ade362e08b0a19bbc172f7bfe34dabe933ccaad31d53af5da" + }, + "3.13/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.13.9+20251031-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.13.9", + "sha256": "48c0f3ca5d31e90658ef99138dc21865bb62f388ab97a1ce72cac176da194ab0" + }, + "3.13/x86_64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.13.9+20251031-x86_64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.13.9", + "sha256": "318a9a1e43dd52054327de3bccc0c5b7afde7b7f2a398ccb4d38e03d28b05386" + }, + "3.13/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.13.9+20251031-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.13.9", + "sha256": "874593f641f31ea101440c70f81768c35d4d7d6df111fde63094db67465ef787" + }, + "3.13/x86_64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.13.9+20251031-x86_64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.13.9", + "sha256": "dcc29b069d0588fbd4ea29c6df840c8d1207d2a3bce8cd5cd57d1b85373b6048" + }, + "3.13/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.13.9+20251031-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.13.9", + "sha256": "6f05b91ee8c7e6dd0f9c60b95bb29130e2d623961de6578b643e80ddd83f96b6" + }, + "3.13/x86_64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.13.9+20251031-x86_64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.13.9", + "sha256": "4c5c9a251a45288ebd4a51900708eb2ada9197173ba56e5604b6b63727fb87ff" + }, + "3.13/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.13.9+20251031-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.13.9", + "sha256": "ad987197034185e628715da504a50613af213dc21ba6d5ccaeab3db2c464aa6c" + }, + "3.14/aarch64-apple-darwin/freethreaded": { + "filename": "cpython-3.14.0+20251031-aarch64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.14.0", + "sha256": "d9c7b430b25bd3837dbb03f945dbe6b7bc526c5940ca96f5db7cdc42f6b2b801" + }, + "3.14/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.14.0+20251031-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.14.0", + "sha256": "b4bcd3c6c24cab32ae99e1b05c89312b783b4d69431d702e5012fe1fdcad4087" + }, + "3.14/aarch64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.14.0+20251031-aarch64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.14.0", + "sha256": "40266e60f655e49cd1d5303295255909a4b593b08b88be6e6a55b2c9fe6ed13d" + }, + "3.14/aarch64-pc-windows-msvc/install_only": { + "filename": "cpython-3.14.0+20251031-aarch64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.14.0", + "sha256": "599a8b7e12439cd95a201dbdfe95cf363146b1ff91f379555dafd86b170caab9" + }, + "3.14/aarch64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.14.0+20251031-aarch64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.14.0", + "sha256": "f383ef50d1da6ca511212e5ae601923b56636b87351fd5fc847e0ea0a19fa9b3" + }, + "3.14/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.14.0+20251031-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.14.0", + "sha256": "128a9cbfb9645d5237ec01704d9d1d2ac5f084464cc43c37a4cd96aa9c3b1ad5" + }, + "3.14/aarch64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.14.0+20251031-aarch64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.14.0", + "sha256": "33c7aa105634102c61b8ad01c801dbaf1950e59c04a876b72004cf4fbcfc6e33" + }, + "3.14/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.14.0+20251031-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.14.0", + "sha256": "e850ffb10a13cf16fb6ee08989e53532b606e7e96045ee65f7a3f41a9de14010" + }, + "3.14/i686-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.14.0+20251031-i686-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.14.0", + "sha256": "c47e0e4fd3a2d334a9f3df1d40fd9a7a8f743572dbd798b68fe5a6361c399806" + }, + "3.14/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.14.0+20251031-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.14.0", + "sha256": "35703b8b813afd37036ec88973c0f5a7626ee0dd48544a1c69cddeee994b5274" + }, + "3.14/x86_64-apple-darwin/freethreaded": { + "filename": "cpython-3.14.0+20251031-x86_64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.14.0", + "sha256": "b3196f6b57bbb3dc2ee07f348f1d51117ffa376979eceafbf50c15f0f7980bf8" + }, + "3.14/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.14.0+20251031-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.14.0", + "sha256": "4e71a3ce973be377ef18637826648bb936e2f9490f64a9e4f33a49bcc431d344" + }, + "3.14/x86_64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.14.0+20251031-x86_64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.14.0", + "sha256": "b81de5fc9e783ea6dfcf1098c28a278c874999c71afbb0309f6a8b4276c769d0" + }, + "3.14/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.14.0+20251031-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.14.0", + "sha256": "39acfcb3857d83eab054a3de11756ffc16b3d49c31393b9800dd2704d1f07fdf" + }, + "3.14/x86_64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.14.0+20251031-x86_64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.14.0", + "sha256": "f4acbef0fbfaf7ab31ac63986da1d93dfa1c5cb797de1dcdc1a988aa18670120" + }, + "3.14/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.14.0+20251031-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.14.0", + "sha256": "3dec1ab70758a3467ac3313bbcdabf7a9b3016db5c072c4537e3cf0a9e6290f6" + }, + "3.14/x86_64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.14.0+20251031-x86_64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.14.0", + "sha256": "9e18302759734fb14694efb0418e7291c8d590d880abc2da1d7e6f14ac9a381d" + }, + "3.14/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.14.0+20251031-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.14.0", + "sha256": "d0a2a6d3b1bb00dce2105377fda8aa79675d187f8d6d7010a42f651af25018dc" + }, + "3.15/aarch64-apple-darwin/freethreaded": { + "filename": "cpython-3.15.0a1+20251031-aarch64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.15.0a1", + "sha256": "12f1b16be4017181ad67904caf9e59e525b9b5d62f49105017d837e27b832959" + }, + "3.15/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.15.0a1+20251031-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.15.0a1", + "sha256": "3acf7aa3559b746498b18929456c5cacb84bae4e09249834cbc818970d71de87" + }, + "3.15/aarch64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.15.0a1+20251031-aarch64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.15.0a1", + "sha256": "54ca78dae455ece6fefbd7f5f287cc55d5ce197caf51921f6d871d15069d9489" + }, + "3.15/aarch64-pc-windows-msvc/install_only": { + "filename": "cpython-3.15.0a1+20251031-aarch64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.15.0a1", + "sha256": "1508bcd7195008479ed156aad3afbb3a3793097ed530690f0304a8107f0e53e8" + }, + "3.15/aarch64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.15.0a1+20251031-aarch64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.15.0a1", + "sha256": "981fe8dfc6e7e1d0ffefa945a18d5c4c759bbe21722acf3a5cc7e62f16aa5f3c" + }, + "3.15/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.15.0a1+20251031-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.15.0a1", + "sha256": "d55c2aeece827e6bec83fd18515ee281d9ea0efaa3e2d20130db8f1c7cbb71c6" + }, + "3.15/aarch64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.15.0a1+20251031-aarch64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.15.0a1", + "sha256": "017cd58a8e6d93a8d60453899d4bac6f540414003ec9a73dc106c20045d542ee" + }, + "3.15/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.15.0a1+20251031-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.15.0a1", + "sha256": "abbd20235411d7cc24cba48ac519324b8bb71a52e05b26e7012de815e43d6e73" + }, + "3.15/i686-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.15.0a1+20251031-i686-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.15.0a1", + "sha256": "9f4bc934ef9c56e6d1d7263949430cecc19d301fa4cad74fcd36c9b3c6a7ba01" + }, + "3.15/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.15.0a1+20251031-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.15.0a1", + "sha256": "6ffdbe54c45d0a9c309498f65c5ddf3de587c84aee89a227836f42b4e7e25691" + }, + "3.15/x86_64-apple-darwin/freethreaded": { + "filename": "cpython-3.15.0a1+20251031-x86_64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.15.0a1", + "sha256": "64fc29e6c7a2f02a18645d968f1b3fc1d00d12a5ef3fcbb0d077fa8c62c08904" + }, + "3.15/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.15.0a1+20251031-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.15.0a1", + "sha256": "0ab19d3ac25f99da438b088751e5ec2421f9f6aa4292fd2dc0f8e49eb3e16bdf" + }, + "3.15/x86_64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.15.0a1+20251031-x86_64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.15.0a1", + "sha256": "34abc5603e1b4131f753d29b7deac865b9277912b851cbed5a149cf3e6745d3d" + }, + "3.15/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.15.0a1+20251031-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.15.0a1", + "sha256": "5f5d6bec2b381cfc771c49972d2a6f7b7e7ab6a1651d8fb6ef3983f3571722b3" + }, + "3.15/x86_64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.15.0a1+20251031-x86_64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.15.0a1", + "sha256": "0e0272186d9f5169394dbc4d4d72a3f4a5762a04c2e5ac2ab1e23aa41fc8538a" + }, + "3.15/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.15.0a1+20251031-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.15.0a1", + "sha256": "1f356288c2b2713619cb7a4e453d33bf8882f812af2987e21e01e7ae382fefba" + }, + "3.15/x86_64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.15.0a1+20251031-x86_64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.15.0a1", + "sha256": "621ac3b8b8afa1593d63fb130dadc6eec2bd9e3603d6c028efe60146e05ec430" + }, + "3.15/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.15.0a1+20251031-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.15.0a1", + "sha256": "caf5311f333eef082dd69a669ca65aceba09a08fc1e78aad602ad649106f294c" + }, + "3.9/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.9.25+20251031-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.9.25", + "sha256": "87275619c2706affa4d1090d2ca3dad354b6d69f8b85dbfafe38785870751b9a" + }, + "3.9/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.9.25+20251031-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.9.25", + "sha256": "6112d46355857680b81849764a6cf9f38cc4cd0d1cf29d432bc12fe5aeedf9d0" + }, + "3.9/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.9.25+20251031-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.9.25", + "sha256": "f4d8eb93c54cbf7dc37d5599748582d91c268c60008f17daf19c0ad183ec78ab" + }, + "3.9/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.9.25+20251031-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.9.25", + "sha256": "5056f28d59653a6bddcc8007f024af00147a7e6f82e797f073a59f16a5cacc19" + }, + "3.9/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.9.25+20251031-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.9.25", + "sha256": "ace63cfe27a9487c4d72e1cb518be01c1d985271da0b2158e813801f7d3e5503" + }, + "3.9/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.9.25+20251031-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.9.25", + "sha256": "4fb1b416482ce94d73cfa140317a670c596c830671d137b07c26afe8c461768a" + }, + "3.9/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.9.25+20251031-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.9.25", + "sha256": "42834f61eb6df43432c3dd6ab9ca3fdf8c06d10a404ebdb53d6902e6b9570b08" + }, + "3.9/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.9.25+20251031-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.9.25", + "sha256": "76593e8c889e81e82db5fe117fe15b69466f85100ab2ec0e4035aa86242b4e93" + } + }, + "release_index_v1_20260303_https://github.com/astral-sh/python-build-standalone/releases/download": { + "3.10/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.10.20+20260303-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.10.20", + "sha256": "b41060c26454b21990254fdc08a4988f4e325708d785f8a0b4b4533881cf5fd4" + }, + "3.10/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.10.20+20260303-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.10.20", + "sha256": "dcf3b9bd0062276866b4fc84c9e4c39be7ef161d22c769e5f4ee01c8e27100f4" + }, + "3.10/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.10.20+20260303-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.10.20", + "sha256": "92713c7f4a7bb77bf8593818e4c1da8db44d415f45b0b5b7a8eb741695c08303" + }, + "3.10/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.10.20+20260303-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.10.20", + "sha256": "9bc6cd476a2670a054dc8dbdd22c5b7c7642ac2f0ac810c5bb18aa39083a8a99" + }, + "3.10/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.10.20+20260303-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.10.20", + "sha256": "2fd25586216e5e6932d767034618b7bb97654c689f07513009d858398fe181f3" + }, + "3.10/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.10.20+20260303-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.10.20", + "sha256": "aa55177f1247cdac1ccdf0877cdf68e9d6718b0914e56f1083404b1dcbac847b" + }, + "3.10/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.10.20+20260303-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.10.20", + "sha256": "c830fc25bc6e318e7ad4961caadee6cc79c041c122884c90ecfad4fe02e20344" + }, + "3.10/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.10.20+20260303-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.10.20", + "sha256": "c781a93c1030c814bc0861dc424c476ca2e0083b429b968f557e1664f3ef223f" + }, + "3.11/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.11.15+20260303-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.11.15", + "sha256": "0d29ed7cb6711890b3c6da27b6258c4ad3b506bf8d5a381bff531ca8fa67417f" + }, + "3.11/aarch64-pc-windows-msvc/install_only": { + "filename": "cpython-3.11.15+20260303-aarch64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.11.15", + "sha256": "84afaa698da2bc12f05aa317ad1ad6bf6708461e737efd08ad7e95d9a8857c1b" + }, + "3.11/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.11.15+20260303-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.11.15", + "sha256": "4786f5ef8567c982517fcd7cb189a5ef4a712ed0aaf3034e839749794155ad4c" + }, + "3.11/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.11.15+20260303-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.11.15", + "sha256": "d37ebd873138f85603607a56bc821e07551f45e6938e02d36b04885a6eded7ff" + }, + "3.11/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.11.15+20260303-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.11.15", + "sha256": "1924013f72c36c8d19d6887979cded6ca7f2295667d591b88f74260f141e1fee" + }, + "3.11/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.11.15+20260303-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.11.15", + "sha256": "6ea2168c4e18cb31d9dc8486634dc375929bcc2adde0957399ce59d90b52297a" + }, + "3.11/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.11.15+20260303-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.11.15", + "sha256": "6f194e1ede02260fd3d758893bbf1d3bb4084652d436a8300a229da721c3ddf8" + }, + "3.11/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.11.15+20260303-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.11.15", + "sha256": "17e1f5b2c9668217ba554decd94db04adf3d085203d322c690fd44cde549d576" + }, + "3.11/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.11.15+20260303-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.11.15", + "sha256": "ee54c7baaa5a1fb65922505a646a2d097660b005e55bd35055d0a9c46a5ab916" + }, + "3.12/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.12.13+20260303-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.12.13", + "sha256": "2c01f29e9e4ddbd57e0319fedecf1f3e222558fce394a3ed4e39d0f750c11988" + }, + "3.12/aarch64-pc-windows-msvc/install_only": { + "filename": "cpython-3.12.13+20260303-aarch64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.12.13", + "sha256": "f003d15139e0baa39563388b7e29c44a6c4dda3987dbd7cec2050eca32450d4f" + }, + "3.12/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.12.13+20260303-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.12.13", + "sha256": "15c00b489fb89c7e3dc433800cd8b932ab3f8825870c1919fbe747f493edf81d" + }, + "3.12/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.12.13+20260303-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.12.13", + "sha256": "2e3e3fc934a597c5c0e95fe9093a89cd6d3e248f9d3f6a0e82dbfa923499bd9d" + }, + "3.12/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.12.13+20260303-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.12.13", + "sha256": "af220242f3d2bebff6b9a01666895bb7198d7e4be608752f7e4007dd0fddfa22" + }, + "3.12/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.12.13+20260303-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.12.13", + "sha256": "8ad52a15de26e67d53f5c14f338433c59d5a2711852adc59043a20ec8da71a52" + }, + "3.12/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.12.13+20260303-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.12.13", + "sha256": "43990976c8de6b72a7525cb509eedaf869a8dd116167e708af08bca50cd8ef00" + }, + "3.12/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.12.13+20260303-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.12.13", + "sha256": "4e5ac5a04afc4fe164e92e3844d6dbda03b33baeb62e032b5c9a8198280221e2" + }, + "3.12/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.12.13+20260303-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.12.13", + "sha256": "4099347cfb11427ceb6fe40d1b9f2af9fee3a3a8915df0e439e13dfbe948b91e" + }, + "3.13/aarch64-apple-darwin/freethreaded": { + "filename": "cpython-3.13.12+20260303-aarch64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.13.12", + "sha256": "d152a8ec3a31a7b49772e70ff7fed1e7f6ec721497151b104532957744703d86" + }, + "3.13/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.13.12+20260303-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.13.12", + "sha256": "267592285674e21982d84f2cd0b56e13e63ce60c3e85ffb0d67a842edaf5b5e9" + }, + "3.13/aarch64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.13.12+20260303-aarch64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.13.12", + "sha256": "33e4de818b5419f0b6c599ccfc98a0468c441f83e02d4e0ef18b4a632408dc57" + }, + "3.13/aarch64-pc-windows-msvc/install_only": { + "filename": "cpython-3.13.12+20260303-aarch64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.13.12", + "sha256": "4cb0d143eeaf51582fa8292d00061fc201e41bf3ce5e2de814d0b273f73d4c25" + }, + "3.13/aarch64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.13.12+20260303-aarch64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.13.12", + "sha256": "a2e320b8b7ec76f538f4414bb56927e0a35fb169a4748594b3b0946df0d8942b" + }, + "3.13/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.13.12+20260303-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.13.12", + "sha256": "3b88fc6dd6f0290f075353ca860b9dc48faca0d849a0a03c088883507ed63881" + }, + "3.13/aarch64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.13.12+20260303-aarch64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.13.12", + "sha256": "5c71151ce936e495b0dc49fe3bdd67a9ec332542e2fc250257cd76276481103c" + }, + "3.13/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.13.12+20260303-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.13.12", + "sha256": "c8f2e10261f327b3b9606c23c79788e1c909f0d703c4b06ebd59b318fa271c77" + }, + "3.13/i686-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.13.12+20260303-i686-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.13.12", + "sha256": "e27287866347dd2cc1dc766174bb67f6b459cbadfbeff74c981abe7fe6cf86ba" + }, + "3.13/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.13.12+20260303-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.13.12", + "sha256": "202a933d5435eced5e92f474fac9480a82959de2b3ea5555569de9bda6f4af4f" + }, + "3.13/x86_64-apple-darwin/freethreaded": { + "filename": "cpython-3.13.12+20260303-x86_64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.13.12", + "sha256": "d603daefc04db99a764942a835497e52beebeb8797f7ac828826969e6f8ea165" + }, + "3.13/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.13.12+20260303-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.13.12", + "sha256": "07833bcaf50c80065db8a21d7ae0459939d95e3cf399ce8f7df908ddfc4d275f" + }, + "3.13/x86_64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.13.12+20260303-x86_64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.13.12", + "sha256": "5703d1e5fcd43d0ac3bce24e65d03a5684f3fec3625794ca9a0a47ad2ecbd0a1" + }, + "3.13/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.13.12+20260303-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.13.12", + "sha256": "61d5f9750e6971cf3bc91a1c8e7ab2eed1c22a34067f0762917bfde12b121f9f" + }, + "3.13/x86_64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.13.12+20260303-x86_64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.13.12", + "sha256": "8f1a00de7342d161bfefcb6bb90f50076b0c49e1ac4d4faa7fb303015369f310" + }, + "3.13/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.13.12+20260303-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.13.12", + "sha256": "ee1d08c3e6149343077d410d7de835a7a7dda8e2cec80df94f393e858a300055" + }, + "3.13/x86_64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.13.12+20260303-x86_64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.13.12", + "sha256": "6bae3d9f3c03448efe7e72aaf7eba1c4af4531ee22964876b36c1569e5123159" + }, + "3.13/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.13.12+20260303-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.13.12", + "sha256": "36f73e0b72ac670bd56c927a078e3e2ef0b1fef1d89a792088766bf1236815b7" + }, + "3.14/aarch64-apple-darwin/freethreaded": { + "filename": "cpython-3.14.3+20260303-aarch64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.14.3", + "sha256": "cedbfdb352b7b0dbdfd2e4dba11244a64665402c44099f36af9e22dc269dd0c0" + }, + "3.14/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.14.3+20260303-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.14.3", + "sha256": "adce81b366416e8d1b95c9c5483607282ae43c98fc155677020d20076d333fec" + }, + "3.14/aarch64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.14.3+20260303-aarch64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.14.3", + "sha256": "5af1b60808d4e8df3838267086556e2518b24a71080a7c4dc0edf3ef6a5bd8c4" + }, + "3.14/aarch64-pc-windows-msvc/install_only": { + "filename": "cpython-3.14.3+20260303-aarch64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.14.3", + "sha256": "f64e500abf0ff11b320cba756114caae6ea733c62af1c9516d28d92cf4223d74" + }, + "3.14/aarch64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.14.3+20260303-aarch64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.14.3", + "sha256": "9ca5169b62fdedbbeb1e01429e5ed75d0c89efb0dffb3d5924c58f667f365863" + }, + "3.14/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.14.3+20260303-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.14.3", + "sha256": "80030e336255241a76cd05c874b70a8840fef24e344907a4ae89f0f6c3c7daf6" + }, + "3.14/aarch64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.14.3+20260303-aarch64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.14.3", + "sha256": "ff4076086f55f83746d680792f8346037060453cf078feba233ba28e4b2a3514" + }, + "3.14/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.14.3+20260303-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.14.3", + "sha256": "97b7e0182daf74f884456a4a24cf882d0296092c918939d25ed1e1f4edee0469" + }, + "3.14/i686-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.14.3+20260303-i686-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.14.3", + "sha256": "e3085abf12bdf84a91784915082eaffd4cac154acd9818aefc71a69e13bdaf24" + }, + "3.14/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.14.3+20260303-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.14.3", + "sha256": "d969b1807fe6a3ebe9c1468c55331859d329119951ab01dc6ec5b2853c217a66" + }, + "3.14/x86_64-apple-darwin/freethreaded": { + "filename": "cpython-3.14.3+20260303-x86_64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.14.3", + "sha256": "ff7ba9353fb4f6f923e5a0c30564e448cb678deb69ac58e7f4f3a78944b40806" + }, + "3.14/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.14.3+20260303-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.14.3", + "sha256": "29469be54c9e471b916f0375f83836811b4df29dc98e0b7452ae9ec483a500a0" + }, + "3.14/x86_64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.14.3+20260303-x86_64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.14.3", + "sha256": "7921cf0fa140f3714c4772b8af161ab463d0ad641ac35db0beff9d45273ab5f5" + }, + "3.14/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.14.3+20260303-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.14.3", + "sha256": "201d5c13ee115e029bf6caa6bb17af2bfb3e4a3baf14c7f31e9145e2aa6571ef" + }, + "3.14/x86_64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.14.3+20260303-x86_64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.14.3", + "sha256": "0629158c702d4ba732c722f24e5a775885e93915c7b04fe29cfb9c81e37f499f" + }, + "3.14/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.14.3+20260303-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.14.3", + "sha256": "8070ec22c0ea164b826a57102f1bf1fa0b360e143ab3378b3c5eb4178bc0c26b" + }, + "3.14/x86_64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.14.3+20260303-x86_64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.14.3", + "sha256": "dc478897cecef7b6dfcd089b8a425e959885883d123ba4ce3e3ec1fcf5f9637a" + }, + "3.14/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.14.3+20260303-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.14.3", + "sha256": "e72b682f652eb8ba71550a7aa4f267ddf3fe06b165a29acd4194dfff0b51ed4e" + }, + "3.15/aarch64-apple-darwin/freethreaded": { + "filename": "cpython-3.15.0a6+20260303-aarch64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.15.0a6", + "sha256": "c2c9679a505c94abb6e0dcbcb1a9ea2148fbcab5b443e9c8efac388e591233a8" + }, + "3.15/aarch64-apple-darwin/install_only": { + "filename": "cpython-3.15.0a6+20260303-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.15.0a6", + "sha256": "7a6bb30a11361b58849ceeaf4d74f4085306f9b00de0c7f4703f9031cbb409ee" + }, + "3.15/aarch64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.15.0a6+20260303-aarch64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.15.0a6", + "sha256": "62890d115b54d2456a74db09d3026834faee19ba1be257c287025b0e8ae6ad16" + }, + "3.15/aarch64-pc-windows-msvc/install_only": { + "filename": "cpython-3.15.0a6+20260303-aarch64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.15.0a6", + "sha256": "aafd627b816dd83cb9ae670383482f3aa166e8f8910ca946278c5cc22f96bff6" + }, + "3.15/aarch64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.15.0a6+20260303-aarch64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.15.0a6", + "sha256": "93792d31d2232f6bf27e08fbfe6aec221aab1a4aa42463ac879540d399b54bc2" + }, + "3.15/aarch64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.15.0a6+20260303-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.15.0a6", + "sha256": "bc351efe2ef61f2d6fae1491b0d240f7616a7be28fcdad2d1644ce0429001ad6" + }, + "3.15/aarch64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.15.0a6+20260303-aarch64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.15.0a6", + "sha256": "497bbd7bc486a3092e003761f6a4fb9fd2c9854dea249042b330cb70d2ebf42a" + }, + "3.15/aarch64-unknown-linux-musl/install_only": { + "filename": "cpython-3.15.0a6+20260303-aarch64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.15.0a6", + "sha256": "55fabc3bfa81d6248db65da659c8f728fdfe8aa5dcd9551a5b1eaef09bc05cbd" + }, + "3.15/i686-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.15.0a6+20260303-i686-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.15.0a6", + "sha256": "4174719f384f3c6893c59e23ea88242c3ab9d84b7fffb9d1ed3a11e9d6a6a068" + }, + "3.15/i686-pc-windows-msvc/install_only": { + "filename": "cpython-3.15.0a6+20260303-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.15.0a6", + "sha256": "a49e43ea7971bb975e00f132bd45bc6834177997add3de7a07361a7449a10bda" + }, + "3.15/x86_64-apple-darwin/freethreaded": { + "filename": "cpython-3.15.0a6+20260303-x86_64-apple-darwin-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.15.0a6", + "sha256": "cf23826a427d19ea945965ba0e00a210b0cd96c3e7c2741ccf1174c18c37d5a6" + }, + "3.15/x86_64-apple-darwin/install_only": { + "filename": "cpython-3.15.0a6+20260303-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.15.0a6", + "sha256": "3c25506d64f6b8e0c38bb66f8430332578a69343c1b27078b7f91d5919f2549a" + }, + "3.15/x86_64-pc-windows-msvc/freethreaded": { + "filename": "cpython-3.15.0a6+20260303-x86_64-pc-windows-msvc-freethreaded+pgo-full.tar.zst", + "full_version": "3.15.0a6", + "sha256": "8c3de05f4df81a3b482fd62daa14b7863df2b517a487b75661e37dfee845a4e6" + }, + "3.15/x86_64-pc-windows-msvc/install_only": { + "filename": "cpython-3.15.0a6+20260303-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.15.0a6", + "sha256": "42690076ba8f6311b737b884f56217cab7d7287f3374ab8c629fd446913534d6" + }, + "3.15/x86_64-unknown-linux-gnu/freethreaded": { + "filename": "cpython-3.15.0a6+20260303-x86_64-unknown-linux-gnu-freethreaded+pgo+lto-full.tar.zst", + "full_version": "3.15.0a6", + "sha256": "9d95b1429958effe665c0dd7e2a9b8dfe1364b477637df87ddf372438adfa109" + }, + "3.15/x86_64-unknown-linux-gnu/install_only": { + "filename": "cpython-3.15.0a6+20260303-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.15.0a6", + "sha256": "ac11f7e619c154e3d9b56186b461f52b4afc583a5524e7109686a7a9e1835b6d" + }, + "3.15/x86_64-unknown-linux-musl/freethreaded": { + "filename": "cpython-3.15.0a6+20260303-x86_64-unknown-linux-musl-freethreaded+lto-full.tar.zst", + "full_version": "3.15.0a6", + "sha256": "2b5d35017190248ebbbf8b24432ec730e496dc68b911308a0cd4c21d8181d090" + }, + "3.15/x86_64-unknown-linux-musl/install_only": { + "filename": "cpython-3.15.0a6+20260303-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.15.0a6", + "sha256": "427675a1e0e79051540cce0f1b450ca0d11a8897486aba03796a8881cadf831f" + } + } + }, + "@@rules_distroless+//apt:extensions.bzl%apt": { + "formats": { + "noble/main/amd64/Contents/https://snapshot.ubuntu.com/ubuntu/20240601T000000Z": "unavailable", + "noble/main/amd64/Packages/https://snapshot.ubuntu.com/ubuntu/20240601T000000Z": ".xz" + }, + "indices": { + "noble/main/amd64/Packages/https://snapshot.ubuntu.com/ubuntu/20240601T000000Z": "sha256-KmoZnhAxpcJ5yzRmRtWUmT81scA91KgqqgMjmA3ZJFE=" + } + } + }, + "factsVersions": {} +} diff --git a/examples/py_image_with_rules_oci_and_aspect_rules_py/app/BUILD.bazel b/examples/py_image_with_rules_oci_and_aspect_rules_py/app/BUILD.bazel new file mode 100644 index 0000000..f3f5567 --- /dev/null +++ b/examples/py_image_with_rules_oci_and_aspect_rules_py/app/BUILD.bazel @@ -0,0 +1,45 @@ +load("@aspect_bazel_lib//lib:write_source_files.bzl", "write_source_files") +load("@aspect_rules_py//py:defs.bzl", "py_binary", "py_test") +load("@rules_oci//oci:defs.bzl", "oci_load") +load("//shared:interpreter.bzl", "interpreter_runfiles_dir") +load("//shared:py_image.bzl", "py_image") + +py_binary( + name = "app", + srcs = ["app.py"], + deps = [ + "@pip//backports_strenum", + "@pip//backports_tarfile", + "@pip//colorama", + "@pip//google_crc32c", + ], +) + +py_image( + name = "image", + binary = ":app", +) + +py_test( + name = "image_test", + size = "medium", + srcs = ["image_test.py"], + args = [ + "$(rootpath :load)", + "/" + interpreter_runfiles_dir() + "/bin/python3", + ], + data = [":load"], + main = "image_test.py", + tags = ["no-sandbox"], +) + +oci_load( + name = "load", + image = ":image", + repo_tags = ["rules-layer-optimizer-py-image:local"], +) + +write_source_files( + name = "write_optimization_plan", + files = {"optimization_plan.json": ":image_optimized_optimization_plan"}, +) diff --git a/examples/py_image_with_rules_oci_and_aspect_rules_py/app/app.py b/examples/py_image_with_rules_oci_and_aspect_rules_py/app/app.py new file mode 100644 index 0000000..fefdc4a --- /dev/null +++ b/examples/py_image_with_rules_oci_and_aspect_rules_py/app/app.py @@ -0,0 +1,24 @@ +"""Small application packaged by the two-argument py_image macro.""" + +import importlib.metadata +import os + +import backports.strenum +import backports.tarfile +import colorama +import google_crc32c + + +def main() -> None: + assert importlib.metadata.version("colorama") == "0.4.6" + assert google_crc32c.implementation == "c" + assert google_crc32c.value(b"123456789") == 0xE3069283 + assert backports.tarfile.TarInfo("fixture").name == "fixture" + assert issubclass(backports.strenum.StrEnum, str) + assert importlib.metadata.version("google-crc32c") == "1.7.1" + assert os.environ["COLORAMA_AVAILABLE"] == "1" + print(colorama.Fore.GREEN + "hello from py_image" + colorama.Style.RESET_ALL) + + +if __name__ == "__main__": + main() diff --git a/examples/py_image_with_rules_oci_and_aspect_rules_py/app/image_test.py b/examples/py_image_with_rules_oci_and_aspect_rules_py/app/image_test.py new file mode 100644 index 0000000..df7767b --- /dev/null +++ b/examples/py_image_with_rules_oci_and_aspect_rules_py/app/image_test.py @@ -0,0 +1,53 @@ +"""Load the py_image into Docker and run its Python entrypoint.""" + +import subprocess +import sys + + +def _run(args: list[str]) -> subprocess.CompletedProcess[str]: + result = subprocess.run(args, check=False, capture_output=True, text=True) + sys.stdout.write(result.stdout) + sys.stderr.write(result.stderr) + return result + + +def _image_ref(load_stdout: str) -> str: + for line in load_stdout.splitlines(): + if line.startswith("Loaded image: "): + return line.removeprefix("Loaded image: ").strip() + if line.startswith("Loaded image ID: "): + return line.removeprefix("Loaded image ID: ").strip() + raise AssertionError("docker load did not report an image:\n{}".format(load_stdout)) + + +def _check(result: subprocess.CompletedProcess[str], what: str) -> None: + assert result.returncode == 0, "{} failed ({}):\n{}".format(what, result.returncode, result.stderr) + + +def test_image(load_script: str, python: str) -> None: + loaded = _run([load_script]) + _check(loaded, "docker load") + image = _image_ref(loaded.stdout) + + ran = _run(["docker", "run", "--rm", "--network", "none", image]) + _check(ran, "image entrypoint") + assert "hello from py_image" in ran.stdout + + printed = _run([ + "docker", + "run", + "--rm", + "--network", + "none", + "--entrypoint", + python, + image, + "-c", + "print('py_image python ok')", + ]) + _check(printed, "python -c") + assert printed.stdout.strip() == "py_image python ok" + + +if __name__ == "__main__": + test_image(sys.argv[1], sys.argv[2]) diff --git a/examples/py_image_with_rules_oci_and_aspect_rules_py/app/optimization_plan.json b/examples/py_image_with_rules_oci_and_aspect_rules_py/app/optimization_plan.json new file mode 100644 index 0000000..a87e4fc --- /dev/null +++ b/examples/py_image_with_rules_oci_and_aspect_rules_py/app/optimization_plan.json @@ -0,0 +1,257 @@ +{ + "groups": [ + { + "flattened_layer_count": 1, + "input_tar_count": 29, + "name": "apt", + "output_layer_count": 3, + "overflow": "flatten", + "separate_layer_count": 2 + }, + { + "flattened_layer_count": 0, + "input_tar_count": 1, + "name": "interpreter", + "output_layer_count": 1, + "overflow": "individual", + "separate_layer_count": 1 + }, + { + "flattened_layer_count": 1, + "input_tar_count": 4, + "name": "pip", + "output_layer_count": 1, + "overflow": "flatten", + "separate_layer_count": 0 + }, + { + "flattened_layer_count": 0, + "input_tar_count": 1, + "name": "source", + "output_layer_count": 1, + "overflow": "individual", + "separate_layer_count": 1 + } + ], + "layers": [ + { + "disposition": "separate", + "group": "apt", + "inputs": [ + { + "path": "../rules_distroless++apt+noble_libssl3t64-amd64_3.0.13-0ubuntu3/content.tar.gz", + "reason": "above_size_threshold", + "size_hint_bytes": 1936306 + } + ], + "known_input_size_bytes": 1936306, + "unknown_input_count": 0 + }, + { + "disposition": "separate", + "group": "apt", + "inputs": [ + { + "path": "../rules_distroless++apt+noble_coreutils-amd64_9.4-3ubuntu6/content.tar.gz", + "reason": "above_size_threshold", + "size_hint_bytes": 1412418 + } + ], + "known_input_size_bytes": 1412418, + "unknown_input_count": 0 + }, + { + "disposition": "flattened", + "group": "apt", + "inputs": [ + { + "path": "../rules_distroless++apt+noble_libcrypt1-amd64_1-4.4.36-4build1/content.tar.gz", + "reason": "missing_size_hint" + }, + { + "path": "../rules_distroless++apt+noble_libc6-amd64_2.39-0ubuntu8/content.tar.gz", + "reason": "missing_size_hint" + }, + { + "path": "../rules_distroless++apt+noble_libgcc-s1-amd64_14-20240412-0ubuntu1/content.tar.gz", + "reason": "missing_size_hint" + }, + { + "path": "../rules_distroless++apt+noble_gcc-14-base-amd64_14-20240412-0ubuntu1/content.tar.gz", + "reason": "missing_size_hint" + }, + { + "path": "../rules_distroless++apt+noble_mawk-amd64_1.3.4.20240123-1build1/content.tar.gz", + "reason": "missing_size_hint" + }, + { + "path": "../rules_distroless++apt+noble_base-files-amd64_13ubuntu10/content.tar.gz", + "reason": "below_size_threshold", + "size_hint_bytes": 73634 + }, + { + "path": "../rules_distroless++apt+noble_debconf-amd64_1.5.86ubuntu1/content.tar.gz", + "reason": "missing_size_hint" + }, + { + "path": "../rules_distroless++apt+noble_openssl-amd64_3.0.13-0ubuntu3/content.tar.gz", + "reason": "below_size_threshold", + "size_hint_bytes": 1001730 + }, + { + "path": "../rules_distroless++apt+noble_ca-certificates-amd64_20240203/content.tar.gz", + "reason": "below_size_threshold", + "size_hint_bytes": 159378 + }, + { + "path": "../rules_distroless++apt+noble_netbase-amd64_6.4/content.tar.gz", + "reason": "below_size_threshold", + "size_hint_bytes": 13112 + }, + { + "path": "../rules_distroless++apt+noble_libstdc--6-amd64_14-20240412-0ubuntu1/content.tar.gz", + "reason": "below_size_threshold", + "size_hint_bytes": 795158 + }, + { + "path": "../rules_distroless++apt+noble_tzdata-amd64_2024a-2ubuntu1/content.tar.gz", + "reason": "below_size_threshold", + "size_hint_bytes": 273318 + }, + { + "path": "../rules_distroless++apt+noble_debianutils-amd64_5.17build1/content.tar.gz", + "reason": "missing_size_hint" + }, + { + "path": "../rules_distroless++apt+noble_libtinfo6-amd64_6.4-20240113-1ubuntu2/content.tar.gz", + "reason": "missing_size_hint" + }, + { + "path": "../rules_distroless++apt+noble_bash-amd64_5.2.21-2ubuntu4/content.tar.gz", + "reason": "below_size_threshold", + "size_hint_bytes": 794086 + }, + { + "path": "../rules_distroless++apt+noble_libselinux1-amd64_3.5-2ubuntu2/content.tar.gz", + "reason": "missing_size_hint" + }, + { + "path": "../rules_distroless++apt+noble_libpcre2-8-0-amd64_10.42-4ubuntu2/content.tar.gz", + "reason": "missing_size_hint" + }, + { + "path": "../rules_distroless++apt+noble_libgmp10-amd64_2-6.3.0-dfsg-2ubuntu6/content.tar.gz", + "reason": "missing_size_hint" + }, + { + "path": "../rules_distroless++apt+noble_libattr1-amd64_1-2.5.2-1build1/content.tar.gz", + "reason": "missing_size_hint" + }, + { + "path": "../rules_distroless++apt+noble_libacl1-amd64_2.3.2-1build1/content.tar.gz", + "reason": "missing_size_hint" + }, + { + "path": "../rules_distroless++apt+noble_libsigsegv2-amd64_2.14-1ubuntu2/content.tar.gz", + "reason": "missing_size_hint" + }, + { + "path": "../rules_distroless++apt+noble_libreadline8t64-amd64_8.2-4build1/content.tar.gz", + "reason": "missing_size_hint" + }, + { + "path": "../rules_distroless++apt+noble_readline-common-amd64_8.2-4build1/content.tar.gz", + "reason": "missing_size_hint" + }, + { + "path": "../rules_distroless++apt+noble_libmpfr6-amd64_4.2.1-1build1/content.tar.gz", + "reason": "missing_size_hint" + }, + { + "path": "../rules_distroless++apt+noble_gawk-amd64_1-5.2.1-2build3/content.tar.gz", + "reason": "below_size_threshold", + "size_hint_bytes": 462772 + }, + { + "path": "../rules_distroless++apt+noble_sed-amd64_4.9-2build1/content.tar.gz", + "reason": "below_size_threshold", + "size_hint_bytes": 193410 + }, + { + "path": "../rules_distroless++apt+noble_grep-amd64_3.11-4build1/content.tar.gz", + "reason": "below_size_threshold", + "size_hint_bytes": 162040 + } + ], + "known_input_size_bytes": 3928638, + "unknown_input_count": 17 + }, + { + "disposition": "separate", + "group": "interpreter", + "inputs": [ + { + "path": "shared/python_interpreter.tar.gz", + "reason": "fixed" + } + ], + "known_input_size_bytes": 0, + "unknown_input_count": 1 + }, + { + "disposition": "flattened", + "group": "pip", + "inputs": [ + { + "path": "../aspect_rules_py++uv+whl_install__py_image__google_crc32c__1_7_1/pip_tars/google_crc32c.tar.zst", + "reason": "below_size_threshold", + "size_hint_bytes": 32794 + }, + { + "path": "../aspect_rules_py++uv+whl_install__py_image__backports_tarfile__1_2_0/pip_tars/backports_tarfile.tar.zst", + "reason": "below_size_threshold", + "size_hint_bytes": 30181 + }, + { + "path": "../aspect_rules_py++uv+whl_install__py_image__colorama__0_4_6/pip_tars/colorama.tar.zst", + "reason": "below_size_threshold", + "size_hint_bytes": 25335 + }, + { + "path": "../aspect_rules_py++uv+whl_install__py_image__backports_strenum__1_2_8/pip_tars/backports_strenum.tar.zst", + "reason": "below_size_threshold", + "size_hint_bytes": 7862 + } + ], + "known_input_size_bytes": 96172, + "unknown_input_count": 0 + }, + { + "disposition": "separate", + "group": "source", + "inputs": [ + { + "path": "app/image_layers_source.tar.gz", + "reason": "fixed" + } + ], + "known_input_size_bytes": 0, + "unknown_input_count": 1 + } + ], + "policy": { + "flatten_all": false, + "layer_budget": 127, + "size_threshold_bytes": 1048576 + }, + "schema_version": 1, + "summary": { + "flattened_layer_count": 2, + "input_tar_count": 35, + "output_layer_count": 6, + "separate_layer_count": 4, + "size_eligible_input_count": 2, + "size_eligible_inputs_kept_separate": 2 + }, + "target": "@@//app:image_optimized_all_tars" +} diff --git a/examples/py_image_with_rules_oci_and_aspect_rules_py/pyproject.toml b/examples/py_image_with_rules_oci_and_aspect_rules_py/pyproject.toml new file mode 100644 index 0000000..c5f8838 --- /dev/null +++ b/examples/py_image_with_rules_oci_and_aspect_rules_py/pyproject.toml @@ -0,0 +1,10 @@ +[project] +name = "py-image" +version = "0.0.0" +requires-python = ">=3.12,<3.13" +dependencies = [ + "backports-strenum==1.2.8", + "backports-tarfile==1.2.0", + "colorama==0.4.6", + "google-crc32c==1.7.1", +] diff --git a/examples/py_image_with_rules_oci_and_aspect_rules_py/shared/BUILD.bazel b/examples/py_image_with_rules_oci_and_aspect_rules_py/shared/BUILD.bazel new file mode 100644 index 0000000..93bfe8a --- /dev/null +++ b/examples/py_image_with_rules_oci_and_aspect_rules_py/shared/BUILD.bazel @@ -0,0 +1,40 @@ +load("@rules_layer_optimizer//inference:defs.bzl", "env_inference_bundle", "layer_inference_bundle") +load("@rules_layer_optimizer//python:inference.bzl", "apt_inference", "env_inference") +load(":interpreter.bzl", "interpreter_layer") + +exports_files(["apt.lock.json"]) + +interpreter_layer( + name = "python_interpreter", + visibility = ["//visibility:public"], +) + +# Example of mapping a python package to an environment variable that will be +# inferred by the image macro. If a py_binary transitively depends on this +# package, the image macro will include the environment variable in the image. +env_inference( + name = "colorama_env", + env = {"COLORAMA_AVAILABLE": "1"}, + for_deps = ["@pip//colorama"], +) + +env_inference_bundle( + name = "env_inferences", + inferences = [":colorama_env"], + visibility = ["//visibility:public"], +) + +# Example of mapping a python package to an apt package that will be +# inferred by the image macro. If a py_binary transitively depends on this +# package, the image macro will include the apt package in the image. +apt_inference( + name = "google_crc32c_apt", + for_deps = ["@pip//google_crc32c"], + packages = ["@noble//libstdc++6"], +) + +layer_inference_bundle( + name = "apt_inferences", + inferences = [":google_crc32c_apt"], + visibility = ["//visibility:public"], +) diff --git a/examples/py_image_with_rules_oci_and_aspect_rules_py/shared/apt.lock.json b/examples/py_image_with_rules_oci_and_aspect_rules_py/shared/apt.lock.json new file mode 100644 index 0000000..75ee7c1 --- /dev/null +++ b/examples/py_image_with_rules_oci_and_aspect_rules_py/shared/apt.lock.json @@ -0,0 +1,43 @@ +{ + "version": 2, + "dependency_sets": { + "noble": { + "sets": { + "amd64": { + "/noble/base-files:amd64": "13ubuntu10", + "/noble/bash:amd64": "5.2.21-2ubuntu4", + "/noble/ca-certificates:amd64": "20240203", + "/noble/coreutils:amd64": "9.4-3ubuntu6", + "/noble/gawk:amd64": "1:5.2.1-2build3", + "/noble/gcc-14-base:amd64": "14-20240412-0ubuntu1", + "/noble/grep:amd64": "3.11-4build1", + "/noble/libc6:amd64": "2.39-0ubuntu8", + "/noble/libgcc-s1:amd64": "14-20240412-0ubuntu1", + "/noble/libssl3t64:amd64": "3.0.13-0ubuntu3", + "/noble/libstdc++6:amd64": "14-20240412-0ubuntu1", + "/noble/netbase:amd64": "6.4", + "/noble/openssl:amd64": "3.0.13-0ubuntu3", + "/noble/sed:amd64": "4.9-2build1", + "/noble/tzdata:amd64": "2024a-2ubuntu1" + } + } + } + }, + "packages": { + "/noble/base-files:amd64=13ubuntu10": {"name": "base-files", "size": 73634, "version": "13ubuntu10"}, + "/noble/bash:amd64=5.2.21-2ubuntu4": {"name": "bash", "size": 794086, "version": "5.2.21-2ubuntu4"}, + "/noble/ca-certificates:amd64=20240203": {"name": "ca-certificates", "size": 159378, "version": "20240203"}, + "/noble/coreutils:amd64=9.4-3ubuntu6": {"name": "coreutils", "size": 1412418, "version": "9.4-3ubuntu6"}, + "/noble/gawk:amd64=1:5.2.1-2build3": {"name": "gawk", "size": 462772, "version": "1:5.2.1-2build3"}, + "/noble/gcc-14-base:amd64=14-20240412-0ubuntu1": {"name": "gcc-14-base", "size": 47612, "version": "14-20240412-0ubuntu1"}, + "/noble/grep:amd64=3.11-4build1": {"name": "grep", "size": 162040, "version": "3.11-4build1"}, + "/noble/libc6:amd64=2.39-0ubuntu8": {"name": "libc6", "size": 3264806, "version": "2.39-0ubuntu8"}, + "/noble/libgcc-s1:amd64=14-20240412-0ubuntu1": {"name": "libgcc-s1", "size": 78484, "version": "14-20240412-0ubuntu1"}, + "/noble/libssl3t64:amd64=3.0.13-0ubuntu3": {"name": "libssl3t64", "size": 1936306, "version": "3.0.13-0ubuntu3"}, + "/noble/libstdc++6:amd64=14-20240412-0ubuntu1": {"name": "libstdc++6", "size": 795158, "version": "14-20240412-0ubuntu1"}, + "/noble/netbase:amd64=6.4": {"name": "netbase", "size": 13112, "version": "6.4"}, + "/noble/openssl:amd64=3.0.13-0ubuntu3": {"name": "openssl", "size": 1001730, "version": "3.0.13-0ubuntu3"}, + "/noble/sed:amd64=4.9-2build1": {"name": "sed", "size": 193410, "version": "4.9-2build1"}, + "/noble/tzdata:amd64=2024a-2ubuntu1": {"name": "tzdata", "size": 273318, "version": "2024a-2ubuntu1"} + } +} diff --git a/examples/py_image_with_rules_oci_and_aspect_rules_py/shared/interpreter.bzl b/examples/py_image_with_rules_oci_and_aspect_rules_py/shared/interpreter.bzl new file mode 100644 index 0000000..5788032 --- /dev/null +++ b/examples/py_image_with_rules_oci_and_aspect_rules_py/shared/interpreter.bzl @@ -0,0 +1,44 @@ +"""Shared interpreter layer for every py_image. + +The layer is the registered aspect_rules_py toolchain, archived once in +//shared at the runfiles path the binary already uses. +""" + +load("@aspect_bazel_lib//lib:tar.bzl", "mtree_mutate", "mtree_spec", "tar") + +_TOOLCHAIN_FILES = "@python_3_12_x86_64_unknown_linux_gnu//:files" + +def interpreter_runfiles_dir(): + """Return the interpreter directory inside the image. + + This is the canonical repository name of the registered toolchain, beneath + /app.runfiles. + + Returns: + The package_dir used when archiving the toolchain. + """ + return "app.runfiles/" + Label(_TOOLCHAIN_FILES).repo_name + +def interpreter_layer(name, visibility = None): + """Build a gzip tar of the registered Python toolchain. + + Args: + name: Name of the tar target consumed by py_image. + visibility: Visibility of that tar. Intermediate targets stay private. + """ + mtree_spec( + name = "{}_mtree".format(name), + srcs = [_TOOLCHAIN_FILES], + ) + mtree_mutate( + name = "{}_paths".format(name), + mtree = ":{}_mtree".format(name), + package_dir = interpreter_runfiles_dir(), + ) + tar( + name = name, + srcs = [_TOOLCHAIN_FILES], + compress = "gzip", + mtree = ":{}_paths".format(name), + visibility = visibility, + ) diff --git a/examples/py_image_with_rules_oci_and_aspect_rules_py/shared/py_image.bzl b/examples/py_image_with_rules_oci_and_aspect_rules_py/shared/py_image.bzl new file mode 100644 index 0000000..239a25f --- /dev/null +++ b/examples/py_image_with_rules_oci_and_aspect_rules_py/shared/py_image.bzl @@ -0,0 +1,98 @@ +"""Caller-owned py_image macro with a two-argument call site. + +The ruleset does not export this macro. Repositories own the base apt packages, +budget, and apt and environment mappings in //shared. +""" + +load("@rules_layer_optimizer//layers:defs.bzl", "MAX_DOCKER_LAYERS", "layer_group") +load("@rules_layer_optimizer//layers:distroless.bzl", "optimized_layers") +load("@rules_layer_optimizer//python:aspect_rules_py.bzl", "py_image_layer") +load("@rules_layer_optimizer//python:inference.bzl", "env_file", "inferred_apt_deps") +load("@rules_oci//oci:defs.bzl", "oci_image") + +# Installed instead of an OCI base image. Enough for a py_binary to run. +_BASE_APT_PACKAGES = [ + "@noble//base-files", + "@noble//ca-certificates", + "@noble//netbase", + "@noble//libssl3t64", + "@noble//openssl", + "@noble//libstdc++6", + "@noble//tzdata", + "@noble//bash", + "@noble//coreutils", + "@noble//gawk", + "@noble//sed", + "@noble//grep", +] + +def py_image(name, binary): + """Build an OCI image from an aspect_rules_py py_binary. + + Args: + name: Image target name. + binary: py_binary to package. Its main-repo path is `package/name`. + """ + layers = "{}_layers".format(name) + py_image_layer( + name = layers, + binary = binary, + compress = "gzip", + interpreter_tar = "//shared:python_interpreter", + python_toolchain = "@python_interpreters//:current_py_toolchain", + strip_prefix = _binary_path(binary), + ) + + inferred_apt_deps( + name = "{}_apt_layers".format(name), + base_packages = _BASE_APT_PACKAGES, + deps = [binary], + inferences = ["//shared:apt_inferences"], + ) + + optimized_layers( + name = "{}_optimized".format(name), + compress = "gzip", + groups = [ + layer_group( + name = "apt", + overflow = "flatten", + targets = [":{}_apt_layers".format(name)], + ), + layer_group( + name = "interpreter", + targets = ["//shared:python_interpreter"], + ), + layer_group( + name = "pip", + overflow = "flatten", + targets = [":{}_pip".format(layers)], + ), + layer_group( + name = "source", + targets = [":{}_source".format(layers)], + ), + ], + layer_budget = MAX_DOCKER_LAYERS, + size_bytes_threshold = 1024 * 1024, + ) + + env_file( + name = "{}_env".format(name), + deps = [binary], + inferences = ["//shared:env_inferences"], + ) + + oci_image( + name = name, + architecture = "amd64", + entrypoint = ["/app"], + env = ":{}_env".format(name), + os = "linux", + tars = [":{}_optimized".format(name)], + visibility = ["//visibility:public"], + ) + +def _binary_path(binary): + label = native.package_relative_label(binary) + return label.package + "/" + label.name if label.package else label.name diff --git a/examples/py_image_with_rules_oci_and_aspect_rules_py/uv.lock b/examples/py_image_with_rules_oci_and_aspect_rules_py/uv.lock new file mode 100644 index 0000000..c93c147 --- /dev/null +++ b/examples/py_image_with_rules_oci_and_aspect_rules_py/uv.lock @@ -0,0 +1,62 @@ +version = 1 +revision = 3 +requires-python = "==3.12.*" + +[[package]] +name = "backports-strenum" +version = "1.2.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/f1/611f9ce7f5ede2e8156d3bc6cd2c62a7f2ff07d73b948925da84785cf331/backports_strenum-1.2.8.tar.gz", hash = "sha256:4dd47365fd427ac8028aeb1ad3628ea38e67c4d0336ceebd5c0f113e0c487ce9", size = 7110, upload-time = "2023-09-19T16:10:33.042Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/d0/a70b2e038cdab32ed2dbbf06d292d010fc208508bb187714306a87384c54/backports_strenum-1.2.8-py3-none-any.whl", hash = "sha256:fc297cb26971f7d5e15a478a06a78575197f81daea47975771b1aae996dcccf4", size = 7862, upload-time = "2023-09-19T16:10:31.827Z" }, +] + +[[package]] +name = "backports-tarfile" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/86/72/cd9b395f25e290e633655a100af28cb253e4393396264a98bd5f5951d50f/backports_tarfile-1.2.0.tar.gz", hash = "sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991", size = 86406, upload-time = "2024-05-28T17:01:54.731Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/fa/123043af240e49752f1c4bd24da5053b6bd00cad78c2be53c0d1e8b975bc/backports.tarfile-1.2.0-py3-none-any.whl", hash = "sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34", size = 30181, upload-time = "2024-05-28T17:01:53.112Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "google-crc32c" +version = "1.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/19/ae/87802e6d9f9d69adfaedfcfd599266bf386a54d0be058b532d04c794f76d/google_crc32c-1.7.1.tar.gz", hash = "sha256:2bff2305f98846f3e825dbeec9ee406f89da7962accdb29356e4eadc251bd472", size = 14495, upload-time = "2025-03-26T14:29:13.32Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dd/b7/787e2453cf8639c94b3d06c9d61f512234a82e1d12d13d18584bd3049904/google_crc32c-1.7.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2d73a68a653c57281401871dd4aeebbb6af3191dcac751a76ce430df4d403194", size = 30470, upload-time = "2025-03-26T14:34:31.655Z" }, + { url = "https://files.pythonhosted.org/packages/ed/b4/6042c2b0cbac3ec3a69bb4c49b28d2f517b7a0f4a0232603c42c58e22b44/google_crc32c-1.7.1-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:22beacf83baaf59f9d3ab2bbb4db0fb018da8e5aebdce07ef9f09fce8220285e", size = 30315, upload-time = "2025-03-26T15:01:54.634Z" }, + { url = "https://files.pythonhosted.org/packages/29/ad/01e7a61a5d059bc57b702d9ff6a18b2585ad97f720bd0a0dbe215df1ab0e/google_crc32c-1.7.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19eafa0e4af11b0a4eb3974483d55d2d77ad1911e6cf6f832e1574f6781fd337", size = 33180, upload-time = "2025-03-26T14:41:32.168Z" }, + { url = "https://files.pythonhosted.org/packages/3b/a5/7279055cf004561894ed3a7bfdf5bf90a53f28fadd01af7cd166e88ddf16/google_crc32c-1.7.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6d86616faaea68101195c6bdc40c494e4d76f41e07a37ffdef270879c15fb65", size = 32794, upload-time = "2025-03-26T14:41:33.264Z" }, + { url = "https://files.pythonhosted.org/packages/0f/d6/77060dbd140c624e42ae3ece3df53b9d811000729a5c821b9fd671ceaac6/google_crc32c-1.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:b7491bdc0c7564fcf48c0179d2048ab2f7c7ba36b84ccd3a3e1c3f7a72d3bba6", size = 33477, upload-time = "2025-03-26T14:29:10.94Z" }, +] + +[[package]] +name = "py-image" +version = "0.0.0" +source = { virtual = "." } +dependencies = [ + { name = "backports-strenum" }, + { name = "backports-tarfile" }, + { name = "colorama" }, + { name = "google-crc32c" }, +] + +[package.metadata] +requires-dist = [ + { name = "backports-strenum", specifier = "==1.2.8" }, + { name = "backports-tarfile", specifier = "==1.2.0" }, + { name = "colorama", specifier = "==0.4.6" }, + { name = "google-crc32c", specifier = "==1.7.1" }, +] diff --git a/examples/python_image/BUILD.bazel b/examples/python_image/BUILD.bazel deleted file mode 100644 index 204df89..0000000 --- a/examples/python_image/BUILD.bazel +++ /dev/null @@ -1,246 +0,0 @@ -load("@aspect_bazel_lib//lib:tar.bzl", "mtree_mutate", "mtree_spec", "tar") -load("@aspect_bazel_lib//lib:write_source_files.bzl", "write_source_files") -load("@aspect_rules_py//py:defs.bzl", "py_binary") -load("@bazel_skylib//rules:write_file.bzl", "write_file") -load("@rules_img//img:image.bzl", "image_manifest") -load("@rules_img//img:load.bzl", "image_load") -load("@rules_img_images.bzl", "image") -load("@rules_layer_optimizer//layers:defs.bzl", "layer_group") -load("@rules_layer_optimizer//layers:distroless.bzl", "optimized_layers") -load("@rules_layer_optimizer//python:defs.bzl", "py_image_layer") -load("@rules_layer_optimizer//python:inference.bzl", "env_file", "env_inference") -load("@rules_oci//oci:defs.bzl", "oci_image") -load("@rules_python//python:py_test.bzl", "py_test") -load("@rules_shell//shell:sh_test.bzl", "sh_test") -load("//:oci_load.bzl", "oci_load") -load(":interpreter.bzl", "interpreter_path") -load(":tags_test.bzl", "tags_test") - -py_binary( - name = "app", - srcs = ["app.py"], - data = [ - ":first_asset", - ":native_extension", - ":second_asset", - ":third_asset", - ], - deps = [ - "@packages//backports_strenum", - "@packages//backports_tarfile", - "@packages//colorama", - "@packages//google_crc32c", - ], -) - -mtree_spec( - name = "interpreter_mtree", - srcs = ["@python_3_12_x86_64_unknown_linux_gnu//:files"], -) - -mtree_mutate( - name = "interpreter_paths", - mtree = ":interpreter_mtree", - package_dir = interpreter_path(), -) - -tar( - name = "interpreter", - srcs = ["@python_3_12_x86_64_unknown_linux_gnu//:files"], - compress = "gzip", - mtree = ":interpreter_paths", -) - -py_image_layer( - name = "app_layers", - binary = ":app", - compress = "gzip", - interpreter_tar = ":interpreter", - python_toolchain = "@python_interpreters//:current_py_toolchain", - strip_prefix = "python_image/app", -) - -optimized_layers( - name = "optimized", - compress = "gzip", - groups = [ - layer_group( - name = "interpreter", - targets = [":interpreter"], - ), - layer_group( - name = "pip", - overflow = "flatten", - targets = [":app_layers_pip"], - ), - layer_group( - name = "source", - targets = [":app_layers_source"], - ), - ], - layer_budget = 8, - size_bytes_threshold = 1, -) - -env_inference( - name = "colorama_env", - env = {"COLORAMA_AVAILABLE": "1"}, - for_deps = [ - "@packages//colorama", - "@packages//google_crc32c", - "@packages//backports_tarfile", - "@packages//backports_strenum", - ], -) - -env_file( - name = "env", - base_env = {}, - extra_env = {}, - inferences = [":colorama_env"], - runfiles_root = "/app.runfiles", - deps = [":app"], -) - -oci_image( - name = "image", - base = "@ubuntu", - entrypoint = ["/app"], - env = ":env", - tars = [":optimized"], - visibility = ["//visibility:public"], -) - -sh_test( - name = "layers_test", - srcs = ["layers_test.sh"], - args = [ - "$(rootpath :app_layers_source)", - "$(rootpath :env)", - "$(rootpath :optimized_optimization_plan)", - ], - data = [ - ":app_layers_source", - ":env", - ":image", - ":optimized_optimization_plan", - ], -) - -oci_load( - name = "load", - image = ":image", - repo_tags = ["rules-layer-optimizer-example:local"], -) - -image_manifest( - name = "img_image", - base = image("img_ubuntu"), - entrypoint = ["/app"], - env_file = ":env", - layers = [":optimized"], -) - -image_load( - name = "img_load", - image = ":img_image", - tag = "docker.io/library/rules-layer-optimizer-aspect-img:local", -) - -filegroup( - name = "img_layout", - srcs = [":img_image"], - output_group = "oci_layout", - visibility = ["//visibility:public"], -) - -py_image_layer( - name = "tagged_layers", - binary = ":app", - interpreter_tar = ":interpreter", - python_toolchain = "@python_interpreters//:current_py_toolchain", - strip_prefix = "python_image/app", - tags = [ - "caller-tag", - "manual", - "no-remote-cache", - ], -) - -tags_test( - name = "default_tags_test", - expected = [], - prefix = "app_layers", -) - -tags_test( - name = "caller_tags_test", - expected = [ - "manual", - "no-remote-cache", - "caller-tag", - ], - prefix = "tagged_layers", -) - -write_source_files( - name = "write_optimization_plan", - files = {"optimization_plan.json": ":optimized_optimization_plan"}, -) - -write_file( - name = "first_asset", - out = "fixtures/first.txt", - content = ["first"], -) - -write_file( - name = "second_asset", - out = "fixtures/second.txt", - content = ["second"], -) - -write_file( - name = "native_extension", - out = "fixtures/binding.so", - content = ["native payload"], -) - -py_image_layer( - name = "partitioned_layers", - binary = ":app", - compress = "gzip", - exclude_patterns = ["/fixtures/second[.]txt$"], - interpreter_tar = ":interpreter", - python_toolchain = "@python_interpreters//:current_py_toolchain", - source_layers = { - "first": ["/fixtures/first[.]txt$"], - "assets": ["/fixtures/.*[.]txt$"], - "empty": ["/does_not_exist/"], - }, - strip_prefix = "python_image/app", - visibility = ["//visibility:public"], -) - -py_test( - name = "source_layers_test", - srcs = ["source_layers_test.py"], - args = [ - "$(rootpath :partitioned_layers_source)", - "$(rootpath :partitioned_layers_source_first)", - "$(rootpath :partitioned_layers_source_assets)", - "$(rootpath :partitioned_layers_source_empty)", - ], - data = [ - ":partitioned_layers_source", - ":partitioned_layers_source_assets", - ":partitioned_layers_source_empty", - ":partitioned_layers_source_first", - ], -) - -write_file( - name = "third_asset", - out = "fixtures/third.txt", - content = ["third"], -) diff --git a/examples/python_image/optimization_plan.json b/examples/python_image/optimization_plan.json deleted file mode 100644 index 58a7472..0000000 --- a/examples/python_image/optimization_plan.json +++ /dev/null @@ -1,128 +0,0 @@ -{ - "groups": [ - { - "flattened_layer_count": 0, - "input_tar_count": 1, - "name": "interpreter", - "output_layer_count": 1, - "overflow": "individual", - "separate_layer_count": 1 - }, - { - "flattened_layer_count": 1, - "input_tar_count": 4, - "name": "pip", - "output_layer_count": 5, - "overflow": "flatten", - "separate_layer_count": 4 - }, - { - "flattened_layer_count": 0, - "input_tar_count": 1, - "name": "source", - "output_layer_count": 1, - "overflow": "individual", - "separate_layer_count": 1 - } - ], - "layers": [ - { - "disposition": "separate", - "group": "interpreter", - "inputs": [ - { - "path": "python_image/interpreter.tar.gz", - "reason": "fixed" - } - ], - "known_input_size_bytes": 0, - "unknown_input_count": 1 - }, - { - "disposition": "separate", - "group": "pip", - "inputs": [ - { - "path": "../aspect_rules_py++uv+whl_install__layer_optimizer_examples__google_crc32c__1_7_1/pip_tars/google_crc32c.tar.zst", - "reason": "above_size_threshold", - "size_hint_bytes": 32794 - } - ], - "known_input_size_bytes": 32794, - "unknown_input_count": 0 - }, - { - "disposition": "separate", - "group": "pip", - "inputs": [ - { - "path": "../aspect_rules_py++uv+whl_install__layer_optimizer_examples__backports_tarfile__1_2_0/pip_tars/backports_tarfile.tar.zst", - "reason": "above_size_threshold", - "size_hint_bytes": 30181 - } - ], - "known_input_size_bytes": 30181, - "unknown_input_count": 0 - }, - { - "disposition": "separate", - "group": "pip", - "inputs": [ - { - "path": "../aspect_rules_py++uv+whl_install__layer_optimizer_examples__colorama__0_4_6/pip_tars/colorama.tar.zst", - "reason": "above_size_threshold", - "size_hint_bytes": 25335 - } - ], - "known_input_size_bytes": 25335, - "unknown_input_count": 0 - }, - { - "disposition": "separate", - "group": "pip", - "inputs": [ - { - "path": "../aspect_rules_py++uv+whl_install__layer_optimizer_examples__backports_strenum__1_2_8/pip_tars/backports_strenum.tar.zst", - "reason": "above_size_threshold", - "size_hint_bytes": 7862 - } - ], - "known_input_size_bytes": 7862, - "unknown_input_count": 0 - }, - { - "disposition": "flattened", - "group": "pip", - "inputs": [], - "known_input_size_bytes": 0, - "unknown_input_count": 0 - }, - { - "disposition": "separate", - "group": "source", - "inputs": [ - { - "path": "python_image/app_layers_source.tar.gz", - "reason": "fixed" - } - ], - "known_input_size_bytes": 0, - "unknown_input_count": 1 - } - ], - "policy": { - "flatten_all": false, - "layer_budget": 8, - "size_threshold_bytes": 1 - }, - "schema_version": 1, - "summary": { - "flattened_layer_count": 1, - "input_tar_count": 6, - "output_layer_count": 7, - "separate_layer_count": 6, - "size_eligible_input_count": 4, - "size_eligible_inputs_kept_separate": 4 - }, - "target": "@@//python_image:optimized_all_tars" -} diff --git a/examples/rules_python_image/BUILD.bazel b/examples/rules_python_image/BUILD.bazel deleted file mode 100644 index d7b1c93..0000000 --- a/examples/rules_python_image/BUILD.bazel +++ /dev/null @@ -1,183 +0,0 @@ -load("@aspect_bazel_lib//lib:write_source_files.bzl", "write_source_files") -load("@rules_img//img:image.bzl", "image_manifest") -load("@rules_img//img:load.bzl", "image_load") -load("@rules_img_images.bzl", "image") -load("@rules_layer_optimizer//layers:defs.bzl", "layer_group") -load("@rules_layer_optimizer//layers:distroless.bzl", "optimized_layers") -load("@rules_layer_optimizer//python:inference.bzl", "env_file", "env_inference") -load("@rules_layer_optimizer//python:rules_python.bzl", "pip_layer_reducer", "py_image_layer") -load("@rules_oci//oci:defs.bzl", "oci_image") -load("@rules_python//python:py_binary.bzl", "py_binary") -load("//:archive_test.bzl", "archive_test") -load("//:oci_load.bzl", "oci_load") -load("//python_image:tags_test.bzl", "tags_test") -load("//shared_dependencies:sharing_test.bzl", "sharing_test") - -py_binary( - name = "app", - srcs = ["app.py"], - legacy_create_init = False, - deps = [ - "@pip//backports_strenum", - "@pip//backports_tarfile", - "@pip//colorama", - "@pip//google_crc32c", - ], -) - -py_binary( - name = "other", - srcs = ["app.py"], - legacy_create_init = False, - main = "app.py", - deps = [ - "@pip//backports_strenum", - "@pip//backports_tarfile", - "@pip//colorama", - "@pip//google_crc32c", - ], -) - -py_image_layer( - name = "app_layers", - binary = ":app", - strip_prefix = "rules_python_image/app", -) - -pip_layer_reducer( - name = "other_layers", - deps = [":other"], -) - -sharing_test( - name = "sharing_test", - expected_count = 4, - other = ":other_layers", - target_under_test = ":app_layers_pip", -) - -archive_test( - name = "wheel_contents_test", - archive = ":app_layers_pip", - contains = [ - "colorama/__init__.py", - "colorama-0.4.6.dist-info/METADATA", - "colorama-0.4.6.dist-info/WHEEL", - "google_crc32c/_crc32c.cpython-312", - "google_crc32c.libs/libcrc32c-", - "backports/tarfile/__init__.py", - "backports/strenum/__init__.py", - ], -) - -archive_test( - name = "source_contents_test", - archive = ":app_layers_source", - contains = ["app.runfiles/_main/rules_python_image/app.py"], - excludes = [ - "colorama/__init__.py", - "/bin/python3.12", - "_crc32c.cpython-312", - "/libcrc32c-", - "backports/tarfile/__init__.py", - "backports/strenum/__init__.py", - "colorama-0.4.6.dist-info/METADATA", - ], -) - -optimized_layers( - name = "optimized", - compress = "gzip", - groups = [ - layer_group( - name = "interpreter", - targets = [":app_layers_interpreter"], - ), - layer_group( - name = "pip", - overflow = "flatten", - targets = [":app_layers_pip"], - ), - layer_group( - name = "source", - targets = [":app_layers_source"], - ), - ], - layer_budget = 8, - size_bytes_threshold = 1, -) - -env_inference( - name = "colorama_env", - env = {"COLORAMA_AVAILABLE": "1"}, - for_deps = ["@packages//colorama"], -) - -env_file( - name = "env", - base_env = {}, - extra_env = {}, - inferences = [":colorama_env"], - runfiles_root = "/app.runfiles", - deps = [":app"], -) - -oci_image( - name = "image", - base = "@ubuntu", - entrypoint = ["/app"], - env = ":env", - tars = [":optimized"], - visibility = ["//visibility:public"], -) - -oci_load( - name = "load", - image = ":image", - repo_tags = ["rules-layer-optimizer-rules-python:local"], -) - -image_manifest( - name = "img_image", - base = image("img_ubuntu"), - entrypoint = ["/app"], - env_file = ":env", - layers = [":optimized"], -) - -image_load( - name = "img_load", - image = ":img_image", - tag = "docker.io/library/rules-layer-optimizer-rules-python-img:local", -) - -filegroup( - name = "img_layout", - srcs = [":img_image"], - output_group = "oci_layout", - visibility = ["//visibility:public"], -) - -write_source_files( - name = "write_optimization_plan", - files = {"optimization_plan.json": ":optimized_optimization_plan"}, -) - -py_image_layer( - name = "tagged_layers", - binary = ":app", - strip_prefix = "rules_python_image/app", - tags = [ - "caller-policy", - "manual", - ], -) - -tags_test( - name = "caller_tags_test", - expected = [ - "manual", - "caller-policy", - ], - prefix = "tagged_layers", -) diff --git a/examples/rules_python_image/optimization_plan.json b/examples/rules_python_image/optimization_plan.json deleted file mode 100644 index 64caec0..0000000 --- a/examples/rules_python_image/optimization_plan.json +++ /dev/null @@ -1,128 +0,0 @@ -{ - "groups": [ - { - "flattened_layer_count": 0, - "input_tar_count": 1, - "name": "interpreter", - "output_layer_count": 1, - "overflow": "individual", - "separate_layer_count": 1 - }, - { - "flattened_layer_count": 1, - "input_tar_count": 4, - "name": "pip", - "output_layer_count": 5, - "overflow": "flatten", - "separate_layer_count": 4 - }, - { - "flattened_layer_count": 0, - "input_tar_count": 1, - "name": "source", - "output_layer_count": 1, - "overflow": "individual", - "separate_layer_count": 1 - } - ], - "layers": [ - { - "disposition": "separate", - "group": "interpreter", - "inputs": [ - { - "path": "rules_python_image/app_layers_interpreter.tar.gz", - "reason": "fixed" - } - ], - "known_input_size_bytes": 0, - "unknown_input_count": 1 - }, - { - "disposition": "separate", - "group": "pip", - "inputs": [ - { - "path": "../rules_python++pip+pip_312_google_crc32c/pip_tars/google_crc32c.tar.gz", - "reason": "above_size_threshold", - "size_hint_bytes": 33477 - } - ], - "known_input_size_bytes": 33477, - "unknown_input_count": 0 - }, - { - "disposition": "separate", - "group": "pip", - "inputs": [ - { - "path": "../rules_python++pip+pip_312_backports_tarfile/pip_tars/backports_tarfile.tar.gz", - "reason": "above_size_threshold", - "size_hint_bytes": 30181 - } - ], - "known_input_size_bytes": 30181, - "unknown_input_count": 0 - }, - { - "disposition": "separate", - "group": "pip", - "inputs": [ - { - "path": "../rules_python++pip+pip_312_colorama/pip_tars/colorama.tar.gz", - "reason": "above_size_threshold", - "size_hint_bytes": 25335 - } - ], - "known_input_size_bytes": 25335, - "unknown_input_count": 0 - }, - { - "disposition": "separate", - "group": "pip", - "inputs": [ - { - "path": "../rules_python++pip+pip_312_backports_strenum/pip_tars/backports_strenum.tar.gz", - "reason": "above_size_threshold", - "size_hint_bytes": 7862 - } - ], - "known_input_size_bytes": 7862, - "unknown_input_count": 0 - }, - { - "disposition": "flattened", - "group": "pip", - "inputs": [], - "known_input_size_bytes": 0, - "unknown_input_count": 0 - }, - { - "disposition": "separate", - "group": "source", - "inputs": [ - { - "path": "rules_python_image/app_layers_source.tar.gz", - "reason": "fixed" - } - ], - "known_input_size_bytes": 0, - "unknown_input_count": 1 - } - ], - "policy": { - "flatten_all": false, - "layer_budget": 8, - "size_threshold_bytes": 1 - }, - "schema_version": 1, - "summary": { - "flattened_layer_count": 1, - "input_tar_count": 6, - "output_layer_count": 7, - "separate_layer_count": 6, - "size_eligible_input_count": 4, - "size_eligible_inputs_kept_separate": 4 - }, - "target": "@@//rules_python_image:optimized_all_tars" -} diff --git a/examples/shared_dependencies/BUILD.bazel b/examples/shared_dependencies/BUILD.bazel deleted file mode 100644 index 7b55b66..0000000 --- a/examples/shared_dependencies/BUILD.bazel +++ /dev/null @@ -1,72 +0,0 @@ -load("@rules_layer_optimizer//python:defs.bzl", "pip_layer_reducer") -load("@rules_layer_optimizer//python:inference.bzl", "apt_inference", "inferred_apt_deps", "inferred_layers", "layer_inference") -load("//:archive_test.bzl", "archive_test") -load(":inference_test.bzl", "inference_test") -load(":sharing_test.bzl", "sharing_test") - -filegroup( - name = "first", - srcs = ["@packages//colorama"], -) - -filegroup( - name = "second", - srcs = ["@packages//colorama"], -) - -pip_layer_reducer( - name = "first_layers", - deps = [":first"], -) - -pip_layer_reducer( - name = "second_layers", - deps = [":second"], -) - -sharing_test( - name = "sharing_test", - other = ":second_layers", - target_under_test = ":first_layers", -) - -archive_test( - name = "wheel_contents_test", - archive = ":first_layers", - contains = [ - "colorama/__init__.py", - "colorama-0.4.6.dist-info/METADATA", - "colorama-0.4.6.dist-info/RECORD", - ], -) - -layer_inference( - name = "package_runtime", - for_deps = ["@packages//colorama"], - layers = ["//basic_layers:first"], -) - -inferred_layers( - name = "runtime_layers", - inferences = [":package_runtime"], - deps = [":first"], -) - -apt_inference( - name = "apt_runtime", - for_deps = ["@packages//colorama"], - tars = ["//basic_layers:first"], -) - -inferred_apt_deps( - name = "apt_layers", - inferences = [":apt_runtime"], - deps = [":first"], -) - -inference_test( - name = "inference_test", - apt = ":apt_layers", - expected = "//basic_layers:first", - target_under_test = ":runtime_layers", -) diff --git a/inference/README.md b/inference/README.md index 4a583e1..92f6870 100644 --- a/inference/README.md +++ b/inference/README.md @@ -2,11 +2,12 @@ The generic API matches exact Bazel labels through the default or root-configured graph attributes. `layer_inference` registers triggers and layer producers; -`layer_inference_bundle` groups policies; `inferred_layers` selects matching -layers and preserves their size hints. It does not inspect Python wheel targets. +`layer_inference_bundle` groups those mappings. `inferred_layers` accepts only +bundles, selects matching layers, and preserves their size hints. It does not +inspect Python wheel targets. -`env_inference`, `env_inference_bundle`, and `env_file` provide the same mechanism -for environment entries. `base_env` is applied first, matching entries next, +`env_inference` registers environment entries and `env_inference_bundle` groups +them. `env_file` accepts only those bundles. `base_env` is applied first, matching entries next, and `extra_env` last. PATH, LD_LIBRARY_PATH, and PYTHONPATH concatenate with colons by default. The `env_separators` dictionary replaces that policy, e.g. `env_separators = {"FLAGS": " "}` joins a caller-owned flag variable with spaces. @@ -19,7 +20,7 @@ Python identity collection with the generic rules. Configure the pip hub and optional size hints as described in [configuration](../docs/configuration.md). Inference bundles and policy belong to callers. There are no default production -mappings. The [smoke module](../e2e/smoke/BUILD.bazel) demonstrates generic +mappings. The [distroless contract](../e2e/distroless/README.md) demonstrates generic inference with a minimal dependency graph. ## API reference @@ -32,10 +33,10 @@ trigger labels without adding those dependencies to image analysis. | --- | --- | | `layer_inference` | `name`, `for_deps`, `layers`, optional `for_keys = []`; registers a mapping and forwards layer files and size hints | | `layer_inference_bundle` | `name`, `inferences`; groups layer mappings | -| `inferred_layers` | `name`, `deps`, `inferences`; emits matching ordered tars and size hints | +| `inferred_layers` | `name`, `deps`, `inferences` (`layer_inference_bundle` targets); emits matching ordered tars and size hints | | `env_inference` | `name`, `env`, optional `for_deps = []`, `for_keys = []`; registers environment entries | | `env_inference_bundle` | `name`, `inferences`; groups environment mappings | -| `env_file` | `name`, optional `deps`, `inferences`, `base_env`, `extra_env`, `env_separators`, `pythonpath_deps`, `runfiles_root`; emits a `KEY=value` file | +| `env_file` | `name`, optional `deps`, `inferences` (`env_inference_bundle` targets), `base_env`, `extra_env`, `env_separators`, `pythonpath_deps`, `runfiles_root`; emits a `KEY=value` file | `env_file` defaults to empty inputs, the path-variable separators described above, and `runfiles_root = "/app.runfiles"`. `for_deps` entries match any visited label; diff --git a/inference/graph.bzl b/inference/graph.bzl new file mode 100644 index 0000000..4902e05 --- /dev/null +++ b/inference/graph.bzl @@ -0,0 +1,19 @@ +"""Extension points for packages that attach dependency identities. + +`apt` and `python` use these to reuse inference matching and to build rules +that see their own dependency aspects. Image authors should load +`inference:defs.bzl` instead. +""" + +load("//inference/private:dependency_inference.bzl", _dependency_graph_aspect = "dependency_graph_aspect", _dependency_identities = "dependency_identities", _inference_matches = "inference_matches", _validate_inference_triggers = "validate_inference_triggers") +load("//inference/private:inferred_env.bzl", _env_inference = "env_inference", _make_env_file = "make_env_file") +load("//inference/private:inferred_layers.bzl", _layer_inference = "layer_inference", _make_inferred_layers = "make_inferred_layers") + +dependency_graph_aspect = _dependency_graph_aspect +dependency_identities = _dependency_identities +inference_matches = _inference_matches +validate_inference_triggers = _validate_inference_triggers +env_inference = _env_inference +make_env_file = _make_env_file +layer_inference = _layer_inference +make_inferred_layers = _make_inferred_layers diff --git a/inference/private/extensions.bzl b/inference/private/extensions.bzl index ec041c9..db5a14c 100644 --- a/inference/private/extensions.bzl +++ b/inference/private/extensions.bzl @@ -1,30 +1,15 @@ -"""Module extension configuration for OCI image inference rules.""" +"""Module extension configuration for OCI image inference rules. -# buildifier: disable=bzl-visibility -load("//apt/private:apt_size_hints.bzl", "parse_apt_lock_size_hints", "render_apt_size_hints_bzl") +Lock parsing stays in `apt` and `python`. This extension only collects the +root-module tags and joins the size-hint files those packages generate. +""" -# buildifier: disable=bzl-visibility -load("//python/private:pip_size_hints_repository.bzl", "parse_pip_size_overrides", "parse_uv_lock_size_hints", "render_pip_size_hint_bzl") +load("//apt:size_hints.bzl", "apt_size_hints_repository") +load("//python:size_hints.bzl", "pip_size_hints_repository") def _inference_config_repository_impl(rctx): rctx.file("BUILD.bazel", "exports_files([\"config.bzl\"])\n") pip_hub_repo_name = rctx.attr.pip_hub.repo_name if rctx.attr.pip_hub else None - apt_package_size_hints = {} - for index in range(len(rctx.attr.apt_locks)): - lock_hints = parse_apt_lock_size_hints( - rctx.read(rctx.attr.apt_locks[index]), - rctx.attr.apt_dependency_sets[index], - rctx.attr.apt_repositories[index].repo_name, - ) - for package, size in lock_hints.items(): - previous_size = apt_package_size_hints.get(package) - apt_package_size_hints[package] = max(previous_size or 0, size) - - pip_size_hints = parse_uv_lock_size_hints( - rctx.read(rctx.attr.pip_lock), - rctx.attr.pip_size_overrides, - ) if rctx.attr.pip_lock else parse_pip_size_overrides(rctx.attr.pip_size_overrides) - rctx.file( "config.bzl", "\n".join([ @@ -33,19 +18,16 @@ def _inference_config_repository_impl(rctx): "DEPENDENCY_ATTRIBUTES = {}".format(repr(rctx.attr.dependency_attributes)), "PIP_HUB_REPO_NAME = {}".format(repr(pip_hub_repo_name)), "", - ]) + render_apt_size_hints_bzl(apt_package_size_hints) + "\n" + render_pip_size_hint_bzl(pip_size_hints), + ]) + rctx.read(rctx.attr.apt_size_hints) + "\n" + rctx.read(rctx.attr.pip_size_hints), ) _inference_config_repository = repository_rule( implementation = _inference_config_repository_impl, attrs = { - "apt_dependency_sets": attr.string_list(), - "apt_locks": attr.label_list(allow_files = [".json"]), - "apt_repositories": attr.label_list(), + "apt_size_hints": attr.label(mandatory = True, allow_single_file = True), "dependency_attributes": attr.string_list(), "pip_hub": attr.label(), - "pip_lock": attr.label(allow_single_file = [".lock"]), - "pip_size_overrides": attr.string_dict(), + "pip_size_hints": attr.label(mandatory = True, allow_single_file = True), }, ) @@ -108,15 +90,23 @@ def _oci_image_inference_impl(module_ctx): if pip_size_hints and not pip_size_hints[0].lock and not pip_size_hints[0].size_overrides: fail("pip_size_hint requires a lock or explicit size_overrides") + apt_size_hints_repository( + name = "oci_image_apt_size_hints", + dependency_sets = [hint.dependency_set for hint in apt_size_hints], + locks = [hint.lock for hint in apt_size_hints], + repositories = [hint.repository for hint in apt_size_hints], + ) + pip_size_hints_repository( + name = "oci_image_pip_size_hints", + lock = pip_size_hints[0].lock if pip_size_hints else None, + size_overrides = pip_size_hints[0].size_overrides if pip_size_hints else {}, + ) _inference_config_repository( name = "oci_image_inference_config", - apt_dependency_sets = [hint.dependency_set for hint in apt_size_hints], - apt_locks = [hint.lock for hint in apt_size_hints], - apt_repositories = [hint.repository for hint in apt_size_hints], + apt_size_hints = "@oci_image_apt_size_hints//:size_hints.bzl", dependency_attributes = configuration.dependency_attributes, pip_hub = configuration.pip_hub, - pip_lock = pip_size_hints[0].lock if pip_size_hints else None, - pip_size_overrides = pip_size_hints[0].size_overrides if pip_size_hints else {}, + pip_size_hints = "@oci_image_pip_size_hints//:size_hints.bzl", ) return module_ctx.extension_metadata(reproducible = True) diff --git a/inference/private/inferred_env.bzl b/inference/private/inferred_env.bzl index 4564171..675e99c 100644 --- a/inference/private/inferred_env.bzl +++ b/inference/private/inferred_env.bzl @@ -130,7 +130,7 @@ def make_env_file(dependency_aspects = []): "env_separators": attr.string_dict(default = DEFAULT_ENV_SEPARATORS), "deps": attr.label_list(aspects = [dependency_graph_aspect] + dependency_aspects), "extra_env": attr.string_dict(), - "inferences": attr.label_list(), + "inferences": attr.label_list(providers = [EnvInferenceBundleInfo]), "pythonpath_deps": attr.label_list(), "runfiles_root": attr.string(default = "/app.runfiles"), }, @@ -164,14 +164,5 @@ def _inference_triggers(for_deps): def _inference_entries(ctx): entries = [] for inference in ctx.attr.inferences: - if EnvInferenceBundleInfo in inference: - entries.extend(inference[EnvInferenceBundleInfo].entries) - elif EnvInferenceInfo in inference: - entries.append(struct( - env = inference[EnvInferenceInfo].env, - for_deps = tuple(inference[EnvInferenceInfo].for_deps), - for_keys = tuple(inference[EnvInferenceInfo].for_keys), - )) - else: - fail("{} is not an env_inference or env_inference_bundle target".format(inference.label)) + entries.extend(inference[EnvInferenceBundleInfo].entries) return entries diff --git a/inference/private/inferred_layers.bzl b/inference/private/inferred_layers.bzl index 8cf696f..a329ef9 100644 --- a/inference/private/inferred_layers.bzl +++ b/inference/private/inferred_layers.bzl @@ -1,9 +1,7 @@ """Infer OCI image layer tars from a target's dependency graph.""" load("//inference/private:dependency_inference.bzl", "dependency_graph_aspect", "dependency_identities", "inference_matches", "validate_inference_triggers") - -# buildifier: disable=bzl-visibility -load("//layers/private:layer_groups.bzl", "LayerTarsInfo", "SizeHintInfo", "merge_size_hints") +load("//layers:providers.bzl", "LayerTarsInfo", "SizeHintInfo", "merge_size_hints") LayerInferenceInfo = provider( "One mapping from dependency identities to OCI layer tars.", @@ -119,10 +117,7 @@ def make_inferred_layers(dependency_aspects = []): "deps": attr.label_list(aspects = [dependency_graph_aspect] + dependency_aspects), "inferences": attr.label_list( mandatory = True, - providers = [ - [LayerInferenceInfo, SizeHintInfo], - [LayerInferenceBundleInfo], - ], + providers = [LayerInferenceBundleInfo], ), }, ) @@ -144,15 +139,5 @@ def _layer_files(layer): def _inference_entries(inferences): entries = [] for inference in inferences: - if LayerInferenceBundleInfo in inference: - entries.extend(inference[LayerInferenceBundleInfo].entries) - elif LayerInferenceInfo in inference: - entries.append(struct( - files = inference.files, - for_deps = tuple(inference[LayerInferenceInfo].for_deps), - for_keys = tuple(inference[LayerInferenceInfo].for_keys), - sizes = inference[SizeHintInfo].sizes, - )) - else: - fail("{} is not a layer_inference or layer_inference_bundle target".format(inference.label)) + entries.extend(inference[LayerInferenceBundleInfo].entries) return entries diff --git a/inference/tests/inferred_layers_test.bzl b/inference/tests/inferred_layers_test.bzl index 0a8c630..c24fff2 100644 --- a/inference/tests/inferred_layers_test.bzl +++ b/inference/tests/inferred_layers_test.bzl @@ -2,9 +2,7 @@ load("@bazel_skylib//lib:unittest.bzl", "analysistest", "asserts") load("//inference/private:inferred_layers.bzl", "inferred_layers", "layer_inference", "layer_inference_bundle") - -# buildifier: disable=bzl-visibility -load("//layers/private:layer_groups.bzl", "LayerTarsInfo", "SizeHintInfo") +load("//layers:providers.bzl", "LayerTarsInfo", "SizeHintInfo") def inferred_layers_test_suite(name): """Declare generic layer inference subjects and their analysis test. diff --git a/layers/README.md b/layers/README.md index b780025..06a6475 100644 --- a/layers/README.md +++ b/layers/README.md @@ -32,7 +32,7 @@ ordered groups, output layers, input sizes, and placement reasons. Each flatten group emits an archive, even when its overflow is empty. `flatten_all = True` combines everything into one archive. Base-image layers are outside this budget. -See [the runnable example](../examples/basic_layers/BUILD.bazel). +See [the layer plan check](../e2e/layer_plan/BUILD.bazel). Subtract base-image layers from the desired runtime limit when choosing `layer_budget`. Size hints estimate input package sizes, not output archive sizes. @@ -69,7 +69,7 @@ image_manifest(name = "img", layers = [":layers"], ...) Load `oci_image` from `@rules_oci//oci:defs.bzl`, or `image_manifest` from `@rules_img//img:image.bzl`. Inferred environment files go to `env` for rules_oci -and `env_file` for rules_img. The examples assemble runnable images with both; +and `env_file` for rules_img. The [image backend checks](../e2e/image_backends/README.md) assemble runnable images with both; base-image selection and backend dependencies remain consumer configuration. ## API reference diff --git a/layers/providers.bzl b/layers/providers.bzl index 70db0e5..ac6f827 100644 --- a/layers/providers.bzl +++ b/layers/providers.bzl @@ -1,6 +1,7 @@ """Public layers building blocks.""" -load("//layers/private:layer_groups.bzl", _LayerTarsInfo = "LayerTarsInfo", _SizeHintInfo = "SizeHintInfo") +load("//layers/private:layer_groups.bzl", _LayerTarsInfo = "LayerTarsInfo", _SizeHintInfo = "SizeHintInfo", _merge_size_hints = "merge_size_hints") LayerTarsInfo = _LayerTarsInfo SizeHintInfo = _SizeHintInfo +merge_size_hints = _merge_size_hints diff --git a/python/README.md b/python/README.md index 48d9ae7..5b21756 100644 --- a/python/README.md +++ b/python/README.md @@ -120,7 +120,8 @@ artifacts in descending size order and exposes `LayerTarsInfo` and `SizeHintInfo inference. See [configuration](../docs/configuration.md) for pip hub setup. Both adapters' tars work with rules_oci and rules_img. See the -[aspect_rules_py example](../examples/python_image/BUILD.bazel), -[rules_python example](../examples/rules_python_image/BUILD.bazel), and +[rules_oci and aspect_rules_py wrapper](../examples/py_image_with_rules_oci_and_aspect_rules_py/app/BUILD.bazel), +[rules_img and rules_python wrapper](../examples/py_image_with_rules_img_and_rules_python/app/BUILD.bazel), +[image backend checks](../e2e/image_backends/README.md), and [standalone rules_python consumer](../e2e/rules_python/README.md). [Compatibility](../docs/compatibility.md) lists tested upstream versions. diff --git a/python/private/inference.bzl b/python/private/inference.bzl index 0e5bc28..886c16b 100644 --- a/python/private/inference.bzl +++ b/python/private/inference.bzl @@ -1,13 +1,7 @@ """Python-aware inference adapters for configured pip hubs.""" -# buildifier: disable=bzl-visibility -load("//apt/private:inferred_apt_deps.bzl", "make_inferred_apt_deps", _apt_inference = "apt_inference") - -# buildifier: disable=bzl-visibility -load("//inference/private:inferred_env.bzl", "make_env_file", _env_inference = "env_inference") - -# buildifier: disable=bzl-visibility -load("//inference/private:inferred_layers.bzl", "make_inferred_layers", _layer_inference = "layer_inference") +load("//apt:defs.bzl", "make_inferred_apt_deps", _apt_inference = "apt_inference") +load("//inference:graph.bzl", "make_env_file", "make_inferred_layers", _env_inference = "env_inference", _layer_inference = "layer_inference") load("//python/private:pip_deps.bzl", "pip_deps_aspect") load("//python/private:pip_utils.bzl", "configured_pip_package", "pip_inference_key") diff --git a/python/private/pip_deps.bzl b/python/private/pip_deps.bzl index 2f3321e..76f4a71 100644 --- a/python/private/pip_deps.bzl +++ b/python/private/pip_deps.bzl @@ -3,9 +3,7 @@ Aspect to collect pip package dependencies. """ load("@oci_image_inference_config//:config.bzl", "DEPENDENCY_ATTRIBUTES") - -# buildifier: disable=bzl-visibility -load("//inference/private:dependency_inference.bzl", "DependencyKeyInfo") +load("//inference:providers.bzl", "DependencyKeyInfo") load("//python/private:aspect_rules_py.bzl", "wheel_identity", "wheel_package") load("//python/private:pip_utils.bzl", "pip_inference_key", "pip_package_size_hint") load("//python/private:rules_python_wheel.bzl", rules_python_package = "wheel_package") diff --git a/python/private/pip_size_hints_repository.bzl b/python/private/pip_size_hints_repository.bzl index 8505a6e..b3d3255 100644 --- a/python/private/pip_size_hints_repository.bzl +++ b/python/private/pip_size_hints_repository.bzl @@ -1,8 +1,8 @@ """Helpers that turn `uv.lock` into pip package size hints. The OCI image layer optimizer needs package sizes during Bazel analysis, not -during execution. The OCI inference module extension calls these helpers while -generating its analysis-time configuration repository. +during execution. `pip_size_hints_repository` reads the lock while generating +the analysis-time size-hint file. """ load("@toml.bzl//:toml.bzl", "toml") @@ -134,6 +134,22 @@ def render_pip_size_hint_bzl(size_hints): lines.append("}") return "\n".join(lines) + "\n" +def _pip_size_hints_repository_impl(rctx): + if rctx.attr.lock: + size_hints = parse_uv_lock_size_hints(rctx.read(rctx.attr.lock), rctx.attr.size_overrides) + else: + size_hints = parse_pip_size_overrides(rctx.attr.size_overrides) + rctx.file("BUILD.bazel", "exports_files([\"size_hints.bzl\"])\n") + rctx.file("size_hints.bzl", render_pip_size_hint_bzl(size_hints)) + +pip_size_hints_repository = repository_rule( + implementation = _pip_size_hints_repository_impl, + attrs = { + "lock": attr.label(allow_single_file = [".lock"]), + "size_overrides": attr.string_dict(), + }, +) + def _normalize_package(package): normalized = [] for char in package.lower().elems(): diff --git a/python/private/rules_python_split.awk b/python/private/rules_python_split.awk index 2790bb5..917075f 100644 --- a/python/private/rules_python_split.awk +++ b/python/private/rules_python_split.awk @@ -1,3 +1,22 @@ +function trim_slash(path) { + sub(/\/$/, "", path) + return path +} + +# Package directory of prefix "my/pkg/app" is "my/pkg". A root binary has none. +function package_dir(pref, n, parts, pkg, i) { + n = split(pref, parts, "/") + if (n < 2) return "" + pkg = parts[1] + for (i = 2; i < n; i++) pkg = pkg "/" parts[i] + return pkg +} + +function is_runfiles(path, pref, root) { + root = pref ".runfiles" + return path == root || index(path, root "/") == 1 +} + BEGIN { while ((getline line < classification) > 0) { split(line, fields, " ") @@ -9,6 +28,14 @@ BEGIN { } /^#/ { next } { + # The entrypoint is rewritten to ./app. Parent directories of the binary, + # and package files that are not the binary or its runfiles, would make a + # root directory named like that file (package "app" vs entrypoint ./app). + # Those sources are already in the runfiles tree. + path = trim_slash($1) + pkg = package_dir(prefix) + if (pkg != "" && path != prefix && index(prefix, path "/") == 1) next + if (pkg != "" && index(path, pkg "/") == 1 && path != prefix && !is_runfiles(path, prefix)) next kind = "source" for (i = 2; i <= NF; i++) { if ($i ~ /^contents?=/) { diff --git a/python/private/split_source.awk b/python/private/split_source.awk index dbfe3cf..6d2c49e 100644 --- a/python/private/split_source.awk +++ b/python/private/split_source.awk @@ -1,3 +1,22 @@ +function trim_slash(path) { + sub(/\/$/, "", path) + return path +} + +# Package directory of prefix "my/pkg/app" is "my/pkg". A root binary has none. +function package_dir(pref, n, parts, pkg, i) { + n = split(pref, parts, "/") + if (n < 2) return "" + pkg = parts[1] + for (i = 2; i < n; i++) pkg = pkg "/" parts[i] + return pkg +} + +function is_runfiles(path, pref, root) { + root = pref ".runfiles" + return path == root || index(path, root "/") == 1 +} + BEGIN { print "#mtree" > source } ARGIND == 1 { split($0, fields, "\t") @@ -14,6 +33,13 @@ ARGIND == 1 { } /^#/ { next } { + # The entrypoint is rewritten to ./app. Parent directories of the binary, + # and package files that are not the binary or its runfiles, would make a + # root directory named like that file. Those sources are already in runfiles. + path = trim_slash($1) + pkg = package_dir(prefix) + if (pkg != "" && path != prefix && index(prefix, path "/") == 1) next + if (pkg != "" && index(path, pkg "/") == 1 && path != prefix && !is_runfiles(path, prefix)) next if ($1 == prefix || $1 == prefix ".runfiles" || index($1, prefix ".runfiles/") == 1) { $0 = "./app" substr($0, length(prefix) + 1) } diff --git a/python/size_hints.bzl b/python/size_hints.bzl new file mode 100644 index 0000000..e5d7e39 --- /dev/null +++ b/python/size_hints.bzl @@ -0,0 +1,5 @@ +"""Public pip lock size-hint repository rule.""" + +load("//python/private:pip_size_hints_repository.bzl", _pip_size_hints_repository = "pip_size_hints_repository") + +pip_size_hints_repository = _pip_size_hints_repository diff --git a/python/tests/rules_python_split_test.py b/python/tests/rules_python_split_test.py index 428be74..7ff929f 100644 --- a/python/tests/rules_python_split_test.py +++ b/python/tests/rules_python_split_test.py @@ -52,6 +52,46 @@ def test_split_runfiles(tmp_path: pathlib.Path) -> None: } +def test_package_named_app_does_not_collide_with_entrypoint(tmp_path: pathlib.Path) -> None: + classification = tmp_path / "files" + classification.write_text("pip external/wheel/site-packages/pkg.py\n") + mtree = tmp_path / "input.mtree" + mtree.write_text( + "#mtree\n" + "app/ type=dir\n" + "app/app type=file content=out/app\n" + "app/app.py type=file content=app/app.py\n" + "app/app.runfiles/_main/app/app.py type=file content=app/app.py\n" + ) + source = tmp_path / "source.mtree" + interpreter = tmp_path / "interpreter.mtree" + subprocess.run( + [ + os.environ["GAWK"], + "-v", + f"classification={classification}", + "-v", + "prefix=app/app", + "-v", + f"source={source}", + "-v", + f"interpreter={interpreter}", + "-f", + os.environ["SPLIT_AWK"], + str(mtree), + ], + check=True, + ) + assert source.read_text() == ( + "#mtree\n" + "./app type=file content=out/app\n" + "./app.runfiles/_main/app/app.py type=file content=app/app.py\n" + ) + assert interpreter.read_text() == "#mtree\n" + + if __name__ == "__main__": with tempfile.TemporaryDirectory() as directory: test_split_runfiles(pathlib.Path(directory)) + with tempfile.TemporaryDirectory() as directory: + test_package_named_app_does_not_collide_with_entrypoint(pathlib.Path(directory)) diff --git a/tools/release.py b/tools/release.py index 404cfdc..186e030 100644 --- a/tools/release.py +++ b/tools/release.py @@ -86,7 +86,10 @@ def verify_archive(root: pathlib.Path, output: pathlib.Path) -> None: for key, value in os.environ.items() if not key.startswith(("RUNFILES_", "JAVA_RUNFILES")) } - for fixture in ("e2e/smoke", "examples"): + for fixture in ( + "e2e/distroless", + "examples/py_image_with_rules_oci_and_aspect_rules_py", + ): consumer = output / "consumers" / fixture shutil.copytree( root / fixture,