Usart: user space driver crates, docs, and async try-read multi-client QEMU flow
diff --git a/MODULE.bazel b/MODULE.bazel
index 2d1ec65..f6bf3bc 100644
--- a/MODULE.bazel
+++ b/MODULE.bazel
@@ -116,6 +116,12 @@
 )
 use_repo(caliptra_repos_ext, "caliptra_mcu_sw", "caliptra_sw")
 
+ast1060_pac_repos_ext = use_extension(
+    "//third_party/ast1060-pac:extensions.bzl",
+    "ast1060_pac_repos",
+)
+use_repo(ast1060_pac_repos_ext, "ast1060_pac")
+
 nonhermetic_repo = use_repo_rule("//target/earlgrey/tooling/signing:nonhermetic.bzl", "nonhermetic_repo")
 
 nonhermetic_repo(name = "nonhermetic")
diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock
index b5a287e..f2e1197 100644
--- a/MODULE.bazel.lock
+++ b/MODULE.bazel.lock
@@ -480,6 +480,32 @@
   },
   "selectedYankedVersions": {},
   "moduleExtensions": {
+    "//third_party/ast1060-pac:extensions.bzl%ast1060_pac_repos": {
+      "general": {
+        "bzlTransitiveDigest": "9k7D+xkEM99NPid/h7wYsj3Z0YaZTgD7Qr32ye2Z5RM=",
+        "usagesDigest": "hP7eNxX+Iwpxc1K8vfzkXD13vb8ur+xKq4rHQmySyyc=",
+        "recordedFileInputs": {},
+        "recordedDirentsInputs": {},
+        "envVariables": {},
+        "generatedRepoSpecs": {
+          "ast1060_pac": {
+            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:git.bzl%git_repository",
+            "attributes": {
+              "build_file": "@@//third_party/ast1060-pac:overlay.BUILD",
+              "commit": "564cd385f0b160b4a5ce435b930d28b87799bc96",
+              "remote": "https://github.com/OpenPRoT/ast1060-pac"
+            }
+          }
+        },
+        "recordedRepoMappingEntries": [
+          [
+            "",
+            "bazel_tools",
+            "bazel_tools"
+          ]
+        ]
+      }
+    },
     "//third_party/caliptra:extensions.bzl%caliptra_repos": {
       "general": {
         "bzlTransitiveDigest": "8cEFLBZLSpLCUIwJNo9rxhRQdKOh+hDpG+Qoj+4YU+k=",
@@ -2672,8 +2698,8 @@
         "bzlTransitiveDigest": "3kVt1CoIJVJiOv5hhXwKcnZWdFwwoEOhc/OeC2GrMQU=",
         "usagesDigest": "/Nz9QH+EBlDXoVXWiAEH8owsAo1cu+GkXjlRdolG7Sk=",
         "recordedFileInputs": {
-          "@@//third_party/crates_io/Cargo.lock": "6c6d5a717de3219d15753d365e003a9b21c6aaa206b10ae410363e47b967291f",
-          "@@//third_party/crates_io/Cargo.toml": "8e2ed358fe2c8f1af9511d3902503788e2207f561ce06babf6ec4024156a80d3",
+          "@@//third_party/crates_io/Cargo.lock": "bbc7b14d634194e289a36caa99b437e0c1b88162219fa5aa719a915fbe86c261",
+          "@@//third_party/crates_io/Cargo.toml": "f27850188faaa844dd1dce91ddb29c635b519bc1daccf9b244f763ccd12f20e3",
           "@@caliptra_deps+//crates_io/embedded/Cargo.lock": "d6c0101f48da22f2bc2d339f358de79bad3dd03218c6db29a14099b9f7757691",
           "@@caliptra_deps+//crates_io/embedded/Cargo.toml": "8f9f4ed2721db13476b12fdac045dac2142b38f189a8abb5f4c446dc0c6ac3dd",
           "@@caliptra_deps+//crates_io/host/Cargo.lock": "ae555b01424917ec61d892c15d7a66af88c2f10be4e0e7b0bc2357b702883b89",
@@ -2699,9 +2725,9 @@
             "repoRuleId": "@@rules_rust+//crate_universe:extensions.bzl%_generate_repo",
             "attributes": {
               "contents": {
-                "BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n#     bazel mod show_repo 'openprot'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files(\n    [\n        \"cargo-bazel.json\",\n        \"crates.bzl\",\n        \"defs.bzl\",\n    ] + glob(\n        allow_empty = True,\n        include = [\"*.bazel\"],\n    ),\n)\n\nfilegroup(\n    name = \"srcs\",\n    srcs = glob(\n        allow_empty = True,\n        include = [\n            \"*.bazel\",\n            \"*.bzl\",\n        ],\n    ),\n)\n\n# Workspace Member Dependencies\nalias(\n    name = \"aes-0.8.4\",\n    actual = \"@rust_crates__aes-0.8.4//:aes\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"aes\",\n    actual = \"@rust_crates__aes-0.8.4//:aes\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"aes-gcm-0.10.3\",\n    actual = \"@rust_crates__aes-gcm-0.10.3//:aes_gcm\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"aes-gcm\",\n    actual = \"@rust_crates__aes-gcm-0.10.3//:aes_gcm\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"aligned-0.4.3\",\n    actual = \"@rust_crates__aligned-0.4.3//:aligned\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"aligned\",\n    actual = \"@rust_crates__aligned-0.4.3//:aligned\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"anyhow-1.0.102\",\n    actual = \"@rust_crates__anyhow-1.0.102//:anyhow\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"anyhow\",\n    actual = \"@rust_crates__anyhow-1.0.102//:anyhow\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"bitfield-0.14.0\",\n    actual = \"@rust_crates__bitfield-0.14.0//:bitfield\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"bitfield\",\n    actual = \"@rust_crates__bitfield-0.14.0//:bitfield\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"bitfield-struct-0.11.0\",\n    actual = \"@rust_crates__bitfield-struct-0.11.0//:bitfield_struct\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"bitfield-struct\",\n    actual = \"@rust_crates__bitfield-struct-0.11.0//:bitfield_struct\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"bitflags-2.11.1\",\n    actual = \"@rust_crates__bitflags-2.11.1//:bitflags\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"bitflags\",\n    actual = \"@rust_crates__bitflags-2.11.1//:bitflags\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"byteorder-1.5.0\",\n    actual = \"@rust_crates__byteorder-1.5.0//:byteorder\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"byteorder\",\n    actual = \"@rust_crates__byteorder-1.5.0//:byteorder\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"cfg-if-1.0.4\",\n    actual = \"@rust_crates__cfg-if-1.0.4//:cfg_if\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"cfg-if\",\n    actual = \"@rust_crates__cfg-if-1.0.4//:cfg_if\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"cipher-0.4.4\",\n    actual = \"@rust_crates__cipher-0.4.4//:cipher\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"cipher\",\n    actual = \"@rust_crates__cipher-0.4.4//:cipher\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"clap-4.6.1\",\n    actual = \"@rust_crates__clap-4.6.1//:clap\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"clap\",\n    actual = \"@rust_crates__clap-4.6.1//:clap\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"compiler_builtins-0.1.160\",\n    actual = \"@rust_crates__compiler_builtins-0.1.160//:compiler_builtins\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"compiler_builtins\",\n    actual = \"@rust_crates__compiler_builtins-0.1.160//:compiler_builtins\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"cortex-m-0.7.7\",\n    actual = \"@rust_crates__cortex-m-0.7.7//:cortex_m\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"cortex-m\",\n    actual = \"@rust_crates__cortex-m-0.7.7//:cortex_m\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"cortex-m-rt-0.7.5\",\n    actual = \"@rust_crates__cortex-m-rt-0.7.5//:cortex_m_rt\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"cortex-m-rt\",\n    actual = \"@rust_crates__cortex-m-rt-0.7.5//:cortex_m_rt\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"cortex-m-semihosting-0.5.0\",\n    actual = \"@rust_crates__cortex-m-semihosting-0.5.0//:cortex_m_semihosting\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"cortex-m-semihosting\",\n    actual = \"@rust_crates__cortex-m-semihosting-0.5.0//:cortex_m_semihosting\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"ctr-0.9.2\",\n    actual = \"@rust_crates__ctr-0.9.2//:ctr\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"ctr\",\n    actual = \"@rust_crates__ctr-0.9.2//:ctr\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"ecdsa-0.16.9\",\n    actual = \"@rust_crates__ecdsa-0.16.9//:ecdsa\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"ecdsa\",\n    actual = \"@rust_crates__ecdsa-0.16.9//:ecdsa\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"embedded-hal-1.0.0\",\n    actual = \"@rust_crates__embedded-hal-1.0.0//:embedded_hal\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"embedded-hal\",\n    actual = \"@rust_crates__embedded-hal-1.0.0//:embedded_hal\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"embedded-hal-async-1.0.0\",\n    actual = \"@rust_crates__embedded-hal-async-1.0.0//:embedded_hal_async\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"embedded-hal-async\",\n    actual = \"@rust_crates__embedded-hal-async-1.0.0//:embedded_hal_async\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"embedded-hal-nb-1.0.0\",\n    actual = \"@rust_crates__embedded-hal-nb-1.0.0//:embedded_hal_nb\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"embedded-hal-nb\",\n    actual = \"@rust_crates__embedded-hal-nb-1.0.0//:embedded_hal_nb\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"embedded-io-0.6.1\",\n    actual = \"@rust_crates__embedded-io-0.6.1//:embedded_io\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"embedded-io\",\n    actual = \"@rust_crates__embedded-io-0.6.1//:embedded_io\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"futures-0.3.32\",\n    actual = \"@rust_crates__futures-0.3.32//:futures\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"futures\",\n    actual = \"@rust_crates__futures-0.3.32//:futures\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"heapless-0.9.2\",\n    actual = \"@rust_crates__heapless-0.9.2//:heapless\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"heapless\",\n    actual = \"@rust_crates__heapless-0.9.2//:heapless\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"hex-0.4.3\",\n    actual = \"@rust_crates__hex-0.4.3//:hex\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"hex\",\n    actual = \"@rust_crates__hex-0.4.3//:hex\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"hmac-0.12.1\",\n    actual = \"@rust_crates__hmac-0.12.1//:hmac\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"hmac\",\n    actual = \"@rust_crates__hmac-0.12.1//:hmac\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"k256-0.13.4\",\n    actual = \"@rust_crates__k256-0.13.4//:k256\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"k256\",\n    actual = \"@rust_crates__k256-0.13.4//:k256\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"log-0.4.29\",\n    actual = \"@rust_crates__log-0.4.29//:log\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"log\",\n    actual = \"@rust_crates__log-0.4.29//:log\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"memoffset-0.9.1\",\n    actual = \"@rust_crates__memoffset-0.9.1//:memoffset\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"memoffset\",\n    actual = \"@rust_crates__memoffset-0.9.1//:memoffset\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"minijinja-2.19.0\",\n    actual = \"@rust_crates__minijinja-2.19.0//:minijinja\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"minijinja\",\n    actual = \"@rust_crates__minijinja-2.19.0//:minijinja\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"nb-1.1.0\",\n    actual = \"@rust_crates__nb-1.1.0//:nb\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"nb\",\n    actual = \"@rust_crates__nb-1.1.0//:nb\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"nom-7.1.3\",\n    actual = \"@rust_crates__nom-7.1.3//:nom\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"nom\",\n    actual = \"@rust_crates__nom-7.1.3//:nom\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"object-0.37.3\",\n    actual = \"@rust_crates__object-0.37.3//:object\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"object\",\n    actual = \"@rust_crates__object-0.37.3//:object\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"p256-0.13.2\",\n    actual = \"@rust_crates__p256-0.13.2//:p256\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"p256\",\n    actual = \"@rust_crates__p256-0.13.2//:p256\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"p384-0.13.1\",\n    actual = \"@rust_crates__p384-0.13.1//:p384\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"p384\",\n    actual = \"@rust_crates__p384-0.13.1//:p384\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"paste-1.0.15\",\n    actual = \"@rust_crates__paste-1.0.15//:paste\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"paste\",\n    actual = \"@rust_crates__paste-1.0.15//:paste\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"proc-macro2-1.0.106\",\n    actual = \"@rust_crates__proc-macro2-1.0.106//:proc_macro2\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"proc-macro2\",\n    actual = \"@rust_crates__proc-macro2-1.0.106//:proc_macro2\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"prost-0.13.5\",\n    actual = \"@rust_crates__prost-0.13.5//:prost\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"prost\",\n    actual = \"@rust_crates__prost-0.13.5//:prost\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"quote-1.0.45\",\n    actual = \"@rust_crates__quote-1.0.45//:quote\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"quote\",\n    actual = \"@rust_crates__quote-1.0.45//:quote\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"rand_core-0.9.5\",\n    actual = \"@rust_crates__rand_core-0.9.5//:rand_core\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"rand_core\",\n    actual = \"@rust_crates__rand_core-0.9.5//:rand_core\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"riscv-0.12.1\",\n    actual = \"@rust_crates__riscv-0.12.1//:riscv\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"riscv\",\n    actual = \"@rust_crates__riscv-0.12.1//:riscv\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"riscv-rt-0.12.2\",\n    actual = \"@rust_crates__riscv-rt-0.12.2//:riscv_rt\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"riscv-rt\",\n    actual = \"@rust_crates__riscv-rt-0.12.2//:riscv_rt\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"riscv-semihosting-0.1.3\",\n    actual = \"@rust_crates__riscv-semihosting-0.1.3//:riscv_semihosting\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"riscv-semihosting\",\n    actual = \"@rust_crates__riscv-semihosting-0.1.3//:riscv_semihosting\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"rustc-demangle-0.1.27\",\n    actual = \"@rust_crates__rustc-demangle-0.1.27//:rustc_demangle\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"rustc-demangle\",\n    actual = \"@rust_crates__rustc-demangle-0.1.27//:rustc_demangle\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"sec1-0.7.3\",\n    actual = \"@rust_crates__sec1-0.7.3//:sec1\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"sec1\",\n    actual = \"@rust_crates__sec1-0.7.3//:sec1\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"serde-1.0.228\",\n    actual = \"@rust_crates__serde-1.0.228//:serde\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"serde\",\n    actual = \"@rust_crates__serde-1.0.228//:serde\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"serde_derive-1.0.228\",\n    actual = \"@rust_crates__serde_derive-1.0.228//:serde_derive\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"serde_derive\",\n    actual = \"@rust_crates__serde_derive-1.0.228//:serde_derive\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"serde_json5-0.2.1\",\n    actual = \"@rust_crates__serde_json5-0.2.1//:serde_json5\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"serde_json5\",\n    actual = \"@rust_crates__serde_json5-0.2.1//:serde_json5\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"sha2-0.10.9\",\n    actual = \"@rust_crates__sha2-0.10.9//:sha2\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"sha2\",\n    actual = \"@rust_crates__sha2-0.10.9//:sha2\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"sha3-0.10.9\",\n    actual = \"@rust_crates__sha3-0.10.9//:sha3\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"sha3\",\n    actual = \"@rust_crates__sha3-0.10.9//:sha3\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"smlang-0.8.0\",\n    actual = \"@rust_crates__smlang-0.8.0//:smlang\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"smlang\",\n    actual = \"@rust_crates__smlang-0.8.0//:smlang\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"subtle-2.6.1\",\n    actual = \"@rust_crates__subtle-2.6.1//:subtle\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"subtle\",\n    actual = \"@rust_crates__subtle-2.6.1//:subtle\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"syn-1.0.109\",\n    actual = \"@rust_crates__syn-1.0.109//:syn\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"syn1-1.0.109\",\n    actual = \"@rust_crates__syn-1.0.109//:syn\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"syn1\",\n    actual = \"@rust_crates__syn-1.0.109//:syn\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"syn-2.0.117\",\n    actual = \"@rust_crates__syn-2.0.117//:syn\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"syn\",\n    actual = \"@rust_crates__syn-2.0.117//:syn\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"thiserror-2.0.18\",\n    actual = \"@rust_crates__thiserror-2.0.18//:thiserror\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"thiserror\",\n    actual = \"@rust_crates__thiserror-2.0.18//:thiserror\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"tock-registers-0.9.0\",\n    actual = \"@rust_crates__tock-registers-0.9.0//:tock_registers\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"tock-registers\",\n    actual = \"@rust_crates__tock-registers-0.9.0//:tock_registers\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"tokio-1.52.1\",\n    actual = \"@rust_crates__tokio-1.52.1//:tokio\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"tokio\",\n    actual = \"@rust_crates__tokio-1.52.1//:tokio\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"tokio-util-0.7.18\",\n    actual = \"@rust_crates__tokio-util-0.7.18//:tokio_util\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"tokio-util\",\n    actual = \"@rust_crates__tokio-util-0.7.18//:tokio_util\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"zerocopy-0.8.48\",\n    actual = \"@rust_crates__zerocopy-0.8.48//:zerocopy\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"zerocopy\",\n    actual = \"@rust_crates__zerocopy-0.8.48//:zerocopy\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"zeroize-1.8.2\",\n    actual = \"@rust_crates__zeroize-1.8.2//:zeroize\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"zeroize\",\n    actual = \"@rust_crates__zeroize-1.8.2//:zeroize\",\n    tags = [\"manual\"],\n)\n",
+                "BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n#     bazel mod show_repo 'openprot'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files(\n    [\n        \"cargo-bazel.json\",\n        \"crates.bzl\",\n        \"defs.bzl\",\n    ] + glob(\n        allow_empty = True,\n        include = [\"*.bazel\"],\n    ),\n)\n\nfilegroup(\n    name = \"srcs\",\n    srcs = glob(\n        allow_empty = True,\n        include = [\n            \"*.bazel\",\n            \"*.bzl\",\n        ],\n    ),\n)\n\n# Workspace Member Dependencies\nalias(\n    name = \"aes-0.8.4\",\n    actual = \"@rust_crates__aes-0.8.4//:aes\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"aes\",\n    actual = \"@rust_crates__aes-0.8.4//:aes\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"aes-gcm-0.10.3\",\n    actual = \"@rust_crates__aes-gcm-0.10.3//:aes_gcm\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"aes-gcm\",\n    actual = \"@rust_crates__aes-gcm-0.10.3//:aes_gcm\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"aligned-0.4.3\",\n    actual = \"@rust_crates__aligned-0.4.3//:aligned\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"aligned\",\n    actual = \"@rust_crates__aligned-0.4.3//:aligned\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"anyhow-1.0.102\",\n    actual = \"@rust_crates__anyhow-1.0.102//:anyhow\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"anyhow\",\n    actual = \"@rust_crates__anyhow-1.0.102//:anyhow\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"bitfield-0.14.0\",\n    actual = \"@rust_crates__bitfield-0.14.0//:bitfield\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"bitfield\",\n    actual = \"@rust_crates__bitfield-0.14.0//:bitfield\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"bitfield-struct-0.11.0\",\n    actual = \"@rust_crates__bitfield-struct-0.11.0//:bitfield_struct\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"bitfield-struct\",\n    actual = \"@rust_crates__bitfield-struct-0.11.0//:bitfield_struct\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"bitflags-2.11.1\",\n    actual = \"@rust_crates__bitflags-2.11.1//:bitflags\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"bitflags\",\n    actual = \"@rust_crates__bitflags-2.11.1//:bitflags\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"byteorder-1.5.0\",\n    actual = \"@rust_crates__byteorder-1.5.0//:byteorder\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"byteorder\",\n    actual = \"@rust_crates__byteorder-1.5.0//:byteorder\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"cfg-if-1.0.4\",\n    actual = \"@rust_crates__cfg-if-1.0.4//:cfg_if\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"cfg-if\",\n    actual = \"@rust_crates__cfg-if-1.0.4//:cfg_if\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"cipher-0.4.4\",\n    actual = \"@rust_crates__cipher-0.4.4//:cipher\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"cipher\",\n    actual = \"@rust_crates__cipher-0.4.4//:cipher\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"clap-4.6.1\",\n    actual = \"@rust_crates__clap-4.6.1//:clap\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"clap\",\n    actual = \"@rust_crates__clap-4.6.1//:clap\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"compiler_builtins-0.1.160\",\n    actual = \"@rust_crates__compiler_builtins-0.1.160//:compiler_builtins\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"compiler_builtins\",\n    actual = \"@rust_crates__compiler_builtins-0.1.160//:compiler_builtins\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"cortex-m-0.7.7\",\n    actual = \"@rust_crates__cortex-m-0.7.7//:cortex_m\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"cortex-m\",\n    actual = \"@rust_crates__cortex-m-0.7.7//:cortex_m\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"cortex-m-rt-0.7.5\",\n    actual = \"@rust_crates__cortex-m-rt-0.7.5//:cortex_m_rt\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"cortex-m-rt\",\n    actual = \"@rust_crates__cortex-m-rt-0.7.5//:cortex_m_rt\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"cortex-m-semihosting-0.5.0\",\n    actual = \"@rust_crates__cortex-m-semihosting-0.5.0//:cortex_m_semihosting\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"cortex-m-semihosting\",\n    actual = \"@rust_crates__cortex-m-semihosting-0.5.0//:cortex_m_semihosting\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"ctr-0.9.2\",\n    actual = \"@rust_crates__ctr-0.9.2//:ctr\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"ctr\",\n    actual = \"@rust_crates__ctr-0.9.2//:ctr\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"ecdsa-0.16.9\",\n    actual = \"@rust_crates__ecdsa-0.16.9//:ecdsa\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"ecdsa\",\n    actual = \"@rust_crates__ecdsa-0.16.9//:ecdsa\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"embedded-hal-1.0.0\",\n    actual = \"@rust_crates__embedded-hal-1.0.0//:embedded_hal\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"embedded-hal\",\n    actual = \"@rust_crates__embedded-hal-1.0.0//:embedded_hal\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"embedded-hal-async-1.0.0\",\n    actual = \"@rust_crates__embedded-hal-async-1.0.0//:embedded_hal_async\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"embedded-hal-async\",\n    actual = \"@rust_crates__embedded-hal-async-1.0.0//:embedded_hal_async\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"embedded-hal-nb-1.0.0\",\n    actual = \"@rust_crates__embedded-hal-nb-1.0.0//:embedded_hal_nb\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"embedded-hal-nb\",\n    actual = \"@rust_crates__embedded-hal-nb-1.0.0//:embedded_hal_nb\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"embedded-io-0.6.1\",\n    actual = \"@rust_crates__embedded-io-0.6.1//:embedded_io\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"embedded-io\",\n    actual = \"@rust_crates__embedded-io-0.6.1//:embedded_io\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"futures-0.3.32\",\n    actual = \"@rust_crates__futures-0.3.32//:futures\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"futures\",\n    actual = \"@rust_crates__futures-0.3.32//:futures\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"heapless-0.9.2\",\n    actual = \"@rust_crates__heapless-0.9.2//:heapless\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"heapless\",\n    actual = \"@rust_crates__heapless-0.9.2//:heapless\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"hex-0.4.3\",\n    actual = \"@rust_crates__hex-0.4.3//:hex\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"hex\",\n    actual = \"@rust_crates__hex-0.4.3//:hex\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"hmac-0.12.1\",\n    actual = \"@rust_crates__hmac-0.12.1//:hmac\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"hmac\",\n    actual = \"@rust_crates__hmac-0.12.1//:hmac\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"k256-0.13.4\",\n    actual = \"@rust_crates__k256-0.13.4//:k256\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"k256\",\n    actual = \"@rust_crates__k256-0.13.4//:k256\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"log-0.4.29\",\n    actual = \"@rust_crates__log-0.4.29//:log\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"log\",\n    actual = \"@rust_crates__log-0.4.29//:log\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"mctp-0.2.0\",\n    actual = \"@rust_crates__mctp-0.2.0//:mctp\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"mctp\",\n    actual = \"@rust_crates__mctp-0.2.0//:mctp\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"mctp-lib-0.1.0\",\n    actual = \"@rust_crates__mctp-lib-0.1.0//:mctp_lib\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"mctp-lib\",\n    actual = \"@rust_crates__mctp-lib-0.1.0//:mctp_lib\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"memoffset-0.9.1\",\n    actual = \"@rust_crates__memoffset-0.9.1//:memoffset\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"memoffset\",\n    actual = \"@rust_crates__memoffset-0.9.1//:memoffset\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"minijinja-2.19.0\",\n    actual = \"@rust_crates__minijinja-2.19.0//:minijinja\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"minijinja\",\n    actual = \"@rust_crates__minijinja-2.19.0//:minijinja\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"nb-1.1.0\",\n    actual = \"@rust_crates__nb-1.1.0//:nb\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"nb\",\n    actual = \"@rust_crates__nb-1.1.0//:nb\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"nom-7.1.3\",\n    actual = \"@rust_crates__nom-7.1.3//:nom\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"nom\",\n    actual = \"@rust_crates__nom-7.1.3//:nom\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"object-0.37.3\",\n    actual = \"@rust_crates__object-0.37.3//:object\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"object\",\n    actual = \"@rust_crates__object-0.37.3//:object\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"p256-0.13.2\",\n    actual = \"@rust_crates__p256-0.13.2//:p256\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"p256\",\n    actual = \"@rust_crates__p256-0.13.2//:p256\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"p384-0.13.1\",\n    actual = \"@rust_crates__p384-0.13.1//:p384\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"p384\",\n    actual = \"@rust_crates__p384-0.13.1//:p384\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"paste-1.0.15\",\n    actual = \"@rust_crates__paste-1.0.15//:paste\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"paste\",\n    actual = \"@rust_crates__paste-1.0.15//:paste\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"proc-macro2-1.0.106\",\n    actual = \"@rust_crates__proc-macro2-1.0.106//:proc_macro2\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"proc-macro2\",\n    actual = \"@rust_crates__proc-macro2-1.0.106//:proc_macro2\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"prost-0.13.5\",\n    actual = \"@rust_crates__prost-0.13.5//:prost\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"prost\",\n    actual = \"@rust_crates__prost-0.13.5//:prost\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"quote-1.0.45\",\n    actual = \"@rust_crates__quote-1.0.45//:quote\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"quote\",\n    actual = \"@rust_crates__quote-1.0.45//:quote\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"rand_core-0.9.5\",\n    actual = \"@rust_crates__rand_core-0.9.5//:rand_core\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"rand_core\",\n    actual = \"@rust_crates__rand_core-0.9.5//:rand_core\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"riscv-0.12.1\",\n    actual = \"@rust_crates__riscv-0.12.1//:riscv\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"riscv\",\n    actual = \"@rust_crates__riscv-0.12.1//:riscv\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"riscv-rt-0.12.2\",\n    actual = \"@rust_crates__riscv-rt-0.12.2//:riscv_rt\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"riscv-rt\",\n    actual = \"@rust_crates__riscv-rt-0.12.2//:riscv_rt\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"riscv-semihosting-0.1.3\",\n    actual = \"@rust_crates__riscv-semihosting-0.1.3//:riscv_semihosting\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"riscv-semihosting\",\n    actual = \"@rust_crates__riscv-semihosting-0.1.3//:riscv_semihosting\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"rustc-demangle-0.1.27\",\n    actual = \"@rust_crates__rustc-demangle-0.1.27//:rustc_demangle\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"rustc-demangle\",\n    actual = \"@rust_crates__rustc-demangle-0.1.27//:rustc_demangle\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"sec1-0.7.3\",\n    actual = \"@rust_crates__sec1-0.7.3//:sec1\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"sec1\",\n    actual = \"@rust_crates__sec1-0.7.3//:sec1\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"serde-1.0.228\",\n    actual = \"@rust_crates__serde-1.0.228//:serde\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"serde\",\n    actual = \"@rust_crates__serde-1.0.228//:serde\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"serde_derive-1.0.228\",\n    actual = \"@rust_crates__serde_derive-1.0.228//:serde_derive\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"serde_derive\",\n    actual = \"@rust_crates__serde_derive-1.0.228//:serde_derive\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"serde_json5-0.2.1\",\n    actual = \"@rust_crates__serde_json5-0.2.1//:serde_json5\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"serde_json5\",\n    actual = \"@rust_crates__serde_json5-0.2.1//:serde_json5\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"sha2-0.10.9\",\n    actual = \"@rust_crates__sha2-0.10.9//:sha2\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"sha2\",\n    actual = \"@rust_crates__sha2-0.10.9//:sha2\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"sha3-0.10.9\",\n    actual = \"@rust_crates__sha3-0.10.9//:sha3\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"sha3\",\n    actual = \"@rust_crates__sha3-0.10.9//:sha3\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"smlang-0.8.0\",\n    actual = \"@rust_crates__smlang-0.8.0//:smlang\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"smlang\",\n    actual = \"@rust_crates__smlang-0.8.0//:smlang\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"subtle-2.6.1\",\n    actual = \"@rust_crates__subtle-2.6.1//:subtle\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"subtle\",\n    actual = \"@rust_crates__subtle-2.6.1//:subtle\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"syn-1.0.109\",\n    actual = \"@rust_crates__syn-1.0.109//:syn\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"syn1-1.0.109\",\n    actual = \"@rust_crates__syn-1.0.109//:syn\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"syn1\",\n    actual = \"@rust_crates__syn-1.0.109//:syn\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"syn-2.0.117\",\n    actual = \"@rust_crates__syn-2.0.117//:syn\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"syn\",\n    actual = \"@rust_crates__syn-2.0.117//:syn\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"thiserror-2.0.18\",\n    actual = \"@rust_crates__thiserror-2.0.18//:thiserror\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"thiserror\",\n    actual = \"@rust_crates__thiserror-2.0.18//:thiserror\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"tock-registers-0.9.0\",\n    actual = \"@rust_crates__tock-registers-0.9.0//:tock_registers\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"tock-registers\",\n    actual = \"@rust_crates__tock-registers-0.9.0//:tock_registers\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"tokio-1.52.1\",\n    actual = \"@rust_crates__tokio-1.52.1//:tokio\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"tokio\",\n    actual = \"@rust_crates__tokio-1.52.1//:tokio\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"tokio-util-0.7.18\",\n    actual = \"@rust_crates__tokio-util-0.7.18//:tokio_util\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"tokio-util\",\n    actual = \"@rust_crates__tokio-util-0.7.18//:tokio_util\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"vcell-0.1.3\",\n    actual = \"@rust_crates__vcell-0.1.3//:vcell\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"vcell\",\n    actual = \"@rust_crates__vcell-0.1.3//:vcell\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"zerocopy-0.8.48\",\n    actual = \"@rust_crates__zerocopy-0.8.48//:zerocopy\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"zerocopy\",\n    actual = \"@rust_crates__zerocopy-0.8.48//:zerocopy\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"zeroize-1.8.2\",\n    actual = \"@rust_crates__zeroize-1.8.2//:zeroize\",\n    tags = [\"manual\"],\n)\n\nalias(\n    name = \"zeroize\",\n    actual = \"@rust_crates__zeroize-1.8.2//:zeroize\",\n    tags = [\"manual\"],\n)\n",
                 "alias_rules.bzl": "\"\"\"Alias that transitions its target to `compilation_mode=opt`.  Use `transition_alias=\"opt\"` to enable.\"\"\"\n\nload(\"@rules_cc//cc:defs.bzl\", \"CcInfo\")\nload(\"@rules_rust//rust:rust_common.bzl\", \"COMMON_PROVIDERS\")\n\ndef _transition_alias_impl(ctx):\n    # `ctx.attr.actual` is a list of 1 item due to the transition\n    providers = [ctx.attr.actual[0][provider] for provider in COMMON_PROVIDERS]\n    if CcInfo in ctx.attr.actual[0]:\n        providers.append(ctx.attr.actual[0][CcInfo])\n    return providers\n\ndef _change_compilation_mode(compilation_mode):\n    def _change_compilation_mode_impl(_settings, _attr):\n        return {\n            \"//command_line_option:compilation_mode\": compilation_mode,\n        }\n\n    return transition(\n        implementation = _change_compilation_mode_impl,\n        inputs = [],\n        outputs = [\n            \"//command_line_option:compilation_mode\",\n        ],\n    )\n\ndef _transition_alias_rule(compilation_mode):\n    return rule(\n        implementation = _transition_alias_impl,\n        provides = COMMON_PROVIDERS,\n        attrs = {\n            \"actual\": attr.label(\n                mandatory = True,\n                doc = \"`rust_library()` target to transition to `compilation_mode=opt`.\",\n                providers = COMMON_PROVIDERS,\n                cfg = _change_compilation_mode(compilation_mode),\n            ),\n            \"_allowlist_function_transition\": attr.label(\n                default = \"@bazel_tools//tools/allowlists/function_transition_allowlist\",\n            ),\n        },\n        doc = \"Transitions a Rust library crate to the `compilation_mode=opt`.\",\n    )\n\ntransition_alias_dbg = _transition_alias_rule(\"dbg\")\ntransition_alias_fastbuild = _transition_alias_rule(\"fastbuild\")\ntransition_alias_opt = _transition_alias_rule(\"opt\")\n",
-                "defs.bzl": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n#     bazel mod show_repo 'openprot'\n###############################################################################\n\"\"\"\n# `crates_repository` API\n\n- [aliases](#aliases)\n- [crate_deps](#crate_deps)\n- [all_crate_deps](#all_crate_deps)\n- [crate_repositories](#crate_repositories)\n\n\"\"\"\n\nload(\"@bazel_tools//tools/build_defs/repo:git.bzl\", \"new_git_repository\")\nload(\"@bazel_tools//tools/build_defs/repo:http.bzl\", \"http_archive\")\nload(\"@bazel_tools//tools/build_defs/repo:utils.bzl\", \"maybe\")\nload(\"@bazel_skylib//lib:selects.bzl\", \"selects\")\nload(\"@rules_rust//crate_universe/private:local_crate_mirror.bzl\", \"local_crate_mirror\")\n\n###############################################################################\n# MACROS API\n###############################################################################\n\n# An identifier that represent common dependencies (unconditional).\n_COMMON_CONDITION = \"\"\n\ndef _flatten_dependency_maps(all_dependency_maps):\n    \"\"\"Flatten a list of dependency maps into one dictionary.\n\n    Dependency maps have the following structure:\n\n    ```python\n    DEPENDENCIES_MAP = {\n        # The first key in the map is a Bazel package\n        # name of the workspace this file is defined in.\n        \"workspace_member_package\": {\n\n            # Not all dependencies are supported for all platforms.\n            # the condition key is the condition required to be true\n            # on the host platform.\n            \"condition\": {\n\n                # An alias to a crate target.     # The label of the crate target the\n                # Aliases are only crate names.   # package name refers to.\n                \"package_name\":                   \"@full//:label\",\n            }\n        }\n    }\n    ```\n\n    Args:\n        all_dependency_maps (list): A list of dicts as described above\n\n    Returns:\n        dict: A dictionary as described above\n    \"\"\"\n    dependencies = {}\n\n    for workspace_deps_map in all_dependency_maps:\n        for pkg_name, conditional_deps_map in workspace_deps_map.items():\n            if pkg_name not in dependencies:\n                non_frozen_map = dict()\n                for key, values in conditional_deps_map.items():\n                    non_frozen_map.update({key: dict(values.items())})\n                dependencies.setdefault(pkg_name, non_frozen_map)\n                continue\n\n            for condition, deps_map in conditional_deps_map.items():\n                # If the condition has not been recorded, do so and continue\n                if condition not in dependencies[pkg_name]:\n                    dependencies[pkg_name].setdefault(condition, dict(deps_map.items()))\n                    continue\n\n                # Alert on any miss-matched dependencies\n                inconsistent_entries = []\n                for crate_name, crate_label in deps_map.items():\n                    existing = dependencies[pkg_name][condition].get(crate_name)\n                    if existing and existing != crate_label:\n                        inconsistent_entries.append((crate_name, existing, crate_label))\n                    dependencies[pkg_name][condition].update({crate_name: crate_label})\n\n    return dependencies\n\ndef crate_deps(deps, package_name = None):\n    \"\"\"Finds the fully qualified label of the requested crates for the package where this macro is called.\n\n    Args:\n        deps (list): The desired list of crate targets.\n        package_name (str, optional): The package name of the set of dependencies to look up.\n            Defaults to `native.package_name()`.\n\n    Returns:\n        list: A list of labels to generated rust targets (str)\n    \"\"\"\n\n    if not deps:\n        return []\n\n    if package_name == None:\n        package_name = native.package_name()\n\n    # Join both sets of dependencies\n    dependencies = _flatten_dependency_maps([\n        _NORMAL_DEPENDENCIES,\n        _NORMAL_DEV_DEPENDENCIES,\n        _PROC_MACRO_DEPENDENCIES,\n        _PROC_MACRO_DEV_DEPENDENCIES,\n        _BUILD_DEPENDENCIES,\n        _BUILD_PROC_MACRO_DEPENDENCIES,\n    ]).pop(package_name, {})\n\n    # Combine all conditional packages so we can easily index over a flat list\n    # TODO: Perhaps this should actually return select statements and maintain\n    # the conditionals of the dependencies\n    flat_deps = {}\n    for deps_set in dependencies.values():\n        for crate_name, crate_label in deps_set.items():\n            flat_deps.update({crate_name: crate_label})\n\n    missing_crates = []\n    crate_targets = []\n    for crate_target in deps:\n        if crate_target not in flat_deps:\n            missing_crates.append(crate_target)\n        else:\n            crate_targets.append(flat_deps[crate_target])\n\n    if missing_crates:\n        fail(\"Could not find crates `{}` among dependencies of `{}`. Available dependencies were `{}`\".format(\n            missing_crates,\n            package_name,\n            dependencies,\n        ))\n\n    return crate_targets\n\ndef all_crate_deps(\n        normal = False, \n        normal_dev = False, \n        proc_macro = False, \n        proc_macro_dev = False,\n        build = False,\n        build_proc_macro = False,\n        package_name = None):\n    \"\"\"Finds the fully qualified label of all requested direct crate dependencies \\\n    for the package where this macro is called.\n\n    If no parameters are set, all normal dependencies are returned. Setting any one flag will\n    otherwise impact the contents of the returned list.\n\n    Args:\n        normal (bool, optional): If True, normal dependencies are included in the\n            output list.\n        normal_dev (bool, optional): If True, normal dev dependencies will be\n            included in the output list..\n        proc_macro (bool, optional): If True, proc_macro dependencies are included\n            in the output list.\n        proc_macro_dev (bool, optional): If True, dev proc_macro dependencies are\n            included in the output list.\n        build (bool, optional): If True, build dependencies are included\n            in the output list.\n        build_proc_macro (bool, optional): If True, build proc_macro dependencies are\n            included in the output list.\n        package_name (str, optional): The package name of the set of dependencies to look up.\n            Defaults to `native.package_name()` when unset.\n\n    Returns:\n        list: A list of labels to generated rust targets (str)\n    \"\"\"\n\n    if package_name == None:\n        package_name = native.package_name()\n\n    # Determine the relevant maps to use\n    all_dependency_maps = []\n    if normal:\n        all_dependency_maps.append(_NORMAL_DEPENDENCIES)\n    if normal_dev:\n        all_dependency_maps.append(_NORMAL_DEV_DEPENDENCIES)\n    if proc_macro:\n        all_dependency_maps.append(_PROC_MACRO_DEPENDENCIES)\n    if proc_macro_dev:\n        all_dependency_maps.append(_PROC_MACRO_DEV_DEPENDENCIES)\n    if build:\n        all_dependency_maps.append(_BUILD_DEPENDENCIES)\n    if build_proc_macro:\n        all_dependency_maps.append(_BUILD_PROC_MACRO_DEPENDENCIES)\n\n    # Default to always using normal dependencies\n    if not all_dependency_maps:\n        all_dependency_maps.append(_NORMAL_DEPENDENCIES)\n\n    dependencies = _flatten_dependency_maps(all_dependency_maps).pop(package_name, None)\n\n    if not dependencies:\n        if dependencies == None:\n            fail(\"Tried to get all_crate_deps for package \" + package_name + \" but that package had no Cargo.toml file\")\n        else:\n            return []\n\n    crate_deps = list(dependencies.pop(_COMMON_CONDITION, {}).values())\n    for condition, deps in dependencies.items():\n        crate_deps += selects.with_or({\n            tuple(_CONDITIONS[condition]): deps.values(),\n            \"//conditions:default\": [],\n        })\n\n    return crate_deps\n\ndef aliases(\n        normal = False,\n        normal_dev = False,\n        proc_macro = False,\n        proc_macro_dev = False,\n        build = False,\n        build_proc_macro = False,\n        package_name = None):\n    \"\"\"Produces a map of Crate alias names to their original label\n\n    If no dependency kinds are specified, `normal` and `proc_macro` are used by default.\n    Setting any one flag will otherwise determine the contents of the returned dict.\n\n    Args:\n        normal (bool, optional): If True, normal dependencies are included in the\n            output list.\n        normal_dev (bool, optional): If True, normal dev dependencies will be\n            included in the output list..\n        proc_macro (bool, optional): If True, proc_macro dependencies are included\n            in the output list.\n        proc_macro_dev (bool, optional): If True, dev proc_macro dependencies are\n            included in the output list.\n        build (bool, optional): If True, build dependencies are included\n            in the output list.\n        build_proc_macro (bool, optional): If True, build proc_macro dependencies are\n            included in the output list.\n        package_name (str, optional): The package name of the set of dependencies to look up.\n            Defaults to `native.package_name()` when unset.\n\n    Returns:\n        dict: The aliases of all associated packages\n    \"\"\"\n    if package_name == None:\n        package_name = native.package_name()\n\n    # Determine the relevant maps to use\n    all_aliases_maps = []\n    if normal:\n        all_aliases_maps.append(_NORMAL_ALIASES)\n    if normal_dev:\n        all_aliases_maps.append(_NORMAL_DEV_ALIASES)\n    if proc_macro:\n        all_aliases_maps.append(_PROC_MACRO_ALIASES)\n    if proc_macro_dev:\n        all_aliases_maps.append(_PROC_MACRO_DEV_ALIASES)\n    if build:\n        all_aliases_maps.append(_BUILD_ALIASES)\n    if build_proc_macro:\n        all_aliases_maps.append(_BUILD_PROC_MACRO_ALIASES)\n\n    # Default to always using normal aliases\n    if not all_aliases_maps:\n        all_aliases_maps.append(_NORMAL_ALIASES)\n        all_aliases_maps.append(_PROC_MACRO_ALIASES)\n\n    aliases = _flatten_dependency_maps(all_aliases_maps).pop(package_name, None)\n\n    if not aliases:\n        return dict()\n\n    common_items = aliases.pop(_COMMON_CONDITION, {}).items()\n\n    # If there are only common items in the dictionary, immediately return them\n    if not len(aliases.keys()) == 1:\n        return dict(common_items)\n\n    # Build a single select statement where each conditional has accounted for the\n    # common set of aliases.\n    crate_aliases = {\"//conditions:default\": dict(common_items)}\n    for condition, deps in aliases.items():\n        condition_triples = _CONDITIONS[condition]\n        for triple in condition_triples:\n            if triple in crate_aliases:\n                crate_aliases[triple].update(deps)\n            else:\n                crate_aliases.update({triple: dict(deps.items() + common_items)})\n\n    return select(crate_aliases)\n\n###############################################################################\n# WORKSPACE MEMBER DEPS AND ALIASES\n###############################################################################\n\n_NORMAL_DEPENDENCIES = {\n    \"third_party/crates_io\": {\n        _COMMON_CONDITION: {\n            \"aes\": Label(\"@rust_crates//:aes-0.8.4\"),\n            \"aes-gcm\": Label(\"@rust_crates//:aes-gcm-0.10.3\"),\n            \"aligned\": Label(\"@rust_crates//:aligned-0.4.3\"),\n            \"anyhow\": Label(\"@rust_crates//:anyhow-1.0.102\"),\n            \"bitfield\": Label(\"@rust_crates//:bitfield-0.14.0\"),\n            \"bitflags\": Label(\"@rust_crates//:bitflags-2.11.1\"),\n            \"byteorder\": Label(\"@rust_crates//:byteorder-1.5.0\"),\n            \"cfg-if\": Label(\"@rust_crates//:cfg-if-1.0.4\"),\n            \"cipher\": Label(\"@rust_crates//:cipher-0.4.4\"),\n            \"clap\": Label(\"@rust_crates//:clap-4.6.1\"),\n            \"compiler_builtins\": Label(\"@rust_crates//:compiler_builtins-0.1.160\"),\n            \"cortex-m\": Label(\"@rust_crates//:cortex-m-0.7.7\"),\n            \"cortex-m-rt\": Label(\"@rust_crates//:cortex-m-rt-0.7.5\"),\n            \"cortex-m-semihosting\": Label(\"@rust_crates//:cortex-m-semihosting-0.5.0\"),\n            \"ctr\": Label(\"@rust_crates//:ctr-0.9.2\"),\n            \"ecdsa\": Label(\"@rust_crates//:ecdsa-0.16.9\"),\n            \"embedded-hal\": Label(\"@rust_crates//:embedded-hal-1.0.0\"),\n            \"embedded-hal-async\": Label(\"@rust_crates//:embedded-hal-async-1.0.0\"),\n            \"embedded-hal-nb\": Label(\"@rust_crates//:embedded-hal-nb-1.0.0\"),\n            \"embedded-io\": Label(\"@rust_crates//:embedded-io-0.6.1\"),\n            \"futures\": Label(\"@rust_crates//:futures-0.3.32\"),\n            \"heapless\": Label(\"@rust_crates//:heapless-0.9.2\"),\n            \"hex\": Label(\"@rust_crates//:hex-0.4.3\"),\n            \"hmac\": Label(\"@rust_crates//:hmac-0.12.1\"),\n            \"k256\": Label(\"@rust_crates//:k256-0.13.4\"),\n            \"log\": Label(\"@rust_crates//:log-0.4.29\"),\n            \"memoffset\": Label(\"@rust_crates//:memoffset-0.9.1\"),\n            \"minijinja\": Label(\"@rust_crates//:minijinja-2.19.0\"),\n            \"nb\": Label(\"@rust_crates//:nb-1.1.0\"),\n            \"nom\": Label(\"@rust_crates//:nom-7.1.3\"),\n            \"object\": Label(\"@rust_crates//:object-0.37.3\"),\n            \"p256\": Label(\"@rust_crates//:p256-0.13.2\"),\n            \"p384\": Label(\"@rust_crates//:p384-0.13.1\"),\n            \"proc-macro2\": Label(\"@rust_crates//:proc-macro2-1.0.106\"),\n            \"prost\": Label(\"@rust_crates//:prost-0.13.5\"),\n            \"quote\": Label(\"@rust_crates//:quote-1.0.45\"),\n            \"rand_core\": Label(\"@rust_crates//:rand_core-0.9.5\"),\n            \"riscv\": Label(\"@rust_crates//:riscv-0.12.1\"),\n            \"riscv-rt\": Label(\"@rust_crates//:riscv-rt-0.12.2\"),\n            \"riscv-semihosting\": Label(\"@rust_crates//:riscv-semihosting-0.1.3\"),\n            \"rustc-demangle\": Label(\"@rust_crates//:rustc-demangle-0.1.27\"),\n            \"sec1\": Label(\"@rust_crates//:sec1-0.7.3\"),\n            \"serde\": Label(\"@rust_crates//:serde-1.0.228\"),\n            \"serde_json5\": Label(\"@rust_crates//:serde_json5-0.2.1\"),\n            \"sha2\": Label(\"@rust_crates//:sha2-0.10.9\"),\n            \"sha3\": Label(\"@rust_crates//:sha3-0.10.9\"),\n            \"smlang\": Label(\"@rust_crates//:smlang-0.8.0\"),\n            \"subtle\": Label(\"@rust_crates//:subtle-2.6.1\"),\n            \"syn1\": Label(\"@rust_crates//:syn-1.0.109\"),\n            \"syn\": Label(\"@rust_crates//:syn-2.0.117\"),\n            \"thiserror\": Label(\"@rust_crates//:thiserror-2.0.18\"),\n            \"tock-registers\": Label(\"@rust_crates//:tock-registers-0.9.0\"),\n            \"tokio\": Label(\"@rust_crates//:tokio-1.52.1\"),\n            \"tokio-util\": Label(\"@rust_crates//:tokio-util-0.7.18\"),\n            \"zerocopy\": Label(\"@rust_crates//:zerocopy-0.8.48\"),\n            \"zeroize\": Label(\"@rust_crates//:zeroize-1.8.2\"),\n        },\n    },\n}\n\n\n_NORMAL_ALIASES = {\n    \"third_party/crates_io\": {\n        _COMMON_CONDITION: {\n            Label(\"@rust_crates//:syn-1.0.109\"): \"syn1\",\n        },\n    },\n}\n\n\n_NORMAL_DEV_DEPENDENCIES = {\n    \"third_party/crates_io\": {\n    },\n}\n\n\n_NORMAL_DEV_ALIASES = {\n    \"third_party/crates_io\": {\n    },\n}\n\n\n_PROC_MACRO_DEPENDENCIES = {\n    \"third_party/crates_io\": {\n        _COMMON_CONDITION: {\n            \"bitfield-struct\": Label(\"@rust_crates//:bitfield-struct-0.11.0\"),\n            \"paste\": Label(\"@rust_crates//:paste-1.0.15\"),\n            \"serde_derive\": Label(\"@rust_crates//:serde_derive-1.0.228\"),\n        },\n    },\n}\n\n\n_PROC_MACRO_ALIASES = {\n    \"third_party/crates_io\": {\n    },\n}\n\n\n_PROC_MACRO_DEV_DEPENDENCIES = {\n    \"third_party/crates_io\": {\n    },\n}\n\n\n_PROC_MACRO_DEV_ALIASES = {\n    \"third_party/crates_io\": {\n    },\n}\n\n\n_BUILD_DEPENDENCIES = {\n    \"third_party/crates_io\": {\n    },\n}\n\n\n_BUILD_ALIASES = {\n    \"third_party/crates_io\": {\n    },\n}\n\n\n_BUILD_PROC_MACRO_DEPENDENCIES = {\n    \"third_party/crates_io\": {\n    },\n}\n\n\n_BUILD_PROC_MACRO_ALIASES = {\n    \"third_party/crates_io\": {\n    },\n}\n\n\n_CONDITIONS = {\n    \"aarch64-apple-darwin\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\"],\n    \"aarch64-linux-android\": [],\n    \"aarch64-unknown-linux-gnu\": [\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\"],\n    \"cfg(all(any(target_os = \\\"linux\\\", target_os = \\\"android\\\"), any(rustix_use_libc, miri, not(all(target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", any(target_arch = \\\"s390x\\\", target_arch = \\\"powerpc\\\")), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc\\\"), all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\")))))))\": [],\n    \"cfg(all(not(rustix_use_libc), not(miri), target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", any(target_arch = \\\"s390x\\\", target_arch = \\\"powerpc\\\")), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc\\\"), all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\"))))\": [\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\"],\n    \"cfg(all(not(windows), any(rustix_use_libc, miri, not(all(target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", any(target_arch = \\\"s390x\\\", target_arch = \\\"powerpc\\\")), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc\\\"), all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\")))))))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:riscv32imc-unknown-none-elf\",\"@rules_rust//rust/platform:thumbv7em-none-eabi\",\"@rules_rust//rust/platform:x86_64-apple-darwin\"],\n    \"cfg(all(target_arch = \\\"aarch64\\\", target_os = \\\"linux\\\"))\": [\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\"],\n    \"cfg(all(target_arch = \\\"aarch64\\\", target_vendor = \\\"apple\\\"))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\"],\n    \"cfg(all(target_arch = \\\"loongarch64\\\", target_os = \\\"linux\\\"))\": [],\n    \"cfg(any())\": [],\n    \"cfg(any(target_arch = \\\"aarch64\\\", target_arch = \\\"x86_64\\\", target_arch = \\\"x86\\\"))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-apple-darwin\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\"],\n    \"cfg(any(target_arch = \\\"arm\\\", target_pointer_width = \\\"32\\\", target_pointer_width = \\\"64\\\"))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:riscv32imc-unknown-none-elf\",\"@rules_rust//rust/platform:thumbv7em-none-eabi\",\"@rules_rust//rust/platform:x86_64-apple-darwin\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\"],\n    \"cfg(any(unix, target_os = \\\"hermit\\\", target_os = \\\"wasi\\\"))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-apple-darwin\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\"],\n    \"cfg(any(unix, target_os = \\\"wasi\\\"))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-apple-darwin\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\"],\n    \"cfg(target_arch = \\\"aarch64\\\")\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\"],\n    \"cfg(target_os = \\\"hermit\\\")\": [],\n    \"cfg(target_os = \\\"redox\\\")\": [],\n    \"cfg(target_os = \\\"wasi\\\")\": [],\n    \"cfg(unix)\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-apple-darwin\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\"],\n    \"cfg(windows)\": [],\n    \"riscv32imc-unknown-none-elf\": [\"@rules_rust//rust/platform:riscv32imc-unknown-none-elf\"],\n    \"thumbv7em-none-eabi\": [\"@rules_rust//rust/platform:thumbv7em-none-eabi\"],\n    \"x86_64-apple-darwin\": [\"@rules_rust//rust/platform:x86_64-apple-darwin\"],\n    \"x86_64-unknown-linux-gnu\": [\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\"],\n}\n\n###############################################################################\n\ndef crate_repositories():\n    \"\"\"A macro for defining repositories for all generated crates.\n\n    Returns:\n      A list of repos visible to the module through the module extension.\n    \"\"\"\n    maybe(\n        http_archive,\n        name = \"rust_crates__adler2-2.0.1\",\n        sha256 = \"320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/adler2/2.0.1/download\"],\n        strip_prefix = \"adler2-2.0.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.adler2-2.0.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__aead-0.5.2\",\n        sha256 = \"d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/aead/0.5.2/download\"],\n        strip_prefix = \"aead-0.5.2\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.aead-0.5.2.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__aes-0.8.4\",\n        sha256 = \"b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/aes/0.8.4/download\"],\n        strip_prefix = \"aes-0.8.4\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.aes-0.8.4.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__aes-gcm-0.10.3\",\n        sha256 = \"831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/aes-gcm/0.10.3/download\"],\n        strip_prefix = \"aes-gcm-0.10.3\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.aes-gcm-0.10.3.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__aligned-0.4.3\",\n        sha256 = \"ee4508988c62edf04abd8d92897fca0c2995d907ce1dfeaf369dac3716a40685\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/aligned/0.4.3/download\"],\n        strip_prefix = \"aligned-0.4.3\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.aligned-0.4.3.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__anstream-1.0.0\",\n        sha256 = \"824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/anstream/1.0.0/download\"],\n        strip_prefix = \"anstream-1.0.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.anstream-1.0.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__anstyle-1.0.14\",\n        sha256 = \"940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/anstyle/1.0.14/download\"],\n        strip_prefix = \"anstyle-1.0.14\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.anstyle-1.0.14.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__anstyle-parse-1.0.0\",\n        sha256 = \"52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/anstyle-parse/1.0.0/download\"],\n        strip_prefix = \"anstyle-parse-1.0.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.anstyle-parse-1.0.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__anstyle-query-1.1.5\",\n        sha256 = \"40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/anstyle-query/1.1.5/download\"],\n        strip_prefix = \"anstyle-query-1.1.5\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.anstyle-query-1.1.5.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__anstyle-wincon-3.0.11\",\n        sha256 = \"291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/anstyle-wincon/3.0.11/download\"],\n        strip_prefix = \"anstyle-wincon-3.0.11\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.anstyle-wincon-3.0.11.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__anyhow-1.0.102\",\n        sha256 = \"7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/anyhow/1.0.102/download\"],\n        strip_prefix = \"anyhow-1.0.102\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.anyhow-1.0.102.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__as-slice-0.2.1\",\n        sha256 = \"516b6b4f0e40d50dcda9365d53964ec74560ad4284da2e7fc97122cd83174516\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/as-slice/0.2.1/download\"],\n        strip_prefix = \"as-slice-0.2.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.as-slice-0.2.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__autocfg-1.5.0\",\n        sha256 = \"c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/autocfg/1.5.0/download\"],\n        strip_prefix = \"autocfg-1.5.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.autocfg-1.5.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__bare-metal-0.2.5\",\n        sha256 = \"5deb64efa5bd81e31fcd1938615a6d98c82eafcbcd787162b6f63b91d6bac5b3\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/bare-metal/0.2.5/download\"],\n        strip_prefix = \"bare-metal-0.2.5\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.bare-metal-0.2.5.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__base16ct-0.2.0\",\n        sha256 = \"4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/base16ct/0.2.0/download\"],\n        strip_prefix = \"base16ct-0.2.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.base16ct-0.2.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__bitfield-0.13.2\",\n        sha256 = \"46afbd2983a5d5a7bd740ccb198caf5b82f45c40c09c0eed36052d91cb92e719\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/bitfield/0.13.2/download\"],\n        strip_prefix = \"bitfield-0.13.2\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.bitfield-0.13.2.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__bitfield-0.14.0\",\n        sha256 = \"2d7e60934ceec538daadb9d8432424ed043a904d8e0243f3c6446bce549a46ac\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/bitfield/0.14.0/download\"],\n        strip_prefix = \"bitfield-0.14.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.bitfield-0.14.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__bitfield-struct-0.11.0\",\n        sha256 = \"d3ca019570363e800b05ad4fd890734f28ac7b72f563ad8a35079efb793616f8\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/bitfield-struct/0.11.0/download\"],\n        strip_prefix = \"bitfield-struct-0.11.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.bitfield-struct-0.11.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__bitflags-2.11.1\",\n        sha256 = \"c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/bitflags/2.11.1/download\"],\n        strip_prefix = \"bitflags-2.11.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.bitflags-2.11.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__block-buffer-0.10.4\",\n        sha256 = \"3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/block-buffer/0.10.4/download\"],\n        strip_prefix = \"block-buffer-0.10.4\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.block-buffer-0.10.4.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__byteorder-1.5.0\",\n        sha256 = \"1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/byteorder/1.5.0/download\"],\n        strip_prefix = \"byteorder-1.5.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.byteorder-1.5.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__bytes-1.11.1\",\n        sha256 = \"1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/bytes/1.11.1/download\"],\n        strip_prefix = \"bytes-1.11.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.bytes-1.11.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__cfg-if-1.0.4\",\n        sha256 = \"9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/cfg-if/1.0.4/download\"],\n        strip_prefix = \"cfg-if-1.0.4\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.cfg-if-1.0.4.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__cipher-0.4.4\",\n        sha256 = \"773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/cipher/0.4.4/download\"],\n        strip_prefix = \"cipher-0.4.4\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.cipher-0.4.4.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__clap-4.6.1\",\n        sha256 = \"1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/clap/4.6.1/download\"],\n        strip_prefix = \"clap-4.6.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.clap-4.6.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__clap_builder-4.6.0\",\n        sha256 = \"714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/clap_builder/4.6.0/download\"],\n        strip_prefix = \"clap_builder-4.6.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.clap_builder-4.6.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__clap_derive-4.6.1\",\n        sha256 = \"f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/clap_derive/4.6.1/download\"],\n        strip_prefix = \"clap_derive-4.6.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.clap_derive-4.6.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__clap_lex-1.1.0\",\n        sha256 = \"c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/clap_lex/1.1.0/download\"],\n        strip_prefix = \"clap_lex-1.1.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.clap_lex-1.1.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__colorchoice-1.0.5\",\n        sha256 = \"1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/colorchoice/1.0.5/download\"],\n        strip_prefix = \"colorchoice-1.0.5\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.colorchoice-1.0.5.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__compiler_builtins-0.1.160\",\n        sha256 = \"6376049cfa92c0aa8b9ac95fae22184b981c658208d4ed8a1dc553cd83612895\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/compiler_builtins/0.1.160/download\"],\n        strip_prefix = \"compiler_builtins-0.1.160\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.compiler_builtins-0.1.160.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__const-oid-0.9.6\",\n        sha256 = \"c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/const-oid/0.9.6/download\"],\n        strip_prefix = \"const-oid-0.9.6\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.const-oid-0.9.6.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__cortex-m-0.7.7\",\n        sha256 = \"8ec610d8f49840a5b376c69663b6369e71f4b34484b9b2eb29fb918d92516cb9\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/cortex-m/0.7.7/download\"],\n        strip_prefix = \"cortex-m-0.7.7\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.cortex-m-0.7.7.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__cortex-m-rt-0.7.5\",\n        sha256 = \"801d4dec46b34c299ccf6b036717ae0fce602faa4f4fe816d9013b9a7c9f5ba6\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/cortex-m-rt/0.7.5/download\"],\n        strip_prefix = \"cortex-m-rt-0.7.5\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.cortex-m-rt-0.7.5.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__cortex-m-rt-macros-0.7.5\",\n        sha256 = \"e37549a379a9e0e6e576fd208ee60394ccb8be963889eebba3ffe0980364f472\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/cortex-m-rt-macros/0.7.5/download\"],\n        strip_prefix = \"cortex-m-rt-macros-0.7.5\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.cortex-m-rt-macros-0.7.5.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__cortex-m-semihosting-0.5.0\",\n        sha256 = \"c23234600452033cc77e4b761e740e02d2c4168e11dbf36ab14a0f58973592b0\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/cortex-m-semihosting/0.5.0/download\"],\n        strip_prefix = \"cortex-m-semihosting-0.5.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.cortex-m-semihosting-0.5.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__cpufeatures-0.2.17\",\n        sha256 = \"59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/cpufeatures/0.2.17/download\"],\n        strip_prefix = \"cpufeatures-0.2.17\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.cpufeatures-0.2.17.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__crc32fast-1.5.0\",\n        sha256 = \"9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/crc32fast/1.5.0/download\"],\n        strip_prefix = \"crc32fast-1.5.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.crc32fast-1.5.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__critical-section-1.2.0\",\n        sha256 = \"790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/critical-section/1.2.0/download\"],\n        strip_prefix = \"critical-section-1.2.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.critical-section-1.2.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__crypto-bigint-0.5.5\",\n        sha256 = \"0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/crypto-bigint/0.5.5/download\"],\n        strip_prefix = \"crypto-bigint-0.5.5\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.crypto-bigint-0.5.5.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__crypto-common-0.1.7\",\n        sha256 = \"78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/crypto-common/0.1.7/download\"],\n        strip_prefix = \"crypto-common-0.1.7\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.crypto-common-0.1.7.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__ctr-0.9.2\",\n        sha256 = \"0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/ctr/0.9.2/download\"],\n        strip_prefix = \"ctr-0.9.2\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.ctr-0.9.2.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__der-0.7.10\",\n        sha256 = \"e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/der/0.7.10/download\"],\n        strip_prefix = \"der-0.7.10\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.der-0.7.10.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__digest-0.10.7\",\n        sha256 = \"9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/digest/0.10.7/download\"],\n        strip_prefix = \"digest-0.10.7\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.digest-0.10.7.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__ecdsa-0.16.9\",\n        sha256 = \"ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/ecdsa/0.16.9/download\"],\n        strip_prefix = \"ecdsa-0.16.9\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.ecdsa-0.16.9.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__either-1.15.0\",\n        sha256 = \"48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/either/1.15.0/download\"],\n        strip_prefix = \"either-1.15.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.either-1.15.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__elliptic-curve-0.13.8\",\n        sha256 = \"b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/elliptic-curve/0.13.8/download\"],\n        strip_prefix = \"elliptic-curve-0.13.8\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.elliptic-curve-0.13.8.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__embedded-hal-0.2.7\",\n        sha256 = \"35949884794ad573cf46071e41c9b60efb0cb311e3ca01f7af807af1debc66ff\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/embedded-hal/0.2.7/download\"],\n        strip_prefix = \"embedded-hal-0.2.7\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.embedded-hal-0.2.7.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__embedded-hal-1.0.0\",\n        sha256 = \"361a90feb7004eca4019fb28352a9465666b24f840f5c3cddf0ff13920590b89\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/embedded-hal/1.0.0/download\"],\n        strip_prefix = \"embedded-hal-1.0.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.embedded-hal-1.0.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__embedded-hal-async-1.0.0\",\n        sha256 = \"0c4c685bbef7fe13c3c6dd4da26841ed3980ef33e841cddfa15ce8a8fb3f1884\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/embedded-hal-async/1.0.0/download\"],\n        strip_prefix = \"embedded-hal-async-1.0.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.embedded-hal-async-1.0.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__embedded-hal-nb-1.0.0\",\n        sha256 = \"fba4268c14288c828995299e59b12babdbe170f6c6d73731af1b4648142e8605\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/embedded-hal-nb/1.0.0/download\"],\n        strip_prefix = \"embedded-hal-nb-1.0.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.embedded-hal-nb-1.0.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__embedded-io-0.6.1\",\n        sha256 = \"edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/embedded-io/0.6.1/download\"],\n        strip_prefix = \"embedded-io-0.6.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.embedded-io-0.6.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__equivalent-1.0.2\",\n        sha256 = \"877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/equivalent/1.0.2/download\"],\n        strip_prefix = \"equivalent-1.0.2\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.equivalent-1.0.2.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__errno-0.3.14\",\n        sha256 = \"39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/errno/0.3.14/download\"],\n        strip_prefix = \"errno-0.3.14\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.errno-0.3.14.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__ff-0.13.1\",\n        sha256 = \"c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/ff/0.13.1/download\"],\n        strip_prefix = \"ff-0.13.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.ff-0.13.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__flate2-1.1.9\",\n        sha256 = \"843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/flate2/1.1.9/download\"],\n        strip_prefix = \"flate2-1.1.9\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.flate2-1.1.9.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__foldhash-0.1.5\",\n        sha256 = \"d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/foldhash/0.1.5/download\"],\n        strip_prefix = \"foldhash-0.1.5\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.foldhash-0.1.5.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__futures-0.3.32\",\n        sha256 = \"8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/futures/0.3.32/download\"],\n        strip_prefix = \"futures-0.3.32\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.futures-0.3.32.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__futures-channel-0.3.32\",\n        sha256 = \"07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/futures-channel/0.3.32/download\"],\n        strip_prefix = \"futures-channel-0.3.32\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.futures-channel-0.3.32.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__futures-core-0.3.32\",\n        sha256 = \"7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/futures-core/0.3.32/download\"],\n        strip_prefix = \"futures-core-0.3.32\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.futures-core-0.3.32.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__futures-executor-0.3.32\",\n        sha256 = \"baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/futures-executor/0.3.32/download\"],\n        strip_prefix = \"futures-executor-0.3.32\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.futures-executor-0.3.32.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__futures-io-0.3.32\",\n        sha256 = \"cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/futures-io/0.3.32/download\"],\n        strip_prefix = \"futures-io-0.3.32\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.futures-io-0.3.32.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__futures-macro-0.3.32\",\n        sha256 = \"e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/futures-macro/0.3.32/download\"],\n        strip_prefix = \"futures-macro-0.3.32\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.futures-macro-0.3.32.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__futures-sink-0.3.32\",\n        sha256 = \"c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/futures-sink/0.3.32/download\"],\n        strip_prefix = \"futures-sink-0.3.32\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.futures-sink-0.3.32.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__futures-task-0.3.32\",\n        sha256 = \"037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/futures-task/0.3.32/download\"],\n        strip_prefix = \"futures-task-0.3.32\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.futures-task-0.3.32.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__futures-util-0.3.32\",\n        sha256 = \"389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/futures-util/0.3.32/download\"],\n        strip_prefix = \"futures-util-0.3.32\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.futures-util-0.3.32.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__generic-array-0.14.7\",\n        sha256 = \"85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/generic-array/0.14.7/download\"],\n        strip_prefix = \"generic-array-0.14.7\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.generic-array-0.14.7.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__ghash-0.5.1\",\n        sha256 = \"f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/ghash/0.5.1/download\"],\n        strip_prefix = \"ghash-0.5.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.ghash-0.5.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__group-0.13.0\",\n        sha256 = \"f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/group/0.13.0/download\"],\n        strip_prefix = \"group-0.13.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.group-0.13.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__hash32-0.3.1\",\n        sha256 = \"47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/hash32/0.3.1/download\"],\n        strip_prefix = \"hash32-0.3.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.hash32-0.3.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__hashbrown-0.15.5\",\n        sha256 = \"9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/hashbrown/0.15.5/download\"],\n        strip_prefix = \"hashbrown-0.15.5\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.hashbrown-0.15.5.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__hashbrown-0.17.0\",\n        sha256 = \"4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/hashbrown/0.17.0/download\"],\n        strip_prefix = \"hashbrown-0.17.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.hashbrown-0.17.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__heapless-0.9.2\",\n        sha256 = \"2af2455f757db2b292a9b1768c4b70186d443bcb3b316252d6b540aec1cd89ed\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/heapless/0.9.2/download\"],\n        strip_prefix = \"heapless-0.9.2\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.heapless-0.9.2.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__heck-0.5.0\",\n        sha256 = \"2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/heck/0.5.0/download\"],\n        strip_prefix = \"heck-0.5.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.heck-0.5.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__hex-0.4.3\",\n        sha256 = \"7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/hex/0.4.3/download\"],\n        strip_prefix = \"hex-0.4.3\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.hex-0.4.3.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__hmac-0.12.1\",\n        sha256 = \"6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/hmac/0.12.1/download\"],\n        strip_prefix = \"hmac-0.12.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.hmac-0.12.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__indexmap-2.14.0\",\n        sha256 = \"d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/indexmap/2.14.0/download\"],\n        strip_prefix = \"indexmap-2.14.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.indexmap-2.14.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__inout-0.1.4\",\n        sha256 = \"879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/inout/0.1.4/download\"],\n        strip_prefix = \"inout-0.1.4\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.inout-0.1.4.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__is_terminal_polyfill-1.70.2\",\n        sha256 = \"a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/is_terminal_polyfill/1.70.2/download\"],\n        strip_prefix = \"is_terminal_polyfill-1.70.2\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.is_terminal_polyfill-1.70.2.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__itertools-0.14.0\",\n        sha256 = \"2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/itertools/0.14.0/download\"],\n        strip_prefix = \"itertools-0.14.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.itertools-0.14.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__k256-0.13.4\",\n        sha256 = \"f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/k256/0.13.4/download\"],\n        strip_prefix = \"k256-0.13.4\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.k256-0.13.4.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__keccak-0.1.6\",\n        sha256 = \"cb26cec98cce3a3d96cbb7bced3c4b16e3d13f27ec56dbd62cbc8f39cfb9d653\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/keccak/0.1.6/download\"],\n        strip_prefix = \"keccak-0.1.6\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.keccak-0.1.6.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__libc-0.2.186\",\n        sha256 = \"68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/libc/0.2.186/download\"],\n        strip_prefix = \"libc-0.2.186\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.libc-0.2.186.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__linux-raw-sys-0.12.1\",\n        sha256 = \"32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/linux-raw-sys/0.12.1/download\"],\n        strip_prefix = \"linux-raw-sys-0.12.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.linux-raw-sys-0.12.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__lock_api-0.4.14\",\n        sha256 = \"224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/lock_api/0.4.14/download\"],\n        strip_prefix = \"lock_api-0.4.14\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.lock_api-0.4.14.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__log-0.4.29\",\n        sha256 = \"5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/log/0.4.29/download\"],\n        strip_prefix = \"log-0.4.29\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.log-0.4.29.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__memchr-2.8.0\",\n        sha256 = \"f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/memchr/2.8.0/download\"],\n        strip_prefix = \"memchr-2.8.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.memchr-2.8.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__memo-map-0.3.3\",\n        sha256 = \"38d1115007560874e373613744c6fba374c17688327a71c1476d1a5954cc857b\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/memo-map/0.3.3/download\"],\n        strip_prefix = \"memo-map-0.3.3\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.memo-map-0.3.3.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__memoffset-0.9.1\",\n        sha256 = \"488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/memoffset/0.9.1/download\"],\n        strip_prefix = \"memoffset-0.9.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.memoffset-0.9.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__minijinja-2.19.0\",\n        sha256 = \"805bfd7352166bae857ee569628b52bcd85a1cecf7810861ebceb1686b72b75d\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/minijinja/2.19.0/download\"],\n        strip_prefix = \"minijinja-2.19.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.minijinja-2.19.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__minimal-lexical-0.2.1\",\n        sha256 = \"68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/minimal-lexical/0.2.1/download\"],\n        strip_prefix = \"minimal-lexical-0.2.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.minimal-lexical-0.2.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__miniz_oxide-0.8.9\",\n        sha256 = \"1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/miniz_oxide/0.8.9/download\"],\n        strip_prefix = \"miniz_oxide-0.8.9\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.miniz_oxide-0.8.9.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__mio-1.2.0\",\n        sha256 = \"50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/mio/1.2.0/download\"],\n        strip_prefix = \"mio-1.2.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.mio-1.2.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__nb-0.1.3\",\n        sha256 = \"801d31da0513b6ec5214e9bf433a77966320625a37860f910be265be6e18d06f\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/nb/0.1.3/download\"],\n        strip_prefix = \"nb-0.1.3\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.nb-0.1.3.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__nb-1.1.0\",\n        sha256 = \"8d5439c4ad607c3c23abf66de8c8bf57ba8adcd1f129e699851a6e43935d339d\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/nb/1.1.0/download\"],\n        strip_prefix = \"nb-1.1.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.nb-1.1.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__nom-7.1.3\",\n        sha256 = \"d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/nom/7.1.3/download\"],\n        strip_prefix = \"nom-7.1.3\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.nom-7.1.3.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__object-0.37.3\",\n        sha256 = \"ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/object/0.37.3/download\"],\n        strip_prefix = \"object-0.37.3\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.object-0.37.3.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__once_cell_polyfill-1.70.2\",\n        sha256 = \"384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/once_cell_polyfill/1.70.2/download\"],\n        strip_prefix = \"once_cell_polyfill-1.70.2\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.once_cell_polyfill-1.70.2.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__opaque-debug-0.3.1\",\n        sha256 = \"c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/opaque-debug/0.3.1/download\"],\n        strip_prefix = \"opaque-debug-0.3.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.opaque-debug-0.3.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__p256-0.13.2\",\n        sha256 = \"c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/p256/0.13.2/download\"],\n        strip_prefix = \"p256-0.13.2\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.p256-0.13.2.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__p384-0.13.1\",\n        sha256 = \"fe42f1670a52a47d448f14b6a5c61dd78fce51856e68edaa38f7ae3a46b8d6b6\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/p384/0.13.1/download\"],\n        strip_prefix = \"p384-0.13.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.p384-0.13.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__parking_lot-0.12.5\",\n        sha256 = \"93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/parking_lot/0.12.5/download\"],\n        strip_prefix = \"parking_lot-0.12.5\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.parking_lot-0.12.5.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__parking_lot_core-0.9.12\",\n        sha256 = \"2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/parking_lot_core/0.9.12/download\"],\n        strip_prefix = \"parking_lot_core-0.9.12\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.parking_lot_core-0.9.12.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__paste-1.0.15\",\n        sha256 = \"57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/paste/1.0.15/download\"],\n        strip_prefix = \"paste-1.0.15\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.paste-1.0.15.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__pest-2.8.6\",\n        sha256 = \"e0848c601009d37dfa3430c4666e147e49cdcf1b92ecd3e63657d8a5f19da662\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/pest/2.8.6/download\"],\n        strip_prefix = \"pest-2.8.6\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.pest-2.8.6.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__pest_derive-2.8.6\",\n        sha256 = \"11f486f1ea21e6c10ed15d5a7c77165d0ee443402f0780849d1768e7d9d6fe77\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/pest_derive/2.8.6/download\"],\n        strip_prefix = \"pest_derive-2.8.6\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.pest_derive-2.8.6.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__pest_generator-2.8.6\",\n        sha256 = \"8040c4647b13b210a963c1ed407c1ff4fdfa01c31d6d2a098218702e6664f94f\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/pest_generator/2.8.6/download\"],\n        strip_prefix = \"pest_generator-2.8.6\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.pest_generator-2.8.6.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__pest_meta-2.8.6\",\n        sha256 = \"89815c69d36021a140146f26659a81d6c2afa33d216d736dd4be5381a7362220\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/pest_meta/2.8.6/download\"],\n        strip_prefix = \"pest_meta-2.8.6\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.pest_meta-2.8.6.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__pin-project-lite-0.2.17\",\n        sha256 = \"a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/pin-project-lite/0.2.17/download\"],\n        strip_prefix = \"pin-project-lite-0.2.17\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.pin-project-lite-0.2.17.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__polyval-0.6.2\",\n        sha256 = \"9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/polyval/0.6.2/download\"],\n        strip_prefix = \"polyval-0.6.2\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.polyval-0.6.2.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__primeorder-0.13.6\",\n        sha256 = \"353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/primeorder/0.13.6/download\"],\n        strip_prefix = \"primeorder-0.13.6\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.primeorder-0.13.6.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__proc-macro2-1.0.106\",\n        sha256 = \"8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/proc-macro2/1.0.106/download\"],\n        strip_prefix = \"proc-macro2-1.0.106\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.proc-macro2-1.0.106.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__prost-0.13.5\",\n        sha256 = \"2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/prost/0.13.5/download\"],\n        strip_prefix = \"prost-0.13.5\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.prost-0.13.5.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__prost-derive-0.13.5\",\n        sha256 = \"8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/prost-derive/0.13.5/download\"],\n        strip_prefix = \"prost-derive-0.13.5\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.prost-derive-0.13.5.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__quote-1.0.45\",\n        sha256 = \"41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/quote/1.0.45/download\"],\n        strip_prefix = \"quote-1.0.45\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.quote-1.0.45.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__rand_core-0.6.4\",\n        sha256 = \"ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/rand_core/0.6.4/download\"],\n        strip_prefix = \"rand_core-0.6.4\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.rand_core-0.6.4.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__rand_core-0.9.5\",\n        sha256 = \"76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/rand_core/0.9.5/download\"],\n        strip_prefix = \"rand_core-0.9.5\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.rand_core-0.9.5.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__redox_syscall-0.5.18\",\n        sha256 = \"ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/redox_syscall/0.5.18/download\"],\n        strip_prefix = \"redox_syscall-0.5.18\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.redox_syscall-0.5.18.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__rfc6979-0.4.0\",\n        sha256 = \"f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/rfc6979/0.4.0/download\"],\n        strip_prefix = \"rfc6979-0.4.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.rfc6979-0.4.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__riscv-0.11.1\",\n        sha256 = \"2f5c1b8bf41ea746266cdee443d1d1e9125c86ce1447e1a2615abd34330d33a9\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/riscv/0.11.1/download\"],\n        strip_prefix = \"riscv-0.11.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.riscv-0.11.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__riscv-0.12.1\",\n        sha256 = \"5ea8ff73d3720bdd0a97925f0bf79ad2744b6da8ff36be3840c48ac81191d7a7\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/riscv/0.12.1/download\"],\n        strip_prefix = \"riscv-0.12.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.riscv-0.12.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__riscv-0.13.0\",\n        sha256 = \"afa3cdbeccae4359f6839a00e8b77e5736caa200ba216caf38d24e4c16e2b586\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/riscv/0.13.0/download\"],\n        strip_prefix = \"riscv-0.13.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.riscv-0.13.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__riscv-macros-0.1.0\",\n        sha256 = \"f265be5d634272320a7de94cea15c22a3bfdd4eb42eb43edc528415f066a1f25\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/riscv-macros/0.1.0/download\"],\n        strip_prefix = \"riscv-macros-0.1.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.riscv-macros-0.1.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__riscv-macros-0.2.0\",\n        sha256 = \"e8c4aa1ea1af6dcc83a61be12e8189f9b293c3ba5a487778a4cd89fb060fdbbc\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/riscv-macros/0.2.0/download\"],\n        strip_prefix = \"riscv-macros-0.2.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.riscv-macros-0.2.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__riscv-pac-0.2.0\",\n        sha256 = \"8188909339ccc0c68cfb5a04648313f09621e8b87dc03095454f1a11f6c5d436\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/riscv-pac/0.2.0/download\"],\n        strip_prefix = \"riscv-pac-0.2.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.riscv-pac-0.2.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__riscv-rt-0.12.2\",\n        sha256 = \"c0d35e32cf1383183e8885d8a9aa4402a087fd094dc34c2cb6df6687d0229dfe\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/riscv-rt/0.12.2/download\"],\n        strip_prefix = \"riscv-rt-0.12.2\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.riscv-rt-0.12.2.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__riscv-rt-macros-0.2.2\",\n        sha256 = \"30f19a85fe107b65031e0ba8ec60c34c2494069fe910d6c297f5e7cb5a6f76d0\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/riscv-rt-macros/0.2.2/download\"],\n        strip_prefix = \"riscv-rt-macros-0.2.2\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.riscv-rt-macros-0.2.2.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__riscv-semihosting-0.1.3\",\n        sha256 = \"1086dd4bcc13de1cb14b93849411e3466de7e5907d2d8eb269032536e93facc6\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/riscv-semihosting/0.1.3/download\"],\n        strip_prefix = \"riscv-semihosting-0.1.3\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.riscv-semihosting-0.1.3.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__rustc-demangle-0.1.27\",\n        sha256 = \"b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/rustc-demangle/0.1.27/download\"],\n        strip_prefix = \"rustc-demangle-0.1.27\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.rustc-demangle-0.1.27.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__rustc_version-0.2.3\",\n        sha256 = \"138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/rustc_version/0.2.3/download\"],\n        strip_prefix = \"rustc_version-0.2.3\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.rustc_version-0.2.3.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__rustix-1.1.4\",\n        sha256 = \"b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/rustix/1.1.4/download\"],\n        strip_prefix = \"rustix-1.1.4\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.rustix-1.1.4.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__ruzstd-0.8.2\",\n        sha256 = \"e5ff0cc5e135c8870a775d3320910cd9b564ec036b4dc0b8741629020be63f01\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/ruzstd/0.8.2/download\"],\n        strip_prefix = \"ruzstd-0.8.2\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.ruzstd-0.8.2.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__scopeguard-1.2.0\",\n        sha256 = \"94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/scopeguard/1.2.0/download\"],\n        strip_prefix = \"scopeguard-1.2.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.scopeguard-1.2.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__sec1-0.7.3\",\n        sha256 = \"d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/sec1/0.7.3/download\"],\n        strip_prefix = \"sec1-0.7.3\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.sec1-0.7.3.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__semver-0.9.0\",\n        sha256 = \"1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/semver/0.9.0/download\"],\n        strip_prefix = \"semver-0.9.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.semver-0.9.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__semver-parser-0.7.0\",\n        sha256 = \"388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/semver-parser/0.7.0/download\"],\n        strip_prefix = \"semver-parser-0.7.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.semver-parser-0.7.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__serde-1.0.228\",\n        sha256 = \"9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/serde/1.0.228/download\"],\n        strip_prefix = \"serde-1.0.228\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.serde-1.0.228.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__serde_core-1.0.228\",\n        sha256 = \"41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/serde_core/1.0.228/download\"],\n        strip_prefix = \"serde_core-1.0.228\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.serde_core-1.0.228.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__serde_derive-1.0.228\",\n        sha256 = \"d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/serde_derive/1.0.228/download\"],\n        strip_prefix = \"serde_derive-1.0.228\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.serde_derive-1.0.228.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__serde_json5-0.2.1\",\n        sha256 = \"5d34d03f54462862f2a42918391c9526337f53171eaa4d8894562be7f252edd3\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/serde_json5/0.2.1/download\"],\n        strip_prefix = \"serde_json5-0.2.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.serde_json5-0.2.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__sha2-0.10.9\",\n        sha256 = \"a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/sha2/0.10.9/download\"],\n        strip_prefix = \"sha2-0.10.9\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.sha2-0.10.9.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__sha3-0.10.9\",\n        sha256 = \"77fd7028345d415a4034cf8777cd4f8ab1851274233b45f84e3d955502d93874\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/sha3/0.10.9/download\"],\n        strip_prefix = \"sha3-0.10.9\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.sha3-0.10.9.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__signal-hook-registry-1.4.8\",\n        sha256 = \"c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/signal-hook-registry/1.4.8/download\"],\n        strip_prefix = \"signal-hook-registry-1.4.8\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.signal-hook-registry-1.4.8.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__signature-2.2.0\",\n        sha256 = \"77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/signature/2.2.0/download\"],\n        strip_prefix = \"signature-2.2.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.signature-2.2.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__simd-adler32-0.3.9\",\n        sha256 = \"703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/simd-adler32/0.3.9/download\"],\n        strip_prefix = \"simd-adler32-0.3.9\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.simd-adler32-0.3.9.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__slab-0.4.12\",\n        sha256 = \"0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/slab/0.4.12/download\"],\n        strip_prefix = \"slab-0.4.12\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.slab-0.4.12.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__smallvec-1.15.1\",\n        sha256 = \"67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/smallvec/1.15.1/download\"],\n        strip_prefix = \"smallvec-1.15.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.smallvec-1.15.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__smlang-0.8.0\",\n        sha256 = \"1de84f9f80bbe6272174e2bfdb8cf7ce4815b218038a42161c2f21c1d872c215\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/smlang/0.8.0/download\"],\n        strip_prefix = \"smlang-0.8.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.smlang-0.8.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__smlang-macros-0.8.0\",\n        sha256 = \"231b4425dcc43afc7e18c34e7c6738cd252d42d91d909c948df14107c9ae79f1\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/smlang-macros/0.8.0/download\"],\n        strip_prefix = \"smlang-macros-0.8.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.smlang-macros-0.8.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__socket2-0.6.3\",\n        sha256 = \"3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/socket2/0.6.3/download\"],\n        strip_prefix = \"socket2-0.6.3\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.socket2-0.6.3.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__stable_deref_trait-1.2.1\",\n        sha256 = \"6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/stable_deref_trait/1.2.1/download\"],\n        strip_prefix = \"stable_deref_trait-1.2.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.stable_deref_trait-1.2.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__string_morph-0.1.0\",\n        sha256 = \"183aaf7fa637cc7b5f54c45b8f7cb6e8d73831f9f75a56b6defa5bf8c51d1699\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/string_morph/0.1.0/download\"],\n        strip_prefix = \"string_morph-0.1.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.string_morph-0.1.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__strsim-0.11.1\",\n        sha256 = \"7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/strsim/0.11.1/download\"],\n        strip_prefix = \"strsim-0.11.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.strsim-0.11.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__subtle-2.6.1\",\n        sha256 = \"13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/subtle/2.6.1/download\"],\n        strip_prefix = \"subtle-2.6.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.subtle-2.6.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__syn-1.0.109\",\n        sha256 = \"72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/syn/1.0.109/download\"],\n        strip_prefix = \"syn-1.0.109\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.syn-1.0.109.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__syn-2.0.117\",\n        sha256 = \"e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/syn/2.0.117/download\"],\n        strip_prefix = \"syn-2.0.117\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.syn-2.0.117.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__terminal_size-0.4.4\",\n        sha256 = \"230a1b821ccbd75b185820a1f1ff7b14d21da1e442e22c0863ea5f08771a8874\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/terminal_size/0.4.4/download\"],\n        strip_prefix = \"terminal_size-0.4.4\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.terminal_size-0.4.4.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__thiserror-2.0.18\",\n        sha256 = \"4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/thiserror/2.0.18/download\"],\n        strip_prefix = \"thiserror-2.0.18\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.thiserror-2.0.18.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__thiserror-impl-2.0.18\",\n        sha256 = \"ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/thiserror-impl/2.0.18/download\"],\n        strip_prefix = \"thiserror-impl-2.0.18\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.thiserror-impl-2.0.18.bazel\"),\n    )\n\n    maybe(\n        new_git_repository,\n        name = \"rust_crates__tock-registers-0.9.0\",\n        commit = \"9554639b17501a9f5940cef7a1770a0823e790c3\",\n        init_submodules = True,\n        remote = \"https://github.com/tock/tock.git\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.tock-registers-0.9.0.bazel\"),\n        strip_prefix = \"libraries/tock-register-interface\",\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__tokio-1.52.1\",\n        sha256 = \"b67dee974fe86fd92cc45b7a95fdd2f99a36a6d7b0d431a231178d3d670bbcc6\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/tokio/1.52.1/download\"],\n        strip_prefix = \"tokio-1.52.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.tokio-1.52.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__tokio-macros-2.7.0\",\n        sha256 = \"385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/tokio-macros/2.7.0/download\"],\n        strip_prefix = \"tokio-macros-2.7.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.tokio-macros-2.7.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__tokio-util-0.7.18\",\n        sha256 = \"9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/tokio-util/0.7.18/download\"],\n        strip_prefix = \"tokio-util-0.7.18\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.tokio-util-0.7.18.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__twox-hash-2.1.2\",\n        sha256 = \"9ea3136b675547379c4bd395ca6b938e5ad3c3d20fad76e7fe85f9e0d011419c\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/twox-hash/2.1.2/download\"],\n        strip_prefix = \"twox-hash-2.1.2\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.twox-hash-2.1.2.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__typenum-1.20.0\",\n        sha256 = \"40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/typenum/1.20.0/download\"],\n        strip_prefix = \"typenum-1.20.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.typenum-1.20.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__ucd-trie-0.1.7\",\n        sha256 = \"2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/ucd-trie/0.1.7/download\"],\n        strip_prefix = \"ucd-trie-0.1.7\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.ucd-trie-0.1.7.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__unicode-ident-1.0.24\",\n        sha256 = \"e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/unicode-ident/1.0.24/download\"],\n        strip_prefix = \"unicode-ident-1.0.24\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.unicode-ident-1.0.24.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__universal-hash-0.5.1\",\n        sha256 = \"fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/universal-hash/0.5.1/download\"],\n        strip_prefix = \"universal-hash-0.5.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.universal-hash-0.5.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__utf8parse-0.2.2\",\n        sha256 = \"06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/utf8parse/0.2.2/download\"],\n        strip_prefix = \"utf8parse-0.2.2\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.utf8parse-0.2.2.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__vcell-0.1.3\",\n        sha256 = \"77439c1b53d2303b20d9459b1ade71a83c716e3f9c34f3228c00e6f185d6c002\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/vcell/0.1.3/download\"],\n        strip_prefix = \"vcell-0.1.3\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.vcell-0.1.3.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__version_check-0.9.5\",\n        sha256 = \"0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/version_check/0.9.5/download\"],\n        strip_prefix = \"version_check-0.9.5\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.version_check-0.9.5.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__void-1.0.2\",\n        sha256 = \"6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/void/1.0.2/download\"],\n        strip_prefix = \"void-1.0.2\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.void-1.0.2.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__volatile-register-0.2.2\",\n        sha256 = \"de437e2a6208b014ab52972a27e59b33fa2920d3e00fe05026167a1c509d19cc\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/volatile-register/0.2.2/download\"],\n        strip_prefix = \"volatile-register-0.2.2\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.volatile-register-0.2.2.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__wasi-0.11.1-wasi-snapshot-preview1\",\n        sha256 = \"ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/wasi/0.11.1+wasi-snapshot-preview1/download\"],\n        strip_prefix = \"wasi-0.11.1+wasi-snapshot-preview1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.wasi-0.11.1+wasi-snapshot-preview1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__windows-link-0.2.1\",\n        sha256 = \"f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/windows-link/0.2.1/download\"],\n        strip_prefix = \"windows-link-0.2.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.windows-link-0.2.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__windows-sys-0.61.2\",\n        sha256 = \"ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/windows-sys/0.61.2/download\"],\n        strip_prefix = \"windows-sys-0.61.2\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.windows-sys-0.61.2.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__zerocopy-0.8.48\",\n        sha256 = \"eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/zerocopy/0.8.48/download\"],\n        strip_prefix = \"zerocopy-0.8.48\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.zerocopy-0.8.48.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__zerocopy-derive-0.8.48\",\n        sha256 = \"70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/zerocopy-derive/0.8.48/download\"],\n        strip_prefix = \"zerocopy-derive-0.8.48\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.zerocopy-derive-0.8.48.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__zeroize-1.8.2\",\n        sha256 = \"b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/zeroize/1.8.2/download\"],\n        strip_prefix = \"zeroize-1.8.2\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.zeroize-1.8.2.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__zeroize_derive-1.4.3\",\n        sha256 = \"85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/zeroize_derive/1.4.3/download\"],\n        strip_prefix = \"zeroize_derive-1.4.3\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.zeroize_derive-1.4.3.bazel\"),\n    )\n\n    return [\n       struct(repo=\"rust_crates__aes-0.8.4\", is_dev_dep = False),\n       struct(repo=\"rust_crates__aes-gcm-0.10.3\", is_dev_dep = False),\n       struct(repo=\"rust_crates__aligned-0.4.3\", is_dev_dep = False),\n       struct(repo=\"rust_crates__anyhow-1.0.102\", is_dev_dep = False),\n       struct(repo=\"rust_crates__bitfield-0.14.0\", is_dev_dep = False),\n       struct(repo=\"rust_crates__bitfield-struct-0.11.0\", is_dev_dep = False),\n       struct(repo=\"rust_crates__bitflags-2.11.1\", is_dev_dep = False),\n       struct(repo=\"rust_crates__byteorder-1.5.0\", is_dev_dep = False),\n       struct(repo=\"rust_crates__cfg-if-1.0.4\", is_dev_dep = False),\n       struct(repo=\"rust_crates__cipher-0.4.4\", is_dev_dep = False),\n       struct(repo=\"rust_crates__clap-4.6.1\", is_dev_dep = False),\n       struct(repo=\"rust_crates__compiler_builtins-0.1.160\", is_dev_dep = False),\n       struct(repo=\"rust_crates__cortex-m-0.7.7\", is_dev_dep = False),\n       struct(repo=\"rust_crates__cortex-m-rt-0.7.5\", is_dev_dep = False),\n       struct(repo=\"rust_crates__cortex-m-semihosting-0.5.0\", is_dev_dep = False),\n       struct(repo=\"rust_crates__ctr-0.9.2\", is_dev_dep = False),\n       struct(repo=\"rust_crates__ecdsa-0.16.9\", is_dev_dep = False),\n       struct(repo=\"rust_crates__embedded-hal-1.0.0\", is_dev_dep = False),\n       struct(repo=\"rust_crates__embedded-hal-async-1.0.0\", is_dev_dep = False),\n       struct(repo=\"rust_crates__embedded-hal-nb-1.0.0\", is_dev_dep = False),\n       struct(repo=\"rust_crates__embedded-io-0.6.1\", is_dev_dep = False),\n       struct(repo=\"rust_crates__futures-0.3.32\", is_dev_dep = False),\n       struct(repo=\"rust_crates__heapless-0.9.2\", is_dev_dep = False),\n       struct(repo=\"rust_crates__hex-0.4.3\", is_dev_dep = False),\n       struct(repo=\"rust_crates__hmac-0.12.1\", is_dev_dep = False),\n       struct(repo=\"rust_crates__k256-0.13.4\", is_dev_dep = False),\n       struct(repo=\"rust_crates__log-0.4.29\", is_dev_dep = False),\n       struct(repo=\"rust_crates__memoffset-0.9.1\", is_dev_dep = False),\n       struct(repo=\"rust_crates__minijinja-2.19.0\", is_dev_dep = False),\n       struct(repo=\"rust_crates__nb-1.1.0\", is_dev_dep = False),\n       struct(repo=\"rust_crates__nom-7.1.3\", is_dev_dep = False),\n       struct(repo=\"rust_crates__object-0.37.3\", is_dev_dep = False),\n       struct(repo=\"rust_crates__p256-0.13.2\", is_dev_dep = False),\n       struct(repo=\"rust_crates__p384-0.13.1\", is_dev_dep = False),\n       struct(repo=\"rust_crates__paste-1.0.15\", is_dev_dep = False),\n       struct(repo=\"rust_crates__proc-macro2-1.0.106\", is_dev_dep = False),\n       struct(repo=\"rust_crates__prost-0.13.5\", is_dev_dep = False),\n       struct(repo=\"rust_crates__quote-1.0.45\", is_dev_dep = False),\n       struct(repo=\"rust_crates__rand_core-0.9.5\", is_dev_dep = False),\n       struct(repo=\"rust_crates__riscv-0.12.1\", is_dev_dep = False),\n       struct(repo=\"rust_crates__riscv-rt-0.12.2\", is_dev_dep = False),\n       struct(repo=\"rust_crates__riscv-semihosting-0.1.3\", is_dev_dep = False),\n       struct(repo=\"rust_crates__rustc-demangle-0.1.27\", is_dev_dep = False),\n       struct(repo=\"rust_crates__sec1-0.7.3\", is_dev_dep = False),\n       struct(repo=\"rust_crates__serde-1.0.228\", is_dev_dep = False),\n       struct(repo=\"rust_crates__serde_derive-1.0.228\", is_dev_dep = False),\n       struct(repo=\"rust_crates__serde_json5-0.2.1\", is_dev_dep = False),\n       struct(repo=\"rust_crates__sha2-0.10.9\", is_dev_dep = False),\n       struct(repo=\"rust_crates__sha3-0.10.9\", is_dev_dep = False),\n       struct(repo=\"rust_crates__smlang-0.8.0\", is_dev_dep = False),\n       struct(repo=\"rust_crates__subtle-2.6.1\", is_dev_dep = False),\n       struct(repo=\"rust_crates__syn-1.0.109\", is_dev_dep = False),\n       struct(repo=\"rust_crates__syn-2.0.117\", is_dev_dep = False),\n       struct(repo=\"rust_crates__thiserror-2.0.18\", is_dev_dep = False),\n       struct(repo=\"rust_crates__tock-registers-0.9.0\", is_dev_dep = False),\n       struct(repo=\"rust_crates__tokio-1.52.1\", is_dev_dep = False),\n       struct(repo=\"rust_crates__tokio-util-0.7.18\", is_dev_dep = False),\n       struct(repo=\"rust_crates__zerocopy-0.8.48\", is_dev_dep = False),\n       struct(repo=\"rust_crates__zeroize-1.8.2\", is_dev_dep = False),\n    ]\n"
+                "defs.bzl": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n#     bazel mod show_repo 'openprot'\n###############################################################################\n\"\"\"\n# `crates_repository` API\n\n- [aliases](#aliases)\n- [crate_deps](#crate_deps)\n- [all_crate_deps](#all_crate_deps)\n- [crate_repositories](#crate_repositories)\n\n\"\"\"\n\nload(\"@bazel_tools//tools/build_defs/repo:git.bzl\", \"new_git_repository\")\nload(\"@bazel_tools//tools/build_defs/repo:http.bzl\", \"http_archive\")\nload(\"@bazel_tools//tools/build_defs/repo:utils.bzl\", \"maybe\")\nload(\"@bazel_skylib//lib:selects.bzl\", \"selects\")\nload(\"@rules_rust//crate_universe/private:local_crate_mirror.bzl\", \"local_crate_mirror\")\n\n###############################################################################\n# MACROS API\n###############################################################################\n\n# An identifier that represent common dependencies (unconditional).\n_COMMON_CONDITION = \"\"\n\ndef _flatten_dependency_maps(all_dependency_maps):\n    \"\"\"Flatten a list of dependency maps into one dictionary.\n\n    Dependency maps have the following structure:\n\n    ```python\n    DEPENDENCIES_MAP = {\n        # The first key in the map is a Bazel package\n        # name of the workspace this file is defined in.\n        \"workspace_member_package\": {\n\n            # Not all dependencies are supported for all platforms.\n            # the condition key is the condition required to be true\n            # on the host platform.\n            \"condition\": {\n\n                # An alias to a crate target.     # The label of the crate target the\n                # Aliases are only crate names.   # package name refers to.\n                \"package_name\":                   \"@full//:label\",\n            }\n        }\n    }\n    ```\n\n    Args:\n        all_dependency_maps (list): A list of dicts as described above\n\n    Returns:\n        dict: A dictionary as described above\n    \"\"\"\n    dependencies = {}\n\n    for workspace_deps_map in all_dependency_maps:\n        for pkg_name, conditional_deps_map in workspace_deps_map.items():\n            if pkg_name not in dependencies:\n                non_frozen_map = dict()\n                for key, values in conditional_deps_map.items():\n                    non_frozen_map.update({key: dict(values.items())})\n                dependencies.setdefault(pkg_name, non_frozen_map)\n                continue\n\n            for condition, deps_map in conditional_deps_map.items():\n                # If the condition has not been recorded, do so and continue\n                if condition not in dependencies[pkg_name]:\n                    dependencies[pkg_name].setdefault(condition, dict(deps_map.items()))\n                    continue\n\n                # Alert on any miss-matched dependencies\n                inconsistent_entries = []\n                for crate_name, crate_label in deps_map.items():\n                    existing = dependencies[pkg_name][condition].get(crate_name)\n                    if existing and existing != crate_label:\n                        inconsistent_entries.append((crate_name, existing, crate_label))\n                    dependencies[pkg_name][condition].update({crate_name: crate_label})\n\n    return dependencies\n\ndef crate_deps(deps, package_name = None):\n    \"\"\"Finds the fully qualified label of the requested crates for the package where this macro is called.\n\n    Args:\n        deps (list): The desired list of crate targets.\n        package_name (str, optional): The package name of the set of dependencies to look up.\n            Defaults to `native.package_name()`.\n\n    Returns:\n        list: A list of labels to generated rust targets (str)\n    \"\"\"\n\n    if not deps:\n        return []\n\n    if package_name == None:\n        package_name = native.package_name()\n\n    # Join both sets of dependencies\n    dependencies = _flatten_dependency_maps([\n        _NORMAL_DEPENDENCIES,\n        _NORMAL_DEV_DEPENDENCIES,\n        _PROC_MACRO_DEPENDENCIES,\n        _PROC_MACRO_DEV_DEPENDENCIES,\n        _BUILD_DEPENDENCIES,\n        _BUILD_PROC_MACRO_DEPENDENCIES,\n    ]).pop(package_name, {})\n\n    # Combine all conditional packages so we can easily index over a flat list\n    # TODO: Perhaps this should actually return select statements and maintain\n    # the conditionals of the dependencies\n    flat_deps = {}\n    for deps_set in dependencies.values():\n        for crate_name, crate_label in deps_set.items():\n            flat_deps.update({crate_name: crate_label})\n\n    missing_crates = []\n    crate_targets = []\n    for crate_target in deps:\n        if crate_target not in flat_deps:\n            missing_crates.append(crate_target)\n        else:\n            crate_targets.append(flat_deps[crate_target])\n\n    if missing_crates:\n        fail(\"Could not find crates `{}` among dependencies of `{}`. Available dependencies were `{}`\".format(\n            missing_crates,\n            package_name,\n            dependencies,\n        ))\n\n    return crate_targets\n\ndef all_crate_deps(\n        normal = False, \n        normal_dev = False, \n        proc_macro = False, \n        proc_macro_dev = False,\n        build = False,\n        build_proc_macro = False,\n        package_name = None):\n    \"\"\"Finds the fully qualified label of all requested direct crate dependencies \\\n    for the package where this macro is called.\n\n    If no parameters are set, all normal dependencies are returned. Setting any one flag will\n    otherwise impact the contents of the returned list.\n\n    Args:\n        normal (bool, optional): If True, normal dependencies are included in the\n            output list.\n        normal_dev (bool, optional): If True, normal dev dependencies will be\n            included in the output list..\n        proc_macro (bool, optional): If True, proc_macro dependencies are included\n            in the output list.\n        proc_macro_dev (bool, optional): If True, dev proc_macro dependencies are\n            included in the output list.\n        build (bool, optional): If True, build dependencies are included\n            in the output list.\n        build_proc_macro (bool, optional): If True, build proc_macro dependencies are\n            included in the output list.\n        package_name (str, optional): The package name of the set of dependencies to look up.\n            Defaults to `native.package_name()` when unset.\n\n    Returns:\n        list: A list of labels to generated rust targets (str)\n    \"\"\"\n\n    if package_name == None:\n        package_name = native.package_name()\n\n    # Determine the relevant maps to use\n    all_dependency_maps = []\n    if normal:\n        all_dependency_maps.append(_NORMAL_DEPENDENCIES)\n    if normal_dev:\n        all_dependency_maps.append(_NORMAL_DEV_DEPENDENCIES)\n    if proc_macro:\n        all_dependency_maps.append(_PROC_MACRO_DEPENDENCIES)\n    if proc_macro_dev:\n        all_dependency_maps.append(_PROC_MACRO_DEV_DEPENDENCIES)\n    if build:\n        all_dependency_maps.append(_BUILD_DEPENDENCIES)\n    if build_proc_macro:\n        all_dependency_maps.append(_BUILD_PROC_MACRO_DEPENDENCIES)\n\n    # Default to always using normal dependencies\n    if not all_dependency_maps:\n        all_dependency_maps.append(_NORMAL_DEPENDENCIES)\n\n    dependencies = _flatten_dependency_maps(all_dependency_maps).pop(package_name, None)\n\n    if not dependencies:\n        if dependencies == None:\n            fail(\"Tried to get all_crate_deps for package \" + package_name + \" but that package had no Cargo.toml file\")\n        else:\n            return []\n\n    crate_deps = list(dependencies.pop(_COMMON_CONDITION, {}).values())\n    for condition, deps in dependencies.items():\n        crate_deps += selects.with_or({\n            tuple(_CONDITIONS[condition]): deps.values(),\n            \"//conditions:default\": [],\n        })\n\n    return crate_deps\n\ndef aliases(\n        normal = False,\n        normal_dev = False,\n        proc_macro = False,\n        proc_macro_dev = False,\n        build = False,\n        build_proc_macro = False,\n        package_name = None):\n    \"\"\"Produces a map of Crate alias names to their original label\n\n    If no dependency kinds are specified, `normal` and `proc_macro` are used by default.\n    Setting any one flag will otherwise determine the contents of the returned dict.\n\n    Args:\n        normal (bool, optional): If True, normal dependencies are included in the\n            output list.\n        normal_dev (bool, optional): If True, normal dev dependencies will be\n            included in the output list..\n        proc_macro (bool, optional): If True, proc_macro dependencies are included\n            in the output list.\n        proc_macro_dev (bool, optional): If True, dev proc_macro dependencies are\n            included in the output list.\n        build (bool, optional): If True, build dependencies are included\n            in the output list.\n        build_proc_macro (bool, optional): If True, build proc_macro dependencies are\n            included in the output list.\n        package_name (str, optional): The package name of the set of dependencies to look up.\n            Defaults to `native.package_name()` when unset.\n\n    Returns:\n        dict: The aliases of all associated packages\n    \"\"\"\n    if package_name == None:\n        package_name = native.package_name()\n\n    # Determine the relevant maps to use\n    all_aliases_maps = []\n    if normal:\n        all_aliases_maps.append(_NORMAL_ALIASES)\n    if normal_dev:\n        all_aliases_maps.append(_NORMAL_DEV_ALIASES)\n    if proc_macro:\n        all_aliases_maps.append(_PROC_MACRO_ALIASES)\n    if proc_macro_dev:\n        all_aliases_maps.append(_PROC_MACRO_DEV_ALIASES)\n    if build:\n        all_aliases_maps.append(_BUILD_ALIASES)\n    if build_proc_macro:\n        all_aliases_maps.append(_BUILD_PROC_MACRO_ALIASES)\n\n    # Default to always using normal aliases\n    if not all_aliases_maps:\n        all_aliases_maps.append(_NORMAL_ALIASES)\n        all_aliases_maps.append(_PROC_MACRO_ALIASES)\n\n    aliases = _flatten_dependency_maps(all_aliases_maps).pop(package_name, None)\n\n    if not aliases:\n        return dict()\n\n    common_items = aliases.pop(_COMMON_CONDITION, {}).items()\n\n    # If there are only common items in the dictionary, immediately return them\n    if not len(aliases.keys()) == 1:\n        return dict(common_items)\n\n    # Build a single select statement where each conditional has accounted for the\n    # common set of aliases.\n    crate_aliases = {\"//conditions:default\": dict(common_items)}\n    for condition, deps in aliases.items():\n        condition_triples = _CONDITIONS[condition]\n        for triple in condition_triples:\n            if triple in crate_aliases:\n                crate_aliases[triple].update(deps)\n            else:\n                crate_aliases.update({triple: dict(deps.items() + common_items)})\n\n    return select(crate_aliases)\n\n###############################################################################\n# WORKSPACE MEMBER DEPS AND ALIASES\n###############################################################################\n\n_NORMAL_DEPENDENCIES = {\n    \"third_party/crates_io\": {\n        _COMMON_CONDITION: {\n            \"aes\": Label(\"@rust_crates//:aes-0.8.4\"),\n            \"aes-gcm\": Label(\"@rust_crates//:aes-gcm-0.10.3\"),\n            \"aligned\": Label(\"@rust_crates//:aligned-0.4.3\"),\n            \"anyhow\": Label(\"@rust_crates//:anyhow-1.0.102\"),\n            \"bitfield\": Label(\"@rust_crates//:bitfield-0.14.0\"),\n            \"bitflags\": Label(\"@rust_crates//:bitflags-2.11.1\"),\n            \"byteorder\": Label(\"@rust_crates//:byteorder-1.5.0\"),\n            \"cfg-if\": Label(\"@rust_crates//:cfg-if-1.0.4\"),\n            \"cipher\": Label(\"@rust_crates//:cipher-0.4.4\"),\n            \"clap\": Label(\"@rust_crates//:clap-4.6.1\"),\n            \"compiler_builtins\": Label(\"@rust_crates//:compiler_builtins-0.1.160\"),\n            \"cortex-m\": Label(\"@rust_crates//:cortex-m-0.7.7\"),\n            \"cortex-m-rt\": Label(\"@rust_crates//:cortex-m-rt-0.7.5\"),\n            \"cortex-m-semihosting\": Label(\"@rust_crates//:cortex-m-semihosting-0.5.0\"),\n            \"ctr\": Label(\"@rust_crates//:ctr-0.9.2\"),\n            \"ecdsa\": Label(\"@rust_crates//:ecdsa-0.16.9\"),\n            \"embedded-hal\": Label(\"@rust_crates//:embedded-hal-1.0.0\"),\n            \"embedded-hal-async\": Label(\"@rust_crates//:embedded-hal-async-1.0.0\"),\n            \"embedded-hal-nb\": Label(\"@rust_crates//:embedded-hal-nb-1.0.0\"),\n            \"embedded-io\": Label(\"@rust_crates//:embedded-io-0.6.1\"),\n            \"futures\": Label(\"@rust_crates//:futures-0.3.32\"),\n            \"heapless\": Label(\"@rust_crates//:heapless-0.9.2\"),\n            \"hex\": Label(\"@rust_crates//:hex-0.4.3\"),\n            \"hmac\": Label(\"@rust_crates//:hmac-0.12.1\"),\n            \"k256\": Label(\"@rust_crates//:k256-0.13.4\"),\n            \"log\": Label(\"@rust_crates//:log-0.4.29\"),\n            \"mctp\": Label(\"@rust_crates//:mctp-0.2.0\"),\n            \"mctp-lib\": Label(\"@rust_crates//:mctp-lib-0.1.0\"),\n            \"memoffset\": Label(\"@rust_crates//:memoffset-0.9.1\"),\n            \"minijinja\": Label(\"@rust_crates//:minijinja-2.19.0\"),\n            \"nb\": Label(\"@rust_crates//:nb-1.1.0\"),\n            \"nom\": Label(\"@rust_crates//:nom-7.1.3\"),\n            \"object\": Label(\"@rust_crates//:object-0.37.3\"),\n            \"p256\": Label(\"@rust_crates//:p256-0.13.2\"),\n            \"p384\": Label(\"@rust_crates//:p384-0.13.1\"),\n            \"proc-macro2\": Label(\"@rust_crates//:proc-macro2-1.0.106\"),\n            \"prost\": Label(\"@rust_crates//:prost-0.13.5\"),\n            \"quote\": Label(\"@rust_crates//:quote-1.0.45\"),\n            \"rand_core\": Label(\"@rust_crates//:rand_core-0.9.5\"),\n            \"riscv\": Label(\"@rust_crates//:riscv-0.12.1\"),\n            \"riscv-rt\": Label(\"@rust_crates//:riscv-rt-0.12.2\"),\n            \"riscv-semihosting\": Label(\"@rust_crates//:riscv-semihosting-0.1.3\"),\n            \"rustc-demangle\": Label(\"@rust_crates//:rustc-demangle-0.1.27\"),\n            \"sec1\": Label(\"@rust_crates//:sec1-0.7.3\"),\n            \"serde\": Label(\"@rust_crates//:serde-1.0.228\"),\n            \"serde_json5\": Label(\"@rust_crates//:serde_json5-0.2.1\"),\n            \"sha2\": Label(\"@rust_crates//:sha2-0.10.9\"),\n            \"sha3\": Label(\"@rust_crates//:sha3-0.10.9\"),\n            \"smlang\": Label(\"@rust_crates//:smlang-0.8.0\"),\n            \"subtle\": Label(\"@rust_crates//:subtle-2.6.1\"),\n            \"syn1\": Label(\"@rust_crates//:syn-1.0.109\"),\n            \"syn\": Label(\"@rust_crates//:syn-2.0.117\"),\n            \"thiserror\": Label(\"@rust_crates//:thiserror-2.0.18\"),\n            \"tock-registers\": Label(\"@rust_crates//:tock-registers-0.9.0\"),\n            \"tokio\": Label(\"@rust_crates//:tokio-1.52.1\"),\n            \"tokio-util\": Label(\"@rust_crates//:tokio-util-0.7.18\"),\n            \"vcell\": Label(\"@rust_crates//:vcell-0.1.3\"),\n            \"zerocopy\": Label(\"@rust_crates//:zerocopy-0.8.48\"),\n            \"zeroize\": Label(\"@rust_crates//:zeroize-1.8.2\"),\n        },\n    },\n}\n\n\n_NORMAL_ALIASES = {\n    \"third_party/crates_io\": {\n        _COMMON_CONDITION: {\n            Label(\"@rust_crates//:syn-1.0.109\"): \"syn1\",\n        },\n    },\n}\n\n\n_NORMAL_DEV_DEPENDENCIES = {\n    \"third_party/crates_io\": {\n    },\n}\n\n\n_NORMAL_DEV_ALIASES = {\n    \"third_party/crates_io\": {\n    },\n}\n\n\n_PROC_MACRO_DEPENDENCIES = {\n    \"third_party/crates_io\": {\n        _COMMON_CONDITION: {\n            \"bitfield-struct\": Label(\"@rust_crates//:bitfield-struct-0.11.0\"),\n            \"paste\": Label(\"@rust_crates//:paste-1.0.15\"),\n            \"serde_derive\": Label(\"@rust_crates//:serde_derive-1.0.228\"),\n        },\n    },\n}\n\n\n_PROC_MACRO_ALIASES = {\n    \"third_party/crates_io\": {\n    },\n}\n\n\n_PROC_MACRO_DEV_DEPENDENCIES = {\n    \"third_party/crates_io\": {\n    },\n}\n\n\n_PROC_MACRO_DEV_ALIASES = {\n    \"third_party/crates_io\": {\n    },\n}\n\n\n_BUILD_DEPENDENCIES = {\n    \"third_party/crates_io\": {\n    },\n}\n\n\n_BUILD_ALIASES = {\n    \"third_party/crates_io\": {\n    },\n}\n\n\n_BUILD_PROC_MACRO_DEPENDENCIES = {\n    \"third_party/crates_io\": {\n    },\n}\n\n\n_BUILD_PROC_MACRO_ALIASES = {\n    \"third_party/crates_io\": {\n    },\n}\n\n\n_CONDITIONS = {\n    \"aarch64-apple-darwin\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\"],\n    \"aarch64-linux-android\": [],\n    \"aarch64-unknown-linux-gnu\": [\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\"],\n    \"cfg(all(any(target_os = \\\"linux\\\", target_os = \\\"android\\\"), any(rustix_use_libc, miri, not(all(target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", any(target_arch = \\\"s390x\\\", target_arch = \\\"powerpc\\\")), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc\\\"), all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\")))))))\": [],\n    \"cfg(all(not(rustix_use_libc), not(miri), target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", any(target_arch = \\\"s390x\\\", target_arch = \\\"powerpc\\\")), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc\\\"), all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\"))))\": [\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\"],\n    \"cfg(all(not(windows), any(rustix_use_libc, miri, not(all(target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", any(target_arch = \\\"s390x\\\", target_arch = \\\"powerpc\\\")), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc\\\"), all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\")))))))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:riscv32imc-unknown-none-elf\",\"@rules_rust//rust/platform:thumbv7em-none-eabi\",\"@rules_rust//rust/platform:x86_64-apple-darwin\"],\n    \"cfg(all(target_arch = \\\"aarch64\\\", target_os = \\\"linux\\\"))\": [\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\"],\n    \"cfg(all(target_arch = \\\"aarch64\\\", target_vendor = \\\"apple\\\"))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\"],\n    \"cfg(all(target_arch = \\\"loongarch64\\\", target_os = \\\"linux\\\"))\": [],\n    \"cfg(any())\": [],\n    \"cfg(any(target_arch = \\\"aarch64\\\", target_arch = \\\"x86_64\\\", target_arch = \\\"x86\\\"))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-apple-darwin\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\"],\n    \"cfg(any(target_arch = \\\"arm\\\", target_pointer_width = \\\"32\\\", target_pointer_width = \\\"64\\\"))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:riscv32imc-unknown-none-elf\",\"@rules_rust//rust/platform:thumbv7em-none-eabi\",\"@rules_rust//rust/platform:x86_64-apple-darwin\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\"],\n    \"cfg(any(unix, target_os = \\\"hermit\\\", target_os = \\\"wasi\\\"))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-apple-darwin\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\"],\n    \"cfg(any(unix, target_os = \\\"wasi\\\"))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-apple-darwin\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\"],\n    \"cfg(target_arch = \\\"aarch64\\\")\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\"],\n    \"cfg(target_os = \\\"hermit\\\")\": [],\n    \"cfg(target_os = \\\"redox\\\")\": [],\n    \"cfg(target_os = \\\"wasi\\\")\": [],\n    \"cfg(unix)\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-apple-darwin\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\"],\n    \"cfg(windows)\": [],\n    \"riscv32imc-unknown-none-elf\": [\"@rules_rust//rust/platform:riscv32imc-unknown-none-elf\"],\n    \"thumbv7em-none-eabi\": [\"@rules_rust//rust/platform:thumbv7em-none-eabi\"],\n    \"x86_64-apple-darwin\": [\"@rules_rust//rust/platform:x86_64-apple-darwin\"],\n    \"x86_64-unknown-linux-gnu\": [\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\"],\n}\n\n###############################################################################\n\ndef crate_repositories():\n    \"\"\"A macro for defining repositories for all generated crates.\n\n    Returns:\n      A list of repos visible to the module through the module extension.\n    \"\"\"\n    maybe(\n        http_archive,\n        name = \"rust_crates__adler2-2.0.1\",\n        sha256 = \"320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/adler2/2.0.1/download\"],\n        strip_prefix = \"adler2-2.0.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.adler2-2.0.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__aead-0.5.2\",\n        sha256 = \"d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/aead/0.5.2/download\"],\n        strip_prefix = \"aead-0.5.2\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.aead-0.5.2.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__aes-0.8.4\",\n        sha256 = \"b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/aes/0.8.4/download\"],\n        strip_prefix = \"aes-0.8.4\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.aes-0.8.4.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__aes-gcm-0.10.3\",\n        sha256 = \"831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/aes-gcm/0.10.3/download\"],\n        strip_prefix = \"aes-gcm-0.10.3\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.aes-gcm-0.10.3.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__aligned-0.4.3\",\n        sha256 = \"ee4508988c62edf04abd8d92897fca0c2995d907ce1dfeaf369dac3716a40685\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/aligned/0.4.3/download\"],\n        strip_prefix = \"aligned-0.4.3\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.aligned-0.4.3.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__anstream-1.0.0\",\n        sha256 = \"824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/anstream/1.0.0/download\"],\n        strip_prefix = \"anstream-1.0.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.anstream-1.0.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__anstyle-1.0.14\",\n        sha256 = \"940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/anstyle/1.0.14/download\"],\n        strip_prefix = \"anstyle-1.0.14\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.anstyle-1.0.14.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__anstyle-parse-1.0.0\",\n        sha256 = \"52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/anstyle-parse/1.0.0/download\"],\n        strip_prefix = \"anstyle-parse-1.0.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.anstyle-parse-1.0.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__anstyle-query-1.1.5\",\n        sha256 = \"40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/anstyle-query/1.1.5/download\"],\n        strip_prefix = \"anstyle-query-1.1.5\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.anstyle-query-1.1.5.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__anstyle-wincon-3.0.11\",\n        sha256 = \"291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/anstyle-wincon/3.0.11/download\"],\n        strip_prefix = \"anstyle-wincon-3.0.11\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.anstyle-wincon-3.0.11.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__anyhow-1.0.102\",\n        sha256 = \"7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/anyhow/1.0.102/download\"],\n        strip_prefix = \"anyhow-1.0.102\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.anyhow-1.0.102.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__as-slice-0.2.1\",\n        sha256 = \"516b6b4f0e40d50dcda9365d53964ec74560ad4284da2e7fc97122cd83174516\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/as-slice/0.2.1/download\"],\n        strip_prefix = \"as-slice-0.2.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.as-slice-0.2.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__autocfg-1.5.0\",\n        sha256 = \"c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/autocfg/1.5.0/download\"],\n        strip_prefix = \"autocfg-1.5.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.autocfg-1.5.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__bare-metal-0.2.5\",\n        sha256 = \"5deb64efa5bd81e31fcd1938615a6d98c82eafcbcd787162b6f63b91d6bac5b3\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/bare-metal/0.2.5/download\"],\n        strip_prefix = \"bare-metal-0.2.5\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.bare-metal-0.2.5.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__base16ct-0.2.0\",\n        sha256 = \"4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/base16ct/0.2.0/download\"],\n        strip_prefix = \"base16ct-0.2.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.base16ct-0.2.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__bitfield-0.13.2\",\n        sha256 = \"46afbd2983a5d5a7bd740ccb198caf5b82f45c40c09c0eed36052d91cb92e719\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/bitfield/0.13.2/download\"],\n        strip_prefix = \"bitfield-0.13.2\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.bitfield-0.13.2.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__bitfield-0.14.0\",\n        sha256 = \"2d7e60934ceec538daadb9d8432424ed043a904d8e0243f3c6446bce549a46ac\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/bitfield/0.14.0/download\"],\n        strip_prefix = \"bitfield-0.14.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.bitfield-0.14.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__bitfield-struct-0.11.0\",\n        sha256 = \"d3ca019570363e800b05ad4fd890734f28ac7b72f563ad8a35079efb793616f8\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/bitfield-struct/0.11.0/download\"],\n        strip_prefix = \"bitfield-struct-0.11.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.bitfield-struct-0.11.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__bitflags-2.11.1\",\n        sha256 = \"c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/bitflags/2.11.1/download\"],\n        strip_prefix = \"bitflags-2.11.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.bitflags-2.11.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__block-buffer-0.10.4\",\n        sha256 = \"3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/block-buffer/0.10.4/download\"],\n        strip_prefix = \"block-buffer-0.10.4\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.block-buffer-0.10.4.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__byteorder-1.5.0\",\n        sha256 = \"1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/byteorder/1.5.0/download\"],\n        strip_prefix = \"byteorder-1.5.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.byteorder-1.5.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__bytes-1.11.1\",\n        sha256 = \"1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/bytes/1.11.1/download\"],\n        strip_prefix = \"bytes-1.11.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.bytes-1.11.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__cfg-if-1.0.4\",\n        sha256 = \"9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/cfg-if/1.0.4/download\"],\n        strip_prefix = \"cfg-if-1.0.4\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.cfg-if-1.0.4.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__cipher-0.4.4\",\n        sha256 = \"773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/cipher/0.4.4/download\"],\n        strip_prefix = \"cipher-0.4.4\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.cipher-0.4.4.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__clap-4.6.1\",\n        sha256 = \"1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/clap/4.6.1/download\"],\n        strip_prefix = \"clap-4.6.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.clap-4.6.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__clap_builder-4.6.0\",\n        sha256 = \"714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/clap_builder/4.6.0/download\"],\n        strip_prefix = \"clap_builder-4.6.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.clap_builder-4.6.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__clap_derive-4.6.1\",\n        sha256 = \"f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/clap_derive/4.6.1/download\"],\n        strip_prefix = \"clap_derive-4.6.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.clap_derive-4.6.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__clap_lex-1.1.0\",\n        sha256 = \"c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/clap_lex/1.1.0/download\"],\n        strip_prefix = \"clap_lex-1.1.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.clap_lex-1.1.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__colorchoice-1.0.5\",\n        sha256 = \"1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/colorchoice/1.0.5/download\"],\n        strip_prefix = \"colorchoice-1.0.5\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.colorchoice-1.0.5.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__compiler_builtins-0.1.160\",\n        sha256 = \"6376049cfa92c0aa8b9ac95fae22184b981c658208d4ed8a1dc553cd83612895\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/compiler_builtins/0.1.160/download\"],\n        strip_prefix = \"compiler_builtins-0.1.160\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.compiler_builtins-0.1.160.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__const-oid-0.9.6\",\n        sha256 = \"c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/const-oid/0.9.6/download\"],\n        strip_prefix = \"const-oid-0.9.6\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.const-oid-0.9.6.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__cortex-m-0.7.7\",\n        sha256 = \"8ec610d8f49840a5b376c69663b6369e71f4b34484b9b2eb29fb918d92516cb9\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/cortex-m/0.7.7/download\"],\n        strip_prefix = \"cortex-m-0.7.7\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.cortex-m-0.7.7.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__cortex-m-rt-0.7.5\",\n        sha256 = \"801d4dec46b34c299ccf6b036717ae0fce602faa4f4fe816d9013b9a7c9f5ba6\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/cortex-m-rt/0.7.5/download\"],\n        strip_prefix = \"cortex-m-rt-0.7.5\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.cortex-m-rt-0.7.5.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__cortex-m-rt-macros-0.7.5\",\n        sha256 = \"e37549a379a9e0e6e576fd208ee60394ccb8be963889eebba3ffe0980364f472\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/cortex-m-rt-macros/0.7.5/download\"],\n        strip_prefix = \"cortex-m-rt-macros-0.7.5\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.cortex-m-rt-macros-0.7.5.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__cortex-m-semihosting-0.5.0\",\n        sha256 = \"c23234600452033cc77e4b761e740e02d2c4168e11dbf36ab14a0f58973592b0\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/cortex-m-semihosting/0.5.0/download\"],\n        strip_prefix = \"cortex-m-semihosting-0.5.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.cortex-m-semihosting-0.5.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__cpufeatures-0.2.17\",\n        sha256 = \"59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/cpufeatures/0.2.17/download\"],\n        strip_prefix = \"cpufeatures-0.2.17\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.cpufeatures-0.2.17.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__crc-3.4.0\",\n        sha256 = \"5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/crc/3.4.0/download\"],\n        strip_prefix = \"crc-3.4.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.crc-3.4.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__crc-catalog-2.5.0\",\n        sha256 = \"217698eaf96b4a3f0bc4f3662aaa55bdf913cd54d7204591faa790070c6d0853\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/crc-catalog/2.5.0/download\"],\n        strip_prefix = \"crc-catalog-2.5.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.crc-catalog-2.5.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__crc32fast-1.5.0\",\n        sha256 = \"9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/crc32fast/1.5.0/download\"],\n        strip_prefix = \"crc32fast-1.5.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.crc32fast-1.5.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__critical-section-1.2.0\",\n        sha256 = \"790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/critical-section/1.2.0/download\"],\n        strip_prefix = \"critical-section-1.2.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.critical-section-1.2.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__crypto-bigint-0.5.5\",\n        sha256 = \"0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/crypto-bigint/0.5.5/download\"],\n        strip_prefix = \"crypto-bigint-0.5.5\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.crypto-bigint-0.5.5.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__crypto-common-0.1.7\",\n        sha256 = \"78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/crypto-common/0.1.7/download\"],\n        strip_prefix = \"crypto-common-0.1.7\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.crypto-common-0.1.7.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__ctr-0.9.2\",\n        sha256 = \"0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/ctr/0.9.2/download\"],\n        strip_prefix = \"ctr-0.9.2\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.ctr-0.9.2.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__der-0.7.10\",\n        sha256 = \"e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/der/0.7.10/download\"],\n        strip_prefix = \"der-0.7.10\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.der-0.7.10.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__digest-0.10.7\",\n        sha256 = \"9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/digest/0.10.7/download\"],\n        strip_prefix = \"digest-0.10.7\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.digest-0.10.7.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__ecdsa-0.16.9\",\n        sha256 = \"ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/ecdsa/0.16.9/download\"],\n        strip_prefix = \"ecdsa-0.16.9\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.ecdsa-0.16.9.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__either-1.15.0\",\n        sha256 = \"48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/either/1.15.0/download\"],\n        strip_prefix = \"either-1.15.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.either-1.15.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__elliptic-curve-0.13.8\",\n        sha256 = \"b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/elliptic-curve/0.13.8/download\"],\n        strip_prefix = \"elliptic-curve-0.13.8\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.elliptic-curve-0.13.8.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__embedded-crc-macros-1.0.0\",\n        sha256 = \"4f1c75747a43b086df1a87fb2a889590bc0725e0abf54bba6d0c4bf7bd9e762c\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/embedded-crc-macros/1.0.0/download\"],\n        strip_prefix = \"embedded-crc-macros-1.0.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.embedded-crc-macros-1.0.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__embedded-hal-0.2.7\",\n        sha256 = \"35949884794ad573cf46071e41c9b60efb0cb311e3ca01f7af807af1debc66ff\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/embedded-hal/0.2.7/download\"],\n        strip_prefix = \"embedded-hal-0.2.7\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.embedded-hal-0.2.7.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__embedded-hal-1.0.0\",\n        sha256 = \"361a90feb7004eca4019fb28352a9465666b24f840f5c3cddf0ff13920590b89\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/embedded-hal/1.0.0/download\"],\n        strip_prefix = \"embedded-hal-1.0.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.embedded-hal-1.0.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__embedded-hal-async-1.0.0\",\n        sha256 = \"0c4c685bbef7fe13c3c6dd4da26841ed3980ef33e841cddfa15ce8a8fb3f1884\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/embedded-hal-async/1.0.0/download\"],\n        strip_prefix = \"embedded-hal-async-1.0.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.embedded-hal-async-1.0.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__embedded-hal-nb-1.0.0\",\n        sha256 = \"fba4268c14288c828995299e59b12babdbe170f6c6d73731af1b4648142e8605\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/embedded-hal-nb/1.0.0/download\"],\n        strip_prefix = \"embedded-hal-nb-1.0.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.embedded-hal-nb-1.0.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__embedded-io-0.6.1\",\n        sha256 = \"edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/embedded-io/0.6.1/download\"],\n        strip_prefix = \"embedded-io-0.6.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.embedded-io-0.6.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__embedded-io-async-0.6.1\",\n        sha256 = \"3ff09972d4073aa8c299395be75161d582e7629cd663171d62af73c8d50dba3f\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/embedded-io-async/0.6.1/download\"],\n        strip_prefix = \"embedded-io-async-0.6.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.embedded-io-async-0.6.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__equivalent-1.0.2\",\n        sha256 = \"877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/equivalent/1.0.2/download\"],\n        strip_prefix = \"equivalent-1.0.2\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.equivalent-1.0.2.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__errno-0.3.14\",\n        sha256 = \"39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/errno/0.3.14/download\"],\n        strip_prefix = \"errno-0.3.14\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.errno-0.3.14.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__ff-0.13.1\",\n        sha256 = \"c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/ff/0.13.1/download\"],\n        strip_prefix = \"ff-0.13.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.ff-0.13.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__flate2-1.1.9\",\n        sha256 = \"843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/flate2/1.1.9/download\"],\n        strip_prefix = \"flate2-1.1.9\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.flate2-1.1.9.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__foldhash-0.1.5\",\n        sha256 = \"d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/foldhash/0.1.5/download\"],\n        strip_prefix = \"foldhash-0.1.5\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.foldhash-0.1.5.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__futures-0.3.32\",\n        sha256 = \"8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/futures/0.3.32/download\"],\n        strip_prefix = \"futures-0.3.32\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.futures-0.3.32.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__futures-channel-0.3.32\",\n        sha256 = \"07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/futures-channel/0.3.32/download\"],\n        strip_prefix = \"futures-channel-0.3.32\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.futures-channel-0.3.32.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__futures-core-0.3.32\",\n        sha256 = \"7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/futures-core/0.3.32/download\"],\n        strip_prefix = \"futures-core-0.3.32\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.futures-core-0.3.32.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__futures-executor-0.3.32\",\n        sha256 = \"baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/futures-executor/0.3.32/download\"],\n        strip_prefix = \"futures-executor-0.3.32\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.futures-executor-0.3.32.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__futures-io-0.3.32\",\n        sha256 = \"cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/futures-io/0.3.32/download\"],\n        strip_prefix = \"futures-io-0.3.32\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.futures-io-0.3.32.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__futures-macro-0.3.32\",\n        sha256 = \"e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/futures-macro/0.3.32/download\"],\n        strip_prefix = \"futures-macro-0.3.32\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.futures-macro-0.3.32.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__futures-sink-0.3.32\",\n        sha256 = \"c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/futures-sink/0.3.32/download\"],\n        strip_prefix = \"futures-sink-0.3.32\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.futures-sink-0.3.32.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__futures-task-0.3.32\",\n        sha256 = \"037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/futures-task/0.3.32/download\"],\n        strip_prefix = \"futures-task-0.3.32\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.futures-task-0.3.32.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__futures-util-0.3.32\",\n        sha256 = \"389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/futures-util/0.3.32/download\"],\n        strip_prefix = \"futures-util-0.3.32\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.futures-util-0.3.32.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__generic-array-0.14.7\",\n        sha256 = \"85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/generic-array/0.14.7/download\"],\n        strip_prefix = \"generic-array-0.14.7\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.generic-array-0.14.7.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__ghash-0.5.1\",\n        sha256 = \"f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/ghash/0.5.1/download\"],\n        strip_prefix = \"ghash-0.5.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.ghash-0.5.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__group-0.13.0\",\n        sha256 = \"f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/group/0.13.0/download\"],\n        strip_prefix = \"group-0.13.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.group-0.13.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__hash32-0.3.1\",\n        sha256 = \"47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/hash32/0.3.1/download\"],\n        strip_prefix = \"hash32-0.3.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.hash32-0.3.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__hashbrown-0.15.5\",\n        sha256 = \"9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/hashbrown/0.15.5/download\"],\n        strip_prefix = \"hashbrown-0.15.5\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.hashbrown-0.15.5.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__hashbrown-0.17.0\",\n        sha256 = \"4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/hashbrown/0.17.0/download\"],\n        strip_prefix = \"hashbrown-0.17.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.hashbrown-0.17.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__heapless-0.8.0\",\n        sha256 = \"0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/heapless/0.8.0/download\"],\n        strip_prefix = \"heapless-0.8.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.heapless-0.8.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__heapless-0.9.2\",\n        sha256 = \"2af2455f757db2b292a9b1768c4b70186d443bcb3b316252d6b540aec1cd89ed\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/heapless/0.9.2/download\"],\n        strip_prefix = \"heapless-0.9.2\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.heapless-0.9.2.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__heck-0.5.0\",\n        sha256 = \"2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/heck/0.5.0/download\"],\n        strip_prefix = \"heck-0.5.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.heck-0.5.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__hex-0.4.3\",\n        sha256 = \"7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/hex/0.4.3/download\"],\n        strip_prefix = \"hex-0.4.3\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.hex-0.4.3.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__hmac-0.12.1\",\n        sha256 = \"6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/hmac/0.12.1/download\"],\n        strip_prefix = \"hmac-0.12.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.hmac-0.12.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__indexmap-2.14.0\",\n        sha256 = \"d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/indexmap/2.14.0/download\"],\n        strip_prefix = \"indexmap-2.14.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.indexmap-2.14.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__inout-0.1.4\",\n        sha256 = \"879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/inout/0.1.4/download\"],\n        strip_prefix = \"inout-0.1.4\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.inout-0.1.4.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__is_terminal_polyfill-1.70.2\",\n        sha256 = \"a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/is_terminal_polyfill/1.70.2/download\"],\n        strip_prefix = \"is_terminal_polyfill-1.70.2\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.is_terminal_polyfill-1.70.2.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__itertools-0.14.0\",\n        sha256 = \"2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/itertools/0.14.0/download\"],\n        strip_prefix = \"itertools-0.14.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.itertools-0.14.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__k256-0.13.4\",\n        sha256 = \"f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/k256/0.13.4/download\"],\n        strip_prefix = \"k256-0.13.4\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.k256-0.13.4.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__keccak-0.1.6\",\n        sha256 = \"cb26cec98cce3a3d96cbb7bced3c4b16e3d13f27ec56dbd62cbc8f39cfb9d653\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/keccak/0.1.6/download\"],\n        strip_prefix = \"keccak-0.1.6\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.keccak-0.1.6.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__libc-0.2.186\",\n        sha256 = \"68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/libc/0.2.186/download\"],\n        strip_prefix = \"libc-0.2.186\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.libc-0.2.186.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__linux-raw-sys-0.12.1\",\n        sha256 = \"32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/linux-raw-sys/0.12.1/download\"],\n        strip_prefix = \"linux-raw-sys-0.12.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.linux-raw-sys-0.12.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__lock_api-0.4.14\",\n        sha256 = \"224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/lock_api/0.4.14/download\"],\n        strip_prefix = \"lock_api-0.4.14\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.lock_api-0.4.14.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__log-0.4.29\",\n        sha256 = \"5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/log/0.4.29/download\"],\n        strip_prefix = \"log-0.4.29\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.log-0.4.29.bazel\"),\n    )\n\n    maybe(\n        new_git_repository,\n        name = \"rust_crates__mctp-0.2.0\",\n        commit = \"fafe92f6fcadf6e57683b91757fad9933ddd223d\",\n        init_submodules = True,\n        remote = \"https://github.com/OpenPRoT/mctp-rs.git\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.mctp-0.2.0.bazel\"),\n        strip_prefix = \"mctp\",\n    )\n\n    maybe(\n        new_git_repository,\n        name = \"rust_crates__mctp-estack-0.1.0\",\n        commit = \"fafe92f6fcadf6e57683b91757fad9933ddd223d\",\n        init_submodules = True,\n        remote = \"https://github.com/OpenPRoT/mctp-rs.git\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.mctp-estack-0.1.0.bazel\"),\n        strip_prefix = \"mctp-estack\",\n    )\n\n    maybe(\n        new_git_repository,\n        name = \"rust_crates__mctp-lib-0.1.0\",\n        commit = \"9c53adaeb7ae544cbeab4654530a50d158e33fe5\",\n        init_submodules = True,\n        remote = \"https://github.com/9elements/mctp-lib.git\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.mctp-lib-0.1.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__memchr-2.8.0\",\n        sha256 = \"f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/memchr/2.8.0/download\"],\n        strip_prefix = \"memchr-2.8.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.memchr-2.8.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__memo-map-0.3.3\",\n        sha256 = \"38d1115007560874e373613744c6fba374c17688327a71c1476d1a5954cc857b\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/memo-map/0.3.3/download\"],\n        strip_prefix = \"memo-map-0.3.3\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.memo-map-0.3.3.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__memoffset-0.9.1\",\n        sha256 = \"488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/memoffset/0.9.1/download\"],\n        strip_prefix = \"memoffset-0.9.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.memoffset-0.9.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__minijinja-2.19.0\",\n        sha256 = \"805bfd7352166bae857ee569628b52bcd85a1cecf7810861ebceb1686b72b75d\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/minijinja/2.19.0/download\"],\n        strip_prefix = \"minijinja-2.19.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.minijinja-2.19.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__minimal-lexical-0.2.1\",\n        sha256 = \"68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/minimal-lexical/0.2.1/download\"],\n        strip_prefix = \"minimal-lexical-0.2.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.minimal-lexical-0.2.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__miniz_oxide-0.8.9\",\n        sha256 = \"1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/miniz_oxide/0.8.9/download\"],\n        strip_prefix = \"miniz_oxide-0.8.9\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.miniz_oxide-0.8.9.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__mio-1.2.0\",\n        sha256 = \"50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/mio/1.2.0/download\"],\n        strip_prefix = \"mio-1.2.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.mio-1.2.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__nb-0.1.3\",\n        sha256 = \"801d31da0513b6ec5214e9bf433a77966320625a37860f910be265be6e18d06f\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/nb/0.1.3/download\"],\n        strip_prefix = \"nb-0.1.3\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.nb-0.1.3.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__nb-1.1.0\",\n        sha256 = \"8d5439c4ad607c3c23abf66de8c8bf57ba8adcd1f129e699851a6e43935d339d\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/nb/1.1.0/download\"],\n        strip_prefix = \"nb-1.1.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.nb-1.1.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__nom-7.1.3\",\n        sha256 = \"d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/nom/7.1.3/download\"],\n        strip_prefix = \"nom-7.1.3\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.nom-7.1.3.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__object-0.37.3\",\n        sha256 = \"ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/object/0.37.3/download\"],\n        strip_prefix = \"object-0.37.3\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.object-0.37.3.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__once_cell_polyfill-1.70.2\",\n        sha256 = \"384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/once_cell_polyfill/1.70.2/download\"],\n        strip_prefix = \"once_cell_polyfill-1.70.2\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.once_cell_polyfill-1.70.2.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__opaque-debug-0.3.1\",\n        sha256 = \"c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/opaque-debug/0.3.1/download\"],\n        strip_prefix = \"opaque-debug-0.3.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.opaque-debug-0.3.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__p256-0.13.2\",\n        sha256 = \"c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/p256/0.13.2/download\"],\n        strip_prefix = \"p256-0.13.2\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.p256-0.13.2.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__p384-0.13.1\",\n        sha256 = \"fe42f1670a52a47d448f14b6a5c61dd78fce51856e68edaa38f7ae3a46b8d6b6\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/p384/0.13.1/download\"],\n        strip_prefix = \"p384-0.13.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.p384-0.13.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__parking_lot-0.12.5\",\n        sha256 = \"93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/parking_lot/0.12.5/download\"],\n        strip_prefix = \"parking_lot-0.12.5\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.parking_lot-0.12.5.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__parking_lot_core-0.9.12\",\n        sha256 = \"2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/parking_lot_core/0.9.12/download\"],\n        strip_prefix = \"parking_lot_core-0.9.12\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.parking_lot_core-0.9.12.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__paste-1.0.15\",\n        sha256 = \"57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/paste/1.0.15/download\"],\n        strip_prefix = \"paste-1.0.15\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.paste-1.0.15.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__pest-2.8.6\",\n        sha256 = \"e0848c601009d37dfa3430c4666e147e49cdcf1b92ecd3e63657d8a5f19da662\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/pest/2.8.6/download\"],\n        strip_prefix = \"pest-2.8.6\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.pest-2.8.6.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__pest_derive-2.8.6\",\n        sha256 = \"11f486f1ea21e6c10ed15d5a7c77165d0ee443402f0780849d1768e7d9d6fe77\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/pest_derive/2.8.6/download\"],\n        strip_prefix = \"pest_derive-2.8.6\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.pest_derive-2.8.6.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__pest_generator-2.8.6\",\n        sha256 = \"8040c4647b13b210a963c1ed407c1ff4fdfa01c31d6d2a098218702e6664f94f\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/pest_generator/2.8.6/download\"],\n        strip_prefix = \"pest_generator-2.8.6\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.pest_generator-2.8.6.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__pest_meta-2.8.6\",\n        sha256 = \"89815c69d36021a140146f26659a81d6c2afa33d216d736dd4be5381a7362220\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/pest_meta/2.8.6/download\"],\n        strip_prefix = \"pest_meta-2.8.6\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.pest_meta-2.8.6.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__pin-project-lite-0.2.17\",\n        sha256 = \"a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/pin-project-lite/0.2.17/download\"],\n        strip_prefix = \"pin-project-lite-0.2.17\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.pin-project-lite-0.2.17.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__polyval-0.6.2\",\n        sha256 = \"9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/polyval/0.6.2/download\"],\n        strip_prefix = \"polyval-0.6.2\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.polyval-0.6.2.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__primeorder-0.13.6\",\n        sha256 = \"353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/primeorder/0.13.6/download\"],\n        strip_prefix = \"primeorder-0.13.6\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.primeorder-0.13.6.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__proc-macro2-1.0.106\",\n        sha256 = \"8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/proc-macro2/1.0.106/download\"],\n        strip_prefix = \"proc-macro2-1.0.106\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.proc-macro2-1.0.106.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__prost-0.13.5\",\n        sha256 = \"2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/prost/0.13.5/download\"],\n        strip_prefix = \"prost-0.13.5\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.prost-0.13.5.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__prost-derive-0.13.5\",\n        sha256 = \"8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/prost-derive/0.13.5/download\"],\n        strip_prefix = \"prost-derive-0.13.5\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.prost-derive-0.13.5.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__quote-1.0.45\",\n        sha256 = \"41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/quote/1.0.45/download\"],\n        strip_prefix = \"quote-1.0.45\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.quote-1.0.45.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__rand_core-0.6.4\",\n        sha256 = \"ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/rand_core/0.6.4/download\"],\n        strip_prefix = \"rand_core-0.6.4\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.rand_core-0.6.4.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__rand_core-0.9.5\",\n        sha256 = \"76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/rand_core/0.9.5/download\"],\n        strip_prefix = \"rand_core-0.9.5\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.rand_core-0.9.5.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__redox_syscall-0.5.18\",\n        sha256 = \"ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/redox_syscall/0.5.18/download\"],\n        strip_prefix = \"redox_syscall-0.5.18\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.redox_syscall-0.5.18.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__rfc6979-0.4.0\",\n        sha256 = \"f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/rfc6979/0.4.0/download\"],\n        strip_prefix = \"rfc6979-0.4.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.rfc6979-0.4.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__riscv-0.11.1\",\n        sha256 = \"2f5c1b8bf41ea746266cdee443d1d1e9125c86ce1447e1a2615abd34330d33a9\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/riscv/0.11.1/download\"],\n        strip_prefix = \"riscv-0.11.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.riscv-0.11.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__riscv-0.12.1\",\n        sha256 = \"5ea8ff73d3720bdd0a97925f0bf79ad2744b6da8ff36be3840c48ac81191d7a7\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/riscv/0.12.1/download\"],\n        strip_prefix = \"riscv-0.12.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.riscv-0.12.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__riscv-0.13.0\",\n        sha256 = \"afa3cdbeccae4359f6839a00e8b77e5736caa200ba216caf38d24e4c16e2b586\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/riscv/0.13.0/download\"],\n        strip_prefix = \"riscv-0.13.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.riscv-0.13.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__riscv-macros-0.1.0\",\n        sha256 = \"f265be5d634272320a7de94cea15c22a3bfdd4eb42eb43edc528415f066a1f25\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/riscv-macros/0.1.0/download\"],\n        strip_prefix = \"riscv-macros-0.1.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.riscv-macros-0.1.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__riscv-macros-0.2.0\",\n        sha256 = \"e8c4aa1ea1af6dcc83a61be12e8189f9b293c3ba5a487778a4cd89fb060fdbbc\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/riscv-macros/0.2.0/download\"],\n        strip_prefix = \"riscv-macros-0.2.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.riscv-macros-0.2.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__riscv-pac-0.2.0\",\n        sha256 = \"8188909339ccc0c68cfb5a04648313f09621e8b87dc03095454f1a11f6c5d436\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/riscv-pac/0.2.0/download\"],\n        strip_prefix = \"riscv-pac-0.2.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.riscv-pac-0.2.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__riscv-rt-0.12.2\",\n        sha256 = \"c0d35e32cf1383183e8885d8a9aa4402a087fd094dc34c2cb6df6687d0229dfe\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/riscv-rt/0.12.2/download\"],\n        strip_prefix = \"riscv-rt-0.12.2\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.riscv-rt-0.12.2.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__riscv-rt-macros-0.2.2\",\n        sha256 = \"30f19a85fe107b65031e0ba8ec60c34c2494069fe910d6c297f5e7cb5a6f76d0\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/riscv-rt-macros/0.2.2/download\"],\n        strip_prefix = \"riscv-rt-macros-0.2.2\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.riscv-rt-macros-0.2.2.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__riscv-semihosting-0.1.3\",\n        sha256 = \"1086dd4bcc13de1cb14b93849411e3466de7e5907d2d8eb269032536e93facc6\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/riscv-semihosting/0.1.3/download\"],\n        strip_prefix = \"riscv-semihosting-0.1.3\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.riscv-semihosting-0.1.3.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__rustc-demangle-0.1.27\",\n        sha256 = \"b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/rustc-demangle/0.1.27/download\"],\n        strip_prefix = \"rustc-demangle-0.1.27\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.rustc-demangle-0.1.27.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__rustc_version-0.2.3\",\n        sha256 = \"138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/rustc_version/0.2.3/download\"],\n        strip_prefix = \"rustc_version-0.2.3\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.rustc_version-0.2.3.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__rustix-1.1.4\",\n        sha256 = \"b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/rustix/1.1.4/download\"],\n        strip_prefix = \"rustix-1.1.4\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.rustix-1.1.4.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__ruzstd-0.8.2\",\n        sha256 = \"e5ff0cc5e135c8870a775d3320910cd9b564ec036b4dc0b8741629020be63f01\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/ruzstd/0.8.2/download\"],\n        strip_prefix = \"ruzstd-0.8.2\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.ruzstd-0.8.2.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__scopeguard-1.2.0\",\n        sha256 = \"94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/scopeguard/1.2.0/download\"],\n        strip_prefix = \"scopeguard-1.2.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.scopeguard-1.2.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__sec1-0.7.3\",\n        sha256 = \"d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/sec1/0.7.3/download\"],\n        strip_prefix = \"sec1-0.7.3\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.sec1-0.7.3.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__semver-0.9.0\",\n        sha256 = \"1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/semver/0.9.0/download\"],\n        strip_prefix = \"semver-0.9.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.semver-0.9.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__semver-parser-0.7.0\",\n        sha256 = \"388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/semver-parser/0.7.0/download\"],\n        strip_prefix = \"semver-parser-0.7.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.semver-parser-0.7.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__serde-1.0.228\",\n        sha256 = \"9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/serde/1.0.228/download\"],\n        strip_prefix = \"serde-1.0.228\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.serde-1.0.228.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__serde_core-1.0.228\",\n        sha256 = \"41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/serde_core/1.0.228/download\"],\n        strip_prefix = \"serde_core-1.0.228\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.serde_core-1.0.228.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__serde_derive-1.0.228\",\n        sha256 = \"d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/serde_derive/1.0.228/download\"],\n        strip_prefix = \"serde_derive-1.0.228\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.serde_derive-1.0.228.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__serde_json5-0.2.1\",\n        sha256 = \"5d34d03f54462862f2a42918391c9526337f53171eaa4d8894562be7f252edd3\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/serde_json5/0.2.1/download\"],\n        strip_prefix = \"serde_json5-0.2.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.serde_json5-0.2.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__sha2-0.10.9\",\n        sha256 = \"a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/sha2/0.10.9/download\"],\n        strip_prefix = \"sha2-0.10.9\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.sha2-0.10.9.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__sha3-0.10.9\",\n        sha256 = \"77fd7028345d415a4034cf8777cd4f8ab1851274233b45f84e3d955502d93874\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/sha3/0.10.9/download\"],\n        strip_prefix = \"sha3-0.10.9\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.sha3-0.10.9.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__signal-hook-registry-1.4.8\",\n        sha256 = \"c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/signal-hook-registry/1.4.8/download\"],\n        strip_prefix = \"signal-hook-registry-1.4.8\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.signal-hook-registry-1.4.8.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__signature-2.2.0\",\n        sha256 = \"77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/signature/2.2.0/download\"],\n        strip_prefix = \"signature-2.2.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.signature-2.2.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__simd-adler32-0.3.9\",\n        sha256 = \"703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/simd-adler32/0.3.9/download\"],\n        strip_prefix = \"simd-adler32-0.3.9\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.simd-adler32-0.3.9.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__slab-0.4.12\",\n        sha256 = \"0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/slab/0.4.12/download\"],\n        strip_prefix = \"slab-0.4.12\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.slab-0.4.12.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__smallvec-1.15.1\",\n        sha256 = \"67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/smallvec/1.15.1/download\"],\n        strip_prefix = \"smallvec-1.15.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.smallvec-1.15.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__smbus-pec-1.0.1\",\n        sha256 = \"ca0763a680cd5d72b28f7bfc8a054c117d8841380a6ad4f72f05bd2a34217d3e\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/smbus-pec/1.0.1/download\"],\n        strip_prefix = \"smbus-pec-1.0.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.smbus-pec-1.0.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__smlang-0.8.0\",\n        sha256 = \"1de84f9f80bbe6272174e2bfdb8cf7ce4815b218038a42161c2f21c1d872c215\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/smlang/0.8.0/download\"],\n        strip_prefix = \"smlang-0.8.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.smlang-0.8.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__smlang-macros-0.8.0\",\n        sha256 = \"231b4425dcc43afc7e18c34e7c6738cd252d42d91d909c948df14107c9ae79f1\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/smlang-macros/0.8.0/download\"],\n        strip_prefix = \"smlang-macros-0.8.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.smlang-macros-0.8.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__socket2-0.6.3\",\n        sha256 = \"3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/socket2/0.6.3/download\"],\n        strip_prefix = \"socket2-0.6.3\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.socket2-0.6.3.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__stable_deref_trait-1.2.1\",\n        sha256 = \"6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/stable_deref_trait/1.2.1/download\"],\n        strip_prefix = \"stable_deref_trait-1.2.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.stable_deref_trait-1.2.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__string_morph-0.1.0\",\n        sha256 = \"183aaf7fa637cc7b5f54c45b8f7cb6e8d73831f9f75a56b6defa5bf8c51d1699\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/string_morph/0.1.0/download\"],\n        strip_prefix = \"string_morph-0.1.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.string_morph-0.1.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__strsim-0.11.1\",\n        sha256 = \"7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/strsim/0.11.1/download\"],\n        strip_prefix = \"strsim-0.11.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.strsim-0.11.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__subtle-2.6.1\",\n        sha256 = \"13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/subtle/2.6.1/download\"],\n        strip_prefix = \"subtle-2.6.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.subtle-2.6.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__syn-1.0.109\",\n        sha256 = \"72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/syn/1.0.109/download\"],\n        strip_prefix = \"syn-1.0.109\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.syn-1.0.109.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__syn-2.0.117\",\n        sha256 = \"e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/syn/2.0.117/download\"],\n        strip_prefix = \"syn-2.0.117\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.syn-2.0.117.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__terminal_size-0.4.4\",\n        sha256 = \"230a1b821ccbd75b185820a1f1ff7b14d21da1e442e22c0863ea5f08771a8874\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/terminal_size/0.4.4/download\"],\n        strip_prefix = \"terminal_size-0.4.4\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.terminal_size-0.4.4.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__thiserror-2.0.18\",\n        sha256 = \"4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/thiserror/2.0.18/download\"],\n        strip_prefix = \"thiserror-2.0.18\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.thiserror-2.0.18.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__thiserror-impl-2.0.18\",\n        sha256 = \"ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/thiserror-impl/2.0.18/download\"],\n        strip_prefix = \"thiserror-impl-2.0.18\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.thiserror-impl-2.0.18.bazel\"),\n    )\n\n    maybe(\n        new_git_repository,\n        name = \"rust_crates__tock-registers-0.9.0\",\n        commit = \"9554639b17501a9f5940cef7a1770a0823e790c3\",\n        init_submodules = True,\n        remote = \"https://github.com/tock/tock.git\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.tock-registers-0.9.0.bazel\"),\n        strip_prefix = \"libraries/tock-register-interface\",\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__tokio-1.52.1\",\n        sha256 = \"b67dee974fe86fd92cc45b7a95fdd2f99a36a6d7b0d431a231178d3d670bbcc6\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/tokio/1.52.1/download\"],\n        strip_prefix = \"tokio-1.52.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.tokio-1.52.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__tokio-macros-2.7.0\",\n        sha256 = \"385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/tokio-macros/2.7.0/download\"],\n        strip_prefix = \"tokio-macros-2.7.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.tokio-macros-2.7.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__tokio-util-0.7.18\",\n        sha256 = \"9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/tokio-util/0.7.18/download\"],\n        strip_prefix = \"tokio-util-0.7.18\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.tokio-util-0.7.18.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__twox-hash-2.1.2\",\n        sha256 = \"9ea3136b675547379c4bd395ca6b938e5ad3c3d20fad76e7fe85f9e0d011419c\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/twox-hash/2.1.2/download\"],\n        strip_prefix = \"twox-hash-2.1.2\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.twox-hash-2.1.2.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__typenum-1.20.0\",\n        sha256 = \"40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/typenum/1.20.0/download\"],\n        strip_prefix = \"typenum-1.20.0\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.typenum-1.20.0.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__ucd-trie-0.1.7\",\n        sha256 = \"2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/ucd-trie/0.1.7/download\"],\n        strip_prefix = \"ucd-trie-0.1.7\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.ucd-trie-0.1.7.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__unicode-ident-1.0.24\",\n        sha256 = \"e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/unicode-ident/1.0.24/download\"],\n        strip_prefix = \"unicode-ident-1.0.24\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.unicode-ident-1.0.24.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__universal-hash-0.5.1\",\n        sha256 = \"fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/universal-hash/0.5.1/download\"],\n        strip_prefix = \"universal-hash-0.5.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.universal-hash-0.5.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__utf8parse-0.2.2\",\n        sha256 = \"06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/utf8parse/0.2.2/download\"],\n        strip_prefix = \"utf8parse-0.2.2\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.utf8parse-0.2.2.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__uuid-1.23.1\",\n        sha256 = \"ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/uuid/1.23.1/download\"],\n        strip_prefix = \"uuid-1.23.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.uuid-1.23.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__vcell-0.1.3\",\n        sha256 = \"77439c1b53d2303b20d9459b1ade71a83c716e3f9c34f3228c00e6f185d6c002\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/vcell/0.1.3/download\"],\n        strip_prefix = \"vcell-0.1.3\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.vcell-0.1.3.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__version_check-0.9.5\",\n        sha256 = \"0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/version_check/0.9.5/download\"],\n        strip_prefix = \"version_check-0.9.5\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.version_check-0.9.5.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__void-1.0.2\",\n        sha256 = \"6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/void/1.0.2/download\"],\n        strip_prefix = \"void-1.0.2\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.void-1.0.2.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__volatile-register-0.2.2\",\n        sha256 = \"de437e2a6208b014ab52972a27e59b33fa2920d3e00fe05026167a1c509d19cc\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/volatile-register/0.2.2/download\"],\n        strip_prefix = \"volatile-register-0.2.2\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.volatile-register-0.2.2.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__wasi-0.11.1-wasi-snapshot-preview1\",\n        sha256 = \"ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/wasi/0.11.1+wasi-snapshot-preview1/download\"],\n        strip_prefix = \"wasi-0.11.1+wasi-snapshot-preview1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.wasi-0.11.1+wasi-snapshot-preview1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__windows-link-0.2.1\",\n        sha256 = \"f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/windows-link/0.2.1/download\"],\n        strip_prefix = \"windows-link-0.2.1\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.windows-link-0.2.1.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__windows-sys-0.61.2\",\n        sha256 = \"ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/windows-sys/0.61.2/download\"],\n        strip_prefix = \"windows-sys-0.61.2\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.windows-sys-0.61.2.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__zerocopy-0.8.48\",\n        sha256 = \"eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/zerocopy/0.8.48/download\"],\n        strip_prefix = \"zerocopy-0.8.48\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.zerocopy-0.8.48.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__zerocopy-derive-0.8.48\",\n        sha256 = \"70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/zerocopy-derive/0.8.48/download\"],\n        strip_prefix = \"zerocopy-derive-0.8.48\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.zerocopy-derive-0.8.48.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__zeroize-1.8.2\",\n        sha256 = \"b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/zeroize/1.8.2/download\"],\n        strip_prefix = \"zeroize-1.8.2\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.zeroize-1.8.2.bazel\"),\n    )\n\n    maybe(\n        http_archive,\n        name = \"rust_crates__zeroize_derive-1.4.3\",\n        sha256 = \"85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e\",\n        type = \"tar.gz\",\n        urls = [\"https://static.crates.io/crates/zeroize_derive/1.4.3/download\"],\n        strip_prefix = \"zeroize_derive-1.4.3\",\n        build_file = Label(\"@rust_crates//rust_crates:BUILD.zeroize_derive-1.4.3.bazel\"),\n    )\n\n    return [\n       struct(repo=\"rust_crates__aes-0.8.4\", is_dev_dep = False),\n       struct(repo=\"rust_crates__aes-gcm-0.10.3\", is_dev_dep = False),\n       struct(repo=\"rust_crates__aligned-0.4.3\", is_dev_dep = False),\n       struct(repo=\"rust_crates__anyhow-1.0.102\", is_dev_dep = False),\n       struct(repo=\"rust_crates__bitfield-0.14.0\", is_dev_dep = False),\n       struct(repo=\"rust_crates__bitfield-struct-0.11.0\", is_dev_dep = False),\n       struct(repo=\"rust_crates__bitflags-2.11.1\", is_dev_dep = False),\n       struct(repo=\"rust_crates__byteorder-1.5.0\", is_dev_dep = False),\n       struct(repo=\"rust_crates__cfg-if-1.0.4\", is_dev_dep = False),\n       struct(repo=\"rust_crates__cipher-0.4.4\", is_dev_dep = False),\n       struct(repo=\"rust_crates__clap-4.6.1\", is_dev_dep = False),\n       struct(repo=\"rust_crates__compiler_builtins-0.1.160\", is_dev_dep = False),\n       struct(repo=\"rust_crates__cortex-m-0.7.7\", is_dev_dep = False),\n       struct(repo=\"rust_crates__cortex-m-rt-0.7.5\", is_dev_dep = False),\n       struct(repo=\"rust_crates__cortex-m-semihosting-0.5.0\", is_dev_dep = False),\n       struct(repo=\"rust_crates__ctr-0.9.2\", is_dev_dep = False),\n       struct(repo=\"rust_crates__ecdsa-0.16.9\", is_dev_dep = False),\n       struct(repo=\"rust_crates__embedded-hal-1.0.0\", is_dev_dep = False),\n       struct(repo=\"rust_crates__embedded-hal-async-1.0.0\", is_dev_dep = False),\n       struct(repo=\"rust_crates__embedded-hal-nb-1.0.0\", is_dev_dep = False),\n       struct(repo=\"rust_crates__embedded-io-0.6.1\", is_dev_dep = False),\n       struct(repo=\"rust_crates__futures-0.3.32\", is_dev_dep = False),\n       struct(repo=\"rust_crates__heapless-0.9.2\", is_dev_dep = False),\n       struct(repo=\"rust_crates__hex-0.4.3\", is_dev_dep = False),\n       struct(repo=\"rust_crates__hmac-0.12.1\", is_dev_dep = False),\n       struct(repo=\"rust_crates__k256-0.13.4\", is_dev_dep = False),\n       struct(repo=\"rust_crates__log-0.4.29\", is_dev_dep = False),\n       struct(repo=\"rust_crates__mctp-0.2.0\", is_dev_dep = False),\n       struct(repo=\"rust_crates__mctp-lib-0.1.0\", is_dev_dep = False),\n       struct(repo=\"rust_crates__memoffset-0.9.1\", is_dev_dep = False),\n       struct(repo=\"rust_crates__minijinja-2.19.0\", is_dev_dep = False),\n       struct(repo=\"rust_crates__nb-1.1.0\", is_dev_dep = False),\n       struct(repo=\"rust_crates__nom-7.1.3\", is_dev_dep = False),\n       struct(repo=\"rust_crates__object-0.37.3\", is_dev_dep = False),\n       struct(repo=\"rust_crates__p256-0.13.2\", is_dev_dep = False),\n       struct(repo=\"rust_crates__p384-0.13.1\", is_dev_dep = False),\n       struct(repo=\"rust_crates__paste-1.0.15\", is_dev_dep = False),\n       struct(repo=\"rust_crates__proc-macro2-1.0.106\", is_dev_dep = False),\n       struct(repo=\"rust_crates__prost-0.13.5\", is_dev_dep = False),\n       struct(repo=\"rust_crates__quote-1.0.45\", is_dev_dep = False),\n       struct(repo=\"rust_crates__rand_core-0.9.5\", is_dev_dep = False),\n       struct(repo=\"rust_crates__riscv-0.12.1\", is_dev_dep = False),\n       struct(repo=\"rust_crates__riscv-rt-0.12.2\", is_dev_dep = False),\n       struct(repo=\"rust_crates__riscv-semihosting-0.1.3\", is_dev_dep = False),\n       struct(repo=\"rust_crates__rustc-demangle-0.1.27\", is_dev_dep = False),\n       struct(repo=\"rust_crates__sec1-0.7.3\", is_dev_dep = False),\n       struct(repo=\"rust_crates__serde-1.0.228\", is_dev_dep = False),\n       struct(repo=\"rust_crates__serde_derive-1.0.228\", is_dev_dep = False),\n       struct(repo=\"rust_crates__serde_json5-0.2.1\", is_dev_dep = False),\n       struct(repo=\"rust_crates__sha2-0.10.9\", is_dev_dep = False),\n       struct(repo=\"rust_crates__sha3-0.10.9\", is_dev_dep = False),\n       struct(repo=\"rust_crates__smlang-0.8.0\", is_dev_dep = False),\n       struct(repo=\"rust_crates__subtle-2.6.1\", is_dev_dep = False),\n       struct(repo=\"rust_crates__syn-1.0.109\", is_dev_dep = False),\n       struct(repo=\"rust_crates__syn-2.0.117\", is_dev_dep = False),\n       struct(repo=\"rust_crates__thiserror-2.0.18\", is_dev_dep = False),\n       struct(repo=\"rust_crates__tock-registers-0.9.0\", is_dev_dep = False),\n       struct(repo=\"rust_crates__tokio-1.52.1\", is_dev_dep = False),\n       struct(repo=\"rust_crates__tokio-util-0.7.18\", is_dev_dep = False),\n       struct(repo=\"rust_crates__vcell-0.1.3\", is_dev_dep = False),\n       struct(repo=\"rust_crates__zerocopy-0.8.48\", is_dev_dep = False),\n       struct(repo=\"rust_crates__zeroize-1.8.2\", is_dev_dep = False),\n    ]\n"
               }
             }
           },
@@ -3281,6 +3307,38 @@
               "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n#     bazel mod show_repo 'openprot'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n    name = \"cargo_toml_env_vars\",\n    src = \"Cargo.toml\",\n)\n\nrust_library(\n    name = \"cpufeatures\",\n    deps = select({\n        \"@rules_rust//rust/platform:aarch64-apple-darwin\": [\n            \"@rust_crates__libc-0.2.186//:libc\",  # cfg(all(target_arch = \"aarch64\", target_vendor = \"apple\"))\n        ],\n        \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [\n            \"@rust_crates__libc-0.2.186//:libc\",  # cfg(all(target_arch = \"aarch64\", target_os = \"linux\"))\n        ],\n        \"//conditions:default\": [],\n    }),\n    compile_data = glob(\n        allow_empty = True,\n        include = [\"**\"],\n        exclude = [\n            \"**/* *\",\n            \".tmp_git_root/**/*\",\n            \"BUILD\",\n            \"BUILD.bazel\",\n            \"WORKSPACE\",\n            \"WORKSPACE.bazel\",\n        ],\n    ),\n    crate_root = \"src/lib.rs\",\n    edition = \"2018\",\n    rustc_env_files = [\n        \":cargo_toml_env_vars\",\n    ],\n    rustc_flags = [\n        \"--cap-lints=allow\",\n    ],\n    srcs = glob(\n        allow_empty = True,\n        include = [\"**/*.rs\"],\n    ),\n    tags = [\n        \"cargo-bazel\",\n        \"crate-name=cpufeatures\",\n        \"manual\",\n        \"noclippy\",\n        \"norustfmt\",\n    ],\n    target_compatible_with = select({\n        \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n        \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n        \"@rules_rust//rust/platform:riscv32imc-unknown-none-elf\": [],\n        \"@rules_rust//rust/platform:thumbv7em-none-eabi\": [],\n        \"@rules_rust//rust/platform:x86_64-apple-darwin\": [],\n        \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n        \"//conditions:default\": [\"@platforms//:incompatible\"],\n    }),\n    version = \"0.2.17\",\n)\n"
             }
           },
+          "rust_crates__crc-3.4.0": {
+            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
+            "attributes": {
+              "patch_args": [],
+              "patch_tool": "",
+              "patches": [],
+              "remote_patch_strip": 1,
+              "sha256": "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d",
+              "type": "tar.gz",
+              "urls": [
+                "https://static.crates.io/crates/crc/3.4.0/download"
+              ],
+              "strip_prefix": "crc-3.4.0",
+              "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n#     bazel mod show_repo 'openprot'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n    name = \"cargo_toml_env_vars\",\n    src = \"Cargo.toml\",\n)\n\nrust_library(\n    name = \"crc\",\n    deps = [\n        \"@rust_crates__crc-catalog-2.5.0//:crc_catalog\",\n    ],\n    compile_data = glob(\n        allow_empty = True,\n        include = [\"**\"],\n        exclude = [\n            \"**/* *\",\n            \".tmp_git_root/**/*\",\n            \"BUILD\",\n            \"BUILD.bazel\",\n            \"WORKSPACE\",\n            \"WORKSPACE.bazel\",\n        ],\n    ),\n    crate_root = \"src/lib.rs\",\n    edition = \"2021\",\n    rustc_env_files = [\n        \":cargo_toml_env_vars\",\n    ],\n    rustc_flags = [\n        \"--cap-lints=allow\",\n    ],\n    srcs = glob(\n        allow_empty = True,\n        include = [\"**/*.rs\"],\n    ),\n    tags = [\n        \"cargo-bazel\",\n        \"crate-name=crc\",\n        \"manual\",\n        \"noclippy\",\n        \"norustfmt\",\n    ],\n    target_compatible_with = select({\n        \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n        \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n        \"@rules_rust//rust/platform:riscv32imc-unknown-none-elf\": [],\n        \"@rules_rust//rust/platform:thumbv7em-none-eabi\": [],\n        \"@rules_rust//rust/platform:x86_64-apple-darwin\": [],\n        \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n        \"//conditions:default\": [\"@platforms//:incompatible\"],\n    }),\n    version = \"3.4.0\",\n)\n"
+            }
+          },
+          "rust_crates__crc-catalog-2.5.0": {
+            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
+            "attributes": {
+              "patch_args": [],
+              "patch_tool": "",
+              "patches": [],
+              "remote_patch_strip": 1,
+              "sha256": "217698eaf96b4a3f0bc4f3662aaa55bdf913cd54d7204591faa790070c6d0853",
+              "type": "tar.gz",
+              "urls": [
+                "https://static.crates.io/crates/crc-catalog/2.5.0/download"
+              ],
+              "strip_prefix": "crc-catalog-2.5.0",
+              "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n#     bazel mod show_repo 'openprot'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n    name = \"cargo_toml_env_vars\",\n    src = \"Cargo.toml\",\n)\n\nrust_library(\n    name = \"crc_catalog\",\n    compile_data = glob(\n        allow_empty = True,\n        include = [\"**\"],\n        exclude = [\n            \"**/* *\",\n            \".tmp_git_root/**/*\",\n            \"BUILD\",\n            \"BUILD.bazel\",\n            \"WORKSPACE\",\n            \"WORKSPACE.bazel\",\n        ],\n    ),\n    crate_root = \"src/lib.rs\",\n    edition = \"2018\",\n    rustc_env_files = [\n        \":cargo_toml_env_vars\",\n    ],\n    rustc_flags = [\n        \"--cap-lints=allow\",\n    ],\n    srcs = glob(\n        allow_empty = True,\n        include = [\"**/*.rs\"],\n    ),\n    tags = [\n        \"cargo-bazel\",\n        \"crate-name=crc-catalog\",\n        \"manual\",\n        \"noclippy\",\n        \"norustfmt\",\n    ],\n    target_compatible_with = select({\n        \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n        \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n        \"@rules_rust//rust/platform:riscv32imc-unknown-none-elf\": [],\n        \"@rules_rust//rust/platform:thumbv7em-none-eabi\": [],\n        \"@rules_rust//rust/platform:x86_64-apple-darwin\": [],\n        \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n        \"//conditions:default\": [\"@platforms//:incompatible\"],\n    }),\n    version = \"2.5.0\",\n)\n"
+            }
+          },
           "rust_crates__crc32fast-1.5.0": {
             "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
             "attributes": {
@@ -3441,6 +3499,22 @@
               "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n#     bazel mod show_repo 'openprot'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n    name = \"cargo_toml_env_vars\",\n    src = \"Cargo.toml\",\n)\n\nrust_library(\n    name = \"elliptic_curve\",\n    deps = [\n        \"@rust_crates__base16ct-0.2.0//:base16ct\",\n        \"@rust_crates__crypto-bigint-0.5.5//:crypto_bigint\",\n        \"@rust_crates__digest-0.10.7//:digest\",\n        \"@rust_crates__ff-0.13.1//:ff\",\n        \"@rust_crates__generic-array-0.14.7//:generic_array\",\n        \"@rust_crates__group-0.13.0//:group\",\n        \"@rust_crates__rand_core-0.6.4//:rand_core\",\n        \"@rust_crates__sec1-0.7.3//:sec1\",\n        \"@rust_crates__subtle-2.6.1//:subtle\",\n        \"@rust_crates__zeroize-1.8.2//:zeroize\",\n    ],\n    compile_data = glob(\n        allow_empty = True,\n        include = [\"**\"],\n        exclude = [\n            \"**/* *\",\n            \".tmp_git_root/**/*\",\n            \"BUILD\",\n            \"BUILD.bazel\",\n            \"WORKSPACE\",\n            \"WORKSPACE.bazel\",\n        ],\n    ),\n    crate_features = [\n        \"arithmetic\",\n        \"digest\",\n        \"ff\",\n        \"group\",\n        \"hazmat\",\n        \"sec1\",\n    ],\n    crate_root = \"src/lib.rs\",\n    edition = \"2021\",\n    rustc_env_files = [\n        \":cargo_toml_env_vars\",\n    ],\n    rustc_flags = [\n        \"--cap-lints=allow\",\n    ],\n    srcs = glob(\n        allow_empty = True,\n        include = [\"**/*.rs\"],\n    ),\n    tags = [\n        \"cargo-bazel\",\n        \"crate-name=elliptic-curve\",\n        \"manual\",\n        \"noclippy\",\n        \"norustfmt\",\n    ],\n    target_compatible_with = select({\n        \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n        \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n        \"@rules_rust//rust/platform:riscv32imc-unknown-none-elf\": [],\n        \"@rules_rust//rust/platform:thumbv7em-none-eabi\": [],\n        \"@rules_rust//rust/platform:x86_64-apple-darwin\": [],\n        \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n        \"//conditions:default\": [\"@platforms//:incompatible\"],\n    }),\n    version = \"0.13.8\",\n)\n"
             }
           },
+          "rust_crates__embedded-crc-macros-1.0.0": {
+            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
+            "attributes": {
+              "patch_args": [],
+              "patch_tool": "",
+              "patches": [],
+              "remote_patch_strip": 1,
+              "sha256": "4f1c75747a43b086df1a87fb2a889590bc0725e0abf54bba6d0c4bf7bd9e762c",
+              "type": "tar.gz",
+              "urls": [
+                "https://static.crates.io/crates/embedded-crc-macros/1.0.0/download"
+              ],
+              "strip_prefix": "embedded-crc-macros-1.0.0",
+              "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n#     bazel mod show_repo 'openprot'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n    name = \"cargo_toml_env_vars\",\n    src = \"Cargo.toml\",\n)\n\nrust_library(\n    name = \"embedded_crc_macros\",\n    compile_data = glob(\n        allow_empty = True,\n        include = [\"**\"],\n        exclude = [\n            \"**/* *\",\n            \".tmp_git_root/**/*\",\n            \"BUILD\",\n            \"BUILD.bazel\",\n            \"WORKSPACE\",\n            \"WORKSPACE.bazel\",\n        ],\n    ),\n    crate_root = \"src/lib.rs\",\n    edition = \"2018\",\n    rustc_env_files = [\n        \":cargo_toml_env_vars\",\n    ],\n    rustc_flags = [\n        \"--cap-lints=allow\",\n    ],\n    srcs = glob(\n        allow_empty = True,\n        include = [\"**/*.rs\"],\n    ),\n    tags = [\n        \"cargo-bazel\",\n        \"crate-name=embedded-crc-macros\",\n        \"manual\",\n        \"noclippy\",\n        \"norustfmt\",\n    ],\n    target_compatible_with = select({\n        \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n        \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n        \"@rules_rust//rust/platform:riscv32imc-unknown-none-elf\": [],\n        \"@rules_rust//rust/platform:thumbv7em-none-eabi\": [],\n        \"@rules_rust//rust/platform:x86_64-apple-darwin\": [],\n        \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n        \"//conditions:default\": [\"@platforms//:incompatible\"],\n    }),\n    version = \"1.0.0\",\n)\n"
+            }
+          },
           "rust_crates__embedded-hal-0.2.7": {
             "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
             "attributes": {
@@ -3521,6 +3595,22 @@
               "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n#     bazel mod show_repo 'openprot'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n    name = \"cargo_toml_env_vars\",\n    src = \"Cargo.toml\",\n)\n\nrust_library(\n    name = \"embedded_io\",\n    compile_data = glob(\n        allow_empty = True,\n        include = [\"**\"],\n        exclude = [\n            \"**/* *\",\n            \".tmp_git_root/**/*\",\n            \"BUILD\",\n            \"BUILD.bazel\",\n            \"WORKSPACE\",\n            \"WORKSPACE.bazel\",\n        ],\n    ),\n    crate_root = \"src/lib.rs\",\n    edition = \"2021\",\n    rustc_env_files = [\n        \":cargo_toml_env_vars\",\n    ],\n    rustc_flags = [\n        \"--cap-lints=allow\",\n    ],\n    srcs = glob(\n        allow_empty = True,\n        include = [\"**/*.rs\"],\n    ),\n    tags = [\n        \"cargo-bazel\",\n        \"crate-name=embedded-io\",\n        \"manual\",\n        \"noclippy\",\n        \"norustfmt\",\n    ],\n    target_compatible_with = select({\n        \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n        \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n        \"@rules_rust//rust/platform:riscv32imc-unknown-none-elf\": [],\n        \"@rules_rust//rust/platform:thumbv7em-none-eabi\": [],\n        \"@rules_rust//rust/platform:x86_64-apple-darwin\": [],\n        \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n        \"//conditions:default\": [\"@platforms//:incompatible\"],\n    }),\n    version = \"0.6.1\",\n)\n"
             }
           },
+          "rust_crates__embedded-io-async-0.6.1": {
+            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
+            "attributes": {
+              "patch_args": [],
+              "patch_tool": "",
+              "patches": [],
+              "remote_patch_strip": 1,
+              "sha256": "3ff09972d4073aa8c299395be75161d582e7629cd663171d62af73c8d50dba3f",
+              "type": "tar.gz",
+              "urls": [
+                "https://static.crates.io/crates/embedded-io-async/0.6.1/download"
+              ],
+              "strip_prefix": "embedded-io-async-0.6.1",
+              "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n#     bazel mod show_repo 'openprot'\n###############################################################################\n\nload(\n    \"@rules_rust//cargo:defs.bzl\",\n    \"cargo_build_script\",\n    \"cargo_toml_env_vars\",\n)\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n    name = \"cargo_toml_env_vars\",\n    src = \"Cargo.toml\",\n)\n\nrust_library(\n    name = \"embedded_io_async\",\n    deps = [\n        \"@rust_crates__embedded-io-0.6.1//:embedded_io\",\n        \"@rust_crates__embedded-io-async-0.6.1//:build_script_build\",\n    ],\n    compile_data = glob(\n        allow_empty = True,\n        include = [\"**\"],\n        exclude = [\n            \"**/* *\",\n            \".tmp_git_root/**/*\",\n            \"BUILD\",\n            \"BUILD.bazel\",\n            \"WORKSPACE\",\n            \"WORKSPACE.bazel\",\n        ],\n    ),\n    crate_root = \"src/lib.rs\",\n    edition = \"2021\",\n    rustc_env_files = [\n        \":cargo_toml_env_vars\",\n    ],\n    rustc_flags = [\n        \"--cap-lints=allow\",\n    ],\n    srcs = glob(\n        allow_empty = True,\n        include = [\"**/*.rs\"],\n    ),\n    tags = [\n        \"cargo-bazel\",\n        \"crate-name=embedded-io-async\",\n        \"manual\",\n        \"noclippy\",\n        \"norustfmt\",\n    ],\n    target_compatible_with = select({\n        \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n        \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n        \"@rules_rust//rust/platform:riscv32imc-unknown-none-elf\": [],\n        \"@rules_rust//rust/platform:thumbv7em-none-eabi\": [],\n        \"@rules_rust//rust/platform:x86_64-apple-darwin\": [],\n        \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n        \"//conditions:default\": [\"@platforms//:incompatible\"],\n    }),\n    version = \"0.6.1\",\n)\n\ncargo_build_script(\n    name = \"_bs\",\n    compile_data = glob(\n        allow_empty = True,\n        include = [\"**\"],\n        exclude = [\n            \"**/* *\",\n            \"**/*.rs\",\n            \".tmp_git_root/**/*\",\n            \"BUILD\",\n            \"BUILD.bazel\",\n            \"WORKSPACE\",\n            \"WORKSPACE.bazel\",\n        ],\n    ),\n    crate_name = \"build_script_build\",\n    crate_root = \"build.rs\",\n    data = glob(\n        allow_empty = True,\n        include = [\"**\"],\n        exclude = [\n            \"**/* *\",\n            \".tmp_git_root/**/*\",\n            \"BUILD\",\n            \"BUILD.bazel\",\n            \"WORKSPACE\",\n            \"WORKSPACE.bazel\",\n        ],\n    ),\n    edition = \"2021\",\n    pkg_name = \"embedded-io-async\",\n    rustc_env_files = [\n        \":cargo_toml_env_vars\",\n    ],\n    rustc_flags = [\n        \"--cap-lints=allow\",\n    ],\n    srcs = glob(\n        allow_empty = True,\n        include = [\"**/*.rs\"],\n    ),\n    tags = [\n        \"cargo-bazel\",\n        \"crate-name=embedded-io-async\",\n        \"manual\",\n        \"noclippy\",\n        \"norustfmt\",\n    ],\n    version = \"0.6.1\",\n    visibility = [\"//visibility:private\"],\n)\n\nalias(\n    name = \"build_script_build\",\n    actual = \":_bs\",\n    tags = [\"manual\"],\n)\n"
+            }
+          },
           "rust_crates__equivalent-1.0.2": {
             "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
             "attributes": {
@@ -3841,6 +3931,22 @@
               "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n#     bazel mod show_repo 'openprot'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n    name = \"cargo_toml_env_vars\",\n    src = \"Cargo.toml\",\n)\n\nrust_library(\n    name = \"hashbrown\",\n    compile_data = glob(\n        allow_empty = True,\n        include = [\"**\"],\n        exclude = [\n            \"**/* *\",\n            \".tmp_git_root/**/*\",\n            \"BUILD\",\n            \"BUILD.bazel\",\n            \"WORKSPACE\",\n            \"WORKSPACE.bazel\",\n        ],\n    ),\n    crate_root = \"src/lib.rs\",\n    edition = \"2024\",\n    rustc_env_files = [\n        \":cargo_toml_env_vars\",\n    ],\n    rustc_flags = [\n        \"--cap-lints=allow\",\n    ],\n    srcs = glob(\n        allow_empty = True,\n        include = [\"**/*.rs\"],\n    ),\n    tags = [\n        \"cargo-bazel\",\n        \"crate-name=hashbrown\",\n        \"manual\",\n        \"noclippy\",\n        \"norustfmt\",\n    ],\n    target_compatible_with = select({\n        \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n        \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n        \"@rules_rust//rust/platform:riscv32imc-unknown-none-elf\": [],\n        \"@rules_rust//rust/platform:thumbv7em-none-eabi\": [],\n        \"@rules_rust//rust/platform:x86_64-apple-darwin\": [],\n        \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n        \"//conditions:default\": [\"@platforms//:incompatible\"],\n    }),\n    version = \"0.17.0\",\n)\n"
             }
           },
+          "rust_crates__heapless-0.8.0": {
+            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
+            "attributes": {
+              "patch_args": [],
+              "patch_tool": "",
+              "patches": [],
+              "remote_patch_strip": 1,
+              "sha256": "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad",
+              "type": "tar.gz",
+              "urls": [
+                "https://static.crates.io/crates/heapless/0.8.0/download"
+              ],
+              "strip_prefix": "heapless-0.8.0",
+              "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n#     bazel mod show_repo 'openprot'\n###############################################################################\n\nload(\n    \"@rules_rust//cargo:defs.bzl\",\n    \"cargo_build_script\",\n    \"cargo_toml_env_vars\",\n)\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n    name = \"cargo_toml_env_vars\",\n    src = \"Cargo.toml\",\n)\n\nrust_library(\n    name = \"heapless\",\n    deps = [\n        \"@rust_crates__hash32-0.3.1//:hash32\",\n        \"@rust_crates__heapless-0.8.0//:build_script_build\",\n        \"@rust_crates__stable_deref_trait-1.2.1//:stable_deref_trait\",\n    ],\n    compile_data = glob(\n        allow_empty = True,\n        include = [\"**\"],\n        exclude = [\n            \"**/* *\",\n            \".tmp_git_root/**/*\",\n            \"BUILD\",\n            \"BUILD.bazel\",\n            \"WORKSPACE\",\n            \"WORKSPACE.bazel\",\n        ],\n    ),\n    crate_root = \"src/lib.rs\",\n    edition = \"2021\",\n    rustc_env_files = [\n        \":cargo_toml_env_vars\",\n    ],\n    rustc_flags = [\n        \"--cap-lints=allow\",\n    ],\n    srcs = glob(\n        allow_empty = True,\n        include = [\"**/*.rs\"],\n    ),\n    tags = [\n        \"cargo-bazel\",\n        \"crate-name=heapless\",\n        \"manual\",\n        \"noclippy\",\n        \"norustfmt\",\n    ],\n    target_compatible_with = select({\n        \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n        \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n        \"@rules_rust//rust/platform:riscv32imc-unknown-none-elf\": [],\n        \"@rules_rust//rust/platform:thumbv7em-none-eabi\": [],\n        \"@rules_rust//rust/platform:x86_64-apple-darwin\": [],\n        \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n        \"//conditions:default\": [\"@platforms//:incompatible\"],\n    }),\n    version = \"0.8.0\",\n)\n\ncargo_build_script(\n    name = \"_bs\",\n    compile_data = glob(\n        allow_empty = True,\n        include = [\"**\"],\n        exclude = [\n            \"**/* *\",\n            \"**/*.rs\",\n            \".tmp_git_root/**/*\",\n            \"BUILD\",\n            \"BUILD.bazel\",\n            \"WORKSPACE\",\n            \"WORKSPACE.bazel\",\n        ],\n    ),\n    crate_name = \"build_script_build\",\n    crate_root = \"build.rs\",\n    data = glob(\n        allow_empty = True,\n        include = [\"**\"],\n        exclude = [\n            \"**/* *\",\n            \".tmp_git_root/**/*\",\n            \"BUILD\",\n            \"BUILD.bazel\",\n            \"WORKSPACE\",\n            \"WORKSPACE.bazel\",\n        ],\n    ),\n    edition = \"2021\",\n    pkg_name = \"heapless\",\n    rustc_env_files = [\n        \":cargo_toml_env_vars\",\n    ],\n    rustc_flags = [\n        \"--cap-lints=allow\",\n    ],\n    srcs = glob(\n        allow_empty = True,\n        include = [\"**/*.rs\"],\n    ),\n    tags = [\n        \"cargo-bazel\",\n        \"crate-name=heapless\",\n        \"manual\",\n        \"noclippy\",\n        \"norustfmt\",\n    ],\n    version = \"0.8.0\",\n    visibility = [\"//visibility:private\"],\n)\n\nalias(\n    name = \"build_script_build\",\n    actual = \":_bs\",\n    tags = [\"manual\"],\n)\n"
+            }
+          },
           "rust_crates__heapless-0.9.2": {
             "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
             "attributes": {
@@ -4065,6 +4171,48 @@
               "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n#     bazel mod show_repo 'openprot'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n    name = \"cargo_toml_env_vars\",\n    src = \"Cargo.toml\",\n)\n\nrust_library(\n    name = \"log\",\n    compile_data = glob(\n        allow_empty = True,\n        include = [\"**\"],\n        exclude = [\n            \"**/* *\",\n            \".tmp_git_root/**/*\",\n            \"BUILD\",\n            \"BUILD.bazel\",\n            \"WORKSPACE\",\n            \"WORKSPACE.bazel\",\n        ],\n    ),\n    crate_root = \"src/lib.rs\",\n    edition = \"2021\",\n    rustc_env_files = [\n        \":cargo_toml_env_vars\",\n    ],\n    rustc_flags = [\n        \"--cap-lints=allow\",\n    ],\n    srcs = glob(\n        allow_empty = True,\n        include = [\"**/*.rs\"],\n    ),\n    tags = [\n        \"cargo-bazel\",\n        \"crate-name=log\",\n        \"manual\",\n        \"noclippy\",\n        \"norustfmt\",\n    ],\n    target_compatible_with = select({\n        \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n        \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n        \"@rules_rust//rust/platform:riscv32imc-unknown-none-elf\": [],\n        \"@rules_rust//rust/platform:thumbv7em-none-eabi\": [],\n        \"@rules_rust//rust/platform:x86_64-apple-darwin\": [],\n        \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n        \"//conditions:default\": [\"@platforms//:incompatible\"],\n    }),\n    version = \"0.4.29\",\n)\n"
             }
           },
+          "rust_crates__mctp-0.2.0": {
+            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:git.bzl%git_repository",
+            "attributes": {
+              "init_submodules": true,
+              "patch_args": [],
+              "patch_tool": "",
+              "patches": [],
+              "shallow_since": "",
+              "remote": "https://github.com/OpenPRoT/mctp-rs.git",
+              "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n#     bazel mod show_repo 'openprot'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n    name = \"cargo_toml_env_vars\",\n    src = \"Cargo.toml\",\n)\n\nrust_library(\n    name = \"mctp\",\n    compile_data = glob(\n        allow_empty = True,\n        include = [\"**\"],\n        exclude = [\n            \"**/* *\",\n            \".tmp_git_root/**/*\",\n            \"BUILD\",\n            \"BUILD.bazel\",\n            \"WORKSPACE\",\n            \"WORKSPACE.bazel\",\n        ],\n    ),\n    crate_root = \"src/lib.rs\",\n    edition = \"2021\",\n    rustc_env_files = [\n        \":cargo_toml_env_vars\",\n    ],\n    rustc_flags = [\n        \"--cap-lints=allow\",\n    ],\n    srcs = glob(\n        allow_empty = True,\n        include = [\"**/*.rs\"],\n    ),\n    tags = [\n        \"cargo-bazel\",\n        \"crate-name=mctp\",\n        \"manual\",\n        \"noclippy\",\n        \"norustfmt\",\n    ],\n    target_compatible_with = select({\n        \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n        \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n        \"@rules_rust//rust/platform:riscv32imc-unknown-none-elf\": [],\n        \"@rules_rust//rust/platform:thumbv7em-none-eabi\": [],\n        \"@rules_rust//rust/platform:x86_64-apple-darwin\": [],\n        \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n        \"//conditions:default\": [\"@platforms//:incompatible\"],\n    }),\n    version = \"0.2.0\",\n)\n",
+              "strip_prefix": "mctp",
+              "commit": "fafe92f6fcadf6e57683b91757fad9933ddd223d"
+            }
+          },
+          "rust_crates__mctp-estack-0.1.0": {
+            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:git.bzl%git_repository",
+            "attributes": {
+              "init_submodules": true,
+              "patch_args": [],
+              "patch_tool": "",
+              "patches": [],
+              "shallow_since": "",
+              "remote": "https://github.com/OpenPRoT/mctp-rs.git",
+              "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n#     bazel mod show_repo 'openprot'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n    name = \"cargo_toml_env_vars\",\n    src = \"Cargo.toml\",\n)\n\nrust_library(\n    name = \"mctp_estack\",\n    deps = [\n        \"@rust_crates__crc-3.4.0//:crc\",\n        \"@rust_crates__embedded-io-0.6.1//:embedded_io\",\n        \"@rust_crates__embedded-io-async-0.6.1//:embedded_io_async\",\n        \"@rust_crates__heapless-0.8.0//:heapless\",\n        \"@rust_crates__log-0.4.29//:log\",\n        \"@rust_crates__mctp-0.2.0//:mctp\",\n        \"@rust_crates__smbus-pec-1.0.1//:smbus_pec\",\n        \"@rust_crates__uuid-1.23.1//:uuid\",\n    ],\n    compile_data = glob(\n        allow_empty = True,\n        include = [\"**\"],\n        exclude = [\n            \"**/* *\",\n            \".tmp_git_root/**/*\",\n            \"BUILD\",\n            \"BUILD.bazel\",\n            \"WORKSPACE\",\n            \"WORKSPACE.bazel\",\n        ],\n    ),\n    crate_features = [\n        \"log\",\n    ],\n    crate_root = \"src/lib.rs\",\n    edition = \"2021\",\n    rustc_env_files = [\n        \":cargo_toml_env_vars\",\n    ],\n    rustc_flags = [\n        \"--cap-lints=allow\",\n    ],\n    srcs = glob(\n        allow_empty = True,\n        include = [\"**/*.rs\"],\n    ),\n    tags = [\n        \"cargo-bazel\",\n        \"crate-name=mctp-estack\",\n        \"manual\",\n        \"noclippy\",\n        \"norustfmt\",\n    ],\n    target_compatible_with = select({\n        \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n        \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n        \"@rules_rust//rust/platform:riscv32imc-unknown-none-elf\": [],\n        \"@rules_rust//rust/platform:thumbv7em-none-eabi\": [],\n        \"@rules_rust//rust/platform:x86_64-apple-darwin\": [],\n        \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n        \"//conditions:default\": [\"@platforms//:incompatible\"],\n    }),\n    version = \"0.1.0\",\n)\n",
+              "strip_prefix": "mctp-estack",
+              "commit": "fafe92f6fcadf6e57683b91757fad9933ddd223d"
+            }
+          },
+          "rust_crates__mctp-lib-0.1.0": {
+            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:git.bzl%git_repository",
+            "attributes": {
+              "init_submodules": true,
+              "patch_args": [],
+              "patch_tool": "",
+              "patches": [],
+              "shallow_since": "",
+              "remote": "https://github.com/9elements/mctp-lib.git",
+              "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n#     bazel mod show_repo 'openprot'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n    name = \"cargo_toml_env_vars\",\n    src = \"Cargo.toml\",\n)\n\nrust_library(\n    name = \"mctp_lib\",\n    deps = [\n        \"@rust_crates__mctp-0.2.0//:mctp\",\n        \"@rust_crates__mctp-estack-0.1.0//:mctp_estack\",\n    ],\n    compile_data = glob(\n        allow_empty = True,\n        include = [\"**\"],\n        exclude = [\n            \"**/* *\",\n            \".tmp_git_root/**/*\",\n            \"BUILD\",\n            \"BUILD.bazel\",\n            \"WORKSPACE\",\n            \"WORKSPACE.bazel\",\n        ],\n    ),\n    crate_root = \"src/lib.rs\",\n    edition = \"2024\",\n    rustc_env_files = [\n        \":cargo_toml_env_vars\",\n    ],\n    rustc_flags = [\n        \"--cap-lints=allow\",\n    ],\n    srcs = glob(\n        allow_empty = True,\n        include = [\"**/*.rs\"],\n    ),\n    tags = [\n        \"cargo-bazel\",\n        \"crate-name=mctp-lib\",\n        \"manual\",\n        \"noclippy\",\n        \"norustfmt\",\n    ],\n    target_compatible_with = select({\n        \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n        \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n        \"@rules_rust//rust/platform:riscv32imc-unknown-none-elf\": [],\n        \"@rules_rust//rust/platform:thumbv7em-none-eabi\": [],\n        \"@rules_rust//rust/platform:x86_64-apple-darwin\": [],\n        \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n        \"//conditions:default\": [\"@platforms//:incompatible\"],\n    }),\n    version = \"0.1.0\",\n)\n",
+              "strip_prefix": "",
+              "commit": "9c53adaeb7ae544cbeab4654530a50d158e33fe5"
+            }
+          },
           "rust_crates__memchr-2.8.0": {
             "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
             "attributes": {
@@ -5041,6 +5189,22 @@
               "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n#     bazel mod show_repo 'openprot'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n    name = \"cargo_toml_env_vars\",\n    src = \"Cargo.toml\",\n)\n\nrust_library(\n    name = \"smallvec\",\n    compile_data = glob(\n        allow_empty = True,\n        include = [\"**\"],\n        exclude = [\n            \"**/* *\",\n            \".tmp_git_root/**/*\",\n            \"BUILD\",\n            \"BUILD.bazel\",\n            \"WORKSPACE\",\n            \"WORKSPACE.bazel\",\n        ],\n    ),\n    crate_root = \"src/lib.rs\",\n    edition = \"2018\",\n    rustc_env_files = [\n        \":cargo_toml_env_vars\",\n    ],\n    rustc_flags = [\n        \"--cap-lints=allow\",\n    ],\n    srcs = glob(\n        allow_empty = True,\n        include = [\"**/*.rs\"],\n    ),\n    tags = [\n        \"cargo-bazel\",\n        \"crate-name=smallvec\",\n        \"manual\",\n        \"noclippy\",\n        \"norustfmt\",\n    ],\n    target_compatible_with = select({\n        \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n        \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n        \"@rules_rust//rust/platform:riscv32imc-unknown-none-elf\": [],\n        \"@rules_rust//rust/platform:thumbv7em-none-eabi\": [],\n        \"@rules_rust//rust/platform:x86_64-apple-darwin\": [],\n        \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n        \"//conditions:default\": [\"@platforms//:incompatible\"],\n    }),\n    version = \"1.15.1\",\n)\n"
             }
           },
+          "rust_crates__smbus-pec-1.0.1": {
+            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
+            "attributes": {
+              "patch_args": [],
+              "patch_tool": "",
+              "patches": [],
+              "remote_patch_strip": 1,
+              "sha256": "ca0763a680cd5d72b28f7bfc8a054c117d8841380a6ad4f72f05bd2a34217d3e",
+              "type": "tar.gz",
+              "urls": [
+                "https://static.crates.io/crates/smbus-pec/1.0.1/download"
+              ],
+              "strip_prefix": "smbus-pec-1.0.1",
+              "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n#     bazel mod show_repo 'openprot'\n###############################################################################\n\nload(\n    \"@rules_rust//cargo:defs.bzl\",\n    \"cargo_build_script\",\n    \"cargo_toml_env_vars\",\n)\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n    name = \"cargo_toml_env_vars\",\n    src = \"Cargo.toml\",\n)\n\nrust_library(\n    name = \"smbus_pec\",\n    deps = [\n        \"@rust_crates__embedded-crc-macros-1.0.0//:embedded_crc_macros\",\n        \"@rust_crates__smbus-pec-1.0.1//:build_script_build\",\n    ],\n    compile_data = glob(\n        allow_empty = True,\n        include = [\"**\"],\n        exclude = [\n            \"**/* *\",\n            \".tmp_git_root/**/*\",\n            \"BUILD\",\n            \"BUILD.bazel\",\n            \"WORKSPACE\",\n            \"WORKSPACE.bazel\",\n        ],\n    ),\n    crate_features = [\n        \"lookup-table\",\n    ],\n    crate_root = \"src/lib.rs\",\n    edition = \"2018\",\n    rustc_env_files = [\n        \":cargo_toml_env_vars\",\n    ],\n    rustc_flags = [\n        \"--cap-lints=allow\",\n    ],\n    srcs = glob(\n        allow_empty = True,\n        include = [\"**/*.rs\"],\n    ),\n    tags = [\n        \"cargo-bazel\",\n        \"crate-name=smbus-pec\",\n        \"manual\",\n        \"noclippy\",\n        \"norustfmt\",\n    ],\n    target_compatible_with = select({\n        \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n        \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n        \"@rules_rust//rust/platform:riscv32imc-unknown-none-elf\": [],\n        \"@rules_rust//rust/platform:thumbv7em-none-eabi\": [],\n        \"@rules_rust//rust/platform:x86_64-apple-darwin\": [],\n        \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n        \"//conditions:default\": [\"@platforms//:incompatible\"],\n    }),\n    version = \"1.0.1\",\n)\n\ncargo_build_script(\n    name = \"_bs\",\n    compile_data = glob(\n        allow_empty = True,\n        include = [\"**\"],\n        exclude = [\n            \"**/* *\",\n            \"**/*.rs\",\n            \".tmp_git_root/**/*\",\n            \"BUILD\",\n            \"BUILD.bazel\",\n            \"WORKSPACE\",\n            \"WORKSPACE.bazel\",\n        ],\n    ),\n    crate_features = [\n        \"lookup-table\",\n    ],\n    crate_name = \"build_script_build\",\n    crate_root = \"build.rs\",\n    data = glob(\n        allow_empty = True,\n        include = [\"**\"],\n        exclude = [\n            \"**/* *\",\n            \".tmp_git_root/**/*\",\n            \"BUILD\",\n            \"BUILD.bazel\",\n            \"WORKSPACE\",\n            \"WORKSPACE.bazel\",\n        ],\n    ),\n    deps = [\n        \"@rust_crates__embedded-crc-macros-1.0.0//:embedded_crc_macros\",\n    ],\n    edition = \"2018\",\n    pkg_name = \"smbus-pec\",\n    rustc_env_files = [\n        \":cargo_toml_env_vars\",\n    ],\n    rustc_flags = [\n        \"--cap-lints=allow\",\n    ],\n    srcs = glob(\n        allow_empty = True,\n        include = [\"**/*.rs\"],\n    ),\n    tags = [\n        \"cargo-bazel\",\n        \"crate-name=smbus-pec\",\n        \"manual\",\n        \"noclippy\",\n        \"norustfmt\",\n    ],\n    version = \"1.0.1\",\n    visibility = [\"//visibility:private\"],\n)\n\nalias(\n    name = \"build_script_build\",\n    actual = \":_bs\",\n    tags = [\"manual\"],\n)\n"
+            }
+          },
           "rust_crates__smlang-0.8.0": {
             "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
             "attributes": {
@@ -5391,6 +5555,22 @@
               "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n#     bazel mod show_repo 'openprot'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n    name = \"cargo_toml_env_vars\",\n    src = \"Cargo.toml\",\n)\n\nrust_library(\n    name = \"utf8parse\",\n    compile_data = glob(\n        allow_empty = True,\n        include = [\"**\"],\n        exclude = [\n            \"**/* *\",\n            \".tmp_git_root/**/*\",\n            \"BUILD\",\n            \"BUILD.bazel\",\n            \"WORKSPACE\",\n            \"WORKSPACE.bazel\",\n        ],\n    ),\n    crate_features = [\n        \"default\",\n    ],\n    crate_root = \"src/lib.rs\",\n    edition = \"2018\",\n    rustc_env_files = [\n        \":cargo_toml_env_vars\",\n    ],\n    rustc_flags = [\n        \"--cap-lints=allow\",\n    ],\n    srcs = glob(\n        allow_empty = True,\n        include = [\"**/*.rs\"],\n    ),\n    tags = [\n        \"cargo-bazel\",\n        \"crate-name=utf8parse\",\n        \"manual\",\n        \"noclippy\",\n        \"norustfmt\",\n    ],\n    target_compatible_with = select({\n        \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n        \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n        \"@rules_rust//rust/platform:riscv32imc-unknown-none-elf\": [],\n        \"@rules_rust//rust/platform:thumbv7em-none-eabi\": [],\n        \"@rules_rust//rust/platform:x86_64-apple-darwin\": [],\n        \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n        \"//conditions:default\": [\"@platforms//:incompatible\"],\n    }),\n    version = \"0.2.2\",\n)\n"
             }
           },
+          "rust_crates__uuid-1.23.1": {
+            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
+            "attributes": {
+              "patch_args": [],
+              "patch_tool": "",
+              "patches": [],
+              "remote_patch_strip": 1,
+              "sha256": "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76",
+              "type": "tar.gz",
+              "urls": [
+                "https://static.crates.io/crates/uuid/1.23.1/download"
+              ],
+              "strip_prefix": "uuid-1.23.1",
+              "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n#     bazel mod show_repo 'openprot'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n    name = \"cargo_toml_env_vars\",\n    src = \"Cargo.toml\",\n)\n\nrust_library(\n    name = \"uuid\",\n    compile_data = glob(\n        allow_empty = True,\n        include = [\"**\"],\n        exclude = [\n            \"**/* *\",\n            \".tmp_git_root/**/*\",\n            \"BUILD\",\n            \"BUILD.bazel\",\n            \"WORKSPACE\",\n            \"WORKSPACE.bazel\",\n        ],\n    ),\n    crate_root = \"src/lib.rs\",\n    edition = \"2021\",\n    rustc_env_files = [\n        \":cargo_toml_env_vars\",\n    ],\n    rustc_flags = [\n        \"--cap-lints=allow\",\n    ],\n    srcs = glob(\n        allow_empty = True,\n        include = [\"**/*.rs\"],\n    ),\n    tags = [\n        \"cargo-bazel\",\n        \"crate-name=uuid\",\n        \"manual\",\n        \"noclippy\",\n        \"norustfmt\",\n    ],\n    target_compatible_with = select({\n        \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n        \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n        \"@rules_rust//rust/platform:riscv32imc-unknown-none-elf\": [],\n        \"@rules_rust//rust/platform:thumbv7em-none-eabi\": [],\n        \"@rules_rust//rust/platform:x86_64-apple-darwin\": [],\n        \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n        \"//conditions:default\": [\"@platforms//:incompatible\"],\n    }),\n    version = \"1.23.1\",\n)\n"
+            }
+          },
           "rust_crates__vcell-0.1.3": {
             "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
             "attributes": {
diff --git a/drivers/usart/README.md b/drivers/usart/README.md
new file mode 100644
index 0000000..0e00521
--- /dev/null
+++ b/drivers/usart/README.md
@@ -0,0 +1,180 @@
+# USART Driver Model
+
+This document describes the architecture of the layered USART userspace driver
+under `drivers/usart/` and how it integrates with platform bindings in a
+target-agnostic way.
+
+## 1. Layer Overview
+
+```
+┌──────────────────────────────────────────────────────────┐
+│  Application / Client                                    │
+│  UsartClient  (drivers/usart/client)                     │
+│  channel_transact(request) → response                    │
+└────────────────────────┬─────────────────────────────────┘
+                         │  Pigweed IPC channel
+                         ▼
+┌──────────────────────────────────────────────────────────┐
+│  Server Binary                                           │
+│    (target/<plat>/tests/usart:usart_server_bin)          │
+│  rust_app — wires codegen handles + backend + runtime    │
+│  wait_group_add ×N  →  runtime::run                      │
+└────────────────────────┬─────────────────────────────────┘
+                         │
+                         ▼
+┌──────────────────────────────────────────────────────────┐
+│  Server Library  (drivers/usart/server:usart_server)     │
+│  runtime::run — object_wait → channel_read               │
+│               → dispatch_request → channel_respond       │
+│  dispatch_request — pure protocol→backend translator     │
+└────────────────────────┬─────────────────────────────────┘
+                         │  UsartBackend trait
+                         ▼
+┌──────────────────────────────────────────────────────────┐
+│  Platform Backend  (target/<plat>/backend/usart)         │
+│  PlatformUsartBackend : UsartBackend                     │
+│  pub type Backend = PlatformUsartBackend                 │
+└────────────────────────┬─────────────────────────────────┘
+                         │  embedded-io / embedded-hal-nb
+                         ▼
+┌──────────────────────────────────────────────────────────┐
+│  PAC-level UART driver  (platform peripherals crate)     │
+│  Usart — raw MMIO handle over vendor PAC RegisterBlock   │
+└──────────────────────────────────────────────────────────┘
+```
+
+## 2. Crate Map
+
+| Bazel target | Crate | Role |
+|---|---|---|
+| `//drivers/usart/api` | `usart_api` | Wire protocol + backend trait contract |
+| `//drivers/usart/server:usart_server` | `usart_server` | Dispatch + runtime loop library (platform-binding-agnostic within Pigweed kernel targets) |
+| `//drivers/usart/client:usart_client` | `usart_client` | Client facade library (platform-binding-agnostic within Pigweed kernel targets) |
+| `//target/ast10x0/tests/usart:usart_server_bin` | binary | Reference platform smoke-test server binding |
+| `//target/ast10x0/tests/usart:usart_client_app` | binary | Reference platform smoke-test client binding |
+| `//target/ast10x0/backend/usart` | `usart_backend` | Reference platform backend implementation |
+| `//target/ast10x0/peripherals` | `<plat>_peripherals` | Reference platform raw MMIO UART driver |
+
+## 3. Wire Protocol  (`usart_api::protocol`)
+
+Operations are identified by a 1-byte opcode in `UsartRequestHeader` (8 bytes, `repr(C, packed)`):
+
+| Op | Value | Args |
+|---|---|---|
+| `Configure` | 0x01 | baud_rate split across `arg0`/`arg1` |
+| `Write` | 0x02 | payload bytes |
+| `Read` | 0x03 | `arg0` = max bytes to read |
+| `GetLineStatus` | 0x04 | — |
+| `EnableInterrupts` | 0x05 | `arg0` = `IrqMask` bits |
+| `DisableInterrupts` | 0x06 | `arg0` = `IrqMask` bits |
+
+`UsartResponseHeader` (4 bytes) carries a `UsartError` status code plus a payload length.
+All structures implement `zerocopy` traits for zero-copy serialization.
+
+## 4. Backend Trait  (`usart_api::backend`)
+
+```rust
+pub trait UsartBackend {
+    fn configure(&mut self, config: UsartConfig) -> Result<(), BackendError>;
+    fn write(&mut self, data: &[u8]) -> Result<usize, BackendError>;
+    fn read(&mut self, out: &mut [u8]) -> Result<usize, BackendError>;
+    fn line_status(&self) -> Result<LineStatus, BackendError>;
+    fn enable_interrupts(&mut self, mask: IrqMask) -> Result<(), BackendError>;
+    fn disable_interrupts(&mut self, mask: IrqMask) -> Result<(), BackendError>;
+}
+```
+
+`BackendError` maps 1-to-1 onto `UsartError` via `From<BackendError> for UsartError`.
+
+## 5. Per-Target Binding
+
+`drivers/usart/` ships only platform-agnostic libraries (`usart_api`,
+`usart_server`, `usart_client`). Every binary that names a specific
+`system.json5` lives next to that config under the platform's tree. In this
+repository, the concrete example binding is `target/ast10x0/tests/usart/`,
+which packages a self-contained smoke-test image.
+
+```python
+# target/ast10x0/tests/usart/BUILD.bazel  (excerpt)
+rust_app(
+    name = "usart_server_bin",
+    srcs = ["server_main.rs"],
+    codegen_crate_name = "app_usart_server",
+    system_config = ":system_config",
+    deps = [
+        "//drivers/usart/server:usart_server",
+        "//target/ast10x0/backend/usart:usart_backend_ast10x0",
+        "@pigweed//pw_kernel/userspace",
+    ],
+)
+
+rust_app(
+    name = "usart_client_app",
+    srcs = ["client_main.rs"],
+    codegen_crate_name = "app_usart_client",
+    system_config = ":system_config",
+    deps = [
+        "//drivers/usart/client:usart_client",
+        "@pigweed//pw_kernel/userspace",
+        "@pigweed//pw_log/rust:pw_log",
+    ],
+)
+```
+
+Each backend target uses `crate_name = "usart_backend"` and exports
+`pub type Backend: UsartBackend`, so `server_main.rs` can stay generic across
+backends:
+
+```rust
+use usart_backend::Backend;
+let mut backend = Backend::new();
+```
+
+## 6. Server Library (`usart_server`)
+
+Two pieces, both platform-binding-agnostic within Pigweed kernel targets:
+
+- `dispatch_request<B: UsartBackend>(backend, request, response) -> usize` —
+  pure protocol→backend translator. No IPC, no OS dependency.
+- `runtime::run<B>(backend, wg, irq, irq_signals) -> !` — the dispatch loop.
+  Topology-agnostic: the binary registers each channel with its handle as
+  `user_data`, and the loop derives the channel handle from
+  `wait_return.user_data` directly.
+
+The binary owns every `wait_group_add` call because only the codegen-aware
+binding knows which handles exist.
+
+## 7. System Image
+
+The smoke-test image bundles server + client + kernel:
+
+```
+//target/ast10x0/tests/usart:usart  (system_image)
+  kernel = :target
+  apps   = [:usart_server_bin, :usart_client_app]
+  system_config = :system_config   (target/ast10x0/tests/usart/system.json5)
+```
+
+Companion test rules:
+
+- `:usart_test` — boots the image under QEMU and reports the semihosting
+  exit code (run with `bazel test --config=virt_ast10x0`).
+- `:no_panics_test` — host-side panic-path detector over the linked binary.
+
+`system.json5` defines each app's memory layout, the `usart` IPC channel
+handle, the UART5 MMIO mapping (`0x7e784000`), and the server thread stack
+size. The handle constant `handle::USART` is generated by
+`rust_app`/`app_usart_server` codegen from the object named `usart`.
+
+## 8. Extension Points
+
+- **New platform**: create `target/<plat>/tests/usart/` (or a non-test
+  binding directory if it's a real deployment) with a `system.json5`,
+  `server_main.rs`, and a `rust_app` that depends on
+  `//drivers/usart/server:usart_server` plus the platform's backend.
+  Nothing under `drivers/usart/` changes.
+- **New operation**: add opcode to `UsartOp`, extend `UsartBackend`, add arm
+  to `dispatch_request`, update protocol doc.
+- **New backend**: implement `UsartBackend` in a `rust_library` with
+  `crate_name = "usart_backend"` exporting `pub type Backend`.
+
diff --git a/drivers/usart/api/BUILD.bazel b/drivers/usart/api/BUILD.bazel
new file mode 100644
index 0000000..740c2c2
--- /dev/null
+++ b/drivers/usart/api/BUILD.bazel
@@ -0,0 +1,18 @@
+# Licensed under the Apache-2.0 license
+
+load("@rules_rust//rust:defs.bzl", "rust_library")
+
+rust_library(
+    name = "usart_api",
+    srcs = [
+        "src/backend.rs",
+        "src/lib.rs",
+        "src/protocol.rs",
+    ],
+    edition = "2024",
+    visibility = ["//visibility:public"],
+    deps = [
+        "@rust_crates//:bitflags",
+        "@rust_crates//:zerocopy",
+    ],
+)
diff --git a/drivers/usart/api/Cargo.toml b/drivers/usart/api/Cargo.toml
new file mode 100644
index 0000000..e41bc52
--- /dev/null
+++ b/drivers/usart/api/Cargo.toml
@@ -0,0 +1,8 @@
+[package]
+name = "usart-api"
+version = "0.1.0"
+edition = "2024"
+
+[dependencies]
+bitflags = { version = "2", default-features = false }
+zerocopy = { version = "0.8", default-features = false, features = ["derive"] }
diff --git a/drivers/usart/api/src/backend.rs b/drivers/usart/api/src/backend.rs
new file mode 100644
index 0000000..a33e359
--- /dev/null
+++ b/drivers/usart/api/src/backend.rs
@@ -0,0 +1,75 @@
+// Licensed under the Apache-2.0 license
+
+use bitflags::bitflags;
+
+use crate::protocol::UsartError;
+
+bitflags! {
+    /// Hardware-agnostic interrupt sources exposed by the USART backend.
+    ///
+    /// The bit layout is the contract between the wire protocol
+    /// (`UsartOp::EnableInterrupts` / `DisableInterrupts` carry these in
+    /// `arg0`), the dispatcher, and every backend implementation.
+    #[derive(Clone, Copy, Debug, PartialEq, Eq)]
+    pub struct IrqMask: u16 {
+        const RX_DATA_AVAILABLE = 0x0001;
+        const TX_IDLE           = 0x0002;
+    }
+}
+
+#[derive(Clone, Copy, Debug, PartialEq, Eq)]
+pub enum BackendError {
+    InvalidOperation,
+    InvalidConfiguration,
+    BufferTooSmall,
+    Busy,
+    Timeout,
+    /// No data in the RX FIFO right now; retry after RX interrupt.
+    WouldBlock,
+    InternalError,
+}
+
+impl From<BackendError> for UsartError {
+    fn from(value: BackendError) -> Self {
+        match value {
+            BackendError::InvalidOperation => UsartError::InvalidOperation,
+            BackendError::InvalidConfiguration => UsartError::InvalidConfiguration,
+            BackendError::BufferTooSmall => UsartError::BufferTooSmall,
+            BackendError::Busy => UsartError::Busy,
+            BackendError::Timeout => UsartError::Timeout,
+            BackendError::WouldBlock => UsartError::WouldBlock,
+            BackendError::InternalError => UsartError::InternalError,
+        }
+    }
+}
+
+#[derive(Clone, Copy, Debug, PartialEq, Eq)]
+pub enum Parity {
+    None,
+    Even,
+    Odd,
+}
+
+#[derive(Clone, Copy, Debug, PartialEq, Eq)]
+pub struct UsartConfig {
+    pub baud_rate: u32,
+    pub parity: Parity,
+    pub stop_bits: u8,
+}
+
+#[derive(Clone, Copy, Debug, PartialEq, Eq)]
+pub struct LineStatus(pub u8);
+
+pub trait UsartBackend {
+    fn configure(&mut self, config: UsartConfig) -> Result<(), BackendError>;
+    fn write(&mut self, data: &[u8]) -> Result<usize, BackendError>;
+    fn read(&mut self, out: &mut [u8]) -> Result<usize, BackendError>;
+    /// Non-blocking read.  Drains whatever bytes are available in the RX FIFO
+    /// right now and returns them.  Returns `Err(BackendError::WouldBlock)` if
+    /// the FIFO is empty; the caller is responsible for enabling the
+    /// `RX_DATA_AVAILABLE` interrupt and retrying when it fires.
+    fn try_read(&mut self, out: &mut [u8]) -> Result<usize, BackendError>;
+    fn line_status(&self) -> Result<LineStatus, BackendError>;
+    fn enable_interrupts(&mut self, mask: IrqMask) -> Result<(), BackendError>;
+    fn disable_interrupts(&mut self, mask: IrqMask) -> Result<(), BackendError>;
+}
diff --git a/drivers/usart/api/src/lib.rs b/drivers/usart/api/src/lib.rs
new file mode 100644
index 0000000..df40fe1
--- /dev/null
+++ b/drivers/usart/api/src/lib.rs
@@ -0,0 +1,8 @@
+// Licensed under the Apache-2.0 license
+
+#![no_std]
+
+pub mod backend;
+pub mod protocol;
+
+pub use protocol::*;
diff --git a/drivers/usart/api/src/protocol.rs b/drivers/usart/api/src/protocol.rs
new file mode 100644
index 0000000..d7ddb71
--- /dev/null
+++ b/drivers/usart/api/src/protocol.rs
@@ -0,0 +1,147 @@
+// Licensed under the Apache-2.0 license
+
+use zerocopy::{FromBytes, Immutable, IntoBytes, KnownLayout};
+
+pub const MAX_PAYLOAD_SIZE: usize = 256;
+
+#[repr(u8)]
+#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+pub enum UsartOp {
+    Configure = 0x01,
+    Write = 0x02,
+    Read = 0x03,
+    GetLineStatus = 0x04,
+    EnableInterrupts = 0x05,
+    DisableInterrupts = 0x06,
+    /// Non-blocking read attempt.  Returns data immediately if available;
+    /// the server queues the request and completes it when the RX IRQ fires
+    /// if no data is ready yet.
+    TryRead = 0x07,
+}
+
+impl TryFrom<u8> for UsartOp {
+    type Error = UsartError;
+
+    fn try_from(value: u8) -> Result<Self, Self::Error> {
+        match value {
+            0x01 => Ok(Self::Configure),
+            0x02 => Ok(Self::Write),
+            0x03 => Ok(Self::Read),
+            0x04 => Ok(Self::GetLineStatus),
+            0x05 => Ok(Self::EnableInterrupts),
+            0x06 => Ok(Self::DisableInterrupts),
+            0x07 => Ok(Self::TryRead),
+            _ => Err(UsartError::InvalidOperation),
+        }
+    }
+}
+
+#[repr(u8)]
+#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+pub enum UsartError {
+    Success = 0x00,
+    InvalidOperation = 0x01,
+    InvalidConfiguration = 0x02,
+    BufferTooSmall = 0x03,
+    Busy = 0x04,
+    Timeout = 0x05,
+    /// No data available right now; the server has queued the request and will
+    /// complete it when data arrives via RX interrupt.
+    WouldBlock = 0x06,
+    InternalError = 0xFF,
+}
+
+impl From<u8> for UsartError {
+    fn from(value: u8) -> Self {
+        match value {
+            0x00 => Self::Success,
+            0x01 => Self::InvalidOperation,
+            0x02 => Self::InvalidConfiguration,
+            0x03 => Self::BufferTooSmall,
+            0x04 => Self::Busy,
+            0x05 => Self::Timeout,
+            0x06 => Self::WouldBlock,
+            _ => Self::InternalError,
+        }
+    }
+}
+
+#[repr(C, packed)]
+#[derive(Debug, Clone, Copy, FromBytes, IntoBytes, Immutable, KnownLayout)]
+pub struct UsartRequestHeader {
+    pub op_code: u8,
+    pub flags: u8,
+    pub arg0: u16,
+    pub arg1: u16,
+    pub payload_len: u16,
+}
+
+impl UsartRequestHeader {
+    pub const SIZE: usize = 8;
+
+    pub fn new(op: UsartOp, arg0: u16, arg1: u16, payload_len: u16) -> Self {
+        Self {
+            op_code: op as u8,
+            flags: 0,
+            arg0: arg0.to_le(),
+            arg1: arg1.to_le(),
+            payload_len: payload_len.to_le(),
+        }
+    }
+
+    pub fn operation(&self) -> Result<UsartOp, UsartError> {
+        UsartOp::try_from(self.op_code)
+    }
+
+    pub fn payload_length(&self) -> usize {
+        u16::from_le(self.payload_len) as usize
+    }
+
+    pub fn arg0_value(&self) -> u16 {
+        u16::from_le(self.arg0)
+    }
+
+    pub fn arg1_value(&self) -> u16 {
+        u16::from_le(self.arg1)
+    }
+}
+
+#[repr(C, packed)]
+#[derive(Debug, Clone, Copy, FromBytes, IntoBytes, Immutable, KnownLayout)]
+pub struct UsartResponseHeader {
+    pub status: u8,
+    pub reserved: u8,
+    pub payload_len: u16,
+}
+
+impl UsartResponseHeader {
+    pub const SIZE: usize = 4;
+
+    pub fn success(payload_len: u16) -> Self {
+        Self {
+            status: UsartError::Success as u8,
+            reserved: 0,
+            payload_len: payload_len.to_le(),
+        }
+    }
+
+    pub fn error(error: UsartError) -> Self {
+        Self {
+            status: error as u8,
+            reserved: 0,
+            payload_len: 0,
+        }
+    }
+
+    pub fn is_success(&self) -> bool {
+        self.status == UsartError::Success as u8
+    }
+
+    pub fn error_code(&self) -> UsartError {
+        UsartError::from(self.status)
+    }
+
+    pub fn payload_length(&self) -> usize {
+        u16::from_le(self.payload_len) as usize
+    }
+}
diff --git a/drivers/usart/client/BUILD.bazel b/drivers/usart/client/BUILD.bazel
new file mode 100644
index 0000000..4b22336
--- /dev/null
+++ b/drivers/usart/client/BUILD.bazel
@@ -0,0 +1,21 @@
+# Licensed under the Apache-2.0 license
+
+load("@rules_rust//rust:defs.bzl", "rust_library")
+
+rust_library(
+    name = "usart_client",
+    srcs = ["src/lib.rs"],
+    edition = "2024",
+    tags = ["kernel"],
+    target_compatible_with = select({
+        "@pigweed//pw_kernel/userspace:userspace_build_enabled": [],
+        "//conditions:default": ["@platforms//:incompatible"],
+    }),
+    visibility = ["//visibility:public"],
+    deps = [
+        "//drivers/usart/api:usart_api",
+        "@pigweed//pw_kernel/userspace",
+        "@pigweed//pw_status/rust:pw_status",
+        "@rust_crates//:zerocopy",
+    ],
+)
diff --git a/drivers/usart/client/Cargo.toml b/drivers/usart/client/Cargo.toml
new file mode 100644
index 0000000..f14e134
--- /dev/null
+++ b/drivers/usart/client/Cargo.toml
@@ -0,0 +1,7 @@
+[package]
+name = "usart-client"
+version = "0.1.0"
+edition = "2024"
+
+[dependencies]
+usart-api = { path = "../api" }
diff --git a/drivers/usart/client/src/lib.rs b/drivers/usart/client/src/lib.rs
new file mode 100644
index 0000000..bc3716b
--- /dev/null
+++ b/drivers/usart/client/src/lib.rs
@@ -0,0 +1,191 @@
+// Licensed under the Apache-2.0 license
+
+#![no_std]
+
+use usart_api::{
+    UsartError, UsartOp, UsartRequestHeader, UsartResponseHeader, MAX_PAYLOAD_SIZE,
+};
+use userspace::syscall;
+use userspace::time::Instant;
+
+const MAX_BUF_SIZE: usize = 512;
+
+#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+pub enum ClientError {
+    IpcError(pw_status::Error),
+    ServerError(UsartError),
+    InvalidResponse,
+    BufferTooSmall,
+}
+
+impl From<pw_status::Error> for ClientError {
+    fn from(e: pw_status::Error) -> Self {
+        Self::IpcError(e)
+    }
+}
+
+pub struct UsartClient {
+    handle: u32,
+}
+
+impl UsartClient {
+    pub const fn new(handle: u32) -> Self {
+        Self { handle }
+    }
+
+    pub fn configure(&self, baud_rate: u32) -> Result<(), ClientError> {
+        let arg0 = (baud_rate & 0xffff) as u16;
+        let arg1 = (baud_rate >> 16) as u16;
+        self.call_no_payload(UsartOp::Configure, arg0, arg1)
+    }
+
+    pub fn write(&self, data: &[u8]) -> Result<usize, ClientError> {
+        if data.len() > MAX_PAYLOAD_SIZE {
+            return Err(ClientError::BufferTooSmall);
+        }
+
+        let mut req = [0u8; MAX_BUF_SIZE];
+        let mut resp = [0u8; MAX_BUF_SIZE];
+
+        let hdr = UsartRequestHeader::new(UsartOp::Write, 0, 0, data.len() as u16);
+        req[..UsartRequestHeader::SIZE].copy_from_slice(zerocopy::IntoBytes::as_bytes(&hdr));
+        req[UsartRequestHeader::SIZE..UsartRequestHeader::SIZE + data.len()].copy_from_slice(data);
+
+        let resp_len = syscall::channel_transact(
+            self.handle,
+            &req[..UsartRequestHeader::SIZE + data.len()],
+            &mut resp,
+            Instant::MAX,
+        )?;
+
+        parse_no_payload_response(&resp[..resp_len])?;
+        Ok(data.len())
+    }
+
+    pub fn read(&self, out: &mut [u8]) -> Result<usize, ClientError> {
+        self.read_with_timeout(out, Instant::MAX)
+    }
+
+    pub fn read_with_timeout(
+        &self,
+        out: &mut [u8],
+        deadline: Instant,
+    ) -> Result<usize, ClientError> {
+        if out.len() > MAX_PAYLOAD_SIZE {
+            return Err(ClientError::BufferTooSmall);
+        }
+
+        let mut req = [0u8; MAX_BUF_SIZE];
+        let mut resp = [0u8; MAX_BUF_SIZE];
+
+        let hdr = UsartRequestHeader::new(UsartOp::Read, out.len() as u16, 0, 0);
+        req[..UsartRequestHeader::SIZE].copy_from_slice(zerocopy::IntoBytes::as_bytes(&hdr));
+
+        let resp_len = syscall::channel_transact(
+            self.handle,
+            &req[..UsartRequestHeader::SIZE],
+            &mut resp,
+            deadline,
+        )?;
+
+        parse_payload_response(&resp[..resp_len], out)
+    }
+
+    /// Non-blocking read.
+    ///
+    /// Sends a `TryRead` request to the server.  If bytes are available in the
+    /// hardware FIFO right now the server responds immediately and this call
+    /// returns `Ok(n)`.  If the FIFO is empty the server arms the RX interrupt
+    /// and blocks the IPC transaction on the server side; this call returns
+    /// once the interrupt fires and data has been copied into `out`.
+    ///
+    /// From the caller's perspective this function always returns with data
+    /// (or an error); the "non-blocking" nature means the **server** is freed
+    /// to handle other events while waiting rather than spinning in a hardware
+    /// read loop.
+    pub fn try_read(&self, out: &mut [u8]) -> Result<usize, ClientError> {
+        self.try_read_with_timeout(out, Instant::MAX)
+    }
+
+    pub fn try_read_with_timeout(
+        &self,
+        out: &mut [u8],
+        deadline: Instant,
+    ) -> Result<usize, ClientError> {
+        if out.len() > MAX_PAYLOAD_SIZE {
+            return Err(ClientError::BufferTooSmall);
+        }
+
+        let mut req = [0u8; MAX_BUF_SIZE];
+        let mut resp = [0u8; MAX_BUF_SIZE];
+
+        let hdr = UsartRequestHeader::new(UsartOp::TryRead, out.len() as u16, 0, 0);
+        req[..UsartRequestHeader::SIZE].copy_from_slice(zerocopy::IntoBytes::as_bytes(&hdr));
+
+        let resp_len = syscall::channel_transact(
+            self.handle,
+            &req[..UsartRequestHeader::SIZE],
+            &mut resp,
+            deadline,
+        )?;
+
+        parse_payload_response(&resp[..resp_len], out)
+    }
+
+    fn call_no_payload(&self, op: UsartOp, arg0: u16, arg1: u16) -> Result<(), ClientError> {
+        let mut req = [0u8; MAX_BUF_SIZE];
+        let mut resp = [0u8; MAX_BUF_SIZE];
+
+        let hdr = UsartRequestHeader::new(op, arg0, arg1, 0);
+        req[..UsartRequestHeader::SIZE].copy_from_slice(zerocopy::IntoBytes::as_bytes(&hdr));
+
+        let resp_len = syscall::channel_transact(
+            self.handle,
+            &req[..UsartRequestHeader::SIZE],
+            &mut resp,
+            Instant::MAX,
+        )?;
+
+        parse_no_payload_response(&resp[..resp_len])
+    }
+}
+
+fn parse_no_payload_response(resp: &[u8]) -> Result<(), ClientError> {
+    if resp.len() < UsartResponseHeader::SIZE {
+        return Err(ClientError::InvalidResponse);
+    }
+
+    let hdr_bytes = &resp[..UsartResponseHeader::SIZE];
+    let Some(hdr) = zerocopy::Ref::<_, UsartResponseHeader>::from_bytes(hdr_bytes).ok() else {
+        return Err(ClientError::InvalidResponse);
+    };
+
+    if hdr.is_success() {
+        Ok(())
+    } else {
+        Err(ClientError::ServerError(hdr.error_code()))
+    }
+}
+
+fn parse_payload_response(resp: &[u8], out: &mut [u8]) -> Result<usize, ClientError> {
+    if resp.len() < UsartResponseHeader::SIZE {
+        return Err(ClientError::InvalidResponse);
+    }
+
+    let hdr_bytes = &resp[..UsartResponseHeader::SIZE];
+    let Some(hdr) = zerocopy::Ref::<_, UsartResponseHeader>::from_bytes(hdr_bytes).ok() else {
+        return Err(ClientError::InvalidResponse);
+    };
+
+    if !hdr.is_success() {
+        return Err(ClientError::ServerError(hdr.error_code()));
+    }
+
+    let len = hdr.payload_length();
+    if len > out.len() || resp.len() < UsartResponseHeader::SIZE + len {
+        return Err(ClientError::InvalidResponse);
+    }
+
+    out[..len].copy_from_slice(&resp[UsartResponseHeader::SIZE..UsartResponseHeader::SIZE + len]);
+    Ok(len)
+}
diff --git a/drivers/usart/server/BUILD.bazel b/drivers/usart/server/BUILD.bazel
new file mode 100644
index 0000000..5473c6a
--- /dev/null
+++ b/drivers/usart/server/BUILD.bazel
@@ -0,0 +1,23 @@
+# Licensed under the Apache-2.0 license
+
+load("@rules_rust//rust:defs.bzl", "rust_library")
+
+rust_library(
+    name = "usart_server",
+    srcs = [
+        "src/lib.rs",
+        "src/runtime.rs",
+    ],
+    edition = "2024",
+    tags = ["kernel"],
+    target_compatible_with = select({
+        "@pigweed//pw_kernel/userspace:userspace_build_enabled": [],
+        "//conditions:default": ["@platforms//:incompatible"],
+    }),
+    visibility = ["//visibility:public"],
+    deps = [
+        "//drivers/usart/api:usart_api",
+        "@pigweed//pw_kernel/userspace",
+        "@rust_crates//:zerocopy",
+    ],
+)
diff --git a/drivers/usart/server/Cargo.toml b/drivers/usart/server/Cargo.toml
new file mode 100644
index 0000000..9c6cfd0
--- /dev/null
+++ b/drivers/usart/server/Cargo.toml
@@ -0,0 +1,7 @@
+[package]
+name = "usart-server"
+version = "0.1.0"
+edition = "2024"
+
+[dependencies]
+usart-api = { path = "../api" }
diff --git a/drivers/usart/server/src/lib.rs b/drivers/usart/server/src/lib.rs
new file mode 100644
index 0000000..f997d4d
--- /dev/null
+++ b/drivers/usart/server/src/lib.rs
@@ -0,0 +1,148 @@
+// Licensed under the Apache-2.0 license
+
+#![no_std]
+
+pub mod runtime;
+
+use usart_api::backend::{BackendError, IrqMask, UsartBackend};
+use usart_api::{UsartError, UsartOp, UsartRequestHeader, UsartResponseHeader};
+
+pub const MAX_REQUEST_SIZE: usize = 512;
+pub const MAX_RESPONSE_SIZE: usize = 512;
+
+/// Outcome of a single dispatch call.
+pub enum DispatchOutcome {
+    /// Response is ready; caller should send `response[..len]` immediately.
+    Respond(usize),
+    /// No data was available yet.  The runtime stored the pending request and
+    /// will respond once the RX interrupt fires.  Caller must NOT call
+    /// `channel_respond` for this request.
+    Queued,
+}
+
+pub fn dispatch_request<B: UsartBackend>(
+    backend: &mut B,
+    pending: &mut runtime::PendingRead,
+    client_channel: u32,
+    request: &[u8],
+    response: &mut [u8],
+) -> DispatchOutcome {
+    if request.len() < UsartRequestHeader::SIZE {
+        return DispatchOutcome::Respond(encode_error(response, UsartError::InvalidOperation));
+    }
+
+    let hdr_bytes = &request[..UsartRequestHeader::SIZE];
+    let Some(hdr) = zerocopy::Ref::<_, UsartRequestHeader>::from_bytes(hdr_bytes).ok() else {
+        return DispatchOutcome::Respond(encode_error(response, UsartError::InvalidOperation));
+    };
+
+    let op = match hdr.operation() {
+        Ok(op) => op,
+        Err(e) => return DispatchOutcome::Respond(encode_error(response, e)),
+    };
+
+    let payload_len = hdr.payload_length();
+    if request.len() < UsartRequestHeader::SIZE + payload_len {
+        return DispatchOutcome::Respond(encode_error(response, UsartError::InvalidOperation));
+    }
+    let payload = &request[UsartRequestHeader::SIZE..UsartRequestHeader::SIZE + payload_len];
+
+    match op {
+        UsartOp::Configure => {
+            let baud = ((hdr.arg1_value() as u32) << 16) | (hdr.arg0_value() as u32);
+            let cfg = usart_api::backend::UsartConfig {
+                baud_rate: baud,
+                parity: usart_api::backend::Parity::None,
+                stop_bits: 1,
+            };
+            match backend.configure(cfg) {
+                Ok(()) => DispatchOutcome::Respond(encode_success(response, &[])),
+                Err(e) => DispatchOutcome::Respond(encode_error(response, e.into())),
+            }
+        }
+        UsartOp::Write => match backend.write(payload) {
+            Ok(_) => DispatchOutcome::Respond(encode_success(response, &[])),
+            Err(e) => DispatchOutcome::Respond(encode_error(response, e.into())),
+        },
+        UsartOp::Read => {
+            let req_len = hdr.arg0_value() as usize;
+            let payload_offset = UsartResponseHeader::SIZE;
+            let payload_capacity = response.len().saturating_sub(payload_offset);
+            let read_buf_len = core::cmp::min(req_len, payload_capacity);
+
+            match backend.read(&mut response[payload_offset..payload_offset + read_buf_len]) {
+                Ok(n) => {
+                    let hdr = UsartResponseHeader::success(n as u16);
+                    response[..UsartResponseHeader::SIZE]
+                        .copy_from_slice(zerocopy::IntoBytes::as_bytes(&hdr));
+                    DispatchOutcome::Respond(UsartResponseHeader::SIZE + n)
+                }
+                Err(e) => DispatchOutcome::Respond(encode_error(response, e.into())),
+            }
+        }
+        UsartOp::TryRead => {
+            let req_len = hdr.arg0_value() as usize;
+            let payload_offset = UsartResponseHeader::SIZE;
+            let payload_capacity = response.len().saturating_sub(payload_offset);
+            let read_buf_len = core::cmp::min(req_len, payload_capacity);
+
+            // Attempt immediate non-blocking drain of the RX FIFO.
+            match backend.try_read(&mut response[payload_offset..payload_offset + read_buf_len]) {
+                Ok(n) => {
+                    // Data available right now — respond immediately.
+                    let hdr = UsartResponseHeader::success(n as u16);
+                    response[..UsartResponseHeader::SIZE]
+                        .copy_from_slice(zerocopy::IntoBytes::as_bytes(&hdr));
+                    DispatchOutcome::Respond(UsartResponseHeader::SIZE + n)
+                }
+                Err(BackendError::WouldBlock) => {
+                    // No data yet.  Attempt to park the request; fail with
+                    // Timeout if another TryRead is already pending — UART RX
+                    // is a single stream and cannot serve two concurrent
+                    // consumers.
+                    if !pending.park(client_channel, req_len) {
+                        return DispatchOutcome::Respond(encode_error(
+                            response,
+                            UsartError::Timeout,
+                        ));
+                    }
+                    let _ = backend.enable_interrupts(IrqMask::RX_DATA_AVAILABLE);
+                    DispatchOutcome::Queued
+                }
+                Err(e) => DispatchOutcome::Respond(encode_error(response, e.into())),
+            }
+        }
+        UsartOp::GetLineStatus => match backend.line_status() {
+            Ok(lsr) => DispatchOutcome::Respond(encode_success(response, &[lsr.0])),
+            Err(e) => DispatchOutcome::Respond(encode_error(response, e.into())),
+        },
+        UsartOp::EnableInterrupts => {
+            let mask = IrqMask::from_bits_truncate(hdr.arg0_value());
+            match backend.enable_interrupts(mask) {
+                Ok(()) => DispatchOutcome::Respond(encode_success(response, &[])),
+                Err(e) => DispatchOutcome::Respond(encode_error(response, e.into())),
+            }
+        }
+        UsartOp::DisableInterrupts => {
+            let mask = IrqMask::from_bits_truncate(hdr.arg0_value());
+            match backend.disable_interrupts(mask) {
+                Ok(()) => DispatchOutcome::Respond(encode_success(response, &[])),
+                Err(e) => DispatchOutcome::Respond(encode_error(response, e.into())),
+            }
+        }
+    }
+}
+
+fn encode_error(response: &mut [u8], error: UsartError) -> usize {
+    let hdr = UsartResponseHeader::error(error);
+    response[..UsartResponseHeader::SIZE].copy_from_slice(zerocopy::IntoBytes::as_bytes(&hdr));
+    UsartResponseHeader::SIZE
+}
+
+fn encode_success(response: &mut [u8], payload: &[u8]) -> usize {
+    let hdr = UsartResponseHeader::success(payload.len() as u16);
+    response[..UsartResponseHeader::SIZE].copy_from_slice(zerocopy::IntoBytes::as_bytes(&hdr));
+    response[UsartResponseHeader::SIZE..UsartResponseHeader::SIZE + payload.len()]
+        .copy_from_slice(payload);
+    UsartResponseHeader::SIZE + payload.len()
+}
diff --git a/drivers/usart/server/src/runtime.rs b/drivers/usart/server/src/runtime.rs
new file mode 100644
index 0000000..6af4e33
--- /dev/null
+++ b/drivers/usart/server/src/runtime.rs
@@ -0,0 +1,149 @@
+// Licensed under the Apache-2.0 license
+
+use usart_api::backend::{IrqMask, UsartBackend};
+use usart_api::{UsartResponseHeader};
+use userspace::syscall::{self, Signals};
+use userspace::time::Instant;
+
+use crate::{DispatchOutcome, MAX_REQUEST_SIZE, MAX_RESPONSE_SIZE, dispatch_request};
+
+/// Holds at most one in-flight `TryRead` request that is waiting for the RX
+/// interrupt to fire before it can be completed.
+pub struct PendingRead {
+    /// IPC channel handle of the waiting client, or `None` if idle.
+    channel: Option<u32>,
+    /// Max bytes the client asked for.
+    requested_size: usize,
+}
+
+impl PendingRead {
+    pub const fn new() -> Self {
+        Self {
+            channel: None,
+            requested_size: 0,
+        }
+    }
+
+    /// Park a `TryRead` request; the server will complete it on the next RX IRQ.
+    ///
+    /// Returns `false` if a read is already parked — UART RX is a single serial
+    /// stream and cannot be multiplexed between concurrent consumers.  The
+    /// caller should respond with `UsartError::Busy` in that case.
+    pub fn park(&mut self, channel: u32, requested_size: usize) -> bool {
+        if self.channel.is_some() {
+            return false;
+        }
+        self.channel = Some(channel);
+        self.requested_size = requested_size;
+        true
+    }
+
+    /// Take the pending request, leaving the slot empty.
+    pub fn take(&mut self) -> Option<(u32, usize)> {
+        self.channel.take().map(|ch| (ch, self.requested_size))
+    }
+
+    pub fn is_pending(&self) -> bool {
+        self.channel.is_some()
+    }
+}
+
+impl Default for PendingRead {
+    fn default() -> Self {
+        Self::new()
+    }
+}
+
+/// Run the USART server dispatch loop forever.
+///
+/// The caller is responsible for populating `wg` ahead of time. The
+/// convention this runtime relies on:
+///
+/// - For each IPC channel the binary serves, register it with its own
+///   handle as `user_data`:
+///   `wait_group_add(wg, ch, Signals::READABLE, ch as usize)`.
+/// - Register the IRQ with `irq_signals` and `irq` as its `user_data`:
+///   `wait_group_add(wg, irq, irq_signals, irq as usize)`.
+///
+/// The loop then routes wake-ups using `wait_return.user_data` directly:
+/// the IRQ branch matches on the IRQ handle, every other wake-up is
+/// treated as a channel and `user_data` is the channel handle to
+/// read/respond on. This keeps the runtime topology-agnostic — adding
+/// another client task is one more `wait_group_add` call in the binary.
+pub fn run<B: UsartBackend>(backend: &mut B, wg: u32, irq: u32, irq_signals: Signals) -> ! {
+    let mut request_buf = [0u8; MAX_REQUEST_SIZE];
+    let mut response_buf = [0u8; MAX_RESPONSE_SIZE];
+    let mut pending = PendingRead::new();
+
+    let wait_mask = Signals::READABLE | irq_signals;
+
+    loop {
+        let Ok(wait_return) = syscall::object_wait(wg, wait_mask, Instant::MAX) else {
+            continue;
+        };
+
+        if wait_return.user_data as u32 == irq
+            && wait_return.pending_signals.contains(irq_signals)
+        {
+            let acked = wait_return.pending_signals & irq_signals;
+            let _ = syscall::interrupt_ack(irq, acked);
+
+            // If a TryRead is parked, complete it now that data may be ready.
+            if let Some((client_channel, req_size)) = pending.take() {
+                let payload_offset = UsartResponseHeader::SIZE;
+                let payload_capacity = response_buf.len().saturating_sub(payload_offset);
+                let read_buf_len = core::cmp::min(req_size, payload_capacity);
+
+                // Disable the RX interrupt; it will be re-armed if the next
+                // try_read also finds no data (unlikely at this point).
+                let _ = backend.disable_interrupts(IrqMask::RX_DATA_AVAILABLE);
+
+                let resp_len = match backend.try_read(
+                    &mut response_buf[payload_offset..payload_offset + read_buf_len],
+                ) {
+                    Ok(n) => {
+                        let hdr = UsartResponseHeader::success(n as u16);
+                        response_buf[..UsartResponseHeader::SIZE]
+                            .copy_from_slice(zerocopy::IntoBytes::as_bytes(&hdr));
+                        UsartResponseHeader::SIZE + n
+                    }
+                    Err(e) => {
+                        // Still not ready (shouldn't happen after IRQ, but handle gracefully).
+                        // Re-arm and re-park with the original size.
+                        let _ = backend.enable_interrupts(IrqMask::RX_DATA_AVAILABLE);
+                        pending.park(client_channel, req_size);
+                        let _ = e; // suppress
+                        continue;
+                    }
+                };
+
+                let _ = syscall::channel_respond(client_channel, &response_buf[..resp_len]);
+            }
+            continue;
+        }
+
+        if !wait_return.pending_signals.contains(Signals::READABLE) {
+            continue;
+        }
+
+        let channel = wait_return.user_data as u32;
+        let Ok(req_len) = syscall::channel_read(channel, 0, &mut request_buf) else {
+            continue;
+        };
+
+        match dispatch_request(
+            backend,
+            &mut pending,
+            channel,
+            &request_buf[..req_len],
+            &mut response_buf,
+        ) {
+            DispatchOutcome::Respond(resp_len) => {
+                let _ = syscall::channel_respond(channel, &response_buf[..resp_len]);
+            }
+            DispatchOutcome::Queued => {
+                // Response will be sent from the IRQ completion path above.
+            }
+        }
+    }
+}
diff --git a/target/ast10x0/backend/usart/BUILD.bazel b/target/ast10x0/backend/usart/BUILD.bazel
new file mode 100644
index 0000000..3d905c7
--- /dev/null
+++ b/target/ast10x0/backend/usart/BUILD.bazel
@@ -0,0 +1,18 @@
+# Licensed under the Apache-2.0 license
+
+load("@rules_rust//rust:defs.bzl", "rust_library")
+load("//target/ast10x0:defs.bzl", "TARGET_COMPATIBLE_WITH")
+
+rust_library(
+    name = "usart_backend_ast10x0",
+    srcs = ["src/lib.rs"],
+    crate_name = "usart_backend",
+    edition = "2024",
+    target_compatible_with = TARGET_COMPATIBLE_WITH,
+    visibility = ["//visibility:public"],
+    deps = [
+        "//drivers/usart/api:usart_api",
+        "//target/ast10x0/peripherals",
+        "@rust_crates//:embedded-io",
+    ],
+)
diff --git a/target/ast10x0/backend/usart/Cargo.toml b/target/ast10x0/backend/usart/Cargo.toml
new file mode 100644
index 0000000..a221aa7
--- /dev/null
+++ b/target/ast10x0/backend/usart/Cargo.toml
@@ -0,0 +1,7 @@
+[package]
+name = "usart-backend-ast10x0"
+version = "0.1.0"
+edition = "2024"
+
+[dependencies]
+usart-api = { path = "../../../../drivers/usart/api" }
diff --git a/target/ast10x0/backend/usart/src/lib.rs b/target/ast10x0/backend/usart/src/lib.rs
new file mode 100644
index 0000000..5585a79
--- /dev/null
+++ b/target/ast10x0/backend/usart/src/lib.rs
@@ -0,0 +1,113 @@
+// Licensed under the Apache-2.0 license
+// SPDX-License-Identifier: Apache-2.0
+
+#![no_std]
+
+use ast10x0_peripherals::uart::Usart;
+use embedded_io::{Read, Write};
+use usart_api::backend::{BackendError, IrqMask, LineStatus, Parity, UsartBackend, UsartConfig};
+
+pub struct Ast10x0UsartBackend {
+    uart: Usart,
+}
+
+impl Ast10x0UsartBackend {
+    /// Create a backend using UART5 (the standard debug UART for AST10x0).
+    ///
+    /// # Safety
+    ///
+    /// This function is safe because it uses the well-known UART5 base address
+    /// and will only be called once per process by the server loop.
+    pub fn new() -> Self {
+        // SAFETY: 0x7e78_4000 is UART5 MMIO base on AST10x0 (IRQ 8); this
+        // process is the sole owner of the mapping per
+        // target/ast10x0/usart/system.json5.
+        let uart = unsafe { Usart::new(0x7e78_4000 as *const _) };
+
+        // The peripheral driver's `Usart::new` enables every IER source.
+        // Mask the ones the trait exposes so the server inherits a quiet
+        // device and only the interrupts a client explicitly enables fire.
+        uart.clear_rx_data_available_interrupt();
+        uart.clear_tx_idle_interrupt();
+
+        Self { uart }
+    }
+}
+
+impl Default for Ast10x0UsartBackend {
+    fn default() -> Self {
+        Self::new()
+    }
+}
+
+/// Stable type alias used by the server binary for compile-time backend selection.
+pub type Backend = Ast10x0UsartBackend;
+
+impl UsartBackend for Ast10x0UsartBackend {
+    fn configure(&mut self, config: UsartConfig) -> Result<(), BackendError> {
+        // Current low-level driver supports a fixed 8N1 configuration and limited rates.
+        // Keep behavior explicit until richer runtime configuration is plumbed through.
+        if config.stop_bits != 1 {
+            return Err(BackendError::InvalidConfiguration);
+        }
+        if config.parity != Parity::None {
+            return Err(BackendError::InvalidConfiguration);
+        }
+        match config.baud_rate {
+            9_600 | 19_200 | 1_500_000 => Ok(()),
+            _ => Err(BackendError::InvalidConfiguration),
+        }
+    }
+
+    fn write(&mut self, data: &[u8]) -> Result<usize, BackendError> {
+        // Use embedded_io::Write to send bytes
+        match self.uart.write_all(data) {
+            Ok(()) => Ok(data.len()),
+            Err(_) => Err(BackendError::Timeout),
+        }
+    }
+
+    fn read(&mut self, out: &mut [u8]) -> Result<usize, BackendError> {
+        match self.uart.read(out) {
+            Ok(n) => Ok(n),
+            Err(_) => Err(BackendError::InternalError),
+        }
+    }
+
+    fn try_read(&mut self, out: &mut [u8]) -> Result<usize, BackendError> {
+        if out.is_empty() {
+            return Ok(0);
+        }
+        let count = self.uart.try_read_available(out);
+        if count == 0 {
+            Err(BackendError::WouldBlock)
+        } else {
+            Ok(count)
+        }
+    }
+
+    fn line_status(&self) -> Result<LineStatus, BackendError> {
+        let status = self.uart.read_line_status();
+        Ok(LineStatus(status.bits()))
+    }
+
+    fn enable_interrupts(&mut self, mask: IrqMask) -> Result<(), BackendError> {
+        if mask.contains(IrqMask::RX_DATA_AVAILABLE) {
+            self.uart.set_rx_data_available_interrupt();
+        }
+        if mask.contains(IrqMask::TX_IDLE) {
+            self.uart.set_tx_idle_interrupt();
+        }
+        Ok(())
+    }
+
+    fn disable_interrupts(&mut self, mask: IrqMask) -> Result<(), BackendError> {
+        if mask.contains(IrqMask::RX_DATA_AVAILABLE) {
+            self.uart.clear_rx_data_available_interrupt();
+        }
+        if mask.contains(IrqMask::TX_IDLE) {
+            self.uart.clear_tx_idle_interrupt();
+        }
+        Ok(())
+    }
+}
diff --git a/target/ast10x0/peripherals/BUILD.bazel b/target/ast10x0/peripherals/BUILD.bazel
new file mode 100644
index 0000000..d534467
--- /dev/null
+++ b/target/ast10x0/peripherals/BUILD.bazel
@@ -0,0 +1,26 @@
+# Licensed under the Apache-2.0 license
+# SPDX-License-Identifier: Apache-2.0
+
+load("@rules_rust//rust:defs.bzl", "rust_library")
+load("//target/ast10x0:defs.bzl", "TARGET_COMPATIBLE_WITH")
+
+package(default_visibility = ["//visibility:public"])
+
+rust_library(
+    name = "peripherals",
+    srcs = [
+        "lib.rs",
+        "uart/mod.rs",
+    ],
+    crate_name = "ast10x0_peripherals",
+    crate_root = "lib.rs",
+    edition = "2024",
+    target_compatible_with = TARGET_COMPATIBLE_WITH,
+    deps = [
+        "@ast1060_pac",
+        "@rust_crates//:bitflags",
+        "@rust_crates//:embedded-hal-nb",
+        "@rust_crates//:embedded-io",
+        "@rust_crates//:nb",
+    ],
+)
diff --git a/target/ast10x0/peripherals/lib.rs b/target/ast10x0/peripherals/lib.rs
new file mode 100644
index 0000000..8f15bfa
--- /dev/null
+++ b/target/ast10x0/peripherals/lib.rs
@@ -0,0 +1,6 @@
+// Licensed under the Apache-2.0 license
+// SPDX-License-Identifier: Apache-2.0
+
+#![no_std]
+
+pub mod uart;
diff --git a/target/ast10x0/peripherals/uart/mod.rs b/target/ast10x0/peripherals/uart/mod.rs
new file mode 100644
index 0000000..ba5f96d
--- /dev/null
+++ b/target/ast10x0/peripherals/uart/mod.rs
@@ -0,0 +1,429 @@
+// Licensed under the Apache-2.0 license
+// SPDX-License-Identifier: Apache-2.0
+
+use ast1060_pac as device;
+use bitflags::bitflags;
+use core::cell::UnsafeCell;
+use core::marker::PhantomData;
+use embedded_hal_nb::serial as serial_nb;
+use embedded_io::{Read, Write};
+
+#[derive(Clone, Copy, Eq, PartialEq, Debug)]
+pub enum Error {
+	Frame,
+	Parity,
+	Noise,
+	BufFull,
+}
+
+#[derive(Debug)]
+pub enum InterruptDecoding {
+	ModemStatusChange = 0,
+	TxEmpty = 1,
+	RxDataAvailable = 2,
+	LineStatusChange = 3,
+	CharacterTimeout = 6,
+	Unknown = -1,
+}
+
+impl TryFrom<u8> for InterruptDecoding {
+	type Error = ();
+
+	fn try_from(value: u8) -> Result<Self, Self::Error> {
+		match value & 0x07 {
+			0 => Ok(InterruptDecoding::ModemStatusChange),
+			1 => Ok(InterruptDecoding::TxEmpty),
+			2 => Ok(InterruptDecoding::RxDataAvailable),
+			3 => Ok(InterruptDecoding::LineStatusChange),
+			6 => Ok(InterruptDecoding::CharacterTimeout),
+			_ => Err(()),
+		}
+	}
+}
+
+/// Receiver FIFO Interrupt trigger level
+#[derive(Debug)]
+#[repr(u8)]
+pub enum FifoTriggerLevel {
+	// 1 byte trigger level
+	OneByte = 0b00,
+	// 4 byte trigger level
+	FourByte = 0b01,
+	// 8 byte trigger level
+	EightByte = 0b10,
+	// 14 byte trigger level
+	FourteenByte = 0b11,
+}
+
+bitflags! {
+	#[derive(Debug)]
+	pub struct LineStatus: u8 {
+		/// here is at least one parity error, framing error, or break indication in the FIFO.
+		///
+		/// This bit is only active when FIFOs are enabled.
+		/// This bit is cleared when the `UART_LSR` is read.
+		const ErrorInReceiverFifo = 0x80;
+		/// Transmitter empty
+		///
+		/// When FIFO enabled, the Transmitter Shift Register and FIFO are both empty.
+		/// When FIFO disabled, the Transmitter Shift Register and UART_THR are both empty.
+		const TransmitterEmpty = 0x40;
+		/// Transmitter Holding Register Empty
+		///
+		/// This bit is set whenever data is transferred from UART_THR
+		/// or TX FIFO to the transmitter shift register
+		/// and no new data has been written to the UART THR or TX FIFO.
+		/// This also causes a THRE Interrupt to occur, if THRE Interrupt is enabled
+		const TransmitterHoldingRegisterEmpty = 0x20;
+		/// Break interrupt
+		///
+		/// The serial input is held in a logic `0` state for longer
+		/// than the sum of start time + data bits + parity + stop bits.
+		/// A break condition on serial input causes one and only one character,
+		/// consisting of all zeros, to be received by the UART
+		const BreakInterrupt = 0x10;
+		/// Framing error
+		///
+		/// A received character did not have a valid stop bit.
+		const FramingError = 0x08;
+		/// Parity error
+		///
+		/// Receive parity error while parity enable was set.
+		const ParityError = 0x04;
+		/// Overrun error
+		///
+		/// Character was received while the receiver or FIFO was full.
+		const OverrunError = 0x02;
+		/// Data ready
+		///
+		/// The receiver contains at least one character.
+		const DataReady = 0x01;
+	}
+}
+pub struct Usart {
+	usart: *const device::uart::RegisterBlock,
+	_not_sync: PhantomData<UnsafeCell<()>>, // makes Usart !Sync
+}
+
+impl embedded_io::ErrorType for Usart {
+	type Error = Error;
+}
+
+impl embedded_io::Error for Error {
+	fn kind(&self) -> embedded_io::ErrorKind {
+		embedded_io::ErrorKind::Other
+	}
+}
+
+impl serial_nb::Error for Error {
+	fn kind(&self) -> serial_nb::ErrorKind {
+		match self {
+			Error::Frame => serial_nb::ErrorKind::FrameFormat,
+			Error::Parity => serial_nb::ErrorKind::Parity,
+			Error::Noise => serial_nb::ErrorKind::Noise,
+			Error::BufFull => serial_nb::ErrorKind::Overrun,
+		}
+	}
+}
+
+impl serial_nb::ErrorType for Usart {
+	type Error = Error;
+}
+
+impl Write for Usart {
+	fn flush(&mut self) -> Result<(), Error> {
+		while !self.is_tx_idle() {}
+		Ok(())
+	}
+
+	fn write(&mut self, buf: &[u8]) -> Result<usize, Error> {
+		for (n, byte) in buf.iter().enumerate() {
+			if !self.is_tx_full() {
+				// This is unsafe because we can transmit 7, 8 or 9 bits but the
+				// interface can't know what it's been configured for.
+				self.regs()
+					.uartthr()
+					.write(|w| unsafe { w.bits(*byte as u32) });
+			} else {
+				if n == 0 {
+					// spec demands to block until atleast one byte has been written
+					continue;
+				}
+				return Ok(n);
+			}
+		}
+		Ok(buf.len())
+	}
+}
+
+impl Read for Usart {
+	fn read(&mut self, out: &mut [u8]) -> Result<usize, Self::Error> {
+		if out.is_empty() {
+			return Ok(0);
+		}
+
+		let mut count = 0;
+		// Block until at least one byte is available, then drain what is immediately readable.
+		while count == 0 {
+			match self.try_read_byte() {
+				Ok(byte) => {
+					out[count] = byte;
+					count += 1;
+				}
+				Err(nb::Error::WouldBlock) => continue,
+				Err(nb::Error::Other(e)) => return Err(e),
+			}
+		}
+
+		while count < out.len() {
+			match self.try_read_byte() {
+				Ok(byte) => {
+					out[count] = byte;
+					count += 1;
+				}
+				Err(nb::Error::WouldBlock) => break,
+				Err(nb::Error::Other(e)) => return Err(e),
+			}
+		}
+
+		Ok(count)
+	}
+}
+
+impl serial_nb::Write<u8> for Usart {
+	fn write(&mut self, word: u8) -> nb::Result<(), Self::Error> {
+		if !self.is_tx_full() {
+			// This is unsafe because we can transmit 7, 8 or 9 bits but the
+			// interface can't know what it's been configured for.
+			self.regs()
+				.uartthr()
+				.write(|w| unsafe { w.bits(word as u32) });
+			Ok(())
+		} else {
+			Err(nb::Error::WouldBlock)
+		}
+	}
+
+	fn flush(&mut self) -> nb::Result<(), Self::Error> {
+		if self.is_tx_idle() {
+			Ok(())
+		} else {
+			Err(nb::Error::WouldBlock)
+		}
+	}
+}
+
+impl serial_nb::Read<u8> for Usart {
+	fn read(&mut self) -> nb::Result<u8, Self::Error> {
+		self.try_read_byte()
+	}
+}
+pub enum Rate {
+	Baud9600,
+	Baud19200,
+	MBaud1_5,
+}
+
+impl Usart {
+	#[inline]
+	fn try_read_byte(&self) -> nb::Result<u8, Error> {
+		// Read LSR exactly once per byte so error bits and DR correspond to the same FIFO state.
+		let lsr = self.regs().uartlsr().read();
+		if !lsr.dr().bit() {
+			return Err(nb::Error::WouldBlock);
+		}
+
+		let byte = self.regs().uartrbr().read().bits() as u8;
+		if lsr.fe().bit_is_set() {
+			Err(nb::Error::Other(Error::Frame))
+		} else if lsr.pe().bit_is_set() {
+			Err(nb::Error::Other(Error::Parity))
+		} else if self.is_rx_noise_err() {
+			Err(nb::Error::Other(Error::Noise))
+		} else {
+			Ok(byte)
+		}
+	}
+
+	/// Create a new USART instance from a raw register-block pointer.
+	///
+	/// Configures RX/TX FIFO, 8 byte RX trigger level, 1.5MBaud, 8n1, and
+	/// enables all interrupts.
+	///
+	/// # Safety
+	///
+	/// - `usart` must be a valid, non-null pointer to the AST1060 UART register block.
+	/// - The pointed register block must remain valid for the lifetime of this `Usart`.
+	/// - Caller must enforce global ownership/coordination so concurrent mutable access
+	///   does not occur through other code paths.
+	pub unsafe fn new(usart: *const device::uart::RegisterBlock) -> Self {
+		let this = Self {
+			usart,
+			_not_sync: PhantomData,
+		};
+
+		unsafe {
+			this.regs().uartfcr().write(|w| {
+				w.enbl_uartfifo().set_bit();
+				w.rx_fiforst().set_bit();
+				w.tx_fiforst().set_bit();
+				w.define_the_rxr_fifointtrigger_level().bits(0b10)
+			});
+		}
+
+		this
+			.set_rate(Rate::MBaud1_5)
+			.set_8n1()
+			.interrupt_enable()
+	}
+
+	#[inline]
+	fn regs(&self) -> &device::uart::RegisterBlock {
+		// SAFETY: `Usart` construction is `unsafe`, so caller upholds pointer validity,
+		// non-nullness, and aliasing/ownership requirements.
+		unsafe { &*self.usart }
+	}
+
+	/// Set the baud rate
+	///
+	/// These baud rates assume that the uart clock is set to 24Mhz.
+	pub fn set_rate(self, rate: Rate) -> Self {
+		// These baud rates assume that the uart clock is set to 24Mhz.
+
+		// Enable DLAB to access divisor latch registers
+		self.regs().uartlcr().modify(|_, w| w.dlab().set_bit());
+
+		// Divisor = 24M / (13 * 16 * Baud Rate)
+		match rate {
+			Rate::Baud9600 => {
+				self.regs().uartdlh().write(|w| unsafe { w.bits(0) });
+				self.regs().uartdll().write(|w| unsafe { w.bits(12) });
+			}
+			Rate::Baud19200 => {
+				self.regs().uartdlh().write(|w| unsafe { w.bits(0) });
+				self.regs().uartdll().write(|w| unsafe { w.bits(6) });
+			}
+			Rate::MBaud1_5 => {
+				self.regs().uartdlh().write(|w| unsafe { w.bits(0) });
+				self.regs().uartdll().write(|w| unsafe { w.bits(1) });
+			}
+		}
+		// Disable DLAB to access other registers
+		self.regs().uartlcr().modify(|_, w| w.dlab().clear_bit());
+
+		self
+	}
+
+	/// Enable all interrupts
+	///
+	/// - Modem Status Interrupt
+	/// - Receiver Line Status Interrupt
+	/// - Transmitter Holding Register Empty Interrupt
+	/// - Received Data Available Interrupt
+	pub fn interrupt_enable(self) -> Self {
+		self.regs().uartier().write(|w| {
+			w.erbfi().set_bit(); // Enable Received Data Available Interrupt
+			w.etbei().set_bit(); // Enable Transmitter Holding Register Empty Interrupt
+			w.elsi().set_bit(); // Enable Receiver Line Status Interrupt
+			w.edssi().set_bit(); // Enable Modem Status Interrupt
+			w
+		});
+
+		self
+	}
+
+	/// Set the Receiver FIFO Interrupt trigger level
+	pub fn set_rx_fifo_trigger_level(&self, level: FifoTriggerLevel) {
+		unsafe {
+			self.regs().uartfcr().modify(|_, w| {
+				w.define_the_rxr_fifointtrigger_level().bits(level as u8)
+			});
+		}
+	}
+
+	pub fn set_8n1(self) -> Self {
+		self
+	}
+
+	pub fn is_tx_full(&self) -> bool {
+		!self.regs().uartlsr().read().thre().bit()
+	}
+
+	pub fn is_rx_empty(&self) -> bool {
+		!self.regs().uartlsr().read().dr().bit()
+	}
+
+	pub fn is_rx_frame_err(&self) -> bool {
+		self.regs().uartlsr().read().fe().bit_is_set()
+	}
+
+	pub fn is_rx_parity_err(&self) -> bool {
+		self.regs().uartlsr().read().pe().bit_is_set()
+	}
+
+	pub fn is_rx_noise_err(&self) -> bool {
+		// self.usart.uartlsr().read().rxnoise().bit()
+		false
+	}
+
+	pub fn read_interrupt_status(&self) -> InterruptDecoding {
+		InterruptDecoding::try_from(
+			self.regs().uartiir().read().intdecoding_table().bits() & 0x07,
+		)
+		.unwrap_or(InterruptDecoding::Unknown)
+	}
+
+	pub fn read_line_status(&self) -> LineStatus {
+		let status = self.regs().uartlsr().read().bits() as u8;
+		LineStatus::from_bits_truncate(status)
+	}
+
+	/// Non-blocking drain of the RX FIFO into `out`.
+	///
+	/// Copies as many bytes as are immediately available (up to `out.len()`)
+	/// and returns the count.  Returns `0` if the FIFO is empty; the caller
+	/// should arm the `RX_DATA_AVAILABLE` interrupt and retry.
+	pub fn try_read_available(&self, out: &mut [u8]) -> usize {
+		let mut count = 0;
+		while count < out.len() {
+			match self.try_read_byte() {
+				Ok(byte) => {
+					out[count] = byte;
+					count += 1;
+				}
+				Err(nb::Error::WouldBlock) => break,
+				Err(nb::Error::Other(_)) => break,
+			}
+		}
+		count
+	}
+
+	pub fn read_modem_status(&self) -> u8 {
+		self.regs().uartmsr().read().bits() as u8
+	}
+
+	pub fn is_tx_idle(&self) -> bool {
+		self.regs().uartlsr().read().txter_empty().bit_is_set()
+	}
+
+	/// Enables the TX idle interrupt (ETBEI)
+	pub fn set_tx_idle_interrupt(&self) {
+		self.regs().uartier().modify(|_, w| w.etbei().set_bit());
+	}
+
+	/// Disables the TX idle interrupt (ETBEI)
+	pub fn clear_tx_idle_interrupt(&self) {
+		// self.regs().uartier().write(|w| w.etbei().clear_bit());
+		self.regs().uartier().modify(|_, w| w.etbei().clear_bit());
+	}
+
+	/// Enables the RX idle interrupt (ERBFI)
+	pub fn set_rx_data_available_interrupt(&self) {
+		self.regs().uartier().modify(|_, w| w.erbfi().set_bit());
+	}
+
+	/// Disables the RX idle interrupt (ERBFI)
+	pub fn clear_rx_data_available_interrupt(&self) {
+		self.regs().uartier().modify(|_, w| w.erbfi().clear_bit());
+	}
+}
diff --git a/target/ast10x0/tests/usart/BUILD.bazel b/target/ast10x0/tests/usart/BUILD.bazel
new file mode 100644
index 0000000..7ab85fd
--- /dev/null
+++ b/target/ast10x0/tests/usart/BUILD.bazel
@@ -0,0 +1,123 @@
+# Licensed under the Apache-2.0 license
+# SPDX-License-Identifier: Apache-2.0
+
+load("@pigweed//pw_kernel/tooling:rust_app.bzl", "rust_app")
+load("@pigweed//pw_kernel/tooling:system_image.bzl", "system_image", "system_image_test")
+load("@pigweed//pw_kernel/tooling:target_codegen.bzl", "target_codegen")
+load("@pigweed//pw_kernel/tooling:target_linker_script.bzl", "target_linker_script")
+load("@pigweed//pw_kernel/tooling/panic_detector:rust_binary_no_panics_test.bzl", "rust_binary_no_panics_test")
+load("@rules_rust//rust:defs.bzl", "rust_binary")
+load("//target/ast10x0:defs.bzl", "TARGET_COMPATIBLE_WITH")
+
+filegroup(
+    name = "system_config",
+    srcs = ["system.json5"],
+    visibility = ["//visibility:public"],
+)
+
+target_codegen(
+    name = "codegen",
+    arch = "@pigweed//pw_kernel/arch/arm_cortex_m:arch_arm_cortex_m",
+    system_config = ":system_config",
+    target_compatible_with = TARGET_COMPATIBLE_WITH,
+)
+
+target_linker_script(
+    name = "linker_script",
+    system_config = ":system_config",
+    tags = ["kernel"],
+    target_compatible_with = TARGET_COMPATIBLE_WITH,
+    template = "//target/ast10x0:linker_script_template",
+)
+
+rust_binary(
+    name = "target",
+    srcs = ["target.rs"],
+    edition = "2024",
+    tags = ["kernel"],
+    target_compatible_with = TARGET_COMPATIBLE_WITH,
+    deps = [
+        ":codegen",
+        ":linker_script",
+        "//target/ast10x0:entry",
+        "@pigweed//pw_kernel/arch/arm_cortex_m:arch_arm_cortex_m",
+        "@pigweed//pw_kernel/kernel",
+        "@pigweed//pw_kernel/subsys/console:console_backend",
+        "@pigweed//pw_kernel/target:target_common",
+        "@pigweed//pw_kernel/userspace",
+        "@pigweed//pw_log/rust:pw_log",
+        "@rust_crates//:cortex-m-semihosting",
+    ],
+)
+
+rust_app(
+    name = "usart_server_bin",
+    srcs = ["server_main.rs"],
+    codegen_crate_name = "app_usart_server",
+    edition = "2024",
+    system_config = ":system_config",
+    tags = ["kernel"],
+    target_compatible_with = TARGET_COMPATIBLE_WITH,
+    deps = [
+        "//drivers/usart/server:usart_server",
+        "//target/ast10x0/backend/usart:usart_backend_ast10x0",
+        "@pigweed//pw_kernel/userspace",
+    ],
+)
+
+rust_app(
+    name = "usart_client_app",
+    srcs = ["client_main.rs"],
+    codegen_crate_name = "app_usart_client",
+    edition = "2024",
+    system_config = ":system_config",
+    tags = ["kernel"],
+    target_compatible_with = TARGET_COMPATIBLE_WITH,
+    deps = [
+        "//drivers/usart/client:usart_client",
+        "@pigweed//pw_kernel/userspace",
+        "@pigweed//pw_log/rust:pw_log",
+    ],
+)
+
+rust_app(
+    name = "usart_client2_app",
+    srcs = ["client2_main.rs"],
+    codegen_crate_name = "app_usart_client2",
+    edition = "2024",
+    system_config = ":system_config",
+    tags = ["kernel"],
+    target_compatible_with = TARGET_COMPATIBLE_WITH,
+    deps = [
+        "//drivers/usart/client:usart_client",
+        "@pigweed//pw_kernel/userspace",
+        "@pigweed//pw_log/rust:pw_log",
+    ],
+)
+
+system_image(
+    name = "usart",
+    apps = [
+        ":usart_server_bin",
+        ":usart_client_app",
+        ":usart_client2_app",
+    ],
+    kernel = ":target",
+    platform = "//target/ast10x0",
+    system_config = ":system_config",
+    tags = ["kernel"],
+    target_compatible_with = TARGET_COMPATIBLE_WITH,
+    visibility = ["//visibility:public"],
+)
+
+system_image_test(
+    name = "usart_test",
+    image = ":usart",
+    target_compatible_with = TARGET_COMPATIBLE_WITH,
+)
+
+rust_binary_no_panics_test(
+    name = "no_panics_test",
+    binary = ":usart",
+    tags = ["kernel"],
+)
diff --git a/target/ast10x0/tests/usart/README.md b/target/ast10x0/tests/usart/README.md
new file mode 100644
index 0000000..a2ee742
--- /dev/null
+++ b/target/ast10x0/tests/usart/README.md
@@ -0,0 +1,195 @@
+# USART Integration Test
+
+## Overview
+
+This directory contains a full system integration test for the USART (Universal Synchronous/Asynchronous Receiver-Transmitter) driver on the AST10x0 platform. The test validates that the USART server and client communicate correctly over IPC channels in a multi-process QEMU-based simulation.
+
+## Test Structure
+
+### Components
+
+- **`target.rs`**: Kernel entry point for the AST10x0 virt target
+- **`server_main.rs`**: USART server process - handles requests from clients
+- **`client_main.rs`**: USART client process - sends configuration and write requests
+- **`system.json5`**: System configuration file defining memory layout and process definitions
+- **`BUILD.bazel`**: Bazel build rules and test targets
+
+### Memory Layout
+
+```
+ARM Cortex-M4 @ 200 MHz, 768KB SRAM (0x00000000 - 0x000BFFFF)
+
+0x00000000 - 0x00000500: Vector table (1280 bytes)
+0x00000500 - 0x00020000: Kernel code (~126KB, ends at 128KB boundary)
+0x00020000 - 0x00060000: ipc multi-process app code (256KB, two processes)
+0x00060000 - 0x00080000: Kernel RAM (128KB)
+0x00080000 - 0x000A0000: App RAM (128KB)
+```
+
+### Process Definition
+
+The test instantiates two processes:
+1. **USART Server** (`usart_server_bin`):
+   - Waits on IPC channel for client requests
+   - Services read/write operations via USART backend
+   - Manages UART5 IRQ and data flow
+   - Depends on `//drivers/usart/server:usart_server`
+
+2. **USART Client** (`usart_client_app`):
+   - Configures USART to 1,500,000 baud
+   - Writes test message: `"usart client online\r\n"`
+   - Validates communication path
+   - Depends on `//drivers/usart/client:usart_client`
+
+## Running the Test
+
+### Prerequisites
+
+- `bazelisk` installed and in PATH
+- AST10x0 QEMU binaries available
+- Working Rust/Bazel build environment
+
+### Run the Test
+
+```bash
+# Run with virt_ast10x0 platform config
+bazelisk test //target/ast10x0/tests/usart:usart_test --config=virt_ast10x0
+
+# With verbose output
+bazelisk test //target/ast10x0/tests/usart:usart_test --config=virt_ast10x0 -s
+
+# Show all test output
+bazelisk test //target/ast10x0/tests/usart:usart_test --config=virt_ast10x0 --test_output=all
+```
+
+### Expected Output
+
+```
+INFO: Found 1 test target...
+Target //target/ast10x0/tests/usart:usart_test up-to-date:
+  bazel-bin/target/ast10x0/tests/usart/usart_test
+INFO: Build completed successfully, X total actions
+//target/ast10x0/tests/usart:usart_test                                  PASSED in 0.4s
+
+Executed 1 out of 1 test: 1 test passes.
+```
+
+## Test Flow
+
+1. **System Initialization**:
+   - Kernel boots with multi-process IPC support
+   - Codegen establishes wait groups and channel handles
+   - Both processes start concurrently
+
+2. **Server Setup**:
+   - Registers IPC channel with `Signals::READABLE`
+   - Registers UART5 IRQ with custom signal mask
+   - Enters dispatch loop in `runtime::run()`
+
+3. **Client Execution**:
+   - Constructs `UsartClient` with IPC handle
+   - Issues `configure(1_500_000)` call
+   - Issues `write(b"usart client online\r\n")` call
+   - Gracefully shuts down
+
+4. **Server Processing**:
+   - Receives client requests via `object_wait()`
+   - Dispatches to backend (AST10x0 UART5 driver)
+   - Responds via `channel_respond()`
+
+5. **Test Completion**:
+   - Client calls `debug_shutdown(Ok(()))`
+   - QEMU halts with exit code 0 (success)
+
+## Architecture
+
+### USART Backend
+
+The test uses the concrete AST10x0 USART backend:
+- **Location**: `//target/ast10x0/backend/usart:usart_backend_ast10x0`
+- **Hardware**: UART5 at 0x7e78_4000 (AST10x0 MMIO base)
+- **Features**: Blocking read/write, IRQ masking, line status
+
+### Wire Protocol
+
+Defined in `//drivers/usart/api`:
+- `UsartOp` enum: Configure, Write, Read, GetLineStatus, (Enable/Disable)Interrupts
+- `UsartError` variants: Success, InvalidOperation, BufferTooSmall, Busy, Timeout, etc.
+- Max payload per IPC request/response: 256 bytes
+
+### Server Runtime
+
+Dispatch loop in `//drivers/usart/server:runtime`:
+1. Wait for IRQ or client channel readable
+2. Route wake-ups by `user_data`:
+   - If IRQ: acknowledge and clear pending signals
+   - If channel: read request, dispatch, respond
+3. Back to wait (infinite loop)
+
+## Debugging
+
+### Build Issues
+
+If Bazel build fails with incompatibility error:
+```
+ERROR: Target is incompatible and cannot be built
+```
+**Solution**: Use `--config=virt_ast10x0` to set the correct platform.
+
+### QEMU Timeout
+
+If test hangs or times out:
+- Check system.json5 for memory/process configuration correctness
+- Verify UART5 device node exists in QEMU model
+- Inspect server startup logs with `--test_output=all`
+
+### Common Failures
+
+| Symptom | Cause | Fix |
+|---------|-------|-----|
+| Process crashes at startup | Missing codegen or wait group | Rebuild with clean cache |
+| IPC channel not found | Incorrect process/object names | Match system.json5 and codegen |
+| USART timeout | Backend not driving UART5 | Check backend initialization |
+| Data corruption | Buffer overflow or alignment | Verify MAX_PAYLOAD_SIZE contract |
+
+## Future Extensions
+
+This test is a foundation for:
+- [ ] Non-blocking read/write (`try_read`, `try_write`)
+- [ ] Async result polling (`get_async_result`)
+- [ ] Multi-client concurrent operations
+- [ ] Error injection and recovery testing
+- [ ] Performance benchmarking
+
+See [ASYNC_NONBLOCKING_IMPLEMENTATION_PLAN.md](../../drivers/usart/api/ASYNC_NONBLOCKING_IMPLEMENTATION_PLAN.md) for planned enhancements.
+
+## Related Documentation
+
+- [USART Driver API](../../drivers/usart/api/README.md) - Protocol and backend trait
+- [USART Client](../../drivers/usart/client/README.md) - IPC wrapper usage
+- [USART Server](../../drivers/usart/server/README.md) - Dispatch and runtime
+- [AST10x0 Backend](../../target/ast10x0/backend/usart/README.md) - Hardware driver
+- [Async Non-Blocking Plan](../../drivers/usart/api/ASYNC_NONBLOCKING_IMPLEMENTATION_PLAN.md) - Future work
+
+## Build Artifacts
+
+After a successful build, the test artifacts are located at:
+```
+bazel-bin/target/ast10x0/tests/usart/
+├── usart                    # System image (kernel + rootfs)
+├── usart_test               # Test runner
+├── usart_server_bin         # Compiled server binary
+└── usart_client_app         # Compiled client binary
+```
+
+## Contributing
+
+When modifying this test:
+1. Keep system.json5 in sync with process/handle definitions
+2. Update both server_main.rs and client_main.rs if changing IPC contract
+3. Run test locally before committing
+4. Document any new operations or error codes in USART API
+
+## License
+
+Licensed under the Apache-2.0 license. See LICENSE file in repository root.
diff --git a/target/ast10x0/tests/usart/client2_main.rs b/target/ast10x0/tests/usart/client2_main.rs
new file mode 100644
index 0000000..a39219d
--- /dev/null
+++ b/target/ast10x0/tests/usart/client2_main.rs
@@ -0,0 +1,35 @@
+// Licensed under the Apache-2.0 license
+// SPDX-License-Identifier: Apache-2.0
+
+#![no_main]
+#![no_std]
+
+use app_usart_client2::handle;
+use usart_client::UsartClient;
+use userspace::entry;
+use userspace::syscall;
+
+#[entry]
+fn entry() -> ! {
+    let client = UsartClient::new(handle::USART);
+
+    match client.configure(1_500_000) {
+        Ok(()) => pw_log::info!("USART client2 configured"),
+        Err(_) => pw_log::error!("USART client2 configure failed"),
+    }
+
+    match client.write(b"usart client2 online\r\n") {
+        Ok(count) => pw_log::info!("USART client2 wrote {} bytes", count as u32),
+        Err(_) => pw_log::error!("USART client2 write failed"),
+    }
+
+    // End the test only after client2 has executed, proving multi-client app
+    // startup and request handling against the same server endpoint.
+    let _ = syscall::debug_shutdown(Ok(()));
+    loop {}
+}
+
+#[panic_handler]
+fn panic(_info: &core::panic::PanicInfo) -> ! {
+    loop {}
+}
diff --git a/target/ast10x0/tests/usart/client_main.rs b/target/ast10x0/tests/usart/client_main.rs
new file mode 100644
index 0000000..ad3a422
--- /dev/null
+++ b/target/ast10x0/tests/usart/client_main.rs
@@ -0,0 +1,58 @@
+// Licensed under the Apache-2.0 license
+// SPDX-License-Identifier: Apache-2.0
+
+#![no_main]
+#![no_std]
+
+use app_usart_client::handle;
+use usart_client::UsartClient;
+use userspace::entry;
+use userspace::time::Instant;
+
+#[entry]
+fn entry() -> ! {
+    let client = UsartClient::new(handle::USART);
+
+    match client.configure(1_500_000) {
+        Ok(()) => pw_log::info!("USART client configured"),
+        Err(_) => pw_log::error!("USART client configure failed"),
+    }
+
+    match client.write(b"usart client online\r\n") {
+        Ok(count) => pw_log::info!("USART client wrote {} bytes", count as u32),
+        Err(_) => pw_log::error!("USART client write failed"),
+    }
+
+    let mut read_buf = [0u8; 16];
+    // Use a bounded deadline so the test exercises timeout-capable try_read
+    // semantics without risking an unbounded wait.
+    match client.try_read_with_timeout(&mut read_buf, Instant::from_ticks(5_000_000)) {
+        Ok(count) => pw_log::info!(
+            "USART try_read returned immediately with {} bytes",
+            count as u32
+        ),
+        Err(usart_client::ClientError::IpcError(e)) if (e as u32) == 4 => {
+            pw_log::info!("USART try_read timeout observed as expected")
+        }
+        Err(usart_client::ClientError::IpcError(e)) => {
+            pw_log::info!("USART try_read returned IPC status {}", e as u32)
+        }
+        Err(usart_client::ClientError::ServerError(e)) => {
+            pw_log::info!("USART try_read returned server status {}", e as u8)
+        }
+        Err(usart_client::ClientError::InvalidResponse) => {
+            pw_log::info!("USART try_read returned invalid response")
+        }
+        Err(usart_client::ClientError::BufferTooSmall) => {
+            pw_log::info!("USART try_read returned buffer too small")
+        }
+    }
+
+    // Keep client 1 alive; client 2 performs test shutdown once it runs.
+    loop {}
+}
+
+#[panic_handler]
+fn panic(_info: &core::panic::PanicInfo) -> ! {
+    loop {}
+}
diff --git a/target/ast10x0/tests/usart/server_main.rs b/target/ast10x0/tests/usart/server_main.rs
new file mode 100644
index 0000000..4f8173f
--- /dev/null
+++ b/target/ast10x0/tests/usart/server_main.rs
@@ -0,0 +1,42 @@
+// Licensed under the Apache-2.0 license
+// SPDX-License-Identifier: Apache-2.0
+
+#![no_main]
+#![no_std]
+
+use app_usart_server::{handle, signals};
+use usart_backend::Backend;
+use usart_server::runtime;
+use userspace::entry;
+use userspace::syscall::{self, Signals};
+
+#[entry]
+fn entry() -> ! {
+    let mut backend = Backend::new();
+
+    let _ = syscall::wait_group_add(
+        handle::WG,
+        handle::USART,
+        Signals::READABLE,
+        handle::USART as usize,
+    );
+    let _ = syscall::wait_group_add(
+        handle::WG,
+        handle::USART2,
+        Signals::READABLE,
+        handle::USART2 as usize,
+    );
+    let _ = syscall::wait_group_add(
+        handle::WG,
+        handle::UART5_IRQ,
+        signals::UART,
+        handle::UART5_IRQ as usize,
+    );
+
+    runtime::run(&mut backend, handle::WG, handle::UART5_IRQ, signals::UART);
+}
+
+#[panic_handler]
+fn panic(_info: &core::panic::PanicInfo) -> ! {
+    loop {}
+}
diff --git a/target/ast10x0/tests/usart/system.json5 b/target/ast10x0/tests/usart/system.json5
new file mode 100644
index 0000000..ad2bca7
--- /dev/null
+++ b/target/ast10x0/tests/usart/system.json5
@@ -0,0 +1,128 @@
+// Licensed under the Apache-2.0 license
+// SPDX-License-Identifier: Apache-2.0
+
+// AST10x0 USART Service Configuration
+// ARM Cortex-M4 @ 200 MHz with 768KB SRAM (0x00000000 - 0x000BFFFF)
+// NOTE: AST10x0 does not support XIP - firmware executes from RAM.
+//
+// PMSAv7-Friendly Memory Layout:
+//   0x00000000 - 0x00000500: Vector table (1280 bytes)
+//   0x00000500 - 0x00020000: Kernel code (~126KB, ends at 128KB boundary)
+//   0x00020000 - 0x00060000: USART app flash (256KB)
+//   0x00060000 - 0x00080000: Kernel RAM (128KB)
+//   0x00080000 - 0x000A0000: App RAM (128KB)
+{
+    arch: {
+        type: "armv7m",
+        vector_table_start_address: 0x00000000,
+        vector_table_size_bytes: 1280,  // 0x500
+    },
+    kernel: {
+        flash_start_address: 0x00000500,  // After vector table
+        flash_size_bytes: 129792,         // ~126KB (ends at 0x00020000)
+        ram_start_address: 0x00060000,    // After all flash regions
+        ram_size_bytes: 131072,           // 128KB
+    },
+    apps: [
+        {
+            name: "usart_server_bin",
+            flash_size_bytes: 131072,     // 128KB for server code
+            processes: [
+                {
+                    name: "usart_server_process",
+                    ram_size_bytes: 65536,        // 64KB RAM
+                    objects: [
+                        {
+                            // Multiplex channel and IRQ events in the server loop.
+                            name: "wg",
+                            type: "wait_group",
+                        },
+                        {
+                            name: "usart",
+                            type: "channel_handler",  // Server side of client→server channel
+                        },
+                        {
+                            name: "usart2",
+                            type: "channel_handler",  // Server side of client2→server channel
+                        },
+                        {
+                            // AST1060 UART interrupt line (covers UART instances including UART5).
+                            // Source: ast1060_pac::Interrupt::uart = 8
+                            name: "uart5_irq",
+                            type: "interrupt",
+                            irqs: [
+                                {
+                                    name: "uart",
+                                    number: 8,
+                                },
+                            ],
+                        },
+                    ],
+                    memory_mappings: [
+                        {
+                            // AST1060 UART5 (debug UART, 16550-compatible)
+                            name: "uart5",
+                            type: "device",
+                            start_address: 0x7e784000,
+                            size_bytes: 0x1000,
+                        },
+                    ],
+                    threads: [
+                        {
+                            name: "usart_server_thread",
+                            kernel_stack_size_bytes: 4096,  // 4KB stack
+                        },
+                    ],
+                },
+            ],
+        },
+        {
+            name: "usart_client_app",
+            flash_size_bytes: 65536,      // 64KB for client code
+            processes: [
+                {
+                    name: "usart_client_process",
+                    ram_size_bytes: 32768,        // 32KB RAM
+                    objects: [
+                        {
+                            name: "usart",
+                            type: "channel_initiator",
+                            handler_process: "usart_server_process",
+                            handler_object_name: "usart",
+                        },
+                    ],
+                    threads: [
+                        {
+                            name: "usart_client_thread",
+                            kernel_stack_size_bytes: 2048,
+                        },
+                    ],
+                },
+            ],
+        },
+        {
+            name: "usart_client2_app",
+            flash_size_bytes: 65536,      // 64KB for second client code
+            processes: [
+                {
+                    name: "usart_client2_process",
+                    ram_size_bytes: 32768,        // 32KB RAM
+                    objects: [
+                        {
+                            name: "usart",
+                            type: "channel_initiator",
+                            handler_process: "usart_server_process",
+                            handler_object_name: "usart2",
+                        },
+                    ],
+                    threads: [
+                        {
+                            name: "usart_client2_thread",
+                            kernel_stack_size_bytes: 2048,
+                        },
+                    ],
+                },
+            ],
+        },
+    ],
+}
diff --git a/target/ast10x0/tests/usart/target.rs b/target/ast10x0/tests/usart/target.rs
new file mode 100644
index 0000000..485021f
--- /dev/null
+++ b/target/ast10x0/tests/usart/target.rs
@@ -0,0 +1,35 @@
+// Licensed under the Apache-2.0 license
+// SPDX-License-Identifier: Apache-2.0
+
+//! AST10x0 USART Service Target
+//!
+//! This target runs the USART server as a userspace process.
+//! Clients can communicate with it over an IPC channel.
+
+#![no_std]
+#![no_main]
+
+use cortex_m_semihosting::debug::{EXIT_FAILURE, EXIT_SUCCESS, exit};
+use target_common::{TargetInterface, declare_target};
+use {console_backend as _, entry as _};
+
+pub struct Target {}
+
+impl TargetInterface for Target {
+    const NAME: &'static str = "AST10x0 USART Service";
+
+    fn main() -> ! {
+        codegen::start();
+        #[expect(clippy::empty_loop)]
+        loop {}
+    }
+
+    fn shutdown(code: u32) -> ! {
+        let status = if code == 0 { EXIT_SUCCESS } else { EXIT_FAILURE };
+        exit(status);
+        #[expect(clippy::empty_loop)]
+        loop {}
+    }
+}
+
+declare_target!(Target);
diff --git a/third_party/ast1060-pac/BUILD.bazel b/third_party/ast1060-pac/BUILD.bazel
new file mode 100644
index 0000000..e55d1aa
--- /dev/null
+++ b/third_party/ast1060-pac/BUILD.bazel
@@ -0,0 +1,6 @@
+# Licensed under the Apache-2.0 license
+# SPDX-License-Identifier: Apache-2.0
+
+package(default_visibility = ["//visibility:public"])
+
+exports_files(["overlay.BUILD"])
diff --git a/third_party/ast1060-pac/README.md b/third_party/ast1060-pac/README.md
new file mode 100644
index 0000000..bb4eb33
--- /dev/null
+++ b/third_party/ast1060-pac/README.md
@@ -0,0 +1,28 @@
+# ast1060-pac Third-Party Integration
+
+[`ast1060-pac`](https://github.com/OpenPRoT/ast1060-pac) is an svd2rust-generated PAC for the ASPEED AST1060. It is fetched from git and built via a Bazel overlay — the upstream repo has no `BUILD.bazel`.
+
+## Files
+
+| File | Purpose |
+|---|---|
+| `versions.bzl` | Git commit pin |
+| `extensions.bzl` | Bzlmod module extension (`git_repository` fetch) |
+| `overlay.BUILD` | Injected `rust_library` target |
+| `BUILD.bazel` | Exports `overlay.BUILD` for use as `build_file` |
+
+## Integration Points
+
+**`MODULE.bazel`** — registers the extension and imports the repo:
+```starlark
+ast1060_pac_repos_ext = use_extension("//third_party/ast1060-pac:extensions.bzl", "ast1060_pac_repos")
+use_repo(ast1060_pac_repos_ext, "ast1060_pac")
+```
+
+**`third_party/crates_io/Cargo.toml`** — adds `vcell = "0.1.2"` (PAC runtime dep).
+
+## Notes
+
+- `overlay.BUILD` passes `-Amismatched-lifetime-syntaxes` because svd2rust emits older lifetime syntax that triggers `-D warnings`. The proper fix is `#![allow(mismatched_lifetime_syntaxes)]` in the PAC's `src/lib.rs`.
+- To use: `deps = ["@ast1060_pac//:ast1060_pac"]`, build with `--platforms=//target/ast10x0:ast10x0`.
+- To upgrade: update the SHA in `versions.bzl`, then regenerate `MODULE.bazel.lock`.
diff --git a/third_party/ast1060-pac/extensions.bzl b/third_party/ast1060-pac/extensions.bzl
new file mode 100644
index 0000000..7c4781a
--- /dev/null
+++ b/third_party/ast1060-pac/extensions.bzl
@@ -0,0 +1,18 @@
+# Licensed under the Apache-2.0 license
+# SPDX-License-Identifier: Apache-2.0
+"""Module extension for the ast1060-pac source repository."""
+
+load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository")
+load("//third_party/ast1060-pac:versions.bzl", "AST1060_PAC_VERSIONS")
+
+def _ast1060_pac_repos_impl(module_ctx):
+    git_repository(
+        name = "ast1060_pac",
+        build_file = "//third_party/ast1060-pac:overlay.BUILD",
+        commit = AST1060_PAC_VERSIONS["ast1060_pac"],
+        remote = "https://github.com/OpenPRoT/ast1060-pac",
+    )
+
+ast1060_pac_repos = module_extension(
+    implementation = _ast1060_pac_repos_impl,
+)
diff --git a/third_party/ast1060-pac/overlay.BUILD b/third_party/ast1060-pac/overlay.BUILD
new file mode 100644
index 0000000..6dd93ea
--- /dev/null
+++ b/third_party/ast1060-pac/overlay.BUILD
@@ -0,0 +1,16 @@
+# Licensed under the Apache-2.0 license
+# SPDX-License-Identifier: Apache-2.0
+
+load("@rules_rust//rust:defs.bzl", "rust_library")
+
+rust_library(
+    name = "ast1060_pac",
+    srcs = glob(["src/**/*.rs"]),
+    edition = "2021",
+    rustc_flags = ["-Amismatched-lifetime-syntaxes"],
+    visibility = ["//visibility:public"],
+    deps = [
+        "@rust_crates//:cortex-m",
+        "@rust_crates//:vcell",
+    ],
+)
diff --git a/third_party/ast1060-pac/versions.bzl b/third_party/ast1060-pac/versions.bzl
new file mode 100644
index 0000000..8269415
--- /dev/null
+++ b/third_party/ast1060-pac/versions.bzl
@@ -0,0 +1,7 @@
+# Licensed under the Apache-2.0 license
+# SPDX-License-Identifier: Apache-2.0
+"""Canonical ast1060-pac git pin for this openprot checkout."""
+
+AST1060_PAC_VERSIONS = {
+    "ast1060_pac": "564cd385f0b160b4a5ce435b930d28b87799bc96",
+}
diff --git a/third_party/crates_io/Cargo.lock b/third_party/crates_io/Cargo.lock
index 75b5922..9254cdb 100644
--- a/third_party/crates_io/Cargo.lock
+++ b/third_party/crates_io/Cargo.lock
@@ -314,6 +314,21 @@
 ]
 
 [[package]]
+name = "crc"
+version = "3.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d"
+dependencies = [
+ "crc-catalog",
+]
+
+[[package]]
+name = "crc-catalog"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "217698eaf96b4a3f0bc4f3662aaa55bdf913cd54d7204591faa790070c6d0853"
+
+[[package]]
 name = "crc32fast"
 version = "1.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -419,6 +434,12 @@
 ]
 
 [[package]]
