diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml
index d4c1d05a1..a649c8af1 100644
--- a/.github/workflows/linux.yml
+++ b/.github/workflows/linux.yml
@@ -178,6 +178,7 @@ jobs:
--platform linux \
--labels "${STEPS_GET_LABELS_OUTPUTS_LABELS}" \
--max-shards 2 \
+ --event ${{ github.event_name }} \
${{ (steps.check-pythonbuild.outputs.changed == 'true' || github.ref == 'refs/heads/main') && '--force-crate-build' || '' }} \
--free-runners \
> matrix.json
diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml
index ab97c1cd0..2312f5938 100644
--- a/.github/workflows/macos.yml
+++ b/.github/workflows/macos.yml
@@ -92,7 +92,11 @@ jobs:
- name: Generate build matrix
id: set-matrix
run: |
+<<<<<<< HEAD
uv run ci-matrix.py --platform darwin --labels "${STEPS_GET_LABELS_OUTPUTS_LABELS}" ${{ (steps.check-pythonbuild.outputs.changed == 'true' || github.ref == 'refs/heads/main') && '--force-crate-build' || '' }} --free-runners > matrix.json
+=======
+ uv run ci-matrix.py --platform darwin --labels "${STEPS_GET_LABELS_OUTPUTS_LABELS}" --event ${{ github.event_name }} ${{ (steps.check-pythonbuild.outputs.changed == 'true' || github.ref == 'refs/heads/main') && '--force-crate-build' || '' }} > matrix.json
+>>>>>>> refs/tags/20260825
# Extract python-build matrix
echo "matrix=$(jq -c '."python-build"' matrix.json)" >> $GITHUB_OUTPUT
@@ -171,6 +175,12 @@ jobs:
repository: phracker/MacOSX-SDKs
ref: master
path: macosx-sdks
+ sparse-checkout: |
+ /MacOSX10.15.sdk/SDKSettings.json
+ /MacOSX10.15.sdk/**/*.tbd
+ /MacOSX11.*.sdk/SDKSettings.json
+ /MacOSX11.*.sdk/**/*.tbd
+ sparse-checkout-cone-mode: false
persist-credentials: false
- name: Validate Distribution
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 20ad2176e..f11818308 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -89,3 +89,100 @@ jobs:
subject-path: |
dist/*.tar.gz
dist/*.tar.zst
+<<<<<<< HEAD
+=======
+
+ - name: Publish to Astral mirror
+ env:
+ AWS_ACCESS_KEY_ID: ${{ secrets.MIRROR_R2_ACCESS_KEY_ID }}
+ AWS_SECRET_ACCESS_KEY: ${{ secrets.MIRROR_R2_SECRET_ACCESS_KEY }}
+ AWS_ENDPOINT_URL: https://${{ secrets.MIRROR_R2_CLOUDFLARE_ACCOUNT_ID }}.r2.cloudflarestorage.com
+ AWS_DEFAULT_REGION: auto
+ R2_BUCKET: ${{ secrets.MIRROR_R2_BUCKET_NAME }}
+ PROJECT: python-build-standalone
+ VERSION: ${{ github.event.inputs.tag }}
+ DRY_RUN: ${{ github.event.inputs.dry-run }}
+ run: |
+ if [ "${DRY_RUN}" = 'true' ]; then
+ just release-upload-mirror-dry-run \
+ ${R2_BUCKET} \
+ github/${PROJECT}/releases/download/${VERSION}/ \
+ ${VERSION}
+ else
+ just release-upload-mirror \
+ ${R2_BUCKET} \
+ github/${PROJECT}/releases/download/${VERSION}/ \
+ ${VERSION}
+ fi
+
+ - name: Generate versions metadata
+ if: ${{ github.event.inputs.dry-run == 'false' }}
+ env:
+ GITHUB_EVENT_INPUTS_TAG: ${{ github.event.inputs.tag }}
+ GITHUB_REPOSITORY: ${{ github.repository }}
+ run: uv run generate-version-metadata.py > dist/versions.ndjson
+
+ - name: Validate metadata
+ if: ${{ github.event.inputs.dry-run == 'false' }}
+ run: |
+ echo "Generated $(wc -l < dist/versions.ndjson) version entries"
+ head -c 1000 dist/versions.ndjson
+
+ - name: Set branch name
+ if: ${{ github.event.inputs.dry-run == 'false' }}
+ env:
+ TAG: ${{ github.event.inputs.tag }}
+ run: echo "BRANCH_NAME=update-versions-$TAG-$(date +%s)" >> $GITHUB_ENV
+
+ - name: Clone versions repo
+ if: ${{ github.event.inputs.dry-run == 'false' }}
+ run: git clone https://${{ secrets.ASTRAL_VERSIONS_PAT }}@github.com/astral-sh/versions.git astral-versions
+
+ - name: Update versions
+ if: ${{ github.event.inputs.dry-run == 'false' }}
+ run: cat dist/versions.ndjson | uv run astral-versions/scripts/insert-versions.py --name python-build-standalone
+
+ - name: Commit versions
+ if: ${{ github.event.inputs.dry-run == 'false' }}
+ env:
+ TAG: ${{ github.event.inputs.tag }}
+ working-directory: astral-versions
+ run: |
+ git config user.name "astral-versions-bot"
+ git config user.email "176161322+astral-versions-bot@users.noreply.github.com"
+
+ git checkout -b "$BRANCH_NAME"
+ git add -A
+ git commit -m "Update python-build-standalone to $TAG"
+
+ - name: Create Pull Request
+ if: ${{ github.event.inputs.dry-run == 'false' }}
+ env:
+ TAG: ${{ github.event.inputs.tag }}
+ GH_TOKEN: ${{ secrets.ASTRAL_VERSIONS_PAT }}
+ working-directory: astral-versions
+ run: |
+ pull_request_title="Update python-build-standalone versions for $TAG"
+
+ gh pr list --state open --json title --jq ".[] | select(.title == \"$pull_request_title\") | .number" | \
+ xargs -I {} gh pr close {}
+
+ git push origin "$BRANCH_NAME"
+
+ gh pr create --base main --head "$BRANCH_NAME" \
+ --title "$pull_request_title" \
+ --body "Automated versions update for $TAG" \
+ --label "automation"
+
+ - name: Merge Pull Request
+ if: ${{ github.event.inputs.dry-run == 'false' }}
+ env:
+ GH_TOKEN: ${{ secrets.ASTRAL_VERSIONS_PAT }}
+ working-directory: astral-versions
+ run: |
+ # Wait for PR to be created before merging
+ sleep 10
+ # Use admin to bypass required review
+ gh pr merge --squash --admin "$BRANCH_NAME"
+
+>>>>>>> refs/tags/20260825
diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml
index fbf633419..d31983421 100644
--- a/.github/workflows/windows.yml
+++ b/.github/workflows/windows.yml
@@ -92,7 +92,11 @@ jobs:
- name: Generate build matrix
id: set-matrix
run: |
+<<<<<<< HEAD
uv run ci-matrix.py --platform windows --labels "${STEPS_GET_LABELS_OUTPUTS_LABELS}" ${{ (steps.check-pythonbuild.outputs.changed == 'true' || github.ref == 'refs/heads/main') && '--force-crate-build' || '' }} --free-runners > matrix.json
+=======
+ uv run ci-matrix.py --platform windows --labels "${STEPS_GET_LABELS_OUTPUTS_LABELS}" --event ${{ github.event_name }} ${{ (steps.check-pythonbuild.outputs.changed == 'true' || github.ref == 'refs/heads/main') && '--force-crate-build' || '' }} > matrix.json
+>>>>>>> refs/tags/20260825
# Extract python-build matrix
echo "matrix=$(jq -c '."python-build"' matrix.json)" >> $GITHUB_OUTPUT
@@ -186,4 +190,7 @@ jobs:
run: |
$Dists = Resolve-Path -Path "dist/*.tar.zst" -Relative
.\pythonbuild.exe validate-distribution $Dists
+ if ($LASTEXITCODE -ne 0) {
+ exit $LASTEXITCODE
+ }
uv run --no-dev test-distribution.py $Dists
diff --git a/BENCHMARKS.md b/BENCHMARKS.md
new file mode 100644
index 000000000..74da21e03
--- /dev/null
+++ b/BENCHMARKS.md
@@ -0,0 +1,43 @@
+## python-build-standalone performance
+
+
+
+The figure above compares CPython 3.14.6 performance across several distributions using pyperformance. Each [violin](https://en.wikipedia.org/wiki/Violin_plot) represents the distribution of per-benchmark mean runtime ratios between an alternative CPython distribution and python-build-standalone on the same platform and architecture. Ratios greater than 1 indicate that python-build-standalone was faster; ratios less than 1 indicate that the alternative distribution was faster.
+
+The horizontal axis uses a logarithmic scale. The vertical marker within each violin indicates the geometric mean of the runtime ratios, which is also expressed as a percentage beside each distribution.
+
+From top to bottom, the distributions shown are:
+* The Docker `python:3.14` image for x86-64, providing CPython 3.14.6.
+* A conda-forge Python 3.14.6 environment for `linux-64`.
+* The system Python 3.14.6 in a `fedora:44` x86-64 Docker container.
+* The system Python 3.14.6 in a `debian:forky` x86-64 Docker container.
+* CPython 3.14.6 from the [Python.org macOS installer](https://www.python.org/ftp/python/3.14.6/python-3.14.6-macos11.pkg) on an arm64 Mac.
+* A conda-forge Python 3.14.6 environment for `osx-arm64`.
+* CPython 3.14.6 installed through Homebrew on an arm64 Mac.
+* CPython 3.14.6 from the Python.org Windows installer for x86-64.
+* A conda-forge Python 3.14.6 environment for `win-64`.
+
+The reference interpreter for each comparison was the corresponding platform- and architecture-matched python-build-standalone CPython 3.14.6 distribution from the [`20260623` release](https://github.com/astral-sh/python-build-standalone/releases#release-20260623), installed using `uv`.
+
+Benchmarks were run in early to mid-July 2026 and reflect the distributions and packages available during that period.
+
+Supporting material, including [Dockerfiles](https://github.com/jjhelmus/cpython-benchmarks/tree/main/containers), commands for creating conda environments, and scripts for running the benchmarks, can be found in [jjhelmus/cpython-benchmarks](https://github.com/jjhelmus/cpython-benchmarks). This repository also contains the raw data and the [script](https://github.com/jjhelmus/cpython-benchmarks/blob/main/plot_pbs_314_comparison.py) used to produce the figure.
+
+### Benchmark methodology
+
+Benchmarks were executed from a virtual environment created with the reference interpreter into which pyperformance 1.14.0 was installed. Results were collected using:
+``` shell
+pyperformance run --rigorous --warmups 2 --output
+```
+
+The complete benchmark suite was run at least twice to assess consistency.
+
+Linux benchmarks were run inside Docker containers on an Ubuntu 24.04 host with an Intel Core i9-9900K processor. Hyper-Threading and Intel SpeedStep were disabled.
+
+macOS benchmarks were run on a MacBook Pro with an Apple M5 Max processor.
+
+Windows benchmarks were run on a Windows 11 host with an Intel Core i5-9500 processor. Intel Turbo Boost was disabled; this processor does not support Hyper-Threading.
diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst
index c7e0193b5..4a9716cb3 100644
--- a/CONTRIBUTING.rst
+++ b/CONTRIBUTING.rst
@@ -8,28 +8,41 @@ Building distributions
See the [documentation](https://gregoryszorc.com/docs/python-build-standalone/main/building.html)
for instructions on building distributions locally.
-CI labels
-=========
-By default, submitting a pull request triggers a complete build of all
-distributions in CI, which can be time-consuming.
+Pull request labels
+===================
+By default, pull requests build a small subset of targets defined in
+``ci-defaults.yaml`` under ``pull_request``. Pushes to ``main`` build the full
+matrix from ``ci-targets.yaml``.
-To conserve CI resources and reduce build times, you can limit the matrix of
-distributions built by applying specific labels to your pull request. Only
-distributions matching the specified labels will be built.
+Pull request labels can be used to change what CI builds:
-The following label prefixes can be used to customize the build matrix:
+* ``platform:`` filters the selected targets by platform.
+* ``arch:`` filters the selected targets by architecture.
+* ``libc:`` filters the selected targets by libc.
+* ``python:`` filters the selected Python versions.
+* ``build:`` filters the selected build options by component.
-* `platform`
-* `python`
-* `build`
-* `arch`
-* `libc`
+The ``:all`` labels expand only their own dimension:
-To bypass CI entirely for changes that do not affect the build (such as
-documentation updates), use the `ci:skip` label.
+* ``platform:all`` expands the selected platforms.
+* ``arch:all`` expands the selected architectures.
+* ``libc:all`` expands the selected libc variants.
+* ``python:all`` expands the selected Python versions.
+* ``build:all`` expands the selected build options.
-Please utilize these tags when appropriate for your changes to minimize CI
-resource consumption.
+Use ``ci:all-targets`` to build the full matrix from ``ci-targets.yaml``.
+
+Examples:
+
+* ``platform:linux`` builds only the Linux targets from ``ci-defaults.yaml``.
+* ``python:3.13`` builds the default targets with Python 3.13.
+* ``build:pgo`` builds the selected targets whose build options include ``pgo``.
+* ``platform:linux,arch:all,libc:all,python:all,build:all`` builds the full
+ Linux matrix.
+
+To bypass CI entirely for changes that do not affect the build, use the
+``ci:skip`` label. The ``documentation`` label is treated the same way. To run
+a dry-run build matrix, use ``ci:dry-run``.
Releases
========
diff --git a/Cargo.lock b/Cargo.lock
index 9e071c55e..1f4f9ede1 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -198,7 +198,7 @@ dependencies = [
"quote",
"regex",
"rustc-hash 1.1.0",
- "shlex",
+ "shlex 1.3.0",
"syn",
"which",
]
@@ -280,13 +280,14 @@ dependencies = [
[[package]]
name = "cc"
-version = "1.2.12"
+version = "1.2.67"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "755717a7de9ec452bf7f3f1a3099085deabd7f2962b861dae91ecd7a365903d2"
+checksum = "e17dd265a7d0f31ef544e1b20e03add05d3b45b491b633b10d67145d2acc1a38"
dependencies = [
+ "find-msvc-tools",
"jobserver",
"libc",
- "shlex",
+ "shlex 2.0.1",
]
[[package]]
@@ -381,9 +382,9 @@ checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6"
[[package]]
name = "cmake"
-version = "0.1.54"
+version = "0.1.58"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0"
+checksum = "c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678"
dependencies = [
"cc",
]
@@ -719,6 +720,12 @@ dependencies = [
"windows-sys 0.59.0",
]
+[[package]]
+name = "find-msvc-tools"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582"
+
[[package]]
name = "flate2"
version = "1.1.5"
@@ -2681,6 +2688,12 @@ version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
+[[package]]
+name = "shlex"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba"
+
[[package]]
name = "signature"
version = "2.2.0"
diff --git a/ci-defaults.yaml b/ci-defaults.yaml
new file mode 100644
index 000000000..56f612675
--- /dev/null
+++ b/ci-defaults.yaml
@@ -0,0 +1,28 @@
+# Describes the default targets that CI will build for different events.
+
+pull_request:
+ python_version: "3.14"
+
+ targets:
+ x86_64-pc-windows-msvc:
+ build_options:
+ - pgo
+
+ aarch64-apple-darwin:
+ build_options:
+ - pgo+lto
+
+ x86_64-unknown-linux-gnu:
+ build_options:
+ - pgo+lto
+ - freethreaded+pgo+lto
+
+ x86_64-unknown-linux-musl:
+ build_options:
+ - lto
+ - lto+static
+ - freethreaded+lto
+
+ armv7-unknown-linux-gnueabihf:
+ build_options:
+ - lto
diff --git a/ci-matrix.py b/ci-matrix.py
index e4b1f3ba8..30b1a70fd 100644
--- a/ci-matrix.py
+++ b/ci-matrix.py
@@ -16,6 +16,7 @@
CI_TARGETS_YAML = "ci-targets.yaml"
CI_RUNNERS_YAML = "ci-runners.yaml"
+CI_DEFAULTS_YAML = "ci-defaults.yaml"
CI_EXTRA_SKIP_LABELS = ["documentation"]
CI_MATRIX_SIZE_LIMIT = 256 # The maximum size of a matrix in GitHub Actions
@@ -40,7 +41,7 @@ def meets_conditional_version(version: str, min_version: str) -> bool:
def parse_labels(labels: str | None) -> dict[str, set[str]]:
- """Parse labels into a dict of category filters."""
+ """Parse labels into a dict of category -> set of values."""
if not labels:
return {}
@@ -75,30 +76,157 @@ def parse_labels(labels: str | None) -> dict[str, set[str]]:
return result
-def should_include_entry(entry: dict[str, str], filters: dict[str, set[str]]) -> bool:
- """Check if an entry satisfies the label filters."""
- if filters.get("directives") and "skip" in filters["directives"]:
- return False
+def get_all_build_options(ci_config: dict[str, Any], target_triple: str) -> list[str]:
+ """Get all build options (including conditional) for a target from ci-targets.yaml."""
+ for platform_config in ci_config.values():
+ if target_triple in platform_config:
+ config = platform_config[target_triple]
+ options = list(config["build_options"])
+ for conditional in config.get("build_options_conditional", []):
+ options.extend(conditional["options"])
+ return options
+ raise KeyError(f"Target triple {target_triple!r} not found in ci-targets.yaml")
+
+
+def find_target_platform(ci_config: dict[str, Any], target_triple: str) -> str:
+ """Find which platform a target triple belongs to in ci-targets.yaml."""
+ for platform, platform_config in ci_config.items():
+ if target_triple in platform_config:
+ return platform
+ raise KeyError(f"Target triple {target_triple!r} not found in ci-targets.yaml")
+
+
+def expand_default_triples(
+ ci_config: dict[str, Any],
+ pull_request_defaults: dict[str, Any],
+ labels: dict[str, set[str]],
+) -> set[str]:
+ """Compute the set of allowed target triples for a pull request.
+
+ Starts from the explicit defaults in ci-defaults.yaml. When a target
+ dimension has an :all label, that dimension is relaxed and additional
+ triples from ci-targets.yaml that match on the non-expanded dimensions
+ are included.
+ """
+ default_triples = set(pull_request_defaults["targets"])
+
+ platform_labels = labels.get("platform", set())
+ arch_labels = labels.get("arch", set())
+ libc_labels = labels.get("libc", set())
+
+ platform_filters = platform_labels - {"all"}
+ arch_filters = arch_labels - {"all"}
+ libc_filters = libc_labels - {"all"}
+
+ expand_platform = "all" in platform_labels or bool(platform_filters)
+ expand_arch = "all" in arch_labels or bool(arch_filters)
+ expand_libc = "all" in libc_labels or bool(libc_filters)
+
+ if not (expand_platform or expand_arch or expand_libc):
+ return default_triples
+
+ # Build reference tuples from the default triples.
+ default_attrs = []
+ for triple in default_triples:
+ platform = find_target_platform(ci_config, triple)
+ config = ci_config[platform][triple]
+ default_attrs.append(
+ (
+ platform,
+ config["arch"],
+ config.get("arch_variant"),
+ config.get("libc"),
+ )
+ )
- if filters.get("platform") and entry["platform"] not in filters["platform"]:
+ # Include any triple whose non-expanded dimensions match a default.
+ allowed = set(default_triples)
+ for platform, platform_config in ci_config.items():
+ for triple, config in platform_config.items():
+ for d_platform, d_arch, d_arch_variant, d_libc in default_attrs:
+ if platform_filters:
+ if platform not in platform_filters:
+ continue
+ elif "all" not in platform_labels and platform != d_platform:
+ continue
+
+ if arch_filters:
+ if config["arch"] not in arch_filters:
+ continue
+ if config.get("arch_variant") != d_arch_variant:
+ continue
+ elif "all" not in arch_labels and (
+ config["arch"] != d_arch
+ or config.get("arch_variant") != d_arch_variant
+ ):
+ continue
+
+ if libc_filters:
+ if config.get("libc") not in libc_filters:
+ continue
+ elif "all" not in libc_labels and config.get("libc") != d_libc:
+ continue
+ allowed.add(triple)
+ break
+
+ return allowed
+
+
+def should_include_entry(
+ entry: dict[str, str],
+ labels: dict[str, set[str]],
+ pull_request_defaults: dict[str, Any] | None = None,
+ allowed_triples: set[str] | None = None,
+) -> bool:
+ """Check if a matrix entry should be included.
+
+ For pull requests, entries are restricted to the allowed target set
+ (computed by expand_default_triples), the default python version, and
+ the curated build options — unless overridden by labels. For pushes
+ (pull_request_defaults is None), only label filters apply.
+ """
+ if pull_request_defaults is not None:
+ triple = entry["target_triple"]
+ default_targets = pull_request_defaults["targets"]
+
+ # Target must be in the allowed set.
+ if allowed_triples is not None and triple not in allowed_triples:
+ return False
+
+ # Python: restrict to default version unless python labels override.
+ if not labels.get("python"):
+ if entry["python"] != pull_request_defaults["python_version"]:
+ return False
+
+ # Build options: restrict to curated defaults for default triples
+ # unless build labels override. Non-default triples (brought in by
+ # :all expansion) are unrestricted.
+ if not labels.get("build") and triple in default_targets:
+ if entry["build_options"] not in default_targets[triple]["build_options"]:
+ return False
+
+ # Label filters
+ platform_filters = labels.get("platform", set()) - {"all"}
+ if platform_filters and entry["platform"] not in platform_filters:
return False
- if filters.get("python") and entry["python"] not in filters["python"]:
+ python_filters = labels.get("python", set()) - {"all"}
+ if python_filters and entry["python"] not in python_filters:
return False
- if filters.get("arch") and entry["arch"] not in filters["arch"]:
+ arch_filters = labels.get("arch", set()) - {"all"}
+ if arch_filters and entry["arch"] not in arch_filters:
return False
- if (
- filters.get("libc")
- and entry.get("libc")
- and entry["libc"] not in filters["libc"]
- ):
+ libc_filters = labels.get("libc", set()) - {"all"}
+ if libc_filters and entry.get("libc") and entry["libc"] not in libc_filters:
return False
- if filters.get("build"):
- build_options = set(entry.get("build_options", "").split("+"))
- if not all(f in build_options for f in filters["build"]):
+ build_filters = labels.get("build", set()) - {"all"}
+ if build_filters:
+ build_components = set(entry.get("build_options", "").split("+"))
+ required = {c for f in build_filters for c in f.split("+")}
+ if not required.issubset(build_components):
return False
return True
@@ -106,17 +234,32 @@ def should_include_entry(entry: dict[str, str], filters: dict[str, set[str]]) ->
def generate_docker_matrix_entries(
runners: dict[str, Any],
+ python_entries: list[dict[str, str]],
platform_filter: str | None = None,
free_runners: bool = False,
) -> list[dict[str, str]]:
- """Generate matrix entries for docker image builds."""
+ """Generate matrix entries for Docker image builds."""
if platform_filter and platform_filter != "linux":
return []
+ needed_archs = {
+ runners[entry["runner"]]["arch"]
+ for entry in python_entries
+ if entry.get("platform") == "linux"
+ }
+
matrix_entries = []
for image in DOCKER_BUILD_IMAGES:
+<<<<<<< HEAD
# Find appropriate runner for Linux platform with the specified architecture
runner = find_runner(runners, "linux", image["arch"], free_runners)
+=======
+ if image["arch"] not in needed_archs:
+ continue
+
+ # Find appropriate runner for Linux platform with the specified architecture.
+ runner = find_runner(runners, "linux", image["arch"], False)
+>>>>>>> refs/tags/20260825
entry = {
"name": image["name"],
@@ -203,14 +346,6 @@ def generate_python_build_matrix_entries(
free_runners,
)
- # Apply label filters if present
- if label_filters:
- matrix_entries = [
- entry
- for entry in matrix_entries
- if should_include_entry(entry, label_filters)
- ]
-
return matrix_entries
@@ -327,6 +462,50 @@ def add_python_build_entries_for_config(
matrix_entries.append(entry)
+def validate_pull_request_defaults(
+ ci_config: dict[str, Any], pull_request_defaults: dict[str, Any]
+) -> None:
+ """Validate the pull_request defaults in ci-defaults.yaml."""
+ all_triples = set()
+ for platform_config in ci_config.values():
+ all_triples.update(platform_config.keys())
+
+ for triple in pull_request_defaults["targets"]:
+ if triple not in all_triples:
+ print(
+ f"error: target triple {triple!r} in {CI_DEFAULTS_YAML}:pull_request "
+ f"not found in {CI_TARGETS_YAML}",
+ file=sys.stderr,
+ )
+ sys.exit(1)
+
+ # Validate that each build option listed is valid for the target.
+ all_options = set(get_all_build_options(ci_config, triple))
+ for option in pull_request_defaults["targets"][triple]["build_options"]:
+ if option not in all_options:
+ print(
+ f"error: build option {option!r} for {triple} in "
+ f"{CI_DEFAULTS_YAML}:pull_request not found in {CI_TARGETS_YAML} "
+ f"(valid: {sorted(all_options)})",
+ file=sys.stderr,
+ )
+ sys.exit(1)
+
+ # Validate that the default python version exists in ci-targets.yaml.
+ default_version = pull_request_defaults["python_version"]
+ for triple in pull_request_defaults["targets"]:
+ platform = find_target_platform(ci_config, triple)
+ ci_versions = ci_config[platform][triple]["python_versions"]
+ if default_version not in ci_versions:
+ print(
+ f"error: python version {default_version!r} in "
+ f"{CI_DEFAULTS_YAML}:pull_request not available for {triple} in "
+ f"{CI_TARGETS_YAML} (valid: {ci_versions})",
+ file=sys.stderr,
+ )
+ sys.exit(1)
+
+
def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser(
description="Generate a JSON matrix for building distributions in CI"
@@ -344,7 +523,12 @@ def parse_args() -> argparse.Namespace:
)
parser.add_argument(
"--labels",
- help="Comma-separated list of labels to filter by (e.g., 'platform:darwin,python:3.13,build:debug'), all must match.",
+ help="Comma-separated list of labels to filter by (e.g., 'platform:linux,python:3.13')",
+ )
+ parser.add_argument(
+ "--event",
+ choices=["pull_request", "push"],
+ help="The GitHub event type. When 'pull_request', uses ci-defaults.yaml for the default subset.",
)
parser.add_argument(
"--free-runners",
@@ -370,11 +554,14 @@ def main() -> None:
labels = parse_labels(args.labels)
with open(CI_TARGETS_YAML) as f:
- config = yaml.safe_load(f)
+ ci_config = yaml.safe_load(f)
with open(CI_RUNNERS_YAML) as f:
runners = yaml.safe_load(f)
+ with open(CI_DEFAULTS_YAML) as f:
+ ci_defaults = yaml.safe_load(f) or {}
+
# If only free runners are allowed, reduce to a subset
if args.free_runners:
runners = {
@@ -383,16 +570,48 @@ def main() -> None:
if runner_config.get("free")
}
+ # Check for skip directive
+ if labels.get("directives") and "skip" in labels["directives"]:
+ # Emit empty matrices
+ result = {}
+ if args.matrix_type in ["python-build", "all"]:
+ if args.max_shards:
+ result["python-build"] = {
+ str(i): {"include": []} for i in range(args.max_shards)
+ }
+ else:
+ result["python-build"] = {"include": []}
+ if args.matrix_type in ["docker-build", "all"]:
+ result["docker-build"] = {"include": []}
+ if args.matrix_type in ["crate-build", "all"]:
+ result["crate-build"] = {"include": []}
+ print(json.dumps(result))
+ return
+
+ event_defaults = ci_defaults.get(args.event) if args.event else None
+ if "all-targets" in labels.get("directives", set()):
+ event_defaults = None
+
+ allowed_triples = None
+ if event_defaults is not None:
+ validate_pull_request_defaults(ci_config, event_defaults)
+ allowed_triples = expand_default_triples(ci_config, event_defaults, labels)
+
result = {}
- # Generate python build entries
+ # Generate all python build entries, then filter
python_entries = generate_python_build_matrix_entries(
- config,
+ ci_config,
runners,
args.platform,
labels,
args.free_runners,
)
+ python_entries = [
+ entry
+ for entry in python_entries
+ if should_include_entry(entry, labels, event_defaults, allowed_triples)
+ ]
# Output python-build matrix if requested
if args.matrix_type in ["python-build", "all"]:
@@ -420,18 +639,19 @@ def main() -> None:
result["python-build"] = {"include": python_entries}
# Generate docker-build matrix if requested
- # Only include docker builds if there are Linux python builds
+ # Only include docker builds if there are Linux python builds.
if args.matrix_type in ["docker-build", "all"]:
- # Check if we have any Linux python builds
+ # Check if we have any Linux python builds.
has_linux_builds = any(
entry.get("platform") == "linux" for entry in python_entries
)
- # If no platform filter or explicitly requesting docker-build only, include docker builds
- # Otherwise, only include if there are Linux python builds
+ # If no platform filter or explicitly requesting docker-build only, include docker builds.
+ # Otherwise, only include if there are Linux python builds.
if args.matrix_type == "docker-build" or has_linux_builds:
docker_entries = generate_docker_matrix_entries(
runners,
+ python_entries,
args.platform,
args.free_runners,
)
@@ -442,7 +662,7 @@ def main() -> None:
crate_entries = generate_crate_build_matrix_entries(
python_entries,
runners,
- config,
+ ci_config, # Use the full target config so --force-crate-build adds all native crate builds.
args.force_crate_build,
args.platform,
args.free_runners,
diff --git a/ci-runners.yaml b/ci-runners.yaml
index 60b64b45b..14e5d9c6d 100644
--- a/ci-runners.yaml
+++ b/ci-runners.yaml
@@ -10,7 +10,7 @@ depot-ubuntu-22.04-arm-4:
platform: linux
free: false
-depot-macos-latest:
+namespace-profile-macos-15:
arch: aarch64
platform: darwin
free: false
diff --git a/ci-targets.yaml b/ci-targets.yaml
index 62b7f50b0..65e71604c 100644
--- a/ci-targets.yaml
+++ b/ci-targets.yaml
@@ -114,10 +114,9 @@ linux:
- "3.14"
- "3.15"
build_options:
- # TODO: Static support is current blocked by some compiler-rt linking issues
- # - debug+static
- # - noopt+static
- # - lto+static
+ - debug+static
+ - noopt+static
+ - lto+static
- debug
- noopt
- lto
diff --git a/cpython-unix/Makefile b/cpython-unix/Makefile
index 69dfe5534..6b2fa6834 100644
--- a/cpython-unix/Makefile
+++ b/cpython-unix/Makefile
@@ -33,6 +33,8 @@ PYTHON_MAJOR_VERSION := $(subst $(SPACE),.,$(wordlist 1,2,$(subst .,$(SPACE),$(P
TARGET_TRIPLE := $(PYBUILD_TARGET_TRIPLE)
HOST_PLATFORM := $(PYBUILD_HOST_PLATFORM)
PACKAGE_SUFFIX := $(TARGET_TRIPLE)-$(PYBUILD_BUILD_OPTIONS)
+MUSL_TOOLCHAIN_NAME := $(if $(findstring static,$(PYBUILD_BUILD_OPTIONS)),musl-static,musl)
+MUSL_TOOLCHAIN_VERSION = $(if $(findstring static,$(PYBUILD_BUILD_OPTIONS)),$(MUSL_STATIC_VERSION),$(MUSL_VERSION))
RUN_BUILD = $(BUILD) \
--host-platform $(HOST_PLATFORM) \
@@ -61,7 +63,7 @@ BASE_TOOLCHAIN_DEPENDS := \
TOOLCHAIN_DEPENDS := \
$(BASE_TOOLCHAIN_DEPENDS) \
- $(if $(NEED_MUSL),$(OUTDIR)/musl-$(MUSL_VERSION)-$(HOST_PLATFORM).tar) \
+ $(if $(NEED_MUSL),$(OUTDIR)/$(MUSL_TOOLCHAIN_NAME)-$(MUSL_TOOLCHAIN_VERSION)-$(HOST_PLATFORM).tar) \
$(NULL)
PYTHON_DEP_DEPENDS := \
@@ -85,11 +87,11 @@ $(OUTDIR)/binutils-$(BINUTILS_VERSION)-$(HOST_PLATFORM).tar: $(OUTDIR)/image-$(D
$(OUTDIR)/$(CLANG_FILENAME):
$(RUN_BUILD) --toolchain clang --target-triple $(TARGET_TRIPLE)
-$(OUTDIR)/musl-$(MUSL_VERSION)-$(HOST_PLATFORM).tar: $(BASE_TOOLCHAIN_DEPENDS) $(HERE)/build-musl.sh
+$(OUTDIR)/$(MUSL_TOOLCHAIN_NAME)-$(MUSL_TOOLCHAIN_VERSION)-$(HOST_PLATFORM).tar: $(BASE_TOOLCHAIN_DEPENDS) $(HERE)/build-musl.sh
$(RUN_BUILD) --toolchain musl --docker-image $(DOCKER_IMAGE_GCC)
ifeq ($(HOST_PLATFORM),linux_x86_64)
- TOOLCHAIN_TARGET := $(OUTDIR)/musl-$(MUSL_VERSION)-$(HOST_PLATFORM).tar
+ TOOLCHAIN_TARGET := $(OUTDIR)/$(MUSL_TOOLCHAIN_NAME)-$(MUSL_TOOLCHAIN_VERSION)-$(HOST_PLATFORM).tar
else
TOOLCHAIN_TARGET :=
endif
@@ -119,9 +121,6 @@ $(OUTDIR)/bzip2-$(BZIP2_VERSION)-$(PACKAGE_SUFFIX).tar: $(PYTHON_DEP_DEPENDS) $(
$(OUTDIR)/expat-$(EXPAT_VERSION)-$(PACKAGE_SUFFIX).tar: $(PYTHON_DEP_DEPENDS) $(HERE)/build-expat.sh
$(RUN_BUILD) --docker-image $(DOCKER_IMAGE_BUILD) expat
-$(OUTDIR)/libffi-3.3-$(LIBFFI_3.3_VERSION)-$(PACKAGE_SUFFIX).tar: $(PYTHON_DEP_DEPENDS) $(HERE)/build-libffi-3.3.sh
- $(RUN_BUILD) --docker-image $(DOCKER_IMAGE_BUILD) libffi-3.3
-
$(OUTDIR)/libffi-$(LIBFFI_VERSION)-$(PACKAGE_SUFFIX).tar: $(PYTHON_DEP_DEPENDS) $(HERE)/build-libffi.sh
$(RUN_BUILD) --docker-image $(DOCKER_IMAGE_BUILD) libffi
@@ -186,6 +185,9 @@ $(OUTDIR)/libedit-$(LIBEDIT_VERSION)-$(PACKAGE_SUFFIX).tar: $(LIBEDIT_DEPENDS)
$(OUTDIR)/patchelf-$(PATCHELF_VERSION)-$(PACKAGE_SUFFIX).tar: $(PYTHON_DEP_DEPENDS) $(HERE)/build-patchelf.sh
$(RUN_BUILD) --docker-image $(DOCKER_IMAGE_BUILD) patchelf
+$(OUTDIR)/pkgconf-$(PKGCONF_VERSION)-$(PACKAGE_SUFFIX).tar: $(PYTHON_DEP_DEPENDS) $(HERE)/build-pkgconf.sh
+ $(RUN_BUILD) --docker-image $(DOCKER_IMAGE_BUILD) pkgconf
+
$(OUTDIR)/sqlite-$(SQLITE_VERSION)-$(PACKAGE_SUFFIX).tar: $(PYTHON_DEP_DEPENDS) $(HERE)/build-sqlite.sh
$(RUN_BUILD) --docker-image $(DOCKER_IMAGE_BUILD) sqlite
@@ -220,6 +222,9 @@ $(OUTDIR)/xcb-proto-$(XCB_PROTO_VERSION)-$(PACKAGE_SUFFIX).tar: $(PYTHON_DEP_DEP
$(OUTDIR)/xorgproto-$(XORGPROTO_VERSION)-$(PACKAGE_SUFFIX).tar: $(PYTHON_DEP_DEPENDS) $(HERE)/build-xorgproto.sh
$(RUN_BUILD) --docker-image $(DOCKER_IMAGE_BUILD) xorgproto
+$(OUTDIR)/linux-uapi-$(LINUX_UAPI_VERSION)-$(PACKAGE_SUFFIX).tar: $(PYTHON_DEP_DEPENDS) $(HERE)/build-linux-uapi.sh
+ $(RUN_BUILD) --docker-image $(DOCKER_IMAGE_BUILD) linux-uapi
+
$(OUTDIR)/xtrans-$(XTRANS_VERSION)-$(PACKAGE_SUFFIX).tar: $(PYTHON_DEP_DEPENDS) $(HERE)/build-xtrans.sh
$(RUN_BUILD) --docker-image $(DOCKER_IMAGE_BUILD) xtrans
@@ -253,14 +258,15 @@ PYTHON_DEPENDS_$(1) := \
$$(if $$(NEED_BZIP2),$$(OUTDIR)/bzip2-$$(BZIP2_VERSION)-$$(PACKAGE_SUFFIX).tar) \
$$(if $$(NEED_EXPAT),$$(OUTDIR)/expat-$$(EXPAT_VERSION)-$$(PACKAGE_SUFFIX).tar) \
$$(if $$(NEED_LIBEDIT),$$(OUTDIR)/libedit-$$(LIBEDIT_VERSION)-$$(PACKAGE_SUFFIX).tar) \
- $$(if $$(NEED_LIBFFI_3_3),$$(OUTDIR)/libffi-3.3-$$(LIBFFI_3.3_VERSION)-$$(PACKAGE_SUFFIX).tar) \
$$(if $$(NEED_LIBFFI),$$(OUTDIR)/libffi-$$(LIBFFI_VERSION)-$$(PACKAGE_SUFFIX).tar) \
+ $$(if $$(NEED_LINUX_UAPI),$$(OUTDIR)/linux-uapi-$$(LINUX_UAPI_VERSION)-$$(PACKAGE_SUFFIX).tar) \
$$(if $$(NEED_m4),$$(OUTDIR)/m4-$$(M4_VERSION)-$$(PACKAGE_SUFFIX).tar) \
$$(if $$(NEED_MPDECIMAL),$$(OUTDIR)/mpdecimal-$$(MPDECIMAL_VERSION)-$$(PACKAGE_SUFFIX).tar) \
$$(if $$(NEED_NCURSES),$$(OUTDIR)/ncurses-$$(NCURSES_VERSION)-$$(PACKAGE_SUFFIX).tar) \
$$(if $$(NEED_OPENSSL_1_1),$$(OUTDIR)/openssl-1.1-$$(OPENSSL_1.1_VERSION)-$$(PACKAGE_SUFFIX).tar) \
$$(if $$(NEED_OPENSSL_3_5),$$(OUTDIR)/openssl-3.5-$$(OPENSSL_3.5_VERSION)-$$(PACKAGE_SUFFIX).tar) \
$$(if $$(NEED_PATCHELF),$$(OUTDIR)/patchelf-$$(PATCHELF_VERSION)-$$(PACKAGE_SUFFIX).tar) \
+ $$(if $$(NEED_PKGCONF),$$(OUTDIR)/pkgconf-$$(PKGCONF_VERSION)-$$(PACKAGE_SUFFIX).tar) \
$$(if $$(NEED_SQLITE),$$(OUTDIR)/sqlite-$$(SQLITE_VERSION)-$$(PACKAGE_SUFFIX).tar) \
$$(if $$(NEED_TCL),$$(OUTDIR)/tcl-$$(TCL_VERSION)-$$(PACKAGE_SUFFIX).tar) \
$$(if $$(NEED_TK),$$(OUTDIR)/tk-$$(TK_VERSION)-$$(PACKAGE_SUFFIX).tar) \
diff --git a/cpython-unix/build-cpython.sh b/cpython-unix/build-cpython.sh
index fdb49c588..68121b4a6 100755
--- a/cpython-unix/build-cpython.sh
+++ b/cpython-unix/build-cpython.sh
@@ -15,6 +15,21 @@ export PKG_CONFIG_PATH=${TOOLS_PATH}/deps/share/pkgconfig:${TOOLS_PATH}/deps/lib
# Ensure that `pkg-config` invocations include the static libraries
export PKG_CONFIG="pkg-config --static"
+# Dependency pkg-config files use /tools/deps as their prefix. macOS builds
+# extract dependencies into a temporary directory, so have pkgconf relocate
+# their prefix based on the location of each .pc file.
+if [[ "${PYBUILD_PLATFORM}" = macos* ]]; then
+ export PKG_CONFIG="${PKG_CONFIG} --define-prefix"
+
+ if [ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_12}" ]; then
+ # On macOS, CPython prefers the system libffi and provides no way to
+ # select a non-system version. Disable its system-library probe so
+ # _ctypes uses the bundled libffi instead.
+ # https://github.com/python/cpython/issues/155813
+ export ac_cv_lib_ffi_ffi_call=no
+ fi
+fi
+
# configure somehow has problems locating llvm-profdata even though it is in
# PATH. The macro it is using allows us to specify its path via an
# environment variable.
@@ -154,12 +169,15 @@ else
patch -p1 -i "${ROOT}/patch-macos-link-extension-modules.patch"
fi
+<<<<<<< HEAD
# Also on macOS, the `python` executable is linked against libraries defined by statically
# linked modules. But those libraries should only get linked into libpython, not the
# executable. This behavior is kinda suspect on all platforms, as it could be adding
# library dependencies that shouldn't need to be there.
# PYSTANDALONE: skip this patch.
+=======
+>>>>>>> refs/tags/20260825
# The macOS code for sniffing for _dyld_shared_cache_contains_path falls back on a
# possibly inappropriate code path if a configure time check fails. This is not
# appropriate for certain cross-compiling scenarios. See discussion at
@@ -216,54 +234,18 @@ if [[ -n "${PYTHON_MEETS_MAXIMUM_VERSION_3_10}" ]]; then
patch -p1 -i "${ROOT}/patch-posixmodule-remove-system.patch"
fi
-# Python 3.11 has configure support for configuring extension modules. We really,
-# really, really want to use this feature because it looks promising. But at the
-# time we added this code the functionality didn't support all extension modules
-# nor did it easily support static linking, including static linking of extra
-# libraries (which appears to be a limitation of `makesetup`). So for now we
-# disable the functionality and require our auto-generated Setup.local to provide
-# everything.
-if [ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_11}" ]; then
- if [ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_12}" ]; then
- # This sets MODULE__STATE=disabled in the Makefile for all extension
- # modules that are not unavailable (n/a) based on the platform.
- # Valid STATE variables are needed to create the _missing_stdlib_info.py
- # file during the build in Python 3.15+
- patch -p1 -i "${ROOT}/patch-configure-disable-stdlib-mod-3.12.patch"
- else
- patch -p1 -i "${ROOT}/patch-configure-disable-stdlib-mod.patch"
- fi
+# CPython 3.11 does not configure every standard-library extension, so disable
+# its incomplete generated rules and supply all rules through Setup.local.
+# CPython 3.12+ uses Setup.stdlib with a small Setup.local for per-module
+# link-type overrides.
+if [ "${PYTHON_MAJMIN_VERSION}" = "3.11" ]; then
+ patch -p1 -i "${ROOT}/patch-configure-disable-stdlib-mod.patch"
# This hack also prevents the conditional definition of the pwd module in
# Setup.bootstrap.in from working. So we remove that conditional.
patch -p1 -i "${ROOT}/patch-pwd-remove-conditional.patch"
fi
-if [ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_12}" ]; then
- # Additional BOLT optimizations, being upstreamed in
- # https://github.com/python/cpython/issues/128514
- patch -p1 -i "${ROOT}/patch-configure-bolt-apply-flags-128514.patch"
-
- # Disable unsafe identical code folding. Objects/typeobject.c
- # update_one_slot requires that wrap_binaryfunc != wrap_binaryfunc_l,
- # despite the functions being identical.
- # https://github.com/python/cpython/pull/134642
- patch -p1 -i "${ROOT}/patch-configure-bolt-icf-safe.patch"
-
- # Tweak --skip-funcs to work with our toolchain.
- if [ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_15}" ]; then
- patch -p1 -i "${ROOT}/patch-configure-bolt-skip-funcs-3.15.patch"
- else
- patch -p1 -i "${ROOT}/patch-configure-bolt-skip-funcs.patch"
- fi
-
- # Remove -use-gnu-stack from the BOLT optimization flags as it incorrectly
- # removes the PT_GNU_STACK segment. This patch can be removed when this bug
- # is fixed in LLVM.
- # https://github.com/llvm/llvm-project/issues/174191
- patch -p1 -i "${ROOT}/patch-configure-bolt-remove-use-gnu-stack.patch"
-fi
-
# The optimization make targets are both phony and non-phony. This leads
# to PGO targets getting reevaluated after a build when you use multiple
# make invocations. e.g. `make install` like we do below. Fix that.
@@ -285,17 +267,6 @@ else
patch -p1 -i "${ROOT}/patch-pgo-file-pool-3.11.patch"
fi
-# There's a post-build Python script that verifies modules were
-# built correctly. Ideally we'd invoke this. But our nerfing of
-# the configure-based module building and replacing it with our
-# own Setup-derived version completely breaks assumptions in this
-# script. So leave it off for now... at our own peril.
-if [ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_15}" ]; then
- patch -p1 -i "${ROOT}/patch-checksharedmods-disable-3.15.patch"
-elif [ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_12}" ]; then
- patch -p1 -i "${ROOT}/patch-checksharedmods-disable.patch"
-fi
-
# CPython < 3.11 always linked against libcrypt. We backport part of
# upstream commit be21706f3760bec8bd11f85ce02ed6792b07f51f to avoid this
# behavior.
@@ -351,11 +322,45 @@ if [ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_15}" ]; then
patch -p1 -i "${ROOT}/patch-testinternalcapi-interpreter-extern.patch"
fi
+# CPython uses HAVE_GETRANDOM_SYSCALL to decide whether to include
+# , but other APIs independently depend on __NR_* definitions
+# from that header. Include it whenever configure finds the header.
+patch -p1 -i "${ROOT}/patch-posixmodule-sys-syscall-header.patch"
+
+# Older glibc headers do not define SYS_getrandom even when the modern UAPI
+# headers provide __NR_getrandom. Use the UAPI syscall number directly so
+# CPython can compile os.getrandom without raising the minimum glibc version.
+if [[ -n "${LINUX_UAPI_INCLUDE_ARCH:-}" ]]; then
+ if [[ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_15}" ]]; then
+ patch -p1 -i "${ROOT}/patch-getrandom-use-nr-3.15.patch"
+ elif [[ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_13}" ]]; then
+ patch -p1 -i "${ROOT}/patch-getrandom-use-nr-3.14.patch"
+ else
+ patch -p1 -i "${ROOT}/patch-getrandom-use-nr-3.12.patch"
+ fi
+fi
+
+# glibc only grew copy_file_range() and memfd_create() in 2.27 and CPython
+# compiles os.copy_file_range() and os.memfd_create() out when the libc it is
+# built against lacks them, which loses them for good in builds targeting an
+# older glibc. Call the raw syscalls when the wrappers are missing so both
+# functions keep working on any kernel that implements them.
+# Backport of https://github.com/python/cpython/pull/155520.
+patch -p1 -i "${ROOT}/patch-posixmodule-syscall-fallback.patch"
+
# Most bits look at CFLAGS. But setup.py only looks at CPPFLAGS.
# So we need to set both.
CFLAGS="${EXTRA_TARGET_CFLAGS} -fPIC -I${TOOLS_PATH}/deps/include -I${TOOLS_PATH}/deps/include/ncursesw"
LDFLAGS="${EXTRA_TARGET_LDFLAGS} -L${TOOLS_PATH}/deps/lib"
+if [[ -n "${LINUX_UAPI_INCLUDE_ARCH:-}" ]]; then
+ if [[ ! -d "${TOOLS_PATH}/deps/linux-uapi/usr/include/${LINUX_UAPI_INCLUDE_ARCH}" ]]; then
+ echo "missing linux-uapi package for ${LINUX_UAPI_INCLUDE_ARCH}"
+ exit 1
+ fi
+ CFLAGS="-isystem ${TOOLS_PATH}/deps/linux-uapi/usr/include/${LINUX_UAPI_INCLUDE_ARCH} -isystem ${TOOLS_PATH}/deps/linux-uapi/usr/include ${CFLAGS}"
+fi
+
# Some target configurations use `-fvisibility=hidden`. Python's configure handles
# symbol visibility properly itself. So let it do its thing.
CFLAGS=${CFLAGS//-fvisibility=hidden/}
@@ -390,13 +395,6 @@ if [[ "${CC}" = "clang" && -n "${PYTHON_MEETS_MINIMUM_VERSION_3_14}" ]]; then
EXTRA_CONFIGURE_FLAGS="${EXTRA_CONFIGURE_FLAGS} --with-tail-call-interp"
fi
-# On Python 3.12+ we need to link the special hacl library provided some SHA-256
-# implementations. Since we hack up the regular extension building mechanism, we
-# need to reinvent this wheel.
-if [ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_12}" ]; then
- LDFLAGS="${LDFLAGS} -LModules/_hacl"
-fi
-
# On PPC we need to prevent the glibc 2.22 __tls_get_addr_opt symbol
# from being introduced to preserve runtime compatibility with older
# glibc.
@@ -435,22 +433,35 @@ CONFIGURE_FLAGS="
--without-ensurepip
${EXTRA_CONFIGURE_FLAGS}"
+if [ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_12}" ]; then
+ # Build standard-library extensions as built-ins by default. Setup.local
+ # overrides only the extensions that must remain shared or disabled.
+ CONFIGURE_FLAGS="${CONFIGURE_FLAGS} MODULE_BUILDTYPE=static --enable-loadable-sqlite-extensions"
+fi
+
+if [[ "${PYTHON_MAJMIN_VERSION}" = "3.12" && "${PYBUILD_PLATFORM}" = macos* ]]; then
+ # CPython 3.12 always uses UNIVERSAL on macOS for libmpdec,
+ # while the bundled dependency requires CONFIG_64.
+ export LIBMPDEC_CFLAGS="-DCONFIG_64=1"
+fi
+
+if [[ "${PYTHON_MAJMIN_VERSION}" = "3.12" && "${TARGET_TRIPLE}" == *-linux-* ]]; then
+ # The panelw archive needs ncursesw during configure's link probe.
+ export PANEL_CFLAGS="-I${TOOLS_PATH}/deps/include/ncursesw"
+ export PANEL_LIBS="-lpanelw -lncursesw"
+fi
# Build a libpython3.x.so, but statically link the interpreter against
# libpython.
-#
-# For now skip this on macos, because it causes some linker failures. Note that
-# this patch mildly conflicts with the macos-only patch-python-link-modules
-# applied above, so you will need to resolve that conflict if you re-enable
-# this for macos.
-if [[ "${PYBUILD_PLATFORM}" != macos* ]]; then
+# Merged upstream in Python 3.15, https://github.com/python/cpython/pull/133313
+if [ -n "${PYTHON_MEETS_MAXIMUM_VERSION_3_14}" ]; then
if [ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_12}" ]; then
patch -p1 -i "${ROOT}/patch-python-configure-add-enable-static-libpython-for-interpreter.patch"
else
patch -p1 -i "${ROOT}/patch-python-configure-add-enable-static-libpython-for-interpreter-${PYTHON_MAJMIN_VERSION}.patch"
fi
- CONFIGURE_FLAGS="${CONFIGURE_FLAGS} --enable-static-libpython-for-interpreter"
fi
+CONFIGURE_FLAGS="${CONFIGURE_FLAGS} --enable-static-libpython-for-interpreter"
if [ "${CC}" = "musl-clang" ]; then
# In order to build the _blake2 extension module with SSE3+ instructions, we need
@@ -515,6 +526,35 @@ if [ -n "${CPYTHON_OPTIMIZED}" ]; then
CONFIGURE_FLAGS="${CONFIGURE_FLAGS} --enable-optimizations"
if [[ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_12}" && -n "${BOLT_CAPABLE}" ]]; then
CONFIGURE_FLAGS="${CONFIGURE_FLAGS} --enable-bolt"
+
+ # CPython allows overriding the default BOLT flags via configure
+ # environment variables. Use our toolchain-specific skip list, add
+ # additional optimizations, use safe identical code folding, and omit
+ # -use-gnu-stack because it incorrectly removes the PT_GNU_STACK
+ # segment.
+ # https://github.com/python/cpython/issues/128514
+ # https://github.com/python/cpython/pull/134642
+ # https://github.com/llvm/llvm-project/issues/174191
+ # BOLT's allocation combiner can remove required stack allocations in
+ # the HACL hash compressors, leaving frame-pointer-relative accesses
+ # below the x86-64 red zone. Match BOLT's `/N` suffix for local symbols.
+ # https://github.com/astral-sh/uv/issues/20618
+ BOLT_COMMON_FLAGS="-update-debug-sections -skip-funcs=RC4_options/1,sha256_update/.*,sha512_update/.*,PyBlake2_blake2b_compress/.*,PyBlake2_blake2s_compress/.*,update_block.*"
+ BOLT_APPLY_FLAGS="${BOLT_COMMON_FLAGS} \
+-reorder-blocks=ext-tsp \
+-reorder-functions=cdsort \
+-split-functions \
+-split-strategy=cdsplit \
+-icf=safe \
+-inline-all \
+-split-eh \
+-reorder-functions-use-hot-size \
+-peepholes=none \
+-jump-tables=aggressive \
+-inline-ap \
+-indirect-call-promotion=all \
+-dyno-stats \
+-frame-opt=hot"
fi
# Allow users to enable the experimental JIT on 3.13+
@@ -631,24 +671,11 @@ if [[ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_14}" && -n "${CROSS_COMPILING}" && "$
PROFILE_TASK="${PROFILE_TASK} --ignore test_strftime_y2k"
fi
-# On 3.14+ `test_json.test_recursion.TestCRecursion.test_highly_nested_objects_decoding` fails during
-# PGO due to RecursionError not being raised as expected. See https://github.com/python/cpython/issues/140125
-if [[ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_14}" ]]; then
- PROFILE_TASK="${PROFILE_TASK} --ignore test_json"
-fi
-
# PGO optimized / BOLT instrumented binaries segfault in a test_bytes test. Skip it.
if [[ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_13}" && "${TARGET_TRIPLE}" == x86_64* ]]; then
PROFILE_TASK="${PROFILE_TASK} --ignore test.test_bytes.BytesTest.test_from_format"
fi
-# ./configure tries to auto-detect whether it can build 128-bit and 256-bit SIMD helpers for HACL,
-# but on x86-64 that requires v2 and v3 respectively, and on arm64 the performance is bad as noted
-# in the comments, so just don't even try. (We should check if we can make this conditional)
-if [[ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_14}" ]]; then
- patch -p1 -i "${ROOT}/patch-python-configure-hacl-no-simd.patch"
-fi
-
# We use ndbm on macOS and BerkeleyDB elsewhere.
if [[ "${PYBUILD_PLATFORM}" = macos* ]]; then
CONFIGURE_FLAGS="${CONFIGURE_FLAGS} --with-dbmliborder=ndbm"
@@ -760,6 +787,9 @@ autoconf
# 3.12 and earlier)
CFLAGS_JIT="${CFLAGS}"
+# JIT stencils should not inherit target-wide stack hardening flags.
+CFLAGS_JIT+=" -fno-stack-protector -fno-stack-clash-protection"
+
# In 3.14+, the JIT compiler on x86-64 Linux uses a model that conflicts with `-fPIC`, so strip it
# from the flags. See:
# - https://github.com/python/cpython/issues/135690
@@ -768,12 +798,14 @@ if [[ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_14}" && "${TARGET_TRIPLE}" == x86_64*
CFLAGS_JIT="${CFLAGS_JIT//-fPIC/}"
fi
-CFLAGS=$CFLAGS CPPFLAGS=$CFLAGS CFLAGS_JIT=$CFLAGS_JIT LDFLAGS=$LDFLAGS \
+BOLT_COMMON_FLAGS="${BOLT_COMMON_FLAGS:-}" BOLT_APPLY_FLAGS="${BOLT_APPLY_FLAGS:-}" \
+ CFLAGS=$CFLAGS CPPFLAGS=$CFLAGS CFLAGS_JIT=$CFLAGS_JIT LDFLAGS=$LDFLAGS \
./configure ${CONFIGURE_FLAGS}
# Supplement produced Makefile with our modifications.
cat ../Makefile.extra >> Makefile
+<<<<<<< HEAD
# PYSTANDALONE: do a silly dance to temporarily disable the _pystandalone module to avoid compilation issues during regen
sed -E "${sed_args[@]}" 's/^(_pystandalone .+)/#\1/g' Modules/Setup.local
rm Modules/config.c
@@ -841,6 +873,22 @@ rm Modules/config.c
make -j "${NUM_CPUS}" Modules/config.c
cat ../Makefile.extra >> Makefile
+=======
+if [[ "${PYBUILD_PLATFORM}" = macos* && -n "${PYTHON_MEETS_MINIMUM_VERSION_3_12}" ]]; then
+ # configure-derived MODLIBS uses plain -l flags. Hide symbols from bundled
+ # static dependency libraries in both libpython and the interpreter.
+ printf '\nMODLIBS := $(subst -l,-Xlinker -hidden-l,$(MODLIBS))\n' >> Makefile
+fi
+
+# Debian's PPC64LE GCC 6 defaults to PIE but selects the non-PIE startup object unless -pie is
+# passed explicitly. Add it only to LINKFORSHARED, which CPython uses when linking executables.
+# See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81170.
+# TODO(jjh)Remove when the ppc64le toolchain changes
+if [[ "${TARGET_TRIPLE}" = "ppc64le-unknown-linux-gnu" ]]; then
+ printf '\nLINKFORSHARED += -pie\n' >> Makefile
+fi
+
+>>>>>>> refs/tags/20260825
make -j "${NUM_CPUS}"
make -j "${NUM_CPUS}" sharedinstall DESTDIR="${ROOT}/out/python"
make -j "${NUM_CPUS}" install DESTDIR="${ROOT}/out/python"
@@ -1078,9 +1126,14 @@ replace_in_all("-I%s/deps/include/ncursesw" % tools_path, "")
replace_in_all("-I%s/deps/include/uuid" % tools_path, "")
replace_in_all("-I%s/deps/include" % tools_path, "")
replace_in_all("-L%s/deps/lib" % tools_path, "")
-# See https://github.com/python/cpython/issues/145810#issuecomment-4068139183
-replace_in_all("-LModules/_hacl", "")
-
+linux_uapi_include_arch = os.environ.get("LINUX_UAPI_INCLUDE_ARCH")
+if linux_uapi_include_arch:
+ replace_in_all(
+ "-isystem %s/deps/linux-uapi/usr/include/%s"
+ % (tools_path, linux_uapi_include_arch),
+ "",
+ )
+replace_in_all("-isystem %s/deps/linux-uapi/usr/include" % tools_path, "")
EOF
${BUILD_PYTHON} "${ROOT}/hack_sysconfig.py" "${ROOT}/out/python"
@@ -1363,7 +1416,7 @@ if [ -d "${TOOLS_PATH}/deps/lib/tcl9" ]; then
# Copy tcl/tk resources needed by tkinter.
mkdir "${ROOT}/out/python/install/lib/tcl"
# Keep this list in sync with tcl_library_paths.
- for source in ${TOOLS_PATH}/deps/lib/{itcl4.3.5,tcl9,tcl9.0,thread3.0.4,tk9.0}; do
+ for source in ${TOOLS_PATH}/deps/lib/{itcl4.3.8,tcl9,tcl9.0,thread3.0.6,tk9.0}; do
cp -av "$source" "${ROOT}/out/python/install/lib/"
done
@@ -1376,6 +1429,13 @@ if [ -d "${TOOLS_PATH}/deps/lib/tcl9" ]; then
)
fi
+# Prune the tk demos which are > 1 MB and not used
+rm -rf "${ROOT}/out/python/install/lib/tk9.0/demos"
+
+# Prune the tcl/tk translations
+rm -rf "${ROOT}/out/python/install/lib/tcl9.0/msgs"
+rm -rf "${ROOT}/out/python/install/lib/tk9.0/msgs"
+
# Copy the terminfo database if present.
if [ -d "${TOOLS_PATH}/deps/usr/share/terminfo" ]; then
cp -av "${TOOLS_PATH}/deps/usr/share/terminfo" "${ROOT}/out/python/install/share/"
diff --git a/cpython-unix/build-expat.sh b/cpython-unix/build-expat.sh
index 87a4d0100..d286091ba 100755
--- a/cpython-unix/build-expat.sh
+++ b/cpython-unix/build-expat.sh
@@ -13,6 +13,15 @@ tar -xf "expat-${EXPAT_VERSION}.tar.xz"
pushd "expat-${EXPAT_VERSION}"
+EXPAT_CONFIGURE_FLAGS=()
+# Expat 2.8.2 no longer enables /dev/urandom by default. Enable it for
+# # x86-64 Linux, whose older glibc target cannot use getrandom().
+# https://github.com/libexpat/libexpat/pull/1257
+if [[ "${TARGET_TRIPLE}" = x86_64-*-linux-* ]]; then
+ # Older Linux targets may not expose newer entropy APIs to configure.
+ EXPAT_CONFIGURE_FLAGS+=(--with-dev-urandom)
+fi
+
# xmlwf isn't needed by CPython.
# Disable -fexceptions because we don't need it and it adds a dependency on libgcc_s, which
# is softly undesirable.
@@ -24,6 +33,7 @@ CFLAGS="${EXTRA_TARGET_CFLAGS} -fPIC" CPPFLAGS="${EXTRA_TARGET_CFLAGS} -fPIC" ./
--without-examples \
--without-tests \
--without-xmlwf \
+ "${EXPAT_CONFIGURE_FLAGS[@]}" \
ax_cv_check_cflags___fexceptions=no
make -j "${NUM_CPUS}"
diff --git a/cpython-unix/build-libX11.sh b/cpython-unix/build-libX11.sh
index b16c5be78..57dd51b50 100755
--- a/cpython-unix/build-libX11.sh
+++ b/cpython-unix/build-libX11.sh
@@ -13,30 +13,6 @@ export PKG_CONFIG_PATH=/tools/deps/share/pkgconfig:/tools/deps/lib/pkgconfig
tar -xf "libX11-${LIBX11_VERSION}.tar.gz"
pushd "libX11-${LIBX11_VERSION}"
-patch -p1 << 'EOF'
-diff --git a/configure b/configure
---- a/configure
-+++ b/configure
-@@ -19557,8 +19557,6 @@ else
- RAWCPPFLAGS="-undef -ansi"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, with -ansi" >&5
- $as_echo "yes, with -ansi" >&6; }
-- else
-- as_fn_error $? "${RAWCPP} defines unix with or without -undef. I don't know what to do." "$LINENO" 5
- fi
- fi
- rm -f conftest.$ac_ext
-@@ -19578,8 +19576,6 @@ else
- RAWCPPFLAGS="${RAWCPPFLAGS} -traditional"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
- $as_echo "yes" >&6; }
-- else
-- as_fn_error $? "${RAWCPP} does not preserve whitespace with or without -traditional. I don't know what to do." "$LINENO" 5
- fi
- fi
- rm -f conftest.$ac_ext
-EOF
-
if [ "${CC}" = "musl-clang" ]; then
EXTRA_FLAGS="--disable-shared"
fi
@@ -112,12 +88,15 @@ EXTRA_FLAGS="${EXTRA_FLAGS} --disable-loadable-xcursor"
# CC_FOR_BUILD is here because configure doesn't look for `clang` when
# cross-compiling. So we force it.
+# RAWCPP is X.Org's stdin-fed preprocessor command. Use the full path to
+# the target compiler driver with "-" to read from stdin.
CFLAGS="${EXTRA_TARGET_CFLAGS} -fPIC -I/tools/deps/include" \
CPPFLAGS="${EXTRA_TARGET_CFLAGS} -fPIC -I/tools/deps/include" \
LDFLAGS="${EXTRA_TARGET_LDFLAGS}" \
CC_FOR_BUILD="${HOST_CC}" \
CFLAGS_FOR_BUILD="-I/tools/deps/include" \
CPPFLAGS_FOR_BUILD="-I/tools/deps/include" \
+ RAWCPP="$(command -v "${CC}") -E -"\
./configure \
--build="${BUILD_TRIPLE}" \
--host="${TARGET_TRIPLE}" \
diff --git a/cpython-unix/build-libffi-3.3.sh b/cpython-unix/build-libffi-3.3.sh
deleted file mode 100755
index 77afc9e77..000000000
--- a/cpython-unix/build-libffi-3.3.sh
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/usr/bin/env bash
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at https://mozilla.org/MPL/2.0/.
-
-set -ex
-
-ROOT=$(pwd)
-
-export PATH=${TOOLS_PATH}/${TOOLCHAIN}/bin:${TOOLS_PATH}/host/bin:$PATH
-
-tar -xf "libffi-${LIBFFI_3_3_VERSION}.tar.gz"
-
-pushd "libffi-${LIBFFI_3_3_VERSION}"
-
-EXTRA_CONFIGURE=
-
-# mkostemp() was introduced in macOS 10.10 and libffi doesn't have
-# runtime guards for it. So ban the symbol when targeting old macOS.
-if [ "${APPLE_MIN_DEPLOYMENT_TARGET}" = "10.9" ]; then
- EXTRA_CONFIGURE="${EXTRA_CONFIGURE} ac_cv_func_mkostemp=no"
-fi
-
-CFLAGS="${EXTRA_TARGET_CFLAGS} -fPIC" CPPFLAGS="${EXTRA_TARGET_CFLAGS} -fPIC" LDFLAGS="${EXTRA_TARGET_LDFLAGS}" ./configure \
- --build="${BUILD_TRIPLE}" \
- --host="${TARGET_TRIPLE}" \
- --prefix=/tools/deps \
- --disable-shared \
- ${EXTRA_CONFIGURE}
-
-make -j "${NUM_CPUS}"
-make -j "${NUM_CPUS}" install DESTDIR="${ROOT}/out"
diff --git a/cpython-unix/build-libffi.sh b/cpython-unix/build-libffi.sh
index 25fa721fc..3d0b60ae3 100755
--- a/cpython-unix/build-libffi.sh
+++ b/cpython-unix/build-libffi.sh
@@ -13,366 +13,22 @@ tar -xf "libffi-${LIBFFI_VERSION}.tar.gz"
pushd "libffi-${LIBFFI_VERSION}"
-# Patches needed to fix compilation on aarch64. Will presumably be in libffi
-# 3.4.7 or 3.5.
-
-# Commit f64141ee3f9e455a060bd09e9ab72b6c94653d7c.
+# libffi uses linux/limits.h and linux/types.h for PATH_MAX.
+# Use the standard header so musl builds do not require Linux headers.
patch -p1 <<'EOF'
-diff --git a/src/aarch64/sysv.S b/src/aarch64/sysv.S
-index fdd0e8b..60cfa50 100644
---- a/src/aarch64/sysv.S
-+++ b/src/aarch64/sysv.S
-@@ -68,7 +68,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
- #define BTI_J hint #36
- /*
- * The ELF Notes section needs to indicate if BTI is supported, as the first ELF loaded that doesn't
-- * declare this support disables it for the whole process.
-+ * declare this support disables it for memory region containing the loaded library.
- */
- # define GNU_PROPERTY_AARCH64_BTI (1 << 0) /* Has Branch Target Identification */
- .text
-@@ -527,6 +527,7 @@ L(do_closure):
- #if defined(FFI_EXEC_STATIC_TRAMP)
- .align 4
- CNAME(ffi_closure_SYSV_V_alt):
-+ BTI_C
- /* See the comments above trampoline_code_table. */
- ldr x17, [sp, #8] /* Load closure in x17 */
- add sp, sp, #16 /* Restore the stack */
-@@ -541,6 +542,7 @@ CNAME(ffi_closure_SYSV_V_alt):
-
- .align 4
- CNAME(ffi_closure_SYSV_alt):
-+ BTI_C
- /* See the comments above trampoline_code_table. */
- ldr x17, [sp, #8] /* Load closure in x17 */
- add sp, sp, #16 /* Restore the stack */
-diff --git a/testsuite/Makefile.am b/testsuite/Makefile.am
-index d286cf7..6ba98e1 100644
---- a/testsuite/Makefile.am
-+++ b/testsuite/Makefile.am
-@@ -8,7 +8,7 @@ CLEANFILES = *.exe core* *.log *.sum
-
- EXTRA_DIST = config/default.exp emscripten/build.sh emscripten/conftest.py \
- emscripten/node-tests.sh emscripten/test.html emscripten/test_libffi.py \
-- emscripten/build-tests.sh lib/libffi.exp lib/target-libpath.exp \
-+ emscripten/build-tests.sh lib/libffi.exp lib/target-libpath.exp \
- lib/wrapper.exp libffi.bhaible/Makefile libffi.bhaible/README \
- libffi.bhaible/alignof.h libffi.bhaible/bhaible.exp libffi.bhaible/test-call.c \
- libffi.bhaible/test-callback.c libffi.bhaible/testcases.c libffi.call/align_mixed.c \
-EOF
-
-# Commit 45d284f2d066cc3a080c5be88e51b4d934349797.
-patch -p1 <<'EOF'
-diff --git a/configure.ac b/configure.ac
-index 816bfd6..b35a999 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -189,17 +189,17 @@ AC_CACHE_CHECK([whether compiler supports pointer authentication],
- AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
- #ifdef __clang__
- # if __has_feature(ptrauth_calls)
--# define HAVE_PTRAUTH 1
-+# define HAVE_ARM64E_PTRAUTH 1
- # endif
- #endif
-
--#ifndef HAVE_PTRAUTH
-+#ifndef HAVE_ARM64E_PTRAUTH
- # error Pointer authentication not supported
- #endif
- ]])],[libffi_cv_as_ptrauth=yes],[libffi_cv_as_ptrauth=no])
- ])
- if test "x$libffi_cv_as_ptrauth" = xyes; then
-- AC_DEFINE(HAVE_PTRAUTH, 1,
-+ AC_DEFINE(HAVE_ARM64E_PTRAUTH, 1,
- [Define if your compiler supports pointer authentication.])
- fi
-
-diff --git a/include/ffi_cfi.h b/include/ffi_cfi.h
-index f4c292d..8565663 100644
---- a/include/ffi_cfi.h
-+++ b/include/ffi_cfi.h
-@@ -49,6 +49,7 @@
- # define cfi_personality(enc, exp) .cfi_personality enc, exp
- # define cfi_lsda(enc, exp) .cfi_lsda enc, exp
- # define cfi_escape(...) .cfi_escape __VA_ARGS__
-+# define cfi_window_save .cfi_window_save
-
- #else
-
-@@ -71,6 +72,7 @@
- # define cfi_personality(enc, exp)
- # define cfi_lsda(enc, exp)
- # define cfi_escape(...)
-+# define cfi_window_save
-
- #endif /* HAVE_AS_CFI_PSEUDO_OP */
- #endif /* FFI_CFI_H */
-diff --git a/src/aarch64/ffi.c b/src/aarch64/ffi.c
-index b13738e..964934d 100644
---- a/src/aarch64/ffi.c
-+++ b/src/aarch64/ffi.c
-@@ -63,7 +63,7 @@ struct call_context
- #if FFI_EXEC_TRAMPOLINE_TABLE
-
- #ifdef __MACH__
--#ifdef HAVE_PTRAUTH
-+#ifdef HAVE_ARM64E_PTRAUTH
- #include
- #endif
- #include
-@@ -877,7 +877,7 @@ ffi_prep_closure_loc (ffi_closure *closure,
-
- #if FFI_EXEC_TRAMPOLINE_TABLE
- # ifdef __MACH__
--# ifdef HAVE_PTRAUTH
-+# ifdef HAVE_ARM64E_PTRAUTH
- codeloc = ptrauth_auth_data(codeloc, ptrauth_key_function_pointer, 0);
- # endif
- void **config = (void **)((uint8_t *)codeloc - PAGE_MAX_SIZE);
-diff --git a/src/aarch64/internal.h b/src/aarch64/internal.h
-index b5d102b..c39f9cb 100644
---- a/src/aarch64/internal.h
-+++ b/src/aarch64/internal.h
-@@ -81,20 +81,62 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
- /* Helpers for writing assembly compatible with arm ptr auth */
- #ifdef LIBFFI_ASM
-
--#ifdef HAVE_PTRAUTH
--#define SIGN_LR pacibsp
--#define SIGN_LR_WITH_REG(x) pacib lr, x
--#define AUTH_LR_AND_RET retab
--#define AUTH_LR_WITH_REG(x) autib lr, x
--#define BRANCH_AND_LINK_TO_REG blraaz
--#define BRANCH_TO_REG braaz
--#else
--#define SIGN_LR
--#define SIGN_LR_WITH_REG(x)
--#define AUTH_LR_AND_RET ret
--#define AUTH_LR_WITH_REG(x)
--#define BRANCH_AND_LINK_TO_REG blr
--#define BRANCH_TO_REG br
+diff --git a/src/tramp.c b/src/tramp.c
+--- a/src/tramp.c
++++ b/src/tramp.c
+@@ -53,9 +53,3 @@
+ #include
+-#ifdef __linux__
+-#include
+-#include
-#endif
--
+-#ifdef __CYGWIN__
+ #include
-#endif
-+ #if defined(HAVE_ARM64E_PTRAUTH)
-+ /* ARM64E ABI For Darwin */
-+ #define SIGN_LR pacibsp
-+ #define SIGN_LR_WITH_REG(x) pacib lr, x
-+ #define AUTH_LR_AND_RET retab
-+ #define AUTH_LR_WITH_REG(x) autib lr, x
-+ #define BRANCH_AND_LINK_TO_REG blraaz
-+ #define BRANCH_TO_REG braaz
-+ #define PAC_CFI_WINDOW_SAVE
-+ /* Linux PAC Support */
-+ #elif defined(__ARM_FEATURE_PAC_DEFAULT)
-+ #define GNU_PROPERTY_AARCH64_POINTER_AUTH (1 << 1)
-+ #define PAC_CFI_WINDOW_SAVE cfi_window_save
-+ #define TMP_REG x9
-+ #define BRANCH_TO_REG br
-+ #define BRANCH_AND_LINK_TO_REG blr
-+ #define SIGN_LR_LINUX_ONLY SIGN_LR
-+ /* Which key to sign with? */
-+ #if (__ARM_FEATURE_PAC_DEFAULT & 1) == 1
-+ /* Signed with A-key */
-+ #define SIGN_LR hint #25 /* paciasp */
-+ #define AUTH_LR hint #29 /* autiasp */
-+ #else
-+ /* Signed with B-key */
-+ #define SIGN_LR hint #27 /* pacibsp */
-+ #define AUTH_LR hint #31 /* autibsp */
-+ #endif /* __ARM_FEATURE_PAC_DEFAULT */
-+ #define AUTH_LR_WITH_REG(x) _auth_lr_with_reg x
-+.macro _auth_lr_with_reg modifier
-+ mov TMP_REG, sp
-+ mov sp, \modifier
-+ AUTH_LR
-+ mov sp, TMP_REG
-+.endm
-+ #define SIGN_LR_WITH_REG(x) _sign_lr_with_reg x
-+.macro _sign_lr_with_reg modifier
-+ mov TMP_REG, sp
-+ mov sp, \modifier
-+ SIGN_LR
-+ mov sp, TMP_REG
-+.endm
-+ #define AUTH_LR_AND_RET _auth_lr_and_ret modifier
-+.macro _auth_lr_and_ret modifier
-+ AUTH_LR
-+ ret
-+.endm
-+ #undef TMP_REG
-+
-+ /* No Pointer Auth */
-+ #else
-+ #define SIGN_LR
-+ #define SIGN_LR_WITH_REG(x)
-+ #define AUTH_LR_AND_RET ret
-+ #define AUTH_LR_WITH_REG(x)
-+ #define BRANCH_AND_LINK_TO_REG blr
-+ #define BRANCH_TO_REG br
-+ #define PAC_CFI_WINDOW_SAVE
-+ #endif /* HAVE_ARM64E_PTRAUTH */
-+#endif /* LIBFFI_ASM */
-diff --git a/src/aarch64/sysv.S b/src/aarch64/sysv.S
-index 60cfa50..6a9a561 100644
---- a/src/aarch64/sysv.S
-+++ b/src/aarch64/sysv.S
-@@ -92,27 +92,27 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
- cfi_startproc
- CNAME(ffi_call_SYSV):
- BTI_C
-- /* Sign the lr with x1 since that is where it will be stored */
-+ PAC_CFI_WINDOW_SAVE
-+ /* Sign the lr with x1 since that is the CFA which is the modifier used in auth instructions */
- SIGN_LR_WITH_REG(x1)
-
-- /* Use a stack frame allocated by our caller. */
--#if defined(HAVE_PTRAUTH) && defined(__APPLE__)
-+#if defined(HAVE_ARM64E_PTRAUTH) && defined(__APPLE__)
- /* darwin's libunwind assumes that the cfa is the sp and that's the data
- * used to sign the lr. In order to allow unwinding through this
- * function it is necessary to point the cfa at the signing register.
- */
- cfi_def_cfa(x1, 0);
--#else
-- cfi_def_cfa(x1, 40);
#endif
-+ /* Use a stack frame allocated by our caller. */
- stp x29, x30, [x1]
-+ cfi_def_cfa_register(x1)
-+ cfi_rel_offset (x29, 0)
-+ cfi_rel_offset (x30, 8)
- mov x9, sp
- str x9, [x1, #32]
- mov x29, x1
-- mov sp, x0
- cfi_def_cfa_register(x29)
-- cfi_rel_offset (x29, 0)
-- cfi_rel_offset (x30, 8)
-+ mov sp, x0
-
- mov x9, x2 /* save fn */
- mov x8, x3 /* install structure return */
-@@ -326,6 +326,7 @@ CNAME(ffi_closure_SYSV_V):
- cfi_startproc
- BTI_C
- SIGN_LR
-+ PAC_CFI_WINDOW_SAVE
- stp x29, x30, [sp, #-ffi_closure_SYSV_FS]!
- cfi_adjust_cfa_offset (ffi_closure_SYSV_FS)
- cfi_rel_offset (x29, 0)
-@@ -351,6 +352,7 @@ CNAME(ffi_closure_SYSV_V):
- CNAME(ffi_closure_SYSV):
- BTI_C
- SIGN_LR
-+ PAC_CFI_WINDOW_SAVE
- stp x29, x30, [sp, #-ffi_closure_SYSV_FS]!
- cfi_adjust_cfa_offset (ffi_closure_SYSV_FS)
- cfi_rel_offset (x29, 0)
-@@ -648,6 +650,8 @@ CNAME(ffi_go_closure_SYSV_V):
- cfi_startproc
- CNAME(ffi_go_closure_SYSV):
- BTI_C
-+ SIGN_LR_LINUX_ONLY
-+ PAC_CFI_WINDOW_SAVE
- stp x29, x30, [sp, #-ffi_closure_SYSV_FS]!
- cfi_adjust_cfa_offset (ffi_closure_SYSV_FS)
- cfi_rel_offset (x29, 0)
-diff --git a/src/closures.c b/src/closures.c
-index 67a94a8..02cf78f 100644
---- a/src/closures.c
-+++ b/src/closures.c
-@@ -164,7 +164,7 @@ ffi_tramp_is_present (__attribute__((unused)) void *ptr)
-
- #include
- #include
--#ifdef HAVE_PTRAUTH
-+#ifdef HAVE_ARM64E_PTRAUTH
- #include
- #endif
- #include
-@@ -223,7 +223,7 @@ ffi_trampoline_table_alloc (void)
- /* Remap the trampoline table on top of the placeholder page */
- trampoline_page = config_page + PAGE_MAX_SIZE;
-
--#ifdef HAVE_PTRAUTH
-+#ifdef HAVE_ARM64E_PTRAUTH
- trampoline_page_template = (vm_address_t)(uintptr_t)ptrauth_auth_data((void *)&ffi_closure_trampoline_table_page, ptrauth_key_function_pointer, 0);
- #else
- trampoline_page_template = (vm_address_t)&ffi_closure_trampoline_table_page;
-@@ -268,7 +268,7 @@ ffi_trampoline_table_alloc (void)
- ffi_trampoline_table_entry *entry = &table->free_list_pool[i];
- entry->trampoline =
- (void *) (trampoline_page + (i * FFI_TRAMPOLINE_SIZE));
--#ifdef HAVE_PTRAUTH
-+#ifdef HAVE_ARM64E_PTRAUTH
- entry->trampoline = ptrauth_sign_unauthenticated(entry->trampoline, ptrauth_key_function_pointer, 0);
- #endif
-
-EOF
-
-# Commit 9c9e8368e49804c4f7c35ac9f0d7c1d0d533308b.
-patch -p1 <<'EOF'
-diff --git a/src/aarch64/internal.h b/src/aarch64/internal.h
-index c39f9cb..50fa5c1 100644
---- a/src/aarch64/internal.h
-+++ b/src/aarch64/internal.h
-@@ -88,6 +88,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
- #define AUTH_LR_AND_RET retab
- #define AUTH_LR_WITH_REG(x) autib lr, x
- #define BRANCH_AND_LINK_TO_REG blraaz
-+ #define SIGN_LR_LINUX_ONLY
- #define BRANCH_TO_REG braaz
- #define PAC_CFI_WINDOW_SAVE
- /* Linux PAC Support */
-@@ -136,6 +137,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
- #define AUTH_LR_AND_RET ret
- #define AUTH_LR_WITH_REG(x)
- #define BRANCH_AND_LINK_TO_REG blr
-+ #define SIGN_LR_LINUX_ONLY
- #define BRANCH_TO_REG br
- #define PAC_CFI_WINDOW_SAVE
- #endif /* HAVE_ARM64E_PTRAUTH */
-EOF
-
-# Commit 8308bed5b2423878aa20d7884a99cf2e30b8daf7.
-patch -p1 <<'EOF'
-diff --git a/src/aarch64/sysv.S b/src/aarch64/sysv.S
-index 6a9a561..e83bc65 100644
---- a/src/aarch64/sysv.S
-+++ b/src/aarch64/sysv.S
-@@ -89,8 +89,8 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
- x5 closure
- */
-
-- cfi_startproc
- CNAME(ffi_call_SYSV):
-+ cfi_startproc
- BTI_C
- PAC_CFI_WINDOW_SAVE
- /* Sign the lr with x1 since that is the CFA which is the modifier used in auth instructions */
-@@ -348,8 +348,8 @@ CNAME(ffi_closure_SYSV_V):
- #endif
-
- .align 4
-- cfi_startproc
- CNAME(ffi_closure_SYSV):
-+ cfi_startproc
- BTI_C
- SIGN_LR
- PAC_CFI_WINDOW_SAVE
-@@ -647,8 +647,8 @@ CNAME(ffi_go_closure_SYSV_V):
- #endif
-
- .align 4
-- cfi_startproc
- CNAME(ffi_go_closure_SYSV):
-+ cfi_startproc
- BTI_C
- SIGN_LR_LINUX_ONLY
- PAC_CFI_WINDOW_SAVE
EOF
EXTRA_CONFIGURE=
diff --git a/cpython-unix/build-linux-uapi.sh b/cpython-unix/build-linux-uapi.sh
new file mode 100755
index 000000000..1d04f0544
--- /dev/null
+++ b/cpython-unix/build-linux-uapi.sh
@@ -0,0 +1,22 @@
+#!/usr/bin/env bash
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+set -ex
+
+ROOT=$(pwd)
+
+export PATH=${TOOLS_PATH}/${TOOLCHAIN}/bin:${TOOLS_PATH}/host/bin:$PATH
+
+archives=("${ROOT}"/linux-libc-dev_*.deb)
+if [[ ${#archives[@]} -ne 1 || ! -f "${archives[0]}" ]]; then
+ echo "expected exactly one linux-libc-dev package"
+ exit 1
+fi
+
+mkdir -p "${ROOT}/linux-uapi-package" "${ROOT}/out/tools/deps/linux-uapi"
+pushd "${ROOT}/linux-uapi-package"
+ar x "${archives[0]}" data.tar.xz
+tar -xf data.tar.xz -C "${ROOT}/out/tools/deps/linux-uapi"
+popd
diff --git a/cpython-unix/build-main.py b/cpython-unix/build-main.py
index 0e1f6a7cf..e4d9fe9a2 100755
--- a/cpython-unix/build-main.py
+++ b/cpython-unix/build-main.py
@@ -142,7 +142,14 @@ def main():
effective_host_platform = host_platform
if building_linux_from_macos:
if host_platform == "macos_arm64":
- effective_host_platform = "linux_aarch64"
+ if target_triple.startswith("aarch64"):
+ effective_host_platform = "linux_aarch64"
+ elif target_triple.startswith("x86_64"):
+ effective_host_platform = "linux_x86_64"
+ else:
+ raise Exception(
+ f"unsupported macOS cross-compile: {host_platform} -> {target_triple}"
+ )
else:
raise Exception(f"Unhandled macOS platform: {host_platform}")
print(
diff --git a/cpython-unix/build-musl.sh b/cpython-unix/build-musl.sh
index ebaf7b8cf..095733cb5 100755
--- a/cpython-unix/build-musl.sh
+++ b/cpython-unix/build-musl.sh
@@ -167,4 +167,17 @@ CFLAGS="${CFLAGS}" CPPFLAGS="${CPPFLAGS}" ./configure \
make -j "$(nproc)"
make -j "$(nproc)" install DESTDIR=/build/out
+if [[ $STATIC && $(clang -dumpmachine) == aarch64-* ]]; then
+ # musl's linker wrapper appends libc after other arguments, including
+ # compiler-rt supplied through the target compiler flags. On aarch64,
+ # static libc uses compiler runtime builtins such as __multf3. GNU ld
+ # searches archives left to right and does not revisit earlier archives,
+ # so append compiler-rt again after libc to resolve those symbols.
+ # TODO(jjh): Remove this adjustment when lld is available; it can resolve
+ # references to previously encountered archives.
+ sed -i \
+ 's/"$@" -lc -dynamic-linker/"$@" -lc "$($cc --rtlib=compiler-rt -print-libgcc-file-name)" -dynamic-linker/' \
+ /build/out/tools/host/bin/ld.musl-clang
+fi
+
popd
diff --git a/cpython-unix/build-patchelf.sh b/cpython-unix/build-patchelf.sh
index c21663303..1acf6c559 100755
--- a/cpython-unix/build-patchelf.sh
+++ b/cpython-unix/build-patchelf.sh
@@ -13,6 +13,37 @@ tar -xf "patchelf-${PATCHELF_VERSION}.tar.bz2"
pushd patchelf-0.13.1.20211127.72b6d44
+# TODO: Drop this patch once patchelf is updated to 0.14.0 or newer,
+# which includes native LoongArch64 support.
+# See: https://github.com/astral-sh/python-build-standalone/issues/1106
+if [[ "${TARGET_TRIPLE}" = loongarch64* ]]; then
+ patch -p1 << 'EOF'
+diff --git a/src/patchelf.cc b/src/patchelf.cc
+index 2b7ec8b9..06f41c6f 100644
+--- a/src/patchelf.cc
++++ b/src/patchelf.cc
+@@ -57,6 +57,10 @@ static int forcedPageSize = DEFAULT_PAGESIZE;
+ static int forcedPageSize = -1;
+ #endif
+
++#ifndef EM_LOONGARCH
++#define EM_LOONGARCH 258
++#endif
++
+ using FileContents = std::shared_ptr>;
+
+ #define ElfFileParams class Elf_Ehdr, class Elf_Phdr, class Elf_Shdr, class Elf_Addr, class Elf_Off, class Elf_Dyn, class Elf_Sym, class Elf_Verneed, class Elf_Versym
+@@ -460,6 +464,7 @@ unsigned int ElfFile::getPageSize() const
+ case EM_PPC64:
+ case EM_AARCH64:
+ case EM_TILEGX:
++ case EM_LOONGARCH:
+ return 0x10000;
+ default:
+ return 0x1000;
+EOF
+fi
+
CC="${HOST_CC}" CXX="${HOST_CXX}" CFLAGS="${EXTRA_HOST_CFLAGS} -fPIC" CPPFLAGS="${EXTRA_HOST_CFLAGS} -fPIC" \
./configure \
--build="${BUILD_TRIPLE}" \
diff --git a/cpython-unix/build-pkgconf.sh b/cpython-unix/build-pkgconf.sh
new file mode 100755
index 000000000..c15ae88c7
--- /dev/null
+++ b/cpython-unix/build-pkgconf.sh
@@ -0,0 +1,29 @@
+#!/usr/bin/env bash
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+set -ex
+
+ROOT=$(pwd)
+
+export PATH=${TOOLS_PATH}/${TOOLCHAIN}/bin:${TOOLS_PATH}/host/bin:$PATH
+
+tar -xf "pkgconf-${PKGCONF_VERSION}.tar.xz"
+
+pushd "pkgconf-${PKGCONF_VERSION}"
+
+CC="${HOST_CC}" CXX="${HOST_CXX}" CFLAGS="${EXTRA_HOST_CFLAGS} -fPIC" CPPFLAGS="${EXTRA_HOST_CFLAGS} -fPIC" LDFLAGS="${EXTRA_HOST_LDFLAGS}" ./configure \
+ --build="${BUILD_TRIPLE}" \
+ --prefix=/tools/host \
+ --disable-shared \
+ --disable-dependency-tracking \
+ --with-system-libdir=/usr/lib \
+ --with-system-includedir=/usr/include
+
+make -j "${NUM_CPUS}"
+make -j "${NUM_CPUS}" install DESTDIR="${ROOT}/out"
+
+ln -s pkgconf "${ROOT}/out/tools/host/bin/pkg-config"
+
+"${ROOT}/out/tools/host/bin/pkg-config" --version
diff --git a/cpython-unix/build-tcl.sh b/cpython-unix/build-tcl.sh
index 140aaeb76..3ed1c02f0 100755
--- a/cpython-unix/build-tcl.sh
+++ b/cpython-unix/build-tcl.sh
@@ -79,6 +79,28 @@ fi
# An alternative is to include these when calling ./configure AND make
export CFLAGS LDFLAGS
export CPPFLAGS="${CFLAGS}"
+# Tcl's Thread package leaves this unset when configuring Tcl 8 compatibility.
+# Initialize it so that package configure does not require an installed Tcl 9.
+export ZIPFS_BUILD=0
+
+# macOS uses SDK zlib, which provides -lz but no zlib.pc. Remove Tcl's
+# pkg-config requirement while retaining its Libs.private: -lz linkage.
+if [[ "${PYBUILD_PLATFORM}" = macos* ]]; then
+ patch -p1 <<'EOF'
+diff --git a/tcl.pc.in b/tcl.pc.in
+--- a/tcl.pc.in
++++ b/tcl.pc.in
+@@ -9,7 +9,7 @@ Name: Tool Command Language
+ Description: Tcl is a powerful, easy-to-learn dynamic programming language, suitable for a wide range of uses.
+ URL: https://www.tcl-lang.org/
+ Version: @TCL_VERSION@@TCL_PATCH_LEVEL@
+-Requires.private: @TCL_PC_REQUIRES_PRIVATE@ zlib >= 1.2.3
++Requires.private: @TCL_PC_REQUIRES_PRIVATE@
+ Libs: -L${libdir} @TCL_LIB_FLAG@ @TCL_STUB_LIB_FLAG@
+ Libs.private: @TCL_LIBS@
+ Cflags: -I${includedir} @TCL_PC_CFLAGS@
+EOF
+fi
./configure \
--build="${BUILD_TRIPLE}" \
diff --git a/cpython-unix/build-tk.sh b/cpython-unix/build-tk.sh
index d90f47ce3..c60aab599 100755
--- a/cpython-unix/build-tk.sh
+++ b/cpython-unix/build-tk.sh
@@ -31,6 +31,22 @@ if [[ "${PYBUILD_PLATFORM}" = macos* ]]; then
else
LDFLAGS="${LDFLAGS} -Wl,--exclude-libs,ALL"
EXTRA_CONFIGURE_FLAGS="--x-includes=${TOOLS_PATH}/deps/include --x-libraries=${TOOLS_PATH}/deps/lib"
+
+ # Tk's pkg-config metadata omits its private X11 dependency. Add it so
+ # pkg-config --static also resolves X11's xcb and Xau dependencies.
+ patch -p1 <<'EOF'
+diff --git a/tk.pc.in b/tk.pc.in
+--- a/tk.pc.in
++++ b/tk.pc.in
+@@ -10,6 +10,7 @@ Description: Tk is a cross-platform graphical user interface toolkit, the stand
+ URL: https://www.tcl-lang.org/
+ Version: @TK_VERSION@@TK_PATCH_LEVEL@
+ Requires: tcl >= 9.0
++Requires.private: x11
+ Libs: -L${libdir} @TK_LIB_FLAG@ @TK_STUB_LIB_FLAG@
+ Libs.private: @XFT_LIBS@ @XLIBSW@
+ Cflags: -I${includedir}
+EOF
fi
CFLAGS="${CFLAGS}" CPPFLAGS="${CFLAGS}" LDFLAGS="${LDFLAGS}" ./configure \
diff --git a/cpython-unix/build-zlib.sh b/cpython-unix/build-zlib.sh
index 778c30302..adfbfd277 100755
--- a/cpython-unix/build-zlib.sh
+++ b/cpython-unix/build-zlib.sh
@@ -13,8 +13,12 @@ tar -xf "zlib-${ZLIB_VERSION}.tar.gz"
pushd "zlib-${ZLIB_VERSION}"
+# --disable-crcvx is needed to build for s390x with -march=z10
+# SIMD instructions require z13+
+# See https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1132458
CFLAGS="${EXTRA_TARGET_CFLAGS} -fPIC" LDFLAGS="${EXTRA_TARGET_LDFLAGS}" ./configure \
--prefix=/tools/deps \
+ --disable-crcvx \
--static
make -j "${NUM_CPUS}"
make -j "${NUM_CPUS}" install DESTDIR="${ROOT}/out"
diff --git a/cpython-unix/build.Dockerfile b/cpython-unix/build.Dockerfile
index 5a5dcad8a..e10c0f02d 100644
--- a/cpython-unix/build.Dockerfile
+++ b/cpython-unix/build.Dockerfile
@@ -7,12 +7,14 @@
# Compression packages are needed to extract archives.
#
# Various other build tools are needed for various building.
+# Note linux-headers is installed to source a missing UAPI header, see below
RUN ulimit -n 10000 && apt-get install \
bzip2 \
ca-certificates \
curl \
file \
libc6-dev \
+ linux-headers-3.16.0-6-common \
libffi-dev \
make \
patch \
@@ -23,3 +25,8 @@ RUN ulimit -n 10000 && apt-get install \
unzip \
zip \
zlib1g-dev
+
+# Debian Jessie's linux-libc-dev is missing the vm_sockets header due to a typo
+# see https://lists.openwall.net/netdev/2014/12/01/2
+RUN install -m 0644 /usr/src/linux-headers-3.16.0-6-common/include/uapi/linux/vm_sockets.h \
+ /usr/include/linux/vm_sockets.h
\ No newline at end of file
diff --git a/cpython-unix/build.py b/cpython-unix/build.py
index 0615b06e3..391c3e5f8 100755
--- a/cpython-unix/build.py
+++ b/cpython-unix/build.py
@@ -26,7 +26,12 @@
meets_python_minimum_version,
parse_setup_line,
)
-from pythonbuild.docker import build_docker_image, get_image, write_dockerfiles
+from pythonbuild.docker import (
+ build_docker_image,
+ docker_platform_from_host_platform,
+ get_image,
+ write_dockerfiles,
+)
from pythonbuild.downloads import DOWNLOADS
from pythonbuild.logging import log, set_logger
from pythonbuild.utils import (
@@ -34,6 +39,7 @@
add_licenses_to_extension_entry,
clang_toolchain,
create_tar_from_directory,
+ current_host_platform,
download_entry,
get_target_settings,
get_targets,
@@ -94,27 +100,41 @@ def add_target_env(env, build_platform, target_triple, build_env, build_options)
extra_host_cflags = []
extra_host_ldflags = []
- # Add compiler-rt for aarch64-musl to resolve missing builtins
+ # aarch64 libgcc is built against glibc and initializes LSE atomics using
+ # __getauxval, which musl does not export.
+ # Use compiler-rt instead, which uses the public getauxval interface.
if target_triple == "aarch64-unknown-linux-musl":
extra_target_cflags.append("--rtlib=compiler-rt")
extra_target_ldflags.append("--rtlib=compiler-rt")
if build_platform.startswith("linux_"):
- machine = platform.machine()
+ # autoconf is not aware of microarch triples. Normalize those out:
+ # we force targeting via -march CFLAG.
+ env["TARGET_TRIPLE"] = (
+ target_triple.replace("x86_64_v2-", "x86_64-")
+ .replace("x86_64_v3-", "x86_64-")
+ .replace("x86_64_v4-", "x86_64-")
+ )
- # arm64 allows building for Linux on a macOS host using Docker
- if machine == "aarch64" or machine == "arm64":
- env["BUILD_TRIPLE"] = "aarch64-unknown-linux-gnu"
- env["TARGET_TRIPLE"] = target_triple
- elif machine == "x86_64":
- env["BUILD_TRIPLE"] = "x86_64-unknown-linux-gnu"
- env["TARGET_TRIPLE"] = (
- target_triple.replace("x86_64_v2-", "x86_64-")
- .replace("x86_64_v3-", "x86_64-")
- .replace("x86_64_v4-", "x86_64-")
- )
+ # On macOS, we support building Linux in a virtualized container that
+ # always matches the target platform. Set build/host triple to whatever
+ # we're building.
+ #
+ # Note: we always use the *-gnu triple otherwise autoconf can have
+ # trouble reasoning about cross-compiling since its detected triple from
+ # our build environment is always GNU based.
+ if current_host_platform().startswith("macos_"):
+ env["BUILD_TRIPLE"] = env["TARGET_TRIPLE"].replace("-musl", "-gnu")
else:
- raise Exception("unhandled Linux machine value: %s" % machine)
+ # Otherwise assume the container environment matches the machine
+ # type of the current process.
+ host_machine = platform.machine()
+ if host_machine == "aarch64" or host_machine == "arm64":
+ env["BUILD_TRIPLE"] = "aarch64-unknown-linux-gnu"
+ elif host_machine == "x86_64":
+ env["BUILD_TRIPLE"] = "x86_64-unknown-linux-gnu"
+ else:
+ raise Exception("unhandled Linux machine value: %s" % host_machine)
# This will make x86_64_v2, etc count as cross-compiling. This is
# semantically correct, since the current machine may not support
@@ -210,6 +230,11 @@ def add_target_env(env, build_platform, target_triple, build_env, build_options)
else:
raise Exception("unhandled build platform: %s" % build_platform)
+ if "debug" in build_options and "-linux-" in target_triple:
+ # Fortification requires optimization and is ineffective with debug's -O0. Keep this last
+ # so it overrides any configured fortification level.
+ extra_target_cflags.append("-U_FORTIFY_SOURCE")
+
env["EXTRA_HOST_CFLAGS"] = " ".join(extra_host_cflags)
env["EXTRA_HOST_LDFLAGS"] = " ".join(extra_host_ldflags)
env["EXTRA_TARGET_CFLAGS"] = " ".join(extra_target_cflags)
@@ -842,6 +867,10 @@ def build_cpython(
"TOOLCHAIN": "clang-%s" % host_platform,
}
+ # Use modern kernel UAPI headers without changing the target's libc.
+ if linux_uapi_include_arch := settings.get("linux_uapi_include_arch"):
+ env["LINUX_UAPI_INCLUDE_ARCH"] = linux_uapi_include_arch
+
# Set environment variables allowing convenient testing for Python
# version ranges.
for v in ("3.10", "3.11", "3.12", "3.13", "3.14", "3.15"):
@@ -952,8 +981,8 @@ def build_cpython(
python_info["tcl_library_path"] = "install/lib"
python_info["tcl_library_paths"] = [
- "itcl4.3.5",
- "thread3.0.4",
+ "itcl4.3.8",
+ "thread3.0.6",
"tk9.0",
]
@@ -990,16 +1019,6 @@ def main():
DOWNLOADS_PATH.mkdir(exist_ok=True)
(BUILD / "logs").mkdir(exist_ok=True)
- if os.environ.get("PYBUILD_NO_DOCKER"):
- client = None
- else:
- try:
- client = docker.from_env(timeout=600)
- client.ping()
- except Exception as e:
- print("unable to connect to Docker: %s" % e, file=sys.stderr)
- return 1
-
# Note these arguments must be synced with `build-main.py`
parser = argparse.ArgumentParser()
parser.add_argument(
@@ -1061,6 +1080,17 @@ def main():
settings = get_target_settings(TARGETS_CONFIG, target_triple)
+ if os.environ.get("PYBUILD_NO_DOCKER"):
+ client = None
+ else:
+ try:
+ client = docker.from_env(timeout=600)
+ client.ping()
+ client._pbs_platform = docker_platform_from_host_platform(host_platform)
+ except Exception as e:
+ print("unable to connect to Docker: %s" % e, file=sys.stderr)
+ return 1
+
if args.action == "dockerfiles":
log_name = "dockerfiles"
elif args.action == "makefiles":
@@ -1166,14 +1196,15 @@ def main():
"bdb",
"bzip2",
"expat",
- "libffi-3.3",
"libffi",
"libpthread-stubs",
+ "linux-uapi",
"m4",
"mpdecimal",
"ncurses",
"openssl-3.5",
"patchelf",
+ "pkgconf",
"sqlite",
"tcl",
"uuid",
@@ -1184,7 +1215,7 @@ def main():
"zlib",
"zstd",
):
- tools_path = "host" if action in ("m4", "patchelf") else "deps"
+ tools_path = "host" if action in ("m4", "patchelf", "pkgconf") else "deps"
extra_archives = {
"tcl": {"zlib"},
}.get(action)
diff --git a/cpython-unix/extension-modules.yml b/cpython-unix/extension-modules.yml
index 524c59b80..f7bf8748b 100644
--- a/cpython-unix/extension-modules.yml
+++ b/cpython-unix/extension-modules.yml
@@ -442,6 +442,8 @@ _remote_debugging:
- _remote_debugging/code_objects.c
- _remote_debugging/frame_cache.c
- _remote_debugging/frames.c
+ - _remote_debugging/gc_stats.c
+ - _remote_debugging/interpreters.c
- _remote_debugging/module.c
- _remote_debugging/object_reading.c
- _remote_debugging/subprocess.c
@@ -720,6 +722,21 @@ _testcapi:
maximum-python-version: "3.12"
- source: _testcapi/watchers.c
minimum-python-version: "3.12"
+ - source: _testcapi/weakref.c
+ minimum-python-version: "3.13"
+
+_testclinic:
+ disabled-targets:
+ - .*
+ sources:
+ - _testclinic.c
+
+_testclinic_limited:
+ minimum-python-version: '3.13'
+ disabled-targets:
+ - .*
+ sources:
+ - _testclinic_limited.c
_testexternalinspection:
minimum-python-version: '3.13'
@@ -784,12 +801,20 @@ _testlimitedcapi:
- _testlimitedcapi/unicode.c
- _testlimitedcapi/vectorcall_limited.c
sources-conditional:
+ - source: _testlimitedcapi/capsule.c
+ minimum-python-version: "3.13"
- source: _testlimitedcapi/codec.c
minimum-python-version: "3.14"
+ - source: _testlimitedcapi/run.c
+ minimum-python-version: "3.13"
+ - source: _testlimitedcapi/slots.c
+ minimum-python-version: "3.15"
- source: _testlimitedcapi/threadstate.c
minimum-python-version: "3.15"
- source: _testlimitedcapi/version.c
minimum-python-version: "3.14"
+ - source: _testlimitedcapi/weakref.c
+ minimum-python-version: "3.13"
_testmultiphase:
minimum-python-version: '3.10'
@@ -1092,6 +1117,13 @@ xxlimited_35:
disabled-targets:
- .*
+xxlimited_3_13:
+ minimum-python-version: '3.15'
+ disabled-targets:
+ - .*
+ sources:
+ - xxlimited_3_13.c
+
xxsubtype:
setup-enabled-conditional:
- enabled: true
diff --git a/cpython-unix/patch-checksharedmods-disable-3.15.patch b/cpython-unix/patch-checksharedmods-disable-3.15.patch
deleted file mode 100644
index 18952a030..000000000
--- a/cpython-unix/patch-checksharedmods-disable-3.15.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-diff --git a/Makefile.pre.in b/Makefile.pre.in
-index a6beb96d12a..bb4e1ecd49b 100644
---- a/Makefile.pre.in
-+++ b/Makefile.pre.in
-@@ -1610,7 +1610,7 @@ checksharedmods: sharedmods $(PYTHON_FOR_BUILD_DEPS) $(BUILDPYTHON)
- else \
- $(RUNSHARED) $(PYTHON_FOR_BUILD) $(srcdir)/Tools/build/check_extension_modules.py --generate-missing-stdlib-info; \
- fi
-- @$(RUNSHARED) $(PYTHON_FOR_BUILD) $(srcdir)/Tools/build/check_extension_modules.py
-+ @echo "module checking disabled"
-
- .PHONY: rundsymutil
- rundsymutil: sharedmods $(PYTHON_FOR_BUILD_DEPS) $(BUILDPYTHON)
diff --git a/cpython-unix/patch-checksharedmods-disable.patch b/cpython-unix/patch-checksharedmods-disable.patch
deleted file mode 100644
index 52b52a2e8..000000000
--- a/cpython-unix/patch-checksharedmods-disable.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-diff --git a/Makefile.pre.in b/Makefile.pre.in
-index 09ceccda1d..6a3a84976e 100644
---- a/Makefile.pre.in
-+++ b/Makefile.pre.in
-@@ -990,7 +990,7 @@ sharedmods: $(SHAREDMODS) pybuilddir.txt
- # dependency on BUILDPYTHON ensures that the target is run last
- .PHONY: checksharedmods
- checksharedmods: sharedmods $(PYTHON_FOR_BUILD_DEPS) $(BUILDPYTHON)
-- @$(RUNSHARED) $(PYTHON_FOR_BUILD) $(srcdir)/Tools/build/check_extension_modules.py
-+ @echo "module checking disabled"
-
- .PHONY: rundsymutil
- rundsymutil: sharedmods $(PYTHON_FOR_BUILD_DEPS) $(BUILDPYTHON)
diff --git a/cpython-unix/patch-configure-bolt-apply-flags-128514.patch b/cpython-unix/patch-configure-bolt-apply-flags-128514.patch
deleted file mode 100644
index e9d864321..000000000
--- a/cpython-unix/patch-configure-bolt-apply-flags-128514.patch
+++ /dev/null
@@ -1,14 +0,0 @@
-diff --git a/configure.ac b/configure.ac
-index ee034e5a962..f1a69b7d4a7 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -2183,8 +2183,9 @@ then
- [m4_normalize("
- -update-debug-sections
- -reorder-blocks=ext-tsp
- -reorder-functions=cdsort
- -split-functions
-+ -split-strategy=cdsplit
- -icf=1
- -inline-all
- -split-eh
diff --git a/cpython-unix/patch-configure-bolt-icf-safe.patch b/cpython-unix/patch-configure-bolt-icf-safe.patch
deleted file mode 100644
index 1cc41adcb..000000000
--- a/cpython-unix/patch-configure-bolt-icf-safe.patch
+++ /dev/null
@@ -1,84 +0,0 @@
-From 91fc5ae4a5a66a03931f8cd383abd2aa062bb0e9 Mon Sep 17 00:00:00 2001
-From: Geoffrey Thomas
-Date: Sat, 24 May 2025 19:04:09 -0400
-Subject: [PATCH 1/1] Use only safe identical code folding with BOLT
-
-"Identical code folding" (ICF) is the feature of an optimizer to find that two
-functions have the same code and that they can therefore be deduplicated
-in the binary. While this is usually safe, it can cause observable
-behavior differences if the program relies on the fact that the two
-functions have different addresses.
-
-CPython relies on this in (at least) Objects/typeobject.c, which defines
-two functions wrap_binaryfunc() and wrap_binaryfunc_l() with the same
-implementation, and stores their addresses in the slotdefs array. If
-these two functions have the same address, update_one_slot() in that
-file will fill in slots it shouldn't, causing, for instances,
-classes defined in Python that inherit from some built-in types to
-misbehave.
-
-As of LLVM 20 (llvm/llvm-project#116275), BOLT has a "safe ICF" mode,
-where it looks to see if there are any uses of a function symbol outside
-function calls (e.g., relocations in data sections) and skips ICF on
-such functions. The intent is that this avoids observable behavior
-differences but still saves storage as much as possible.
-
-This version is about two months old at the time of writing. To support
-older LLVM versions, we have to turn off ICF entirely.
-
-This problem was previously noticed for Windows/MSVC in #53093 (and
-again in #24098), where the default behavior of PGO is to enable ICF
-(which they expand to "identical COMDAT folding") and we had to turn it
-off.
----
- configure | 50 +++++++++++++++++++++++++++++++++++++++++++++++++-
- configure.ac | 25 ++++++++++++++++++++++++-
- 2 files changed, 73 insertions(+), 2 deletions(-)
-
-diff --git a/configure.ac b/configure.ac
-index 8d939f07505..25737e3f9d6 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -2129,6 +2129,29 @@ if test "$Py_BOLT" = 'true' ; then
- else
- AC_MSG_ERROR([merge-fdata is required for a --enable-bolt build but could not be found.])
- fi
-+
-+ py_bolt_icf_flag="-icf=safe"
-+ AC_CACHE_CHECK(
-+ [whether ${LLVM_BOLT} supports safe identical code folding],
-+ [py_cv_bolt_icf_safe],
-+ [
-+ saved_cflags="$CFLAGS"
-+ saved_ldflags="$LDFLAGS"
-+ CFLAGS="$CFLAGS_NODIST"
-+ LDFLAGS="$LDFLAGS_NODIST"
-+ AC_LINK_IFELSE(
-+ [AC_LANG_PROGRAM([[]], [[]])],
-+ [py_cv_bolt_icf_safe=no
-+ ${LLVM_BOLT} -icf=safe -o conftest.bolt conftest$EXEEXT >&AS_MESSAGE_LOG_FD 2>&1 dnl
-+ && py_cv_bolt_icf_safe=yes],
-+ [AC_MSG_FAILURE([could not compile empty test program])])
-+ CFLAGS="$saved_cflags"
-+ LDFLAGS="$saved_ldflags"
-+ ]
-+ )
-+ if test "$py_cv_bolt_icf_safe" = no; then
-+ py_bolt_icf_flag=""
-+ fi
- fi
-
- dnl Enable BOLT of libpython if built.
-@@ -2184,7 +2207,7 @@ then
- -reorder-blocks=ext-tsp
- -reorder-functions=cdsort
- -split-functions
- -split-strategy=cdsplit
-- -icf=1
-+ ${py_bolt_icf_flag}
- -inline-all
- -split-eh
- -reorder-functions-use-hot-size
---
-2.39.5 (Apple Git-154)
-
diff --git a/cpython-unix/patch-configure-bolt-remove-use-gnu-stack.patch b/cpython-unix/patch-configure-bolt-remove-use-gnu-stack.patch
deleted file mode 100644
index 7cd091380..000000000
--- a/cpython-unix/patch-configure-bolt-remove-use-gnu-stack.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff --git a/configure.ac b/configure.ac
-index a1f4a567095..03264f87d4c 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -2205,7 +2205,6 @@ then
- -inline-ap
- -indirect-call-promotion=all
- -dyno-stats
-- -use-gnu-stack
- -frame-opt=hot
- ")]
- )
diff --git a/cpython-unix/patch-configure-bolt-skip-funcs-3.15.patch b/cpython-unix/patch-configure-bolt-skip-funcs-3.15.patch
deleted file mode 100644
index df3d5a2b2..000000000
--- a/cpython-unix/patch-configure-bolt-skip-funcs-3.15.patch
+++ /dev/null
@@ -1,18 +0,0 @@
-diff --git a/configure.ac b/configure.ac
-index a059a07bec2..92a7ff8d54c 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -2167,11 +2167,8 @@ then
- [m4_normalize("
- [-update-debug-sections]
-
-- dnl At least LLVM 19.x doesn't support computed gotos in PIC compiled code.
-- dnl Exclude functions containing computed gotos.
-- dnl TODO this may be fixed in LLVM 20.x via https://github.com/llvm/llvm-project/pull/120267.
-- dnl GCC's LTO creates .lto_priv.0 clones of these functions.
-- [-skip-funcs=_PyEval_EvalFrameDefault,sre_ucs1_match/1,sre_ucs2_match/1,sre_ucs4_match/1,sre_ucs1_match.lto_priv.0/1,sre_ucs2_match.lto_priv.0/1,sre_ucs4_match.lto_priv.0/1]
-+ dnl LLVM on at least 20.1.0 crashes on this symbol. Work around.
-+ [-skip-funcs=RC4_options/1]
- ")]
- )
- fi
diff --git a/cpython-unix/patch-configure-bolt-skip-funcs.patch b/cpython-unix/patch-configure-bolt-skip-funcs.patch
deleted file mode 100644
index afc8dd95f..000000000
--- a/cpython-unix/patch-configure-bolt-skip-funcs.patch
+++ /dev/null
@@ -1,17 +0,0 @@
-diff --git a/configure.ac b/configure.ac
-index 3fcb18922c5..2df614a3063 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -2227,10 +2227,8 @@ then
- [m4_normalize("
- [-update-debug-sections]
-
-- dnl At least LLVM 19.x doesn't support computed gotos in PIC compiled code.
-- dnl Exclude functions containing computed gotos.
-- dnl TODO this may be fixed in LLVM 20.x via https://github.com/llvm/llvm-project/pull/120267.
-- [-skip-funcs=_PyEval_EvalFrameDefault,sre_ucs1_match/1,sre_ucs2_match/1,sre_ucs4_match/1]
-+ dnl LLVM on at least 20.1.0 crashes on this symbol. Work around.
-+ [-skip-funcs=RC4_options/1]
- ")]
- )
- fi
diff --git a/cpython-unix/patch-configure-disable-stdlib-mod-3.12.patch b/cpython-unix/patch-configure-disable-stdlib-mod-3.12.patch
deleted file mode 100644
index 675c31071..000000000
--- a/cpython-unix/patch-configure-disable-stdlib-mod-3.12.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-diff --git a/configure.ac b/configure.ac
-index a284a118f02..7e536c41fda 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -7859,11 +7859,7 @@ AC_DEFUN([PY_STDLIB_MOD], [
- m4_pushdef([modcond], [MODULE_]m4_toupper([$1]))dnl
- m4_pushdef([modstate], [py_cv_module_$1])dnl
- dnl Check if module has been disabled by PY_STDLIB_MOD_SET_NA()
-- AS_IF([test "$modstate" != "n/a"], [
-- AS_IF([m4_ifblank([$2], [true], [$2])],
-- [AS_IF([m4_ifblank([$3], [true], [$3])], [modstate=yes], [modstate=missing])],
-- [modstate=disabled])
-- ])
-+ AS_IF([test "$modstate" != "n/a"], [modstate=disabled])
- _MODULE_BLOCK_ADD(modcond[_STATE], [$modstate])
- AS_VAR_IF([modstate], [yes], [
- m4_ifblank([$4], [], [_MODULE_BLOCK_ADD([MODULE_]m4_toupper([$1])[_CFLAGS], [$4])])
-@@ -7883,7 +7879,7 @@ AC_DEFUN([PY_STDLIB_MOD_SIMPLE], [
- m4_pushdef([modcond], [MODULE_]m4_toupper([$1]))dnl
- m4_pushdef([modstate], [py_cv_module_$1])dnl
- dnl Check if module has been disabled by PY_STDLIB_MOD_SET_NA()
-- AS_IF([test "$modstate" != "n/a"], [modstate=yes])
-+ AS_IF([test "$modstate" != "n/a"], [modstate=disabled])
- AM_CONDITIONAL(modcond, [test "$modstate" = yes])
- _MODULE_BLOCK_ADD(modcond[_STATE], [$modstate])
- AS_VAR_IF([modstate], [yes], [
diff --git a/cpython-unix/patch-getrandom-use-nr-3.12.patch b/cpython-unix/patch-getrandom-use-nr-3.12.patch
new file mode 100644
index 000000000..0f944052f
--- /dev/null
+++ b/cpython-unix/patch-getrandom-use-nr-3.12.patch
@@ -0,0 +1,21 @@
+diff --git a/configure.ac b/configure.ac
+--- a/configure.ac
++++ b/configure.ac
+@@ -6990 +6990 @@
+- (void)syscall(SYS_getrandom, buffer, buflen, flags);
++ (void)syscall(__NR_getrandom, buffer, buflen, flags);
+diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
+--- a/Modules/posixmodule.c
++++ b/Modules/posixmodule.c
+@@ -15684 +15684 @@
+- n = syscall(SYS_getrandom,
++ n = syscall(__NR_getrandom,
+diff --git a/Python/bootstrap_hash.c b/Python/bootstrap_hash.c
+--- a/Python/bootstrap_hash.c
++++ b/Python/bootstrap_hash.c
+@@ -129 +129 @@
+- n = syscall(SYS_getrandom, dest, n, flags);
++ n = syscall(__NR_getrandom, dest, n, flags);
+@@ -133 +133 @@
+- n = syscall(SYS_getrandom, dest, n, flags);
++ n = syscall(__NR_getrandom, dest, n, flags);
diff --git a/cpython-unix/patch-getrandom-use-nr-3.14.patch b/cpython-unix/patch-getrandom-use-nr-3.14.patch
new file mode 100644
index 000000000..bf64922ed
--- /dev/null
+++ b/cpython-unix/patch-getrandom-use-nr-3.14.patch
@@ -0,0 +1,24 @@
+diff --git a/configure.ac b/configure.ac
+--- a/configure.ac
++++ b/configure.ac
+@@ -7263 +7263 @@
+- (void)syscall(SYS_getrandom, buffer, buflen, flags);
++ (void)syscall(__NR_getrandom, buffer, buflen, flags);
+diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
+--- a/Modules/posixmodule.c
++++ b/Modules/posixmodule.c
+@@ -16559 +16559 @@
+- n = syscall(SYS_getrandom,
++ n = syscall(__NR_getrandom,
+diff --git a/Python/bootstrap_hash.c b/Python/bootstrap_hash.c
+--- a/Python/bootstrap_hash.c
++++ b/Python/bootstrap_hash.c
+@@ -25 +25 @@
+-# include // SYS_getrandom
++# include // __NR_getrandom
+@@ -133 +133 @@
+- n = syscall(SYS_getrandom, dest, n, flags);
++ n = syscall(__NR_getrandom, dest, n, flags);
+@@ -137 +137 @@
+- n = syscall(SYS_getrandom, dest, n, flags);
++ n = syscall(__NR_getrandom, dest, n, flags);
diff --git a/cpython-unix/patch-getrandom-use-nr-3.15.patch b/cpython-unix/patch-getrandom-use-nr-3.15.patch
new file mode 100644
index 000000000..778f6d79b
--- /dev/null
+++ b/cpython-unix/patch-getrandom-use-nr-3.15.patch
@@ -0,0 +1,24 @@
+diff --git a/configure.ac b/configure.ac
+--- a/configure.ac
++++ b/configure.ac
+@@ -7689 +7689 @@
+- (void)syscall(SYS_getrandom, buffer, buflen, flags);
++ (void)syscall(__NR_getrandom, buffer, buflen, flags);
+diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
+--- a/Modules/posixmodule.c
++++ b/Modules/posixmodule.c
+@@ -17258 +17258 @@
+- n = syscall(SYS_getrandom, data, size, flags);
++ n = syscall(__NR_getrandom, data, size, flags);
+diff --git a/Python/bootstrap_hash.c b/Python/bootstrap_hash.c
+--- a/Python/bootstrap_hash.c
++++ b/Python/bootstrap_hash.c
+@@ -26 +26 @@
+-# include // SYS_getrandom
++# include // __NR_getrandom
+@@ -134 +134 @@
+- n = syscall(SYS_getrandom, dest, n, flags);
++ n = syscall(__NR_getrandom, dest, n, flags);
+@@ -138 +138 @@
+- n = syscall(SYS_getrandom, dest, n, flags);
++ n = syscall(__NR_getrandom, dest, n, flags);
diff --git a/cpython-unix/patch-jit-llvm-version-3.13.patch b/cpython-unix/patch-jit-llvm-version-3.13.patch
index f8f6fd0a7..f980855d7 100644
--- a/cpython-unix/patch-jit-llvm-version-3.13.patch
+++ b/cpython-unix/patch-jit-llvm-version-3.13.patch
@@ -1,4 +1,5 @@
diff --git a/Tools/jit/_llvm.py b/Tools/jit/_llvm.py
+index b68da1b6be1..cf04f83539e 100644
--- a/Tools/jit/_llvm.py
+++ b/Tools/jit/_llvm.py
@@ -8,7 +8,7 @@
@@ -7,6 +8,6 @@ diff --git a/Tools/jit/_llvm.py b/Tools/jit/_llvm.py
-_LLVM_VERSION = 18
+_LLVM_VERSION = 22
- _LLVM_VERSION_PATTERN = re.compile(rf"version\s+{_LLVM_VERSION}\.\d+\.\d+\S*\s+")
-
- _P = typing.ParamSpec("_P")
+ _LLVM_VERSION_PATTERN = re.compile(
+ rf"(?
Date: Tue, 16 Dec 2025 09:29:55 -0500
-Subject: [PATCH 1/1] Backport relevant parts of 3.14 getpath.c to 3.13
-Forwarded: not-needed
+Subject: [PATCH] Backport relevant parts of 3.14 getpath.c to 3.13
---
Modules/getpath.c | 38 +++++++++++++++-----------------------
@@ -78,15 +77,15 @@ index d0128b20fae..50612432027 100644
}
diff --git a/configure.ac b/configure.ac
-index 94776540d1b..fbc6cfd0de4 100644
+index a016a439c6c..071f8905ab0 100644
--- a/configure.ac
+++ b/configure.ac
-@@ -5217,7 +5217,7 @@ fi
+@@ -5242,7 +5242,7 @@ fi
# checks for library functions
AC_CHECK_FUNCS([ \
accept4 alarm bind_textdomain_codeset chmod chown clock closefrom close_range confstr \
-- copy_file_range ctermid dup dup3 execv explicit_bzero explicit_memset \
-+ copy_file_range ctermid dladdr dup dup3 execv explicit_bzero explicit_memset \
+- copy_file_range ctermid dup execv explicit_bzero explicit_memset \
++ copy_file_range ctermid dladdr dup execv explicit_bzero explicit_memset \
faccessat fchmod fchmodat fchown fchownat fdopendir fdwalk fexecve \
fork fork1 fpathconf fstatat ftime ftruncate futimens futimes futimesat \
gai_strerror getegid geteuid getgid getgrent getgrgid getgrgid_r \
@@ -105,5 +104,5 @@ index e18a6426b06..10b0cc1dafd 100644
#undef HAVE_DLFCN_H
--
-2.50.1 (Apple Git-155)
+2.54.0
diff --git a/cpython-unix/patch-python-link-modules-3.10.patch b/cpython-unix/patch-python-link-modules-3.10.patch
deleted file mode 100644
index 58247aebd..000000000
--- a/cpython-unix/patch-python-link-modules-3.10.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff --git a/Makefile.pre.in b/Makefile.pre.in
---- a/Makefile.pre.in
-+++ b/Makefile.pre.in
-@@ -563,7 +563,7 @@ clinic: check-clean-src $(srcdir)/Modules/_blake2/blake2s_impl.c
-
- # Build the interpreter
- $(BUILDPYTHON): Programs/python.o $(LIBRARY_DEPS)
-- $(LINKCC) $(PY_CORE_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/python.o $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS)
-+ $(LINKCC) $(PY_CORE_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/python.o $(BLDLIBRARY) $(LIBS) $(SYSLIBS)
-
- platform: $(BUILDPYTHON) pybuilddir.txt
- $(RUNSHARED) $(PYTHON_FOR_BUILD) -c 'import sys ; from sysconfig import get_platform ; print("%s-%d.%d" % (get_platform(), *sys.version_info[:2]))' >platform
diff --git a/cpython-unix/patch-python-link-modules-3.11.patch b/cpython-unix/patch-python-link-modules-3.11.patch
deleted file mode 100644
index 8bc7aee63..000000000
--- a/cpython-unix/patch-python-link-modules-3.11.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-diff --git a/Makefile.pre.in b/Makefile.pre.in
-index b356f6293e..89fddd4d4e 100644
---- a/Makefile.pre.in
-+++ b/Makefile.pre.in
-@@ -702,7 +702,7 @@ clinic: check-clean-src $(srcdir)/Modules/_blake2/blake2s_impl.c
-
- # Build the interpreter
- $(BUILDPYTHON): Programs/python.o $(LINK_PYTHON_DEPS)
-- $(LINKCC) $(PY_CORE_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/python.o $(LINK_PYTHON_OBJS) $(LIBS) $(MODLIBS) $(SYSLIBS)
-+ $(LINKCC) $(PY_CORE_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/python.o $(LINK_PYTHON_OBJS) $(LIBS) $(SYSLIBS)
-
- platform: $(PYTHON_FOR_BUILD_DEPS) pybuilddir.txt
- $(RUNSHARED) $(PYTHON_FOR_BUILD) -c 'import sys ; from sysconfig import get_platform ; print("%s-%d.%d" % (get_platform(), *sys.version_info[:2]))' >platform
diff --git a/cpython-unix/patch-python-link-modules-3.15.patch b/cpython-unix/patch-python-link-modules-3.15.patch
deleted file mode 100644
index 5225bb6f9..000000000
--- a/cpython-unix/patch-python-link-modules-3.15.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-diff --git a/Makefile.pre.in b/Makefile.pre.in
-index 120a6add385..4d8abc5256a 100644
---- a/Makefile.pre.in
-+++ b/Makefile.pre.in
-@@ -990,7 +990,7 @@ clinic-tests: check-clean-src $(srcdir)/Lib/test/clinic.test.c
-
- # Build the interpreter
- $(BUILDPYTHON): Programs/python.o $(LINK_PYTHON_DEPS)
-- $(LINKCC) $(PY_CORE_EXE_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/python.o $(LINK_PYTHON_OBJS) $(LIBS) $(MODLIBS) $(SYSLIBS)
-+ $(LINKCC) $(PY_CORE_EXE_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/python.o $(LINK_PYTHON_OBJS) $(LIBS) $(SYSLIBS)
-
- platform: $(PYTHON_FOR_BUILD_DEPS) pybuilddir.txt
- $(RUNSHARED) $(PYTHON_FOR_BUILD) -c 'import sys ; from sysconfig import get_platform ; print("%s-%d.%d" % (get_platform(), *sys.version_info[:2]))' >platform
diff --git a/cpython-unix/targets.yml b/cpython-unix/targets.yml
index 588c2db79..adc42ca9d 100644
--- a/cpython-unix/targets.yml
+++ b/cpython-unix/targets.yml
@@ -14,6 +14,11 @@
# needs
# Packages required to build Python.
#
+# linux_uapi_include_arch
+# Architecture-specific include directory in the linux-uapi package. When
+# defined, the package's modern Linux UAPI headers are used to build Python.
+# The linux-uapi package must also be listed in the target's needs.
+#
# host_cc
# Path to C compiler to use when producing binaries targeting the
# current build environment.
@@ -40,6 +45,11 @@
#
# Values will be added to LDFLAGS.
#
+# Linux targets pass -Wl,--build-id=sha1 so binaries carry a GNU build ID.
+# Debuginfod is keyed entirely on that ID, so without it debuggers cannot
+# request debug symbols for these distributions at all. sha1 is derived from
+# the linked content, so it does not affect build reproducibility.
+#
# apple_sdk_platform
# Name of the Apple SDK platform to use when building.
#
@@ -103,6 +113,7 @@ aarch64-apple-darwin:
- m4
- mpdecimal
- openssl-3.5
+ - pkgconf
- sqlite
- tcl
- tk
@@ -112,6 +123,7 @@ aarch64-apple-darwin:
openssl_target: darwin64-arm64-cc
aarch64-unknown-linux-gnu:
+ linux_uapi_include_arch: aarch64-linux-gnu
host_platforms:
- linux_x86_64
- linux_aarch64
@@ -130,6 +142,11 @@ aarch64-unknown-linux-gnu:
target_cc: clang
target_cxx: clang++
target_cflags:
+ # Hardening
+ - '-fstack-protector'
+ - '-fstack-clash-protection'
+ - '-U_FORTIFY_SOURCE'
+ - '-D_FORTIFY_SOURCE=2'
- '-fvisibility=hidden'
# Enable frame pointers
- '-fno-omit-frame-pointer'
@@ -139,6 +156,9 @@ aarch64-unknown-linux-gnu:
target_ldflags:
# Hardening
- '-Wl,-z,noexecstack'
+ - '-Wl,-z,relro'
+ - '-Wl,-z,now'
+ - '-Wl,--build-id=sha1'
needs:
- autoconf
- bdb
@@ -150,6 +170,7 @@ aarch64-unknown-linux-gnu:
- libX11
- libXau
- libxcb
+ - linux-uapi
- m4
- mpdecimal
- ncurses
@@ -171,6 +192,7 @@ aarch64-unknown-linux-gnu:
# bolt_capable: true
armv7-unknown-linux-gnueabi:
+ linux_uapi_include_arch: arm-linux-gnueabi
host_platforms:
- linux_x86_64
pythons_supported:
@@ -185,9 +207,17 @@ armv7-unknown-linux-gnueabi:
host_cxx: /usr/bin/x86_64-linux-gnu-g++
target_cc: /usr/bin/arm-linux-gnueabi-gcc
target_cxx: /usr/bin/arm-linux-gnueabi-g++
+ target_cflags:
+ # Hardening
+ - '-fstack-protector'
+ - '-U_FORTIFY_SOURCE'
+ - '-D_FORTIFY_SOURCE=2'
target_ldflags:
# Hardening
- '-Wl,-z,noexecstack'
+ - '-Wl,-z,relro'
+ - '-Wl,-z,now'
+ - '-Wl,--build-id=sha1'
needs:
- autoconf
- bdb
@@ -199,6 +229,7 @@ armv7-unknown-linux-gnueabi:
- libX11
- libXau
- libxcb
+ - linux-uapi
- m4
- mpdecimal
- ncurses
@@ -215,6 +246,7 @@ armv7-unknown-linux-gnueabi:
openssl_target: linux-armv4
armv7-unknown-linux-gnueabihf:
+ linux_uapi_include_arch: arm-linux-gnueabihf
host_platforms:
- linux_x86_64
pythons_supported:
@@ -229,9 +261,17 @@ armv7-unknown-linux-gnueabihf:
host_cxx: /usr/bin/x86_64-linux-gnu-g++
target_cc: /usr/bin/arm-linux-gnueabihf-gcc
target_cxx: /usr/bin/arm-linux-gnueabihf-g++
+ target_cflags:
+ # Hardening
+ - '-fstack-protector'
+ - '-U_FORTIFY_SOURCE'
+ - '-D_FORTIFY_SOURCE=2'
target_ldflags:
# Hardening
- '-Wl,-z,noexecstack'
+ - '-Wl,-z,relro'
+ - '-Wl,-z,now'
+ - '-Wl,--build-id=sha1'
needs:
- autoconf
- bdb
@@ -243,6 +283,7 @@ armv7-unknown-linux-gnueabihf:
- libX11
- libXau
- libxcb
+ - linux-uapi
- m4
- mpdecimal
- ncurses
@@ -259,6 +300,7 @@ armv7-unknown-linux-gnueabihf:
openssl_target: linux-armv4
loongarch64-unknown-linux-gnu:
+ linux_uapi_include_arch: loongarch64-linux-gnu
host_platforms:
- linux_x86_64
pythons_supported:
@@ -267,14 +309,24 @@ loongarch64-unknown-linux-gnu:
- '3.12'
- '3.13'
- '3.14'
+ - '3.15'
docker_image_suffix: .cross-loongarch64
host_cc: /usr/bin/x86_64-linux-gnu-gcc
host_cxx: /usr/bin/x86_64-linux-gnu-g++
target_cc: /usr/bin/loongarch64-linux-gnu-gcc
target_cxx: /usr/bin/loongarch64-linux-gnu-g++
+ target_cflags:
+ # Hardening
+ - '-fstack-protector'
+ - '-U_FORTIFY_SOURCE'
+ - '-D_FORTIFY_SOURCE=2'
target_ldflags:
# Hardening
- '-Wl,-z,noexecstack'
+ - '-Wl,-z,relro'
+ - '-Wl,-z,now'
+ - '-Wl,--build-id=sha1'
+ - '-Wl,-z,max-page-size=0x10000'
needs:
- autoconf
- bdb
@@ -286,6 +338,7 @@ loongarch64-unknown-linux-gnu:
- libX11
- libXau
- libxcb
+ - linux-uapi
- m4
- mpdecimal
- ncurses
@@ -302,6 +355,7 @@ loongarch64-unknown-linux-gnu:
openssl_target: linux64-loongarch64
mips-unknown-linux-gnu:
+ linux_uapi_include_arch: mips-linux-gnu
host_platforms:
- linux_x86_64
pythons_supported:
@@ -316,9 +370,17 @@ mips-unknown-linux-gnu:
host_cxx: /usr/bin/x86_64-linux-gnu-g++
target_cc: /usr/bin/mips-linux-gnu-gcc
target_cxx: /usr/bin/mips-linux-gnu-g++
+ target_cflags:
+ # Hardening
+ - '-fstack-protector'
+ - '-U_FORTIFY_SOURCE'
+ - '-D_FORTIFY_SOURCE=2'
target_ldflags:
# Hardening
- '-Wl,-z,noexecstack'
+ - '-Wl,-z,relro'
+ - '-Wl,-z,now'
+ - '-Wl,--build-id=sha1'
needs:
- autoconf
- bdb
@@ -330,6 +392,7 @@ mips-unknown-linux-gnu:
- libX11
- libXau
- libxcb
+ - linux-uapi
- m4
- mpdecimal
- ncurses
@@ -346,6 +409,7 @@ mips-unknown-linux-gnu:
openssl_target: linux-mips32
mipsel-unknown-linux-gnu:
+ linux_uapi_include_arch: mipsel-linux-gnu
host_platforms:
- linux_x86_64
pythons_supported:
@@ -360,9 +424,17 @@ mipsel-unknown-linux-gnu:
host_cxx: /usr/bin/x86_64-linux-gnu-g++
target_cc: /usr/bin/mipsel-linux-gnu-gcc
target_cxx: /usr/bin/mipsel-linux-gnu-g++
+ target_cflags:
+ # Hardening
+ - '-fstack-protector'
+ - '-U_FORTIFY_SOURCE'
+ - '-D_FORTIFY_SOURCE=2'
target_ldflags:
# Hardening
- '-Wl,-z,noexecstack'
+ - '-Wl,-z,relro'
+ - '-Wl,-z,now'
+ - '-Wl,--build-id=sha1'
needs:
- autoconf
- bdb
@@ -374,6 +446,7 @@ mipsel-unknown-linux-gnu:
- libX11
- libXau
- libxcb
+ - linux-uapi
- m4
- mpdecimal
- ncurses
@@ -390,6 +463,7 @@ mipsel-unknown-linux-gnu:
openssl_target: linux-mips32
ppc64le-unknown-linux-gnu:
+ linux_uapi_include_arch: powerpc64le-linux-gnu
host_platforms:
- linux_x86_64
pythons_supported:
@@ -404,9 +478,17 @@ ppc64le-unknown-linux-gnu:
host_cxx: /usr/bin/x86_64-linux-gnu-g++
target_cc: /usr/bin/powerpc64le-linux-gnu-gcc
target_cxx: /usr/bin/powerpc64le-linux-gnu-g++
+ target_cflags:
+ # Hardening
+ - '-fstack-protector'
+ - '-U_FORTIFY_SOURCE'
+ - '-D_FORTIFY_SOURCE=2'
target_ldflags:
# Hardening
- '-Wl,-z,noexecstack'
+ - '-Wl,-z,relro'
+ - '-Wl,-z,now'
+ - '-Wl,--build-id=sha1'
needs:
- autoconf
- bdb
@@ -418,6 +500,7 @@ ppc64le-unknown-linux-gnu:
- libX11
- libXau
- libxcb
+ - linux-uapi
- m4
- mpdecimal
- ncurses
@@ -434,6 +517,7 @@ ppc64le-unknown-linux-gnu:
openssl_target: linux-ppc64le
riscv64-unknown-linux-gnu:
+ linux_uapi_include_arch: riscv64-linux-gnu
host_platforms:
- linux_x86_64
pythons_supported:
@@ -448,9 +532,17 @@ riscv64-unknown-linux-gnu:
host_cxx: /usr/bin/x86_64-linux-gnu-g++
target_cc: /usr/bin/riscv64-linux-gnu-gcc
target_cxx: /usr/bin/riscv64-linux-gnu-g++
+ target_cflags:
+ # Hardening
+ - '-fstack-protector'
+ - '-U_FORTIFY_SOURCE'
+ - '-D_FORTIFY_SOURCE=2'
target_ldflags:
# Hardening
- '-Wl,-z,noexecstack'
+ - '-Wl,-z,relro'
+ - '-Wl,-z,now'
+ - '-Wl,--build-id=sha1'
needs:
- autoconf
- bdb
@@ -462,6 +554,7 @@ riscv64-unknown-linux-gnu:
- libX11
- libXau
- libxcb
+ - linux-uapi
- m4
- mpdecimal
- ncurses
@@ -478,6 +571,7 @@ riscv64-unknown-linux-gnu:
openssl_target: linux64-riscv64
s390x-unknown-linux-gnu:
+ linux_uapi_include_arch: s390x-linux-gnu
host_platforms:
- linux_x86_64
pythons_supported:
@@ -493,11 +587,18 @@ s390x-unknown-linux-gnu:
target_cc: /usr/bin/s390x-linux-gnu-gcc
target_cxx: /usr/bin/s390x-linux-gnu-g++
target_cflags:
+ # Hardening
+ - '-fstack-protector'
+ - '-U_FORTIFY_SOURCE'
+ - '-D_FORTIFY_SOURCE=2'
# set the minimum compatibility level to z10 (released 2008)
- '-march=z10'
target_ldflags:
# Hardening
- '-Wl,-z,noexecstack'
+ - '-Wl,-z,relro'
+ - '-Wl,-z,now'
+ - '-Wl,--build-id=sha1'
needs:
- autoconf
- bdb
@@ -509,6 +610,7 @@ s390x-unknown-linux-gnu:
- libX11
- libXau
- libxcb
+ - linux-uapi
- m4
- mpdecimal
- ncurses
@@ -572,6 +674,7 @@ x86_64-apple-darwin:
- m4
- mpdecimal
- openssl-3.5
+ - pkgconf
- sqlite
- tcl
- tk
@@ -581,8 +684,10 @@ x86_64-apple-darwin:
openssl_target: darwin64-x86_64-cc
x86_64-unknown-linux-gnu:
+ linux_uapi_include_arch: x86_64-linux-gnu
host_platforms:
- linux_x86_64
+ - macos_arm64
pythons_supported:
- '3.10'
- '3.11'
@@ -596,6 +701,11 @@ x86_64-unknown-linux-gnu:
target_cc: clang
target_cxx: clang++
target_cflags:
+ # Hardening
+ - '-fstack-protector'
+ - '-fstack-clash-protection'
+ - '-U_FORTIFY_SOURCE'
+ - '-D_FORTIFY_SOURCE=2'
- '-fvisibility=hidden'
# Enable frame pointers
- '-fno-omit-frame-pointer'
@@ -605,6 +715,9 @@ x86_64-unknown-linux-gnu:
target_ldflags:
# Hardening
- '-Wl,-z,noexecstack'
+ - '-Wl,-z,relro'
+ - '-Wl,-z,now'
+ - '-Wl,--build-id=sha1'
needs:
- autoconf
- bdb
@@ -616,6 +729,7 @@ x86_64-unknown-linux-gnu:
- libX11
- libXau
- libxcb
+ - linux-uapi
- m4
- mpdecimal
- ncurses
@@ -633,8 +747,10 @@ x86_64-unknown-linux-gnu:
bolt_capable: true
x86_64_v2-unknown-linux-gnu:
+ linux_uapi_include_arch: x86_64-linux-gnu
host_platforms:
- linux_x86_64
+ - macos_arm64
pythons_supported:
- '3.10'
- '3.11'
@@ -648,6 +764,11 @@ x86_64_v2-unknown-linux-gnu:
target_cc: clang
target_cxx: clang++
target_cflags:
+ # Hardening
+ - '-fstack-protector'
+ - '-fstack-clash-protection'
+ - '-U_FORTIFY_SOURCE'
+ - '-D_FORTIFY_SOURCE=2'
- '-march=x86-64-v2'
- '-fvisibility=hidden'
# Enable frame pointers
@@ -658,6 +779,9 @@ x86_64_v2-unknown-linux-gnu:
target_ldflags:
# Hardening
- '-Wl,-z,noexecstack'
+ - '-Wl,-z,relro'
+ - '-Wl,-z,now'
+ - '-Wl,--build-id=sha1'
needs:
- autoconf
- bdb
@@ -669,6 +793,7 @@ x86_64_v2-unknown-linux-gnu:
- libX11
- libXau
- libxcb
+ - linux-uapi
- m4
- mpdecimal
- ncurses
@@ -686,8 +811,10 @@ x86_64_v2-unknown-linux-gnu:
bolt_capable: true
x86_64_v3-unknown-linux-gnu:
+ linux_uapi_include_arch: x86_64-linux-gnu
host_platforms:
- linux_x86_64
+ - macos_arm64
pythons_supported:
- '3.10'
- '3.11'
@@ -701,6 +828,11 @@ x86_64_v3-unknown-linux-gnu:
target_cc: clang
target_cxx: clang++
target_cflags:
+ # Hardening
+ - '-fstack-protector'
+ - '-fstack-clash-protection'
+ - '-U_FORTIFY_SOURCE'
+ - '-D_FORTIFY_SOURCE=2'
- '-march=x86-64-v3'
- '-fvisibility=hidden'
# Enable frame pointers
@@ -711,6 +843,9 @@ x86_64_v3-unknown-linux-gnu:
target_ldflags:
# Hardening
- '-Wl,-z,noexecstack'
+ - '-Wl,-z,relro'
+ - '-Wl,-z,now'
+ - '-Wl,--build-id=sha1'
needs:
- autoconf
- bdb
@@ -722,6 +857,7 @@ x86_64_v3-unknown-linux-gnu:
- libX11
- libXau
- libxcb
+ - linux-uapi
- m4
- mpdecimal
- ncurses
@@ -739,8 +875,12 @@ x86_64_v3-unknown-linux-gnu:
bolt_capable: true
x86_64_v4-unknown-linux-gnu:
+ linux_uapi_include_arch: x86_64-linux-gnu
host_platforms:
- linux_x86_64
+ # Rosetta doesn't support AVX-512. So we cannot run x86-64-v4 binaries
+ # under Rosetta. But they can build correctly.
+ - macos_arm64
pythons_supported:
- '3.10'
- '3.11'
@@ -754,6 +894,11 @@ x86_64_v4-unknown-linux-gnu:
target_cc: clang
target_cxx: clang++
target_cflags:
+ # Hardening
+ - '-fstack-protector'
+ - '-fstack-clash-protection'
+ - '-U_FORTIFY_SOURCE'
+ - '-D_FORTIFY_SOURCE=2'
- '-march=x86-64-v4'
- '-fvisibility=hidden'
# Enable frame pointers
@@ -764,6 +909,9 @@ x86_64_v4-unknown-linux-gnu:
target_ldflags:
# Hardening
- '-Wl,-z,noexecstack'
+ - '-Wl,-z,relro'
+ - '-Wl,-z,now'
+ - '-Wl,--build-id=sha1'
needs:
- autoconf
- bdb
@@ -775,6 +923,7 @@ x86_64_v4-unknown-linux-gnu:
- libX11
- libXau
- libxcb
+ - linux-uapi
- m4
- mpdecimal
- ncurses
@@ -794,6 +943,7 @@ x86_64_v4-unknown-linux-gnu:
x86_64-unknown-linux-musl:
host_platforms:
- linux_x86_64
+ - macos_arm64
pythons_supported:
- '3.10'
- '3.11'
@@ -807,6 +957,9 @@ x86_64-unknown-linux-musl:
target_cc: musl-clang
target_cxx: clang++ # TODO: Explore a musl-clang++ shim?
target_cflags:
+ # Hardening
+ - '-fstack-protector'
+ - '-fstack-clash-protection'
- '-fvisibility=hidden'
# Enable frame pointers
- '-fno-omit-frame-pointer'
@@ -814,6 +967,9 @@ x86_64-unknown-linux-musl:
target_ldflags:
# Hardening
- '-Wl,-z,noexecstack'
+ - '-Wl,-z,relro'
+ - '-Wl,-z,now'
+ - '-Wl,--build-id=sha1'
needs:
- autoconf
- bdb
@@ -821,7 +977,7 @@ x86_64-unknown-linux-musl:
- bzip2
- expat
- libedit
- - libffi-3.3
+ - libffi
- libX11
- libXau
- libxcb
@@ -844,6 +1000,7 @@ x86_64-unknown-linux-musl:
x86_64_v2-unknown-linux-musl:
host_platforms:
- linux_x86_64
+ - macos_arm64
pythons_supported:
- '3.10'
- '3.11'
@@ -857,6 +1014,9 @@ x86_64_v2-unknown-linux-musl:
target_cc: musl-clang
target_cxx: clang++ # TODO: Explore a musl-clang++ shim?
target_cflags:
+ # Hardening
+ - '-fstack-protector'
+ - '-fstack-clash-protection'
- '-march=x86-64-v2'
- '-fvisibility=hidden'
# Enable frame pointers
@@ -865,6 +1025,9 @@ x86_64_v2-unknown-linux-musl:
target_ldflags:
# Hardening
- '-Wl,-z,noexecstack'
+ - '-Wl,-z,relro'
+ - '-Wl,-z,now'
+ - '-Wl,--build-id=sha1'
needs:
- autoconf
- bdb
@@ -872,7 +1035,7 @@ x86_64_v2-unknown-linux-musl:
- bzip2
- expat
- libedit
- - libffi-3.3
+ - libffi
- libX11
- libXau
- libxcb
@@ -895,6 +1058,7 @@ x86_64_v2-unknown-linux-musl:
x86_64_v3-unknown-linux-musl:
host_platforms:
- linux_x86_64
+ - macos_arm64
pythons_supported:
- '3.10'
- '3.11'
@@ -908,6 +1072,9 @@ x86_64_v3-unknown-linux-musl:
target_cc: musl-clang
target_cxx: clang++ # TODO: Explore a musl-clang++ shim?
target_cflags:
+ # Hardening
+ - '-fstack-protector'
+ - '-fstack-clash-protection'
- '-march=x86-64-v3'
- '-fvisibility=hidden'
# Enable frame pointers
@@ -916,6 +1083,9 @@ x86_64_v3-unknown-linux-musl:
target_ldflags:
# Hardening
- '-Wl,-z,noexecstack'
+ - '-Wl,-z,relro'
+ - '-Wl,-z,now'
+ - '-Wl,--build-id=sha1'
needs:
- autoconf
- bdb
@@ -923,7 +1093,7 @@ x86_64_v3-unknown-linux-musl:
- bzip2
- expat
- libedit
- - libffi-3.3
+ - libffi
- libX11
- libXau
- libxcb
@@ -946,6 +1116,9 @@ x86_64_v3-unknown-linux-musl:
x86_64_v4-unknown-linux-musl:
host_platforms:
- linux_x86_64
+ # Rosetta doesn't support AVX-512. So we cannot run x86-64-v4 binaries
+ # under Rosetta. But they can build correctly.
+ - macos_arm64
pythons_supported:
- '3.10'
- '3.11'
@@ -959,6 +1132,9 @@ x86_64_v4-unknown-linux-musl:
target_cc: musl-clang
target_cxx: clang++ # TODO: Explore a musl-clang++ shim?
target_cflags:
+ # Hardening
+ - '-fstack-protector'
+ - '-fstack-clash-protection'
- '-march=x86-64-v4'
- '-fvisibility=hidden'
# Enable frame pointers
@@ -967,6 +1143,9 @@ x86_64_v4-unknown-linux-musl:
target_ldflags:
# Hardening
- '-Wl,-z,noexecstack'
+ - '-Wl,-z,relro'
+ - '-Wl,-z,now'
+ - '-Wl,--build-id=sha1'
needs:
- autoconf
- bdb
@@ -974,7 +1153,7 @@ x86_64_v4-unknown-linux-musl:
- bzip2
- expat
- libedit
- - libffi-3.3
+ - libffi
- libX11
- libXau
- libxcb
@@ -1014,6 +1193,9 @@ aarch64-unknown-linux-musl:
target_cc: musl-clang
target_cxx: clang++
target_cflags:
+ # Hardening
+ - '-fstack-protector'
+ - '-fstack-clash-protection'
- '-fvisibility=hidden'
# Enable frame pointers
- '-fno-omit-frame-pointer'
@@ -1021,6 +1203,9 @@ aarch64-unknown-linux-musl:
target_ldflags:
# Hardening
- '-Wl,-z,noexecstack'
+ - '-Wl,-z,relro'
+ - '-Wl,-z,now'
+ - '-Wl,--build-id=sha1'
needs:
- autoconf
- bdb
@@ -1028,7 +1213,7 @@ aarch64-unknown-linux-musl:
- bzip2
- expat
- libedit
- - libffi-3.3
+ - libffi
- libX11
- libXau
- libxcb
diff --git a/cpython-windows/build.py b/cpython-windows/build.py
index ef5097601..252b16223 100644
--- a/cpython-windows/build.py
+++ b/cpython-windows/build.py
@@ -296,6 +296,58 @@ def find_vcvarsall_path(msvc_version):
)
+<<<<<<< HEAD
+=======
+class NoSearchStringError(Exception):
+ """Represents a missing search string when replacing content in a file."""
+
+
+def static_replace_in_file(p: pathlib.Path, search, replace):
+ """Replace occurrences of a string in a file.
+
+ The updated file contents are written out in place.
+ """
+
+ with p.open("rb") as fh:
+ data = fh.read()
+
+ # Build should be as deterministic as possible. Assert that wanted changes
+ # actually occur.
+ if search not in data:
+ raise NoSearchStringError("search string (%s) not in %s" % (search, p))
+
+ log("replacing `%s` with `%s` in %s" % (search, replace, p))
+ data = data.replace(search, replace)
+
+ with p.open("wb") as fh:
+ fh.write(data)
+
+
+def apply_source_patch(cpython_source_path: pathlib.Path, patch_path: pathlib.Path):
+ with patch_path.open("rb") as fh:
+ patch = fh.read().replace(b"\r\n", b"\n")
+
+ with tempfile.NamedTemporaryFile("wb", delete=False) as fh:
+ fh.write(patch)
+ normalized_patch = pathlib.Path(fh.name)
+
+ try:
+ subprocess.run(
+ [
+ "git.exe",
+ "-C",
+ str(cpython_source_path),
+ "apply",
+ "--whitespace=nowarn",
+ str(normalized_patch),
+ ],
+ check=True,
+ )
+ finally:
+ normalized_patch.unlink()
+
+
+>>>>>>> refs/tags/20260825
OPENSSL_PROPS_REMOVE_RULES_LEGACY = b"""
<_SSLDLL Include="$(opensslOutDir)\libcrypto$(_DLLSuffix).dll" />
@@ -357,8 +409,10 @@ def hack_props(
mpdecimal_version = DOWNLOADS["mpdecimal"]["version"]
- if meets_python_minimum_version(python_version, "3.14") or arch == "arm64":
- tcltk_commit = DOWNLOADS["tk-windows-bin"]["git_commit"]
+ if meets_python_minimum_version(python_version, "3.14"):
+ tcltk_commit = DOWNLOADS["tk-windows-bin-904"]["git_commit"]
+ elif arch == "arm64":
+ tcltk_commit = DOWNLOADS["tk-windows-bin-8614"]["git_commit"]
else:
tcltk_commit = DOWNLOADS["tk-windows-bin-8612"]["git_commit"]
@@ -660,21 +714,21 @@ def hack_project_files(
pass
# Our custom OpenSSL build has applink.c in a different location from the
- # binary OpenSSL distribution. This is no longer relevant for 3.12+ per
- # https://github.com/python/cpython/pull/131839, so we allow it to fail.swe
- try:
+ # binary OpenSSL distribution.
+ # Starting with 3.12 CPython on Windows is built without uplink support
+ # so this modification is not needed.
+ # https://github.com/python/cpython/pull/131839
+ if meets_python_maximum_version(python_version, "3.11"):
ssl_proj = pcbuild_path / "_ssl.vcxproj"
static_replace_in_file(
ssl_proj,
rb'',
rb'',
)
- except NoSearchStringError:
- pass
# Python 3.12+ uses the the pre-built tk-windows-bin 8.6.12 which doesn't
# have a standalone zlib DLL, so we remove references to it. For Python
- # 3.14+, we're using tk-windows-bin 8.6.14 which includes a prebuilt zlib
+ # 3.14+, we're using tk-windows-bin 9.0.4 which includes a prebuilt zlib
# DLL, so we skip this patch there.
# On arm64, we use the new version of tk-windows-bin for all versions.
if meets_python_minimum_version(python_version, "3.12") and (
@@ -975,6 +1029,7 @@ def build_openssl_for_arch(
build_root: pathlib.Path,
*,
jom_archive,
+ with_uplink: bool = False,
):
nasm_version = DOWNLOADS["nasm-windows-bin"]["version"]
@@ -994,14 +1049,15 @@ def build_openssl_for_arch(
source_root = build_root / ("openssl-%s" % openssl_version)
- # uplink.c tries to find the OPENSSL_Applink function exported from the current
- # executable. However, it is exported from _ssl[_d].pyd in shared builds. So
- # update its sounce to look for it from there.
- static_replace_in_file(
- source_root / "ms" / "uplink.c",
- b"((h = GetModuleHandle(NULL)) == NULL)",
- b'((h = GetModuleHandleA("_ssl.pyd")) == NULL) if ((h = GetModuleHandleA("_ssl_d.pyd")) == NULL) if ((h = GetModuleHandle(NULL)) == NULL)',
- )
+ if with_uplink:
+ # uplink.c tries to find the OPENSSL_Applink function exported from the
+ # current executable. However, it is exported from _ssl[_d].pyd in shared
+ # builds. So update its source to look for it from there.
+ static_replace_in_file(
+ source_root / "ms" / "uplink.c",
+ b"((h = GetModuleHandle(NULL)) == NULL)",
+ b'((h = GetModuleHandleA("_ssl.pyd")) == NULL) if ((h = GetModuleHandleA("_ssl_d.pyd")) == NULL) if ((h = GetModuleHandle(NULL)) == NULL)',
+ )
if arch == "x86":
configure = "VC-WIN32"
@@ -1015,26 +1071,27 @@ def build_openssl_for_arch(
else:
raise Exception("unhandled architecture: %s" % arch)
- # The official CPython OpenSSL builds hack ms/uplink.c to change the
- # ``GetModuleHandle(NULL)`` invocation to load things from _ssl.pyd
- # instead. But since we statically link the _ssl extension, this hackery
- # is not required.
-
# Set DESTDIR to affect install location.
dest_dir = build_root / "install"
env["DESTDIR"] = str(dest_dir)
install_root = dest_dir / prefix
+ configure_args = [
+ str(perl_path),
+ "Configure",
+ configure,
+ "no-idea",
+ "no-mdc2",
+ "no-tests",
+ "--prefix=/%s" % prefix,
+ ]
+ if with_uplink:
+ log("building OpenSSL with uplink support for Python <3.12")
+ else:
+ configure_args.append("no-uplink")
+
exec_and_log(
- [
- str(perl_path),
- "Configure",
- configure,
- "no-idea",
- "no-mdc2",
- "no-tests",
- "--prefix=/%s" % prefix,
- ],
+ configure_args,
source_root,
{
**env,
@@ -1076,6 +1133,7 @@ def build_openssl(
perl_path: pathlib.Path,
arch: str,
dest_archive: pathlib.Path,
+ with_uplink: bool = False,
):
"""Build OpenSSL from sources using the Perl executable specified."""
@@ -1103,6 +1161,7 @@ def build_openssl(
nasm_archive,
root_32,
jom_archive=jom_archive,
+ with_uplink=with_uplink,
)
elif arch == "amd64":
root_64.mkdir()
@@ -1114,6 +1173,7 @@ def build_openssl(
nasm_archive,
root_64,
jom_archive=jom_archive,
+ with_uplink=with_uplink,
)
elif arch == "arm64":
root_arm64.mkdir()
@@ -1125,6 +1185,7 @@ def build_openssl(
nasm_archive,
root_arm64,
jom_archive=jom_archive,
+ with_uplink=with_uplink,
)
else:
raise Exception("unhandled architecture: %s" % arch)
@@ -1274,20 +1335,23 @@ def collect_python_build_artifacts(
pcbuild_path: pathlib.Path,
out_dir: pathlib.Path,
python_majmin: str,
- arch: str,
+ pcbuild_directory: str,
config: str,
openssl_entry: str,
zlib_entry: str,
freethreaded: bool,
):
"""Collect build artifacts from Python.
-
Copies them into an output directory and returns a data structure describing
the files.
"""
- outputs_path = pcbuild_path / arch
+ arch = pcbuild_directory
+ # Python 3.15 suffixes the directory with 't' for free-threading
+ if arch.endswith("t"):
+ arch = arch.removesuffix("t")
+ outputs_path = pcbuild_path / pcbuild_directory
intermediates_path = (
- pcbuild_path / "obj" / ("%s%s_%s" % (python_majmin, arch, config))
+ pcbuild_path / "obj" / ("%s%s_%s" % (python_majmin, pcbuild_directory, config))
)
if not outputs_path.exists():
@@ -1339,6 +1403,11 @@ def collect_python_build_artifacts(
}
other_projects = {"pythoncore"}
+<<<<<<< HEAD
+=======
+ other_projects.add("python3dll")
+ other_projects.add("python3tdll")
+>>>>>>> refs/tags/20260825
# Projects providing dependencies.
depends_projects = set()
@@ -1590,6 +1659,7 @@ def build_cpython(
xz_archive = download_entry("xz", BUILD)
zlib_archive = download_entry(zlib_entry, BUILD)
+<<<<<<< HEAD
# On CPython 3.14+, we use the latest tcl/tk version which has additional
# runtime dependencies, so we are conservative and use the old version
# elsewhere. The old version isn't built for arm64, so we use the new
@@ -1599,6 +1669,22 @@ def build_cpython(
if meets_python_minimum_version(python_version, "3.14") or arch == "arm64"
else "tk-windows-bin-8612"
)
+=======
+ setuptools_wheel = download_entry("setuptools", BUILD)
+ pip_wheel = download_entry("pip", BUILD)
+
+ # We use a prebuild tcl/tk from the upstream CPython project.
+ # Tcl/tk 8.6.14+ has an additional runtime dependency. We are conservative and
+ # use an old version prior to CPython 3.14. The older tck/tk release
+ # is not available for arm64 so we use a newer release there as well.
+ # On CPython 3.14+ we match the version included in the Python.org release.
+ if meets_python_minimum_version(python_version, "3.14"):
+ tk_bin_entry = "tk-windows-bin-904"
+ elif arch == "arm64":
+ tk_bin_entry = "tk-windows-bin-8614"
+ else:
+ tk_bin_entry = "tk-windows-bin-8612"
+>>>>>>> refs/tags/20260825
tk_bin_archive = download_entry(
tk_bin_entry, BUILD, local_name="tk-windows-bin.tar.gz"
)
@@ -1625,6 +1711,11 @@ def build_cpython(
python_exe = "python.exe"
pythonw_exe = "pythonw.exe"
+ # Python 3.15 uses the default name for the executable in a suffixed directory
+ instrumented_python_exe = python_exe
+ if meets_python_minimum_version(python_version, "3.15") and freethreaded:
+ instrumented_python_exe = "python.exe"
+
if arch == "amd64":
build_platform = "x64"
build_directory = "amd64"
@@ -1637,6 +1728,12 @@ def build_cpython(
else:
raise Exception("unhandled architecture: %s" % arch)
+ pcbuild_directory = build_directory
+ # Starting with 3.15, free-threaded CPython outputs use a `t` suffix.
+ # The third-party dependency archives still use the base architecture name.
+ if freethreaded and meets_python_minimum_version(python_version, "3.15"):
+ pcbuild_directory = f"{build_directory}t"
+
tempdir_opts = (
{"ignore_cleanup_errors": True} if sys.version_info >= (3, 12) else {}
)
@@ -1677,7 +1774,7 @@ def build_cpython(
extract_tar_to_directory(libffi_archive, td)
# Delete the tk nmake helper, it's not needed and links msvc
- if tk_bin_entry == "tk-windows-bin":
+ if tk_bin_entry in ("tk-windows-bin-8614", "tk-windows-bin-904"):
tcltk_commit: str = DOWNLOADS[tk_bin_entry]["git_commit"]
tcltk_path = td / ("cpython-bin-deps-%s" % tcltk_commit)
(
@@ -1761,7 +1858,10 @@ def build_cpython(
# test execution. We work around this by invoking the test harness
# separately for each test.
instrumented_python = (
- pcbuild_path / build_directory / "instrumented" / python_exe
+ pcbuild_path
+ / pcbuild_directory
+ / "instrumented"
+ / instrumented_python_exe
)
tests = subprocess.run(
@@ -1870,7 +1970,7 @@ def build_cpython(
"--source",
str(cpython_source_path),
"--build",
- str(pcbuild_path / build_directory),
+ str(pcbuild_path / pcbuild_directory),
"--copy",
str(install_dir),
"--temp",
@@ -1914,7 +2014,7 @@ def build_cpython(
pcbuild_path,
out_dir / "python",
"".join(entry["version"].split(".")[0:2]),
- build_directory,
+ pcbuild_directory,
artifact_config,
openssl_entry=openssl_entry,
zlib_entry=zlib_entry,
@@ -2160,8 +2260,14 @@ def main() -> None:
else:
openssl_entry = "openssl-3.5"
+ openssl_with_uplink = args.python in ["cpython-3.10", "cpython-3.11"]
+ if openssl_with_uplink:
+ openssl_build_options = f"{build_options}-uplink"
+ else:
+ openssl_build_options = f"{build_options}-no-uplink"
+
openssl_archive = BUILD / (
- "%s-%s-%s.tar" % (openssl_entry, target_triple, build_options)
+ "%s-%s-%s.tar" % (openssl_entry, target_triple, openssl_build_options)
)
if not openssl_archive.exists():
perl_path = fetch_strawberry_perl() / "perl" / "bin" / "perl.exe"
@@ -2171,6 +2277,7 @@ def main() -> None:
perl_path,
arch,
dest_archive=openssl_archive,
+ with_uplink=openssl_with_uplink,
)
libffi_archive = BUILD / ("libffi-%s-%s.tar" % (target_triple, build_options))
diff --git a/docs/building.rst b/docs/building.rst
index 947871a83..ce49d2034 100644
--- a/docs/building.rst
+++ b/docs/building.rst
@@ -37,7 +37,8 @@ Linux
The host system must be x86-64 or aarch64.
The execution environment must have access to a Docker
daemon (all build operations are performed in Docker containers for
-isolation from the host system).
+isolation from the host system). Docker Buildx must be installed and available
+as ``docker buildx``.
``build.py`` accepts a ``--target-triple`` argument to support building
for non-native targets (i.e. cross-compiling).
@@ -76,9 +77,11 @@ The ``--target-triple`` argument can be used to build for an Intel Mac on an arm
$ ./build.py --target-triple x86_64-apple-darwin
-Additionally, an arm64 macOS host can be used to build Linux aarch64 targets using Docker::
+Additionally, an arm64 macOS host can be used to build Linux aarch64 and x86-64
+targets using Docker::
$ ./build.py --target-triple aarch64-unknown-linux-gnu
+ $ ./build.py --target-triple x86_64-unknown-linux-gnu
The ``APPLE_SDK_PATH`` environment variable is recognized as the path
to the Apple SDK to use. If not defined, the build will attempt to find
@@ -104,4 +107,4 @@ You will need to specify the path to ``sh.exe`` from cygwin::
$ uv run --no-dev build.py --sh c:\cygwin\bin\sh.exe
-To build a 32-bit x86 binary, simply use an ``x86 Native Tools Command Prompt`` instead of ``x64``.
\ No newline at end of file
+To build a 32-bit x86 binary, simply use an ``x86 Native Tools Command Prompt`` instead of ``x64``.
diff --git a/mypy.ini b/mypy.ini
index 579b81675..08898d53c 100644
--- a/mypy.ini
+++ b/mypy.ini
@@ -6,4 +6,4 @@ warn_unused_configs = True
warn_unused_ignores = True
warn_unreachable = True
-files = pythonbuild,check.py,build-linux.py,build-macos.py,build-windows.py
+files = pythonbuild,check.py,build.py
diff --git a/pyproject.toml b/pyproject.toml
index ab36e9b58..479c42edd 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -37,3 +37,11 @@ check = [
dev = [
"moto[server]>=5.1.22",
]
+
+[tool.uv]
+no-build = true
+no-binary-package = ["python-build-standalone"]
+# Pin the isolated build environment for source-build exceptions.
+build-constraint-dependencies = [
+ "uv-build==0.11.33",
+]
diff --git a/pythonbuild/buildenv.py b/pythonbuild/buildenv.py
index a946813ed..37019ca26 100644
--- a/pythonbuild/buildenv.py
+++ b/pythonbuild/buildenv.py
@@ -266,7 +266,10 @@ def find_output_files(self, base_path, pattern):
def build_environment(client, image):
if client is not None:
container = client.containers.run(
- image, command=["/bin/sleep", "86400"], detach=True
+ image,
+ command=["/bin/sleep", "86400"],
+ detach=True,
+ platform=client._pbs_platform,
)
td = None
context = ContainerContext(container)
diff --git a/pythonbuild/cpython.py b/pythonbuild/cpython.py
index 3221760ab..a82afddf0 100644
--- a/pythonbuild/cpython.py
+++ b/pythonbuild/cpython.py
@@ -255,6 +255,8 @@ def derive_setup_local(
):
"""Derive the content of the Modules/Setup.local file."""
+ use_setup_stdlib = meets_python_minimum_version(python_version, "3.12")
+
# The first part of this function validates that our extension modules YAML
# based metadata is in sync with the various files declaring extension
# modules in the Python distribution.
@@ -343,6 +345,12 @@ def derive_setup_local(
except KeyError:
setup_bootstrap_in = []
+ if use_setup_stdlib:
+ ifh = tf.extractfile(f"Python-{python_version}/Modules/Setup.stdlib.in")
+ setup_stdlib_in = ifh.readlines()
+ else:
+ setup_stdlib_in = []
+
ifh = tf.extractfile("Python-%s/Modules/config.c.in" % python_version)
config_c_in = ifh.read()
@@ -353,6 +361,31 @@ def derive_setup_local(
RE_VARIABLE = re.compile(rb"^[a-zA-Z_]+\s*=")
RE_EXTENSION_MODULE = re.compile(rb"^([a-z_]+)\s.*[a-zA-Z/_-]+\.c\b")
+ RE_STDLIB_EXTENSION_MODULE = re.compile(
+ rb"^@MODULE_[A-Z0-9_]+_TRUE@([a-z0-9_]+\s+.*)$"
+ )
+
+ setup_stdlib_lines = {}
+ setup_stdlib_linkage = {}
+ # CPython 3.12+ is configured with MODULE_BUILDTYPE=static.
+ setup_stdlib_section = "static"
+
+ for line in setup_stdlib_in:
+ line = line.rstrip()
+
+ if line == b"*shared*":
+ setup_stdlib_section = "shared"
+ continue
+ elif line == b"*static*":
+ setup_stdlib_section = "static"
+ continue
+
+ if m := RE_STDLIB_EXTENSION_MODULE.match(line):
+ line = m.group(1)
+ name = line.split()[0].decode("ascii")
+ dist_modules.add(name)
+ setup_stdlib_lines[name] = line
+ setup_stdlib_linkage[name] = setup_stdlib_section
# Setup.bootstrap.in has a simple format.
for line in setup_bootstrap_in:
@@ -460,10 +493,11 @@ def derive_setup_local(
% ", ".join(sorted(extra))
)
- # And with verification out of way, now we generate a Setup.local file
- # from our metadata. The verification above ensured that our metadata
- # agrees fully with the distribution's knowledge of extensions. So we can
- # treat our metadata as canonical.
+ # And with verification out of way, now we generate a Setup.local file.
+ # Python 3.12+ builds extensions from Setup.stdlib using configure-derived
+ # compiler and linker flags. Setup.local only disables modules or overrides
+ # linkage that differs from Setup.stdlib; older versions still use the
+ # YAML-derived compilation rules for every extension.
RE_DEFINE = re.compile(rb"-D[^=]+=[^\s]+")
@@ -540,7 +574,10 @@ def derive_setup_local(
enabled_extensions[name]["setup_line"] = setup_enabled_lines[name]
continue
- log(f"extension {name} being configured via YAML metadata")
+ if use_setup_stdlib and name in setup_stdlib_lines:
+ log(f"extension {name} being configured via Modules/Setup.stdlib")
+ else:
+ log(f"extension {name} being configured via YAML metadata")
line = name
@@ -667,9 +704,10 @@ def derive_setup_local(
# around this by detecting the syntax we'd like to support and move the
# variable defines to a Makefile supplement that overrides variables for
# specific targets.
- for m in RE_DEFINE.finditer(parsed["line"]):
- for obj_path in sorted(parsed["posix_obj_paths"]):
- extra_cflags.setdefault(bytes(obj_path), []).append(m.group(0))
+ if not use_setup_stdlib:
+ for m in RE_DEFINE.finditer(parsed["line"]):
+ for obj_path in sorted(parsed["posix_obj_paths"]):
+ extra_cflags.setdefault(bytes(obj_path), []).append(m.group(0))
line = RE_DEFINE.sub(b"", line)
@@ -679,9 +717,23 @@ def derive_setup_local(
"makesetup: %s" % line.decode("utf-8")
)
- section_lines[section].append(line)
+ # The YAML-derived line is still used to describe packaged object files
+ # and dependency libraries in PYTHON.json, even when compilation is
+ # driven by Setup.stdlib.
enabled_extensions[name]["setup_line"] = line
+ if not use_setup_stdlib:
+ section_lines[section].append(line)
+ elif section != setup_stdlib_linkage.get(name, "static"):
+ if name not in setup_stdlib_lines:
+ raise Exception(
+ f"{section} extension {name} has no Modules/Setup.stdlib.in entry"
+ )
+
+ # Override Setup.stdlib's linkage while inheriting the
+ # MODULE__CFLAGS/LDFLAGS values produced by configure.
+ section_lines[section].append(setup_stdlib_lines[name])
+
dest_lines = []
for section, lines in sorted(section_lines.items()):
diff --git a/pythonbuild/disttests/__init__.py b/pythonbuild/disttests/__init__.py
index 7b92f43f2..64bdf72d9 100644
--- a/pythonbuild/disttests/__init__.py
+++ b/pythonbuild/disttests/__init__.py
@@ -239,7 +239,7 @@ def test_testcapi(self):
def test_sqlite(self):
import sqlite3
- self.assertEqual(sqlite3.sqlite_version_info, (3, 50, 4))
+ self.assertEqual(sqlite3.sqlite_version_info, (3, 53, 1))
# Optional SQLite3 features are enabled.
conn = sqlite3.connect(":memory:")
@@ -314,12 +314,32 @@ def test_ssl(self):
if os.name == "nt" and sys.version_info[0:2] < (3, 11):
wanted_version = (1, 1, 1, 23, 15)
else:
- wanted_version = (3, 5, 0, 6, 0)
+ wanted_version = (3, 5, 0, 8, 0)
self.assertEqual(ssl.OPENSSL_VERSION_INFO, wanted_version)
ssl.create_default_context()
+ @unittest.skipIf(os.name != "nt", "Windows-specific OpenSSL uplink regression")
+ def test_ssl_with_keylogfile(self):
+ # Validate that a SSLContext can be created when SSLKEYLOGFILE is set
+ # https://github.com/astral-sh/python-build-standalone/issues/640
+ import ssl
+
+ with tempfile.TemporaryDirectory(ignore_cleanup_errors=True) as td:
+ keylog_path = str(Path(td) / "sslkeylog.log")
+ original_keylog_path = os.environ.get("SSLKEYLOGFILE")
+ os.environ["SSLKEYLOGFILE"] = keylog_path
+ try:
+ context = ssl.create_default_context()
+ self.assertEqual(context.keylog_filename, keylog_path)
+ del context
+ finally:
+ if original_keylog_path is None:
+ os.environ.pop("SSLKEYLOGFILE", None)
+ else:
+ os.environ["SSLKEYLOGFILE"] = original_keylog_path
+
@unittest.skipIf(
sys.version_info[:2] < (3, 13),
"Free-threaded builds are only available in 3.13+",
@@ -424,6 +444,136 @@ def assertPythonWorks(path: Path, argv0: Optional[str] = None):
with self.subTest(msg="weird argv[0]"):
assertPythonWorks(sys.executable, argv0="/dev/null")
+ @unittest.skipUnless(sys.platform == "linux", "Linux-specific socket constant")
+ # TODO(jjh) remove when musl builds use a sysroot
+ @unittest.skipIf(
+ os.environ["TARGET_TRIPLE"].endswith("-musl"),
+ "kernel headers not available in musl",
+ )
+ def test_socket_af_vsock(self):
+ import socket
+
+ self.assertTrue(hasattr(socket, "AF_VSOCK"))
+ self.assertEqual(socket.AF_VSOCK, 40)
+
+ @unittest.skipUnless(
+ "-linux-gnu" in os.environ["TARGET_TRIPLE"],
+ "modern kernel UAPI headers are currently enabled for Linux GNU targets",
+ )
+ def test_os_pidfd_open(self):
+ self.assertTrue(hasattr(os, "pidfd_open"))
+
+ @unittest.skipUnless(
+ "-linux-gnu" in os.environ["TARGET_TRIPLE"],
+ "modern kernel UAPI headers are currently enabled for Linux GNU targets",
+ )
+ def test_os_getrandom(self):
+ import errno
+
+ self.assertTrue(hasattr(os, "getrandom"))
+
+ try:
+ data = os.getrandom(16)
+ except OSError as exc:
+ if exc.errno == errno.ENOSYS:
+ self.skipTest("the runtime kernel does not support getrandom")
+ raise
+
+ self.assertEqual(len(data), 16)
+
+ @unittest.skipUnless(
+ "-linux-gnu" in os.environ["TARGET_TRIPLE"],
+ "the memfd_create syscall fallback is enabled for Linux GNU targets",
+ )
+ def test_os_memfd_create(self):
+ import errno
+
+ self.assertTrue(hasattr(os, "memfd_create"))
+
+ try:
+ fd = os.memfd_create("python-build-standalone-test")
+ except OSError as exc:
+ if exc.errno == errno.ENOSYS:
+ self.skipTest("the runtime kernel does not support memfd_create")
+ raise
+
+ try:
+ os.write(fd, b"memfd_create")
+ os.lseek(fd, 0, os.SEEK_SET)
+ self.assertEqual(os.read(fd, 12), b"memfd_create")
+ finally:
+ os.close(fd)
+
+ @unittest.skipUnless(
+ "-linux-gnu" in os.environ["TARGET_TRIPLE"],
+ "the copy_file_range syscall fallback is enabled for Linux GNU targets",
+ )
+ def test_os_copy_file_range(self):
+ import errno
+
+ self.assertTrue(hasattr(os, "copy_file_range"))
+
+ data = b"copy_file_range"
+ with tempfile.TemporaryFile() as src, tempfile.TemporaryFile() as dst:
+ src.write(data)
+ src.flush()
+ src.seek(0)
+
+ try:
+ copied = os.copy_file_range(src.fileno(), dst.fileno(), len(data))
+ except OSError as exc:
+ if exc.errno == errno.ENOSYS:
+ self.skipTest("the runtime kernel does not support copy_file_range")
+ raise
+
+ self.assertEqual(copied, len(data))
+ dst.seek(0)
+ self.assertEqual(dst.read(), data)
+
+ def test_linux_uapi_not_in_sysconfig(self):
+ import sysconfig
+
+ for key, value in sysconfig.get_config_vars().items():
+ if isinstance(value, str):
+ with self.subTest(key=key):
+ self.assertNotIn("linux-uapi", value)
+
+ @unittest.skipUnless(sys.platform == "linux", "Linux-specific prctl")
+ @unittest.skipIf(
+ "static" in os.environ["BUILD_OPTIONS"],
+ "cannot import libc on static builds",
+ )
+ def test_nx_thread_creation(self):
+ "Test that thread creation works under e.g. systemd's MemoryDenyWriteExecute."
+ # Note that NX cannot be unset so this pollutes the current process,
+ # but if something else breaks under NX we probably want to know!
+ import ctypes
+ import threading
+
+ libc = ctypes.CDLL(None, use_errno=True)
+ #
+ PR_SET_MDWE = 65
+ PR_GET_MDWE = 66
+ PR_MDWE_REFUSE_EXEC_GAIN = 1 << 0
+ PR_MDWE_NO_INHERIT = 1 << 1
+ mdwe = libc.prctl(PR_GET_MDWE, 0, 0, 0, 0)
+ if mdwe < 0:
+ self.skipTest("prctl(PR_SET_MDWE) unsupported")
+ elif not (mdwe & PR_MDWE_REFUSE_EXEC_GAIN):
+ if (
+ libc.prctl(
+ PR_SET_MDWE, PR_MDWE_REFUSE_EXEC_GAIN | PR_MDWE_NO_INHERIT, 0, 0, 0
+ )
+ != 0
+ ):
+ self.fail("prctl(PR_SET_MDWE): " + os.strerror(ctypes.get_errno()))
+
+ a = []
+ t = threading.Thread(target=a.append, args=("Thread was here",))
+ t.start()
+ t.join()
+ self.assertEqual(a, ["Thread was here"])
+
if __name__ == "__main__":
unittest.main()
diff --git a/pythonbuild/docker.py b/pythonbuild/docker.py
index 0be78e4f8..931c81f63 100644
--- a/pythonbuild/docker.py
+++ b/pythonbuild/docker.py
@@ -2,12 +2,14 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
-import contextlib
import io
import operator
import os
import pathlib
+import subprocess
+import sys
import tarfile
+import typing
import docker # type: ignore
import jinja2
@@ -29,41 +31,79 @@ def write_dockerfiles(source_dir: pathlib.Path, dest_dir: pathlib.Path):
write_if_different(dest_dir / f, data.encode("utf-8"))
+def docker_platform_from_host_platform(host_platform: str) -> typing.Optional[str]:
+ """Convert a PBS host platform to a Docker platform.
+
+ This function assumes we're using a Docker daemon on the local machine.
+ """
+ # On macOS, we only use Docker to build Linux distros. We also support
+ # using Rosetta for x86-64 emulation when building from aarch64. So it
+ # is allowed to specify a non-native platform here.
+ if sys.platform == "darwin":
+ if host_platform == "linux_x86_64":
+ return "linux/amd64"
+ elif host_platform == "linux_aarch64":
+ return "linux/arm64"
+ else:
+ return None
+ else:
+ # On Linux, we currently only support running native architecture
+ # containers. Cross-compiling is achieved by running a native arch
+ # container and cross-compiling within it. We don't specify a platform
+ # here and let the Docker runtime use the defaults.
+ return None
+
+
def build_docker_image(
client, image_data: bytes, image_dir: pathlib.Path, name, host_platform
):
image_path = image_dir / f"image-{name}.{host_platform}"
- return ensure_docker_image(client, io.BytesIO(image_data), image_path=image_path)
-
-
-def ensure_docker_image(client, fh, image_path=None):
- res = client.api.build(fileobj=fh, decode=True)
-
- image = None
-
- for s in res:
- if "stream" in s:
- for l in s["stream"].strip().splitlines():
- log(l)
-
- if "aux" in s and "ID" in s["aux"]:
- image = s["aux"]["ID"]
-
- if "error" in s:
- log(s["error"])
-
- if not image:
- raise Exception("unable to determine built Docker image")
+ return ensure_docker_image(
+ client,
+ io.BytesIO(image_data),
+ image_path=image_path,
+ platform=docker_platform_from_host_platform(host_platform),
+ )
- if image_path:
- tar_path = pathlib.Path(str(image_path) + ".tar")
- with tar_path.open("wb") as fh:
- for chunk in client.images.get(image).save():
- fh.write(chunk)
- with image_path.open("w") as fh:
- fh.write(image + "\n")
+def ensure_docker_image(client, fh, image_path, platform=None):
+ args = [
+ "docker",
+ "buildx",
+ "build",
+ "--progress=plain",
+ "--load",
+ f"--iidfile={image_path}",
+ ]
+ if platform:
+ args.append(f"--platform={platform}")
+ args.append("-")
+
+ with subprocess.Popen(
+ args,
+ stdin=subprocess.PIPE,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT,
+ ) as process:
+ assert process.stdin is not None
+ assert process.stdout is not None
+ process.stdin.write(fh.read())
+ process.stdin.close()
+
+ for line in process.stdout:
+ log(line.rstrip(b"\r\n"))
+
+ returncode = process.wait()
+
+ if returncode:
+ raise subprocess.CalledProcessError(returncode, args)
+
+ image = image_path.read_text().strip()
+ tar_path = pathlib.Path(str(image_path) + ".tar")
+ with tar_path.open("wb") as fh:
+ for chunk in client.images.get(image).save():
+ fh.write(chunk)
return image
@@ -111,18 +151,6 @@ def copy_file_to_container(path, container, container_path, archive_path=None):
container.put_archive(container_path, buf.getvalue())
-@contextlib.contextmanager
-def run_container(client, image):
- container = client.containers.run(
- image, command=["/bin/sleep", "86400"], detach=True
- )
- try:
- yield container
- finally:
- container.stop(timeout=0)
- container.remove()
-
-
def container_exec(container, command, user="build", environment=None):
# docker-py's exec_run() won't return the exit code. So we reinvent the
# wheel.
diff --git a/pythonbuild/downloads.py b/pythonbuild/downloads.py
index 8a28180e8..218cb9a57 100644
--- a/pythonbuild/downloads.py
+++ b/pythonbuild/downloads.py
@@ -48,64 +48,64 @@
"license_file": "LICENSE.bzip2.txt",
},
"cpython-3.10": {
- "url": "https://www.python.org/ftp/python/3.10.20/Python-3.10.20.tar.xz",
- "size": 19868028,
- "sha256": "de6517421601e39a9a3bc3e1bc4c7b2f239297423ee05e282598c83ec0647505",
- "version": "3.10.20",
+ "url": "https://www.python.org/ftp/python/3.10.21/Python-3.10.21.tar.xz",
+ "size": 19896516,
+ "sha256": "a0da1e72132e950154eca0f6f47d5db828454700de20e5113667940d81e0db04",
+ "version": "3.10.21",
"licenses": ["Python-2.0", "CNRI-Python"],
"license_file": "LICENSE.cpython.txt",
"python_tag": "cp310",
},
"cpython-3.11": {
- "url": "https://www.python.org/ftp/python/3.11.15/Python-3.11.15.tar.xz",
- "size": 20332596,
- "sha256": "272179ddd9a2e41a0fc8e42e33dfbdca0b3711aa5abf372d3f2d51543d09b625",
- "version": "3.11.15",
+ "url": "https://www.python.org/ftp/python/3.11.16/Python-3.11.16.tar.xz",
+ "size": 20328716,
+ "sha256": "91bcdebfdde239a003ae93738a7fce0f9230fee5c4bc2b86f6e6e8c6f98aabe8",
+ "version": "3.11.16",
"licenses": ["Python-2.0", "CNRI-Python"],
"license_file": "LICENSE.cpython.txt",
"python_tag": "cp311",
},
"cpython-3.12": {
- "url": "https://www.python.org/ftp/python/3.12.13/Python-3.12.13.tar.xz",
- "size": 20801708,
- "sha256": "c08bc65a81971c1dd5783182826503369466c7e67374d1646519adf05207b684",
- "version": "3.12.13",
+ "url": "https://www.python.org/ftp/python/3.12.14/Python-3.12.14.tar.xz",
+ "size": 20820300,
+ "sha256": "5c8462af5790baf43a321a1559dbe0db06d1be4300fb85fb53c40060668e548a",
+ "version": "3.12.14",
"licenses": ["Python-2.0", "CNRI-Python"],
"license_file": "LICENSE.cpython.txt",
"python_tag": "cp312",
},
"cpython-3.13": {
- "url": "https://www.python.org/ftp/python/3.13.13/Python-3.13.13.tar.xz",
- "size": 22957612,
- "sha256": "2ab91ff401783ccca64f75d10c882e957bdfd60e2bf5a72f8421793729b78a71",
- "version": "3.13.13",
+ "url": "https://www.python.org/ftp/python/3.13.15/Python-3.13.15.tar.xz",
+ "size": 23160540,
+ "sha256": "1e66a7945a48390ee4c2a4268a0e4185884059a13c4aab6d148aa208deea4a76",
+ "version": "3.13.15",
"licenses": ["Python-2.0", "CNRI-Python"],
"license_file": "LICENSE.cpython.txt",
"python_tag": "cp313",
},
"cpython-3.14": {
- "url": "https://www.python.org/ftp/python/3.14.4/Python-3.14.4.tar.xz",
- "size": 23855332,
- "sha256": "d923c51303e38e249136fc1bdf3568d56ecb03214efdef48516176d3d7faaef8",
- "version": "3.14.4",
+ "url": "https://www.python.org/ftp/python/3.14.7/Python-3.14.7.tar.xz",
+ "size": 24053924,
+ "sha256": "3b48dac8fb59f62eaa67ac83c1eb12bda1b7a08406dd286e252c11a66be27f81",
+ "version": "3.14.7",
"licenses": ["Python-2.0", "CNRI-Python"],
"license_file": "LICENSE.cpython.txt",
"python_tag": "cp314",
},
"cpython-3.15": {
- "url": "https://www.python.org/ftp/python/3.15.0/Python-3.15.0a8.tar.xz",
- "size": 35130268,
- "sha256": "28f1b6358609042ebcc81488ec24569519f50804bb07dc23cc707b281b031c69",
- "version": "3.15.0a8",
+ "url": "https://www.python.org/ftp/python/3.15.0/Python-3.15.0rc1.tar.xz",
+ "size": 35516700,
+ "sha256": "f84dad680ab2147417d2739355c2678f0f9acffe4ae8ef77895de1454b384b07",
+ "version": "3.15.0rc1",
"licenses": ["Python-2.0", "CNRI-Python"],
"license_file": "LICENSE.cpython.txt",
"python_tag": "cp315",
},
"expat": {
- "url": "https://github.com/libexpat/libexpat/releases/download/R_2_6_3/expat-2.6.3.tar.xz",
- "size": 485600,
- "sha256": "274db254a6979bde5aad404763a704956940e465843f2a9bd9ed7af22e2c0efc",
- "version": "2.6.3",
+ "url": "https://github.com/libexpat/libexpat/releases/download/R_2_8_3/expat-2.8.3.tar.xz",
+ "size": 517264,
+ "sha256": "f6256df90c906773d344da084402b7d3e4f22ed41b1a59c989098a83d3ea0c85",
+ "version": "2.8.3",
"library_names": ["expat"],
"licenses": ["MIT"],
"license_file": "LICENSE.expat.txt",
@@ -125,20 +125,11 @@
"licenses": ["BSD-3-Clause"],
"license_file": "LICENSE.libedit.txt",
},
- "libffi-3.3": {
- "url": "https://github.com/libffi/libffi/releases/download/v3.3/libffi-3.3.tar.gz",
- "size": 1305466,
- "sha256": "72fba7922703ddfa7a028d513ac15a85c8d54c8d67f55fa5a4802885dc652056",
- "version": "3.3",
- "library_names": ["ffi"],
- "licenses": ["MIT"],
- "license_file": "LICENSE.libffi.txt",
- },
"libffi": {
- "url": "https://github.com/libffi/libffi/releases/download/v3.4.6/libffi-3.4.6.tar.gz",
- "size": 1391684,
- "sha256": "b0dea9df23c863a7a50e825440f3ebffabd65df1497108e5d437747843895a4e",
- "version": "3.4.6",
+ "url": "https://github.com/libffi/libffi/releases/download/v3.4.8/libffi-3.4.8.tar.gz",
+ "size": 1397992,
+ "sha256": "bc9842a18898bfacb0ed1252c4febcc7e78fa139fd27fdc7a3e30d9d9356119b",
+ "version": "3.4.8",
"library_names": ["ffi"],
"licenses": ["MIT"],
"license_file": "LICENSE.libffi.txt",
@@ -150,19 +141,19 @@
"version": "0.5",
},
"libX11": {
- "url": "https://www.x.org/archive/individual/lib/libX11-1.6.12.tar.gz",
- "size": 3168158,
- "sha256": "0fce5fc0a24a3dc728174eccd0cb8d6a1b37a2ec1654bd5628c84e5bc200d594",
- "version": "1.6.12",
+ "url": "https://www.x.org/releases/individual/lib/libX11-1.8.13.tar.gz",
+ "size": 3217264,
+ "sha256": "acf0e7cd7541110e6330ecb539441a2d53061f386ec7be6906dfde0de2598470",
+ "version": "1.8.13",
"library_names": ["X11", "X11-xcb"],
"licenses": ["MIT", "X11"],
"license_file": "LICENSE.libX11.txt",
},
"libXau": {
- "url": "https://www.x.org/releases/individual/lib/libXau-1.0.11.tar.gz",
- "size": 404973,
- "sha256": "3a321aaceb803577a4776a5efe78836eb095a9e44bbc7a465d29463e1a14f189",
- "version": "1.0.11",
+ "url": "https://www.x.org/releases/individual/lib/libXau-1.0.12.tar.gz",
+ "size": 418722,
+ "sha256": "2402dd938da4d0a332349ab3d3586606175e19cb32cb9fe013c19f1dc922dcee",
+ "version": "1.0.12",
"library_names": ["Xau"],
"licenses": ["MIT"],
"license_file": "LICENSE.libXau.txt",
@@ -176,6 +167,14 @@
"licenses": ["MIT"],
"license_file": "LICENSE.libxcb.txt",
},
+ # Pre-sanitized Linux UAPI headers from Debian 13 backports. This does not
+ # change the glibc headers or libraries used by selected targets.
+ "linux-uapi": {
+ "url": "https://snapshot.debian.org/archive/debian/20260624T024300Z/pool/main/l/linux/linux-libc-dev_7.0.12-2~bpo13+1_all.deb",
+ "size": 2637888,
+ "sha256": "162ba55a6e6eca68b32a80e6774f8dda4e145bd68049fb2e85760ec1546bee3c",
+ "version": "7.0.12-2~bpo13+1",
+ },
# Remember to update LLVM_URL in src/release.rs whenever upgrading.
"llvm-aarch64-linux": {
"url": "https://github.com/indygreg/toolchain-tools/releases/download/toolchain-bootstrap%2F20260410/llvm-22.1.3+20260410-gnu_only-aarch64-unknown-linux-gnu.tar.zst",
@@ -257,10 +256,10 @@
},
# Remember to update OPENSSL_VERSION_INFO in pythonbuild/disttests/ whenever upgrading.
"openssl-3.5": {
- "url": "https://github.com/openssl/openssl/releases/download/openssl-3.5.6/openssl-3.5.6.tar.gz",
- "size": 53121812,
- "sha256": "deae7c80cba99c4b4f940ecadb3c3338b13cb77418409238e57d7f31f2a3b736",
- "version": "3.5.6",
+ "url": "https://github.com/openssl/openssl/releases/download/openssl-3.5.8/openssl-3.5.8.tar.gz",
+ "size": 53213818,
+ "sha256": "a8f84a39918ec6415ce765d9b429d313ba97b8143169c172e734b9514464f5b2",
+ "version": "3.5.8",
"library_names": ["crypto", "ssl"],
"licenses": ["Apache-2.0"],
"license_file": "LICENSE.openssl-3.txt",
@@ -278,21 +277,17 @@
"sha256": "39e8aeccd7495d54df094d2b4a7c08010ff7777036faaf24f28e07777d1598e2",
"version": "0.13.1",
},
+ "pkgconf": {
+ "url": "https://github.com/pkgconf/pkgconf/releases/download/pkgconf-3.0.3/pkgconf-3.0.3.tar.xz",
+ "size": 415512,
+ "sha256": "aa033abb2b777ba4e66635495a931e53c49d86e4e4e38af68c0f76d666cbd8cf",
+ "version": "3.0.3",
+ },
"pip": {
- "url": "https://files.pythonhosted.org/packages/de/f0/c81e05b613866b76d2d1066490adf1a3dbc4ee9d9c839961c3fc8a6997af/pip-26.0.1-py3-none-any.whl",
- "size": 1787723,
- "sha256": "bdb1b08f4274833d62c1aa29e20907365a2ceb950410df15fc9521bad440122b",
- "version": "26.0.1",
- },
- "readline": {
- # Mirrored from https://ftp.gnu.org/gnu/readline/readline-8.2.tar.gz
- "url": "https://astral-sh.github.io/mirror/files/readline-8.2.tar.gz",
- "size": 3043952,
- "sha256": "3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35",
- "version": "8.2",
- "library_names": ["readline"],
- "licenses": ["GPL-3.0-only"],
- "license_file": "LICENSE.readline.txt",
+ "url": "https://files.pythonhosted.org/packages/f3/6e/1736e5b4ae2b778ef2f81c47d797de9f891d4d8acb047a24ca37a60294dd/pip-26.2.1-py3-none-any.whl",
+ "size": 1816632,
+ "sha256": "71138adf1f4ca900cdb7d289c21b7494329f2332b6d85f0e1c42108c0384ed3e",
+ "version": "26.2.1",
},
"setuptools": {
"url": "https://files.pythonhosted.org/packages/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.1-py3-none-any.whl",
@@ -302,11 +297,11 @@
},
# Remember to update pythonbuild/disttests/ when version changed.
"sqlite": {
- "url": "https://www.sqlite.org/2025/sqlite-autoconf-3500400.tar.gz",
- "size": 3173050,
- "sha256": "a3db587a1b92ee5ddac2f66b3edb41b26f9c867275782d46c3a088977d6a5b18",
- "version": "3500400",
- "actual_version": "3.50.4.0",
+ "url": "https://www.sqlite.org/2026/sqlite-autoconf-3530100.tar.gz",
+ "size": 3275272,
+ "sha256": "83e6b2020a034e9a7ad4a72feea59e1ad52f162e09cbd26735a3ffb98359fc4f",
+ "version": "3530100",
+ "actual_version": "3.53.1.0",
"library_names": ["sqlite3"],
"licenses": [],
"license_file": "LICENSE.sqlite.txt",
@@ -319,10 +314,10 @@
"version": "5.38.2.2",
},
"tcl": {
- "url": "https://prdownloads.sourceforge.net/tcl/tcl9.0.3-src.tar.gz",
- "size": 11922915,
- "sha256": "2537ba0c86112c8c953f7c09d33f134dd45c0fb3a71f2d7f7691fd301d2c33a6",
- "version": "9.0.3",
+ "url": "https://prdownloads.sourceforge.net/tcl/tcl9.0.4-src.tar.gz",
+ "size": 11866337,
+ "sha256": "d0aed49230bc02a65c1e0229e65f34590a4b037ec40d546f32573b467f7551ea",
+ "version": "9.0.4",
"library_names": ["tcl9.0"],
"licenses": ["TCL"],
"license_file": "LICENSE.tcl.txt",
@@ -336,15 +331,22 @@
"license_file": "LICENSE.tix.txt",
},
"tk": {
- "url": "https://prdownloads.sourceforge.net/tcl/tk9.0.3-src.tar.gz",
- "size": 4644835,
- "sha256": "bf344efadb618babb7933f69275620f72454d1c8220130da93e3f7feb0efbf9b",
- "version": "9.0.3",
+ "url": "https://prdownloads.sourceforge.net/tcl/tk9.0.4-src.tar.gz",
+ "size": 4613019,
+ "sha256": "d7a146d2917eb8b5cc95276dbf0e3d03c7464d2b19c1675357857c989301dbb4",
+ "version": "9.0.4",
"library_names": ["tk9.0"],
"licenses": ["TCL"],
"license_file": "LICENSE.tcl.txt",
},
- "tk-windows-bin": {
+ "tk-windows-bin-904": {
+ "url": "https://github.com/python/cpython-bin-deps/archive/907f3f4de820cb74fc8fb4431a39beae4c690915.tar.gz",
+ "size": 15632291,
+ "sha256": "e7aaa6417b7c2301ecd876307cced7e5bc4575a0b96e66dd08fcb6ab0d5d87a8",
+ "version": "9.0.4",
+ "git_commit": "907f3f4de820cb74fc8fb4431a39beae4c690915",
+ },
+ "tk-windows-bin-8614": {
"url": "https://github.com/python/cpython-bin-deps/archive/c624cc881bd0e5071dec9de4b120cbe9985d8c14.tar.gz",
"size": 9497943,
"sha256": "9b8e77d55f40ceaedd140ccca0daa804f0d43346d5abfcead9b547b5590f82f8",
@@ -398,10 +400,10 @@
"version": "1.17.0",
},
"xorgproto": {
- "url": "https://www.x.org/archive/individual/proto/xorgproto-2024.1.tar.gz",
- "size": 1115486,
- "sha256": "4f6b9b4faf91e5df8265b71843a91fc73dc895be6210c84117a996545df296ce",
- "version": "2024.1",
+ "url": "https://www.x.org/releases/individual/proto/xorgproto-2025.1.tar.gz",
+ "size": 1127613,
+ "sha256": "d6f89f65bafb8c9b735e0515882b8a1511e8e864dde5e9513e191629369f2256",
+ "version": "2025.1",
},
"xtrans": {
"url": "https://www.x.org/archive/individual/lib/xtrans-1.6.0.tar.gz",
@@ -412,10 +414,10 @@
# IMPORTANT: xz 5.6.0 was released with a backdoor (CVE-2024-3094). This has been resolved.
# Be cautious before taking any xz upgrades given this past behavior.
"xz": {
- "url": "https://github.com/tukaani-project/xz/releases/download/v5.8.1/xz-5.8.1.tar.gz",
- "size": 2587189,
- "sha256": "507825b599356c10dca1cd720c9d0d0c9d5400b9de300af00e4d1ea150795543",
- "version": "5.8.1",
+ "url": "https://github.com/tukaani-project/xz/releases/download/v5.8.3/xz-5.8.3.tar.gz",
+ "size": 2771455,
+ "sha256": "3d3a1b973af218114f4f889bbaa2f4c037deaae0c8e815eec381c3d546b974a0",
+ "version": "5.8.3",
"library_names": ["lzma"],
# liblzma is licensed as 0BSD. Other parts of code have different licenses.
# But we only use liblzma.
@@ -423,10 +425,10 @@
"license_file": "LICENSE.liblzma.txt",
},
"zlib": {
- "url": "https://github.com/madler/zlib/releases/download/v1.3.1/zlib-1.3.1.tar.gz",
- "size": 1512791,
- "sha256": "9a93b2b7dfdac77ceba5a558a580e74667dd6fede4585b91eefb60f03b72df23",
- "version": "1.3.1",
+ "url": "https://github.com/madler/zlib/releases/download/v1.3.2/zlib-1.3.2.tar.gz",
+ "size": 1502830,
+ "sha256": "bb329a0a2cd0274d05519d61c667c062e06990d72e125ee2dfa8de64f0119d16",
+ "version": "1.3.2",
"library_names": ["z"],
"licenses": ["Zlib"],
"license_file": "LICENSE.zlib.txt",
diff --git a/pythonbuild/testdist.py b/pythonbuild/testdist.py
index a1376e727..c43a83656 100644
--- a/pythonbuild/testdist.py
+++ b/pythonbuild/testdist.py
@@ -34,7 +34,7 @@ def run_dist_python(
env = dict(os.environ)
# Wipe PYTHON environment variables.
- for k in env:
+ for k in list(env):
if k.startswith("PYTHON"):
del env[k]
diff --git a/requirements.dev.in b/requirements.dev.in
deleted file mode 100644
index 2f64d57f3..000000000
--- a/requirements.dev.in
+++ /dev/null
@@ -1,7 +0,0 @@
--r requirements.txt
-
-ruff
-mypy
-types-jsonschema
-types-PyYAML
-types-jinja2
diff --git a/requirements.dev.txt b/requirements.dev.txt
deleted file mode 100644
index f09be0336..000000000
--- a/requirements.dev.txt
+++ /dev/null
@@ -1,612 +0,0 @@
-# This file was autogenerated by uv via the following command:
-# uv pip compile --generate-hashes requirements.dev.in -o requirements.dev.txt
-attrs==24.3.0 \
- --hash=sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff \
- --hash=sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308
- # via
- # -r requirements.txt
- # jsonschema
- # referencing
-certifi==2024.12.14 \
- --hash=sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56 \
- --hash=sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db
- # via
- # -r requirements.txt
- # requests
-charset-normalizer==3.4.1 \
- --hash=sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537 \
- --hash=sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa \
- --hash=sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a \
- --hash=sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294 \
- --hash=sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b \
- --hash=sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd \
- --hash=sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601 \
- --hash=sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd \
- --hash=sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4 \
- --hash=sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d \
- --hash=sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2 \
- --hash=sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313 \
- --hash=sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd \
- --hash=sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa \
- --hash=sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8 \
- --hash=sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1 \
- --hash=sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2 \
- --hash=sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496 \
- --hash=sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d \
- --hash=sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b \
- --hash=sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e \
- --hash=sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a \
- --hash=sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4 \
- --hash=sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca \
- --hash=sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78 \
- --hash=sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408 \
- --hash=sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5 \
- --hash=sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3 \
- --hash=sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f \
- --hash=sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a \
- --hash=sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765 \
- --hash=sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6 \
- --hash=sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146 \
- --hash=sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6 \
- --hash=sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9 \
- --hash=sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd \
- --hash=sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c \
- --hash=sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f \
- --hash=sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545 \
- --hash=sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176 \
- --hash=sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770 \
- --hash=sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824 \
- --hash=sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f \
- --hash=sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf \
- --hash=sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487 \
- --hash=sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d \
- --hash=sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd \
- --hash=sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b \
- --hash=sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534 \
- --hash=sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f \
- --hash=sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b \
- --hash=sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9 \
- --hash=sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd \
- --hash=sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125 \
- --hash=sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9 \
- --hash=sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de \
- --hash=sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11 \
- --hash=sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d \
- --hash=sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35 \
- --hash=sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f \
- --hash=sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda \
- --hash=sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7 \
- --hash=sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a \
- --hash=sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971 \
- --hash=sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8 \
- --hash=sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41 \
- --hash=sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d \
- --hash=sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f \
- --hash=sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757 \
- --hash=sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a \
- --hash=sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886 \
- --hash=sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77 \
- --hash=sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76 \
- --hash=sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247 \
- --hash=sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85 \
- --hash=sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb \
- --hash=sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7 \
- --hash=sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e \
- --hash=sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6 \
- --hash=sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037 \
- --hash=sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1 \
- --hash=sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e \
- --hash=sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807 \
- --hash=sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407 \
- --hash=sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c \
- --hash=sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12 \
- --hash=sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3 \
- --hash=sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089 \
- --hash=sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd \
- --hash=sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e \
- --hash=sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00 \
- --hash=sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616
- # via
- # -r requirements.txt
- # requests
-docker==7.1.0 \
- --hash=sha256:ad8c70e6e3f8926cb8a92619b832b4ea5299e2831c14284663184e200546fa6c \
- --hash=sha256:c96b93b7f0a746f9e77d325bcfb87422a3d8bd4f03136ae8a85b37f1898d5fc0
- # via -r requirements.txt
-idna==3.10 \
- --hash=sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9 \
- --hash=sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3
- # via
- # -r requirements.txt
- # requests
-jinja2==3.1.5 \
- --hash=sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb \
- --hash=sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb
- # via -r requirements.txt
-jsonschema==4.23.0 \
- --hash=sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4 \
- --hash=sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566
- # via -r requirements.txt
-jsonschema-specifications==2024.10.1 \
- --hash=sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272 \
- --hash=sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf
- # via
- # -r requirements.txt
- # jsonschema
-markupsafe==3.0.2 \
- --hash=sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4 \
- --hash=sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30 \
- --hash=sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0 \
- --hash=sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9 \
- --hash=sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396 \
- --hash=sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13 \
- --hash=sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028 \
- --hash=sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca \
- --hash=sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557 \
- --hash=sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832 \
- --hash=sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0 \
- --hash=sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b \
- --hash=sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579 \
- --hash=sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a \
- --hash=sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c \
- --hash=sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff \
- --hash=sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c \
- --hash=sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22 \
- --hash=sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094 \
- --hash=sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb \
- --hash=sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e \
- --hash=sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5 \
- --hash=sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a \
- --hash=sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d \
- --hash=sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a \
- --hash=sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b \
- --hash=sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8 \
- --hash=sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225 \
- --hash=sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c \
- --hash=sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144 \
- --hash=sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f \
- --hash=sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87 \
- --hash=sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d \
- --hash=sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93 \
- --hash=sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf \
- --hash=sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158 \
- --hash=sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84 \
- --hash=sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb \
- --hash=sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48 \
- --hash=sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171 \
- --hash=sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c \
- --hash=sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6 \
- --hash=sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd \
- --hash=sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d \
- --hash=sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1 \
- --hash=sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d \
- --hash=sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca \
- --hash=sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a \
- --hash=sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29 \
- --hash=sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe \
- --hash=sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798 \
- --hash=sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c \
- --hash=sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8 \
- --hash=sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f \
- --hash=sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f \
- --hash=sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a \
- --hash=sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178 \
- --hash=sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0 \
- --hash=sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79 \
- --hash=sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430 \
- --hash=sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50
- # via
- # -r requirements.txt
- # jinja2
-mypy==1.18.1 \
- --hash=sha256:040ecc95e026f71a9ad7956fea2724466602b561e6a25c2e5584160d3833aaa8 \
- --hash=sha256:1a0e70b87eb27b33209fa4792b051c6947976f6ab829daa83819df5f58330c71 \
- --hash=sha256:1cabb353194d2942522546501c0ff75c4043bf3b63069cb43274491b44b773c9 \
- --hash=sha256:1f95cc4f01c0f1701ca3b0355792bccec13ecb2ec1c469e5b85a6ef398398b1d \
- --hash=sha256:261fbfced030228bc0f724d5d92f9ae69f46373bdfd0e04a533852677a11dbea \
- --hash=sha256:2657654d82fcd2a87e02a33e0d23001789a554059bbf34702d623dafe353eabf \
- --hash=sha256:2761b6ae22a2b7d8e8607fb9b81ae90bc2e95ec033fd18fa35e807af6c657763 \
- --hash=sha256:2a0c8392c19934c2b6c65566d3a6abdc6b51d5da7f5d04e43f0eb627d6eeee65 \
- --hash=sha256:2cd2c1e0f3a7465f22731987fff6fc427e3dcbb4ca5f7db5bbeaff2ff9a31f6d \
- --hash=sha256:2fbcecbe5cf213ba294aa8c0b8c104400bf7bb64db82fb34fe32a205da4b3531 \
- --hash=sha256:320f0ad4205eefcb0e1a72428dde0ad10be73da9f92e793c36228e8ebf7298c0 \
- --hash=sha256:4dc6b34a1c6875e6286e27d836a35c0d04e8316beac4482d42cfea7ed2527df8 \
- --hash=sha256:502cde8896be8e638588b90fdcb4c5d5b8c1b004dfc63fd5604a973547367bb9 \
- --hash=sha256:51531b6e94f34b8bd8b01dee52bbcee80daeac45e69ec5c36e25bce51cbc46e6 \
- --hash=sha256:5956ecaabb3a245e3f34100172abca1507be687377fe20e24d6a7557e07080e2 \
- --hash=sha256:5b10e3ea7f2eec23b4929a3fabf84505da21034a4f4b9613cda81217e92b74f3 \
- --hash=sha256:6c903857b3e28fc5489e54042684a9509039ea0aedb2a619469438b544ae1961 \
- --hash=sha256:738b171690c8e47c93569635ee8ec633d2cdb06062f510b853b5f233020569a9 \
- --hash=sha256:7509549b5e41be279afc1228242d0e397f1af2919a8f2877ad542b199dc4083e \
- --hash=sha256:82ace21edf7ba8af31c3308a61dc72df30500f4dbb26f99ac36b4b80809d7e94 \
- --hash=sha256:8750ceb014a96c9890421c83f0db53b0f3b8633e2864c6f9bc0a8e93951ed18d \
- --hash=sha256:8c05a7f8c00300a52f3a4fcc95a185e99bf944d7e851ff141bae8dcf6dcfeac4 \
- --hash=sha256:913f668ec50c3337b89df22f973c1c8f0b29ee9e290a8b7fe01cc1ef7446d42e \
- --hash=sha256:937e3ed86cb731276706e46e03512547e43c391a13f363e08d0fee49a7c38a0d \
- --hash=sha256:99f272c9b59f5826fffa439575716276d19cbf9654abc84a2ba2d77090a0ba14 \
- --hash=sha256:9e988c64ad3ac5987f43f5154f884747faf62141b7f842e87465b45299eea5a9 \
- --hash=sha256:a2dfd53dfe632f1ef5d161150a4b1f2d0786746ae02950eb3ac108964ee2975a \
- --hash=sha256:b76a4de66a0ac01da1be14ecc8ae88ddea33b8380284a9e3eae39d57ebcbe26e \
- --hash=sha256:b8367e33506300f07a43012fc546402f283c3f8bcff1dc338636affb710154ce \
- --hash=sha256:ba24603c58e34dd5b096dfad792d87b304fc6470cbb1c22fd64e7ebd17edcc61 \
- --hash=sha256:c378d946e8a60be6b6ede48c878d145546fb42aad61df998c056ec151bf6c746 \
- --hash=sha256:d70d2b5baf9b9a20bc9c730015615ae3243ef47fb4a58ad7b31c3e0a59b5ef1f \
- --hash=sha256:dbfdea20e90e9c5476cea80cfd264d8e197c6ef2c58483931db2eefb2f7adc14 \
- --hash=sha256:e37763af63a8018308859bc83d9063c501a5820ec5bd4a19f0a2ac0d1c25c061 \
- --hash=sha256:e4f16c0019d48941220ac60b893615be2f63afedaba6a0801bdcd041b96991ce \
- --hash=sha256:ed36662fb92ae4cb3cacc682ec6656208f323bbc23d4b08d091eecfc0863d4b5 \
- --hash=sha256:f85eb7efa2ec73ef63fc23b8af89c2fe5bf2a4ad985ed2d3ff28c1bb3c317c92 \
- --hash=sha256:fb89ea08ff41adf59476b235293679a6eb53a7b9400f6256272fb6029bec3ce5
- # via -r requirements.dev.in
-mypy-extensions==1.0.0 \
- --hash=sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d \
- --hash=sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782
- # via mypy
-pathspec==0.12.1 \
- --hash=sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08 \
- --hash=sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712
- # via mypy
-pyyaml==6.0.2 \
- --hash=sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff \
- --hash=sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48 \
- --hash=sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086 \
- --hash=sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e \
- --hash=sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133 \
- --hash=sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5 \
- --hash=sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484 \
- --hash=sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee \
- --hash=sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5 \
- --hash=sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68 \
- --hash=sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a \
- --hash=sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf \
- --hash=sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99 \
- --hash=sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8 \
- --hash=sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85 \
- --hash=sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19 \
- --hash=sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc \
- --hash=sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a \
- --hash=sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1 \
- --hash=sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317 \
- --hash=sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c \
- --hash=sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631 \
- --hash=sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d \
- --hash=sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652 \
- --hash=sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5 \
- --hash=sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e \
- --hash=sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b \
- --hash=sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8 \
- --hash=sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476 \
- --hash=sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706 \
- --hash=sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563 \
- --hash=sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237 \
- --hash=sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b \
- --hash=sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083 \
- --hash=sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180 \
- --hash=sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425 \
- --hash=sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e \
- --hash=sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f \
- --hash=sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725 \
- --hash=sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183 \
- --hash=sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab \
- --hash=sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774 \
- --hash=sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725 \
- --hash=sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e \
- --hash=sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5 \
- --hash=sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d \
- --hash=sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290 \
- --hash=sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44 \
- --hash=sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed \
- --hash=sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4 \
- --hash=sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba \
- --hash=sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12 \
- --hash=sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4
- # via -r requirements.txt
-referencing==0.35.1 \
- --hash=sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c \
- --hash=sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de
- # via
- # -r requirements.txt
- # jsonschema
- # jsonschema-specifications
- # types-jsonschema
-requests==2.32.3 \
- --hash=sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760 \
- --hash=sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6
- # via
- # -r requirements.txt
- # docker
-rpds-py==0.22.3 \
- --hash=sha256:009de23c9c9ee54bf11303a966edf4d9087cd43a6003672e6aa7def643d06518 \
- --hash=sha256:02fbb9c288ae08bcb34fb41d516d5eeb0455ac35b5512d03181d755d80810059 \
- --hash=sha256:0a0461200769ab3b9ab7e513f6013b7a97fdeee41c29b9db343f3c5a8e2b9e61 \
- --hash=sha256:0b09865a9abc0ddff4e50b5ef65467cd94176bf1e0004184eb915cbc10fc05c5 \
- --hash=sha256:0b8db6b5b2d4491ad5b6bdc2bc7c017eec108acbf4e6785f42a9eb0ba234f4c9 \
- --hash=sha256:0c150c7a61ed4a4f4955a96626574e9baf1adf772c2fb61ef6a5027e52803543 \
- --hash=sha256:0f3cec041684de9a4684b1572fe28c7267410e02450f4561700ca5a3bc6695a2 \
- --hash=sha256:1352ae4f7c717ae8cba93421a63373e582d19d55d2ee2cbb184344c82d2ae55a \
- --hash=sha256:177c7c0fce2855833819c98e43c262007f42ce86651ffbb84f37883308cb0e7d \
- --hash=sha256:1978d0021e943aae58b9b0b196fb4895a25cc53d3956b8e35e0b7682eefb6d56 \
- --hash=sha256:1a60bce91f81ddaac922a40bbb571a12c1070cb20ebd6d49c48e0b101d87300d \
- --hash=sha256:1aef18820ef3e4587ebe8b3bc9ba6e55892a6d7b93bac6d29d9f631a3b4befbd \
- --hash=sha256:1e9663daaf7a63ceccbbb8e3808fe90415b0757e2abddbfc2e06c857bf8c5e2b \
- --hash=sha256:20070c65396f7373f5df4005862fa162db5d25d56150bddd0b3e8214e8ef45b4 \
- --hash=sha256:214b7a953d73b5e87f0ebece4a32a5bd83c60a3ecc9d4ec8f1dca968a2d91e99 \
- --hash=sha256:22bebe05a9ffc70ebfa127efbc429bc26ec9e9b4ee4d15a740033efda515cf3d \
- --hash=sha256:24e8abb5878e250f2eb0d7859a8e561846f98910326d06c0d51381fed59357bd \
- --hash=sha256:26fd7cac7dd51011a245f29a2cc6489c4608b5a8ce8d75661bb4a1066c52dfbe \
- --hash=sha256:27b1d3b3915a99208fee9ab092b8184c420f2905b7d7feb4aeb5e4a9c509b8a1 \
- --hash=sha256:27e98004595899949bd7a7b34e91fa7c44d7a97c40fcaf1d874168bb652ec67e \
- --hash=sha256:2b8f60e1b739a74bab7e01fcbe3dddd4657ec685caa04681df9d562ef15b625f \
- --hash=sha256:2de29005e11637e7a2361fa151f780ff8eb2543a0da1413bb951e9f14b699ef3 \
- --hash=sha256:2e8b55d8517a2fda8d95cb45d62a5a8bbf9dd0ad39c5b25c8833efea07b880ca \
- --hash=sha256:2fa4331c200c2521512595253f5bb70858b90f750d39b8cbfd67465f8d1b596d \
- --hash=sha256:3445e07bf2e8ecfeef6ef67ac83de670358abf2996916039b16a218e3d95e97e \
- --hash=sha256:3453e8d41fe5f17d1f8e9c383a7473cd46a63661628ec58e07777c2fff7196dc \
- --hash=sha256:378753b4a4de2a7b34063d6f95ae81bfa7b15f2c1a04a9518e8644e81807ebea \
- --hash=sha256:3af6e48651c4e0d2d166dc1b033b7042ea3f871504b6805ba5f4fe31581d8d38 \
- --hash=sha256:3dfcbc95bd7992b16f3f7ba05af8a64ca694331bd24f9157b49dadeeb287493b \
- --hash=sha256:3f21f0495edea7fdbaaa87e633a8689cd285f8f4af5c869f27bc8074638ad69c \
- --hash=sha256:4041711832360a9b75cfb11b25a6a97c8fb49c07b8bd43d0d02b45d0b499a4ff \
- --hash=sha256:44d61b4b7d0c2c9ac019c314e52d7cbda0ae31078aabd0f22e583af3e0d79723 \
- --hash=sha256:4617e1915a539a0d9a9567795023de41a87106522ff83fbfaf1f6baf8e85437e \
- --hash=sha256:4b232061ca880db21fa14defe219840ad9b74b6158adb52ddf0e87bead9e8493 \
- --hash=sha256:5246b14ca64a8675e0a7161f7af68fe3e910e6b90542b4bfb5439ba752191df6 \
- --hash=sha256:5725dd9cc02068996d4438d397e255dcb1df776b7ceea3b9cb972bdb11260a83 \
- --hash=sha256:583f6a1993ca3369e0f80ba99d796d8e6b1a3a2a442dd4e1a79e652116413091 \
- --hash=sha256:59259dc58e57b10e7e18ce02c311804c10c5a793e6568f8af4dead03264584d1 \
- --hash=sha256:593eba61ba0c3baae5bc9be2f5232430453fb4432048de28399ca7376de9c627 \
- --hash=sha256:59f4a79c19232a5774aee369a0c296712ad0e77f24e62cad53160312b1c1eaa1 \
- --hash=sha256:5f0e260eaf54380380ac3808aa4ebe2d8ca28b9087cf411649f96bad6900c728 \
- --hash=sha256:62d9cfcf4948683a18a9aff0ab7e1474d407b7bab2ca03116109f8464698ab16 \
- --hash=sha256:64607d4cbf1b7e3c3c8a14948b99345eda0e161b852e122c6bb71aab6d1d798c \
- --hash=sha256:655ca44a831ecb238d124e0402d98f6212ac527a0ba6c55ca26f616604e60a45 \
- --hash=sha256:666ecce376999bf619756a24ce15bb14c5bfaf04bf00abc7e663ce17c3f34fe7 \
- --hash=sha256:68049202f67380ff9aa52f12e92b1c30115f32e6895cd7198fa2a7961621fc5a \
- --hash=sha256:69803198097467ee7282750acb507fba35ca22cc3b85f16cf45fb01cb9097730 \
- --hash=sha256:6c7b99ca52c2c1752b544e310101b98a659b720b21db00e65edca34483259967 \
- --hash=sha256:6dd9412824c4ce1aca56c47b0991e65bebb7ac3f4edccfd3f156150c96a7bf25 \
- --hash=sha256:70eb60b3ae9245ddea20f8a4190bd79c705a22f8028aaf8bbdebe4716c3fab24 \
- --hash=sha256:70fb28128acbfd264eda9bf47015537ba3fe86e40d046eb2963d75024be4d055 \
- --hash=sha256:7b2513ba235829860b13faa931f3b6846548021846ac808455301c23a101689d \
- --hash=sha256:7ef9d9da710be50ff6809fed8f1963fecdfecc8b86656cadfca3bc24289414b0 \
- --hash=sha256:81e69b0a0e2537f26d73b4e43ad7bc8c8efb39621639b4434b76a3de50c6966e \
- --hash=sha256:8633e471c6207a039eff6aa116e35f69f3156b3989ea3e2d755f7bc41754a4a7 \
- --hash=sha256:8bd7c8cfc0b8247c8799080fbff54e0b9619e17cdfeb0478ba7295d43f635d7c \
- --hash=sha256:9253fc214112405f0afa7db88739294295f0e08466987f1d70e29930262b4c8f \
- --hash=sha256:99b37292234e61325e7a5bb9689e55e48c3f5f603af88b1642666277a81f1fbd \
- --hash=sha256:9bd7228827ec7bb817089e2eb301d907c0d9827a9e558f22f762bb690b131652 \
- --hash=sha256:9beeb01d8c190d7581a4d59522cd3d4b6887040dcfc744af99aa59fef3e041a8 \
- --hash=sha256:a63cbdd98acef6570c62b92a1e43266f9e8b21e699c363c0fef13bd530799c11 \
- --hash=sha256:a76e42402542b1fae59798fab64432b2d015ab9d0c8c47ba7addddbaf7952333 \
- --hash=sha256:ac0a03221cdb5058ce0167ecc92a8c89e8d0decdc9e99a2ec23380793c4dcb96 \
- --hash=sha256:b0b4136a252cadfa1adb705bb81524eee47d9f6aab4f2ee4fa1e9d3cd4581f64 \
- --hash=sha256:b25bc607423935079e05619d7de556c91fb6adeae9d5f80868dde3468657994b \
- --hash=sha256:b3d504047aba448d70cf6fa22e06cb09f7cbd761939fdd47604f5e007675c24e \
- --hash=sha256:bb47271f60660803ad11f4c61b42242b8c1312a31c98c578f79ef9387bbde21c \
- --hash=sha256:bbb232860e3d03d544bc03ac57855cd82ddf19c7a07651a7c0fdb95e9efea8b9 \
- --hash=sha256:bc27863442d388870c1809a87507727b799c8460573cfbb6dc0eeaef5a11b5ec \
- --hash=sha256:bc51abd01f08117283c5ebf64844a35144a0843ff7b2983e0648e4d3d9f10dbb \
- --hash=sha256:be2eb3f2495ba669d2a985f9b426c1797b7d48d6963899276d22f23e33d47e37 \
- --hash=sha256:bf9db5488121b596dbfc6718c76092fda77b703c1f7533a226a5a9f65248f8ad \
- --hash=sha256:c58e2339def52ef6b71b8f36d13c3688ea23fa093353f3a4fee2556e62086ec9 \
- --hash=sha256:cfbc454a2880389dbb9b5b398e50d439e2e58669160f27b60e5eca11f68ae17c \
- --hash=sha256:cff63a0272fcd259dcc3be1657b07c929c466b067ceb1c20060e8d10af56f5bf \
- --hash=sha256:d115bffdd417c6d806ea9069237a4ae02f513b778e3789a359bc5856e0404cc4 \
- --hash=sha256:d20cfb4e099748ea39e6f7b16c91ab057989712d31761d3300d43134e26e165f \
- --hash=sha256:d48424e39c2611ee1b84ad0f44fb3b2b53d473e65de061e3f460fc0be5f1939d \
- --hash=sha256:e0fa2d4ec53dc51cf7d3bb22e0aa0143966119f42a0c3e4998293a3dd2856b09 \
- --hash=sha256:e32fee8ab45d3c2db6da19a5323bc3362237c8b653c70194414b892fd06a080d \
- --hash=sha256:e35ba67d65d49080e8e5a1dd40101fccdd9798adb9b050ff670b7d74fa41c566 \
- --hash=sha256:e3fb866d9932a3d7d0c82da76d816996d1667c44891bd861a0f97ba27e84fc74 \
- --hash=sha256:e61b02c3f7a1e0b75e20c3978f7135fd13cb6cf551bf4a6d29b999a88830a338 \
- --hash=sha256:e67ba3c290821343c192f7eae1d8fd5999ca2dc99994114643e2f2d3e6138b15 \
- --hash=sha256:e79dd39f1e8c3504be0607e5fc6e86bb60fe3584bec8b782578c3b0fde8d932c \
- --hash=sha256:e89391e6d60251560f0a8f4bd32137b077a80d9b7dbe6d5cab1cd80d2746f648 \
- --hash=sha256:ea7433ce7e4bfc3a85654aeb6747babe3f66eaf9a1d0c1e7a4435bbdf27fea84 \
- --hash=sha256:eaf16ae9ae519a0e237a0f528fd9f0197b9bb70f40263ee57ae53c2b8d48aeb3 \
- --hash=sha256:eb0c341fa71df5a4595f9501df4ac5abfb5a09580081dffbd1ddd4654e6e9123 \
- --hash=sha256:f276b245347e6e36526cbd4a266a417796fc531ddf391e43574cf6466c492520 \
- --hash=sha256:f47ad3d5f3258bd7058d2d506852217865afefe6153a36eb4b6928758041d831 \
- --hash=sha256:f56a6b404f74ab372da986d240e2e002769a7d7102cc73eb238a4f72eec5284e \
- --hash=sha256:f5cf2a0c2bdadf3791b5c205d55a37a54025c6e18a71c71f82bb536cf9a454bf \
- --hash=sha256:f5d36399a1b96e1a5fdc91e0522544580dbebeb1f77f27b2b0ab25559e103b8b \
- --hash=sha256:f60bd8423be1d9d833f230fdbccf8f57af322d96bcad6599e5a771b151398eb2 \
- --hash=sha256:f612463ac081803f243ff13cccc648578e2279295048f2a8d5eb430af2bae6e3 \
- --hash=sha256:f73d3fef726b3243a811121de45193c0ca75f6407fe66f3f4e183c983573e130 \
- --hash=sha256:f82a116a1d03628a8ace4859556fb39fd1424c933341a08ea3ed6de1edb0283b \
- --hash=sha256:fb0ba113b4983beac1a2eb16faffd76cb41e176bf58c4afe3e14b9c681f702de \
- --hash=sha256:fb4f868f712b2dd4bcc538b0a0c1f63a2b1d584c925e69a224d759e7070a12d5 \
- --hash=sha256:fb6116dfb8d1925cbdb52595560584db42a7f664617a1f7d7f6e32f138cdf37d \
- --hash=sha256:fda7cb070f442bf80b642cd56483b5548e43d366fe3f39b98e67cce780cded00 \
- --hash=sha256:feea821ee2a9273771bae61194004ee2fc33f8ec7db08117ef9147d4bbcbca8e
- # via
- # -r requirements.txt
- # jsonschema
- # referencing
-ruff==0.13.0 \
- --hash=sha256:03447f3d18479df3d24917a92d768a89f873a7181a064858ea90a804a7538991 \
- --hash=sha256:0f96a8d90bb258d7d3358b372905fe7333aaacf6c39e2408b9f8ba181f4b6ef2 \
- --hash=sha256:137f3d65d58ee828ae136a12d1dc33d992773d8f7644bc6b82714570f31b2004 \
- --hash=sha256:21ae48151b66e71fd111b7d79f9ad358814ed58c339631450c66a4be33cc28b9 \
- --hash=sha256:2b2c653ae9b9d46e0ef62fc6fbf5b979bda20a0b1d2b22f8f7eb0cde9f4963b8 \
- --hash=sha256:48e5c25c7a3713eea9ce755995767f4dcd1b0b9599b638b12946e892123d1efb \
- --hash=sha256:4cec632534332062bc9eb5884a267b689085a1afea9801bf94e3ba7498a2d207 \
- --hash=sha256:4e473e8f0e6a04e4113f2e1de12a5039579892329ecc49958424e5568ef4f768 \
- --hash=sha256:5b4b1ee7eb35afae128ab94459b13b2baaed282b1fb0f472a73c82c996c8ae60 \
- --hash=sha256:64de45f4ca5441209e41742d527944635a05a6e7c05798904f39c85bafa819e3 \
- --hash=sha256:79ea0c44a3032af768cabfd9616e44c24303af49d633b43e3a5096e009ebe823 \
- --hash=sha256:94b5e3d883e4f924c5298e3f2ee0f3085819c14f68d1e5b6715597681433f153 \
- --hash=sha256:a8ab6a3e03665d39d4a25ee199d207a488724f022db0e1fe4002968abdb8001b \
- --hash=sha256:ab80525317b1e1d38614addec8ac954f1b3e662de9d59114ecbf771d00cf613e \
- --hash=sha256:afe37db8e1466acb173bb2a39ca92df00570e0fd7c94c72d87b51b21bb63efea \
- --hash=sha256:b7b85ca27aeeb1ab421bc787009831cffe6048faae08ad80867edab9f2760945 \
- --hash=sha256:d2a5c62f8ccc6dd2fe259917482de7275cecc86141ee10432727c4816235bc41 \
- --hash=sha256:dcd628101d9f7d122e120ac7c17e0a0f468b19bc925501dbe03c1cb7f5415b24 \
- --hash=sha256:fbc6b1934eb1c0033da427c805e27d164bb713f8e273a024a7e86176d7f462cf
- # via -r requirements.dev.in
-six==1.17.0 \
- --hash=sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 \
- --hash=sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81
- # via -r requirements.txt
-tomli==2.2.1 \
- --hash=sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6 \
- --hash=sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd \
- --hash=sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c \
- --hash=sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b \
- --hash=sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8 \
- --hash=sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6 \
- --hash=sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77 \
- --hash=sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff \
- --hash=sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea \
- --hash=sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192 \
- --hash=sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249 \
- --hash=sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee \
- --hash=sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4 \
- --hash=sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98 \
- --hash=sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8 \
- --hash=sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4 \
- --hash=sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281 \
- --hash=sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744 \
- --hash=sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69 \
- --hash=sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13 \
- --hash=sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140 \
- --hash=sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e \
- --hash=sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e \
- --hash=sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc \
- --hash=sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff \
- --hash=sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec \
- --hash=sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2 \
- --hash=sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222 \
- --hash=sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106 \
- --hash=sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272 \
- --hash=sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a \
- --hash=sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7
- # via -r requirements.txt
-types-jinja2==2.11.9 \
- --hash=sha256:60a1e21e8296979db32f9374d8a239af4cb541ff66447bb915d8ad398f9c63b2 \
- --hash=sha256:dbdc74a40aba7aed520b7e4d89e8f0fe4286518494208b35123bcf084d4b8c81
- # via -r requirements.dev.in
-types-jsonschema==4.25.1.20250822 \
- --hash=sha256:aac69ed4b23f49aaceb7fcb834141d61b9e4e6a7f6008cb2f0d3b831dfa8464a \
- --hash=sha256:f82c2d7fa1ce1c0b84ba1de4ed6798469768188884db04e66421913a4e181294
- # via -r requirements.dev.in
-types-markupsafe==1.1.10 \
- --hash=sha256:85b3a872683d02aea3a5ac2a8ef590193c344092032f58457287fbf8e06711b1 \
- --hash=sha256:ca2bee0f4faafc45250602567ef38d533e877d2ddca13003b319c551ff5b3cc5
- # via types-jinja2
-types-pyyaml==6.0.12.20250915 \
- --hash=sha256:0f8b54a528c303f0e6f7165687dd33fafa81c807fcac23f632b63aa624ced1d3 \
- --hash=sha256:e7d4d9e064e89a3b3cae120b4990cd370874d2bf12fa5f46c97018dd5d3c9ab6
- # via -r requirements.dev.in
-typing-extensions==4.14.1 \
- --hash=sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36 \
- --hash=sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76
- # via
- # -r requirements.txt
- # mypy
-urllib3==2.3.0 \
- --hash=sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df \
- --hash=sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d
- # via
- # -r requirements.txt
- # docker
- # requests
-zstandard==0.23.0 \
- --hash=sha256:034b88913ecc1b097f528e42b539453fa82c3557e414b3de9d5632c80439a473 \
- --hash=sha256:0a7f0804bb3799414af278e9ad51be25edf67f78f916e08afdb983e74161b916 \
- --hash=sha256:11e3bf3c924853a2d5835b24f03eeba7fc9b07d8ca499e247e06ff5676461a15 \
- --hash=sha256:12a289832e520c6bd4dcaad68e944b86da3bad0d339ef7989fb7e88f92e96072 \
- --hash=sha256:1516c8c37d3a053b01c1c15b182f3b5f5eef19ced9b930b684a73bad121addf4 \
- --hash=sha256:157e89ceb4054029a289fb504c98c6a9fe8010f1680de0201b3eb5dc20aa6d9e \
- --hash=sha256:1bfe8de1da6d104f15a60d4a8a768288f66aa953bbe00d027398b93fb9680b26 \
- --hash=sha256:1e172f57cd78c20f13a3415cc8dfe24bf388614324d25539146594c16d78fcc8 \
- --hash=sha256:1fd7e0f1cfb70eb2f95a19b472ee7ad6d9a0a992ec0ae53286870c104ca939e5 \
- --hash=sha256:203d236f4c94cd8379d1ea61db2fce20730b4c38d7f1c34506a31b34edc87bdd \
- --hash=sha256:27d3ef2252d2e62476389ca8f9b0cf2bbafb082a3b6bfe9d90cbcbb5529ecf7c \
- --hash=sha256:29a2bc7c1b09b0af938b7a8343174b987ae021705acabcbae560166567f5a8db \
- --hash=sha256:2ef230a8fd217a2015bc91b74f6b3b7d6522ba48be29ad4ea0ca3a3775bf7dd5 \
- --hash=sha256:2ef3775758346d9ac6214123887d25c7061c92afe1f2b354f9388e9e4d48acfc \
- --hash=sha256:2f146f50723defec2975fb7e388ae3a024eb7151542d1599527ec2aa9cacb152 \
- --hash=sha256:2fb4535137de7e244c230e24f9d1ec194f61721c86ebea04e1581d9d06ea1269 \
- --hash=sha256:32ba3b5ccde2d581b1e6aa952c836a6291e8435d788f656fe5976445865ae045 \
- --hash=sha256:34895a41273ad33347b2fc70e1bff4240556de3c46c6ea430a7ed91f9042aa4e \
- --hash=sha256:379b378ae694ba78cef921581ebd420c938936a153ded602c4fea612b7eaa90d \
- --hash=sha256:38302b78a850ff82656beaddeb0bb989a0322a8bbb1bf1ab10c17506681d772a \
- --hash=sha256:3aa014d55c3af933c1315eb4bb06dd0459661cc0b15cd61077afa6489bec63bb \
- --hash=sha256:4051e406288b8cdbb993798b9a45c59a4896b6ecee2f875424ec10276a895740 \
- --hash=sha256:40b33d93c6eddf02d2c19f5773196068d875c41ca25730e8288e9b672897c105 \
- --hash=sha256:43da0f0092281bf501f9c5f6f3b4c975a8a0ea82de49ba3f7100e64d422a1274 \
- --hash=sha256:445e4cb5048b04e90ce96a79b4b63140e3f4ab5f662321975679b5f6360b90e2 \
- --hash=sha256:48ef6a43b1846f6025dde6ed9fee0c24e1149c1c25f7fb0a0585572b2f3adc58 \
- --hash=sha256:50a80baba0285386f97ea36239855f6020ce452456605f262b2d33ac35c7770b \
- --hash=sha256:519fbf169dfac1222a76ba8861ef4ac7f0530c35dd79ba5727014613f91613d4 \
- --hash=sha256:53dd9d5e3d29f95acd5de6802e909ada8d8d8cfa37a3ac64836f3bc4bc5512db \
- --hash=sha256:53ea7cdc96c6eb56e76bb06894bcfb5dfa93b7adcf59d61c6b92674e24e2dd5e \
- --hash=sha256:576856e8594e6649aee06ddbfc738fec6a834f7c85bf7cadd1c53d4a58186ef9 \
- --hash=sha256:59556bf80a7094d0cfb9f5e50bb2db27fefb75d5138bb16fb052b61b0e0eeeb0 \
- --hash=sha256:5d41d5e025f1e0bccae4928981e71b2334c60f580bdc8345f824e7c0a4c2a813 \
- --hash=sha256:61062387ad820c654b6a6b5f0b94484fa19515e0c5116faf29f41a6bc91ded6e \
- --hash=sha256:61f89436cbfede4bc4e91b4397eaa3e2108ebe96d05e93d6ccc95ab5714be512 \
- --hash=sha256:62136da96a973bd2557f06ddd4e8e807f9e13cbb0bfb9cc06cfe6d98ea90dfe0 \
- --hash=sha256:64585e1dba664dc67c7cdabd56c1e5685233fbb1fc1966cfba2a340ec0dfff7b \
- --hash=sha256:65308f4b4890aa12d9b6ad9f2844b7ee42c7f7a4fd3390425b242ffc57498f48 \
- --hash=sha256:66b689c107857eceabf2cf3d3fc699c3c0fe8ccd18df2219d978c0283e4c508a \
- --hash=sha256:6a41c120c3dbc0d81a8e8adc73312d668cd34acd7725f036992b1b72d22c1772 \
- --hash=sha256:6f77fa49079891a4aab203d0b1744acc85577ed16d767b52fc089d83faf8d8ed \
- --hash=sha256:72c68dda124a1a138340fb62fa21b9bf4848437d9ca60bd35db36f2d3345f373 \
- --hash=sha256:752bf8a74412b9892f4e5b58f2f890a039f57037f52c89a740757ebd807f33ea \
- --hash=sha256:76e79bc28a65f467e0409098fa2c4376931fd3207fbeb6b956c7c476d53746dd \
- --hash=sha256:774d45b1fac1461f48698a9d4b5fa19a69d47ece02fa469825b442263f04021f \
- --hash=sha256:77da4c6bfa20dd5ea25cbf12c76f181a8e8cd7ea231c673828d0386b1740b8dc \
- --hash=sha256:77ea385f7dd5b5676d7fd943292ffa18fbf5c72ba98f7d09fc1fb9e819b34c23 \
- --hash=sha256:80080816b4f52a9d886e67f1f96912891074903238fe54f2de8b786f86baded2 \
- --hash=sha256:80a539906390591dd39ebb8d773771dc4db82ace6372c4d41e2d293f8e32b8db \
- --hash=sha256:82d17e94d735c99621bf8ebf9995f870a6b3e6d14543b99e201ae046dfe7de70 \
- --hash=sha256:837bb6764be6919963ef41235fd56a6486b132ea64afe5fafb4cb279ac44f259 \
- --hash=sha256:84433dddea68571a6d6bd4fbf8ff398236031149116a7fff6f777ff95cad3df9 \
- --hash=sha256:8c24f21fa2af4bb9f2c492a86fe0c34e6d2c63812a839590edaf177b7398f700 \
- --hash=sha256:8ed7d27cb56b3e058d3cf684d7200703bcae623e1dcc06ed1e18ecda39fee003 \
- --hash=sha256:9206649ec587e6b02bd124fb7799b86cddec350f6f6c14bc82a2b70183e708ba \
- --hash=sha256:983b6efd649723474f29ed42e1467f90a35a74793437d0bc64a5bf482bedfa0a \
- --hash=sha256:98da17ce9cbf3bfe4617e836d561e433f871129e3a7ac16d6ef4c680f13a839c \
- --hash=sha256:9c236e635582742fee16603042553d276cca506e824fa2e6489db04039521e90 \
- --hash=sha256:9da6bc32faac9a293ddfdcb9108d4b20416219461e4ec64dfea8383cac186690 \
- --hash=sha256:a05e6d6218461eb1b4771d973728f0133b2a4613a6779995df557f70794fd60f \
- --hash=sha256:a0817825b900fcd43ac5d05b8b3079937073d2b1ff9cf89427590718b70dd840 \
- --hash=sha256:a4ae99c57668ca1e78597d8b06d5af837f377f340f4cce993b551b2d7731778d \
- --hash=sha256:a8c86881813a78a6f4508ef9daf9d4995b8ac2d147dcb1a450448941398091c9 \
- --hash=sha256:a8fffdbd9d1408006baaf02f1068d7dd1f016c6bcb7538682622c556e7b68e35 \
- --hash=sha256:a9b07268d0c3ca5c170a385a0ab9fb7fdd9f5fd866be004c4ea39e44edce47dd \
- --hash=sha256:ab19a2d91963ed9e42b4e8d77cd847ae8381576585bad79dbd0a8837a9f6620a \
- --hash=sha256:ac184f87ff521f4840e6ea0b10c0ec90c6b1dcd0bad2f1e4a9a1b4fa177982ea \
- --hash=sha256:b0e166f698c5a3e914947388c162be2583e0c638a4703fc6a543e23a88dea3c1 \
- --hash=sha256:b2170c7e0367dde86a2647ed5b6f57394ea7f53545746104c6b09fc1f4223573 \
- --hash=sha256:b2d8c62d08e7255f68f7a740bae85b3c9b8e5466baa9cbf7f57f1cde0ac6bc09 \
- --hash=sha256:b4567955a6bc1b20e9c31612e615af6b53733491aeaa19a6b3b37f3b65477094 \
- --hash=sha256:b69bb4f51daf461b15e7b3db033160937d3ff88303a7bc808c67bbc1eaf98c78 \
- --hash=sha256:b8c0bd73aeac689beacd4e7667d48c299f61b959475cdbb91e7d3d88d27c56b9 \
- --hash=sha256:be9b5b8659dff1f913039c2feee1aca499cfbc19e98fa12bc85e037c17ec6ca5 \
- --hash=sha256:bf0a05b6059c0528477fba9054d09179beb63744355cab9f38059548fedd46a9 \
- --hash=sha256:c16842b846a8d2a145223f520b7e18b57c8f476924bda92aeee3a88d11cfc391 \
- --hash=sha256:c363b53e257246a954ebc7c488304b5592b9c53fbe74d03bc1c64dda153fb847 \
- --hash=sha256:c7c517d74bea1a6afd39aa612fa025e6b8011982a0897768a2f7c8ab4ebb78a2 \
- --hash=sha256:d20fd853fbb5807c8e84c136c278827b6167ded66c72ec6f9a14b863d809211c \
- --hash=sha256:d2240ddc86b74966c34554c49d00eaafa8200a18d3a5b6ffbf7da63b11d74ee2 \
- --hash=sha256:d477ed829077cd945b01fc3115edd132c47e6540ddcd96ca169facff28173057 \
- --hash=sha256:d50d31bfedd53a928fed6707b15a8dbeef011bb6366297cc435accc888b27c20 \
- --hash=sha256:dc1d33abb8a0d754ea4763bad944fd965d3d95b5baef6b121c0c9013eaf1907d \
- --hash=sha256:dc5d1a49d3f8262be192589a4b72f0d03b72dcf46c51ad5852a4fdc67be7b9e4 \
- --hash=sha256:e2d1a054f8f0a191004675755448d12be47fa9bebbcffa3cdf01db19f2d30a54 \
- --hash=sha256:e7792606d606c8df5277c32ccb58f29b9b8603bf83b48639b7aedf6df4fe8171 \
- --hash=sha256:ed1708dbf4d2e3a1c5c69110ba2b4eb6678262028afd6c6fbcc5a8dac9cda68e \
- --hash=sha256:f2d4380bf5f62daabd7b751ea2339c1a21d1c9463f1feb7fc2bdcea2c29c3160 \
- --hash=sha256:f3513916e8c645d0610815c257cbfd3242adfd5c4cfa78be514e5a3ebb42a41b \
- --hash=sha256:f8346bfa098532bc1fb6c7ef06783e969d87a99dd1d2a5a18a892c1d7a643c58 \
- --hash=sha256:f83fa6cae3fff8e98691248c9320356971b59678a17f20656a9e59cd32cee6d8 \
- --hash=sha256:fa6ce8b52c5987b3e34d5674b0ab529a4602b632ebab0a93b07bfb4dfc8f8a33 \
- --hash=sha256:fb2b1ecfef1e67897d336de3a0e3f52478182d6a47eda86cbd42504c5cbd009a \
- --hash=sha256:fc9ca1c9718cb3b06634c7c8dec57d24e9438b2aa9a0f02b8bb36bf478538880 \
- --hash=sha256:fd30d9c67d13d891f2360b2a120186729c111238ac63b43dbd37a5a40670b8ca \
- --hash=sha256:fd7699e8fd9969f455ef2926221e0233f81a2542921471382e77a9e2f2b57f4b \
- --hash=sha256:fe3b385d996ee0822fd46528d9f0443b880d4d05528fd26a9119a54ec3f91c69
- # via -r requirements.txt
diff --git a/requirements.in b/requirements.in
deleted file mode 100644
index 0e9ae39ab..000000000
--- a/requirements.in
+++ /dev/null
@@ -1,11 +0,0 @@
-docker
-jinja2
-jsonschema
-PyYAML
-# Undeclared dependency in docker 5.0 package.
-six
-# This is a transitive dependency that doesn't get picked up when running on
-# modern Python. So include to force it in requirements.txt.
-tomli
-typing-extensions
-zstandard
diff --git a/requirements.txt b/requirements.txt
deleted file mode 100644
index 6770e892f..000000000
--- a/requirements.txt
+++ /dev/null
@@ -1,508 +0,0 @@
-# This file was autogenerated by uv via the following command:
-# uv pip compile --generate-hashes requirements.in -o requirements.txt
-attrs==24.3.0 \
- --hash=sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff \
- --hash=sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308
- # via
- # jsonschema
- # referencing
-certifi==2024.12.14 \
- --hash=sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56 \
- --hash=sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db
- # via requests
-charset-normalizer==3.4.1 \
- --hash=sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537 \
- --hash=sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa \
- --hash=sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a \
- --hash=sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294 \
- --hash=sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b \
- --hash=sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd \
- --hash=sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601 \
- --hash=sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd \
- --hash=sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4 \
- --hash=sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d \
- --hash=sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2 \
- --hash=sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313 \
- --hash=sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd \
- --hash=sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa \
- --hash=sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8 \
- --hash=sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1 \
- --hash=sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2 \
- --hash=sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496 \
- --hash=sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d \
- --hash=sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b \
- --hash=sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e \
- --hash=sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a \
- --hash=sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4 \
- --hash=sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca \
- --hash=sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78 \
- --hash=sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408 \
- --hash=sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5 \
- --hash=sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3 \
- --hash=sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f \
- --hash=sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a \
- --hash=sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765 \
- --hash=sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6 \
- --hash=sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146 \
- --hash=sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6 \
- --hash=sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9 \
- --hash=sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd \
- --hash=sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c \
- --hash=sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f \
- --hash=sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545 \
- --hash=sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176 \
- --hash=sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770 \
- --hash=sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824 \
- --hash=sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f \
- --hash=sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf \
- --hash=sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487 \
- --hash=sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d \
- --hash=sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd \
- --hash=sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b \
- --hash=sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534 \
- --hash=sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f \
- --hash=sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b \
- --hash=sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9 \
- --hash=sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd \
- --hash=sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125 \
- --hash=sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9 \
- --hash=sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de \
- --hash=sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11 \
- --hash=sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d \
- --hash=sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35 \
- --hash=sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f \
- --hash=sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda \
- --hash=sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7 \
- --hash=sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a \
- --hash=sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971 \
- --hash=sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8 \
- --hash=sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41 \
- --hash=sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d \
- --hash=sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f \
- --hash=sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757 \
- --hash=sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a \
- --hash=sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886 \
- --hash=sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77 \
- --hash=sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76 \
- --hash=sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247 \
- --hash=sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85 \
- --hash=sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb \
- --hash=sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7 \
- --hash=sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e \
- --hash=sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6 \
- --hash=sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037 \
- --hash=sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1 \
- --hash=sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e \
- --hash=sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807 \
- --hash=sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407 \
- --hash=sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c \
- --hash=sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12 \
- --hash=sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3 \
- --hash=sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089 \
- --hash=sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd \
- --hash=sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e \
- --hash=sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00 \
- --hash=sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616
- # via requests
-docker==7.1.0 \
- --hash=sha256:ad8c70e6e3f8926cb8a92619b832b4ea5299e2831c14284663184e200546fa6c \
- --hash=sha256:c96b93b7f0a746f9e77d325bcfb87422a3d8bd4f03136ae8a85b37f1898d5fc0
- # via -r requirements.in
-idna==3.10 \
- --hash=sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9 \
- --hash=sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3
- # via requests
-jinja2==3.1.5 \
- --hash=sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb \
- --hash=sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb
- # via -r requirements.in
-jsonschema==4.23.0 \
- --hash=sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4 \
- --hash=sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566
- # via -r requirements.in
-jsonschema-specifications==2024.10.1 \
- --hash=sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272 \
- --hash=sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf
- # via jsonschema
-markupsafe==3.0.2 \
- --hash=sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4 \
- --hash=sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30 \
- --hash=sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0 \
- --hash=sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9 \
- --hash=sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396 \
- --hash=sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13 \
- --hash=sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028 \
- --hash=sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca \
- --hash=sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557 \
- --hash=sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832 \
- --hash=sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0 \
- --hash=sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b \
- --hash=sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579 \
- --hash=sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a \
- --hash=sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c \
- --hash=sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff \
- --hash=sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c \
- --hash=sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22 \
- --hash=sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094 \
- --hash=sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb \
- --hash=sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e \
- --hash=sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5 \
- --hash=sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a \
- --hash=sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d \
- --hash=sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a \
- --hash=sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b \
- --hash=sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8 \
- --hash=sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225 \
- --hash=sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c \
- --hash=sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144 \
- --hash=sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f \
- --hash=sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87 \
- --hash=sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d \
- --hash=sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93 \
- --hash=sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf \
- --hash=sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158 \
- --hash=sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84 \
- --hash=sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb \
- --hash=sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48 \
- --hash=sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171 \
- --hash=sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c \
- --hash=sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6 \
- --hash=sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd \
- --hash=sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d \
- --hash=sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1 \
- --hash=sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d \
- --hash=sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca \
- --hash=sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a \
- --hash=sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29 \
- --hash=sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe \
- --hash=sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798 \
- --hash=sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c \
- --hash=sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8 \
- --hash=sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f \
- --hash=sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f \
- --hash=sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a \
- --hash=sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178 \
- --hash=sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0 \
- --hash=sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79 \
- --hash=sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430 \
- --hash=sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50
- # via jinja2
-pyyaml==6.0.2 \
- --hash=sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff \
- --hash=sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48 \
- --hash=sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086 \
- --hash=sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e \
- --hash=sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133 \
- --hash=sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5 \
- --hash=sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484 \
- --hash=sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee \
- --hash=sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5 \
- --hash=sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68 \
- --hash=sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a \
- --hash=sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf \
- --hash=sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99 \
- --hash=sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8 \
- --hash=sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85 \
- --hash=sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19 \
- --hash=sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc \
- --hash=sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a \
- --hash=sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1 \
- --hash=sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317 \
- --hash=sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c \
- --hash=sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631 \
- --hash=sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d \
- --hash=sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652 \
- --hash=sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5 \
- --hash=sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e \
- --hash=sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b \
- --hash=sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8 \
- --hash=sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476 \
- --hash=sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706 \
- --hash=sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563 \
- --hash=sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237 \
- --hash=sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b \
- --hash=sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083 \
- --hash=sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180 \
- --hash=sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425 \
- --hash=sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e \
- --hash=sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f \
- --hash=sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725 \
- --hash=sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183 \
- --hash=sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab \
- --hash=sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774 \
- --hash=sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725 \
- --hash=sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e \
- --hash=sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5 \
- --hash=sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d \
- --hash=sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290 \
- --hash=sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44 \
- --hash=sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed \
- --hash=sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4 \
- --hash=sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba \
- --hash=sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12 \
- --hash=sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4
- # via -r requirements.in
-referencing==0.35.1 \
- --hash=sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c \
- --hash=sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de
- # via
- # jsonschema
- # jsonschema-specifications
-requests==2.32.3 \
- --hash=sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760 \
- --hash=sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6
- # via docker
-rpds-py==0.22.3 \
- --hash=sha256:009de23c9c9ee54bf11303a966edf4d9087cd43a6003672e6aa7def643d06518 \
- --hash=sha256:02fbb9c288ae08bcb34fb41d516d5eeb0455ac35b5512d03181d755d80810059 \
- --hash=sha256:0a0461200769ab3b9ab7e513f6013b7a97fdeee41c29b9db343f3c5a8e2b9e61 \
- --hash=sha256:0b09865a9abc0ddff4e50b5ef65467cd94176bf1e0004184eb915cbc10fc05c5 \
- --hash=sha256:0b8db6b5b2d4491ad5b6bdc2bc7c017eec108acbf4e6785f42a9eb0ba234f4c9 \
- --hash=sha256:0c150c7a61ed4a4f4955a96626574e9baf1adf772c2fb61ef6a5027e52803543 \
- --hash=sha256:0f3cec041684de9a4684b1572fe28c7267410e02450f4561700ca5a3bc6695a2 \
- --hash=sha256:1352ae4f7c717ae8cba93421a63373e582d19d55d2ee2cbb184344c82d2ae55a \
- --hash=sha256:177c7c0fce2855833819c98e43c262007f42ce86651ffbb84f37883308cb0e7d \
- --hash=sha256:1978d0021e943aae58b9b0b196fb4895a25cc53d3956b8e35e0b7682eefb6d56 \
- --hash=sha256:1a60bce91f81ddaac922a40bbb571a12c1070cb20ebd6d49c48e0b101d87300d \
- --hash=sha256:1aef18820ef3e4587ebe8b3bc9ba6e55892a6d7b93bac6d29d9f631a3b4befbd \
- --hash=sha256:1e9663daaf7a63ceccbbb8e3808fe90415b0757e2abddbfc2e06c857bf8c5e2b \
- --hash=sha256:20070c65396f7373f5df4005862fa162db5d25d56150bddd0b3e8214e8ef45b4 \
- --hash=sha256:214b7a953d73b5e87f0ebece4a32a5bd83c60a3ecc9d4ec8f1dca968a2d91e99 \
- --hash=sha256:22bebe05a9ffc70ebfa127efbc429bc26ec9e9b4ee4d15a740033efda515cf3d \
- --hash=sha256:24e8abb5878e250f2eb0d7859a8e561846f98910326d06c0d51381fed59357bd \
- --hash=sha256:26fd7cac7dd51011a245f29a2cc6489c4608b5a8ce8d75661bb4a1066c52dfbe \
- --hash=sha256:27b1d3b3915a99208fee9ab092b8184c420f2905b7d7feb4aeb5e4a9c509b8a1 \
- --hash=sha256:27e98004595899949bd7a7b34e91fa7c44d7a97c40fcaf1d874168bb652ec67e \
- --hash=sha256:2b8f60e1b739a74bab7e01fcbe3dddd4657ec685caa04681df9d562ef15b625f \
- --hash=sha256:2de29005e11637e7a2361fa151f780ff8eb2543a0da1413bb951e9f14b699ef3 \
- --hash=sha256:2e8b55d8517a2fda8d95cb45d62a5a8bbf9dd0ad39c5b25c8833efea07b880ca \
- --hash=sha256:2fa4331c200c2521512595253f5bb70858b90f750d39b8cbfd67465f8d1b596d \
- --hash=sha256:3445e07bf2e8ecfeef6ef67ac83de670358abf2996916039b16a218e3d95e97e \
- --hash=sha256:3453e8d41fe5f17d1f8e9c383a7473cd46a63661628ec58e07777c2fff7196dc \
- --hash=sha256:378753b4a4de2a7b34063d6f95ae81bfa7b15f2c1a04a9518e8644e81807ebea \
- --hash=sha256:3af6e48651c4e0d2d166dc1b033b7042ea3f871504b6805ba5f4fe31581d8d38 \
- --hash=sha256:3dfcbc95bd7992b16f3f7ba05af8a64ca694331bd24f9157b49dadeeb287493b \
- --hash=sha256:3f21f0495edea7fdbaaa87e633a8689cd285f8f4af5c869f27bc8074638ad69c \
- --hash=sha256:4041711832360a9b75cfb11b25a6a97c8fb49c07b8bd43d0d02b45d0b499a4ff \
- --hash=sha256:44d61b4b7d0c2c9ac019c314e52d7cbda0ae31078aabd0f22e583af3e0d79723 \
- --hash=sha256:4617e1915a539a0d9a9567795023de41a87106522ff83fbfaf1f6baf8e85437e \
- --hash=sha256:4b232061ca880db21fa14defe219840ad9b74b6158adb52ddf0e87bead9e8493 \
- --hash=sha256:5246b14ca64a8675e0a7161f7af68fe3e910e6b90542b4bfb5439ba752191df6 \
- --hash=sha256:5725dd9cc02068996d4438d397e255dcb1df776b7ceea3b9cb972bdb11260a83 \
- --hash=sha256:583f6a1993ca3369e0f80ba99d796d8e6b1a3a2a442dd4e1a79e652116413091 \
- --hash=sha256:59259dc58e57b10e7e18ce02c311804c10c5a793e6568f8af4dead03264584d1 \
- --hash=sha256:593eba61ba0c3baae5bc9be2f5232430453fb4432048de28399ca7376de9c627 \
- --hash=sha256:59f4a79c19232a5774aee369a0c296712ad0e77f24e62cad53160312b1c1eaa1 \
- --hash=sha256:5f0e260eaf54380380ac3808aa4ebe2d8ca28b9087cf411649f96bad6900c728 \
- --hash=sha256:62d9cfcf4948683a18a9aff0ab7e1474d407b7bab2ca03116109f8464698ab16 \
- --hash=sha256:64607d4cbf1b7e3c3c8a14948b99345eda0e161b852e122c6bb71aab6d1d798c \
- --hash=sha256:655ca44a831ecb238d124e0402d98f6212ac527a0ba6c55ca26f616604e60a45 \
- --hash=sha256:666ecce376999bf619756a24ce15bb14c5bfaf04bf00abc7e663ce17c3f34fe7 \
- --hash=sha256:68049202f67380ff9aa52f12e92b1c30115f32e6895cd7198fa2a7961621fc5a \
- --hash=sha256:69803198097467ee7282750acb507fba35ca22cc3b85f16cf45fb01cb9097730 \
- --hash=sha256:6c7b99ca52c2c1752b544e310101b98a659b720b21db00e65edca34483259967 \
- --hash=sha256:6dd9412824c4ce1aca56c47b0991e65bebb7ac3f4edccfd3f156150c96a7bf25 \
- --hash=sha256:70eb60b3ae9245ddea20f8a4190bd79c705a22f8028aaf8bbdebe4716c3fab24 \
- --hash=sha256:70fb28128acbfd264eda9bf47015537ba3fe86e40d046eb2963d75024be4d055 \
- --hash=sha256:7b2513ba235829860b13faa931f3b6846548021846ac808455301c23a101689d \
- --hash=sha256:7ef9d9da710be50ff6809fed8f1963fecdfecc8b86656cadfca3bc24289414b0 \
- --hash=sha256:81e69b0a0e2537f26d73b4e43ad7bc8c8efb39621639b4434b76a3de50c6966e \
- --hash=sha256:8633e471c6207a039eff6aa116e35f69f3156b3989ea3e2d755f7bc41754a4a7 \
- --hash=sha256:8bd7c8cfc0b8247c8799080fbff54e0b9619e17cdfeb0478ba7295d43f635d7c \
- --hash=sha256:9253fc214112405f0afa7db88739294295f0e08466987f1d70e29930262b4c8f \
- --hash=sha256:99b37292234e61325e7a5bb9689e55e48c3f5f603af88b1642666277a81f1fbd \
- --hash=sha256:9bd7228827ec7bb817089e2eb301d907c0d9827a9e558f22f762bb690b131652 \
- --hash=sha256:9beeb01d8c190d7581a4d59522cd3d4b6887040dcfc744af99aa59fef3e041a8 \
- --hash=sha256:a63cbdd98acef6570c62b92a1e43266f9e8b21e699c363c0fef13bd530799c11 \
- --hash=sha256:a76e42402542b1fae59798fab64432b2d015ab9d0c8c47ba7addddbaf7952333 \
- --hash=sha256:ac0a03221cdb5058ce0167ecc92a8c89e8d0decdc9e99a2ec23380793c4dcb96 \
- --hash=sha256:b0b4136a252cadfa1adb705bb81524eee47d9f6aab4f2ee4fa1e9d3cd4581f64 \
- --hash=sha256:b25bc607423935079e05619d7de556c91fb6adeae9d5f80868dde3468657994b \
- --hash=sha256:b3d504047aba448d70cf6fa22e06cb09f7cbd761939fdd47604f5e007675c24e \
- --hash=sha256:bb47271f60660803ad11f4c61b42242b8c1312a31c98c578f79ef9387bbde21c \
- --hash=sha256:bbb232860e3d03d544bc03ac57855cd82ddf19c7a07651a7c0fdb95e9efea8b9 \
- --hash=sha256:bc27863442d388870c1809a87507727b799c8460573cfbb6dc0eeaef5a11b5ec \
- --hash=sha256:bc51abd01f08117283c5ebf64844a35144a0843ff7b2983e0648e4d3d9f10dbb \
- --hash=sha256:be2eb3f2495ba669d2a985f9b426c1797b7d48d6963899276d22f23e33d47e37 \
- --hash=sha256:bf9db5488121b596dbfc6718c76092fda77b703c1f7533a226a5a9f65248f8ad \
- --hash=sha256:c58e2339def52ef6b71b8f36d13c3688ea23fa093353f3a4fee2556e62086ec9 \
- --hash=sha256:cfbc454a2880389dbb9b5b398e50d439e2e58669160f27b60e5eca11f68ae17c \
- --hash=sha256:cff63a0272fcd259dcc3be1657b07c929c466b067ceb1c20060e8d10af56f5bf \
- --hash=sha256:d115bffdd417c6d806ea9069237a4ae02f513b778e3789a359bc5856e0404cc4 \
- --hash=sha256:d20cfb4e099748ea39e6f7b16c91ab057989712d31761d3300d43134e26e165f \
- --hash=sha256:d48424e39c2611ee1b84ad0f44fb3b2b53d473e65de061e3f460fc0be5f1939d \
- --hash=sha256:e0fa2d4ec53dc51cf7d3bb22e0aa0143966119f42a0c3e4998293a3dd2856b09 \
- --hash=sha256:e32fee8ab45d3c2db6da19a5323bc3362237c8b653c70194414b892fd06a080d \
- --hash=sha256:e35ba67d65d49080e8e5a1dd40101fccdd9798adb9b050ff670b7d74fa41c566 \
- --hash=sha256:e3fb866d9932a3d7d0c82da76d816996d1667c44891bd861a0f97ba27e84fc74 \
- --hash=sha256:e61b02c3f7a1e0b75e20c3978f7135fd13cb6cf551bf4a6d29b999a88830a338 \
- --hash=sha256:e67ba3c290821343c192f7eae1d8fd5999ca2dc99994114643e2f2d3e6138b15 \
- --hash=sha256:e79dd39f1e8c3504be0607e5fc6e86bb60fe3584bec8b782578c3b0fde8d932c \
- --hash=sha256:e89391e6d60251560f0a8f4bd32137b077a80d9b7dbe6d5cab1cd80d2746f648 \
- --hash=sha256:ea7433ce7e4bfc3a85654aeb6747babe3f66eaf9a1d0c1e7a4435bbdf27fea84 \
- --hash=sha256:eaf16ae9ae519a0e237a0f528fd9f0197b9bb70f40263ee57ae53c2b8d48aeb3 \
- --hash=sha256:eb0c341fa71df5a4595f9501df4ac5abfb5a09580081dffbd1ddd4654e6e9123 \
- --hash=sha256:f276b245347e6e36526cbd4a266a417796fc531ddf391e43574cf6466c492520 \
- --hash=sha256:f47ad3d5f3258bd7058d2d506852217865afefe6153a36eb4b6928758041d831 \
- --hash=sha256:f56a6b404f74ab372da986d240e2e002769a7d7102cc73eb238a4f72eec5284e \
- --hash=sha256:f5cf2a0c2bdadf3791b5c205d55a37a54025c6e18a71c71f82bb536cf9a454bf \
- --hash=sha256:f5d36399a1b96e1a5fdc91e0522544580dbebeb1f77f27b2b0ab25559e103b8b \
- --hash=sha256:f60bd8423be1d9d833f230fdbccf8f57af322d96bcad6599e5a771b151398eb2 \
- --hash=sha256:f612463ac081803f243ff13cccc648578e2279295048f2a8d5eb430af2bae6e3 \
- --hash=sha256:f73d3fef726b3243a811121de45193c0ca75f6407fe66f3f4e183c983573e130 \
- --hash=sha256:f82a116a1d03628a8ace4859556fb39fd1424c933341a08ea3ed6de1edb0283b \
- --hash=sha256:fb0ba113b4983beac1a2eb16faffd76cb41e176bf58c4afe3e14b9c681f702de \
- --hash=sha256:fb4f868f712b2dd4bcc538b0a0c1f63a2b1d584c925e69a224d759e7070a12d5 \
- --hash=sha256:fb6116dfb8d1925cbdb52595560584db42a7f664617a1f7d7f6e32f138cdf37d \
- --hash=sha256:fda7cb070f442bf80b642cd56483b5548e43d366fe3f39b98e67cce780cded00 \
- --hash=sha256:feea821ee2a9273771bae61194004ee2fc33f8ec7db08117ef9147d4bbcbca8e
- # via
- # jsonschema
- # referencing
-six==1.17.0 \
- --hash=sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 \
- --hash=sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81
- # via -r requirements.in
-tomli==2.2.1 \
- --hash=sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6 \
- --hash=sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd \
- --hash=sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c \
- --hash=sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b \
- --hash=sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8 \
- --hash=sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6 \
- --hash=sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77 \
- --hash=sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff \
- --hash=sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea \
- --hash=sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192 \
- --hash=sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249 \
- --hash=sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee \
- --hash=sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4 \
- --hash=sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98 \
- --hash=sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8 \
- --hash=sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4 \
- --hash=sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281 \
- --hash=sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744 \
- --hash=sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69 \
- --hash=sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13 \
- --hash=sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140 \
- --hash=sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e \
- --hash=sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e \
- --hash=sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc \
- --hash=sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff \
- --hash=sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec \
- --hash=sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2 \
- --hash=sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222 \
- --hash=sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106 \
- --hash=sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272 \
- --hash=sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a \
- --hash=sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7
- # via -r requirements.in
-typing-extensions==4.14.1 \
- --hash=sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36 \
- --hash=sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76
- # via -r requirements.in
-urllib3==2.3.0 \
- --hash=sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df \
- --hash=sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d
- # via
- # docker
- # requests
-zstandard==0.23.0 \
- --hash=sha256:034b88913ecc1b097f528e42b539453fa82c3557e414b3de9d5632c80439a473 \
- --hash=sha256:0a7f0804bb3799414af278e9ad51be25edf67f78f916e08afdb983e74161b916 \
- --hash=sha256:11e3bf3c924853a2d5835b24f03eeba7fc9b07d8ca499e247e06ff5676461a15 \
- --hash=sha256:12a289832e520c6bd4dcaad68e944b86da3bad0d339ef7989fb7e88f92e96072 \
- --hash=sha256:1516c8c37d3a053b01c1c15b182f3b5f5eef19ced9b930b684a73bad121addf4 \
- --hash=sha256:157e89ceb4054029a289fb504c98c6a9fe8010f1680de0201b3eb5dc20aa6d9e \
- --hash=sha256:1bfe8de1da6d104f15a60d4a8a768288f66aa953bbe00d027398b93fb9680b26 \
- --hash=sha256:1e172f57cd78c20f13a3415cc8dfe24bf388614324d25539146594c16d78fcc8 \
- --hash=sha256:1fd7e0f1cfb70eb2f95a19b472ee7ad6d9a0a992ec0ae53286870c104ca939e5 \
- --hash=sha256:203d236f4c94cd8379d1ea61db2fce20730b4c38d7f1c34506a31b34edc87bdd \
- --hash=sha256:27d3ef2252d2e62476389ca8f9b0cf2bbafb082a3b6bfe9d90cbcbb5529ecf7c \
- --hash=sha256:29a2bc7c1b09b0af938b7a8343174b987ae021705acabcbae560166567f5a8db \
- --hash=sha256:2ef230a8fd217a2015bc91b74f6b3b7d6522ba48be29ad4ea0ca3a3775bf7dd5 \
- --hash=sha256:2ef3775758346d9ac6214123887d25c7061c92afe1f2b354f9388e9e4d48acfc \
- --hash=sha256:2f146f50723defec2975fb7e388ae3a024eb7151542d1599527ec2aa9cacb152 \
- --hash=sha256:2fb4535137de7e244c230e24f9d1ec194f61721c86ebea04e1581d9d06ea1269 \
- --hash=sha256:32ba3b5ccde2d581b1e6aa952c836a6291e8435d788f656fe5976445865ae045 \
- --hash=sha256:34895a41273ad33347b2fc70e1bff4240556de3c46c6ea430a7ed91f9042aa4e \
- --hash=sha256:379b378ae694ba78cef921581ebd420c938936a153ded602c4fea612b7eaa90d \
- --hash=sha256:38302b78a850ff82656beaddeb0bb989a0322a8bbb1bf1ab10c17506681d772a \
- --hash=sha256:3aa014d55c3af933c1315eb4bb06dd0459661cc0b15cd61077afa6489bec63bb \
- --hash=sha256:4051e406288b8cdbb993798b9a45c59a4896b6ecee2f875424ec10276a895740 \
- --hash=sha256:40b33d93c6eddf02d2c19f5773196068d875c41ca25730e8288e9b672897c105 \
- --hash=sha256:43da0f0092281bf501f9c5f6f3b4c975a8a0ea82de49ba3f7100e64d422a1274 \
- --hash=sha256:445e4cb5048b04e90ce96a79b4b63140e3f4ab5f662321975679b5f6360b90e2 \
- --hash=sha256:48ef6a43b1846f6025dde6ed9fee0c24e1149c1c25f7fb0a0585572b2f3adc58 \
- --hash=sha256:50a80baba0285386f97ea36239855f6020ce452456605f262b2d33ac35c7770b \
- --hash=sha256:519fbf169dfac1222a76ba8861ef4ac7f0530c35dd79ba5727014613f91613d4 \
- --hash=sha256:53dd9d5e3d29f95acd5de6802e909ada8d8d8cfa37a3ac64836f3bc4bc5512db \
- --hash=sha256:53ea7cdc96c6eb56e76bb06894bcfb5dfa93b7adcf59d61c6b92674e24e2dd5e \
- --hash=sha256:576856e8594e6649aee06ddbfc738fec6a834f7c85bf7cadd1c53d4a58186ef9 \
- --hash=sha256:59556bf80a7094d0cfb9f5e50bb2db27fefb75d5138bb16fb052b61b0e0eeeb0 \
- --hash=sha256:5d41d5e025f1e0bccae4928981e71b2334c60f580bdc8345f824e7c0a4c2a813 \
- --hash=sha256:61062387ad820c654b6a6b5f0b94484fa19515e0c5116faf29f41a6bc91ded6e \
- --hash=sha256:61f89436cbfede4bc4e91b4397eaa3e2108ebe96d05e93d6ccc95ab5714be512 \
- --hash=sha256:62136da96a973bd2557f06ddd4e8e807f9e13cbb0bfb9cc06cfe6d98ea90dfe0 \
- --hash=sha256:64585e1dba664dc67c7cdabd56c1e5685233fbb1fc1966cfba2a340ec0dfff7b \
- --hash=sha256:65308f4b4890aa12d9b6ad9f2844b7ee42c7f7a4fd3390425b242ffc57498f48 \
- --hash=sha256:66b689c107857eceabf2cf3d3fc699c3c0fe8ccd18df2219d978c0283e4c508a \
- --hash=sha256:6a41c120c3dbc0d81a8e8adc73312d668cd34acd7725f036992b1b72d22c1772 \
- --hash=sha256:6f77fa49079891a4aab203d0b1744acc85577ed16d767b52fc089d83faf8d8ed \
- --hash=sha256:72c68dda124a1a138340fb62fa21b9bf4848437d9ca60bd35db36f2d3345f373 \
- --hash=sha256:752bf8a74412b9892f4e5b58f2f890a039f57037f52c89a740757ebd807f33ea \
- --hash=sha256:76e79bc28a65f467e0409098fa2c4376931fd3207fbeb6b956c7c476d53746dd \
- --hash=sha256:774d45b1fac1461f48698a9d4b5fa19a69d47ece02fa469825b442263f04021f \
- --hash=sha256:77da4c6bfa20dd5ea25cbf12c76f181a8e8cd7ea231c673828d0386b1740b8dc \
- --hash=sha256:77ea385f7dd5b5676d7fd943292ffa18fbf5c72ba98f7d09fc1fb9e819b34c23 \
- --hash=sha256:80080816b4f52a9d886e67f1f96912891074903238fe54f2de8b786f86baded2 \
- --hash=sha256:80a539906390591dd39ebb8d773771dc4db82ace6372c4d41e2d293f8e32b8db \
- --hash=sha256:82d17e94d735c99621bf8ebf9995f870a6b3e6d14543b99e201ae046dfe7de70 \
- --hash=sha256:837bb6764be6919963ef41235fd56a6486b132ea64afe5fafb4cb279ac44f259 \
- --hash=sha256:84433dddea68571a6d6bd4fbf8ff398236031149116a7fff6f777ff95cad3df9 \
- --hash=sha256:8c24f21fa2af4bb9f2c492a86fe0c34e6d2c63812a839590edaf177b7398f700 \
- --hash=sha256:8ed7d27cb56b3e058d3cf684d7200703bcae623e1dcc06ed1e18ecda39fee003 \
- --hash=sha256:9206649ec587e6b02bd124fb7799b86cddec350f6f6c14bc82a2b70183e708ba \
- --hash=sha256:983b6efd649723474f29ed42e1467f90a35a74793437d0bc64a5bf482bedfa0a \
- --hash=sha256:98da17ce9cbf3bfe4617e836d561e433f871129e3a7ac16d6ef4c680f13a839c \
- --hash=sha256:9c236e635582742fee16603042553d276cca506e824fa2e6489db04039521e90 \
- --hash=sha256:9da6bc32faac9a293ddfdcb9108d4b20416219461e4ec64dfea8383cac186690 \
- --hash=sha256:a05e6d6218461eb1b4771d973728f0133b2a4613a6779995df557f70794fd60f \
- --hash=sha256:a0817825b900fcd43ac5d05b8b3079937073d2b1ff9cf89427590718b70dd840 \
- --hash=sha256:a4ae99c57668ca1e78597d8b06d5af837f377f340f4cce993b551b2d7731778d \
- --hash=sha256:a8c86881813a78a6f4508ef9daf9d4995b8ac2d147dcb1a450448941398091c9 \
- --hash=sha256:a8fffdbd9d1408006baaf02f1068d7dd1f016c6bcb7538682622c556e7b68e35 \
- --hash=sha256:a9b07268d0c3ca5c170a385a0ab9fb7fdd9f5fd866be004c4ea39e44edce47dd \
- --hash=sha256:ab19a2d91963ed9e42b4e8d77cd847ae8381576585bad79dbd0a8837a9f6620a \
- --hash=sha256:ac184f87ff521f4840e6ea0b10c0ec90c6b1dcd0bad2f1e4a9a1b4fa177982ea \
- --hash=sha256:b0e166f698c5a3e914947388c162be2583e0c638a4703fc6a543e23a88dea3c1 \
- --hash=sha256:b2170c7e0367dde86a2647ed5b6f57394ea7f53545746104c6b09fc1f4223573 \
- --hash=sha256:b2d8c62d08e7255f68f7a740bae85b3c9b8e5466baa9cbf7f57f1cde0ac6bc09 \
- --hash=sha256:b4567955a6bc1b20e9c31612e615af6b53733491aeaa19a6b3b37f3b65477094 \
- --hash=sha256:b69bb4f51daf461b15e7b3db033160937d3ff88303a7bc808c67bbc1eaf98c78 \
- --hash=sha256:b8c0bd73aeac689beacd4e7667d48c299f61b959475cdbb91e7d3d88d27c56b9 \
- --hash=sha256:be9b5b8659dff1f913039c2feee1aca499cfbc19e98fa12bc85e037c17ec6ca5 \
- --hash=sha256:bf0a05b6059c0528477fba9054d09179beb63744355cab9f38059548fedd46a9 \
- --hash=sha256:c16842b846a8d2a145223f520b7e18b57c8f476924bda92aeee3a88d11cfc391 \
- --hash=sha256:c363b53e257246a954ebc7c488304b5592b9c53fbe74d03bc1c64dda153fb847 \
- --hash=sha256:c7c517d74bea1a6afd39aa612fa025e6b8011982a0897768a2f7c8ab4ebb78a2 \
- --hash=sha256:d20fd853fbb5807c8e84c136c278827b6167ded66c72ec6f9a14b863d809211c \
- --hash=sha256:d2240ddc86b74966c34554c49d00eaafa8200a18d3a5b6ffbf7da63b11d74ee2 \
- --hash=sha256:d477ed829077cd945b01fc3115edd132c47e6540ddcd96ca169facff28173057 \
- --hash=sha256:d50d31bfedd53a928fed6707b15a8dbeef011bb6366297cc435accc888b27c20 \
- --hash=sha256:dc1d33abb8a0d754ea4763bad944fd965d3d95b5baef6b121c0c9013eaf1907d \
- --hash=sha256:dc5d1a49d3f8262be192589a4b72f0d03b72dcf46c51ad5852a4fdc67be7b9e4 \
- --hash=sha256:e2d1a054f8f0a191004675755448d12be47fa9bebbcffa3cdf01db19f2d30a54 \
- --hash=sha256:e7792606d606c8df5277c32ccb58f29b9b8603bf83b48639b7aedf6df4fe8171 \
- --hash=sha256:ed1708dbf4d2e3a1c5c69110ba2b4eb6678262028afd6c6fbcc5a8dac9cda68e \
- --hash=sha256:f2d4380bf5f62daabd7b751ea2339c1a21d1c9463f1feb7fc2bdcea2c29c3160 \
- --hash=sha256:f3513916e8c645d0610815c257cbfd3242adfd5c4cfa78be514e5a3ebb42a41b \
- --hash=sha256:f8346bfa098532bc1fb6c7ef06783e969d87a99dd1d2a5a18a892c1d7a643c58 \
- --hash=sha256:f83fa6cae3fff8e98691248c9320356971b59678a17f20656a9e59cd32cee6d8 \
- --hash=sha256:fa6ce8b52c5987b3e34d5674b0ab529a4602b632ebab0a93b07bfb4dfc8f8a33 \
- --hash=sha256:fb2b1ecfef1e67897d336de3a0e3f52478182d6a47eda86cbd42504c5cbd009a \
- --hash=sha256:fc9ca1c9718cb3b06634c7c8dec57d24e9438b2aa9a0f02b8bb36bf478538880 \
- --hash=sha256:fd30d9c67d13d891f2360b2a120186729c111238ac63b43dbd37a5a40670b8ca \
- --hash=sha256:fd7699e8fd9969f455ef2926221e0233f81a2542921471382e77a9e2f2b57f4b \
- --hash=sha256:fe3b385d996ee0822fd46528d9f0443b880d4d05528fd26a9119a54ec3f91c69
- # via -r requirements.in
diff --git a/requirements.win-arm64.txt b/requirements.win-arm64.txt
deleted file mode 100644
index 411d63cfc..000000000
--- a/requirements.win-arm64.txt
+++ /dev/null
@@ -1,593 +0,0 @@
-# This file was autogenerated by uv via the following command:
-# uv pip compile --python-platform aarch64-pc-windows-msvc --generate-hashes requirements.in -o requirements.win-arm64.txt
-attrs==25.4.0 \
- --hash=sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11 \
- --hash=sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373
- # via
- # jsonschema
- # referencing
-certifi==2025.11.12 \
- --hash=sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b \
- --hash=sha256:d8ab5478f2ecd78af242878415affce761ca6bc54a22a27e026d7c25357c3316
- # via requests
-charset-normalizer==3.4.4 \
- --hash=sha256:027f6de494925c0ab2a55eab46ae5129951638a49a34d87f4c3eda90f696b4ad \
- --hash=sha256:077fbb858e903c73f6c9db43374fd213b0b6a778106bc7032446a8e8b5b38b93 \
- --hash=sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394 \
- --hash=sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89 \
- --hash=sha256:0f04b14ffe5fdc8c4933862d8306109a2c51e0704acfa35d51598eb45a1e89fc \
- --hash=sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86 \
- --hash=sha256:194f08cbb32dc406d6e1aea671a68be0823673db2832b38405deba2fb0d88f63 \
- --hash=sha256:1bee1e43c28aa63cb16e5c14e582580546b08e535299b8b6158a7c9c768a1f3d \
- --hash=sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f \
- --hash=sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8 \
- --hash=sha256:244bfb999c71b35de57821b8ea746b24e863398194a4014e4c76adc2bbdfeff0 \
- --hash=sha256:2677acec1a2f8ef614c6888b5b4ae4060cc184174a938ed4e8ef690e15d3e505 \
- --hash=sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161 \
- --hash=sha256:2aaba3b0819274cc41757a1da876f810a3e4d7b6eb25699253a4effef9e8e4af \
- --hash=sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152 \
- --hash=sha256:2c9d3c380143a1fedbff95a312aa798578371eb29da42106a29019368a475318 \
- --hash=sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72 \
- --hash=sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4 \
- --hash=sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e \
- --hash=sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3 \
- --hash=sha256:44c2a8734b333e0578090c4cd6b16f275e07aa6614ca8715e6c038e865e70576 \
- --hash=sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c \
- --hash=sha256:4902828217069c3c5c71094537a8e623f5d097858ac6ca8252f7b4d10b7560f1 \
- --hash=sha256:4bd5d4137d500351a30687c2d3971758aac9a19208fc110ccb9d7188fbe709e8 \
- --hash=sha256:4fe7859a4e3e8457458e2ff592f15ccb02f3da787fcd31e0183879c3ad4692a1 \
- --hash=sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2 \
- --hash=sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44 \
- --hash=sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26 \
- --hash=sha256:5947809c8a2417be3267efc979c47d76a079758166f7d43ef5ae8e9f92751f88 \
- --hash=sha256:5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016 \
- --hash=sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede \
- --hash=sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf \
- --hash=sha256:5cb4d72eea50c8868f5288b7f7f33ed276118325c1dfd3957089f6b519e1382a \
- --hash=sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc \
- --hash=sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0 \
- --hash=sha256:64b55f9dce520635f018f907ff1b0df1fdc31f2795a922fb49dd14fbcdf48c84 \
- --hash=sha256:6515f3182dbe4ea06ced2d9e8666d97b46ef4c75e326b79bb624110f122551db \
- --hash=sha256:65e2befcd84bc6f37095f5961e68a6f077bf44946771354a28ad434c2cce0ae1 \
- --hash=sha256:6aee717dcfead04c6eb1ce3bd29ac1e22663cdea57f943c87d1eab9a025438d7 \
- --hash=sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed \
- --hash=sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8 \
- --hash=sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133 \
- --hash=sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e \
- --hash=sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef \
- --hash=sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14 \
- --hash=sha256:778d2e08eda00f4256d7f672ca9fef386071c9202f5e4607920b86d7803387f2 \
- --hash=sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0 \
- --hash=sha256:798d75d81754988d2565bff1b97ba5a44411867c0cf32b77a7e8f8d84796b10d \
- --hash=sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828 \
- --hash=sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f \
- --hash=sha256:7c308f7e26e4363d79df40ca5b2be1c6ba9f02bdbccfed5abddb7859a6ce72cf \
- --hash=sha256:7fa17817dc5625de8a027cb8b26d9fefa3ea28c8253929b8d6649e705d2835b6 \
- --hash=sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328 \
- --hash=sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090 \
- --hash=sha256:837c2ce8c5a65a2035be9b3569c684358dfbf109fd3b6969630a87535495ceaa \
- --hash=sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381 \
- --hash=sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c \
- --hash=sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb \
- --hash=sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc \
- --hash=sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a \
- --hash=sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec \
- --hash=sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc \
- --hash=sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac \
- --hash=sha256:9cd98cdc06614a2f768d2b7286d66805f94c48cde050acdbbb7db2600ab3197e \
- --hash=sha256:9d1bb833febdff5c8927f922386db610b49db6e0d4f4ee29601d71e7c2694313 \
- --hash=sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569 \
- --hash=sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3 \
- --hash=sha256:a61900df84c667873b292c3de315a786dd8dac506704dea57bc957bd31e22c7d \
- --hash=sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525 \
- --hash=sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894 \
- --hash=sha256:a8bf8d0f749c5757af2142fe7903a9df1d2e8aa3841559b2bad34b08d0e2bcf3 \
- --hash=sha256:a9768c477b9d7bd54bc0c86dbaebdec6f03306675526c9927c0e8a04e8f94af9 \
- --hash=sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a \
- --hash=sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9 \
- --hash=sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14 \
- --hash=sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25 \
- --hash=sha256:b5d84d37db046c5ca74ee7bb47dd6cbc13f80665fdde3e8040bdd3fb015ecb50 \
- --hash=sha256:b7cf1017d601aa35e6bb650b6ad28652c9cd78ee6caff19f3c28d03e1c80acbf \
- --hash=sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1 \
- --hash=sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3 \
- --hash=sha256:c4ef880e27901b6cc782f1b95f82da9313c0eb95c3af699103088fa0ac3ce9ac \
- --hash=sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e \
- --hash=sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815 \
- --hash=sha256:cb01158d8b88ee68f15949894ccc6712278243d95f344770fa7593fa2d94410c \
- --hash=sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6 \
- --hash=sha256:cc00f04ed596e9dc0da42ed17ac5e596c6ccba999ba6bd92b0e0aef2f170f2d6 \
- --hash=sha256:cd09d08005f958f370f539f186d10aec3377d55b9eeb0d796025d4886119d76e \
- --hash=sha256:cd4b7ca9984e5e7985c12bc60a6f173f3c958eae74f3ef6624bb6b26e2abbae4 \
- --hash=sha256:ce8a0633f41a967713a59c4139d29110c07e826d131a316b50ce11b1d79b4f84 \
- --hash=sha256:cead0978fc57397645f12578bfd2d5ea9138ea0fac82b2f63f7f7c6877986a69 \
- --hash=sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15 \
- --hash=sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191 \
- --hash=sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0 \
- --hash=sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897 \
- --hash=sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd \
- --hash=sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2 \
- --hash=sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794 \
- --hash=sha256:e824f1492727fa856dd6eda4f7cee25f8518a12f3c4a56a74e8095695089cf6d \
- --hash=sha256:e912091979546adf63357d7e2ccff9b44f026c075aeaf25a52d0e95ad2281074 \
- --hash=sha256:eaabd426fe94daf8fd157c32e571c85cb12e66692f15516a83a03264b08d06c3 \
- --hash=sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224 \
- --hash=sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838 \
- --hash=sha256:eecbc200c7fd5ddb9a7f16c7decb07b566c29fa2161a16cf67b8d068bd21690a \
- --hash=sha256:f155a433c2ec037d4e8df17d18922c3a0d9b3232a396690f17175d2946f0218d \
- --hash=sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d \
- --hash=sha256:f34be2938726fc13801220747472850852fe6b1ea75869a048d6f896838c896f \
- --hash=sha256:f820802628d2694cb7e56db99213f930856014862f3fd943d290ea8438d07ca8 \
- --hash=sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490 \
- --hash=sha256:f8e160feb2aed042cd657a72acc0b481212ed28b1b9a95c0cee1621b524e1966 \
- --hash=sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9 \
- --hash=sha256:fa09f53c465e532f4d3db095e0c55b615f010ad81803d383195b6b5ca6cbf5f3 \
- --hash=sha256:faa3a41b2b66b6e50f84ae4a68c64fcd0c44355741c6374813a800cd6695db9e \
- --hash=sha256:fd44c878ea55ba351104cb93cc85e74916eb8fa440ca7903e57575e97394f608
- # via requests
-docker==7.1.0 \
- --hash=sha256:ad8c70e6e3f8926cb8a92619b832b4ea5299e2831c14284663184e200546fa6c \
- --hash=sha256:c96b93b7f0a746f9e77d325bcfb87422a3d8bd4f03136ae8a85b37f1898d5fc0
- # via -r requirements.in
-idna==3.11 \
- --hash=sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea \
- --hash=sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902
- # via requests
-jinja2==3.1.6 \
- --hash=sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d \
- --hash=sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67
- # via -r requirements.in
-jsonschema==4.25.1 \
- --hash=sha256:3fba0169e345c7175110351d456342c364814cfcf3b964ba4587f22915230a63 \
- --hash=sha256:e4a9655ce0da0c0b67a085847e00a3a51449e1157f4f75e9fb5aa545e122eb85
- # via -r requirements.in
-jsonschema-specifications==2025.9.1 \
- --hash=sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe \
- --hash=sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d
- # via jsonschema
-markupsafe==3.0.3 \
- --hash=sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f \
- --hash=sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a \
- --hash=sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf \
- --hash=sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19 \
- --hash=sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf \
- --hash=sha256:0f4b68347f8c5eab4a13419215bdfd7f8c9b19f2b25520968adfad23eb0ce60c \
- --hash=sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175 \
- --hash=sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219 \
- --hash=sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb \
- --hash=sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6 \
- --hash=sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab \
- --hash=sha256:15d939a21d546304880945ca1ecb8a039db6b4dc49b2c5a400387cdae6a62e26 \
- --hash=sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1 \
- --hash=sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce \
- --hash=sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218 \
- --hash=sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634 \
- --hash=sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695 \
- --hash=sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad \
- --hash=sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73 \
- --hash=sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c \
- --hash=sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe \
- --hash=sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa \
- --hash=sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559 \
- --hash=sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa \
- --hash=sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37 \
- --hash=sha256:3537e01efc9d4dccdf77221fb1cb3b8e1a38d5428920e0657ce299b20324d758 \
- --hash=sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f \
- --hash=sha256:38664109c14ffc9e7437e86b4dceb442b0096dfe3541d7864d9cbe1da4cf36c8 \
- --hash=sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d \
- --hash=sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c \
- --hash=sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97 \
- --hash=sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a \
- --hash=sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19 \
- --hash=sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9 \
- --hash=sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9 \
- --hash=sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc \
- --hash=sha256:591ae9f2a647529ca990bc681daebdd52c8791ff06c2bfa05b65163e28102ef2 \
- --hash=sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4 \
- --hash=sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354 \
- --hash=sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50 \
- --hash=sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698 \
- --hash=sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9 \
- --hash=sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b \
- --hash=sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc \
- --hash=sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115 \
- --hash=sha256:7c3fb7d25180895632e5d3148dbdc29ea38ccb7fd210aa27acbd1201a1902c6e \
- --hash=sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485 \
- --hash=sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f \
- --hash=sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12 \
- --hash=sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025 \
- --hash=sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009 \
- --hash=sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d \
- --hash=sha256:949b8d66bc381ee8b007cd945914c721d9aba8e27f71959d750a46f7c282b20b \
- --hash=sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a \
- --hash=sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5 \
- --hash=sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f \
- --hash=sha256:a320721ab5a1aba0a233739394eb907f8c8da5c98c9181d1161e77a0c8e36f2d \
- --hash=sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1 \
- --hash=sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287 \
- --hash=sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6 \
- --hash=sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f \
- --hash=sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581 \
- --hash=sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed \
- --hash=sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b \
- --hash=sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c \
- --hash=sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026 \
- --hash=sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8 \
- --hash=sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676 \
- --hash=sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6 \
- --hash=sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e \
- --hash=sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d \
- --hash=sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d \
- --hash=sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01 \
- --hash=sha256:df2449253ef108a379b8b5d6b43f4b1a8e81a061d6537becd5582fba5f9196d7 \
- --hash=sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419 \
- --hash=sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795 \
- --hash=sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1 \
- --hash=sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5 \
- --hash=sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d \
- --hash=sha256:e8fc20152abba6b83724d7ff268c249fa196d8259ff481f3b1476383f8f24e42 \
- --hash=sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe \
- --hash=sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda \
- --hash=sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e \
- --hash=sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737 \
- --hash=sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523 \
- --hash=sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591 \
- --hash=sha256:f71a396b3bf33ecaa1626c255855702aca4d3d9fea5e051b41ac59a9c1c41edc \
- --hash=sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a \
- --hash=sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50
- # via jinja2
-pywin32==311 \
- --hash=sha256:0502d1facf1fed4839a9a51ccbcc63d952cf318f78ffc00a7e78528ac27d7a2b \
- --hash=sha256:184eb5e436dea364dcd3d2316d577d625c0351bf237c4e9a5fabbcfa5a58b151 \
- --hash=sha256:3aca44c046bd2ed8c90de9cb8427f581c479e594e99b5c0bb19b29c10fd6cb87 \
- --hash=sha256:3ce80b34b22b17ccbd937a6e78e7225d80c52f5ab9940fe0506a1a16f3dab503 \
- --hash=sha256:62ea666235135fee79bb154e695f3ff67370afefd71bd7fea7512fc70ef31e3d \
- --hash=sha256:6c6f2969607b5023b0d9ce2541f8d2cbb01c4f46bc87456017cf63b73f1e2d8c \
- --hash=sha256:718a38f7e5b058e76aee1c56ddd06908116d35147e133427e59a3983f703a20d \
- --hash=sha256:750ec6e621af2b948540032557b10a2d43b0cee2ae9758c54154d711cc852d31 \
- --hash=sha256:797c2772017851984b97180b0bebe4b620bb86328e8a884bb626156295a63b3b \
- --hash=sha256:7b4075d959648406202d92a2310cb990fea19b535c7f4a78d3f5e10b926eeb8a \
- --hash=sha256:a508e2d9025764a8270f93111a970e1d0fbfc33f4153b388bb649b7eec4f9b42 \
- --hash=sha256:a733f1388e1a842abb67ffa8e7aad0e70ac519e09b0f6a784e65a136ec7cefd2 \
- --hash=sha256:aba8f82d551a942cb20d4a83413ccbac30790b50efb89a75e4f586ac0bb8056b \
- --hash=sha256:b7a2c10b93f8986666d0c803ee19b5990885872a7de910fc460f9b0c2fbf92ee \
- --hash=sha256:b8c095edad5c211ff31c05223658e71bf7116daa0ecf3ad85f3201ea3190d067 \
- --hash=sha256:c8015b09fb9a5e188f83b7b04de91ddca4658cee2ae6f3bc483f0b21a77ef6cd \
- --hash=sha256:d03ff496d2a0cd4a5893504789d4a15399133fe82517455e78bad62efbb7f0a3 \
- --hash=sha256:e0c4cfb0621281fe40387df582097fd796e80430597cb9944f0ae70447bacd91 \
- --hash=sha256:e286f46a9a39c4a18b319c28f59b61de793654af2f395c102b4f819e584b5852 \
- --hash=sha256:f95ba5a847cba10dd8c4d8fefa9f2a6cf283b8b88ed6178fa8a6c1ab16054d0d
- # via docker
-pyyaml==6.0.2 \
- --hash=sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff \
- --hash=sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48 \
- --hash=sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086 \
- --hash=sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e \
- --hash=sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133 \
- --hash=sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5 \
- --hash=sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484 \
- --hash=sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee \
- --hash=sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5 \
- --hash=sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68 \
- --hash=sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a \
- --hash=sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf \
- --hash=sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99 \
- --hash=sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8 \
- --hash=sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85 \
- --hash=sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19 \
- --hash=sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc \
- --hash=sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a \
- --hash=sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1 \
- --hash=sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317 \
- --hash=sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c \
- --hash=sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631 \
- --hash=sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d \
- --hash=sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652 \
- --hash=sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5 \
- --hash=sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e \
- --hash=sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b \
- --hash=sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8 \
- --hash=sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476 \
- --hash=sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706 \
- --hash=sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563 \
- --hash=sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237 \
- --hash=sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b \
- --hash=sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083 \
- --hash=sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180 \
- --hash=sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425 \
- --hash=sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e \
- --hash=sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f \
- --hash=sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725 \
- --hash=sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183 \
- --hash=sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab \
- --hash=sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774 \
- --hash=sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725 \
- --hash=sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e \
- --hash=sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5 \
- --hash=sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d \
- --hash=sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290 \
- --hash=sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44 \
- --hash=sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed \
- --hash=sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4 \
- --hash=sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba \
- --hash=sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12 \
- --hash=sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4
- # via -r requirements.in
-referencing==0.37.0 \
- --hash=sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231 \
- --hash=sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8
- # via
- # jsonschema
- # jsonschema-specifications
-requests==2.32.5 \
- --hash=sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6 \
- --hash=sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf
- # via docker
-rpds-py==0.29.0 \
- --hash=sha256:00e56b12d2199ca96068057e1ae7f9998ab6e99cda82431afafd32f3ec98cca9 \
- --hash=sha256:0248b19405422573621172ab8e3a1f29141362d13d9f72bafa2e28ea0cdca5a2 \
- --hash=sha256:05a2bd42768ea988294ca328206efbcc66e220d2d9b7836ee5712c07ad6340ea \
- --hash=sha256:070befbb868f257d24c3bb350dbd6e2f645e83731f31264b19d7231dd5c396c7 \
- --hash=sha256:0a8896986efaa243ab713c69e6491a4138410f0fe36f2f4c71e18bd5501e8014 \
- --hash=sha256:0ea962671af5cb9a260489e311fa22b2e97103e3f9f0caaea6f81390af96a9ed \
- --hash=sha256:115f48170fd4296a33938d8c11f697f5f26e0472e43d28f35624764173a60e4d \
- --hash=sha256:12597d11d97b8f7e376c88929a6e17acb980e234547c92992f9f7c058f1a7310 \
- --hash=sha256:1585648d0760b88292eecab5181f5651111a69d90eff35d6b78aa32998886a61 \
- --hash=sha256:16e9da2bda9eb17ea318b4c335ec9ac1818e88922cbe03a5743ea0da9ecf74fb \
- --hash=sha256:1a409b0310a566bfd1be82119891fefbdce615ccc8aa558aff7835c27988cbef \
- --hash=sha256:1c3c3e8101bb06e337c88eb0c0ede3187131f19d97d43ea0e1c5407ea74c0cbf \
- --hash=sha256:1d24564a700ef41480a984c5ebed62b74e6ce5860429b98b1fede76049e953e6 \
- --hash=sha256:1de2345af363d25696969befc0c1688a6cb5e8b1d32b515ef84fc245c6cddba3 \
- --hash=sha256:1ea59b23ea931d494459c8338056fe7d93458c0bf3ecc061cd03916505369d55 \
- --hash=sha256:2023473f444752f0f82a58dfcbee040d0a1b3d1b3c2ec40e884bd25db6d117d2 \
- --hash=sha256:20c51ae86a0bb9accc9ad4e6cdeec58d5ebb7f1b09dd4466331fc65e1766aae7 \
- --hash=sha256:24a16cb7163933906c62c272de20ea3c228e4542c8c45c1d7dc2b9913e17369a \
- --hash=sha256:24a7231493e3c4a4b30138b50cca089a598e52c34cf60b2f35cebf62f274fdea \
- --hash=sha256:2549d833abdf8275c901313b9e8ff8fba57e50f6a495035a2a4e30621a2f7cc4 \
- --hash=sha256:28de03cf48b8a9e6ec10318f2197b83946ed91e2891f651a109611be4106ac4b \
- --hash=sha256:28fd300326dd21198f311534bdb6d7e989dd09b3418b3a91d54a0f384c700967 \
- --hash=sha256:295ce5ac7f0cf69a651ea75c8f76d02a31f98e5698e82a50a5f4d4982fbbae3b \
- --hash=sha256:2a21deb8e0d1571508c6491ce5ea5e25669b1dd4adf1c9d64b6314842f708b5d \
- --hash=sha256:2aba991e041d031c7939e1358f583ae405a7bf04804ca806b97a5c0e0af1ea5e \
- --hash=sha256:2b8e54d6e61f3ecd3abe032065ce83ea63417a24f437e4a3d73d2f85ce7b7cfe \
- --hash=sha256:2d6fb2ad1c36f91c4646989811e84b1ea5e0c3cf9690b826b6e32b7965853a63 \
- --hash=sha256:33ca7bdfedd83339ca55da3a5e1527ee5870d4b8369456b5777b197756f3ca22 \
- --hash=sha256:37d94eadf764d16b9a04307f2ab1d7af6dc28774bbe0535c9323101e14877b4c \
- --hash=sha256:3897924d3f9a0361472d884051f9a2460358f9a45b1d85a39a158d2f8f1ad71c \
- --hash=sha256:3919a3bbecee589300ed25000b6944174e07cd20db70552159207b3f4bbb45b8 \
- --hash=sha256:394d27e4453d3b4d82bb85665dc1fcf4b0badc30fc84282defed71643b50e1a1 \
- --hash=sha256:3fbd4e9aebf110473a420dea85a238b254cf8a15acb04b22a5a6b5ce8925b760 \
- --hash=sha256:3fd2164d73812026ce970d44c3ebd51e019d2a26a4425a5dcbdfa93a34abc383 \
- --hash=sha256:40f65470919dc189c833e86b2c4bd21bd355f98436a2cef9e0a9a92aebc8e57e \
- --hash=sha256:4448dad428f28a6a767c3e3b80cde3446a22a0efbddaa2360f4bb4dc836d0688 \
- --hash=sha256:44a91e0ab77bdc0004b43261a4b8cd6d6b451e8d443754cfda830002b5745b32 \
- --hash=sha256:453783477aa4f2d9104c4b59b08c871431647cb7af51b549bbf2d9eb9c827756 \
- --hash=sha256:4a097b7f7f7274164566ae90a221fd725363c0e9d243e2e9ed43d195ccc5495c \
- --hash=sha256:4aa195e5804d32c682e453b34474f411ca108e4291c6a0f824ebdc30a91c973c \
- --hash=sha256:4ae4b88c6617e1b9e5038ab3fccd7bac0842fdda2b703117b2aa99bc85379113 \
- --hash=sha256:521807963971a23996ddaf764c682b3e46459b3c58ccd79fefbe16718db43154 \
- --hash=sha256:534dc9df211387547267ccdb42253aa30527482acb38dd9b21c5c115d66a96d2 \
- --hash=sha256:539eb77eb043afcc45314d1be09ea6d6cafb3addc73e0547c171c6d636957f60 \
- --hash=sha256:55d827b2ae95425d3be9bc9a5838b6c29d664924f98146557f7715e331d06df8 \
- --hash=sha256:56838e1cd9174dc23c5691ee29f1d1be9eab357f27efef6bded1328b23e1ced2 \
- --hash=sha256:5a572911cd053137bbff8e3a52d31c5d2dba51d3a67ad902629c70185f3f2181 \
- --hash=sha256:5c9546cfdd5d45e562cc0444b6dddc191e625c62e866bf567a2c69487c7ad28a \
- --hash=sha256:5cc58aac218826d054c7da7f95821eba94125d88be673ff44267bb89d12a5866 \
- --hash=sha256:6410e66f02803600edb0b1889541f4b5cc298a5ccda0ad789cc50ef23b54813e \
- --hash=sha256:66786c3fb1d8de416a7fa8e1cb1ec6ba0a745b2b0eee42f9b7daa26f1a495545 \
- --hash=sha256:6e97846e9800a5d0fe7be4d008f0c93d0feeb2700da7b1f7528dabafb31dfadb \
- --hash=sha256:7033c1010b1f57bb44d8067e8c25aa6fa2e944dbf46ccc8c92b25043839c3fd2 \
- --hash=sha256:715b67eac317bf1c7657508170a3e011a1ea6ccb1c9d5f296e20ba14196be6b3 \
- --hash=sha256:72fdfd5ff8992e4636621826371e3ac5f3e3b8323e9d0e48378e9c13c3dac9d0 \
- --hash=sha256:76054d540061eda273274f3d13a21a4abdde90e13eaefdc205db37c05230efce \
- --hash=sha256:76fe96632d53f3bf0ea31ede2f53bbe3540cc2736d4aec3b3801b0458499ef3a \
- --hash=sha256:7971bdb7bf4ee0f7e6f67fa4c7fbc6019d9850cc977d126904392d363f6f8318 \
- --hash=sha256:799156ef1f3529ed82c36eb012b5d7a4cf4b6ef556dd7cc192148991d07206ae \
- --hash=sha256:7cdc0490374e31cedefefaa1520d5fe38e82fde8748cbc926e7284574c714d6b \
- --hash=sha256:7d9128ec9d8cecda6f044001fde4fb71ea7c24325336612ef8179091eb9596b9 \
- --hash=sha256:7f437026dbbc3f08c99cc41a5b2570c6e1a1ddbe48ab19a9b814254128d4ea7a \
- --hash=sha256:80fdf53d36e6c72819993e35d1ebeeb8e8fc688d0c6c2b391b55e335b3afba5a \
- --hash=sha256:8238d1d310283e87376c12f658b61e1ee23a14c0e54c7c0ce953efdbdc72deed \
- --hash=sha256:89ca2e673ddd5bde9b386da9a0aac0cab0e76f40c8f0aaf0d6311b6bbf2aa311 \
- --hash=sha256:8ae33ad9ce580c7a47452c3b3f7d8a9095ef6208e0a0c7e4e2384f9fc5bf8212 \
- --hash=sha256:8c5a8ecaa44ce2d8d9d20a68a2483a74c07f05d72e94a4dff88906c8807e77b0 \
- --hash=sha256:8e5bb73ffc029820f4348e9b66b3027493ae00bca6629129cd433fd7a76308ee \
- --hash=sha256:90f30d15f45048448b8da21c41703b31c61119c06c216a1bf8c245812a0f0c17 \
- --hash=sha256:923248a56dd8d158389a28934f6f69ebf89f218ef96a6b216a9be6861804d3f4 \
- --hash=sha256:9459a33f077130dbb2c7c3cea72ee9932271fb3126404ba2a2661e4fe9eb7b79 \
- --hash=sha256:97c817863ffc397f1e6a6e9d2d89fe5408c0a9922dac0329672fb0f35c867ea5 \
- --hash=sha256:9b9c764a11fd637e0322a488560533112837f5334ffeb48b1be20f6d98a7b437 \
- --hash=sha256:9ba8028597e824854f0f1733d8b964e914ae3003b22a10c2c664cb6927e0feb9 \
- --hash=sha256:9efe71687d6427737a0a2de9ca1c0a216510e6cd08925c44162be23ed7bed2d5 \
- --hash=sha256:9f84c549746a5be3bc7415830747a3a0312573afc9f95785eb35228bb17742ec \
- --hash=sha256:a0891cfd8db43e085c0ab93ab7e9b0c8fee84780d436d3b266b113e51e79f954 \
- --hash=sha256:a110e14508fd26fd2e472bb541f37c209409876ba601cf57e739e87d8a53cf95 \
- --hash=sha256:a5d9da3ff5af1ca1249b1adb8ef0573b94c76e6ae880ba1852f033bf429d4588 \
- --hash=sha256:a738f2da2f565989401bd6fd0b15990a4d1523c6d7fe83f300b7e7d17212feca \
- --hash=sha256:acd82a9e39082dc5f4492d15a6b6c8599aa21db5c35aaf7d6889aea16502c07d \
- --hash=sha256:ad7bd570be92695d89285a4b373006930715b78d96449f686af422debb4d3949 \
- --hash=sha256:b016eddf00dca7944721bf0cd85b6af7f6c4efaf83ee0b37c4133bd39757a8c7 \
- --hash=sha256:b1581fcde18fcdf42ea2403a16a6b646f8eb1e58d7f90a0ce693da441f76942e \
- --hash=sha256:b58f5c77f1af888b5fd1876c9a0d9858f6f88a39c9dd7c073a88e57e577da66d \
- --hash=sha256:b5f6134faf54b3cb83375db0f113506f8b7770785be1f95a631e7e2892101977 \
- --hash=sha256:b9cf2359a4fca87cfb6801fae83a76aedf66ee1254a7a151f1341632acf67f1b \
- --hash=sha256:ba5e1aeaf8dd6d8f6caba1f5539cddda87d511331714b7b5fc908b6cfc3636b7 \
- --hash=sha256:bb78b3a0d31ac1bde132c67015a809948db751cb4e92cdb3f0b242e430b6ed0d \
- --hash=sha256:bdb67151ea81fcf02d8f494703fb728d4d34d24556cbff5f417d74f6f5792e7c \
- --hash=sha256:c07d107b7316088f1ac0177a7661ca0c6670d443f6fe72e836069025e6266761 \
- --hash=sha256:c4695dd224212f6105db7ea62197144230b808d6b2bba52238906a2762f1d1e7 \
- --hash=sha256:c5523b0009e7c3c1263471b69d8da1c7d41b3ecb4cb62ef72be206b92040a950 \
- --hash=sha256:c661132ab2fb4eeede2ef69670fd60da5235209874d001a98f1542f31f2a8a94 \
- --hash=sha256:d37812c3da8e06f2bb35b3cf10e4a7b68e776a706c13058997238762b4e07f4f \
- --hash=sha256:d456e64724a075441e4ed648d7f154dc62e9aabff29bcdf723d0c00e9e1d352f \
- --hash=sha256:d472cf73efe5726a067dce63eebe8215b14beabea7c12606fd9994267b3cfe2b \
- --hash=sha256:d583d4403bcbf10cffc3ab5cee23d7643fcc960dff85973fd3c2d6c86e8dbb0c \
- --hash=sha256:de73e40ebc04dd5d9556f50180395322193a78ec247e637e741c1b954810f295 \
- --hash=sha256:def48ff59f181130f1a2cb7c517d16328efac3ec03951cca40c1dc2049747e83 \
- --hash=sha256:e6596b93c010d386ae46c9fba9bfc9fc5965fa8228edeac51576299182c2e31c \
- --hash=sha256:e71136fd0612556b35c575dc2726ae04a1669e6a6c378f2240312cf5d1a2ab10 \
- --hash=sha256:e7fa2ccc312bbd91e43aa5e0869e46bc03278a3dddb8d58833150a18b0f0283a \
- --hash=sha256:ea7173df5d86f625f8dde6d5929629ad811ed8decda3b60ae603903839ac9ac0 \
- --hash=sha256:f3b1b87a237cb2dba4db18bcfaaa44ba4cd5936b91121b62292ff21df577fc43 \
- --hash=sha256:f475f103488312e9bd4000bc890a95955a07b2d0b6e8884aef4be56132adbbf1 \
- --hash=sha256:f49196aec7c4b406495f60e6f947ad71f317a765f956d74bbd83996b9edc0352 \
- --hash=sha256:f49d41559cebd608042fdcf54ba597a4a7555b49ad5c1c0c03e0af82692661cd \
- --hash=sha256:f7728653900035fb7b8d06e1e5900545d8088efc9d5d4545782da7df03ec803f \
- --hash=sha256:f9f436aee28d13b9ad2c764fc273e0457e37c2e61529a07b928346b219fcde3b \
- --hash=sha256:fc31a07ed352e5462d3ee1b22e89285f4ce97d5266f6d1169da1142e78045626 \
- --hash=sha256:fc935f6b20b0c9f919a8ff024739174522abd331978f750a74bb68abd117bd19 \
- --hash=sha256:fcae1770b401167f8b9e1e3f566562e6966ffa9ce63639916248a9e25fa8a244 \
- --hash=sha256:fd7951c964069039acc9d67a8ff1f0a7f34845ae180ca542b17dc1456b1f1808 \
- --hash=sha256:fe55fe686908f50154d1dc599232016e50c243b438c3b7432f24e2895b0e5359
- # via
- # jsonschema
- # referencing
-six==1.17.0 \
- --hash=sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 \
- --hash=sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81
- # via -r requirements.in
-tomli==2.2.1 \
- --hash=sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6 \
- --hash=sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd \
- --hash=sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c \
- --hash=sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b \
- --hash=sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8 \
- --hash=sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6 \
- --hash=sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77 \
- --hash=sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff \
- --hash=sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea \
- --hash=sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192 \
- --hash=sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249 \
- --hash=sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee \
- --hash=sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4 \
- --hash=sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98 \
- --hash=sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8 \
- --hash=sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4 \
- --hash=sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281 \
- --hash=sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744 \
- --hash=sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69 \
- --hash=sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13 \
- --hash=sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140 \
- --hash=sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e \
- --hash=sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e \
- --hash=sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc \
- --hash=sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff \
- --hash=sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec \
- --hash=sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2 \
- --hash=sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222 \
- --hash=sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106 \
- --hash=sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272 \
- --hash=sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a \
- --hash=sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7
- # via -r requirements.in
-typing-extensions==4.15.0 \
- --hash=sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466 \
- --hash=sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548
- # via -r requirements.in
-urllib3==2.5.0 \
- --hash=sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760 \
- --hash=sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc
- # via
- # docker
- # requests
-zstandard==0.25.0 \
- --hash=sha256:011d388c76b11a0c165374ce660ce2c8efa8e5d87f34996aa80f9c0816698b64 \
- --hash=sha256:01582723b3ccd6939ab7b3a78622c573799d5d8737b534b86d0e06ac18dbde4a \
- --hash=sha256:05353cef599a7b0b98baca9b068dd36810c3ef0f42bf282583f438caf6ddcee3 \
- --hash=sha256:05df5136bc5a011f33cd25bc9f506e7426c0c9b3f9954f056831ce68f3b6689f \
- --hash=sha256:06acb75eebeedb77b69048031282737717a63e71e4ae3f77cc0c3b9508320df6 \
- --hash=sha256:07b527a69c1e1c8b5ab1ab14e2afe0675614a09182213f21a0717b62027b5936 \
- --hash=sha256:0bbc9a0c65ce0eea3c34a691e3c4b6889f5f3909ba4822ab385fab9057099431 \
- --hash=sha256:0be7622c37c183406f3dbf0cba104118eb16a4ea7359eeb5752f0794882fc250 \
- --hash=sha256:106281ae350e494f4ac8a80470e66d1fe27e497052c8d9c3b95dc4cf1ade81aa \
- --hash=sha256:10ef2a79ab8e2974e2075fb984e5b9806c64134810fac21576f0668e7ea19f8f \
- --hash=sha256:1673b7199bbe763365b81a4f3252b8e80f44c9e323fc42940dc8843bfeaf9851 \
- --hash=sha256:172de1f06947577d3a3005416977cce6168f2261284c02080e7ad0185faeced3 \
- --hash=sha256:181eb40e0b6a29b3cd2849f825e0fa34397f649170673d385f3598ae17cca2e9 \
- --hash=sha256:1869da9571d5e94a85a5e8d57e4e8807b175c9e4a6294e3b66fa4efb074d90f6 \
- --hash=sha256:19796b39075201d51d5f5f790bf849221e58b48a39a5fc74837675d8bafc7362 \
- --hash=sha256:1cd5da4d8e8ee0e88be976c294db744773459d51bb32f707a0f166e5ad5c8649 \
- --hash=sha256:1f3689581a72eaba9131b1d9bdbfe520ccd169999219b41000ede2fca5c1bfdb \
- --hash=sha256:1f830a0dac88719af0ae43b8b2d6aef487d437036468ef3c2ea59c51f9d55fd5 \
- --hash=sha256:223415140608d0f0da010499eaa8ccdb9af210a543fac54bce15babbcfc78439 \
- --hash=sha256:22a06c5df3751bb7dc67406f5374734ccee8ed37fc5981bf1ad7041831fa1137 \
- --hash=sha256:22a086cff1b6ceca18a8dd6096ec631e430e93a8e70a9ca5efa7561a00f826fa \
- --hash=sha256:23ebc8f17a03133b4426bcc04aabd68f8236eb78c3760f12783385171b0fd8bd \
- --hash=sha256:25f8f3cd45087d089aef5ba3848cd9efe3ad41163d3400862fb42f81a3a46701 \
- --hash=sha256:2b6bd67528ee8b5c5f10255735abc21aa106931f0dbaf297c7be0c886353c3d0 \
- --hash=sha256:2e54296a283f3ab5a26fc9b8b5d4978ea0532f37b231644f367aa588930aa043 \
- --hash=sha256:3756b3e9da9b83da1796f8809dd57cb024f838b9eeafde28f3cb472012797ac1 \
- --hash=sha256:37daddd452c0ffb65da00620afb8e17abd4adaae6ce6310702841760c2c26860 \
- --hash=sha256:3a39c94ad7866160a4a46d772e43311a743c316942037671beb264e395bdd611 \
- --hash=sha256:3b870ce5a02d4b22286cf4944c628e0f0881b11b3f14667c1d62185a99e04f53 \
- --hash=sha256:3c83b0188c852a47cd13ef3bf9209fb0a77fa5374958b8c53aaa699398c6bd7b \
- --hash=sha256:4203ce3b31aec23012d3a4cf4a2ed64d12fea5269c49aed5e4c3611b938e4088 \
- --hash=sha256:457ed498fc58cdc12fc48f7950e02740d4f7ae9493dd4ab2168a47c93c31298e \
- --hash=sha256:474d2596a2dbc241a556e965fb76002c1ce655445e4e3bf38e5477d413165ffa \
- --hash=sha256:4b14abacf83dfb5c25eb4e4a79520de9e7e205f72c9ee7702f91233ae57d33a2 \
- --hash=sha256:4b6d83057e713ff235a12e73916b6d356e3084fd3d14ced499d84240f3eecee0 \
- --hash=sha256:4d441506e9b372386a5271c64125f72d5df6d2a8e8a2a45a0ae09b03cb781ef7 \
- --hash=sha256:4f187a0bb61b35119d1926aee039524d1f93aaf38a9916b8c4b78ac8514a0aaf \
- --hash=sha256:51526324f1b23229001eb3735bc8c94f9c578b1bd9e867a0a646a3b17109f388 \
- --hash=sha256:53e08b2445a6bc241261fea89d065536f00a581f02535f8122eba42db9375530 \
- --hash=sha256:53f94448fe5b10ee75d246497168e5825135d54325458c4bfffbaafabcc0a577 \
- --hash=sha256:5a56ba0db2d244117ed744dfa8f6f5b366e14148e00de44723413b2f3938a902 \
- --hash=sha256:5f1ad7bf88535edcf30038f6919abe087f606f62c00a87d7e33e7fc57cb69fcc \
- --hash=sha256:5f5e4c2a23ca271c218ac025bd7d635597048b366d6f31f420aaeb715239fc98 \
- --hash=sha256:6a573a35693e03cf1d67799fd01b50ff578515a8aeadd4595d2a7fa9f3ec002a \
- --hash=sha256:6c0e5a65158a7946e7a7affa6418878ef97ab66636f13353b8502d7ea03c8097 \
- --hash=sha256:6dffecc361d079bb48d7caef5d673c88c8988d3d33fb74ab95b7ee6da42652ea \
- --hash=sha256:7030defa83eef3e51ff26f0b7bfb229f0204b66fe18e04359ce3474ac33cbc09 \
- --hash=sha256:7149623bba7fdf7e7f24312953bcf73cae103db8cae49f8154dd1eadc8a29ecb \
- --hash=sha256:72d35d7aa0bba323965da807a462b0966c91608ef3a48ba761678cb20ce5d8b7 \
- --hash=sha256:75ffc32a569fb049499e63ce68c743155477610532da1eb38e7f24bf7cd29e74 \
- --hash=sha256:7713e1179d162cf5c7906da876ec2ccb9c3a9dcbdffef0cc7f70c3667a205f0b \
- --hash=sha256:78228d8a6a1c177a96b94f7e2e8d012c55f9c760761980da16ae7546a15a8e9b \
- --hash=sha256:7b3c3a3ab9daa3eed242d6ecceead93aebbb8f5f84318d82cee643e019c4b73b \
- --hash=sha256:809c5bcb2c67cd0ed81e9229d227d4ca28f82d0f778fc5fea624a9def3963f91 \
- --hash=sha256:81dad8d145d8fd981b2962b686b2241d3a1ea07733e76a2f15435dfb7fb60150 \
- --hash=sha256:85304a43f4d513f5464ceb938aa02c1e78c2943b29f44a750b48b25ac999a049 \
- --hash=sha256:89c4b48479a43f820b749df49cd7ba2dbc2b1b78560ecb5ab52985574fd40b27 \
- --hash=sha256:8e735494da3db08694d26480f1493ad2cf86e99bdd53e8e9771b2752a5c0246a \
- --hash=sha256:913cbd31a400febff93b564a23e17c3ed2d56c064006f54efec210d586171c00 \
- --hash=sha256:9174f4ed06f790a6869b41cba05b43eeb9a35f8993c4422ab853b705e8112bbd \
- --hash=sha256:9300d02ea7c6506f00e627e287e0492a5eb0371ec1670ae852fefffa6164b072 \
- --hash=sha256:933b65d7680ea337180733cf9e87293cc5500cc0eb3fc8769f4d3c88d724ec5c \
- --hash=sha256:9654dbc012d8b06fc3d19cc825af3f7bf8ae242226df5f83936cb39f5fdc846c \
- --hash=sha256:98750a309eb2f020da61e727de7d7ba3c57c97cf6213f6f6277bb7fb42a8e065 \
- --hash=sha256:99c0c846e6e61718715a3c9437ccc625de26593fea60189567f0118dc9db7512 \
- --hash=sha256:a1a4ae2dec3993a32247995bdfe367fc3266da832d82f8438c8570f989753de1 \
- --hash=sha256:a3f79487c687b1fc69f19e487cd949bf3aae653d181dfb5fde3bf6d18894706f \
- --hash=sha256:a4089a10e598eae6393756b036e0f419e8c1d60f44a831520f9af41c14216cf2 \
- --hash=sha256:a51ff14f8017338e2f2e5dab738ce1ec3b5a851f23b18c1ae1359b1eecbee6df \
- --hash=sha256:a5a419712cf88862a45a23def0ae063686db3d324cec7edbe40509d1a79a0aab \
- --hash=sha256:a9ec8c642d1ec73287ae3e726792dd86c96f5681eb8df274a757bf62b750eae7 \
- --hash=sha256:aaf21ba8fb76d102b696781bddaa0954b782536446083ae3fdaa6f16b25a1c4b \
- --hash=sha256:ab85470ab54c2cb96e176f40342d9ed41e58ca5733be6a893b730e7af9c40550 \
- --hash=sha256:b9af1fe743828123e12b41dd8091eca1074d0c1569cc42e6e1eee98027f2bbd0 \
- --hash=sha256:bfc4e20784722098822e3eee42b8e576b379ed72cca4a7cb856ae733e62192ea \
- --hash=sha256:bfd06b1c5584b657a2892a6014c2f4c20e0db0208c159148fa78c65f7e0b0277 \
- --hash=sha256:c19bcdd826e95671065f8692b5a4aa95c52dc7a02a4c5a0cac46deb879a017a2 \
- --hash=sha256:c2ba942c94e0691467ab901fc51b6f2085ff48f2eea77b1a48240f011e8247c7 \
- --hash=sha256:c8e167d5adf59476fa3e37bee730890e389410c354771a62e3c076c86f9f7778 \
- --hash=sha256:ca54090275939dc8ec5dea2d2afb400e0f83444b2fc24e07df7fdef677110859 \
- --hash=sha256:d7541afd73985c630bafcd6338d2518ae96060075f9463d7dc14cfb33514383d \
- --hash=sha256:d8c56bb4e6c795fc77d74d8e8b80846e1fb8292fc0b5060cd8131d522974b751 \
- --hash=sha256:da469dc041701583e34de852d8634703550348d5822e66a0c827d39b05365b12 \
- --hash=sha256:daab68faadb847063d0c56f361a289c4f268706b598afbf9ad113cbe5c38b6b2 \
- --hash=sha256:e05ab82ea7753354bb054b92e2f288afb750e6b439ff6ca78af52939ebbc476d \
- --hash=sha256:e09bb6252b6476d8d56100e8147b803befa9a12cea144bbe629dd508800d1ad0 \
- --hash=sha256:e29f0cf06974c899b2c188ef7f783607dbef36da4c242eb6c82dcd8b512855e3 \
- --hash=sha256:e59fdc271772f6686e01e1b3b74537259800f57e24280be3f29c8a0deb1904dd \
- --hash=sha256:e7360eae90809efd19b886e59a09dad07da4ca9ba096752e61a2e03c8aca188e \
- --hash=sha256:e96594a5537722fdfb79951672a2a63aec5ebfb823e7560586f7484819f2a08f \
- --hash=sha256:ea9d54cc3d8064260114a0bbf3479fc4a98b21dffc89b3459edd506b69262f6e \
- --hash=sha256:ec996f12524f88e151c339688c3897194821d7f03081ab35d31d1e12ec975e94 \
- --hash=sha256:f27662e4f7dbf9f9c12391cb37b4c4c3cb90ffbd3b1fb9284dadbbb8935fa708 \
- --hash=sha256:f373da2c1757bb7f1acaf09369cdc1d51d84131e50d5fa9863982fd626466313 \
- --hash=sha256:f5aeea11ded7320a84dcdd62a3d95b5186834224a9e55b92ccae35d21a8b63d4 \
- --hash=sha256:f604efd28f239cc21b3adb53eb061e2a205dc164be408e553b41ba2ffe0ca15c \
- --hash=sha256:f67e8f1a324a900e75b5e28ffb152bcac9fbed1cc7b43f99cd90f395c4375344 \
- --hash=sha256:fd7a5004eb1980d3cefe26b2685bcb0b17989901a70a1040d1ac86f1d898c551 \
- --hash=sha256:ffef5a74088f1e09947aecf91011136665152e0b4b359c42be3373897fb39b01
- # via -r requirements.in
diff --git a/requirements.win.txt b/requirements.win.txt
deleted file mode 100644
index c2cbcae4b..000000000
--- a/requirements.win.txt
+++ /dev/null
@@ -1,593 +0,0 @@
-# This file was autogenerated by uv via the following command:
-# uv pip compile --python-platform windows --generate-hashes requirements.in -o requirements.win.txt
-attrs==25.4.0 \
- --hash=sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11 \
- --hash=sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373
- # via
- # jsonschema
- # referencing
-certifi==2025.11.12 \
- --hash=sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b \
- --hash=sha256:d8ab5478f2ecd78af242878415affce761ca6bc54a22a27e026d7c25357c3316
- # via requests
-charset-normalizer==3.4.4 \
- --hash=sha256:027f6de494925c0ab2a55eab46ae5129951638a49a34d87f4c3eda90f696b4ad \
- --hash=sha256:077fbb858e903c73f6c9db43374fd213b0b6a778106bc7032446a8e8b5b38b93 \
- --hash=sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394 \
- --hash=sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89 \
- --hash=sha256:0f04b14ffe5fdc8c4933862d8306109a2c51e0704acfa35d51598eb45a1e89fc \
- --hash=sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86 \
- --hash=sha256:194f08cbb32dc406d6e1aea671a68be0823673db2832b38405deba2fb0d88f63 \
- --hash=sha256:1bee1e43c28aa63cb16e5c14e582580546b08e535299b8b6158a7c9c768a1f3d \
- --hash=sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f \
- --hash=sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8 \
- --hash=sha256:244bfb999c71b35de57821b8ea746b24e863398194a4014e4c76adc2bbdfeff0 \
- --hash=sha256:2677acec1a2f8ef614c6888b5b4ae4060cc184174a938ed4e8ef690e15d3e505 \
- --hash=sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161 \
- --hash=sha256:2aaba3b0819274cc41757a1da876f810a3e4d7b6eb25699253a4effef9e8e4af \
- --hash=sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152 \
- --hash=sha256:2c9d3c380143a1fedbff95a312aa798578371eb29da42106a29019368a475318 \
- --hash=sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72 \
- --hash=sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4 \
- --hash=sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e \
- --hash=sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3 \
- --hash=sha256:44c2a8734b333e0578090c4cd6b16f275e07aa6614ca8715e6c038e865e70576 \
- --hash=sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c \
- --hash=sha256:4902828217069c3c5c71094537a8e623f5d097858ac6ca8252f7b4d10b7560f1 \
- --hash=sha256:4bd5d4137d500351a30687c2d3971758aac9a19208fc110ccb9d7188fbe709e8 \
- --hash=sha256:4fe7859a4e3e8457458e2ff592f15ccb02f3da787fcd31e0183879c3ad4692a1 \
- --hash=sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2 \
- --hash=sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44 \
- --hash=sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26 \
- --hash=sha256:5947809c8a2417be3267efc979c47d76a079758166f7d43ef5ae8e9f92751f88 \
- --hash=sha256:5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016 \
- --hash=sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede \
- --hash=sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf \
- --hash=sha256:5cb4d72eea50c8868f5288b7f7f33ed276118325c1dfd3957089f6b519e1382a \
- --hash=sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc \
- --hash=sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0 \
- --hash=sha256:64b55f9dce520635f018f907ff1b0df1fdc31f2795a922fb49dd14fbcdf48c84 \
- --hash=sha256:6515f3182dbe4ea06ced2d9e8666d97b46ef4c75e326b79bb624110f122551db \
- --hash=sha256:65e2befcd84bc6f37095f5961e68a6f077bf44946771354a28ad434c2cce0ae1 \
- --hash=sha256:6aee717dcfead04c6eb1ce3bd29ac1e22663cdea57f943c87d1eab9a025438d7 \
- --hash=sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed \
- --hash=sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8 \
- --hash=sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133 \
- --hash=sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e \
- --hash=sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef \
- --hash=sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14 \
- --hash=sha256:778d2e08eda00f4256d7f672ca9fef386071c9202f5e4607920b86d7803387f2 \
- --hash=sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0 \
- --hash=sha256:798d75d81754988d2565bff1b97ba5a44411867c0cf32b77a7e8f8d84796b10d \
- --hash=sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828 \
- --hash=sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f \
- --hash=sha256:7c308f7e26e4363d79df40ca5b2be1c6ba9f02bdbccfed5abddb7859a6ce72cf \
- --hash=sha256:7fa17817dc5625de8a027cb8b26d9fefa3ea28c8253929b8d6649e705d2835b6 \
- --hash=sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328 \
- --hash=sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090 \
- --hash=sha256:837c2ce8c5a65a2035be9b3569c684358dfbf109fd3b6969630a87535495ceaa \
- --hash=sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381 \
- --hash=sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c \
- --hash=sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb \
- --hash=sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc \
- --hash=sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a \
- --hash=sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec \
- --hash=sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc \
- --hash=sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac \
- --hash=sha256:9cd98cdc06614a2f768d2b7286d66805f94c48cde050acdbbb7db2600ab3197e \
- --hash=sha256:9d1bb833febdff5c8927f922386db610b49db6e0d4f4ee29601d71e7c2694313 \
- --hash=sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569 \
- --hash=sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3 \
- --hash=sha256:a61900df84c667873b292c3de315a786dd8dac506704dea57bc957bd31e22c7d \
- --hash=sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525 \
- --hash=sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894 \
- --hash=sha256:a8bf8d0f749c5757af2142fe7903a9df1d2e8aa3841559b2bad34b08d0e2bcf3 \
- --hash=sha256:a9768c477b9d7bd54bc0c86dbaebdec6f03306675526c9927c0e8a04e8f94af9 \
- --hash=sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a \
- --hash=sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9 \
- --hash=sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14 \
- --hash=sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25 \
- --hash=sha256:b5d84d37db046c5ca74ee7bb47dd6cbc13f80665fdde3e8040bdd3fb015ecb50 \
- --hash=sha256:b7cf1017d601aa35e6bb650b6ad28652c9cd78ee6caff19f3c28d03e1c80acbf \
- --hash=sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1 \
- --hash=sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3 \
- --hash=sha256:c4ef880e27901b6cc782f1b95f82da9313c0eb95c3af699103088fa0ac3ce9ac \
- --hash=sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e \
- --hash=sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815 \
- --hash=sha256:cb01158d8b88ee68f15949894ccc6712278243d95f344770fa7593fa2d94410c \
- --hash=sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6 \
- --hash=sha256:cc00f04ed596e9dc0da42ed17ac5e596c6ccba999ba6bd92b0e0aef2f170f2d6 \
- --hash=sha256:cd09d08005f958f370f539f186d10aec3377d55b9eeb0d796025d4886119d76e \
- --hash=sha256:cd4b7ca9984e5e7985c12bc60a6f173f3c958eae74f3ef6624bb6b26e2abbae4 \
- --hash=sha256:ce8a0633f41a967713a59c4139d29110c07e826d131a316b50ce11b1d79b4f84 \
- --hash=sha256:cead0978fc57397645f12578bfd2d5ea9138ea0fac82b2f63f7f7c6877986a69 \
- --hash=sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15 \
- --hash=sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191 \
- --hash=sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0 \
- --hash=sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897 \
- --hash=sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd \
- --hash=sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2 \
- --hash=sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794 \
- --hash=sha256:e824f1492727fa856dd6eda4f7cee25f8518a12f3c4a56a74e8095695089cf6d \
- --hash=sha256:e912091979546adf63357d7e2ccff9b44f026c075aeaf25a52d0e95ad2281074 \
- --hash=sha256:eaabd426fe94daf8fd157c32e571c85cb12e66692f15516a83a03264b08d06c3 \
- --hash=sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224 \
- --hash=sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838 \
- --hash=sha256:eecbc200c7fd5ddb9a7f16c7decb07b566c29fa2161a16cf67b8d068bd21690a \
- --hash=sha256:f155a433c2ec037d4e8df17d18922c3a0d9b3232a396690f17175d2946f0218d \
- --hash=sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d \
- --hash=sha256:f34be2938726fc13801220747472850852fe6b1ea75869a048d6f896838c896f \
- --hash=sha256:f820802628d2694cb7e56db99213f930856014862f3fd943d290ea8438d07ca8 \
- --hash=sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490 \
- --hash=sha256:f8e160feb2aed042cd657a72acc0b481212ed28b1b9a95c0cee1621b524e1966 \
- --hash=sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9 \
- --hash=sha256:fa09f53c465e532f4d3db095e0c55b615f010ad81803d383195b6b5ca6cbf5f3 \
- --hash=sha256:faa3a41b2b66b6e50f84ae4a68c64fcd0c44355741c6374813a800cd6695db9e \
- --hash=sha256:fd44c878ea55ba351104cb93cc85e74916eb8fa440ca7903e57575e97394f608
- # via requests
-docker==7.1.0 \
- --hash=sha256:ad8c70e6e3f8926cb8a92619b832b4ea5299e2831c14284663184e200546fa6c \
- --hash=sha256:c96b93b7f0a746f9e77d325bcfb87422a3d8bd4f03136ae8a85b37f1898d5fc0
- # via -r requirements.in
-idna==3.11 \
- --hash=sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea \
- --hash=sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902
- # via requests
-jinja2==3.1.6 \
- --hash=sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d \
- --hash=sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67
- # via -r requirements.in
-jsonschema==4.25.1 \
- --hash=sha256:3fba0169e345c7175110351d456342c364814cfcf3b964ba4587f22915230a63 \
- --hash=sha256:e4a9655ce0da0c0b67a085847e00a3a51449e1157f4f75e9fb5aa545e122eb85
- # via -r requirements.in
-jsonschema-specifications==2025.9.1 \
- --hash=sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe \
- --hash=sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d
- # via jsonschema
-markupsafe==3.0.3 \
- --hash=sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f \
- --hash=sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a \
- --hash=sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf \
- --hash=sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19 \
- --hash=sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf \
- --hash=sha256:0f4b68347f8c5eab4a13419215bdfd7f8c9b19f2b25520968adfad23eb0ce60c \
- --hash=sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175 \
- --hash=sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219 \
- --hash=sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb \
- --hash=sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6 \
- --hash=sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab \
- --hash=sha256:15d939a21d546304880945ca1ecb8a039db6b4dc49b2c5a400387cdae6a62e26 \
- --hash=sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1 \
- --hash=sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce \
- --hash=sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218 \
- --hash=sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634 \
- --hash=sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695 \
- --hash=sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad \
- --hash=sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73 \
- --hash=sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c \
- --hash=sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe \
- --hash=sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa \
- --hash=sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559 \
- --hash=sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa \
- --hash=sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37 \
- --hash=sha256:3537e01efc9d4dccdf77221fb1cb3b8e1a38d5428920e0657ce299b20324d758 \
- --hash=sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f \
- --hash=sha256:38664109c14ffc9e7437e86b4dceb442b0096dfe3541d7864d9cbe1da4cf36c8 \
- --hash=sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d \
- --hash=sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c \
- --hash=sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97 \
- --hash=sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a \
- --hash=sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19 \
- --hash=sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9 \
- --hash=sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9 \
- --hash=sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc \
- --hash=sha256:591ae9f2a647529ca990bc681daebdd52c8791ff06c2bfa05b65163e28102ef2 \
- --hash=sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4 \
- --hash=sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354 \
- --hash=sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50 \
- --hash=sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698 \
- --hash=sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9 \
- --hash=sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b \
- --hash=sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc \
- --hash=sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115 \
- --hash=sha256:7c3fb7d25180895632e5d3148dbdc29ea38ccb7fd210aa27acbd1201a1902c6e \
- --hash=sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485 \
- --hash=sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f \
- --hash=sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12 \
- --hash=sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025 \
- --hash=sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009 \
- --hash=sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d \
- --hash=sha256:949b8d66bc381ee8b007cd945914c721d9aba8e27f71959d750a46f7c282b20b \
- --hash=sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a \
- --hash=sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5 \
- --hash=sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f \
- --hash=sha256:a320721ab5a1aba0a233739394eb907f8c8da5c98c9181d1161e77a0c8e36f2d \
- --hash=sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1 \
- --hash=sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287 \
- --hash=sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6 \
- --hash=sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f \
- --hash=sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581 \
- --hash=sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed \
- --hash=sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b \
- --hash=sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c \
- --hash=sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026 \
- --hash=sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8 \
- --hash=sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676 \
- --hash=sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6 \
- --hash=sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e \
- --hash=sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d \
- --hash=sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d \
- --hash=sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01 \
- --hash=sha256:df2449253ef108a379b8b5d6b43f4b1a8e81a061d6537becd5582fba5f9196d7 \
- --hash=sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419 \
- --hash=sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795 \
- --hash=sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1 \
- --hash=sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5 \
- --hash=sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d \
- --hash=sha256:e8fc20152abba6b83724d7ff268c249fa196d8259ff481f3b1476383f8f24e42 \
- --hash=sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe \
- --hash=sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda \
- --hash=sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e \
- --hash=sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737 \
- --hash=sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523 \
- --hash=sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591 \
- --hash=sha256:f71a396b3bf33ecaa1626c255855702aca4d3d9fea5e051b41ac59a9c1c41edc \
- --hash=sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a \
- --hash=sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50
- # via jinja2
-pywin32==311 \
- --hash=sha256:0502d1facf1fed4839a9a51ccbcc63d952cf318f78ffc00a7e78528ac27d7a2b \
- --hash=sha256:184eb5e436dea364dcd3d2316d577d625c0351bf237c4e9a5fabbcfa5a58b151 \
- --hash=sha256:3aca44c046bd2ed8c90de9cb8427f581c479e594e99b5c0bb19b29c10fd6cb87 \
- --hash=sha256:3ce80b34b22b17ccbd937a6e78e7225d80c52f5ab9940fe0506a1a16f3dab503 \
- --hash=sha256:62ea666235135fee79bb154e695f3ff67370afefd71bd7fea7512fc70ef31e3d \
- --hash=sha256:6c6f2969607b5023b0d9ce2541f8d2cbb01c4f46bc87456017cf63b73f1e2d8c \
- --hash=sha256:718a38f7e5b058e76aee1c56ddd06908116d35147e133427e59a3983f703a20d \
- --hash=sha256:750ec6e621af2b948540032557b10a2d43b0cee2ae9758c54154d711cc852d31 \
- --hash=sha256:797c2772017851984b97180b0bebe4b620bb86328e8a884bb626156295a63b3b \
- --hash=sha256:7b4075d959648406202d92a2310cb990fea19b535c7f4a78d3f5e10b926eeb8a \
- --hash=sha256:a508e2d9025764a8270f93111a970e1d0fbfc33f4153b388bb649b7eec4f9b42 \
- --hash=sha256:a733f1388e1a842abb67ffa8e7aad0e70ac519e09b0f6a784e65a136ec7cefd2 \
- --hash=sha256:aba8f82d551a942cb20d4a83413ccbac30790b50efb89a75e4f586ac0bb8056b \
- --hash=sha256:b7a2c10b93f8986666d0c803ee19b5990885872a7de910fc460f9b0c2fbf92ee \
- --hash=sha256:b8c095edad5c211ff31c05223658e71bf7116daa0ecf3ad85f3201ea3190d067 \
- --hash=sha256:c8015b09fb9a5e188f83b7b04de91ddca4658cee2ae6f3bc483f0b21a77ef6cd \
- --hash=sha256:d03ff496d2a0cd4a5893504789d4a15399133fe82517455e78bad62efbb7f0a3 \
- --hash=sha256:e0c4cfb0621281fe40387df582097fd796e80430597cb9944f0ae70447bacd91 \
- --hash=sha256:e286f46a9a39c4a18b319c28f59b61de793654af2f395c102b4f819e584b5852 \
- --hash=sha256:f95ba5a847cba10dd8c4d8fefa9f2a6cf283b8b88ed6178fa8a6c1ab16054d0d
- # via docker
-pyyaml==6.0.2 \
- --hash=sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff \
- --hash=sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48 \
- --hash=sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086 \
- --hash=sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e \
- --hash=sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133 \
- --hash=sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5 \
- --hash=sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484 \
- --hash=sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee \
- --hash=sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5 \
- --hash=sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68 \
- --hash=sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a \
- --hash=sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf \
- --hash=sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99 \
- --hash=sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8 \
- --hash=sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85 \
- --hash=sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19 \
- --hash=sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc \
- --hash=sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a \
- --hash=sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1 \
- --hash=sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317 \
- --hash=sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c \
- --hash=sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631 \
- --hash=sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d \
- --hash=sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652 \
- --hash=sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5 \
- --hash=sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e \
- --hash=sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b \
- --hash=sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8 \
- --hash=sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476 \
- --hash=sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706 \
- --hash=sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563 \
- --hash=sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237 \
- --hash=sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b \
- --hash=sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083 \
- --hash=sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180 \
- --hash=sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425 \
- --hash=sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e \
- --hash=sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f \
- --hash=sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725 \
- --hash=sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183 \
- --hash=sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab \
- --hash=sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774 \
- --hash=sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725 \
- --hash=sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e \
- --hash=sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5 \
- --hash=sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d \
- --hash=sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290 \
- --hash=sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44 \
- --hash=sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed \
- --hash=sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4 \
- --hash=sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba \
- --hash=sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12 \
- --hash=sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4
- # via -r requirements.in
-referencing==0.37.0 \
- --hash=sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231 \
- --hash=sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8
- # via
- # jsonschema
- # jsonschema-specifications
-requests==2.32.5 \
- --hash=sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6 \
- --hash=sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf
- # via docker
-rpds-py==0.29.0 \
- --hash=sha256:00e56b12d2199ca96068057e1ae7f9998ab6e99cda82431afafd32f3ec98cca9 \
- --hash=sha256:0248b19405422573621172ab8e3a1f29141362d13d9f72bafa2e28ea0cdca5a2 \
- --hash=sha256:05a2bd42768ea988294ca328206efbcc66e220d2d9b7836ee5712c07ad6340ea \
- --hash=sha256:070befbb868f257d24c3bb350dbd6e2f645e83731f31264b19d7231dd5c396c7 \
- --hash=sha256:0a8896986efaa243ab713c69e6491a4138410f0fe36f2f4c71e18bd5501e8014 \
- --hash=sha256:0ea962671af5cb9a260489e311fa22b2e97103e3f9f0caaea6f81390af96a9ed \
- --hash=sha256:115f48170fd4296a33938d8c11f697f5f26e0472e43d28f35624764173a60e4d \
- --hash=sha256:12597d11d97b8f7e376c88929a6e17acb980e234547c92992f9f7c058f1a7310 \
- --hash=sha256:1585648d0760b88292eecab5181f5651111a69d90eff35d6b78aa32998886a61 \
- --hash=sha256:16e9da2bda9eb17ea318b4c335ec9ac1818e88922cbe03a5743ea0da9ecf74fb \
- --hash=sha256:1a409b0310a566bfd1be82119891fefbdce615ccc8aa558aff7835c27988cbef \
- --hash=sha256:1c3c3e8101bb06e337c88eb0c0ede3187131f19d97d43ea0e1c5407ea74c0cbf \
- --hash=sha256:1d24564a700ef41480a984c5ebed62b74e6ce5860429b98b1fede76049e953e6 \
- --hash=sha256:1de2345af363d25696969befc0c1688a6cb5e8b1d32b515ef84fc245c6cddba3 \
- --hash=sha256:1ea59b23ea931d494459c8338056fe7d93458c0bf3ecc061cd03916505369d55 \
- --hash=sha256:2023473f444752f0f82a58dfcbee040d0a1b3d1b3c2ec40e884bd25db6d117d2 \
- --hash=sha256:20c51ae86a0bb9accc9ad4e6cdeec58d5ebb7f1b09dd4466331fc65e1766aae7 \
- --hash=sha256:24a16cb7163933906c62c272de20ea3c228e4542c8c45c1d7dc2b9913e17369a \
- --hash=sha256:24a7231493e3c4a4b30138b50cca089a598e52c34cf60b2f35cebf62f274fdea \
- --hash=sha256:2549d833abdf8275c901313b9e8ff8fba57e50f6a495035a2a4e30621a2f7cc4 \
- --hash=sha256:28de03cf48b8a9e6ec10318f2197b83946ed91e2891f651a109611be4106ac4b \
- --hash=sha256:28fd300326dd21198f311534bdb6d7e989dd09b3418b3a91d54a0f384c700967 \
- --hash=sha256:295ce5ac7f0cf69a651ea75c8f76d02a31f98e5698e82a50a5f4d4982fbbae3b \
- --hash=sha256:2a21deb8e0d1571508c6491ce5ea5e25669b1dd4adf1c9d64b6314842f708b5d \
- --hash=sha256:2aba991e041d031c7939e1358f583ae405a7bf04804ca806b97a5c0e0af1ea5e \
- --hash=sha256:2b8e54d6e61f3ecd3abe032065ce83ea63417a24f437e4a3d73d2f85ce7b7cfe \
- --hash=sha256:2d6fb2ad1c36f91c4646989811e84b1ea5e0c3cf9690b826b6e32b7965853a63 \
- --hash=sha256:33ca7bdfedd83339ca55da3a5e1527ee5870d4b8369456b5777b197756f3ca22 \
- --hash=sha256:37d94eadf764d16b9a04307f2ab1d7af6dc28774bbe0535c9323101e14877b4c \
- --hash=sha256:3897924d3f9a0361472d884051f9a2460358f9a45b1d85a39a158d2f8f1ad71c \
- --hash=sha256:3919a3bbecee589300ed25000b6944174e07cd20db70552159207b3f4bbb45b8 \
- --hash=sha256:394d27e4453d3b4d82bb85665dc1fcf4b0badc30fc84282defed71643b50e1a1 \
- --hash=sha256:3fbd4e9aebf110473a420dea85a238b254cf8a15acb04b22a5a6b5ce8925b760 \
- --hash=sha256:3fd2164d73812026ce970d44c3ebd51e019d2a26a4425a5dcbdfa93a34abc383 \
- --hash=sha256:40f65470919dc189c833e86b2c4bd21bd355f98436a2cef9e0a9a92aebc8e57e \
- --hash=sha256:4448dad428f28a6a767c3e3b80cde3446a22a0efbddaa2360f4bb4dc836d0688 \
- --hash=sha256:44a91e0ab77bdc0004b43261a4b8cd6d6b451e8d443754cfda830002b5745b32 \
- --hash=sha256:453783477aa4f2d9104c4b59b08c871431647cb7af51b549bbf2d9eb9c827756 \
- --hash=sha256:4a097b7f7f7274164566ae90a221fd725363c0e9d243e2e9ed43d195ccc5495c \
- --hash=sha256:4aa195e5804d32c682e453b34474f411ca108e4291c6a0f824ebdc30a91c973c \
- --hash=sha256:4ae4b88c6617e1b9e5038ab3fccd7bac0842fdda2b703117b2aa99bc85379113 \
- --hash=sha256:521807963971a23996ddaf764c682b3e46459b3c58ccd79fefbe16718db43154 \
- --hash=sha256:534dc9df211387547267ccdb42253aa30527482acb38dd9b21c5c115d66a96d2 \
- --hash=sha256:539eb77eb043afcc45314d1be09ea6d6cafb3addc73e0547c171c6d636957f60 \
- --hash=sha256:55d827b2ae95425d3be9bc9a5838b6c29d664924f98146557f7715e331d06df8 \
- --hash=sha256:56838e1cd9174dc23c5691ee29f1d1be9eab357f27efef6bded1328b23e1ced2 \
- --hash=sha256:5a572911cd053137bbff8e3a52d31c5d2dba51d3a67ad902629c70185f3f2181 \
- --hash=sha256:5c9546cfdd5d45e562cc0444b6dddc191e625c62e866bf567a2c69487c7ad28a \
- --hash=sha256:5cc58aac218826d054c7da7f95821eba94125d88be673ff44267bb89d12a5866 \
- --hash=sha256:6410e66f02803600edb0b1889541f4b5cc298a5ccda0ad789cc50ef23b54813e \
- --hash=sha256:66786c3fb1d8de416a7fa8e1cb1ec6ba0a745b2b0eee42f9b7daa26f1a495545 \
- --hash=sha256:6e97846e9800a5d0fe7be4d008f0c93d0feeb2700da7b1f7528dabafb31dfadb \
- --hash=sha256:7033c1010b1f57bb44d8067e8c25aa6fa2e944dbf46ccc8c92b25043839c3fd2 \
- --hash=sha256:715b67eac317bf1c7657508170a3e011a1ea6ccb1c9d5f296e20ba14196be6b3 \
- --hash=sha256:72fdfd5ff8992e4636621826371e3ac5f3e3b8323e9d0e48378e9c13c3dac9d0 \
- --hash=sha256:76054d540061eda273274f3d13a21a4abdde90e13eaefdc205db37c05230efce \
- --hash=sha256:76fe96632d53f3bf0ea31ede2f53bbe3540cc2736d4aec3b3801b0458499ef3a \
- --hash=sha256:7971bdb7bf4ee0f7e6f67fa4c7fbc6019d9850cc977d126904392d363f6f8318 \
- --hash=sha256:799156ef1f3529ed82c36eb012b5d7a4cf4b6ef556dd7cc192148991d07206ae \
- --hash=sha256:7cdc0490374e31cedefefaa1520d5fe38e82fde8748cbc926e7284574c714d6b \
- --hash=sha256:7d9128ec9d8cecda6f044001fde4fb71ea7c24325336612ef8179091eb9596b9 \
- --hash=sha256:7f437026dbbc3f08c99cc41a5b2570c6e1a1ddbe48ab19a9b814254128d4ea7a \
- --hash=sha256:80fdf53d36e6c72819993e35d1ebeeb8e8fc688d0c6c2b391b55e335b3afba5a \
- --hash=sha256:8238d1d310283e87376c12f658b61e1ee23a14c0e54c7c0ce953efdbdc72deed \
- --hash=sha256:89ca2e673ddd5bde9b386da9a0aac0cab0e76f40c8f0aaf0d6311b6bbf2aa311 \
- --hash=sha256:8ae33ad9ce580c7a47452c3b3f7d8a9095ef6208e0a0c7e4e2384f9fc5bf8212 \
- --hash=sha256:8c5a8ecaa44ce2d8d9d20a68a2483a74c07f05d72e94a4dff88906c8807e77b0 \
- --hash=sha256:8e5bb73ffc029820f4348e9b66b3027493ae00bca6629129cd433fd7a76308ee \
- --hash=sha256:90f30d15f45048448b8da21c41703b31c61119c06c216a1bf8c245812a0f0c17 \
- --hash=sha256:923248a56dd8d158389a28934f6f69ebf89f218ef96a6b216a9be6861804d3f4 \
- --hash=sha256:9459a33f077130dbb2c7c3cea72ee9932271fb3126404ba2a2661e4fe9eb7b79 \
- --hash=sha256:97c817863ffc397f1e6a6e9d2d89fe5408c0a9922dac0329672fb0f35c867ea5 \
- --hash=sha256:9b9c764a11fd637e0322a488560533112837f5334ffeb48b1be20f6d98a7b437 \
- --hash=sha256:9ba8028597e824854f0f1733d8b964e914ae3003b22a10c2c664cb6927e0feb9 \
- --hash=sha256:9efe71687d6427737a0a2de9ca1c0a216510e6cd08925c44162be23ed7bed2d5 \
- --hash=sha256:9f84c549746a5be3bc7415830747a3a0312573afc9f95785eb35228bb17742ec \
- --hash=sha256:a0891cfd8db43e085c0ab93ab7e9b0c8fee84780d436d3b266b113e51e79f954 \
- --hash=sha256:a110e14508fd26fd2e472bb541f37c209409876ba601cf57e739e87d8a53cf95 \
- --hash=sha256:a5d9da3ff5af1ca1249b1adb8ef0573b94c76e6ae880ba1852f033bf429d4588 \
- --hash=sha256:a738f2da2f565989401bd6fd0b15990a4d1523c6d7fe83f300b7e7d17212feca \
- --hash=sha256:acd82a9e39082dc5f4492d15a6b6c8599aa21db5c35aaf7d6889aea16502c07d \
- --hash=sha256:ad7bd570be92695d89285a4b373006930715b78d96449f686af422debb4d3949 \
- --hash=sha256:b016eddf00dca7944721bf0cd85b6af7f6c4efaf83ee0b37c4133bd39757a8c7 \
- --hash=sha256:b1581fcde18fcdf42ea2403a16a6b646f8eb1e58d7f90a0ce693da441f76942e \
- --hash=sha256:b58f5c77f1af888b5fd1876c9a0d9858f6f88a39c9dd7c073a88e57e577da66d \
- --hash=sha256:b5f6134faf54b3cb83375db0f113506f8b7770785be1f95a631e7e2892101977 \
- --hash=sha256:b9cf2359a4fca87cfb6801fae83a76aedf66ee1254a7a151f1341632acf67f1b \
- --hash=sha256:ba5e1aeaf8dd6d8f6caba1f5539cddda87d511331714b7b5fc908b6cfc3636b7 \
- --hash=sha256:bb78b3a0d31ac1bde132c67015a809948db751cb4e92cdb3f0b242e430b6ed0d \
- --hash=sha256:bdb67151ea81fcf02d8f494703fb728d4d34d24556cbff5f417d74f6f5792e7c \
- --hash=sha256:c07d107b7316088f1ac0177a7661ca0c6670d443f6fe72e836069025e6266761 \
- --hash=sha256:c4695dd224212f6105db7ea62197144230b808d6b2bba52238906a2762f1d1e7 \
- --hash=sha256:c5523b0009e7c3c1263471b69d8da1c7d41b3ecb4cb62ef72be206b92040a950 \
- --hash=sha256:c661132ab2fb4eeede2ef69670fd60da5235209874d001a98f1542f31f2a8a94 \
- --hash=sha256:d37812c3da8e06f2bb35b3cf10e4a7b68e776a706c13058997238762b4e07f4f \
- --hash=sha256:d456e64724a075441e4ed648d7f154dc62e9aabff29bcdf723d0c00e9e1d352f \
- --hash=sha256:d472cf73efe5726a067dce63eebe8215b14beabea7c12606fd9994267b3cfe2b \
- --hash=sha256:d583d4403bcbf10cffc3ab5cee23d7643fcc960dff85973fd3c2d6c86e8dbb0c \
- --hash=sha256:de73e40ebc04dd5d9556f50180395322193a78ec247e637e741c1b954810f295 \
- --hash=sha256:def48ff59f181130f1a2cb7c517d16328efac3ec03951cca40c1dc2049747e83 \
- --hash=sha256:e6596b93c010d386ae46c9fba9bfc9fc5965fa8228edeac51576299182c2e31c \
- --hash=sha256:e71136fd0612556b35c575dc2726ae04a1669e6a6c378f2240312cf5d1a2ab10 \
- --hash=sha256:e7fa2ccc312bbd91e43aa5e0869e46bc03278a3dddb8d58833150a18b0f0283a \
- --hash=sha256:ea7173df5d86f625f8dde6d5929629ad811ed8decda3b60ae603903839ac9ac0 \
- --hash=sha256:f3b1b87a237cb2dba4db18bcfaaa44ba4cd5936b91121b62292ff21df577fc43 \
- --hash=sha256:f475f103488312e9bd4000bc890a95955a07b2d0b6e8884aef4be56132adbbf1 \
- --hash=sha256:f49196aec7c4b406495f60e6f947ad71f317a765f956d74bbd83996b9edc0352 \
- --hash=sha256:f49d41559cebd608042fdcf54ba597a4a7555b49ad5c1c0c03e0af82692661cd \
- --hash=sha256:f7728653900035fb7b8d06e1e5900545d8088efc9d5d4545782da7df03ec803f \
- --hash=sha256:f9f436aee28d13b9ad2c764fc273e0457e37c2e61529a07b928346b219fcde3b \
- --hash=sha256:fc31a07ed352e5462d3ee1b22e89285f4ce97d5266f6d1169da1142e78045626 \
- --hash=sha256:fc935f6b20b0c9f919a8ff024739174522abd331978f750a74bb68abd117bd19 \
- --hash=sha256:fcae1770b401167f8b9e1e3f566562e6966ffa9ce63639916248a9e25fa8a244 \
- --hash=sha256:fd7951c964069039acc9d67a8ff1f0a7f34845ae180ca542b17dc1456b1f1808 \
- --hash=sha256:fe55fe686908f50154d1dc599232016e50c243b438c3b7432f24e2895b0e5359
- # via
- # jsonschema
- # referencing
-six==1.17.0 \
- --hash=sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 \
- --hash=sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81
- # via -r requirements.in
-tomli==2.2.1 \
- --hash=sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6 \
- --hash=sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd \
- --hash=sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c \
- --hash=sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b \
- --hash=sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8 \
- --hash=sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6 \
- --hash=sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77 \
- --hash=sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff \
- --hash=sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea \
- --hash=sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192 \
- --hash=sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249 \
- --hash=sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee \
- --hash=sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4 \
- --hash=sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98 \
- --hash=sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8 \
- --hash=sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4 \
- --hash=sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281 \
- --hash=sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744 \
- --hash=sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69 \
- --hash=sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13 \
- --hash=sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140 \
- --hash=sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e \
- --hash=sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e \
- --hash=sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc \
- --hash=sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff \
- --hash=sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec \
- --hash=sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2 \
- --hash=sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222 \
- --hash=sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106 \
- --hash=sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272 \
- --hash=sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a \
- --hash=sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7
- # via -r requirements.in
-typing-extensions==4.15.0 \
- --hash=sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466 \
- --hash=sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548
- # via -r requirements.in
-urllib3==2.5.0 \
- --hash=sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760 \
- --hash=sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc
- # via
- # docker
- # requests
-zstandard==0.25.0 \
- --hash=sha256:011d388c76b11a0c165374ce660ce2c8efa8e5d87f34996aa80f9c0816698b64 \
- --hash=sha256:01582723b3ccd6939ab7b3a78622c573799d5d8737b534b86d0e06ac18dbde4a \
- --hash=sha256:05353cef599a7b0b98baca9b068dd36810c3ef0f42bf282583f438caf6ddcee3 \
- --hash=sha256:05df5136bc5a011f33cd25bc9f506e7426c0c9b3f9954f056831ce68f3b6689f \
- --hash=sha256:06acb75eebeedb77b69048031282737717a63e71e4ae3f77cc0c3b9508320df6 \
- --hash=sha256:07b527a69c1e1c8b5ab1ab14e2afe0675614a09182213f21a0717b62027b5936 \
- --hash=sha256:0bbc9a0c65ce0eea3c34a691e3c4b6889f5f3909ba4822ab385fab9057099431 \
- --hash=sha256:0be7622c37c183406f3dbf0cba104118eb16a4ea7359eeb5752f0794882fc250 \
- --hash=sha256:106281ae350e494f4ac8a80470e66d1fe27e497052c8d9c3b95dc4cf1ade81aa \
- --hash=sha256:10ef2a79ab8e2974e2075fb984e5b9806c64134810fac21576f0668e7ea19f8f \
- --hash=sha256:1673b7199bbe763365b81a4f3252b8e80f44c9e323fc42940dc8843bfeaf9851 \
- --hash=sha256:172de1f06947577d3a3005416977cce6168f2261284c02080e7ad0185faeced3 \
- --hash=sha256:181eb40e0b6a29b3cd2849f825e0fa34397f649170673d385f3598ae17cca2e9 \
- --hash=sha256:1869da9571d5e94a85a5e8d57e4e8807b175c9e4a6294e3b66fa4efb074d90f6 \
- --hash=sha256:19796b39075201d51d5f5f790bf849221e58b48a39a5fc74837675d8bafc7362 \
- --hash=sha256:1cd5da4d8e8ee0e88be976c294db744773459d51bb32f707a0f166e5ad5c8649 \
- --hash=sha256:1f3689581a72eaba9131b1d9bdbfe520ccd169999219b41000ede2fca5c1bfdb \
- --hash=sha256:1f830a0dac88719af0ae43b8b2d6aef487d437036468ef3c2ea59c51f9d55fd5 \
- --hash=sha256:223415140608d0f0da010499eaa8ccdb9af210a543fac54bce15babbcfc78439 \
- --hash=sha256:22a06c5df3751bb7dc67406f5374734ccee8ed37fc5981bf1ad7041831fa1137 \
- --hash=sha256:22a086cff1b6ceca18a8dd6096ec631e430e93a8e70a9ca5efa7561a00f826fa \
- --hash=sha256:23ebc8f17a03133b4426bcc04aabd68f8236eb78c3760f12783385171b0fd8bd \
- --hash=sha256:25f8f3cd45087d089aef5ba3848cd9efe3ad41163d3400862fb42f81a3a46701 \
- --hash=sha256:2b6bd67528ee8b5c5f10255735abc21aa106931f0dbaf297c7be0c886353c3d0 \
- --hash=sha256:2e54296a283f3ab5a26fc9b8b5d4978ea0532f37b231644f367aa588930aa043 \
- --hash=sha256:3756b3e9da9b83da1796f8809dd57cb024f838b9eeafde28f3cb472012797ac1 \
- --hash=sha256:37daddd452c0ffb65da00620afb8e17abd4adaae6ce6310702841760c2c26860 \
- --hash=sha256:3a39c94ad7866160a4a46d772e43311a743c316942037671beb264e395bdd611 \
- --hash=sha256:3b870ce5a02d4b22286cf4944c628e0f0881b11b3f14667c1d62185a99e04f53 \
- --hash=sha256:3c83b0188c852a47cd13ef3bf9209fb0a77fa5374958b8c53aaa699398c6bd7b \
- --hash=sha256:4203ce3b31aec23012d3a4cf4a2ed64d12fea5269c49aed5e4c3611b938e4088 \
- --hash=sha256:457ed498fc58cdc12fc48f7950e02740d4f7ae9493dd4ab2168a47c93c31298e \
- --hash=sha256:474d2596a2dbc241a556e965fb76002c1ce655445e4e3bf38e5477d413165ffa \
- --hash=sha256:4b14abacf83dfb5c25eb4e4a79520de9e7e205f72c9ee7702f91233ae57d33a2 \
- --hash=sha256:4b6d83057e713ff235a12e73916b6d356e3084fd3d14ced499d84240f3eecee0 \
- --hash=sha256:4d441506e9b372386a5271c64125f72d5df6d2a8e8a2a45a0ae09b03cb781ef7 \
- --hash=sha256:4f187a0bb61b35119d1926aee039524d1f93aaf38a9916b8c4b78ac8514a0aaf \
- --hash=sha256:51526324f1b23229001eb3735bc8c94f9c578b1bd9e867a0a646a3b17109f388 \
- --hash=sha256:53e08b2445a6bc241261fea89d065536f00a581f02535f8122eba42db9375530 \
- --hash=sha256:53f94448fe5b10ee75d246497168e5825135d54325458c4bfffbaafabcc0a577 \
- --hash=sha256:5a56ba0db2d244117ed744dfa8f6f5b366e14148e00de44723413b2f3938a902 \
- --hash=sha256:5f1ad7bf88535edcf30038f6919abe087f606f62c00a87d7e33e7fc57cb69fcc \
- --hash=sha256:5f5e4c2a23ca271c218ac025bd7d635597048b366d6f31f420aaeb715239fc98 \
- --hash=sha256:6a573a35693e03cf1d67799fd01b50ff578515a8aeadd4595d2a7fa9f3ec002a \
- --hash=sha256:6c0e5a65158a7946e7a7affa6418878ef97ab66636f13353b8502d7ea03c8097 \
- --hash=sha256:6dffecc361d079bb48d7caef5d673c88c8988d3d33fb74ab95b7ee6da42652ea \
- --hash=sha256:7030defa83eef3e51ff26f0b7bfb229f0204b66fe18e04359ce3474ac33cbc09 \
- --hash=sha256:7149623bba7fdf7e7f24312953bcf73cae103db8cae49f8154dd1eadc8a29ecb \
- --hash=sha256:72d35d7aa0bba323965da807a462b0966c91608ef3a48ba761678cb20ce5d8b7 \
- --hash=sha256:75ffc32a569fb049499e63ce68c743155477610532da1eb38e7f24bf7cd29e74 \
- --hash=sha256:7713e1179d162cf5c7906da876ec2ccb9c3a9dcbdffef0cc7f70c3667a205f0b \
- --hash=sha256:78228d8a6a1c177a96b94f7e2e8d012c55f9c760761980da16ae7546a15a8e9b \
- --hash=sha256:7b3c3a3ab9daa3eed242d6ecceead93aebbb8f5f84318d82cee643e019c4b73b \
- --hash=sha256:809c5bcb2c67cd0ed81e9229d227d4ca28f82d0f778fc5fea624a9def3963f91 \
- --hash=sha256:81dad8d145d8fd981b2962b686b2241d3a1ea07733e76a2f15435dfb7fb60150 \
- --hash=sha256:85304a43f4d513f5464ceb938aa02c1e78c2943b29f44a750b48b25ac999a049 \
- --hash=sha256:89c4b48479a43f820b749df49cd7ba2dbc2b1b78560ecb5ab52985574fd40b27 \
- --hash=sha256:8e735494da3db08694d26480f1493ad2cf86e99bdd53e8e9771b2752a5c0246a \
- --hash=sha256:913cbd31a400febff93b564a23e17c3ed2d56c064006f54efec210d586171c00 \
- --hash=sha256:9174f4ed06f790a6869b41cba05b43eeb9a35f8993c4422ab853b705e8112bbd \
- --hash=sha256:9300d02ea7c6506f00e627e287e0492a5eb0371ec1670ae852fefffa6164b072 \
- --hash=sha256:933b65d7680ea337180733cf9e87293cc5500cc0eb3fc8769f4d3c88d724ec5c \
- --hash=sha256:9654dbc012d8b06fc3d19cc825af3f7bf8ae242226df5f83936cb39f5fdc846c \
- --hash=sha256:98750a309eb2f020da61e727de7d7ba3c57c97cf6213f6f6277bb7fb42a8e065 \
- --hash=sha256:99c0c846e6e61718715a3c9437ccc625de26593fea60189567f0118dc9db7512 \
- --hash=sha256:a1a4ae2dec3993a32247995bdfe367fc3266da832d82f8438c8570f989753de1 \
- --hash=sha256:a3f79487c687b1fc69f19e487cd949bf3aae653d181dfb5fde3bf6d18894706f \
- --hash=sha256:a4089a10e598eae6393756b036e0f419e8c1d60f44a831520f9af41c14216cf2 \
- --hash=sha256:a51ff14f8017338e2f2e5dab738ce1ec3b5a851f23b18c1ae1359b1eecbee6df \
- --hash=sha256:a5a419712cf88862a45a23def0ae063686db3d324cec7edbe40509d1a79a0aab \
- --hash=sha256:a9ec8c642d1ec73287ae3e726792dd86c96f5681eb8df274a757bf62b750eae7 \
- --hash=sha256:aaf21ba8fb76d102b696781bddaa0954b782536446083ae3fdaa6f16b25a1c4b \
- --hash=sha256:ab85470ab54c2cb96e176f40342d9ed41e58ca5733be6a893b730e7af9c40550 \
- --hash=sha256:b9af1fe743828123e12b41dd8091eca1074d0c1569cc42e6e1eee98027f2bbd0 \
- --hash=sha256:bfc4e20784722098822e3eee42b8e576b379ed72cca4a7cb856ae733e62192ea \
- --hash=sha256:bfd06b1c5584b657a2892a6014c2f4c20e0db0208c159148fa78c65f7e0b0277 \
- --hash=sha256:c19bcdd826e95671065f8692b5a4aa95c52dc7a02a4c5a0cac46deb879a017a2 \
- --hash=sha256:c2ba942c94e0691467ab901fc51b6f2085ff48f2eea77b1a48240f011e8247c7 \
- --hash=sha256:c8e167d5adf59476fa3e37bee730890e389410c354771a62e3c076c86f9f7778 \
- --hash=sha256:ca54090275939dc8ec5dea2d2afb400e0f83444b2fc24e07df7fdef677110859 \
- --hash=sha256:d7541afd73985c630bafcd6338d2518ae96060075f9463d7dc14cfb33514383d \
- --hash=sha256:d8c56bb4e6c795fc77d74d8e8b80846e1fb8292fc0b5060cd8131d522974b751 \
- --hash=sha256:da469dc041701583e34de852d8634703550348d5822e66a0c827d39b05365b12 \
- --hash=sha256:daab68faadb847063d0c56f361a289c4f268706b598afbf9ad113cbe5c38b6b2 \
- --hash=sha256:e05ab82ea7753354bb054b92e2f288afb750e6b439ff6ca78af52939ebbc476d \
- --hash=sha256:e09bb6252b6476d8d56100e8147b803befa9a12cea144bbe629dd508800d1ad0 \
- --hash=sha256:e29f0cf06974c899b2c188ef7f783607dbef36da4c242eb6c82dcd8b512855e3 \
- --hash=sha256:e59fdc271772f6686e01e1b3b74537259800f57e24280be3f29c8a0deb1904dd \
- --hash=sha256:e7360eae90809efd19b886e59a09dad07da4ca9ba096752e61a2e03c8aca188e \
- --hash=sha256:e96594a5537722fdfb79951672a2a63aec5ebfb823e7560586f7484819f2a08f \
- --hash=sha256:ea9d54cc3d8064260114a0bbf3479fc4a98b21dffc89b3459edd506b69262f6e \
- --hash=sha256:ec996f12524f88e151c339688c3897194821d7f03081ab35d31d1e12ec975e94 \
- --hash=sha256:f27662e4f7dbf9f9c12391cb37b4c4c3cb90ffbd3b1fb9284dadbbb8935fa708 \
- --hash=sha256:f373da2c1757bb7f1acaf09369cdc1d51d84131e50d5fa9863982fd626466313 \
- --hash=sha256:f5aeea11ded7320a84dcdd62a3d95b5186834224a9e55b92ccae35d21a8b63d4 \
- --hash=sha256:f604efd28f239cc21b3adb53eb061e2a205dc164be408e553b41ba2ffe0ca15c \
- --hash=sha256:f67e8f1a324a900e75b5e28ffb152bcac9fbed1cc7b43f99cd90f395c4375344 \
- --hash=sha256:fd7a5004eb1980d3cefe26b2685bcb0b17989901a70a1040d1ac86f1d898c551 \
- --hash=sha256:ffef5a74088f1e09947aecf91011136665152e0b4b359c42be3373897fb39b01
- # via -r requirements.in
diff --git a/scripts/update_downloads.py b/scripts/update_downloads.py
new file mode 100644
index 000000000..41959fa0c
--- /dev/null
+++ b/scripts/update_downloads.py
@@ -0,0 +1,868 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+# /// script
+# requires-python = ">=3.10"
+# dependencies = [
+# "packaging>=24",
+# ]
+# ///
+
+"""Find and optionally apply updates to pythonbuild/downloads.py.
+
+From the repository root, run ``uv run scripts/update_downloads.py`` to list
+possible updates. Pass one or more package names and ``--write`` to download
+those artifacts, calculate their metadata, and update the download table.
+
+Version discovery is intentionally configured per package. Many dependencies
+have a release-series constraint or an artifact URL that cannot be inferred
+safely from the URL currently recorded in the download table.
+"""
+
+from __future__ import annotations
+
+import argparse
+import ast
+import concurrent.futures
+import dataclasses
+import hashlib
+import html.parser
+import json
+import os
+import pathlib
+import re
+import shlex
+import sys
+import urllib.parse
+import urllib.request
+from collections.abc import Callable, Iterable, Sequence
+from typing import Any, Protocol, cast
+
+from packaging.version import InvalidVersion, Version
+
+ROOT = pathlib.Path(__file__).resolve().parents[1]
+DOWNLOADS_PATH = ROOT / "pythonbuild" / "downloads.py"
+DISTTESTS_PATH = ROOT / "pythonbuild" / "disttests" / "__init__.py"
+DEFAULT_STAGING_DIR = ROOT / "build" / "download-updates"
+MIRROR_BASE_URL = "https://astral-sh.github.io/mirror/files/"
+USER_AGENT = "python-build-standalone update-downloads"
+
+
+@dataclasses.dataclass(frozen=True)
+class Release:
+ version: str
+ url: str
+
+
+class Discovery(Protocol):
+ def releases(self, client: HttpClient) -> Iterable[Release]: ...
+
+
+@dataclasses.dataclass(frozen=True)
+class Policy:
+ discovery: Discovery
+ series_components: int = 0
+ allow_prereleases: bool = False
+ mirrored: bool = False
+ note: str | None = None
+ version_parser: Callable[[str], Version] = Version
+
+ def accepts(self, candidate: Version, current: Version) -> bool:
+ if candidate <= current:
+ return False
+ if candidate.is_prerelease and not self.allow_prereleases:
+ return False
+ if self.series_components:
+ count = self.series_components
+ return candidate.release[:count] == current.release[:count]
+ return True
+
+
+@dataclasses.dataclass(frozen=True)
+class CheckResult:
+ package: str
+ current_version: str
+ release: Release | None = None
+ error: str | None = None
+
+
+class HttpClient:
+ def __init__(self, github_token: str | None = None) -> None:
+ self.github_token = github_token
+
+ def open(self, url: str) -> Any:
+ headers = {"User-Agent": USER_AGENT, "Accept-Encoding": "identity"}
+ if self.github_token and urllib.parse.urlparse(url).netloc == "api.github.com":
+ headers["Authorization"] = f"Bearer {self.github_token}"
+ request = urllib.request.Request(url, headers=headers)
+ return urllib.request.urlopen(request, timeout=60)
+
+ def text(self, url: str) -> str:
+ with self.open(url) as response:
+ charset = response.headers.get_content_charset() or "utf-8"
+ return cast(str, response.read().decode(charset, errors="replace"))
+
+ def json(self, url: str) -> Any:
+ return json.loads(self.text(url))
+
+
+class _LinkParser(html.parser.HTMLParser):
+ def __init__(self) -> None:
+ super().__init__()
+ self.links: list[str] = []
+
+ def handle_starttag(self, tag: str, attrs: list[tuple[str, str | None]]) -> None:
+ if tag.lower() != "a":
+ return
+ href = dict(attrs).get("href")
+ if href:
+ self.links.append(href)
+
+
+@dataclasses.dataclass(frozen=True)
+class HtmlDiscovery:
+ """Discover versions from links in a directory or release page."""
+
+ index_url: str
+ link_pattern: str
+ artifact_url: str | None = None
+ version_transform: Callable[[str], str] = lambda value: value
+
+ def releases(self, client: HttpClient) -> Iterable[Release]:
+ parser = _LinkParser()
+ parser.feed(client.text(self.index_url))
+ pattern = re.compile(self.link_pattern)
+ for href in parser.links:
+ match = pattern.search(urllib.parse.unquote(href))
+ if not match:
+ continue
+ version = self.version_transform(match.group("version"))
+ url = (
+ self.artifact_url.format(version=version)
+ if self.artifact_url
+ else urllib.parse.urljoin(self.index_url, href)
+ )
+ yield Release(version, url)
+
+
+@dataclasses.dataclass(frozen=True)
+class GitHubReleaseDiscovery:
+ """Discover release artifacts using the GitHub releases API."""
+
+ repository: str
+ tag_pattern: str
+ artifact_name: str | None = None
+ artifact_url: str | None = None
+ version_transform: Callable[[str], str] = lambda value: value
+
+ def releases(self, client: HttpClient) -> Iterable[Release]:
+ url = f"https://api.github.com/repos/{self.repository}/releases?per_page=100"
+ pattern = re.compile(self.tag_pattern)
+ for item in client.json(url):
+ if item.get("draft"):
+ continue
+ match = pattern.fullmatch(item["tag_name"])
+ if not match:
+ continue
+ version = self.version_transform(match.group("version"))
+ if self.artifact_name:
+ expected = self.artifact_name.format(version=version)
+ asset_url = next(
+ (
+ asset["browser_download_url"]
+ for asset in item.get("assets", [])
+ if asset["name"] == expected
+ ),
+ None,
+ )
+ if not asset_url:
+ continue
+ elif self.artifact_url:
+ asset_url = self.artifact_url.format(
+ version=version, tag=item["tag_name"]
+ )
+ else:
+ raise ValueError("GitHub discovery needs an artifact name or URL")
+ yield Release(version, asset_url)
+
+
+@dataclasses.dataclass(frozen=True)
+class PyPIDiscovery:
+ project: str
+ filename_pattern: str
+
+ def releases(self, client: HttpClient) -> Iterable[Release]:
+ data = client.json(f"https://pypi.org/pypi/{self.project}/json")
+ pattern = re.compile(self.filename_pattern)
+ for version, files in data["releases"].items():
+ for file_data in files:
+ if pattern.fullmatch(file_data["filename"]):
+ yield Release(version, file_data["url"])
+ break
+
+
+def html_policy(
+ index_url: str,
+ link_pattern: str,
+ *,
+ artifact_url: str | None = None,
+ series: int = 0,
+ mirrored: bool = False,
+ allow_prereleases: bool = False,
+ version_transform: Callable[[str], str] = lambda value: value,
+ version_parser: Callable[[str], Version] = Version,
+) -> Policy:
+ return Policy(
+ HtmlDiscovery(index_url, link_pattern, artifact_url, version_transform),
+ series_components=series,
+ allow_prereleases=allow_prereleases,
+ mirrored=mirrored,
+ version_parser=version_parser,
+ )
+
+
+def github_policy(
+ repository: str,
+ tag_pattern: str,
+ *,
+ artifact_name: str | None = None,
+ artifact_url: str | None = None,
+ series: int = 0,
+ mirrored: bool = False,
+ version_transform: Callable[[str], str] = lambda value: value,
+) -> Policy:
+ return Policy(
+ GitHubReleaseDiscovery(
+ repository,
+ tag_pattern,
+ artifact_name,
+ artifact_url,
+ version_transform,
+ ),
+ series_components=series,
+ mirrored=mirrored,
+ )
+
+
+def gnu_policy(name: str, extension: str, *, series: int = 0) -> Policy:
+ return html_policy(
+ f"https://ftp.gnu.org/gnu/{name}/",
+ rf"(?:^|/){re.escape(name)}-(?P[0-9]+(?:\.[0-9]+)*)"
+ rf"\.{re.escape(extension)}$",
+ series=series,
+ mirrored=True,
+ )
+
+
+def cpython_policy(series: str, allow_prereleases: bool = False) -> Policy:
+ escaped = re.escape(series)
+ if allow_prereleases:
+ return html_policy(
+ f"https://www.python.org/ftp/python/{series}.0/",
+ rf"^Python-(?P{escaped}\.0"
+ rf"(?:a[0-9]+|b[0-9]+|rc[0-9]+)?)\.tar\.xz$",
+ series=2,
+ allow_prereleases=True,
+ )
+ return html_policy(
+ "https://www.python.org/ftp/python/",
+ rf"^(?P{escaped}\.[0-9]+)/$",
+ artifact_url="https://www.python.org/ftp/python/{version}/Python-{version}.tar.xz",
+ series=2,
+ )
+
+
+def xorg_policy(category: str, name: str, extension: str = "tar.gz") -> Policy:
+ return html_policy(
+ f"https://www.x.org/releases/individual/{category}/",
+ rf"(?:^|/){re.escape(name)}-(?P[0-9][0-9A-Za-z.+-]*)"
+ rf"\.{re.escape(extension)}$",
+ )
+
+
+POLICIES: dict[str, Policy] = {
+ "autoconf": gnu_policy("autoconf", "tar.gz"),
+ "binutils": gnu_policy("binutils", "tar.xz"),
+ "bzip2": html_policy(
+ "https://sourceware.org/pub/bzip2/",
+ r"(?:^|/)bzip2-(?P[0-9][0-9A-Za-z.+-]*)\.tar\.gz$",
+ mirrored=True,
+ ),
+ "cpython-3.10": cpython_policy("3.10"),
+ "cpython-3.11": cpython_policy("3.11"),
+ "cpython-3.12": cpython_policy("3.12"),
+ "cpython-3.13": cpython_policy("3.13"),
+ "cpython-3.14": cpython_policy("3.14"),
+ "cpython-3.15": cpython_policy("3.15", allow_prereleases=True),
+ "expat": github_policy(
+ "libexpat/libexpat",
+ r"R_(?P[0-9_]+)",
+ artifact_name="expat-{version}.tar.xz",
+ version_transform=lambda value: value.replace("_", "."),
+ ),
+ "libedit": html_policy(
+ "https://thrysoee.dk/editline/",
+ r"(?:^|/)libedit-(?P[0-9][0-9A-Za-z.+-]*)\.tar\.gz$",
+ version_parser=lambda value: Version(value.replace("-", ".")),
+ ),
+ "libffi": github_policy(
+ "libffi/libffi",
+ r"v(?P[0-9.]+)",
+ artifact_name="libffi-{version}.tar.gz",
+ series=2,
+ ),
+ "libpthread-stubs": xorg_policy("lib", "libpthread-stubs"),
+ "libX11": xorg_policy("lib", "libX11"),
+ "libXau": xorg_policy("lib", "libXau"),
+ "libxcb": html_policy(
+ "https://xcb.freedesktop.org/dist/",
+ r"(?:^|/)libxcb-(?P[0-9][0-9A-Za-z.+-]*)\.tar\.gz$",
+ ),
+ "m4": gnu_policy("m4", "tar.xz"),
+ "mpdecimal": html_policy(
+ "https://www.bytereef.org/mpdecimal/changelog.html",
+ r"^#version-(?P[0-9-]+)$",
+ artifact_url=(
+ "https://www.bytereef.org/software/mpdecimal/releases/"
+ "mpdecimal-{version}.tar.gz"
+ ),
+ mirrored=True,
+ version_transform=lambda value: value.replace("-", "."),
+ ),
+ "ncurses": gnu_policy("ncurses", "tar.gz"),
+ "openssl-3.5": github_policy(
+ "openssl/openssl",
+ r"openssl-(?P3\.5\.[0-9]+)",
+ artifact_name="openssl-{version}.tar.gz",
+ series=2,
+ ),
+ "nasm-windows-bin": html_policy(
+ "https://www.nasm.us/pub/nasm/releasebuilds/",
+ r"^(?P[0-9][0-9.]*)/$",
+ artifact_url=(
+ "https://www.nasm.us/pub/nasm/releasebuilds/{version}/win64/"
+ "nasm-{version}-win64.zip"
+ ),
+ mirrored=True,
+ ),
+ "patchelf": github_policy(
+ "NixOS/patchelf",
+ r"(?P[0-9.]+)",
+ artifact_name="patchelf-{version}.tar.bz2",
+ ),
+ "pkgconf": github_policy(
+ "pkgconf/pkgconf",
+ r"pkgconf-(?P[0-9.]+)",
+ artifact_name="pkgconf-{version}.tar.xz",
+ ),
+ "pip": Policy(PyPIDiscovery("pip", r"pip-[0-9A-Za-z.+-]+-py3-none-any\.whl")),
+ "setuptools": Policy(
+ PyPIDiscovery("setuptools", r"setuptools-[0-9A-Za-z.+-]+-py3-none-any\.whl")
+ ),
+ "tcl": html_policy(
+ "https://www.tcl-lang.org/software/tcltk/download.html",
+ r"(?:^|/)tcl(?P[0-9]+(?:\.[0-9]+)+(?:a[0-9]+|b[0-9]+|rc[0-9]+)?)-src\.tar\.gz$",
+ artifact_url="https://prdownloads.sourceforge.net/tcl/tcl{version}-src.tar.gz",
+ series=2,
+ ),
+ "tk": html_policy(
+ "https://www.tcl-lang.org/software/tcltk/download.html",
+ r"(?:^|/)tk(?P[0-9]+(?:\.[0-9]+)+(?:a[0-9]+|b[0-9]+|rc[0-9]+)?)-src\.tar\.gz$",
+ artifact_url="https://prdownloads.sourceforge.net/tcl/tk{version}-src.tar.gz",
+ series=2,
+ ),
+ "x11-util-macros": xorg_policy("util", "util-macros"),
+ "xcb-proto": html_policy(
+ "https://xcb.freedesktop.org/dist/",
+ r"(?:^|/)xcb-proto-(?P[0-9][0-9A-Za-z.+-]*)\.tar\.xz$",
+ ),
+ "xorgproto": xorg_policy("proto", "xorgproto"),
+ "xtrans": xorg_policy("lib", "xtrans"),
+ "xz": github_policy(
+ "tukaani-project/xz",
+ r"v(?P[0-9.]+)",
+ artifact_name="xz-{version}.tar.gz",
+ ),
+ "zlib": github_policy(
+ "madler/zlib",
+ r"v(?P[0-9.]+)",
+ artifact_name="zlib-{version}.tar.gz",
+ ),
+}
+
+
+UNSUPPORTED: dict[str, str] = {
+ "bdb": "pinned to the last Sleepycat-licensed release",
+ "jom-windows-bin": "Qt's release layout needs a dedicated policy",
+ "llvm-aarch64-linux": "toolchain bootstrap requires coordinated updates",
+ "llvm-x86_64-linux": "toolchain bootstrap requires coordinated updates",
+ "llvm-aarch64-macos": "toolchain bootstrap requires coordinated updates",
+ "llvm-x86_64-macos": "toolchain bootstrap requires coordinated updates",
+ "musl": "intentionally pinned build toolchain",
+ "musl-static": "intentionally pinned build toolchain",
+ "openssl-1.1": "end-of-life release series",
+ "sqlite": "requires SQLite's numeric-version and release-year mapping",
+ "strawberryperl": "Windows toolchain update requires manual validation",
+ "tix": "source dependency snapshot",
+ "tcl-8612": "legacy compatibility version",
+ "tk-8612": "legacy compatibility version",
+ "tk-windows-bin-904": "commit-pinned CPython binary dependency",
+ "tk-windows-bin-8614": "commit-pinned CPython binary dependency",
+ "tk-windows-bin-8612": "commit-pinned CPython binary dependency",
+ "uuid": "inactive upstream project",
+ "zlib-ng": "CPython source-deps snapshot must follow the upstream release",
+ "zstd": "CPython source-deps snapshot must follow the upstream release",
+}
+
+
+def load_downloads(path: pathlib.Path = DOWNLOADS_PATH) -> dict[str, dict[str, Any]]:
+ tree = ast.parse(path.read_text(), filename=str(path))
+ for node in tree.body:
+ if isinstance(node, ast.Assign) and any(
+ isinstance(target, ast.Name) and target.id == "DOWNLOADS"
+ for target in node.targets
+ ):
+ value = ast.literal_eval(node.value)
+ if not isinstance(value, dict):
+ break
+ return value
+ raise ValueError(f"could not find a literal DOWNLOADS dictionary in {path}")
+
+
+def find_update(
+ package: str,
+ entry: dict[str, Any],
+ policy: Policy,
+ client: HttpClient,
+) -> CheckResult:
+ current_text = entry["version"]
+ if not isinstance(current_text, str):
+ return CheckResult(package, str(current_text), error="version is not a string")
+ try:
+ current = policy.version_parser(current_text)
+ candidates: list[tuple[Version, Release]] = []
+ for release in policy.discovery.releases(client):
+ try:
+ candidates.append((policy.version_parser(release.version), release))
+ except InvalidVersion:
+ continue
+ if not candidates:
+ raise ValueError("no parseable releases discovered")
+ accepted = [item for item in candidates if policy.accepts(item[0], current)]
+ selected_release = (
+ max(accepted, key=lambda item: item[0])[1] if accepted else None
+ )
+ return CheckResult(package, current_text, selected_release)
+ except Exception as exc:
+ return CheckResult(package, current_text, error=str(exc))
+
+
+def find_updates(
+ downloads: dict[str, dict[str, Any]],
+ packages: Sequence[str],
+ client: HttpClient,
+ workers: int,
+) -> list[CheckResult]:
+ with concurrent.futures.ThreadPoolExecutor(max_workers=workers) as executor:
+ futures = {
+ executor.submit(
+ find_update, package, downloads[package], POLICIES[package], client
+ ): package
+ for package in packages
+ }
+ results = [
+ future.result() for future in concurrent.futures.as_completed(futures)
+ ]
+ return sorted(results, key=lambda result: result.package.lower())
+
+
+def artifact_metadata(client: HttpClient, url: str) -> tuple[int, str]:
+ digest = hashlib.sha256()
+ size = 0
+ with client.open(url) as response:
+ while chunk := response.read(1024 * 1024):
+ size += len(chunk)
+ digest.update(chunk)
+ return size, digest.hexdigest()
+
+
+def artifact_filename(url: str) -> str:
+ filename = pathlib.PurePosixPath(urllib.parse.urlparse(url).path).name
+ if not filename:
+ raise ValueError(f"could not determine artifact filename from {url}")
+ return filename
+
+
+def stage_artifact(
+ client: HttpClient, url: str, staging_dir: pathlib.Path
+) -> tuple[pathlib.Path, int, str]:
+ staging_dir.mkdir(parents=True, exist_ok=True)
+ path = staging_dir / artifact_filename(url)
+ temporary_path = path.with_name(f".{path.name}.part")
+ digest = hashlib.sha256()
+ size = 0
+ try:
+ with client.open(url) as response, temporary_path.open("wb") as destination:
+ while chunk := response.read(1024 * 1024):
+ destination.write(chunk)
+ size += len(chunk)
+ digest.update(chunk)
+ os.replace(temporary_path, path)
+ except Exception:
+ temporary_path.unlink(missing_ok=True)
+ raise
+ return path, size, digest.hexdigest()
+
+
+def stored_url(release: Release, policy: Policy, upstream_urls: bool) -> str:
+ if not policy.mirrored or upstream_urls:
+ return release.url
+ return urllib.parse.urljoin(MIRROR_BASE_URL, artifact_filename(release.url))
+
+
+def print_mirror_instructions(
+ staged: dict[str, tuple[pathlib.Path, Release, str]],
+) -> None:
+ if not staged:
+ return
+
+ print("\nMirrored artifacts staged:", file=sys.stderr)
+ for package, (path, release, sha256) in sorted(staged.items()):
+ print(f" {package}: {path}", file=sys.stderr)
+ print(f" upstream: {release.url}", file=sys.stderr)
+ print(f" sha256: {sha256}", file=sys.stderr)
+
+ print("\nBefore committing this update:", file=sys.stderr)
+ print("1. Confirm each version and upstream URL are legitimate.", file=sys.stderr)
+ print("2. Verify upstream signatures or checksums when available.", file=sys.stderr)
+ print(
+ "3. Copy each artifact into files/ in a checkout of "
+ "https://github.com/astral-sh/mirror:",
+ file=sys.stderr,
+ )
+ for path, release, _sha256 in sorted(staged.values()):
+ filename = artifact_filename(release.url)
+ print(
+ f" cp {shlex.quote(str(path))} "
+ f"/path/to/mirror/files/{shlex.quote(filename)}",
+ file=sys.stderr,
+ )
+ print("4. Commit and push the mirror change.", file=sys.stderr)
+ print("5. Wait for GitHub Pages deployment, then verify:", file=sys.stderr)
+ for _path, release, sha256 in sorted(staged.values()):
+ mirror_url = urllib.parse.urljoin(
+ MIRROR_BASE_URL, artifact_filename(release.url)
+ )
+ print(f" {mirror_url} sha256={sha256}", file=sys.stderr)
+
+
+def _line_offsets(source: str) -> list[int]:
+ offsets = [0]
+ for line in source.splitlines(keepends=True):
+ offsets.append(offsets[-1] + len(line))
+ return offsets
+
+
+def _literal(value: Any) -> str:
+ if isinstance(value, str):
+ return json.dumps(value)
+ return repr(value)
+
+
+def update_download_literals(
+ path: pathlib.Path,
+ changes: dict[str, dict[str, Any]],
+ source_comments: dict[str, tuple[str, bool]] | None = None,
+) -> None:
+ source = path.read_text()
+ tree = ast.parse(source, filename=str(path))
+ offsets = _line_offsets(source)
+ replacements: list[tuple[int, int, str]] = []
+
+ downloads_node: ast.Dict | None = None
+ for node in tree.body:
+ if isinstance(node, ast.Assign) and any(
+ isinstance(target, ast.Name) and target.id == "DOWNLOADS"
+ for target in node.targets
+ ):
+ if isinstance(node.value, ast.Dict):
+ downloads_node = node.value
+ break
+ if downloads_node is None:
+ raise ValueError(f"could not locate DOWNLOADS in {path}")
+
+ entries = {
+ key.value: value
+ for key, value in zip(downloads_node.keys, downloads_node.values, strict=True)
+ if isinstance(key, ast.Constant)
+ and isinstance(key.value, str)
+ and isinstance(value, ast.Dict)
+ }
+ source_comments = source_comments or {}
+ for package, fields in changes.items():
+ entry = entries.get(package)
+ if entry is None:
+ raise KeyError(f"DOWNLOADS has no {package!r} entry")
+ values = {
+ key.value: value
+ for key, value in zip(entry.keys, entry.values, strict=True)
+ if isinstance(key, ast.Constant) and isinstance(key.value, str)
+ }
+ if package in source_comments:
+ url_node = values.get("url")
+ if url_node is None:
+ raise KeyError(f"{package!r} has no editable 'url' field")
+ lines = source.splitlines(keepends=True)
+ for line_number in range(entry.lineno, url_node.lineno):
+ line = lines[line_number - 1]
+ match = re.match(
+ r"^(\s*)# (?:Mirrored from|Upstream source \(mirror pending\):) "
+ r"https?://",
+ line,
+ )
+ if not match:
+ continue
+ upstream_url, using_mirror = source_comments[package]
+ label = (
+ "Mirrored from"
+ if using_mirror
+ else "Upstream source (mirror pending):"
+ )
+ start = offsets[line_number - 1]
+ end = offsets[line_number]
+ replacements.append(
+ (
+ start,
+ end,
+ f"{match.group(1)}# {label} {upstream_url}\n",
+ )
+ )
+ break
+ else:
+ raise ValueError(f"{package!r} has no upstream source comment")
+ for field, new_value in fields.items():
+ field_node = values.get(field)
+ if (
+ field_node is None
+ or field_node.end_lineno is None
+ or field_node.end_col_offset is None
+ ):
+ raise KeyError(f"{package!r} has no editable {field!r} field")
+ start = offsets[field_node.lineno - 1] + field_node.col_offset
+ end = offsets[field_node.end_lineno - 1] + field_node.end_col_offset
+ replacements.append((start, end, _literal(new_value)))
+
+ for start, end, replacement in sorted(replacements, reverse=True):
+ source = source[:start] + replacement + source[end:]
+ path.write_text(source)
+
+
+def update_openssl_disttest_version(
+ version: str, path: pathlib.Path = DISTTESTS_PATH
+) -> None:
+ release = Version(version).release
+ if len(release) != 3 or release[0] < 3:
+ raise ValueError(f"cannot derive OpenSSL 3.x version info from {version!r}")
+ wanted_version = (release[0], release[1], 0, release[2], 0)
+
+ source = path.read_text()
+ tree = ast.parse(source, filename=str(path))
+ offsets = _line_offsets(source)
+ matches: list[ast.expr] = []
+ for node in ast.walk(tree):
+ if not isinstance(node, ast.Assign) or not any(
+ isinstance(target, ast.Name) and target.id == "wanted_version"
+ for target in node.targets
+ ):
+ continue
+ try:
+ current_value = ast.literal_eval(node.value)
+ except (SyntaxError, ValueError):
+ continue
+ if (
+ isinstance(current_value, tuple)
+ and len(current_value) == 5
+ and current_value[0] == 3
+ ):
+ matches.append(node.value)
+
+ if len(matches) != 1:
+ raise ValueError(
+ f"expected one OpenSSL 3.x wanted_version assignment in {path}; "
+ f"found {len(matches)}"
+ )
+ node = matches[0]
+ if node.end_lineno is None or node.end_col_offset is None:
+ raise ValueError(f"could not locate OpenSSL version tuple in {path}")
+ start = offsets[node.lineno - 1] + node.col_offset
+ end = offsets[node.end_lineno - 1] + node.end_col_offset
+ path.write_text(source[:start] + _literal(wanted_version) + source[end:])
+
+
+def validate_package_names(
+ parser: argparse.ArgumentParser,
+ requested: Sequence[str],
+ downloads: dict[str, dict[str, Any]],
+) -> list[str]:
+ unknown = sorted(set(requested) - downloads.keys())
+ if unknown:
+ parser.error(f"unknown package(s): {', '.join(unknown)}")
+ unsupported = sorted(set(requested) - POLICIES.keys())
+ if unsupported:
+ details = "; ".join(
+ f"{name}: {UNSUPPORTED.get(name, 'no update policy')}"
+ for name in unsupported
+ )
+ parser.error(f"cannot check package(s): {details}")
+ return list(dict.fromkeys(requested))
+
+
+def build_parser() -> argparse.ArgumentParser:
+ parser = argparse.ArgumentParser(description=__doc__)
+ parser.add_argument(
+ "packages",
+ nargs="*",
+ metavar="PACKAGE",
+ help="packages to check (default: every package with an update policy)",
+ )
+ parser.add_argument(
+ "--write",
+ action="store_true",
+ help="download updates and modify pythonbuild/downloads.py",
+ )
+ parser.add_argument(
+ "--upstream-urls",
+ action="store_true",
+ help="write upstream URLs instead of mirror URLs for mirrored packages",
+ )
+ parser.add_argument(
+ "--staging-dir",
+ type=pathlib.Path,
+ default=DEFAULT_STAGING_DIR,
+ help=(
+ "directory for newly downloaded mirrored artifacts "
+ f"(default: {DEFAULT_STAGING_DIR})"
+ ),
+ )
+ parser.add_argument(
+ "--show-unsupported",
+ action="store_true",
+ help="list packages that are pinned or do not yet have an update policy",
+ )
+ parser.add_argument("--json", action="store_true", help="emit JSON")
+ parser.add_argument(
+ "--workers", type=int, default=8, help="concurrent update checks (default: 8)"
+ )
+ parser.add_argument(
+ "--downloads-file",
+ type=pathlib.Path,
+ default=DOWNLOADS_PATH,
+ help=argparse.SUPPRESS,
+ )
+ return parser
+
+
+def main(argv: Sequence[str] | None = None) -> int:
+ parser = build_parser()
+ args = parser.parse_args(argv)
+ downloads = load_downloads(args.downloads_file)
+ if args.workers < 1:
+ parser.error("--workers must be at least 1")
+ if args.write and not args.packages:
+ parser.error("--write requires at least one PACKAGE")
+ if args.write:
+ requested = set(args.packages)
+ tcl_tk = {"tcl", "tk"}
+ if requested & tcl_tk and not tcl_tk <= requested:
+ parser.error("--write must select tcl and tk together")
+
+ packages = (
+ validate_package_names(parser, args.packages, downloads)
+ if args.packages
+ else sorted(downloads.keys() & POLICIES.keys())
+ )
+ client = HttpClient(os.environ.get("GITHUB_TOKEN"))
+ results = find_updates(downloads, packages, client, args.workers)
+
+ if args.json:
+ output: dict[str, Any] = {
+ "results": [dataclasses.asdict(result) for result in results]
+ }
+ if args.show_unsupported:
+ output["unsupported"] = {
+ name: UNSUPPORTED.get(name, "no update policy")
+ for name in sorted(downloads.keys() - POLICIES.keys())
+ }
+ print(json.dumps(output, indent=2, sort_keys=True))
+ else:
+ for result in results:
+ if result.error:
+ print(f"{result.package}: error: {result.error}", file=sys.stderr)
+ elif result.release:
+ marker = " (mirrored)" if POLICIES[result.package].mirrored else ""
+ print(
+ f"{result.package}: {result.current_version} -> "
+ f"{result.release.version}{marker}\n {result.release.url}"
+ )
+ else:
+ print(f"{result.package}: {result.current_version} (current)")
+ if args.show_unsupported:
+ for name in sorted(downloads.keys() - POLICIES.keys()):
+ reason = UNSUPPORTED.get(name, "no update policy")
+ print(f"{name}: not checked ({reason})")
+
+ changes: dict[str, dict[str, Any]] = {}
+ staged: dict[str, tuple[pathlib.Path, Release, str]] = {}
+ if args.write:
+ for result in results:
+ if not result.release or result.error:
+ continue
+ print(
+ f"downloading {result.package} {result.release.version}",
+ file=sys.stderr,
+ )
+ if POLICIES[result.package].mirrored:
+ path, size, sha256 = stage_artifact(
+ client, result.release.url, args.staging_dir
+ )
+ staged[result.package] = (path, result.release, sha256)
+ else:
+ size, sha256 = artifact_metadata(client, result.release.url)
+ changes[result.package] = {
+ "url": stored_url(
+ result.release,
+ POLICIES[result.package],
+ args.upstream_urls,
+ ),
+ "size": size,
+ "sha256": sha256,
+ "version": result.release.version,
+ }
+ if changes:
+ update_download_literals(
+ args.downloads_file,
+ changes,
+ {
+ result.package: (result.release.url, not args.upstream_urls)
+ for result in results
+ if result.release
+ and result.package in changes
+ and POLICIES[result.package].mirrored
+ },
+ )
+ if "openssl-3.5" in changes:
+ update_openssl_disttest_version(changes["openssl-3.5"]["version"])
+ print(
+ f"updated {args.downloads_file}: {', '.join(sorted(changes))}",
+ file=sys.stderr,
+ )
+ if "openssl-3.5" in changes:
+ print(f"updated {DISTTESTS_PATH}", file=sys.stderr)
+ print_mirror_instructions(staged)
+
+ return 1 if any(result.error for result in results) else 0
+
+
+if __name__ == "__main__":
+ raise SystemExit(main())
diff --git a/src/release.rs b/src/release.rs
index b5b012674..642886412 100644
--- a/src/release.rs
+++ b/src/release.rs
@@ -364,7 +364,7 @@ pub static RELEASE_TRIPLES: Lazy> = Lazy::
h.insert(
"aarch64-unknown-linux-musl",
TripleRelease {
- suffixes: vec!["debug", "lto", "noopt"],
+ suffixes: linux_suffixes_musl.clone(),
install_only_suffix: "lto",
freethreaded_install_only_suffix: "freethreaded+lto",
python_version_requirement: None,
@@ -730,9 +730,28 @@ pub fn convert_to_stripped(
| FileKind::Pe32
| FileKind::Pe64)
) {
- // Skip stripping MSVC runtime DLLs
+ // Skip stripping MSVC runtime DLLs and Tcl/Tk DLLs containing ZIPFS data or
+ // valid signatures.
+ // Tcl 9 DLLs contain ZIPFS data. The other DLLs are signed by Microsoft or by the
+ // Tcl maintainers. `llvm-strip` removes the signature but keeps
+ // the certificate table entry in the PE header.
+ // This makes the binaries impossible to re-sign with `signtool`, which in turn
+ // means that they can never be bundled into a Microsoft Store-compatible .msix.
let filename = path.file_name().and_then(|n| n.to_str());
- if !matches!(filename, Some("vcruntime140.dll" | "vcruntime140_1.dll")) {
+ if !matches!(
+ filename,
+ Some(
+ "tcl86t.dll"
+ | "tcl90.dll"
+ | "tcl9tk90.dll"
+ | "tcldde14.dll"
+ | "tclreg13.dll"
+ | "tk86t.dll"
+ | "vcruntime140.dll"
+ | "vcruntime140_1.dll"
+ | "vcruntime140_threads.dll"
+ )
+ ) {
data = llvm_strip(&data, llvm_dir)
.with_context(|| format!("failed to strip {}", path.display()))?;
}
diff --git a/src/validation.rs b/src/validation.rs
index c72804cad..c56322e36 100644
--- a/src/validation.rs
+++ b/src/validation.rs
@@ -10,8 +10,9 @@ use {
object::{
Architecture, Endianness, FileKind, Object, ObjectSection, SectionIndex, SymbolScope,
elf::{
- ET_DYN, ET_EXEC, FileHeader32, FileHeader64, PF_X, PT_GNU_STACK, SHN_UNDEF, STB_GLOBAL,
- STB_WEAK, STV_DEFAULT, STV_HIDDEN,
+ DF_1_NOW, DF_BIND_NOW, DF_TEXTREL, DT_BIND_NOW, DT_FLAGS, DT_FLAGS_1, DT_TEXTREL,
+ ET_DYN, ET_EXEC, FileHeader32, FileHeader64, PF_W, PF_X, PT_GNU_RELRO, PT_GNU_STACK,
+ PT_LOAD, SHN_UNDEF, STB_GLOBAL, STB_WEAK, STV_DEFAULT, STV_HIDDEN,
},
macho::{LC_CODE_SIGNATURE, MH_OBJECT, MH_TWOLEVEL, MachHeader32, MachHeader64},
read::{
@@ -110,6 +111,7 @@ const PE_ALLOWED_LIBRARIES: &[&str] = &[
"WINMM.dll",
"WS2_32.dll",
// Our libraries.
+<<<<<<< HEAD
// "libcrypto-1_1.dll",
// "libcrypto-1_1-x64.dll",
// "libcrypto-3.dll",
@@ -135,14 +137,45 @@ const PE_ALLOWED_LIBRARIES: &[&str] = &[
// "sqlite3.dll",
// "tcl86t.dll",
// "tk86t.dll",
+=======
+ "libcrypto-1_1.dll",
+ "libcrypto-1_1-x64.dll",
+ "libcrypto-3.dll",
+ "libcrypto-3-arm64.dll",
+ "libcrypto-3-x64.dll",
+ "libffi-8.dll",
+ "libssl-1_1.dll",
+ "libssl-1_1-x64.dll",
+ "libssl-3.dll",
+ "libssl-3-arm64.dll",
+ "libssl-3-x64.dll",
+ "python3.dll",
+ "python3t.dll",
+ "python39.dll",
+ "python310.dll",
+ "python311.dll",
+ "python312.dll",
+ "python313.dll",
+ "python313t.dll",
+ "python314.dll",
+ "python314t.dll",
+ "python315.dll",
+ "python315t.dll",
+ "sqlite3.dll",
+ "tcl86t.dll",
+ "tk86t.dll",
+>>>>>>> refs/tags/20260825
];
-// CPython 3.14 and ARM64 use a newer version of tcl/tk (8.6.14+) which includes a bundled zlib that
-// dynamically links some system libraries
+// CPython 3.14 uses Tcl/Tk 9, which includes a bundled zlib and additional DLLs.
const PE_ALLOWED_LIBRARIES_314: &[&str] = &[
// "zlib1.dll",
"api-ms-win-crt-private-l1-1-0.dll", // zlib loads this library on arm64, 3.14+
"msvcrt.dll", // zlib loads this library
+ "libtommath.dll",
+ "tcl90.dll",
+ "tcl9tk90.dll",
+ "WINSPOOL.DRV",
];
const PE_ALLOWED_LIBRARIES_ARM64: &[&str] = &[
"msvcrt.dll",
@@ -153,6 +186,11 @@ const PE_ALLOWED_LIBRARIES_315: &[&str] = &[
// "zlib1.dll",
"api-ms-win-crt-private-l1-1-0.dll",
"msvcrt.dll",
+ // Tcl/Tk 9 is used in CPython 3.14+
+ "libtommath.dll",
+ "tcl90.dll",
+ "tcl9tk90.dll",
+ "WINSPOOL.DRV",
// `_remote_debugging` loads `ntdll`
// See https://github.com/python/cpython/pull/138710
"ntdll.dll",
@@ -255,6 +293,10 @@ static ELF_ALLOWED_LIBRARIES_BY_TRIPLE: Lazy>(
elf: &Elf,
data: &[u8],
) -> Result<()> {
+ // The target hardening flags are intended to protect the interpreter
+ // itself. Restrict these symbol heuristics to that binary: extension
+ // modules and bundled libraries may not contain functions eligible for
+ // stack protection or fortification.
+ let validate_python_hardening = path.parent() == Some(Path::new("python/install/bin"))
+ && path
+ .file_name()
+ .map(|name| name.to_string_lossy().starts_with("python"))
+ .unwrap_or(false);
+ let mut has_stack_protector_symbol = false;
+ let mut has_fortify_symbol = false;
+
let mut system_links = BTreeSet::new();
for link in &json.build_info.core.links {
if link.system.unwrap_or_default() {
@@ -1065,9 +1131,14 @@ fn validate_elf>(
let versions = sections.versions(endian, data)?;
+ let mut has_dynamic_section = false;
+ let mut has_bind_now = false;
+ let mut has_text_relocations = false;
+
for (section_index, section) in sections.iter().enumerate() {
// Dynamic sections defined needed libraries, which we validate.
if let Some((entries, index)) = section.dynamic(endian, data)? {
+ has_dynamic_section = true;
let strings = sections.strings(endian, data, index).unwrap_or_default();
for entry in entries {
@@ -1125,6 +1196,20 @@ fn validate_elf>(
}
}
}
+
+ match entry.tag32(endian) {
+ Some(DT_BIND_NOW) => has_bind_now = true,
+ Some(DT_FLAGS) => {
+ let flags = entry.val32(endian).unwrap_or_default();
+ has_bind_now |= flags & DF_BIND_NOW != 0;
+ has_text_relocations |= flags & DF_TEXTREL != 0;
+ }
+ Some(DT_FLAGS_1) => {
+ has_bind_now |= entry.val32(endian).unwrap_or_default() & DF_1_NOW != 0;
+ }
+ Some(DT_TEXTREL) => has_text_relocations = true,
+ _ => {}
+ }
}
}
@@ -1135,6 +1220,17 @@ fn validate_elf>(
for (symbol_index, symbol) in symbols.enumerate() {
let name = String::from_utf8_lossy(symbol.name(endian, strings)?);
+ let is_undefined_symbol = symbol.is_undefined(endian);
+
+ // Stack protector and fortify are compiler features rather than
+ // ELF properties. Their symbols provide a useful heuristic that
+ // at least one protected function made it into the interpreter.
+ if matches!(name.as_ref(), "__stack_chk_fail" | "__stack_chk_fail_local") {
+ has_stack_protector_symbol = true;
+ }
+ if is_undefined_symbol && name.starts_with("__") && name.ends_with("_chk") {
+ has_fortify_symbol = true;
+ }
// If symbol versions are defined and we're in the .dynsym section, there should
// be version info for every symbol.
@@ -1156,7 +1252,7 @@ fn validate_elf>(
None
};
- if symbol.is_undefined(endian) {
+ if is_undefined_symbol {
if ELF_BANNED_SYMBOLS.contains(&name.as_ref()) {
context.errors.push(format!(
"{} defines banned ELF symbol {}",
@@ -1218,6 +1314,7 @@ fn validate_elf>(
}
}
+<<<<<<< HEAD
if let Some(filename) = path.file_name() {
let filename = filename.to_string_lossy();
@@ -1233,6 +1330,11 @@ fn validate_elf>(
// Verify that objects are not requesting an executable stack. For backwards compatibility,
// Linux (the kernel when loading an executable, and glibc when loading a shared library)
+=======
+ // Verify that objects are not requesting an executable stack and that other hardening
+ // properties exist in the linked outputs. For backwards compatibility, Linux (the kernel
+ // when loading an executable, and glibc when loading a shared library)
+>>>>>>> refs/tags/20260825
// assumes you need an executable stack unless you request otherwise. In linked outputs
// (executables and shared libraries) this is in the program header: the flags of a
// PT_GNU_STACK entry specify stack permissions, and the default if unspecified is RWX. In
@@ -1245,15 +1347,27 @@ fn validate_elf>(
if matches!(elf.e_type(endian), ET_EXEC | ET_DYN) {
let mut found_pt_gnu_stack = false;
+ let mut found_pt_gnu_relro = false;
for phdr in elf.program_headers(endian, data)? {
- if phdr.p_type(endian) != PT_GNU_STACK {
- continue;
- }
- found_pt_gnu_stack = true;
- if (phdr.p_flags(endian) & PF_X) != 0 {
- context
- .errors
- .push(format!("{} requests executable stack", path.display()));
+ let flags = phdr.p_flags(endian);
+
+ match phdr.p_type(endian) {
+ PT_GNU_STACK => {
+ found_pt_gnu_stack = true;
+ if flags & PF_X != 0 {
+ context
+ .errors
+ .push(format!("{} requests executable stack", path.display()));
+ }
+ }
+ PT_GNU_RELRO => found_pt_gnu_relro = true,
+ PT_LOAD if flags & (PF_W | PF_X) == (PF_W | PF_X) => {
+ context.errors.push(format!(
+ "{} has a writable and executable PT_LOAD segment",
+ path.display(),
+ ));
+ }
+ _ => {}
}
}
if !found_pt_gnu_stack {
@@ -1262,6 +1376,45 @@ fn validate_elf>(
path.display(),
));
}
+ if !found_pt_gnu_relro {
+ context.errors.push(format!(
+ "{} is missing a PT_GNU_RELRO segment",
+ path.display(),
+ ));
+ }
+ if has_dynamic_section && !has_bind_now {
+ context.errors.push(format!(
+ "{} does not request immediate symbol binding",
+ path.display(),
+ ));
+ }
+ if has_text_relocations {
+ context
+ .errors
+ .push(format!("{} contains text relocations", path.display()));
+ }
+
+ if validate_python_hardening {
+ if !has_stack_protector_symbol {
+ context.errors.push(format!(
+ "{} does not reference __stack_chk_fail",
+ path.display(),
+ ));
+ }
+
+ // Debug builds deliberately undefine _FORTIFY_SOURCE because
+ // fortification is ineffective at -O0. musl targets do not enable
+ // _FORTIFY_SOURCE.
+ if !json.build_options.contains("debug")
+ && !target_triple.contains("-musl")
+ && !has_fortify_symbol
+ {
+ context.errors.push(format!(
+ "{} does not reference any __*_chk fortify symbol",
+ path.display(),
+ ));
+ }
+ }
}
Ok(())
@@ -1858,6 +2011,18 @@ fn validate_extension_modules(
Ok(errors)
}
+fn is_shared_library(path: &Path) -> bool {
+ path.file_name()
+ .and_then(|filename| filename.to_str())
+ .is_some_and(|filename| {
+ filename.ends_with(".so")
+ || filename.contains(".so.")
+ || filename.ends_with(".dylib")
+ || filename.ends_with(".dll")
+ || filename.ends_with(".pyd")
+ })
+}
+
fn validate_json(json: &PythonJsonMain, triple: &str, is_debug: bool) -> Result> {
let mut errors = vec![];
@@ -2013,6 +2178,13 @@ fn validate_distribution(
let mut entry = entry.map_err(|e| anyhow!("failed to iterate over archive: {}", e))?;
let path = entry.path()?.to_path_buf();
+ if is_static && is_shared_library(&path) {
+ context.errors.push(format!(
+ "static distribution contains shared library {}",
+ path.display()
+ ));
+ }
+
seen_paths.insert(path.clone());
if let Some(link_name) = entry.link_name()? {
diff --git a/uv.lock b/uv.lock
index f78a50f07..5646b8709 100644
--- a/uv.lock
+++ b/uv.lock
@@ -6,6 +6,9 @@ resolution-markers = [
"python_full_version < '3.11'",
]
+[manifest]
+build-constraints = [{ name = "uv-build", specifier = "==0.11.33" }]
+
[[package]]
name = "annotated-types"
version = "0.7.0"