diff --git a/.github/action-common-python-release/action.yml b/.github/action-common-python-release/action.yml
index 247e7ca15..1f0e2397b 100644
--- a/.github/action-common-python-release/action.yml
+++ b/.github/action-common-python-release/action.yml
@@ -32,9 +32,6 @@ runs:
python-version: ${{ inputs.python-version }}
architecture: ${{ inputs.python-architecture }}
- - name: Install Poetry
- uses: abatilo/actions-poetry@v4
-
- name: Install Rust toolchain
uses: actions-rs/toolchain@v1
with:
diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml
index fc9eb97b4..708f5762d 100644
--- a/.github/workflows/checks.yml
+++ b/.github/workflows/checks.yml
@@ -18,14 +18,13 @@ jobs:
- uses: Swatinem/rust-cache@v2
- name: Install protoc
- uses: arduino/setup-protoc@v1
+ uses: arduino/setup-protoc@v3
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
- version: '3.20.1'
+ version: '21.0'
- name: Install libquil
run: |
sudo ./scripts/install-libquil
- - uses: syphar/restore-virtualenv@v1
# may protect against linking failure: no space left on device
- name: Delete huge unnecessary tools folder
run: rm -rf /opt/hostedtoolcache
@@ -38,17 +37,19 @@ jobs:
- uses: knope-dev/action@v2.1.0
with:
version: 0.21.3
- - uses: actions/setup-python@v5
+ - name: Install uv
+ uses: astral-sh/setup-uv@v6
with:
- python-version: '3.13'
- - uses: abatilo/actions-poetry@v4
+ enable-cache: true
+ cache-dependency-glob: crates/lib/uv.lock
- name: Run CI Flow
env:
CARGO_MAKE_RUN_CHECK_FORMAT: true
CARGO_MAKE_RUN_CLIPPY: true
CARGO_MAKE_BUILD_EXAMPLES: true
- run: cargo make --cwd crates/lib --makefile Makefile.toml ci-flow
+ run: |
+ cargo make --cwd crates/lib --makefile Makefile.toml ci-flow
check-python:
name: Run Python Checks
@@ -61,14 +62,13 @@ jobs:
- uses: Swatinem/rust-cache@v2
- name: Install protoc
- uses: arduino/setup-protoc@v1
+ uses: arduino/setup-protoc@v3
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
- version: '3.20.1'
+ version: '21.0'
- name: Install libquil
run: |
sudo ./scripts/install-libquil
- - uses: syphar/restore-virtualenv@v1
# may protect against linking failure: no space left on device
- name: Delete huge unnecessary tools folder
run: rm -rf /opt/hostedtoolcache
@@ -80,11 +80,13 @@ jobs:
with:
version: 0.21.3
- - uses: actions/setup-python@v5
+ - name: Install uv
+ uses: astral-sh/setup-uv@v6
with:
- python-version: '3.13'
-
- - uses: abatilo/actions-poetry@v4
+ enable-cache: true
+ cache-dependency-glob: crates/lib/uv.lock
- name: Test Python Package
- run: cargo make --cwd crates/lib --makefile Makefile.toml test-python-package
+ shell: bash
+ run: |
+ cargo make --cwd crates/lib --makefile Makefile.toml test-python-package
diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml
index d92e9fda3..83d4e3036 100644
--- a/.github/workflows/publish-docs.yml
+++ b/.github/workflows/publish-docs.yml
@@ -16,21 +16,20 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- - uses: actions/setup-python@v5
- with:
- python-version: '3.11'
- cache: pip
- uses: Swatinem/rust-cache@v2
- name: Install cargo-make
uses: taiki-e/install-action@cargo-make
- - uses: syphar/restore-virtualenv@v1
- - name: Install Poetry
- uses: abatilo/actions-poetry@v4
+ - name: Install uv
+ uses: astral-sh/setup-uv@v6
+ with:
+ enable-cache: true
+ cache-dependency-glob: crates/lib/uv.lock
- name: Build qcs-sdk-python documentation
- run: cargo make --cwd crates/lib document-python-package
+ run: |
+ cargo make --cwd crates/lib document-python-package
- name: Deploy preview
if: ${{ github.event_name == 'pull_request' }}
diff --git a/.github/workflows/release-library.yml b/.github/workflows/release-library.yml
index 1540b23ae..039c6a70a 100644
--- a/.github/workflows/release-library.yml
+++ b/.github/workflows/release-library.yml
@@ -24,9 +24,9 @@ jobs:
fetch-depth: 0
token: ${{ secrets.PAT }}
- name: Install protoc
- uses: arduino/setup-protoc@v1
+ uses: arduino/setup-protoc@v3
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
- version: '3.20.1'
+ version: '21.0'
- uses: Swatinem/rust-cache@v2
- run: cargo publish -p qcs --locked --token ${{ secrets.CRATES_IO_TOKEN }}
diff --git a/.gitignore b/.gitignore
index 2866c92fb..6b2698b68 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,6 +6,8 @@
.envrc
venv/
.venv
+# Local `uv` cache; see `UV_CACHE_DIR` in crates/lib/Makefile.toml.
+.uv-cache
# IDEs
.idea
diff --git a/Cargo.lock b/Cargo.lock
index d2fcb8c19..1a94c547b 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -47,9 +47,9 @@ dependencies = [
[[package]]
name = "anyhow"
-version = "1.0.100"
+version = "1.0.104"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61"
+checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470"
[[package]]
name = "approx"
@@ -105,9 +105,9 @@ dependencies = [
[[package]]
name = "async-tempfile"
-version = "0.7.0"
+version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c8a57b75c36e16f4d015e60e6a177552976a99b6947724403c551bcfa7cb1207"
+checksum = "64782aa61953a4fa6f6ddc6b510942adffa37315f1cbf8ca7a96fdc990f913d5"
dependencies = [
"tokio",
"uuid",
@@ -386,12 +386,6 @@ dependencies = [
"shlex",
]
-[[package]]
-name = "cesu8"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c"
-
[[package]]
name = "cexpr"
version = "0.6.0"
@@ -425,9 +419,9 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
[[package]]
name = "chrono"
-version = "0.4.43"
+version = "0.4.45"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118"
+checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327"
dependencies = [
"iana-time-zone",
"js-sys",
@@ -463,7 +457,7 @@ version = "3.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "faf9468729b8cbcea668e36183cb69d317348c2e08e994829fb56ebfdfbaac34"
dependencies = [
- "windows-sys 0.61.2",
+ "windows-sys 0.48.0",
]
[[package]]
@@ -506,6 +500,15 @@ version = "0.9.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8"
+[[package]]
+name = "convert_case"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9"
+dependencies = [
+ "unicode-segmentation",
+]
+
[[package]]
name = "cookie"
version = "0.18.1"
@@ -613,9 +616,9 @@ dependencies = [
[[package]]
name = "crossbeam-epoch"
-version = "0.9.18"
+version = "0.9.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
+checksum = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f"
dependencies = [
"crossbeam-utils",
]
@@ -789,6 +792,17 @@ dependencies = [
"serde_core",
]
+[[package]]
+name = "derive-where"
+version = "1.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d08b3a0bcc0d079199cd476b2cae8435016ec11d1c0986c6901c5ac223041534"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.117",
+]
+
[[package]]
name = "derive_builder"
version = "0.20.2"
@@ -820,6 +834,29 @@ dependencies = [
"syn 2.0.117",
]
+[[package]]
+name = "derive_more"
+version = "2.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134"
+dependencies = [
+ "derive_more-impl",
+]
+
+[[package]]
+name = "derive_more-impl"
+version = "2.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb"
+dependencies = [
+ "convert_case",
+ "proc-macro2",
+ "quote",
+ "rustc_version",
+ "syn 2.0.117",
+ "unicode-xid",
+]
+
[[package]]
name = "diff"
version = "0.1.13"
@@ -848,6 +885,16 @@ dependencies = [
"walkdir",
]
+[[package]]
+name = "dispatch2"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38"
+dependencies = [
+ "bitflags 2.11.1",
+ "objc2",
+]
+
[[package]]
name = "displaydoc"
version = "0.2.5"
@@ -882,9 +929,9 @@ checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555"
[[package]]
name = "either"
-version = "1.15.0"
+version = "1.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
+checksum = "9e5e8f6c15a24b9a3ee5efec809ccd006d3b30e8b3bb63c39af737c7f87daa1d"
[[package]]
name = "encode_unicode"
@@ -935,7 +982,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
dependencies = [
"libc",
- "windows-sys 0.61.2",
+ "windows-sys 0.59.0",
]
[[package]]
@@ -1185,9 +1232,9 @@ checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280"
[[package]]
name = "h2"
-version = "0.4.13"
+version = "0.4.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54"
+checksum = "a9f37a958b41b3b19ee2707c06439c0e9e547e847223eb791ecb0cb821c65e27"
dependencies = [
"atomic-waker",
"bytes",
@@ -1614,15 +1661,6 @@ dependencies = [
"serde_core",
]
-[[package]]
-name = "indoc"
-version = "2.0.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706"
-dependencies = [
- "rustversion",
-]
-
[[package]]
name = "inlinable_string"
version = "0.1.15"
@@ -1664,9 +1702,9 @@ dependencies = [
[[package]]
name = "inventory"
-version = "0.3.21"
+version = "0.3.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bc61209c082fbeb19919bee74b176221b27223e27b65d781eb91af24eb1fb46e"
+checksum = "a4f0c30c76f2f4ccee3fe55a2435f691ca00c0e4bd87abe4f4a851b1d4dac39b"
dependencies = [
"rustversion",
]
@@ -1741,22 +1779,6 @@ version = "1.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
-[[package]]
-name = "jni"
-version = "0.21.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97"
-dependencies = [
- "cesu8",
- "cfg-if",
- "combine",
- "jni-sys 0.3.0",
- "log",
- "thiserror 1.0.69",
- "walkdir",
- "windows-sys 0.45.0",
-]
-
[[package]]
name = "jni"
version = "0.22.4"
@@ -1766,7 +1788,7 @@ dependencies = [
"cfg-if",
"combine",
"jni-macros",
- "jni-sys 0.4.1",
+ "jni-sys",
"log",
"simd_cesu8",
"thiserror 2.0.18",
@@ -1787,12 +1809,6 @@ dependencies = [
"syn 2.0.117",
]
-[[package]]
-name = "jni-sys"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130"
-
[[package]]
name = "jni-sys"
version = "0.4.1"
@@ -2023,9 +2039,9 @@ dependencies = [
[[package]]
name = "log"
-version = "0.4.29"
+version = "0.4.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"
+checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad"
[[package]]
name = "lru-slab"
@@ -2070,15 +2086,6 @@ version = "2.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79"
-[[package]]
-name = "memoffset"
-version = "0.9.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a"
-dependencies = [
- "autocfg",
-]
-
[[package]]
name = "mime"
version = "0.3.17"
@@ -2224,7 +2231,7 @@ version = "0.50.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5"
dependencies = [
- "windows-sys 0.61.2",
+ "windows-sys 0.59.0",
]
[[package]]
@@ -2343,9 +2350,9 @@ dependencies = [
[[package]]
name = "numpy"
-version = "0.27.1"
+version = "0.29.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7aac2e6a6e4468ffa092ad43c39b81c79196c2bb773b8db4085f695efe3bba17"
+checksum = "6a5b15d63a5ff39e378daed0e1340d3a5964703ea9712eb09a0dc66fade996f4"
dependencies = [
"libc",
"ndarray",
@@ -2414,6 +2421,28 @@ dependencies = [
"objc2-encode",
]
+[[package]]
+name = "objc2-app-kit"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c"
+dependencies = [
+ "bitflags 2.11.1",
+ "objc2",
+ "objc2-foundation",
+]
+
+[[package]]
+name = "objc2-core-foundation"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536"
+dependencies = [
+ "bitflags 2.11.1",
+ "dispatch2",
+ "objc2",
+]
+
[[package]]
name = "objc2-encode"
version = "4.1.0"
@@ -2428,6 +2457,7 @@ checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272"
dependencies = [
"bitflags 2.11.1",
"objc2",
+ "objc2-core-foundation",
]
[[package]]
@@ -2564,9 +2594,20 @@ dependencies = [
[[package]]
name = "optipy"
-version = "0.1.2"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a3e278be53c02ede90508fb229efd13c14a17ad905db34c88ff49c25639de0fc"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.117",
+]
+
+[[package]]
+name = "optipy"
+version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f0b56d0b41dc7b5b69e9133418df44a4b41a2700c7ee922176cb3d9801d5c51"
+checksum = "861264739d9b482f654ce5bf9a7123dc2bc47b1f3c3820af990c0576ca3ecba7"
dependencies = [
"proc-macro2",
"quote",
@@ -2575,9 +2616,9 @@ dependencies = [
[[package]]
name = "ordered-float"
-version = "5.1.0"
+version = "5.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f4779c6901a562440c3786d08192c6fbda7c1c2060edd10006b05ee35d10f2d"
+checksum = "b7d950ca161dc355eaf28f82b11345ed76c6e1f6eb1f4f4479e0323b9e2fbd0e"
dependencies = [
"num-traits",
]
@@ -3049,31 +3090,29 @@ dependencies = [
[[package]]
name = "pyo3"
-version = "0.27.2"
+version = "0.29.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ab53c047fcd1a1d2a8820fe84f05d6be69e9526be40cb03b73f86b6b03e6d87d"
+checksum = "4688ddedf473e32662b9b067670129a8afb8c18e351482c70d62ba4a88171e8b"
dependencies = [
"indexmap 2.13.0",
- "indoc",
"inventory",
"libc",
- "memoffset",
"num-complex",
"once_cell",
"portable-atomic",
"pyo3-build-config",
"pyo3-ffi",
"pyo3-macros",
- "unindent",
]
[[package]]
name = "pyo3-async-runtimes"
-version = "0.27.0"
+version = "0.29.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57ddb5b570751e93cc6777e81fee8087e59cd53b5043292f2a6d59d5bd80fdfd"
+checksum = "b3ef68daa7316a3fac65e5e18b2203f010346de1c1c53456811a2624673ab046"
dependencies = [
- "futures",
+ "futures-channel",
+ "futures-util",
"once_cell",
"pin-project-lite",
"pyo3",
@@ -3083,9 +3122,9 @@ dependencies = [
[[package]]
name = "pyo3-async-runtimes-macros"
-version = "0.27.0"
+version = "0.29.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bcd7d70ee0ca1661c40407e6f84e4463ef2658c90a9e2fbbd4515b2bcdfcaeca"
+checksum = "faf75ff3922e6830adcaa30f3a359ce861326f6161f16a13d97adb40ba6a744a"
dependencies = [
"proc-macro2",
"quote",
@@ -3094,18 +3133,18 @@ dependencies = [
[[package]]
name = "pyo3-build-config"
-version = "0.27.2"
+version = "0.29.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b455933107de8642b4487ed26d912c2d899dec6114884214a0b3bb3be9261ea6"
+checksum = "f41027e41b4bd03f6e60f9f417fe24a6341a6bb744edd62b6f709f2a52ea30e9"
dependencies = [
"target-lexicon 0.13.4",
]
[[package]]
name = "pyo3-ffi"
-version = "0.27.2"
+version = "0.29.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1c85c9cbfaddf651b1221594209aed57e9e5cff63c4d11d1feead529b872a089"
+checksum = "e591a95526fead067432c3b3a33fc74770b87b1e04e73671090d9c2055a2b327"
dependencies = [
"libc",
"pyo3-build-config",
@@ -3113,9 +3152,9 @@ dependencies = [
[[package]]
name = "pyo3-log"
-version = "0.13.2"
+version = "0.13.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2f8bae9ad5ba08b0b0ed2bb9c2bdbaeccc69cafca96d78cf0fbcea0d45d122bb"
+checksum = "f64083bd3a16a353d9d62335808e8e13d0552d2a2b83fdb084496192dcfa9fcd"
dependencies = [
"arc-swap",
"log",
@@ -3124,9 +3163,9 @@ dependencies = [
[[package]]
name = "pyo3-macros"
-version = "0.27.2"
+version = "0.29.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0a5b10c9bf9888125d917fb4d2ca2d25c8df94c7ab5a52e13313a07e050a3b02"
+checksum = "73225868fc1cd84eef2c3c230ddb91273bf1de46aeb8a4248da76d32a0924a1c"
dependencies = [
"proc-macro2",
"pyo3-macros-backend",
@@ -3136,22 +3175,21 @@ dependencies = [
[[package]]
name = "pyo3-macros-backend"
-version = "0.27.2"
+version = "0.29.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "03b51720d314836e53327f5871d4c0cfb4fb37cc2c4a11cc71907a86342c40f9"
+checksum = "571575aa3749fa6216757dd47d2a3e7ef360f329a40f0666a9fbd14889024952"
dependencies = [
"heck 0.5.0",
"proc-macro2",
- "pyo3-build-config",
"quote",
"syn 2.0.117",
]
[[package]]
name = "pyo3-opentelemetry"
-version = "0.7.0"
+version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3d7d1e83566a3d349671a417dbde37b76fde16a6f5893de038dc897db071c46c"
+checksum = "751d9b7fc7751abbee4110735a420cfc4ae172698b5a8aac0f417df3776b10d5"
dependencies = [
"pyo3",
"pyo3-opentelemetry-macros",
@@ -3160,9 +3198,9 @@ dependencies = [
[[package]]
name = "pyo3-opentelemetry-macros"
-version = "0.7.0"
+version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d6e0e861730227d0b1f08f4dc4641d787ae4627653ceae7624d43e4190bc68b2"
+checksum = "7c303ed73d294dd7b88f0262afdbfab275b6bae37f2556c0120965649c094e7f"
dependencies = [
"proc-macro2",
"quote",
@@ -3171,9 +3209,9 @@ dependencies = [
[[package]]
name = "pyo3-stub-gen"
-version = "0.17.2"
+version = "0.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "398b833826a83ca72c1e26d1b2c7c71f9ca7c3bfc74eacc663901895c362ae33"
+checksum = "a267ea4da9a831f534def7f1d8e14f581d5640d3e5af6527072724f216f4dbbf"
dependencies = [
"anyhow",
"chrono",
@@ -3188,15 +3226,18 @@ dependencies = [
"ordered-float",
"pyo3",
"pyo3-stub-gen-derive",
+ "rustpython-parser",
"serde",
- "toml 0.9.11+spec-1.1.0",
+ "serde_json",
+ "time",
+ "toml 1.1.4+spec-1.1.0",
]
[[package]]
name = "pyo3-stub-gen-derive"
-version = "0.17.2"
+version = "0.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2426ba759d848787239d80f9fdb1f223786976f87fb6c3da8188ca7c17744b28"
+checksum = "6573423a5e8cc43ec7565eccccbc2dd35e1fc9032d9ca404afab875429eb8cf0"
dependencies = [
"heck 0.5.0",
"indexmap 2.13.0",
@@ -3208,15 +3249,15 @@ dependencies = [
[[package]]
name = "pyo3-tracing-subscriber"
-version = "0.5.0"
+version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4b5001efbec2c29b8c89834447ea2328b8d9bf8ed864f8a3ebeab3484ec1c9f7"
+checksum = "c8eef7a29520a43da6e6b6a021d3faf81c2b5464b170fb524ec0ebc25137cad7"
dependencies = [
"futures-core",
"pyo3",
"pyo3-async-runtimes",
"qcs-dependencies-client",
- "rigetti-pyo3",
+ "rigetti-pyo3 0.8.1",
"serde",
"serde_json",
"thiserror 2.0.18",
@@ -3227,9 +3268,9 @@ dependencies = [
[[package]]
name = "pyo3-tracing-subscriber-build"
-version = "0.5.0"
+version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4cf575aa55922da7d8fceb3e2f27f4eb609135b67d84a17c65d70246de3997e5"
+checksum = "fa1d2d8629e327274fb0688b4e89d91c3a2dd1f0d5751400826b511a63915102"
dependencies = [
"handlebars",
"serde",
@@ -3261,7 +3302,7 @@ dependencies = [
"num",
"numpy",
"oauth2-test-server",
- "optipy",
+ "optipy 0.2.1",
"pastey",
"pyo3",
"pyo3-async-runtimes",
@@ -3277,7 +3318,7 @@ dependencies = [
"qcs-dependencies-client",
"quil-rs",
"regex",
- "rigetti-pyo3",
+ "rigetti-pyo3 0.8.1",
"rmp-serde",
"rstest",
"serde",
@@ -3298,9 +3339,9 @@ dependencies = [
[[package]]
name = "qcs-api-client-common"
-version = "0.18.1"
+version = "0.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "652f68ce5f08fb59e203753fb27e57c9cb23b8b857126dba9b7dbd4b056076fe"
+checksum = "2b18ee6da7075796d52a4955a5627ae15b2ca4e05f5925370844279f5b2c6d57"
dependencies = [
"async-tempfile",
"async-trait",
@@ -3314,13 +3355,13 @@ dependencies = [
"hyper-util",
"jsonwebtoken 9.3.1",
"oauth2",
- "optipy",
+ "optipy 0.1.4",
"pyo3",
"pyo3-async-runtimes",
"pyo3-build-config",
"pyo3-stub-gen",
"qcs-dependencies-client",
- "rigetti-pyo3",
+ "rigetti-pyo3 0.8.1",
"serde",
"serde_json",
"shellexpand",
@@ -3338,9 +3379,9 @@ dependencies = [
[[package]]
name = "qcs-api-client-grpc"
-version = "0.18.1"
+version = "0.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1a4fcd8b43da659fbcb77a08c9509bfe38ed22a49d95c9dcc9bb9ad994f3b938"
+checksum = "ebcb9f81b22e5382b0751dc3b2c9d58be4340241a85ff940d66d94529d86587d"
dependencies = [
"backoff",
"futures-util",
@@ -3363,9 +3404,9 @@ dependencies = [
[[package]]
name = "qcs-api-client-openapi"
-version = "0.19.1"
+version = "0.20.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c76e1c7d1599ac487c7b1e19db7dc8682e5e076420c106da7b160ffd10b57932"
+checksum = "b39321327e8c69be751b2791eba7f48a8038b8b5b329c7d98287b6607205f7fd"
dependencies = [
"anyhow",
"http",
@@ -3384,9 +3425,9 @@ dependencies = [
[[package]]
name = "qcs-dependencies-client"
-version = "0.3.2"
+version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a1a7391bf8f8b9f92aea059531f7071c8b6c487f47b8d0536e56fc968c6359dd"
+checksum = "594d8244e2e6408f80907ae82e49caebb3e5783e5e1512eb24bf87f10c081e2a"
dependencies = [
"http",
"opentelemetry",
@@ -3415,14 +3456,17 @@ dependencies = [
[[package]]
name = "quil-rs"
-version = "0.35.0"
+version = "0.37.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "281944c5f662c40607e966f9628cb0a3a23c4f854c4cf2089e6e61b98f2c8c58"
+checksum = "40079ddd1cbcb7a38fac4e1b010fa8a4949c9a1e0d9ab79406e6964805b71185"
dependencies = [
+ "anyhow",
"approx",
+ "derive-where",
+ "derive_more",
"indexmap 2.13.0",
"internment",
- "itertools 0.12.1",
+ "itertools 0.14.0",
"lexical",
"ndarray",
"nom",
@@ -3430,14 +3474,14 @@ dependencies = [
"num-complex",
"numpy",
"once_cell",
- "optipy",
+ "optipy 0.1.4",
"paste",
"petgraph 0.6.5",
"pyo3",
"pyo3-build-config",
"pyo3-stub-gen",
"regex",
- "rigetti-pyo3",
+ "rigetti-pyo3 0.7.1",
"serde",
"statrs",
"strum",
@@ -3827,13 +3871,27 @@ dependencies = [
[[package]]
name = "rigetti-pyo3"
-version = "0.5.5"
+version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af07bc1eb22f60196c1993dcf3b7d81761ca77eb631ad50d9ff357556dd6ccc7"
+checksum = "213e90a6c913d2826aa2b14c0a267c0bd784e586f108319066fdd42834abf325"
dependencies = [
"indexmap 2.13.0",
"itertools 0.14.0",
- "optipy",
+ "optipy 0.1.4",
+ "pastey",
+ "pyo3",
+ "pyo3-stub-gen",
+]
+
+[[package]]
+name = "rigetti-pyo3"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "54283d7a88051a30fd1d508c22a1c5bca9b74ef9572d1e43ee707c5f8417e3d0"
+dependencies = [
+ "indexmap 2.13.0",
+ "itertools 0.14.0",
+ "optipy 0.2.1",
"pastey",
"pyo3",
"pyo3-async-runtimes",
@@ -3955,7 +4013,7 @@ dependencies = [
"errno",
"libc",
"linux-raw-sys",
- "windows-sys 0.61.2",
+ "windows-sys 0.59.0",
]
[[package]]
@@ -4004,7 +4062,7 @@ checksum = "26d1e2536ce4f35f4846aa13bff16bd0ff40157cdb14cc056c7b14ba41233ba0"
dependencies = [
"core-foundation 0.10.1",
"core-foundation-sys",
- "jni 0.22.4",
+ "jni",
"log",
"once_cell",
"rustls",
@@ -4014,7 +4072,7 @@ dependencies = [
"security-framework 3.5.1",
"security-framework-sys",
"webpki-root-certs",
- "windows-sys 0.61.2",
+ "windows-sys 0.59.0",
]
[[package]]
@@ -4289,9 +4347,9 @@ dependencies = [
[[package]]
name = "serde_spanned"
-version = "1.0.4"
+version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f8bbf91e5a4d6315eee45e704372590b30e260ee83af6639d64557f51b067776"
+checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26"
dependencies = [
"serde_core",
]
@@ -4672,7 +4730,7 @@ dependencies = [
"getrandom 0.3.4",
"once_cell",
"rustix",
- "windows-sys 0.61.2",
+ "windows-sys 0.59.0",
]
[[package]]
@@ -4927,13 +4985,28 @@ checksum = "f3afc9a848309fe1aaffaed6e1546a7a14de1f935dc9d89d32afd9a44bab7c46"
dependencies = [
"indexmap 2.13.0",
"serde_core",
- "serde_spanned 1.0.4",
+ "serde_spanned 1.1.1",
"toml_datetime 0.7.5+spec-1.1.0",
"toml_parser",
"toml_writer",
"winnow 0.7.14",
]
+[[package]]
+name = "toml"
+version = "1.1.4+spec-1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3aace63f4bbcdfc2c965b059de67119c89c4017a70d633be6c104910f67056f5"
+dependencies = [
+ "indexmap 2.13.0",
+ "serde_core",
+ "serde_spanned 1.1.1",
+ "toml_datetime 1.1.1+spec-1.1.0",
+ "toml_parser",
+ "toml_writer",
+ "winnow 1.0.4",
+]
+
[[package]]
name = "toml_datetime"
version = "0.6.11"
@@ -4952,6 +5025,15 @@ dependencies = [
"serde_core",
]
+[[package]]
+name = "toml_datetime"
+version = "1.1.1+spec-1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7"
+dependencies = [
+ "serde_core",
+]
+
[[package]]
name = "toml_edit"
version = "0.19.15"
@@ -4994,11 +5076,11 @@ dependencies = [
[[package]]
name = "toml_parser"
-version = "1.0.6+spec-1.1.0"
+version = "1.1.3+spec-1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a3198b4b0a8e11f09dd03e133c0280504d0801269e9afa46362ffde1cbeebf44"
+checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56"
dependencies = [
- "winnow 0.7.14",
+ "winnow 1.0.4",
]
[[package]]
@@ -5009,9 +5091,9 @@ checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801"
[[package]]
name = "toml_writer"
-version = "1.0.6+spec-1.1.0"
+version = "1.1.2+spec-1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ab16f14aed21ee8bfd8ec22513f7287cd4a91aa92e44edfe2c17ddd004e92607"
+checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2"
[[package]]
name = "tonic"
@@ -5150,6 +5232,7 @@ dependencies = [
"tower-layer",
"tower-service",
"tracing",
+ "uuid",
]
[[package]]
@@ -5352,12 +5435,24 @@ version = "1.0.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
+[[package]]
+name = "unicode-segmentation"
+version = "1.13.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8"
+
[[package]]
name = "unicode-width"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254"
+[[package]]
+name = "unicode-xid"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
+
[[package]]
name = "unicode_names2"
version = "1.3.0"
@@ -5380,12 +5475,6 @@ dependencies = [
"rand 0.8.5",
]
-[[package]]
-name = "unindent"
-version = "0.2.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7264e107f553ccae879d21fbea1d6724ac785e8c3bfc762137959b5802826ef3"
-
[[package]]
name = "untrusted"
version = "0.7.1"
@@ -5413,9 +5502,9 @@ dependencies = [
[[package]]
name = "urlpattern"
-version = "0.4.2"
+version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0f805818f843b548bacc19609eb3619dd2850e54746f5cada37927393c2ef4ec"
+checksum = "df16f50ef4cc145211879a3867ba757076b25dfee812040dcb0658bd9ae7904b"
dependencies = [
"icu_properties",
"regex",
@@ -5621,15 +5710,15 @@ dependencies = [
[[package]]
name = "webbrowser"
-version = "1.0.6"
+version = "1.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "00f1243ef785213e3a32fa0396093424a3a6ea566f9948497e5a2309261a4c97"
+checksum = "62c35be770821a214dbc362fc26908c853e776c0004294d0b10b8a6bad582f94"
dependencies = [
- "core-foundation 0.10.1",
- "jni 0.21.1",
+ "jni",
"log",
"ndk-context",
"objc2",
+ "objc2-app-kit",
"objc2-foundation",
"url",
"web-sys",
@@ -5669,7 +5758,7 @@ version = "0.1.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22"
dependencies = [
- "windows-sys 0.61.2",
+ "windows-sys 0.48.0",
]
[[package]]
@@ -5742,15 +5831,6 @@ dependencies = [
"windows-link",
]
-[[package]]
-name = "windows-sys"
-version = "0.45.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0"
-dependencies = [
- "windows-targets 0.42.2",
-]
-
[[package]]
name = "windows-sys"
version = "0.48.0"
@@ -5787,21 +5867,6 @@ dependencies = [
"windows-link",
]
-[[package]]
-name = "windows-targets"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071"
-dependencies = [
- "windows_aarch64_gnullvm 0.42.2",
- "windows_aarch64_msvc 0.42.2",
- "windows_i686_gnu 0.42.2",
- "windows_i686_msvc 0.42.2",
- "windows_x86_64_gnu 0.42.2",
- "windows_x86_64_gnullvm 0.42.2",
- "windows_x86_64_msvc 0.42.2",
-]
-
[[package]]
name = "windows-targets"
version = "0.48.5"
@@ -5833,12 +5898,6 @@ dependencies = [
"windows_x86_64_msvc 0.52.6",
]
-[[package]]
-name = "windows_aarch64_gnullvm"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8"
-
[[package]]
name = "windows_aarch64_gnullvm"
version = "0.48.5"
@@ -5851,12 +5910,6 @@ version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
-[[package]]
-name = "windows_aarch64_msvc"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43"
-
[[package]]
name = "windows_aarch64_msvc"
version = "0.48.5"
@@ -5869,12 +5922,6 @@ version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
-[[package]]
-name = "windows_i686_gnu"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f"
-
[[package]]
name = "windows_i686_gnu"
version = "0.48.5"
@@ -5893,12 +5940,6 @@ version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
-[[package]]
-name = "windows_i686_msvc"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060"
-
[[package]]
name = "windows_i686_msvc"
version = "0.48.5"
@@ -5911,12 +5952,6 @@ version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
-[[package]]
-name = "windows_x86_64_gnu"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36"
-
[[package]]
name = "windows_x86_64_gnu"
version = "0.48.5"
@@ -5929,12 +5964,6 @@ version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
-[[package]]
-name = "windows_x86_64_gnullvm"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3"
-
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.48.5"
@@ -5947,12 +5976,6 @@ version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
-[[package]]
-name = "windows_x86_64_msvc"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0"
-
[[package]]
name = "windows_x86_64_msvc"
version = "0.48.5"
@@ -5983,6 +6006,12 @@ dependencies = [
"memchr",
]
+[[package]]
+name = "winnow"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81"
+
[[package]]
name = "wit-bindgen"
version = "0.51.0"
diff --git a/Cargo.toml b/Cargo.toml
index 08fe41326..6e42d4984 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -6,16 +6,8 @@ resolver = "2"
# ndarray is used by the `qcs` crate, but it is also used in the `python` crate via a
# re-export through the numpy crate. They should be updated as a pair to keep both
# crates' versions of ndarray in sync.
-# Similarly, pyo3 packages (`numpy`, `pyo3*`) track versions together
-# and need to be updated together.
ndarray = { version = "0.17.2", features = ["serde"] }
-numpy = "0.27.1"
-qcs-dependencies-client = { version = "0.3.2" }
-pyo3 = { version = "0.27.2", features = ["num-complex", "multiple-pymethods"] }
-pyo3-async-runtimes = { version = "0.27", features = ["attributes", "tokio-runtime"] }
-pyo3-build-config = "0.27.2"
-pyo3-log = { version = "0.13.2" }
-pyo3-stub-gen = { version = "0.17.2", features = ["numpy"] }
+qcs-dependencies-client = { version = "0.5" }
serde_json = "1.0.86"
thiserror = "2.0.17"
tokio = "1.36.0"
@@ -23,17 +15,23 @@ tokio-util = "0.7"
tracing = { version = "0.1", features = ["log"] }
tracing-subscriber = { version = "0.3.19" }
-# These dependencies we manage.
-optipy = "0.1"
+# PyO3-related versions all need to be kept synchronized. Mismatches will fail to build.
+numpy = "0.29"
+pyo3 = { version = "0.29", features = ["num-complex", "multiple-pymethods"] }
+pyo3-async-runtimes = { version = "0.29", features = ["attributes", "tokio-runtime"] }
+pyo3-build-config = "0.29"
+pyo3-log = { version = "0.13" }
+pyo3-stub-gen = { version = "0.23", features = ["numpy"] }
+pyo3-opentelemetry = "0.11"
+pyo3-tracing-subscriber = "0.9"
+pyo3-tracing-subscriber-build = "0.9"
+rigetti-pyo3 = "0.8"
+optipy = "0.2"
-pyo3-opentelemetry = "0.7.0"
-pyo3-tracing-subscriber = "0.5.0"
-pyo3-tracing-subscriber-build = "0.5.0"
-qcs-api-client-common = "0.18.1"
-qcs-api-client-grpc = "0.18.1"
-qcs-api-client-openapi = "0.19.1"
-quil-rs = "0.35.0"
-rigetti-pyo3 = "0.5"
+qcs-api-client-common = "0.19"
+qcs-api-client-grpc = "0.19"
+qcs-api-client-openapi = "0.20"
+quil-rs = "0.37.0"
assert2 = "0.3.11"
async-trait = "0.1.73"
built = "0.6.1"
diff --git a/crates/lib/Cargo.toml b/crates/lib/Cargo.toml
index 3f1ef946d..baac47fdc 100644
--- a/crates/lib/Cargo.toml
+++ b/crates/lib/Cargo.toml
@@ -64,7 +64,7 @@ lazy_static = { workspace = true }
ndarray.workspace = true
num = { workspace = true, features = ["serde"] }
optipy.workspace = true
-qcs-dependencies-client = { workspace = true, features = ["grpc", "http"] }
+qcs-dependencies-client = { workspace = true, features = ["grpc", "openapi"] }
quil-rs.workspace = true
rmp-serde = { workspace = true }
serde = { workspace = true, features = ["derive"] }
diff --git a/crates/lib/Makefile.toml b/crates/lib/Makefile.toml
index 1c4ed20b5..760ef538d 100644
--- a/crates/lib/Makefile.toml
+++ b/crates/lib/Makefile.toml
@@ -46,41 +46,57 @@ dependencies = ["deny", "lint", "check", "test-flow"]
# ----
-[tasks.install-python-deps]
-description = "Install python dependencies using poetry."
-command = "poetry"
-args = ["install", "--with", "dev", "--no-root"]
-
-# NOTE: if using `uv`, you may need to set `PYTHONHOME` to the root of the virtual environment:
-#
-# export PYTHONHOME=$(python3 -c "import sys; print(sys.base_prefix)")
[tasks.generate-stubs]
description = "Generate Python stub files."
-command = "cargo"
-args = ["run", "-p", "qcs", "--features", "stubs", "--bin", "stub_gen"]
-install_crate = false
+script_runner = "bash"
+script = '''
+cargo run -p qcs --features stubs --bin stub_gen
+# The generators emit unformatted output and the result is committed, so format it here.
+# `[tool.ruff.lint] exclude` (rather than a top-level `exclude`) is what lets `ruff format`
+# reach these files while they stay unlinted.
+uv run --group dev ruff format python/qcs_sdk
+'''
+
+[tasks.check-generated-python-files]
+# The generated `__init__.py` files are what expose the compiled `qcs_sdk._qcs_sdk` modules
+# under their public `qcs_sdk` names, and release wheels are built straight from the committed
+# tree (see `.github/workflows/release-python.yml`, which does not run `cargo make`). So if
+# they go stale, a release can silently omit a class — or a whole submodule — with nothing else
+# to catch it.
+description = "Check that the committed stubs and `__init__.py` files are up to date."
+dependencies = ["generate-stubs"]
+cwd = "python"
+script = '''
+if [ -n "$(git status --porcelain .)" ]; then
+ echo "error: the generated Python files are out of date." >&2
+ echo "Run 'cargo make --cwd crates/lib generate-stubs' and commit the result:" >&2
+ git status --porcelain . >&2
+ git --no-pager diff . >&2
+ exit 1
+fi
+echo "Generated Python files are up to date."
+'''
[tasks.package-python]
-description = "Build a release version of the Python package to the active virtual environment."
-dependencies = ["install-python-deps", "generate-stubs"]
-command = "poetry"
-args = ["run", "maturin", "build", "--release"]
+description = "Build a release version of the Python package and install in the virtual environment."
+dependencies = ["generate-stubs"]
+command = "uv"
+args = ["run", "--group", "dev", "maturin", "build", "--release"]
[tasks.install-python-package]
+# `generate-stubs` also writes the package's `__init__.py` files, which are what expose the
+# compiled `qcs_sdk._qcs_sdk` modules under their public `qcs_sdk` names — so it is a build
+# input now, not just a convenience for type checkers.
description = "Build the Python package and install to the active virtual environment."
-dependencies = ["install-python-deps"]
-command = "poetry"
-args = ["run", "maturin", "develop"]
-
-[tasks.install-python-package-with-stubs]
-description = "Install the Python package with up-to-date stubs (not needed for testing)."
-dependencies = ["generate-stubs", "install-python-package"]
+dependencies = ["generate-stubs"]
+command = "uv"
+args = ["run", "--group", "dev", "maturin", "develop"]
[tasks.pytest]
description = "Run Python tests."
dependencies = ["install-python-package"]
-command = "poetry"
-args = ["run", "pytest"]
+command = "uv"
+args = ["run", "--group", "dev", "pytest"]
[tasks.pytest-flow]
dependencies = [
@@ -92,11 +108,13 @@ dependencies = [
[tasks.stubtest]
description = "Check Python stubfiles."
-dependencies = ["install-python-package-with-stubs"]
-command = "poetry"
+dependencies = ["install-python-package"]
+command = "uv"
cwd = "python"
args = [
"run",
+ "--group",
+ "dev",
"stubtest",
"--allowlist",
"stubtest-allowlist",
@@ -104,30 +122,33 @@ args = [
"./qcs_sdk/_tracing_subscriber/.stubtest-allowlist",
"--ignore-disjoint-bases",
"--ignore-unused-allowlist",
+ # Silences the undefined foreign-module references in the generated stubs; an allowlist
+ # cannot, since those are `mypy` build errors and abort the run before it is consulted.
+ "--mypy-config-file",
+ "stubtest-mypy.ini",
"qcs_sdk",
]
-# TODO(#475): Enable error reporting once stubtest is happy with stubgen's output.
-ignore_errors = true
[tasks.stubtest-flow]
dependencies = ["stubtest"]
[tasks.lint-python-package]
description = "Find errors in Python-related Rust code."
-dependencies = ["install-python-package-with-stubs"]
-command = "poetry"
-args = ["run", "python", "./scripts/lint-bindings.py", "--base", "src", "--show-mistakes"]
+dependencies = ["install-python-package"]
+command = "uv"
+args = ["run", "--group", "dev", "python", "./scripts/lint-bindings.py", "--base", "src", "--show-mistakes"]
[tasks.show-python-package-layout]
description = "Print the Python package layout as defined within Rust code."
-dependencies = ["install-python-package-with-stubs"]
-command = "poetry"
-args = ["run", "python", "./scripts/lint-bindings.py", "--base", "src", "--show-package"]
+dependencies = ["install-python-package"]
+command = "uv"
+args = ["run", "--group", "dev", "python", "./scripts/lint-bindings.py", "--base", "src", "--show-package"]
[tasks.test-python-package]
description = "Run all Python-related tests."
dependencies = [
"lint-python-package",
+ "check-generated-python-files",
"check-python-api",
"stubtest-flow",
"pytest-flow",
@@ -142,43 +163,46 @@ alias = "test-all"
[tasks.check-python-api]
description = "Check if Python API has breaking changes."
-dependencies = ["install-python-package-with-stubs"]
+dependencies = ["install-python-package"]
script = { file = "./scripts/check-py-api.sh" }
[tasks.document-python-package]
description = "Generate Python package documentation."
-dependencies = ["install-python-package-with-stubs"]
-command = "poetry"
+dependencies = ["install-python-package"]
+command = "uv"
args = [
"run",
+ "--group",
+ "dev",
"pdoc",
"-o", "build/docs",
"qcs_sdk",
- "!qcs_sdk.qcs_sdk",
+ "!qcs_sdk._qcs_sdk",
"--logo", "https://qcs.rigetti.com/static/img/rigetti-logo.svg",
]
# ----
[tasks.format-tracing-subscriber]
-dependencies = ["install-python-deps"]
-command = "poetry"
-args = ["run", "black", "python/qcs_sdk/_tracing_subscriber"]
+command = "uv"
+args = ["run", "--group", "dev", "ruff", "format", "python/qcs_sdk/_tracing_subscriber"]
[tasks.format]
-dependencies = ["install-python-deps"]
-command = "poetry"
-args = ["run", "black", "python/qcs_sdk", "tests"]
+# Only hand-written Python. Everything under `python/qcs_sdk` is generated — reformatting it
+# makes `check-generated-python-files` fail until the next `generate-stubs` run.
+# (`tests` is the Rust integration-test directory and contains no Python.)
+command = "uv"
+args = ["run", "--group", "dev", "ruff", "format", "tests_py", "scripts"]
[tasks.test-session]
-dependencies = ["install-python-package-with-stubs"]
-command = "poetry"
-args = ["run", "pytest", "tests_py", "--with-qcs-session"]
+dependencies = ["install-python-package"]
+command = "uv"
+args = ["run", "--group", "dev", "pytest", "tests_py", "--with-qcs-session"]
[tasks.test-execution]
-dependencies = ["install-python-package-with-stubs"]
-command = "poetry"
-args = ["run", "pytest", "tests_py", "--with-qcs-session", "--with-qcs-execution"]
+dependencies = ["install-python-package"]
+command = "uv"
+args = ["run", "--group", "dev", "pytest", "tests_py", "--with-qcs-session", "--with-qcs-execution"]
[tasks.dev-flow]
dependencies = ["dev-test-flow", "pytest-flow", "stubtest-flow"]
diff --git a/crates/lib/poetry.lock b/crates/lib/poetry.lock
deleted file mode 100644
index 96df84dc5..000000000
--- a/crates/lib/poetry.lock
+++ /dev/null
@@ -1,1445 +0,0 @@
-# This file is automatically @generated by Poetry 2.3.3 and should not be changed by hand.
-
-[[package]]
-name = "anyio"
-version = "4.12.0"
-description = "High-level concurrency and networking framework on top of asyncio or Trio"
-optional = false
-python-versions = ">=3.9"
-groups = ["main"]
-files = [
- {file = "anyio-4.12.0-py3-none-any.whl", hash = "sha256:dad2376a628f98eeca4881fc56cd06affd18f659b17a747d3ff0307ced94b1bb"},
- {file = "anyio-4.12.0.tar.gz", hash = "sha256:73c693b567b0c55130c104d0b43a9baf3aa6a31fc6110116509f27bf75e21ec0"},
-]
-
-[package.dependencies]
-exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""}
-idna = ">=2.8"
-typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""}
-
-[package.extras]
-trio = ["trio (>=0.31.0) ; python_version < \"3.10\"", "trio (>=0.32.0) ; python_version >= \"3.10\""]
-
-[[package]]
-name = "backports-asyncio-runner"
-version = "1.2.0"
-description = "Backport of asyncio.Runner, a context manager that controls event loop life cycle."
-optional = false
-python-versions = "<3.11,>=3.8"
-groups = ["dev"]
-markers = "python_version == \"3.10\""
-files = [
- {file = "backports_asyncio_runner-1.2.0-py3-none-any.whl", hash = "sha256:0da0a936a8aeb554eccb426dc55af3ba63bcdc69fa1a600b5bb305413a4477b5"},
- {file = "backports_asyncio_runner-1.2.0.tar.gz", hash = "sha256:a5aa7b2b7d8f8bfcaa2b57313f70792df84e32a2a746f585213373f900b42162"},
-]
-
-[[package]]
-name = "black"
-version = "25.11.0"
-description = "The uncompromising code formatter."
-optional = false
-python-versions = ">=3.9"
-groups = ["dev"]
-files = [
- {file = "black-25.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ec311e22458eec32a807f029b2646f661e6859c3f61bc6d9ffb67958779f392e"},
- {file = "black-25.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1032639c90208c15711334d681de2e24821af0575573db2810b0763bcd62e0f0"},
- {file = "black-25.11.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0c0f7c461df55cf32929b002335883946a4893d759f2df343389c4396f3b6b37"},
- {file = "black-25.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:f9786c24d8e9bd5f20dc7a7f0cdd742644656987f6ea6947629306f937726c03"},
- {file = "black-25.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:895571922a35434a9d8ca67ef926da6bc9ad464522a5fe0db99b394ef1c0675a"},
- {file = "black-25.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cb4f4b65d717062191bdec8e4a442539a8ea065e6af1c4f4d36f0cdb5f71e170"},
- {file = "black-25.11.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d81a44cbc7e4f73a9d6ae449ec2317ad81512d1e7dce7d57f6333fd6259737bc"},
- {file = "black-25.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:7eebd4744dfe92ef1ee349dc532defbf012a88b087bb7ddd688ff59a447b080e"},
- {file = "black-25.11.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:80e7486ad3535636657aa180ad32a7d67d7c273a80e12f1b4bfa0823d54e8fac"},
- {file = "black-25.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6cced12b747c4c76bc09b4db057c319d8545307266f41aaee665540bc0e04e96"},
- {file = "black-25.11.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6cb2d54a39e0ef021d6c5eef442e10fd71fcb491be6413d083a320ee768329dd"},
- {file = "black-25.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:ae263af2f496940438e5be1a0c1020e13b09154f3af4df0835ea7f9fe7bfa409"},
- {file = "black-25.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0a1d40348b6621cc20d3d7530a5b8d67e9714906dfd7346338249ad9c6cedf2b"},
- {file = "black-25.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:51c65d7d60bb25429ea2bf0731c32b2a2442eb4bd3b2afcb47830f0b13e58bfd"},
- {file = "black-25.11.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:936c4dd07669269f40b497440159a221ee435e3fddcf668e0c05244a9be71993"},
- {file = "black-25.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:f42c0ea7f59994490f4dccd64e6b2dd49ac57c7c84f38b8faab50f8759db245c"},
- {file = "black-25.11.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:35690a383f22dd3e468c85dc4b915217f87667ad9cce781d7b42678ce63c4170"},
- {file = "black-25.11.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:dae49ef7369c6caa1a1833fd5efb7c3024bb7e4499bf64833f65ad27791b1545"},
- {file = "black-25.11.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5bd4a22a0b37401c8e492e994bce79e614f91b14d9ea911f44f36e262195fdda"},
- {file = "black-25.11.0-cp314-cp314-win_amd64.whl", hash = "sha256:aa211411e94fdf86519996b7f5f05e71ba34835d8f0c0f03c00a26271da02664"},
- {file = "black-25.11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a3bb5ce32daa9ff0605d73b6f19da0b0e6c1f8f2d75594db539fdfed722f2b06"},
- {file = "black-25.11.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9815ccee1e55717fe9a4b924cae1646ef7f54e0f990da39a34fc7b264fcf80a2"},
- {file = "black-25.11.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:92285c37b93a1698dcbc34581867b480f1ba3a7b92acf1fe0467b04d7a4da0dc"},
- {file = "black-25.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:43945853a31099c7c0ff8dface53b4de56c41294fa6783c0441a8b1d9bf668bc"},
- {file = "black-25.11.0-py3-none-any.whl", hash = "sha256:e3f562da087791e96cefcd9dda058380a442ab322a02e222add53736451f604b"},
- {file = "black-25.11.0.tar.gz", hash = "sha256:9a323ac32f5dc75ce7470501b887250be5005a01602e931a15e45593f70f6e08"},
-]
-
-[package.dependencies]
-click = ">=8.0.0"
-mypy-extensions = ">=0.4.3"
-packaging = ">=22.0"
-pathspec = ">=0.9.0"
-platformdirs = ">=2"
-pytokens = ">=0.3.0"
-tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""}
-typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""}
-
-[package.extras]
-colorama = ["colorama (>=0.4.3)"]
-d = ["aiohttp (>=3.10)"]
-jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"]
-uvloop = ["uvloop (>=0.15.2)"]
-
-[[package]]
-name = "certifi"
-version = "2025.11.12"
-description = "Python package for providing Mozilla's CA Bundle."
-optional = false
-python-versions = ">=3.7"
-groups = ["main"]
-files = [
- {file = "certifi-2025.11.12-py3-none-any.whl", hash = "sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b"},
- {file = "certifi-2025.11.12.tar.gz", hash = "sha256:d8ab5478f2ecd78af242878415affce761ca6bc54a22a27e026d7c25357c3316"},
-]
-
-[[package]]
-name = "click"
-version = "8.3.1"
-description = "Composable command line interface toolkit"
-optional = false
-python-versions = ">=3.10"
-groups = ["dev"]
-files = [
- {file = "click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6"},
- {file = "click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a"},
-]
-
-[package.dependencies]
-colorama = {version = "*", markers = "platform_system == \"Windows\""}
-
-[[package]]
-name = "colorama"
-version = "0.4.6"
-description = "Cross-platform colored terminal text."
-optional = false
-python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7"
-groups = ["dev"]
-files = [
- {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"},
- {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
-]
-
-[[package]]
-name = "deprecated"
-version = "1.3.1"
-description = "Python @deprecated decorator to deprecate old python classes, functions or methods."
-optional = false
-python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7"
-groups = ["dev"]
-files = [
- {file = "deprecated-1.3.1-py2.py3-none-any.whl", hash = "sha256:597bfef186b6f60181535a29fbe44865ce137a5079f295b479886c82729d5f3f"},
- {file = "deprecated-1.3.1.tar.gz", hash = "sha256:b1b50e0ff0c1fddaa5708a2c6b0a6588bb09b892825ab2b214ac9ea9d92a5223"},
-]
-
-[package.dependencies]
-wrapt = ">=1.10,<3"
-
-[package.extras]
-dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "setuptools ; python_version >= \"3.12\"", "tox"]
-
-[[package]]
-name = "exceptiongroup"
-version = "1.3.1"
-description = "Backport of PEP 654 (exception groups)"
-optional = false
-python-versions = ">=3.7"
-groups = ["main", "dev"]
-markers = "python_version == \"3.10\""
-files = [
- {file = "exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598"},
- {file = "exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219"},
-]
-
-[package.dependencies]
-typing-extensions = {version = ">=4.6.0", markers = "python_version < \"3.13\""}
-
-[package.extras]
-test = ["pytest (>=6)"]
-
-[[package]]
-name = "griffe"
-version = "1.15.0"
-description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API."
-optional = false
-python-versions = ">=3.10"
-groups = ["dev"]
-files = [
- {file = "griffe-1.15.0-py3-none-any.whl", hash = "sha256:6f6762661949411031f5fcda9593f586e6ce8340f0ba88921a0f2ef7a81eb9a3"},
- {file = "griffe-1.15.0.tar.gz", hash = "sha256:7726e3afd6f298fbc3696e67958803e7ac843c1cfe59734b6251a40cdbfb5eea"},
-]
-
-[package.dependencies]
-colorama = ">=0.4"
-
-[package.extras]
-pypi = ["pip (>=24.0)", "platformdirs (>=4.2)", "wheel (>=0.42)"]
-
-[[package]]
-name = "grpc-interceptor"
-version = "0.15.4"
-description = "Simplifies gRPC interceptors"
-optional = false
-python-versions = ">=3.7,<4.0"
-groups = ["main"]
-files = [
- {file = "grpc-interceptor-0.15.4.tar.gz", hash = "sha256:1f45c0bcb58b6f332f37c637632247c9b02bc6af0fdceb7ba7ce8d2ebbfb0926"},
- {file = "grpc_interceptor-0.15.4-py3-none-any.whl", hash = "sha256:0035f33228693ed3767ee49d937bac424318db173fef4d2d0170b3215f254d9d"},
-]
-
-[package.dependencies]
-grpcio = ">=1.49.1,<2.0.0"
-
-[package.extras]
-testing = ["protobuf (>=4.21.9)"]
-
-[[package]]
-name = "grpcio"
-version = "1.76.0"
-description = "HTTP/2-based RPC framework"
-optional = false
-python-versions = ">=3.9"
-groups = ["main"]
-files = [
- {file = "grpcio-1.76.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:65a20de41e85648e00305c1bb09a3598f840422e522277641145a32d42dcefcc"},
- {file = "grpcio-1.76.0-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:40ad3afe81676fd9ec6d9d406eda00933f218038433980aa19d401490e46ecde"},
- {file = "grpcio-1.76.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:035d90bc79eaa4bed83f524331d55e35820725c9fbb00ffa1904d5550ed7ede3"},
- {file = "grpcio-1.76.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:4215d3a102bd95e2e11b5395c78562967959824156af11fa93d18fdd18050990"},
- {file = "grpcio-1.76.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:49ce47231818806067aea3324d4bf13825b658ad662d3b25fada0bdad9b8a6af"},
- {file = "grpcio-1.76.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8cc3309d8e08fd79089e13ed4819d0af72aa935dd8f435a195fd152796752ff2"},
- {file = "grpcio-1.76.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:971fd5a1d6e62e00d945423a567e42eb1fa678ba89072832185ca836a94daaa6"},
- {file = "grpcio-1.76.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9d9adda641db7207e800a7f089068f6f645959f2df27e870ee81d44701dd9db3"},
- {file = "grpcio-1.76.0-cp310-cp310-win32.whl", hash = "sha256:063065249d9e7e0782d03d2bca50787f53bd0fb89a67de9a7b521c4a01f1989b"},
- {file = "grpcio-1.76.0-cp310-cp310-win_amd64.whl", hash = "sha256:a6ae758eb08088d36812dd5d9af7a9859c05b1e0f714470ea243694b49278e7b"},
- {file = "grpcio-1.76.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:2e1743fbd7f5fa713a1b0a8ac8ebabf0ec980b5d8809ec358d488e273b9cf02a"},
- {file = "grpcio-1.76.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:a8c2cf1209497cf659a667d7dea88985e834c24b7c3b605e6254cbb5076d985c"},
- {file = "grpcio-1.76.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:08caea849a9d3c71a542827d6df9d5a69067b0a1efbea8a855633ff5d9571465"},
- {file = "grpcio-1.76.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:f0e34c2079d47ae9f6188211db9e777c619a21d4faba6977774e8fa43b085e48"},
- {file = "grpcio-1.76.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8843114c0cfce61b40ad48df65abcfc00d4dba82eae8718fab5352390848c5da"},
- {file = "grpcio-1.76.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8eddfb4d203a237da6f3cc8a540dad0517d274b5a1e9e636fd8d2c79b5c1d397"},
- {file = "grpcio-1.76.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:32483fe2aab2c3794101c2a159070584e5db11d0aa091b2c0ea9c4fc43d0d749"},
- {file = "grpcio-1.76.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:dcfe41187da8992c5f40aa8c5ec086fa3672834d2be57a32384c08d5a05b4c00"},
- {file = "grpcio-1.76.0-cp311-cp311-win32.whl", hash = "sha256:2107b0c024d1b35f4083f11245c0e23846ae64d02f40b2b226684840260ed054"},
- {file = "grpcio-1.76.0-cp311-cp311-win_amd64.whl", hash = "sha256:522175aba7af9113c48ec10cc471b9b9bd4f6ceb36aeb4544a8e2c80ed9d252d"},
- {file = "grpcio-1.76.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:81fd9652b37b36f16138611c7e884eb82e0cec137c40d3ef7c3f9b3ed00f6ed8"},
- {file = "grpcio-1.76.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:04bbe1bfe3a68bbfd4e52402ab7d4eb59d72d02647ae2042204326cf4bbad280"},
- {file = "grpcio-1.76.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d388087771c837cdb6515539f43b9d4bf0b0f23593a24054ac16f7a960be16f4"},
- {file = "grpcio-1.76.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:9f8f757bebaaea112c00dba718fc0d3260052ce714e25804a03f93f5d1c6cc11"},
- {file = "grpcio-1.76.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:980a846182ce88c4f2f7e2c22c56aefd515daeb36149d1c897f83cf57999e0b6"},
- {file = "grpcio-1.76.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f92f88e6c033db65a5ae3d97905c8fea9c725b63e28d5a75cb73b49bda5024d8"},
- {file = "grpcio-1.76.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4baf3cbe2f0be3289eb68ac8ae771156971848bb8aaff60bad42005539431980"},
- {file = "grpcio-1.76.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:615ba64c208aaceb5ec83bfdce7728b80bfeb8be97562944836a7a0a9647d882"},
- {file = "grpcio-1.76.0-cp312-cp312-win32.whl", hash = "sha256:45d59a649a82df5718fd9527ce775fd66d1af35e6d31abdcdc906a49c6822958"},
- {file = "grpcio-1.76.0-cp312-cp312-win_amd64.whl", hash = "sha256:c088e7a90b6017307f423efbb9d1ba97a22aa2170876223f9709e9d1de0b5347"},
- {file = "grpcio-1.76.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:26ef06c73eb53267c2b319f43e6634c7556ea37672029241a056629af27c10e2"},
- {file = "grpcio-1.76.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:45e0111e73f43f735d70786557dc38141185072d7ff8dc1829d6a77ac1471468"},
- {file = "grpcio-1.76.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:83d57312a58dcfe2a3a0f9d1389b299438909a02db60e2f2ea2ae2d8034909d3"},
- {file = "grpcio-1.76.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:3e2a27c89eb9ac3d81ec8835e12414d73536c6e620355d65102503064a4ed6eb"},
- {file = "grpcio-1.76.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:61f69297cba3950a524f61c7c8ee12e55c486cb5f7db47ff9dcee33da6f0d3ae"},
- {file = "grpcio-1.76.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6a15c17af8839b6801d554263c546c69c4d7718ad4321e3166175b37eaacca77"},
- {file = "grpcio-1.76.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:25a18e9810fbc7e7f03ec2516addc116a957f8cbb8cbc95ccc80faa072743d03"},
- {file = "grpcio-1.76.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:931091142fd8cc14edccc0845a79248bc155425eee9a98b2db2ea4f00a235a42"},
- {file = "grpcio-1.76.0-cp313-cp313-win32.whl", hash = "sha256:5e8571632780e08526f118f74170ad8d50fb0a48c23a746bef2a6ebade3abd6f"},
- {file = "grpcio-1.76.0-cp313-cp313-win_amd64.whl", hash = "sha256:f9f7bd5faab55f47231ad8dba7787866b69f5e93bc306e3915606779bbfb4ba8"},
- {file = "grpcio-1.76.0-cp314-cp314-linux_armv7l.whl", hash = "sha256:ff8a59ea85a1f2191a0ffcc61298c571bc566332f82e5f5be1b83c9d8e668a62"},
- {file = "grpcio-1.76.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:06c3d6b076e7b593905d04fdba6a0525711b3466f43b3400266f04ff735de0cd"},
- {file = "grpcio-1.76.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fd5ef5932f6475c436c4a55e4336ebbe47bd3272be04964a03d316bbf4afbcbc"},
- {file = "grpcio-1.76.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:b331680e46239e090f5b3cead313cc772f6caa7d0fc8de349337563125361a4a"},
- {file = "grpcio-1.76.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2229ae655ec4e8999599469559e97630185fdd53ae1e8997d147b7c9b2b72cba"},
- {file = "grpcio-1.76.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:490fa6d203992c47c7b9e4a9d39003a0c2bcc1c9aa3c058730884bbbb0ee9f09"},
- {file = "grpcio-1.76.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:479496325ce554792dba6548fae3df31a72cef7bad71ca2e12b0e58f9b336bfc"},
- {file = "grpcio-1.76.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:1c9b93f79f48b03ada57ea24725d83a30284a012ec27eab2cf7e50a550cbbbcc"},
- {file = "grpcio-1.76.0-cp314-cp314-win32.whl", hash = "sha256:747fa73efa9b8b1488a95d0ba1039c8e2dca0f741612d80415b1e1c560febf4e"},
- {file = "grpcio-1.76.0-cp314-cp314-win_amd64.whl", hash = "sha256:922fa70ba549fce362d2e2871ab542082d66e2aaf0c19480ea453905b01f384e"},
- {file = "grpcio-1.76.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:8ebe63ee5f8fa4296b1b8cfc743f870d10e902ca18afc65c68cf46fd39bb0783"},
- {file = "grpcio-1.76.0-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:3bf0f392c0b806905ed174dcd8bdd5e418a40d5567a05615a030a5aeddea692d"},
- {file = "grpcio-1.76.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0b7604868b38c1bfd5cf72d768aedd7db41d78cb6a4a18585e33fb0f9f2363fd"},
- {file = "grpcio-1.76.0-cp39-cp39-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:e6d1db20594d9daba22f90da738b1a0441a7427552cc6e2e3d1297aeddc00378"},
- {file = "grpcio-1.76.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d099566accf23d21037f18a2a63d323075bebace807742e4b0ac210971d4dd70"},
- {file = "grpcio-1.76.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ebea5cc3aa8ea72e04df9913492f9a96d9348db876f9dda3ad729cfedf7ac416"},
- {file = "grpcio-1.76.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:0c37db8606c258e2ee0c56b78c62fc9dee0e901b5dbdcf816c2dd4ad652b8b0c"},
- {file = "grpcio-1.76.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ebebf83299b0cb1721a8859ea98f3a77811e35dce7609c5c963b9ad90728f886"},
- {file = "grpcio-1.76.0-cp39-cp39-win32.whl", hash = "sha256:0aaa82d0813fd4c8e589fac9b65d7dd88702555f702fb10417f96e2a2a6d4c0f"},
- {file = "grpcio-1.76.0-cp39-cp39-win_amd64.whl", hash = "sha256:acab0277c40eff7143c2323190ea57b9ee5fd353d8190ee9652369fae735668a"},
- {file = "grpcio-1.76.0.tar.gz", hash = "sha256:7be78388d6da1a25c0d5ec506523db58b18be22d9c37d8d3a32c08be4987bd73"},
-]
-
-[package.dependencies]
-typing-extensions = ">=4.12,<5.0"
-
-[package.extras]
-protobuf = ["grpcio-tools (>=1.76.0)"]
-
-[[package]]
-name = "h11"
-version = "0.16.0"
-description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1"
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86"},
- {file = "h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1"},
-]
-
-[[package]]
-name = "httpcore"
-version = "1.0.9"
-description = "A minimal low-level HTTP client."
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55"},
- {file = "httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8"},
-]
-
-[package.dependencies]
-certifi = "*"
-h11 = ">=0.16"
-
-[package.extras]
-asyncio = ["anyio (>=4.0,<5.0)"]
-http2 = ["h2 (>=3,<5)"]
-socks = ["socksio (==1.*)"]
-trio = ["trio (>=0.22.0,<1.0)"]
-
-[[package]]
-name = "httpx"
-version = "0.28.1"
-description = "The next generation HTTP client."
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"},
- {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"},
-]
-
-[package.dependencies]
-anyio = "*"
-certifi = "*"
-httpcore = "==1.*"
-idna = "*"
-
-[package.extras]
-brotli = ["brotli ; platform_python_implementation == \"CPython\"", "brotlicffi ; platform_python_implementation != \"CPython\""]
-cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"]
-http2 = ["h2 (>=3,<5)"]
-socks = ["socksio (==1.*)"]
-zstd = ["zstandard (>=0.18.0)"]
-
-[[package]]
-name = "idna"
-version = "3.11"
-description = "Internationalized Domain Names in Applications (IDNA)"
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea"},
- {file = "idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902"},
-]
-
-[package.extras]
-all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"]
-
-[[package]]
-name = "importlib-metadata"
-version = "7.1.0"
-description = "Read metadata from Python packages"
-optional = false
-python-versions = ">=3.8"
-groups = ["dev"]
-files = [
- {file = "importlib_metadata-7.1.0-py3-none-any.whl", hash = "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570"},
- {file = "importlib_metadata-7.1.0.tar.gz", hash = "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2"},
-]
-
-[package.dependencies]
-zipp = ">=0.5"
-
-[package.extras]
-docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
-perf = ["ipython"]
-testing = ["flufl.flake8", "importlib-resources (>=1.3) ; python_version < \"3.9\"", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy ; platform_python_implementation != \"PyPy\"", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"]
-
-[[package]]
-name = "iniconfig"
-version = "2.3.0"
-description = "brain-dead simple config-ini parsing"
-optional = false
-python-versions = ">=3.10"
-groups = ["dev"]
-files = [
- {file = "iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12"},
- {file = "iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730"},
-]
-
-[[package]]
-name = "jinja2"
-version = "3.1.6"
-description = "A very fast and expressive template engine."
-optional = false
-python-versions = ">=3.7"
-groups = ["dev"]
-files = [
- {file = "jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"},
- {file = "jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"},
-]
-
-[package.dependencies]
-MarkupSafe = ">=2.0"
-
-[package.extras]
-i18n = ["Babel (>=2.7)"]
-
-[[package]]
-name = "librt"
-version = "0.6.3"
-description = "Mypyc runtime library"
-optional = false
-python-versions = ">=3.9"
-groups = ["dev"]
-files = [
- {file = "librt-0.6.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:45660d26569cc22ed30adf583389d8a0d1b468f8b5e518fcf9bfe2cd298f9dd1"},
- {file = "librt-0.6.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:54f3b2177fb892d47f8016f1087d21654b44f7fc4cf6571c1c6b3ea531ab0fcf"},
- {file = "librt-0.6.3-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:c5b31bed2c2f2fa1fcb4815b75f931121ae210dc89a3d607fb1725f5907f1437"},
- {file = "librt-0.6.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8f8ed5053ef9fb08d34f1fd80ff093ccbd1f67f147633a84cf4a7d9b09c0f089"},
- {file = "librt-0.6.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3f0e4bd9bcb0ee34fa3dbedb05570da50b285f49e52c07a241da967840432513"},
- {file = "librt-0.6.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d8f89c8d20dfa648a3f0a56861946eb00e5b00d6b00eea14bc5532b2fcfa8ef1"},
- {file = "librt-0.6.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:ecc2c526547eacd20cb9fbba19a5268611dbc70c346499656d6cf30fae328977"},
- {file = "librt-0.6.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:fbedeb9b48614d662822ee514567d2d49a8012037fc7b4cd63f282642c2f4b7d"},
- {file = "librt-0.6.3-cp310-cp310-win32.whl", hash = "sha256:0765b0fe0927d189ee14b087cd595ae636bef04992e03fe6dfdaa383866c8a46"},
- {file = "librt-0.6.3-cp310-cp310-win_amd64.whl", hash = "sha256:8c659f9fb8a2f16dc4131b803fa0144c1dadcb3ab24bb7914d01a6da58ae2457"},
- {file = "librt-0.6.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:61348cc488b18d1b1ff9f3e5fcd5ac43ed22d3e13e862489d2267c2337285c08"},
- {file = "librt-0.6.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:64645b757d617ad5f98c08e07620bc488d4bced9ced91c6279cec418f16056fa"},
- {file = "librt-0.6.3-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:26b8026393920320bb9a811b691d73c5981385d537ffc5b6e22e53f7b65d4122"},
- {file = "librt-0.6.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d998b432ed9ffccc49b820e913c8f327a82026349e9c34fa3690116f6b70770f"},
- {file = "librt-0.6.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e18875e17ef69ba7dfa9623f2f95f3eda6f70b536079ee6d5763ecdfe6cc9040"},
- {file = "librt-0.6.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a218f85081fc3f70cddaed694323a1ad7db5ca028c379c214e3a7c11c0850523"},
- {file = "librt-0.6.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1ef42ff4edd369e84433ce9b188a64df0837f4f69e3d34d3b34d4955c599d03f"},
- {file = "librt-0.6.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0e0f2b79993fec23a685b3e8107ba5f8675eeae286675a216da0b09574fa1e47"},
- {file = "librt-0.6.3-cp311-cp311-win32.whl", hash = "sha256:fd98cacf4e0fabcd4005c452cb8a31750258a85cab9a59fb3559e8078da408d7"},
- {file = "librt-0.6.3-cp311-cp311-win_amd64.whl", hash = "sha256:e17b5b42c8045867ca9d1f54af00cc2275198d38de18545edaa7833d7e9e4ac8"},
- {file = "librt-0.6.3-cp311-cp311-win_arm64.whl", hash = "sha256:87597e3d57ec0120a3e1d857a708f80c02c42ea6b00227c728efbc860f067c45"},
- {file = "librt-0.6.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:74418f718083009108dc9a42c21bf2e4802d49638a1249e13677585fcc9ca176"},
- {file = "librt-0.6.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:514f3f363d1ebc423357d36222c37e5c8e6674b6eae8d7195ac9a64903722057"},
- {file = "librt-0.6.3-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cf1115207a5049d1f4b7b4b72de0e52f228d6c696803d94843907111cbf80610"},
- {file = "librt-0.6.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ad8ba80cdcea04bea7b78fcd4925bfbf408961e9d8397d2ee5d3ec121e20c08c"},
- {file = "librt-0.6.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4018904c83eab49c814e2494b4e22501a93cdb6c9f9425533fe693c3117126f9"},
- {file = "librt-0.6.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8983c5c06ac9c990eac5eb97a9f03fe41dc7e9d7993df74d9e8682a1056f596c"},
- {file = "librt-0.6.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d7769c579663a6f8dbf34878969ac71befa42067ce6bf78e6370bf0d1194997c"},
- {file = "librt-0.6.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d3c9a07eafdc70556f8c220da4a538e715668c0c63cabcc436a026e4e89950bf"},
- {file = "librt-0.6.3-cp312-cp312-win32.whl", hash = "sha256:38320386a48a15033da295df276aea93a92dfa94a862e06893f75ea1d8bbe89d"},
- {file = "librt-0.6.3-cp312-cp312-win_amd64.whl", hash = "sha256:c0ecf4786ad0404b072196b5df774b1bb23c8aacdcacb6c10b4128bc7b00bd01"},
- {file = "librt-0.6.3-cp312-cp312-win_arm64.whl", hash = "sha256:9f2a6623057989ebc469cd9cc8fe436c40117a0147627568d03f84aef7854c55"},
- {file = "librt-0.6.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9e716f9012148a81f02f46a04fc4c663420c6fbfeacfac0b5e128cf43b4413d3"},
- {file = "librt-0.6.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:669ff2495728009a96339c5ad2612569c6d8be4474e68f3f3ac85d7c3261f5f5"},
- {file = "librt-0.6.3-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:349b6873ebccfc24c9efd244e49da9f8a5c10f60f07575e248921aae2123fc42"},
- {file = "librt-0.6.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c74c26736008481c9f6d0adf1aedb5a52aff7361fea98276d1f965c0256ee70"},
- {file = "librt-0.6.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:408a36ddc75e91918cb15b03460bdc8a015885025d67e68c6f78f08c3a88f522"},
- {file = "librt-0.6.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e61ab234624c9ffca0248a707feffe6fac2343758a36725d8eb8a6efef0f8c30"},
- {file = "librt-0.6.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:324462fe7e3896d592b967196512491ec60ca6e49c446fe59f40743d08c97917"},
- {file = "librt-0.6.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:36b2ec8c15030002c7f688b4863e7be42820d7c62d9c6eece3db54a2400f0530"},
- {file = "librt-0.6.3-cp313-cp313-win32.whl", hash = "sha256:25b1b60cb059471c0c0c803e07d0dfdc79e41a0a122f288b819219ed162672a3"},
- {file = "librt-0.6.3-cp313-cp313-win_amd64.whl", hash = "sha256:10a95ad074e2a98c9e4abc7f5b7d40e5ecbfa84c04c6ab8a70fabf59bd429b88"},
- {file = "librt-0.6.3-cp313-cp313-win_arm64.whl", hash = "sha256:17000df14f552e86877d67e4ab7966912224efc9368e998c96a6974a8d609bf9"},
- {file = "librt-0.6.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8e695f25d1a425ad7a272902af8ab8c8d66c1998b177e4b5f5e7b4e215d0c88a"},
- {file = "librt-0.6.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:3e84a4121a7ae360ca4da436548a9c1ca8ca134a5ced76c893cc5944426164bd"},
- {file = "librt-0.6.3-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:05f385a414de3f950886ea0aad8f109650d4b712cf9cc14cc17f5f62a9ab240b"},
- {file = "librt-0.6.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:36a8e337461150b05ca2c7bdedb9e591dfc262c5230422cea398e89d0c746cdc"},
- {file = "librt-0.6.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dcbe48f6a03979384f27086484dc2a14959be1613cb173458bd58f714f2c48f3"},
- {file = "librt-0.6.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4bca9e4c260233fba37b15c4ec2f78aa99c1a79fbf902d19dd4a763c5c3fb751"},
- {file = "librt-0.6.3-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:760c25ed6ac968e24803eb5f7deb17ce026902d39865e83036bacbf5cf242aa8"},
- {file = "librt-0.6.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4aa4a93a353ccff20df6e34fa855ae8fd788832c88f40a9070e3ddd3356a9f0e"},
- {file = "librt-0.6.3-cp314-cp314-win32.whl", hash = "sha256:cb92741c2b4ea63c09609b064b26f7f5d9032b61ae222558c55832ec3ad0bcaf"},
- {file = "librt-0.6.3-cp314-cp314-win_amd64.whl", hash = "sha256:fdcd095b1b812d756fa5452aca93b962cf620694c0cadb192cec2bb77dcca9a2"},
- {file = "librt-0.6.3-cp314-cp314-win_arm64.whl", hash = "sha256:822ca79e28720a76a935c228d37da6579edef048a17cd98d406a2484d10eda78"},
- {file = "librt-0.6.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:078cd77064d1640cb7b0650871a772956066174d92c8aeda188a489b58495179"},
- {file = "librt-0.6.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5cc22f7f5c0cc50ed69f4b15b9c51d602aabc4500b433aaa2ddd29e578f452f7"},
- {file = "librt-0.6.3-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:14b345eb7afb61b9fdcdfda6738946bd11b8e0f6be258666b0646af3b9bb5916"},
- {file = "librt-0.6.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d46aa46aa29b067f0b8b84f448fd9719aaf5f4c621cc279164d76a9dc9ab3e8"},
- {file = "librt-0.6.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1b51ba7d9d5d9001494769eca8c0988adce25d0a970c3ba3f2eb9df9d08036fc"},
- {file = "librt-0.6.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ced0925a18fddcff289ef54386b2fc230c5af3c83b11558571124bfc485b8c07"},
- {file = "librt-0.6.3-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:6bac97e51f66da2ca012adddbe9fd656b17f7368d439de30898f24b39512f40f"},
- {file = "librt-0.6.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b2922a0e8fa97395553c304edc3bd36168d8eeec26b92478e292e5d4445c1ef0"},
- {file = "librt-0.6.3-cp314-cp314t-win32.whl", hash = "sha256:f33462b19503ba68d80dac8a1354402675849259fb3ebf53b67de86421735a3a"},
- {file = "librt-0.6.3-cp314-cp314t-win_amd64.whl", hash = "sha256:04f8ce401d4f6380cfc42af0f4e67342bf34c820dae01343f58f472dbac75dcf"},
- {file = "librt-0.6.3-cp314-cp314t-win_arm64.whl", hash = "sha256:afb39550205cc5e5c935762c6bf6a2bb34f7d21a68eadb25e2db7bf3593fecc0"},
- {file = "librt-0.6.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:09262cb2445b6f15d09141af20b95bb7030c6f13b00e876ad8fdd1a9045d6aa5"},
- {file = "librt-0.6.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:57705e8eec76c5b77130d729c0f70190a9773366c555c5457c51eace80afd873"},
- {file = "librt-0.6.3-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3ac2a7835434b31def8ed5355dd9b895bbf41642d61967522646d1d8b9681106"},
- {file = "librt-0.6.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:71f0a5918aebbea1e7db2179a8fe87e8a8732340d9e8b8107401fb407eda446e"},
- {file = "librt-0.6.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aa346e202e6e1ebc01fe1c69509cffe486425884b96cb9ce155c99da1ecbe0e9"},
- {file = "librt-0.6.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:92267f865c7bbd12327a0d394666948b9bf4b51308b52947c0cc453bfa812f5d"},
- {file = "librt-0.6.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:86605d5bac340beb030cbc35859325982a79047ebdfba1e553719c7126a2389d"},
- {file = "librt-0.6.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:98e4bbecbef8d2a60ecf731d735602feee5ac0b32117dbbc765e28b054bac912"},
- {file = "librt-0.6.3-cp39-cp39-win32.whl", hash = "sha256:3caa0634c02d5ff0b2ae4a28052e0d8c5f20d497623dc13f629bd4a9e2a6efad"},
- {file = "librt-0.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:b47395091e7e0ece1e6ebac9b98bf0c9084d1e3d3b2739aa566be7e56e3f7bf2"},
- {file = "librt-0.6.3.tar.gz", hash = "sha256:c724a884e642aa2bbad52bb0203ea40406ad742368a5f90da1b220e970384aae"},
-]
-
-[[package]]
-name = "markdown-it-py"
-version = "4.0.0"
-description = "Python port of markdown-it. Markdown parsing, done right!"
-optional = false
-python-versions = ">=3.10"
-groups = ["dev"]
-files = [
- {file = "markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147"},
- {file = "markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3"},
-]
-
-[package.dependencies]
-mdurl = ">=0.1,<1.0"
-
-[package.extras]
-benchmarking = ["psutil", "pytest", "pytest-benchmark"]
-compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "markdown-it-pyrs", "mistletoe (>=1.0,<2.0)", "mistune (>=3.0,<4.0)", "panflute (>=2.3,<3.0)"]
-linkify = ["linkify-it-py (>=1,<3)"]
-plugins = ["mdit-py-plugins (>=0.5.0)"]
-profiling = ["gprof2dot"]
-rtd = ["ipykernel", "jupyter_sphinx", "mdit-py-plugins (>=0.5.0)", "myst-parser", "pyyaml", "sphinx", "sphinx-book-theme (>=1.0,<2.0)", "sphinx-copybutton", "sphinx-design"]
-testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions", "requests"]
-
-[[package]]
-name = "markdown2"
-version = "2.5.4"
-description = "A fast and complete Python implementation of Markdown"
-optional = false
-python-versions = "<4,>=3.9"
-groups = ["dev"]
-files = [
- {file = "markdown2-2.5.4-py3-none-any.whl", hash = "sha256:3c4b2934e677be7fec0e6f2de4410e116681f4ad50ec8e5ba7557be506d3f439"},
- {file = "markdown2-2.5.4.tar.gz", hash = "sha256:a09873f0b3c23dbfae589b0080587df52ad75bb09a5fa6559147554736676889"},
-]
-
-[package.extras]
-all = ["latex2mathml ; python_version >= \"3.8.1\"", "pygments (>=2.7.3)", "wavedrom"]
-code-syntax-highlighting = ["pygments (>=2.7.3)"]
-latex = ["latex2mathml ; python_version >= \"3.8.1\""]
-wavedrom = ["wavedrom"]
-
-[[package]]
-name = "markupsafe"
-version = "3.0.3"
-description = "Safely add untrusted strings to HTML/XML markup."
-optional = false
-python-versions = ">=3.9"
-groups = ["dev"]
-files = [
- {file = "markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559"},
- {file = "markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419"},
- {file = "markupsafe-3.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695"},
- {file = "markupsafe-3.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591"},
- {file = "markupsafe-3.0.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c"},
- {file = "markupsafe-3.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f"},
- {file = "markupsafe-3.0.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6"},
- {file = "markupsafe-3.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1"},
- {file = "markupsafe-3.0.3-cp310-cp310-win32.whl", hash = "sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa"},
- {file = "markupsafe-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8"},
- {file = "markupsafe-3.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1"},
- {file = "markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad"},
- {file = "markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a"},
- {file = "markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50"},
- {file = "markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf"},
- {file = "markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f"},
- {file = "markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a"},
- {file = "markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115"},
- {file = "markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a"},
- {file = "markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19"},
- {file = "markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01"},
- {file = "markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c"},
- {file = "markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e"},
- {file = "markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce"},
- {file = "markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d"},
- {file = "markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d"},
- {file = "markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a"},
- {file = "markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b"},
- {file = "markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f"},
- {file = "markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b"},
- {file = "markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d"},
- {file = "markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c"},
- {file = "markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f"},
- {file = "markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795"},
- {file = "markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219"},
- {file = "markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6"},
- {file = "markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676"},
- {file = "markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9"},
- {file = "markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1"},
- {file = "markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc"},
- {file = "markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12"},
- {file = "markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed"},
- {file = "markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5"},
- {file = "markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485"},
- {file = "markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73"},
- {file = "markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37"},
- {file = "markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19"},
- {file = "markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025"},
- {file = "markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6"},
- {file = "markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f"},
- {file = "markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb"},
- {file = "markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009"},
- {file = "markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354"},
- {file = "markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218"},
- {file = "markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287"},
- {file = "markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe"},
- {file = "markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026"},
- {file = "markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737"},
- {file = "markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97"},
- {file = "markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d"},
- {file = "markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda"},
- {file = "markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf"},
- {file = "markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe"},
- {file = "markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9"},
- {file = "markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581"},
- {file = "markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4"},
- {file = "markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab"},
- {file = "markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175"},
- {file = "markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634"},
- {file = "markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50"},
- {file = "markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e"},
- {file = "markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5"},
- {file = "markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523"},
- {file = "markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc"},
- {file = "markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d"},
- {file = "markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9"},
- {file = "markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa"},
- {file = "markupsafe-3.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15d939a21d546304880945ca1ecb8a039db6b4dc49b2c5a400387cdae6a62e26"},
- {file = "markupsafe-3.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f71a396b3bf33ecaa1626c255855702aca4d3d9fea5e051b41ac59a9c1c41edc"},
- {file = "markupsafe-3.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f4b68347f8c5eab4a13419215bdfd7f8c9b19f2b25520968adfad23eb0ce60c"},
- {file = "markupsafe-3.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e8fc20152abba6b83724d7ff268c249fa196d8259ff481f3b1476383f8f24e42"},
- {file = "markupsafe-3.0.3-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:949b8d66bc381ee8b007cd945914c721d9aba8e27f71959d750a46f7c282b20b"},
- {file = "markupsafe-3.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:3537e01efc9d4dccdf77221fb1cb3b8e1a38d5428920e0657ce299b20324d758"},
- {file = "markupsafe-3.0.3-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:591ae9f2a647529ca990bc681daebdd52c8791ff06c2bfa05b65163e28102ef2"},
- {file = "markupsafe-3.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a320721ab5a1aba0a233739394eb907f8c8da5c98c9181d1161e77a0c8e36f2d"},
- {file = "markupsafe-3.0.3-cp39-cp39-win32.whl", hash = "sha256:df2449253ef108a379b8b5d6b43f4b1a8e81a061d6537becd5582fba5f9196d7"},
- {file = "markupsafe-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:7c3fb7d25180895632e5d3148dbdc29ea38ccb7fd210aa27acbd1201a1902c6e"},
- {file = "markupsafe-3.0.3-cp39-cp39-win_arm64.whl", hash = "sha256:38664109c14ffc9e7437e86b4dceb442b0096dfe3541d7864d9cbe1da4cf36c8"},
- {file = "markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698"},
-]
-
-[[package]]
-name = "maturin"
-version = "1.9.4"
-description = "Build and publish crates with pyo3, cffi and uniffi bindings as well as rust binaries as python packages"
-optional = false
-python-versions = ">=3.7"
-groups = ["dev"]
-files = [
- {file = "maturin-1.9.4-py3-none-linux_armv6l.whl", hash = "sha256:6ff37578e3f5fdbe685110d45f60af1f5a7dfce70a1e26dfe3810af66853ecae"},
- {file = "maturin-1.9.4-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:f3837bb53611b2dafa1c090436c330f2d743ba305ef00d8801a371f4495e7e1b"},
- {file = "maturin-1.9.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:4227d627d8e3bfe45877a8d65e9d8351a9d01434549f0da75d2c06a1b570de58"},
- {file = "maturin-1.9.4-py3-none-manylinux_2_12_i686.manylinux2010_i686.musllinux_1_1_i686.whl", hash = "sha256:1bb2aa0fa29032e9c5aac03ac400396ddea12cadef242f8967e9c8ef715313a1"},
- {file = "maturin-1.9.4-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.musllinux_1_1_x86_64.whl", hash = "sha256:a0868d52934c8a5d1411b42367633fdb5cd5515bec47a534192282167448ec30"},
- {file = "maturin-1.9.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:68b7b833b25741c0f553b78e8b9e095b31ae7c6611533b3c7b71f84c2cb8fc44"},
- {file = "maturin-1.9.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.musllinux_1_1_armv7l.whl", hash = "sha256:08dc86312afee55af778af919818632e35d8d0464ccd79cb86700d9ea560ccd7"},
- {file = "maturin-1.9.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.musllinux_1_1_ppc64le.whl", hash = "sha256:ef20ffdd943078c4c3699c29fb2ed722bb6b4419efdade6642d1dbf248f94a70"},
- {file = "maturin-1.9.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:368e958468431dfeec80f75eea9639b4356d8c42428b0128444424b083fecfb0"},
- {file = "maturin-1.9.4-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:273f879214f63f79bfe851cd7d541f8150bdbfae5dfdc3c0c4d125d02d1f41b4"},
- {file = "maturin-1.9.4-py3-none-win32.whl", hash = "sha256:ed2e54d132ace7e61829bd49709331007dd9a2cc78937f598aa76a4f69b6804d"},
- {file = "maturin-1.9.4-py3-none-win_amd64.whl", hash = "sha256:8e450bb2c9afdf38a0059ee2e1ec2b17323f152b59c16f33eb9c74edaf1f9f79"},
- {file = "maturin-1.9.4-py3-none-win_arm64.whl", hash = "sha256:7a6f980a9b67a5c13c844c268eabd855b54a6a765df4b4bb07d15a990572a4c9"},
- {file = "maturin-1.9.4.tar.gz", hash = "sha256:235163a0c99bc6f380fb8786c04fd14dcf6cd622ff295ea3de525015e6ac40cf"},
-]
-
-[package.dependencies]
-tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0\""}
-
-[package.extras]
-patchelf = ["patchelf"]
-zig = ["ziglang (>=0.10.0,<0.13.0)"]
-
-[[package]]
-name = "mdurl"
-version = "0.1.2"
-description = "Markdown URL utilities"
-optional = false
-python-versions = ">=3.7"
-groups = ["dev"]
-files = [
- {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"},
- {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"},
-]
-
-[[package]]
-name = "mypy"
-version = "1.19.0"
-description = "Optional static typing for Python"
-optional = false
-python-versions = ">=3.9"
-groups = ["dev"]
-files = [
- {file = "mypy-1.19.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6148ede033982a8c5ca1143de34c71836a09f105068aaa8b7d5edab2b053e6c8"},
- {file = "mypy-1.19.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a9ac09e52bb0f7fb912f5d2a783345c72441a08ef56ce3e17c1752af36340a39"},
- {file = "mypy-1.19.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:11f7254c15ab3f8ed68f8e8f5cbe88757848df793e31c36aaa4d4f9783fd08ab"},
- {file = "mypy-1.19.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:318ba74f75899b0e78b847d8c50821e4c9637c79d9a59680fc1259f29338cb3e"},
- {file = "mypy-1.19.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cf7d84f497f78b682edd407f14a7b6e1a2212b433eedb054e2081380b7395aa3"},
- {file = "mypy-1.19.0-cp310-cp310-win_amd64.whl", hash = "sha256:c3385246593ac2b97f155a0e9639be906e73534630f663747c71908dfbf26134"},
- {file = "mypy-1.19.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a31e4c28e8ddb042c84c5e977e28a21195d086aaffaf08b016b78e19c9ef8106"},
- {file = "mypy-1.19.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:34ec1ac66d31644f194b7c163d7f8b8434f1b49719d403a5d26c87fff7e913f7"},
- {file = "mypy-1.19.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cb64b0ba5980466a0f3f9990d1c582bcab8db12e29815ecb57f1408d99b4bff7"},
- {file = "mypy-1.19.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:120cffe120cca5c23c03c77f84abc0c14c5d2e03736f6c312480020082f1994b"},
- {file = "mypy-1.19.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7a500ab5c444268a70565e374fc803972bfd1f09545b13418a5174e29883dab7"},
- {file = "mypy-1.19.0-cp311-cp311-win_amd64.whl", hash = "sha256:c14a98bc63fd867530e8ec82f217dae29d0550c86e70debc9667fff1ec83284e"},
- {file = "mypy-1.19.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0fb3115cb8fa7c5f887c8a8d81ccdcb94cff334684980d847e5a62e926910e1d"},
- {file = "mypy-1.19.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f3e19e3b897562276bb331074d64c076dbdd3e79213f36eed4e592272dabd760"},
- {file = "mypy-1.19.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b9d491295825182fba01b6ffe2c6fe4e5a49dbf4e2bb4d1217b6ced3b4797bc6"},
- {file = "mypy-1.19.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6016c52ab209919b46169651b362068f632efcd5eb8ef9d1735f6f86da7853b2"},
- {file = "mypy-1.19.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f188dcf16483b3e59f9278c4ed939ec0254aa8a60e8fc100648d9ab5ee95a431"},
- {file = "mypy-1.19.0-cp312-cp312-win_amd64.whl", hash = "sha256:0e3c3d1e1d62e678c339e7ade72746a9e0325de42cd2cccc51616c7b2ed1a018"},
- {file = "mypy-1.19.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7686ed65dbabd24d20066f3115018d2dce030d8fa9db01aa9f0a59b6813e9f9e"},
- {file = "mypy-1.19.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:fd4a985b2e32f23bead72e2fb4bbe5d6aceee176be471243bd831d5b2644672d"},
- {file = "mypy-1.19.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fc51a5b864f73a3a182584b1ac75c404396a17eced54341629d8bdcb644a5bba"},
- {file = "mypy-1.19.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:37af5166f9475872034b56c5efdcf65ee25394e9e1d172907b84577120714364"},
- {file = "mypy-1.19.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:510c014b722308c9bd377993bcbf9a07d7e0692e5fa8fc70e639c1eb19fc6bee"},
- {file = "mypy-1.19.0-cp313-cp313-win_amd64.whl", hash = "sha256:cabbee74f29aa9cd3b444ec2f1e4fa5a9d0d746ce7567a6a609e224429781f53"},
- {file = "mypy-1.19.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:f2e36bed3c6d9b5f35d28b63ca4b727cb0228e480826ffc8953d1892ddc8999d"},
- {file = "mypy-1.19.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a18d8abdda14035c5718acb748faec09571432811af129bf0d9e7b2d6699bf18"},
- {file = "mypy-1.19.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f75e60aca3723a23511948539b0d7ed514dda194bc3755eae0bfc7a6b4887aa7"},
- {file = "mypy-1.19.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8f44f2ae3c58421ee05fe609160343c25f70e3967f6e32792b5a78006a9d850f"},
- {file = "mypy-1.19.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:63ea6a00e4bd6822adbfc75b02ab3653a17c02c4347f5bb0cf1d5b9df3a05835"},
- {file = "mypy-1.19.0-cp314-cp314-win_amd64.whl", hash = "sha256:3ad925b14a0bb99821ff6f734553294aa6a3440a8cb082fe1f5b84dfb662afb1"},
- {file = "mypy-1.19.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0dde5cb375cb94deff0d4b548b993bec52859d1651e073d63a1386d392a95495"},
- {file = "mypy-1.19.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1cf9c59398db1c68a134b0b5354a09a1e124523f00bacd68e553b8bd16ff3299"},
- {file = "mypy-1.19.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3210d87b30e6af9c8faed61be2642fcbe60ef77cec64fa1ef810a630a4cf671c"},
- {file = "mypy-1.19.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e2c1101ab41d01303103ab6ef82cbbfedb81c1a060c868fa7cc013d573d37ab5"},
- {file = "mypy-1.19.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0ea4fd21bb48f0da49e6d3b37ef6bd7e8228b9fe41bbf4d80d9364d11adbd43c"},
- {file = "mypy-1.19.0-cp39-cp39-win_amd64.whl", hash = "sha256:16f76ff3f3fd8137aadf593cb4607d82634fca675e8211ad75c43d86033ee6c6"},
- {file = "mypy-1.19.0-py3-none-any.whl", hash = "sha256:0c01c99d626380752e527d5ce8e69ffbba2046eb8a060db0329690849cf9b6f9"},
- {file = "mypy-1.19.0.tar.gz", hash = "sha256:f6b874ca77f733222641e5c46e4711648c4037ea13646fd0cdc814c2eaec2528"},
-]
-
-[package.dependencies]
-librt = ">=0.6.2"
-mypy_extensions = ">=1.0.0"
-pathspec = ">=0.9.0"
-tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""}
-typing_extensions = ">=4.6.0"
-
-[package.extras]
-dmypy = ["psutil (>=4.0)"]
-faster-cache = ["orjson"]
-install-types = ["pip"]
-mypyc = ["setuptools (>=50)"]
-reports = ["lxml"]
-
-[[package]]
-name = "mypy-extensions"
-version = "1.1.0"
-description = "Type system extensions for programs checked with the mypy type checker."
-optional = false
-python-versions = ">=3.8"
-groups = ["dev"]
-files = [
- {file = "mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505"},
- {file = "mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558"},
-]
-
-[[package]]
-name = "numpy"
-version = "2.2.6"
-description = "Fundamental package for array computing in Python"
-optional = false
-python-versions = ">=3.10"
-groups = ["main", "dev"]
-files = [
- {file = "numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb"},
- {file = "numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90"},
- {file = "numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163"},
- {file = "numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf"},
- {file = "numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83"},
- {file = "numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915"},
- {file = "numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680"},
- {file = "numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289"},
- {file = "numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d"},
- {file = "numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3"},
- {file = "numpy-2.2.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f9f1adb22318e121c5c69a09142811a201ef17ab257a1e66ca3025065b7f53ae"},
- {file = "numpy-2.2.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c820a93b0255bc360f53eca31a0e676fd1101f673dda8da93454a12e23fc5f7a"},
- {file = "numpy-2.2.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3d70692235e759f260c3d837193090014aebdf026dfd167834bcba43e30c2a42"},
- {file = "numpy-2.2.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:481b49095335f8eed42e39e8041327c05b0f6f4780488f61286ed3c01368d491"},
- {file = "numpy-2.2.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b64d8d4d17135e00c8e346e0a738deb17e754230d7e0810ac5012750bbd85a5a"},
- {file = "numpy-2.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf"},
- {file = "numpy-2.2.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bd48227a919f1bafbdda0583705e547892342c26fb127219d60a5c36882609d1"},
- {file = "numpy-2.2.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9551a499bf125c1d4f9e250377c1ee2eddd02e01eac6644c080162c0c51778ab"},
- {file = "numpy-2.2.6-cp311-cp311-win32.whl", hash = "sha256:0678000bb9ac1475cd454c6b8c799206af8107e310843532b04d49649c717a47"},
- {file = "numpy-2.2.6-cp311-cp311-win_amd64.whl", hash = "sha256:e8213002e427c69c45a52bbd94163084025f533a55a59d6f9c5b820774ef3303"},
- {file = "numpy-2.2.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff"},
- {file = "numpy-2.2.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c"},
- {file = "numpy-2.2.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3"},
- {file = "numpy-2.2.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282"},
- {file = "numpy-2.2.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87"},
- {file = "numpy-2.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249"},
- {file = "numpy-2.2.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49"},
- {file = "numpy-2.2.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de"},
- {file = "numpy-2.2.6-cp312-cp312-win32.whl", hash = "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4"},
- {file = "numpy-2.2.6-cp312-cp312-win_amd64.whl", hash = "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2"},
- {file = "numpy-2.2.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84"},
- {file = "numpy-2.2.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b"},
- {file = "numpy-2.2.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d"},
- {file = "numpy-2.2.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566"},
- {file = "numpy-2.2.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f"},
- {file = "numpy-2.2.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f"},
- {file = "numpy-2.2.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868"},
- {file = "numpy-2.2.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d"},
- {file = "numpy-2.2.6-cp313-cp313-win32.whl", hash = "sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd"},
- {file = "numpy-2.2.6-cp313-cp313-win_amd64.whl", hash = "sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c"},
- {file = "numpy-2.2.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6"},
- {file = "numpy-2.2.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda"},
- {file = "numpy-2.2.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40"},
- {file = "numpy-2.2.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8"},
- {file = "numpy-2.2.6-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f"},
- {file = "numpy-2.2.6-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa"},
- {file = "numpy-2.2.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571"},
- {file = "numpy-2.2.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1"},
- {file = "numpy-2.2.6-cp313-cp313t-win32.whl", hash = "sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff"},
- {file = "numpy-2.2.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06"},
- {file = "numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d"},
- {file = "numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db"},
- {file = "numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543"},
- {file = "numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00"},
- {file = "numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd"},
-]
-
-[[package]]
-name = "opentelemetry-api"
-version = "1.25.0"
-description = "OpenTelemetry Python API"
-optional = false
-python-versions = ">=3.8"
-groups = ["dev"]
-files = [
- {file = "opentelemetry_api-1.25.0-py3-none-any.whl", hash = "sha256:757fa1aa020a0f8fa139f8959e53dec2051cc26b832e76fa839a6d76ecefd737"},
- {file = "opentelemetry_api-1.25.0.tar.gz", hash = "sha256:77c4985f62f2614e42ce77ee4c9da5fa5f0bc1e1821085e9a47533a9323ae869"},
-]
-
-[package.dependencies]
-deprecated = ">=1.2.6"
-importlib-metadata = ">=6.0,<=7.1"
-
-[[package]]
-name = "opentelemetry-sdk"
-version = "1.25.0"
-description = "OpenTelemetry Python SDK"
-optional = false
-python-versions = ">=3.8"
-groups = ["dev"]
-files = [
- {file = "opentelemetry_sdk-1.25.0-py3-none-any.whl", hash = "sha256:d97ff7ec4b351692e9d5a15af570c693b8715ad78b8aafbec5c7100fe966b4c9"},
- {file = "opentelemetry_sdk-1.25.0.tar.gz", hash = "sha256:ce7fc319c57707ef5bf8b74fb9f8ebdb8bfafbe11898410e0d2a761d08a98ec7"},
-]
-
-[package.dependencies]
-opentelemetry-api = "1.25.0"
-opentelemetry-semantic-conventions = "0.46b0"
-typing-extensions = ">=3.7.4"
-
-[[package]]
-name = "opentelemetry-semantic-conventions"
-version = "0.46b0"
-description = "OpenTelemetry Semantic Conventions"
-optional = false
-python-versions = ">=3.8"
-groups = ["dev"]
-files = [
- {file = "opentelemetry_semantic_conventions-0.46b0-py3-none-any.whl", hash = "sha256:6daef4ef9fa51d51855d9f8e0ccd3a1bd59e0e545abe99ac6203804e36ab3e07"},
- {file = "opentelemetry_semantic_conventions-0.46b0.tar.gz", hash = "sha256:fbc982ecbb6a6e90869b15c1673be90bd18c8a56ff1cffc0864e38e2edffaefa"},
-]
-
-[package.dependencies]
-opentelemetry-api = "1.25.0"
-
-[[package]]
-name = "packaging"
-version = "25.0"
-description = "Core utilities for Python packages"
-optional = false
-python-versions = ">=3.8"
-groups = ["dev"]
-files = [
- {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"},
- {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"},
-]
-
-[[package]]
-name = "pathspec"
-version = "0.12.1"
-description = "Utility library for gitignore style pattern matching of file paths."
-optional = false
-python-versions = ">=3.8"
-groups = ["dev"]
-files = [
- {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"},
- {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"},
-]
-
-[[package]]
-name = "pdoc"
-version = "16.0.0"
-description = "API Documentation for Python Projects"
-optional = false
-python-versions = ">=3.10"
-groups = ["dev"]
-files = [
- {file = "pdoc-16.0.0-py3-none-any.whl", hash = "sha256:070b51de2743b9b1a4e0ab193a06c9e6c12cf4151cf9137656eebb16e8556628"},
- {file = "pdoc-16.0.0.tar.gz", hash = "sha256:fdadc40cc717ec53919e3cd720390d4e3bcd40405cb51c4918c119447f913514"},
-]
-
-[package.dependencies]
-Jinja2 = ">=2.11.0"
-markdown2 = ">=2.5.4"
-MarkupSafe = ">=1.1.1"
-pygments = ">=2.12.0"
-
-[[package]]
-name = "platformdirs"
-version = "4.5.1"
-description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`."
-optional = false
-python-versions = ">=3.10"
-groups = ["dev"]
-files = [
- {file = "platformdirs-4.5.1-py3-none-any.whl", hash = "sha256:d03afa3963c806a9bed9d5125c8f4cb2fdaf74a55ab60e5d59b3fde758104d31"},
- {file = "platformdirs-4.5.1.tar.gz", hash = "sha256:61d5cdcc6065745cdd94f0f878977f8de9437be93de97c1c12f853c9c0cdcbda"},
-]
-
-[package.extras]
-docs = ["furo (>=2025.9.25)", "proselint (>=0.14)", "sphinx (>=8.2.3)", "sphinx-autodoc-typehints (>=3.2)"]
-test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.4.2)", "pytest-cov (>=7)", "pytest-mock (>=3.15.1)"]
-type = ["mypy (>=1.18.2)"]
-
-[[package]]
-name = "pluggy"
-version = "1.6.0"
-description = "plugin and hook calling mechanisms for python"
-optional = false
-python-versions = ">=3.9"
-groups = ["dev"]
-files = [
- {file = "pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746"},
- {file = "pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3"},
-]
-
-[package.extras]
-dev = ["pre-commit", "tox"]
-testing = ["coverage", "pytest", "pytest-benchmark"]
-
-[[package]]
-name = "pprintpp"
-version = "0.4.0"
-description = "A drop-in replacement for pprint that's actually pretty"
-optional = false
-python-versions = "*"
-groups = ["dev"]
-files = [
- {file = "pprintpp-0.4.0-py2.py3-none-any.whl", hash = "sha256:b6b4dcdd0c0c0d75e4d7b2f21a9e933e5b2ce62b26e1a54537f9651ae5a5c01d"},
- {file = "pprintpp-0.4.0.tar.gz", hash = "sha256:ea826108e2c7f49dc6d66c752973c3fc9749142a798d6b254e1e301cfdbc6403"},
-]
-
-[[package]]
-name = "pygments"
-version = "2.19.2"
-description = "Pygments is a syntax highlighting package written in Python."
-optional = false
-python-versions = ">=3.8"
-groups = ["dev"]
-files = [
- {file = "pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b"},
- {file = "pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887"},
-]
-
-[package.extras]
-windows-terminal = ["colorama (>=0.4.6)"]
-
-[[package]]
-name = "pyo3-linter"
-version = "0.0.1"
-description = "A linter for Rust code that uses PyO3 and rigetti-pyo3."
-optional = false
-python-versions = ">=3.10,<4"
-groups = ["dev"]
-files = []
-develop = false
-
-[package.dependencies]
-typing-extensions = "^4.15.0"
-
-[package.source]
-type = "git"
-url = "https://github.com/rigetti/rigetti-pyo3.git"
-reference = "feat-pyo3-linter"
-resolved_reference = "d43c02b77df8c23ca7a989a00166f3287f2e1e8b"
-subdirectory = "pyo3_linter"
-
-[[package]]
-name = "pytest"
-version = "9.0.1"
-description = "pytest: simple powerful testing with Python"
-optional = false
-python-versions = ">=3.10"
-groups = ["dev"]
-files = [
- {file = "pytest-9.0.1-py3-none-any.whl", hash = "sha256:67be0030d194df2dfa7b556f2e56fb3c3315bd5c8822c6951162b92b32ce7dad"},
- {file = "pytest-9.0.1.tar.gz", hash = "sha256:3e9c069ea73583e255c3b21cf46b8d3c56f6e3a1a8f6da94ccb0fcf57b9d73c8"},
-]
-
-[package.dependencies]
-colorama = {version = ">=0.4", markers = "sys_platform == \"win32\""}
-exceptiongroup = {version = ">=1", markers = "python_version < \"3.11\""}
-iniconfig = ">=1.0.1"
-packaging = ">=22"
-pluggy = ">=1.5,<2"
-pygments = ">=2.7.2"
-tomli = {version = ">=1", markers = "python_version < \"3.11\""}
-
-[package.extras]
-dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "requests", "setuptools", "xmlschema"]
-
-[[package]]
-name = "pytest-asyncio"
-version = "1.3.0"
-description = "Pytest support for asyncio"
-optional = false
-python-versions = ">=3.10"
-groups = ["dev"]
-files = [
- {file = "pytest_asyncio-1.3.0-py3-none-any.whl", hash = "sha256:611e26147c7f77640e6d0a92a38ed17c3e9848063698d5c93d5aa7aa11cebff5"},
- {file = "pytest_asyncio-1.3.0.tar.gz", hash = "sha256:d7f52f36d231b80ee124cd216ffb19369aa168fc10095013c6b014a34d3ee9e5"},
-]
-
-[package.dependencies]
-backports-asyncio-runner = {version = ">=1.1,<2", markers = "python_version < \"3.11\""}
-pytest = ">=8.2,<10"
-typing-extensions = {version = ">=4.12", markers = "python_version < \"3.13\""}
-
-[package.extras]
-docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1)"]
-testing = ["coverage (>=6.2)", "hypothesis (>=5.7.1)"]
-
-[[package]]
-name = "pytest-clarity"
-version = "1.0.1"
-description = "A plugin providing an alternative, colourful diff output for failing assertions."
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
-groups = ["dev"]
-files = [
- {file = "pytest-clarity-1.0.1.tar.gz", hash = "sha256:505fe345fad4fe11c6a4187fe683f2c7c52c077caa1e135f3e483fe112db7772"},
-]
-
-[package.dependencies]
-pprintpp = ">=0.4.0"
-pytest = ">=3.5.0"
-rich = ">=8.0.0"
-
-[[package]]
-name = "pytest-mock"
-version = "3.15.1"
-description = "Thin-wrapper around the mock package for easier use with pytest"
-optional = false
-python-versions = ">=3.9"
-groups = ["dev"]
-files = [
- {file = "pytest_mock-3.15.1-py3-none-any.whl", hash = "sha256:0a25e2eb88fe5168d535041d09a4529a188176ae608a6d249ee65abc0949630d"},
- {file = "pytest_mock-3.15.1.tar.gz", hash = "sha256:1849a238f6f396da19762269de72cb1814ab44416fa73a8686deac10b0d87a0f"},
-]
-
-[package.dependencies]
-pytest = ">=6.2.5"
-
-[package.extras]
-dev = ["pre-commit", "pytest-asyncio", "tox"]
-
-[[package]]
-name = "pytest-sugar"
-version = "1.1.1"
-description = "pytest-sugar is a plugin for pytest that changes the default look and feel of pytest (e.g. progressbar, show tests that fail instantly)."
-optional = false
-python-versions = "*"
-groups = ["dev"]
-files = [
- {file = "pytest-sugar-1.1.1.tar.gz", hash = "sha256:73b8b65163ebf10f9f671efab9eed3d56f20d2ca68bda83fa64740a92c08f65d"},
- {file = "pytest_sugar-1.1.1-py3-none-any.whl", hash = "sha256:2f8319b907548d5b9d03a171515c1d43d2e38e32bd8182a1781eb20b43344cc8"},
-]
-
-[package.dependencies]
-pytest = ">=6.2.0"
-termcolor = ">=2.1.0"
-
-[package.extras]
-dev = ["black", "flake8", "pre-commit"]
-
-[[package]]
-name = "pytokens"
-version = "0.3.0"
-description = "A Fast, spec compliant Python 3.14+ tokenizer that runs on older Pythons."
-optional = false
-python-versions = ">=3.8"
-groups = ["dev"]
-files = [
- {file = "pytokens-0.3.0-py3-none-any.whl", hash = "sha256:95b2b5eaf832e469d141a378872480ede3f251a5a5041b8ec6e581d3ac71bbf3"},
- {file = "pytokens-0.3.0.tar.gz", hash = "sha256:2f932b14ed08de5fcf0b391ace2642f858f1394c0857202959000b68ed7a458a"},
-]
-
-[package.extras]
-dev = ["black", "build", "mypy", "pytest", "pytest-cov", "setuptools", "tox", "twine", "wheel"]
-
-[[package]]
-name = "qcs-api-client-common"
-version = "0.15.0"
-description = "Contains core QCS client functionality and middleware implementations."
-optional = false
-python-versions = "<4,>=3.10"
-groups = ["main"]
-files = [
- {file = "qcs_api_client_common-0.15.0-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:429543fddd265635be0f12b0bd947434820b9a08a3e7c825d0e0421efbb3a299"},
- {file = "qcs_api_client_common-0.15.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:0446f4e4c34dca4c116aa47783e86ca1dfb13d8027b3c0be60c6be1b0b2e41df"},
- {file = "qcs_api_client_common-0.15.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:7bc82215c0fb7d0afaa574fe47d6fe14e4385871dbe6621d7c1224196a1d77e8"},
- {file = "qcs_api_client_common-0.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:59c2d152b2b5fb3ba2058e3bdb8b081a1c7746bf42f2e722f62ce3e029b135b0"},
- {file = "qcs_api_client_common-0.15.0-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:5afdc7cd07fcf4aab5c305c13b583e2153fa8aff694a56eb173df377fdb4237c"},
- {file = "qcs_api_client_common-0.15.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:b0e6c643d6289a0e7e8d425c5d3cf94d9424531d03f5ed3423ce72a8bfeb795f"},
- {file = "qcs_api_client_common-0.15.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:df922ff7c0e7df7f6b2a5eabc0924aedff086e106325c7c3b053985501b5f345"},
- {file = "qcs_api_client_common-0.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:ec2b1cc71a99d1012cbe0dfd898546d47ff276cf498f3658fe38c5857d40a4f3"},
- {file = "qcs_api_client_common-0.15.0-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:415d5c046e1a4a396c93ef8dbcff0463a096e82bd2e020abffbf8b2b32b7ecfa"},
- {file = "qcs_api_client_common-0.15.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:c8ed377b8995ef3fe8dcba3c0954c0937b6c9bb9b86b8b8b7f217efeeedff771"},
- {file = "qcs_api_client_common-0.15.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:56d13ef2e435a302c93b8c85365388226cec06ff7daf366b8fa7cdc40bf4b1c2"},
- {file = "qcs_api_client_common-0.15.0-cp312-cp312-win_amd64.whl", hash = "sha256:f1f592e600e062de1963c957dbd262b2bcbfae4be0e6d772860e3f2c62ca48ed"},
- {file = "qcs_api_client_common-0.15.0-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:5c815808b5f4187274f1340421080fc3717aaafa2e4fa448774a4baf80f993db"},
- {file = "qcs_api_client_common-0.15.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:97abc3bc7473ee33c0218f38f6bbd4c69900b364719d37ed89cc06c27fbe6c38"},
- {file = "qcs_api_client_common-0.15.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:c1d44e841040661dc8ea0dd59d7dc28de12afbe342d1c42d6cedba842ebe0776"},
- {file = "qcs_api_client_common-0.15.0-cp313-cp313-win_amd64.whl", hash = "sha256:6a61da3276d375055861605f3af2f3a61a0380368eb4aa8a08d3c04948978545"},
- {file = "qcs_api_client_common-0.15.0.tar.gz", hash = "sha256:33bc2923cd36d83a38a971f957ec1606244bd576be29f56e778deefb94a55320"},
-]
-
-[package.dependencies]
-grpc-interceptor = ">=0.15.0"
-grpcio = ">=1.63.0"
-httpx = ">=0.27.0"
-
-[[package]]
-name = "quil"
-version = "0.35.0"
-description = "A Python package for building and parsing Quil programs."
-optional = false
-python-versions = "<4,>=3.10"
-groups = ["main"]
-files = [
- {file = "quil-0.35.0-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:3aa6b195d9709339458482548faf065ec1047a97fd909b2cfa8ba1f94044fb50"},
- {file = "quil-0.35.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50f5c097698aaeddd5885b635cb130a077c44caeb41af9f92d731c756bb3a94d"},
- {file = "quil-0.35.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0930ac3a442a61ac5a1cc8a4aca4b0c18e83c3121741bdbe0080070e92495ce6"},
- {file = "quil-0.35.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:632239bbcc7edc7bec0e852f1cd642bf199df7e4a7d2f90e4ae7d5ae42472129"},
- {file = "quil-0.35.0-cp310-cp310-win_amd64.whl", hash = "sha256:937020e4fe1ea4856a7334816257360c22c60e6d841bc9af979723b367a97d06"},
- {file = "quil-0.35.0-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:8302252ae6ad798177351fc78a06ed00fd2192bec0c8098977e7211ca4487123"},
- {file = "quil-0.35.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebed22ff1569b7fdc79deba32c9df00cf72a044fc07d289a5738a22ed0f3d4db"},
- {file = "quil-0.35.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:61be747892679356626397b3e4322ac4d2c3a2e59863b72058f7117ec0349e61"},
- {file = "quil-0.35.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4828c63dcdd79d47c0d1776dd64dd2990a338c1109d9af4a4524ec38f48597d2"},
- {file = "quil-0.35.0-cp311-cp311-win_amd64.whl", hash = "sha256:2135e9fc788fbe08e4402c03b02718bd21619ac502833a3436d7129dcc9cfe06"},
- {file = "quil-0.35.0-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:21e688e2967125ca18f66320dbac8aef744fc02258ba2ace141d9a8fd32b0e16"},
- {file = "quil-0.35.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4be73ed73d85389647421c557d6d7848740312ca2a5fe7ac8a1bc99476d52d6"},
- {file = "quil-0.35.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:564667d580ac39a372d42cf1b461c9ce4c14b20c3dc0166100330b1bc426b517"},
- {file = "quil-0.35.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efd75e06a8d6f7f500115882f0d2ad681f406d825761ccb7f54cde2a66b16b58"},
- {file = "quil-0.35.0-cp312-cp312-win_amd64.whl", hash = "sha256:c37ebc76e0c3dfac7b9f5c5a8270f7b0397d67fea37ceb2c239cd6e826a2cd0f"},
- {file = "quil-0.35.0-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:045629e8a9bf41ca0b9f399c1fe7a4f75d0e25177d71d12d2c391a2a47c1596e"},
- {file = "quil-0.35.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7b0053442c4f912d4f6202ab97aa666ab3f04b32923c4fdf4a4cb11c7e50f92"},
- {file = "quil-0.35.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8bba8ff547698ddb92483d4c8fac229c4b7cebbbf1d570b93835164eddfb428f"},
- {file = "quil-0.35.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7fc7dc43344df869960c1c080aca86d44abd1c2e966f27d38f11b04364af92c"},
- {file = "quil-0.35.0-cp313-cp313-win_amd64.whl", hash = "sha256:831eebf082f9d54353b23802e762047b3ebd1e9faff20ea7ed20f850a9bd20c0"},
- {file = "quil-0.35.0.tar.gz", hash = "sha256:f6de3ab675b7c6be17b2f1b0bd9139e956b4a70e2073180d92a9b122e804ad8f"},
-]
-
-[package.dependencies]
-numpy = ">=1.26"
-
-[[package]]
-name = "rich"
-version = "14.2.0"
-description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal"
-optional = false
-python-versions = ">=3.8.0"
-groups = ["dev"]
-files = [
- {file = "rich-14.2.0-py3-none-any.whl", hash = "sha256:76bc51fe2e57d2b1be1f96c524b890b816e334ab4c1e45888799bfaab0021edd"},
- {file = "rich-14.2.0.tar.gz", hash = "sha256:73ff50c7c0c1c77c8243079283f4edb376f0f6442433aecb8ce7e6d0b92d1fe4"},
-]
-
-[package.dependencies]
-markdown-it-py = ">=2.2.0"
-pygments = ">=2.13.0,<3.0.0"
-
-[package.extras]
-jupyter = ["ipywidgets (>=7.5.1,<9)"]
-
-[[package]]
-name = "ruff"
-version = "0.14.8"
-description = "An extremely fast Python linter and code formatter, written in Rust."
-optional = false
-python-versions = ">=3.7"
-groups = ["dev"]
-files = [
- {file = "ruff-0.14.8-py3-none-linux_armv6l.whl", hash = "sha256:ec071e9c82eca417f6111fd39f7043acb53cd3fde9b1f95bbed745962e345afb"},
- {file = "ruff-0.14.8-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:8cdb162a7159f4ca36ce980a18c43d8f036966e7f73f866ac8f493b75e0c27e9"},
- {file = "ruff-0.14.8-py3-none-macosx_11_0_arm64.whl", hash = "sha256:2e2fcbefe91f9fad0916850edf0854530c15bd1926b6b779de47e9ab619ea38f"},
- {file = "ruff-0.14.8-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9d70721066a296f45786ec31916dc287b44040f553da21564de0ab4d45a869b"},
- {file = "ruff-0.14.8-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2c87e09b3cd9d126fc67a9ecd3b5b1d3ded2b9c7fce3f16e315346b9d05cfb52"},
- {file = "ruff-0.14.8-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d62cb310c4fbcb9ee4ac023fe17f984ae1e12b8a4a02e3d21489f9a2a5f730c"},
- {file = "ruff-0.14.8-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:1af35c2d62633d4da0521178e8a2641c636d2a7153da0bac1b30cfd4ccd91344"},
- {file = "ruff-0.14.8-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:25add4575ffecc53d60eed3f24b1e934493631b48ebbc6ebaf9d8517924aca4b"},
- {file = "ruff-0.14.8-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4c943d847b7f02f7db4201a0600ea7d244d8a404fbb639b439e987edcf2baf9a"},
- {file = "ruff-0.14.8-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb6e8bf7b4f627548daa1b69283dac5a296bfe9ce856703b03130732e20ddfe2"},
- {file = "ruff-0.14.8-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:7aaf2974f378e6b01d1e257c6948207aec6a9b5ba53fab23d0182efb887a0e4a"},
- {file = "ruff-0.14.8-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e5758ca513c43ad8a4ef13f0f081f80f08008f410790f3611a21a92421ab045b"},
- {file = "ruff-0.14.8-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:f74f7ba163b6e85a8d81a590363bf71618847e5078d90827749bfda1d88c9cdf"},
- {file = "ruff-0.14.8-py3-none-musllinux_1_2_i686.whl", hash = "sha256:eed28f6fafcc9591994c42254f5a5c5ca40e69a30721d2ab18bb0bb3baac3ab6"},
- {file = "ruff-0.14.8-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:21d48fa744c9d1cb8d71eb0a740c4dd02751a5de9db9a730a8ef75ca34cf138e"},
- {file = "ruff-0.14.8-py3-none-win32.whl", hash = "sha256:15f04cb45c051159baebb0f0037f404f1dc2f15a927418f29730f411a79bc4e7"},
- {file = "ruff-0.14.8-py3-none-win_amd64.whl", hash = "sha256:9eeb0b24242b5bbff3011409a739929f497f3fb5fe3b5698aba5e77e8c833097"},
- {file = "ruff-0.14.8-py3-none-win_arm64.whl", hash = "sha256:965a582c93c63fe715fd3e3f8aa37c4b776777203d8e1d8aa3cc0c14424a4b99"},
- {file = "ruff-0.14.8.tar.gz", hash = "sha256:774ed0dd87d6ce925e3b8496feb3a00ac564bea52b9feb551ecd17e0a23d1eed"},
-]
-
-[[package]]
-name = "syrupy"
-version = "5.0.0"
-description = "Pytest Snapshot Test Utility"
-optional = false
-python-versions = ">=3.10"
-groups = ["dev"]
-files = [
- {file = "syrupy-5.0.0-py3-none-any.whl", hash = "sha256:c848e1a980ca52a28715cd2d2b4d434db424699c05653bd1158fb31cf56e9546"},
- {file = "syrupy-5.0.0.tar.gz", hash = "sha256:3282fe963fa5d4d3e47231b16d1d4d0f4523705e8199eeb99a22a1bc9f5942f2"},
-]
-
-[package.dependencies]
-pytest = ">=8.0.0"
-
-[[package]]
-name = "termcolor"
-version = "3.2.0"
-description = "ANSI color formatting for output in terminal"
-optional = false
-python-versions = ">=3.10"
-groups = ["dev"]
-files = [
- {file = "termcolor-3.2.0-py3-none-any.whl", hash = "sha256:a10343879eba4da819353c55cb8049b0933890c2ebf9ad5d3ecd2bb32ea96ea6"},
- {file = "termcolor-3.2.0.tar.gz", hash = "sha256:610e6456feec42c4bcd28934a8c87a06c3fa28b01561d46aa09a9881b8622c58"},
-]
-
-[package.extras]
-tests = ["pytest", "pytest-cov"]
-
-[[package]]
-name = "tomli"
-version = "2.3.0"
-description = "A lil' TOML parser"
-optional = false
-python-versions = ">=3.8"
-groups = ["dev"]
-markers = "python_version == \"3.10\""
-files = [
- {file = "tomli-2.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:88bd15eb972f3664f5ed4b57c1634a97153b4bac4479dcb6a495f41921eb7f45"},
- {file = "tomli-2.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:883b1c0d6398a6a9d29b508c331fa56adbcdff647f6ace4dfca0f50e90dfd0ba"},
- {file = "tomli-2.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d1381caf13ab9f300e30dd8feadb3de072aeb86f1d34a8569453ff32a7dea4bf"},
- {file = "tomli-2.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a0e285d2649b78c0d9027570d4da3425bdb49830a6156121360b3f8511ea3441"},
- {file = "tomli-2.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a154a9ae14bfcf5d8917a59b51ffd5a3ac1fd149b71b47a3a104ca4edcfa845"},
- {file = "tomli-2.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:74bf8464ff93e413514fefd2be591c3b0b23231a77f901db1eb30d6f712fc42c"},
- {file = "tomli-2.3.0-cp311-cp311-win32.whl", hash = "sha256:00b5f5d95bbfc7d12f91ad8c593a1659b6387b43f054104cda404be6bda62456"},
- {file = "tomli-2.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:4dc4ce8483a5d429ab602f111a93a6ab1ed425eae3122032db7e9acf449451be"},
- {file = "tomli-2.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d7d86942e56ded512a594786a5ba0a5e521d02529b3826e7761a05138341a2ac"},
- {file = "tomli-2.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:73ee0b47d4dad1c5e996e3cd33b8a76a50167ae5f96a2607cbe8cc773506ab22"},
- {file = "tomli-2.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:792262b94d5d0a466afb5bc63c7daa9d75520110971ee269152083270998316f"},
- {file = "tomli-2.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4f195fe57ecceac95a66a75ac24d9d5fbc98ef0962e09b2eddec5d39375aae52"},
- {file = "tomli-2.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e31d432427dcbf4d86958c184b9bfd1e96b5b71f8eb17e6d02531f434fd335b8"},
- {file = "tomli-2.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b0882799624980785240ab732537fcfc372601015c00f7fc367c55308c186f6"},
- {file = "tomli-2.3.0-cp312-cp312-win32.whl", hash = "sha256:ff72b71b5d10d22ecb084d345fc26f42b5143c5533db5e2eaba7d2d335358876"},
- {file = "tomli-2.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:1cb4ed918939151a03f33d4242ccd0aa5f11b3547d0cf30f7c74a408a5b99878"},
- {file = "tomli-2.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5192f562738228945d7b13d4930baffda67b69425a7f0da96d360b0a3888136b"},
- {file = "tomli-2.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:be71c93a63d738597996be9528f4abe628d1adf5e6eb11607bc8fe1a510b5dae"},
- {file = "tomli-2.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c4665508bcbac83a31ff8ab08f424b665200c0e1e645d2bd9ab3d3e557b6185b"},
- {file = "tomli-2.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4021923f97266babc6ccab9f5068642a0095faa0a51a246a6a02fccbb3514eaf"},
- {file = "tomli-2.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4ea38c40145a357d513bffad0ed869f13c1773716cf71ccaa83b0fa0cc4e42f"},
- {file = "tomli-2.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ad805ea85eda330dbad64c7ea7a4556259665bdf9d2672f5dccc740eb9d3ca05"},
- {file = "tomli-2.3.0-cp313-cp313-win32.whl", hash = "sha256:97d5eec30149fd3294270e889b4234023f2c69747e555a27bd708828353ab606"},
- {file = "tomli-2.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0c95ca56fbe89e065c6ead5b593ee64b84a26fca063b5d71a1122bf26e533999"},
- {file = "tomli-2.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:cebc6fe843e0733ee827a282aca4999b596241195f43b4cc371d64fc6639da9e"},
- {file = "tomli-2.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4c2ef0244c75aba9355561272009d934953817c49f47d768070c3c94355c2aa3"},
- {file = "tomli-2.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c22a8bf253bacc0cf11f35ad9808b6cb75ada2631c2d97c971122583b129afbc"},
- {file = "tomli-2.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0eea8cc5c5e9f89c9b90c4896a8deefc74f518db5927d0e0e8d4a80953d774d0"},
- {file = "tomli-2.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b74a0e59ec5d15127acdabd75ea17726ac4c5178ae51b85bfe39c4f8a278e879"},
- {file = "tomli-2.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b5870b50c9db823c595983571d1296a6ff3e1b88f734a4c8f6fc6188397de005"},
- {file = "tomli-2.3.0-cp314-cp314-win32.whl", hash = "sha256:feb0dacc61170ed7ab602d3d972a58f14ee3ee60494292d384649a3dc38ef463"},
- {file = "tomli-2.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:b273fcbd7fc64dc3600c098e39136522650c49bca95df2d11cf3b626422392c8"},
- {file = "tomli-2.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:940d56ee0410fa17ee1f12b817b37a4d4e4dc4d27340863cc67236c74f582e77"},
- {file = "tomli-2.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f85209946d1fe94416debbb88d00eb92ce9cd5266775424ff81bc959e001acaf"},
- {file = "tomli-2.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a56212bdcce682e56b0aaf79e869ba5d15a6163f88d5451cbde388d48b13f530"},
- {file = "tomli-2.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c5f3ffd1e098dfc032d4d3af5c0ac64f6d286d98bc148698356847b80fa4de1b"},
- {file = "tomli-2.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e01decd096b1530d97d5d85cb4dff4af2d8347bd35686654a004f8dea20fc67"},
- {file = "tomli-2.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:8a35dd0e643bb2610f156cca8db95d213a90015c11fee76c946aa62b7ae7e02f"},
- {file = "tomli-2.3.0-cp314-cp314t-win32.whl", hash = "sha256:a1f7f282fe248311650081faafa5f4732bdbfef5d45fe3f2e702fbc6f2d496e0"},
- {file = "tomli-2.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:70a251f8d4ba2d9ac2542eecf008b3c8a9fc5c3f9f02c56a9d7952612be2fdba"},
- {file = "tomli-2.3.0-py3-none-any.whl", hash = "sha256:e95b1af3c5b07d9e643909b5abbec77cd9f1217e6d0bca72b0234736b9fb1f1b"},
- {file = "tomli-2.3.0.tar.gz", hash = "sha256:64be704a875d2a59753d80ee8a533c3fe183e3f06807ff7dc2232938ccb01549"},
-]
-
-[[package]]
-name = "typing-extensions"
-version = "4.15.0"
-description = "Backported and Experimental Type Hints for Python 3.9+"
-optional = false
-python-versions = ">=3.9"
-groups = ["main", "dev"]
-files = [
- {file = "typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"},
- {file = "typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466"},
-]
-
-[[package]]
-name = "wrapt"
-version = "2.0.1"
-description = "Module for decorators, wrappers and monkey patching."
-optional = false
-python-versions = ">=3.8"
-groups = ["dev"]
-files = [
- {file = "wrapt-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:64b103acdaa53b7caf409e8d45d39a8442fe6dcfec6ba3f3d141e0cc2b5b4dbd"},
- {file = "wrapt-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:91bcc576260a274b169c3098e9a3519fb01f2989f6d3d386ef9cbf8653de1374"},
- {file = "wrapt-2.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ab594f346517010050126fcd822697b25a7031d815bb4fbc238ccbe568216489"},
- {file = "wrapt-2.0.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:36982b26f190f4d737f04a492a68accbfc6fa042c3f42326fdfbb6c5b7a20a31"},
- {file = "wrapt-2.0.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:23097ed8bc4c93b7bf36fa2113c6c733c976316ce0ee2c816f64ca06102034ef"},
- {file = "wrapt-2.0.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8bacfe6e001749a3b64db47bcf0341da757c95959f592823a93931a422395013"},
- {file = "wrapt-2.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8ec3303e8a81932171f455f792f8df500fc1a09f20069e5c16bd7049ab4e8e38"},
- {file = "wrapt-2.0.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:3f373a4ab5dbc528a94334f9fe444395b23c2f5332adab9ff4ea82f5a9e33bc1"},
- {file = "wrapt-2.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f49027b0b9503bf6c8cdc297ca55006b80c2f5dd36cecc72c6835ab6e10e8a25"},
- {file = "wrapt-2.0.1-cp310-cp310-win32.whl", hash = "sha256:8330b42d769965e96e01fa14034b28a2a7600fbf7e8f0cc90ebb36d492c993e4"},
- {file = "wrapt-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:1218573502a8235bb8a7ecaed12736213b22dcde9feab115fa2989d42b5ded45"},
- {file = "wrapt-2.0.1-cp310-cp310-win_arm64.whl", hash = "sha256:eda8e4ecd662d48c28bb86be9e837c13e45c58b8300e43ba3c9b4fa9900302f7"},
- {file = "wrapt-2.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0e17283f533a0d24d6e5429a7d11f250a58d28b4ae5186f8f47853e3e70d2590"},
- {file = "wrapt-2.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:85df8d92158cb8f3965aecc27cf821461bb5f40b450b03facc5d9f0d4d6ddec6"},
- {file = "wrapt-2.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c1be685ac7700c966b8610ccc63c3187a72e33cab53526a27b2a285a662cd4f7"},
- {file = "wrapt-2.0.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:df0b6d3b95932809c5b3fecc18fda0f1e07452d05e2662a0b35548985f256e28"},
- {file = "wrapt-2.0.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4da7384b0e5d4cae05c97cd6f94faaf78cc8b0f791fc63af43436d98c4ab37bb"},
- {file = "wrapt-2.0.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ec65a78fbd9d6f083a15d7613b2800d5663dbb6bb96003899c834beaa68b242c"},
- {file = "wrapt-2.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7de3cc939be0e1174969f943f3b44e0d79b6f9a82198133a5b7fc6cc92882f16"},
- {file = "wrapt-2.0.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:fb1a5b72cbd751813adc02ef01ada0b0d05d3dcbc32976ce189a1279d80ad4a2"},
- {file = "wrapt-2.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3fa272ca34332581e00bf7773e993d4f632594eb2d1b0b162a9038df0fd971dd"},
- {file = "wrapt-2.0.1-cp311-cp311-win32.whl", hash = "sha256:fc007fdf480c77301ab1afdbb6ab22a5deee8885f3b1ed7afcb7e5e84a0e27be"},
- {file = "wrapt-2.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:47434236c396d04875180171ee1f3815ca1eada05e24a1ee99546320d54d1d1b"},
- {file = "wrapt-2.0.1-cp311-cp311-win_arm64.whl", hash = "sha256:837e31620e06b16030b1d126ed78e9383815cbac914693f54926d816d35d8edf"},
- {file = "wrapt-2.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1fdbb34da15450f2b1d735a0e969c24bdb8d8924892380126e2a293d9902078c"},
- {file = "wrapt-2.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3d32794fe940b7000f0519904e247f902f0149edbe6316c710a8562fb6738841"},
- {file = "wrapt-2.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:386fb54d9cd903ee0012c09291336469eb7b244f7183d40dc3e86a16a4bace62"},
- {file = "wrapt-2.0.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7b219cb2182f230676308cdcacd428fa837987b89e4b7c5c9025088b8a6c9faf"},
- {file = "wrapt-2.0.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:641e94e789b5f6b4822bb8d8ebbdfc10f4e4eae7756d648b717d980f657a9eb9"},
- {file = "wrapt-2.0.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fe21b118b9f58859b5ebaa4b130dee18669df4bd111daad082b7beb8799ad16b"},
- {file = "wrapt-2.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:17fb85fa4abc26a5184d93b3efd2dcc14deb4b09edcdb3535a536ad34f0b4dba"},
- {file = "wrapt-2.0.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:b89ef9223d665ab255ae42cc282d27d69704d94be0deffc8b9d919179a609684"},
- {file = "wrapt-2.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a453257f19c31b31ba593c30d997d6e5be39e3b5ad9148c2af5a7314061c63eb"},
- {file = "wrapt-2.0.1-cp312-cp312-win32.whl", hash = "sha256:3e271346f01e9c8b1130a6a3b0e11908049fe5be2d365a5f402778049147e7e9"},
- {file = "wrapt-2.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:2da620b31a90cdefa9cd0c2b661882329e2e19d1d7b9b920189956b76c564d75"},
- {file = "wrapt-2.0.1-cp312-cp312-win_arm64.whl", hash = "sha256:aea9c7224c302bc8bfc892b908537f56c430802560e827b75ecbde81b604598b"},
- {file = "wrapt-2.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:47b0f8bafe90f7736151f61482c583c86b0693d80f075a58701dd1549b0010a9"},
- {file = "wrapt-2.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:cbeb0971e13b4bd81d34169ed57a6dda017328d1a22b62fda45e1d21dd06148f"},
- {file = "wrapt-2.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eb7cffe572ad0a141a7886a1d2efa5bef0bf7fe021deeea76b3ab334d2c38218"},
- {file = "wrapt-2.0.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c8d60527d1ecfc131426b10d93ab5d53e08a09c5fa0175f6b21b3252080c70a9"},
- {file = "wrapt-2.0.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c654eafb01afac55246053d67a4b9a984a3567c3808bb7df2f8de1c1caba2e1c"},
- {file = "wrapt-2.0.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:98d873ed6c8b4ee2418f7afce666751854d6d03e3c0ec2a399bb039cd2ae89db"},
- {file = "wrapt-2.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c9e850f5b7fc67af856ff054c71690d54fa940c3ef74209ad9f935b4f66a0233"},
- {file = "wrapt-2.0.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:e505629359cb5f751e16e30cf3f91a1d3ddb4552480c205947da415d597f7ac2"},
- {file = "wrapt-2.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2879af909312d0baf35f08edeea918ee3af7ab57c37fe47cb6a373c9f2749c7b"},
- {file = "wrapt-2.0.1-cp313-cp313-win32.whl", hash = "sha256:d67956c676be5a24102c7407a71f4126d30de2a569a1c7871c9f3cabc94225d7"},
- {file = "wrapt-2.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:9ca66b38dd642bf90c59b6738af8070747b610115a39af2498535f62b5cdc1c3"},
- {file = "wrapt-2.0.1-cp313-cp313-win_arm64.whl", hash = "sha256:5a4939eae35db6b6cec8e7aa0e833dcca0acad8231672c26c2a9ab7a0f8ac9c8"},
- {file = "wrapt-2.0.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a52f93d95c8d38fed0669da2ebdb0b0376e895d84596a976c15a9eb45e3eccb3"},
- {file = "wrapt-2.0.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4e54bbf554ee29fcceee24fa41c4d091398b911da6e7f5d7bffda963c9aed2e1"},
- {file = "wrapt-2.0.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:908f8c6c71557f4deaa280f55d0728c3bca0960e8c3dd5ceeeafb3c19942719d"},
- {file = "wrapt-2.0.1-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e2f84e9af2060e3904a32cea9bb6db23ce3f91cfd90c6b426757cf7cc01c45c7"},
- {file = "wrapt-2.0.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e3612dc06b436968dfb9142c62e5dfa9eb5924f91120b3c8ff501ad878f90eb3"},
- {file = "wrapt-2.0.1-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6d2d947d266d99a1477cd005b23cbd09465276e302515e122df56bb9511aca1b"},
- {file = "wrapt-2.0.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:7d539241e87b650cbc4c3ac9f32c8d1ac8a54e510f6dca3f6ab60dcfd48c9b10"},
- {file = "wrapt-2.0.1-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:4811e15d88ee62dbf5c77f2c3ff3932b1e3ac92323ba3912f51fc4016ce81ecf"},
- {file = "wrapt-2.0.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c1c91405fcf1d501fa5d55df21e58ea49e6b879ae829f1039faaf7e5e509b41e"},
- {file = "wrapt-2.0.1-cp313-cp313t-win32.whl", hash = "sha256:e76e3f91f864e89db8b8d2a8311d57df93f01ad6bb1e9b9976d1f2e83e18315c"},
- {file = "wrapt-2.0.1-cp313-cp313t-win_amd64.whl", hash = "sha256:83ce30937f0ba0d28818807b303a412440c4b63e39d3d8fc036a94764b728c92"},
- {file = "wrapt-2.0.1-cp313-cp313t-win_arm64.whl", hash = "sha256:4b55cacc57e1dc2d0991dbe74c6419ffd415fb66474a02335cb10efd1aa3f84f"},
- {file = "wrapt-2.0.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:5e53b428f65ece6d9dad23cb87e64506392b720a0b45076c05354d27a13351a1"},
- {file = "wrapt-2.0.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ad3ee9d0f254851c71780966eb417ef8e72117155cff04821ab9b60549694a55"},
- {file = "wrapt-2.0.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d7b822c61ed04ee6ad64bc90d13368ad6eb094db54883b5dde2182f67a7f22c0"},
- {file = "wrapt-2.0.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7164a55f5e83a9a0b031d3ffab4d4e36bbec42e7025db560f225489fa929e509"},
- {file = "wrapt-2.0.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e60690ba71a57424c8d9ff28f8d006b7ad7772c22a4af432188572cd7fa004a1"},
- {file = "wrapt-2.0.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3cd1a4bd9a7a619922a8557e1318232e7269b5fb69d4ba97b04d20450a6bf970"},
- {file = "wrapt-2.0.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b4c2e3d777e38e913b8ce3a6257af72fb608f86a1df471cb1d4339755d0a807c"},
- {file = "wrapt-2.0.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:3d366aa598d69416b5afedf1faa539fac40c1d80a42f6b236c88c73a3c8f2d41"},
- {file = "wrapt-2.0.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c235095d6d090aa903f1db61f892fffb779c1eaeb2a50e566b52001f7a0f66ed"},
- {file = "wrapt-2.0.1-cp314-cp314-win32.whl", hash = "sha256:bfb5539005259f8127ea9c885bdc231978c06b7a980e63a8a61c8c4c979719d0"},
- {file = "wrapt-2.0.1-cp314-cp314-win_amd64.whl", hash = "sha256:4ae879acc449caa9ed43fc36ba08392b9412ee67941748d31d94e3cedb36628c"},
- {file = "wrapt-2.0.1-cp314-cp314-win_arm64.whl", hash = "sha256:8639b843c9efd84675f1e100ed9e99538ebea7297b62c4b45a7042edb84db03e"},
- {file = "wrapt-2.0.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:9219a1d946a9b32bb23ccae66bdb61e35c62773ce7ca6509ceea70f344656b7b"},
- {file = "wrapt-2.0.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:fa4184e74197af3adad3c889a1af95b53bb0466bced92ea99a0c014e48323eec"},
- {file = "wrapt-2.0.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c5ef2f2b8a53b7caee2f797ef166a390fef73979b15778a4a153e4b5fedce8fa"},
- {file = "wrapt-2.0.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e042d653a4745be832d5aa190ff80ee4f02c34b21f4b785745eceacd0907b815"},
- {file = "wrapt-2.0.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2afa23318136709c4b23d87d543b425c399887b4057936cd20386d5b1422b6fa"},
- {file = "wrapt-2.0.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6c72328f668cf4c503ffcf9434c2b71fdd624345ced7941bc6693e61bbe36bef"},
- {file = "wrapt-2.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:3793ac154afb0e5b45d1233cb94d354ef7a983708cc3bb12563853b1d8d53747"},
- {file = "wrapt-2.0.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:fec0d993ecba3991645b4857837277469c8cc4c554a7e24d064d1ca291cfb81f"},
- {file = "wrapt-2.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:949520bccc1fa227274da7d03bf238be15389cd94e32e4297b92337df9b7a349"},
- {file = "wrapt-2.0.1-cp314-cp314t-win32.whl", hash = "sha256:be9e84e91d6497ba62594158d3d31ec0486c60055c49179edc51ee43d095f79c"},
- {file = "wrapt-2.0.1-cp314-cp314t-win_amd64.whl", hash = "sha256:61c4956171c7434634401db448371277d07032a81cc21c599c22953374781395"},
- {file = "wrapt-2.0.1-cp314-cp314t-win_arm64.whl", hash = "sha256:35cdbd478607036fee40273be8ed54a451f5f23121bd9d4be515158f9498f7ad"},
- {file = "wrapt-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:90897ea1cf0679763b62e79657958cd54eae5659f6360fc7d2ccc6f906342183"},
- {file = "wrapt-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:50844efc8cdf63b2d90cd3d62d4947a28311e6266ce5235a219d21b195b4ec2c"},
- {file = "wrapt-2.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:49989061a9977a8cbd6d20f2efa813f24bf657c6990a42967019ce779a878dbf"},
- {file = "wrapt-2.0.1-cp38-cp38-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:09c7476ab884b74dce081ad9bfd07fe5822d8600abade571cb1f66d5fc915af6"},
- {file = "wrapt-2.0.1-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d1a8a09a004ef100e614beec82862d11fc17d601092c3599afd22b1f36e4137e"},
- {file = "wrapt-2.0.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:89a82053b193837bf93c0f8a57ded6e4b6d88033a499dadff5067e912c2a41e9"},
- {file = "wrapt-2.0.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:f26f8e2ca19564e2e1fdbb6a0e47f36e0efbab1acc31e15471fad88f828c75f6"},
- {file = "wrapt-2.0.1-cp38-cp38-win32.whl", hash = "sha256:115cae4beed3542e37866469a8a1f2b9ec549b4463572b000611e9946b86e6f6"},
- {file = "wrapt-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:c4012a2bd37059d04f8209916aa771dfb564cccb86079072bdcd48a308b6a5c5"},
- {file = "wrapt-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:68424221a2dc00d634b54f92441914929c5ffb1c30b3b837343978343a3512a3"},
- {file = "wrapt-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6bd1a18f5a797fe740cb3d7a0e853a8ce6461cc62023b630caec80171a6b8097"},
- {file = "wrapt-2.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fb3a86e703868561c5cad155a15c36c716e1ab513b7065bd2ac8ed353c503333"},
- {file = "wrapt-2.0.1-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:5dc1b852337c6792aa111ca8becff5bacf576bf4a0255b0f05eb749da6a1643e"},
- {file = "wrapt-2.0.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c046781d422f0830de6329fa4b16796096f28a92c8aef3850674442cdcb87b7f"},
- {file = "wrapt-2.0.1-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f73f9f7a0ebd0db139253d27e5fc8d2866ceaeef19c30ab5d69dcbe35e1a6981"},
- {file = "wrapt-2.0.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:b667189cf8efe008f55bbda321890bef628a67ab4147ebf90d182f2dadc78790"},
- {file = "wrapt-2.0.1-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:a9a83618c4f0757557c077ef71d708ddd9847ed66b7cc63416632af70d3e2308"},
- {file = "wrapt-2.0.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1e9b121e9aeb15df416c2c960b8255a49d44b4038016ee17af03975992d03931"},
- {file = "wrapt-2.0.1-cp39-cp39-win32.whl", hash = "sha256:1f186e26ea0a55f809f232e92cc8556a0977e00183c3ebda039a807a42be1494"},
- {file = "wrapt-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:bf4cb76f36be5de950ce13e22e7fdf462b35b04665a12b64f3ac5c1bbbcf3728"},
- {file = "wrapt-2.0.1-cp39-cp39-win_arm64.whl", hash = "sha256:d6cc985b9c8b235bd933990cdbf0f891f8e010b65a3911f7a55179cd7b0fc57b"},
- {file = "wrapt-2.0.1-py3-none-any.whl", hash = "sha256:4d2ce1bf1a48c5277d7969259232b57645aae5686dba1eaeade39442277afbca"},
- {file = "wrapt-2.0.1.tar.gz", hash = "sha256:9c9c635e78497cacb81e84f8b11b23e0aacac7a136e73b8e5b2109a1d9fc468f"},
-]
-
-[package.extras]
-dev = ["pytest", "setuptools"]
-
-[[package]]
-name = "zipp"
-version = "3.23.0"
-description = "Backport of pathlib-compatible object wrapper for zip files"
-optional = false
-python-versions = ">=3.9"
-groups = ["dev"]
-files = [
- {file = "zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e"},
- {file = "zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166"},
-]
-
-[package.extras]
-check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""]
-cover = ["pytest-cov"]
-doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
-enabler = ["pytest-enabler (>=2.2)"]
-test = ["big-O", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more_itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"]
-type = ["pytest-mypy"]
-
-[metadata]
-lock-version = "2.1"
-python-versions = ">=3.10,<4"
-content-hash = "26879ff6adc0c0ffd7c1683d023fa1846b89b850e4fcf6b12f9e0500b2ea137f"
diff --git a/crates/lib/poetry.toml b/crates/lib/poetry.toml
deleted file mode 100644
index aec3c719e..000000000
--- a/crates/lib/poetry.toml
+++ /dev/null
@@ -1,4 +0,0 @@
-[virtualenvs]
-create = true
-in-project = true
-
diff --git a/crates/lib/pyproject.toml b/crates/lib/pyproject.toml
index ddbea81c1..5494e54eb 100644
--- a/crates/lib/pyproject.toml
+++ b/crates/lib/pyproject.toml
@@ -1,30 +1,44 @@
-# This is the metadata Maturin uploads to PyPI on publish
[project]
name = "qcs-sdk-python"
version = "0.26.3"
-requires-python = ">=3.10,<4"
description = "Python interface for the QCS Rust SDK"
-readme = "README-py.md"
-license = { text = "Apache-2.0" }
authors = [
- { name = "Rigetti Computing", email = "softapps@rigetti.com" },
- { name = "Mark Skilbeck", email = "mark.skilbeck@rigetti.com" },
- { name = "Marquess Valdez", email = "mvaldez@rigetti.com" },
- { name = "Randall Fulton", email = "rfulton@rigetti.com" },
+ { name = "Rigetti QPU Software", email = "qpu-software@rigetti.com" },
]
+requires-python = ">=3.10,<4"
+readme = "README-py.md"
+license = { text = "Apache-2.0" }
classifiers = [
- "Development Status :: 3 - Alpha",
- "License :: OSI Approved :: Apache Software License",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Programming Language :: Python :: 3.12",
- "Programming Language :: Python :: 3.13",
- "Operating System :: OS Independent",
+ "Development Status :: 3 - Alpha",
+ "License :: OSI Approved :: Apache Software License",
+ "Programming Language :: Python :: 3.10",
+ "Programming Language :: Python :: 3.11",
+ "Programming Language :: Python :: 3.12",
+ "Programming Language :: Python :: 3.13",
+ "Operating System :: OS Independent",
]
-
dependencies = [
- "quil>=0.35.0,<0.37.0",
- "qcs-api-client-common>=0.15.0,<0.16.0",
+ "quil>=0.37.1,<0.38.0",
+ "qcs-api-client-common>=0.19.0,<0.20.0",
+]
+
+[dependency-groups]
+dev = [
+ "griffe>=1.14.0,<2",
+ "black>=24.8.0",
+ "opentelemetry-sdk==1.25.0",
+ "pytest>=8.1.1",
+ "pytest-asyncio>=0.23.6",
+ "pytest-mock>=3.14.0",
+ "pytest-sugar>=1.0.0",
+ "pytest-clarity>=1.0.1",
+ "syrupy>=4.0.0",
+ "maturin>=1.9.4",
+ "numpy>=1.24.1",
+ "pdoc>=16.0.0",
+ "ruff>=0.3.5",
+ "mypy>=1.14.1",
+ "pyo3_linter",
]
[tool.maturin]
@@ -36,6 +50,19 @@ module-name = "qcs_sdk._qcs_sdk"
sdist-include = ["README-py.md", "THIRDPARTY.yaml"]
compatibility = "linux"
+[tool.uv]
+package = false
+default-groups = "all"
+
+[tool.uv.sources]
+pyo3_linter = { git = "https://github.com/rigetti/rigetti-pyo3.git", branch = "feat-pyo3-linter", subdirectory = "pyo3_linter" }
+
+[tool.pyo3-stub-gen]
+# Generate an `__init__.py` for every module with a `reexport_module_members!`
+# declaration in `src/python/mod.rs`. Note that this *overwrites* those files on
+# every run, so they must not be edited by hand.
+generate-init-py = true
+
[build-system]
requires = ["maturin>=1.9.4,<2.0.0"] # coordinate this with .github/workflows/release-python.yml
build-backend = "maturin"
@@ -50,26 +77,6 @@ include = '\.pyi?$'
# necessarily the case for a pure Rust pyo3 module, so disabling it.
reportMissingModuleSource = false
-[tool.poetry]
-package-mode = false
-
-[tool.poetry.group.dev.dependencies]
-griffe = "^1.14.0"
-black = ">=24.8.0"
-opentelemetry-sdk = "1.25.0"
-pytest = ">=8.1.1"
-pytest-asyncio = ">=0.23.6"
-pytest-mock = ">=3.14.0"
-pytest-sugar = ">=1.0.0"
-pytest-clarity = ">=1.0.1"
-syrupy = ">=4.0.0"
-maturin = ">=1.9.4" # TODO coordinate this with .github/workflows/release-python.yml
-numpy = ">=1.24.1"
-pdoc = ">=16.0.0"
-ruff = ">=0.3.5"
-mypy = ">=1.14.1"
-pyo3_linter = { git = "https://github.com/rigetti/rigetti-pyo3.git", branch = "feat-pyo3-linter", subdirectory = "pyo3_linter" }
-
[tool.pytest.ini_options]
addopts = [
"--ignore=scripts",
@@ -109,6 +116,14 @@ indent-width = 4
target-version = "py39"
[tool.ruff.lint]
+# Don't lint generated files: the type stubs and the `__init__.py` files that pyo3_stub_gen
+# generates alongside them, plus the `_tracing_subscriber` package generated by
+# pyo3-tracing-subscriber-build. This is a lint-only exclusion rather than a top-level one so
+# that `ruff format` still reaches them; `generate-stubs` formats them after writing them.
+exclude = [
+ "python/qcs_sdk/**/*.pyi",
+ "python/qcs_sdk/**/__init__.py",
+]
select = ["D", "E4", "E7", "E9", "F", "I", "B", "S", "W"]
ignore = [
"E741" # "Ambiguous" variable names like "I" aren't ambiguous in this contex.
@@ -124,7 +139,7 @@ dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$"
"D100", # docstrings belong in type stubs
"D104",
]
-"test/**/*.py" = [
+"tests_py/**/*.py" = [
"D", # docstrings are not enforced in tests
"S101", # asserts are allowed in tests
"S301", # we need to test pickling
diff --git a/crates/lib/python/qcs_sdk/__init__.py b/crates/lib/python/qcs_sdk/__init__.py
index d64d7b300..9b9e56d7f 100644
--- a/crates/lib/python/qcs_sdk/__init__.py
+++ b/crates/lib/python/qcs_sdk/__init__.py
@@ -1,23 +1,56 @@
-"""An interface to Rigetti [Quantum Cloud Services](https://docs.rigetti.com/qcs/) (QCS).
+# This file is automatically generated by pyo3_stub_gen
+# ruff: noqa: F401
-These APIs allow users to compile and run Quil programs on Rigetti quantum processors.
-Internally, it is powered by the [QCS Rust SDK](https://github.com/rigetti/qcs-sdk-rust).
-
-This package is still in development and breaking changes should be expected between minor versions.
-"""
-
-from . import _qcs_sdk
-from .client import QCSClient # noqa: re-export
+from qcs_sdk import _tracing_subscriber
+from qcs_sdk._qcs_sdk import (
+ ExeParameter,
+ Executable,
+ ExecutionData,
+ ExecutionError,
+ JobHandle,
+ QcsSdkError,
+ RegisterData,
+ RegisterMap,
+ RegisterMapItemsIter,
+ RegisterMapKeysIter,
+ RegisterMapValuesIter,
+ RegisterMatrix,
+ RegisterMatrixConversionError,
+ Service,
+ __doc__,
+ __version__,
+ client,
+ compiler,
+ diagnostics,
+ qpu,
+ qvm,
+ reset_logging,
+)
+from qcs_sdk._qcs_sdk.client import QCSClient
-_additional_exports = [
+__all__ = [
+ "ExeParameter",
+ "Executable",
+ "ExecutionData",
+ "ExecutionError",
+ "JobHandle",
"QCSClient",
+ "QcsSdkError",
+ "RegisterData",
+ "RegisterMap",
+ "RegisterMapItemsIter",
+ "RegisterMapKeysIter",
+ "RegisterMapValuesIter",
+ "RegisterMatrix",
+ "RegisterMatrixConversionError",
+ "Service",
+ "__doc__",
+ "__version__",
+ "_tracing_subscriber",
+ "client",
+ "compiler",
+ "diagnostics",
+ "qpu",
+ "qvm",
+ "reset_logging",
]
-
-# The following code exposes the package contents under the same namespace without the `_` prefix.
-assert isinstance(_qcs_sdk.__all__, list) and all(isinstance(s, str) for s in _qcs_sdk.__all__)
-exec(
- f"from ._qcs_sdk import {', '.join(_qcs_sdk.__all__)}; "
- f"__all__ = {_qcs_sdk.__all__ + _additional_exports}"
-)
-del _qcs_sdk
-
diff --git a/crates/lib/python/qcs_sdk/__init__.pyi b/crates/lib/python/qcs_sdk/_qcs_sdk/__init__.pyi
similarity index 76%
rename from crates/lib/python/qcs_sdk/__init__.pyi
rename to crates/lib/python/qcs_sdk/_qcs_sdk/__init__.pyi
index 2cc59dec7..1788a858b 100644
--- a/crates/lib/python/qcs_sdk/__init__.pyi
+++ b/crates/lib/python/qcs_sdk/_qcs_sdk/__init__.pyi
@@ -1,5 +1,13 @@
# This file is automatically generated by pyo3_stub_gen
-# ruff: noqa: E501, F401
+# ruff: noqa: E501, F401, F403, F405
+r"""
+An interface to Rigetti [Quantum Cloud Services](https://docs.rigetti.com/qcs/) (QCS).
+
+These APIs allow users to compile and run Quil programs on Rigetti quantum processors.
+Internally, it is powered by the [QCS Rust SDK](https://github.com/rigetti/qcs-sdk-rust).
+
+This package is still in development and breaking changes should be expected between minor versions.
+"""
import builtins
import collections.abc
@@ -7,24 +15,46 @@ import datetime
import enum
import numpy
import numpy.typing
+from qcs_sdk._qcs_sdk.compiler import quilc
+from qcs_sdk._qcs_sdk.qpu import api
+from qcs_sdk._qcs_sdk.qpu import translation
import typing
-from qcs_sdk.compiler.quilc import CompilerOpts, QuilcClient
-from qcs_sdk.qpu import QPUResultData
-from qcs_sdk.qpu.api import ExecutionOptions
-from qcs_sdk.qpu.translation import TranslationOptions
-from qcs_sdk.qvm import QVMClient, QVMResultData
from . import client
from . import compiler
from . import diagnostics
from . import qpu
from . import qvm
+__all__ = [
+ "ExeParameter",
+ "Executable",
+ "ExecutionData",
+ "ExecutionError",
+ "JobHandle",
+ "QcsSdkError",
+ "RegisterData",
+ "RegisterMap",
+ "RegisterMapItemsIter",
+ "RegisterMapKeysIter",
+ "RegisterMapValuesIter",
+ "RegisterMatrix",
+ "RegisterMatrixConversionError",
+ "Service",
+ "client",
+ "compiler",
+ "diagnostics",
+ "qpu",
+ "qvm",
+ "reset_logging",
+]
+
__version__: typing.Final[builtins.str]
+
@typing.final
class ExeParameter:
r"""
Program execution parameters.
-
+
Note: The validity of parameters is not checked until execution.
"""
@property
@@ -45,26 +75,26 @@ class ExeParameter:
class Executable:
r"""
A builder interface for executing Quil programs on QVMs and QPUs.
-
+
# Example
-
+
This example executes a program on a QVM, specified by the `qvm_url` in the `QCSClient`:
-
+
```python
from qcs_sdk import Executable
from qcs_sdk.client import QCSClient
from qcs_sdk.qvm import QVMClient
-
+
PROGRAM = r'''
DECLARE ro BIT[2]
-
+
H 0
CNOT 0 1
-
+
MEASURE 0 ro[0]
MEASURE 1 ro[1]
'''
-
+
async def run():
client = QVMClient.new_http(QCSClient.load().qvm_url)
result = await Executable(PROGRAM, shots=4).execute_on_qvm_async()
@@ -76,7 +106,7 @@ class Executable:
.as_integer()
.expect("should be integer matrix")
.to_owned();
-
+
// In this case, we ran the program for 4 shots, so we know the number of rows is 4.
assert_eq!(data.nrows(), 4);
for shot in data.rows() {
@@ -86,13 +116,13 @@ class Executable:
// In the case of this particular program, we know ro[0] should equal ro[1]
assert_eq!(shot[0], shot[1]);
}
-
+
def main():
import asyncio
asyncio.run(run())
-
+
# "ro" is the only source read from by default if you don't specify `registers`.
-
+
# We first convert the readout data to a ``RegisterMap`` to get a mapping of registers
# (ie. "ro") to a [`RegisterMatrix`], `M`, where M[`shot`][`index`] is the value for
# the memory offset `index` during shot `shot`.
@@ -102,69 +132,102 @@ class Executable:
# might fail.
```
"""
- def __new__(cls, quil: builtins.str, /, registers: typing.Sequence[builtins.str] = [], parameters: typing.Sequence[ExeParameter] = [], shots: typing.Optional[builtins.int] = None, quilc_client: typing.Optional[QuilcClient] = None, compiler_options: typing.Optional[CompilerOpts] = None) -> Executable: ...
- def execute_on_qpu(self, quantum_processor_id: builtins.str, endpoint_id: typing.Optional[builtins.str] = None, translation_options: typing.Optional[TranslationOptions] = None, execution_options: typing.Optional[ExecutionOptions] = None) -> ExecutionData:
+ def __new__(
+ cls,
+ quil: builtins.str,
+ /,
+ registers: typing.Sequence[builtins.str] = [],
+ parameters: typing.Sequence[ExeParameter] = [],
+ shots: typing.Optional[builtins.int] = None,
+ quilc_client: typing.Optional[quilc.QuilcClient] = None,
+ compiler_options: typing.Optional[quilc.CompilerOpts] = None,
+ ) -> Executable: ...
+ def execute_on_qpu(
+ self,
+ quantum_processor_id: builtins.str,
+ endpoint_id: typing.Optional[builtins.str] = None,
+ translation_options: typing.Optional[translation.TranslationOptions] = None,
+ execution_options: typing.Optional[api.ExecutionOptions] = None,
+ ) -> ExecutionData:
r"""
Compile the program and execute it on a QPU, waiting for results.
-
+
:param `endpoint_id`: execute the compiled program against an explicitly provided endpoint.
If `None`, the default endpoint for the given `quantum_processor_id` is used.
-
+
:raises `ExecutionError`: If the job fails to execute.
"""
- def execute_on_qpu_async(self, quantum_processor_id: builtins.str, endpoint_id: typing.Optional[builtins.str] = None, translation_options: typing.Optional[TranslationOptions] = None, execution_options: typing.Optional[ExecutionOptions] = None) -> collections.abc.Awaitable[ExecutionData]:
+ def execute_on_qpu_async(
+ self,
+ quantum_processor_id: builtins.str,
+ endpoint_id: typing.Optional[builtins.str] = None,
+ translation_options: typing.Optional[translation.TranslationOptions] = None,
+ execution_options: typing.Optional[api.ExecutionOptions] = None,
+ ) -> collections.abc.Awaitable[ExecutionData]:
r"""
Compile the program and execute it on a QPU, waiting for results
(async analog of `Executable.execute_on_qpu`).
-
+
:param `endpoint_id`: execute the compiled program against an explicitly provided endpoint.
If `None`, the default endpoint for the given `quantum_processor_id` is used.
-
+
:raises `ExecutionError`: If the job fails to execute.
"""
- def execute_on_qvm(self, client: QVMClient) -> ExecutionData:
+ def execute_on_qvm(self, client: qvm.QVMClient) -> ExecutionData:
r"""
Execute on a QVM which is accessible via the provided client.
-
+
:raises `ExecutionError`: If the job fails to execute.
"""
- def execute_on_qvm_async(self, client: QVMClient) -> collections.abc.Awaitable[ExecutionData]:
+ def execute_on_qvm_async(self, client: qvm.QVMClient) -> collections.abc.Awaitable[ExecutionData]:
r"""
Execute on a QVM which is accessible via the provided client
(async analog of ``Executable.execute_on_qvm``).
-
+
:raises `ExecutionError`: If the job fails to execute.
"""
def retrieve_results(self, job_handle: JobHandle) -> ExecutionData:
r"""
Wait for the results of a job to complete.
-
+
:raises `ExecutionError`: If the job fails to execute.
"""
def retrieve_results_async(self, job_handle: JobHandle) -> collections.abc.Awaitable[ExecutionData]:
r"""
Wait for the results of a job to complete
(async analog of `Executable.retrieve_results`).
-
+
:raises `ExecutionError`: If the job fails to execute.
"""
- def submit_to_qpu(self, quantum_processor_id: builtins.str, endpoint_id: typing.Optional[builtins.str] = None, translation_options: typing.Optional[TranslationOptions] = None, execution_options: typing.Optional[ExecutionOptions] = None) -> JobHandle:
+ def submit_to_qpu(
+ self,
+ quantum_processor_id: builtins.str,
+ endpoint_id: typing.Optional[builtins.str] = None,
+ translation_options: typing.Optional[translation.TranslationOptions] = None,
+ execution_options: typing.Optional[api.ExecutionOptions] = None,
+ ) -> JobHandle:
r"""
Compile the program and execute it on a QPU, without waiting for results.
-
+
:param `endpoint_id`: execute the compiled program against an explicitly provided endpoint.
If `None`, the default endpoint for the given `quantum_processor_id` is used.
-
+
:raises `ExecutionError`: If the job fails to execute.
"""
- def submit_to_qpu_async(self, quantum_processor_id: builtins.str, endpoint_id: typing.Optional[builtins.str] = None, translation_options: typing.Optional[TranslationOptions] = None, execution_options: typing.Optional[ExecutionOptions] = None) -> collections.abc.Awaitable[JobHandle]:
+ def submit_to_qpu_async(
+ self,
+ quantum_processor_id: builtins.str,
+ endpoint_id: typing.Optional[builtins.str] = None,
+ translation_options: typing.Optional[translation.TranslationOptions] = None,
+ execution_options: typing.Optional[api.ExecutionOptions] = None,
+ ) -> collections.abc.Awaitable[JobHandle]:
r"""
Compile the program and execute it on a QPU, without waiting for results
(async analog of `Executable.submit_to_qpu`).
-
+
:param `endpoint_id`: execute the compiled program against an explicitly provided endpoint.
If `None`, the default endpoint for the given `quantum_processor_id` is used.
-
+
:raises `ExecutionError`: If the job fails to execute.
"""
@@ -178,17 +241,19 @@ class ExecutionData:
r"""
The time it took to execute the program on the QPU, not including any network or queueing
time. If paying for on-demand execution, this is the amount you will be billed for.
-
+
This will always be `None` for QVM execution.
"""
@property
- def result_data(self) -> QVMResultData | QPUResultData:
+ def result_data(self) -> qvm.QVMResultData | qpu.QPUResultData:
r"""
The [`ResultData`] that was read from the [`Executable`](crate::Executable).
"""
- def __eq__(self, other: builtins.object) -> builtins.bool: ...
- def __getnewargs__(self) -> tuple[QVMResultData | QPUResultData, typing.Optional[datetime.timedelta]]: ...
- def __new__(cls, result_data: QVMResultData | QPUResultData, duration: typing.Optional[datetime.timedelta] = None) -> ExecutionData:
+ def __eq__(self, other: builtins.object, /) -> builtins.bool: ...
+ def __getnewargs__(self) -> tuple[qvm.QVMResultData | qpu.QPUResultData, typing.Optional[datetime.timedelta]]: ...
+ def __new__(
+ cls, result_data: qvm.QVMResultData | qpu.QPUResultData, duration: typing.Optional[datetime.timedelta] = None
+ ) -> ExecutionData:
r"""
Create `ExecutionData` from `ResultData` and an optional `duration`.
"""
@@ -197,13 +262,14 @@ class ExecutionError(QcsSdkError):
r"""
Errors which can occur when executing a program.
"""
+
...
@typing.final
class JobHandle:
r"""
The result of submitting a job to a QPU.
-
+
Used to retrieve the results of a job.
"""
@property
@@ -222,87 +288,108 @@ class QcsSdkError(builtins.Exception):
r"""
Base exception type for errors raised by this package.
"""
+
...
class RegisterData:
r"""
Data resulting from [`Executable::execute_on_qvm`](`crate::Executable::execute_on_qvm`)
-
+
This represents a single vector (or "register") of typed memory across some number of shots.
The register corresponds to the usage of a `DECLARE` instruction in Quil, and the name of that
register should be provided with [`Executable::read_from`](`crate::Executable::read_from`).
-
+
There is a variant of this enum for each type of data that a register could hold. The register
is represented as a 2-dimensional array `M` where the value `M[shot_number][memory_index]`
represents the value at `memory_index` for `shot_number`.
-
+
# Usage
-
+
Typically, you will be interacting with this data through the [`crate::ResultData`] of an
[`crate::ExecutionData`] returned after running a program. In those cases, you'll probably
want to convert it to a readout map using [`crate::ResultData.to_register_map()`]. This
will give you each register in the form of a [`crate::RegisterMatrix`] which is similar
but backed by an [`ndarray::Array2`] and more convenient for working with matrices.
-
+
If you are interacting with [`RegisterData`] directly, then you should already know what type of data it _should_
have, so you can use the [`mod@enum_as_inner`] methods (e.g. [`RegisterData::into_i8`]) in order to
convert any variant type to its inner data.
"""
- def __getnewargs__(self) -> tuple[builtins.list[builtins.list[builtins.int]] | builtins.list[builtins.list[builtins.float]] | builtins.list[builtins.list[builtins.complex]]]: ...
- def __new__(cls, inner: typing.Sequence[typing.Sequence[builtins.int]] | typing.Sequence[typing.Sequence[builtins.float]] | typing.Sequence[typing.Sequence[builtins.complex]]) -> RegisterData: ...
+ def __getnewargs__(
+ self,
+ ) -> tuple[
+ builtins.list[builtins.list[builtins.int]]
+ | builtins.list[builtins.list[builtins.float]]
+ | builtins.list[builtins.list[builtins.complex]]
+ ]: ...
+ def __new__(
+ cls,
+ inner: typing.Sequence[typing.Sequence[builtins.int]]
+ | typing.Sequence[typing.Sequence[builtins.float]]
+ | typing.Sequence[typing.Sequence[builtins.complex]],
+ ) -> RegisterData: ...
def as_ndarray(self) -> numpy.ndarray:
r"""
Return the inner values as a 2D Numpy ``ndarray``.
"""
- def inner(self) -> builtins.list[builtins.list[builtins.int]] | builtins.list[builtins.list[builtins.float]] | builtins.list[builtins.list[builtins.complex]]: ...
+ def inner(
+ self,
+ ) -> (
+ builtins.list[builtins.list[builtins.int]]
+ | builtins.list[builtins.list[builtins.float]]
+ | builtins.list[builtins.list[builtins.complex]]
+ ): ...
@typing.final
class Complex32(RegisterData):
r"""
Results containing complex numbers.
"""
+
__match_args__ = ("_0",)
@property
def _0(self) -> builtins.list[builtins.list[builtins.complex]]: ...
- def __getitem__(self, key: builtins.int) -> typing.Any: ...
+ def __getitem__(self, key: builtins.int, /) -> typing.Any: ...
def __len__(self) -> builtins.int: ...
def __new__(cls, _0: typing.Sequence[typing.Sequence[builtins.complex]]) -> RegisterData.Complex32: ...
-
+
@typing.final
class F64(RegisterData):
r"""
Corresponds to the Quil `REAL` type.
"""
+
__match_args__ = ("_0",)
@property
def _0(self) -> builtins.list[builtins.list[builtins.float]]: ...
- def __getitem__(self, key: builtins.int) -> typing.Any: ...
+ def __getitem__(self, key: builtins.int, /) -> typing.Any: ...
def __len__(self) -> builtins.int: ...
def __new__(cls, _0: typing.Sequence[typing.Sequence[builtins.float]]) -> RegisterData.F64: ...
-
+
@typing.final
class I16(RegisterData):
r"""
Corresponds to the Quil `INTEGER` type.
"""
+
__match_args__ = ("_0",)
@property
def _0(self) -> builtins.list[builtins.list[builtins.int]]: ...
- def __getitem__(self, key: builtins.int) -> typing.Any: ...
+ def __getitem__(self, key: builtins.int, /) -> typing.Any: ...
def __len__(self) -> builtins.int: ...
def __new__(cls, _0: typing.Sequence[typing.Sequence[builtins.int]]) -> RegisterData.I16: ...
-
+
@typing.final
class I8(RegisterData):
r"""
Corresponds to the Quil `BIT` or `OCTET` types.
"""
+
__match_args__ = ("_0",)
@property
def _0(self) -> builtins.list[builtins.list[builtins.int]]: ...
- def __getitem__(self, key: builtins.int) -> typing.Any: ...
+ def __getitem__(self, key: builtins.int, /) -> typing.Any: ...
def __len__(self) -> builtins.int: ...
def __new__(cls, _0: typing.Sequence[typing.Sequence[builtins.int]]) -> RegisterData.I8: ...
-
@typing.final
class RegisterMap:
@@ -314,11 +401,13 @@ class RegisterMap:
def __getitem__(self, item: builtins.str) -> RegisterMatrix: ...
def __iter__(self) -> RegisterMapKeysIter: ...
def __len__(self) -> builtins.int: ...
- def get(self, key: builtins.str, default: typing.Optional[RegisterMatrix] = None) -> typing.Optional[RegisterMatrix]: ...
+ def get(
+ self, key: builtins.str, default: typing.Optional[RegisterMatrix] = None
+ ) -> typing.Optional[RegisterMatrix]: ...
def get_register_matrix(self, register_name: builtins.str) -> typing.Optional[RegisterMatrix]:
r"""
Get the `RegisterMatrix` for the given register.
-
+
Returns `None` if the register doesn't exist.
"""
def items(self) -> RegisterMapItemsIter: ...
@@ -343,7 +432,7 @@ class RegisterMapValuesIter:
class RegisterMatrix:
r"""
A 2-dimensional matrix of register values.
-
+
Each variant corresponds to the possible data types a register can contain.
"""
def to_ndarray(self) -> typing.Any:
@@ -355,42 +444,45 @@ class RegisterMatrix:
r"""
Complex numbered register.
"""
+
__match_args__ = ("_0",)
@property
def _0(self) -> numpy.typing.NDArray[numpy.complex128]: ...
- def __getitem__(self, key: builtins.int) -> typing.Any: ...
+ def __getitem__(self, key: builtins.int, /) -> typing.Any: ...
def __len__(self) -> builtins.int: ...
def __new__(cls, _0: numpy.typing.NDArray[numpy.complex128]) -> RegisterMatrix.Complex: ...
-
+
@typing.final
class Integer(RegisterMatrix):
r"""
Integer register.
"""
+
__match_args__ = ("_0",)
@property
def _0(self) -> numpy.typing.NDArray[numpy.int64]: ...
- def __getitem__(self, key: builtins.int) -> typing.Any: ...
+ def __getitem__(self, key: builtins.int, /) -> typing.Any: ...
def __len__(self) -> builtins.int: ...
def __new__(cls, _0: numpy.typing.NDArray[numpy.int64]) -> RegisterMatrix.Integer: ...
-
+
@typing.final
class Real(RegisterMatrix):
r"""
Real numbered register.
"""
+
__match_args__ = ("_0",)
@property
def _0(self) -> numpy.typing.NDArray[numpy.float64]: ...
- def __getitem__(self, key: builtins.int) -> typing.Any: ...
+ def __getitem__(self, key: builtins.int, /) -> typing.Any: ...
def __len__(self) -> builtins.int: ...
def __new__(cls, _0: numpy.typing.NDArray[numpy.float64]) -> RegisterMatrix.Real: ...
-
class RegisterMatrixConversionError(QcsSdkError):
r"""
Error that may occur when building a `RegisterMatrix` from execution data.
"""
+
...
@typing.final
@@ -399,6 +491,7 @@ class Service(enum.Enum):
The external services that this SDK may connect to. Used to differentiate between networking
issues in [`Error::Connection`].
"""
+
QUILC = ...
r"""
The open source [`quilc`](https://github.com/quil-lang/quilc) compiler.
@@ -430,12 +523,10 @@ class Service(enum.Enum):
"""
def _gather_diagnostics() -> builtins.str: ...
-
def reset_logging() -> None:
r"""
Reset all caches for logging configuration within this library,
allowing the most recent Python-side changes to be applied.
-
+
See for more information.
"""
-
diff --git a/crates/lib/python/qcs_sdk/client.pyi b/crates/lib/python/qcs_sdk/_qcs_sdk/client/__init__.pyi
similarity index 73%
rename from crates/lib/python/qcs_sdk/client.pyi
rename to crates/lib/python/qcs_sdk/_qcs_sdk/client/__init__.pyi
index ffd539f16..16025e428 100644
--- a/crates/lib/python/qcs_sdk/client.pyi
+++ b/crates/lib/python/qcs_sdk/_qcs_sdk/client/__init__.pyi
@@ -1,28 +1,54 @@
# This file is automatically generated by pyo3_stub_gen
-# ruff: noqa: E501, F401
+# ruff: noqa: E501, F401, F403, F405
import builtins
import collections.abc
+import qcs_api_client_common._qcs_api_client_common.configuration
+from qcs_sdk import _qcs_sdk
import typing
-from qcs_api_client_common.configuration import OAuthSession
-from qcs_sdk import QcsSdkError
+from typing import TypeAlias
+
+__all__ = [
+ "AuthServer",
+ "BuildClientError",
+ "ClientCredentials",
+ "ClientError",
+ "ExternallyManaged",
+ "LoadClientError",
+ "OAuthSession",
+ "QCSClient",
+ "RPCQQuilcError",
+ "RefreshToken",
+ "SecretRefreshToken",
+ "TokenError",
+]
+
+AuthServer: TypeAlias = configuration.AuthServer
+ClientCredentials: TypeAlias = configuration.ClientCredentials
+ExternallyManaged: TypeAlias = configuration.ExternallyManaged
+OAuthSession: TypeAlias = configuration.OAuthSession
+RefreshToken: TypeAlias = configuration.RefreshToken
+SecretRefreshToken: TypeAlias = configuration.SecretRefreshToken
class BuildClientError(ClientError):
r"""
Errors encountered while building the QCS API client configuration manually.
"""
+
...
-class ClientError(QcsSdkError):
+class ClientError(_qcs_sdk.QcsSdkError):
r"""
Errors encountered while interacting with a QCS API client.
"""
+
...
class LoadClientError(ClientError):
r"""
Errors encountered while loading the QCS API client configuration from the environment configuration.
"""
+
...
@typing.final
@@ -41,7 +67,7 @@ class QCSClient:
URL to access the QCS gRPC API.
"""
@property
- def oauth_session(self) -> OAuthSession:
+ def oauth_session(self) -> configuration.OAuthSession:
r"""
Get a copy of the OAuth session.
"""
@@ -55,11 +81,18 @@ class QCSClient:
r"""
URL to access the QVM.
"""
- def __eq__(self, other: builtins.object) -> builtins.bool: ...
- def __new__(cls, oauth_session: typing.Optional[OAuthSession] = None, api_url: typing.Optional[builtins.str] = None, grpc_api_url: typing.Optional[builtins.str] = None, quilc_url: typing.Optional[builtins.str] = None, qvm_url: typing.Optional[builtins.str] = None) -> QCSClient:
+ def __eq__(self, other: builtins.object, /) -> builtins.bool: ...
+ def __new__(
+ cls,
+ oauth_session: typing.Optional[configuration.OAuthSession] = None,
+ api_url: typing.Optional[builtins.str] = None,
+ grpc_api_url: typing.Optional[builtins.str] = None,
+ quilc_url: typing.Optional[builtins.str] = None,
+ qvm_url: typing.Optional[builtins.str] = None,
+ ) -> QCSClient:
r"""
Manually construct a `QCSClient`.
-
+
Prefer to use `QCSClient.load` to construct an environment-based profile.
"""
def get_oauth_session_async(self) -> collections.abc.Awaitable[typing.Any]:
@@ -70,42 +103,44 @@ class QCSClient:
def load(profile_name: typing.Optional[builtins.str] = None) -> QCSClient:
r"""
Create a `QCSClient` configuration using an environment-based configuration.
-
+
:param `profile_name`: The QCS setting's profile name to use. If ``None``, the default value configured in your environment is used.
-
+
:raises `LoadClientError`: If there is an issue loading the profile details from the environment.
"""
@staticmethod
def load_with_login(profile_name: typing.Optional[builtins.str] = None) -> QCSClient:
r"""
Create a `QCSClient` configuration using an environment-based configuration.
-
+
If credentials are not found or stale, a PKCE login redirect flow will be initialized.
Note that this opens up a TCP port on your system to accept a browser HTTP redirect,
so you should not use this in environments where that is not possible,
such as hosted `JupyterLab` sessions.
-
+
:param `profile_name`: The QCS setting's profile name to use. If ``None``, the default value configured in your environment is used.
-
+
:raises `LoadClientError`: If there is an issue loading the profile details from the environment or if the PKCE login flow fails.
-
+
See the [QCS documentation](https://docs.rigetti.com/qcs/references/qcs-client-configuration#environment-variables-and-configuration-files)
for more details.
"""
@staticmethod
- def load_with_login_async(profile_name: typing.Optional[builtins.str] = None) -> collections.abc.Awaitable[QCSClient]:
+ def load_with_login_async(
+ profile_name: typing.Optional[builtins.str] = None,
+ ) -> collections.abc.Awaitable[QCSClient]:
r"""
Create a `QCSClient` configuration using an environment-based configuration.
-
+
If credentials are not found or stale, a PKCE login redirect flow will be initialized.
Note that this opens up a TCP port on your system to accept a browser HTTP redirect,
so you should not use this in environments where that is not possible,
such as hosted `JupyterLab` sessions.
-
+
:param `profile_name`: The QCS setting's profile name to use. If ``None``, the default value configured in your environment is used.
-
+
:raises `LoadClientError`: If there is an issue loading the profile details from the environment or if the PKCE login flow fails.
-
+
See the [QCS documentation](https://docs.rigetti.com/qcs/references/qcs-client-configuration#environment-variables-and-configuration-files)
for more details.
"""
@@ -114,11 +149,12 @@ class RPCQQuilcError(ClientError):
r"""
Errors when compiling with RPCQ client.
"""
+
...
class TokenError(ClientError):
r"""
Errors that can occur when managing authorization tokens.
"""
- ...
+ ...
diff --git a/crates/lib/python/qcs_sdk/compiler/__init__.pyi b/crates/lib/python/qcs_sdk/_qcs_sdk/compiler/__init__.pyi
similarity index 54%
rename from crates/lib/python/qcs_sdk/compiler/__init__.pyi
rename to crates/lib/python/qcs_sdk/_qcs_sdk/compiler/__init__.pyi
index c0d75883f..c369280de 100644
--- a/crates/lib/python/qcs_sdk/compiler/__init__.pyi
+++ b/crates/lib/python/qcs_sdk/_qcs_sdk/compiler/__init__.pyi
@@ -1,5 +1,8 @@
# This file is automatically generated by pyo3_stub_gen
-# ruff: noqa: E501, F401
+# ruff: noqa: E501, F401, F403, F405
from . import quilc
+__all__ = [
+ "quilc",
+]
diff --git a/crates/lib/python/qcs_sdk/compiler/quilc.pyi b/crates/lib/python/qcs_sdk/_qcs_sdk/compiler/quilc/__init__.pyi
similarity index 72%
rename from crates/lib/python/qcs_sdk/compiler/quilc.pyi
rename to crates/lib/python/qcs_sdk/_qcs_sdk/compiler/quilc/__init__.pyi
index 17212f6a0..4ab0ada89 100644
--- a/crates/lib/python/qcs_sdk/compiler/quilc.pyi
+++ b/crates/lib/python/qcs_sdk/_qcs_sdk/compiler/quilc/__init__.pyi
@@ -1,12 +1,38 @@
# This file is automatically generated by pyo3_stub_gen
-# ruff: noqa: E501, F401
+# ruff: noqa: E501, F401, F403, F405
import builtins
import collections.abc
+from qcs_sdk import _qcs_sdk
+from qcs_sdk._qcs_sdk.qpu import isa
+import quil._quil.program
import typing
-from qcs_sdk import QcsSdkError
-from qcs_sdk.qpu.isa import InstructionSetArchitecture
-from quil.program import Program
+
+__all__ = [
+ "CompilationResult",
+ "CompilerOpts",
+ "ConjugateByCliffordRequest",
+ "ConjugatePauliByCliffordRequest",
+ "ConjugatePauliByCliffordResponse",
+ "DEFAULT_COMPILER_TIMEOUT",
+ "GenerateRandomizedBenchmarkingSequenceResponse",
+ "NativeQuilMetadata",
+ "PauliTerm",
+ "QuilcClient",
+ "QuilcError",
+ "RandomizedBenchmarkingRequest",
+ "TargetDevice",
+ "compile_program",
+ "compile_program_async",
+ "conjugate_pauli_by_clifford",
+ "conjugate_pauli_by_clifford_async",
+ "generate_randomized_benchmarking_sequence",
+ "generate_randomized_benchmarking_sequence_async",
+ "get_version_info",
+ "get_version_info_async",
+]
+
+DEFAULT_COMPILER_TIMEOUT: typing.Final[builtins.float]
@typing.final
class CompilationResult:
@@ -19,7 +45,7 @@ class CompilationResult:
Metadata about the compiled program
"""
@property
- def program(self) -> Program:
+ def program(self) -> program.Program:
r"""
The compiled program
"""
@@ -29,7 +55,9 @@ class CompilerOpts:
r"""
A set of options that determine the behavior of compiling programs with quilc
"""
- def __new__(cls, timeout: typing.Optional[builtins.float] = 30.0, protoquil: typing.Optional[builtins.bool] = None) -> CompilerOpts:
+ def __new__(
+ cls, timeout: typing.Optional[builtins.float] = 30.0, protoquil: typing.Optional[builtins.bool] = None
+ ) -> CompilerOpts:
r"""
Create a new instance of `CompilerOpts`.
"""
@@ -96,9 +124,30 @@ class NativeQuilMetadata:
r"""
Metadata about a program compiled to native quil.
"""
- def __eq__(self, other: builtins.object) -> builtins.bool: ...
- def __getnewargs__(self) -> tuple[typing.Optional[builtins.list[builtins.int]], typing.Optional[builtins.int], typing.Optional[builtins.int], typing.Optional[builtins.int], typing.Optional[builtins.float], typing.Optional[builtins.float], typing.Optional[builtins.int], typing.Optional[builtins.float]]: ...
- def __new__(cls, final_rewiring: typing.Optional[typing.Sequence[builtins.int]], gate_depth: typing.Optional[builtins.int], gate_volume: typing.Optional[builtins.int], multiqubit_gate_depth: typing.Optional[builtins.int], program_duration: typing.Optional[builtins.float], program_fidelity: typing.Optional[builtins.float], topological_swaps: typing.Optional[builtins.int], qpu_runtime_estimation: typing.Optional[builtins.float]) -> NativeQuilMetadata:
+ def __eq__(self, other: builtins.object, /) -> builtins.bool: ...
+ def __getnewargs__(
+ self,
+ ) -> tuple[
+ typing.Optional[builtins.list[builtins.int]],
+ typing.Optional[builtins.int],
+ typing.Optional[builtins.int],
+ typing.Optional[builtins.int],
+ typing.Optional[builtins.float],
+ typing.Optional[builtins.float],
+ typing.Optional[builtins.int],
+ typing.Optional[builtins.float],
+ ]: ...
+ def __new__(
+ cls,
+ final_rewiring: typing.Optional[typing.Sequence[builtins.int]],
+ gate_depth: typing.Optional[builtins.int],
+ gate_volume: typing.Optional[builtins.int],
+ multiqubit_gate_depth: typing.Optional[builtins.int],
+ program_duration: typing.Optional[builtins.float],
+ program_fidelity: typing.Optional[builtins.float],
+ topological_swaps: typing.Optional[builtins.int],
+ qpu_runtime_estimation: typing.Optional[builtins.float],
+ ) -> NativeQuilMetadata:
r"""
Construct a new `NativeQuilMetadata` from arguments.
"""
@@ -139,10 +188,11 @@ class QuilcClient:
Construct a `QuilcClient` that uses RPCQ to communicate with Quilc.
"""
-class QuilcError(QcsSdkError):
+class QuilcError(_qcs_sdk.QcsSdkError):
r"""
Errors encountered compiling a Quil program.
"""
+
...
@typing.final
@@ -175,7 +225,14 @@ class RandomizedBenchmarkingRequest:
r"""
PRNG seed. Set this to guarantee repeatable results.
"""
- def __new__(cls, depth: builtins.int, qubits: builtins.int, gateset: typing.Sequence[builtins.str], seed: typing.Optional[builtins.int], interleaver: typing.Optional[builtins.str]) -> RandomizedBenchmarkingRequest: ...
+ def __new__(
+ cls,
+ depth: builtins.int,
+ qubits: builtins.int,
+ gateset: typing.Sequence[builtins.str],
+ seed: typing.Optional[builtins.int],
+ interleaver: typing.Optional[builtins.str],
+ ) -> RandomizedBenchmarkingRequest: ...
@typing.final
class TargetDevice:
@@ -183,12 +240,12 @@ class TargetDevice:
Description of a device to compile for.
"""
@staticmethod
- def from_isa(isa: InstructionSetArchitecture) -> TargetDevice:
+ def from_isa(isa: isa.InstructionSetArchitecture) -> TargetDevice:
r"""
Create a [`TargetDevice`] based on an [`InstructionSetArchitecture`].
-
+
# Errors
-
+
Returns a [`QuilcError`] if the [`InstructionSetArchitecture`]
cannot be converted into a format that Quilc understands.
"""
@@ -196,121 +253,132 @@ class TargetDevice:
def from_json(value: builtins.str) -> TargetDevice:
r"""
Create a [`TargetDevice`] from a JSON string.
-
+
# Errors
-
+
Returns a [`QuilcError`] if the JSON is malformed.
"""
-def compile_program(quil: builtins.str, target: TargetDevice, client: QuilcClient, options: typing.Optional[CompilerOpts] = None) -> CompilationResult:
+def compile_program(
+ quil: builtins.str, target: TargetDevice, client: QuilcClient, options: typing.Optional[CompilerOpts] = None
+) -> CompilationResult:
r"""
Compile a quil program for a target device.
-
+
:param quil: The Quil program to compile.
:param target: Architectural description of device to compile for.
:param client: Client used to send compilation requests to Quilc.
:param options: Optional compiler options. If ``None``, default values are used.
-
+
:raises QuilcError: If compilation fails.
"""
-def compile_program_async(quil: builtins.str, target: TargetDevice, client: QuilcClient, options: typing.Optional[CompilerOpts] = None) -> collections.abc.Awaitable[CompilationResult]:
+def compile_program_async(
+ quil: builtins.str, target: TargetDevice, client: QuilcClient, options: typing.Optional[CompilerOpts] = None
+) -> collections.abc.Awaitable[CompilationResult]:
r"""
Compile a quil program for a target device.
-
+
:param quil: The Quil program to compile.
:param target: Architectural description of device to compile for.
:param client: Client used to send compilation requests to Quilc.
:param options: Optional compiler options. If ``None``, default values are used.
-
+
:raises QuilcError: If compilation fails.
"""
-def conjugate_pauli_by_clifford(request: ConjugateByCliffordRequest, client: QuilcClient) -> ConjugatePauliByCliffordResponse:
+def conjugate_pauli_by_clifford(
+ request: ConjugateByCliffordRequest, client: QuilcClient
+) -> ConjugatePauliByCliffordResponse:
r"""
Given a circuit that consists only of elements of the Clifford group, return its action on a PauliTerm.
In particular, for Clifford C, and Pauli P, this returns the PauliTerm representing CPC^{\dagger}.
-
+
:param request: Pauli Term conjugation request.
:param client: Client used to send compilation requests to Quilc.
-
+
:raises QuilcError: If there is a failure connecting to Quilc or if the request is malformed.
"""
-def conjugate_pauli_by_clifford_async(request: ConjugateByCliffordRequest, client: QuilcClient) -> collections.abc.Awaitable[ConjugatePauliByCliffordResponse]:
+def conjugate_pauli_by_clifford_async(
+ request: ConjugateByCliffordRequest, client: QuilcClient
+) -> collections.abc.Awaitable[ConjugatePauliByCliffordResponse]:
r"""
Given a circuit that consists only of elements of the Clifford group, return its action on a PauliTerm.
In particular, for Clifford C, and Pauli P, this returns the PauliTerm representing CPC^{\dagger}.
-
+
:param request: Pauli Term conjugation request.
:param client: Client used to send compilation requests to Quilc.
-
+
:raises QuilcError: If there is a failure connecting to Quilc or if the request is malformed.
"""
-def generate_randomized_benchmarking_sequence(request: RandomizedBenchmarkingRequest, client: QuilcClient) -> GenerateRandomizedBenchmarkingSequenceResponse:
+def generate_randomized_benchmarking_sequence(
+ request: RandomizedBenchmarkingRequest, client: QuilcClient
+) -> GenerateRandomizedBenchmarkingSequenceResponse:
r"""
Construct a randomized benchmarking experiment on the given qubits, decomposing into
gateset. If interleaver is not provided, the returned sequence will have the form
-
+
```ignore
C_1 C_2 ... C_(depth-1) C_inv ,
```
-
+
where each C is a Clifford element drawn from gateset, C_{< depth} are randomly selected,
and C_inv is selected so that the entire sequence composes to the identity. If an
interleaver G (which must be a Clifford, and which will be decomposed into the native
gateset) is provided, then the sequence instead takes the form
-
+
```ignore
C_1 G C_2 G ... C_(depth-1) G C_inv .
```
-
+
:param request: Randomized benchmarking request.
:param client: Client used to send compilation requests to Quilc.
-
+
:raises QuilcError: If there is a failure connecting to Quilc or if the request is malformed.
"""
-def generate_randomized_benchmarking_sequence_async(request: RandomizedBenchmarkingRequest, client: QuilcClient) -> collections.abc.Awaitable[GenerateRandomizedBenchmarkingSequenceResponse]:
+def generate_randomized_benchmarking_sequence_async(
+ request: RandomizedBenchmarkingRequest, client: QuilcClient
+) -> collections.abc.Awaitable[GenerateRandomizedBenchmarkingSequenceResponse]:
r"""
Construct a randomized benchmarking experiment on the given qubits, decomposing into
gateset. If interleaver is not provided, the returned sequence will have the form
-
+
```ignore
C_1 C_2 ... C_(depth-1) C_inv ,
```
-
+
where each C is a Clifford element drawn from gateset, C_{< depth} are randomly selected,
and C_inv is selected so that the entire sequence composes to the identity. If an
interleaver G (which must be a Clifford, and which will be decomposed into the native
gateset) is provided, then the sequence instead takes the form
-
+
```ignore
C_1 G C_2 G ... C_(depth-1) G C_inv .
```
-
+
:param request: Randomized benchmarking request.
:param client: Client used to send compilation requests to Quilc.
-
+
:raises QuilcError: If there is a failure connecting to Quilc or if the request is malformed.
"""
def get_version_info(client: QuilcClient) -> builtins.str:
r"""
Fetch the version information from the running Quilc service.
-
+
:param client: Client used to send compilation requests to Quilc.
-
+
:raises QuilcError: If there is a failure connecting to Quilc.
"""
def get_version_info_async(client: QuilcClient) -> collections.abc.Awaitable[builtins.str]:
r"""
Fetch the version information from the running Quilc service.
-
+
:param client: Client used to send compilation requests to Quilc.
-
+
:raises QuilcError: If there is a failure connecting to Quilc.
"""
-
diff --git a/crates/lib/python/qcs_sdk/diagnostics.pyi b/crates/lib/python/qcs_sdk/_qcs_sdk/diagnostics/__init__.pyi
similarity index 90%
rename from crates/lib/python/qcs_sdk/diagnostics.pyi
rename to crates/lib/python/qcs_sdk/_qcs_sdk/diagnostics/__init__.pyi
index f6d8b7bc9..fce5490fb 100644
--- a/crates/lib/python/qcs_sdk/diagnostics.pyi
+++ b/crates/lib/python/qcs_sdk/_qcs_sdk/diagnostics/__init__.pyi
@@ -1,36 +1,40 @@
# This file is automatically generated by pyo3_stub_gen
-# ruff: noqa: E501, F401
+# ruff: noqa: E501, F401, F403, F405
import builtins
import collections.abc
+__all__ = [
+ "get_report",
+ "get_report_async",
+]
+
def get_report() -> builtins.str:
r"""
Return a string describing the package and its environment for use in bug reporting and diagnosis.
-
+
This is a synchronous wrapper around `get_report_async`.
Use that version in async environments.
-
+
Note: this format is not stable and its content may change between versions.
"""
def get_report_async() -> collections.abc.Awaitable[builtins.str]:
r"""
Return a string describing the package and its environment for use in bug reporting and diagnosis.
-
+
Note: this format is not stable and its content may change between versions.
-
+
# Python Usage
-
+
```python
import asyncio
from qcs_sdk import diagnostics
-
+
async def main():
return await diagnostics.get_report_async()
-
+
report = asyncio.run(main())
print(report)
```
"""
-
diff --git a/crates/lib/python/qcs_sdk/qpu/__init__.pyi b/crates/lib/python/qcs_sdk/_qcs_sdk/qpu/__init__.pyi
similarity index 77%
rename from crates/lib/python/qcs_sdk/qpu/__init__.pyi
rename to crates/lib/python/qcs_sdk/_qcs_sdk/qpu/__init__.pyi
index 5ad866366..955138f53 100644
--- a/crates/lib/python/qcs_sdk/qpu/__init__.pyi
+++ b/crates/lib/python/qcs_sdk/_qcs_sdk/qpu/__init__.pyi
@@ -1,26 +1,41 @@
# This file is automatically generated by pyo3_stub_gen
-# ruff: noqa: E501, F401
+# ruff: noqa: E501, F401, F403, F405
import builtins
import collections.abc
+from qcs_sdk import _qcs_sdk
+from qcs_sdk._qcs_sdk import client
import typing
-from qcs_sdk import QcsSdkError, RegisterMap
-from qcs_sdk.client import QCSClient
from . import api
from . import experimental
from . import isa
from . import translation
-class ListQuantumProcessorsError(QcsSdkError):
+__all__ = [
+ "ListQuantumProcessorsError",
+ "MemoryValues",
+ "QPUResultData",
+ "RawQPUReadoutData",
+ "ReadoutValues",
+ "api",
+ "experimental",
+ "isa",
+ "list_quantum_processors",
+ "list_quantum_processors_async",
+ "translation",
+]
+
+class ListQuantumProcessorsError(_qcs_sdk.QcsSdkError):
r"""
API Errors encountered when trying to list available quantum processors.
"""
+
...
class MemoryValues:
r"""
A row of data containing the contents of a memory region at the end of a job.
-
+
There is a variant for each possible type the memory region could be.
"""
def __getnewargs__(self) -> tuple[builtins.list[builtins.int] | builtins.list[builtins.float]]: ...
@@ -31,48 +46,50 @@ class MemoryValues:
r"""
Values that correspond to a memory region declared with the BIT or OCTET data type.
"""
+
__match_args__ = ("_0",)
@property
def _0(self) -> builtins.list[builtins.int]: ...
- def __getitem__(self, key: builtins.int) -> typing.Any: ...
+ def __getitem__(self, key: builtins.int, /) -> typing.Any: ...
def __len__(self) -> builtins.int: ...
def __new__(cls, _0: typing.Sequence[builtins.int]) -> MemoryValues.Binary: ...
-
+
@typing.final
class Integer(MemoryValues):
r"""
Values that correspond to a memory region declared with the INTEGER data type.
"""
+
__match_args__ = ("_0",)
@property
def _0(self) -> builtins.list[builtins.int]: ...
- def __getitem__(self, key: builtins.int) -> typing.Any: ...
+ def __getitem__(self, key: builtins.int, /) -> typing.Any: ...
def __len__(self) -> builtins.int: ...
def __new__(cls, _0: typing.Sequence[builtins.int]) -> MemoryValues.Integer: ...
-
+
@typing.final
class Real(MemoryValues):
r"""
Values that correspond to a memory region declared with the REAL data type.
"""
+
__match_args__ = ("_0",)
@property
def _0(self) -> builtins.list[builtins.float]: ...
- def __getitem__(self, key: builtins.int) -> typing.Any: ...
+ def __getitem__(self, key: builtins.int, /) -> typing.Any: ...
def __len__(self) -> builtins.int: ...
def __new__(cls, _0: typing.Sequence[builtins.float]) -> MemoryValues.Real: ...
-
@typing.final
class QPUResultData:
r"""
Encapsulates data returned from the QPU after executing a job.
-
+
`QpuResultData` contains "mappings", which map declared memory regions
in a program (ie. "ro[0]") to that region's readout key in `QpuResultData.readout_values`.
`readout_values` maps those readout keys to the values emitted for that region
across all shots.
-
+
Read more about QPU readout data in the
[QCS Documentation](https://docs.rigetti.com/qcs/guides/qpus-vs-qvms#qpu-readout-data)
"""
@@ -91,8 +108,19 @@ class QPUResultData:
r"""
Mapping of a readout values identifier (ie. "q0") to a set of `ReadoutValues`.
"""
- def __getnewargs__(self) -> tuple[builtins.dict[builtins.str, builtins.str], builtins.dict[builtins.str, ReadoutValues], builtins.dict[builtins.str, MemoryValues]]: ...
- def __new__(cls, mappings: typing.Mapping[builtins.str, builtins.str], readout_values: typing.Mapping[builtins.str, ReadoutValues], memory_values: typing.Mapping[builtins.str, MemoryValues]) -> QPUResultData:
+ def __getnewargs__(
+ self,
+ ) -> tuple[
+ builtins.dict[builtins.str, builtins.str],
+ builtins.dict[builtins.str, ReadoutValues],
+ builtins.dict[builtins.str, MemoryValues],
+ ]: ...
+ def __new__(
+ cls,
+ mappings: typing.Mapping[builtins.str, builtins.str],
+ readout_values: typing.Mapping[builtins.str, ReadoutValues],
+ memory_values: typing.Mapping[builtins.str, MemoryValues],
+ ) -> QPUResultData:
r"""
Construct a new `QPUResultData` from mappings and values.
"""
@@ -105,20 +133,20 @@ class QPUResultData:
r"""
Get the raw readout data as a flattened structure.
"""
- def to_register_map(self) -> RegisterMap:
+ def to_register_map(self) -> _qcs_sdk.RegisterMap:
r"""
Convert into a [`RegisterMap`].
-
+
The [`RegisterMatrix`] for each register will be
constructed such that each row contains all the final values in the register for a single shot.
-
+
# Errors
-
+
Returns a [`RegisterMatrixConversionError`] if the execution data for any of the
registers would result in a jagged matrix.
[`QpuResultData`] data is captured per measure,
meaning a value is returned for every measure to a memory reference, not just once per shot.
-
+
This is often the case in programs that use mid-circuit measurement or dynamic control flow,
where measurements to the same memory reference might occur multiple times in a shot, or be
skipped conditionally. In these cases, building a rectangular [`RegisterMatrix`] would
@@ -150,67 +178,78 @@ class RawQPUReadoutData:
class ReadoutValues:
r"""
A row of readout values from the QPU.
-
+
Each row contains all the values emitted to a memory reference across all shots.
There is a variant for each possible type the list of readout values could be.
"""
- def __getnewargs__(self) -> tuple[builtins.list[builtins.int] | builtins.list[builtins.float] | builtins.list[builtins.complex]]: ...
- def __new__(cls, values: typing.Sequence[builtins.int] | typing.Sequence[builtins.float] | typing.Sequence[builtins.complex]) -> ReadoutValues: ...
- def inner(self) -> builtins.list[builtins.int] | builtins.list[builtins.float] | builtins.list[builtins.complex]: ...
+ def __getnewargs__(
+ self,
+ ) -> tuple[builtins.list[builtins.int] | builtins.list[builtins.float] | builtins.list[builtins.complex]]: ...
+ def __new__(
+ cls, values: typing.Sequence[builtins.int] | typing.Sequence[builtins.float] | typing.Sequence[builtins.complex]
+ ) -> ReadoutValues: ...
+ def inner(
+ self,
+ ) -> builtins.list[builtins.int] | builtins.list[builtins.float] | builtins.list[builtins.complex]: ...
@typing.final
class Complex(ReadoutValues):
r"""
Complex readout values
"""
+
__match_args__ = ("_0",)
@property
def _0(self) -> builtins.list[builtins.complex]: ...
- def __getitem__(self, key: builtins.int) -> typing.Any: ...
+ def __getitem__(self, key: builtins.int, /) -> typing.Any: ...
def __len__(self) -> builtins.int: ...
def __new__(cls, _0: typing.Sequence[builtins.complex]) -> ReadoutValues.Complex: ...
-
+
@typing.final
class Integer(ReadoutValues):
r"""
Integer readout values
"""
+
__match_args__ = ("_0",)
@property
def _0(self) -> builtins.list[builtins.int]: ...
- def __getitem__(self, key: builtins.int) -> typing.Any: ...
+ def __getitem__(self, key: builtins.int, /) -> typing.Any: ...
def __len__(self) -> builtins.int: ...
def __new__(cls, _0: typing.Sequence[builtins.int]) -> ReadoutValues.Integer: ...
-
+
@typing.final
class Real(ReadoutValues):
r"""
Real numbered readout values
"""
+
__match_args__ = ("_0",)
@property
def _0(self) -> builtins.list[builtins.float]: ...
- def __getitem__(self, key: builtins.int) -> typing.Any: ...
+ def __getitem__(self, key: builtins.int, /) -> typing.Any: ...
def __len__(self) -> builtins.int: ...
def __new__(cls, _0: typing.Sequence[builtins.float]) -> ReadoutValues.Real: ...
-
-def list_quantum_processors(client: typing.Optional[QCSClient] = None, timeout: typing.Optional[builtins.float] = None) -> builtins.list[builtins.str]:
+def list_quantum_processors(
+ client: typing.Optional[client.QCSClient] = None, timeout: typing.Optional[builtins.float] = None
+) -> builtins.list[builtins.str]:
r"""
Returns all available Quantum Processor (QPU) IDs.
-
+
:param client: The ``Qcs`` client to use. Creates one using environment configuration if unset - see https://docs.rigetti.com/qcs/references/qcs-client-configuration
:param timeout: Maximum duration to wait for API calls to complete, in seconds.
-
+
:raises ListQuantumProcessorsError: If the request to list available QPU IDs failed.
"""
-def list_quantum_processors_async(client: typing.Optional[QCSClient] = None, timeout: typing.Optional[builtins.float] = None) -> collections.abc.Awaitable[builtins.list[builtins.str]]:
+def list_quantum_processors_async(
+ client: typing.Optional[client.QCSClient] = None, timeout: typing.Optional[builtins.float] = None
+) -> collections.abc.Awaitable[builtins.list[builtins.str]]:
r"""
Returns all available Quantum Processor (QPU) IDs.
-
+
:param client: The ``Qcs`` client to use. Creates one using environment configuration if unset - see https://docs.rigetti.com/qcs/references/qcs-client-configuration
:param timeout: Maximum duration to wait for API calls to complete, in seconds.
-
+
:raises ListQuantumProcessorsError: If the request to list available QPU IDs failed.
"""
-
diff --git a/crates/lib/python/qcs_sdk/qpu/api.pyi b/crates/lib/python/qcs_sdk/_qcs_sdk/qpu/api/__init__.pyi
similarity index 78%
rename from crates/lib/python/qcs_sdk/qpu/api.pyi
rename to crates/lib/python/qcs_sdk/_qcs_sdk/qpu/api/__init__.pyi
index 275b5ce9b..4f99b34ff 100644
--- a/crates/lib/python/qcs_sdk/qpu/api.pyi
+++ b/crates/lib/python/qcs_sdk/_qcs_sdk/qpu/api/__init__.pyi
@@ -1,21 +1,45 @@
# This file is automatically generated by pyo3_stub_gen
-# ruff: noqa: E501, F401
+# ruff: noqa: E501, F401, F403, F405
import builtins
import collections.abc
import datetime
+from qcs_sdk import _qcs_sdk
+from qcs_sdk._qcs_sdk import client
+from qcs_sdk._qcs_sdk import qpu
import typing
-from qcs_sdk import QcsSdkError
-from qcs_sdk.client import QCSClient
-from qcs_sdk.qpu import MemoryValues
+
+__all__ = [
+ "APIExecutionOptions",
+ "APIExecutionOptionsBuilder",
+ "BuildOptionsError",
+ "ConnectionStrategy",
+ "ExecutionOptions",
+ "ExecutionOptionsBuilder",
+ "ExecutionResult",
+ "ExecutionResults",
+ "QpuApiDuration",
+ "QpuApiError",
+ "SubmissionError",
+ "cancel_job",
+ "cancel_job_async",
+ "cancel_jobs",
+ "cancel_jobs_async",
+ "retrieve_results",
+ "retrieve_results_async",
+ "submit",
+ "submit_async",
+ "submit_with_parameter_batch",
+ "submit_with_parameter_batch_async",
+]
@typing.final
class APIExecutionOptions:
r"""
Options available when executing a job on a QPU, particular to the execution service's API.
-
+
This is a conventent alias for [`InnerApiExecutionOptions`] which provides a builder.
-
+
Use [`Default`] to get a reasonable set of defaults, or start with [`ApiExecutionOptionsBuilder`]
to build a custom set of options.
"""
@@ -28,17 +52,19 @@ class APIExecutionOptions:
def timeout(self) -> typing.Optional[QpuApiDuration]:
r"""
Get the configured `timeout` value.
-
+
Note, this is the timeout while running a job; the job will be evicted from
the hardware once this time has elapsed.
-
+
If unset, the job's estimated duration will be used;
if the job does not have an estimated duration, the default
timeout is selected by the service.
-
+
The service may also enforce a maximum value for this field.
"""
- def __new__(cls, bypass_settings_protection: builtins.bool = False, timeout: typing.Optional[datetime.timedelta] = None) -> APIExecutionOptions: ...
+ def __new__(
+ cls, bypass_settings_protection: builtins.bool = False, timeout: typing.Optional[datetime.timedelta] = None
+ ) -> APIExecutionOptions: ...
def __repr__(self) -> builtins.str:
r"""
Implements `__repr__` for Python in terms of the Rust
@@ -61,7 +87,7 @@ class APIExecutionOptionsBuilder:
def bypass_settings_protection(self) -> typing.Never:
r"""
DO NOT CALL THIS METHOD.
-
+
`mypy` requires write-only properties to have a getter,
but this method is not actually available at runtime.
"""
@@ -71,7 +97,7 @@ class APIExecutionOptionsBuilder:
def timeout(self) -> typing.Never:
r"""
DO NOT CALL THIS METHOD.
-
+
`mypy` requires write-only properties to have a getter,
but this method is not actually available at runtime.
"""
@@ -86,6 +112,7 @@ class BuildOptionsError(QpuApiError):
r"""
Errors building execution options.
"""
+
...
class ConnectionStrategy:
@@ -107,53 +134,56 @@ class ConnectionStrategy:
Connect directly to the default endpoint, bypassing the gateway. Should only be used when you
have direct network access and an active reservation.
"""
+
__match_args__ = ()
- def __getitem__(self, key: builtins.int) -> typing.Any: ...
+ def __getitem__(self, key: builtins.int, /) -> typing.Any: ...
def __len__(self) -> builtins.int: ...
def __new__(cls) -> ConnectionStrategy.DirectAccess: ...
-
+
@typing.final
class EndpointAddress(ConnectionStrategy):
r"""
Connect directly to a specific endpoint by its gRPC address, bypassing the gateway.
-
+
Should only be used when you have direct network access.
"""
+
__match_args__ = ("_0",)
@property
def _0(self) -> builtins.str: ...
- def __getitem__(self, key: builtins.int) -> typing.Any: ...
+ def __getitem__(self, key: builtins.int, /) -> typing.Any: ...
def __len__(self) -> builtins.int: ...
def __new__(cls, _0: builtins.str) -> ConnectionStrategy.EndpointAddress: ...
-
+
@typing.final
class EndpointId(ConnectionStrategy):
r"""
Connect directly to a specific endpoint using its ID.
"""
+
__match_args__ = ("_0",)
@property
def _0(self) -> builtins.str: ...
- def __getitem__(self, key: builtins.int) -> typing.Any: ...
+ def __getitem__(self, key: builtins.int, /) -> typing.Any: ...
def __len__(self) -> builtins.int: ...
def __new__(cls, _0: builtins.str) -> ConnectionStrategy.EndpointId: ...
-
+
@typing.final
class Gateway(ConnectionStrategy):
r"""
Connect through the publicly accessible gateway.
"""
+
__match_args__ = ()
- def __getitem__(self, key: builtins.int) -> typing.Any: ...
+ def __getitem__(self, key: builtins.int, /) -> typing.Any: ...
def __len__(self) -> builtins.int: ...
def __new__(cls) -> ConnectionStrategy.Gateway: ...
-
@typing.final
class ExecutionOptions:
r"""
Options available when executing a job on a QPU.
-
+
Use [`Default`] to get a reasonable set of defaults, or start with [`ExecutionOptionsBuilder`]
to build a custom set of options.
"""
@@ -166,9 +196,16 @@ class ExecutionOptions:
"""
@property
def timeout_seconds(self) -> typing.Optional[builtins.float]: ...
- def __eq__(self, other: builtins.object) -> builtins.bool: ...
- def __getnewargs__(self) -> tuple[ConnectionStrategy, typing.Optional[datetime.timedelta], typing.Optional[APIExecutionOptions]]: ...
- def __new__(cls, connection_strategy: ConnectionStrategy = ..., timeout: typing.Optional[datetime.timedelta] = ..., api_options: typing.Optional[APIExecutionOptions] = None) -> ExecutionOptions: ...
+ def __eq__(self, other: builtins.object, /) -> builtins.bool: ...
+ def __getnewargs__(
+ self,
+ ) -> tuple[ConnectionStrategy, typing.Optional[datetime.timedelta], typing.Optional[APIExecutionOptions]]: ...
+ def __new__(
+ cls,
+ connection_strategy: ConnectionStrategy = ...,
+ timeout: typing.Optional[datetime.timedelta] = ...,
+ api_options: typing.Optional[APIExecutionOptions] = None,
+ ) -> ExecutionOptions: ...
def __repr__(self) -> builtins.str:
r"""
Implements `__repr__` for Python in terms of the Rust
@@ -188,7 +225,7 @@ class ExecutionOptionsBuilder:
def api_options(self) -> typing.Never:
r"""
DO NOT CALL THIS METHOD.
-
+
`mypy` requires write-only properties to have a getter,
but this method is not actually available at runtime.
"""
@@ -198,7 +235,7 @@ class ExecutionOptionsBuilder:
def connection_strategy(self) -> typing.Never:
r"""
DO NOT CALL THIS METHOD.
-
+
`mypy` requires write-only properties to have a getter,
but this method is not actually available at runtime.
"""
@@ -208,7 +245,7 @@ class ExecutionOptionsBuilder:
def timeout_seconds(self) -> typing.Never:
r"""
DO NOT CALL THIS METHOD.
-
+
`mypy` requires write-only properties to have a getter,
but this method is not actually available at runtime.
"""
@@ -240,7 +277,9 @@ class ExecutionResult:
The shape of the result data.
"""
def __getnewargs__(self) -> tuple[builtins.list[builtins.int] | builtins.list[builtins.complex]]: ...
- def __new__(cls, register: typing.Sequence[builtins.int] | typing.Sequence[builtins.complex]) -> ExecutionResult: ...
+ def __new__(
+ cls, register: typing.Sequence[builtins.int] | typing.Sequence[builtins.complex]
+ ) -> ExecutionResult: ...
@staticmethod
def from_register(register: typing.Sequence[builtins.int] | typing.Sequence[builtins.complex]) -> ExecutionResult:
r"""
@@ -256,7 +295,7 @@ class ExecutionResults:
def buffers(self) -> builtins.dict[builtins.str, ExecutionResult]:
r"""
The readout results of execution, mapping a published filter node to its data.
-
+
See `TranslationResult.ro_sources` which provides the mapping from the filter node name
to the name of the memory declaration in the source program.
"""
@@ -266,12 +305,17 @@ class ExecutionResults:
The time spent executing the program.
"""
@property
- def memory(self) -> builtins.dict[builtins.str, MemoryValues]:
+ def memory(self) -> builtins.dict[builtins.str, qpu.MemoryValues]:
r"""
The final state of memory for parameters that were read from and written to during
the execution of the program.
"""
- def __new__(cls, buffers: typing.Mapping[builtins.str, ExecutionResult], memory: typing.Mapping[builtins.str, MemoryValues], execution_duration_microseconds: typing.Optional[builtins.int] = None) -> ExecutionResults: ...
+ def __new__(
+ cls,
+ buffers: typing.Mapping[builtins.str, ExecutionResult],
+ memory: typing.Mapping[builtins.str, qpu.MemoryValues],
+ execution_duration_microseconds: typing.Optional[builtins.int] = None,
+ ) -> ExecutionResults: ...
@typing.final
class QpuApiDuration:
@@ -284,120 +328,158 @@ class QpuApiDuration:
def seconds(self) -> builtins.int: ...
def __new__(cls, seconds: builtins.int, nanos: builtins.int) -> QpuApiDuration: ...
-class QpuApiError(QcsSdkError):
+class QpuApiError(_qcs_sdk.QcsSdkError):
r"""
Errors that can occur while attempting to establish a connection to the QPU.
"""
+
...
class SubmissionError(QpuApiError):
r"""
Errors that may occur when submitting a program for execution.
"""
+
...
-def cancel_job(job_id: builtins.str, quantum_processor_id: typing.Optional[builtins.str] = None, client: typing.Optional[QCSClient] = None, execution_options: typing.Optional[ExecutionOptions] = None) -> None:
+def cancel_job(
+ job_id: builtins.str,
+ quantum_processor_id: typing.Optional[builtins.str] = None,
+ client: typing.Optional[client.QCSClient] = None,
+ execution_options: typing.Optional[ExecutionOptions] = None,
+) -> None:
r"""
Cancel a job that has yet to begin executing.
-
+
This action is *not* atomic, and will attempt to cancel a job even if it cannot be cancelled. A
job can be cancelled only if it has not yet started executing.
-
+
Success response indicates only that the request was received. Cancellation is not guaranteed,
as it is based on job state at the time of cancellation, and is completed on a best effort
basis.
-
+
:param job_id: The job ID to cancel.
:param quantum_processor_id: The quantum processor to execute the job on. This parameter is required unless using the ``ConnectionStrategy.endpoint_id()`` or ``ConnectionStrategy.endpoint_address()`` execution option.
:param client: The ``Qcs`` client to use.
:param execution_options: The ``ExecutionOptions`` to use.
"""
-def cancel_job_async(job_id: builtins.str, quantum_processor_id: typing.Optional[builtins.str] = None, client: typing.Optional[QCSClient] = None, execution_options: typing.Optional[ExecutionOptions] = None) -> collections.abc.Awaitable[None]:
+def cancel_job_async(
+ job_id: builtins.str,
+ quantum_processor_id: typing.Optional[builtins.str] = None,
+ client: typing.Optional[client.QCSClient] = None,
+ execution_options: typing.Optional[ExecutionOptions] = None,
+) -> collections.abc.Awaitable[None]:
r"""
Cancel a job that has yet to begin executing.
-
+
This action is *not* atomic, and will attempt to cancel a job even if it cannot be cancelled. A
job can be cancelled only if it has not yet started executing.
-
+
Success response indicates only that the request was received. Cancellation is not guaranteed,
as it is based on job state at the time of cancellation, and is completed on a best effort
basis.
-
+
:param job_id: The job ID to cancel.
:param quantum_processor_id: The quantum processor to execute the job on. This parameter is required unless using the ``ConnectionStrategy.endpoint_id()`` or ``ConnectionStrategy.endpoint_address()`` execution option.
:param client: The ``Qcs`` client to use.
:param execution_options: The ``ExecutionOptions`` to use.
"""
-def cancel_jobs(job_ids: typing.Sequence[builtins.str], quantum_processor_id: typing.Optional[builtins.str] = None, client: typing.Optional[QCSClient] = None, execution_options: typing.Optional[ExecutionOptions] = None) -> None:
+def cancel_jobs(
+ job_ids: typing.Sequence[builtins.str],
+ quantum_processor_id: typing.Optional[builtins.str] = None,
+ client: typing.Optional[client.QCSClient] = None,
+ execution_options: typing.Optional[ExecutionOptions] = None,
+) -> None:
r"""
Cancel all given jobs that have yet to begin executing.
-
+
This action is *not* atomic, and will attempt to cancel every job even when some jobs cannot be
cancelled. A job can be cancelled only if it has not yet started executing.
-
+
Success response indicates only that the request was received. Cancellation is not guaranteed,
as it is based on job state at the time of cancellation, and is completed on a best effort
basis.
-
+
:param job_ids: The job IDs to cancel.
:param quantum_processor_id: The quantum processor to execute the job on. This parameter is required unless using the ``ConnectionStrategy.endpoint_id()`` or ``ConnectionStrategy.endpoint_address()`` execution option.
:param client: The ``Qcs`` client to use.
:param execution_options: The ``ExecutionOptions`` to use.
"""
-def cancel_jobs_async(job_ids: typing.Sequence[builtins.str], quantum_processor_id: typing.Optional[builtins.str] = None, client: typing.Optional[QCSClient] = None, execution_options: typing.Optional[ExecutionOptions] = None) -> collections.abc.Awaitable[None]:
+def cancel_jobs_async(
+ job_ids: typing.Sequence[builtins.str],
+ quantum_processor_id: typing.Optional[builtins.str] = None,
+ client: typing.Optional[client.QCSClient] = None,
+ execution_options: typing.Optional[ExecutionOptions] = None,
+) -> collections.abc.Awaitable[None]:
r"""
Cancel all given jobs that have yet to begin executing.
-
+
This action is *not* atomic, and will attempt to cancel every job even when some jobs cannot be
cancelled. A job can be cancelled only if it has not yet started executing.
-
+
Success response indicates only that the request was received. Cancellation is not guaranteed,
as it is based on job state at the time of cancellation, and is completed on a best effort
basis.
-
+
:param job_ids: The job IDs to cancel.
:param quantum_processor_id: The quantum processor to execute the job on. This parameter is required unless using the ``ConnectionStrategy.endpoint_id()`` or ``ConnectionStrategy.endpoint_address()`` execution option.
:param client: The ``Qcs`` client to use.
:param execution_options: The ``ExecutionOptions`` to use.
"""
-def retrieve_results(job_id: builtins.str, quantum_processor_id: typing.Optional[builtins.str] = None, client: typing.Optional[QCSClient] = None, execution_options: typing.Optional[ExecutionOptions] = None) -> ExecutionResults:
+def retrieve_results(
+ job_id: builtins.str,
+ quantum_processor_id: typing.Optional[builtins.str] = None,
+ client: typing.Optional[client.QCSClient] = None,
+ execution_options: typing.Optional[ExecutionOptions] = None,
+) -> ExecutionResults:
r"""
Fetches execution results for the given QCS Job ID.
-
+
:param job_id: The ID of the job to retrieve results for.
:param quantum_processor_id: The ID of the quantum processor the job ran on. This field is required, unless being used with the ``ConnectionStrategy.endpoint_id()`` or ``ConnectionStrategy.endpoint_address()`` execution option.
:param client: The ``Qcs`` client to use. Creates one using environment configuration if unset - see https://docs.rigetti.com/qcs/references/qcs-client-configuration
:param execution_options: The ``ExecutionOptions`` to use.
-
+
:returns: Results from execution.
-
+
:raises LoadClientError: If there is an issue loading the QCS Client configuration.
:raises QpuApiError: If there was a problem retrieving the results.
"""
-def retrieve_results_async(job_id: builtins.str, quantum_processor_id: typing.Optional[builtins.str] = None, client: typing.Optional[QCSClient] = None, execution_options: typing.Optional[ExecutionOptions] = None) -> collections.abc.Awaitable[ExecutionResults]:
+def retrieve_results_async(
+ job_id: builtins.str,
+ quantum_processor_id: typing.Optional[builtins.str] = None,
+ client: typing.Optional[client.QCSClient] = None,
+ execution_options: typing.Optional[ExecutionOptions] = None,
+) -> collections.abc.Awaitable[ExecutionResults]:
r"""
Fetches execution results for the given QCS Job ID.
-
+
:param job_id: The ID of the job to retrieve results for.
:param quantum_processor_id: The ID of the quantum processor the job ran on. This field is required, unless being used with the ``ConnectionStrategy.endpoint_id()`` or ``ConnectionStrategy.endpoint_address()`` execution option.
:param client: The ``Qcs`` client to use. Creates one using environment configuration if unset - see https://docs.rigetti.com/qcs/references/qcs-client-configuration
:param execution_options: The ``ExecutionOptions`` to use.
-
+
:returns: Results from execution.
-
+
:raises LoadClientError: If there is an issue loading the QCS Client configuration.
:raises QpuApiError: If there was a problem retrieving the results.
"""
-def submit(program: builtins.str, patch_values: typing.Mapping[builtins.str, typing.Sequence[builtins.float]], quantum_processor_id: typing.Optional[builtins.str] = None, client: typing.Optional[QCSClient] = None, execution_options: typing.Optional[ExecutionOptions] = None) -> builtins.str:
+def submit(
+ program: builtins.str,
+ patch_values: typing.Mapping[builtins.str, typing.Sequence[builtins.float]],
+ quantum_processor_id: typing.Optional[builtins.str] = None,
+ client: typing.Optional[client.QCSClient] = None,
+ execution_options: typing.Optional[ExecutionOptions] = None,
+) -> builtins.str:
r"""
Submits an executable `program` to be run on the specified QPU.
-
+
:param program: An executable program (see ``qcs_sdk.qpu.translation.translate``).
:param patch_values: A mapping of symbols to their desired values (see ``build_patch_values``).
:param quantum_processor_id: The ID of the quantum processor to run the executable on.
@@ -410,17 +492,23 @@ def submit(program: builtins.str, patch_values: typing.Mapping[builtins.str, typ
If the connection strategy option used is ``ConnectionStrategy.endpoint_id("endpoint_id")``
or ``ConnectionStrategy.endpoint_address("http://some_endpoint_address")``,
then direct access to "endpoint_id" overrides the ``quantum_processor_id`` parameter.
-
+
:returns: The ID of the submitted job which can be used to fetch results.
-
+
:raises LoadClientError: If there is an issue loading the QCS Client configuration.
:raises SubmissionError: If there was a problem submitting the program for execution.
"""
-def submit_async(program: builtins.str, patch_values: typing.Mapping[builtins.str, typing.Sequence[builtins.float]], quantum_processor_id: typing.Optional[builtins.str] = None, client: typing.Optional[QCSClient] = None, execution_options: typing.Optional[ExecutionOptions] = None) -> collections.abc.Awaitable[builtins.str]:
+def submit_async(
+ program: builtins.str,
+ patch_values: typing.Mapping[builtins.str, typing.Sequence[builtins.float]],
+ quantum_processor_id: typing.Optional[builtins.str] = None,
+ client: typing.Optional[client.QCSClient] = None,
+ execution_options: typing.Optional[ExecutionOptions] = None,
+) -> collections.abc.Awaitable[builtins.str]:
r"""
Submits an executable `program` to be run on the specified QPU.
-
+
:param program: An executable program (see ``qcs_sdk.qpu.translation.translate``).
:param patch_values: A mapping of symbols to their desired values (see ``build_patch_values``).
:param quantum_processor_id: The ID of the quantum processor to run the executable on.
@@ -433,52 +521,63 @@ def submit_async(program: builtins.str, patch_values: typing.Mapping[builtins.st
If the connection strategy option used is ``ConnectionStrategy.endpoint_id("endpoint_id")``
or ``ConnectionStrategy.endpoint_address("http://some_endpoint_address")``,
then direct access to "endpoint_id" overrides the ``quantum_processor_id`` parameter.
-
+
:returns: The ID of the submitted job which can be used to fetch results.
-
+
:raises LoadClientError: If there is an issue loading the QCS Client configuration.
:raises SubmissionError: If there was a problem submitting the program for execution.
"""
-def submit_with_parameter_batch(program: builtins.str, patch_values: typing.Sequence[typing.Mapping[builtins.str, typing.Sequence[builtins.float]]], quantum_processor_id: typing.Optional[builtins.str] = None, client: typing.Optional[QCSClient] = None, execution_options: typing.Optional[ExecutionOptions] = None) -> builtins.list[builtins.str]:
+def submit_with_parameter_batch(
+ program: builtins.str,
+ patch_values: typing.Sequence[typing.Mapping[builtins.str, typing.Sequence[builtins.float]]],
+ quantum_processor_id: typing.Optional[builtins.str] = None,
+ client: typing.Optional[client.QCSClient] = None,
+ execution_options: typing.Optional[ExecutionOptions] = None,
+) -> builtins.list[builtins.str]:
r"""
Execute a compiled program on a QPU with multiple sets of ``patch_values``.
-
+
This action is *atomic* in that all jobs will be queued, or none of them will. On success, this
function will return a list of strings where the length and order correspond to the
``patch_values`` given. However, note that execution in the order of given patch values is not
guaranteed. If there is a failure to queue any of the jobs, then none will be queued.
-
+
:param program: An executable program (see ``translate``).
:param patch_values: An iterable containing one or more mapping of symbols to their desired values.
:param quantum_processor_id: The ID of the quantum processor to run the executable on. This field is required, unless being used with the ``ConnectionStrategy.endpoint_id()`` or ``ConnectionStrategy.endpoint_address()`` execution option.
:param client: The ``Qcs`` client to use. Creates one using environment configuration if unset - see https://docs.rigetti.com/qcs/references/qcs-client-configuration
:param execution_options: The ``ExecutionOptions`` to use.
-
+
:returns: The IDs of the submitted jobs which can be used to fetch results.
-
+
:raises LoadClientError: If there is an issue loading the QCS Client configuration.
:raises SubmissionError: If there was a problem submitting any of the jobs for execution, or if no ``patch_values`` are given.
"""
-def submit_with_parameter_batch_async(program: builtins.str, patch_values: typing.Sequence[typing.Mapping[builtins.str, typing.Sequence[builtins.float]]], quantum_processor_id: typing.Optional[builtins.str] = None, client: typing.Optional[QCSClient] = None, execution_options: typing.Optional[ExecutionOptions] = None) -> collections.abc.Awaitable[builtins.list[builtins.str]]:
+def submit_with_parameter_batch_async(
+ program: builtins.str,
+ patch_values: typing.Sequence[typing.Mapping[builtins.str, typing.Sequence[builtins.float]]],
+ quantum_processor_id: typing.Optional[builtins.str] = None,
+ client: typing.Optional[client.QCSClient] = None,
+ execution_options: typing.Optional[ExecutionOptions] = None,
+) -> collections.abc.Awaitable[builtins.list[builtins.str]]:
r"""
Execute a compiled program on a QPU with multiple sets of ``patch_values``.
-
+
This action is *atomic* in that all jobs will be queued, or none of them will. On success, this
function will return a list of strings where the length and order correspond to the
``patch_values`` given. However, note that execution in the order of given patch values is not
guaranteed. If there is a failure to queue any of the jobs, then none will be queued.
-
+
:param program: An executable program (see ``translate``).
:param patch_values: An iterable containing one or more mapping of symbols to their desired values.
:param quantum_processor_id: The ID of the quantum processor to run the executable on. This field is required, unless being used with the ``ConnectionStrategy.endpoint_id()`` or ``ConnectionStrategy.endpoint_address()`` execution option.
:param client: The ``Qcs`` client to use. Creates one using environment configuration if unset - see https://docs.rigetti.com/qcs/references/qcs-client-configuration
:param execution_options: The ``ExecutionOptions`` to use.
-
+
:returns: The IDs of the submitted jobs which can be used to fetch results.
-
+
:raises LoadClientError: If there is an issue loading the QCS Client configuration.
:raises SubmissionError: If there was a problem submitting any of the jobs for execution, or if no ``patch_values`` are given.
"""
-
diff --git a/crates/lib/python/qcs_sdk/qpu/experimental/__init__.pyi b/crates/lib/python/qcs_sdk/_qcs_sdk/qpu/experimental/__init__.pyi
similarity index 54%
rename from crates/lib/python/qcs_sdk/qpu/experimental/__init__.pyi
rename to crates/lib/python/qcs_sdk/_qcs_sdk/qpu/experimental/__init__.pyi
index 042d20ede..330680465 100644
--- a/crates/lib/python/qcs_sdk/qpu/experimental/__init__.pyi
+++ b/crates/lib/python/qcs_sdk/_qcs_sdk/qpu/experimental/__init__.pyi
@@ -1,5 +1,8 @@
# This file is automatically generated by pyo3_stub_gen
-# ruff: noqa: E501, F401
+# ruff: noqa: E501, F401, F403, F405
from . import random
+__all__ = [
+ "random",
+]
diff --git a/crates/lib/python/qcs_sdk/qpu/experimental/random.pyi b/crates/lib/python/qcs_sdk/_qcs_sdk/qpu/experimental/random/__init__.pyi
similarity index 86%
rename from crates/lib/python/qcs_sdk/qpu/experimental/random.pyi
rename to crates/lib/python/qcs_sdk/_qcs_sdk/qpu/experimental/random/__init__.pyi
index 8c98fd775..9e631e445 100644
--- a/crates/lib/python/qcs_sdk/qpu/experimental/random.pyi
+++ b/crates/lib/python/qcs_sdk/_qcs_sdk/qpu/experimental/random/__init__.pyi
@@ -1,9 +1,17 @@
# This file is automatically generated by pyo3_stub_gen
-# ruff: noqa: E501, F401
+# ruff: noqa: E501, F401, F403, F405
import builtins
+from qcs_sdk import _qcs_sdk
import typing
-from qcs_sdk import QcsSdkError
+
+__all__ = [
+ "ChooseRandomRealSubRegions",
+ "PrngSeedValue",
+ "RandomError",
+ "choose_random_real_sub_region_indices",
+ "lfsr_v1_next",
+]
@typing.final
class ChooseRandomRealSubRegions:
@@ -11,7 +19,8 @@ class ChooseRandomRealSubRegions:
An [`ExternedCall`] that may be used to select one or more random
sub-regions from a source array of real values to a destination array.
"""
- NAME: builtins.str = 'choose_random_real_sub_regions'
+
+ NAME: builtins.str = "choose_random_real_sub_regions"
r"""
The name of the function referenced by the `PRAGMA EXTERN` and `CALL` instructions.
"""
@@ -19,9 +28,9 @@ class ChooseRandomRealSubRegions:
def build_signature() -> builtins.str:
r"""
Build the signature for the `PRAGMA EXTERN choose_random_real_sub_regions` instruction.
-
+
The signature expressed in Quil is as follows:
-
+
```text
"(destination : mut REAL[], source : REAL[], sub_region_size : INTEGER, seed : mut INTEGER)"
```
@@ -37,46 +46,49 @@ class PrngSeedValue:
def __new__(cls, value: builtins.int) -> PrngSeedValue:
r"""
Attempt to create a new instance of `PrngSeedValue` from a `u64`.
-
+
# Errors
-
+
Returns [`Error::InvalidSeed`] if the value is not in range `[1, MAX_SEQUENCER_VALUE]`
or if it is not losslessly convertible to `f64`.
"""
def as_f64(self) -> builtins.float: ...
-class RandomError(QcsSdkError):
+class RandomError(_qcs_sdk.QcsSdkError):
r"""
Errors that may occur using the randomization primitives defined in this module.
"""
+
...
-def choose_random_real_sub_region_indices(seed: PrngSeedValue, start_index: builtins.int, series_length: builtins.int, sub_region_count: builtins.int) -> builtins.list[builtins.int]:
+def choose_random_real_sub_region_indices(
+ seed: PrngSeedValue, start_index: builtins.int, series_length: builtins.int, sub_region_count: builtins.int
+) -> builtins.list[builtins.int]:
r"""
Given a seed, start index, series length, and sub-region count, this function
will generate and return the sequence of pseudo-randomly chosen indices on
the Rigetti control systems.
-
+
For instance, if the following Quil program is run for 100 shots:
-
+
```quil
# presumed sub-region size is 3.
DECLARE destination REAL[6] # prng invocations per shot = (6 / sub_region_size) = 2
DECLARE source REAL[12] # implicit sub-region count = (12 / sub_region_size) = 4
DECLARE seed INTEGER[1]
DECLARE ro BIT[1]
-
+
DELAY 0 1e-6
-
+
PRAGMA EXTERN choose_random_real_sub_regions "(destination : mut REAL[], source : REAL[], sub_region_size : INTEGER, seed : mut INTEGER)"
CALL choose_random_real_sub_regions destination source 3 seed
```
-
+
with a seed of 639,523, the following will provide the random sequence of sub-region indices:
-
+
```rust
use qcs::qpu::experimental::random::{choose_random_real_sub_region_indices, PrngSeedValue};
-
+
let seed = PrngSeedValue::try_new(639_523).unwrap();
let start_index = 0;
let prng_invocations_per_shot = 2;
@@ -95,4 +107,3 @@ def lfsr_v1_next(seed: PrngSeedValue) -> builtins.int:
it implements a 48-bit LFSR with taps at 0-based indices 47, 46, 20, and 19.
The taps have been shown to produce maximal sequence lengths for 48-bit strings.
"""
-
diff --git a/crates/lib/python/qcs_sdk/qpu/isa.pyi b/crates/lib/python/qcs_sdk/_qcs_sdk/qpu/isa/__init__.pyi
similarity index 83%
rename from crates/lib/python/qcs_sdk/qpu/isa.pyi
rename to crates/lib/python/qcs_sdk/_qcs_sdk/qpu/isa/__init__.pyi
index 1f29041ac..1d1f71ebd 100644
--- a/crates/lib/python/qcs_sdk/qpu/isa.pyi
+++ b/crates/lib/python/qcs_sdk/_qcs_sdk/qpu/isa/__init__.pyi
@@ -1,30 +1,49 @@
# This file is automatically generated by pyo3_stub_gen
-# ruff: noqa: E501, F401
+# ruff: noqa: E501, F401, F403, F405
import builtins
import collections.abc
import enum
+from qcs_sdk import _qcs_sdk
+from qcs_sdk._qcs_sdk import client
import typing
-from qcs_sdk import QcsSdkError
-from qcs_sdk.client import QCSClient
+
+__all__ = [
+ "Architecture",
+ "Characteristic",
+ "Edge",
+ "Family",
+ "GetISAError",
+ "InstructionSetArchitecture",
+ "ListISAsError",
+ "Node",
+ "Operation",
+ "OperationSite",
+ "Parameter",
+ "SerializeISAError",
+ "get_instruction_set_architecture",
+ "get_instruction_set_architecture_async",
+ "list_instruction_set_architectures",
+ "list_instruction_set_architectures_async",
+]
@typing.final
class Architecture:
r"""
Represents the logical underlying architecture of a quantum processor.
-
+
The architecture is defined in detail by the nodes and edges that constitute the quantum
processor. This defines the set of all nodes that could be operated upon, and indicates to
some approximation their physical layout. The main purpose of this is to support geometry
calculations that are independent of the available operations, and rendering ISA-based
information. Architecture layouts are defined by the `family`, as follows.
-
+
The "Aspen" family of quantum processor indicates a 2D planar grid layout of octagon unit
cells. The `node_id` in this architecture is computed as :math:`100 p_y + 10 p_x + p_u` where
:math:`p_y` is the zero-based Y position in the unit cell grid, :math:`p_x` is the zero-based
X position in the unit cell grid, and :math:`p_u` is the zero-based position in the octagon
unit cell and always ranges from 0 to 7.
-
+
The "Ankaa" architecture is based on a grid topology; having, in "vertical" orientation,
qubits numbered starting from 0 at the top-left and increasing from left to right,
then top to bottom, so the final qubit is in the bottom-right. Each qubit is connected
@@ -33,7 +52,7 @@ class Architecture:
alternating with vertical rows. Ankaa chips are, in vertical orientation,
7 qubits wide and 12 tall. This architecture may also be presented in "landscape"
orientation, which is a simple 90-degree clockwise rotation of the vertical orientation.
-
+
Note that the operations that are actually available are defined entirely by ``Operation``
instances. The presence of a node or edge in the ``Architecture`` model provides no guarantee
that any 1Q or 2Q operation will be available to users writing QUIL programs.
@@ -44,7 +63,7 @@ class Architecture:
A list of all computational edges in the instruction set architecture.
"""
@edges.setter
- def edges(self, value: builtins.list[Edge]) -> None:
+ def edges(self, value: typing.Sequence[Edge]) -> None:
r"""
A list of all computational edges in the instruction set architecture.
"""
@@ -64,12 +83,14 @@ class Architecture:
A list of all computational nodes in the instruction set architecture.
"""
@nodes.setter
- def nodes(self, value: builtins.list[Node]) -> None:
+ def nodes(self, value: typing.Sequence[Node]) -> None:
r"""
A list of all computational nodes in the instruction set architecture.
"""
- def __eq__(self, other: builtins.object) -> builtins.bool: ...
- def __new__(cls, edges: typing.Sequence[Edge], family: typing.Optional[Family | builtins.str], nodes: typing.Sequence[Node]) -> Architecture: ...
+ def __eq__(self, other: builtins.object, /) -> builtins.bool: ...
+ def __new__(
+ cls, edges: typing.Sequence[Edge], family: typing.Optional[Family | builtins.str], nodes: typing.Sequence[Node]
+ ) -> Architecture: ...
def __repr__(self) -> builtins.str:
r"""
Implements `__repr__` for Python in terms of the Rust
@@ -107,7 +128,7 @@ class Characteristic:
The list of architecture node ids for the site where the characteristic is measured, if that is different from the site of the enclosing operation. None if it is the same. The order of this or the enclosing node ids obey the definition of node symmetry from the enclosing operation.
"""
@node_ids.setter
- def node_ids(self, value: typing.Optional[builtins.list[builtins.int]]) -> None:
+ def node_ids(self, value: typing.Optional[typing.Sequence[builtins.int]]) -> None:
r"""
The list of architecture node ids for the site where the characteristic is measured, if that is different from the site of the enclosing operation. None if it is the same. The order of this or the enclosing node ids obey the definition of node symmetry from the enclosing operation.
"""
@@ -117,7 +138,7 @@ class Characteristic:
The optional ordered list of parameter values used to generate the characteristic. The order matches the parameters in the enclosing operation, and so the lengths of these two lists must match.
"""
@parameter_values.setter
- def parameter_values(self, value: typing.Optional[builtins.list[builtins.float]]) -> None:
+ def parameter_values(self, value: typing.Optional[typing.Sequence[builtins.float]]) -> None:
r"""
The optional ordered list of parameter values used to generate the characteristic. The order matches the parameters in the enclosing operation, and so the lengths of these two lists must match.
"""
@@ -141,7 +162,7 @@ class Characteristic:
r"""
The characteristic value measured.
"""
- def __eq__(self, other: builtins.object) -> builtins.bool: ...
+ def __eq__(self, other: builtins.object, /) -> builtins.bool: ...
def __new__(cls, name: builtins.str, timestamp: builtins.str, value: builtins.float) -> Characteristic:
r"""
A measured characteristic of an operation.
@@ -156,11 +177,11 @@ class Characteristic:
class Edge:
r"""
A degree-two logical connection in the quantum processor's architecture.
-
+
The existence of an edge in the ISA ``Architecture`` does not necessarily mean that a given 2Q
operation will be available on the edge. This information is conveyed by the presence of the
two `node_id` values in instances of ``Instruction``.
-
+
Note that edges are undirected in this model. Thus edge :math:`(a, b)` is equivalent to edge
:math:`(b, a)`.
"""
@@ -171,12 +192,12 @@ class Edge:
Order is not important; an architecture edge is treated as undirected.
"""
@node_ids.setter
- def node_ids(self, value: builtins.list[builtins.int]) -> None:
+ def node_ids(self, value: typing.Sequence[builtins.int]) -> None:
r"""
The integer ids of the computational nodes at the two ends of the edge.
Order is not important; an architecture edge is treated as undirected.
"""
- def __eq__(self, other: builtins.object) -> builtins.bool: ...
+ def __eq__(self, other: builtins.object, /) -> builtins.bool: ...
def __new__(cls, node_ids: typing.Sequence[builtins.int]) -> Edge: ...
def __repr__(self) -> builtins.str:
r"""
@@ -184,21 +205,22 @@ class Edge:
[`Debug`](std::fmt::Debug) implementation.
"""
-class GetISAError(QcsSdkError):
+class GetISAError(_qcs_sdk.QcsSdkError):
r"""
Errors raised due to failure to get an ISA.
"""
+
...
@typing.final
class InstructionSetArchitecture:
r"""
The native instruction set architecture (ISA) of a quantum processor, annotated with characteristics.
-
+
The operations described by the `instructions` field are named by their QUIL instruction name,
while the operation described by the `benchmarks` field are named by their benchmark routine
and are a future extension point.
-
+
The characteristics that annotate both instructions and benchmarks assist the user to generate
the best native QUIL program for a desired task, and so are provided as part of the native ISA.
"""
@@ -212,7 +234,7 @@ class InstructionSetArchitecture:
The list of benchmarks that have characterized the quantum processor.
"""
@benchmarks.setter
- def benchmarks(self, value: builtins.list[Operation]) -> None:
+ def benchmarks(self, value: typing.Sequence[Operation]) -> None:
r"""
The list of benchmarks that have characterized the quantum processor.
"""
@@ -222,7 +244,7 @@ class InstructionSetArchitecture:
The list of native QUIL instructions supported by the quantum processor.
"""
@instructions.setter
- def instructions(self, value: builtins.list[Operation]) -> None:
+ def instructions(self, value: typing.Sequence[Operation]) -> None:
r"""
The list of native QUIL instructions supported by the quantum processor.
"""
@@ -236,8 +258,14 @@ class InstructionSetArchitecture:
r"""
The name of the quantum processor.
"""
- def __eq__(self, other: builtins.object) -> builtins.bool: ...
- def __new__(cls, architecture: Architecture, benchmarks: typing.Sequence[Operation], instructions: typing.Sequence[Operation], name: builtins.str) -> InstructionSetArchitecture: ...
+ def __eq__(self, other: builtins.object, /) -> builtins.bool: ...
+ def __new__(
+ cls,
+ architecture: Architecture,
+ benchmarks: typing.Sequence[Operation],
+ instructions: typing.Sequence[Operation],
+ name: builtins.str,
+ ) -> InstructionSetArchitecture: ...
def __repr__(self) -> builtins.str:
r"""
Implements `__repr__` for Python in terms of the Rust
@@ -247,33 +275,34 @@ class InstructionSetArchitecture:
def from_raw(json: builtins.str) -> InstructionSetArchitecture:
r"""
Deserialize an `InstructionSetArchitecture` from a json representation.
-
+
# Errors
-
+
Returns [`SerializeIsaError`] if the input string was not deserialized correctly.
"""
def json(self, pretty: builtins.bool = False) -> builtins.str:
r"""
Serialize the `InstructionSetArchitecture` to a json string, optionally pretty-printed.
-
+
If `pretty` is true, the json output should be pretty-printed with newlines and indents.
-
+
# Errors
-
+
Returns [`SerializeIsaError`] if the ISA could not be serialized.
"""
-class ListISAsError(QcsSdkError):
+class ListISAsError(_qcs_sdk.QcsSdkError):
r"""
API Errors encountered when trying to list available ISAs.
"""
+
...
@typing.final
class Node:
r"""
A logical node in the quantum processor's architecture.
-
+
The existence of a node in the ISA ``Architecture`` does not necessarily mean that a given 1Q
operation will be available on the node. This information is conveyed by the presence of the
specific `node_id` in instances of ``Instruction``.
@@ -282,17 +311,17 @@ class Node:
def node_id(self) -> builtins.int:
r"""
An integer id assigned to the computational node.
-
+
The ids may not be contiguous and will be assigned based on the architecture family.
"""
@node_id.setter
def node_id(self, value: builtins.int) -> None:
r"""
An integer id assigned to the computational node.
-
+
The ids may not be contiguous and will be assigned based on the architecture family.
"""
- def __eq__(self, other: builtins.object) -> builtins.bool: ...
+ def __eq__(self, other: builtins.object, /) -> builtins.bool: ...
def __new__(cls, node_id: builtins.int) -> Node: ...
def __repr__(self) -> builtins.str:
r"""
@@ -311,7 +340,7 @@ class Operation:
The list of site-independent characteristics of this operation.
"""
@characteristics.setter
- def characteristics(self, value: builtins.list[Characteristic]) -> None:
+ def characteristics(self, value: typing.Sequence[Characteristic]) -> None:
r"""
The list of site-independent characteristics of this operation.
"""
@@ -341,7 +370,7 @@ class Operation:
The list of parameters. Each parameter must be uniquely named. May be empty.
"""
@parameters.setter
- def parameters(self, value: builtins.list[Parameter]) -> None:
+ def parameters(self, value: typing.Sequence[Parameter]) -> None:
r"""
The list of parameters. Each parameter must be uniquely named. May be empty.
"""
@@ -351,12 +380,18 @@ class Operation:
The list of sites at which this operation can be applied, together with its site-dependent characteristics.
"""
@sites.setter
- def sites(self, value: builtins.list[OperationSite]) -> None:
+ def sites(self, value: typing.Sequence[OperationSite]) -> None:
r"""
The list of sites at which this operation can be applied, together with its site-dependent characteristics.
"""
- def __eq__(self, other: builtins.object) -> builtins.bool: ...
- def __new__(cls, characteristics: typing.Sequence[Characteristic], name: builtins.str, parameters: typing.Sequence[Parameter], sites: typing.Sequence[OperationSite]) -> Operation:
+ def __eq__(self, other: builtins.object, /) -> builtins.bool: ...
+ def __new__(
+ cls,
+ characteristics: typing.Sequence[Characteristic],
+ name: builtins.str,
+ parameters: typing.Sequence[Parameter],
+ sites: typing.Sequence[OperationSite],
+ ) -> Operation:
r"""
An operation, with its sites and site-independent characteristics.
"""
@@ -377,7 +412,7 @@ class OperationSite:
The list of site-dependent characteristics of this operation.
"""
@characteristics.setter
- def characteristics(self, value: builtins.list[Characteristic]) -> None:
+ def characteristics(self, value: typing.Sequence[Characteristic]) -> None:
r"""
The list of site-dependent characteristics of this operation.
"""
@@ -385,18 +420,20 @@ class OperationSite:
def node_ids(self) -> builtins.list[builtins.int]:
r"""
The list of architecture node ids for the site.
-
+
The order of these node ids obey the definition of node symmetry from the enclosing operation.
"""
@node_ids.setter
- def node_ids(self, value: builtins.list[builtins.int]) -> None:
+ def node_ids(self, value: typing.Sequence[builtins.int]) -> None:
r"""
The list of architecture node ids for the site.
-
+
The order of these node ids obey the definition of node symmetry from the enclosing operation.
"""
- def __eq__(self, other: builtins.object) -> builtins.bool: ...
- def __new__(cls, characteristics: typing.Sequence[Characteristic], node_ids: typing.Sequence[builtins.int]) -> OperationSite:
+ def __eq__(self, other: builtins.object, /) -> builtins.bool: ...
+ def __new__(
+ cls, characteristics: typing.Sequence[Characteristic], node_ids: typing.Sequence[builtins.int]
+ ) -> OperationSite:
r"""
A site for an operation, with its site-dependent characteristics.
"""
@@ -421,7 +458,7 @@ class Parameter:
r"""
The name of the parameter, such as the name of a mathematical symbol.
"""
- def __eq__(self, other: builtins.object) -> builtins.bool: ...
+ def __eq__(self, other: builtins.object, /) -> builtins.bool: ...
def __new__(cls, name: builtins.str) -> Parameter: ...
def __repr__(self) -> builtins.str:
r"""
@@ -429,70 +466,77 @@ class Parameter:
[`Debug`](std::fmt::Debug) implementation.
"""
-class SerializeISAError(QcsSdkError):
+class SerializeISAError(_qcs_sdk.QcsSdkError):
r"""
Errors raised due to failure to serialize an ISA.
"""
+
...
@typing.final
class Family(enum.Enum):
r"""
The architecture family identifier of an ``InstructionSetArchitecture``.
-
+
Value 'NONE' implies the architecture has no specific layout topology.
Value 'FULL' implies that each node is connected to every other (a fully-connected architecture).
For other values based on deployed architecture layouts (e.g. `Aspen` and `Ankaa`),
refer to the architecture classes themselves for more details.
-
+
Note: Within an ``InstructionSetArchitecture``, the `family` may be one of these,
or may be a `str` for an unknown family, or may be `None` if the `family` is not specified.
The latter in particular is distinct from the `NONE` value within this enumeration.
"""
+
NONE = ...
FULL = ...
ASPEN = ...
ANKAA = ...
-def get_instruction_set_architecture(quantum_processor_id: builtins.str, client: typing.Optional[QCSClient] = None) -> InstructionSetArchitecture:
+def get_instruction_set_architecture(
+ quantum_processor_id: builtins.str, client: typing.Optional[client.QCSClient] = None
+) -> InstructionSetArchitecture:
r"""
Fetch the ``InstructionSetArchitecture`` (ISA) for a given `quantum_processor_id` from the QCS API.
-
+
:param quantum_processor_id: The ID of the quantum processor.
:param client: The ``Qcs`` client to use. Creates one using environment configuration if unset - see https://docs.rigetti.com/qcs/references/qcs-client-configuration
-
+
:raises LoadClientError: If ``client`` was not provided to the function, and failed to load internally.
:raises GetISAError: If there was an issue fetching the ISA from the QCS API.
"""
-def get_instruction_set_architecture_async(quantum_processor_id: builtins.str, client: typing.Optional[QCSClient] = None) -> collections.abc.Awaitable[InstructionSetArchitecture]:
+def get_instruction_set_architecture_async(
+ quantum_processor_id: builtins.str, client: typing.Optional[client.QCSClient] = None
+) -> collections.abc.Awaitable[InstructionSetArchitecture]:
r"""
Fetch the ``InstructionSetArchitecture`` (ISA) for a given `quantum_processor_id` from the QCS API.
-
+
:param quantum_processor_id: The ID of the quantum processor.
:param client: The ``Qcs`` client to use. Creates one using environment configuration if unset - see https://docs.rigetti.com/qcs/references/qcs-client-configuration
-
+
:raises LoadClientError: If ``client`` was not provided to the function, and failed to load internally.
:raises GetISAError: If there was an issue fetching the ISA from the QCS API.
"""
-def list_instruction_set_architectures(client: typing.Optional[QCSClient] = None) -> builtins.list[builtins.str]:
+def list_instruction_set_architectures(client: typing.Optional[client.QCSClient] = None) -> builtins.list[builtins.str]:
r"""
Fetch the names of available ``InstructionSetArchitecture``s (ISAs) from the QCS API.
-
+
:param client: The ``Qcs`` client to use. Creates one using environment configuration if unset - see https://docs.rigetti.com/qcs/references/qcs-client-configuration
-
+
:raises LoadClientError: If ``client`` was not provided to the function, and failed to load internally.
:raises ListISAsError: If there was an issue fetching the ISAs from the QCS API.
"""
-def list_instruction_set_architectures_async(client: typing.Optional[QCSClient] = None) -> collections.abc.Awaitable[builtins.list[builtins.str]]:
+def list_instruction_set_architectures_async(
+ client: typing.Optional[client.QCSClient] = None,
+) -> collections.abc.Awaitable[builtins.list[builtins.str]]:
r"""
Fetch the names of available ``InstructionSetArchitecture``s (ISAs) from the QCS API.
-
+
:param client: The ``Qcs`` client to use. Creates one using environment configuration if unset - see https://docs.rigetti.com/qcs/references/qcs-client-configuration
-
+
:raises LoadClientError: If ``client`` was not provided to the function, and failed to load internally.
:raises ListISAsError: If there was an issue fetching the ISAs from the QCS API.
"""
-
diff --git a/crates/lib/python/qcs_sdk/qpu/translation.pyi b/crates/lib/python/qcs_sdk/_qcs_sdk/qpu/translation/__init__.pyi
similarity index 77%
rename from crates/lib/python/qcs_sdk/qpu/translation.pyi
rename to crates/lib/python/qcs_sdk/_qcs_sdk/qpu/translation/__init__.pyi
index 1845fc956..e171ca5f9 100644
--- a/crates/lib/python/qcs_sdk/qpu/translation.pyi
+++ b/crates/lib/python/qcs_sdk/_qcs_sdk/qpu/translation/__init__.pyi
@@ -1,18 +1,31 @@
# This file is automatically generated by pyo3_stub_gen
-# ruff: noqa: E501, F401
+# ruff: noqa: E501, F401, F403, F405
import builtins
import collections.abc
import enum
+from qcs_sdk import _qcs_sdk
+from qcs_sdk._qcs_sdk import client
import typing
-from qcs_sdk import QcsSdkError
-from qcs_sdk.client import QCSClient
+
+__all__ = [
+ "QCtrl",
+ "Riverlane",
+ "TranslationBackend",
+ "TranslationError",
+ "TranslationOptions",
+ "TranslationResult",
+ "get_quilt_calibrations",
+ "get_quilt_calibrations_async",
+ "translate",
+ "translate_async",
+]
@typing.final
class QCtrl:
r"""
Options for compiling programs through the Q-CTRL API.
-
+
Options here are specially authorized and are not generally available to the client.
"""
def __new__(cls, fixed_layout: typing.Optional[builtins.bool] = None) -> QCtrl: ...
@@ -21,22 +34,27 @@ class QCtrl:
class Riverlane:
r"""
Options for configuring Riverlane features prior to execution.
-
+
Options here are specially authorized and are not generally available to the client.
"""
- def __new__(cls, qeci_configuration_data: typing.Mapping[builtins.str, typing.Sequence[builtins.int]], qeci_max_nanoseconds_until_read_available: builtins.int) -> Riverlane: ...
+ def __new__(
+ cls,
+ qeci_configuration_data: typing.Mapping[builtins.str, typing.Sequence[builtins.int]],
+ qeci_max_nanoseconds_until_read_available: builtins.int,
+ ) -> Riverlane: ...
-class TranslationError(QcsSdkError):
+class TranslationError(_qcs_sdk.QcsSdkError):
r"""
Errors raised due to failure to translate a program.
"""
+
...
@typing.final
class TranslationOptions:
r"""
Options available for Quil program translation.
-
+
This wraps [`ApiTranslationOptions`] in order to improve the user experience,
because the structs auto-generated by `prost` can be clumsy to use directly.
"""
@@ -66,14 +84,14 @@ class TranslationOptions:
def use_q_ctrl(self, q_ctrl: typing.Optional[QCtrl] = None) -> None:
r"""
Compile the program through Q-CTRL's API prior to translation.
-
+
The client should generally leave the `q_ctrl` compile options unset
as it is specially authorized and not generally available.
"""
def use_riverlane(self, riverlane: Riverlane = ...) -> None:
r"""
Configure Riverlane features prior to execution.
-
+
Options here are specially authorized and are not generally available to the client.
"""
@staticmethod
@@ -82,10 +100,16 @@ class TranslationOptions:
Use the v1 backend for translation, available on QCS since 2018.
"""
@staticmethod
- def v2(*, prepend_default_calibrations: typing.Optional[builtins.bool] = None, passive_reset_delay_seconds: typing.Optional[builtins.float] = None, allow_unchecked_pointer_arithmetic: typing.Optional[builtins.bool] = None, allow_frame_redefinition: typing.Optional[builtins.bool] = None) -> TranslationOptions:
+ def v2(
+ *,
+ prepend_default_calibrations: typing.Optional[builtins.bool] = None,
+ passive_reset_delay_seconds: typing.Optional[builtins.float] = None,
+ allow_unchecked_pointer_arithmetic: typing.Optional[builtins.bool] = None,
+ allow_frame_redefinition: typing.Optional[builtins.bool] = None,
+ ) -> TranslationOptions:
r"""
Use the v2 backend for translation, available on QCS since 2023.
-
+
:param `prepend_default_calibrations`: If False, do not prepend the default calibrations to the translated program.
:param `passive_reset_delay_seconds`: The delay between passive resets, in seconds.
:param `allow_unchecked_pointer_arithmetic`: If True, disable runtime memory bounds checking. Only available to certain users.
@@ -113,6 +137,7 @@ class TranslationBackend(enum.Enum):
r"""
The backend used for translation.
"""
+
V1 = ...
r"""
The first-generation translation backend available on QCS since 2018.
@@ -122,59 +147,78 @@ class TranslationBackend(enum.Enum):
The second-generation translation backend available on QCS since 2023.
"""
-def get_quilt_calibrations(quantum_processor_id: builtins.str, client: typing.Optional[QCSClient] = None, timeout: typing.Optional[builtins.float] = None) -> builtins.str:
+def get_quilt_calibrations(
+ quantum_processor_id: builtins.str,
+ client: typing.Optional[client.QCSClient] = None,
+ timeout: typing.Optional[builtins.float] = None,
+) -> builtins.str:
r"""
Retrieve the calibration data used for client-side Quil-T generation.
-
+
:param `quantum_processor_id`: The ID of the quantum processor.
:param `client`: The ``Qcs`` client to use. Creates one using environment configuration if unset - see https://docs.rigetti.com/qcs/references/qcs-client-configuration
:param `timeout`: Maximum duration to wait for API calls to complete, in seconds. Defaults to 10 seconds.
-
+
:returns: The Quil calibration program for the requested quantum processor.
-
+
:raises `LoadClientError`: If there is an issue loading the QCS Client configuration.
:raises `TranslationError`: If there was a problem fetching Quil-T calibrations.
"""
-def get_quilt_calibrations_async(quantum_processor_id: builtins.str, client: typing.Optional[QCSClient] = None, timeout: typing.Optional[builtins.float] = None) -> collections.abc.Awaitable[builtins.str]:
+def get_quilt_calibrations_async(
+ quantum_processor_id: builtins.str,
+ client: typing.Optional[client.QCSClient] = None,
+ timeout: typing.Optional[builtins.float] = None,
+) -> collections.abc.Awaitable[builtins.str]:
r"""
Retrieve the calibration data used for client-side Quil-T generation.
-
+
:param `quantum_processor_id`: The ID of the quantum processor.
:param `client`: The ``Qcs`` client to use. Creates one using environment configuration if unset - see https://docs.rigetti.com/qcs/references/qcs-client-configuration
:param `timeout`: Maximum duration to wait for API calls to complete, in seconds. Defaults to 10 seconds.
-
+
:returns: The Quil calibration program for the requested quantum processor.
-
+
:raises `LoadClientError`: If there is an issue loading the QCS Client configuration.
:raises `TranslationError`: If there was a problem fetching Quil-T calibrations.
"""
-def translate(native_quil: builtins.str, num_shots: builtins.int, quantum_processor_id: builtins.str, client: typing.Optional[QCSClient] = None, translation_options: typing.Optional[TranslationOptions] = None) -> TranslationResult:
+def translate(
+ native_quil: builtins.str,
+ num_shots: builtins.int,
+ quantum_processor_id: builtins.str,
+ client: typing.Optional[client.QCSClient] = None,
+ translation_options: typing.Optional[TranslationOptions] = None,
+) -> TranslationResult:
r"""
Translates a native Quil program into an executable program.
-
+
:param `native_quil`: A Quil program.
:param `num_shots`: The number of shots to perform.
:param `quantum_processor_id`: The ID of the quantum processor the executable will run on (e.g. "Aspen-M-2").
:param `client`: The ``Qcs`` client to use. Creates one using environment configuration if unset - see https://docs.rigetti.com/qcs/references/qcs-client-configuration
:param `translation_options`: Optional translation options.
-
+
:raises `LoadClientError`: If there is an issue loading the QCS Client configuration.
:raises `TranslationError`: If the `native_quil` program could not be translated.
"""
-def translate_async(native_quil: builtins.str, num_shots: builtins.int, quantum_processor_id: builtins.str, client: typing.Optional[QCSClient] = None, translation_options: typing.Optional[TranslationOptions] = None) -> collections.abc.Awaitable[TranslationResult]:
+def translate_async(
+ native_quil: builtins.str,
+ num_shots: builtins.int,
+ quantum_processor_id: builtins.str,
+ client: typing.Optional[client.QCSClient] = None,
+ translation_options: typing.Optional[TranslationOptions] = None,
+) -> collections.abc.Awaitable[TranslationResult]:
r"""
Translates a native Quil program into an executable program.
-
+
:param `native_quil`: A Quil program.
:param `num_shots`: The number of shots to perform.
:param `quantum_processor_id`: The ID of the quantum processor the executable will run on (e.g. "Aspen-M-2").
:param `client`: The ``Qcs`` client to use. Creates one using environment configuration if unset - see https://docs.rigetti.com/qcs/references/qcs-client-configuration
:param `translation_options`: Optional translation options.
-
+
:raises `LoadClientError`: If there is an issue loading the QCS Client configuration.
:raises `TranslationError`: If the `native_quil` program could not be translated.
"""
-
diff --git a/crates/lib/python/qcs_sdk/qvm/__init__.pyi b/crates/lib/python/qcs_sdk/_qcs_sdk/qvm/__init__.pyi
similarity index 77%
rename from crates/lib/python/qcs_sdk/qvm/__init__.pyi
rename to crates/lib/python/qcs_sdk/_qcs_sdk/qvm/__init__.pyi
index 6d8d31ccb..dc6a2025f 100644
--- a/crates/lib/python/qcs_sdk/qvm/__init__.pyi
+++ b/crates/lib/python/qcs_sdk/_qcs_sdk/qvm/__init__.pyi
@@ -1,13 +1,23 @@
# This file is automatically generated by pyo3_stub_gen
-# ruff: noqa: E501, F401
+# ruff: noqa: E501, F401, F403, F405
import builtins
import collections.abc
+from qcs_sdk import _qcs_sdk
import typing
-from qcs_sdk import QcsSdkError, RegisterData, RegisterMap
-from qcs_sdk.qvm.api import AddressRequest
from . import api
+__all__ = [
+ "QVMClient",
+ "QVMError",
+ "QVMOptions",
+ "QVMResultData",
+ "RawQVMReadoutData",
+ "api",
+ "run",
+ "run_async",
+]
+
@typing.final
class QVMClient:
r"""
@@ -27,10 +37,11 @@ class QVMClient:
@staticmethod
def new_libquil() -> QVMClient: ...
-class QVMError(QcsSdkError):
+class QVMError(_qcs_sdk.QcsSdkError):
r"""
Errors that can occur when running a Quil program on QVM.
"""
+
...
@typing.final
@@ -58,7 +69,7 @@ class QVMOptions:
def default() -> QVMOptions:
r"""
Get the default set of ``QVMOptions`` used for QVM requests.
-
+
Settings:
timeout: 30.0 seconds
"""
@@ -69,12 +80,12 @@ class QVMResultData:
Encapsulates data returned after running a program on the QVM
"""
@property
- def memory(self) -> builtins.dict[builtins.str, RegisterData]:
+ def memory(self) -> builtins.dict[builtins.str, _qcs_sdk.RegisterData]:
r"""
A map of register names (ie. "ro") to a `RegisterData` containing their values.
"""
- def __getnewargs__(self) -> tuple[builtins.dict[builtins.str, RegisterData]]: ...
- def __new__(cls, memory: typing.Mapping[builtins.str, RegisterData]) -> QVMResultData:
+ def __getnewargs__(self) -> tuple[builtins.dict[builtins.str, _qcs_sdk.RegisterData]]: ...
+ def __new__(cls, memory: typing.Mapping[builtins.str, _qcs_sdk.RegisterData]) -> QVMResultData:
r"""
Build a ``QVMResultData`` from a mapping of register names to a ``RegisterData`` matrix.
"""
@@ -84,7 +95,7 @@ class QVMResultData:
[`Debug`](std::fmt::Debug) implementation.
"""
@staticmethod
- def from_memory_map(memory: typing.Mapping[builtins.str, RegisterData]) -> QVMResultData:
+ def from_memory_map(memory: typing.Mapping[builtins.str, _qcs_sdk.RegisterData]) -> QVMResultData:
r"""
Build a [`QvmResultData`] from a mapping of register names to a [`RegisterData`]
"""
@@ -92,15 +103,15 @@ class QVMResultData:
r"""
Get a copy of this result data flattened into a ``RawQVMReadoutData``.
"""
- def to_register_map(self) -> RegisterMap:
+ def to_register_map(self) -> _qcs_sdk.RegisterMap:
r"""
Convert into a [`RegisterMap`].
-
+
The [`RegisterMatrix`] for each register will be
constructed such that each row contains all the final values in the register for a single shot.
-
+
# Errors
-
+
Returns a [`RegisterMatrixConversionError`] if the inner execution data for any of the
registers would result in a jagged matrix.
This is often the case in programs that use mid-circuit measurement or dynamic control flow,
@@ -128,35 +139,54 @@ class RawQVMReadoutData:
[`Debug`](std::fmt::Debug) implementation.
"""
-def run(quil: builtins.str, shots: builtins.int, addresses: typing.Mapping[builtins.str, AddressRequest], params: typing.Mapping[builtins.str, typing.Sequence[builtins.float]], client: QVMClient, measurement_noise: typing.Optional[tuple[builtins.float, builtins.float, builtins.float]] = None, gate_noise: typing.Optional[tuple[builtins.float, builtins.float, builtins.float]] = None, rng_seed: typing.Optional[builtins.int] = None, options: typing.Optional[QVMOptions] = None) -> QVMResultData:
+def run(
+ quil: builtins.str,
+ shots: builtins.int,
+ addresses: typing.Mapping[builtins.str, api.AddressRequest],
+ params: typing.Mapping[builtins.str, typing.Sequence[builtins.float]],
+ client: QVMClient,
+ measurement_noise: typing.Optional[tuple[builtins.float, builtins.float, builtins.float]] = None,
+ gate_noise: typing.Optional[tuple[builtins.float, builtins.float, builtins.float]] = None,
+ rng_seed: typing.Optional[builtins.int] = None,
+ options: typing.Optional[QVMOptions] = None,
+) -> QVMResultData:
r"""
Runs the given program on the QVM.
-
+
:param quil: A quil program as a string.
:param shots: The number of times to run the program. Should be a value greater than zero.
:param addresses: A mapping of memory region names to an ``AddressRequest`` describing what data to get back for that memory region from the QVM at the end of execution.
:param params: A mapping of memory region names to their desired values.
:param client: An optional ``QCSClient`` to use. If unset, creates one using the environemnt configuration (see https://docs.rigetti.com/qcs/references/qcs-client-configuration).
:param options: An optional ``QVMOptions`` to use. If unset, uses ``QVMOptions.default()`` for the request.
-
+
:returns: A ``QVMResultData`` containing the final state of of memory for the requested readouts after the program finished running.
-
+
:raises QVMError: If one of the parameters is invalid, or if there was a problem communicating with the QVM server.
"""
-def run_async(quil: builtins.str, shots: builtins.int, addresses: typing.Mapping[builtins.str, AddressRequest], params: typing.Mapping[builtins.str, typing.Sequence[builtins.float]], client: QVMClient, measurement_noise: typing.Optional[tuple[builtins.float, builtins.float, builtins.float]] = None, gate_noise: typing.Optional[tuple[builtins.float, builtins.float, builtins.float]] = None, rng_seed: typing.Optional[builtins.int] = None, options: typing.Optional[QVMOptions] = None) -> collections.abc.Awaitable[QVMResultData]:
+def run_async(
+ quil: builtins.str,
+ shots: builtins.int,
+ addresses: typing.Mapping[builtins.str, api.AddressRequest],
+ params: typing.Mapping[builtins.str, typing.Sequence[builtins.float]],
+ client: QVMClient,
+ measurement_noise: typing.Optional[tuple[builtins.float, builtins.float, builtins.float]] = None,
+ gate_noise: typing.Optional[tuple[builtins.float, builtins.float, builtins.float]] = None,
+ rng_seed: typing.Optional[builtins.int] = None,
+ options: typing.Optional[QVMOptions] = None,
+) -> collections.abc.Awaitable[QVMResultData]:
r"""
Runs the given program on the QVM.
-
+
:param quil: A quil program as a string.
:param shots: The number of times to run the program. Should be a value greater than zero.
:param addresses: A mapping of memory region names to an ``AddressRequest`` describing what data to get back for that memory region from the QVM at the end of execution.
:param params: A mapping of memory region names to their desired values.
:param client: An optional ``QCSClient`` to use. If unset, creates one using the environemnt configuration (see https://docs.rigetti.com/qcs/references/qcs-client-configuration).
:param options: An optional ``QVMOptions`` to use. If unset, uses ``QVMOptions.default()`` for the request.
-
+
:returns: A ``QVMResultData`` containing the final state of of memory for the requested readouts after the program finished running.
-
+
:raises QVMError: If one of the parameters is invalid, or if there was a problem communicating with the QVM server.
"""
-
diff --git a/crates/lib/python/qcs_sdk/qvm/api.pyi b/crates/lib/python/qcs_sdk/_qcs_sdk/qvm/api/__init__.pyi
similarity index 60%
rename from crates/lib/python/qcs_sdk/qvm/api.pyi
rename to crates/lib/python/qcs_sdk/_qcs_sdk/qvm/api/__init__.pyi
index eb44b9987..054eea826 100644
--- a/crates/lib/python/qcs_sdk/qvm/api.pyi
+++ b/crates/lib/python/qcs_sdk/_qcs_sdk/qvm/api/__init__.pyi
@@ -1,11 +1,30 @@
# This file is automatically generated by pyo3_stub_gen
-# ruff: noqa: E501, F401
+# ruff: noqa: E501, F401, F403, F405
import builtins
import collections.abc
+from qcs_sdk import _qcs_sdk
+from qcs_sdk._qcs_sdk import qvm
import typing
-from qcs_sdk import RegisterData
-from qcs_sdk.qvm import QVMClient, QVMOptions
+
+__all__ = [
+ "AddressRequest",
+ "ExpectationRequest",
+ "MultishotMeasureRequest",
+ "MultishotRequest",
+ "MultishotResponse",
+ "WavefunctionRequest",
+ "get_version_info",
+ "get_version_info_async",
+ "get_wavefunction",
+ "get_wavefunction_async",
+ "measure_expectation",
+ "measure_expectation_async",
+ "run",
+ "run_and_measure",
+ "run_and_measure_async",
+ "run_async",
+]
class AddressRequest:
r"""
@@ -16,33 +35,36 @@ class AddressRequest:
r"""
Exclude all values for the address.
"""
+
__match_args__ = ()
- def __getitem__(self, key: builtins.int) -> typing.Any: ...
+ def __getitem__(self, key: builtins.int, /) -> typing.Any: ...
def __len__(self) -> builtins.int: ...
def __new__(cls) -> AddressRequest.ExcludeAll: ...
-
+
@typing.final
class IncludeAll(AddressRequest):
r"""
Get all values for the address.
"""
+
__match_args__ = ()
- def __getitem__(self, key: builtins.int) -> typing.Any: ...
+ def __getitem__(self, key: builtins.int, /) -> typing.Any: ...
def __len__(self) -> builtins.int: ...
def __new__(cls) -> AddressRequest.IncludeAll: ...
-
+
@typing.final
class Indices(AddressRequest):
r"""
A list of specific indices to get back for the address.
"""
+
__match_args__ = ("_0",)
@property
def _0(self) -> builtins.list[builtins.int]: ...
- def __getitem__(self, key: builtins.int) -> typing.Any: ...
+ def __getitem__(self, key: builtins.int, /) -> typing.Any: ...
def __len__(self) -> builtins.int: ...
def __new__(cls, _0: typing.Sequence[builtins.int]) -> AddressRequest.Indices: ...
-
+
...
@typing.final
@@ -65,7 +87,12 @@ class ExpectationRequest:
r"""
A Quil program defining the state.
"""
- def __new__(cls, state_preparation: builtins.str, operators: typing.Sequence[builtins.str], rng_seed: typing.Optional[builtins.int] = None) -> ExpectationRequest:
+ def __new__(
+ cls,
+ state_preparation: builtins.str,
+ operators: typing.Sequence[builtins.str],
+ rng_seed: typing.Optional[builtins.int] = None,
+ ) -> ExpectationRequest:
r"""
Creates a new `ExpectationRequest` using the given parameters.
"""
@@ -104,7 +131,15 @@ class MultishotMeasureRequest:
def trials(self) -> builtins.int: ...
@trials.setter
def trials(self, value: builtins.int) -> None: ...
- def __new__(cls, compiled_quil: builtins.str, trials: builtins.int, qubits: builtins.list[builtins.int], measurement_noise: typing.Optional[tuple[builtins.float, builtins.float, builtins.float]] = None, gate_noise: typing.Optional[tuple[builtins.float, builtins.float, builtins.float]] = None, rng_seed: typing.Optional[builtins.int] = None) -> MultishotMeasureRequest:
+ def __new__(
+ cls,
+ compiled_quil: builtins.str,
+ trials: builtins.int,
+ qubits: builtins.list[builtins.int],
+ measurement_noise: typing.Optional[tuple[builtins.float, builtins.float, builtins.float]] = None,
+ gate_noise: typing.Optional[tuple[builtins.float, builtins.float, builtins.float]] = None,
+ rng_seed: typing.Optional[builtins.int] = None,
+ ) -> MultishotMeasureRequest:
r"""
Construct a new `MultishotMeasureRequest` using the given parameters.
"""
@@ -120,7 +155,7 @@ class MultishotRequest:
The memory regions to include in the response.
"""
@addresses.setter
- def addresses(self, value: builtins.dict[builtins.str, AddressRequest]) -> None:
+ def addresses(self, value: typing.Mapping[builtins.str, AddressRequest]) -> None:
r"""
The memory regions to include in the response.
"""
@@ -168,7 +203,15 @@ class MultishotRequest:
def trials(self) -> builtins.int: ...
@trials.setter
def trials(self, value: builtins.int) -> None: ...
- def __new__(cls, program: builtins.str, shots: builtins.int, addresses: typing.Mapping[builtins.str, AddressRequest], measurement_noise: typing.Optional[tuple[builtins.float, builtins.float, builtins.float]] = None, gate_noise: typing.Optional[tuple[builtins.float, builtins.float, builtins.float]] = None, rng_seed: typing.Optional[builtins.int] = None) -> MultishotRequest:
+ def __new__(
+ cls,
+ program: builtins.str,
+ shots: builtins.int,
+ addresses: typing.Mapping[builtins.str, AddressRequest],
+ measurement_noise: typing.Optional[tuple[builtins.float, builtins.float, builtins.float]] = None,
+ gate_noise: typing.Optional[tuple[builtins.float, builtins.float, builtins.float]] = None,
+ rng_seed: typing.Optional[builtins.int] = None,
+ ) -> MultishotRequest:
r"""
Creates a new `MultishotRequest` with the given parameters.
"""
@@ -179,7 +222,7 @@ class MultishotResponse:
The response body returned by the QVM after a multishot [`run`] request.
"""
@property
- def registers(self) -> builtins.dict[builtins.str, RegisterData]:
+ def registers(self) -> builtins.dict[builtins.str, _qcs_sdk.RegisterData]:
r"""
The requested readout registers and their final values for each shot.
"""
@@ -209,28 +252,42 @@ class WavefunctionRequest:
r"""
An optional seed for the random number generator.
"""
- def __new__(cls, compiled_quil: builtins.str, measurement_noise: typing.Optional[tuple[builtins.float, builtins.float, builtins.float]] = None, gate_noise: typing.Optional[tuple[builtins.float, builtins.float, builtins.float]] = None, rng_seed: typing.Optional[builtins.int] = None) -> WavefunctionRequest:
+ def __new__(
+ cls,
+ compiled_quil: builtins.str,
+ measurement_noise: typing.Optional[tuple[builtins.float, builtins.float, builtins.float]] = None,
+ gate_noise: typing.Optional[tuple[builtins.float, builtins.float, builtins.float]] = None,
+ rng_seed: typing.Optional[builtins.int] = None,
+ ) -> WavefunctionRequest:
r"""
Create a new `WavefunctionRequest` with the given parameters.
"""
-def get_version_info(client: QVMClient, options: typing.Optional[QVMOptions] = None) -> builtins.str: ...
-
-def get_version_info_async(client: QVMClient, options: typing.Optional[QVMOptions] = None) -> collections.abc.Awaitable[builtins.str]: ...
-
-def get_wavefunction(request: WavefunctionRequest, client: QVMClient, options: typing.Optional[QVMOptions] = None) -> builtins.list[builtins.int]: ...
-
-def get_wavefunction_async(request: WavefunctionRequest, client: QVMClient, options: typing.Optional[QVMOptions] = None) -> collections.abc.Awaitable[builtins.list[builtins.int]]: ...
-
-def measure_expectation(request: ExpectationRequest, client: QVMClient, options: typing.Optional[QVMOptions] = None) -> builtins.list[builtins.float]: ...
-
-def measure_expectation_async(request: ExpectationRequest, client: QVMClient, options: typing.Optional[QVMOptions] = None) -> collections.abc.Awaitable[builtins.list[builtins.float]]: ...
-
-def run(request: MultishotRequest, client: QVMClient, options: typing.Optional[QVMOptions] = None) -> MultishotResponse: ...
-
-def run_and_measure(request: MultishotMeasureRequest, client: QVMClient, options: typing.Optional[QVMOptions] = None) -> builtins.list[builtins.list[builtins.int]]: ...
-
-def run_and_measure_async(request: MultishotMeasureRequest, client: QVMClient, options: typing.Optional[QVMOptions] = None) -> collections.abc.Awaitable[builtins.list[builtins.list[builtins.int]]]: ...
-
-def run_async(request: MultishotRequest, client: QVMClient, options: typing.Optional[QVMOptions] = None) -> collections.abc.Awaitable[MultishotResponse]: ...
-
+def get_version_info(client: qvm.QVMClient, options: typing.Optional[qvm.QVMOptions] = None) -> builtins.str: ...
+def get_version_info_async(
+ client: qvm.QVMClient, options: typing.Optional[qvm.QVMOptions] = None
+) -> collections.abc.Awaitable[builtins.str]: ...
+def get_wavefunction(
+ request: WavefunctionRequest, client: qvm.QVMClient, options: typing.Optional[qvm.QVMOptions] = None
+) -> builtins.list[builtins.int]: ...
+def get_wavefunction_async(
+ request: WavefunctionRequest, client: qvm.QVMClient, options: typing.Optional[qvm.QVMOptions] = None
+) -> collections.abc.Awaitable[builtins.list[builtins.int]]: ...
+def measure_expectation(
+ request: ExpectationRequest, client: qvm.QVMClient, options: typing.Optional[qvm.QVMOptions] = None
+) -> builtins.list[builtins.float]: ...
+def measure_expectation_async(
+ request: ExpectationRequest, client: qvm.QVMClient, options: typing.Optional[qvm.QVMOptions] = None
+) -> collections.abc.Awaitable[builtins.list[builtins.float]]: ...
+def run(
+ request: MultishotRequest, client: qvm.QVMClient, options: typing.Optional[qvm.QVMOptions] = None
+) -> MultishotResponse: ...
+def run_and_measure(
+ request: MultishotMeasureRequest, client: qvm.QVMClient, options: typing.Optional[qvm.QVMOptions] = None
+) -> builtins.list[builtins.list[builtins.int]]: ...
+def run_and_measure_async(
+ request: MultishotMeasureRequest, client: qvm.QVMClient, options: typing.Optional[qvm.QVMOptions] = None
+) -> collections.abc.Awaitable[builtins.list[builtins.list[builtins.int]]]: ...
+def run_async(
+ request: MultishotRequest, client: qvm.QVMClient, options: typing.Optional[qvm.QVMOptions] = None
+) -> collections.abc.Awaitable[MultishotResponse]: ...
diff --git a/crates/lib/python/qcs_sdk/_tracing_subscriber/common/__init__.py b/crates/lib/python/qcs_sdk/_tracing_subscriber/common/__init__.py
index 13c85d414..6a880873e 100644
--- a/crates/lib/python/qcs_sdk/_tracing_subscriber/common/__init__.py
+++ b/crates/lib/python/qcs_sdk/_tracing_subscriber/common/__init__.py
@@ -15,4 +15,3 @@
__doc__ = common.__doc__
__all__ = getattr(common, "__all__", [])
-
diff --git a/crates/lib/python/qcs_sdk/_tracing_subscriber/common/__init__.pyi b/crates/lib/python/qcs_sdk/_tracing_subscriber/common/__init__.pyi
index 7fa3db7d7..97f1c82ea 100644
--- a/crates/lib/python/qcs_sdk/_tracing_subscriber/common/__init__.pyi
+++ b/crates/lib/python/qcs_sdk/_tracing_subscriber/common/__init__.pyi
@@ -12,15 +12,14 @@
from typing import Dict, Optional, final
-
@final
class InstrumentationLibrary:
"""
Information about a library or crate providing instrumentation.
-
+
An instrumentation library should be named to follow any naming conventions
of the instrumented library (e.g. 'middleware' for a web framework).
-
+
See the `instrumentation libraries `_
spec for more information.
"""
@@ -43,4 +42,3 @@ class InstrumentationLibrary:
:param attributes: The attributes of the instrumentation library.
"""
...
-
diff --git a/crates/lib/python/qcs_sdk/_tracing_subscriber/layers/__init__.py b/crates/lib/python/qcs_sdk/_tracing_subscriber/layers/__init__.py
index 3cd1601fd..579ad6642 100644
--- a/crates/lib/python/qcs_sdk/_tracing_subscriber/layers/__init__.py
+++ b/crates/lib/python/qcs_sdk/_tracing_subscriber/layers/__init__.py
@@ -15,4 +15,3 @@
__doc__ = layers.__doc__
__all__ = getattr(layers, "__all__", [])
-
diff --git a/crates/lib/python/qcs_sdk/_tracing_subscriber/layers/__init__.pyi b/crates/lib/python/qcs_sdk/_tracing_subscriber/layers/__init__.pyi
index f3eaf1662..807535a39 100644
--- a/crates/lib/python/qcs_sdk/_tracing_subscriber/layers/__init__.pyi
+++ b/crates/lib/python/qcs_sdk/_tracing_subscriber/layers/__init__.pyi
@@ -18,13 +18,13 @@ from . import otel_otlp_file as otel_otlp_file
from . import otel_otlp as otel_otlp
if TYPE_CHECKING:
- from typing import Union
+ from typing import Union
- Config = Union[
- file.Config,
- otel_otlp_file.Config,
- otel_otlp.Config,
- ]
- """
+ Config = Union[
+ file.Config,
+ otel_otlp_file.Config,
+ otel_otlp.Config,
+ ]
+ """
One of the supported layer configurations that may be set on the subscriber configuration.
"""
diff --git a/crates/lib/python/qcs_sdk/_tracing_subscriber/layers/file/__init__.py b/crates/lib/python/qcs_sdk/_tracing_subscriber/layers/file/__init__.py
index d5455e2f5..bc611131f 100644
--- a/crates/lib/python/qcs_sdk/_tracing_subscriber/layers/file/__init__.py
+++ b/crates/lib/python/qcs_sdk/_tracing_subscriber/layers/file/__init__.py
@@ -15,5 +15,3 @@
__doc__ = file.__doc__
__all__ = getattr(file, "__all__", [])
-
-
diff --git a/crates/lib/python/qcs_sdk/_tracing_subscriber/layers/file/__init__.pyi b/crates/lib/python/qcs_sdk/_tracing_subscriber/layers/file/__init__.pyi
index 7c6310f6a..c19ac9b1c 100644
--- a/crates/lib/python/qcs_sdk/_tracing_subscriber/layers/file/__init__.pyi
+++ b/crates/lib/python/qcs_sdk/_tracing_subscriber/layers/file/__init__.pyi
@@ -39,4 +39,3 @@ class Config:
:param json: Whether or not to format the output as JSON. Defaults to `True`.
"""
...
-
diff --git a/crates/lib/python/qcs_sdk/_tracing_subscriber/layers/otel_otlp/__init__.py b/crates/lib/python/qcs_sdk/_tracing_subscriber/layers/otel_otlp/__init__.py
index 6cd240184..056571f04 100644
--- a/crates/lib/python/qcs_sdk/_tracing_subscriber/layers/otel_otlp/__init__.py
+++ b/crates/lib/python/qcs_sdk/_tracing_subscriber/layers/otel_otlp/__init__.py
@@ -15,4 +15,3 @@
__doc__ = otel_otlp.__doc__
__all__ = getattr(otel_otlp, "__all__", [])
-
diff --git a/crates/lib/python/qcs_sdk/_tracing_subscriber/layers/otel_otlp/__init__.pyi b/crates/lib/python/qcs_sdk/_tracing_subscriber/layers/otel_otlp/__init__.pyi
index ff19b80cc..098439ff9 100644
--- a/crates/lib/python/qcs_sdk/_tracing_subscriber/layers/otel_otlp/__init__.pyi
+++ b/crates/lib/python/qcs_sdk/_tracing_subscriber/layers/otel_otlp/__init__.pyi
@@ -46,8 +46,6 @@ class Resource:
schema_url: Optional[str] = None,
) -> "Resource": ...
-
-
@final
class Config:
"""
@@ -98,14 +96,14 @@ class Config:
...
if TYPE_CHECKING:
- from typing import List, Union
+ from typing import List, Union
ResourceValueArray = Union[List[bool], List[int], List[float], List[str]]
"""
An array of `ResourceValue`s. This array is homogenous, so all values must be of the same type.
"""
- ResourceValue= Union[bool, int, float, str, ResourceValueArray]
+ ResourceValue = Union[bool, int, float, str, ResourceValueArray]
"""
A value that can be added to a `Resource`.
"""
diff --git a/crates/lib/python/qcs_sdk/_tracing_subscriber/layers/otel_otlp_file/__init__.py b/crates/lib/python/qcs_sdk/_tracing_subscriber/layers/otel_otlp_file/__init__.py
index c139623a7..1f93a68f2 100644
--- a/crates/lib/python/qcs_sdk/_tracing_subscriber/layers/otel_otlp_file/__init__.py
+++ b/crates/lib/python/qcs_sdk/_tracing_subscriber/layers/otel_otlp_file/__init__.py
@@ -15,4 +15,3 @@
__doc__ = otel_otlp_file.__doc__
__all__ = getattr(otel_otlp_file, "__all__", [])
-
diff --git a/crates/lib/python/qcs_sdk/_tracing_subscriber/layers/otel_otlp_file/__init__.pyi b/crates/lib/python/qcs_sdk/_tracing_subscriber/layers/otel_otlp_file/__init__.pyi
index addb471e6..d9e5cf226 100644
--- a/crates/lib/python/qcs_sdk/_tracing_subscriber/layers/otel_otlp_file/__init__.pyi
+++ b/crates/lib/python/qcs_sdk/_tracing_subscriber/layers/otel_otlp_file/__init__.pyi
@@ -13,7 +13,6 @@
from typing import Optional, final
from qcs_sdk._tracing_subscriber.common import InstrumentationLibrary
-
@final
class Config:
"""
@@ -21,7 +20,12 @@ class Config:
layer.
"""
- def __new__(cls, file_path: Optional[str] = None, filter: Optional[str] = None, instrumentation_library: Optional[InstrumentationLibrary] = None) -> "Config":
+ def __new__(
+ cls,
+ file_path: Optional[str] = None,
+ filter: Optional[str] = None,
+ instrumentation_library: Optional[InstrumentationLibrary] = None,
+ ) -> "Config":
"""
:param file_path: The path to the file to write to. If not specified, defaults to stdout.
:param filter: A filter string to use for this layer. This uses the same format as the
@@ -35,4 +39,3 @@ class Config:
:param instrumentation_library: Information about the library providing the tracing instrumentation.
"""
...
-
diff --git a/crates/lib/python/qcs_sdk/_tracing_subscriber/subscriber/__init__.py b/crates/lib/python/qcs_sdk/_tracing_subscriber/subscriber/__init__.py
index aea1cf1b5..9c2e8f19f 100644
--- a/crates/lib/python/qcs_sdk/_tracing_subscriber/subscriber/__init__.py
+++ b/crates/lib/python/qcs_sdk/_tracing_subscriber/subscriber/__init__.py
@@ -15,4 +15,3 @@
__doc__ = subscriber.__doc__
__all__ = getattr(subscriber, "__all__", [])
-
diff --git a/crates/lib/python/qcs_sdk/_tracing_subscriber/subscriber/__init__.pyi b/crates/lib/python/qcs_sdk/_tracing_subscriber/subscriber/__init__.pyi
index 8376c4d96..96e59220e 100644
--- a/crates/lib/python/qcs_sdk/_tracing_subscriber/subscriber/__init__.pyi
+++ b/crates/lib/python/qcs_sdk/_tracing_subscriber/subscriber/__init__.pyi
@@ -22,4 +22,3 @@ class Config:
"""
def __new__(cls, layer: layers.Config | None = None) -> "Config": ...
-
diff --git a/crates/lib/python/qcs_sdk/client/__init__.py b/crates/lib/python/qcs_sdk/client/__init__.py
new file mode 100644
index 000000000..c7018814e
--- /dev/null
+++ b/crates/lib/python/qcs_sdk/client/__init__.py
@@ -0,0 +1,32 @@
+# This file is automatically generated by pyo3_stub_gen
+# ruff: noqa: F401
+
+from qcs_sdk._qcs_sdk.client import (
+ AuthServer,
+ BuildClientError,
+ ClientCredentials,
+ ClientError,
+ ExternallyManaged,
+ LoadClientError,
+ OAuthSession,
+ QCSClient,
+ RPCQQuilcError,
+ RefreshToken,
+ SecretRefreshToken,
+ TokenError,
+)
+
+__all__ = [
+ "AuthServer",
+ "BuildClientError",
+ "ClientCredentials",
+ "ClientError",
+ "ExternallyManaged",
+ "LoadClientError",
+ "OAuthSession",
+ "QCSClient",
+ "RPCQQuilcError",
+ "RefreshToken",
+ "SecretRefreshToken",
+ "TokenError",
+]
diff --git a/crates/lib/python/qcs_sdk/compiler/__init__.py b/crates/lib/python/qcs_sdk/compiler/__init__.py
new file mode 100644
index 000000000..e57ecf0b7
--- /dev/null
+++ b/crates/lib/python/qcs_sdk/compiler/__init__.py
@@ -0,0 +1,8 @@
+# This file is automatically generated by pyo3_stub_gen
+# ruff: noqa: F401
+
+from qcs_sdk._qcs_sdk.compiler import quilc
+
+__all__ = [
+ "quilc",
+]
diff --git a/crates/lib/python/qcs_sdk/compiler/quilc/__init__.py b/crates/lib/python/qcs_sdk/compiler/quilc/__init__.py
new file mode 100644
index 000000000..843ca1595
--- /dev/null
+++ b/crates/lib/python/qcs_sdk/compiler/quilc/__init__.py
@@ -0,0 +1,50 @@
+# This file is automatically generated by pyo3_stub_gen
+# ruff: noqa: F401
+
+from qcs_sdk._qcs_sdk.compiler.quilc import (
+ CompilationResult,
+ CompilerOpts,
+ ConjugateByCliffordRequest,
+ ConjugatePauliByCliffordRequest,
+ ConjugatePauliByCliffordResponse,
+ DEFAULT_COMPILER_TIMEOUT,
+ GenerateRandomizedBenchmarkingSequenceResponse,
+ NativeQuilMetadata,
+ PauliTerm,
+ QuilcClient,
+ QuilcError,
+ RandomizedBenchmarkingRequest,
+ TargetDevice,
+ compile_program,
+ compile_program_async,
+ conjugate_pauli_by_clifford,
+ conjugate_pauli_by_clifford_async,
+ generate_randomized_benchmarking_sequence,
+ generate_randomized_benchmarking_sequence_async,
+ get_version_info,
+ get_version_info_async,
+)
+
+__all__ = [
+ "CompilationResult",
+ "CompilerOpts",
+ "ConjugateByCliffordRequest",
+ "ConjugatePauliByCliffordRequest",
+ "ConjugatePauliByCliffordResponse",
+ "DEFAULT_COMPILER_TIMEOUT",
+ "GenerateRandomizedBenchmarkingSequenceResponse",
+ "NativeQuilMetadata",
+ "PauliTerm",
+ "QuilcClient",
+ "QuilcError",
+ "RandomizedBenchmarkingRequest",
+ "TargetDevice",
+ "compile_program",
+ "compile_program_async",
+ "conjugate_pauli_by_clifford",
+ "conjugate_pauli_by_clifford_async",
+ "generate_randomized_benchmarking_sequence",
+ "generate_randomized_benchmarking_sequence_async",
+ "get_version_info",
+ "get_version_info_async",
+]
diff --git a/crates/lib/python/qcs_sdk/diagnostics/__init__.py b/crates/lib/python/qcs_sdk/diagnostics/__init__.py
new file mode 100644
index 000000000..63c66eb58
--- /dev/null
+++ b/crates/lib/python/qcs_sdk/diagnostics/__init__.py
@@ -0,0 +1,9 @@
+# This file is automatically generated by pyo3_stub_gen
+# ruff: noqa: F401
+
+from qcs_sdk._qcs_sdk.diagnostics import get_report, get_report_async
+
+__all__ = [
+ "get_report",
+ "get_report_async",
+]
diff --git a/crates/lib/python/qcs_sdk/qpu/__init__.py b/crates/lib/python/qcs_sdk/qpu/__init__.py
new file mode 100644
index 000000000..40b9d4fda
--- /dev/null
+++ b/crates/lib/python/qcs_sdk/qpu/__init__.py
@@ -0,0 +1,30 @@
+# This file is automatically generated by pyo3_stub_gen
+# ruff: noqa: F401
+
+from qcs_sdk._qcs_sdk.qpu import (
+ ListQuantumProcessorsError,
+ MemoryValues,
+ QPUResultData,
+ RawQPUReadoutData,
+ ReadoutValues,
+ api,
+ experimental,
+ isa,
+ list_quantum_processors,
+ list_quantum_processors_async,
+ translation,
+)
+
+__all__ = [
+ "ListQuantumProcessorsError",
+ "MemoryValues",
+ "QPUResultData",
+ "RawQPUReadoutData",
+ "ReadoutValues",
+ "api",
+ "experimental",
+ "isa",
+ "list_quantum_processors",
+ "list_quantum_processors_async",
+ "translation",
+]
diff --git a/crates/lib/python/qcs_sdk/qpu/api/__init__.py b/crates/lib/python/qcs_sdk/qpu/api/__init__.py
new file mode 100644
index 000000000..103113bf9
--- /dev/null
+++ b/crates/lib/python/qcs_sdk/qpu/api/__init__.py
@@ -0,0 +1,50 @@
+# This file is automatically generated by pyo3_stub_gen
+# ruff: noqa: F401
+
+from qcs_sdk._qcs_sdk.qpu.api import (
+ APIExecutionOptions,
+ APIExecutionOptionsBuilder,
+ BuildOptionsError,
+ ConnectionStrategy,
+ ExecutionOptions,
+ ExecutionOptionsBuilder,
+ ExecutionResult,
+ ExecutionResults,
+ QpuApiDuration,
+ QpuApiError,
+ SubmissionError,
+ cancel_job,
+ cancel_job_async,
+ cancel_jobs,
+ cancel_jobs_async,
+ retrieve_results,
+ retrieve_results_async,
+ submit,
+ submit_async,
+ submit_with_parameter_batch,
+ submit_with_parameter_batch_async,
+)
+
+__all__ = [
+ "APIExecutionOptions",
+ "APIExecutionOptionsBuilder",
+ "BuildOptionsError",
+ "ConnectionStrategy",
+ "ExecutionOptions",
+ "ExecutionOptionsBuilder",
+ "ExecutionResult",
+ "ExecutionResults",
+ "QpuApiDuration",
+ "QpuApiError",
+ "SubmissionError",
+ "cancel_job",
+ "cancel_job_async",
+ "cancel_jobs",
+ "cancel_jobs_async",
+ "retrieve_results",
+ "retrieve_results_async",
+ "submit",
+ "submit_async",
+ "submit_with_parameter_batch",
+ "submit_with_parameter_batch_async",
+]
diff --git a/crates/lib/python/qcs_sdk/qpu/experimental/__init__.py b/crates/lib/python/qcs_sdk/qpu/experimental/__init__.py
new file mode 100644
index 000000000..ee43285a1
--- /dev/null
+++ b/crates/lib/python/qcs_sdk/qpu/experimental/__init__.py
@@ -0,0 +1,8 @@
+# This file is automatically generated by pyo3_stub_gen
+# ruff: noqa: F401
+
+from qcs_sdk._qcs_sdk.qpu.experimental import random
+
+__all__ = [
+ "random",
+]
diff --git a/crates/lib/python/qcs_sdk/qpu/experimental/random/__init__.py b/crates/lib/python/qcs_sdk/qpu/experimental/random/__init__.py
new file mode 100644
index 000000000..1c19628fd
--- /dev/null
+++ b/crates/lib/python/qcs_sdk/qpu/experimental/random/__init__.py
@@ -0,0 +1,18 @@
+# This file is automatically generated by pyo3_stub_gen
+# ruff: noqa: F401
+
+from qcs_sdk._qcs_sdk.qpu.experimental.random import (
+ ChooseRandomRealSubRegions,
+ PrngSeedValue,
+ RandomError,
+ choose_random_real_sub_region_indices,
+ lfsr_v1_next,
+)
+
+__all__ = [
+ "ChooseRandomRealSubRegions",
+ "PrngSeedValue",
+ "RandomError",
+ "choose_random_real_sub_region_indices",
+ "lfsr_v1_next",
+]
diff --git a/crates/lib/python/qcs_sdk/qpu/isa/__init__.py b/crates/lib/python/qcs_sdk/qpu/isa/__init__.py
new file mode 100644
index 000000000..44bbddf9a
--- /dev/null
+++ b/crates/lib/python/qcs_sdk/qpu/isa/__init__.py
@@ -0,0 +1,40 @@
+# This file is automatically generated by pyo3_stub_gen
+# ruff: noqa: F401
+
+from qcs_sdk._qcs_sdk.qpu.isa import (
+ Architecture,
+ Characteristic,
+ Edge,
+ Family,
+ GetISAError,
+ InstructionSetArchitecture,
+ ListISAsError,
+ Node,
+ Operation,
+ OperationSite,
+ Parameter,
+ SerializeISAError,
+ get_instruction_set_architecture,
+ get_instruction_set_architecture_async,
+ list_instruction_set_architectures,
+ list_instruction_set_architectures_async,
+)
+
+__all__ = [
+ "Architecture",
+ "Characteristic",
+ "Edge",
+ "Family",
+ "GetISAError",
+ "InstructionSetArchitecture",
+ "ListISAsError",
+ "Node",
+ "Operation",
+ "OperationSite",
+ "Parameter",
+ "SerializeISAError",
+ "get_instruction_set_architecture",
+ "get_instruction_set_architecture_async",
+ "list_instruction_set_architectures",
+ "list_instruction_set_architectures_async",
+]
diff --git a/crates/lib/python/qcs_sdk/qpu/translation/__init__.py b/crates/lib/python/qcs_sdk/qpu/translation/__init__.py
new file mode 100644
index 000000000..c461cadc6
--- /dev/null
+++ b/crates/lib/python/qcs_sdk/qpu/translation/__init__.py
@@ -0,0 +1,28 @@
+# This file is automatically generated by pyo3_stub_gen
+# ruff: noqa: F401
+
+from qcs_sdk._qcs_sdk.qpu.translation import (
+ QCtrl,
+ Riverlane,
+ TranslationBackend,
+ TranslationError,
+ TranslationOptions,
+ TranslationResult,
+ get_quilt_calibrations,
+ get_quilt_calibrations_async,
+ translate,
+ translate_async,
+)
+
+__all__ = [
+ "QCtrl",
+ "Riverlane",
+ "TranslationBackend",
+ "TranslationError",
+ "TranslationOptions",
+ "TranslationResult",
+ "get_quilt_calibrations",
+ "get_quilt_calibrations_async",
+ "translate",
+ "translate_async",
+]
diff --git a/crates/lib/python/qcs_sdk/qvm/__init__.py b/crates/lib/python/qcs_sdk/qvm/__init__.py
new file mode 100644
index 000000000..d29a56b49
--- /dev/null
+++ b/crates/lib/python/qcs_sdk/qvm/__init__.py
@@ -0,0 +1,15 @@
+# This file is automatically generated by pyo3_stub_gen
+# ruff: noqa: F401
+
+from qcs_sdk._qcs_sdk.qvm import QVMClient, QVMError, QVMOptions, QVMResultData, RawQVMReadoutData, api, run, run_async
+
+__all__ = [
+ "QVMClient",
+ "QVMError",
+ "QVMOptions",
+ "QVMResultData",
+ "RawQVMReadoutData",
+ "api",
+ "run",
+ "run_async",
+]
diff --git a/crates/lib/python/qcs_sdk/qvm/api/__init__.py b/crates/lib/python/qcs_sdk/qvm/api/__init__.py
new file mode 100644
index 000000000..896dd07c9
--- /dev/null
+++ b/crates/lib/python/qcs_sdk/qvm/api/__init__.py
@@ -0,0 +1,40 @@
+# This file is automatically generated by pyo3_stub_gen
+# ruff: noqa: F401
+
+from qcs_sdk._qcs_sdk.qvm.api import (
+ AddressRequest,
+ ExpectationRequest,
+ MultishotMeasureRequest,
+ MultishotRequest,
+ MultishotResponse,
+ WavefunctionRequest,
+ get_version_info,
+ get_version_info_async,
+ get_wavefunction,
+ get_wavefunction_async,
+ measure_expectation,
+ measure_expectation_async,
+ run,
+ run_and_measure,
+ run_and_measure_async,
+ run_async,
+)
+
+__all__ = [
+ "AddressRequest",
+ "ExpectationRequest",
+ "MultishotMeasureRequest",
+ "MultishotRequest",
+ "MultishotResponse",
+ "WavefunctionRequest",
+ "get_version_info",
+ "get_version_info_async",
+ "get_wavefunction",
+ "get_wavefunction_async",
+ "measure_expectation",
+ "measure_expectation_async",
+ "run",
+ "run_and_measure",
+ "run_and_measure_async",
+ "run_async",
+]
diff --git a/crates/lib/python/stubtest-allowlist b/crates/lib/python/stubtest-allowlist
index 58afe25f5..0f72da16d 100644
--- a/crates/lib/python/stubtest-allowlist
+++ b/crates/lib/python/stubtest-allowlist
@@ -1,46 +1,19 @@
+# Entries are regexes matched against the full runtime path. Each name below is checked twice:
+# once in the compiled extension (`qcs_sdk._qcs_sdk.*`) and once under the public name it is
+# re-exported as (`qcs_sdk.*`), so both forms need allowing — hence the `(_qcs_sdk\.)?` prefix.
qcs_sdk._tracing_subscriber.*
+qcs_sdk._qcs_sdk._tracing_subscriber
-# These "__all__" exist in the package but aren't included in the generated stubs (yet).
-qcs_sdk.__all__
-qcs_sdk.client.__all__
-qcs_sdk.compiler.__all__
-qcs_sdk.compiler.quilc.__all__
-qcs_sdk.diagnostics.__all__
-qcs_sdk.qpu.__all__
-qcs_sdk.qpu.api.__all__
-qcs_sdk.qpu.experimental.__all__
-qcs_sdk.qpu.experimental.random.__all__
-qcs_sdk.qpu.isa.__all__
-qcs_sdk.qpu.translation.__all__
-qcs_sdk.qvm.__all__
-qcs_sdk.qvm.api.__all__
+# The generated stubs don't (yet) carry an `__all__` for the private extension module.
+qcs_sdk._qcs_sdk.__all__
# `mypy` detects the defaults as Ellipsis, rather than as empty lists.
# That's sort of technically correct, but showing the empty list is way more useful for callers.
-qcs_sdk.Executable.__new__
-qcs_sdk.compiler.quilc.CompilerOpts.__new__
+qcs_sdk\.(_qcs_sdk\.)?Executable\.__new__
+qcs_sdk\.(_qcs_sdk\.)?compiler\.quilc\.CompilerOpts\.__new__
# These constants are typed with Ellipsis, but technically have (arbitrary) values,
# so `mypy` complains about them, too.
-qcs_sdk.Service.QCS
-qcs_sdk.Service.QPU
-qcs_sdk.Service.QUILC
-qcs_sdk.Service.QVM
-qcs_sdk.compiler.quilc.DEFAULT_COMPILER_TIMEOUT
-qcs_sdk.qpu.isa.Family.ANKAA
-qcs_sdk.qpu.isa.Family.ASPEN
-qcs_sdk.qpu.isa.Family.FULL
-qcs_sdk.qpu.isa.Family.NONE
-qcs_sdk.qpu.translation.TranslationBackend.V1
-qcs_sdk.qpu.translation.TranslationBackend.V2
-
-# These are re-exported from the qcs_api_client_common crate.
-qcs_sdk.client.AuthServer
-qcs_sdk.client.ClientCredentials
-qcs_sdk.client.ExternallyManaged
-qcs_sdk.client.RefreshToken
-qcs_sdk.client.SecretRefreshToken
-
-# Re-exported to top-level from submodules.
-qcs_sdk.QCSClient
-
+qcs_sdk\.(_qcs_sdk\.)?Service\.(QCS|QPU|QUILC|QVM)
+qcs_sdk\.(_qcs_sdk\.)?qpu\.isa\.Family\.(ANKAA|ASPEN|FULL|NONE)
+qcs_sdk\.(_qcs_sdk\.)?qpu\.translation\.TranslationBackend\.(V1|V2)
diff --git a/crates/lib/python/stubtest-mypy.ini b/crates/lib/python/stubtest-mypy.ini
new file mode 100644
index 000000000..8af6060b7
--- /dev/null
+++ b/crates/lib/python/stubtest-mypy.ini
@@ -0,0 +1,15 @@
+# `stubtest` type-checks the stubs with `mypy` before comparing them to the runtime, and any
+# build error there aborts the run before the allowlist is ever consulted.
+#
+# `pyo3_stub_gen` refers to types from other crates' nested modules by the module's last
+# component (`program.Program`), but imports those modules as `import quil._quil.program`,
+# which binds only `quil` — so the references are undefined. See TODO(#556); until the
+# generator emits a usable import for foreign modules, silence just that error, in just the
+# modules that borrow those types.
+[mypy]
+
+[mypy-qcs_sdk._qcs_sdk.client]
+disable_error_code = name-defined
+
+[mypy-qcs_sdk._qcs_sdk.compiler.quilc]
+disable_error_code = name-defined
diff --git a/crates/lib/scripts/check-py-api.sh b/crates/lib/scripts/check-py-api.sh
index 9e424b6d1..530d48b9a 100755
--- a/crates/lib/scripts/check-py-api.sh
+++ b/crates/lib/scripts/check-py-api.sh
@@ -3,7 +3,7 @@
# Exits with status 1 if `griffe` says it's a breaking change, but `knope` doesn't know that.
# Exits with status 0 if they both or only `knope` reports this is a breaking change.
#
-# This uses `poetry` to run `griffe`, and must be executed from the project's root directory.
+# This uses `uv` to run `griffe`, and must be executed from the project's root directory.
set -u
@@ -28,7 +28,7 @@ PY_PACKAGE="qcs_sdk"
KNOPE_PACKAGE="crates/lib"
# Check if `griffe` says this is a breaking change.
-poetry run -P crates/lib -- \
+uv run --active --project crates/lib -- \
griffe check \
--search crates/python \
--search crates/lib/python \
diff --git a/crates/lib/scripts/lint-bindings.py b/crates/lib/scripts/lint-bindings.py
index 711991c10..a77e713e7 100644
--- a/crates/lib/scripts/lint-bindings.py
+++ b/crates/lib/scripts/lint-bindings.py
@@ -22,6 +22,7 @@
logging.basicConfig(level=logging.WARNING)
logger = logging.getLogger()
+
def main():
args = parser.get_parser().parse_args()
@@ -41,7 +42,7 @@ def main():
"ClientCredentials",
"ExternallyManaged",
}
- client_mod = exported["qcs_sdk.client"]
+ client_mod = exported["qcs_sdk._qcs_sdk.client"]
to_remove = {item for item in client_mod if item.rust_name in reexports}
for export in to_remove:
client_mod.discard(export)
diff --git a/crates/lib/scripts/patch_grpc_web.py b/crates/lib/scripts/patch_grpc_web.py
index 3f5682eec..21ed96b29 100644
--- a/crates/lib/scripts/patch_grpc_web.py
+++ b/crates/lib/scripts/patch_grpc_web.py
@@ -28,4 +28,4 @@ def write(f: TextIOWrapper, data):
with open(join(pycrate_path, "Cargo.toml"), "r+") as f:
data = toml.load(f)
data["package"]["name"] = "qcs-sdk-python-grpc-web"
- write(f, data)
\ No newline at end of file
+ write(f, data)
diff --git a/crates/lib/src/client.rs b/crates/lib/src/client.rs
index cc1bd48d1..6fc113580 100644
--- a/crates/lib/src/client.rs
+++ b/crates/lib/src/client.rs
@@ -50,7 +50,12 @@ pub(crate) static DEFAULT_HTTP_API_TIMEOUT: Duration = Duration::from_secs(10);
#[cfg_attr(feature = "stubs", gen_stub_pyclass)]
#[cfg_attr(
feature = "python",
- pyo3::pyclass(module = "qcs_sdk.client", name = "QCSClient", eq)
+ pyo3::pyclass(
+ module = "qcs_sdk._qcs_sdk.client",
+ name = "QCSClient",
+ eq,
+ from_py_object
+ )
)]
pub struct Qcs {
config: ClientConfiguration,
diff --git a/crates/lib/src/compiler/python.rs b/crates/lib/src/compiler/python.rs
index c78ed902c..7596a755e 100644
--- a/crates/lib/src/compiler/python.rs
+++ b/crates/lib/src/compiler/python.rs
@@ -114,7 +114,11 @@ pub(crate) enum QuilcClient {
/// Client used to communicate with Quilc.
#[derive(Clone)]
#[cfg_attr(feature = "stubs", gen_stub_pyclass)]
-#[pyclass(module = "qcs_sdk.compiler.quilc", name = "QuilcClient")]
+#[pyclass(
+ module = "qcs_sdk._qcs_sdk.compiler.quilc",
+ name = "QuilcClient",
+ from_py_object
+)]
pub(crate) struct PyQuilcClient {
pub inner: QuilcClient,
}
@@ -220,7 +224,7 @@ py_function_sync_async! {
/// :param options: Optional compiler options. If ``None``, default values are used.
///
/// :raises QuilcError: If compilation fails.
- #[cfg_attr(feature = "stubs", gen_stub_pyfunction(module = "qcs_sdk.compiler.quilc"))]
+ #[cfg_attr(feature = "stubs", gen_stub_pyfunction(module = "qcs_sdk._qcs_sdk.compiler.quilc"))]
#[pyfunction]
#[pyo3(signature = (quil, target, client, options = None))]
#[tracing::instrument(skip_all)]
@@ -303,7 +307,7 @@ py_function_sync_async! {
/// :param client: Client used to send compilation requests to Quilc.
///
/// :raises QuilcError: If there is a failure connecting to Quilc.
- #[cfg_attr(feature = "stubs", gen_stub_pyfunction(module = "qcs_sdk.compiler.quilc"))]
+ #[cfg_attr(feature = "stubs", gen_stub_pyfunction(module = "qcs_sdk._qcs_sdk.compiler.quilc"))]
#[pyfunction]
async fn get_version_info(client: PyQuilcClient) -> PyResult {
client.inner.as_client().get_version_info().map_err(Into::into)
@@ -336,7 +340,7 @@ py_function_sync_async! {
/// :param client: Client used to send compilation requests to Quilc.
///
/// :raises QuilcError: If there is a failure connecting to Quilc or if the request is malformed.
- #[cfg_attr(feature = "stubs", gen_stub_pyfunction(module = "qcs_sdk.compiler.quilc"))]
+ #[cfg_attr(feature = "stubs", gen_stub_pyfunction(module = "qcs_sdk._qcs_sdk.compiler.quilc"))]
#[pyfunction]
async fn conjugate_pauli_by_clifford(
request: ConjugateByCliffordRequest,
@@ -390,7 +394,7 @@ py_function_sync_async! {
/// :param client: Client used to send compilation requests to Quilc.
///
/// :raises QuilcError: If there is a failure connecting to Quilc or if the request is malformed.
- #[cfg_attr(feature = "stubs", gen_stub_pyfunction(module = "qcs_sdk.compiler.quilc"))]
+ #[cfg_attr(feature = "stubs", gen_stub_pyfunction(module = "qcs_sdk._qcs_sdk.compiler.quilc"))]
#[pyfunction]
async fn generate_randomized_benchmarking_sequence(
request: RandomizedBenchmarkingRequest,
diff --git a/crates/lib/src/compiler/quilc.rs b/crates/lib/src/compiler/quilc.rs
index 08fe08f27..e3da87212 100644
--- a/crates/lib/src/compiler/quilc.rs
+++ b/crates/lib/src/compiler/quilc.rs
@@ -63,7 +63,12 @@ pub trait Client {
#[cfg_attr(feature = "stubs", gen_stub_pyclass)]
#[cfg_attr(
feature = "python",
- pyo3::pyclass(module = "qcs_sdk.compiler.quilc", get_all, frozen)
+ pyo3::pyclass(
+ module = "qcs_sdk._qcs_sdk.compiler.quilc",
+ get_all,
+ frozen,
+ from_py_object
+ )
)]
pub struct CompilationResult {
/// The compiled program
@@ -77,7 +82,7 @@ pub struct CompilationResult {
#[cfg_attr(feature = "stubs", gen_stub_pyclass)]
#[cfg_attr(
feature = "python",
- pyo3::pyclass(module = "qcs_sdk.compiler.quilc", frozen)
+ pyo3::pyclass(module = "qcs_sdk._qcs_sdk.compiler.quilc", frozen, from_py_object)
)]
pub struct CompilerOpts {
/// The number of seconds to wait before timing out. If `None`, there is no timeout.
@@ -133,7 +138,12 @@ impl Default for CompilerOpts {
#[cfg_attr(feature = "stubs", gen_stub_pyclass)]
#[cfg_attr(
feature = "python",
- pyo3::pyclass(module = "qcs_sdk.compiler.quilc", frozen, get_all)
+ pyo3::pyclass(
+ module = "qcs_sdk._qcs_sdk.compiler.quilc",
+ frozen,
+ get_all,
+ from_py_object
+ )
)]
pub struct PauliTerm {
/// Qubit indices onto which the factors of the Pauli term are applied.
@@ -149,7 +159,12 @@ pub struct PauliTerm {
#[cfg_attr(feature = "stubs", gen_stub_pyclass)]
#[cfg_attr(
feature = "python",
- pyo3::pyclass(module = "qcs_sdk.compiler.quilc", frozen, get_all)
+ pyo3::pyclass(
+ module = "qcs_sdk._qcs_sdk.compiler.quilc",
+ frozen,
+ get_all,
+ from_py_object
+ )
)]
pub struct ConjugateByCliffordRequest {
/// Pauli Term to conjugate.
@@ -164,7 +179,12 @@ pub struct ConjugateByCliffordRequest {
#[cfg_attr(feature = "stubs", gen_stub_pyclass)]
#[cfg_attr(
feature = "python",
- pyo3::pyclass(module = "qcs_sdk.compiler.quilc", frozen, get_all)
+ pyo3::pyclass(
+ module = "qcs_sdk._qcs_sdk.compiler.quilc",
+ frozen,
+ get_all,
+ from_py_object
+ )
)]
pub(crate) struct ConjugatePauliByCliffordRequest {
#[serde(rename = "*args")]
@@ -182,7 +202,12 @@ impl From for ConjugatePauliByCliffordRequest {
#[cfg_attr(feature = "stubs", gen_stub_pyclass)]
#[cfg_attr(
feature = "python",
- pyo3::pyclass(module = "qcs_sdk.compiler.quilc", frozen, get_all)
+ pyo3::pyclass(
+ module = "qcs_sdk._qcs_sdk.compiler.quilc",
+ frozen,
+ get_all,
+ from_py_object
+ )
)]
pub struct ConjugatePauliByCliffordResponse {
/// Encoded global phase factor on the emitted Pauli.
@@ -198,7 +223,12 @@ pub struct ConjugatePauliByCliffordResponse {
#[cfg_attr(feature = "stubs", gen_stub_pyclass)]
#[cfg_attr(
feature = "python",
- pyo3::pyclass(module = "qcs_sdk.compiler.quilc", frozen, get_all)
+ pyo3::pyclass(
+ module = "qcs_sdk._qcs_sdk.compiler.quilc",
+ frozen,
+ get_all,
+ from_py_object
+ )
)]
pub struct RandomizedBenchmarkingRequest {
/// Depth of the benchmarking sequence.
@@ -235,7 +265,12 @@ impl From for GenerateRandomizedBenchmarkingSeque
#[cfg_attr(feature = "stubs", gen_stub_pyclass)]
#[cfg_attr(
feature = "python",
- pyo3::pyclass(module = "qcs_sdk.compiler.quilc", frozen, get_all)
+ pyo3::pyclass(
+ module = "qcs_sdk._qcs_sdk.compiler.quilc",
+ frozen,
+ get_all,
+ from_py_object
+ )
)]
pub struct GenerateRandomizedBenchmarkingSequenceResponse {
/// List of Cliffords, each expressed as a list of generator indices.
@@ -299,7 +334,7 @@ where
#[cfg_attr(feature = "stubs", gen_stub_pyclass)]
#[cfg_attr(
feature = "python",
- pyo3::pyclass(module = "qcs_sdk.compiler.quilc", eq)
+ pyo3::pyclass(module = "qcs_sdk._qcs_sdk.compiler.quilc", eq, from_py_object)
)]
pub struct NativeQuilMetadata {
/// Output qubit index relabeling due to SWAP insertion.
@@ -369,7 +404,7 @@ impl NativeQuilRequest {
#[cfg_attr(feature = "stubs", gen_stub_pyclass)]
#[cfg_attr(
feature = "python",
- pyo3::pyclass(module = "qcs_sdk.compiler.quilc", frozen)
+ pyo3::pyclass(module = "qcs_sdk._qcs_sdk.compiler.quilc", frozen, from_py_object)
)]
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[serde(tag = "_type")]
diff --git a/crates/lib/src/diagnostics/python.rs b/crates/lib/src/diagnostics/python.rs
index 2c922d0f9..40748367e 100644
--- a/crates/lib/src/diagnostics/python.rs
+++ b/crates/lib/src/diagnostics/python.rs
@@ -28,7 +28,10 @@ create_init_submodule! {
/// report = asyncio.run(main())
/// print(report)
/// ```
-#[cfg_attr(feature = "stubs", gen_stub_pyfunction(module = "qcs_sdk.diagnostics"))]
+#[cfg_attr(
+ feature = "stubs",
+ gen_stub_pyfunction(module = "qcs_sdk._qcs_sdk.diagnostics")
+)]
#[pyfunction]
pub(crate) fn get_report_async(py: Python<'_>) -> PyResult> {
let py_part = get_py_report(py)?;
@@ -46,7 +49,10 @@ pub(crate) fn get_report_async(py: Python<'_>) -> PyResult
/// Use that version in async environments.
///
/// Note: this format is not stable and its content may change between versions.
-#[cfg_attr(feature = "stubs", gen_stub_pyfunction(module = "qcs_sdk.diagnostics"))]
+#[cfg_attr(
+ feature = "stubs",
+ gen_stub_pyfunction(module = "qcs_sdk._qcs_sdk.diagnostics")
+)]
#[pyfunction]
pub(crate) fn get_report(py: Python<'_>) -> PyResult {
let py_part = get_py_report(py)?;
diff --git a/crates/lib/src/executable.rs b/crates/lib/src/executable.rs
index b9ba54769..c42004e77 100644
--- a/crates/lib/src/executable.rs
+++ b/crates/lib/src/executable.rs
@@ -681,7 +681,12 @@ pub enum Error {
#[cfg_attr(feature = "stubs", gen_stub_pyclass_enum)]
#[cfg_attr(
feature = "python",
- pyo3::pyclass(module = "qcs_sdk", rename_all = "SCREAMING_SNAKE_CASE", eq)
+ pyo3::pyclass(
+ module = "qcs_sdk._qcs_sdk",
+ rename_all = "SCREAMING_SNAKE_CASE",
+ eq,
+ from_py_object
+ )
)]
/// The external services that this SDK may connect to. Used to differentiate between networking
/// issues in [`Error::Connection`].
diff --git a/crates/lib/src/execution_data.rs b/crates/lib/src/execution_data.rs
index 0eee9ff37..6c2a5bee8 100644
--- a/crates/lib/src/execution_data.rs
+++ b/crates/lib/src/execution_data.rs
@@ -66,7 +66,10 @@ pub enum ResultData {
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
#[cfg_attr(not(feature = "python"), optipy::strip_pyo3)]
#[cfg_attr(feature = "stubs", gen_stub_pyclass)]
-#[cfg_attr(feature = "python", pyo3::pyclass(module = "qcs_sdk", eq))]
+#[cfg_attr(
+ feature = "python",
+ pyo3::pyclass(module = "qcs_sdk._qcs_sdk", eq, from_py_object)
+)]
pub struct ExecutionData {
/// The [`ResultData`] that was read from the [`Executable`](crate::Executable).
#[pyo3(get)]
@@ -95,7 +98,10 @@ pub enum RegisterMatrix {
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[repr(transparent)]
#[cfg_attr(feature = "stubs", gen_stub_pyclass)]
-#[cfg_attr(feature = "python", pyo3::pyclass(module = "qcs_sdk", mapping))]
+#[cfg_attr(
+ feature = "python",
+ pyo3::pyclass(module = "qcs_sdk._qcs_sdk", mapping, from_py_object)
+)]
pub struct RegisterMap(pub HashMap);
/// Errors that may occur when trying to build a [`RegisterMatrix`] from execution data
diff --git a/crates/lib/src/python/errors.rs b/crates/lib/src/python/errors.rs
index c871266e7..18807166b 100644
--- a/crates/lib/src/python/errors.rs
+++ b/crates/lib/src/python/errors.rs
@@ -5,7 +5,7 @@ use qcs_api_client_common::configuration;
use rigetti_pyo3::{create_exception, exception};
create_exception!(
- qcs_sdk,
+ qcs_sdk._qcs_sdk,
QcsSdkError,
PyException,
"Base exception type for errors raised by this package."
@@ -13,7 +13,7 @@ create_exception!(
exception!(
crate::Error,
- qcs_sdk,
+ qcs_sdk._qcs_sdk,
ExecutionError,
QcsSdkError,
"Errors which can occur when executing a program."
@@ -21,35 +21,35 @@ exception!(
exception!(
crate::RegisterMatrixConversionError,
- qcs_sdk,
+ qcs_sdk._qcs_sdk,
RegisterMatrixConversionError,
QcsSdkError,
"Error that may occur when building a `RegisterMatrix` from execution data."
);
create_exception!(
- qcs_sdk.client,
+ qcs_sdk._qcs_sdk.client,
ClientError,
QcsSdkError,
"Errors encountered while interacting with a QCS API client."
);
create_exception!(
- qcs_sdk.client,
+ qcs_sdk._qcs_sdk.client,
BuildClientError,
ClientError,
"Errors encountered while building the QCS API client configuration manually."
);
create_exception!(
- qcs_sdk.client,
+ qcs_sdk._qcs_sdk.client,
LoadClientError,
ClientError,
"Errors encountered while loading the QCS API client configuration from the environment configuration."
);
create_exception!(
- qcs_sdk.client,
+ qcs_sdk._qcs_sdk.client,
TokenError,
ClientError,
"Errors that can occur when managing authorization tokens."
@@ -79,7 +79,7 @@ impl ClientError {
exception!(
crate::compiler::quilc::Error,
- qcs_sdk.compiler.quilc,
+ qcs_sdk._qcs_sdk.compiler.quilc,
QuilcError,
QcsSdkError,
"Errors encountered compiling a Quil program."
@@ -87,7 +87,7 @@ exception!(
exception!(
crate::compiler::rpcq::Error,
- qcs_sdk.client,
+ qcs_sdk._qcs_sdk.client,
RPCQQuilcError,
ClientError,
"Errors when compiling with RPCQ client."
@@ -96,7 +96,7 @@ exception!(
#[cfg(feature = "libquil")]
exception!(
crate::compiler::libquil::Error,
- qcs_sdk.client,
+ qcs_sdk._qcs_sdk.client,
LibquilQuilcError,
QcsSdkError,
"Errors when compiling with the libquil client."
@@ -104,7 +104,7 @@ exception!(
exception!(
crate::qpu::ListQuantumProcessorsError,
- qcs_sdk.qpu,
+ qcs_sdk._qcs_sdk.qpu,
ListQuantumProcessorsError,
QcsSdkError,
"API Errors encountered when trying to list available quantum processors."
@@ -113,7 +113,7 @@ exception!(
#[cfg(feature = "experimental")]
exception!(
crate::qpu::experimental::random::Error,
- qcs_sdk.qpu.experimental.random,
+ qcs_sdk._qcs_sdk.qpu.experimental.random,
RandomError,
QcsSdkError,
"Errors that may occur using the randomization primitives defined in this module."
@@ -121,7 +121,7 @@ exception!(
exception!(
crate::qpu::api::QpuApiError,
- qcs_sdk.qpu.api,
+ qcs_sdk._qcs_sdk.qpu.api,
QpuApiError,
QcsSdkError,
"Errors that can occur while attempting to establish a connection to the QPU."
@@ -129,7 +129,7 @@ exception!(
exception!(
crate::qpu::api::python::SubmissionError,
- qcs_sdk.qpu.api,
+ qcs_sdk._qcs_sdk.qpu.api,
SubmissionError,
QpuApiError,
"Errors that may occur when submitting a program for execution."
@@ -137,7 +137,7 @@ exception!(
exception!(
crate::qpu::api::python::BuildOptionsError,
- qcs_sdk.qpu.api,
+ qcs_sdk._qcs_sdk.qpu.api,
BuildOptionsError,
QpuApiError,
"Errors building execution options."
@@ -145,7 +145,7 @@ exception!(
exception!(
crate::qpu::GetIsaError,
- qcs_sdk.qpu.isa,
+ qcs_sdk._qcs_sdk.qpu.isa,
GetISAError,
QcsSdkError,
"Errors raised due to failure to get an ISA."
@@ -153,7 +153,7 @@ exception!(
exception!(
crate::qpu::ListISAsError,
- qcs_sdk.qpu.isa,
+ qcs_sdk._qcs_sdk.qpu.isa,
ListISAsError,
QcsSdkError,
"API Errors encountered when trying to list available ISAs."
@@ -161,7 +161,7 @@ exception!(
exception!(
crate::qpu::isa::python::SerializeIsaError,
- qcs_sdk.qpu.isa,
+ qcs_sdk._qcs_sdk.qpu.isa,
SerializeISAError,
QcsSdkError,
"Errors raised due to failure to serialize an ISA."
@@ -169,7 +169,7 @@ exception!(
exception!(
crate::qpu::translation::python::TranslationError,
- qcs_sdk.qpu.translation,
+ qcs_sdk._qcs_sdk.qpu.translation,
TranslationError,
QcsSdkError,
"Errors raised due to failure to translate a program."
@@ -177,7 +177,7 @@ exception!(
exception!(
crate::qvm::Error,
- qcs_sdk.qvm,
+ qcs_sdk._qcs_sdk.qvm,
QVMError,
QcsSdkError,
"Errors that can occur when running a Quil program on QVM."
diff --git a/crates/lib/src/python/executable.rs b/crates/lib/src/python/executable.rs
index 6cf315b55..5aa529061 100644
--- a/crates/lib/src/python/executable.rs
+++ b/crates/lib/src/python/executable.rs
@@ -83,7 +83,12 @@ use crate::{
/// ```
#[derive(Clone)]
#[cfg_attr(feature = "stubs", gen_stub_pyclass)]
-#[pyclass(module = "qcs_sdk", name = "Executable", frozen)]
+#[pyclass(
+ module = "qcs_sdk._qcs_sdk",
+ name = "Executable",
+ frozen,
+ from_py_object
+)]
pub(crate) struct PyExecutable(Arc>>);
/// The result of submitting a job to a QPU.
@@ -91,7 +96,12 @@ pub(crate) struct PyExecutable(Arc>>);
/// Used to retrieve the results of a job.
#[derive(Clone)]
#[cfg_attr(feature = "stubs", gen_stub_pyclass)]
-#[pyclass(module = "qcs_sdk", name = "JobHandle", frozen)]
+#[pyclass(
+ module = "qcs_sdk._qcs_sdk",
+ name = "JobHandle",
+ frozen,
+ from_py_object
+)]
pub(crate) struct PyJobHandle(JobHandle<'static>);
#[cfg_attr(feature = "stubs", gen_stub_pymethods)]
@@ -417,7 +427,7 @@ impl PyExecutable {
/// Note: The validity of parameters is not checked until execution.
#[derive(Debug, Clone)]
#[cfg_attr(feature = "stubs", gen_stub_pyclass)]
-#[pyclass(module = "qcs_sdk", get_all, set_all)]
+#[pyclass(module = "qcs_sdk._qcs_sdk", get_all, set_all, from_py_object)]
pub(crate) struct ExeParameter {
name: String,
index: usize,
diff --git a/crates/lib/src/python/execution_data.rs b/crates/lib/src/python/execution_data.rs
index 79570e7f7..bb68676c2 100644
--- a/crates/lib/src/python/execution_data.rs
+++ b/crates/lib/src/python/execution_data.rs
@@ -60,7 +60,7 @@ impl ExecutionData {
/// Each variant corresponds to the possible data types a register can contain.
#[derive(Debug)]
#[cfg_attr(feature = "stubs", gen_stub_pyclass_complex_enum)]
-#[pyclass(name = "RegisterMatrix", module = "qcs_sdk")]
+#[pyclass(name = "RegisterMatrix", module = "qcs_sdk._qcs_sdk")]
pub(crate) enum PyRegisterMatrix {
/// Integer register.
Integer(Py>),
@@ -191,7 +191,7 @@ impl RegisterMap {
}
#[cfg_attr(feature = "stubs", gen_stub_pyclass)]
-#[pyclass(module = "qcs_sdk")]
+#[pyclass(module = "qcs_sdk._qcs_sdk")]
pub(crate) struct RegisterMapItemsIter {
inner: std::collections::hash_map::IntoIter,
}
@@ -216,7 +216,7 @@ impl RegisterMapItemsIter {
}
#[cfg_attr(feature = "stubs", gen_stub_pyclass)]
-#[pyclass(module = "qcs_sdk")]
+#[pyclass(module = "qcs_sdk._qcs_sdk")]
pub(crate) struct RegisterMapKeysIter {
inner: std::collections::hash_map::IntoIter,
}
@@ -236,7 +236,7 @@ impl RegisterMapKeysIter {
}
#[cfg_attr(feature = "stubs", gen_stub_pyclass)]
-#[pyclass(module = "qcs_sdk")]
+#[pyclass(module = "qcs_sdk._qcs_sdk")]
pub(crate) struct RegisterMapValuesIter {
inner: std::collections::hash_map::IntoIter,
}
@@ -344,7 +344,7 @@ impl QpuResultData {
/// each register contains.
#[derive(Debug)]
#[cfg_attr(feature = "stubs", gen_stub_pyclass)]
-#[pyclass(module = "qcs_sdk.qpu", name = "RawQPUReadoutData", get_all)]
+#[pyclass(module = "qcs_sdk._qcs_sdk.qpu", name = "RawQPUReadoutData", get_all)]
pub(crate) struct RawQpuReadoutData {
pub mappings: HashMap,
pub readout_values: HashMap>,
diff --git a/crates/lib/src/python/mod.rs b/crates/lib/src/python/mod.rs
index 7e3b4a119..77bacbc2c 100644
--- a/crates/lib/src/python/mod.rs
+++ b/crates/lib/src/python/mod.rs
@@ -34,6 +34,21 @@ pub(crate) use nonzero::NonZeroU16;
static PY_RESET_LOGGING_HANDLE: OnceLock = OnceLock::new();
+/// The docstring for the `qcs_sdk` Python package.
+///
+/// The `__init__.py` files in the package are generated by `pyo3_stub_gen`, which does not
+/// write docstrings into them, so this is the only definition of the package docstring:
+/// [`init_module`] assigns it to the compiled module, from which the generated
+/// `qcs_sdk/__init__.py` re-exports it, and `module_doc!` copies it into the type stubs.
+const PACKAGE_DOC: &str =
+ "An interface to Rigetti [Quantum Cloud Services](https://docs.rigetti.com/qcs/) (QCS).
+
+These APIs allow users to compile and run Quil programs on Rigetti quantum processors.
+Internally, it is powered by the [QCS Rust SDK](https://github.com/rigetti/qcs-sdk-rust).
+
+This package is still in development and breaking changes should be expected between minor versions.
+";
+
create_init_submodule! {
classes: [
ExeParameter,
@@ -78,9 +93,14 @@ fn init_module(m: &Bound<'_, PyModule>) -> PyResult<()> {
}
let py = m.py();
- init_submodule("qcs_sdk", py, m)?;
+ init_submodule("qcs_sdk._qcs_sdk", py, m)?;
m.add("__version__", env!("CARGO_PKG_VERSION"))?;
+ m.setattr("__doc__", PACKAGE_DOC)?;
+
+ // Registered under the public `qcs_sdk` name rather than `qcs_sdk._qcs_sdk`: the
+ // corresponding Python source is generated into `python/qcs_sdk/_tracing_subscriber` by
+ // `pyo3_tracing_subscriber_build`, so `qcs_sdk._tracing_subscriber` is its import path.
pyo3_tracing_subscriber::add_submodule("qcs_sdk", "_tracing_subscriber", py, m)?;
Ok(())
@@ -88,7 +108,10 @@ fn init_module(m: &Bound<'_, PyModule>) -> PyResult<()> {
#[cfg(feature = "stubs")]
mod stubs {
- use pyo3_stub_gen::{define_stub_info_gatherer, generate::Module, Result, StubInfo};
+ use pyo3_stub_gen::{
+ define_stub_info_gatherer, generate::Module, module_doc, reexport_module_members, Result,
+ StubInfo,
+ };
use std::path::Path;
#[derive(pyo3::IntoPyObject)]
@@ -106,7 +129,84 @@ mod stubs {
}
}
- pyo3_stub_gen::module_variable!("qcs_sdk", "__version__", Final<&str>);
+ pyo3_stub_gen::module_variable!("qcs_sdk._qcs_sdk", "__version__", Final<&str>);
+
+ pyo3_stub_gen::module_variable!(
+ "qcs_sdk._qcs_sdk.compiler.quilc",
+ "DEFAULT_COMPILER_TIMEOUT",
+ Final
+ );
+
+ pyo3_stub_gen::module_doc!("qcs_sdk._qcs_sdk", "{}", super::PACKAGE_DOC);
+
+ // `client::init_submodule` adds these `qcs_api_client_common` types to `qcs_sdk.client`,
+ // but they carry that crate's own module annotation, so nothing declares them as members of
+ // ours: they would be missing from the generated `__init__.py` and undefined in the stubs.
+ // Aliasing them here registers them as members of the module that actually exposes them.
+ // (`scripts/lint-bindings.py` keeps a matching list, for the same reason.)
+ mod client_reexports {
+ use pyo3_stub_gen::type_alias;
+ use qcs_api_client_common::configuration::{
+ secrets::SecretRefreshToken as CommonSecretRefreshToken,
+ settings::AuthServer as CommonAuthServer,
+ tokens::{
+ ClientCredentials as CommonClientCredentials,
+ ExternallyManaged as CommonExternallyManaged, OAuthSession as CommonOAuthSession,
+ RefreshToken as CommonRefreshToken,
+ },
+ };
+
+ type_alias!("qcs_sdk._qcs_sdk.client", AuthServer = CommonAuthServer);
+ type_alias!("qcs_sdk._qcs_sdk.client", ClientCredentials = CommonClientCredentials);
+ type_alias!("qcs_sdk._qcs_sdk.client", ExternallyManaged = CommonExternallyManaged);
+ type_alias!("qcs_sdk._qcs_sdk.client", OAuthSession = CommonOAuthSession);
+ type_alias!("qcs_sdk._qcs_sdk.client", RefreshToken = CommonRefreshToken);
+ type_alias!("qcs_sdk._qcs_sdk.client", SecretRefreshToken = CommonSecretRefreshToken);
+ }
+
+ // During stub generation, these `qcs_sdk._qcs_sdk` modules and their contents are
+ // re-exported into the public `qcs_sdk` namespace, and the corresponding `__init__.py`
+ // files are generated. Every module in the tree built by `create_init_submodule!` needs an
+ // entry here: the compiled modules register themselves under `qcs_sdk._qcs_sdk.*`, so the
+ // public `qcs_sdk.*` import paths exist only by way of these generated packages.
+ reexport_module_members!("qcs_sdk" from "qcs_sdk._qcs_sdk"; *, "__doc__", "__version__");
+ reexport_module_members!("qcs_sdk.client" from "qcs_sdk._qcs_sdk.client");
+ reexport_module_members!("qcs_sdk.compiler" from "qcs_sdk._qcs_sdk.compiler");
+ // `DEFAULT_COMPILER_TIMEOUT` is a `consts:` entry in `create_init_submodule!`, which the
+ // wildcard doesn't see; `module_variable!` below gives it a type in the stubs.
+ reexport_module_members!(
+ "qcs_sdk.compiler.quilc" from "qcs_sdk._qcs_sdk.compiler.quilc";
+ *,
+ "DEFAULT_COMPILER_TIMEOUT"
+ );
+ reexport_module_members!("qcs_sdk.diagnostics" from "qcs_sdk._qcs_sdk.diagnostics");
+ reexport_module_members!("qcs_sdk.qpu" from "qcs_sdk._qcs_sdk.qpu");
+ reexport_module_members!("qcs_sdk.qpu.api" from "qcs_sdk._qcs_sdk.qpu.api");
+ reexport_module_members!("qcs_sdk.qpu.experimental" from "qcs_sdk._qcs_sdk.qpu.experimental");
+ reexport_module_members!(
+ "qcs_sdk.qpu.experimental.random" from "qcs_sdk._qcs_sdk.qpu.experimental.random"
+ );
+ reexport_module_members!("qcs_sdk.qpu.isa" from "qcs_sdk._qcs_sdk.qpu.isa");
+ reexport_module_members!("qcs_sdk.qpu.translation" from "qcs_sdk._qcs_sdk.qpu.translation");
+ reexport_module_members!("qcs_sdk.qvm" from "qcs_sdk._qcs_sdk.qvm");
+ reexport_module_members!("qcs_sdk.qvm.api" from "qcs_sdk._qcs_sdk.qvm.api");
+
+ // `QCSClient` has always been available at the top level, in addition to `qcs_sdk.client`.
+ reexport_module_members!("qcs_sdk" from "qcs_sdk._qcs_sdk.client"; "QCSClient");
+
+ // `_tracing_subscriber` is generated by `pyo3_tracing_subscriber_build` rather than by
+ // `pyo3_stub_gen`, so it has to be named explicitly. Sourcing it from the package itself
+ // generates `from qcs_sdk import _tracing_subscriber`, which resolves the generated
+ // subpackage through the partially-initialized package in `sys.modules`.
+ reexport_module_members!("qcs_sdk" from "qcs_sdk"; "_tracing_subscriber");
+
+ // `StubInfo` resolves every wildcard re-export it can see, including those declared by our
+ // dependencies, and fails if a source module has no registered members. `quil-rs` declares
+ // `quil.validation` from `quil._quil.validation`, whose only content is a submodule, so it
+ // registers that module imperatively in its own `stub_gen` binary — meaning it does not
+ // exist here and resolution fails. Declaring the module (with no docstring) registers it,
+ // after which `stub_info` drops it along with the rest of the foreign modules.
+ module_doc!("quil._quil.validation", "");
define_stub_info_gatherer!(internal_stub_info);
@@ -137,11 +237,22 @@ mod stubs {
let manifest_dir: &Path = env!("CARGO_MANIFEST_DIR").as_ref();
let mut stubs = StubInfo::from_pyproject_toml(manifest_dir.join("pyproject.toml"))?;
+ // `pyo3_stub_gen` gathers declarations from every linked crate, so dependencies that
+ // define their own Python packages — `quil-rs`, `qcs-api-client-common` — contribute
+ // their modules here too. Generation rejects any non-empty module outside this
+ // package's module path, and writing files for them would shadow the real, installed
+ // packages, so drop them. The cost is that our stubs refer to foreign types by their
+ // private paths (`quil._quil.program.Program`), since resolving the public alias needs
+ // the foreign module to still be present at generation time.
+ stubs
+ .modules
+ .retain(|name, _| name == "qcs_sdk" || name.starts_with("qcs_sdk."));
+
// Add otherwise empty modules, as they aren't found automatically.
let module_leaves = [
- "qcs_sdk.compiler.quilc",
- "qcs_sdk.qpu.experimental.random",
- "qcs_sdk.qvm",
+ "qcs_sdk._qcs_sdk.compiler.quilc",
+ "qcs_sdk._qcs_sdk.qpu.experimental.random",
+ "qcs_sdk._qcs_sdk.qvm",
];
for mod_name in module_leaves {
@@ -155,7 +266,7 @@ mod stubs {
#[cfg(feature = "stubs")]
pub use stubs::stub_info;
-#[cfg_attr(feature = "stubs", gen_stub_pyfunction(module = "qcs_sdk"))]
+#[cfg_attr(feature = "stubs", gen_stub_pyfunction(module = "qcs_sdk._qcs_sdk"))]
#[pyfunction]
/// Reset all caches for logging configuration within this library,
/// allowing the most recent Python-side changes to be applied.
@@ -167,7 +278,7 @@ fn reset_logging() {
}
}
-#[cfg_attr(feature = "stubs", gen_stub_pyfunction(module = "qcs_sdk"))]
+#[cfg_attr(feature = "stubs", gen_stub_pyfunction(module = "qcs_sdk._qcs_sdk"))]
#[pyfunction]
#[pyo3(name = "_gather_diagnostics")]
fn gather_diagnostics(py: Python<'_>) -> PyResult {
diff --git a/crates/lib/src/qpu/api/mod.rs b/crates/lib/src/qpu/api/mod.rs
index 4759f49ad..5276c9a81 100644
--- a/crates/lib/src/qpu/api/mod.rs
+++ b/crates/lib/src/qpu/api/mod.rs
@@ -377,8 +377,8 @@ pub type QpuConnectionOptionsBuilder = ExecutionOptionsBuilder;
)]
#[cfg_attr(
feature = "python",
- builder_struct_attr(pyo3::pyclass(module = "qcs_sdk.qpu.api")),
- pyo3::pyclass(module = "qcs_sdk.qpu.api", eq)
+ builder_struct_attr(pyo3::pyclass(module = "qcs_sdk._qcs_sdk.qpu.api", from_py_object)),
+ pyo3::pyclass(module = "qcs_sdk._qcs_sdk.qpu.api", eq, from_py_object)
)]
pub struct ExecutionOptions {
#[pyo3(get)]
@@ -421,9 +421,14 @@ impl Eq for ExecutionOptions {}
feature = "python",
builder_struct_attr(pyo3::pyclass(
name = "APIExecutionOptionsBuilder",
- module = "qcs_sdk.qpu.api"
+ module = "qcs_sdk._qcs_sdk.qpu.api",
+ from_py_object
)),
- pyo3::pyclass(name = "APIExecutionOptions", module = "qcs_sdk.qpu.api")
+ pyo3::pyclass(
+ name = "APIExecutionOptions",
+ module = "qcs_sdk._qcs_sdk.qpu.api",
+ from_py_object
+ )
)]
#[allow(clippy::module_name_repetitions)]
pub struct ApiExecutionOptions {
@@ -531,7 +536,10 @@ impl ExecutionOptions {
/// The connection strategy to use when submitting and retrieving jobs from a QPU.
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "stubs", gen_stub_pyclass_complex_enum)]
-#[cfg_attr(feature = "python", pyo3::pyclass(module = "qcs_sdk.qpu.api", eq))]
+#[cfg_attr(
+ feature = "python",
+ pyo3::pyclass(module = "qcs_sdk._qcs_sdk.qpu.api", eq, from_py_object)
+)]
pub enum ConnectionStrategy {
/// Connect through the publicly accessible gateway.
Gateway(),
diff --git a/crates/lib/src/qpu/api/python.rs b/crates/lib/src/qpu/api/python.rs
index ee4df51c6..9a5bd8610 100644
--- a/crates/lib/src/qpu/api/python.rs
+++ b/crates/lib/src/qpu/api/python.rs
@@ -78,7 +78,7 @@ impl_stub_type!(Register = Vec | Vec);
/// Execution readout data from a particular memory location.
#[derive(Clone, Debug)]
#[cfg_attr(feature = "stubs", gen_stub_pyclass)]
-#[pyclass(module = "qcs_sdk.qpu.api", frozen, get_all)]
+#[pyclass(module = "qcs_sdk._qcs_sdk.qpu.api", frozen, get_all, from_py_object)]
pub struct ExecutionResult {
/// The shape of the result data.
pub shape: [usize; 2],
@@ -143,7 +143,7 @@ impl ExecutionResult {
/// Execution readout data for all memory locations.
#[derive(Clone, Debug)]
#[cfg_attr(feature = "stubs", gen_stub_pyclass)]
-#[pyclass(module = "qcs_sdk.qpu.api", frozen, get_all)]
+#[pyclass(module = "qcs_sdk._qcs_sdk.qpu.api", frozen, get_all, from_py_object)]
pub struct ExecutionResults {
/// The readout results of execution, mapping a published filter node to its data.
///
@@ -210,7 +210,12 @@ impl From for ExecutionResults {
/// The duration of an API call.
#[derive(Debug, Clone, Copy)]
#[cfg_attr(feature = "stubs", gen_stub_pyclass)]
-#[pyclass(name = "QpuApiDuration", module = "qcs_sdk.qpu.api", frozen)]
+#[pyclass(
+ name = "QpuApiDuration",
+ module = "qcs_sdk._qcs_sdk.qpu.api",
+ frozen,
+ from_py_object
+)]
pub struct PyQpuApiDuration {
inner: QpuApiDuration,
}
@@ -570,7 +575,7 @@ py_function_sync_async! {
///
/// :raises LoadClientError: If there is an issue loading the QCS Client configuration.
/// :raises SubmissionError: If there was a problem submitting the program for execution.
- #[cfg_attr(feature = "stubs", gen_stub_pyfunction(module = "qcs_sdk.qpu.api"))]
+ #[cfg_attr(feature = "stubs", gen_stub_pyfunction(module = "qcs_sdk._qcs_sdk.qpu.api"))]
#[pyfunction]
#[pyo3(signature = (program, patch_values, quantum_processor_id = None, client = None, execution_options = None))]
#[pyo3_opentelemetry::pypropagate(on_context_extraction_failure="ignore")]
@@ -629,7 +634,7 @@ py_function_sync_async! {
///
/// :raises LoadClientError: If there is an issue loading the QCS Client configuration.
/// :raises SubmissionError: If there was a problem submitting any of the jobs for execution, or if no ``patch_values`` are given.
- #[cfg_attr(feature = "stubs", gen_stub_pyfunction(module = "qcs_sdk.qpu.api"))]
+ #[cfg_attr(feature = "stubs", gen_stub_pyfunction(module = "qcs_sdk._qcs_sdk.qpu.api"))]
#[pyfunction]
#[pyo3(signature = (program, patch_values, quantum_processor_id = None, client = None, execution_options = None))]
#[pyo3_opentelemetry::pypropagate(on_context_extraction_failure="ignore")]
@@ -677,7 +682,7 @@ py_function_sync_async! {
/// :param quantum_processor_id: The quantum processor to execute the job on. This parameter is required unless using the ``ConnectionStrategy.endpoint_id()`` or ``ConnectionStrategy.endpoint_address()`` execution option.
/// :param client: The ``Qcs`` client to use.
/// :param execution_options: The ``ExecutionOptions`` to use.
- #[cfg_attr(feature = "stubs", gen_stub_pyfunction(module = "qcs_sdk.qpu.api"))]
+ #[cfg_attr(feature = "stubs", gen_stub_pyfunction(module = "qcs_sdk._qcs_sdk.qpu.api"))]
#[pyfunction]
#[pyo3(signature = (job_ids, quantum_processor_id = None, client = None, execution_options = None))]
async fn cancel_jobs(
@@ -711,7 +716,7 @@ py_function_sync_async! {
/// :param quantum_processor_id: The quantum processor to execute the job on. This parameter is required unless using the ``ConnectionStrategy.endpoint_id()`` or ``ConnectionStrategy.endpoint_address()`` execution option.
/// :param client: The ``Qcs`` client to use.
/// :param execution_options: The ``ExecutionOptions`` to use.
- #[cfg_attr(feature = "stubs", gen_stub_pyfunction(module = "qcs_sdk.qpu.api"))]
+ #[cfg_attr(feature = "stubs", gen_stub_pyfunction(module = "qcs_sdk._qcs_sdk.qpu.api"))]
#[pyfunction]
#[pyo3(signature = (job_id, quantum_processor_id = None, client = None, execution_options = None))]
async fn cancel_job(
@@ -743,7 +748,7 @@ py_function_sync_async! {
///
/// :raises LoadClientError: If there is an issue loading the QCS Client configuration.
/// :raises QpuApiError: If there was a problem retrieving the results.
- #[cfg_attr(feature = "stubs", gen_stub_pyfunction(module = "qcs_sdk.qpu.api"))]
+ #[cfg_attr(feature = "stubs", gen_stub_pyfunction(module = "qcs_sdk._qcs_sdk.qpu.api"))]
#[pyfunction]
#[pyo3(signature = (job_id, quantum_processor_id = None, client = None, execution_options = None))]
#[pyo3_opentelemetry::pypropagate(on_context_extraction_failure="ignore")]
diff --git a/crates/lib/src/qpu/experimental/random.rs b/crates/lib/src/qpu/experimental/random.rs
index ef5c03fc0..1e3abd6d4 100644
--- a/crates/lib/src/qpu/experimental/random.rs
+++ b/crates/lib/src/qpu/experimental/random.rs
@@ -80,7 +80,14 @@ pub type RandomResult = Result;
/// sub-regions from a source array of real values to a destination array.
#[derive(Debug, Clone)]
#[cfg_attr(feature = "stubs", gen_stub_pyclass)]
-#[cfg_attr(feature = "python", pyo3::pyclass(module = "qcs_sdk.qpu.experimental.random", frozen))]
+#[cfg_attr(
+ feature = "python",
+ pyo3::pyclass(
+ module = "qcs_sdk._qcs_sdk.qpu.experimental.random",
+ frozen,
+ from_py_object
+ )
+)]
pub struct ChooseRandomRealSubRegions {
destination_memory_region_name: String,
source_memory_region_name: String,
@@ -162,7 +169,10 @@ impl ChooseRandomRealSubRegions {
}
#[cfg_attr(not(feature = "python"), optipy::strip_pyo3)]
-#[cfg_attr(all(feature = "python", not(feature = "stubs")), optipy::strip_pyo3(only_stubs))]
+#[cfg_attr(
+ all(feature = "python", not(feature = "stubs")),
+ optipy::strip_pyo3(only_stubs)
+)]
#[cfg_attr(feature = "stubs", gen_stub_pymethods)]
#[cfg_attr(feature = "python", pyo3::pymethods)]
impl ChooseRandomRealSubRegions {
@@ -238,7 +248,14 @@ impl TryFrom for Call {
/// convertible to `f64`.
#[derive(Debug, Clone, Copy)]
#[cfg_attr(feature = "stubs", gen_stub_pyclass)]
-#[cfg_attr(feature = "python", pyo3::pyclass(module = "qcs_sdk.qpu.experimental.random", frozen))]
+#[cfg_attr(
+ feature = "python",
+ pyo3::pyclass(
+ module = "qcs_sdk._qcs_sdk.qpu.experimental.random",
+ frozen,
+ from_py_object
+ )
+)]
pub struct PrngSeedValue {
u64_value: u64,
f64_value: f64,
@@ -291,7 +308,7 @@ fn lfsr_next(seed: u64, taps: &[u32]) -> u64 {
#[must_use]
#[cfg_attr(
feature = "stubs",
- gen_stub_pyfunction(module = "qcs_sdk.qpu.experimental.random")
+ gen_stub_pyfunction(module = "qcs_sdk._qcs_sdk.qpu.experimental.random")
)]
#[cfg_attr(feature = "python", pyo3::pyfunction)]
pub fn lfsr_v1_next(seed: PrngSeedValue) -> u64 {
@@ -353,7 +370,7 @@ fn prng_value_to_sub_region_index(value: u64, sub_region_count: u8) -> u8 {
#[must_use]
#[cfg_attr(
feature = "stubs",
- gen_stub_pyfunction(module = "qcs_sdk.qpu.experimental.random")
+ gen_stub_pyfunction(module = "qcs_sdk._qcs_sdk.qpu.experimental.random")
)]
#[cfg_attr(feature = "python", pyo3::pyfunction)]
pub fn choose_random_real_sub_region_indices(
diff --git a/crates/lib/src/qpu/isa/python.rs b/crates/lib/src/qpu/isa/python.rs
index 9f6d4b51f..d53733669 100644
--- a/crates/lib/src/qpu/isa/python.rs
+++ b/crates/lib/src/qpu/isa/python.rs
@@ -60,7 +60,13 @@ impl_repr!(Parameter);
/// the best native QUIL program for a desired task, and so are provided as part of the native ISA.
#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
#[cfg_attr(feature = "stubs", gen_stub_pyclass)]
-#[pyclass(module = "qcs_sdk.qpu.isa", eq, get_all, set_all)]
+#[pyclass(
+ module = "qcs_sdk._qcs_sdk.qpu.isa",
+ eq,
+ get_all,
+ set_all,
+ from_py_object
+)]
pub(crate) struct InstructionSetArchitecture {
architecture: Architecture,
/// The list of benchmarks that have characterized the quantum processor.
@@ -99,7 +105,13 @@ pub(crate) struct InstructionSetArchitecture {
/// that any 1Q or 2Q operation will be available to users writing QUIL programs.
#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
#[cfg_attr(feature = "stubs", gen_stub_pyclass)]
-#[pyclass(module = "qcs_sdk.qpu.isa", eq, get_all, set_all)]
+#[pyclass(
+ module = "qcs_sdk._qcs_sdk.qpu.isa",
+ eq,
+ get_all,
+ set_all,
+ from_py_object
+)]
struct Architecture {
/// A list of all computational edges in the instruction set architecture.
pub edges: Vec,
@@ -125,7 +137,12 @@ struct Architecture {
#[cfg_attr(feature = "stubs", gen_stub_pyclass_enum)]
#[cfg_attr(
feature = "python",
- pyo3::pyclass(module = "qcs_sdk.qpu.isa", eq, rename_all = "SCREAMING_SNAKE_CASE")
+ pyo3::pyclass(
+ module = "qcs_sdk._qcs_sdk.qpu.isa",
+ eq,
+ rename_all = "SCREAMING_SNAKE_CASE",
+ from_py_object
+ )
)]
enum Family {
#[default]
@@ -207,7 +224,13 @@ impl From for models::Family {
/// :math:`(b, a)`.
#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
#[cfg_attr(feature = "stubs", gen_stub_pyclass)]
-#[pyclass(module = "qcs_sdk.qpu.isa", eq, get_all, set_all)]
+#[pyclass(
+ module = "qcs_sdk._qcs_sdk.qpu.isa",
+ eq,
+ get_all,
+ set_all,
+ from_py_object
+)]
struct Edge {
/// The integer ids of the computational nodes at the two ends of the edge.
/// Order is not important; an architecture edge is treated as undirected.
@@ -221,7 +244,13 @@ struct Edge {
/// specific `node_id` in instances of ``Instruction``.
#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
#[cfg_attr(feature = "stubs", gen_stub_pyclass)]
-#[pyclass(module = "qcs_sdk.qpu.isa", eq, get_all, set_all)]
+#[pyclass(
+ module = "qcs_sdk._qcs_sdk.qpu.isa",
+ eq,
+ get_all,
+ set_all,
+ from_py_object
+)]
struct Node {
/// An integer id assigned to the computational node.
///
@@ -232,7 +261,13 @@ struct Node {
/// A measured characteristic of an operation.
#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
#[cfg_attr(feature = "stubs", gen_stub_pyclass)]
-#[pyclass(module = "qcs_sdk.qpu.isa", eq, get_all, set_all)]
+#[pyclass(
+ module = "qcs_sdk._qcs_sdk.qpu.isa",
+ eq,
+ get_all,
+ set_all,
+ from_py_object
+)]
struct Characteristic {
/// The error in the characteristic value, or None otherwise.
#[serde(skip_serializing_if = "Option::is_none")]
@@ -254,7 +289,13 @@ struct Characteristic {
/// A parameter to an operation.
#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
#[cfg_attr(feature = "stubs", gen_stub_pyclass)]
-#[pyclass(module = "qcs_sdk.qpu.isa", eq, get_all, set_all)]
+#[pyclass(
+ module = "qcs_sdk._qcs_sdk.qpu.isa",
+ eq,
+ get_all,
+ set_all,
+ from_py_object
+)]
struct Parameter {
/// The name of the parameter, such as the name of a mathematical symbol.
pub name: String,
@@ -263,7 +304,13 @@ struct Parameter {
/// A site for an operation, with its site-dependent characteristics.
#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
#[cfg_attr(feature = "stubs", gen_stub_pyclass)]
-#[pyclass(module = "qcs_sdk.qpu.isa", eq, get_all, set_all)]
+#[pyclass(
+ module = "qcs_sdk._qcs_sdk.qpu.isa",
+ eq,
+ get_all,
+ set_all,
+ from_py_object
+)]
struct OperationSite {
/// The list of site-dependent characteristics of this operation.
pub characteristics: Vec,
@@ -276,7 +323,13 @@ struct OperationSite {
/// An operation, with its sites and site-independent characteristics.
#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
#[cfg_attr(feature = "stubs", gen_stub_pyclass)]
-#[pyclass(module = "qcs_sdk.qpu.isa", eq, get_all, set_all)]
+#[pyclass(
+ module = "qcs_sdk._qcs_sdk.qpu.isa",
+ eq,
+ get_all,
+ set_all,
+ from_py_object
+)]
struct Operation {
/// The list of site-independent characteristics of this operation.
pub characteristics: Vec,
@@ -620,7 +673,7 @@ py_function_sync_async! {
///
/// :raises LoadClientError: If ``client`` was not provided to the function, and failed to load internally.
/// :raises GetISAError: If there was an issue fetching the ISA from the QCS API.
- #[cfg_attr(feature = "stubs", gen_stub_pyfunction(module = "qcs_sdk.qpu.isa"))]
+ #[cfg_attr(feature = "stubs", gen_stub_pyfunction(module = "qcs_sdk._qcs_sdk.qpu.isa"))]
#[pyfunction]
#[pyo3(signature = (quantum_processor_id, client = None))]
async fn get_instruction_set_architecture(
@@ -643,7 +696,7 @@ py_function_sync_async! {
///
/// :raises LoadClientError: If ``client`` was not provided to the function, and failed to load internally.
/// :raises ListISAsError: If there was an issue fetching the ISAs from the QCS API.
- #[cfg_attr(feature = "stubs", gen_stub_pyfunction(module = "qcs_sdk.qpu.isa"))]
+ #[cfg_attr(feature = "stubs", gen_stub_pyfunction(module = "qcs_sdk._qcs_sdk.qpu.isa"))]
#[pyfunction]
#[pyo3(signature = (client = None))]
async fn list_instruction_set_architectures(client: Option) -> PyResult> {
diff --git a/crates/lib/src/qpu/python.rs b/crates/lib/src/qpu/python.rs
index 7cf5f0d2e..6ba6c10e0 100644
--- a/crates/lib/src/qpu/python.rs
+++ b/crates/lib/src/qpu/python.rs
@@ -130,7 +130,7 @@ py_function_sync_async! {
/// :param timeout: Maximum duration to wait for API calls to complete, in seconds.
///
/// :raises ListQuantumProcessorsError: If the request to list available QPU IDs failed.
- #[cfg_attr(feature = "stubs", gen_stub_pyfunction(module = "qcs_sdk.qpu"))]
+ #[cfg_attr(feature = "stubs", gen_stub_pyfunction(module = "qcs_sdk._qcs_sdk.qpu"))]
#[pyfunction]
#[pyo3(signature = (client = None, timeout = None))]
async fn list_quantum_processors(
diff --git a/crates/lib/src/qpu/result_data.rs b/crates/lib/src/qpu/result_data.rs
index 44ae260a0..bb231029d 100644
--- a/crates/lib/src/qpu/result_data.rs
+++ b/crates/lib/src/qpu/result_data.rs
@@ -21,7 +21,10 @@ use qcs_api_client_grpc::models::controller::{
#[expect(clippy::unsafe_derive_deserialize)]
#[derive(Debug, Clone, EnumAsInner, PartialEq, Deserialize, Serialize)]
#[cfg_attr(feature = "stubs", gen_stub_pyclass_complex_enum)]
-#[cfg_attr(feature = "python", pyo3::pyclass(module = "qcs_sdk.qpu"))]
+#[cfg_attr(
+ feature = "python",
+ pyo3::pyclass(module = "qcs_sdk._qcs_sdk.qpu", from_py_object)
+)]
pub enum ReadoutValues {
/// Integer readout values
Integer(Vec),
@@ -37,7 +40,10 @@ pub enum ReadoutValues {
#[expect(clippy::unsafe_derive_deserialize)]
#[derive(Debug, Clone, EnumAsInner, PartialEq, Deserialize, Serialize)]
#[cfg_attr(feature = "stubs", gen_stub_pyclass_complex_enum)]
-#[cfg_attr(feature = "python", pyo3::pyclass(module = "qcs_sdk.qpu", eq))]
+#[cfg_attr(
+ feature = "python",
+ pyo3::pyclass(module = "qcs_sdk._qcs_sdk.qpu", eq, from_py_object)
+)]
pub enum MemoryValues {
/// Values that correspond to a memory region declared with the BIT or OCTET data type.
Binary(Vec),
@@ -61,7 +67,12 @@ pub enum MemoryValues {
#[cfg_attr(feature = "stubs", gen_stub_pyclass)]
#[cfg_attr(
feature = "python",
- pyo3::pyclass(module = "qcs_sdk.qpu", name = "QPUResultData", get_all)
+ pyo3::pyclass(
+ module = "qcs_sdk._qcs_sdk.qpu",
+ name = "QPUResultData",
+ get_all,
+ from_py_object
+ )
)]
pub struct QpuResultData {
/// Mappings of a memory region (ie. "ro[0]") to its key name in `readout_values` (ie. "q0").
diff --git a/crates/lib/src/qpu/translation/mod.rs b/crates/lib/src/qpu/translation/mod.rs
index 7b4c99920..6b5ac2d26 100644
--- a/crates/lib/src/qpu/translation/mod.rs
+++ b/crates/lib/src/qpu/translation/mod.rs
@@ -142,7 +142,10 @@ pub enum TranslationBackendMismatch {
#[allow(clippy::module_name_repetitions)]
#[derive(Clone, Debug, Default)]
#[cfg_attr(feature = "stubs", gen_stub_pyclass)]
-#[cfg_attr(feature = "python", pyo3::pyclass(module = "qcs_sdk.qpu.translation"))]
+#[cfg_attr(
+ feature = "python",
+ pyo3::pyclass(module = "qcs_sdk._qcs_sdk.qpu.translation", from_py_object)
+)]
pub struct TranslationOptions {
inner: ApiTranslationOptions,
}
diff --git a/crates/lib/src/qpu/translation/python.rs b/crates/lib/src/qpu/translation/python.rs
index 5a7c37f59..68fe450af 100644
--- a/crates/lib/src/qpu/translation/python.rs
+++ b/crates/lib/src/qpu/translation/python.rs
@@ -55,7 +55,7 @@ py_function_sync_async! {
///
/// :raises `LoadClientError`: If there is an issue loading the QCS Client configuration.
/// :raises `TranslationError`: If there was a problem fetching Quil-T calibrations.
- #[cfg_attr(feature = "stubs", gen_stub_pyfunction(module = "qcs_sdk.qpu.translation"))]
+ #[cfg_attr(feature = "stubs", gen_stub_pyfunction(module = "qcs_sdk._qcs_sdk.qpu.translation"))]
#[pyfunction]
#[pyo3(signature = (quantum_processor_id, client = None, timeout = None))]
#[pyo3_opentelemetry::pypropagate(on_context_extraction_failure="ignore")]
@@ -88,10 +88,11 @@ pub enum TranslationError {
#[derive(Copy, Clone, Debug, PartialEq)]
#[cfg_attr(feature = "stubs", gen_stub_pyclass_enum)]
#[pyclass(
- module = "qcs_sdk.qpu.translation",
+ module = "qcs_sdk._qcs_sdk.qpu.translation",
name = "TranslationBackend",
rename_all = "SCREAMING_SNAKE_CASE",
- eq
+ eq,
+ from_py_object
)]
pub enum PyTranslationBackend {
/// The first-generation translation backend available on QCS since 2018.
@@ -219,7 +220,12 @@ impl TranslationOptions {
/// Options here are specially authorized and are not generally available to the client.
#[derive(Clone, Copy, Default, Debug)]
#[cfg_attr(feature = "stubs", gen_stub_pyclass)]
-#[pyclass(name = "QCtrl", module = "qcs_sdk.qpu.translation", frozen)]
+#[pyclass(
+ name = "QCtrl",
+ module = "qcs_sdk._qcs_sdk.qpu.translation",
+ frozen,
+ from_py_object
+)]
pub struct PyQCtrl(translation_options::QCtrl);
#[cfg_attr(feature = "stubs", gen_stub_pymethods)]
@@ -243,7 +249,12 @@ impl PyQCtrl {
/// Options here are specially authorized and are not generally available to the client.
#[derive(Clone, Default, Debug)]
#[cfg_attr(feature = "stubs", gen_stub_pyclass)]
-#[pyclass(name = "Riverlane", module = "qcs_sdk.qpu.translation", frozen)]
+#[pyclass(
+ name = "Riverlane",
+ module = "qcs_sdk._qcs_sdk.qpu.translation",
+ frozen,
+ from_py_object
+)]
pub struct PyRiverlane(Riverlane);
#[cfg_attr(feature = "stubs", gen_stub_pymethods)]
@@ -266,7 +277,7 @@ impl PyRiverlane {
#[derive(Debug)]
#[cfg_attr(feature = "stubs", gen_stub_pyclass)]
#[pyclass(
- module = "qcs_sdk.qpu.translation",
+ module = "qcs_sdk._qcs_sdk.qpu.translation",
name = "TranslationResult",
get_all,
frozen
@@ -290,7 +301,7 @@ py_function_sync_async! {
///
/// :raises `LoadClientError`: If there is an issue loading the QCS Client configuration.
/// :raises `TranslationError`: If the `native_quil` program could not be translated.
- #[cfg_attr(feature = "stubs", gen_stub_pyfunction(module = "qcs_sdk.qpu.translation"))]
+ #[cfg_attr(feature = "stubs", gen_stub_pyfunction(module = "qcs_sdk._qcs_sdk.qpu.translation"))]
#[pyfunction]
#[pyo3(signature = (native_quil, num_shots, quantum_processor_id, client = None, translation_options = None))]
#[pyo3_opentelemetry::pypropagate(on_context_extraction_failure="ignore")]
diff --git a/crates/lib/src/qvm/http.rs b/crates/lib/src/qvm/http.rs
index 109280339..1980b1883 100644
--- a/crates/lib/src/qvm/http.rs
+++ b/crates/lib/src/qvm/http.rs
@@ -61,7 +61,10 @@ impl QvmResponse {
#[serde(rename_all = "kebab-case")]
#[cfg_attr(not(feature = "python"), optipy::strip_pyo3)]
#[cfg_attr(feature = "stubs", gen_stub_pyclass)]
-#[cfg_attr(feature = "python", pyo3::pyclass(module = "qcs_sdk.qvm.api"))]
+#[cfg_attr(
+ feature = "python",
+ pyo3::pyclass(module = "qcs_sdk._qcs_sdk.qvm.api", from_py_object)
+)]
pub struct MultishotRequest {
/// The Quil program to run.
#[pyo3(get, set)]
@@ -92,7 +95,10 @@ pub struct MultishotRequest {
#[derive(Serialize, Debug, Clone, PartialEq, Eq)]
#[serde(untagged)]
#[cfg_attr(feature = "stubs", gen_stub_pyclass_complex_enum)]
-#[cfg_attr(feature = "python", pyo3::pyclass(module = "qcs_sdk.qvm.api", eq))]
+#[cfg_attr(
+ feature = "python",
+ pyo3::pyclass(module = "qcs_sdk._qcs_sdk.qvm.api", eq, from_py_object)
+)]
pub enum AddressRequest {
/// Get all values for the address.
#[serde(serialize_with = "serialize_true")]
@@ -144,7 +150,10 @@ impl MultishotRequest {
/// The response body returned by the QVM after a multishot [`run`] request.
#[derive(Debug, Deserialize, Clone, PartialEq)]
#[cfg_attr(feature = "stubs", gen_stub_pyclass)]
-#[cfg_attr(feature = "python", pyo3::pyclass(module = "qcs_sdk.qvm.api", get_all))]
+#[cfg_attr(
+ feature = "python",
+ pyo3::pyclass(module = "qcs_sdk._qcs_sdk.qvm.api", get_all, from_py_object)
+)]
pub struct MultishotResponse {
/// The requested readout registers and their final values for each shot.
#[serde(flatten)]
@@ -156,7 +165,10 @@ pub struct MultishotResponse {
#[serde(rename_all = "kebab-case")]
#[cfg_attr(not(feature = "python"), optipy::strip_pyo3)]
#[cfg_attr(feature = "stubs", gen_stub_pyclass)]
-#[cfg_attr(feature = "python", pyo3::pyclass(module = "qcs_sdk.qvm.api"))]
+#[cfg_attr(
+ feature = "python",
+ pyo3::pyclass(module = "qcs_sdk._qcs_sdk.qvm.api", from_py_object)
+)]
pub struct MultishotMeasureRequest {
/// The Quil program to run.
#[pyo3(get)]
@@ -211,7 +223,10 @@ impl MultishotMeasureRequest {
#[serde(rename_all = "kebab-case")]
#[cfg_attr(not(feature = "python"), optipy::strip_pyo3)]
#[cfg_attr(feature = "stubs", gen_stub_pyclass)]
-#[cfg_attr(feature = "python", pyo3::pyclass(module = "qcs_sdk.qvm.api"))]
+#[cfg_attr(
+ feature = "python",
+ pyo3::pyclass(module = "qcs_sdk._qcs_sdk.qvm.api", from_py_object)
+)]
pub struct ExpectationRequest {
/// A Quil program defining the state.
#[pyo3(get)]
@@ -245,7 +260,10 @@ impl ExpectationRequest {
#[serde(rename_all = "kebab-case")]
#[cfg_attr(not(feature = "python"), optipy::strip_pyo3)]
#[cfg_attr(feature = "stubs", gen_stub_pyclass)]
-#[cfg_attr(feature = "python", pyo3::pyclass(module = "qcs_sdk.qvm.api"))]
+#[cfg_attr(
+ feature = "python",
+ pyo3::pyclass(module = "qcs_sdk._qcs_sdk.qvm.api", from_py_object)
+)]
pub struct WavefunctionRequest {
/// The Quil program to run.
#[pyo3(get)]
diff --git a/crates/lib/src/qvm/mod.rs b/crates/lib/src/qvm/mod.rs
index 4b57d7669..4997850f5 100644
--- a/crates/lib/src/qvm/mod.rs
+++ b/crates/lib/src/qvm/mod.rs
@@ -114,7 +114,13 @@ impl Client for Arc {
#[cfg_attr(feature = "stubs", gen_stub_pyclass)]
#[cfg_attr(
feature = "python",
- pyo3::pyclass(module = "qcs_sdk.qvm", name = "QVMResultData", get_all, frozen)
+ pyo3::pyclass(
+ module = "qcs_sdk._qcs_sdk.qvm",
+ name = "QVMResultData",
+ get_all,
+ frozen,
+ from_py_object
+ )
)]
pub struct QvmResultData {
/// A map of register names (ie. "ro") to a `RegisterData` containing their values.
@@ -257,7 +263,7 @@ pub fn apply_parameters_to_program(
#[cfg_attr(feature = "stubs", gen_stub_pyclass)]
#[cfg_attr(
feature = "python",
- pyo3::pyclass(module = "qcs_sdk.qvm", name = "QVMOptions")
+ pyo3::pyclass(module = "qcs_sdk._qcs_sdk.qvm", name = "QVMOptions", from_py_object)
)]
pub struct QvmOptions {
/// The timeout to use for requests to the QVM. If set to [`None`], there is no timeout.
diff --git a/crates/lib/src/qvm/python.rs b/crates/lib/src/qvm/python.rs
index c4d0d0bea..45bb81822 100644
--- a/crates/lib/src/qvm/python.rs
+++ b/crates/lib/src/qvm/python.rs
@@ -58,7 +58,7 @@ pub enum QvmClient {
/// Client used to communicate with QVM.
#[derive(Clone, Debug)]
#[cfg_attr(feature = "stubs", gen_stub_pyclass)]
-#[pyclass(name = "QVMClient", module = "qcs_sdk.qvm")]
+#[pyclass(name = "QVMClient", module = "qcs_sdk._qcs_sdk.qvm", from_py_object)]
pub struct PyQvmClient {
inner: QvmClient,
}
@@ -66,7 +66,12 @@ pub struct PyQvmClient {
/// Encapsulates raw data returned from the QVM after executing a program.
#[derive(Debug)]
#[cfg_attr(feature = "stubs", gen_stub_pyclass)]
-#[pyo3::pyclass(name = "RawQVMReadoutData", module = "qcs_sdk.qvm", frozen, get_all)]
+#[pyo3::pyclass(
+ name = "RawQVMReadoutData",
+ module = "qcs_sdk._qcs_sdk.qvm",
+ frozen,
+ get_all
+)]
pub struct RawQvmReadoutData {
/// The mapping of register names (ie. "ro") to a 2-d list containing the
/// values for that register.
@@ -386,7 +391,7 @@ impl WavefunctionRequest {
}
py_function_sync_async! {
- #[cfg_attr(feature = "stubs", gen_stub_pyfunction(module = "qcs_sdk.qvm"))]
+ #[cfg_attr(feature = "stubs", gen_stub_pyfunction(module = "qcs_sdk._qcs_sdk.qvm"))]
#[pyfunction(signature = (
quil, shots, addresses, params, client,
measurement_noise=None, gate_noise=None, rng_seed=None, options=None
@@ -479,7 +484,7 @@ mod api {
}
py_function_sync_async! {
- #[cfg_attr(feature = "stubs", gen_stub_pyfunction(module = "qcs_sdk.qvm.api"))]
+ #[cfg_attr(feature = "stubs", gen_stub_pyfunction(module = "qcs_sdk._qcs_sdk.qvm.api"))]
#[pyfunction]
#[pyo3(signature = (client, options = None))]
async fn get_version_info(client: PyQvmClient, options: Option) -> PyResult {
@@ -491,7 +496,7 @@ mod api {
}
py_function_sync_async! {
- #[cfg_attr(feature = "stubs", gen_stub_pyfunction(module = "qcs_sdk.qvm.api"))]
+ #[cfg_attr(feature = "stubs", gen_stub_pyfunction(module = "qcs_sdk._qcs_sdk.qvm.api"))]
#[pyfunction]
#[pyo3(signature = (request, client, options = None))]
#[tracing::instrument(skip_all)]
@@ -509,7 +514,7 @@ mod api {
}
py_function_sync_async! {
- #[cfg_attr(feature = "stubs", gen_stub_pyfunction(module = "qcs_sdk.qvm.api"))]
+ #[cfg_attr(feature = "stubs", gen_stub_pyfunction(module = "qcs_sdk._qcs_sdk.qvm.api"))]
#[pyfunction]
#[pyo3(signature = (request, client, options = None))]
#[tracing::instrument(skip_all)]
@@ -526,7 +531,7 @@ mod api {
}
py_function_sync_async! {
- #[cfg_attr(feature = "stubs", gen_stub_pyfunction(module = "qcs_sdk.qvm.api"))]
+ #[cfg_attr(feature = "stubs", gen_stub_pyfunction(module = "qcs_sdk._qcs_sdk.qvm.api"))]
#[pyfunction]
#[pyo3(signature = (request, client, options = None))]
#[tracing::instrument(skip_all)]
@@ -543,7 +548,7 @@ mod api {
}
py_function_sync_async! {
- #[cfg_attr(feature = "stubs", gen_stub_pyfunction(module = "qcs_sdk.qvm.api"))]
+ #[cfg_attr(feature = "stubs", gen_stub_pyfunction(module = "qcs_sdk._qcs_sdk.qvm.api"))]
#[pyfunction]
#[pyo3(signature = (request, client, options = None))]
#[tracing::instrument(skip_all)]
diff --git a/crates/lib/src/register_data.rs b/crates/lib/src/register_data.rs
index d28b9431f..b2a4653e7 100644
--- a/crates/lib/src/register_data.rs
+++ b/crates/lib/src/register_data.rs
@@ -31,7 +31,7 @@ use pyo3_stub_gen::derive::gen_stub_pyclass_complex_enum;
#[cfg_attr(feature = "stubs", gen_stub_pyclass_complex_enum)]
#[cfg_attr(
feature = "python",
- pyo3::pyclass(module = "qcs_sdk", eq, frozen, get_all)
+ pyo3::pyclass(module = "qcs_sdk._qcs_sdk", eq, frozen, get_all, from_py_object)
)]
pub enum RegisterData {
/// Corresponds to the Quil `BIT` or `OCTET` types.
diff --git a/crates/lib/tests_py/compiler/test_quilc.py b/crates/lib/tests_py/compiler/test_quilc.py
index 181d97596..f522f6ade 100644
--- a/crates/lib/tests_py/compiler/test_quilc.py
+++ b/crates/lib/tests_py/compiler/test_quilc.py
@@ -43,9 +43,7 @@ def test_target_device_error(aspen_m_3_isa: InstructionSetArchitecture):
"""TargetDevice cannot be built when ISA lacks ``randomized_benchmark_simultaneous_1q`` benchmark."""
isa = InstructionSetArchitecture.from_raw(aspen_m_3_isa.json())
isa.benchmarks = [
- benchmark
- for benchmark in isa.benchmarks
- if benchmark.name != "randomized_benchmark_simultaneous_1q"
+ benchmark for benchmark in isa.benchmarks if benchmark.name != "randomized_benchmark_simultaneous_1q"
]
with pytest.raises(QuilcError):
TargetDevice.from_isa(isa)
@@ -58,7 +56,9 @@ def test_compile_program(
quilc_rpcq_client: QuilcClient,
):
"""A simple program should compile successfully."""
- result = compile_program(bell_program, target_device, client=quilc_rpcq_client, options=CompilerOpts(protoquil=True))
+ result = compile_program(
+ bell_program, target_device, client=quilc_rpcq_client, options=CompilerOpts(protoquil=True)
+ )
assert result.program.to_quil() == snapshot
assert result.native_quil_metadata == snapshot
@@ -89,9 +89,7 @@ async def test_get_version_info_async(quilc_rpcq_client: QuilcClient):
def test_conjugate_pauli_by_clifford(quilc_rpcq_client: QuilcClient):
"""Pauli should be conjugated by clifford."""
- request = ConjugateByCliffordRequest(
- pauli=PauliTerm(indices=[0], symbols=["X"]), clifford="H 0"
- )
+ request = ConjugateByCliffordRequest(pauli=PauliTerm(indices=[0], symbols=["X"]), clifford="H 0")
response = conjugate_pauli_by_clifford(request, client=quilc_rpcq_client)
assert type(response) == ConjugatePauliByCliffordResponse
assert response.pauli == "Z"
@@ -101,9 +99,7 @@ def test_conjugate_pauli_by_clifford(quilc_rpcq_client: QuilcClient):
@pytest.mark.asyncio
async def test_conjugate_pauli_by_clifford_async(quilc_rpcq_client: QuilcClient):
"""Pauli should be conjugated by clifford."""
- request = ConjugateByCliffordRequest(
- pauli=PauliTerm(indices=[0], symbols=["X"]), clifford="H 0"
- )
+ request = ConjugateByCliffordRequest(pauli=PauliTerm(indices=[0], symbols=["X"]), clifford="H 0")
response = await conjugate_pauli_by_clifford_async(request, client=quilc_rpcq_client)
assert type(response) == ConjugatePauliByCliffordResponse
assert response.pauli == "Z"
diff --git a/crates/lib/tests_py/conftest.py b/crates/lib/tests_py/conftest.py
index 37c0c86ff..759612329 100644
--- a/crates/lib/tests_py/conftest.py
+++ b/crates/lib/tests_py/conftest.py
@@ -10,10 +10,7 @@
from qcs_sdk.client import QCSClient
from qcs_sdk.qpu.api import APIExecutionOptions, ExecutionOptions
-from qcs_sdk.qpu.isa import (
- list_instruction_set_architectures_async,
- InstructionSetArchitecture
-)
+from qcs_sdk.qpu.isa import list_instruction_set_architectures_async, InstructionSetArchitecture
from qcs_sdk.qvm import QVMClient
from qcs_sdk.compiler.quilc import QuilcClient
@@ -23,8 +20,15 @@
def pytest_addoption(parser: Parser):
- parser.addoption("--with-qcs-session", action="store_true", default=False, help="Run tests that require proper user config authentication.")
- parser.addoption("--with-qcs-execution", action="store_true", default=False, help="Run tests that require qpu execution.")
+ parser.addoption(
+ "--with-qcs-session",
+ action="store_true",
+ default=False,
+ help="Run tests that require proper user config authentication.",
+ )
+ parser.addoption(
+ "--with-qcs-execution", action="store_true", default=False, help="Run tests that require qpu execution."
+ )
def pytest_configure(config: Config):
@@ -68,6 +72,7 @@ def _read_fixture(relpath: str) -> str:
def available_ids() -> list[str]:
async def _list_isas():
return await list_instruction_set_architectures_async(client=QCSClient())
+
return asyncio.run(_list_isas())
@@ -137,11 +142,6 @@ def api_execution_options(execution_timeout: datetime.timedelta) -> APIExecution
@pytest.fixture
def execution_options(
- execution_timeout: datetime.timedelta,
- api_execution_options: APIExecutionOptions
+ execution_timeout: datetime.timedelta, api_execution_options: APIExecutionOptions
) -> ExecutionOptions:
- return ExecutionOptions(
- timeout=execution_timeout,
- api_options=api_execution_options
- )
-
+ return ExecutionOptions(timeout=execution_timeout, api_options=api_execution_options)
diff --git a/crates/lib/tests_py/execution_data/test_execution_data.py b/crates/lib/tests_py/execution_data/test_execution_data.py
index a468c0a28..6c3f100c2 100644
--- a/crates/lib/tests_py/execution_data/test_execution_data.py
+++ b/crates/lib/tests_py/execution_data/test_execution_data.py
@@ -78,13 +78,16 @@ def test_to_register_map_from_qvm_result_data(self):
[
("integer", np.array([[0, 1, 2], [1, 2, 3]]), RegisterMatrix.Integer),
("real", np.array([[0.0, 1.1, 2.2], [1.1, 2.2, 3.3]]), RegisterMatrix.Real),
- ("complex",
- np.array([[complex(0, 1), complex(1, 2), complex(2, 3)],
- [complex(1, 2), complex(2, 3), complex(3, 4)]]),
- RegisterMatrix.Complex),
- ]
+ (
+ "complex",
+ np.array([[complex(0, 1), complex(1, 2), complex(2, 3)], [complex(1, 2), complex(2, 3), complex(3, 4)]]),
+ RegisterMatrix.Complex,
+ ),
+ ],
)
-def test_register_matrix(name: str, m: np.ndarray, cls: RegisterMatrix.Integer | RegisterMatrix.Real | RegisterMatrix.Complex):
+def test_register_matrix(
+ name: str, m: np.ndarray, cls: RegisterMatrix.Integer | RegisterMatrix.Real | RegisterMatrix.Complex
+):
register_matrix = cls(m)
match (name, register_matrix):
case ("integer", RegisterMatrix.Integer(register_matrix)):
@@ -99,6 +102,7 @@ def test_register_matrix(name: str, m: np.ndarray, cls: RegisterMatrix.Integer |
assert register_matrix is not None, f"register_matrix should be an {name} matrix"
assert_array_equal(register_matrix, m)
+
class TestRegisterMap:
def test_iter(self):
memory_map = {
diff --git a/crates/lib/tests_py/qpu/test_api.py b/crates/lib/tests_py/qpu/test_api.py
index f2d4d79ac..f195aebe9 100644
--- a/crates/lib/tests_py/qpu/test_api.py
+++ b/crates/lib/tests_py/qpu/test_api.py
@@ -18,7 +18,7 @@ def test_submit_retrieve(quantum_processor_id: str, execution_options: Execution
"""
program = "DECLARE theta REAL; RZ(theta) 0"
- memory = { "theta": [0.5] }
+ memory = {"theta": [0.5]}
translated = translate(program, 1, quantum_processor_id)
@@ -30,8 +30,17 @@ def test_submit_retrieve(quantum_processor_id: str, execution_options: Execution
)
assert results is not None
-class TestPickle():
- @pytest.mark.parametrize("strategy", [ConnectionStrategy.Gateway(), ConnectionStrategy.DirectAccess(), ConnectionStrategy.EndpointId("endpoint_id"), ConnectionStrategy.EndpointAddress("http://localhost:8080")])
+
+class TestPickle:
+ @pytest.mark.parametrize(
+ "strategy",
+ [
+ ConnectionStrategy.Gateway(),
+ ConnectionStrategy.DirectAccess(),
+ ConnectionStrategy.EndpointId("endpoint_id"),
+ ConnectionStrategy.EndpointAddress("http://localhost:8080"),
+ ],
+ )
def test_connection_strategy(self, strategy: ConnectionStrategy):
pickled = pickle.dumps(strategy)
unpickled = pickle.loads(pickled)
diff --git a/crates/lib/tests_py/qpu/test_isa.py b/crates/lib/tests_py/qpu/test_isa.py
index 5b843e346..8f0971b90 100644
--- a/crates/lib/tests_py/qpu/test_isa.py
+++ b/crates/lib/tests_py/qpu/test_isa.py
@@ -9,6 +9,7 @@
get_instruction_set_architecture_async,
)
+
@pytest.mark.qcs_session
def test_get_instruction_set_architecture(quantum_processor_id: str):
"""Successfully get a known public ISA."""
@@ -23,6 +24,7 @@ async def test_get_instruction_set_architecture_async(quantum_processor_id: str)
isa = await get_instruction_set_architecture_async(quantum_processor_id)
assert type(isa) is InstructionSetArchitecture
+
@pytest.mark.qcs_session
def test_get_instruction_set_architecture_error():
with pytest.raises(GetISAError):
@@ -45,4 +47,3 @@ async def test_get_instruction_set_architecture_public_async(quantum_processor_i
"""Successfully get a known public ISA without authentication."""
isa = await get_instruction_set_architecture_async(quantum_processor_id, client=QCSClient())
assert type(isa) is InstructionSetArchitecture
-
diff --git a/crates/lib/tests_py/qpu/test_qpu.py b/crates/lib/tests_py/qpu/test_qpu.py
index d121de6a5..9d9067bc1 100644
--- a/crates/lib/tests_py/qpu/test_qpu.py
+++ b/crates/lib/tests_py/qpu/test_qpu.py
@@ -27,7 +27,11 @@ def test_readout_values():
def test_qpu_result_data():
mappings = {"a": "_q0"}
readout_values = {"a": ReadoutValues.Integer([0, 1])}
- memory_values = { "int": MemoryValues.Integer([2, 3]), "real": MemoryValues.Real([3.0, 4.0]), "binary": MemoryValues.Binary([0, 1]) }
+ memory_values = {
+ "int": MemoryValues.Integer([2, 3]),
+ "real": MemoryValues.Real([3.0, 4.0]),
+ "binary": MemoryValues.Binary([0, 1]),
+ }
result_data = QPUResultData(mappings, readout_values, memory_values)
assert result_data.mappings == mappings
diff --git a/crates/lib/tests_py/test_client.py b/crates/lib/tests_py/test_client.py
index bf7091555..342a46f74 100644
--- a/crates/lib/tests_py/test_client.py
+++ b/crates/lib/tests_py/test_client.py
@@ -47,9 +47,7 @@ def test_client_default_profile_is_not_empty(default_client: QCSClient):
@pytest.mark.not_qcs_session
def test_client_broken_raises():
"""Using a profile with broken configuration should surface the underlying error."""
- with pytest.raises(
- LoadClientError, match=r"Expected auth server .* but it does not exist"
- ):
+ with pytest.raises(LoadClientError, match=r"Expected auth server .* but it does not exist"):
QCSClient.load(profile_name="broken")
diff --git a/crates/lib/tests_py/test_diagnostics.py b/crates/lib/tests_py/test_diagnostics.py
index 2c4c828ba..b710d5121 100644
--- a/crates/lib/tests_py/test_diagnostics.py
+++ b/crates/lib/tests_py/test_diagnostics.py
@@ -4,6 +4,7 @@
from qcs_sdk import diagnostics
+
@pytest.mark.qcs_session
def test_get_report():
"""The async and sync reports are the same, and are generated without panicing."""
diff --git a/crates/lib/tests_py/test_executable.py b/crates/lib/tests_py/test_executable.py
index 3644ae233..7ce593889 100644
--- a/crates/lib/tests_py/test_executable.py
+++ b/crates/lib/tests_py/test_executable.py
@@ -5,6 +5,7 @@
from qcs_sdk.qpu import QPUResultData
from qcs_sdk.qvm import QVMClient, QVMResultData
+
@pytest.mark.qcs_session
@pytest.mark.qcs_execution
def test_execute_qpu(
@@ -21,7 +22,7 @@ def test_execute_qpu(
shots = results.readout_values[key].inner()
shot_value = shots[0]
- assert shot_value in [ 0, 1 ]
+ assert shot_value in [0, 1]
@pytest.mark.asyncio
@@ -41,7 +42,7 @@ async def test_execute_qpu_async(
shots = results.readout_values[key].inner()
shot_value = shots[0]
- assert shot_value in [ 0, 1 ]
+ assert shot_value in [0, 1]
@pytest.mark.qcs_session
@@ -65,7 +66,7 @@ def test_submit_and_retrieve_qpu(
shots = results.readout_values[key].inner()
shot_value = shots[0]
- assert shot_value in [ 0, 1 ]
+ assert shot_value in [0, 1]
@pytest.mark.asyncio
@@ -90,7 +91,7 @@ async def test_submit_and_retrieve_qpu_async(
shots = results.readout_values[key].inner()
shot_value = shots[0]
- assert shot_value in [ 0, 1 ]
+ assert shot_value in [0, 1]
def test_execute_qvm(
@@ -105,7 +106,7 @@ def test_execute_qvm(
shot = vals.inner()[0]
shot_value = shot[0]
- assert shot_value in [ 0, 1 ]
+ assert shot_value in [0, 1]
@pytest.mark.asyncio
@@ -121,4 +122,4 @@ async def test_execute_qvm_async(
shot = vals.inner()[0]
shot_value = shot[0]
- assert shot_value in [ 0, 1 ]
+ assert shot_value in [0, 1]
diff --git a/crates/lib/tests_py/test_logging.py b/crates/lib/tests_py/test_logging.py
index f657a80bc..bea2f3f21 100644
--- a/crates/lib/tests_py/test_logging.py
+++ b/crates/lib/tests_py/test_logging.py
@@ -1,8 +1,8 @@
from qcs_sdk import reset_logging
+
def test_reset_logging():
"""
Assert that resetting logging configuration does not panic.
"""
reset_logging()
-
diff --git a/crates/lib/tests_py/test_tracing_subscriber.py b/crates/lib/tests_py/test_tracing_subscriber.py
index 151ba7832..03627225d 100644
--- a/crates/lib/tests_py/test_tracing_subscriber.py
+++ b/crates/lib/tests_py/test_tracing_subscriber.py
@@ -16,6 +16,7 @@
If the environment variable `QCS_SDK_TESTS_KEEP_RUST_TRACES` is set to `1`,
the traces will not be deleted after the test completes.
"""
+
from collections import Counter
from dataclasses import dataclass
from datetime import datetime, timedelta, timezone
@@ -145,12 +146,7 @@ def test_qvm_tracing_sync(
python_spans = []
multishot_request = MultishotRequest(
- program=native_bitflip_program,
- shots=10,
- addresses={},
- measurement_noise=None,
- gate_noise=None,
- rng_seed=None
+ program=native_bitflip_program, shots=10, addresses={}, measurement_noise=None, gate_noise=None, rng_seed=None
)
with tracer.start_as_current_span("test_qvm_tracing") as span:
python_spans.append(span)
@@ -188,12 +184,7 @@ async def test_qvm_tracing_async(
python_spans = []
multishot_request = MultishotRequest(
- program=native_bitflip_program,
- shots=10,
- addresses={},
- measurement_noise=None,
- gate_noise=None,
- rng_seed=None
+ program=native_bitflip_program, shots=10, addresses={}, measurement_noise=None, gate_noise=None, rng_seed=None
)
with tracer.start_as_current_span("test_qvm_tracing_async") as span:
python_spans.append(span)
@@ -278,6 +269,8 @@ def test_translate_submit_retrieve_sync(
parent_span_name=span.name,
)
)
+
+
@pytest.mark.qcs_session
@pytest.mark.asyncio
async def test_translate_submit_retrieve_async(
@@ -380,9 +373,9 @@ def _verify_expected_spans(rust_trace_file: str, expected_spans: list[_ExpectedS
duration = timedelta(microseconds=duration_ns / 1000)
assert duration >= expected.minimum_expected_duration
- assert (
- counter[expected.span_name] == expected.count
- ), f'Expected {expected.count} spans with name {expected.span_name} within parent "{expected.parent_span_name}", but found {counter[expected.span_name]}. Added by {expected.added_by}. See {rust_trace_file} trace {hex(expected.trace_id)}'
+ assert counter[expected.span_name] == expected.count, (
+ f'Expected {expected.count} spans with name {expected.span_name} within parent "{expected.parent_span_name}", but found {counter[expected.span_name]}. Added by {expected.added_by}. See {rust_trace_file} trace {hex(expected.trace_id)}'
+ )
@pytest.fixture(scope="module")
@@ -438,6 +431,7 @@ def tracer() -> Generator[trace.Tracer, None, None]:
finally:
provider.force_flush()
+
@pytest.fixture(scope="module", autouse=True)
def tracing_environment_variables() -> Generator[None, None, None]:
"""
@@ -452,5 +446,3 @@ def tracing_environment_variables() -> Generator[None, None, None]:
},
):
yield
-
-
diff --git a/crates/lib/uv.lock b/crates/lib/uv.lock
new file mode 100644
index 000000000..adf861f03
--- /dev/null
+++ b/crates/lib/uv.lock
@@ -0,0 +1,1135 @@
+version = 1
+revision = 3
+requires-python = ">=3.10, <4"
+
+[[package]]
+name = "anyio"
+version = "4.12.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "exceptiongroup", marker = "python_full_version < '3.11'" },
+ { name = "idna" },
+ { name = "typing-extensions", marker = "python_full_version < '3.13'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/16/ce/8a777047513153587e5434fd752e89334ac33e379aa3497db860eeb60377/anyio-4.12.0.tar.gz", hash = "sha256:73c693b567b0c55130c104d0b43a9baf3aa6a31fc6110116509f27bf75e21ec0", size = 228266, upload-time = "2025-11-28T23:37:38.911Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/7f/9c/36c5c37947ebfb8c7f22e0eb6e4d188ee2d53aa3880f3f2744fb894f0cb1/anyio-4.12.0-py3-none-any.whl", hash = "sha256:dad2376a628f98eeca4881fc56cd06affd18f659b17a747d3ff0307ced94b1bb", size = 113362, upload-time = "2025-11-28T23:36:57.897Z" },
+]
+
+[[package]]
+name = "backports-asyncio-runner"
+version = "1.2.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/8e/ff/70dca7d7cb1cbc0edb2c6cc0c38b65cba36cccc491eca64cabd5fe7f8670/backports_asyncio_runner-1.2.0.tar.gz", hash = "sha256:a5aa7b2b7d8f8bfcaa2b57313f70792df84e32a2a746f585213373f900b42162", size = 69893, upload-time = "2025-07-02T02:27:15.685Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a0/59/76ab57e3fe74484f48a53f8e337171b4a2349e506eabe136d7e01d059086/backports_asyncio_runner-1.2.0-py3-none-any.whl", hash = "sha256:0da0a936a8aeb554eccb426dc55af3ba63bcdc69fa1a600b5bb305413a4477b5", size = 12313, upload-time = "2025-07-02T02:27:14.263Z" },
+]
+
+[[package]]
+name = "black"
+version = "25.11.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "click" },
+ { name = "mypy-extensions" },
+ { name = "packaging" },
+ { name = "pathspec" },
+ { name = "platformdirs" },
+ { name = "pytokens" },
+ { name = "tomli", marker = "python_full_version < '3.11'" },
+ { name = "typing-extensions", marker = "python_full_version < '3.11'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/8c/ad/33adf4708633d047950ff2dfdea2e215d84ac50ef95aff14a614e4b6e9b2/black-25.11.0.tar.gz", hash = "sha256:9a323ac32f5dc75ce7470501b887250be5005a01602e931a15e45593f70f6e08", size = 655669, upload-time = "2025-11-10T01:53:50.558Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b3/d2/6caccbc96f9311e8ec3378c296d4f4809429c43a6cd2394e3c390e86816d/black-25.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ec311e22458eec32a807f029b2646f661e6859c3f61bc6d9ffb67958779f392e", size = 1743501, upload-time = "2025-11-10T01:59:06.202Z" },
+ { url = "https://files.pythonhosted.org/packages/69/35/b986d57828b3f3dccbf922e2864223197ba32e74c5004264b1c62bc9f04d/black-25.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1032639c90208c15711334d681de2e24821af0575573db2810b0763bcd62e0f0", size = 1597308, upload-time = "2025-11-10T01:57:58.633Z" },
+ { url = "https://files.pythonhosted.org/packages/39/8e/8b58ef4b37073f52b64a7b2dd8c9a96c84f45d6f47d878d0aa557e9a2d35/black-25.11.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0c0f7c461df55cf32929b002335883946a4893d759f2df343389c4396f3b6b37", size = 1656194, upload-time = "2025-11-10T01:57:10.909Z" },
+ { url = "https://files.pythonhosted.org/packages/8d/30/9c2267a7955ecc545306534ab88923769a979ac20a27cf618d370091e5dd/black-25.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:f9786c24d8e9bd5f20dc7a7f0cdd742644656987f6ea6947629306f937726c03", size = 1347996, upload-time = "2025-11-10T01:57:22.391Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/62/d304786b75ab0c530b833a89ce7d997924579fb7484ecd9266394903e394/black-25.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:895571922a35434a9d8ca67ef926da6bc9ad464522a5fe0db99b394ef1c0675a", size = 1727891, upload-time = "2025-11-10T02:01:40.507Z" },
+ { url = "https://files.pythonhosted.org/packages/82/5d/ffe8a006aa522c9e3f430e7b93568a7b2163f4b3f16e8feb6d8c3552761a/black-25.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cb4f4b65d717062191bdec8e4a442539a8ea065e6af1c4f4d36f0cdb5f71e170", size = 1581875, upload-time = "2025-11-10T01:57:51.192Z" },
+ { url = "https://files.pythonhosted.org/packages/cb/c8/7c8bda3108d0bb57387ac41b4abb5c08782b26da9f9c4421ef6694dac01a/black-25.11.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d81a44cbc7e4f73a9d6ae449ec2317ad81512d1e7dce7d57f6333fd6259737bc", size = 1642716, upload-time = "2025-11-10T01:56:51.589Z" },
+ { url = "https://files.pythonhosted.org/packages/34/b9/f17dea34eecb7cc2609a89627d480fb6caea7b86190708eaa7eb15ed25e7/black-25.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:7eebd4744dfe92ef1ee349dc532defbf012a88b087bb7ddd688ff59a447b080e", size = 1352904, upload-time = "2025-11-10T01:59:26.252Z" },
+ { url = "https://files.pythonhosted.org/packages/7f/12/5c35e600b515f35ffd737da7febdb2ab66bb8c24d88560d5e3ef3d28c3fd/black-25.11.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:80e7486ad3535636657aa180ad32a7d67d7c273a80e12f1b4bfa0823d54e8fac", size = 1772831, upload-time = "2025-11-10T02:03:47Z" },
+ { url = "https://files.pythonhosted.org/packages/1a/75/b3896bec5a2bb9ed2f989a970ea40e7062f8936f95425879bbe162746fe5/black-25.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6cced12b747c4c76bc09b4db057c319d8545307266f41aaee665540bc0e04e96", size = 1608520, upload-time = "2025-11-10T01:58:46.895Z" },
+ { url = "https://files.pythonhosted.org/packages/f3/b5/2bfc18330eddbcfb5aab8d2d720663cd410f51b2ed01375f5be3751595b0/black-25.11.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6cb2d54a39e0ef021d6c5eef442e10fd71fcb491be6413d083a320ee768329dd", size = 1682719, upload-time = "2025-11-10T01:56:55.24Z" },
+ { url = "https://files.pythonhosted.org/packages/96/fb/f7dc2793a22cdf74a72114b5ed77fe3349a2e09ef34565857a2f917abdf2/black-25.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:ae263af2f496940438e5be1a0c1020e13b09154f3af4df0835ea7f9fe7bfa409", size = 1362684, upload-time = "2025-11-10T01:57:07.639Z" },
+ { url = "https://files.pythonhosted.org/packages/ad/47/3378d6a2ddefe18553d1115e36aea98f4a90de53b6a3017ed861ba1bd3bc/black-25.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0a1d40348b6621cc20d3d7530a5b8d67e9714906dfd7346338249ad9c6cedf2b", size = 1772446, upload-time = "2025-11-10T02:02:16.181Z" },
+ { url = "https://files.pythonhosted.org/packages/ba/4b/0f00bfb3d1f7e05e25bfc7c363f54dc523bb6ba502f98f4ad3acf01ab2e4/black-25.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:51c65d7d60bb25429ea2bf0731c32b2a2442eb4bd3b2afcb47830f0b13e58bfd", size = 1607983, upload-time = "2025-11-10T02:02:52.502Z" },
+ { url = "https://files.pythonhosted.org/packages/99/fe/49b0768f8c9ae57eb74cc10a1f87b4c70453551d8ad498959721cc345cb7/black-25.11.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:936c4dd07669269f40b497440159a221ee435e3fddcf668e0c05244a9be71993", size = 1682481, upload-time = "2025-11-10T01:57:12.35Z" },
+ { url = "https://files.pythonhosted.org/packages/55/17/7e10ff1267bfa950cc16f0a411d457cdff79678fbb77a6c73b73a5317904/black-25.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:f42c0ea7f59994490f4dccd64e6b2dd49ac57c7c84f38b8faab50f8759db245c", size = 1363869, upload-time = "2025-11-10T01:58:24.608Z" },
+ { url = "https://files.pythonhosted.org/packages/67/c0/cc865ce594d09e4cd4dfca5e11994ebb51604328489f3ca3ae7bb38a7db5/black-25.11.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:35690a383f22dd3e468c85dc4b915217f87667ad9cce781d7b42678ce63c4170", size = 1771358, upload-time = "2025-11-10T02:03:33.331Z" },
+ { url = "https://files.pythonhosted.org/packages/37/77/4297114d9e2fd2fc8ab0ab87192643cd49409eb059e2940391e7d2340e57/black-25.11.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:dae49ef7369c6caa1a1833fd5efb7c3024bb7e4499bf64833f65ad27791b1545", size = 1612902, upload-time = "2025-11-10T01:59:33.382Z" },
+ { url = "https://files.pythonhosted.org/packages/de/63/d45ef97ada84111e330b2b2d45e1dd163e90bd116f00ac55927fb6bf8adb/black-25.11.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5bd4a22a0b37401c8e492e994bce79e614f91b14d9ea911f44f36e262195fdda", size = 1680571, upload-time = "2025-11-10T01:57:04.239Z" },
+ { url = "https://files.pythonhosted.org/packages/ff/4b/5604710d61cdff613584028b4cb4607e56e148801ed9b38ee7970799dab6/black-25.11.0-cp314-cp314-win_amd64.whl", hash = "sha256:aa211411e94fdf86519996b7f5f05e71ba34835d8f0c0f03c00a26271da02664", size = 1382599, upload-time = "2025-11-10T01:57:57.427Z" },
+ { url = "https://files.pythonhosted.org/packages/00/5d/aed32636ed30a6e7f9efd6ad14e2a0b0d687ae7c8c7ec4e4a557174b895c/black-25.11.0-py3-none-any.whl", hash = "sha256:e3f562da087791e96cefcd9dda058380a442ab322a02e222add53736451f604b", size = 204918, upload-time = "2025-11-10T01:53:48.917Z" },
+]
+
+[[package]]
+name = "certifi"
+version = "2025.11.12"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/a2/8c/58f469717fa48465e4a50c014a0400602d3c437d7c0c468e17ada824da3a/certifi-2025.11.12.tar.gz", hash = "sha256:d8ab5478f2ecd78af242878415affce761ca6bc54a22a27e026d7c25357c3316", size = 160538, upload-time = "2025-11-12T02:54:51.517Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/70/7d/9bc192684cea499815ff478dfcdc13835ddf401365057044fb721ec6bddb/certifi-2025.11.12-py3-none-any.whl", hash = "sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b", size = 159438, upload-time = "2025-11-12T02:54:49.735Z" },
+]
+
+[[package]]
+name = "click"
+version = "8.3.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/3d/fa/656b739db8587d7b5dfa22e22ed02566950fbfbcdc20311993483657a5c0/click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a", size = 295065, upload-time = "2025-11-15T20:45:42.706Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6", size = 108274, upload-time = "2025-11-15T20:45:41.139Z" },
+]
+
+[[package]]
+name = "colorama"
+version = "0.4.6"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" },
+]
+
+[[package]]
+name = "deprecated"
+version = "1.3.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "wrapt" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/49/85/12f0a49a7c4ffb70572b6c2ef13c90c88fd190debda93b23f026b25f9634/deprecated-1.3.1.tar.gz", hash = "sha256:b1b50e0ff0c1fddaa5708a2c6b0a6588bb09b892825ab2b214ac9ea9d92a5223", size = 2932523, upload-time = "2025-10-30T08:19:02.757Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/84/d0/205d54408c08b13550c733c4b85429e7ead111c7f0014309637425520a9a/deprecated-1.3.1-py2.py3-none-any.whl", hash = "sha256:597bfef186b6f60181535a29fbe44865ce137a5079f295b479886c82729d5f3f", size = 11298, upload-time = "2025-10-30T08:19:00.758Z" },
+]
+
+[[package]]
+name = "exceptiongroup"
+version = "1.3.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "typing-extensions" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" },
+]
+
+[[package]]
+name = "griffe"
+version = "1.15.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "colorama" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/0d/0c/3a471b6e31951dce2360477420d0a8d1e00dea6cf33b70f3e8c3ab6e28e1/griffe-1.15.0.tar.gz", hash = "sha256:7726e3afd6f298fbc3696e67958803e7ac843c1cfe59734b6251a40cdbfb5eea", size = 424112, upload-time = "2025-11-10T15:03:15.52Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9c/83/3b1d03d36f224edded98e9affd0467630fc09d766c0e56fb1498cbb04a9b/griffe-1.15.0-py3-none-any.whl", hash = "sha256:6f6762661949411031f5fcda9593f586e6ce8340f0ba88921a0f2ef7a81eb9a3", size = 150705, upload-time = "2025-11-10T15:03:13.549Z" },
+]
+
+[[package]]
+name = "grpc-interceptor"
+version = "0.15.4"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "grpcio" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/9f/28/57449d5567adf4c1d3e216aaca545913fbc21a915f2da6790d6734aac76e/grpc-interceptor-0.15.4.tar.gz", hash = "sha256:1f45c0bcb58b6f332f37c637632247c9b02bc6af0fdceb7ba7ce8d2ebbfb0926", size = 19322, upload-time = "2023-11-16T02:05:42.459Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/15/ac/8d53f230a7443401ce81791ec50a3b0e54924bf615ad287654fa4a2f5cdc/grpc_interceptor-0.15.4-py3-none-any.whl", hash = "sha256:0035f33228693ed3767ee49d937bac424318db173fef4d2d0170b3215f254d9d", size = 20848, upload-time = "2023-11-16T02:05:40.913Z" },
+]
+
+[[package]]
+name = "grpcio"
+version = "1.76.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "typing-extensions" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/b6/e0/318c1ce3ae5a17894d5791e87aea147587c9e702f24122cc7a5c8bbaeeb1/grpcio-1.76.0.tar.gz", hash = "sha256:7be78388d6da1a25c0d5ec506523db58b18be22d9c37d8d3a32c08be4987bd73", size = 12785182, upload-time = "2025-10-21T16:23:12.106Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/88/17/ff4795dc9a34b6aee6ec379f1b66438a3789cd1315aac0cbab60d92f74b3/grpcio-1.76.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:65a20de41e85648e00305c1bb09a3598f840422e522277641145a32d42dcefcc", size = 5840037, upload-time = "2025-10-21T16:20:25.069Z" },
+ { url = "https://files.pythonhosted.org/packages/4e/ff/35f9b96e3fa2f12e1dcd58a4513a2e2294a001d64dec81677361b7040c9a/grpcio-1.76.0-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:40ad3afe81676fd9ec6d9d406eda00933f218038433980aa19d401490e46ecde", size = 11836482, upload-time = "2025-10-21T16:20:30.113Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/1c/8374990f9545e99462caacea5413ed783014b3b66ace49e35c533f07507b/grpcio-1.76.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:035d90bc79eaa4bed83f524331d55e35820725c9fbb00ffa1904d5550ed7ede3", size = 6407178, upload-time = "2025-10-21T16:20:32.733Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/77/36fd7d7c75a6c12542c90a6d647a27935a1ecaad03e0ffdb7c42db6b04d2/grpcio-1.76.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:4215d3a102bd95e2e11b5395c78562967959824156af11fa93d18fdd18050990", size = 7075684, upload-time = "2025-10-21T16:20:35.435Z" },
+ { url = "https://files.pythonhosted.org/packages/38/f7/e3cdb252492278e004722306c5a8935eae91e64ea11f0af3437a7de2e2b7/grpcio-1.76.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:49ce47231818806067aea3324d4bf13825b658ad662d3b25fada0bdad9b8a6af", size = 6611133, upload-time = "2025-10-21T16:20:37.541Z" },
+ { url = "https://files.pythonhosted.org/packages/7e/20/340db7af162ccd20a0893b5f3c4a5d676af7b71105517e62279b5b61d95a/grpcio-1.76.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8cc3309d8e08fd79089e13ed4819d0af72aa935dd8f435a195fd152796752ff2", size = 7195507, upload-time = "2025-10-21T16:20:39.643Z" },
+ { url = "https://files.pythonhosted.org/packages/10/f0/b2160addc1487bd8fa4810857a27132fb4ce35c1b330c2f3ac45d697b106/grpcio-1.76.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:971fd5a1d6e62e00d945423a567e42eb1fa678ba89072832185ca836a94daaa6", size = 8160651, upload-time = "2025-10-21T16:20:42.492Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/2c/ac6f98aa113c6ef111b3f347854e99ebb7fb9d8f7bb3af1491d438f62af4/grpcio-1.76.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9d9adda641db7207e800a7f089068f6f645959f2df27e870ee81d44701dd9db3", size = 7620568, upload-time = "2025-10-21T16:20:45.995Z" },
+ { url = "https://files.pythonhosted.org/packages/90/84/7852f7e087285e3ac17a2703bc4129fafee52d77c6c82af97d905566857e/grpcio-1.76.0-cp310-cp310-win32.whl", hash = "sha256:063065249d9e7e0782d03d2bca50787f53bd0fb89a67de9a7b521c4a01f1989b", size = 3998879, upload-time = "2025-10-21T16:20:48.592Z" },
+ { url = "https://files.pythonhosted.org/packages/10/30/d3d2adcbb6dd3ff59d6ac3df6ef830e02b437fb5c90990429fd180e52f30/grpcio-1.76.0-cp310-cp310-win_amd64.whl", hash = "sha256:a6ae758eb08088d36812dd5d9af7a9859c05b1e0f714470ea243694b49278e7b", size = 4706892, upload-time = "2025-10-21T16:20:50.697Z" },
+ { url = "https://files.pythonhosted.org/packages/a0/00/8163a1beeb6971f66b4bbe6ac9457b97948beba8dd2fc8e1281dce7f79ec/grpcio-1.76.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:2e1743fbd7f5fa713a1b0a8ac8ebabf0ec980b5d8809ec358d488e273b9cf02a", size = 5843567, upload-time = "2025-10-21T16:20:52.829Z" },
+ { url = "https://files.pythonhosted.org/packages/10/c1/934202f5cf335e6d852530ce14ddb0fef21be612ba9ecbbcbd4d748ca32d/grpcio-1.76.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:a8c2cf1209497cf659a667d7dea88985e834c24b7c3b605e6254cbb5076d985c", size = 11848017, upload-time = "2025-10-21T16:20:56.705Z" },
+ { url = "https://files.pythonhosted.org/packages/11/0b/8dec16b1863d74af6eb3543928600ec2195af49ca58b16334972f6775663/grpcio-1.76.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:08caea849a9d3c71a542827d6df9d5a69067b0a1efbea8a855633ff5d9571465", size = 6412027, upload-time = "2025-10-21T16:20:59.3Z" },
+ { url = "https://files.pythonhosted.org/packages/d7/64/7b9e6e7ab910bea9d46f2c090380bab274a0b91fb0a2fe9b0cd399fffa12/grpcio-1.76.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:f0e34c2079d47ae9f6188211db9e777c619a21d4faba6977774e8fa43b085e48", size = 7075913, upload-time = "2025-10-21T16:21:01.645Z" },
+ { url = "https://files.pythonhosted.org/packages/68/86/093c46e9546073cefa789bd76d44c5cb2abc824ca62af0c18be590ff13ba/grpcio-1.76.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8843114c0cfce61b40ad48df65abcfc00d4dba82eae8718fab5352390848c5da", size = 6615417, upload-time = "2025-10-21T16:21:03.844Z" },
+ { url = "https://files.pythonhosted.org/packages/f7/b6/5709a3a68500a9c03da6fb71740dcdd5ef245e39266461a03f31a57036d8/grpcio-1.76.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8eddfb4d203a237da6f3cc8a540dad0517d274b5a1e9e636fd8d2c79b5c1d397", size = 7199683, upload-time = "2025-10-21T16:21:06.195Z" },
+ { url = "https://files.pythonhosted.org/packages/91/d3/4b1f2bf16ed52ce0b508161df3a2d186e4935379a159a834cb4a7d687429/grpcio-1.76.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:32483fe2aab2c3794101c2a159070584e5db11d0aa091b2c0ea9c4fc43d0d749", size = 8163109, upload-time = "2025-10-21T16:21:08.498Z" },
+ { url = "https://files.pythonhosted.org/packages/5c/61/d9043f95f5f4cf085ac5dd6137b469d41befb04bd80280952ffa2a4c3f12/grpcio-1.76.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:dcfe41187da8992c5f40aa8c5ec086fa3672834d2be57a32384c08d5a05b4c00", size = 7626676, upload-time = "2025-10-21T16:21:10.693Z" },
+ { url = "https://files.pythonhosted.org/packages/36/95/fd9a5152ca02d8881e4dd419cdd790e11805979f499a2e5b96488b85cf27/grpcio-1.76.0-cp311-cp311-win32.whl", hash = "sha256:2107b0c024d1b35f4083f11245c0e23846ae64d02f40b2b226684840260ed054", size = 3997688, upload-time = "2025-10-21T16:21:12.746Z" },
+ { url = "https://files.pythonhosted.org/packages/60/9c/5c359c8d4c9176cfa3c61ecd4efe5affe1f38d9bae81e81ac7186b4c9cc8/grpcio-1.76.0-cp311-cp311-win_amd64.whl", hash = "sha256:522175aba7af9113c48ec10cc471b9b9bd4f6ceb36aeb4544a8e2c80ed9d252d", size = 4709315, upload-time = "2025-10-21T16:21:15.26Z" },
+ { url = "https://files.pythonhosted.org/packages/bf/05/8e29121994b8d959ffa0afd28996d452f291b48cfc0875619de0bde2c50c/grpcio-1.76.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:81fd9652b37b36f16138611c7e884eb82e0cec137c40d3ef7c3f9b3ed00f6ed8", size = 5799718, upload-time = "2025-10-21T16:21:17.939Z" },
+ { url = "https://files.pythonhosted.org/packages/d9/75/11d0e66b3cdf998c996489581bdad8900db79ebd83513e45c19548f1cba4/grpcio-1.76.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:04bbe1bfe3a68bbfd4e52402ab7d4eb59d72d02647ae2042204326cf4bbad280", size = 11825627, upload-time = "2025-10-21T16:21:20.466Z" },
+ { url = "https://files.pythonhosted.org/packages/28/50/2f0aa0498bc188048f5d9504dcc5c2c24f2eb1a9337cd0fa09a61a2e75f0/grpcio-1.76.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d388087771c837cdb6515539f43b9d4bf0b0f23593a24054ac16f7a960be16f4", size = 6359167, upload-time = "2025-10-21T16:21:23.122Z" },
+ { url = "https://files.pythonhosted.org/packages/66/e5/bbf0bb97d29ede1d59d6588af40018cfc345b17ce979b7b45424628dc8bb/grpcio-1.76.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:9f8f757bebaaea112c00dba718fc0d3260052ce714e25804a03f93f5d1c6cc11", size = 7044267, upload-time = "2025-10-21T16:21:25.995Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/86/f6ec2164f743d9609691115ae8ece098c76b894ebe4f7c94a655c6b03e98/grpcio-1.76.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:980a846182ce88c4f2f7e2c22c56aefd515daeb36149d1c897f83cf57999e0b6", size = 6573963, upload-time = "2025-10-21T16:21:28.631Z" },
+ { url = "https://files.pythonhosted.org/packages/60/bc/8d9d0d8505feccfdf38a766d262c71e73639c165b311c9457208b56d92ae/grpcio-1.76.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f92f88e6c033db65a5ae3d97905c8fea9c725b63e28d5a75cb73b49bda5024d8", size = 7164484, upload-time = "2025-10-21T16:21:30.837Z" },
+ { url = "https://files.pythonhosted.org/packages/67/e6/5d6c2fc10b95edf6df9b8f19cf10a34263b7fd48493936fffd5085521292/grpcio-1.76.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4baf3cbe2f0be3289eb68ac8ae771156971848bb8aaff60bad42005539431980", size = 8127777, upload-time = "2025-10-21T16:21:33.577Z" },
+ { url = "https://files.pythonhosted.org/packages/3f/c8/dce8ff21c86abe025efe304d9e31fdb0deaaa3b502b6a78141080f206da0/grpcio-1.76.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:615ba64c208aaceb5ec83bfdce7728b80bfeb8be97562944836a7a0a9647d882", size = 7594014, upload-time = "2025-10-21T16:21:41.882Z" },
+ { url = "https://files.pythonhosted.org/packages/e0/42/ad28191ebf983a5d0ecef90bab66baa5a6b18f2bfdef9d0a63b1973d9f75/grpcio-1.76.0-cp312-cp312-win32.whl", hash = "sha256:45d59a649a82df5718fd9527ce775fd66d1af35e6d31abdcdc906a49c6822958", size = 3984750, upload-time = "2025-10-21T16:21:44.006Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/00/7bd478cbb851c04a48baccaa49b75abaa8e4122f7d86da797500cccdd771/grpcio-1.76.0-cp312-cp312-win_amd64.whl", hash = "sha256:c088e7a90b6017307f423efbb9d1ba97a22aa2170876223f9709e9d1de0b5347", size = 4704003, upload-time = "2025-10-21T16:21:46.244Z" },
+ { url = "https://files.pythonhosted.org/packages/fc/ed/71467ab770effc9e8cef5f2e7388beb2be26ed642d567697bb103a790c72/grpcio-1.76.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:26ef06c73eb53267c2b319f43e6634c7556ea37672029241a056629af27c10e2", size = 5807716, upload-time = "2025-10-21T16:21:48.475Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/85/c6ed56f9817fab03fa8a111ca91469941fb514e3e3ce6d793cb8f1e1347b/grpcio-1.76.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:45e0111e73f43f735d70786557dc38141185072d7ff8dc1829d6a77ac1471468", size = 11821522, upload-time = "2025-10-21T16:21:51.142Z" },
+ { url = "https://files.pythonhosted.org/packages/ac/31/2b8a235ab40c39cbc141ef647f8a6eb7b0028f023015a4842933bc0d6831/grpcio-1.76.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:83d57312a58dcfe2a3a0f9d1389b299438909a02db60e2f2ea2ae2d8034909d3", size = 6362558, upload-time = "2025-10-21T16:21:54.213Z" },
+ { url = "https://files.pythonhosted.org/packages/bd/64/9784eab483358e08847498ee56faf8ff6ea8e0a4592568d9f68edc97e9e9/grpcio-1.76.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:3e2a27c89eb9ac3d81ec8835e12414d73536c6e620355d65102503064a4ed6eb", size = 7049990, upload-time = "2025-10-21T16:21:56.476Z" },
+ { url = "https://files.pythonhosted.org/packages/2b/94/8c12319a6369434e7a184b987e8e9f3b49a114c489b8315f029e24de4837/grpcio-1.76.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:61f69297cba3950a524f61c7c8ee12e55c486cb5f7db47ff9dcee33da6f0d3ae", size = 6575387, upload-time = "2025-10-21T16:21:59.051Z" },
+ { url = "https://files.pythonhosted.org/packages/15/0f/f12c32b03f731f4a6242f771f63039df182c8b8e2cf8075b245b409259d4/grpcio-1.76.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6a15c17af8839b6801d554263c546c69c4d7718ad4321e3166175b37eaacca77", size = 7166668, upload-time = "2025-10-21T16:22:02.049Z" },
+ { url = "https://files.pythonhosted.org/packages/ff/2d/3ec9ce0c2b1d92dd59d1c3264aaec9f0f7c817d6e8ac683b97198a36ed5a/grpcio-1.76.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:25a18e9810fbc7e7f03ec2516addc116a957f8cbb8cbc95ccc80faa072743d03", size = 8124928, upload-time = "2025-10-21T16:22:04.984Z" },
+ { url = "https://files.pythonhosted.org/packages/1a/74/fd3317be5672f4856bcdd1a9e7b5e17554692d3db9a3b273879dc02d657d/grpcio-1.76.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:931091142fd8cc14edccc0845a79248bc155425eee9a98b2db2ea4f00a235a42", size = 7589983, upload-time = "2025-10-21T16:22:07.881Z" },
+ { url = "https://files.pythonhosted.org/packages/45/bb/ca038cf420f405971f19821c8c15bcbc875505f6ffadafe9ffd77871dc4c/grpcio-1.76.0-cp313-cp313-win32.whl", hash = "sha256:5e8571632780e08526f118f74170ad8d50fb0a48c23a746bef2a6ebade3abd6f", size = 3984727, upload-time = "2025-10-21T16:22:10.032Z" },
+ { url = "https://files.pythonhosted.org/packages/41/80/84087dc56437ced7cdd4b13d7875e7439a52a261e3ab4e06488ba6173b0a/grpcio-1.76.0-cp313-cp313-win_amd64.whl", hash = "sha256:f9f7bd5faab55f47231ad8dba7787866b69f5e93bc306e3915606779bbfb4ba8", size = 4702799, upload-time = "2025-10-21T16:22:12.709Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/46/39adac80de49d678e6e073b70204091e76631e03e94928b9ea4ecf0f6e0e/grpcio-1.76.0-cp314-cp314-linux_armv7l.whl", hash = "sha256:ff8a59ea85a1f2191a0ffcc61298c571bc566332f82e5f5be1b83c9d8e668a62", size = 5808417, upload-time = "2025-10-21T16:22:15.02Z" },
+ { url = "https://files.pythonhosted.org/packages/9c/f5/a4531f7fb8b4e2a60b94e39d5d924469b7a6988176b3422487be61fe2998/grpcio-1.76.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:06c3d6b076e7b593905d04fdba6a0525711b3466f43b3400266f04ff735de0cd", size = 11828219, upload-time = "2025-10-21T16:22:17.954Z" },
+ { url = "https://files.pythonhosted.org/packages/4b/1c/de55d868ed7a8bd6acc6b1d6ddc4aa36d07a9f31d33c912c804adb1b971b/grpcio-1.76.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fd5ef5932f6475c436c4a55e4336ebbe47bd3272be04964a03d316bbf4afbcbc", size = 6367826, upload-time = "2025-10-21T16:22:20.721Z" },
+ { url = "https://files.pythonhosted.org/packages/59/64/99e44c02b5adb0ad13ab3adc89cb33cb54bfa90c74770f2607eea629b86f/grpcio-1.76.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:b331680e46239e090f5b3cead313cc772f6caa7d0fc8de349337563125361a4a", size = 7049550, upload-time = "2025-10-21T16:22:23.637Z" },
+ { url = "https://files.pythonhosted.org/packages/43/28/40a5be3f9a86949b83e7d6a2ad6011d993cbe9b6bd27bea881f61c7788b6/grpcio-1.76.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2229ae655ec4e8999599469559e97630185fdd53ae1e8997d147b7c9b2b72cba", size = 6575564, upload-time = "2025-10-21T16:22:26.016Z" },
+ { url = "https://files.pythonhosted.org/packages/4b/a9/1be18e6055b64467440208a8559afac243c66a8b904213af6f392dc2212f/grpcio-1.76.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:490fa6d203992c47c7b9e4a9d39003a0c2bcc1c9aa3c058730884bbbb0ee9f09", size = 7176236, upload-time = "2025-10-21T16:22:28.362Z" },
+ { url = "https://files.pythonhosted.org/packages/0f/55/dba05d3fcc151ce6e81327541d2cc8394f442f6b350fead67401661bf041/grpcio-1.76.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:479496325ce554792dba6548fae3df31a72cef7bad71ca2e12b0e58f9b336bfc", size = 8125795, upload-time = "2025-10-21T16:22:31.075Z" },
+ { url = "https://files.pythonhosted.org/packages/4a/45/122df922d05655f63930cf42c9e3f72ba20aadb26c100ee105cad4ce4257/grpcio-1.76.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:1c9b93f79f48b03ada57ea24725d83a30284a012ec27eab2cf7e50a550cbbbcc", size = 7592214, upload-time = "2025-10-21T16:22:33.831Z" },
+ { url = "https://files.pythonhosted.org/packages/4a/6e/0b899b7f6b66e5af39e377055fb4a6675c9ee28431df5708139df2e93233/grpcio-1.76.0-cp314-cp314-win32.whl", hash = "sha256:747fa73efa9b8b1488a95d0ba1039c8e2dca0f741612d80415b1e1c560febf4e", size = 4062961, upload-time = "2025-10-21T16:22:36.468Z" },
+ { url = "https://files.pythonhosted.org/packages/19/41/0b430b01a2eb38ee887f88c1f07644a1df8e289353b78e82b37ef988fb64/grpcio-1.76.0-cp314-cp314-win_amd64.whl", hash = "sha256:922fa70ba549fce362d2e2871ab542082d66e2aaf0c19480ea453905b01f384e", size = 4834462, upload-time = "2025-10-21T16:22:39.772Z" },
+]
+
+[[package]]
+name = "h11"
+version = "0.16.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" },
+]
+
+[[package]]
+name = "httpcore"
+version = "1.0.9"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "certifi" },
+ { name = "h11" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" },
+]
+
+[[package]]
+name = "httpx"
+version = "0.28.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "anyio" },
+ { name = "certifi" },
+ { name = "httpcore" },
+ { name = "idna" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" },
+]
+
+[[package]]
+name = "idna"
+version = "3.11"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" },
+]
+
+[[package]]
+name = "importlib-metadata"
+version = "7.1.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "zipp" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/a0/fc/c4e6078d21fc4fa56300a241b87eae76766aa380a23fc450fc85bb7bf547/importlib_metadata-7.1.0.tar.gz", hash = "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2", size = 52120, upload-time = "2024-03-20T19:51:32.429Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/2d/0a/679461c511447ffaf176567d5c496d1de27cbe34a87df6677d7171b2fbd4/importlib_metadata-7.1.0-py3-none-any.whl", hash = "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570", size = 24409, upload-time = "2024-03-20T19:51:30.241Z" },
+]
+
+[[package]]
+name = "iniconfig"
+version = "2.3.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" },
+]
+
+[[package]]
+name = "jinja2"
+version = "3.1.6"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "markupsafe" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" },
+]
+
+[[package]]
+name = "librt"
+version = "0.6.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/37/c3/cdff3c10e2e608490dc0a310ccf11ba777b3943ad4fcead2a2ade98c21e1/librt-0.6.3.tar.gz", hash = "sha256:c724a884e642aa2bbad52bb0203ea40406ad742368a5f90da1b220e970384aae", size = 54209, upload-time = "2025-11-29T14:01:56.058Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a6/84/859df8db21dedab2538ddfbe1d486dda3eb66a98c6ad7ba754a99e25e45e/librt-0.6.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:45660d26569cc22ed30adf583389d8a0d1b468f8b5e518fcf9bfe2cd298f9dd1", size = 27294, upload-time = "2025-11-29T14:00:35.053Z" },
+ { url = "https://files.pythonhosted.org/packages/f7/01/ec3971cf9c4f827f17de6729bdfdbf01a67493147334f4ef8fac68936e3a/librt-0.6.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:54f3b2177fb892d47f8016f1087d21654b44f7fc4cf6571c1c6b3ea531ab0fcf", size = 27635, upload-time = "2025-11-29T14:00:36.496Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/f9/3efe201df84dd26388d2e0afa4c4dc668c8e406a3da7b7319152faf835a1/librt-0.6.3-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:c5b31bed2c2f2fa1fcb4815b75f931121ae210dc89a3d607fb1725f5907f1437", size = 81768, upload-time = "2025-11-29T14:00:37.451Z" },
+ { url = "https://files.pythonhosted.org/packages/0a/13/f63e60bc219b17f3d8f3d13423cd4972e597b0321c51cac7bfbdd5e1f7b9/librt-0.6.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8f8ed5053ef9fb08d34f1fd80ff093ccbd1f67f147633a84cf4a7d9b09c0f089", size = 85884, upload-time = "2025-11-29T14:00:38.433Z" },
+ { url = "https://files.pythonhosted.org/packages/c2/42/0068f14f39a79d1ce8a19d4988dd07371df1d0a7d3395fbdc8a25b1c9437/librt-0.6.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3f0e4bd9bcb0ee34fa3dbedb05570da50b285f49e52c07a241da967840432513", size = 85830, upload-time = "2025-11-29T14:00:39.418Z" },
+ { url = "https://files.pythonhosted.org/packages/14/1c/87f5af3a9e6564f09e50c72f82fc3057fd42d1facc8b510a707d0438c4ad/librt-0.6.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d8f89c8d20dfa648a3f0a56861946eb00e5b00d6b00eea14bc5532b2fcfa8ef1", size = 88086, upload-time = "2025-11-29T14:00:40.555Z" },
+ { url = "https://files.pythonhosted.org/packages/05/e5/22153b98b88a913b5b3f266f12e57df50a2a6960b3f8fcb825b1a0cfe40a/librt-0.6.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:ecc2c526547eacd20cb9fbba19a5268611dbc70c346499656d6cf30fae328977", size = 86470, upload-time = "2025-11-29T14:00:41.827Z" },
+ { url = "https://files.pythonhosted.org/packages/18/3c/ea1edb587799b1edcc22444e0630fa422e32d7aaa5bfb5115b948acc2d1c/librt-0.6.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:fbedeb9b48614d662822ee514567d2d49a8012037fc7b4cd63f282642c2f4b7d", size = 89079, upload-time = "2025-11-29T14:00:42.882Z" },
+ { url = "https://files.pythonhosted.org/packages/73/ad/50bb4ae6b07c9f3ab19653e0830a210533b30eb9a18d515efb5a2b9d0c7c/librt-0.6.3-cp310-cp310-win32.whl", hash = "sha256:0765b0fe0927d189ee14b087cd595ae636bef04992e03fe6dfdaa383866c8a46", size = 19820, upload-time = "2025-11-29T14:00:44.211Z" },
+ { url = "https://files.pythonhosted.org/packages/7a/12/7426ee78f3b1dbe11a90619d54cb241ca924ca3c0ff9ade3992178e9b440/librt-0.6.3-cp310-cp310-win_amd64.whl", hash = "sha256:8c659f9fb8a2f16dc4131b803fa0144c1dadcb3ab24bb7914d01a6da58ae2457", size = 21332, upload-time = "2025-11-29T14:00:45.427Z" },
+ { url = "https://files.pythonhosted.org/packages/8b/80/bc60fd16fe24910bf5974fb914778a2e8540cef55385ab2cb04a0dfe42c4/librt-0.6.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:61348cc488b18d1b1ff9f3e5fcd5ac43ed22d3e13e862489d2267c2337285c08", size = 27285, upload-time = "2025-11-29T14:00:46.626Z" },
+ { url = "https://files.pythonhosted.org/packages/88/3c/26335536ed9ba097c79cffcee148393592e55758fe76d99015af3e47a6d0/librt-0.6.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:64645b757d617ad5f98c08e07620bc488d4bced9ced91c6279cec418f16056fa", size = 27629, upload-time = "2025-11-29T14:00:47.863Z" },
+ { url = "https://files.pythonhosted.org/packages/af/fd/2dcedeacfedee5d2eda23e7a49c1c12ce6221b5d58a13555f053203faafc/librt-0.6.3-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:26b8026393920320bb9a811b691d73c5981385d537ffc5b6e22e53f7b65d4122", size = 82039, upload-time = "2025-11-29T14:00:49.131Z" },
+ { url = "https://files.pythonhosted.org/packages/48/ff/6aa11914b83b0dc2d489f7636942a8e3322650d0dba840db9a1b455f3caa/librt-0.6.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d998b432ed9ffccc49b820e913c8f327a82026349e9c34fa3690116f6b70770f", size = 86560, upload-time = "2025-11-29T14:00:50.403Z" },
+ { url = "https://files.pythonhosted.org/packages/76/a1/d25af61958c2c7eb978164aeba0350719f615179ba3f428b682b9a5fdace/librt-0.6.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e18875e17ef69ba7dfa9623f2f95f3eda6f70b536079ee6d5763ecdfe6cc9040", size = 86494, upload-time = "2025-11-29T14:00:51.383Z" },
+ { url = "https://files.pythonhosted.org/packages/7d/4b/40e75d3b258c801908e64b39788f9491635f9554f8717430a491385bd6f2/librt-0.6.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a218f85081fc3f70cddaed694323a1ad7db5ca028c379c214e3a7c11c0850523", size = 88914, upload-time = "2025-11-29T14:00:52.688Z" },
+ { url = "https://files.pythonhosted.org/packages/97/6d/0070c81aba8a169224301c75fb5fb6c3c25ca67e6ced086584fc130d5a67/librt-0.6.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1ef42ff4edd369e84433ce9b188a64df0837f4f69e3d34d3b34d4955c599d03f", size = 86944, upload-time = "2025-11-29T14:00:53.768Z" },
+ { url = "https://files.pythonhosted.org/packages/a6/94/809f38887941b7726692e0b5a083dbdc87dbb8cf893e3b286550c5f0b129/librt-0.6.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0e0f2b79993fec23a685b3e8107ba5f8675eeae286675a216da0b09574fa1e47", size = 89852, upload-time = "2025-11-29T14:00:54.71Z" },
+ { url = "https://files.pythonhosted.org/packages/58/a3/b0e5b1cda675b91f1111d8ba941da455d8bfaa22f4d2d8963ba96ccb5b12/librt-0.6.3-cp311-cp311-win32.whl", hash = "sha256:fd98cacf4e0fabcd4005c452cb8a31750258a85cab9a59fb3559e8078da408d7", size = 19948, upload-time = "2025-11-29T14:00:55.989Z" },
+ { url = "https://files.pythonhosted.org/packages/cc/73/70011c2b37e3be3ece3affd3abc8ebe5cda482b03fd6b3397906321a901e/librt-0.6.3-cp311-cp311-win_amd64.whl", hash = "sha256:e17b5b42c8045867ca9d1f54af00cc2275198d38de18545edaa7833d7e9e4ac8", size = 21406, upload-time = "2025-11-29T14:00:56.874Z" },
+ { url = "https://files.pythonhosted.org/packages/91/ee/119aa759290af6ca0729edf513ca390c1afbeae60f3ecae9b9d56f25a8a9/librt-0.6.3-cp311-cp311-win_arm64.whl", hash = "sha256:87597e3d57ec0120a3e1d857a708f80c02c42ea6b00227c728efbc860f067c45", size = 20875, upload-time = "2025-11-29T14:00:57.752Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/2c/b59249c566f98fe90e178baf59e83f628d6c38fb8bc78319301fccda0b5e/librt-0.6.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:74418f718083009108dc9a42c21bf2e4802d49638a1249e13677585fcc9ca176", size = 27841, upload-time = "2025-11-29T14:00:58.925Z" },
+ { url = "https://files.pythonhosted.org/packages/40/e8/9db01cafcd1a2872b76114c858f81cc29ce7ad606bc102020d6dabf470fb/librt-0.6.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:514f3f363d1ebc423357d36222c37e5c8e6674b6eae8d7195ac9a64903722057", size = 27844, upload-time = "2025-11-29T14:01:00.2Z" },
+ { url = "https://files.pythonhosted.org/packages/59/4d/da449d3a7d83cc853af539dee42adc37b755d7eea4ad3880bacfd84b651d/librt-0.6.3-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cf1115207a5049d1f4b7b4b72de0e52f228d6c696803d94843907111cbf80610", size = 84091, upload-time = "2025-11-29T14:01:01.118Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/6c/f90306906fb6cc6eaf4725870f0347115de05431e1f96d35114392d31fda/librt-0.6.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ad8ba80cdcea04bea7b78fcd4925bfbf408961e9d8397d2ee5d3ec121e20c08c", size = 88239, upload-time = "2025-11-29T14:01:02.11Z" },
+ { url = "https://files.pythonhosted.org/packages/e7/ae/473ce7b423cfac2cb503851a89d9d2195bf615f534d5912bf86feeebbee7/librt-0.6.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4018904c83eab49c814e2494b4e22501a93cdb6c9f9425533fe693c3117126f9", size = 88815, upload-time = "2025-11-29T14:01:03.114Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/6d/934df738c87fb9617cabefe4891eece585a06abe6def25b4bca3b174429d/librt-0.6.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8983c5c06ac9c990eac5eb97a9f03fe41dc7e9d7993df74d9e8682a1056f596c", size = 90598, upload-time = "2025-11-29T14:01:04.071Z" },
+ { url = "https://files.pythonhosted.org/packages/72/89/eeaa124f5e0f431c2b39119550378ae817a4b1a3c93fd7122f0639336fff/librt-0.6.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d7769c579663a6f8dbf34878969ac71befa42067ce6bf78e6370bf0d1194997c", size = 88603, upload-time = "2025-11-29T14:01:05.02Z" },
+ { url = "https://files.pythonhosted.org/packages/4d/ed/c60b3c1cfc27d709bc0288af428ce58543fcb5053cf3eadbc773c24257f5/librt-0.6.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d3c9a07eafdc70556f8c220da4a538e715668c0c63cabcc436a026e4e89950bf", size = 92112, upload-time = "2025-11-29T14:01:06.304Z" },
+ { url = "https://files.pythonhosted.org/packages/c1/ab/f56169be5f716ef4ab0277be70bcb1874b4effc262e655d85b505af4884d/librt-0.6.3-cp312-cp312-win32.whl", hash = "sha256:38320386a48a15033da295df276aea93a92dfa94a862e06893f75ea1d8bbe89d", size = 20127, upload-time = "2025-11-29T14:01:07.283Z" },
+ { url = "https://files.pythonhosted.org/packages/ff/8d/222750ce82bf95125529eaab585ac7e2829df252f3cfc05d68792fb1dd2c/librt-0.6.3-cp312-cp312-win_amd64.whl", hash = "sha256:c0ecf4786ad0404b072196b5df774b1bb23c8aacdcacb6c10b4128bc7b00bd01", size = 21545, upload-time = "2025-11-29T14:01:08.184Z" },
+ { url = "https://files.pythonhosted.org/packages/72/c9/f731ddcfb72f446a92a8674c6b8e1e2242773cce43a04f41549bd8b958ff/librt-0.6.3-cp312-cp312-win_arm64.whl", hash = "sha256:9f2a6623057989ebc469cd9cc8fe436c40117a0147627568d03f84aef7854c55", size = 20946, upload-time = "2025-11-29T14:01:09.384Z" },
+ { url = "https://files.pythonhosted.org/packages/dd/aa/3055dd440f8b8b3b7e8624539a0749dd8e1913e978993bcca9ce7e306231/librt-0.6.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9e716f9012148a81f02f46a04fc4c663420c6fbfeacfac0b5e128cf43b4413d3", size = 27874, upload-time = "2025-11-29T14:01:10.615Z" },
+ { url = "https://files.pythonhosted.org/packages/ef/93/226d7dd455eaa4c26712b5ccb2dfcca12831baa7f898c8ffd3a831e29fda/librt-0.6.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:669ff2495728009a96339c5ad2612569c6d8be4474e68f3f3ac85d7c3261f5f5", size = 27852, upload-time = "2025-11-29T14:01:11.535Z" },
+ { url = "https://files.pythonhosted.org/packages/4e/8b/db9d51191aef4e4cc06285250affe0bb0ad8b2ed815f7ca77951655e6f02/librt-0.6.3-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:349b6873ebccfc24c9efd244e49da9f8a5c10f60f07575e248921aae2123fc42", size = 84264, upload-time = "2025-11-29T14:01:12.461Z" },
+ { url = "https://files.pythonhosted.org/packages/8d/53/297c96bda3b5a73bdaf748f1e3ae757edd29a0a41a956b9c10379f193417/librt-0.6.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c74c26736008481c9f6d0adf1aedb5a52aff7361fea98276d1f965c0256ee70", size = 88432, upload-time = "2025-11-29T14:01:13.405Z" },
+ { url = "https://files.pythonhosted.org/packages/54/3a/c005516071123278e340f22de72fa53d51e259d49215295c212da16c4dc2/librt-0.6.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:408a36ddc75e91918cb15b03460bdc8a015885025d67e68c6f78f08c3a88f522", size = 89014, upload-time = "2025-11-29T14:01:14.373Z" },
+ { url = "https://files.pythonhosted.org/packages/8e/9b/ea715f818d926d17b94c80a12d81a79e95c44f52848e61e8ca1ff29bb9a9/librt-0.6.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e61ab234624c9ffca0248a707feffe6fac2343758a36725d8eb8a6efef0f8c30", size = 90807, upload-time = "2025-11-29T14:01:15.377Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/fc/4e2e4c87e002fa60917a8e474fd13c4bac9a759df82be3778573bb1ab954/librt-0.6.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:324462fe7e3896d592b967196512491ec60ca6e49c446fe59f40743d08c97917", size = 88890, upload-time = "2025-11-29T14:01:16.633Z" },
+ { url = "https://files.pythonhosted.org/packages/70/7f/c7428734fbdfd4db3d5b9237fc3a857880b2ace66492836f6529fef25d92/librt-0.6.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:36b2ec8c15030002c7f688b4863e7be42820d7c62d9c6eece3db54a2400f0530", size = 92300, upload-time = "2025-11-29T14:01:17.658Z" },
+ { url = "https://files.pythonhosted.org/packages/f9/0c/738c4824fdfe74dc0f95d5e90ef9e759d4ecf7fd5ba964d54a7703322251/librt-0.6.3-cp313-cp313-win32.whl", hash = "sha256:25b1b60cb059471c0c0c803e07d0dfdc79e41a0a122f288b819219ed162672a3", size = 20159, upload-time = "2025-11-29T14:01:18.61Z" },
+ { url = "https://files.pythonhosted.org/packages/f2/95/93d0e61bc617306ecf4c54636b5cbde4947d872563565c4abdd9d07a39d3/librt-0.6.3-cp313-cp313-win_amd64.whl", hash = "sha256:10a95ad074e2a98c9e4abc7f5b7d40e5ecbfa84c04c6ab8a70fabf59bd429b88", size = 21484, upload-time = "2025-11-29T14:01:19.506Z" },
+ { url = "https://files.pythonhosted.org/packages/10/23/abd7ace79ab54d1dbee265f13529266f686a7ce2d21ab59a992f989009b6/librt-0.6.3-cp313-cp313-win_arm64.whl", hash = "sha256:17000df14f552e86877d67e4ab7966912224efc9368e998c96a6974a8d609bf9", size = 20935, upload-time = "2025-11-29T14:01:20.415Z" },
+ { url = "https://files.pythonhosted.org/packages/83/14/c06cb31152182798ed98be73f54932ab984894f5a8fccf9b73130897a938/librt-0.6.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8e695f25d1a425ad7a272902af8ab8c8d66c1998b177e4b5f5e7b4e215d0c88a", size = 27566, upload-time = "2025-11-29T14:01:21.609Z" },
+ { url = "https://files.pythonhosted.org/packages/0c/b1/ce83ca7b057b06150519152f53a0b302d7c33c8692ce2f01f669b5a819d9/librt-0.6.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:3e84a4121a7ae360ca4da436548a9c1ca8ca134a5ced76c893cc5944426164bd", size = 27753, upload-time = "2025-11-29T14:01:22.558Z" },
+ { url = "https://files.pythonhosted.org/packages/3b/ec/739a885ef0a2839b6c25f1b01c99149d2cb6a34e933ffc8c051fcd22012e/librt-0.6.3-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:05f385a414de3f950886ea0aad8f109650d4b712cf9cc14cc17f5f62a9ab240b", size = 83178, upload-time = "2025-11-29T14:01:23.555Z" },
+ { url = "https://files.pythonhosted.org/packages/db/bd/dc18bb1489d48c0911b9f4d72eae2d304ea264e215ba80f1e6ba4a9fc41d/librt-0.6.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:36a8e337461150b05ca2c7bdedb9e591dfc262c5230422cea398e89d0c746cdc", size = 87266, upload-time = "2025-11-29T14:01:24.532Z" },
+ { url = "https://files.pythonhosted.org/packages/94/f3/d0c5431b39eef15e48088b2d739ad84b17c2f1a22c0345c6d4c4a42b135e/librt-0.6.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dcbe48f6a03979384f27086484dc2a14959be1613cb173458bd58f714f2c48f3", size = 87623, upload-time = "2025-11-29T14:01:25.798Z" },
+ { url = "https://files.pythonhosted.org/packages/3b/15/9a52e90834e4bd6ee16cdbaf551cb32227cbaad27398391a189c489318bc/librt-0.6.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4bca9e4c260233fba37b15c4ec2f78aa99c1a79fbf902d19dd4a763c5c3fb751", size = 89436, upload-time = "2025-11-29T14:01:26.769Z" },
+ { url = "https://files.pythonhosted.org/packages/c3/8a/a7e78e46e8486e023c50f21758930ef4793999115229afd65de69e94c9cc/librt-0.6.3-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:760c25ed6ac968e24803eb5f7deb17ce026902d39865e83036bacbf5cf242aa8", size = 87540, upload-time = "2025-11-29T14:01:27.756Z" },
+ { url = "https://files.pythonhosted.org/packages/49/01/93799044a1cccac31f1074b07c583e181829d240539657e7f305ae63ae2a/librt-0.6.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4aa4a93a353ccff20df6e34fa855ae8fd788832c88f40a9070e3ddd3356a9f0e", size = 90597, upload-time = "2025-11-29T14:01:29.35Z" },
+ { url = "https://files.pythonhosted.org/packages/a7/29/00c7f58b8f8eb1bad6529ffb6c9cdcc0890a27dac59ecda04f817ead5277/librt-0.6.3-cp314-cp314-win32.whl", hash = "sha256:cb92741c2b4ea63c09609b064b26f7f5d9032b61ae222558c55832ec3ad0bcaf", size = 18955, upload-time = "2025-11-29T14:01:30.325Z" },
+ { url = "https://files.pythonhosted.org/packages/d7/13/2739e6e197a9f751375a37908a6a5b0bff637b81338497a1bcb5817394da/librt-0.6.3-cp314-cp314-win_amd64.whl", hash = "sha256:fdcd095b1b812d756fa5452aca93b962cf620694c0cadb192cec2bb77dcca9a2", size = 20263, upload-time = "2025-11-29T14:01:31.287Z" },
+ { url = "https://files.pythonhosted.org/packages/e1/73/393868fc2158705ea003114a24e73bb10b03bda31e9ad7b5c5ec6575338b/librt-0.6.3-cp314-cp314-win_arm64.whl", hash = "sha256:822ca79e28720a76a935c228d37da6579edef048a17cd98d406a2484d10eda78", size = 19575, upload-time = "2025-11-29T14:01:32.229Z" },
+ { url = "https://files.pythonhosted.org/packages/48/6d/3c8ff3dec21bf804a205286dd63fd28dcdbe00b8dd7eb7ccf2e21a40a0b0/librt-0.6.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:078cd77064d1640cb7b0650871a772956066174d92c8aeda188a489b58495179", size = 28732, upload-time = "2025-11-29T14:01:33.165Z" },
+ { url = "https://files.pythonhosted.org/packages/f4/90/e214b8b4aa34ed3d3f1040719c06c4d22472c40c5ef81a922d5af7876eb4/librt-0.6.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5cc22f7f5c0cc50ed69f4b15b9c51d602aabc4500b433aaa2ddd29e578f452f7", size = 29065, upload-time = "2025-11-29T14:01:34.088Z" },
+ { url = "https://files.pythonhosted.org/packages/ab/90/ef61ed51f0a7770cc703422d907a757bbd8811ce820c333d3db2fd13542a/librt-0.6.3-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:14b345eb7afb61b9fdcdfda6738946bd11b8e0f6be258666b0646af3b9bb5916", size = 93703, upload-time = "2025-11-29T14:01:35.057Z" },
+ { url = "https://files.pythonhosted.org/packages/a8/ae/c30bb119c35962cbe9a908a71da99c168056fc3f6e9bbcbc157d0b724d89/librt-0.6.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d46aa46aa29b067f0b8b84f448fd9719aaf5f4c621cc279164d76a9dc9ab3e8", size = 98890, upload-time = "2025-11-29T14:01:36.031Z" },
+ { url = "https://files.pythonhosted.org/packages/d1/96/47a4a78d252d36f072b79d592df10600d379a895c3880c8cbd2ac699f0ad/librt-0.6.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1b51ba7d9d5d9001494769eca8c0988adce25d0a970c3ba3f2eb9df9d08036fc", size = 98255, upload-time = "2025-11-29T14:01:37.058Z" },
+ { url = "https://files.pythonhosted.org/packages/e5/28/779b5cc3cd9987683884eb5f5672e3251676bebaaae6b7da1cf366eb1da1/librt-0.6.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ced0925a18fddcff289ef54386b2fc230c5af3c83b11558571124bfc485b8c07", size = 100769, upload-time = "2025-11-29T14:01:38.413Z" },
+ { url = "https://files.pythonhosted.org/packages/28/d7/771755e57c375cb9d25a4e106f570607fd856e2cb91b02418db1db954796/librt-0.6.3-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:6bac97e51f66da2ca012adddbe9fd656b17f7368d439de30898f24b39512f40f", size = 98580, upload-time = "2025-11-29T14:01:39.459Z" },
+ { url = "https://files.pythonhosted.org/packages/d0/ec/8b157eb8fbc066339a2f34b0aceb2028097d0ed6150a52e23284a311eafe/librt-0.6.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b2922a0e8fa97395553c304edc3bd36168d8eeec26b92478e292e5d4445c1ef0", size = 101706, upload-time = "2025-11-29T14:01:40.474Z" },
+ { url = "https://files.pythonhosted.org/packages/82/a8/4aaead9a06c795a318282aebf7d3e3e578fa889ff396e1b640c3be4c7806/librt-0.6.3-cp314-cp314t-win32.whl", hash = "sha256:f33462b19503ba68d80dac8a1354402675849259fb3ebf53b67de86421735a3a", size = 19465, upload-time = "2025-11-29T14:01:41.77Z" },
+ { url = "https://files.pythonhosted.org/packages/3a/61/b7e6a02746c1731670c19ba07d86da90b1ae45d29e405c0b5615abf97cde/librt-0.6.3-cp314-cp314t-win_amd64.whl", hash = "sha256:04f8ce401d4f6380cfc42af0f4e67342bf34c820dae01343f58f472dbac75dcf", size = 21042, upload-time = "2025-11-29T14:01:42.865Z" },
+ { url = "https://files.pythonhosted.org/packages/0e/3d/72cc9ec90bb80b5b1a65f0bb74a0f540195837baaf3b98c7fa4a7aa9718e/librt-0.6.3-cp314-cp314t-win_arm64.whl", hash = "sha256:afb39550205cc5e5c935762c6bf6a2bb34f7d21a68eadb25e2db7bf3593fecc0", size = 20246, upload-time = "2025-11-29T14:01:44.13Z" },
+]
+
+[[package]]
+name = "markdown-it-py"
+version = "4.0.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "mdurl" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3", size = 73070, upload-time = "2025-08-11T12:57:52.854Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321, upload-time = "2025-08-11T12:57:51.923Z" },
+]
+
+[[package]]
+name = "markdown2"
+version = "2.5.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/42/f8/b2ae8bf5f28f9b510ae097415e6e4cb63226bb28d7ee01aec03a755ba03b/markdown2-2.5.4.tar.gz", hash = "sha256:a09873f0b3c23dbfae589b0080587df52ad75bb09a5fa6559147554736676889", size = 145652, upload-time = "2025-07-27T16:16:24.307Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b8/06/2697b5043c3ecb720ce0d243fc7cf5024c0b5b1e450506e9b21939019963/markdown2-2.5.4-py3-none-any.whl", hash = "sha256:3c4b2934e677be7fec0e6f2de4410e116681f4ad50ec8e5ba7557be506d3f439", size = 49954, upload-time = "2025-07-27T16:16:23.026Z" },
+]
+
+[[package]]
+name = "markupsafe"
+version = "3.0.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e8/4b/3541d44f3937ba468b75da9eebcae497dcf67adb65caa16760b0a6807ebb/markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559", size = 11631, upload-time = "2025-09-27T18:36:05.558Z" },
+ { url = "https://files.pythonhosted.org/packages/98/1b/fbd8eed11021cabd9226c37342fa6ca4e8a98d8188a8d9b66740494960e4/markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419", size = 12057, upload-time = "2025-09-27T18:36:07.165Z" },
+ { url = "https://files.pythonhosted.org/packages/40/01/e560d658dc0bb8ab762670ece35281dec7b6c1b33f5fbc09ebb57a185519/markupsafe-3.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695", size = 22050, upload-time = "2025-09-27T18:36:08.005Z" },
+ { url = "https://files.pythonhosted.org/packages/af/cd/ce6e848bbf2c32314c9b237839119c5a564a59725b53157c856e90937b7a/markupsafe-3.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591", size = 20681, upload-time = "2025-09-27T18:36:08.881Z" },
+ { url = "https://files.pythonhosted.org/packages/c9/2a/b5c12c809f1c3045c4d580b035a743d12fcde53cf685dbc44660826308da/markupsafe-3.0.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c", size = 20705, upload-time = "2025-09-27T18:36:10.131Z" },
+ { url = "https://files.pythonhosted.org/packages/cf/e3/9427a68c82728d0a88c50f890d0fc072a1484de2f3ac1ad0bfc1a7214fd5/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f", size = 21524, upload-time = "2025-09-27T18:36:11.324Z" },
+ { url = "https://files.pythonhosted.org/packages/bc/36/23578f29e9e582a4d0278e009b38081dbe363c5e7165113fad546918a232/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6", size = 20282, upload-time = "2025-09-27T18:36:12.573Z" },
+ { url = "https://files.pythonhosted.org/packages/56/21/dca11354e756ebd03e036bd8ad58d6d7168c80ce1fe5e75218e4945cbab7/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1", size = 20745, upload-time = "2025-09-27T18:36:13.504Z" },
+ { url = "https://files.pythonhosted.org/packages/87/99/faba9369a7ad6e4d10b6a5fbf71fa2a188fe4a593b15f0963b73859a1bbd/markupsafe-3.0.3-cp310-cp310-win32.whl", hash = "sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa", size = 14571, upload-time = "2025-09-27T18:36:14.779Z" },
+ { url = "https://files.pythonhosted.org/packages/d6/25/55dc3ab959917602c96985cb1253efaa4ff42f71194bddeb61eb7278b8be/markupsafe-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8", size = 15056, upload-time = "2025-09-27T18:36:16.125Z" },
+ { url = "https://files.pythonhosted.org/packages/d0/9e/0a02226640c255d1da0b8d12e24ac2aa6734da68bff14c05dd53b94a0fc3/markupsafe-3.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1", size = 13932, upload-time = "2025-09-27T18:36:17.311Z" },
+ { url = "https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad", size = 11631, upload-time = "2025-09-27T18:36:18.185Z" },
+ { url = "https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a", size = 12058, upload-time = "2025-09-27T18:36:19.444Z" },
+ { url = "https://files.pythonhosted.org/packages/1d/09/adf2df3699d87d1d8184038df46a9c80d78c0148492323f4693df54e17bb/markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50", size = 24287, upload-time = "2025-09-27T18:36:20.768Z" },
+ { url = "https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf", size = 22940, upload-time = "2025-09-27T18:36:22.249Z" },
+ { url = "https://files.pythonhosted.org/packages/19/ae/31c1be199ef767124c042c6c3e904da327a2f7f0cd63a0337e1eca2967a8/markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f", size = 21887, upload-time = "2025-09-27T18:36:23.535Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/76/7edcab99d5349a4532a459e1fe64f0b0467a3365056ae550d3bcf3f79e1e/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a", size = 23692, upload-time = "2025-09-27T18:36:24.823Z" },
+ { url = "https://files.pythonhosted.org/packages/a4/28/6e74cdd26d7514849143d69f0bf2399f929c37dc2b31e6829fd2045b2765/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115", size = 21471, upload-time = "2025-09-27T18:36:25.95Z" },
+ { url = "https://files.pythonhosted.org/packages/62/7e/a145f36a5c2945673e590850a6f8014318d5577ed7e5920a4b3448e0865d/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a", size = 22923, upload-time = "2025-09-27T18:36:27.109Z" },
+ { url = "https://files.pythonhosted.org/packages/0f/62/d9c46a7f5c9adbeeeda52f5b8d802e1094e9717705a645efc71b0913a0a8/markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19", size = 14572, upload-time = "2025-09-27T18:36:28.045Z" },
+ { url = "https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01", size = 15077, upload-time = "2025-09-27T18:36:29.025Z" },
+ { url = "https://files.pythonhosted.org/packages/35/73/893072b42e6862f319b5207adc9ae06070f095b358655f077f69a35601f0/markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c", size = 13876, upload-time = "2025-09-27T18:36:29.954Z" },
+ { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" },
+ { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" },
+ { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" },
+ { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" },
+ { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" },
+ { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" },
+ { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" },
+ { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" },
+ { url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622, upload-time = "2025-09-27T18:36:41.777Z" },
+ { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029, upload-time = "2025-09-27T18:36:43.257Z" },
+ { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z" },
+ { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z" },
+ { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z" },
+ { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z" },
+ { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z" },
+ { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z" },
+ { url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543, upload-time = "2025-09-27T18:36:51.584Z" },
+ { url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113, upload-time = "2025-09-27T18:36:52.537Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911, upload-time = "2025-09-27T18:36:53.513Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658, upload-time = "2025-09-27T18:36:54.819Z" },
+ { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066, upload-time = "2025-09-27T18:36:55.714Z" },
+ { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z" },
+ { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z" },
+ { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z" },
+ { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z" },
+ { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z" },
+ { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z" },
+ { url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612, upload-time = "2025-09-27T18:37:02.639Z" },
+ { url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200, upload-time = "2025-09-27T18:37:03.582Z" },
+ { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z" },
+ { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" },
+ { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" },
+ { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" },
+ { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" },
+ { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" },
+ { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" },
+ { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" },
+ { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" },
+ { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" },
+ { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" },
+ { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" },
+ { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" },
+ { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" },
+ { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" },
+ { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" },
+ { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" },
+ { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" },
+ { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" },
+ { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" },
+ { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" },
+]
+
+[[package]]
+name = "maturin"
+version = "1.9.4"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "tomli", marker = "python_full_version < '3.11'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/13/7c/b11b870fc4fd84de2099906314ce45488ae17be32ff5493519a6cddc518a/maturin-1.9.4.tar.gz", hash = "sha256:235163a0c99bc6f380fb8786c04fd14dcf6cd622ff295ea3de525015e6ac40cf", size = 213647, upload-time = "2025-08-27T11:37:57.079Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f2/90/0d99389eea1939116fca841cad0763600c8d3183a02a9478d066736c60e8/maturin-1.9.4-py3-none-linux_armv6l.whl", hash = "sha256:6ff37578e3f5fdbe685110d45f60af1f5a7dfce70a1e26dfe3810af66853ecae", size = 8276133, upload-time = "2025-08-27T11:37:23.325Z" },
+ { url = "https://files.pythonhosted.org/packages/f4/ed/c8ec68b383e50f084bf1fa9605e62a90cd32a3f75d9894ed3a6e5d4cc5b3/maturin-1.9.4-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:f3837bb53611b2dafa1c090436c330f2d743ba305ef00d8801a371f4495e7e1b", size = 15994496, upload-time = "2025-08-27T11:37:27.092Z" },
+ { url = "https://files.pythonhosted.org/packages/84/4e/401ff5f3cfc6b123364d4b94379bf910d7baee32c9c95b72784ff2329357/maturin-1.9.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:4227d627d8e3bfe45877a8d65e9d8351a9d01434549f0da75d2c06a1b570de58", size = 8362228, upload-time = "2025-08-27T11:37:31.181Z" },
+ { url = "https://files.pythonhosted.org/packages/51/8e/c56176dd360da9650c62b8a5ecfb85432cf011e97e46c186901e6996002e/maturin-1.9.4-py3-none-manylinux_2_12_i686.manylinux2010_i686.musllinux_1_1_i686.whl", hash = "sha256:1bb2aa0fa29032e9c5aac03ac400396ddea12cadef242f8967e9c8ef715313a1", size = 8271397, upload-time = "2025-08-27T11:37:33.672Z" },
+ { url = "https://files.pythonhosted.org/packages/d2/46/001fcc5c6ad509874896418d6169a61acd619df5b724f99766308c44a99f/maturin-1.9.4-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.musllinux_1_1_x86_64.whl", hash = "sha256:a0868d52934c8a5d1411b42367633fdb5cd5515bec47a534192282167448ec30", size = 8775625, upload-time = "2025-08-27T11:37:35.86Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/2e/26fa7574f01c19b7a74680fd70e5bae2e8c40fed9683d1752e765062cc2b/maturin-1.9.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:68b7b833b25741c0f553b78e8b9e095b31ae7c6611533b3c7b71f84c2cb8fc44", size = 8051117, upload-time = "2025-08-27T11:37:38.278Z" },
+ { url = "https://files.pythonhosted.org/packages/73/ee/ca7308832d4f5b521c1aa176d9265f6f93e0bd1ad82a90fd9cd799f6b28c/maturin-1.9.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.musllinux_1_1_armv7l.whl", hash = "sha256:08dc86312afee55af778af919818632e35d8d0464ccd79cb86700d9ea560ccd7", size = 8132122, upload-time = "2025-08-27T11:37:40.499Z" },
+ { url = "https://files.pythonhosted.org/packages/45/e8/c623955da75e801a06942edf1fdc4e772a9e8fbc1ceebbdc85d59584dc10/maturin-1.9.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.musllinux_1_1_ppc64le.whl", hash = "sha256:ef20ffdd943078c4c3699c29fb2ed722bb6b4419efdade6642d1dbf248f94a70", size = 10586762, upload-time = "2025-08-27T11:37:42.718Z" },
+ { url = "https://files.pythonhosted.org/packages/3c/4b/19ad558fdf54e151b1b4916ed45f1952ada96684ee6db64f9cd91cabec09/maturin-1.9.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:368e958468431dfeec80f75eea9639b4356d8c42428b0128444424b083fecfb0", size = 8926988, upload-time = "2025-08-27T11:37:45.492Z" },
+ { url = "https://files.pythonhosted.org/packages/7e/27/153ad15eccae26921e8a01812da9f3b7f9013368f8f92c36853f2043b2a3/maturin-1.9.4-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:273f879214f63f79bfe851cd7d541f8150bdbfae5dfdc3c0c4d125d02d1f41b4", size = 8536758, upload-time = "2025-08-27T11:37:48.213Z" },
+ { url = "https://files.pythonhosted.org/packages/43/e3/f304c3bdc3fba9adebe5348d4d2dd015f1152c0a9027aaf52cae0bb182c8/maturin-1.9.4-py3-none-win32.whl", hash = "sha256:ed2e54d132ace7e61829bd49709331007dd9a2cc78937f598aa76a4f69b6804d", size = 7265200, upload-time = "2025-08-27T11:37:50.881Z" },
+ { url = "https://files.pythonhosted.org/packages/14/14/f86d0124bf1816b99005c058a1dbdca7cb5850d9cf4b09dcae07a1bc6201/maturin-1.9.4-py3-none-win_amd64.whl", hash = "sha256:8e450bb2c9afdf38a0059ee2e1ec2b17323f152b59c16f33eb9c74edaf1f9f79", size = 8237391, upload-time = "2025-08-27T11:37:53.23Z" },
+ { url = "https://files.pythonhosted.org/packages/3f/25/8320fc2591e45b750c3ae71fa596b47aefa802d07d6abaaa719034a85160/maturin-1.9.4-py3-none-win_arm64.whl", hash = "sha256:7a6f980a9b67a5c13c844c268eabd855b54a6a765df4b4bb07d15a990572a4c9", size = 6988277, upload-time = "2025-08-27T11:37:55.429Z" },
+]
+
+[[package]]
+name = "mdurl"
+version = "0.1.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" },
+]
+
+[[package]]
+name = "mypy"
+version = "1.19.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "librt" },
+ { name = "mypy-extensions" },
+ { name = "pathspec" },
+ { name = "tomli", marker = "python_full_version < '3.11'" },
+ { name = "typing-extensions" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/f9/b5/b58cdc25fadd424552804bf410855d52324183112aa004f0732c5f6324cf/mypy-1.19.0.tar.gz", hash = "sha256:f6b874ca77f733222641e5c46e4711648c4037ea13646fd0cdc814c2eaec2528", size = 3579025, upload-time = "2025-11-28T15:49:01.26Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/98/8f/55fb488c2b7dabd76e3f30c10f7ab0f6190c1fcbc3e97b1e588ec625bbe2/mypy-1.19.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6148ede033982a8c5ca1143de34c71836a09f105068aaa8b7d5edab2b053e6c8", size = 13093239, upload-time = "2025-11-28T15:45:11.342Z" },
+ { url = "https://files.pythonhosted.org/packages/72/1b/278beea978456c56b3262266274f335c3ba5ff2c8108b3b31bec1ffa4c1d/mypy-1.19.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a9ac09e52bb0f7fb912f5d2a783345c72441a08ef56ce3e17c1752af36340a39", size = 12156128, upload-time = "2025-11-28T15:46:02.566Z" },
+ { url = "https://files.pythonhosted.org/packages/21/f8/e06f951902e136ff74fd7a4dc4ef9d884faeb2f8eb9c49461235714f079f/mypy-1.19.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:11f7254c15ab3f8ed68f8e8f5cbe88757848df793e31c36aaa4d4f9783fd08ab", size = 12753508, upload-time = "2025-11-28T15:44:47.538Z" },
+ { url = "https://files.pythonhosted.org/packages/67/5a/d035c534ad86e09cee274d53cf0fd769c0b29ca6ed5b32e205be3c06878c/mypy-1.19.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:318ba74f75899b0e78b847d8c50821e4c9637c79d9a59680fc1259f29338cb3e", size = 13507553, upload-time = "2025-11-28T15:44:39.26Z" },
+ { url = "https://files.pythonhosted.org/packages/6a/17/c4a5498e00071ef29e483a01558b285d086825b61cf1fb2629fbdd019d94/mypy-1.19.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cf7d84f497f78b682edd407f14a7b6e1a2212b433eedb054e2081380b7395aa3", size = 13792898, upload-time = "2025-11-28T15:44:31.102Z" },
+ { url = "https://files.pythonhosted.org/packages/67/f6/bb542422b3ee4399ae1cdc463300d2d91515ab834c6233f2fd1d52fa21e0/mypy-1.19.0-cp310-cp310-win_amd64.whl", hash = "sha256:c3385246593ac2b97f155a0e9639be906e73534630f663747c71908dfbf26134", size = 10048835, upload-time = "2025-11-28T15:48:15.744Z" },
+ { url = "https://files.pythonhosted.org/packages/0f/d2/010fb171ae5ac4a01cc34fbacd7544531e5ace95c35ca166dd8fd1b901d0/mypy-1.19.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a31e4c28e8ddb042c84c5e977e28a21195d086aaffaf08b016b78e19c9ef8106", size = 13010563, upload-time = "2025-11-28T15:48:23.975Z" },
+ { url = "https://files.pythonhosted.org/packages/41/6b/63f095c9f1ce584fdeb595d663d49e0980c735a1d2004720ccec252c5d47/mypy-1.19.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:34ec1ac66d31644f194b7c163d7f8b8434f1b49719d403a5d26c87fff7e913f7", size = 12077037, upload-time = "2025-11-28T15:47:51.582Z" },
+ { url = "https://files.pythonhosted.org/packages/d7/83/6cb93d289038d809023ec20eb0b48bbb1d80af40511fa077da78af6ff7c7/mypy-1.19.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cb64b0ba5980466a0f3f9990d1c582bcab8db12e29815ecb57f1408d99b4bff7", size = 12680255, upload-time = "2025-11-28T15:46:57.628Z" },
+ { url = "https://files.pythonhosted.org/packages/99/db/d217815705987d2cbace2edd9100926196d6f85bcb9b5af05058d6e3c8ad/mypy-1.19.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:120cffe120cca5c23c03c77f84abc0c14c5d2e03736f6c312480020082f1994b", size = 13421472, upload-time = "2025-11-28T15:47:59.655Z" },
+ { url = "https://files.pythonhosted.org/packages/4e/51/d2beaca7c497944b07594f3f8aad8d2f0e8fc53677059848ae5d6f4d193e/mypy-1.19.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7a500ab5c444268a70565e374fc803972bfd1f09545b13418a5174e29883dab7", size = 13651823, upload-time = "2025-11-28T15:45:29.318Z" },
+ { url = "https://files.pythonhosted.org/packages/aa/d1/7883dcf7644db3b69490f37b51029e0870aac4a7ad34d09ceae709a3df44/mypy-1.19.0-cp311-cp311-win_amd64.whl", hash = "sha256:c14a98bc63fd867530e8ec82f217dae29d0550c86e70debc9667fff1ec83284e", size = 10049077, upload-time = "2025-11-28T15:45:39.818Z" },
+ { url = "https://files.pythonhosted.org/packages/11/7e/1afa8fb188b876abeaa14460dc4983f909aaacaa4bf5718c00b2c7e0b3d5/mypy-1.19.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0fb3115cb8fa7c5f887c8a8d81ccdcb94cff334684980d847e5a62e926910e1d", size = 13207728, upload-time = "2025-11-28T15:46:26.463Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/13/f103d04962bcbefb1644f5ccb235998b32c337d6c13145ea390b9da47f3e/mypy-1.19.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f3e19e3b897562276bb331074d64c076dbdd3e79213f36eed4e592272dabd760", size = 12202945, upload-time = "2025-11-28T15:48:49.143Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/93/a86a5608f74a22284a8ccea8592f6e270b61f95b8588951110ad797c2ddd/mypy-1.19.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b9d491295825182fba01b6ffe2c6fe4e5a49dbf4e2bb4d1217b6ced3b4797bc6", size = 12718673, upload-time = "2025-11-28T15:47:37.193Z" },
+ { url = "https://files.pythonhosted.org/packages/3d/58/cf08fff9ced0423b858f2a7495001fda28dc058136818ee9dffc31534ea9/mypy-1.19.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6016c52ab209919b46169651b362068f632efcd5eb8ef9d1735f6f86da7853b2", size = 13608336, upload-time = "2025-11-28T15:48:32.625Z" },
+ { url = "https://files.pythonhosted.org/packages/64/ed/9c509105c5a6d4b73bb08733102a3ea62c25bc02c51bca85e3134bf912d3/mypy-1.19.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f188dcf16483b3e59f9278c4ed939ec0254aa8a60e8fc100648d9ab5ee95a431", size = 13833174, upload-time = "2025-11-28T15:45:48.091Z" },
+ { url = "https://files.pythonhosted.org/packages/cd/71/01939b66e35c6f8cb3e6fdf0b657f0fd24de2f8ba5e523625c8e72328208/mypy-1.19.0-cp312-cp312-win_amd64.whl", hash = "sha256:0e3c3d1e1d62e678c339e7ade72746a9e0325de42cd2cccc51616c7b2ed1a018", size = 10112208, upload-time = "2025-11-28T15:46:41.702Z" },
+ { url = "https://files.pythonhosted.org/packages/cb/0d/a1357e6bb49e37ce26fcf7e3cc55679ce9f4ebee0cd8b6ee3a0e301a9210/mypy-1.19.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7686ed65dbabd24d20066f3115018d2dce030d8fa9db01aa9f0a59b6813e9f9e", size = 13191993, upload-time = "2025-11-28T15:47:22.336Z" },
+ { url = "https://files.pythonhosted.org/packages/5d/75/8e5d492a879ec4490e6ba664b5154e48c46c85b5ac9785792a5ec6a4d58f/mypy-1.19.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:fd4a985b2e32f23bead72e2fb4bbe5d6aceee176be471243bd831d5b2644672d", size = 12174411, upload-time = "2025-11-28T15:44:55.492Z" },
+ { url = "https://files.pythonhosted.org/packages/71/31/ad5dcee9bfe226e8eaba777e9d9d251c292650130f0450a280aec3485370/mypy-1.19.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fc51a5b864f73a3a182584b1ac75c404396a17eced54341629d8bdcb644a5bba", size = 12727751, upload-time = "2025-11-28T15:44:14.169Z" },
+ { url = "https://files.pythonhosted.org/packages/77/06/b6b8994ce07405f6039701f4b66e9d23f499d0b41c6dd46ec28f96d57ec3/mypy-1.19.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:37af5166f9475872034b56c5efdcf65ee25394e9e1d172907b84577120714364", size = 13593323, upload-time = "2025-11-28T15:46:34.699Z" },
+ { url = "https://files.pythonhosted.org/packages/68/b1/126e274484cccdf099a8e328d4fda1c7bdb98a5e888fa6010b00e1bbf330/mypy-1.19.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:510c014b722308c9bd377993bcbf9a07d7e0692e5fa8fc70e639c1eb19fc6bee", size = 13818032, upload-time = "2025-11-28T15:46:18.286Z" },
+ { url = "https://files.pythonhosted.org/packages/f8/56/53a8f70f562dfc466c766469133a8a4909f6c0012d83993143f2a9d48d2d/mypy-1.19.0-cp313-cp313-win_amd64.whl", hash = "sha256:cabbee74f29aa9cd3b444ec2f1e4fa5a9d0d746ce7567a6a609e224429781f53", size = 10120644, upload-time = "2025-11-28T15:47:43.99Z" },
+ { url = "https://files.pythonhosted.org/packages/b0/f4/7751f32f56916f7f8c229fe902cbdba3e4dd3f3ea9e8b872be97e7fc546d/mypy-1.19.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:f2e36bed3c6d9b5f35d28b63ca4b727cb0228e480826ffc8953d1892ddc8999d", size = 13185236, upload-time = "2025-11-28T15:45:20.696Z" },
+ { url = "https://files.pythonhosted.org/packages/35/31/871a9531f09e78e8d145032355890384f8a5b38c95a2c7732d226b93242e/mypy-1.19.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a18d8abdda14035c5718acb748faec09571432811af129bf0d9e7b2d6699bf18", size = 12213902, upload-time = "2025-11-28T15:46:10.117Z" },
+ { url = "https://files.pythonhosted.org/packages/58/b8/af221910dd40eeefa2077a59107e611550167b9994693fc5926a0b0f87c0/mypy-1.19.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f75e60aca3723a23511948539b0d7ed514dda194bc3755eae0bfc7a6b4887aa7", size = 12738600, upload-time = "2025-11-28T15:44:22.521Z" },
+ { url = "https://files.pythonhosted.org/packages/11/9f/c39e89a3e319c1d9c734dedec1183b2cc3aefbab066ec611619002abb932/mypy-1.19.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8f44f2ae3c58421ee05fe609160343c25f70e3967f6e32792b5a78006a9d850f", size = 13592639, upload-time = "2025-11-28T15:48:08.55Z" },
+ { url = "https://files.pythonhosted.org/packages/97/6d/ffaf5f01f5e284d9033de1267e6c1b8f3783f2cf784465378a86122e884b/mypy-1.19.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:63ea6a00e4bd6822adbfc75b02ab3653a17c02c4347f5bb0cf1d5b9df3a05835", size = 13799132, upload-time = "2025-11-28T15:47:06.032Z" },
+ { url = "https://files.pythonhosted.org/packages/fe/b0/c33921e73aaa0106224e5a34822411bea38046188eb781637f5a5b07e269/mypy-1.19.0-cp314-cp314-win_amd64.whl", hash = "sha256:3ad925b14a0bb99821ff6f734553294aa6a3440a8cb082fe1f5b84dfb662afb1", size = 10269832, upload-time = "2025-11-28T15:47:29.392Z" },
+ { url = "https://files.pythonhosted.org/packages/09/0e/fe228ed5aeab470c6f4eb82481837fadb642a5aa95cc8215fd2214822c10/mypy-1.19.0-py3-none-any.whl", hash = "sha256:0c01c99d626380752e527d5ce8e69ffbba2046eb8a060db0329690849cf9b6f9", size = 2469714, upload-time = "2025-11-28T15:45:33.22Z" },
+]
+
+[[package]]
+name = "mypy-extensions"
+version = "1.1.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" },
+]
+
+[[package]]
+name = "numpy"
+version = "2.2.6"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245, upload-time = "2025-05-17T21:27:58.555Z" },
+ { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", size = 14360048, upload-time = "2025-05-17T21:28:21.406Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", size = 5340542, upload-time = "2025-05-17T21:28:30.931Z" },
+ { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", size = 6878301, upload-time = "2025-05-17T21:28:41.613Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", size = 14297320, upload-time = "2025-05-17T21:29:02.78Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", size = 16801050, upload-time = "2025-05-17T21:29:27.675Z" },
+ { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", size = 15807034, upload-time = "2025-05-17T21:29:51.102Z" },
+ { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", size = 18614185, upload-time = "2025-05-17T21:30:18.703Z" },
+ { url = "https://files.pythonhosted.org/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", size = 6527149, upload-time = "2025-05-17T21:30:29.788Z" },
+ { url = "https://files.pythonhosted.org/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", size = 12904620, upload-time = "2025-05-17T21:30:48.994Z" },
+ { url = "https://files.pythonhosted.org/packages/da/a8/4f83e2aa666a9fbf56d6118faaaf5f1974d456b1823fda0a176eff722839/numpy-2.2.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f9f1adb22318e121c5c69a09142811a201ef17ab257a1e66ca3025065b7f53ae", size = 21176963, upload-time = "2025-05-17T21:31:19.36Z" },
+ { url = "https://files.pythonhosted.org/packages/b3/2b/64e1affc7972decb74c9e29e5649fac940514910960ba25cd9af4488b66c/numpy-2.2.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c820a93b0255bc360f53eca31a0e676fd1101f673dda8da93454a12e23fc5f7a", size = 14406743, upload-time = "2025-05-17T21:31:41.087Z" },
+ { url = "https://files.pythonhosted.org/packages/4a/9f/0121e375000b5e50ffdd8b25bf78d8e1a5aa4cca3f185d41265198c7b834/numpy-2.2.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3d70692235e759f260c3d837193090014aebdf026dfd167834bcba43e30c2a42", size = 5352616, upload-time = "2025-05-17T21:31:50.072Z" },
+ { url = "https://files.pythonhosted.org/packages/31/0d/b48c405c91693635fbe2dcd7bc84a33a602add5f63286e024d3b6741411c/numpy-2.2.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:481b49095335f8eed42e39e8041327c05b0f6f4780488f61286ed3c01368d491", size = 6889579, upload-time = "2025-05-17T21:32:01.712Z" },
+ { url = "https://files.pythonhosted.org/packages/52/b8/7f0554d49b565d0171eab6e99001846882000883998e7b7d9f0d98b1f934/numpy-2.2.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b64d8d4d17135e00c8e346e0a738deb17e754230d7e0810ac5012750bbd85a5a", size = 14312005, upload-time = "2025-05-17T21:32:23.332Z" },
+ { url = "https://files.pythonhosted.org/packages/b3/dd/2238b898e51bd6d389b7389ffb20d7f4c10066d80351187ec8e303a5a475/numpy-2.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf", size = 16821570, upload-time = "2025-05-17T21:32:47.991Z" },
+ { url = "https://files.pythonhosted.org/packages/83/6c/44d0325722cf644f191042bf47eedad61c1e6df2432ed65cbe28509d404e/numpy-2.2.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bd48227a919f1bafbdda0583705e547892342c26fb127219d60a5c36882609d1", size = 15818548, upload-time = "2025-05-17T21:33:11.728Z" },
+ { url = "https://files.pythonhosted.org/packages/ae/9d/81e8216030ce66be25279098789b665d49ff19eef08bfa8cb96d4957f422/numpy-2.2.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9551a499bf125c1d4f9e250377c1ee2eddd02e01eac6644c080162c0c51778ab", size = 18620521, upload-time = "2025-05-17T21:33:39.139Z" },
+ { url = "https://files.pythonhosted.org/packages/6a/fd/e19617b9530b031db51b0926eed5345ce8ddc669bb3bc0044b23e275ebe8/numpy-2.2.6-cp311-cp311-win32.whl", hash = "sha256:0678000bb9ac1475cd454c6b8c799206af8107e310843532b04d49649c717a47", size = 6525866, upload-time = "2025-05-17T21:33:50.273Z" },
+ { url = "https://files.pythonhosted.org/packages/31/0a/f354fb7176b81747d870f7991dc763e157a934c717b67b58456bc63da3df/numpy-2.2.6-cp311-cp311-win_amd64.whl", hash = "sha256:e8213002e427c69c45a52bbd94163084025f533a55a59d6f9c5b820774ef3303", size = 12907455, upload-time = "2025-05-17T21:34:09.135Z" },
+ { url = "https://files.pythonhosted.org/packages/82/5d/c00588b6cf18e1da539b45d3598d3557084990dcc4331960c15ee776ee41/numpy-2.2.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff", size = 20875348, upload-time = "2025-05-17T21:34:39.648Z" },
+ { url = "https://files.pythonhosted.org/packages/66/ee/560deadcdde6c2f90200450d5938f63a34b37e27ebff162810f716f6a230/numpy-2.2.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c", size = 14119362, upload-time = "2025-05-17T21:35:01.241Z" },
+ { url = "https://files.pythonhosted.org/packages/3c/65/4baa99f1c53b30adf0acd9a5519078871ddde8d2339dc5a7fde80d9d87da/numpy-2.2.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3", size = 5084103, upload-time = "2025-05-17T21:35:10.622Z" },
+ { url = "https://files.pythonhosted.org/packages/cc/89/e5a34c071a0570cc40c9a54eb472d113eea6d002e9ae12bb3a8407fb912e/numpy-2.2.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282", size = 6625382, upload-time = "2025-05-17T21:35:21.414Z" },
+ { url = "https://files.pythonhosted.org/packages/f8/35/8c80729f1ff76b3921d5c9487c7ac3de9b2a103b1cd05e905b3090513510/numpy-2.2.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87", size = 14018462, upload-time = "2025-05-17T21:35:42.174Z" },
+ { url = "https://files.pythonhosted.org/packages/8c/3d/1e1db36cfd41f895d266b103df00ca5b3cbe965184df824dec5c08c6b803/numpy-2.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249", size = 16527618, upload-time = "2025-05-17T21:36:06.711Z" },
+ { url = "https://files.pythonhosted.org/packages/61/c6/03ed30992602c85aa3cd95b9070a514f8b3c33e31124694438d88809ae36/numpy-2.2.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49", size = 15505511, upload-time = "2025-05-17T21:36:29.965Z" },
+ { url = "https://files.pythonhosted.org/packages/b7/25/5761d832a81df431e260719ec45de696414266613c9ee268394dd5ad8236/numpy-2.2.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de", size = 18313783, upload-time = "2025-05-17T21:36:56.883Z" },
+ { url = "https://files.pythonhosted.org/packages/57/0a/72d5a3527c5ebffcd47bde9162c39fae1f90138c961e5296491ce778e682/numpy-2.2.6-cp312-cp312-win32.whl", hash = "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4", size = 6246506, upload-time = "2025-05-17T21:37:07.368Z" },
+ { url = "https://files.pythonhosted.org/packages/36/fa/8c9210162ca1b88529ab76b41ba02d433fd54fecaf6feb70ef9f124683f1/numpy-2.2.6-cp312-cp312-win_amd64.whl", hash = "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2", size = 12614190, upload-time = "2025-05-17T21:37:26.213Z" },
+ { url = "https://files.pythonhosted.org/packages/f9/5c/6657823f4f594f72b5471f1db1ab12e26e890bb2e41897522d134d2a3e81/numpy-2.2.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84", size = 20867828, upload-time = "2025-05-17T21:37:56.699Z" },
+ { url = "https://files.pythonhosted.org/packages/dc/9e/14520dc3dadf3c803473bd07e9b2bd1b69bc583cb2497b47000fed2fa92f/numpy-2.2.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b", size = 14143006, upload-time = "2025-05-17T21:38:18.291Z" },
+ { url = "https://files.pythonhosted.org/packages/4f/06/7e96c57d90bebdce9918412087fc22ca9851cceaf5567a45c1f404480e9e/numpy-2.2.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d", size = 5076765, upload-time = "2025-05-17T21:38:27.319Z" },
+ { url = "https://files.pythonhosted.org/packages/73/ed/63d920c23b4289fdac96ddbdd6132e9427790977d5457cd132f18e76eae0/numpy-2.2.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566", size = 6617736, upload-time = "2025-05-17T21:38:38.141Z" },
+ { url = "https://files.pythonhosted.org/packages/85/c5/e19c8f99d83fd377ec8c7e0cf627a8049746da54afc24ef0a0cb73d5dfb5/numpy-2.2.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f", size = 14010719, upload-time = "2025-05-17T21:38:58.433Z" },
+ { url = "https://files.pythonhosted.org/packages/19/49/4df9123aafa7b539317bf6d342cb6d227e49f7a35b99c287a6109b13dd93/numpy-2.2.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f", size = 16526072, upload-time = "2025-05-17T21:39:22.638Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/6c/04b5f47f4f32f7c2b0e7260442a8cbcf8168b0e1a41ff1495da42f42a14f/numpy-2.2.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868", size = 15503213, upload-time = "2025-05-17T21:39:45.865Z" },
+ { url = "https://files.pythonhosted.org/packages/17/0a/5cd92e352c1307640d5b6fec1b2ffb06cd0dabe7d7b8227f97933d378422/numpy-2.2.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d", size = 18316632, upload-time = "2025-05-17T21:40:13.331Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/3b/5cba2b1d88760ef86596ad0f3d484b1cbff7c115ae2429678465057c5155/numpy-2.2.6-cp313-cp313-win32.whl", hash = "sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd", size = 6244532, upload-time = "2025-05-17T21:43:46.099Z" },
+ { url = "https://files.pythonhosted.org/packages/cb/3b/d58c12eafcb298d4e6d0d40216866ab15f59e55d148a5658bb3132311fcf/numpy-2.2.6-cp313-cp313-win_amd64.whl", hash = "sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c", size = 12610885, upload-time = "2025-05-17T21:44:05.145Z" },
+ { url = "https://files.pythonhosted.org/packages/6b/9e/4bf918b818e516322db999ac25d00c75788ddfd2d2ade4fa66f1f38097e1/numpy-2.2.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6", size = 20963467, upload-time = "2025-05-17T21:40:44Z" },
+ { url = "https://files.pythonhosted.org/packages/61/66/d2de6b291507517ff2e438e13ff7b1e2cdbdb7cb40b3ed475377aece69f9/numpy-2.2.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda", size = 14225144, upload-time = "2025-05-17T21:41:05.695Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/25/480387655407ead912e28ba3a820bc69af9adf13bcbe40b299d454ec011f/numpy-2.2.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40", size = 5200217, upload-time = "2025-05-17T21:41:15.903Z" },
+ { url = "https://files.pythonhosted.org/packages/aa/4a/6e313b5108f53dcbf3aca0c0f3e9c92f4c10ce57a0a721851f9785872895/numpy-2.2.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8", size = 6712014, upload-time = "2025-05-17T21:41:27.321Z" },
+ { url = "https://files.pythonhosted.org/packages/b7/30/172c2d5c4be71fdf476e9de553443cf8e25feddbe185e0bd88b096915bcc/numpy-2.2.6-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f", size = 14077935, upload-time = "2025-05-17T21:41:49.738Z" },
+ { url = "https://files.pythonhosted.org/packages/12/fb/9e743f8d4e4d3c710902cf87af3512082ae3d43b945d5d16563f26ec251d/numpy-2.2.6-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa", size = 16600122, upload-time = "2025-05-17T21:42:14.046Z" },
+ { url = "https://files.pythonhosted.org/packages/12/75/ee20da0e58d3a66f204f38916757e01e33a9737d0b22373b3eb5a27358f9/numpy-2.2.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571", size = 15586143, upload-time = "2025-05-17T21:42:37.464Z" },
+ { url = "https://files.pythonhosted.org/packages/76/95/bef5b37f29fc5e739947e9ce5179ad402875633308504a52d188302319c8/numpy-2.2.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1", size = 18385260, upload-time = "2025-05-17T21:43:05.189Z" },
+ { url = "https://files.pythonhosted.org/packages/09/04/f2f83279d287407cf36a7a8053a5abe7be3622a4363337338f2585e4afda/numpy-2.2.6-cp313-cp313t-win32.whl", hash = "sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff", size = 6377225, upload-time = "2025-05-17T21:43:16.254Z" },
+ { url = "https://files.pythonhosted.org/packages/67/0e/35082d13c09c02c011cf21570543d202ad929d961c02a147493cb0c2bdf5/numpy-2.2.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06", size = 12771374, upload-time = "2025-05-17T21:43:35.479Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391, upload-time = "2025-05-17T21:44:35.948Z" },
+ { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754, upload-time = "2025-05-17T21:44:47.446Z" },
+ { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476, upload-time = "2025-05-17T21:45:11.871Z" },
+ { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666, upload-time = "2025-05-17T21:45:31.426Z" },
+]
+
+[[package]]
+name = "opentelemetry-api"
+version = "1.25.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "deprecated" },
+ { name = "importlib-metadata" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/df/0d/10357006dc10fc65f7c7b46c18232e466e355f9e606ac461cfc7193b4cbe/opentelemetry_api-1.25.0.tar.gz", hash = "sha256:77c4985f62f2614e42ce77ee4c9da5fa5f0bc1e1821085e9a47533a9323ae869", size = 60383, upload-time = "2024-05-31T01:40:38.766Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/7e/b2/4bc5e52c9a23df0ac17dbb23923e609a8269cd67000a712b4f5bcfae1490/opentelemetry_api-1.25.0-py3-none-any.whl", hash = "sha256:757fa1aa020a0f8fa139f8959e53dec2051cc26b832e76fa839a6d76ecefd737", size = 59910, upload-time = "2024-05-31T01:40:00.911Z" },
+]
+
+[[package]]
+name = "opentelemetry-sdk"
+version = "1.25.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "opentelemetry-api" },
+ { name = "opentelemetry-semantic-conventions" },
+ { name = "typing-extensions" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/05/3c/77076b77f1d73141adc119f62370ec9456ef314ba0b4e7072e3775c36ef7/opentelemetry_sdk-1.25.0.tar.gz", hash = "sha256:ce7fc319c57707ef5bf8b74fb9f8ebdb8bfafbe11898410e0d2a761d08a98ec7", size = 141042, upload-time = "2024-05-31T01:40:53.73Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ae/b2/729a959a8aa032bce246c791f977161099ab60fb0188408ccec1bf283b00/opentelemetry_sdk-1.25.0-py3-none-any.whl", hash = "sha256:d97ff7ec4b351692e9d5a15af570c693b8715ad78b8aafbec5c7100fe966b4c9", size = 107028, upload-time = "2024-05-31T01:40:33.281Z" },
+]
+
+[[package]]
+name = "opentelemetry-semantic-conventions"
+version = "0.46b0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "opentelemetry-api" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/4e/ea/a4a5277247b3d2ed2e23a58b0d509c2eafa4ebb56038ba5b23c0f9ea6242/opentelemetry_semantic_conventions-0.46b0.tar.gz", hash = "sha256:fbc982ecbb6a6e90869b15c1673be90bd18c8a56ff1cffc0864e38e2edffaefa", size = 80198, upload-time = "2024-05-31T01:40:54.722Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/fd/41/28dae1ec1fe0151373f06bd06d9170ca14b52d5b3a6c2dc55f85bc219619/opentelemetry_semantic_conventions-0.46b0-py3-none-any.whl", hash = "sha256:6daef4ef9fa51d51855d9f8e0ccd3a1bd59e0e545abe99ac6203804e36ab3e07", size = 130549, upload-time = "2024-05-31T01:40:35.348Z" },
+]
+
+[[package]]
+name = "packaging"
+version = "25.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" },
+]
+
+[[package]]
+name = "pathspec"
+version = "0.12.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043, upload-time = "2023-12-10T22:30:45Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload-time = "2023-12-10T22:30:43.14Z" },
+]
+
+[[package]]
+name = "pdoc"
+version = "16.0.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "jinja2" },
+ { name = "markdown2" },
+ { name = "markupsafe" },
+ { name = "pygments" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/ac/fe/ab3f34a5fb08c6b698439a2c2643caf8fef0d61a86dd3fdcd5501c670ab8/pdoc-16.0.0.tar.gz", hash = "sha256:fdadc40cc717ec53919e3cd720390d4e3bcd40405cb51c4918c119447f913514", size = 111890, upload-time = "2025-10-27T16:02:16.345Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/16/a1/56a17b7f9e18c2bb8df73f3833345d97083b344708b97bab148fdd7e0b82/pdoc-16.0.0-py3-none-any.whl", hash = "sha256:070b51de2743b9b1a4e0ab193a06c9e6c12cf4151cf9137656eebb16e8556628", size = 100014, upload-time = "2025-10-27T16:02:15.007Z" },
+]
+
+[[package]]
+name = "platformdirs"
+version = "4.5.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/cf/86/0248f086a84f01b37aaec0fa567b397df1a119f73c16f6c7a9aac73ea309/platformdirs-4.5.1.tar.gz", hash = "sha256:61d5cdcc6065745cdd94f0f878977f8de9437be93de97c1c12f853c9c0cdcbda", size = 21715, upload-time = "2025-12-05T13:52:58.638Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl", hash = "sha256:d03afa3963c806a9bed9d5125c8f4cb2fdaf74a55ab60e5d59b3fde758104d31", size = 18731, upload-time = "2025-12-05T13:52:56.823Z" },
+]
+
+[[package]]
+name = "pluggy"
+version = "1.6.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" },
+]
+
+[[package]]
+name = "pprintpp"
+version = "0.4.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/06/1a/7737e7a0774da3c3824d654993cf57adc915cb04660212f03406334d8c0b/pprintpp-0.4.0.tar.gz", hash = "sha256:ea826108e2c7f49dc6d66c752973c3fc9749142a798d6b254e1e301cfdbc6403", size = 17995, upload-time = "2018-07-01T01:42:34.87Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/4e/d1/e4ed95fdd3ef13b78630280d9e9e240aeb65cc7c544ec57106149c3942fb/pprintpp-0.4.0-py2.py3-none-any.whl", hash = "sha256:b6b4dcdd0c0c0d75e4d7b2f21a9e933e5b2ce62b26e1a54537f9651ae5a5c01d", size = 16952, upload-time = "2018-07-01T01:42:36.496Z" },
+]
+
+[[package]]
+name = "pygments"
+version = "2.19.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" },
+]
+
+[[package]]
+name = "pyo3-linter"
+version = "0.0.1"
+source = { git = "https://github.com/rigetti/rigetti-pyo3.git?subdirectory=pyo3_linter&branch=feat-pyo3-linter#4accd2d014bedff302d56087cc42e8e8690e2ae0" }
+
+[[package]]
+name = "pytest"
+version = "9.0.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+ { name = "exceptiongroup", marker = "python_full_version < '3.11'" },
+ { name = "iniconfig" },
+ { name = "packaging" },
+ { name = "pluggy" },
+ { name = "pygments" },
+ { name = "tomli", marker = "python_full_version < '3.11'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/07/56/f013048ac4bc4c1d9be45afd4ab209ea62822fb1598f40687e6bf45dcea4/pytest-9.0.1.tar.gz", hash = "sha256:3e9c069ea73583e255c3b21cf46b8d3c56f6e3a1a8f6da94ccb0fcf57b9d73c8", size = 1564125, upload-time = "2025-11-12T13:05:09.333Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/0b/8b/6300fb80f858cda1c51ffa17075df5d846757081d11ab4aa35cef9e6258b/pytest-9.0.1-py3-none-any.whl", hash = "sha256:67be0030d194df2dfa7b556f2e56fb3c3315bd5c8822c6951162b92b32ce7dad", size = 373668, upload-time = "2025-11-12T13:05:07.379Z" },
+]
+
+[[package]]
+name = "pytest-asyncio"
+version = "1.3.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "backports-asyncio-runner", marker = "python_full_version < '3.11'" },
+ { name = "pytest" },
+ { name = "typing-extensions", marker = "python_full_version < '3.13'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/90/2c/8af215c0f776415f3590cac4f9086ccefd6fd463befeae41cd4d3f193e5a/pytest_asyncio-1.3.0.tar.gz", hash = "sha256:d7f52f36d231b80ee124cd216ffb19369aa168fc10095013c6b014a34d3ee9e5", size = 50087, upload-time = "2025-11-10T16:07:47.256Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e5/35/f8b19922b6a25bc0880171a2f1a003eaeb93657475193ab516fd87cac9da/pytest_asyncio-1.3.0-py3-none-any.whl", hash = "sha256:611e26147c7f77640e6d0a92a38ed17c3e9848063698d5c93d5aa7aa11cebff5", size = 15075, upload-time = "2025-11-10T16:07:45.537Z" },
+]
+
+[[package]]
+name = "pytest-clarity"
+version = "1.0.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pprintpp" },
+ { name = "pytest" },
+ { name = "rich" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/52/5c/cafa97944de55738a6a2c5a7cee00d073cb80495032d2b112c4546525eca/pytest-clarity-1.0.1.tar.gz", hash = "sha256:505fe345fad4fe11c6a4187fe683f2c7c52c077caa1e135f3e483fe112db7772", size = 4891, upload-time = "2021-06-11T18:16:18.372Z" }
+
+[[package]]
+name = "pytest-mock"
+version = "3.15.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pytest" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/68/14/eb014d26be205d38ad5ad20d9a80f7d201472e08167f0bb4361e251084a9/pytest_mock-3.15.1.tar.gz", hash = "sha256:1849a238f6f396da19762269de72cb1814ab44416fa73a8686deac10b0d87a0f", size = 34036, upload-time = "2025-09-16T16:37:27.081Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/5a/cc/06253936f4a7fa2e0f48dfe6d851d9c56df896a9ab09ac019d70b760619c/pytest_mock-3.15.1-py3-none-any.whl", hash = "sha256:0a25e2eb88fe5168d535041d09a4529a188176ae608a6d249ee65abc0949630d", size = 10095, upload-time = "2025-09-16T16:37:25.734Z" },
+]
+
+[[package]]
+name = "pytest-sugar"
+version = "1.1.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pytest" },
+ { name = "termcolor" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/0b/4e/60fed105549297ba1a700e1ea7b828044842ea27d72c898990510b79b0e2/pytest-sugar-1.1.1.tar.gz", hash = "sha256:73b8b65163ebf10f9f671efab9eed3d56f20d2ca68bda83fa64740a92c08f65d", size = 16533, upload-time = "2025-08-23T12:19:35.737Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/87/d5/81d38a91c1fdafb6711f053f5a9b92ff788013b19821257c2c38c1e132df/pytest_sugar-1.1.1-py3-none-any.whl", hash = "sha256:2f8319b907548d5b9d03a171515c1d43d2e38e32bd8182a1781eb20b43344cc8", size = 11440, upload-time = "2025-08-23T12:19:34.894Z" },
+]
+
+[[package]]
+name = "pytokens"
+version = "0.3.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/4e/8d/a762be14dae1c3bf280202ba3172020b2b0b4c537f94427435f19c413b72/pytokens-0.3.0.tar.gz", hash = "sha256:2f932b14ed08de5fcf0b391ace2642f858f1394c0857202959000b68ed7a458a", size = 17644, upload-time = "2025-11-05T13:36:35.34Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/84/25/d9db8be44e205a124f6c98bc0324b2bb149b7431c53877fc6d1038dddaf5/pytokens-0.3.0-py3-none-any.whl", hash = "sha256:95b2b5eaf832e469d141a378872480ede3f251a5a5041b8ec6e581d3ac71bbf3", size = 12195, upload-time = "2025-11-05T13:36:33.183Z" },
+]
+
+[[package]]
+name = "qcs-api-client-common"
+version = "0.19.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "grpc-interceptor" },
+ { name = "grpcio" },
+ { name = "httpx" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/e6/08/3c9d79adf26c16b1e9c2db933cb414aa43c214fcf66eddf4c3a0c3e14259/qcs_api_client_common-0.19.1.tar.gz", hash = "sha256:7114960ad5fe9104a32b99b426db6a96f9a826c872b9919477fda74580e89e87", size = 113299, upload-time = "2026-08-14T23:14:41.596Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9a/11/0f2166ecdea8be4e2aae4a210320cf5a56d217044ac049f10365701a7dbd/qcs_api_client_common-0.19.1-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:23b162e64bdf3266b8b57364227f2cec56409c9296931f49f0665fa191a13f36", size = 8852545, upload-time = "2026-08-14T23:14:08.47Z" },
+ { url = "https://files.pythonhosted.org/packages/2d/89/babe00e86cffad378ca8a72a6bfad8d12f6755534e9360db482d710f0e13/qcs_api_client_common-0.19.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:176f5ee07cd13bafae2ab3e0dc376e10aa5399933e55b1ac304a893dbb6226c6", size = 4875865, upload-time = "2026-08-14T23:14:11.042Z" },
+ { url = "https://files.pythonhosted.org/packages/3f/f8/4b457fc06058b008e5624526a38a4d09a5b44d0ea75209d40c7d6717178b/qcs_api_client_common-0.19.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:c7e485a55ca619db811918f41c60e0bca75edb5c246a95553a5d63bd72e7ea06", size = 4893373, upload-time = "2026-08-14T23:14:13.188Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/e6/21aadcdcee80025f354ca19520b09b4acbf12942510d09b3f9e250d2920f/qcs_api_client_common-0.19.1-cp310-cp310-win_amd64.whl", hash = "sha256:e244360ac110d0744c37c3656ba070a19ae8f670b1d3d9843d08bad18fdeef63", size = 3934912, upload-time = "2026-08-14T23:14:15.08Z" },
+ { url = "https://files.pythonhosted.org/packages/6e/cd/96ae79ddea104d2b4090a5c2f6581292bbc878f48cec0db01fd9856a2d83/qcs_api_client_common-0.19.1-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:9a68a0331ff17caaf3f2b84f55a4f0944b7ec7f91a0a9c767fbb4a7e840f7207", size = 8848943, upload-time = "2026-08-14T23:14:17.39Z" },
+ { url = "https://files.pythonhosted.org/packages/94/25/3ac25b5feb901fff79f618aff7b6d7318f5951e15c144d513213a87e1feb/qcs_api_client_common-0.19.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:d12caab87ce3d96d3b93894a201a833f618379c178666a3d33f65091c6e14bf3", size = 4874818, upload-time = "2026-08-14T23:14:20.111Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/b7/d2aa051859b639eb09e2468fcd49cf62321dbb40d295ef0eb2c7e284ac5e/qcs_api_client_common-0.19.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:85dbf3762c4b9e5befedf75430c518f1bb6452b770139c80dd431b535d7f8c58", size = 4891199, upload-time = "2026-08-14T23:14:22.077Z" },
+ { url = "https://files.pythonhosted.org/packages/a4/16/e962c769d6c04b5741a71941583d1ba46221af531c402747a26a8dcbef35/qcs_api_client_common-0.19.1-cp311-cp311-win_amd64.whl", hash = "sha256:0d143b45d3b0c24d124a9472f996846188950d609993a2a3ca329d5690d8cf7d", size = 3934355, upload-time = "2026-08-14T23:14:23.945Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/14/bfa93a3ee67c0c5d7060a3ac71bb52a61bd6f93a2b9c43f5839d3ad35b1d/qcs_api_client_common-0.19.1-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:e26c8e88e362b938192920b0fb16c6c956d150c658b0d0e4a223112f83b21471", size = 8841559, upload-time = "2026-08-14T23:14:26.245Z" },
+ { url = "https://files.pythonhosted.org/packages/a7/82/3394bed3a56d3224e70c26398712145da634cd1679780ad74e71ee42d6ed/qcs_api_client_common-0.19.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:bb0600eeb0e8d13b2f085839a3f3f123e597c1d30ddfe948429f448c2c739664", size = 4868953, upload-time = "2026-08-14T23:14:28.33Z" },
+ { url = "https://files.pythonhosted.org/packages/46/be/9e880f3a3f37dbd0275c1588c99f929e6cc2ad9fda503890c07e657ecbd8/qcs_api_client_common-0.19.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:d81d5fc6c0389eb955fda6b4e849d67d86372c86022994e91730d66c6f369208", size = 4887973, upload-time = "2026-08-14T23:14:30.205Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/b2/9776ba8a4533fb185e797a678c23979f27d4da4e6942ebd28115d63ba2aa/qcs_api_client_common-0.19.1-cp312-cp312-win_amd64.whl", hash = "sha256:c27e8d3c76dafd903f39fc213a2f9943bbcc7110c0650c99539c6e824d40c4e0", size = 3929567, upload-time = "2026-08-14T23:14:32.264Z" },
+ { url = "https://files.pythonhosted.org/packages/93/0b/534c0171ea56701bebea745f297f5e203f954183622100a6ec6dea4c8f85/qcs_api_client_common-0.19.1-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:5b43ab376fee184d5d97e1727c6632cf3db1cb371d718e2fc60e6e34f0d19ca9", size = 8843557, upload-time = "2026-08-14T23:14:34.157Z" },
+ { url = "https://files.pythonhosted.org/packages/16/aa/c93ab83a1891a4f44ad20b8b1b4f8faa14b63fb0382de81aa73a6115eba5/qcs_api_client_common-0.19.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:6cf801def8011f78a29d2cbe57f42c00f20dc702e844147f559fdeefc70b4f8d", size = 4868490, upload-time = "2026-08-14T23:14:36.455Z" },
+ { url = "https://files.pythonhosted.org/packages/c8/e2/7d292a26a2a8074226a774ccdfab75378c9473399df7b1f1b4e36ecb5a86/qcs_api_client_common-0.19.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:cc93f4cd84c7e7dd533eef7d55a3b22238cc10de273ca95ee9be4bc87e7d2e67", size = 4887562, upload-time = "2026-08-14T23:14:38.249Z" },
+ { url = "https://files.pythonhosted.org/packages/8a/08/14521d08f8f99a8f114971226a72254c4c012a854a14f43f5340134ff9f2/qcs_api_client_common-0.19.1-cp313-cp313-win_amd64.whl", hash = "sha256:5f2472c05cdade74c900c70f4c4feabf923d8aef1fed72d4a055303e8660e5d6", size = 3929429, upload-time = "2026-08-14T23:14:40.055Z" },
+]
+
+[[package]]
+name = "qcs-sdk-python"
+version = "0.26.3"
+source = { virtual = "." }
+dependencies = [
+ { name = "qcs-api-client-common" },
+ { name = "quil" },
+]
+
+[package.dev-dependencies]
+dev = [
+ { name = "black" },
+ { name = "griffe" },
+ { name = "maturin" },
+ { name = "mypy" },
+ { name = "numpy" },
+ { name = "opentelemetry-sdk" },
+ { name = "pdoc" },
+ { name = "pyo3-linter" },
+ { name = "pytest" },
+ { name = "pytest-asyncio" },
+ { name = "pytest-clarity" },
+ { name = "pytest-mock" },
+ { name = "pytest-sugar" },
+ { name = "ruff" },
+ { name = "syrupy" },
+]
+
+[package.metadata]
+requires-dist = [
+ { name = "qcs-api-client-common", specifier = ">=0.19.0,<0.20.0" },
+ { name = "quil", specifier = ">=0.37.1,<0.38.0" },
+]
+
+[package.metadata.requires-dev]
+dev = [
+ { name = "black", specifier = ">=24.8.0" },
+ { name = "griffe", specifier = ">=1.14.0,<2" },
+ { name = "maturin", specifier = ">=1.9.4" },
+ { name = "mypy", specifier = ">=1.14.1" },
+ { name = "numpy", specifier = ">=1.24.1" },
+ { name = "opentelemetry-sdk", specifier = "==1.25.0" },
+ { name = "pdoc", specifier = ">=16.0.0" },
+ { name = "pyo3-linter", git = "https://github.com/rigetti/rigetti-pyo3.git?subdirectory=pyo3_linter&branch=feat-pyo3-linter" },
+ { name = "pytest", specifier = ">=8.1.1" },
+ { name = "pytest-asyncio", specifier = ">=0.23.6" },
+ { name = "pytest-clarity", specifier = ">=1.0.1" },
+ { name = "pytest-mock", specifier = ">=3.14.0" },
+ { name = "pytest-sugar", specifier = ">=1.0.0" },
+ { name = "ruff", specifier = ">=0.3.5" },
+ { name = "syrupy", specifier = ">=4.0.0" },
+]
+
+[[package]]
+name = "quil"
+version = "0.37.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "numpy" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/bb/a8/632f13756ae9fe7431eb17390ae61eb99280421164fa29562aa4e891d4cf/quil-0.37.1.tar.gz", hash = "sha256:a86feea4f2a7fac4068ce37cc2c89948ac773fbdf2db86905a5d45d8ca7dd60b", size = 491319, upload-time = "2026-08-17T22:56:37.166Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/07/01/93a609c9a018b48200f1f50b975eedab9996343ff7e5d5d90f9dd718382c/quil-0.37.1-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:f814c9d349b9bc543dbfcbef0308b0af61043f6c33dd5f3789e843b1f0acb0a5", size = 3852264, upload-time = "2026-08-17T22:56:09.049Z" },
+ { url = "https://files.pythonhosted.org/packages/15/58/1eb8d5419aade81bf80eee2173ed261c81cf80e8425f8f8ca93303fa2bf4/quil-0.37.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c250e9fc20a8b607d0e6fc5fcf9fbe5ac0182f7573a257a1b150de82e686148", size = 2040184, upload-time = "2026-08-17T22:56:10.794Z" },
+ { url = "https://files.pythonhosted.org/packages/cd/7c/1873c6cac23647cda83f2cbfdf4bca92be184a3312ae4d7e0ae34912977f/quil-0.37.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:331e4078eff3c1e5f1048126905c10cdb3997bd54544775d2f2a85b03642e523", size = 2236449, upload-time = "2026-08-17T22:56:12.064Z" },
+ { url = "https://files.pythonhosted.org/packages/d3/1b/89ca4bb448790c565433f1df600615c9057b63e68e6784357c76f4cbe1c0/quil-0.37.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6414df52145be1960f7cc201b20fddd0d79076a1f082fd49580db2030a10e749", size = 2093368, upload-time = "2026-08-17T22:56:13.345Z" },
+ { url = "https://files.pythonhosted.org/packages/cd/ea/e91f621fc191dab9ecc4734d1619c8f87a50323c91d3adb285f08ab74dd9/quil-0.37.1-cp310-cp310-win_amd64.whl", hash = "sha256:12a5e8272f8ca7b415f5e962605455731fafb71a9ee6786448104df1ac6757d1", size = 1947278, upload-time = "2026-08-17T22:56:14.561Z" },
+ { url = "https://files.pythonhosted.org/packages/54/7c/92acf422785540ce26144ebba16f5537b1824f25f027975ffd746226935b/quil-0.37.1-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:d70c18b4c19e0b3a02fb053320912c9912bd45325e53e35aba829bc9585d3c9f", size = 3852406, upload-time = "2026-08-17T22:56:16.158Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/01/0d686ae2a211b1e76a247f686e95276d3afebac5d010f96b10ed938ce7a8/quil-0.37.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d35773c9b3b5588c42caa6b495b59197546bfafa5d8902847cc2d8ccbe12a53", size = 2039650, upload-time = "2026-08-17T22:56:17.438Z" },
+ { url = "https://files.pythonhosted.org/packages/76/b5/3c6b082d8cb0c94a42d9436be0e3ca9dbb4939940b158483c5cafb0e487d/quil-0.37.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8569452d1337c6ec2198fd7fd41801cfcb40a9daf586b15a87b932c6f5d60b42", size = 2236365, upload-time = "2026-08-17T22:56:18.775Z" },
+ { url = "https://files.pythonhosted.org/packages/85/76/235b9e72202a8d34a75bc29692c76c0098bee74b0c1418069282fc0acf5a/quil-0.37.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c5794e713cb1285d034233c854124c1bdd5e17f85d6c6ef7413e0f288bcae4ed", size = 2092996, upload-time = "2026-08-17T22:56:20.587Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/2b/ffbaa779ee1be3fab5ca3bac324e19d3ca15d75570cd7e2b856ca47cc072/quil-0.37.1-cp311-cp311-win_amd64.whl", hash = "sha256:de000b97a80ec4a54a54ccdb4107cd0fd1d064ada98e57cea1046d2c1f8712d0", size = 1947526, upload-time = "2026-08-17T22:56:22.065Z" },
+ { url = "https://files.pythonhosted.org/packages/d1/da/fef69b4182ac81944809226601f5996794cb21c9ebf5514a81f1f4284943/quil-0.37.1-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:09e305358c58c0adee7b8de824a2a83da7c6264c4d4f42d4fe8971a56d2139cc", size = 3885635, upload-time = "2026-08-17T22:56:23.363Z" },
+ { url = "https://files.pythonhosted.org/packages/f3/fb/c94af6a6268d7ac03b44c5e23d00bf6740677537757486f426169fac38fe/quil-0.37.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dac96d2af093a28e147ecaf9ddf0e3bedff6ecf11933d75f727f42d80e20f000", size = 2033515, upload-time = "2026-08-17T22:56:24.603Z" },
+ { url = "https://files.pythonhosted.org/packages/4c/29/91f7f932c5880c9c3f166f8bfb8ab66fbc11454d62aa5d829dc5be944033/quil-0.37.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:623bfa85d5d5edbf3329e0a335d53caf3891950ae4263a55628a71471f9adf6c", size = 2223674, upload-time = "2026-08-17T22:56:25.989Z" },
+ { url = "https://files.pythonhosted.org/packages/30/cf/6067026ea21db0f96d70909e88969cc3e30124c80ca20faf99067ed7a5b1/quil-0.37.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e7db024b3e80cab3fb80452fe8e7ce21017268761d70f64db6391b31de7d4b9", size = 2087365, upload-time = "2026-08-17T22:56:27.235Z" },
+ { url = "https://files.pythonhosted.org/packages/9f/b5/2ae0d601694dc557a1ec47df0a481478cc9059e8ff27f2d7450cad217d2d/quil-0.37.1-cp312-cp312-win_amd64.whl", hash = "sha256:d317a0be302fc584bf5661ccb8fac550dd7ea8b2766249a6ad33f53108b2a75f", size = 1939826, upload-time = "2026-08-17T22:56:28.731Z" },
+ { url = "https://files.pythonhosted.org/packages/63/7a/465b89903bdad45d93a580821a50b95eee1c6fdeed0f444b57d16cbc5142/quil-0.37.1-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:8dc6959047657f08f42fb18910517006d7dc1bc181e6693876aeeba1aaa0fbfa", size = 3889840, upload-time = "2026-08-17T22:56:30.033Z" },
+ { url = "https://files.pythonhosted.org/packages/c9/84/6ec6c8b9ed03299e977d1c90ec6b5600b63735f95af12406e5f5f97aba69/quil-0.37.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7196cfaf6dcfd7455d7be2d9653ef52f2d7fb381b4b1b9a81558abe9adc5f4ac", size = 2034564, upload-time = "2026-08-17T22:56:31.488Z" },
+ { url = "https://files.pythonhosted.org/packages/95/eb/0a62f303f84b39b809a1b2274fff40218403bd42c7c8286fadd5c57715db/quil-0.37.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:40a65ebb2aa5c7263a9360be463a52d132b17923c73ecc4924cc75e89e24173a", size = 2224930, upload-time = "2026-08-17T22:56:32.809Z" },
+ { url = "https://files.pythonhosted.org/packages/f8/17/b4265d8353909883be2b6ba4f5e9a738249b8d03a1ecb4935394fb7c6273/quil-0.37.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:731463db92d7a4ca8b89bab3a75e0726edb675d42539b26b2726fa936e435e88", size = 2089153, upload-time = "2026-08-17T22:56:34.196Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/f5/c8fff3e52b345308a7b608538e0918b757e48d7f505ec2724913d1ed839b/quil-0.37.1-cp313-cp313-win_amd64.whl", hash = "sha256:67d2adc00a34b6d154eb26d47a8b6504d786b5dc181f2af12d9c650640760675", size = 1941421, upload-time = "2026-08-17T22:56:35.838Z" },
+]
+
+[[package]]
+name = "rich"
+version = "14.2.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "markdown-it-py" },
+ { name = "pygments" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/fb/d2/8920e102050a0de7bfabeb4c4614a49248cf8d5d7a8d01885fbb24dc767a/rich-14.2.0.tar.gz", hash = "sha256:73ff50c7c0c1c77c8243079283f4edb376f0f6442433aecb8ce7e6d0b92d1fe4", size = 219990, upload-time = "2025-10-09T14:16:53.064Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/25/7a/b0178788f8dc6cafce37a212c99565fa1fe7872c70c6c9c1e1a372d9d88f/rich-14.2.0-py3-none-any.whl", hash = "sha256:76bc51fe2e57d2b1be1f96c524b890b816e334ab4c1e45888799bfaab0021edd", size = 243393, upload-time = "2025-10-09T14:16:51.245Z" },
+]
+
+[[package]]
+name = "ruff"
+version = "0.14.8"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/ed/d9/f7a0c4b3a2bf2556cd5d99b05372c29980249ef71e8e32669ba77428c82c/ruff-0.14.8.tar.gz", hash = "sha256:774ed0dd87d6ce925e3b8496feb3a00ac564bea52b9feb551ecd17e0a23d1eed", size = 5765385, upload-time = "2025-12-04T15:06:17.669Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/48/b8/9537b52010134b1d2b72870cc3f92d5fb759394094741b09ceccae183fbe/ruff-0.14.8-py3-none-linux_armv6l.whl", hash = "sha256:ec071e9c82eca417f6111fd39f7043acb53cd3fde9b1f95bbed745962e345afb", size = 13441540, upload-time = "2025-12-04T15:06:14.896Z" },
+ { url = "https://files.pythonhosted.org/packages/24/00/99031684efb025829713682012b6dd37279b1f695ed1b01725f85fd94b38/ruff-0.14.8-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:8cdb162a7159f4ca36ce980a18c43d8f036966e7f73f866ac8f493b75e0c27e9", size = 13669384, upload-time = "2025-12-04T15:06:51.809Z" },
+ { url = "https://files.pythonhosted.org/packages/72/64/3eb5949169fc19c50c04f28ece2c189d3b6edd57e5b533649dae6ca484fe/ruff-0.14.8-py3-none-macosx_11_0_arm64.whl", hash = "sha256:2e2fcbefe91f9fad0916850edf0854530c15bd1926b6b779de47e9ab619ea38f", size = 12806917, upload-time = "2025-12-04T15:06:08.925Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/08/5250babb0b1b11910f470370ec0cbc67470231f7cdc033cee57d4976f941/ruff-0.14.8-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9d70721066a296f45786ec31916dc287b44040f553da21564de0ab4d45a869b", size = 13256112, upload-time = "2025-12-04T15:06:23.498Z" },
+ { url = "https://files.pythonhosted.org/packages/78/4c/6c588e97a8e8c2d4b522c31a579e1df2b4d003eddfbe23d1f262b1a431ff/ruff-0.14.8-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2c87e09b3cd9d126fc67a9ecd3b5b1d3ded2b9c7fce3f16e315346b9d05cfb52", size = 13227559, upload-time = "2025-12-04T15:06:33.432Z" },
+ { url = "https://files.pythonhosted.org/packages/23/ce/5f78cea13eda8eceac71b5f6fa6e9223df9b87bb2c1891c166d1f0dce9f1/ruff-0.14.8-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d62cb310c4fbcb9ee4ac023fe17f984ae1e12b8a4a02e3d21489f9a2a5f730c", size = 13896379, upload-time = "2025-12-04T15:06:02.687Z" },
+ { url = "https://files.pythonhosted.org/packages/cf/79/13de4517c4dadce9218a20035b21212a4c180e009507731f0d3b3f5df85a/ruff-0.14.8-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:1af35c2d62633d4da0521178e8a2641c636d2a7153da0bac1b30cfd4ccd91344", size = 15372786, upload-time = "2025-12-04T15:06:29.828Z" },
+ { url = "https://files.pythonhosted.org/packages/00/06/33df72b3bb42be8a1c3815fd4fae83fa2945fc725a25d87ba3e42d1cc108/ruff-0.14.8-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:25add4575ffecc53d60eed3f24b1e934493631b48ebbc6ebaf9d8517924aca4b", size = 14990029, upload-time = "2025-12-04T15:06:36.812Z" },
+ { url = "https://files.pythonhosted.org/packages/64/61/0f34927bd90925880394de0e081ce1afab66d7b3525336f5771dcf0cb46c/ruff-0.14.8-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4c943d847b7f02f7db4201a0600ea7d244d8a404fbb639b439e987edcf2baf9a", size = 14407037, upload-time = "2025-12-04T15:06:39.979Z" },
+ { url = "https://files.pythonhosted.org/packages/96/bc/058fe0aefc0fbf0d19614cb6d1a3e2c048f7dc77ca64957f33b12cfdc5ef/ruff-0.14.8-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb6e8bf7b4f627548daa1b69283dac5a296bfe9ce856703b03130732e20ddfe2", size = 14102390, upload-time = "2025-12-04T15:06:46.372Z" },
+ { url = "https://files.pythonhosted.org/packages/af/a4/e4f77b02b804546f4c17e8b37a524c27012dd6ff05855d2243b49a7d3cb9/ruff-0.14.8-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:7aaf2974f378e6b01d1e257c6948207aec6a9b5ba53fab23d0182efb887a0e4a", size = 14230793, upload-time = "2025-12-04T15:06:20.497Z" },
+ { url = "https://files.pythonhosted.org/packages/3f/52/bb8c02373f79552e8d087cedaffad76b8892033d2876c2498a2582f09dcf/ruff-0.14.8-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e5758ca513c43ad8a4ef13f0f081f80f08008f410790f3611a21a92421ab045b", size = 13160039, upload-time = "2025-12-04T15:06:49.06Z" },
+ { url = "https://files.pythonhosted.org/packages/1f/ad/b69d6962e477842e25c0b11622548df746290cc6d76f9e0f4ed7456c2c31/ruff-0.14.8-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:f74f7ba163b6e85a8d81a590363bf71618847e5078d90827749bfda1d88c9cdf", size = 13205158, upload-time = "2025-12-04T15:06:54.574Z" },
+ { url = "https://files.pythonhosted.org/packages/06/63/54f23da1315c0b3dfc1bc03fbc34e10378918a20c0b0f086418734e57e74/ruff-0.14.8-py3-none-musllinux_1_2_i686.whl", hash = "sha256:eed28f6fafcc9591994c42254f5a5c5ca40e69a30721d2ab18bb0bb3baac3ab6", size = 13469550, upload-time = "2025-12-04T15:05:59.209Z" },
+ { url = "https://files.pythonhosted.org/packages/70/7d/a4d7b1961e4903bc37fffb7ddcfaa7beb250f67d97cfd1ee1d5cddb1ec90/ruff-0.14.8-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:21d48fa744c9d1cb8d71eb0a740c4dd02751a5de9db9a730a8ef75ca34cf138e", size = 14211332, upload-time = "2025-12-04T15:06:06.027Z" },
+ { url = "https://files.pythonhosted.org/packages/5d/93/2a5063341fa17054e5c86582136e9895db773e3c2ffb770dde50a09f35f0/ruff-0.14.8-py3-none-win32.whl", hash = "sha256:15f04cb45c051159baebb0f0037f404f1dc2f15a927418f29730f411a79bc4e7", size = 13151890, upload-time = "2025-12-04T15:06:11.668Z" },
+ { url = "https://files.pythonhosted.org/packages/02/1c/65c61a0859c0add13a3e1cbb6024b42de587456a43006ca2d4fd3d1618fe/ruff-0.14.8-py3-none-win_amd64.whl", hash = "sha256:9eeb0b24242b5bbff3011409a739929f497f3fb5fe3b5698aba5e77e8c833097", size = 14537826, upload-time = "2025-12-04T15:06:26.409Z" },
+ { url = "https://files.pythonhosted.org/packages/6d/63/8b41cea3afd7f58eb64ac9251668ee0073789a3bc9ac6f816c8c6fef986d/ruff-0.14.8-py3-none-win_arm64.whl", hash = "sha256:965a582c93c63fe715fd3e3f8aa37c4b776777203d8e1d8aa3cc0c14424a4b99", size = 13634522, upload-time = "2025-12-04T15:06:43.212Z" },
+]
+
+[[package]]
+name = "syrupy"
+version = "5.0.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pytest" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/c1/90/1a442d21527009d4b40f37fe50b606ebb68a6407142c2b5cc508c34b696b/syrupy-5.0.0.tar.gz", hash = "sha256:3282fe963fa5d4d3e47231b16d1d4d0f4523705e8199eeb99a22a1bc9f5942f2", size = 48881, upload-time = "2025-09-28T21:15:12.783Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9d/9a/6c68aad2ccfce6e2eeebbf5bb709d0240592eb51ff142ec4c8fbf3c2460a/syrupy-5.0.0-py3-none-any.whl", hash = "sha256:c848e1a980ca52a28715cd2d2b4d434db424699c05653bd1158fb31cf56e9546", size = 49087, upload-time = "2025-09-28T21:15:11.639Z" },
+]
+
+[[package]]
+name = "termcolor"
+version = "3.2.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/87/56/ab275c2b56a5e2342568838f0d5e3e66a32354adcc159b495e374cda43f5/termcolor-3.2.0.tar.gz", hash = "sha256:610e6456feec42c4bcd28934a8c87a06c3fa28b01561d46aa09a9881b8622c58", size = 14423, upload-time = "2025-10-25T19:11:42.586Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f9/d5/141f53d7c1eb2a80e6d3e9a390228c3222c27705cbe7f048d3623053f3ca/termcolor-3.2.0-py3-none-any.whl", hash = "sha256:a10343879eba4da819353c55cb8049b0933890c2ebf9ad5d3ecd2bb32ea96ea6", size = 7698, upload-time = "2025-10-25T19:11:41.536Z" },
+]
+
+[[package]]
+name = "tomli"
+version = "2.3.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/52/ed/3f73f72945444548f33eba9a87fc7a6e969915e7b1acc8260b30e1f76a2f/tomli-2.3.0.tar.gz", hash = "sha256:64be704a875d2a59753d80ee8a533c3fe183e3f06807ff7dc2232938ccb01549", size = 17392, upload-time = "2025-10-08T22:01:47.119Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b3/2e/299f62b401438d5fe1624119c723f5d877acc86a4c2492da405626665f12/tomli-2.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:88bd15eb972f3664f5ed4b57c1634a97153b4bac4479dcb6a495f41921eb7f45", size = 153236, upload-time = "2025-10-08T22:01:00.137Z" },
+ { url = "https://files.pythonhosted.org/packages/86/7f/d8fffe6a7aefdb61bced88fcb5e280cfd71e08939da5894161bd71bea022/tomli-2.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:883b1c0d6398a6a9d29b508c331fa56adbcdff647f6ace4dfca0f50e90dfd0ba", size = 148084, upload-time = "2025-10-08T22:01:01.63Z" },
+ { url = "https://files.pythonhosted.org/packages/47/5c/24935fb6a2ee63e86d80e4d3b58b222dafaf438c416752c8b58537c8b89a/tomli-2.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d1381caf13ab9f300e30dd8feadb3de072aeb86f1d34a8569453ff32a7dea4bf", size = 234832, upload-time = "2025-10-08T22:01:02.543Z" },
+ { url = "https://files.pythonhosted.org/packages/89/da/75dfd804fc11e6612846758a23f13271b76d577e299592b4371a4ca4cd09/tomli-2.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a0e285d2649b78c0d9027570d4da3425bdb49830a6156121360b3f8511ea3441", size = 242052, upload-time = "2025-10-08T22:01:03.836Z" },
+ { url = "https://files.pythonhosted.org/packages/70/8c/f48ac899f7b3ca7eb13af73bacbc93aec37f9c954df3c08ad96991c8c373/tomli-2.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a154a9ae14bfcf5d8917a59b51ffd5a3ac1fd149b71b47a3a104ca4edcfa845", size = 239555, upload-time = "2025-10-08T22:01:04.834Z" },
+ { url = "https://files.pythonhosted.org/packages/ba/28/72f8afd73f1d0e7829bfc093f4cb98ce0a40ffc0cc997009ee1ed94ba705/tomli-2.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:74bf8464ff93e413514fefd2be591c3b0b23231a77f901db1eb30d6f712fc42c", size = 245128, upload-time = "2025-10-08T22:01:05.84Z" },
+ { url = "https://files.pythonhosted.org/packages/b6/eb/a7679c8ac85208706d27436e8d421dfa39d4c914dcf5fa8083a9305f58d9/tomli-2.3.0-cp311-cp311-win32.whl", hash = "sha256:00b5f5d95bbfc7d12f91ad8c593a1659b6387b43f054104cda404be6bda62456", size = 96445, upload-time = "2025-10-08T22:01:06.896Z" },
+ { url = "https://files.pythonhosted.org/packages/0a/fe/3d3420c4cb1ad9cb462fb52967080575f15898da97e21cb6f1361d505383/tomli-2.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:4dc4ce8483a5d429ab602f111a93a6ab1ed425eae3122032db7e9acf449451be", size = 107165, upload-time = "2025-10-08T22:01:08.107Z" },
+ { url = "https://files.pythonhosted.org/packages/ff/b7/40f36368fcabc518bb11c8f06379a0fd631985046c038aca08c6d6a43c6e/tomli-2.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d7d86942e56ded512a594786a5ba0a5e521d02529b3826e7761a05138341a2ac", size = 154891, upload-time = "2025-10-08T22:01:09.082Z" },
+ { url = "https://files.pythonhosted.org/packages/f9/3f/d9dd692199e3b3aab2e4e4dd948abd0f790d9ded8cd10cbaae276a898434/tomli-2.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:73ee0b47d4dad1c5e996e3cd33b8a76a50167ae5f96a2607cbe8cc773506ab22", size = 148796, upload-time = "2025-10-08T22:01:10.266Z" },
+ { url = "https://files.pythonhosted.org/packages/60/83/59bff4996c2cf9f9387a0f5a3394629c7efa5ef16142076a23a90f1955fa/tomli-2.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:792262b94d5d0a466afb5bc63c7daa9d75520110971ee269152083270998316f", size = 242121, upload-time = "2025-10-08T22:01:11.332Z" },
+ { url = "https://files.pythonhosted.org/packages/45/e5/7c5119ff39de8693d6baab6c0b6dcb556d192c165596e9fc231ea1052041/tomli-2.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4f195fe57ecceac95a66a75ac24d9d5fbc98ef0962e09b2eddec5d39375aae52", size = 250070, upload-time = "2025-10-08T22:01:12.498Z" },
+ { url = "https://files.pythonhosted.org/packages/45/12/ad5126d3a278f27e6701abde51d342aa78d06e27ce2bb596a01f7709a5a2/tomli-2.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e31d432427dcbf4d86958c184b9bfd1e96b5b71f8eb17e6d02531f434fd335b8", size = 245859, upload-time = "2025-10-08T22:01:13.551Z" },
+ { url = "https://files.pythonhosted.org/packages/fb/a1/4d6865da6a71c603cfe6ad0e6556c73c76548557a8d658f9e3b142df245f/tomli-2.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b0882799624980785240ab732537fcfc372601015c00f7fc367c55308c186f6", size = 250296, upload-time = "2025-10-08T22:01:14.614Z" },
+ { url = "https://files.pythonhosted.org/packages/a0/b7/a7a7042715d55c9ba6e8b196d65d2cb662578b4d8cd17d882d45322b0d78/tomli-2.3.0-cp312-cp312-win32.whl", hash = "sha256:ff72b71b5d10d22ecb084d345fc26f42b5143c5533db5e2eaba7d2d335358876", size = 97124, upload-time = "2025-10-08T22:01:15.629Z" },
+ { url = "https://files.pythonhosted.org/packages/06/1e/f22f100db15a68b520664eb3328fb0ae4e90530887928558112c8d1f4515/tomli-2.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:1cb4ed918939151a03f33d4242ccd0aa5f11b3547d0cf30f7c74a408a5b99878", size = 107698, upload-time = "2025-10-08T22:01:16.51Z" },
+ { url = "https://files.pythonhosted.org/packages/89/48/06ee6eabe4fdd9ecd48bf488f4ac783844fd777f547b8d1b61c11939974e/tomli-2.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5192f562738228945d7b13d4930baffda67b69425a7f0da96d360b0a3888136b", size = 154819, upload-time = "2025-10-08T22:01:17.964Z" },
+ { url = "https://files.pythonhosted.org/packages/f1/01/88793757d54d8937015c75dcdfb673c65471945f6be98e6a0410fba167ed/tomli-2.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:be71c93a63d738597996be9528f4abe628d1adf5e6eb11607bc8fe1a510b5dae", size = 148766, upload-time = "2025-10-08T22:01:18.959Z" },
+ { url = "https://files.pythonhosted.org/packages/42/17/5e2c956f0144b812e7e107f94f1cc54af734eb17b5191c0bbfb72de5e93e/tomli-2.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c4665508bcbac83a31ff8ab08f424b665200c0e1e645d2bd9ab3d3e557b6185b", size = 240771, upload-time = "2025-10-08T22:01:20.106Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/f4/0fbd014909748706c01d16824eadb0307115f9562a15cbb012cd9b3512c5/tomli-2.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4021923f97266babc6ccab9f5068642a0095faa0a51a246a6a02fccbb3514eaf", size = 248586, upload-time = "2025-10-08T22:01:21.164Z" },
+ { url = "https://files.pythonhosted.org/packages/30/77/fed85e114bde5e81ecf9bc5da0cc69f2914b38f4708c80ae67d0c10180c5/tomli-2.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4ea38c40145a357d513bffad0ed869f13c1773716cf71ccaa83b0fa0cc4e42f", size = 244792, upload-time = "2025-10-08T22:01:22.417Z" },
+ { url = "https://files.pythonhosted.org/packages/55/92/afed3d497f7c186dc71e6ee6d4fcb0acfa5f7d0a1a2878f8beae379ae0cc/tomli-2.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ad805ea85eda330dbad64c7ea7a4556259665bdf9d2672f5dccc740eb9d3ca05", size = 248909, upload-time = "2025-10-08T22:01:23.859Z" },
+ { url = "https://files.pythonhosted.org/packages/f8/84/ef50c51b5a9472e7265ce1ffc7f24cd4023d289e109f669bdb1553f6a7c2/tomli-2.3.0-cp313-cp313-win32.whl", hash = "sha256:97d5eec30149fd3294270e889b4234023f2c69747e555a27bd708828353ab606", size = 96946, upload-time = "2025-10-08T22:01:24.893Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/b7/718cd1da0884f281f95ccfa3a6cc572d30053cba64603f79d431d3c9b61b/tomli-2.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0c95ca56fbe89e065c6ead5b593ee64b84a26fca063b5d71a1122bf26e533999", size = 107705, upload-time = "2025-10-08T22:01:26.153Z" },
+ { url = "https://files.pythonhosted.org/packages/19/94/aeafa14a52e16163008060506fcb6aa1949d13548d13752171a755c65611/tomli-2.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:cebc6fe843e0733ee827a282aca4999b596241195f43b4cc371d64fc6639da9e", size = 154244, upload-time = "2025-10-08T22:01:27.06Z" },
+ { url = "https://files.pythonhosted.org/packages/db/e4/1e58409aa78eefa47ccd19779fc6f36787edbe7d4cd330eeeedb33a4515b/tomli-2.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4c2ef0244c75aba9355561272009d934953817c49f47d768070c3c94355c2aa3", size = 148637, upload-time = "2025-10-08T22:01:28.059Z" },
+ { url = "https://files.pythonhosted.org/packages/26/b6/d1eccb62f665e44359226811064596dd6a366ea1f985839c566cd61525ae/tomli-2.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c22a8bf253bacc0cf11f35ad9808b6cb75ada2631c2d97c971122583b129afbc", size = 241925, upload-time = "2025-10-08T22:01:29.066Z" },
+ { url = "https://files.pythonhosted.org/packages/70/91/7cdab9a03e6d3d2bb11beae108da5bdc1c34bdeb06e21163482544ddcc90/tomli-2.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0eea8cc5c5e9f89c9b90c4896a8deefc74f518db5927d0e0e8d4a80953d774d0", size = 249045, upload-time = "2025-10-08T22:01:31.98Z" },
+ { url = "https://files.pythonhosted.org/packages/15/1b/8c26874ed1f6e4f1fcfeb868db8a794cbe9f227299402db58cfcc858766c/tomli-2.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b74a0e59ec5d15127acdabd75ea17726ac4c5178ae51b85bfe39c4f8a278e879", size = 245835, upload-time = "2025-10-08T22:01:32.989Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/42/8e3c6a9a4b1a1360c1a2a39f0b972cef2cc9ebd56025168c4137192a9321/tomli-2.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b5870b50c9db823c595983571d1296a6ff3e1b88f734a4c8f6fc6188397de005", size = 253109, upload-time = "2025-10-08T22:01:34.052Z" },
+ { url = "https://files.pythonhosted.org/packages/22/0c/b4da635000a71b5f80130937eeac12e686eefb376b8dee113b4a582bba42/tomli-2.3.0-cp314-cp314-win32.whl", hash = "sha256:feb0dacc61170ed7ab602d3d972a58f14ee3ee60494292d384649a3dc38ef463", size = 97930, upload-time = "2025-10-08T22:01:35.082Z" },
+ { url = "https://files.pythonhosted.org/packages/b9/74/cb1abc870a418ae99cd5c9547d6bce30701a954e0e721821df483ef7223c/tomli-2.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:b273fcbd7fc64dc3600c098e39136522650c49bca95df2d11cf3b626422392c8", size = 107964, upload-time = "2025-10-08T22:01:36.057Z" },
+ { url = "https://files.pythonhosted.org/packages/54/78/5c46fff6432a712af9f792944f4fcd7067d8823157949f4e40c56b8b3c83/tomli-2.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:940d56ee0410fa17ee1f12b817b37a4d4e4dc4d27340863cc67236c74f582e77", size = 163065, upload-time = "2025-10-08T22:01:37.27Z" },
+ { url = "https://files.pythonhosted.org/packages/39/67/f85d9bd23182f45eca8939cd2bc7050e1f90c41f4a2ecbbd5963a1d1c486/tomli-2.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f85209946d1fe94416debbb88d00eb92ce9cd5266775424ff81bc959e001acaf", size = 159088, upload-time = "2025-10-08T22:01:38.235Z" },
+ { url = "https://files.pythonhosted.org/packages/26/5a/4b546a0405b9cc0659b399f12b6adb750757baf04250b148d3c5059fc4eb/tomli-2.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a56212bdcce682e56b0aaf79e869ba5d15a6163f88d5451cbde388d48b13f530", size = 268193, upload-time = "2025-10-08T22:01:39.712Z" },
+ { url = "https://files.pythonhosted.org/packages/42/4f/2c12a72ae22cf7b59a7fe75b3465b7aba40ea9145d026ba41cb382075b0e/tomli-2.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c5f3ffd1e098dfc032d4d3af5c0ac64f6d286d98bc148698356847b80fa4de1b", size = 275488, upload-time = "2025-10-08T22:01:40.773Z" },
+ { url = "https://files.pythonhosted.org/packages/92/04/a038d65dbe160c3aa5a624e93ad98111090f6804027d474ba9c37c8ae186/tomli-2.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e01decd096b1530d97d5d85cb4dff4af2d8347bd35686654a004f8dea20fc67", size = 272669, upload-time = "2025-10-08T22:01:41.824Z" },
+ { url = "https://files.pythonhosted.org/packages/be/2f/8b7c60a9d1612a7cbc39ffcca4f21a73bf368a80fc25bccf8253e2563267/tomli-2.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:8a35dd0e643bb2610f156cca8db95d213a90015c11fee76c946aa62b7ae7e02f", size = 279709, upload-time = "2025-10-08T22:01:43.177Z" },
+ { url = "https://files.pythonhosted.org/packages/7e/46/cc36c679f09f27ded940281c38607716c86cf8ba4a518d524e349c8b4874/tomli-2.3.0-cp314-cp314t-win32.whl", hash = "sha256:a1f7f282fe248311650081faafa5f4732bdbfef5d45fe3f2e702fbc6f2d496e0", size = 107563, upload-time = "2025-10-08T22:01:44.233Z" },
+ { url = "https://files.pythonhosted.org/packages/84/ff/426ca8683cf7b753614480484f6437f568fd2fda2edbdf57a2d3d8b27a0b/tomli-2.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:70a251f8d4ba2d9ac2542eecf008b3c8a9fc5c3f9f02c56a9d7952612be2fdba", size = 119756, upload-time = "2025-10-08T22:01:45.234Z" },
+ { url = "https://files.pythonhosted.org/packages/77/b8/0135fadc89e73be292b473cb820b4f5a08197779206b33191e801feeae40/tomli-2.3.0-py3-none-any.whl", hash = "sha256:e95b1af3c5b07d9e643909b5abbec77cd9f1217e6d0bca72b0234736b9fb1f1b", size = 14408, upload-time = "2025-10-08T22:01:46.04Z" },
+]
+
+[[package]]
+name = "typing-extensions"
+version = "4.15.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" },
+]
+
+[[package]]
+name = "wrapt"
+version = "2.0.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/49/2a/6de8a50cb435b7f42c46126cf1a54b2aab81784e74c8595c8e025e8f36d3/wrapt-2.0.1.tar.gz", hash = "sha256:9c9c635e78497cacb81e84f8b11b23e0aacac7a136e73b8e5b2109a1d9fc468f", size = 82040, upload-time = "2025-11-07T00:45:33.312Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/61/0d/12d8c803ed2ce4e5e7d5b9f5f602721f9dfef82c95959f3ce97fa584bb5c/wrapt-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:64b103acdaa53b7caf409e8d45d39a8442fe6dcfec6ba3f3d141e0cc2b5b4dbd", size = 77481, upload-time = "2025-11-07T00:43:11.103Z" },
+ { url = "https://files.pythonhosted.org/packages/05/3e/4364ebe221ebf2a44d9fc8695a19324692f7dd2795e64bd59090856ebf12/wrapt-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:91bcc576260a274b169c3098e9a3519fb01f2989f6d3d386ef9cbf8653de1374", size = 60692, upload-time = "2025-11-07T00:43:13.697Z" },
+ { url = "https://files.pythonhosted.org/packages/1f/ff/ae2a210022b521f86a8ddcdd6058d137c051003812b0388a5e9a03d3fe10/wrapt-2.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ab594f346517010050126fcd822697b25a7031d815bb4fbc238ccbe568216489", size = 61574, upload-time = "2025-11-07T00:43:14.967Z" },
+ { url = "https://files.pythonhosted.org/packages/c6/93/5cf92edd99617095592af919cb81d4bff61c5dbbb70d3c92099425a8ec34/wrapt-2.0.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:36982b26f190f4d737f04a492a68accbfc6fa042c3f42326fdfbb6c5b7a20a31", size = 113688, upload-time = "2025-11-07T00:43:18.275Z" },
+ { url = "https://files.pythonhosted.org/packages/a0/0a/e38fc0cee1f146c9fb266d8ef96ca39fb14a9eef165383004019aa53f88a/wrapt-2.0.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:23097ed8bc4c93b7bf36fa2113c6c733c976316ce0ee2c816f64ca06102034ef", size = 115698, upload-time = "2025-11-07T00:43:19.407Z" },
+ { url = "https://files.pythonhosted.org/packages/b0/85/bef44ea018b3925fb0bcbe9112715f665e4d5309bd945191da814c314fd1/wrapt-2.0.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8bacfe6e001749a3b64db47bcf0341da757c95959f592823a93931a422395013", size = 112096, upload-time = "2025-11-07T00:43:16.5Z" },
+ { url = "https://files.pythonhosted.org/packages/7c/0b/733a2376e413117e497aa1a5b1b78e8f3a28c0e9537d26569f67d724c7c5/wrapt-2.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8ec3303e8a81932171f455f792f8df500fc1a09f20069e5c16bd7049ab4e8e38", size = 114878, upload-time = "2025-11-07T00:43:20.81Z" },
+ { url = "https://files.pythonhosted.org/packages/da/03/d81dcb21bbf678fcda656495792b059f9d56677d119ca022169a12542bd0/wrapt-2.0.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:3f373a4ab5dbc528a94334f9fe444395b23c2f5332adab9ff4ea82f5a9e33bc1", size = 111298, upload-time = "2025-11-07T00:43:22.229Z" },
+ { url = "https://files.pythonhosted.org/packages/c9/d5/5e623040e8056e1108b787020d56b9be93dbbf083bf2324d42cde80f3a19/wrapt-2.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f49027b0b9503bf6c8cdc297ca55006b80c2f5dd36cecc72c6835ab6e10e8a25", size = 113361, upload-time = "2025-11-07T00:43:24.301Z" },
+ { url = "https://files.pythonhosted.org/packages/a1/f3/de535ccecede6960e28c7b722e5744846258111d6c9f071aa7578ea37ad3/wrapt-2.0.1-cp310-cp310-win32.whl", hash = "sha256:8330b42d769965e96e01fa14034b28a2a7600fbf7e8f0cc90ebb36d492c993e4", size = 58035, upload-time = "2025-11-07T00:43:28.96Z" },
+ { url = "https://files.pythonhosted.org/packages/21/15/39d3ca5428a70032c2ec8b1f1c9d24c32e497e7ed81aed887a4998905fcc/wrapt-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:1218573502a8235bb8a7ecaed12736213b22dcde9feab115fa2989d42b5ded45", size = 60383, upload-time = "2025-11-07T00:43:25.804Z" },
+ { url = "https://files.pythonhosted.org/packages/43/c2/dfd23754b7f7a4dce07e08f4309c4e10a40046a83e9ae1800f2e6b18d7c1/wrapt-2.0.1-cp310-cp310-win_arm64.whl", hash = "sha256:eda8e4ecd662d48c28bb86be9e837c13e45c58b8300e43ba3c9b4fa9900302f7", size = 58894, upload-time = "2025-11-07T00:43:27.074Z" },
+ { url = "https://files.pythonhosted.org/packages/98/60/553997acf3939079dab022e37b67b1904b5b0cc235503226898ba573b10c/wrapt-2.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0e17283f533a0d24d6e5429a7d11f250a58d28b4ae5186f8f47853e3e70d2590", size = 77480, upload-time = "2025-11-07T00:43:30.573Z" },
+ { url = "https://files.pythonhosted.org/packages/2d/50/e5b3d30895d77c52105c6d5cbf94d5b38e2a3dd4a53d22d246670da98f7c/wrapt-2.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:85df8d92158cb8f3965aecc27cf821461bb5f40b450b03facc5d9f0d4d6ddec6", size = 60690, upload-time = "2025-11-07T00:43:31.594Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/40/660b2898703e5cbbb43db10cdefcc294274458c3ca4c68637c2b99371507/wrapt-2.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c1be685ac7700c966b8610ccc63c3187a72e33cab53526a27b2a285a662cd4f7", size = 61578, upload-time = "2025-11-07T00:43:32.918Z" },
+ { url = "https://files.pythonhosted.org/packages/5b/36/825b44c8a10556957bc0c1d84c7b29a40e05fcf1873b6c40aa9dbe0bd972/wrapt-2.0.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:df0b6d3b95932809c5b3fecc18fda0f1e07452d05e2662a0b35548985f256e28", size = 114115, upload-time = "2025-11-07T00:43:35.605Z" },
+ { url = "https://files.pythonhosted.org/packages/83/73/0a5d14bb1599677304d3c613a55457d34c344e9b60eda8a737c2ead7619e/wrapt-2.0.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4da7384b0e5d4cae05c97cd6f94faaf78cc8b0f791fc63af43436d98c4ab37bb", size = 116157, upload-time = "2025-11-07T00:43:37.058Z" },
+ { url = "https://files.pythonhosted.org/packages/01/22/1c158fe763dbf0a119f985d945711d288994fe5514c0646ebe0eb18b016d/wrapt-2.0.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ec65a78fbd9d6f083a15d7613b2800d5663dbb6bb96003899c834beaa68b242c", size = 112535, upload-time = "2025-11-07T00:43:34.138Z" },
+ { url = "https://files.pythonhosted.org/packages/5c/28/4f16861af67d6de4eae9927799b559c20ebdd4fe432e89ea7fe6fcd9d709/wrapt-2.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7de3cc939be0e1174969f943f3b44e0d79b6f9a82198133a5b7fc6cc92882f16", size = 115404, upload-time = "2025-11-07T00:43:39.214Z" },
+ { url = "https://files.pythonhosted.org/packages/a0/8b/7960122e625fad908f189b59c4aae2d50916eb4098b0fb2819c5a177414f/wrapt-2.0.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:fb1a5b72cbd751813adc02ef01ada0b0d05d3dcbc32976ce189a1279d80ad4a2", size = 111802, upload-time = "2025-11-07T00:43:40.476Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/73/7881eee5ac31132a713ab19a22c9e5f1f7365c8b1df50abba5d45b781312/wrapt-2.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3fa272ca34332581e00bf7773e993d4f632594eb2d1b0b162a9038df0fd971dd", size = 113837, upload-time = "2025-11-07T00:43:42.921Z" },
+ { url = "https://files.pythonhosted.org/packages/45/00/9499a3d14e636d1f7089339f96c4409bbc7544d0889f12264efa25502ae8/wrapt-2.0.1-cp311-cp311-win32.whl", hash = "sha256:fc007fdf480c77301ab1afdbb6ab22a5deee8885f3b1ed7afcb7e5e84a0e27be", size = 58028, upload-time = "2025-11-07T00:43:47.369Z" },
+ { url = "https://files.pythonhosted.org/packages/70/5d/8f3d7eea52f22638748f74b102e38fdf88cb57d08ddeb7827c476a20b01b/wrapt-2.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:47434236c396d04875180171ee1f3815ca1eada05e24a1ee99546320d54d1d1b", size = 60385, upload-time = "2025-11-07T00:43:44.34Z" },
+ { url = "https://files.pythonhosted.org/packages/14/e2/32195e57a8209003587bbbad44d5922f13e0ced2a493bb46ca882c5b123d/wrapt-2.0.1-cp311-cp311-win_arm64.whl", hash = "sha256:837e31620e06b16030b1d126ed78e9383815cbac914693f54926d816d35d8edf", size = 58893, upload-time = "2025-11-07T00:43:46.161Z" },
+ { url = "https://files.pythonhosted.org/packages/cb/73/8cb252858dc8254baa0ce58ce382858e3a1cf616acebc497cb13374c95c6/wrapt-2.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1fdbb34da15450f2b1d735a0e969c24bdb8d8924892380126e2a293d9902078c", size = 78129, upload-time = "2025-11-07T00:43:48.852Z" },
+ { url = "https://files.pythonhosted.org/packages/19/42/44a0db2108526ee6e17a5ab72478061158f34b08b793df251d9fbb9a7eb4/wrapt-2.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3d32794fe940b7000f0519904e247f902f0149edbe6316c710a8562fb6738841", size = 61205, upload-time = "2025-11-07T00:43:50.402Z" },
+ { url = "https://files.pythonhosted.org/packages/4d/8a/5b4b1e44b791c22046e90d9b175f9a7581a8cc7a0debbb930f81e6ae8e25/wrapt-2.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:386fb54d9cd903ee0012c09291336469eb7b244f7183d40dc3e86a16a4bace62", size = 61692, upload-time = "2025-11-07T00:43:51.678Z" },
+ { url = "https://files.pythonhosted.org/packages/11/53/3e794346c39f462bcf1f58ac0487ff9bdad02f9b6d5ee2dc84c72e0243b2/wrapt-2.0.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7b219cb2182f230676308cdcacd428fa837987b89e4b7c5c9025088b8a6c9faf", size = 121492, upload-time = "2025-11-07T00:43:55.017Z" },
+ { url = "https://files.pythonhosted.org/packages/c6/7e/10b7b0e8841e684c8ca76b462a9091c45d62e8f2de9c4b1390b690eadf16/wrapt-2.0.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:641e94e789b5f6b4822bb8d8ebbdfc10f4e4eae7756d648b717d980f657a9eb9", size = 123064, upload-time = "2025-11-07T00:43:56.323Z" },
+ { url = "https://files.pythonhosted.org/packages/0e/d1/3c1e4321fc2f5ee7fd866b2d822aa89b84495f28676fd976c47327c5b6aa/wrapt-2.0.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fe21b118b9f58859b5ebaa4b130dee18669df4bd111daad082b7beb8799ad16b", size = 117403, upload-time = "2025-11-07T00:43:53.258Z" },
+ { url = "https://files.pythonhosted.org/packages/a4/b0/d2f0a413cf201c8c2466de08414a15420a25aa83f53e647b7255cc2fab5d/wrapt-2.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:17fb85fa4abc26a5184d93b3efd2dcc14deb4b09edcdb3535a536ad34f0b4dba", size = 121500, upload-time = "2025-11-07T00:43:57.468Z" },
+ { url = "https://files.pythonhosted.org/packages/bd/45/bddb11d28ca39970a41ed48a26d210505120f925918592283369219f83cc/wrapt-2.0.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:b89ef9223d665ab255ae42cc282d27d69704d94be0deffc8b9d919179a609684", size = 116299, upload-time = "2025-11-07T00:43:58.877Z" },
+ { url = "https://files.pythonhosted.org/packages/81/af/34ba6dd570ef7a534e7eec0c25e2615c355602c52aba59413411c025a0cb/wrapt-2.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a453257f19c31b31ba593c30d997d6e5be39e3b5ad9148c2af5a7314061c63eb", size = 120622, upload-time = "2025-11-07T00:43:59.962Z" },
+ { url = "https://files.pythonhosted.org/packages/e2/3e/693a13b4146646fb03254636f8bafd20c621955d27d65b15de07ab886187/wrapt-2.0.1-cp312-cp312-win32.whl", hash = "sha256:3e271346f01e9c8b1130a6a3b0e11908049fe5be2d365a5f402778049147e7e9", size = 58246, upload-time = "2025-11-07T00:44:03.169Z" },
+ { url = "https://files.pythonhosted.org/packages/a7/36/715ec5076f925a6be95f37917b66ebbeaa1372d1862c2ccd7a751574b068/wrapt-2.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:2da620b31a90cdefa9cd0c2b661882329e2e19d1d7b9b920189956b76c564d75", size = 60492, upload-time = "2025-11-07T00:44:01.027Z" },
+ { url = "https://files.pythonhosted.org/packages/ef/3e/62451cd7d80f65cc125f2b426b25fbb6c514bf6f7011a0c3904fc8c8df90/wrapt-2.0.1-cp312-cp312-win_arm64.whl", hash = "sha256:aea9c7224c302bc8bfc892b908537f56c430802560e827b75ecbde81b604598b", size = 58987, upload-time = "2025-11-07T00:44:02.095Z" },
+ { url = "https://files.pythonhosted.org/packages/ad/fe/41af4c46b5e498c90fc87981ab2972fbd9f0bccda597adb99d3d3441b94b/wrapt-2.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:47b0f8bafe90f7736151f61482c583c86b0693d80f075a58701dd1549b0010a9", size = 78132, upload-time = "2025-11-07T00:44:04.628Z" },
+ { url = "https://files.pythonhosted.org/packages/1c/92/d68895a984a5ebbbfb175512b0c0aad872354a4a2484fbd5552e9f275316/wrapt-2.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:cbeb0971e13b4bd81d34169ed57a6dda017328d1a22b62fda45e1d21dd06148f", size = 61211, upload-time = "2025-11-07T00:44:05.626Z" },
+ { url = "https://files.pythonhosted.org/packages/e8/26/ba83dc5ae7cf5aa2b02364a3d9cf74374b86169906a1f3ade9a2d03cf21c/wrapt-2.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eb7cffe572ad0a141a7886a1d2efa5bef0bf7fe021deeea76b3ab334d2c38218", size = 61689, upload-time = "2025-11-07T00:44:06.719Z" },
+ { url = "https://files.pythonhosted.org/packages/cf/67/d7a7c276d874e5d26738c22444d466a3a64ed541f6ef35f740dbd865bab4/wrapt-2.0.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c8d60527d1ecfc131426b10d93ab5d53e08a09c5fa0175f6b21b3252080c70a9", size = 121502, upload-time = "2025-11-07T00:44:09.557Z" },
+ { url = "https://files.pythonhosted.org/packages/0f/6b/806dbf6dd9579556aab22fc92908a876636e250f063f71548a8660382184/wrapt-2.0.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c654eafb01afac55246053d67a4b9a984a3567c3808bb7df2f8de1c1caba2e1c", size = 123110, upload-time = "2025-11-07T00:44:10.64Z" },
+ { url = "https://files.pythonhosted.org/packages/e5/08/cdbb965fbe4c02c5233d185d070cabed2ecc1f1e47662854f95d77613f57/wrapt-2.0.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:98d873ed6c8b4ee2418f7afce666751854d6d03e3c0ec2a399bb039cd2ae89db", size = 117434, upload-time = "2025-11-07T00:44:08.138Z" },
+ { url = "https://files.pythonhosted.org/packages/2d/d1/6aae2ce39db4cb5216302fa2e9577ad74424dfbe315bd6669725569e048c/wrapt-2.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c9e850f5b7fc67af856ff054c71690d54fa940c3ef74209ad9f935b4f66a0233", size = 121533, upload-time = "2025-11-07T00:44:12.142Z" },
+ { url = "https://files.pythonhosted.org/packages/79/35/565abf57559fbe0a9155c29879ff43ce8bd28d2ca61033a3a3dd67b70794/wrapt-2.0.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:e505629359cb5f751e16e30cf3f91a1d3ddb4552480c205947da415d597f7ac2", size = 116324, upload-time = "2025-11-07T00:44:13.28Z" },
+ { url = "https://files.pythonhosted.org/packages/e1/e0/53ff5e76587822ee33e560ad55876d858e384158272cd9947abdd4ad42ca/wrapt-2.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2879af909312d0baf35f08edeea918ee3af7ab57c37fe47cb6a373c9f2749c7b", size = 120627, upload-time = "2025-11-07T00:44:14.431Z" },
+ { url = "https://files.pythonhosted.org/packages/7c/7b/38df30fd629fbd7612c407643c63e80e1c60bcc982e30ceeae163a9800e7/wrapt-2.0.1-cp313-cp313-win32.whl", hash = "sha256:d67956c676be5a24102c7407a71f4126d30de2a569a1c7871c9f3cabc94225d7", size = 58252, upload-time = "2025-11-07T00:44:17.814Z" },
+ { url = "https://files.pythonhosted.org/packages/85/64/d3954e836ea67c4d3ad5285e5c8fd9d362fd0a189a2db622df457b0f4f6a/wrapt-2.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:9ca66b38dd642bf90c59b6738af8070747b610115a39af2498535f62b5cdc1c3", size = 60500, upload-time = "2025-11-07T00:44:15.561Z" },
+ { url = "https://files.pythonhosted.org/packages/89/4e/3c8b99ac93527cfab7f116089db120fef16aac96e5f6cdb724ddf286086d/wrapt-2.0.1-cp313-cp313-win_arm64.whl", hash = "sha256:5a4939eae35db6b6cec8e7aa0e833dcca0acad8231672c26c2a9ab7a0f8ac9c8", size = 58993, upload-time = "2025-11-07T00:44:16.65Z" },
+ { url = "https://files.pythonhosted.org/packages/f9/f4/eff2b7d711cae20d220780b9300faa05558660afb93f2ff5db61fe725b9a/wrapt-2.0.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a52f93d95c8d38fed0669da2ebdb0b0376e895d84596a976c15a9eb45e3eccb3", size = 82028, upload-time = "2025-11-07T00:44:18.944Z" },
+ { url = "https://files.pythonhosted.org/packages/0c/67/cb945563f66fd0f61a999339460d950f4735c69f18f0a87ca586319b1778/wrapt-2.0.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4e54bbf554ee29fcceee24fa41c4d091398b911da6e7f5d7bffda963c9aed2e1", size = 62949, upload-time = "2025-11-07T00:44:20.074Z" },
+ { url = "https://files.pythonhosted.org/packages/ec/ca/f63e177f0bbe1e5cf5e8d9b74a286537cd709724384ff20860f8f6065904/wrapt-2.0.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:908f8c6c71557f4deaa280f55d0728c3bca0960e8c3dd5ceeeafb3c19942719d", size = 63681, upload-time = "2025-11-07T00:44:21.345Z" },
+ { url = "https://files.pythonhosted.org/packages/39/a1/1b88fcd21fd835dca48b556daef750952e917a2794fa20c025489e2e1f0f/wrapt-2.0.1-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e2f84e9af2060e3904a32cea9bb6db23ce3f91cfd90c6b426757cf7cc01c45c7", size = 152696, upload-time = "2025-11-07T00:44:24.318Z" },
+ { url = "https://files.pythonhosted.org/packages/62/1c/d9185500c1960d9f5f77b9c0b890b7fc62282b53af7ad1b6bd779157f714/wrapt-2.0.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e3612dc06b436968dfb9142c62e5dfa9eb5924f91120b3c8ff501ad878f90eb3", size = 158859, upload-time = "2025-11-07T00:44:25.494Z" },
+ { url = "https://files.pythonhosted.org/packages/91/60/5d796ed0f481ec003220c7878a1d6894652efe089853a208ea0838c13086/wrapt-2.0.1-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6d2d947d266d99a1477cd005b23cbd09465276e302515e122df56bb9511aca1b", size = 146068, upload-time = "2025-11-07T00:44:22.81Z" },
+ { url = "https://files.pythonhosted.org/packages/04/f8/75282dd72f102ddbfba137e1e15ecba47b40acff32c08ae97edbf53f469e/wrapt-2.0.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:7d539241e87b650cbc4c3ac9f32c8d1ac8a54e510f6dca3f6ab60dcfd48c9b10", size = 155724, upload-time = "2025-11-07T00:44:26.634Z" },
+ { url = "https://files.pythonhosted.org/packages/5a/27/fe39c51d1b344caebb4a6a9372157bdb8d25b194b3561b52c8ffc40ac7d1/wrapt-2.0.1-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:4811e15d88ee62dbf5c77f2c3ff3932b1e3ac92323ba3912f51fc4016ce81ecf", size = 144413, upload-time = "2025-11-07T00:44:27.939Z" },
+ { url = "https://files.pythonhosted.org/packages/83/2b/9f6b643fe39d4505c7bf926d7c2595b7cb4b607c8c6b500e56c6b36ac238/wrapt-2.0.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c1c91405fcf1d501fa5d55df21e58ea49e6b879ae829f1039faaf7e5e509b41e", size = 150325, upload-time = "2025-11-07T00:44:29.29Z" },
+ { url = "https://files.pythonhosted.org/packages/bb/b6/20ffcf2558596a7f58a2e69c89597128781f0b88e124bf5a4cadc05b8139/wrapt-2.0.1-cp313-cp313t-win32.whl", hash = "sha256:e76e3f91f864e89db8b8d2a8311d57df93f01ad6bb1e9b9976d1f2e83e18315c", size = 59943, upload-time = "2025-11-07T00:44:33.211Z" },
+ { url = "https://files.pythonhosted.org/packages/87/6a/0e56111cbb3320151eed5d3821ee1373be13e05b376ea0870711f18810c3/wrapt-2.0.1-cp313-cp313t-win_amd64.whl", hash = "sha256:83ce30937f0ba0d28818807b303a412440c4b63e39d3d8fc036a94764b728c92", size = 63240, upload-time = "2025-11-07T00:44:30.935Z" },
+ { url = "https://files.pythonhosted.org/packages/1d/54/5ab4c53ea1f7f7e5c3e7c1095db92932cc32fd62359d285486d00c2884c3/wrapt-2.0.1-cp313-cp313t-win_arm64.whl", hash = "sha256:4b55cacc57e1dc2d0991dbe74c6419ffd415fb66474a02335cb10efd1aa3f84f", size = 60416, upload-time = "2025-11-07T00:44:32.002Z" },
+ { url = "https://files.pythonhosted.org/packages/73/81/d08d83c102709258e7730d3cd25befd114c60e43ef3891d7e6877971c514/wrapt-2.0.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:5e53b428f65ece6d9dad23cb87e64506392b720a0b45076c05354d27a13351a1", size = 78290, upload-time = "2025-11-07T00:44:34.691Z" },
+ { url = "https://files.pythonhosted.org/packages/f6/14/393afba2abb65677f313aa680ff0981e829626fed39b6a7e3ec807487790/wrapt-2.0.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ad3ee9d0f254851c71780966eb417ef8e72117155cff04821ab9b60549694a55", size = 61255, upload-time = "2025-11-07T00:44:35.762Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/10/a4a1f2fba205a9462e36e708ba37e5ac95f4987a0f1f8fd23f0bf1fc3b0f/wrapt-2.0.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d7b822c61ed04ee6ad64bc90d13368ad6eb094db54883b5dde2182f67a7f22c0", size = 61797, upload-time = "2025-11-07T00:44:37.22Z" },
+ { url = "https://files.pythonhosted.org/packages/12/db/99ba5c37cf1c4fad35349174f1e38bd8d992340afc1ff27f526729b98986/wrapt-2.0.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7164a55f5e83a9a0b031d3ffab4d4e36bbec42e7025db560f225489fa929e509", size = 120470, upload-time = "2025-11-07T00:44:39.425Z" },
+ { url = "https://files.pythonhosted.org/packages/30/3f/a1c8d2411eb826d695fc3395a431757331582907a0ec59afce8fe8712473/wrapt-2.0.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e60690ba71a57424c8d9ff28f8d006b7ad7772c22a4af432188572cd7fa004a1", size = 122851, upload-time = "2025-11-07T00:44:40.582Z" },
+ { url = "https://files.pythonhosted.org/packages/b3/8d/72c74a63f201768d6a04a8845c7976f86be6f5ff4d74996c272cefc8dafc/wrapt-2.0.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3cd1a4bd9a7a619922a8557e1318232e7269b5fb69d4ba97b04d20450a6bf970", size = 117433, upload-time = "2025-11-07T00:44:38.313Z" },
+ { url = "https://files.pythonhosted.org/packages/c7/5a/df37cf4042cb13b08256f8e27023e2f9b3d471d553376616591bb99bcb31/wrapt-2.0.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b4c2e3d777e38e913b8ce3a6257af72fb608f86a1df471cb1d4339755d0a807c", size = 121280, upload-time = "2025-11-07T00:44:41.69Z" },
+ { url = "https://files.pythonhosted.org/packages/54/34/40d6bc89349f9931e1186ceb3e5fbd61d307fef814f09fbbac98ada6a0c8/wrapt-2.0.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:3d366aa598d69416b5afedf1faa539fac40c1d80a42f6b236c88c73a3c8f2d41", size = 116343, upload-time = "2025-11-07T00:44:43.013Z" },
+ { url = "https://files.pythonhosted.org/packages/70/66/81c3461adece09d20781dee17c2366fdf0cb8754738b521d221ca056d596/wrapt-2.0.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c235095d6d090aa903f1db61f892fffb779c1eaeb2a50e566b52001f7a0f66ed", size = 119650, upload-time = "2025-11-07T00:44:44.523Z" },
+ { url = "https://files.pythonhosted.org/packages/46/3a/d0146db8be8761a9e388cc9cc1c312b36d583950ec91696f19bbbb44af5a/wrapt-2.0.1-cp314-cp314-win32.whl", hash = "sha256:bfb5539005259f8127ea9c885bdc231978c06b7a980e63a8a61c8c4c979719d0", size = 58701, upload-time = "2025-11-07T00:44:48.277Z" },
+ { url = "https://files.pythonhosted.org/packages/1a/38/5359da9af7d64554be63e9046164bd4d8ff289a2dd365677d25ba3342c08/wrapt-2.0.1-cp314-cp314-win_amd64.whl", hash = "sha256:4ae879acc449caa9ed43fc36ba08392b9412ee67941748d31d94e3cedb36628c", size = 60947, upload-time = "2025-11-07T00:44:46.086Z" },
+ { url = "https://files.pythonhosted.org/packages/aa/3f/96db0619276a833842bf36343685fa04f987dd6e3037f314531a1e00492b/wrapt-2.0.1-cp314-cp314-win_arm64.whl", hash = "sha256:8639b843c9efd84675f1e100ed9e99538ebea7297b62c4b45a7042edb84db03e", size = 59359, upload-time = "2025-11-07T00:44:47.164Z" },
+ { url = "https://files.pythonhosted.org/packages/71/49/5f5d1e867bf2064bf3933bc6cf36ade23505f3902390e175e392173d36a2/wrapt-2.0.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:9219a1d946a9b32bb23ccae66bdb61e35c62773ce7ca6509ceea70f344656b7b", size = 82031, upload-time = "2025-11-07T00:44:49.4Z" },
+ { url = "https://files.pythonhosted.org/packages/2b/89/0009a218d88db66ceb83921e5685e820e2c61b59bbbb1324ba65342668bc/wrapt-2.0.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:fa4184e74197af3adad3c889a1af95b53bb0466bced92ea99a0c014e48323eec", size = 62952, upload-time = "2025-11-07T00:44:50.74Z" },
+ { url = "https://files.pythonhosted.org/packages/ae/18/9b968e920dd05d6e44bcc918a046d02afea0fb31b2f1c80ee4020f377cbe/wrapt-2.0.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c5ef2f2b8a53b7caee2f797ef166a390fef73979b15778a4a153e4b5fedce8fa", size = 63688, upload-time = "2025-11-07T00:44:52.248Z" },
+ { url = "https://files.pythonhosted.org/packages/a6/7d/78bdcb75826725885d9ea26c49a03071b10c4c92da93edda612910f150e4/wrapt-2.0.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e042d653a4745be832d5aa190ff80ee4f02c34b21f4b785745eceacd0907b815", size = 152706, upload-time = "2025-11-07T00:44:54.613Z" },
+ { url = "https://files.pythonhosted.org/packages/dd/77/cac1d46f47d32084a703df0d2d29d47e7eb2a7d19fa5cbca0e529ef57659/wrapt-2.0.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2afa23318136709c4b23d87d543b425c399887b4057936cd20386d5b1422b6fa", size = 158866, upload-time = "2025-11-07T00:44:55.79Z" },
+ { url = "https://files.pythonhosted.org/packages/8a/11/b521406daa2421508903bf8d5e8b929216ec2af04839db31c0a2c525eee0/wrapt-2.0.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6c72328f668cf4c503ffcf9434c2b71fdd624345ced7941bc6693e61bbe36bef", size = 146148, upload-time = "2025-11-07T00:44:53.388Z" },
+ { url = "https://files.pythonhosted.org/packages/0c/c0/340b272bed297baa7c9ce0c98ef7017d9c035a17a6a71dce3184b8382da2/wrapt-2.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:3793ac154afb0e5b45d1233cb94d354ef7a983708cc3bb12563853b1d8d53747", size = 155737, upload-time = "2025-11-07T00:44:56.971Z" },
+ { url = "https://files.pythonhosted.org/packages/f3/93/bfcb1fb2bdf186e9c2883a4d1ab45ab099c79cbf8f4e70ea453811fa3ea7/wrapt-2.0.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:fec0d993ecba3991645b4857837277469c8cc4c554a7e24d064d1ca291cfb81f", size = 144451, upload-time = "2025-11-07T00:44:58.515Z" },
+ { url = "https://files.pythonhosted.org/packages/d2/6b/dca504fb18d971139d232652656180e3bd57120e1193d9a5899c3c0b7cdd/wrapt-2.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:949520bccc1fa227274da7d03bf238be15389cd94e32e4297b92337df9b7a349", size = 150353, upload-time = "2025-11-07T00:44:59.753Z" },
+ { url = "https://files.pythonhosted.org/packages/1d/f6/a1de4bd3653afdf91d250ca5c721ee51195df2b61a4603d4b373aa804d1d/wrapt-2.0.1-cp314-cp314t-win32.whl", hash = "sha256:be9e84e91d6497ba62594158d3d31ec0486c60055c49179edc51ee43d095f79c", size = 60609, upload-time = "2025-11-07T00:45:03.315Z" },
+ { url = "https://files.pythonhosted.org/packages/01/3a/07cd60a9d26fe73efead61c7830af975dfdba8537632d410462672e4432b/wrapt-2.0.1-cp314-cp314t-win_amd64.whl", hash = "sha256:61c4956171c7434634401db448371277d07032a81cc21c599c22953374781395", size = 64038, upload-time = "2025-11-07T00:45:00.948Z" },
+ { url = "https://files.pythonhosted.org/packages/41/99/8a06b8e17dddbf321325ae4eb12465804120f699cd1b8a355718300c62da/wrapt-2.0.1-cp314-cp314t-win_arm64.whl", hash = "sha256:35cdbd478607036fee40273be8ed54a451f5f23121bd9d4be515158f9498f7ad", size = 60634, upload-time = "2025-11-07T00:45:02.087Z" },
+ { url = "https://files.pythonhosted.org/packages/15/d1/b51471c11592ff9c012bd3e2f7334a6ff2f42a7aed2caffcf0bdddc9cb89/wrapt-2.0.1-py3-none-any.whl", hash = "sha256:4d2ce1bf1a48c5277d7969259232b57645aae5686dba1eaeade39442277afbca", size = 44046, upload-time = "2025-11-07T00:45:32.116Z" },
+]
+
+[[package]]
+name = "zipp"
+version = "3.23.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/e3/02/0f2892c661036d50ede074e376733dca2ae7c6eb617489437771209d4180/zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166", size = 25547, upload-time = "2025-06-08T17:06:39.4Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e", size = 10276, upload-time = "2025-06-08T17:06:38.034Z" },
+]