+name = "embedded-crc-macros"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4f1c75747a43b086df1a87fb2a889590bc0725e0abf54bba6d0c4bf7bd9e762c"
+
+[[package]]
 name = "embedded-hal"
 version = "0.2.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -460,6 +481,15 @@
 checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d"
 
 [[package]]
+name = "embedded-io-async"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3ff09972d4073aa8c299395be75161d582e7629cd663171d62af73c8d50dba3f"
+dependencies = [
+ "embedded-io",
+]
+
+[[package]]
 name = "equivalent"
 version = "1.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -647,6 +677,16 @@
 
 [[package]]
 name = "heapless"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad"
+dependencies = [
+ "hash32",
+ "stable_deref_trait",
+]
+
+[[package]]
+name = "heapless"
 version = "0.9.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "2af2455f757db2b292a9b1768c4b70186d443bcb3b316252d6b540aec1cd89ed"
@@ -759,6 +799,35 @@
 checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"
 
 [[package]]
+name = "mctp"
+version = "0.2.0"
+source = "git+https://github.com/OpenPRoT/mctp-rs.git?branch=sync-features#fafe92f6fcadf6e57683b91757fad9933ddd223d"
+
+[[package]]
+name = "mctp-estack"
+version = "0.1.0"
+source = "git+https://github.com/OpenPRoT/mctp-rs.git?branch=sync-features#fafe92f6fcadf6e57683b91757fad9933ddd223d"
+dependencies = [
+ "crc",
+ "embedded-io",
+ "embedded-io-async",
+ "heapless 0.8.0",
+ "log",
+ "mctp",
+ "smbus-pec",
+ "uuid",
+]
+
+[[package]]
+name = "mctp-lib"
+version = "0.1.0"
+source = "git+https://github.com/9elements/mctp-lib.git?branch=buildup#9c53adaeb7ae544cbeab4654530a50d158e33fe5"
+dependencies = [
+ "mctp",
+ "mctp-estack",
+]
+
+[[package]]
 name = "memchr"
 version = "2.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1183,11 +1252,13 @@
  "embedded-hal-nb",
  "embedded-io",
  "futures",
- "heapless",
+ "heapless 0.9.2",
  "hex",
  "hmac",
  "k256",
  "log",
+ "mctp",
+ "mctp-lib",
  "memoffset",
  "minijinja",
  "nb 1.1.0",
@@ -1218,6 +1289,7 @@
  "tock-registers",
  "tokio",
  "tokio-util",
+ "vcell",
  "zerocopy",
  "zeroize",
 ]
@@ -1394,6 +1466,15 @@
 checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
 
 [[package]]
+name = "smbus-pec"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca0763a680cd5d72b28f7bfc8a054c117d8841380a6ad4f72f05bd2a34217d3e"
+dependencies = [
+ "embedded-crc-macros",
+]
+
+[[package]]
 name = "smlang"
 version = "0.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1587,6 +1668,12 @@
 checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
 
 [[package]]
+name = "uuid"
+version = "1.23.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76"
+
+[[package]]
 name = "vcell"
 version = "0.1.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
diff --git a/third_party/crates_io/Cargo.toml b/third_party/crates_io/Cargo.toml
index aba75cc..6891e83 100644
--- a/third_party/crates_io/Cargo.toml
+++ b/third_party/crates_io/Cargo.toml
@@ -34,6 +34,7 @@
 syn = { version = "2.0.104", features = ["full", "extra-traits"] }
 syn1 = { package = "syn", version = "1.0.109", features = ["full", "extra-traits"] }
 tock-registers = "0.9.0"
+vcell = "0.1.2"
 zerocopy = { version = "0.8.48", default-features = false, features = ["derive"] }
 zeroize = { version = "1.8", default-features = false, features = ["derive"] }
 
@@ -44,6 +45,8 @@
 embedded-hal-async = "1.0"
 embedded-hal-nb = "1.0"
 heapless = { version = "0.9", default-features = false }
+mctp = { git = "https://github.com/OpenPRoT/mctp-rs.git", branch = "sync-features", default-features = false }
+mctp-lib = { git = "https://github.com/9elements/mctp-lib.git", branch = "buildup" }
 nb = "1.0"
 # Pin to match Hubris ecosystem
 rand_core = { version = "0.9", default-features = false }