Merge "Update virtio-drivers to 0.7.5" into main
diff --git a/crates/inotify/.android-checksum.json b/crates/inotify/.android-checksum.json
index 61a3c56..8d6609f 100644
--- a/crates/inotify/.android-checksum.json
+++ b/crates/inotify/.android-checksum.json
@@ -1 +1 @@
-{"package":null,"files":{".cargo-checksum.json":"0d9706ef5d373938da2aa7d4614d1f4dcf9ff6e2371ead9c58d28441687f8618","Android.bp":"791845197a6ab656064a71eb1ca5a1eea1c160885d348b45fa07c84b0def118a","CHANGELOG.md":"6741d951a7b741c56d109f35cd5268006984aa429ff173b278368a8f223b3603","CONTRIBUTING.md":"903615a28d3cd291969fd64f862320104a0d3b9a195232b842ac43b36fd4db3e","Cargo.lock":"66cc74d61ad532389ddd4d973d81aeb058f7d14aaafd3b79b4ef5a4c0bfe4e68","Cargo.toml":"1cf43ba6b2af411a443e6993a852f59ab6398b67937e880c85b18418ae003850","LICENSE":"827af61e671db65655482be1fe90882b836403fdec06746b03bdd935c869c71a","METADATA":"e226bcee9f6cdc3891cb4f8840430823d1e55e5f65b2003f4746c60a35dc34a8","MODULE_LICENSE_ISC":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"125060d459975be258596f1df8386a9f4b4fbcbecbddaebeadbf634e2090de51","cargo_embargo.json":"84459a3d28b2de537000617d709682791207b299a562af849851183686bc30fe","examples/stream.rs":"57246cc24a83cc6f57bd3be52eaeab2fa799d5006970f1312ebb937ceabc810d","examples/watch.rs":"c833b8f7951536c4e5d5643494487cc6b547472faa8d9851a5fc56b905301adc","src/events.rs":"04d951288983fd669fb0a564c80e4c9020d6597ffadf61e85a185057aaf495ce","src/fd_guard.rs":"1332a0d16207474a81e8e294f2a76e6ff6939f55f6111f6a6ee7e9385d3cc2e1","src/inotify.rs":"a0adfee86e9a7d8f00d1f245ce47c37e4df0e465a7683dfce16983e409273e88","src/lib.rs":"6cb02efc6fcfbb91bf3029f8a03e685ab66139f6fade7837f49eab7411cdb04a","src/stream.rs":"b1e929261395ab0b81efe7a7e70881333b32c4e26872a9090a6c8743bf63da92","src/util.rs":"a64770266cffdad1ec275b331677e3da18ac206820a7682c2b140e0fbab412bc","src/watches.rs":"8033907cbc312ba322e2936dd91876249c9e4749936007b90b505da3130b176c","tests/main.rs":"268d6edfe319dab75b0bc54908995f22f3ebe2becd63d9ba076972b501c24df1"}}
\ No newline at end of file
+{"package":null,"files":{".cargo-checksum.json":"0d9706ef5d373938da2aa7d4614d1f4dcf9ff6e2371ead9c58d28441687f8618","Android.bp":"791845197a6ab656064a71eb1ca5a1eea1c160885d348b45fa07c84b0def118a","CHANGELOG.md":"6741d951a7b741c56d109f35cd5268006984aa429ff173b278368a8f223b3603","CONTRIBUTING.md":"903615a28d3cd291969fd64f862320104a0d3b9a195232b842ac43b36fd4db3e","Cargo.lock":"66cc74d61ad532389ddd4d973d81aeb058f7d14aaafd3b79b4ef5a4c0bfe4e68","Cargo.toml":"1cf43ba6b2af411a443e6993a852f59ab6398b67937e880c85b18418ae003850","LICENSE":"827af61e671db65655482be1fe90882b836403fdec06746b03bdd935c869c71a","METADATA":"e226bcee9f6cdc3891cb4f8840430823d1e55e5f65b2003f4746c60a35dc34a8","MODULE_LICENSE_ISC":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"125060d459975be258596f1df8386a9f4b4fbcbecbddaebeadbf634e2090de51","TEST_MAPPING":"c0145f928abec387f02c33dfb55b21fa952e5088b5c415d604ee3d8c0fdc965e","cargo_embargo.json":"84459a3d28b2de537000617d709682791207b299a562af849851183686bc30fe","examples/stream.rs":"57246cc24a83cc6f57bd3be52eaeab2fa799d5006970f1312ebb937ceabc810d","examples/watch.rs":"c833b8f7951536c4e5d5643494487cc6b547472faa8d9851a5fc56b905301adc","src/events.rs":"04d951288983fd669fb0a564c80e4c9020d6597ffadf61e85a185057aaf495ce","src/fd_guard.rs":"1332a0d16207474a81e8e294f2a76e6ff6939f55f6111f6a6ee7e9385d3cc2e1","src/inotify.rs":"a0adfee86e9a7d8f00d1f245ce47c37e4df0e465a7683dfce16983e409273e88","src/lib.rs":"6cb02efc6fcfbb91bf3029f8a03e685ab66139f6fade7837f49eab7411cdb04a","src/stream.rs":"b1e929261395ab0b81efe7a7e70881333b32c4e26872a9090a6c8743bf63da92","src/util.rs":"a64770266cffdad1ec275b331677e3da18ac206820a7682c2b140e0fbab412bc","src/watches.rs":"8033907cbc312ba322e2936dd91876249c9e4749936007b90b505da3130b176c","tests/main.rs":"268d6edfe319dab75b0bc54908995f22f3ebe2becd63d9ba076972b501c24df1"}}
\ No newline at end of file
diff --git a/crates/inotify/TEST_MAPPING b/crates/inotify/TEST_MAPPING
new file mode 100644
index 0000000..355c520
--- /dev/null
+++ b/crates/inotify/TEST_MAPPING
@@ -0,0 +1,10 @@
+{
+  "postsubmit": [
+    {
+      "name": "inotify_test_src_lib"
+    },
+    {
+      "name": "inotify_test_tests_main"
+    }
+  ]
+}
diff --git a/crates/maplit/.android-checksum.json b/crates/maplit/.android-checksum.json
index 0362cad..66f9e78 100644
--- a/crates/maplit/.android-checksum.json
+++ b/crates/maplit/.android-checksum.json
@@ -1 +1 @@
-{"package":null,"files":{".cargo-checksum.json":"57d75b1f8b4d6f04ae6bbfe06c9dca420b7767c7ddfc12baa9909f6828aa6c6d","Android.bp":"6b7d1d4e48627450dfc0b6cfae1bb62cbedb6ad9edd97113fadbe69f5d584325","Cargo.toml":"9ead68a86ae6a94a698d67d83ee7c1161be6cbc031d5f8489e25816e6493337b","LICENSE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","LICENSE-APACHE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","LICENSE-MIT":"25045647f8514b43237cf0efdc4ba7dc153f8793e19c9e4b4a65af7e1b78cb5b","METADATA":"842f972a407701f4a9c09f52915c0de3d51b1b6fc8fe1831f136186d15130878","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.rst":"67555a05bc2fdfcf303ca098d68dd0f12cee4582f35a6ddcfd4ff10632759b4a","cargo_embargo.json":"d87209d4c367ff47dd3b7c46cebe3557f0596daaaae987d18ea162cb31e92b6c","src/lib.rs":"d05a41c93137cd8128cfe5e6eb97b0395be8898a7733f78eed36cb17e0f236ce","tests/tests.rs":"d8716b250cae0d9869c4d979f532dfc59850fc9e8ef26661ac18b7c8980116f6"}}
\ No newline at end of file
+{"package":null,"files":{".cargo-checksum.json":"57d75b1f8b4d6f04ae6bbfe06c9dca420b7767c7ddfc12baa9909f6828aa6c6d","Android.bp":"6b7d1d4e48627450dfc0b6cfae1bb62cbedb6ad9edd97113fadbe69f5d584325","Cargo.toml":"9ead68a86ae6a94a698d67d83ee7c1161be6cbc031d5f8489e25816e6493337b","LICENSE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","LICENSE-APACHE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","LICENSE-MIT":"25045647f8514b43237cf0efdc4ba7dc153f8793e19c9e4b4a65af7e1b78cb5b","METADATA":"842f972a407701f4a9c09f52915c0de3d51b1b6fc8fe1831f136186d15130878","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.rst":"67555a05bc2fdfcf303ca098d68dd0f12cee4582f35a6ddcfd4ff10632759b4a","TEST_MAPPING":"a921d5883143432706de1e49ff3f31f65e57983427abe9c250bad3c4bddc10a1","cargo_embargo.json":"d87209d4c367ff47dd3b7c46cebe3557f0596daaaae987d18ea162cb31e92b6c","src/lib.rs":"d05a41c93137cd8128cfe5e6eb97b0395be8898a7733f78eed36cb17e0f236ce","tests/tests.rs":"d8716b250cae0d9869c4d979f532dfc59850fc9e8ef26661ac18b7c8980116f6"}}
\ No newline at end of file
diff --git a/crates/maplit/TEST_MAPPING b/crates/maplit/TEST_MAPPING
new file mode 100644
index 0000000..46337d2
--- /dev/null
+++ b/crates/maplit/TEST_MAPPING
@@ -0,0 +1,10 @@
+{
+  "postsubmit": [
+    {
+      "name": "maplit_test_src_lib"
+    },
+    {
+      "name": "maplit_test_tests_tests"
+    }
+  ]
+}
diff --git a/crates/memmap2/.android-checksum.json b/crates/memmap2/.android-checksum.json
index 623243e..7addba8 100644
--- a/crates/memmap2/.android-checksum.json
+++ b/crates/memmap2/.android-checksum.json
@@ -1 +1 @@
-{"package":null,"files":{".cargo-checksum.json":"4e4250ae3c2467f0159657019ece7c23dc793ec787b4ed13047f10a9f350f848","Android.bp":"21b7d4c26c090ab87682050682912484dc15f54e46520c5beda5c1e2b3701377","CHANGELOG.md":"64c9a56e0cfa98a4519aa203223bace28550cf6476c9a65df9a5ba5a9fcf1942","Cargo.lock":"98d5ac2dc865a84afed79f2b7895587f3ed122743c5a751061ab284f3f20b836","Cargo.toml":"9058af16cf241fc0cf0e00226fefe07ba8697b7c12b02f641f038b84e758a9bf","LICENSE":"3e99c8c5c7ed0e673ff7ada34f2f91ff090dd19c25040c0ec8a191e0dababef6","LICENSE-APACHE":"3e99c8c5c7ed0e673ff7ada34f2f91ff090dd19c25040c0ec8a191e0dababef6","LICENSE-MIT":"834989c1a573298116f240ba61cca4dece60d84170442dcae8a6f11200f25d94","METADATA":"786f96c92cfa72fb224001a517668268661eb5c87717fb5b1785ee31188b64a1","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"a169de144eb94def02d398ae2cf0be93d1c587021fabec3e7b0e47dfe67c1335","cargo_embargo.json":"47b5961cae22b0b582a8dd82651bfbf99c92a3d2003ee32c511666208375596e","examples/cat.rs":"a7402c4256080130a410f71947dc7710f9f8c91d654878ecd37b887445e16922","src/advice.rs":"77d7888e5e8616154dd41c24b61982b339d855e5cd004db409ba1ae4e5e6a42a","src/lib.rs":"55a87ed3be320d1c0387d8ae77c782395224b2f1cf043cc6ebd4c6c0fb510a8b","src/stub.rs":"92877f7c5675f415390232ea9fc2b7df5ad7409184349ba60a296cdce25c5f6c","src/unix.rs":"b8b055c27b2bbd43fa5a65582f2506b594016092d4598937b1287d0515011e6a","src/windows.rs":"3a6b2ec61a7c34cf73dae792aa5c434a6b1bdc875a52cc0850ab62f46e86d45c"}}
\ No newline at end of file
+{"package":null,"files":{".cargo-checksum.json":"4e4250ae3c2467f0159657019ece7c23dc793ec787b4ed13047f10a9f350f848","Android.bp":"21b7d4c26c090ab87682050682912484dc15f54e46520c5beda5c1e2b3701377","CHANGELOG.md":"64c9a56e0cfa98a4519aa203223bace28550cf6476c9a65df9a5ba5a9fcf1942","Cargo.lock":"98d5ac2dc865a84afed79f2b7895587f3ed122743c5a751061ab284f3f20b836","Cargo.toml":"9058af16cf241fc0cf0e00226fefe07ba8697b7c12b02f641f038b84e758a9bf","LICENSE":"3e99c8c5c7ed0e673ff7ada34f2f91ff090dd19c25040c0ec8a191e0dababef6","LICENSE-APACHE":"3e99c8c5c7ed0e673ff7ada34f2f91ff090dd19c25040c0ec8a191e0dababef6","LICENSE-MIT":"834989c1a573298116f240ba61cca4dece60d84170442dcae8a6f11200f25d94","METADATA":"786f96c92cfa72fb224001a517668268661eb5c87717fb5b1785ee31188b64a1","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"a169de144eb94def02d398ae2cf0be93d1c587021fabec3e7b0e47dfe67c1335","TEST_MAPPING":"9de80dd75c899d27012bb43340c1413ebc8e4bf27737e876a19ddf709a45feb7","cargo_embargo.json":"47b5961cae22b0b582a8dd82651bfbf99c92a3d2003ee32c511666208375596e","examples/cat.rs":"a7402c4256080130a410f71947dc7710f9f8c91d654878ecd37b887445e16922","src/advice.rs":"77d7888e5e8616154dd41c24b61982b339d855e5cd004db409ba1ae4e5e6a42a","src/lib.rs":"55a87ed3be320d1c0387d8ae77c782395224b2f1cf043cc6ebd4c6c0fb510a8b","src/stub.rs":"92877f7c5675f415390232ea9fc2b7df5ad7409184349ba60a296cdce25c5f6c","src/unix.rs":"b8b055c27b2bbd43fa5a65582f2506b594016092d4598937b1287d0515011e6a","src/windows.rs":"3a6b2ec61a7c34cf73dae792aa5c434a6b1bdc875a52cc0850ab62f46e86d45c"}}
\ No newline at end of file
diff --git a/crates/memmap2/TEST_MAPPING b/crates/memmap2/TEST_MAPPING
new file mode 100644
index 0000000..0861505
--- /dev/null
+++ b/crates/memmap2/TEST_MAPPING
@@ -0,0 +1,7 @@
+{
+  "postsubmit": [
+    {
+      "name": "memmap2_test_src_lib"
+    }
+  ]
+}
diff --git a/crates/oneshot-uniffi/.android-checksum.json b/crates/oneshot-uniffi/.android-checksum.json
deleted file mode 100644
index 2602b02..0000000
--- a/crates/oneshot-uniffi/.android-checksum.json
+++ /dev/null
@@ -1 +0,0 @@
-{"package":null,"files":{".cargo-checksum.json":"97e9ebc917ebc5a1954a99514e8f0fd1e614540c47bb33fcf8af0d90cdbf6555","Android.bp":"ca173f9408a99f6a8692ca0f62307c26d00348aeca4c51f5d1df0b784dd36b7d","CHANGELOG.md":"d9b0b57b8de7db3911f8082cb7b4ecbcc3c307a3519d316fe48314a7b118ade4","Cargo.lock":"60e1aa6e73629daed8de4fb4332807565170157456667994260b601eb328ee50","Cargo.toml":"713e9d15175a02ef4d24ef63e5c158c21055e2293b531ca38434b1c533868742","LICENSE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","LICENSE-APACHE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","METADATA":"77ba786845175ab289b2acaaebaf039ea12700f35f087602166b188f03d48faf","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"38ddaffc95777da428fa753c336da71aea887a1b113e6e7e5451ad826aa433fe","TEST_MAPPING":"eb5c12a9af352a99871e8d9ffe1b736d5cce107639e6612f4843787cf579b5ca","benches/benches.rs":"6cda18db6d7d776f3bb658ec24f3cf9f894638ce7f80b6c7efeb4c51f5d6bce8","cargo_embargo.json":"4a057fe782470d9f805e92bfc20dd94ec1611400c1c0aa1158e28c906a3cae58","check_mem_leaks.sh":"23bf513520df53e850c45b040bdedfe7ef400ef7ce5e684e76fec7a46e2782b6","examples/recv_before_send.rs":"7255b86ec16a888f4a94a16dbce9e9b7be7d46f3d45c0817ecc6f8cc88df7f5e","examples/recv_before_send_then_drop_sender.rs":"e37820a857962115aff65b2e785d962e864c41513bb084ac767eec4c770e1214","examples/recv_ref_before_send.rs":"27c989bb61ffc81e6ed5a2cbe07bc542d2dc6d37f32fc1d8e871f3d9495f8756","examples/recv_ref_before_send_then_drop_sender.rs":"cf2e9b0c6b0ce9f1128a48d1fd1e8a8c544bf15ff3bd7e5c6e1c786ba955436f","examples/recv_timeout_before_send.rs":"c74fd40ecedb1cf32c8e042d7a61de30265967e437cc4ef666471d64d69241b8","examples/recv_timeout_before_send_then_drop_sender.rs":"d88caf6e8b5d4988f1041884ac1d6f6cb1ab7441704394cb52aaa5d73d60fee3","examples/recv_with_dropped_sender.rs":"64e4c67ef874a72cf96330c89dab67e0750d7fa4134eea8d6ea5b8ca9f29ed19","examples/send_before_recv.rs":"474bd3ccf10a21d98e00f20f61e58acda51c657e3abc4bc9c82be24794a53720","examples/send_then_drop_receiver.rs":"72fdde1da2ce6384965af5f847e8c1d66b54f70490f9524ae8e1b0fc0fd6e20d","examples/send_with_dropped_receiver.rs":"e0c41d03786f9c9d335007499265e1ff366a3aaa00db7f6d65777f0ccd9a7504","patches/Android.bp.patch":"67de9c27be28fbb24e659edf84c344497ab37aa4713b6a89c607b0d8e1edd774","patches/disable-async-tests.patch":"f451a931be893b64a7116b0eaa3863499293b65c348fd3912a76cd4ee4ce48d8","patches/license.patch":"f0d3aa482e73dba3b94f665d0758ebe8025a237401359b8b371e22b5a74de3f2","src/errors.rs":"2e6b6fcb504153ceb7c7c1704010462f5ecf4df70ca3158867807290529ef70b","src/lib.rs":"2834429368501928aed79c9bea22658206f1f2b0e2b74ec5e4ca17530358692e","src/loombox.rs":"39447fa245c5a71f90eb950ad1987df53d367efc5f6e7430a13985b660a8a238","tests/assert_mem.rs":"c1ce6423c3e9bfa92919f4a299975b12f54e283fef2efcd886bf3399357a7aca","tests/async.rs":"b094de28123adf79cd294865f82ac256f1c44e255e83ab957d6af63370bb97ab","tests/future.rs":"9ee7db73abd38d68a79f6e5b6ab9947bc6dae050323a7974d85414a5f83b0bbb","tests/helpers/mod.rs":"46468f5c6893f0d8afe4d5cfe433a702e5afa21549068db8f3367aa9eae1054b","tests/helpers/waker.rs":"ac20f1299cac10ef31688a5a740fab86619f9b179c7c805cab350b7cb7b474d1","tests/loom.rs":"c78ec70adc87238da39defd49ae27c29cf2549cdec06248de2b19676b90cf8b2","tests/raw.rs":"16f5bb3df24c4fccb25647ec7348a8eba8af14b70123d2802d21a548c46d7318","tests/sync.rs":"24a6d27af8eef4a263c084b1a797ae5dd3ad4940a2598208af71e9fa764f1971"}}
\ No newline at end of file
diff --git a/crates/oneshot-uniffi/.cargo-checksum.json b/crates/oneshot-uniffi/.cargo-checksum.json
deleted file mode 100644
index 985bede..0000000
--- a/crates/oneshot-uniffi/.cargo-checksum.json
+++ /dev/null
@@ -1 +0,0 @@
-{"files":{"CHANGELOG.md":"4ad03d95d5532e8f2551e3e53877e6347c04c32f479c4edf517244ecd5921ac7","Cargo.lock":"5d85bcfda2ee559d243099fb26f3724ae239777d891e780a924804e30f6733ad","Cargo.toml":"07a73ff74274df3a7439fccc8acfe306fae0f51ad79a80edbc54b51a730314c0","README.md":"811ea1c958d5a65583d0223b7ab09bb282e7a51ed60f9a2cb90ef6d555325a68","benches/benches.rs":"67dcc916d0b7e28e396c28dac0499726366e1cb10e9991948d1c881a5abf5faa","check_mem_leaks.sh":"c1ab6ef27997c7f971352ab1c86a184004843c499bc24925da953aefcf1c624c","examples/recv_before_send.rs":"9a3cabcc2878990b61787d0048061b382555a8cd1a08b1ddec63a6e8a4a31e56","examples/recv_before_send_then_drop_sender.rs":"14706c6b4308a690662ceaa47f1699588bd833b3ec020eb9f42f220f3ffc7ae7","examples/recv_ref_before_send.rs":"43699f4720c46b5f138c260b866eb708ddf616e2b442ffa74a97373f4f48d4d0","examples/recv_ref_before_send_then_drop_sender.rs":"a190ed220cb4288d4965485365c9afaed30535cbfad5f8cb7389071b82d67cac","examples/recv_timeout_before_send.rs":"2262aa6531afce7816d43182ad9cbec2c04f3dc129064e11e89452278ce8b163","examples/recv_timeout_before_send_then_drop_sender.rs":"4cc8eade4c211f52f5b9be0f72a5906689b894490f4cb5255525e44106e7a4a8","examples/recv_with_dropped_sender.rs":"7906685053ce1c53ff6c26ce11d3221d4bf5ca3429d1d4d2c28de9237cb151c6","examples/send_before_recv.rs":"5555bd61ad52273b663007794128d8f012fc54272bd3225259b5546221bcd591","examples/send_then_drop_receiver.rs":"c3612de207309098404b057468687a2d2311d07f354b7e046398e35e93c4cdcf","examples/send_with_dropped_receiver.rs":"f5a7762b231a24a0db4397c5139437cba155d09b9dbb59872d662c7923080706","src/errors.rs":"a5aa56bc497dccdbdbe15b9070360f50835c762f11be4ee96e0d25b150168ac9","src/lib.rs":"4bef3602ff4f5d2b42ce963d722a48c9ff07275e75ef6bed7b523e8f45e459fe","src/loombox.rs":"fc85d1c2d3fda432be60f0c4d1d528e5998ec2b738a5b395a242285051b94d65","tests/assert_mem.rs":"b1e5190af01af22e55c7c1cd1ff2711807591f788e4eb8b6c6d89123e146105e","tests/async.rs":"6fd2826e589b94677d4eeed1080deda8bcc429aa05a20d843d1442a3a48ea757","tests/future.rs":"0e71f0293cd5a8c44210e8882aca20cfbf1e3771ecd4e4f6b59b924c0d01dd97","tests/helpers/mod.rs":"19161ed33e0ba8862746f04678d0606dee90205896083f85d8c1dcd4d211ccb0","tests/helpers/waker.rs":"77494d49f62d0d320df3830643c306e06e6e20751d210cf6fa58b238bd96c3f9","tests/loom.rs":"ea350fa424a95581e1871bc0037badecc5a090f28fd10532917abbaf561218ab","tests/raw.rs":"5564615fea811b0061d8ad801356e60e0018ec4e3fb99cc739287ed5b96cb7cf","tests/sync.rs":"1186fa6cdb5a180944fa7d793ccb8be412c4a4e88bb504daa70bc097ee081b06"},"package":"6c548d5c78976f6955d72d0ced18c48ca07030f7a1d4024529fedd7c1c01b29c"}
\ No newline at end of file
diff --git a/crates/oneshot-uniffi/Android.bp b/crates/oneshot-uniffi/Android.bp
deleted file mode 100644
index e131a92..0000000
--- a/crates/oneshot-uniffi/Android.bp
+++ /dev/null
@@ -1,210 +0,0 @@
-// This file is generated by cargo_embargo.
-// Do not modify this file because the changes will be overridden on upgrade.
-
-package {
-    default_applicable_licenses: ["external_rust_crates_oneshot-uniffi_license"],
-    default_team: "trendy_team_android_rust",
-}
-
-license {
-    name: "external_rust_crates_oneshot-uniffi_license",
-    visibility: [":__subpackages__"],
-    license_kinds: ["SPDX-license-identifier-Apache-2.0"],
-    license_text: ["LICENSE"],
-}
-
-rust_library {
-    name: "liboneshot_uniffi",
-    host_supported: true,
-    crate_name: "oneshot",
-    cargo_env_compat: true,
-    cargo_pkg_version: "0.1.6",
-    crate_root: "src/lib.rs",
-    edition: "2021",
-    features: [
-        "async",
-        "default",
-        "std",
-    ],
-    apex_available: [
-        "//apex_available:platform",
-        "//apex_available:anyapex",
-    ],
-    product_available: true,
-    vendor_available: true,
-    visibility: ["//external/rust/android-crates-io/crates/uniffi_core"],
-}
-
-rust_test {
-    name: "oneshot-uniffi_test_src_lib",
-    host_supported: true,
-    crate_name: "oneshot_uniffi",
-    cargo_env_compat: true,
-    cargo_pkg_version: "0.1.6",
-    crate_root: "src/lib.rs",
-    test_suites: ["general-tests"],
-    auto_gen_config: true,
-    test_options: {
-        unit_test: true,
-    },
-    edition: "2021",
-    features: [
-        "async",
-        "default",
-        "std",
-    ],
-    rustlibs: [
-        "libcriterion",
-        "libtokio",
-    ],
-}
-
-rust_test {
-    name: "oneshot-uniffi_test_tests_assert_mem",
-    host_supported: true,
-    crate_name: "assert_mem",
-    cargo_env_compat: true,
-    cargo_pkg_version: "0.1.6",
-    crate_root: "tests/assert_mem.rs",
-    test_suites: ["general-tests"],
-    auto_gen_config: true,
-    test_options: {
-        unit_test: true,
-    },
-    edition: "2021",
-    features: [
-        "async",
-        "default",
-        "std",
-    ],
-    rustlibs: [
-        "libcriterion",
-        "liboneshot_uniffi",
-        "libtokio",
-    ],
-}
-
-rust_test {
-    name: "oneshot-uniffi_test_tests_async",
-    host_supported: true,
-    crate_name: "async",
-    cargo_env_compat: true,
-    cargo_pkg_version: "0.1.6",
-    crate_root: "tests/async.rs",
-    test_suites: ["general-tests"],
-    auto_gen_config: true,
-    test_options: {
-        unit_test: true,
-    },
-    edition: "2021",
-    features: [
-        "async",
-        "default",
-        "std",
-    ],
-    rustlibs: [
-        "libcriterion",
-        "liboneshot_uniffi",
-        "libtokio",
-    ],
-}
-
-rust_test {
-    name: "oneshot-uniffi_test_tests_future",
-    host_supported: true,
-    crate_name: "future",
-    cargo_env_compat: true,
-    cargo_pkg_version: "0.1.6",
-    crate_root: "tests/future.rs",
-    test_suites: ["general-tests"],
-    auto_gen_config: true,
-    test_options: {
-        unit_test: true,
-    },
-    edition: "2021",
-    features: [
-        "async",
-        "default",
-        "std",
-    ],
-    rustlibs: [
-        "libcriterion",
-        "liboneshot_uniffi",
-        "libtokio",
-    ],
-}
-
-rust_test {
-    name: "oneshot-uniffi_test_tests_loom",
-    host_supported: true,
-    crate_name: "loom",
-    cargo_env_compat: true,
-    cargo_pkg_version: "0.1.6",
-    crate_root: "tests/loom.rs",
-    test_suites: ["general-tests"],
-    auto_gen_config: true,
-    test_options: {
-        unit_test: true,
-    },
-    edition: "2021",
-    features: [
-        "async",
-        "default",
-        "std",
-    ],
-    rustlibs: [
-        "libcriterion",
-        "liboneshot_uniffi",
-        "libtokio",
-    ],
-}
-
-rust_test {
-    name: "oneshot-uniffi_test_tests_raw",
-    host_supported: true,
-    crate_name: "raw",
-    cargo_env_compat: true,
-    cargo_pkg_version: "0.1.6",
-    crate_root: "tests/raw.rs",
-    test_suites: ["general-tests"],
-    auto_gen_config: true,
-    test_options: {
-        unit_test: true,
-    },
-    edition: "2021",
-    features: [
-        "async",
-        "default",
-        "std",
-    ],
-    rustlibs: [
-        "libcriterion",
-        "liboneshot_uniffi",
-        "libtokio",
-    ],
-}
-
-rust_test {
-    name: "oneshot-uniffi_test_tests_sync",
-    host_supported: true,
-    crate_name: "sync",
-    cargo_env_compat: true,
-    cargo_pkg_version: "0.1.6",
-    crate_root: "tests/sync.rs",
-    test_suites: ["general-tests"],
-    auto_gen_config: true,
-    test_options: {
-        unit_test: true,
-    },
-    edition: "2021",
-    features: [
-        "async",
-        "default",
-        "std",
-    ],
-    rustlibs: [
-        "libcriterion",
-        "liboneshot_uniffi",
-        "libtokio",
-    ],
-}
diff --git a/crates/oneshot-uniffi/CHANGELOG.md b/crates/oneshot-uniffi/CHANGELOG.md
deleted file mode 100644
index c4c9283..0000000
--- a/crates/oneshot-uniffi/CHANGELOG.md
+++ /dev/null
@@ -1,69 +0,0 @@
-# Changelog
-All notable changes to this project will be documented in this file.
-
-The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
-and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
-
-### Categories each change fall into
-
-* **Added**: for new features.
-* **Changed**: for changes in existing functionality.
-* **Deprecated**: for soon-to-be removed features.
-* **Removed**: for now removed features.
-* **Fixed**: for any bug fixes.
-* **Security**: in case of vulnerabilities.
-
-
-## [Unreleased]
-
-
-## [0.1.6] - 2023-09-14
-### Added
-* Add `into_raw` and `from_raw` methods on both `Sender` and `Receiver`. Allows passing `oneshot`
-  channels over FFI without an extra layer of heap allocation.
-
-
-## [0.1.5] - 2022-09-01
-### Fixed
-- Handle the UNPARKING state correctly in all recv methods. `try_recv` will now not panic
-  if used on a `Receiver` that is being unparked from an async wait. The other `recv` methods
-  will still panic (as they should), but with a better error message.
-
-
-## [0.1.4] - 2022-08-30
-### Changed
-- Upgrade to Rust edition 2021. Also increases the MSRV to Rust 1.60.
-- Add null-pointer optimization to `Sender`, `Receiver` and `SendError`.
-  This reduces the call stack size of Sender::send and it makes
-  `Option<Sender>` and `Option<Receiver>` pointer sized (#18).
-- Relax the memory ordering of all atomic operations from `SeqCst` to the most appropriate
-  lower ordering (#17 + #20).
-
-### Fixed
-- Fix undefined behavior due to multiple mutable references to the same channel instance (#18).
-- Fix race condition that could happen during unparking of a receiving `Receiver` (#17 + #20).
-
-
-## [0.1.3] - 2021-11-23
-### Fixed
-- Keep the *last* `Waker` in `Future::poll`, not the *first* one. Stops breaking the contract
-  on how futures should work.
-
-
-## [0.1.2] - 2020-08-11
-### Fixed
-- Fix unreachable code panic that happened if the `Receiver` of an empty but open channel was
-  polled and then dropped.
-
-
-## [0.1.1] - 2020-05-10
-Initial implementation. Supports basically all the (for now) intended functionality.
-Sender is as lock-free as I think it can get and the receiver can both do thread blocking
-and be awaited asynchronously. The receiver also has a wait-free `try_recv` method.
-
-The crate has two features. They are activated by default, but the user can opt out of async
-support as well as usage of libstd (making the crate `no_std` but still requiring liballoc)
-
-
-## [0.1.0] - 2019-05-30
-Name reserved on crate.io by someone other than the author of this crate.
diff --git a/crates/oneshot-uniffi/Cargo.lock b/crates/oneshot-uniffi/Cargo.lock
deleted file mode 100644
index b716449..0000000
--- a/crates/oneshot-uniffi/Cargo.lock
+++ /dev/null
@@ -1,1118 +0,0 @@
-# This file is automatically @generated by Cargo.
-# It is not intended for manual editing.
-version = 3
-
-[[package]]
-name = "addr2line"
-version = "0.21.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb"
-dependencies = [
- "gimli",
-]
-
-[[package]]
-name = "adler"
-version = "1.0.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
-
-[[package]]
-name = "aho-corasick"
-version = "1.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6748e8def348ed4d14996fa801f4122cd763fff530258cdc03f64b25f89d3a5a"
-dependencies = [
- "memchr",
-]
-
-[[package]]
-name = "async-attributes"
-version = "1.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a3203e79f4dd9bdda415ed03cf14dae5a2bf775c683a00f94e9cd1faf0f596e5"
-dependencies = [
- "quote",
- "syn 1.0.109",
-]
-
-[[package]]
-name = "async-channel"
-version = "1.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35"
-dependencies = [
- "concurrent-queue",
- "event-listener",
- "futures-core",
-]
-
-[[package]]
-name = "async-executor"
-version = "1.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6fa3dc5f2a8564f07759c008b9109dc0d39de92a88d5588b8a5036d286383afb"
-dependencies = [
- "async-lock",
- "async-task",
- "concurrent-queue",
- "fastrand",
- "futures-lite",
- "slab",
-]
-
-[[package]]
-name = "async-global-executor"
-version = "2.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f1b6f5d7df27bd294849f8eec66ecfc63d11814df7a4f5d74168a2394467b776"
-dependencies = [
- "async-channel",
- "async-executor",
- "async-io",
- "async-lock",
- "blocking",
- "futures-lite",
- "once_cell",
-]
-
-[[package]]
-name = "async-io"
-version = "1.13.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af"
-dependencies = [
- "async-lock",
- "autocfg",
- "cfg-if",
- "concurrent-queue",
- "futures-lite",
- "log",
- "parking",
- "polling",
- "rustix",
- "slab",
- "socket2",
- "waker-fn",
-]
-
-[[package]]
-name = "async-lock"
-version = "2.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b"
-dependencies = [
- "event-listener",
-]
-
-[[package]]
-name = "async-std"
-version = "1.12.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "62565bb4402e926b29953c785397c6dc0391b7b446e45008b0049eb43cec6f5d"
-dependencies = [
- "async-attributes",
- "async-channel",
- "async-global-executor",
- "async-io",
- "async-lock",
- "crossbeam-utils",
- "futures-channel",
- "futures-core",
- "futures-io",
- "futures-lite",
- "gloo-timers",
- "kv-log-macro",
- "log",
- "memchr",
- "once_cell",
- "pin-project-lite",
- "pin-utils",
- "slab",
- "wasm-bindgen-futures",
-]
-
-[[package]]
-name = "async-task"
-version = "4.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ecc7ab41815b3c653ccd2978ec3255c81349336702dfdf62ee6f7069b12a3aae"
-
-[[package]]
-name = "atomic-waker"
-version = "1.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1181e1e0d1fce796a03db1ae795d67167da795f9cf4a39c37589e85ef57f26d3"
-
-[[package]]
-name = "atty"
-version = "0.2.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
-dependencies = [
- "hermit-abi 0.1.19",
- "libc",
- "winapi",
-]
-
-[[package]]
-name = "autocfg"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
-
-[[package]]
-name = "backtrace"
-version = "0.3.69"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837"
-dependencies = [
- "addr2line",
- "cc",
- "cfg-if",
- "libc",
- "miniz_oxide",
- "object",
- "rustc-demangle",
-]
-
-[[package]]
-name = "bitflags"
-version = "1.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
-
-[[package]]
-name = "blocking"
-version = "1.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77231a1c8f801696fc0123ec6150ce92cffb8e164a02afb9c8ddee0e9b65ad65"
-dependencies = [
- "async-channel",
- "async-lock",
- "async-task",
- "atomic-waker",
- "fastrand",
- "futures-lite",
- "log",
-]
-
-[[package]]
-name = "bumpalo"
-version = "3.13.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1"
-
-[[package]]
-name = "cast"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5"
-
-[[package]]
-name = "cc"
-version = "1.0.83"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "cfg-if"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
-
-[[package]]
-name = "clap"
-version = "2.34.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c"
-dependencies = [
- "bitflags",
- "textwrap",
- "unicode-width",
-]
-
-[[package]]
-name = "concurrent-queue"
-version = "2.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "62ec6771ecfa0762d24683ee5a32ad78487a3d3afdc0fb8cae19d2c5deb50b7c"
-dependencies = [
- "crossbeam-utils",
-]
-
-[[package]]
-name = "criterion"
-version = "0.3.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b01d6de93b2b6c65e17c634a26653a29d107b3c98c607c765bf38d041531cd8f"
-dependencies = [
- "atty",
- "cast",
- "clap",
- "criterion-plot",
- "csv",
- "itertools",
- "lazy_static",
- "num-traits",
- "oorandom",
- "plotters",
- "rayon",
- "regex",
- "serde",
- "serde_cbor",
- "serde_derive",
- "serde_json",
- "tinytemplate",
- "walkdir",
-]
-
-[[package]]
-name = "criterion-plot"
-version = "0.4.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2673cc8207403546f45f5fd319a974b1e6983ad1a3ee7e6041650013be041876"
-dependencies = [
- "cast",
- "itertools",
-]
-
-[[package]]
-name = "crossbeam-channel"
-version = "0.5.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200"
-dependencies = [
- "cfg-if",
- "crossbeam-utils",
-]
-
-[[package]]
-name = "crossbeam-deque"
-version = "0.8.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef"
-dependencies = [
- "cfg-if",
- "crossbeam-epoch",
- "crossbeam-utils",
-]
-
-[[package]]
-name = "crossbeam-epoch"
-version = "0.9.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7"
-dependencies = [
- "autocfg",
- "cfg-if",
- "crossbeam-utils",
- "memoffset",
- "scopeguard",
-]
-
-[[package]]
-name = "crossbeam-utils"
-version = "0.8.16"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294"
-dependencies = [
- "cfg-if",
-]
-
-[[package]]
-name = "csv"
-version = "1.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "626ae34994d3d8d668f4269922248239db4ae42d538b14c398b74a52208e8086"
-dependencies = [
- "csv-core",
- "itoa",
- "ryu",
- "serde",
-]
-
-[[package]]
-name = "csv-core"
-version = "0.1.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90"
-dependencies = [
- "memchr",
-]
-
-[[package]]
-name = "either"
-version = "1.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07"
-
-[[package]]
-name = "errno"
-version = "0.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "136526188508e25c6fef639d7927dfb3e0e3084488bf202267829cf7fc23dbdd"
-dependencies = [
- "errno-dragonfly",
- "libc",
- "windows-sys",
-]
-
-[[package]]
-name = "errno-dragonfly"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf"
-dependencies = [
- "cc",
- "libc",
-]
-
-[[package]]
-name = "event-listener"
-version = "2.5.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0"
-
-[[package]]
-name = "fastrand"
-version = "1.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be"
-dependencies = [
- "instant",
-]
-
-[[package]]
-name = "futures-channel"
-version = "0.3.28"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2"
-dependencies = [
- "futures-core",
-]
-
-[[package]]
-name = "futures-core"
-version = "0.3.28"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c"
-
-[[package]]
-name = "futures-io"
-version = "0.3.28"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964"
-
-[[package]]
-name = "futures-lite"
-version = "1.13.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce"
-dependencies = [
- "fastrand",
- "futures-core",
- "futures-io",
- "memchr",
- "parking",
- "pin-project-lite",
- "waker-fn",
-]
-
-[[package]]
-name = "gimli"
-version = "0.28.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0"
-
-[[package]]
-name = "gloo-timers"
-version = "0.2.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c"
-dependencies = [
- "futures-channel",
- "futures-core",
- "js-sys",
- "wasm-bindgen",
-]
-
-[[package]]
-name = "half"
-version = "1.8.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7"
-
-[[package]]
-name = "hermit-abi"
-version = "0.1.19"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "hermit-abi"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b"
-
-[[package]]
-name = "instant"
-version = "0.1.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
-dependencies = [
- "cfg-if",
-]
-
-[[package]]
-name = "io-lifetimes"
-version = "1.0.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2"
-dependencies = [
- "hermit-abi 0.3.2",
- "libc",
- "windows-sys",
-]
-
-[[package]]
-name = "itertools"
-version = "0.10.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"
-dependencies = [
- "either",
-]
-
-[[package]]
-name = "itoa"
-version = "1.0.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38"
-
-[[package]]
-name = "js-sys"
-version = "0.3.64"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a"
-dependencies = [
- "wasm-bindgen",
-]
-
-[[package]]
-name = "kv-log-macro"
-version = "1.0.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f"
-dependencies = [
- "log",
-]
-
-[[package]]
-name = "lazy_static"
-version = "1.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
-
-[[package]]
-name = "libc"
-version = "0.2.147"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3"
-
-[[package]]
-name = "linux-raw-sys"
-version = "0.3.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519"
-
-[[package]]
-name = "log"
-version = "0.4.20"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f"
-dependencies = [
- "value-bag",
-]
-
-[[package]]
-name = "memchr"
-version = "2.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "76fc44e2588d5b436dbc3c6cf62aef290f90dab6235744a93dfe1cc18f451e2c"
-
-[[package]]
-name = "memoffset"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c"
-dependencies = [
- "autocfg",
-]
-
-[[package]]
-name = "miniz_oxide"
-version = "0.7.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7"
-dependencies = [
- "adler",
-]
-
-[[package]]
-name = "num-traits"
-version = "0.2.16"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2"
-dependencies = [
- "autocfg",
-]
-
-[[package]]
-name = "num_cpus"
-version = "1.16.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43"
-dependencies = [
- "hermit-abi 0.3.2",
- "libc",
-]
-
-[[package]]
-name = "object"
-version = "0.32.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77ac5bbd07aea88c60a577a1ce218075ffd59208b2d7ca97adf9bfc5aeb21ebe"
-dependencies = [
- "memchr",
-]
-
-[[package]]
-name = "once_cell"
-version = "1.18.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d"
-
-[[package]]
-name = "oneshot-uniffi"
-version = "0.1.6"
-dependencies = [
- "async-std",
- "criterion",
- "tokio",
-]
-
-[[package]]
-name = "oorandom"
-version = "11.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575"
-
-[[package]]
-name = "parking"
-version = "2.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "14f2252c834a40ed9bb5422029649578e63aa341ac401f74e719dd1afda8394e"
-
-[[package]]
-name = "pin-project-lite"
-version = "0.2.13"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58"
-
-[[package]]
-name = "pin-utils"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
-
-[[package]]
-name = "plotters"
-version = "0.3.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d2c224ba00d7cadd4d5c660deaf2098e5e80e07846537c51f9cfa4be50c1fd45"
-dependencies = [
- "num-traits",
- "plotters-backend",
- "plotters-svg",
- "wasm-bindgen",
- "web-sys",
-]
-
-[[package]]
-name = "plotters-backend"
-version = "0.3.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9e76628b4d3a7581389a35d5b6e2139607ad7c75b17aed325f210aa91f4a9609"
-
-[[package]]
-name = "plotters-svg"
-version = "0.3.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "38f6d39893cca0701371e3c27294f09797214b86f1fb951b89ade8ec04e2abab"
-dependencies = [
- "plotters-backend",
-]
-
-[[package]]
-name = "polling"
-version = "2.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce"
-dependencies = [
- "autocfg",
- "bitflags",
- "cfg-if",
- "concurrent-queue",
- "libc",
- "log",
- "pin-project-lite",
- "windows-sys",
-]
-
-[[package]]
-name = "proc-macro2"
-version = "1.0.66"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9"
-dependencies = [
- "unicode-ident",
-]
-
-[[package]]
-name = "quote"
-version = "1.0.33"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
-dependencies = [
- "proc-macro2",
-]
-
-[[package]]
-name = "rayon"
-version = "1.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b"
-dependencies = [
- "either",
- "rayon-core",
-]
-
-[[package]]
-name = "rayon-core"
-version = "1.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d"
-dependencies = [
- "crossbeam-channel",
- "crossbeam-deque",
- "crossbeam-utils",
- "num_cpus",
-]
-
-[[package]]
-name = "regex"
-version = "1.9.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "12de2eff854e5fa4b1295edd650e227e9d8fb0c9e90b12e7f36d6a6811791a29"
-dependencies = [
- "aho-corasick",
- "memchr",
- "regex-automata",
- "regex-syntax",
-]
-
-[[package]]
-name = "regex-automata"
-version = "0.3.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49530408a136e16e5b486e883fbb6ba058e8e4e8ae6621a77b048b314336e629"
-dependencies = [
- "aho-corasick",
- "memchr",
- "regex-syntax",
-]
-
-[[package]]
-name = "regex-syntax"
-version = "0.7.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da"
-
-[[package]]
-name = "rustc-demangle"
-version = "0.1.23"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
-
-[[package]]
-name = "rustix"
-version = "0.37.23"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4d69718bf81c6127a49dc64e44a742e8bb9213c0ff8869a22c308f84c1d4ab06"
-dependencies = [
- "bitflags",
- "errno",
- "io-lifetimes",
- "libc",
- "linux-raw-sys",
- "windows-sys",
-]
-
-[[package]]
-name = "ryu"
-version = "1.0.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741"
-
-[[package]]
-name = "same-file"
-version = "1.0.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
-dependencies = [
- "winapi-util",
-]
-
-[[package]]
-name = "scopeguard"
-version = "1.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
-
-[[package]]
-name = "serde"
-version = "1.0.188"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e"
-dependencies = [
- "serde_derive",
-]
-
-[[package]]
-name = "serde_cbor"
-version = "0.11.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2bef2ebfde456fb76bbcf9f59315333decc4fda0b2b44b420243c11e0f5ec1f5"
-dependencies = [
- "half",
- "serde",
-]
-
-[[package]]
-name = "serde_derive"
-version = "1.0.188"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.29",
-]
-
-[[package]]
-name = "serde_json"
-version = "1.0.105"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "693151e1ac27563d6dbcec9dee9fbd5da8539b20fa14ad3752b2e6d363ace360"
-dependencies = [
- "itoa",
- "ryu",
- "serde",
-]
-
-[[package]]
-name = "slab"
-version = "0.4.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67"
-dependencies = [
- "autocfg",
-]
-
-[[package]]
-name = "socket2"
-version = "0.4.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662"
-dependencies = [
- "libc",
- "winapi",
-]
-
-[[package]]
-name = "syn"
-version = "1.0.109"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
-dependencies = [
- "proc-macro2",
- "quote",
- "unicode-ident",
-]
-
-[[package]]
-name = "syn"
-version = "2.0.29"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a"
-dependencies = [
- "proc-macro2",
- "quote",
- "unicode-ident",
-]
-
-[[package]]
-name = "textwrap"
-version = "0.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
-dependencies = [
- "unicode-width",
-]
-
-[[package]]
-name = "tinytemplate"
-version = "1.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc"
-dependencies = [
- "serde",
- "serde_json",
-]
-
-[[package]]
-name = "tokio"
-version = "1.32.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "17ed6077ed6cd6c74735e21f37eb16dc3935f96878b1fe961074089cc80893f9"
-dependencies = [
- "backtrace",
- "num_cpus",
- "pin-project-lite",
- "tokio-macros",
-]
-
-[[package]]
-name = "tokio-macros"
-version = "2.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.29",
-]
-
-[[package]]
-name = "unicode-ident"
-version = "1.0.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c"
-
-[[package]]
-name = "unicode-width"
-version = "0.1.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b"
-
-[[package]]
-name = "value-bag"
-version = "1.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d92ccd67fb88503048c01b59152a04effd0782d035a83a6d256ce6085f08f4a3"
-
-[[package]]
-name = "waker-fn"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca"
-
-[[package]]
-name = "walkdir"
-version = "2.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698"
-dependencies = [
- "same-file",
- "winapi-util",
-]
-
-[[package]]
-name = "wasm-bindgen"
-version = "0.2.87"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342"
-dependencies = [
- "cfg-if",
- "wasm-bindgen-macro",
-]
-
-[[package]]
-name = "wasm-bindgen-backend"
-version = "0.2.87"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd"
-dependencies = [
- "bumpalo",
- "log",
- "once_cell",
- "proc-macro2",
- "quote",
- "syn 2.0.29",
- "wasm-bindgen-shared",
-]
-
-[[package]]
-name = "wasm-bindgen-futures"
-version = "0.4.37"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03"
-dependencies = [
- "cfg-if",
- "js-sys",
- "wasm-bindgen",
- "web-sys",
-]
-
-[[package]]
-name = "wasm-bindgen-macro"
-version = "0.2.87"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d"
-dependencies = [
- "quote",
- "wasm-bindgen-macro-support",
-]
-
-[[package]]
-name = "wasm-bindgen-macro-support"
-version = "0.2.87"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.29",
- "wasm-bindgen-backend",
- "wasm-bindgen-shared",
-]
-
-[[package]]
-name = "wasm-bindgen-shared"
-version = "0.2.87"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1"
-
-[[package]]
-name = "web-sys"
-version = "0.3.64"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b"
-dependencies = [
- "js-sys",
- "wasm-bindgen",
-]
-
-[[package]]
-name = "winapi"
-version = "0.3.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
-dependencies = [
- "winapi-i686-pc-windows-gnu",
- "winapi-x86_64-pc-windows-gnu",
-]
-
-[[package]]
-name = "winapi-i686-pc-windows-gnu"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
-
-[[package]]
-name = "winapi-util"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
-dependencies = [
- "winapi",
-]
-
-[[package]]
-name = "winapi-x86_64-pc-windows-gnu"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
-
-[[package]]
-name = "windows-sys"
-version = "0.48.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
-dependencies = [
- "windows-targets",
-]
-
-[[package]]
-name = "windows-targets"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
-dependencies = [
- "windows_aarch64_gnullvm",
- "windows_aarch64_msvc",
- "windows_i686_gnu",
- "windows_i686_msvc",
- "windows_x86_64_gnu",
- "windows_x86_64_gnullvm",
- "windows_x86_64_msvc",
-]
-
-[[package]]
-name = "windows_aarch64_gnullvm"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
-
-[[package]]
-name = "windows_aarch64_msvc"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
-
-[[package]]
-name = "windows_i686_gnu"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
-
-[[package]]
-name = "windows_i686_msvc"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
-
-[[package]]
-name = "windows_x86_64_gnu"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
-
-[[package]]
-name = "windows_x86_64_gnullvm"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
-
-[[package]]
-name = "windows_x86_64_msvc"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
diff --git a/crates/oneshot-uniffi/Cargo.toml b/crates/oneshot-uniffi/Cargo.toml
deleted file mode 100644
index cba7266..0000000
--- a/crates/oneshot-uniffi/Cargo.toml
+++ /dev/null
@@ -1,64 +0,0 @@
-# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
-#
-# When uploading crates to the registry Cargo will automatically
-# "normalize" Cargo.toml files for maximal compatibility
-# with all versions of Cargo and also rewrite `path` dependencies
-# to registry (e.g., crates.io) dependencies.
-#
-# If you are reading this file be aware that the original Cargo.toml
-# will likely look very different (and much more reasonable).
-# See Cargo.toml.orig for the original contents.
-
-[package]
-edition = "2021"
-rust-version = "1.60.0"
-name = "oneshot-uniffi"
-version = "0.1.6"
-authors = ["Linus Färnstrand <[email protected]>"]
-description = """
-Patched version of oneshot specifically for the UniFFI project.
-
-This removes the `loom` target and dependency which helps with UniFFI's downstream consumers.
-"""
-readme = "README.md"
-keywords = [
-    "oneshot",
-    "spsc",
-    "async",
-    "sync",
-    "channel",
-]
-categories = [
-    "asynchronous",
-    "concurrency",
-]
-license = "MIT OR Apache-2.0"
-repository = "https://github.com/faern/oneshot"
-
-[[bench]]
-name = "benches"
-harness = false
-
-[dev-dependencies.async-std]
-version = "1"
-features = ["attributes"]
-
-[dev-dependencies.criterion]
-version = "0.3"
-
-[dev-dependencies.tokio]
-version = "1"
-features = [
-    "rt",
-    "rt-multi-thread",
-    "macros",
-    "time",
-]
-
-[features]
-async = []
-default = [
-    "std",
-    "async",
-]
-std = []
diff --git a/crates/oneshot-uniffi/LICENSE b/crates/oneshot-uniffi/LICENSE
deleted file mode 120000
index 6b579aa..0000000
--- a/crates/oneshot-uniffi/LICENSE
+++ /dev/null
@@ -1 +0,0 @@
-LICENSE-APACHE
\ No newline at end of file
diff --git a/crates/oneshot-uniffi/LICENSE-APACHE b/crates/oneshot-uniffi/LICENSE-APACHE
deleted file mode 100644
index 16fe87b..0000000
--- a/crates/oneshot-uniffi/LICENSE-APACHE
+++ /dev/null
@@ -1,201 +0,0 @@
-                              Apache License
-                        Version 2.0, January 2004
-                     http://www.apache.org/licenses/
-
-TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-1. Definitions.
-
-   "License" shall mean the terms and conditions for use, reproduction,
-   and distribution as defined by Sections 1 through 9 of this document.
-
-   "Licensor" shall mean the copyright owner or entity authorized by
-   the copyright owner that is granting the License.
-
-   "Legal Entity" shall mean the union of the acting entity and all
-   other entities that control, are controlled by, or are under common
-   control with that entity. For the purposes of this definition,
-   "control" means (i) the power, direct or indirect, to cause the
-   direction or management of such entity, whether by contract or
-   otherwise, or (ii) ownership of fifty percent (50%) or more of the
-   outstanding shares, or (iii) beneficial ownership of such entity.
-
-   "You" (or "Your") shall mean an individual or Legal Entity
-   exercising permissions granted by this License.
-
-   "Source" form shall mean the preferred form for making modifications,
-   including but not limited to software source code, documentation
-   source, and configuration files.
-
-   "Object" form shall mean any form resulting from mechanical
-   transformation or translation of a Source form, including but
-   not limited to compiled object code, generated documentation,
-   and conversions to other media types.
-
-   "Work" shall mean the work of authorship, whether in Source or
-   Object form, made available under the License, as indicated by a
-   copyright notice that is included in or attached to the work
-   (an example is provided in the Appendix below).
-
-   "Derivative Works" shall mean any work, whether in Source or Object
-   form, that is based on (or derived from) the Work and for which the
-   editorial revisions, annotations, elaborations, or other modifications
-   represent, as a whole, an original work of authorship. For the purposes
-   of this License, Derivative Works shall not include works that remain
-   separable from, or merely link (or bind by name) to the interfaces of,
-   the Work and Derivative Works thereof.
-
-   "Contribution" shall mean any work of authorship, including
-   the original version of the Work and any modifications or additions
-   to that Work or Derivative Works thereof, that is intentionally
-   submitted to Licensor for inclusion in the Work by the copyright owner
-   or by an individual or Legal Entity authorized to submit on behalf of
-   the copyright owner. For the purposes of this definition, "submitted"
-   means any form of electronic, verbal, or written communication sent
-   to the Licensor or its representatives, including but not limited to
-   communication on electronic mailing lists, source code control systems,
-   and issue tracking systems that are managed by, or on behalf of, the
-   Licensor for the purpose of discussing and improving the Work, but
-   excluding communication that is conspicuously marked or otherwise
-   designated in writing by the copyright owner as "Not a Contribution."
-
-   "Contributor" shall mean Licensor and any individual or Legal Entity
-   on behalf of whom a Contribution has been received by Licensor and
-   subsequently incorporated within the Work.
-
-2. Grant of Copyright License. Subject to the terms and conditions of
-   this License, each Contributor hereby grants to You a perpetual,
-   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-   copyright license to reproduce, prepare Derivative Works of,
-   publicly display, publicly perform, sublicense, and distribute the
-   Work and such Derivative Works in Source or Object form.
-
-3. Grant of Patent License. Subject to the terms and conditions of
-   this License, each Contributor hereby grants to You a perpetual,
-   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-   (except as stated in this section) patent license to make, have made,
-   use, offer to sell, sell, import, and otherwise transfer the Work,
-   where such license applies only to those patent claims licensable
-   by such Contributor that are necessarily infringed by their
-   Contribution(s) alone or by combination of their Contribution(s)
-   with the Work to which such Contribution(s) was submitted. If You
-   institute patent litigation against any entity (including a
-   cross-claim or counterclaim in a lawsuit) alleging that the Work
-   or a Contribution incorporated within the Work constitutes direct
-   or contributory patent infringement, then any patent licenses
-   granted to You under this License for that Work shall terminate
-   as of the date such litigation is filed.
-
-4. Redistribution. You may reproduce and distribute copies of the
-   Work or Derivative Works thereof in any medium, with or without
-   modifications, and in Source or Object form, provided that You
-   meet the following conditions:
-
-   (a) You must give any other recipients of the Work or
-       Derivative Works a copy of this License; and
-
-   (b) You must cause any modified files to carry prominent notices
-       stating that You changed the files; and
-
-   (c) You must retain, in the Source form of any Derivative Works
-       that You distribute, all copyright, patent, trademark, and
-       attribution notices from the Source form of the Work,
-       excluding those notices that do not pertain to any part of
-       the Derivative Works; and
-
-   (d) If the Work includes a "NOTICE" text file as part of its
-       distribution, then any Derivative Works that You distribute must
-       include a readable copy of the attribution notices contained
-       within such NOTICE file, excluding those notices that do not
-       pertain to any part of the Derivative Works, in at least one
-       of the following places: within a NOTICE text file distributed
-       as part of the Derivative Works; within the Source form or
-       documentation, if provided along with the Derivative Works; or,
-       within a display generated by the Derivative Works, if and
-       wherever such third-party notices normally appear. The contents
-       of the NOTICE file are for informational purposes only and
-       do not modify the License. You may add Your own attribution
-       notices within Derivative Works that You distribute, alongside
-       or as an addendum to the NOTICE text from the Work, provided
-       that such additional attribution notices cannot be construed
-       as modifying the License.
-
-   You may add Your own copyright statement to Your modifications and
-   may provide additional or different license terms and conditions
-   for use, reproduction, or distribution of Your modifications, or
-   for any such Derivative Works as a whole, provided Your use,
-   reproduction, and distribution of the Work otherwise complies with
-   the conditions stated in this License.
-
-5. Submission of Contributions. Unless You explicitly state otherwise,
-   any Contribution intentionally submitted for inclusion in the Work
-   by You to the Licensor shall be under the terms and conditions of
-   this License, without any additional terms or conditions.
-   Notwithstanding the above, nothing herein shall supersede or modify
-   the terms of any separate license agreement you may have executed
-   with Licensor regarding such Contributions.
-
-6. Trademarks. This License does not grant permission to use the trade
-   names, trademarks, service marks, or product names of the Licensor,
-   except as required for reasonable and customary use in describing the
-   origin of the Work and reproducing the content of the NOTICE file.
-
-7. Disclaimer of Warranty. Unless required by applicable law or
-   agreed to in writing, Licensor provides the Work (and each
-   Contributor provides its Contributions) on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-   implied, including, without limitation, any warranties or conditions
-   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-   PARTICULAR PURPOSE. You are solely responsible for determining the
-   appropriateness of using or redistributing the Work and assume any
-   risks associated with Your exercise of permissions under this License.
-
-8. Limitation of Liability. In no event and under no legal theory,
-   whether in tort (including negligence), contract, or otherwise,
-   unless required by applicable law (such as deliberate and grossly
-   negligent acts) or agreed to in writing, shall any Contributor be
-   liable to You for damages, including any direct, indirect, special,
-   incidental, or consequential damages of any character arising as a
-   result of this License or out of the use or inability to use the
-   Work (including but not limited to damages for loss of goodwill,
-   work stoppage, computer failure or malfunction, or any and all
-   other commercial damages or losses), even if such Contributor
-   has been advised of the possibility of such damages.
-
-9. Accepting Warranty or Additional Liability. While redistributing
-   the Work or Derivative Works thereof, You may choose to offer,
-   and charge a fee for, acceptance of support, warranty, indemnity,
-   or other liability obligations and/or rights consistent with this
-   License. However, in accepting such obligations, You may act only
-   on Your own behalf and on Your sole responsibility, not on behalf
-   of any other Contributor, and only if You agree to indemnify,
-   defend, and hold each Contributor harmless for any liability
-   incurred by, or claims asserted against, such Contributor by reason
-   of your accepting any such warranty or additional liability.
-
-END OF TERMS AND CONDITIONS
-
-APPENDIX: How to apply the Apache License to your work.
-
-   To apply the Apache License to your work, attach the following
-   boilerplate notice, with the fields enclosed by brackets "[]"
-   replaced with your own identifying information. (Don't include
-   the brackets!)  The text should be enclosed in the appropriate
-   comment syntax for the file format. We also recommend that a
-   file or class name and description of purpose be included on the
-   same "printed page" as the copyright notice for easier
-   identification within third-party archives.
-
-Copyright [yyyy] [name of copyright owner]
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-	http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
diff --git a/crates/oneshot-uniffi/METADATA b/crates/oneshot-uniffi/METADATA
deleted file mode 100644
index 814f2b9..0000000
--- a/crates/oneshot-uniffi/METADATA
+++ /dev/null
@@ -1,17 +0,0 @@
-name: "oneshot-uniffi"
-description: "()"
-third_party {
-  version: "0.1.6"
-  license_type: NOTICE
-  last_upgrade_date {
-    year: 2024
-    month: 3
-    day: 21
-  }
-  homepage: "https://crates.io/crates/oneshot-uniffi"
-  identifier {
-    type: "Archive"
-    value: "https://static.crates.io/crates/oneshot-uniffi/oneshot-uniffi-0.1.6.crate"
-    version: "0.1.6"
-  }
-}
diff --git a/crates/oneshot-uniffi/MODULE_LICENSE_APACHE2 b/crates/oneshot-uniffi/MODULE_LICENSE_APACHE2
deleted file mode 100644
index e69de29..0000000
--- a/crates/oneshot-uniffi/MODULE_LICENSE_APACHE2
+++ /dev/null
diff --git a/crates/oneshot-uniffi/README.md b/crates/oneshot-uniffi/README.md
deleted file mode 100644
index 535f011..0000000
--- a/crates/oneshot-uniffi/README.md
+++ /dev/null
@@ -1,94 +0,0 @@
-# oneshot
-
-Oneshot spsc (single producer, single consumer) channel. Meaning each channel instance
-can only transport a single message. This has a few nice outcomes. One thing is that
-the implementation can be very efficient, utilizing the knowledge that there will
-only be one message. But more importantly, it allows the API to be expressed in such
-a way that certain edge cases that you don't want to care about when only sending a
-single message on a channel does not exist. For example: The sender can't be copied
-or cloned, and the send method takes ownership and consumes the sender.
-So you are guaranteed, at the type level, that there can only be one message sent.
-
-The sender's send method is non-blocking, and potentially lock- and wait-free.
-See documentation on [Sender::send] for situations where it might not be fully wait-free.
-The receiver supports both lock- and wait-free `try_recv` as well as indefinite and time
-limited thread blocking receive operations. The receiver also implements `Future` and
-supports asynchronously awaiting the message.
-
-
-## Examples
-
-This example sets up a background worker that processes requests coming in on a standard
-mpsc channel and replies on a oneshot channel provided with each request. The worker can
-be interacted with both from sync and async contexts since the oneshot receiver
-can receive both blocking and async.
-
-```rust
-use std::sync::mpsc;
-use std::thread;
-use std::time::Duration;
-
-type Request = String;
-
-// Starts a background thread performing some computation on requests sent to it.
-// Delivers the response back over a oneshot channel.
-fn spawn_processing_thread() -> mpsc::Sender<(Request, oneshot::Sender<usize>)> {
-    let (request_sender, request_receiver) = mpsc::channel::<(Request, oneshot::Sender<usize>)>();
-    thread::spawn(move || {
-        for (request_data, response_sender) in request_receiver.iter() {
-            let compute_operation = || request_data.len();
-            let _ = response_sender.send(compute_operation()); // <- Send on the oneshot channel
-        }
-    });
-    request_sender
-}
-
-let processor = spawn_processing_thread();
-
-// If compiled with `std` the library can receive messages with timeout on regular threads
-#[cfg(feature = "std")] {
-    let (response_sender, response_receiver) = oneshot::channel();
-    let request = Request::from("data from sync thread");
-
-    processor.send((request, response_sender)).expect("Processor down");
-    match response_receiver.recv_timeout(Duration::from_secs(1)) { // <- Receive on the oneshot channel
-        Ok(result) => println!("Processor returned {}", result),
-        Err(oneshot::RecvTimeoutError::Timeout) => eprintln!("Processor was too slow"),
-        Err(oneshot::RecvTimeoutError::Disconnected) => panic!("Processor exited"),
-    }
-}
-
-// If compiled with the `async` feature, the `Receiver` can be awaited in an async context
-#[cfg(feature = "async")] {
-    tokio::runtime::Runtime::new()
-        .unwrap()
-        .block_on(async move {
-            let (response_sender, response_receiver) = oneshot::channel();
-            let request = Request::from("data from sync thread");
-
-            processor.send((request, response_sender)).expect("Processor down");
-            match response_receiver.await { // <- Receive on the oneshot channel asynchronously
-                Ok(result) => println!("Processor returned {}", result),
-                Err(_e) => panic!("Processor exited"),
-            }
-        });
-}
-```
-
-## Sync vs async
-
-The main motivation for writing this library was that there were no (known to me) channel
-implementations allowing you to seamlessly send messages between a normal thread and an async
-task, or the other way around. If message passing is the way you are communicating, of course
-that should work smoothly between the sync and async parts of the program!
-
-This library achieves that by having a fast and cheap send operation that can
-be used in both sync threads and async tasks. The receiver has both thread blocking
-receive methods for synchronous usage, and implements `Future` for asynchronous usage.
-
-The receiving endpoint of this channel implements Rust's `Future` trait and can be waited on
-in an asynchronous task. This implementation is completely executor/runtime agnostic. It should
-be possible to use this library with any executor.
-
-
-License: MIT OR Apache-2.0
diff --git a/crates/oneshot-uniffi/TEST_MAPPING b/crates/oneshot-uniffi/TEST_MAPPING
deleted file mode 100644
index f835124..0000000
--- a/crates/oneshot-uniffi/TEST_MAPPING
+++ /dev/null
@@ -1,25 +0,0 @@
-{
-  "postsubmit": [
-    {
-      "name": "oneshot-uniffi_test_src_lib"
-    },
-    {
-      "name": "oneshot-uniffi_test_tests_assert_mem"
-    },
-    {
-      "name": "oneshot-uniffi_test_tests_async"
-    },
-    {
-      "name": "oneshot-uniffi_test_tests_future"
-    },
-    {
-      "name": "oneshot-uniffi_test_tests_loom"
-    },
-    {
-      "name": "oneshot-uniffi_test_tests_raw"
-    },
-    {
-      "name": "oneshot-uniffi_test_tests_sync"
-    }
-  ]
-}
diff --git a/crates/oneshot-uniffi/benches/benches.rs b/crates/oneshot-uniffi/benches/benches.rs
deleted file mode 100644
index 438d46a..0000000
--- a/crates/oneshot-uniffi/benches/benches.rs
+++ /dev/null
@@ -1,122 +0,0 @@
-use criterion::{black_box, criterion_group, criterion_main, Criterion};
-use std::mem;
-use std::time::{Duration, Instant};
-
-criterion_group!(benches, bench);
-criterion_main!(benches);
-
-macro_rules! bench_send_and_recv {
-    ($c:expr, $($type:ty => $value:expr);+) => {
-        // Sanity check that all $values are of $type.
-        $(let _: $type = $value;)*
-        {
-            let mut group = $c.benchmark_group("create_channel");
-            $(group.bench_function(stringify!($type), |b| {
-                b.iter(oneshot::channel::<$type>)
-            });)*
-            group.finish();
-        }
-        {
-            let mut group = $c.benchmark_group("create_and_send");
-            $(group.bench_function(stringify!($type), |b| {
-                b.iter(|| {
-                    let (sender, _receiver) = oneshot::channel();
-                    sender.send(black_box($value)).unwrap()
-                });
-            });)*
-            group.finish();
-        }
-        {
-            let mut group = $c.benchmark_group("create_and_send_on_closed");
-            $(group.bench_function(stringify!($type), |b| {
-                b.iter(|| {
-                    let (sender, _) = oneshot::channel();
-                    sender.send(black_box($value)).unwrap_err()
-                });
-            });)*
-            group.finish();
-        }
-        {
-            let mut group = $c.benchmark_group("create_send_and_recv");
-            $(group.bench_function(stringify!($type), |b| {
-                b.iter(|| {
-                    let (sender, receiver) = oneshot::channel();
-                    sender.send(black_box($value)).unwrap();
-                    receiver.recv().unwrap()
-                });
-            });)*
-            group.finish();
-        }
-        {
-            let mut group = $c.benchmark_group("create_send_and_recv_ref");
-            $(group.bench_function(stringify!($type), |b| {
-                b.iter(|| {
-                    let (sender, receiver) = oneshot::channel();
-                    sender.send(black_box($value)).unwrap();
-                    receiver.recv_ref().unwrap()
-                });
-            });)*
-            group.finish();
-        }
-    };
-}
-
-fn bench(c: &mut Criterion) {
-    bench_send_and_recv!(c,
-        () => ();
-        u8 => 7u8;
-        usize => 9876usize;
-        u128 => 1234567u128;
-        [u8; 64] => [0b10101010u8; 64];
-        [u8; 4096] => [0b10101010u8; 4096]
-    );
-
-    bench_try_recv(c);
-    bench_recv_deadline_now(c);
-    bench_recv_timeout_zero(c);
-}
-
-fn bench_try_recv(c: &mut Criterion) {
-    let (sender, receiver) = oneshot::channel::<u128>();
-    c.bench_function("try_recv_empty", |b| {
-        b.iter(|| receiver.try_recv().unwrap_err())
-    });
-    mem::drop(sender);
-    c.bench_function("try_recv_empty_closed", |b| {
-        b.iter(|| receiver.try_recv().unwrap_err())
-    });
-}
-
-fn bench_recv_deadline_now(c: &mut Criterion) {
-    let now = Instant::now();
-    {
-        let (_sender, receiver) = oneshot::channel::<u128>();
-        c.bench_function("recv_deadline_now", |b| {
-            b.iter(|| receiver.recv_deadline(now).unwrap_err())
-        });
-    }
-    {
-        let (sender, receiver) = oneshot::channel::<u128>();
-        mem::drop(sender);
-        c.bench_function("recv_deadline_now_closed", |b| {
-            b.iter(|| receiver.recv_deadline(now).unwrap_err())
-        });
-    }
-}
-
-fn bench_recv_timeout_zero(c: &mut Criterion) {
-    let zero = Duration::from_nanos(0);
-    {
-        let (_sender, receiver) = oneshot::channel::<u128>();
-        c.bench_function("recv_timeout_zero", |b| {
-            b.iter(|| receiver.recv_timeout(zero).unwrap_err())
-        });
-    }
-    {
-        let (sender, receiver) = oneshot::channel::<u128>();
-        mem::drop(sender);
-        c.bench_function("recv_timeout_zero_closed", |b| {
-            b.iter(|| receiver.recv_timeout(zero).unwrap_err())
-        });
-    }
-}
diff --git a/crates/oneshot-uniffi/cargo_embargo.json b/crates/oneshot-uniffi/cargo_embargo.json
deleted file mode 100644
index c169a21..0000000
--- a/crates/oneshot-uniffi/cargo_embargo.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-    "run_cargo": false,
-    "tests": true,
-    "module_visibility": {
-        "liboneshot_uniffi": [
-            "//external/rust/android-crates-io/crates/uniffi_core"
-        ]
-    },
-    "package": {
-        "oneshot-uniffi": {
-            "patch": "patches/Android.bp.patch",
-            "dep_blocklist": [
-                "libasync_std"
-            ]
-        }
-    }
-}
diff --git a/crates/oneshot-uniffi/check_mem_leaks.sh b/crates/oneshot-uniffi/check_mem_leaks.sh
deleted file mode 100755
index 5a10835..0000000
--- a/crates/oneshot-uniffi/check_mem_leaks.sh
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/usr/bin/env bash
-
-set -eu
-
-SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
-cd "$SCRIPT_DIR"
-
-for example_path in examples/*.rs; do
-    example_filename=$(basename -- $example_path)
-    example=${example_filename%.*}
-    echo $example
-    cargo valgrind run --example "$example"
-done
diff --git a/crates/oneshot-uniffi/examples/recv_before_send.rs b/crates/oneshot-uniffi/examples/recv_before_send.rs
deleted file mode 100644
index 2eda3dd..0000000
--- a/crates/oneshot-uniffi/examples/recv_before_send.rs
+++ /dev/null
@@ -1,18 +0,0 @@
-#[cfg(feature = "std")]
-fn main() {
-    use std::thread;
-    use std::time::Duration;
-
-    let (sender, receiver) = oneshot::channel();
-    let t = thread::spawn(move || {
-        thread::sleep(Duration::from_millis(2));
-        sender.send(9u128).unwrap();
-    });
-    assert_eq!(receiver.recv(), Ok(9));
-    t.join().unwrap();
-}
-
-#[cfg(not(feature = "std"))]
-fn main() {
-    panic!("This example is only for when the \"sync\" feature is used");
-}
diff --git a/crates/oneshot-uniffi/examples/recv_before_send_then_drop_sender.rs b/crates/oneshot-uniffi/examples/recv_before_send_then_drop_sender.rs
deleted file mode 100644
index aea7d66..0000000
--- a/crates/oneshot-uniffi/examples/recv_before_send_then_drop_sender.rs
+++ /dev/null
@@ -1,18 +0,0 @@
-#[cfg(feature = "std")]
-fn main() {
-    use std::thread;
-    use std::time::Duration;
-
-    let (sender, receiver) = oneshot::channel::<u128>();
-    let t = thread::spawn(move || {
-        thread::sleep(Duration::from_millis(2));
-        std::mem::drop(sender);
-    });
-    assert!(receiver.recv().is_err());
-    t.join().unwrap();
-}
-
-#[cfg(not(feature = "std"))]
-fn main() {
-    panic!("This example is only for when the \"sync\" feature is used");
-}
diff --git a/crates/oneshot-uniffi/examples/recv_ref_before_send.rs b/crates/oneshot-uniffi/examples/recv_ref_before_send.rs
deleted file mode 100644
index 6ed74dd..0000000
--- a/crates/oneshot-uniffi/examples/recv_ref_before_send.rs
+++ /dev/null
@@ -1,18 +0,0 @@
-#[cfg(feature = "std")]
-fn main() {
-    use std::thread;
-    use std::time::Duration;
-
-    let (sender, receiver) = oneshot::channel();
-    let t = thread::spawn(move || {
-        thread::sleep(Duration::from_millis(2));
-        sender.send(9u128).unwrap();
-    });
-    assert_eq!(receiver.recv_ref(), Ok(9));
-    t.join().unwrap();
-}
-
-#[cfg(not(feature = "std"))]
-fn main() {
-    panic!("This example is only for when the \"sync\" feature is used");
-}
diff --git a/crates/oneshot-uniffi/examples/recv_ref_before_send_then_drop_sender.rs b/crates/oneshot-uniffi/examples/recv_ref_before_send_then_drop_sender.rs
deleted file mode 100644
index 75ff3d6..0000000
--- a/crates/oneshot-uniffi/examples/recv_ref_before_send_then_drop_sender.rs
+++ /dev/null
@@ -1,18 +0,0 @@
-#[cfg(feature = "std")]
-fn main() {
-    use std::thread;
-    use std::time::Duration;
-
-    let (sender, receiver) = oneshot::channel::<u128>();
-    let t = thread::spawn(move || {
-        thread::sleep(Duration::from_millis(2));
-        std::mem::drop(sender);
-    });
-    assert!(receiver.recv_ref().is_err());
-    t.join().unwrap();
-}
-
-#[cfg(not(feature = "std"))]
-fn main() {
-    panic!("This example is only for when the \"sync\" feature is used");
-}
diff --git a/crates/oneshot-uniffi/examples/recv_timeout_before_send.rs b/crates/oneshot-uniffi/examples/recv_timeout_before_send.rs
deleted file mode 100644
index 85a2ac8..0000000
--- a/crates/oneshot-uniffi/examples/recv_timeout_before_send.rs
+++ /dev/null
@@ -1,18 +0,0 @@
-#[cfg(feature = "std")]
-fn main() {
-    use std::thread;
-    use std::time::Duration;
-
-    let (sender, receiver) = oneshot::channel();
-    let t = thread::spawn(move || {
-        thread::sleep(Duration::from_millis(2));
-        sender.send(9u128).unwrap();
-    });
-    assert_eq!(receiver.recv_timeout(Duration::from_millis(100)), Ok(9));
-    t.join().unwrap();
-}
-
-#[cfg(not(feature = "std"))]
-fn main() {
-    panic!("This example is only for when the \"sync\" feature is used");
-}
diff --git a/crates/oneshot-uniffi/examples/recv_timeout_before_send_then_drop_sender.rs b/crates/oneshot-uniffi/examples/recv_timeout_before_send_then_drop_sender.rs
deleted file mode 100644
index 32c31fc..0000000
--- a/crates/oneshot-uniffi/examples/recv_timeout_before_send_then_drop_sender.rs
+++ /dev/null
@@ -1,18 +0,0 @@
-#[cfg(feature = "std")]
-fn main() {
-    use std::thread;
-    use std::time::Duration;
-
-    let (sender, receiver) = oneshot::channel::<u128>();
-    let t = thread::spawn(move || {
-        thread::sleep(Duration::from_millis(2));
-        std::mem::drop(sender);
-    });
-    assert!(receiver.recv_timeout(Duration::from_millis(100)).is_err());
-    t.join().unwrap();
-}
-
-#[cfg(not(feature = "std"))]
-fn main() {
-    panic!("This example is only for when the \"sync\" feature is used");
-}
diff --git a/crates/oneshot-uniffi/examples/recv_with_dropped_sender.rs b/crates/oneshot-uniffi/examples/recv_with_dropped_sender.rs
deleted file mode 100644
index f7a7171..0000000
--- a/crates/oneshot-uniffi/examples/recv_with_dropped_sender.rs
+++ /dev/null
@@ -1,11 +0,0 @@
-#[cfg(feature = "std")]
-fn main() {
-    let (sender, receiver) = oneshot::channel::<u128>();
-    std::mem::drop(sender);
-    receiver.recv().unwrap_err();
-}
-
-#[cfg(not(feature = "std"))]
-fn main() {
-    panic!("This example is only for when the \"sync\" feature is used");
-}
diff --git a/crates/oneshot-uniffi/examples/send_before_recv.rs b/crates/oneshot-uniffi/examples/send_before_recv.rs
deleted file mode 100644
index c31ba65..0000000
--- a/crates/oneshot-uniffi/examples/send_before_recv.rs
+++ /dev/null
@@ -1,11 +0,0 @@
-#[cfg(feature = "std")]
-fn main() {
-    let (sender, receiver) = oneshot::channel();
-    assert!(sender.send(19i128).is_ok());
-    assert_eq!(receiver.recv(), Ok(19i128));
-}
-
-#[cfg(not(feature = "std"))]
-fn main() {
-    panic!("This example is only for when the \"sync\" feature is used");
-}
diff --git a/crates/oneshot-uniffi/examples/send_then_drop_receiver.rs b/crates/oneshot-uniffi/examples/send_then_drop_receiver.rs
deleted file mode 100644
index 941c508..0000000
--- a/crates/oneshot-uniffi/examples/send_then_drop_receiver.rs
+++ /dev/null
@@ -1,7 +0,0 @@
-use std::mem;
-
-fn main() {
-    let (sender, receiver) = oneshot::channel();
-    assert!(sender.send(19i128).is_ok());
-    mem::drop(receiver);
-}
diff --git a/crates/oneshot-uniffi/examples/send_with_dropped_receiver.rs b/crates/oneshot-uniffi/examples/send_with_dropped_receiver.rs
deleted file mode 100644
index 19bfa38..0000000
--- a/crates/oneshot-uniffi/examples/send_with_dropped_receiver.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-use std::mem;
-
-fn main() {
-    let (sender, receiver) = oneshot::channel();
-    mem::drop(receiver);
-    let send_error = sender.send(5u128).unwrap_err();
-    assert_eq!(send_error.into_inner(), 5);
-}
diff --git a/crates/oneshot-uniffi/patches/Android.bp.patch b/crates/oneshot-uniffi/patches/Android.bp.patch
deleted file mode 100644
index c47fbc7..0000000
--- a/crates/oneshot-uniffi/patches/Android.bp.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-diff --git b/Android.bp a/Android.bp
-index dabff6d..9f54e56 100644
---- b/Android.bp
-+++ a/Android.bp
-@@ -24,7 +24,7 @@ license {
- rust_library {
-     name: "liboneshot_uniffi",
-     host_supported: true,
--    crate_name: "oneshot_uniffi",
-+    crate_name: "oneshot",
-     cargo_env_compat: true,
-     cargo_pkg_version: "0.1.6",
-     crate_root: "src/lib.rs",
diff --git a/crates/oneshot-uniffi/patches/disable-async-tests.patch b/crates/oneshot-uniffi/patches/disable-async-tests.patch
deleted file mode 100644
index 7e07ab1..0000000
--- a/crates/oneshot-uniffi/patches/disable-async-tests.patch
+++ /dev/null
@@ -1,9 +0,0 @@
-diff --git a/tests/async.rs b/tests/async.rs
-index e7633aa..59acbf5 100644
---- a/tests/async.rs
-+++ b/tests/async.rs
-@@ -1,3 +1,4 @@
-+#![cfg(not(soong))]
- #![cfg(all(feature = "async", not(loom)))]
- 
- use core::mem;
diff --git a/crates/oneshot-uniffi/patches/license.patch b/crates/oneshot-uniffi/patches/license.patch
deleted file mode 100644
index a0f8517..0000000
--- a/crates/oneshot-uniffi/patches/license.patch
+++ /dev/null
@@ -1,207 +0,0 @@
-diff --git b/LICENSE-APACHE a/LICENSE-APACHE
-new file mode 100644
-index 0000000..16fe87b
---- /dev/null
-+++ a/LICENSE-APACHE
-@@ -0,0 +1,201 @@
-+                              Apache License
-+                        Version 2.0, January 2004
-+                     http://www.apache.org/licenses/
-+
-+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-+
-+1. Definitions.
-+
-+   "License" shall mean the terms and conditions for use, reproduction,
-+   and distribution as defined by Sections 1 through 9 of this document.
-+
-+   "Licensor" shall mean the copyright owner or entity authorized by
-+   the copyright owner that is granting the License.
-+
-+   "Legal Entity" shall mean the union of the acting entity and all
-+   other entities that control, are controlled by, or are under common
-+   control with that entity. For the purposes of this definition,
-+   "control" means (i) the power, direct or indirect, to cause the
-+   direction or management of such entity, whether by contract or
-+   otherwise, or (ii) ownership of fifty percent (50%) or more of the
-+   outstanding shares, or (iii) beneficial ownership of such entity.
-+
-+   "You" (or "Your") shall mean an individual or Legal Entity
-+   exercising permissions granted by this License.
-+
-+   "Source" form shall mean the preferred form for making modifications,
-+   including but not limited to software source code, documentation
-+   source, and configuration files.
-+
-+   "Object" form shall mean any form resulting from mechanical
-+   transformation or translation of a Source form, including but
-+   not limited to compiled object code, generated documentation,
-+   and conversions to other media types.
-+
-+   "Work" shall mean the work of authorship, whether in Source or
-+   Object form, made available under the License, as indicated by a
-+   copyright notice that is included in or attached to the work
-+   (an example is provided in the Appendix below).
-+
-+   "Derivative Works" shall mean any work, whether in Source or Object
-+   form, that is based on (or derived from) the Work and for which the
-+   editorial revisions, annotations, elaborations, or other modifications
-+   represent, as a whole, an original work of authorship. For the purposes
-+   of this License, Derivative Works shall not include works that remain
-+   separable from, or merely link (or bind by name) to the interfaces of,
-+   the Work and Derivative Works thereof.
-+
-+   "Contribution" shall mean any work of authorship, including
-+   the original version of the Work and any modifications or additions
-+   to that Work or Derivative Works thereof, that is intentionally
-+   submitted to Licensor for inclusion in the Work by the copyright owner
-+   or by an individual or Legal Entity authorized to submit on behalf of
-+   the copyright owner. For the purposes of this definition, "submitted"
-+   means any form of electronic, verbal, or written communication sent
-+   to the Licensor or its representatives, including but not limited to
-+   communication on electronic mailing lists, source code control systems,
-+   and issue tracking systems that are managed by, or on behalf of, the
-+   Licensor for the purpose of discussing and improving the Work, but
-+   excluding communication that is conspicuously marked or otherwise
-+   designated in writing by the copyright owner as "Not a Contribution."
-+
-+   "Contributor" shall mean Licensor and any individual or Legal Entity
-+   on behalf of whom a Contribution has been received by Licensor and
-+   subsequently incorporated within the Work.
-+
-+2. Grant of Copyright License. Subject to the terms and conditions of
-+   this License, each Contributor hereby grants to You a perpetual,
-+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-+   copyright license to reproduce, prepare Derivative Works of,
-+   publicly display, publicly perform, sublicense, and distribute the
-+   Work and such Derivative Works in Source or Object form.
-+
-+3. Grant of Patent License. Subject to the terms and conditions of
-+   this License, each Contributor hereby grants to You a perpetual,
-+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-+   (except as stated in this section) patent license to make, have made,
-+   use, offer to sell, sell, import, and otherwise transfer the Work,
-+   where such license applies only to those patent claims licensable
-+   by such Contributor that are necessarily infringed by their
-+   Contribution(s) alone or by combination of their Contribution(s)
-+   with the Work to which such Contribution(s) was submitted. If You
-+   institute patent litigation against any entity (including a
-+   cross-claim or counterclaim in a lawsuit) alleging that the Work
-+   or a Contribution incorporated within the Work constitutes direct
-+   or contributory patent infringement, then any patent licenses
-+   granted to You under this License for that Work shall terminate
-+   as of the date such litigation is filed.
-+
-+4. Redistribution. You may reproduce and distribute copies of the
-+   Work or Derivative Works thereof in any medium, with or without
-+   modifications, and in Source or Object form, provided that You
-+   meet the following conditions:
-+
-+   (a) You must give any other recipients of the Work or
-+       Derivative Works a copy of this License; and
-+
-+   (b) You must cause any modified files to carry prominent notices
-+       stating that You changed the files; and
-+
-+   (c) You must retain, in the Source form of any Derivative Works
-+       that You distribute, all copyright, patent, trademark, and
-+       attribution notices from the Source form of the Work,
-+       excluding those notices that do not pertain to any part of
-+       the Derivative Works; and
-+
-+   (d) If the Work includes a "NOTICE" text file as part of its
-+       distribution, then any Derivative Works that You distribute must
-+       include a readable copy of the attribution notices contained
-+       within such NOTICE file, excluding those notices that do not
-+       pertain to any part of the Derivative Works, in at least one
-+       of the following places: within a NOTICE text file distributed
-+       as part of the Derivative Works; within the Source form or
-+       documentation, if provided along with the Derivative Works; or,
-+       within a display generated by the Derivative Works, if and
-+       wherever such third-party notices normally appear. The contents
-+       of the NOTICE file are for informational purposes only and
-+       do not modify the License. You may add Your own attribution
-+       notices within Derivative Works that You distribute, alongside
-+       or as an addendum to the NOTICE text from the Work, provided
-+       that such additional attribution notices cannot be construed
-+       as modifying the License.
-+
-+   You may add Your own copyright statement to Your modifications and
-+   may provide additional or different license terms and conditions
-+   for use, reproduction, or distribution of Your modifications, or
-+   for any such Derivative Works as a whole, provided Your use,
-+   reproduction, and distribution of the Work otherwise complies with
-+   the conditions stated in this License.
-+
-+5. Submission of Contributions. Unless You explicitly state otherwise,
-+   any Contribution intentionally submitted for inclusion in the Work
-+   by You to the Licensor shall be under the terms and conditions of
-+   this License, without any additional terms or conditions.
-+   Notwithstanding the above, nothing herein shall supersede or modify
-+   the terms of any separate license agreement you may have executed
-+   with Licensor regarding such Contributions.
-+
-+6. Trademarks. This License does not grant permission to use the trade
-+   names, trademarks, service marks, or product names of the Licensor,
-+   except as required for reasonable and customary use in describing the
-+   origin of the Work and reproducing the content of the NOTICE file.
-+
-+7. Disclaimer of Warranty. Unless required by applicable law or
-+   agreed to in writing, Licensor provides the Work (and each
-+   Contributor provides its Contributions) on an "AS IS" BASIS,
-+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-+   implied, including, without limitation, any warranties or conditions
-+   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-+   PARTICULAR PURPOSE. You are solely responsible for determining the
-+   appropriateness of using or redistributing the Work and assume any
-+   risks associated with Your exercise of permissions under this License.
-+
-+8. Limitation of Liability. In no event and under no legal theory,
-+   whether in tort (including negligence), contract, or otherwise,
-+   unless required by applicable law (such as deliberate and grossly
-+   negligent acts) or agreed to in writing, shall any Contributor be
-+   liable to You for damages, including any direct, indirect, special,
-+   incidental, or consequential damages of any character arising as a
-+   result of this License or out of the use or inability to use the
-+   Work (including but not limited to damages for loss of goodwill,
-+   work stoppage, computer failure or malfunction, or any and all
-+   other commercial damages or losses), even if such Contributor
-+   has been advised of the possibility of such damages.
-+
-+9. Accepting Warranty or Additional Liability. While redistributing
-+   the Work or Derivative Works thereof, You may choose to offer,
-+   and charge a fee for, acceptance of support, warranty, indemnity,
-+   or other liability obligations and/or rights consistent with this
-+   License. However, in accepting such obligations, You may act only
-+   on Your own behalf and on Your sole responsibility, not on behalf
-+   of any other Contributor, and only if You agree to indemnify,
-+   defend, and hold each Contributor harmless for any liability
-+   incurred by, or claims asserted against, such Contributor by reason
-+   of your accepting any such warranty or additional liability.
-+
-+END OF TERMS AND CONDITIONS
-+
-+APPENDIX: How to apply the Apache License to your work.
-+
-+   To apply the Apache License to your work, attach the following
-+   boilerplate notice, with the fields enclosed by brackets "[]"
-+   replaced with your own identifying information. (Don't include
-+   the brackets!)  The text should be enclosed in the appropriate
-+   comment syntax for the file format. We also recommend that a
-+   file or class name and description of purpose be included on the
-+   same "printed page" as the copyright notice for easier
-+   identification within third-party archives.
-+
-+Copyright [yyyy] [name of copyright owner]
-+
-+Licensed under the Apache License, Version 2.0 (the "License");
-+you may not use this file except in compliance with the License.
-+You may obtain a copy of the License at
-+
-+	http://www.apache.org/licenses/LICENSE-2.0
-+
-+Unless required by applicable law or agreed to in writing, software
-+distributed under the License is distributed on an "AS IS" BASIS,
-+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+See the License for the specific language governing permissions and
-+limitations under the License.
diff --git a/crates/oneshot-uniffi/src/errors.rs b/crates/oneshot-uniffi/src/errors.rs
deleted file mode 100644
index 1fd0de1..0000000
--- a/crates/oneshot-uniffi/src/errors.rs
+++ /dev/null
@@ -1,147 +0,0 @@
-use super::{dealloc, Channel};
-use core::fmt;
-use core::mem;
-use core::ptr::NonNull;
-
-/// An error returned when trying to send on a closed channel. Returned from
-/// [`Sender::send`](crate::Sender::send) if the corresponding [`Receiver`](crate::Receiver)
-/// has already been dropped.
-///
-/// The message that could not be sent can be retreived again with [`SendError::into_inner`].
-pub struct SendError<T> {
-    channel_ptr: NonNull<Channel<T>>,
-}
-
-unsafe impl<T: Send> Send for SendError<T> {}
-unsafe impl<T: Sync> Sync for SendError<T> {}
-
-impl<T> SendError<T> {
-    /// # Safety
-    ///
-    /// By calling this function, the caller semantically transfers ownership of the
-    /// channel's resources to the created `SendError`. Thus the caller must ensure that the
-    /// pointer is not used in a way which would violate this ownership transfer. Moreover,
-    /// the caller must assert that the channel contains a valid, initialized message.
-    pub(crate) const unsafe fn new(channel_ptr: NonNull<Channel<T>>) -> Self {
-        Self { channel_ptr }
-    }
-
-    /// Consumes the error and returns the message that failed to be sent.
-    #[inline]
-    pub fn into_inner(self) -> T {
-        let channel_ptr = self.channel_ptr;
-
-        // Don't run destructor if we consumed ourselves. Freeing happens here.
-        mem::forget(self);
-
-        // SAFETY: we have ownership of the channel
-        let channel: &Channel<T> = unsafe { channel_ptr.as_ref() };
-
-        // SAFETY: we know that the message is initialized according to the safety requirements of
-        // `new`
-        let message = unsafe { channel.take_message() };
-
-        // SAFETY: we own the channel
-        unsafe { dealloc(channel_ptr) };
-
-        message
-    }
-
-    /// Get a reference to the message that failed to be sent.
-    #[inline]
-    pub fn as_inner(&self) -> &T {
-        unsafe { self.channel_ptr.as_ref().message().assume_init_ref() }
-    }
-}
-
-impl<T> Drop for SendError<T> {
-    fn drop(&mut self) {
-        // SAFETY: we have ownership of the channel and require that the message is initialized
-        // upon construction
-        unsafe {
-            self.channel_ptr.as_ref().drop_message();
-            dealloc(self.channel_ptr);
-        }
-    }
-}
-
-impl<T> fmt::Display for SendError<T> {
-    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
-        "sending on a closed channel".fmt(f)
-    }
-}
-
-impl<T> fmt::Debug for SendError<T> {
-    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
-        write!(f, "SendError<{}>(_)", stringify!(T))
-    }
-}
-
-#[cfg(feature = "std")]
-impl<T> std::error::Error for SendError<T> {}
-
-/// An error returned from the blocking [`Receiver::recv`](crate::Receiver::recv) method.
-///
-/// The receive operation can only fail if the corresponding [`Sender`](crate::Sender) was dropped
-/// before sending any message, or if a message has already been sent and received on the channel.
-#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
-pub struct RecvError;
-
-impl fmt::Display for RecvError {
-    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
-        "receiving on a closed channel".fmt(f)
-    }
-}
-
-#[cfg(feature = "std")]
-impl std::error::Error for RecvError {}
-
-/// An error returned when failing to receive a message in the non-blocking
-/// [`Receiver::try_recv`](crate::Receiver::try_recv).
-#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
-pub enum TryRecvError {
-    /// The channel is still open, but there was no message present in it.
-    Empty,
-
-    /// The channel is closed. Either the sender was dropped before sending any message, or the
-    /// message has already been extracted from the receiver.
-    Disconnected,
-}
-
-impl fmt::Display for TryRecvError {
-    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
-        let msg = match self {
-            TryRecvError::Empty => "receiving on an empty channel",
-            TryRecvError::Disconnected => "receiving on a closed channel",
-        };
-        msg.fmt(f)
-    }
-}
-
-#[cfg(feature = "std")]
-impl std::error::Error for TryRecvError {}
-
-/// An error returned when failing to receive a message in
-/// [`Receiver::recv_timeout`](crate::Receiver::recv_timeout).
-#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
-pub enum RecvTimeoutError {
-    /// No message arrived on the channel before the timeout was reached. The channel is still open.
-    Timeout,
-
-    /// The channel is closed. Either the sender was dropped before sending any message, or the
-    /// message has already been extracted from the receiver.
-    Disconnected,
-}
-
-impl fmt::Display for RecvTimeoutError {
-    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
-        let msg = match self {
-            RecvTimeoutError::Timeout => "timed out waiting on channel",
-            RecvTimeoutError::Disconnected => "channel is empty and sending half is closed",
-        };
-        msg.fmt(f)
-    }
-}
-
-#[cfg(feature = "std")]
-impl std::error::Error for RecvTimeoutError {}
diff --git a/crates/oneshot-uniffi/src/lib.rs b/crates/oneshot-uniffi/src/lib.rs
deleted file mode 100644
index 8da012b..0000000
--- a/crates/oneshot-uniffi/src/lib.rs
+++ /dev/null
@@ -1,1242 +0,0 @@
-//! Oneshot spsc (single producer, single consumer) channel. Meaning each channel instance
-//! can only transport a single message. This has a few nice outcomes. One thing is that
-//! the implementation can be very efficient, utilizing the knowledge that there will
-//! only be one message. But more importantly, it allows the API to be expressed in such
-//! a way that certain edge cases that you don't want to care about when only sending a
-//! single message on a channel does not exist. For example: The sender can't be copied
-//! or cloned, and the send method takes ownership and consumes the sender.
-//! So you are guaranteed, at the type level, that there can only be one message sent.
-//!
-//! The sender's send method is non-blocking, and potentially lock- and wait-free.
-//! See documentation on [Sender::send] for situations where it might not be fully wait-free.
-//! The receiver supports both lock- and wait-free `try_recv` as well as indefinite and time
-//! limited thread blocking receive operations. The receiver also implements `Future` and
-//! supports asynchronously awaiting the message.
-//!
-//!
-//! # Examples
-//!
-//! This example sets up a background worker that processes requests coming in on a standard
-//! mpsc channel and replies on a oneshot channel provided with each request. The worker can
-//! be interacted with both from sync and async contexts since the oneshot receiver
-//! can receive both blocking and async.
-//!
-//! ```rust
-//! use std::sync::mpsc;
-//! use std::thread;
-//! use std::time::Duration;
-//!
-//! type Request = String;
-//!
-//! // Starts a background thread performing some computation on requests sent to it.
-//! // Delivers the response back over a oneshot channel.
-//! fn spawn_processing_thread() -> mpsc::Sender<(Request, oneshot::Sender<usize>)> {
-//!     let (request_sender, request_receiver) = mpsc::channel::<(Request, oneshot::Sender<usize>)>();
-//!     thread::spawn(move || {
-//!         for (request_data, response_sender) in request_receiver.iter() {
-//!             let compute_operation = || request_data.len();
-//!             let _ = response_sender.send(compute_operation()); // <- Send on the oneshot channel
-//!         }
-//!     });
-//!     request_sender
-//! }
-//!
-//! let processor = spawn_processing_thread();
-//!
-//! // If compiled with `std` the library can receive messages with timeout on regular threads
-//! #[cfg(feature = "std")] {
-//!     let (response_sender, response_receiver) = oneshot::channel();
-//!     let request = Request::from("data from sync thread");
-//!
-//!     processor.send((request, response_sender)).expect("Processor down");
-//!     match response_receiver.recv_timeout(Duration::from_secs(1)) { // <- Receive on the oneshot channel
-//!         Ok(result) => println!("Processor returned {}", result),
-//!         Err(oneshot::RecvTimeoutError::Timeout) => eprintln!("Processor was too slow"),
-//!         Err(oneshot::RecvTimeoutError::Disconnected) => panic!("Processor exited"),
-//!     }
-//! }
-//!
-//! // If compiled with the `async` feature, the `Receiver` can be awaited in an async context
-//! #[cfg(feature = "async")] {
-//!     tokio::runtime::Runtime::new()
-//!         .unwrap()
-//!         .block_on(async move {
-//!             let (response_sender, response_receiver) = oneshot::channel();
-//!             let request = Request::from("data from sync thread");
-//!
-//!             processor.send((request, response_sender)).expect("Processor down");
-//!             match response_receiver.await { // <- Receive on the oneshot channel asynchronously
-//!                 Ok(result) => println!("Processor returned {}", result),
-//!                 Err(_e) => panic!("Processor exited"),
-//!             }
-//!         });
-//! }
-//! ```
-//!
-//! # Sync vs async
-//!
-//! The main motivation for writing this library was that there were no (known to me) channel
-//! implementations allowing you to seamlessly send messages between a normal thread and an async
-//! task, or the other way around. If message passing is the way you are communicating, of course
-//! that should work smoothly between the sync and async parts of the program!
-//!
-//! This library achieves that by having a fast and cheap send operation that can
-//! be used in both sync threads and async tasks. The receiver has both thread blocking
-//! receive methods for synchronous usage, and implements `Future` for asynchronous usage.
-//!
-//! The receiving endpoint of this channel implements Rust's `Future` trait and can be waited on
-//! in an asynchronous task. This implementation is completely executor/runtime agnostic. It should
-//! be possible to use this library with any executor.
-//!
-
-// # Implementation description
-//
-// When a channel is created via the channel function, it creates a single heap allocation
-// containing:
-// * A one byte atomic integer that represents the current channel state,
-// * Uninitialized memory to fit the message,
-// * Uninitialized memory to fit the waker that can wake the receiving task or thread up.
-//
-// The size of the waker depends on which features are activated, it ranges from 0 to 24 bytes[1].
-// So with all features enabled (the default) each channel allocates 25 bytes plus the size of the
-// message, plus any padding needed to get correct memory alignment.
-//
-// The Sender and Receiver only holds a raw pointer to the heap channel object. The last endpoint
-// to be consumed or dropped is responsible for freeing the heap memory. The first endpoint to
-// be consumed or dropped signal via the state that it is gone. And the second one see this and
-// frees the memory.
-//
-// ## Footnotes
-//
-// [1]: Mind that the waker only takes zero bytes when all features are disabled, making it
-//      impossible to *wait* for the message. `try_recv` the only available method in this scenario.
-
-#![deny(rust_2018_idioms)]
-#![cfg_attr(not(feature = "std"), no_std)]
-
-#[cfg(not(loom))]
-extern crate alloc;
-
-use core::{
-    marker::PhantomData,
-    mem::{self, MaybeUninit},
-    ptr::{self, NonNull},
-};
-
-#[cfg(not(loom))]
-use core::{
-    cell::UnsafeCell,
-    sync::atomic::{fence, AtomicU8, Ordering::*},
-};
-#[cfg(loom)]
-use loom::{
-    cell::UnsafeCell,
-    sync::atomic::{fence, AtomicU8, Ordering::*},
-};
-
-#[cfg(all(feature = "async", not(loom)))]
-use core::hint;
-#[cfg(all(feature = "async", loom))]
-use loom::hint;
-
-#[cfg(feature = "async")]
-use core::{
-    pin::Pin,
-    task::{self, Poll},
-};
-#[cfg(feature = "std")]
-use std::time::{Duration, Instant};
-
-#[cfg(feature = "std")]
-mod thread {
-    #[cfg(not(loom))]
-    pub use std::thread::{current, park, park_timeout, yield_now, Thread};
-
-    #[cfg(loom)]
-    pub use loom::thread::{current, park, yield_now, Thread};
-
-    // loom does not support parking with a timeout. So we just
-    // yield. This means that the "park" will "spuriously" wake up
-    // way too early. But the code should properly handle this.
-    // One thing to note is that very short timeouts are needed
-    // when using loom, since otherwise the looping will cause
-    // an overflow in loom.
-    #[cfg(loom)]
-    pub fn park_timeout(_timeout: std::time::Duration) {
-        loom::thread::yield_now()
-    }
-}
-
-#[cfg(loom)]
-mod loombox;
-#[cfg(not(loom))]
-use alloc::boxed::Box;
-#[cfg(loom)]
-use loombox::Box;
-
-mod errors;
-pub use errors::{RecvError, RecvTimeoutError, SendError, TryRecvError};
-
-/// Creates a new oneshot channel and returns the two endpoints, [`Sender`] and [`Receiver`].
-pub fn channel<T>() -> (Sender<T>, Receiver<T>) {
-    // Allocate the channel on the heap and get the pointer.
-    // The last endpoint of the channel to be alive is responsible for freeing the channel
-    // and dropping any object that might have been written to it.
-
-    let channel_ptr = Box::into_raw(Box::new(Channel::new()));
-
-    // SAFETY: `channel_ptr` came from a Box and thus is not null
-    let channel_ptr = unsafe { NonNull::new_unchecked(channel_ptr) };
-
-    (
-        Sender {
-            channel_ptr,
-            _invariant: PhantomData,
-        },
-        Receiver { channel_ptr },
-    )
-}
-
-#[derive(Debug)]
-pub struct Sender<T> {
-    channel_ptr: NonNull<Channel<T>>,
-    // In reality we want contravariance, however we can't obtain that.
-    //
-    // Consider the following scenario:
-    // ```
-    // let (mut tx, rx) = channel::<&'short u8>();
-    // let (tx2, rx2) = channel::<&'long u8>();
-    //
-    // tx = tx2;
-    //
-    // // Pretend short_ref is some &'short u8
-    // tx.send(short_ref).unwrap();
-    // let long_ref = rx2.recv().unwrap();
-    // ```
-    //
-    // If this type were covariant then we could safely extend lifetimes, which is not okay.
-    // Hence, we enforce invariance.
-    _invariant: PhantomData<fn(T) -> T>,
-}
-
-#[derive(Debug)]
-pub struct Receiver<T> {
-    // Covariance is the right choice here. Consider the example presented in Sender, and you'll
-    // see that if we replaced `rx` instead then we would get the expected behavior
-    channel_ptr: NonNull<Channel<T>>,
-}
-
-unsafe impl<T: Send> Send for Sender<T> {}
-unsafe impl<T: Send> Send for Receiver<T> {}
-impl<T> Unpin for Receiver<T> {}
-
-impl<T> Sender<T> {
-    /// Sends `message` over the channel to the corresponding [`Receiver`].
-    ///
-    /// Returns an error if the receiver has already been dropped. The message can
-    /// be extracted from the error.
-    ///
-    /// This method is lock-free and wait-free when sending on a channel that the
-    /// receiver is currently not receiving on. If the receiver is receiving during the send
-    /// operation this method includes waking up the thread/task. Unparking a thread involves
-    /// a mutex in Rust's standard library at the time of writing this.
-    /// How lock-free waking up an async task is
-    /// depends on your executor. If this method returns a `SendError`, please mind that dropping
-    /// the error involves running any drop implementation on the message type, and freeing the
-    /// channel's heap allocation, which might or might not be lock-free.
-    pub fn send(self, message: T) -> Result<(), SendError<T>> {
-        let channel_ptr = self.channel_ptr;
-
-        // Don't run our Drop implementation if send was called, any cleanup now happens here
-        mem::forget(self);
-
-        // SAFETY: The channel exists on the heap for the entire duration of this method and we
-        // only ever acquire shared references to it. Note that if the receiver disconnects it
-        // does not free the channel.
-        let channel = unsafe { channel_ptr.as_ref() };
-
-        // Write the message into the channel on the heap.
-        // SAFETY: The receiver only ever accesses this memory location if we are in the MESSAGE
-        // state, and since we're responsible for setting that state, we can guarantee that we have
-        // exclusive access to this memory location to perform this write.
-        unsafe { channel.write_message(message) };
-
-        // Set the state to signal there is a message on the channel.
-        // ORDERING: we use release ordering to ensure the write of the message is visible to the
-        // receiving thread. The EMPTY and DISCONNECTED branches do not observe any shared state,
-        // and thus we do not need acquire orderng. The RECEIVING branch manages synchronization
-        // independent of this operation.
-        //
-        // EMPTY + 1 = MESSAGE
-        // RECEIVING + 1 = UNPARKING
-        // DISCONNECTED + 1 = invalid, however this state is never observed
-        match channel.state.fetch_add(1, Release) {
-            // The receiver is alive and has not started waiting. Send done.
-            EMPTY => Ok(()),
-            // The receiver is waiting. Wake it up so it can return the message.
-            RECEIVING => {
-                // ORDERING: Synchronizes with the write of the waker to memory, and prevents the
-                // taking of the waker from being ordered before this operation.
-                fence(Acquire);
-
-                // Take the waker, but critically do not unpark it. If we unparked now, then the
-                // receiving thread could still observe the UNPARKING state and re-park, meaning
-                // that after we change to the MESSAGE state, it would remain parked indefinitely
-                // or until a spurious wakeup.
-                // SAFETY: at this point we are in the UNPARKING state, and the receiving thread
-                // does not access the waker while in this state, nor does it free the channel
-                // allocation in this state.
-                let waker = unsafe { channel.take_waker() };
-
-                // ORDERING: this ordering serves two-fold: it synchronizes with the acquire load
-                // in the receiving thread, ensuring that both our read of the waker and write of
-                // the message happen-before the taking of the message and freeing of the channel.
-                // Furthermore, we need acquire ordering to ensure the unparking of the receiver
-                // happens after the channel state is updated.
-                channel.state.swap(MESSAGE, AcqRel);
-
-                // Note: it is possible that between the store above and this statement that
-                // the receiving thread is spuriously unparked, takes the message, and frees
-                // the channel allocation. However, we took ownership of the channel out of
-                // that allocation, and freeing the channel does not drop the waker since the
-                // waker is wrapped in MaybeUninit. Therefore this data is valid regardless of
-                // whether or not the receive has completed by this point.
-                waker.unpark();
-
-                Ok(())
-            }
-            // The receiver was already dropped. The error is responsible for freeing the channel.
-            // SAFETY: since the receiver disconnected it will no longer access `channel_ptr`, so
-            // we can transfer exclusive ownership of the channel's resources to the error.
-            // Moreover, since we just placed the message in the channel, the channel contains a
-            // valid message.
-            DISCONNECTED => Err(unsafe { SendError::new(channel_ptr) }),
-            _ => unreachable!(),
-        }
-    }
-
-    /// Consumes the Sender, returning a raw pointer to the channel on the heap.
-    ///
-    /// This is intended to simplify using oneshot channels with some FFI code. The only safe thing
-    /// to do with the returned pointer is to later reconstruct the Sender with [Sender::from_raw].
-    /// Memory will leak if the Sender is never reconstructed.
-    pub fn into_raw(self) -> *mut () {
-        let raw = self.channel_ptr.as_ptr() as *mut ();
-        mem::forget(self);
-        raw
-    }
-
-    /// Consumes a raw pointer from [Sender::into_raw], recreating the Sender.
-    ///
-    /// # Safety
-    ///
-    /// This pointer must have come from [`Sender<T>::into_raw`] with the same message type, `T`.
-    /// At most one Sender must exist for a channel at any point in time.
-    /// Constructing multiple Senders from the same raw pointer leads to undefined behavior.
-    pub unsafe fn from_raw(raw: *mut ()) -> Self {
-        Self {
-            channel_ptr: NonNull::new_unchecked(raw as *mut Channel<T>),
-            _invariant: PhantomData,
-        }
-    }
-}
-
-impl<T> Drop for Sender<T> {
-    fn drop(&mut self) {
-        // SAFETY: The receiver only ever frees the channel if we are in the MESSAGE or
-        // DISCONNECTED states. If we are in the MESSAGE state, then we called
-        // mem::forget(self), so we should not be in this function call. If we are in the
-        // DISCONNECTED state, then the receiver either received a MESSAGE so this statement is
-        // unreachable, or was dropped and observed that our side was still alive, and thus didn't
-        // free the channel.
-        let channel = unsafe { self.channel_ptr.as_ref() };
-
-        // Set the channel state to disconnected and read what state the receiver was in
-        // ORDERING: we don't need release ordering here since there are no modifications we
-        // need to make visible to other thread, and the Err(RECEIVING) branch handles
-        // synchronization independent of this cmpxchg
-        //
-        // EMPTY ^ 001 = DISCONNECTED
-        // RECEIVING ^ 001 = UNPARKING
-        // DISCONNECTED ^ 001 = EMPTY (invalid), but this state is never observed
-        match channel.state.fetch_xor(0b001, Relaxed) {
-            // The receiver has not started waiting, nor is it dropped.
-            EMPTY => (),
-            // The receiver is waiting. Wake it up so it can detect that the channel disconnected.
-            RECEIVING => {
-                // See comments in Sender::send
-
-                fence(Acquire);
-
-                let waker = unsafe { channel.take_waker() };
-
-                // We still need release ordering here to make sure our read of the waker happens
-                // before this, and acquire ordering to ensure the unparking of the receiver
-                // happens after this.
-                channel.state.swap(DISCONNECTED, AcqRel);
-
-                // The Acquire ordering above ensures that the write of the DISCONNECTED state
-                // happens-before unparking the receiver.
-                waker.unpark();
-            }
-            // The receiver was already dropped. We are responsible for freeing the channel.
-            DISCONNECTED => {
-                // SAFETY: when the receiver switches the state to DISCONNECTED they have received
-                // the message or will no longer be trying to receive the message, and have
-                // observed that the sender is still alive, meaning that we're responsible for
-                // freeing the channel allocation.
-                unsafe { dealloc(self.channel_ptr) };
-            }
-            _ => unreachable!(),
-        }
-    }
-}
-
-impl<T> Receiver<T> {
-    /// Checks if there is a message in the channel without blocking. Returns:
-    ///  * `Ok(message)` if there was a message in the channel.
-    ///  * `Err(Empty)` if the [`Sender`] is alive, but has not yet sent a message.
-    ///  * `Err(Disconnected)` if the [`Sender`] was dropped before sending anything or if the
-    ///    message has already been extracted by a previous receive call.
-    ///
-    /// If a message is returned, the channel is disconnected and any subsequent receive operation
-    /// using this receiver will return an error.
-    ///
-    /// This method is completely lock-free and wait-free. The only thing it does is an atomic
-    /// integer load of the channel state. And if there is a message in the channel it additionally
-    /// performs one atomic integer store and copies the message from the heap to the stack for
-    /// returning it.
-    pub fn try_recv(&self) -> Result<T, TryRecvError> {
-        // SAFETY: The channel will not be freed while this method is still running.
-        let channel = unsafe { self.channel_ptr.as_ref() };
-
-        // ORDERING: we use acquire ordering to synchronize with the store of the message.
-        match channel.state.load(Acquire) {
-            MESSAGE => {
-                // It's okay to break up the load and store since once we're in the message state
-                // the sender no longer modifies the state
-                // ORDERING: at this point the sender has done its job and is no longer active, so
-                // we don't need to make any side effects visible to it
-                channel.state.store(DISCONNECTED, Relaxed);
-
-                // SAFETY: we are in the MESSAGE state so the message is present
-                Ok(unsafe { channel.take_message() })
-            }
-            EMPTY => Err(TryRecvError::Empty),
-            DISCONNECTED => Err(TryRecvError::Disconnected),
-            #[cfg(feature = "async")]
-            RECEIVING | UNPARKING => Err(TryRecvError::Empty),
-            _ => unreachable!(),
-        }
-    }
-
-    /// Attempts to wait for a message from the [`Sender`], returning an error if the channel is
-    /// disconnected.
-    ///
-    /// This method will always block the current thread if there is no data available and it is
-    /// still possible for the message to be sent. Once the message is sent to the corresponding
-    /// [`Sender`], then this receiver will wake up and return that message.
-    ///
-    /// If the corresponding [`Sender`] has disconnected (been dropped), or it disconnects while
-    /// this call is blocking, this call will wake up and return `Err` to indicate that the message
-    /// can never be received on this channel.
-    ///
-    /// If a sent message has already been extracted from this channel this method will return an
-    /// error.
-    ///
-    /// # Panics
-    ///
-    /// Panics if called after this receiver has been polled asynchronously.
-    #[cfg(feature = "std")]
-    pub fn recv(self) -> Result<T, RecvError> {
-        // Note that we don't need to worry about changing the state to disconnected or setting the
-        // state to an invalid value at any point in this function because we take ownership of
-        // self, and this function does not exit until the message has been received or both side
-        // of the channel are inactive and cleaned up.
-
-        let channel_ptr = self.channel_ptr;
-
-        // Don't run our Drop implementation if we are receiving consuming ourselves.
-        mem::forget(self);
-
-        // SAFETY: the existence of the `self` parameter serves as a certificate that the receiver
-        // is still alive, meaning that even if the sender was dropped then it would have observed
-        // the fact that we're still alive and left the responsibility of deallocating the
-        // channel to us, so channel_ptr is valid
-        let channel = unsafe { channel_ptr.as_ref() };
-
-        // ORDERING: we use acquire ordering to synchronize with the write of the message in the
-        // case that it's available
-        match channel.state.load(Acquire) {
-            // The sender is alive but has not sent anything yet. We prepare to park.
-            EMPTY => {
-                // Conditionally add a delay here to help the tests trigger the edge cases where
-                // the sender manages to be dropped or send something before we are able to store
-                // our waker object in the channel.
-                #[cfg(oneshot_test_delay)]
-                std::thread::sleep(std::time::Duration::from_millis(10));
-
-                // Write our waker instance to the channel.
-                // SAFETY: we are not yet in the RECEIVING state, meaning that the sender will not
-                // try to access the waker until it sees the state set to RECEIVING below
-                unsafe { channel.write_waker(ReceiverWaker::current_thread()) };
-
-                // Switch the state to RECEIVING. We need to do this in one atomic step in case the
-                // sender disconnected or sent the message while we wrote the waker to memory. We
-                // don't need to do a compare exchange here however because if the original state
-                // was not EMPTY, then the sender has either finished sending the message or is
-                // being dropped, so the RECEIVING state will never be observed after we return.
-                // ORDERING: we use release ordering so the sender can synchronize with our writing
-                // of the waker to memory. The individual branches handle any additional
-                // synchronizaton
-                match channel.state.swap(RECEIVING, Release) {
-                    // We stored our waker, now we park until the sender has changed the state
-                    EMPTY => loop {
-                        thread::park();
-
-                        // ORDERING: synchronize with the write of the message
-                        match channel.state.load(Acquire) {
-                            // The sender sent the message while we were parked.
-                            MESSAGE => {
-                                // SAFETY: we are in the message state so the message is valid
-                                let message = unsafe { channel.take_message() };
-
-                                // SAFETY: the Sender delegates the responsibility of deallocating
-                                // the channel to us upon sending the message
-                                unsafe { dealloc(channel_ptr) };
-
-                                break Ok(message);
-                            }
-                            // The sender was dropped while we were parked.
-                            DISCONNECTED => {
-                                // SAFETY: the Sender doesn't deallocate the channel allocation in
-                                // its drop implementation if we're receiving
-                                unsafe { dealloc(channel_ptr) };
-
-                                break Err(RecvError);
-                            }
-                            // State did not change, spurious wakeup, park again.
-                            RECEIVING | UNPARKING => (),
-                            _ => unreachable!(),
-                        }
-                    },
-                    // The sender sent the message while we prepared to park.
-                    MESSAGE => {
-                        // ORDERING: Synchronize with the write of the message. This branch is
-                        // unlikely to be taken, so it's likely more efficient to use a fence here
-                        // instead of AcqRel ordering on the RMW operation
-                        fence(Acquire);
-
-                        // SAFETY: we started in the empty state and the sender switched us to the
-                        // message state. This means that it did not take the waker, so we're
-                        // responsible for dropping it.
-                        unsafe { channel.drop_waker() };
-
-                        // SAFETY: we are in the message state so the message is valid
-                        let message = unsafe { channel.take_message() };
-
-                        // SAFETY: the Sender delegates the responsibility of deallocating the
-                        // channel to us upon sending the message
-                        unsafe { dealloc(channel_ptr) };
-
-                        Ok(message)
-                    }
-                    // The sender was dropped before sending anything while we prepared to park.
-                    DISCONNECTED => {
-                        // SAFETY: we started in the empty state and the sender switched us to the
-                        // disconnected state. It does not take the waker when it does this so we
-                        // need to drop it.
-                        unsafe { channel.drop_waker() };
-
-                        // SAFETY: the sender does not deallocate the channel if it switches from
-                        // empty to disconnected so we need to free the allocation
-                        unsafe { dealloc(channel_ptr) };
-
-                        Err(RecvError)
-                    }
-                    _ => unreachable!(),
-                }
-            }
-            // The sender already sent the message.
-            MESSAGE => {
-                // SAFETY: we are in the message state so the message is valid
-                let message = unsafe { channel.take_message() };
-
-                // SAFETY: we are already in the message state so the sender has been forgotten
-                // and it's our job to clean up resources
-                unsafe { dealloc(channel_ptr) };
-
-                Ok(message)
-            }
-            // The sender was dropped before sending anything, or we already received the message.
-            DISCONNECTED => {
-                // SAFETY: the sender does not deallocate the channel if it switches from empty to
-                // disconnected so we need to free the allocation
-                unsafe { dealloc(channel_ptr) };
-
-                Err(RecvError)
-            }
-            // The receiver must have been `Future::poll`ed prior to this call.
-            #[cfg(feature = "async")]
-            RECEIVING | UNPARKING => panic!("{}", RECEIVER_USED_SYNC_AND_ASYNC_ERROR),
-            _ => unreachable!(),
-        }
-    }
-
-    /// Attempts to wait for a message from the [`Sender`], returning an error if the channel is
-    /// disconnected. This is a non consuming version of [`Receiver::recv`], but with a bit
-    /// worse performance. Prefer `[`Receiver::recv`]` if your code allows consuming the receiver.
-    ///
-    /// If a message is returned, the channel is disconnected and any subsequent receive operation
-    /// using this receiver will return an error.
-    ///
-    /// # Panics
-    ///
-    /// Panics if called after this receiver has been polled asynchronously.
-    #[cfg(feature = "std")]
-    pub fn recv_ref(&self) -> Result<T, RecvError> {
-        self.start_recv_ref(RecvError, |channel| {
-            loop {
-                thread::park();
-
-                // ORDERING: we use acquire ordering to synchronize with the write of the message
-                match channel.state.load(Acquire) {
-                    // The sender sent the message while we were parked.
-                    // We take the message and mark the channel disconnected.
-                    MESSAGE => {
-                        // ORDERING: the sender is inactive at this point so we don't need to make
-                        // any reads or writes visible to the sending thread
-                        channel.state.store(DISCONNECTED, Relaxed);
-
-                        // SAFETY: we were just in the message state so the message is valid
-                        break Ok(unsafe { channel.take_message() });
-                    }
-                    // The sender was dropped while we were parked.
-                    DISCONNECTED => break Err(RecvError),
-                    // State did not change, spurious wakeup, park again.
-                    RECEIVING | UNPARKING => (),
-                    _ => unreachable!(),
-                }
-            }
-        })
-    }
-
-    /// Like [`Receiver::recv`], but will not block longer than `timeout`. Returns:
-    ///  * `Ok(message)` if there was a message in the channel before the timeout was reached.
-    ///  * `Err(Timeout)` if no message arrived on the channel before the timeout was reached.
-    ///  * `Err(Disconnected)` if the sender was dropped before sending anything or if the message
-    ///    has already been extracted by a previous receive call.
-    ///
-    /// If a message is returned, the channel is disconnected and any subsequent receive operation
-    /// using this receiver will return an error.
-    ///
-    /// If the supplied `timeout` is so large that Rust's `Instant` type can't represent this point
-    /// in the future this falls back to an indefinitely blocking receive operation.
-    ///
-    /// # Panics
-    ///
-    /// Panics if called after this receiver has been polled asynchronously.
-    #[cfg(feature = "std")]
-    pub fn recv_timeout(&self, timeout: Duration) -> Result<T, RecvTimeoutError> {
-        match Instant::now().checked_add(timeout) {
-            Some(deadline) => self.recv_deadline(deadline),
-            None => self.recv_ref().map_err(|_| RecvTimeoutError::Disconnected),
-        }
-    }
-
-    /// Like [`Receiver::recv`], but will not block longer than until `deadline`. Returns:
-    ///  * `Ok(message)` if there was a message in the channel before the deadline was reached.
-    ///  * `Err(Timeout)` if no message arrived on the channel before the deadline was reached.
-    ///  * `Err(Disconnected)` if the sender was dropped before sending anything or if the message
-    ///    has already been extracted by a previous receive call.
-    ///
-    /// If a message is returned, the channel is disconnected and any subsequent receive operation
-    /// using this receiver will return an error.
-    ///
-    /// # Panics
-    ///
-    /// Panics if called after this receiver has been polled asynchronously.
-    #[cfg(feature = "std")]
-    pub fn recv_deadline(&self, deadline: Instant) -> Result<T, RecvTimeoutError> {
-        /// # Safety
-        ///
-        /// If the sender is unparking us after a message send, the message must already have been
-        /// written to the channel and an acquire memory barrier issued before calling this function
-        #[cold]
-        unsafe fn wait_for_unpark<T>(channel: &Channel<T>) -> Result<T, RecvTimeoutError> {
-            loop {
-                thread::park();
-
-                // ORDERING: The callee has already synchronized with any message write
-                match channel.state.load(Relaxed) {
-                    MESSAGE => {
-                        // ORDERING: the sender has been dropped, so this update only
-                        // needs to be visible to us
-                        channel.state.store(DISCONNECTED, Relaxed);
-                        break Ok(channel.take_message());
-                    }
-                    DISCONNECTED => break Err(RecvTimeoutError::Disconnected),
-                    // The sender is still unparking us. We continue on the empty state here since
-                    // the current implementation eagerly sets the state to EMPTY upon timeout.
-                    EMPTY => (),
-                    _ => unreachable!(),
-                }
-            }
-        }
-
-        self.start_recv_ref(RecvTimeoutError::Disconnected, |channel| {
-            loop {
-                match deadline.checked_duration_since(Instant::now()) {
-                    Some(timeout) => {
-                        thread::park_timeout(timeout);
-
-                        // ORDERING: synchronize with the write of the message
-                        match channel.state.load(Acquire) {
-                            // The sender sent the message while we were parked.
-                            MESSAGE => {
-                                // ORDERING: the sender has been `mem::forget`-ed so this update
-                                // only needs to be visible to us.
-                                channel.state.store(DISCONNECTED, Relaxed);
-
-                                // SAFETY: we either are in the message state or were just in the
-                                // message state
-                                break Ok(unsafe { channel.take_message() });
-                            }
-                            // The sender was dropped while we were parked.
-                            DISCONNECTED => break Err(RecvTimeoutError::Disconnected),
-                            // State did not change, spurious wakeup, park again.
-                            RECEIVING | UNPARKING => (),
-                            _ => unreachable!(),
-                        }
-                    }
-                    None => {
-                        // ORDERING: synchronize with the write of the message
-                        match channel.state.swap(EMPTY, Acquire) {
-                            // We reached the end of the timeout without receiving a message
-                            RECEIVING => {
-                                // SAFETY: we were in the receiving state and are now in the empty
-                                // state, so the sender has not and will not try to read the waker,
-                                // so we have exclusive access to drop it.
-                                unsafe { channel.drop_waker() };
-
-                                break Err(RecvTimeoutError::Timeout);
-                            }
-                            // The sender sent the message while we were parked.
-                            MESSAGE => {
-                                // Same safety and ordering as the Some branch
-
-                                channel.state.store(DISCONNECTED, Relaxed);
-                                break Ok(unsafe { channel.take_message() });
-                            }
-                            // The sender was dropped while we were parked.
-                            DISCONNECTED => {
-                                // ORDERING: we were originally in the disconnected state meaning
-                                // that the sender is inactive and no longer observing the state,
-                                // so we only need to change it back to DISCONNECTED for if the
-                                // receiver is dropped or a recv* method is called again
-                                channel.state.store(DISCONNECTED, Relaxed);
-
-                                break Err(RecvTimeoutError::Disconnected);
-                            }
-                            // The sender sent the message and started unparking us
-                            UNPARKING => {
-                                // We were in the UNPARKING state and are now in the EMPTY state.
-                                // We wait to be properly unparked and to observe if the sender
-                                // sets MESSAGE or DISCONNECTED state.
-                                // SAFETY: The load above has synchronized with any message write.
-                                break unsafe { wait_for_unpark(channel) };
-                            }
-                            _ => unreachable!(),
-                        }
-                    }
-                }
-            }
-        })
-    }
-
-    /// Begins the process of receiving on the channel by reference. If the message is already
-    /// ready, or the sender has disconnected, then this function will return the appropriate
-    /// Result immediately. Otherwise, it will write the waker to memory, check to see if the
-    /// sender has finished or disconnected again, and then will call `finish`. `finish` is
-    /// thus responsible for cleaning up the channel's resources appropriately before it returns,
-    /// such as destroying the waker, for instance.
-    #[cfg(feature = "std")]
-    #[inline]
-    fn start_recv_ref<E>(
-        &self,
-        disconnected_error: E,
-        finish: impl FnOnce(&Channel<T>) -> Result<T, E>,
-    ) -> Result<T, E> {
-        // SAFETY: the existence of the `self` parameter serves as a certificate that the receiver
-        // is still alive, meaning that even if the sender was dropped then it would have observed
-        // the fact that we're still alive and left the responsibility of deallocating the
-        // channel to us, so `self.channel` is valid
-        let channel = unsafe { self.channel_ptr.as_ref() };
-
-        // ORDERING: synchronize with the write of the message
-        match channel.state.load(Acquire) {
-            // The sender is alive but has not sent anything yet. We prepare to park.
-            EMPTY => {
-                // Conditionally add a delay here to help the tests trigger the edge cases where
-                // the sender manages to be dropped or send something before we are able to store
-                // our waker object in the channel.
-                #[cfg(oneshot_test_delay)]
-                std::thread::sleep(std::time::Duration::from_millis(10));
-
-                // Write our waker instance to the channel.
-                // SAFETY: we are not yet in the RECEIVING state, meaning that the sender will not
-                // try to access the waker until it sees the state set to RECEIVING below
-                unsafe { channel.write_waker(ReceiverWaker::current_thread()) };
-
-                // ORDERING: we use release ordering on success so the sender can synchronize with
-                // our write of the waker. We use relaxed ordering on failure since the sender does
-                // not need to synchronize with our write and the individual match arms handle any
-                // additional synchronization
-                match channel
-                    .state
-                    .compare_exchange(EMPTY, RECEIVING, Release, Relaxed)
-                {
-                    // We stored our waker, now we delegate to the callback to finish the receive
-                    // operation
-                    Ok(_) => finish(channel),
-                    // The sender sent the message while we prepared to finish
-                    Err(MESSAGE) => {
-                        // See comments in `recv` for ordering and safety
-
-                        fence(Acquire);
-
-                        unsafe { channel.drop_waker() };
-
-                        // ORDERING: the sender has been `mem::forget`-ed so this update only
-                        // needs to be visible to us
-                        channel.state.store(DISCONNECTED, Relaxed);
-
-                        // SAFETY: The MESSAGE state tells us there is a correctly initialized
-                        // message
-                        Ok(unsafe { channel.take_message() })
-                    }
-                    // The sender was dropped before sending anything while we prepared to park.
-                    Err(DISCONNECTED) => {
-                        // See comments in `recv` for safety
-                        unsafe { channel.drop_waker() };
-                        Err(disconnected_error)
-                    }
-                    _ => unreachable!(),
-                }
-            }
-            // The sender sent the message. We take the message and mark the channel disconnected.
-            MESSAGE => {
-                // ORDERING: the sender has been `mem::forget`-ed so this update only needs to be
-                // visible to us
-                channel.state.store(DISCONNECTED, Relaxed);
-
-                // SAFETY: we are in the message state so the message is valid
-                Ok(unsafe { channel.take_message() })
-            }
-            // The sender was dropped before sending anything, or we already received the message.
-            DISCONNECTED => Err(disconnected_error),
-            // The receiver must have been `Future::poll`ed prior to this call.
-            #[cfg(feature = "async")]
-            RECEIVING | UNPARKING => panic!("{}", RECEIVER_USED_SYNC_AND_ASYNC_ERROR),
-            _ => unreachable!(),
-        }
-    }
-
-    /// Consumes the Receiver, returning a raw pointer to the channel on the heap.
-    ///
-    /// This is intended to simplify using oneshot channels with some FFI code. The only safe thing
-    /// to do with the returned pointer is to later reconstruct the Receiver with
-    /// [Receiver::from_raw]. Memory will leak if the Receiver is never reconstructed.
-    pub fn into_raw(self) -> *mut () {
-        let raw = self.channel_ptr.as_ptr() as *mut ();
-        mem::forget(self);
-        raw
-    }
-
-    /// Consumes a raw pointer from [Receiver::into_raw], recreating the Receiver.
-    ///
-    /// # Safety
-    ///
-    /// This pointer must have come from [`Receiver<T>::into_raw`] with the same message type, `T`.
-    /// At most one Receiver must exist for a channel at any point in time.
-    /// Constructing multiple Receivers from the same raw pointer leads to undefined behavior.
-    pub unsafe fn from_raw(raw: *mut ()) -> Self {
-        Self {
-            channel_ptr: NonNull::new_unchecked(raw as *mut Channel<T>),
-        }
-    }
-}
-
-#[cfg(feature = "async")]
-impl<T> core::future::Future for Receiver<T> {
-    type Output = Result<T, RecvError>;
-
-    fn poll(self: Pin<&mut Self>, cx: &mut task::Context<'_>) -> Poll<Self::Output> {
-        // SAFETY: the existence of the `self` parameter serves as a certificate that the receiver
-        // is still alive, meaning that even if the sender was dropped then it would have observed
-        // the fact that we're still alive and left the responsibility of deallocating the
-        // channel to us, so `self.channel` is valid
-        let channel = unsafe { self.channel_ptr.as_ref() };
-
-        // ORDERING: we use acquire ordering to synchronize with the store of the message.
-        match channel.state.load(Acquire) {
-            // The sender is alive but has not sent anything yet.
-            EMPTY => {
-                // SAFETY: We can't be in the forbidden states, and no waker in the channel.
-                unsafe { channel.write_async_waker(cx) }
-            }
-            // We were polled again while waiting for the sender. Replace the waker with the new one.
-            RECEIVING => {
-                // ORDERING: We use relaxed ordering on both success and failure since we have not
-                // written anything above that must be released, and the individual match arms
-                // handle any additional synchronization.
-                match channel
-                    .state
-                    .compare_exchange(RECEIVING, EMPTY, Relaxed, Relaxed)
-                {
-                    // We successfully changed the state back to EMPTY. Replace the waker.
-                    // This is the most likely branch to be taken, which is why we don't use any
-                    // memory barriers in the compare_exchange above.
-                    Ok(_) => {
-                        // SAFETY: We wrote the waker in a previous call to poll. We do not need
-                        // a memory barrier since the previous write here was by ourselves.
-                        unsafe { channel.drop_waker() };
-                        // SAFETY: We can't be in the forbidden states, and no waker in the channel.
-                        unsafe { channel.write_async_waker(cx) }
-                    }
-                    // The sender sent the message while we prepared to replace the waker.
-                    // We take the message and mark the channel disconnected.
-                    // The sender has already taken the waker.
-                    Err(MESSAGE) => {
-                        // ORDERING: Synchronize with the write of the message. This branch is
-                        // unlikely to be taken.
-                        channel.state.swap(DISCONNECTED, Acquire);
-                        // SAFETY: The state tells us the sender has initialized the message.
-                        Poll::Ready(Ok(unsafe { channel.take_message() }))
-                    }
-                    // The sender was dropped before sending anything while we prepared to park.
-                    // The sender has taken the waker already.
-                    Err(DISCONNECTED) => Poll::Ready(Err(RecvError)),
-                    // The sender is currently waking us up.
-                    Err(UNPARKING) => {
-                        // We can't trust that the old waker that the sender has access to
-                        // is honored by the async runtime at this point. So we wake ourselves
-                        // up to get polled instantly again.
-                        cx.waker().wake_by_ref();
-                        Poll::Pending
-                    }
-                    _ => unreachable!(),
-                }
-            }
-            // The sender sent the message.
-            MESSAGE => {
-                // ORDERING: the sender has been dropped so this update only needs to be
-                // visible to us
-                channel.state.store(DISCONNECTED, Relaxed);
-                Poll::Ready(Ok(unsafe { channel.take_message() }))
-            }
-            // The sender was dropped before sending anything, or we already received the message.
-            DISCONNECTED => Poll::Ready(Err(RecvError)),
-            // The sender has observed the RECEIVING state and is currently reading the waker from
-            // a previous poll. We need to loop here until we observe the MESSAGE or DISCONNECTED
-            // state. We busy loop here since we know the sender is done very soon.
-            UNPARKING => loop {
-                hint::spin_loop();
-                // ORDERING: The load above has already synchronized with the write of the message.
-                match channel.state.load(Relaxed) {
-                    MESSAGE => {
-                        // ORDERING: the sender has been dropped, so this update only
-                        // needs to be visible to us
-                        channel.state.store(DISCONNECTED, Relaxed);
-                        // SAFETY: We observed the MESSAGE state
-                        break Poll::Ready(Ok(unsafe { channel.take_message() }));
-                    }
-                    DISCONNECTED => break Poll::Ready(Err(RecvError)),
-                    UNPARKING => (),
-                    _ => unreachable!(),
-                }
-            },
-            _ => unreachable!(),
-        }
-    }
-}
-
-impl<T> Drop for Receiver<T> {
-    fn drop(&mut self) {
-        // SAFETY: since the receiving side is still alive the sender would have observed that and
-        // left deallocating the channel allocation to us.
-        let channel = unsafe { self.channel_ptr.as_ref() };
-
-        // Set the channel state to disconnected and read what state the receiver was in
-        match channel.state.swap(DISCONNECTED, Acquire) {
-            // The sender has not sent anything, nor is it dropped.
-            EMPTY => (),
-            // The sender already sent something. We must drop it, and free the channel.
-            MESSAGE => {
-                // SAFETY: we are in the message state so the message is initialized
-                unsafe { channel.drop_message() };
-
-                // SAFETY: see safety comment at top of function
-                unsafe { dealloc(self.channel_ptr) };
-            }
-            // The receiver has been polled.
-            #[cfg(feature = "async")]
-            RECEIVING => {
-                // TODO: figure this out when async is fixed
-                unsafe { channel.drop_waker() };
-            }
-            // The sender was already dropped. We are responsible for freeing the channel.
-            DISCONNECTED => {
-                // SAFETY: see safety comment at top of function
-                unsafe { dealloc(self.channel_ptr) };
-            }
-            _ => unreachable!(),
-        }
-    }
-}
-
-/// All the values that the `Channel::state` field can have during the lifetime of a channel.
-mod states {
-    // These values are very explicitly chosen so that we can replace some cmpxchg calls with
-    // fetch_* calls.
-
-    /// The initial channel state. Active while both endpoints are still alive, no message has been
-    /// sent, and the receiver is not receiving.
-    pub const EMPTY: u8 = 0b011;
-    /// A message has been sent to the channel, but the receiver has not yet read it.
-    pub const MESSAGE: u8 = 0b100;
-    /// No message has yet been sent on the channel, but the receiver is currently receiving.
-    pub const RECEIVING: u8 = 0b000;
-    #[cfg(any(feature = "std", feature = "async"))]
-    pub const UNPARKING: u8 = 0b001;
-    /// The channel has been closed. This means that either the sender or receiver has been dropped,
-    /// or the message sent to the channel has already been received. Since this is a oneshot
-    /// channel, it is disconnected after the one message it is supposed to hold has been
-    /// transmitted.
-    pub const DISCONNECTED: u8 = 0b010;
-}
-use states::*;
-
-/// Internal channel data structure structure. the `channel` method allocates and puts one instance
-/// of this struct on the heap for each oneshot channel instance. The struct holds:
-/// * The current state of the channel.
-/// * The message in the channel. This memory is uninitialized until the message is sent.
-/// * The waker instance for the thread or task that is currently receiving on this channel.
-///   This memory is uninitialized until the receiver starts receiving.
-struct Channel<T> {
-    state: AtomicU8,
-    message: UnsafeCell<MaybeUninit<T>>,
-    waker: UnsafeCell<MaybeUninit<ReceiverWaker>>,
-}
-
-impl<T> Channel<T> {
-    pub fn new() -> Self {
-        Self {
-            state: AtomicU8::new(EMPTY),
-            message: UnsafeCell::new(MaybeUninit::uninit()),
-            waker: UnsafeCell::new(MaybeUninit::uninit()),
-        }
-    }
-
-    #[inline(always)]
-    unsafe fn message(&self) -> &MaybeUninit<T> {
-        #[cfg(loom)]
-        {
-            self.message.with(|ptr| &*ptr)
-        }
-
-        #[cfg(not(loom))]
-        {
-            &*self.message.get()
-        }
-    }
-
-    #[inline(always)]
-    unsafe fn with_message_mut<F>(&self, op: F)
-    where
-        F: FnOnce(&mut MaybeUninit<T>),
-    {
-        #[cfg(loom)]
-        {
-            self.message.with_mut(|ptr| op(&mut *ptr))
-        }
-
-        #[cfg(not(loom))]
-        {
-            op(&mut *self.message.get())
-        }
-    }
-
-    #[inline(always)]
-    #[cfg(any(feature = "std", feature = "async"))]
-    unsafe fn with_waker_mut<F>(&self, op: F)
-    where
-        F: FnOnce(&mut MaybeUninit<ReceiverWaker>),
-    {
-        #[cfg(loom)]
-        {
-            self.waker.with_mut(|ptr| op(&mut *ptr))
-        }
-
-        #[cfg(not(loom))]
-        {
-            op(&mut *self.waker.get())
-        }
-    }
-
-    #[inline(always)]
-    unsafe fn write_message(&self, message: T) {
-        self.with_message_mut(|slot| slot.as_mut_ptr().write(message));
-    }
-
-    #[inline(always)]
-    unsafe fn take_message(&self) -> T {
-        #[cfg(loom)]
-        {
-            self.message.with(|ptr| ptr::read(ptr)).assume_init()
-        }
-
-        #[cfg(not(loom))]
-        {
-            ptr::read(self.message.get()).assume_init()
-        }
-    }
-
-    #[inline(always)]
-    unsafe fn drop_message(&self) {
-        self.with_message_mut(|slot| slot.assume_init_drop());
-    }
-
-    #[cfg(any(feature = "std", feature = "async"))]
-    #[inline(always)]
-    unsafe fn write_waker(&self, waker: ReceiverWaker) {
-        self.with_waker_mut(|slot| slot.as_mut_ptr().write(waker));
-    }
-
-    #[inline(always)]
-    unsafe fn take_waker(&self) -> ReceiverWaker {
-        #[cfg(loom)]
-        {
-            self.waker.with(|ptr| ptr::read(ptr)).assume_init()
-        }
-
-        #[cfg(not(loom))]
-        {
-            ptr::read(self.waker.get()).assume_init()
-        }
-    }
-
-    #[cfg(any(feature = "std", feature = "async"))]
-    #[inline(always)]
-    unsafe fn drop_waker(&self) {
-        self.with_waker_mut(|slot| slot.assume_init_drop());
-    }
-
-    /// # Safety
-    ///
-    /// * `Channel::waker` must not have a waker stored in it when calling this method.
-    /// * Channel state must not be RECEIVING or UNPARKING when calling this method.
-    #[cfg(feature = "async")]
-    unsafe fn write_async_waker(&self, cx: &mut task::Context<'_>) -> Poll<Result<T, RecvError>> {
-        // Write our thread instance to the channel.
-        // SAFETY: we are not yet in the RECEIVING state, meaning that the sender will not
-        // try to access the waker until it sees the state set to RECEIVING below
-        self.write_waker(ReceiverWaker::task_waker(cx));
-
-        // ORDERING: we use release ordering on success so the sender can synchronize with
-        // our write of the waker. We use relaxed ordering on failure since the sender does
-        // not need to synchronize with our write and the individual match arms handle any
-        // additional synchronization
-        match self
-            .state
-            .compare_exchange(EMPTY, RECEIVING, Release, Relaxed)
-        {
-            // We stored our waker, now we return and let the sender wake us up
-            Ok(_) => Poll::Pending,
-            // The sender sent the message while we prepared to park.
-            // We take the message and mark the channel disconnected.
-            Err(MESSAGE) => {
-                // ORDERING: Synchronize with the write of the message. This branch is
-                // unlikely to be taken, so it's likely more efficient to use a fence here
-                // instead of AcqRel ordering on the compare_exchange operation
-                fence(Acquire);
-
-                // SAFETY: we started in the EMPTY state and the sender switched us to the
-                // MESSAGE state. This means that it did not take the waker, so we're
-                // responsible for dropping it.
-                self.drop_waker();
-
-                // ORDERING: sender does not exist, so this update only needs to be visible to us
-                self.state.store(DISCONNECTED, Relaxed);
-
-                // SAFETY: The MESSAGE state tells us there is a correctly initialized message
-                Poll::Ready(Ok(self.take_message()))
-            }
-            // The sender was dropped before sending anything while we prepared to park.
-            Err(DISCONNECTED) => {
-                // SAFETY: we started in the EMPTY state and the sender switched us to the
-                // DISCONNECTED state. This means that it did not take the waker, so we're
-                // responsible for dropping it.
-                self.drop_waker();
-                Poll::Ready(Err(RecvError))
-            }
-            _ => unreachable!(),
-        }
-    }
-}
-
-enum ReceiverWaker {
-    /// The receiver is waiting synchronously. Its thread is parked.
-    #[cfg(feature = "std")]
-    Thread(thread::Thread),
-    /// The receiver is waiting asynchronously. Its task can be woken up with this `Waker`.
-    #[cfg(feature = "async")]
-    Task(task::Waker),
-    /// A little hack to not make this enum an uninhibitable type when no features are enabled.
-    #[cfg(not(any(feature = "async", feature = "std")))]
-    _Uninhabited,
-}
-
-impl ReceiverWaker {
-    #[cfg(feature = "std")]
-    pub fn current_thread() -> Self {
-        Self::Thread(thread::current())
-    }
-
-    #[cfg(feature = "async")]
-    pub fn task_waker(cx: &task::Context<'_>) -> Self {
-        Self::Task(cx.waker().clone())
-    }
-
-    pub fn unpark(self) {
-        match self {
-            #[cfg(feature = "std")]
-            ReceiverWaker::Thread(thread) => thread.unpark(),
-            #[cfg(feature = "async")]
-            ReceiverWaker::Task(waker) => waker.wake(),
-            #[cfg(not(any(feature = "async", feature = "std")))]
-            ReceiverWaker::_Uninhabited => unreachable!(),
-        }
-    }
-}
-
-#[cfg(not(loom))]
-#[test]
-fn receiver_waker_size() {
-    let expected: usize = match (cfg!(feature = "std"), cfg!(feature = "async")) {
-        (false, false) => 0,
-        (false, true) => 16,
-        (true, false) => 8,
-        (true, true) => 16,
-    };
-    assert_eq!(mem::size_of::<ReceiverWaker>(), expected);
-}
-
-#[cfg(all(feature = "std", feature = "async"))]
-const RECEIVER_USED_SYNC_AND_ASYNC_ERROR: &str =
-    "Invalid to call a blocking receive method on oneshot::Receiver after it has been polled";
-
-#[inline]
-pub(crate) unsafe fn dealloc<T>(channel: NonNull<Channel<T>>) {
-    drop(Box::from_raw(channel.as_ptr()))
-}
diff --git a/crates/oneshot-uniffi/src/loombox.rs b/crates/oneshot-uniffi/src/loombox.rs
deleted file mode 100644
index 615db30..0000000
--- a/crates/oneshot-uniffi/src/loombox.rs
+++ /dev/null
@@ -1,151 +0,0 @@
-use core::{borrow, fmt, hash, mem, ptr};
-use loom::alloc;
-
-pub struct Box<T: ?Sized> {
-    ptr: *mut T,
-}
-
-impl<T> Box<T> {
-    pub fn new(value: T) -> Self {
-        let layout = alloc::Layout::new::<T>();
-        let ptr = unsafe { alloc::alloc(layout) } as *mut T;
-        unsafe { ptr::write(ptr, value) };
-        Self { ptr }
-    }
-}
-
-impl<T: ?Sized> Box<T> {
-    #[inline]
-    pub fn into_raw(b: Box<T>) -> *mut T {
-        let ptr = b.ptr;
-        mem::forget(b);
-        ptr
-    }
-
-    pub const unsafe fn from_raw(ptr: *mut T) -> Box<T> {
-        Self { ptr }
-    }
-}
-
-impl<T: ?Sized> Drop for Box<T> {
-    fn drop(&mut self) {
-        unsafe {
-            let size = mem::size_of_val(&*self.ptr);
-            let align = mem::align_of_val(&*self.ptr);
-            let layout = alloc::Layout::from_size_align(size, align).unwrap();
-            ptr::drop_in_place(self.ptr);
-            alloc::dealloc(self.ptr as *mut u8, layout);
-        }
-    }
-}
-
-unsafe impl<T: Send> Send for Box<T> {}
-unsafe impl<T: Sync> Sync for Box<T> {}
-
-impl<T: ?Sized> core::ops::Deref for Box<T> {
-    type Target = T;
-
-    fn deref(&self) -> &T {
-        unsafe { &*self.ptr }
-    }
-}
-
-impl<T: ?Sized> core::ops::DerefMut for Box<T> {
-    fn deref_mut(&mut self) -> &mut T {
-        unsafe { &mut *self.ptr }
-    }
-}
-
-impl<T: ?Sized> borrow::Borrow<T> for Box<T> {
-    fn borrow(&self) -> &T {
-        &**self
-    }
-}
-
-impl<T: ?Sized> borrow::BorrowMut<T> for Box<T> {
-    fn borrow_mut(&mut self) -> &mut T {
-        &mut **self
-    }
-}
-
-impl<T: ?Sized> AsRef<T> for Box<T> {
-    fn as_ref(&self) -> &T {
-        &**self
-    }
-}
-
-impl<T: ?Sized> AsMut<T> for Box<T> {
-    fn as_mut(&mut self) -> &mut T {
-        &mut **self
-    }
-}
-
-impl<T: fmt::Display + ?Sized> fmt::Display for Box<T> {
-    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
-        fmt::Display::fmt(&**self, f)
-    }
-}
-
-impl<T: fmt::Debug + ?Sized> fmt::Debug for Box<T> {
-    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
-        fmt::Debug::fmt(&**self, f)
-    }
-}
-
-impl<T: Clone> Clone for Box<T> {
-    #[inline]
-    fn clone(&self) -> Box<T> {
-        Self::new(self.as_ref().clone())
-    }
-}
-
-impl<T: ?Sized + PartialEq> PartialEq for Box<T> {
-    #[inline]
-    fn eq(&self, other: &Box<T>) -> bool {
-        PartialEq::eq(&**self, &**other)
-    }
-
-    #[allow(clippy::partialeq_ne_impl)]
-    #[inline]
-    fn ne(&self, other: &Box<T>) -> bool {
-        PartialEq::ne(&**self, &**other)
-    }
-}
-
-impl<T: ?Sized + Eq> Eq for Box<T> {}
-
-impl<T: ?Sized + PartialOrd> PartialOrd for Box<T> {
-    #[inline]
-    fn partial_cmp(&self, other: &Box<T>) -> Option<core::cmp::Ordering> {
-        PartialOrd::partial_cmp(&**self, &**other)
-    }
-    #[inline]
-    fn lt(&self, other: &Box<T>) -> bool {
-        PartialOrd::lt(&**self, &**other)
-    }
-    #[inline]
-    fn le(&self, other: &Box<T>) -> bool {
-        PartialOrd::le(&**self, &**other)
-    }
-    #[inline]
-    fn ge(&self, other: &Box<T>) -> bool {
-        PartialOrd::ge(&**self, &**other)
-    }
-    #[inline]
-    fn gt(&self, other: &Box<T>) -> bool {
-        PartialOrd::gt(&**self, &**other)
-    }
-}
-
-impl<T: ?Sized + Ord> Ord for Box<T> {
-    #[inline]
-    fn cmp(&self, other: &Box<T>) -> core::cmp::Ordering {
-        Ord::cmp(&**self, &**other)
-    }
-}
-
-impl<T: ?Sized + hash::Hash> hash::Hash for Box<T> {
-    fn hash<H: hash::Hasher>(&self, state: &mut H) {
-        (**self).hash(state);
-    }
-}
diff --git a/crates/oneshot-uniffi/tests/assert_mem.rs b/crates/oneshot-uniffi/tests/assert_mem.rs
deleted file mode 100644
index a993ad7..0000000
--- a/crates/oneshot-uniffi/tests/assert_mem.rs
+++ /dev/null
@@ -1,37 +0,0 @@
-use oneshot::{Receiver, Sender};
-use std::mem;
-
-/// Just sanity check that both channel endpoints stay the size of a single pointer.
-#[test]
-fn channel_endpoints_single_pointer() {
-    const PTR_SIZE: usize = mem::size_of::<*const ()>();
-
-    assert_eq!(mem::size_of::<Sender<()>>(), PTR_SIZE);
-    assert_eq!(mem::size_of::<Receiver<()>>(), PTR_SIZE);
-
-    assert_eq!(mem::size_of::<Sender<u8>>(), PTR_SIZE);
-    assert_eq!(mem::size_of::<Receiver<u8>>(), PTR_SIZE);
-
-    assert_eq!(mem::size_of::<Sender<[u8; 1024]>>(), PTR_SIZE);
-    assert_eq!(mem::size_of::<Receiver<[u8; 1024]>>(), PTR_SIZE);
-
-    assert_eq!(mem::size_of::<Option<Sender<[u8; 1024]>>>(), PTR_SIZE);
-    assert_eq!(mem::size_of::<Option<Receiver<[u8; 1024]>>>(), PTR_SIZE);
-}
-
-/// Check that the `SendError` stays small. Useful to automatically detect if it is refactored
-/// to become large. We do not want the stack requirement for calling `Sender::send` to grow.
-#[test]
-fn error_sizes() {
-    const PTR_SIZE: usize = mem::size_of::<usize>();
-
-    assert_eq!(mem::size_of::<oneshot::SendError<()>>(), PTR_SIZE);
-    assert_eq!(mem::size_of::<oneshot::SendError<u8>>(), PTR_SIZE);
-    assert_eq!(mem::size_of::<oneshot::SendError<[u8; 1024]>>(), PTR_SIZE);
-
-    // The type returned from `Sender::send` is also just pointer sized
-    assert_eq!(
-        mem::size_of::<Result<(), oneshot::SendError<[u8; 1024]>>>(),
-        PTR_SIZE
-    );
-}
diff --git a/crates/oneshot-uniffi/tests/async.rs b/crates/oneshot-uniffi/tests/async.rs
deleted file mode 100644
index 59acbf5..0000000
--- a/crates/oneshot-uniffi/tests/async.rs
+++ /dev/null
@@ -1,129 +0,0 @@
-#![cfg(not(soong))]
-#![cfg(all(feature = "async", not(loom)))]
-
-use core::mem;
-use core::time::Duration;
-
-mod helpers;
-use helpers::DropCounter;
-
-#[tokio::test]
-async fn send_before_await_tokio() {
-    let (sender, receiver) = oneshot::channel();
-    assert!(sender.send(19i128).is_ok());
-    assert_eq!(receiver.await, Ok(19i128));
-}
-
-#[async_std::test]
-async fn send_before_await_async_std() {
-    let (sender, receiver) = oneshot::channel();
-    assert!(sender.send(19i128).is_ok());
-    assert_eq!(receiver.await, Ok(19i128));
-}
-
-#[tokio::test]
-async fn await_with_dropped_sender_tokio() {
-    let (sender, receiver) = oneshot::channel::<u128>();
-    mem::drop(sender);
-    receiver.await.unwrap_err();
-}
-
-#[async_std::test]
-async fn await_with_dropped_sender_async_std() {
-    let (sender, receiver) = oneshot::channel::<u128>();
-    mem::drop(sender);
-    receiver.await.unwrap_err();
-}
-
-#[tokio::test]
-async fn await_before_send_tokio() {
-    let (sender, receiver) = oneshot::channel();
-    let (message, counter) = DropCounter::new(79u128);
-    let t = tokio::spawn(async move {
-        tokio::time::sleep(Duration::from_millis(10)).await;
-        sender.send(message)
-    });
-    let returned_message = receiver.await.unwrap();
-    assert_eq!(counter.count(), 0);
-    assert_eq!(*returned_message.value(), 79u128);
-    mem::drop(returned_message);
-    assert_eq!(counter.count(), 1);
-    t.await.unwrap().unwrap();
-}
-
-#[async_std::test]
-async fn await_before_send_async_std() {
-    let (sender, receiver) = oneshot::channel();
-    let (message, counter) = DropCounter::new(79u128);
-    let t = async_std::task::spawn(async move {
-        async_std::task::sleep(Duration::from_millis(10)).await;
-        sender.send(message)
-    });
-    let returned_message = receiver.await.unwrap();
-    assert_eq!(counter.count(), 0);
-    assert_eq!(*returned_message.value(), 79u128);
-    mem::drop(returned_message);
-    assert_eq!(counter.count(), 1);
-    t.await.unwrap();
-}
-
-#[tokio::test]
-async fn await_before_send_then_drop_sender_tokio() {
-    let (sender, receiver) = oneshot::channel::<u128>();
-    let t = tokio::spawn(async {
-        tokio::time::sleep(Duration::from_millis(10)).await;
-        mem::drop(sender);
-    });
-    assert!(receiver.await.is_err());
-    t.await.unwrap();
-}
-
-#[async_std::test]
-async fn await_before_send_then_drop_sender_async_std() {
-    let (sender, receiver) = oneshot::channel::<u128>();
-    let t = async_std::task::spawn(async {
-        async_std::task::sleep(Duration::from_millis(10)).await;
-        mem::drop(sender);
-    });
-    assert!(receiver.await.is_err());
-    t.await;
-}
-
-// Tests that the Receiver handles being used synchronously even after being polled
-#[tokio::test]
-async fn poll_future_and_then_try_recv() {
-    use core::future::Future;
-    use core::pin::Pin;
-    use core::task::{self, Poll};
-
-    struct StupidReceiverFuture(oneshot::Receiver<()>);
-
-    impl Future for StupidReceiverFuture {
-        type Output = Result<(), oneshot::RecvError>;
-
-        fn poll(mut self: Pin<&mut Self>, cx: &mut task::Context<'_>) -> Poll<Self::Output> {
-            let poll_result = Future::poll(Pin::new(&mut self.0), cx);
-            self.0.try_recv().expect_err("Should never be a message");
-            poll_result
-        }
-    }
-
-    let (sender, receiver) = oneshot::channel();
-    let t = tokio::spawn(async {
-        tokio::time::sleep(Duration::from_millis(20)).await;
-        mem::drop(sender);
-    });
-    StupidReceiverFuture(receiver).await.unwrap_err();
-    t.await.unwrap();
-}
-
-#[tokio::test]
-async fn poll_receiver_then_drop_it() {
-    let (sender, receiver) = oneshot::channel::<()>();
-    // This will poll the receiver and then give up after 100 ms.
-    tokio::time::timeout(Duration::from_millis(100), receiver)
-        .await
-        .unwrap_err();
-    // Make sure the receiver has been dropped by the runtime.
-    assert!(sender.send(()).is_err());
-}
diff --git a/crates/oneshot-uniffi/tests/future.rs b/crates/oneshot-uniffi/tests/future.rs
deleted file mode 100644
index 3895946..0000000
--- a/crates/oneshot-uniffi/tests/future.rs
+++ /dev/null
@@ -1,65 +0,0 @@
-#![cfg(feature = "async")]
-
-use core::{future, mem, pin, task};
-
-#[cfg(loom)]
-pub use loom::sync::{Arc, Mutex};
-#[cfg(not(loom))]
-pub use std::sync::{Arc, Mutex};
-
-mod helpers;
-use helpers::maybe_loom_model;
-
-#[test]
-fn multiple_receiver_polls_keeps_only_latest_waker() {
-    #[derive(Default)]
-    struct MockWaker {
-        cloned: usize,
-        dropped: usize,
-    }
-
-    fn clone_mock_waker(waker: *const ()) -> task::RawWaker {
-        let mock_waker = unsafe { Arc::from_raw(waker as *const Mutex<MockWaker>) };
-        mock_waker.lock().unwrap().cloned += 1;
-        let new_waker =
-            task::RawWaker::new(Arc::into_raw(mock_waker.clone()) as *const (), &VTABLE);
-        mem::forget(mock_waker);
-        new_waker
-    }
-
-    fn drop_mock_waker(waker: *const ()) {
-        let mock_waker = unsafe { Arc::from_raw(waker as *const Mutex<MockWaker>) };
-        mock_waker.lock().unwrap().dropped += 1;
-    }
-
-    const VTABLE: task::RawWakerVTable =
-        task::RawWakerVTable::new(clone_mock_waker, |_| (), |_| (), drop_mock_waker);
-
-    maybe_loom_model(|| {
-        let mock_waker1 = Arc::new(Mutex::new(MockWaker::default()));
-        let raw_waker1 =
-            task::RawWaker::new(Arc::into_raw(mock_waker1.clone()) as *const (), &VTABLE);
-        let waker1 = unsafe { task::Waker::from_raw(raw_waker1) };
-        let mut context1 = task::Context::from_waker(&waker1);
-
-        let (_sender, mut receiver) = oneshot::channel::<()>();
-
-        let poll_result = future::Future::poll(pin::Pin::new(&mut receiver), &mut context1);
-        assert_eq!(poll_result, task::Poll::Pending);
-        assert_eq!(mock_waker1.lock().unwrap().cloned, 1);
-        assert_eq!(mock_waker1.lock().unwrap().dropped, 0);
-
-        let mock_waker2 = Arc::new(Mutex::new(MockWaker::default()));
-        let raw_waker2 =
-            task::RawWaker::new(Arc::into_raw(mock_waker2.clone()) as *const (), &VTABLE);
-        let waker2 = unsafe { task::Waker::from_raw(raw_waker2) };
-        let mut context2 = task::Context::from_waker(&waker2);
-
-        let poll_result = future::Future::poll(pin::Pin::new(&mut receiver), &mut context2);
-        assert_eq!(poll_result, task::Poll::Pending);
-        assert_eq!(mock_waker2.lock().unwrap().cloned, 1);
-        assert_eq!(mock_waker2.lock().unwrap().dropped, 0);
-        assert_eq!(mock_waker1.lock().unwrap().cloned, 1);
-        assert_eq!(mock_waker1.lock().unwrap().dropped, 1);
-    });
-}
diff --git a/crates/oneshot-uniffi/tests/helpers/mod.rs b/crates/oneshot-uniffi/tests/helpers/mod.rs
deleted file mode 100644
index 1b14539..0000000
--- a/crates/oneshot-uniffi/tests/helpers/mod.rs
+++ /dev/null
@@ -1,63 +0,0 @@
-#![allow(dead_code)]
-
-extern crate alloc;
-
-#[cfg(not(loom))]
-use alloc::sync::Arc;
-#[cfg(not(loom))]
-use core::sync::atomic::{AtomicUsize, Ordering::SeqCst};
-#[cfg(loom)]
-use loom::sync::{
-    atomic::{AtomicUsize, Ordering::SeqCst},
-    Arc,
-};
-
-#[cfg(loom)]
-pub mod waker;
-
-pub fn maybe_loom_model(test: impl Fn() + Sync + Send + 'static) {
-    #[cfg(loom)]
-    loom::model(test);
-    #[cfg(not(loom))]
-    test();
-}
-
-pub struct DropCounter<T> {
-    drop_count: Arc<AtomicUsize>,
-    value: Option<T>,
-}
-
-pub struct DropCounterHandle(Arc<AtomicUsize>);
-
-impl<T> DropCounter<T> {
-    pub fn new(value: T) -> (Self, DropCounterHandle) {
-        let drop_count = Arc::new(AtomicUsize::new(0));
-        (
-            Self {
-                drop_count: drop_count.clone(),
-                value: Some(value),
-            },
-            DropCounterHandle(drop_count),
-        )
-    }
-
-    pub fn value(&self) -> &T {
-        self.value.as_ref().unwrap()
-    }
-
-    pub fn into_value(mut self) -> T {
-        self.value.take().unwrap()
-    }
-}
-
-impl DropCounterHandle {
-    pub fn count(&self) -> usize {
-        self.0.load(SeqCst)
-    }
-}
-
-impl<T> Drop for DropCounter<T> {
-    fn drop(&mut self) {
-        self.drop_count.fetch_add(1, SeqCst);
-    }
-}
diff --git a/crates/oneshot-uniffi/tests/helpers/waker.rs b/crates/oneshot-uniffi/tests/helpers/waker.rs
deleted file mode 100644
index 2e3f1be..0000000
--- a/crates/oneshot-uniffi/tests/helpers/waker.rs
+++ /dev/null
@@ -1,64 +0,0 @@
-//! Creates a Waker that can be observed from tests.
-
-use std::mem::forget;
-use std::sync::atomic::{AtomicU32, Ordering};
-use std::sync::Arc;
-use std::task::{RawWaker, RawWakerVTable, Waker};
-
-#[derive(Default)]
-pub struct WakerHandle {
-    clone_count: AtomicU32,
-    drop_count: AtomicU32,
-    wake_count: AtomicU32,
-}
-
-impl WakerHandle {
-    pub fn clone_count(&self) -> u32 {
-        self.clone_count.load(Ordering::Relaxed)
-    }
-
-    pub fn drop_count(&self) -> u32 {
-        self.drop_count.load(Ordering::Relaxed)
-    }
-
-    pub fn wake_count(&self) -> u32 {
-        self.wake_count.load(Ordering::Relaxed)
-    }
-}
-
-pub fn waker() -> (Waker, Arc<WakerHandle>) {
-    let waker_handle = Arc::new(WakerHandle::default());
-    let waker_handle_ptr = Arc::into_raw(waker_handle.clone());
-    let raw_waker = RawWaker::new(waker_handle_ptr as *const _, waker_vtable());
-    (unsafe { Waker::from_raw(raw_waker) }, waker_handle)
-}
-
-pub(super) fn waker_vtable() -> &'static RawWakerVTable {
-    &RawWakerVTable::new(clone_raw, wake_raw, wake_by_ref_raw, drop_raw)
-}
-
-unsafe fn clone_raw(data: *const ()) -> RawWaker {
-    let handle: Arc<WakerHandle> = Arc::from_raw(data as *const _);
-    handle.clone_count.fetch_add(1, Ordering::Relaxed);
-    forget(handle.clone());
-    forget(handle);
-    RawWaker::new(data, waker_vtable())
-}
-
-unsafe fn wake_raw(data: *const ()) {
-    let handle: Arc<WakerHandle> = Arc::from_raw(data as *const _);
-    handle.wake_count.fetch_add(1, Ordering::Relaxed);
-    handle.drop_count.fetch_add(1, Ordering::Relaxed);
-}
-
-unsafe fn wake_by_ref_raw(data: *const ()) {
-    let handle: Arc<WakerHandle> = Arc::from_raw(data as *const _);
-    handle.wake_count.fetch_add(1, Ordering::Relaxed);
-    forget(handle)
-}
-
-unsafe fn drop_raw(data: *const ()) {
-    let handle: Arc<WakerHandle> = Arc::from_raw(data as *const _);
-    handle.drop_count.fetch_add(1, Ordering::Relaxed);
-    drop(handle)
-}
diff --git a/crates/oneshot-uniffi/tests/loom.rs b/crates/oneshot-uniffi/tests/loom.rs
deleted file mode 100644
index a7625a4..0000000
--- a/crates/oneshot-uniffi/tests/loom.rs
+++ /dev/null
@@ -1,223 +0,0 @@
-#![cfg(loom)]
-
-use oneshot::TryRecvError;
-
-use loom::hint;
-use loom::thread;
-#[cfg(feature = "async")]
-use std::future::Future;
-#[cfg(feature = "async")]
-use std::pin::Pin;
-#[cfg(feature = "async")]
-use std::task::{self, Poll};
-#[cfg(feature = "std")]
-use std::time::Duration;
-
-mod helpers;
-
-#[test]
-fn try_recv() {
-    loom::model(|| {
-        let (sender, receiver) = oneshot::channel::<u128>();
-
-        let t = thread::spawn(move || loop {
-            match receiver.try_recv() {
-                Ok(msg) => break msg,
-                Err(TryRecvError::Empty) => hint::spin_loop(),
-                Err(TryRecvError::Disconnected) => panic!("Should not be disconnected"),
-            }
-        });
-
-        assert!(sender.send(19).is_ok());
-        assert_eq!(t.join().unwrap(), 19);
-    })
-}
-
-#[cfg(feature = "std")]
-#[test]
-fn send_recv_different_threads() {
-    loom::model(|| {
-        let (sender, receiver) = oneshot::channel();
-        let t2 = thread::spawn(move || {
-            assert_eq!(receiver.recv_timeout(Duration::from_millis(1)), Ok(9));
-        });
-        let t1 = thread::spawn(move || {
-            sender.send(9u128).unwrap();
-        });
-        t1.join().unwrap();
-        t2.join().unwrap();
-    })
-}
-
-#[cfg(feature = "std")]
-#[test]
-fn recv_drop_sender_different_threads() {
-    loom::model(|| {
-        let (sender, receiver) = oneshot::channel::<u128>();
-        let t2 = thread::spawn(move || {
-            assert!(receiver.recv_timeout(Duration::from_millis(0)).is_err());
-        });
-        let t1 = thread::spawn(move || {
-            drop(sender);
-        });
-        t1.join().unwrap();
-        t2.join().unwrap();
-    })
-}
-
-#[cfg(feature = "async")]
-#[test]
-fn async_recv() {
-    loom::model(|| {
-        let (sender, receiver) = oneshot::channel::<u128>();
-        let t1 = thread::spawn(move || {
-            sender.send(987).unwrap();
-        });
-        assert_eq!(loom::future::block_on(receiver), Ok(987));
-        t1.join().unwrap();
-    })
-}
-
-#[cfg(feature = "async")]
-#[test]
-fn send_then_poll() {
-    loom::model(|| {
-        let (sender, mut receiver) = oneshot::channel::<u128>();
-        sender.send(1234).unwrap();
-
-        let (waker, waker_handle) = helpers::waker::waker();
-        let mut context = task::Context::from_waker(&waker);
-
-        assert_eq!(
-            Pin::new(&mut receiver).poll(&mut context),
-            Poll::Ready(Ok(1234))
-        );
-        assert_eq!(waker_handle.clone_count(), 0);
-        assert_eq!(waker_handle.drop_count(), 0);
-        assert_eq!(waker_handle.wake_count(), 0);
-    })
-}
-
-#[cfg(feature = "async")]
-#[test]
-fn poll_then_send() {
-    loom::model(|| {
-        let (sender, mut receiver) = oneshot::channel::<u128>();
-
-        let (waker, waker_handle) = helpers::waker::waker();
-        let mut context = task::Context::from_waker(&waker);
-
-        assert_eq!(Pin::new(&mut receiver).poll(&mut context), Poll::Pending);
-        assert_eq!(waker_handle.clone_count(), 1);
-        assert_eq!(waker_handle.drop_count(), 0);
-        assert_eq!(waker_handle.wake_count(), 0);
-
-        sender.send(1234).unwrap();
-        assert_eq!(waker_handle.clone_count(), 1);
-        assert_eq!(waker_handle.drop_count(), 1);
-        assert_eq!(waker_handle.wake_count(), 1);
-
-        assert_eq!(
-            Pin::new(&mut receiver).poll(&mut context),
-            Poll::Ready(Ok(1234))
-        );
-        assert_eq!(waker_handle.clone_count(), 1);
-        assert_eq!(waker_handle.drop_count(), 1);
-        assert_eq!(waker_handle.wake_count(), 1);
-    })
-}
-
-#[cfg(feature = "async")]
-#[test]
-fn poll_with_different_wakers() {
-    loom::model(|| {
-        let (sender, mut receiver) = oneshot::channel::<u128>();
-
-        let (waker1, waker_handle1) = helpers::waker::waker();
-        let mut context1 = task::Context::from_waker(&waker1);
-
-        assert_eq!(Pin::new(&mut receiver).poll(&mut context1), Poll::Pending);
-        assert_eq!(waker_handle1.clone_count(), 1);
-        assert_eq!(waker_handle1.drop_count(), 0);
-        assert_eq!(waker_handle1.wake_count(), 0);
-
-        let (waker2, waker_handle2) = helpers::waker::waker();
-        let mut context2 = task::Context::from_waker(&waker2);
-
-        assert_eq!(Pin::new(&mut receiver).poll(&mut context2), Poll::Pending);
-        assert_eq!(waker_handle1.clone_count(), 1);
-        assert_eq!(waker_handle1.drop_count(), 1);
-        assert_eq!(waker_handle1.wake_count(), 0);
-
-        assert_eq!(waker_handle2.clone_count(), 1);
-        assert_eq!(waker_handle2.drop_count(), 0);
-        assert_eq!(waker_handle2.wake_count(), 0);
-
-        // Sending should cause the waker from the latest poll to be woken up
-        sender.send(1234).unwrap();
-        assert_eq!(waker_handle1.clone_count(), 1);
-        assert_eq!(waker_handle1.drop_count(), 1);
-        assert_eq!(waker_handle1.wake_count(), 0);
-
-        assert_eq!(waker_handle2.clone_count(), 1);
-        assert_eq!(waker_handle2.drop_count(), 1);
-        assert_eq!(waker_handle2.wake_count(), 1);
-    })
-}
-
-#[cfg(feature = "async")]
-#[test]
-fn poll_then_try_recv() {
-    loom::model(|| {
-        let (_sender, mut receiver) = oneshot::channel::<u128>();
-
-        let (waker, waker_handle) = helpers::waker::waker();
-        let mut context = task::Context::from_waker(&waker);
-
-        assert_eq!(Pin::new(&mut receiver).poll(&mut context), Poll::Pending);
-        assert_eq!(waker_handle.clone_count(), 1);
-        assert_eq!(waker_handle.drop_count(), 0);
-        assert_eq!(waker_handle.wake_count(), 0);
-
-        assert_eq!(receiver.try_recv(), Err(TryRecvError::Empty));
-
-        assert_eq!(Pin::new(&mut receiver).poll(&mut context), Poll::Pending);
-        assert_eq!(waker_handle.clone_count(), 2);
-        assert_eq!(waker_handle.drop_count(), 1);
-        assert_eq!(waker_handle.wake_count(), 0);
-    })
-}
-
-#[cfg(feature = "async")]
-#[test]
-fn poll_then_try_recv_while_sending() {
-    loom::model(|| {
-        let (sender, mut receiver) = oneshot::channel::<u128>();
-
-        let (waker, waker_handle) = helpers::waker::waker();
-        let mut context = task::Context::from_waker(&waker);
-
-        assert_eq!(Pin::new(&mut receiver).poll(&mut context), Poll::Pending);
-        assert_eq!(waker_handle.clone_count(), 1);
-        assert_eq!(waker_handle.drop_count(), 0);
-        assert_eq!(waker_handle.wake_count(), 0);
-
-        let t = thread::spawn(move || {
-            sender.send(1234).unwrap();
-        });
-
-        let msg = loop {
-            match receiver.try_recv() {
-                Ok(msg) => break msg,
-                Err(TryRecvError::Empty) => hint::spin_loop(),
-                Err(TryRecvError::Disconnected) => panic!("Should not be disconnected"),
-            }
-        };
-        assert_eq!(msg, 1234);
-        assert_eq!(waker_handle.clone_count(), 1);
-        assert_eq!(waker_handle.drop_count(), 1);
-        assert_eq!(waker_handle.wake_count(), 1);
-
-        t.join().unwrap();
-    })
-}
diff --git a/crates/oneshot-uniffi/tests/raw.rs b/crates/oneshot-uniffi/tests/raw.rs
deleted file mode 100644
index e38dc45..0000000
--- a/crates/oneshot-uniffi/tests/raw.rs
+++ /dev/null
@@ -1,46 +0,0 @@
-#![cfg(not(loom))]
-
-use oneshot::{channel, Receiver, Sender};
-
-#[test]
-fn test_raw_sender() {
-    let (sender, receiver) = channel::<u32>();
-    let raw = sender.into_raw();
-    let recreated = unsafe { Sender::<u32>::from_raw(raw) };
-    recreated
-        .send(100)
-        .unwrap_or_else(|e| panic!("error sending after into_raw/from_raw roundtrip: {e}"));
-    assert_eq!(receiver.try_recv(), Ok(100))
-}
-
-#[test]
-fn test_raw_receiver() {
-    let (sender, receiver) = channel::<u32>();
-    let raw = receiver.into_raw();
-    sender.send(100).unwrap();
-    let recreated = unsafe { Receiver::<u32>::from_raw(raw) };
-    assert_eq!(
-        recreated
-            .try_recv()
-            .unwrap_or_else(|e| panic!("error receiving after into_raw/from_raw roundtrip: {e}")),
-        100
-    )
-}
-
-#[test]
-fn test_raw_sender_and_receiver() {
-    let (sender, receiver) = channel::<u32>();
-    let raw_receiver = receiver.into_raw();
-    let raw_sender = sender.into_raw();
-
-    let recreated_sender = unsafe { Sender::<u32>::from_raw(raw_sender) };
-    recreated_sender.send(100).unwrap();
-
-    let recreated_receiver = unsafe { Receiver::<u32>::from_raw(raw_receiver) };
-    assert_eq!(
-        recreated_receiver
-            .try_recv()
-            .unwrap_or_else(|e| panic!("error receiving after into_raw/from_raw roundtrip: {e}")),
-        100
-    )
-}
diff --git a/crates/oneshot-uniffi/tests/sync.rs b/crates/oneshot-uniffi/tests/sync.rs
deleted file mode 100644
index c6ba081..0000000
--- a/crates/oneshot-uniffi/tests/sync.rs
+++ /dev/null
@@ -1,343 +0,0 @@
-use core::mem;
-use oneshot::TryRecvError;
-
-#[cfg(feature = "std")]
-use oneshot::{RecvError, RecvTimeoutError};
-#[cfg(feature = "std")]
-use std::time::{Duration, Instant};
-
-#[cfg(feature = "std")]
-mod thread {
-    #[cfg(loom)]
-    pub use loom::thread::spawn;
-    #[cfg(not(loom))]
-    pub use std::thread::{sleep, spawn};
-
-    #[cfg(loom)]
-    pub fn sleep(_timeout: core::time::Duration) {
-        loom::thread::yield_now()
-    }
-}
-
-mod helpers;
-use helpers::{maybe_loom_model, DropCounter};
-
-#[test]
-fn send_before_try_recv() {
-    maybe_loom_model(|| {
-        let (sender, receiver) = oneshot::channel();
-        assert!(sender.send(19i128).is_ok());
-
-        assert_eq!(receiver.try_recv(), Ok(19i128));
-        assert_eq!(receiver.try_recv(), Err(TryRecvError::Disconnected));
-        #[cfg(feature = "std")]
-        {
-            assert_eq!(receiver.recv_ref(), Err(RecvError));
-            assert!(receiver.recv_timeout(Duration::from_secs(1)).is_err());
-        }
-    })
-}
-
-#[cfg(feature = "std")]
-#[test]
-fn send_before_recv() {
-    maybe_loom_model(|| {
-        let (sender, receiver) = oneshot::channel::<()>();
-        assert!(sender.send(()).is_ok());
-        assert_eq!(receiver.recv(), Ok(()));
-    });
-    maybe_loom_model(|| {
-        let (sender, receiver) = oneshot::channel::<u8>();
-        assert!(sender.send(19).is_ok());
-        assert_eq!(receiver.recv(), Ok(19));
-    });
-    maybe_loom_model(|| {
-        let (sender, receiver) = oneshot::channel::<u64>();
-        assert!(sender.send(21).is_ok());
-        assert_eq!(receiver.recv(), Ok(21));
-    });
-    // FIXME: This test does not work with loom. There is something that happens after the
-    // channel object becomes larger than ~500 bytes and that makes an atomic read from the state
-    // result in "signal: 10, SIGBUS: access to undefined memory"
-    #[cfg(not(loom))]
-    maybe_loom_model(|| {
-        let (sender, receiver) = oneshot::channel::<[u8; 4096]>();
-        assert!(sender.send([0b10101010; 4096]).is_ok());
-        assert!(receiver.recv().unwrap()[..] == [0b10101010; 4096][..]);
-    });
-}
-
-#[cfg(feature = "std")]
-#[test]
-fn send_before_recv_ref() {
-    maybe_loom_model(|| {
-        let (sender, receiver) = oneshot::channel();
-        assert!(sender.send(19i128).is_ok());
-
-        assert_eq!(receiver.recv_ref(), Ok(19i128));
-        assert_eq!(receiver.recv_ref(), Err(RecvError));
-        assert_eq!(receiver.try_recv(), Err(TryRecvError::Disconnected));
-        assert!(receiver.recv_timeout(Duration::from_secs(1)).is_err());
-    })
-}
-
-#[cfg(feature = "std")]
-#[test]
-fn send_before_recv_timeout() {
-    maybe_loom_model(|| {
-        let (sender, receiver) = oneshot::channel();
-        assert!(sender.send(19i128).is_ok());
-
-        let start = Instant::now();
-        let timeout = Duration::from_secs(1);
-        assert_eq!(receiver.recv_timeout(timeout), Ok(19i128));
-        assert!(start.elapsed() < Duration::from_millis(100));
-
-        assert!(receiver.recv_timeout(timeout).is_err());
-        assert!(receiver.try_recv().is_err());
-        assert!(receiver.recv().is_err());
-    })
-}
-
-#[test]
-fn send_then_drop_receiver() {
-    maybe_loom_model(|| {
-        let (sender, receiver) = oneshot::channel();
-        assert!(sender.send(19i128).is_ok());
-        mem::drop(receiver);
-    })
-}
-
-#[test]
-fn send_with_dropped_receiver() {
-    maybe_loom_model(|| {
-        let (sender, receiver) = oneshot::channel();
-        mem::drop(receiver);
-        let send_error = sender.send(5u128).unwrap_err();
-        assert_eq!(*send_error.as_inner(), 5);
-        assert_eq!(send_error.into_inner(), 5);
-    })
-}
-
-#[test]
-fn try_recv_with_dropped_sender() {
-    maybe_loom_model(|| {
-        let (sender, receiver) = oneshot::channel::<u128>();
-        mem::drop(sender);
-        receiver.try_recv().unwrap_err();
-    })
-}
-
-#[cfg(feature = "std")]
-#[test]
-fn recv_with_dropped_sender() {
-    maybe_loom_model(|| {
-        let (sender, receiver) = oneshot::channel::<u128>();
-        mem::drop(sender);
-        receiver.recv().unwrap_err();
-    })
-}
-
-#[cfg(feature = "std")]
-#[test]
-fn recv_before_send() {
-    maybe_loom_model(|| {
-        let (sender, receiver) = oneshot::channel();
-        let t = thread::spawn(move || {
-            thread::sleep(Duration::from_millis(2));
-            sender.send(9u128).unwrap();
-        });
-        assert_eq!(receiver.recv(), Ok(9));
-        t.join().unwrap();
-    })
-}
-
-#[cfg(feature = "std")]
-#[test]
-fn recv_timeout_before_send() {
-    maybe_loom_model(|| {
-        let (sender, receiver) = oneshot::channel();
-        let t = thread::spawn(move || {
-            thread::sleep(Duration::from_millis(2));
-            sender.send(9u128).unwrap();
-        });
-        assert_eq!(receiver.recv_timeout(Duration::from_secs(1)), Ok(9));
-        t.join().unwrap();
-    })
-}
-
-#[cfg(feature = "std")]
-#[test]
-fn recv_before_send_then_drop_sender() {
-    maybe_loom_model(|| {
-        let (sender, receiver) = oneshot::channel::<u128>();
-        let t = thread::spawn(move || {
-            thread::sleep(Duration::from_millis(10));
-            mem::drop(sender);
-        });
-        assert!(receiver.recv().is_err());
-        t.join().unwrap();
-    })
-}
-
-#[cfg(feature = "std")]
-#[test]
-fn recv_timeout_before_send_then_drop_sender() {
-    maybe_loom_model(|| {
-        let (sender, receiver) = oneshot::channel::<u128>();
-        let t = thread::spawn(move || {
-            thread::sleep(Duration::from_millis(10));
-            mem::drop(sender);
-        });
-        assert!(receiver.recv_timeout(Duration::from_secs(1)).is_err());
-        t.join().unwrap();
-    })
-}
-
-#[test]
-fn try_recv() {
-    maybe_loom_model(|| {
-        let (sender, receiver) = oneshot::channel::<u128>();
-        assert_eq!(receiver.try_recv(), Err(TryRecvError::Empty));
-        mem::drop(sender)
-    })
-}
-
-#[cfg(feature = "std")]
-#[test]
-fn try_recv_then_drop_receiver() {
-    maybe_loom_model(|| {
-        let (sender, receiver) = oneshot::channel::<u128>();
-        let t1 = thread::spawn(move || {
-            let _ = sender.send(42);
-        });
-        let t2 = thread::spawn(move || {
-            assert!(matches!(
-                receiver.try_recv(),
-                Ok(42) | Err(TryRecvError::Empty)
-            ));
-            mem::drop(receiver);
-        });
-        t1.join().unwrap();
-        t2.join().unwrap();
-    })
-}
-
-#[cfg(feature = "std")]
-#[test]
-fn recv_deadline_and_timeout_no_time() {
-    maybe_loom_model(|| {
-        let (_sender, receiver) = oneshot::channel::<u128>();
-
-        let start = Instant::now();
-        assert_eq!(
-            receiver.recv_deadline(start),
-            Err(RecvTimeoutError::Timeout)
-        );
-        assert!(start.elapsed() < Duration::from_millis(200));
-
-        let start = Instant::now();
-        assert_eq!(
-            receiver.recv_timeout(Duration::from_millis(0)),
-            Err(RecvTimeoutError::Timeout)
-        );
-        assert!(start.elapsed() < Duration::from_millis(200));
-    })
-}
-
-// This test doesn't give meaningful results when run with oneshot_test_delay and loom
-#[cfg(all(feature = "std", not(all(oneshot_test_delay, loom))))]
-#[test]
-fn recv_deadline_time_should_elapse() {
-    maybe_loom_model(|| {
-        let (_sender, receiver) = oneshot::channel::<u128>();
-
-        let start = Instant::now();
-        #[cfg(not(loom))]
-        let timeout = Duration::from_millis(100);
-        #[cfg(loom)]
-        let timeout = Duration::from_millis(1);
-        assert_eq!(
-            receiver.recv_deadline(start + timeout),
-            Err(RecvTimeoutError::Timeout)
-        );
-        assert!(start.elapsed() > timeout);
-        assert!(start.elapsed() < timeout * 3);
-    })
-}
-
-#[cfg(all(feature = "std", not(all(oneshot_test_delay, loom))))]
-#[test]
-fn recv_timeout_time_should_elapse() {
-    maybe_loom_model(|| {
-        let (_sender, receiver) = oneshot::channel::<u128>();
-
-        let start = Instant::now();
-        #[cfg(not(loom))]
-        let timeout = Duration::from_millis(100);
-        #[cfg(loom)]
-        let timeout = Duration::from_millis(1);
-
-        assert_eq!(
-            receiver.recv_timeout(timeout),
-            Err(RecvTimeoutError::Timeout)
-        );
-        assert!(start.elapsed() > timeout);
-        assert!(start.elapsed() < timeout * 3);
-    })
-}
-
-#[cfg(not(loom))]
-#[test]
-fn non_send_type_can_be_used_on_same_thread() {
-    use std::ptr;
-
-    #[derive(Debug, Eq, PartialEq)]
-    struct NotSend(*mut ());
-
-    let (sender, receiver) = oneshot::channel();
-    sender.send(NotSend(ptr::null_mut())).unwrap();
-    let reply = receiver.try_recv().unwrap();
-    assert_eq!(reply, NotSend(ptr::null_mut()));
-}
-
-#[test]
-fn message_in_channel_dropped_on_receiver_drop() {
-    maybe_loom_model(|| {
-        let (sender, receiver) = oneshot::channel();
-        let (message, counter) = DropCounter::new(());
-        assert_eq!(counter.count(), 0);
-        sender.send(message).unwrap();
-        assert_eq!(counter.count(), 0);
-        mem::drop(receiver);
-        assert_eq!(counter.count(), 1);
-    })
-}
-
-#[test]
-fn send_error_drops_message_correctly() {
-    maybe_loom_model(|| {
-        let (sender, _) = oneshot::channel();
-        let (message, counter) = DropCounter::new(());
-
-        let send_error = sender.send(message).unwrap_err();
-        assert_eq!(counter.count(), 0);
-        mem::drop(send_error);
-        assert_eq!(counter.count(), 1);
-    });
-}
-
-#[test]
-fn send_error_drops_message_correctly_on_into_inner() {
-    maybe_loom_model(|| {
-        let (sender, _) = oneshot::channel();
-        let (message, counter) = DropCounter::new(());
-
-        let send_error = sender.send(message).unwrap_err();
-        assert_eq!(counter.count(), 0);
-        let message = send_error.into_inner();
-        assert_eq!(counter.count(), 0);
-        mem::drop(message);
-        assert_eq!(counter.count(), 1);
-    });
-}
diff --git a/crates/parking_lot/.android-checksum.json b/crates/parking_lot/.android-checksum.json
index 74118d9..36ab651 100644
--- a/crates/parking_lot/.android-checksum.json
+++ b/crates/parking_lot/.android-checksum.json
@@ -1 +1 @@
-{"package":null,"files":{".cargo-checksum.json":"16861faf1bb6d3bac3efcc5574d382cb3673cc5c64478d002d6d57aa92d67483","Android.bp":"d144d1f8b4b3b7c952f0dd76d05c38d45f01357307d818d6b3e0383585a2f40b","CHANGELOG.md":"aa36d4755ce428e625b38766750238961361c97fccae17d964927bff733cf464","Cargo.toml":"38933a782d0c4ed9357594f941ea089eb98015db7f482f390b02190052cc5407","LICENSE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","LICENSE-APACHE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","LICENSE-MIT":"e17148c150ed6e1f84ea8f6eb3a11c3f2817c4ea663012777bdcb8e9629b6e20","METADATA":"79961c00142efb9da295ff71c26d3bdf960e9be23c8bef730473fb4312057303","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"f4d31a5c6f1892b426236e107ffb3b843b44e2be186f66d27a8291a44d64c77a","TEST_MAPPING":"463ae4df63cb20585a4d5dfe51a3a59af0325aca0df1a3bc943ccc6b069a1c9d","bors.toml":"4de3bbdad92bf60e4c941f391b0cb5032c334800ac1172fa0d6ca33083457b00","cargo_embargo.json":"81dac50c56c34d5846286bcc1d253e7e5044332422d7d5ae1534178e2eea828e","src/condvar.rs":"58d5d11d79cfdebe20a0241987f773e3236d39aab120d11abdc062d7d081fce1","src/deadlock.rs":"4188337fa28636be5bdfaedc9f54fc1406bfcbc3960cc6ba9dba867c7b2d8c08","src/elision.rs":"d50617a72d0d9739cd542a9fb3d600d19a0627dc1d27b3fc640308b78db38cbf","src/fair_mutex.rs":"9f3f38654054d7e1038dc04db03d13a473e1426f5a04afff9dc024f1db4e3a1d","src/lib.rs":"ee446b66b1b2fa919848854dca98b921fe334250986dce6d5527c43c291caf83","src/mutex.rs":"01fc09fd03eb9777c297ed1a77ec6c105cc9072e6929db283c226cf7f61c2d9b","src/once.rs":"397e902eee9f706333af5ba5e7db0aa84a9f516908ad6f8c55404be138f90d53","src/raw_fair_mutex.rs":"2cff810824091199917a1cfba92e61b8ae12ed455213bc919022ca305b09f3a0","src/raw_mutex.rs":"1589f7145815e3aed9f5bb2c9386722432be6d3a9bdb89c7721a89dc0cf17c53","src/raw_rwlock.rs":"53dec176efbd734fd32daf465562c4cf2f5386456ebd1bf47e5ef8662858a034","src/remutex.rs":"296a6afec3bfd14e5fab454732b44e9aea765e732466650fae7e218d26fcebb6","src/rwlock.rs":"8476d4f1ee3c7ba7336dbaa209bdde2b3b7482fb522d663408d6a9795b8bf45c","src/util.rs":"08ac772b868faad961f9cefe3419ae0a8ea160f750b76ab0a97ee714ac04c55a","tests/issue_203.rs":"a43889a2161aabb7069603e5d0131f95128565a613de2b2d13b0b74f904755e8","tests/issue_392.rs":"758b656de3ce767672594781ca8762491a8d6a79a2273a5a6255de69f4480c1d"}}
\ No newline at end of file
+{"package":null,"files":{".cargo-checksum.json":"16861faf1bb6d3bac3efcc5574d382cb3673cc5c64478d002d6d57aa92d67483","Android.bp":"d144d1f8b4b3b7c952f0dd76d05c38d45f01357307d818d6b3e0383585a2f40b","CHANGELOG.md":"aa36d4755ce428e625b38766750238961361c97fccae17d964927bff733cf464","Cargo.toml":"38933a782d0c4ed9357594f941ea089eb98015db7f482f390b02190052cc5407","LICENSE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","LICENSE-APACHE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","LICENSE-MIT":"e17148c150ed6e1f84ea8f6eb3a11c3f2817c4ea663012777bdcb8e9629b6e20","METADATA":"79961c00142efb9da295ff71c26d3bdf960e9be23c8bef730473fb4312057303","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"f4d31a5c6f1892b426236e107ffb3b843b44e2be186f66d27a8291a44d64c77a","TEST_MAPPING":"bafecbf0d873b754409c5d84cee2dcff8e67d12e8666da07e38c837aeedfead9","bors.toml":"4de3bbdad92bf60e4c941f391b0cb5032c334800ac1172fa0d6ca33083457b00","cargo_embargo.json":"81dac50c56c34d5846286bcc1d253e7e5044332422d7d5ae1534178e2eea828e","src/condvar.rs":"58d5d11d79cfdebe20a0241987f773e3236d39aab120d11abdc062d7d081fce1","src/deadlock.rs":"4188337fa28636be5bdfaedc9f54fc1406bfcbc3960cc6ba9dba867c7b2d8c08","src/elision.rs":"d50617a72d0d9739cd542a9fb3d600d19a0627dc1d27b3fc640308b78db38cbf","src/fair_mutex.rs":"9f3f38654054d7e1038dc04db03d13a473e1426f5a04afff9dc024f1db4e3a1d","src/lib.rs":"ee446b66b1b2fa919848854dca98b921fe334250986dce6d5527c43c291caf83","src/mutex.rs":"01fc09fd03eb9777c297ed1a77ec6c105cc9072e6929db283c226cf7f61c2d9b","src/once.rs":"397e902eee9f706333af5ba5e7db0aa84a9f516908ad6f8c55404be138f90d53","src/raw_fair_mutex.rs":"2cff810824091199917a1cfba92e61b8ae12ed455213bc919022ca305b09f3a0","src/raw_mutex.rs":"1589f7145815e3aed9f5bb2c9386722432be6d3a9bdb89c7721a89dc0cf17c53","src/raw_rwlock.rs":"53dec176efbd734fd32daf465562c4cf2f5386456ebd1bf47e5ef8662858a034","src/remutex.rs":"296a6afec3bfd14e5fab454732b44e9aea765e732466650fae7e218d26fcebb6","src/rwlock.rs":"8476d4f1ee3c7ba7336dbaa209bdde2b3b7482fb522d663408d6a9795b8bf45c","src/util.rs":"08ac772b868faad961f9cefe3419ae0a8ea160f750b76ab0a97ee714ac04c55a","tests/issue_203.rs":"a43889a2161aabb7069603e5d0131f95128565a613de2b2d13b0b74f904755e8","tests/issue_392.rs":"758b656de3ce767672594781ca8762491a8d6a79a2273a5a6255de69f4480c1d"}}
\ No newline at end of file
diff --git a/crates/parking_lot/TEST_MAPPING b/crates/parking_lot/TEST_MAPPING
index 4eb132e..cb1d295 100644
--- a/crates/parking_lot/TEST_MAPPING
+++ b/crates/parking_lot/TEST_MAPPING
@@ -10,6 +10,9 @@
     },
     {
       "name": "parking_lot_test_tests_issue_203"
+    },
+    {
+      "name": "parking_lot_test_tests_issue_392"
     }
   ]
 }
diff --git a/crates/pest_derive/.android-checksum.json b/crates/pest_derive/.android-checksum.json
index cc8f289..018395d 100644
--- a/crates/pest_derive/.android-checksum.json
+++ b/crates/pest_derive/.android-checksum.json
@@ -1 +1 @@
-{"package":null,"files":{".cargo-checksum.json":"5f98b94baadfa33a9137bb2025a6f6c859f5f910897491ec49e52f0c4eac86ca","Android.bp":"274f442aaff9706c0fae333eae510282643557bc71685ea892e4c9bba3b053f4","Cargo.lock":"e4100fe11eaf1cc18a2fa05097c36b9d922dbbefcd62717e614c40f1535613a1","Cargo.toml":"e1f46d0e75584f4dc39111d6a8d065f75cf0398db0b04358a55948e2d0dae227","LICENSE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","LICENSE-APACHE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","LICENSE-MIT":"38620a3cfaeec97a9197e8c39e436ea7f0bc86699b1f1c35f1aa41785b6d4eac","METADATA":"0b05d9e92b5e4e614f48256769f256a5bc87437e03a83374bd9b515409a1373a","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","_README.md":"6b973bfc5a49b890c6c47d4705f7f6ae59ec30552d0c3fd0fccf77bb1c694157","cargo_embargo.json":"a312c0e7105c9c5ffc84080c106ad3800ed7cb35ed0457c19e84fb6f44392840","examples/base.pest":"1f200b18e4e84a4966531ab0e0eebb950cadc72fcde2c8e1156bbfd0e870a9ab","examples/calc.pest":"a9369c6eede083ef8cb7de3aca7b78cbc91ccc29dcaa1d8a433e958d5c50e932","examples/calc.rs":"2d9888f3c44818ede455a313c9f20217543d51f837fb679aa5cf12fb415d18ef","examples/help-menu.pest":"16c86e7a3d2dfcb26b261d328167d4b8aae187bd54cc9a691fa966a0886234a2","examples/help-menu.rs":"66d4b6f10e1a9db840887a5e6f78829eb566d06f9d2f75e32fd8530b7a5ad5d9","src/lib.rs":"e6cc9a3f78a0ff056b1a0eab3a8ac06ebdb8ed6bf7d1bb676433c8723c8e7a40","tests/grammar.pest":"13a27a33c21d6e752897829ce884cccafa29bbf36f1ba8f972390071dbde3e88","tests/grammar.rs":"2f7775d57b328e783b16e1f30106dcd15afb4c851bb85c05157fcac7d494758a","tests/grammar_inline.rs":"fbc64141cfe2d073794c7ac402ba46266c57c18d226d5dfe8464644f5f4c446b","tests/implicit.pest":"4af86b6dc9872bd2891751e1e102ad8e0b21d9d81163cb0a9157eccf6fac293c","tests/implicit.rs":"9c89cdb2480403225a872dc7f231a594e6550f4552f7dd3d773157ec2b64d036","tests/lists.pest":"f7654b3240ca07969740b993c203d20e59b90cb846240271a634bfc92d663308","tests/lists.rs":"f9eac63c7e48dd4a2140c5cf0bb06b5d0b16a6a165af3cd46e3a7f072f04d323","tests/oneormore.pest":"01490dabc2b1598720bcfba13b3c9fd42441786ab267f5cc919452c40c2ce5e7","tests/oneormore.rs":"5030143dfc0765a8f458539f6367766e24823530712bbefc2e5a116105a74fa6","tests/reporting.pest":"1a573e5238d59ddf94b79c42aaf8d8e4447e7f6c2d812530db657c488cc012e3","tests/reporting.rs":"babea6d074335e542f89465512cd5ee96bb3b72f851edf9ce5b82b47a290e8fe"}}
\ No newline at end of file
+{"package":null,"files":{".cargo-checksum.json":"342400cbe945540429efb61d9657dd5268feb6c5355eb358374324dfca7bf925","Android.bp":"fd36054c13ab0702dd59c578749fe770dc216c0f60c6e6e88aa432e9413111c5","Cargo.lock":"05c2eca8f28037543a0053853a1ff7ff06fd0784d10aef9a383bd160c3041172","Cargo.toml":"d7a9705dc0f3928d6a6834a674c9a5b9d6c7eec0035b64d6b885c6f03feb6419","LICENSE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","LICENSE-APACHE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","LICENSE-MIT":"38620a3cfaeec97a9197e8c39e436ea7f0bc86699b1f1c35f1aa41785b6d4eac","METADATA":"1f7a1dd36ac1420d5149b746604f0380115314d359bfacfcb3c787fb3b0d3431","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","_README.md":"6b973bfc5a49b890c6c47d4705f7f6ae59ec30552d0c3fd0fccf77bb1c694157","cargo_embargo.json":"a312c0e7105c9c5ffc84080c106ad3800ed7cb35ed0457c19e84fb6f44392840","examples/base.pest":"1f200b18e4e84a4966531ab0e0eebb950cadc72fcde2c8e1156bbfd0e870a9ab","examples/calc.pest":"a9369c6eede083ef8cb7de3aca7b78cbc91ccc29dcaa1d8a433e958d5c50e932","examples/calc.rs":"2d9888f3c44818ede455a313c9f20217543d51f837fb679aa5cf12fb415d18ef","examples/help-menu.pest":"16c86e7a3d2dfcb26b261d328167d4b8aae187bd54cc9a691fa966a0886234a2","examples/help-menu.rs":"66d4b6f10e1a9db840887a5e6f78829eb566d06f9d2f75e32fd8530b7a5ad5d9","src/lib.rs":"34cdcc0d25e78c2ec50903c6f001f79321068bbad87f88ca5c951289905a41f5","tests/grammar.pest":"13a27a33c21d6e752897829ce884cccafa29bbf36f1ba8f972390071dbde3e88","tests/grammar.rs":"2f7775d57b328e783b16e1f30106dcd15afb4c851bb85c05157fcac7d494758a","tests/grammar_inline.rs":"fbc64141cfe2d073794c7ac402ba46266c57c18d226d5dfe8464644f5f4c446b","tests/implicit.pest":"4af86b6dc9872bd2891751e1e102ad8e0b21d9d81163cb0a9157eccf6fac293c","tests/implicit.rs":"e4c5b35551835bcc1075933a68d251bee16c0874666bba8a8be90097a247c592","tests/lists.pest":"f7654b3240ca07969740b993c203d20e59b90cb846240271a634bfc92d663308","tests/lists.rs":"f9eac63c7e48dd4a2140c5cf0bb06b5d0b16a6a165af3cd46e3a7f072f04d323","tests/oneormore.pest":"01490dabc2b1598720bcfba13b3c9fd42441786ab267f5cc919452c40c2ce5e7","tests/oneormore.rs":"5030143dfc0765a8f458539f6367766e24823530712bbefc2e5a116105a74fa6","tests/opt.pest":"1340ebc55fb4e5c38b6656ca4ad22d6145bd8e1a7444aa4ed6b41a8aad40351f","tests/opt.rs":"8ae2d183511c3e228b2b4b29689478cf4c87a11cd2e705fe618142f65c892dd5","tests/reporting.pest":"1a573e5238d59ddf94b79c42aaf8d8e4447e7f6c2d812530db657c488cc012e3","tests/reporting.rs":"babea6d074335e542f89465512cd5ee96bb3b72f851edf9ce5b82b47a290e8fe"}}
\ No newline at end of file
diff --git a/crates/pest_derive/.cargo-checksum.json b/crates/pest_derive/.cargo-checksum.json
index 68ad72a..9ae30b5 100644
--- a/crates/pest_derive/.cargo-checksum.json
+++ b/crates/pest_derive/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"Cargo.lock":"cfb8b2bfc6d84ac16139b191cb0a02fdaf1e2e5b046838e71494c8e795881801","Cargo.toml":"194f98a342af9604985906c8f6ebae72481df68b10566316a86ae4cb91ad4c8e","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","_README.md":"bde746653575153be4ae26ce950963ced5034449e352e60cfd8825260c666c16","examples/base.pest":"949b57af96904b47da714890dd1ab5ce8937a92aac71be1b5cc3c3573198ad24","examples/calc.pest":"4347730e9c77c74545b205e8aa5a1128c064056eb6bfe47d31d3e0f76d9c25ea","examples/calc.rs":"0ded248d3d04adde5eafc69e1ed5d8c120400f7a01181db4a30408c4b777b641","examples/help-menu.pest":"901550581cf040a346c78b64a3320e34da5e4b3941b127ba81820de0dedd2906","examples/help-menu.rs":"c6b9b4d860101a4e3ef0f9e59d967dc5ed9bd3ed4acd4b2e8f30ed2a61a899c9","src/lib.rs":"ef3426de6a0c667066202be87f23a7605461884aba71eda8aae5f82b04846149","tests/grammar.pest":"4d172b9d3851292aed1b8e5ce95c49ef10fda2b3b269baaf5ad2c333fe3744b0","tests/grammar.rs":"fca526a09e4a6ebd27641be7377caae5a867a720e256ef60c324825cc19e5ea1","tests/grammar_inline.rs":"349527e75a1fc10e0208d3d88cbac427dd5999b8a2a79d2b9c981e73af22da37","tests/implicit.pest":"18cd082b71214f7d6bbf32fcf4cd9e3a0b10f99212a640db5327deddb434925e","tests/implicit.rs":"6a30987f22000d1afa186ba9ad1781868d35a418ea381d8bcd08ca8f0b1b1477","tests/lists.pest":"96d90ad5eb7b14648fa8720f0a48e680327080b07251a4dd74e1a023625e9c1a","tests/lists.rs":"2dc0cb9c07f5b077743ce9313488599347061ea486e0f5160bff50b3d07ca72c","tests/oneormore.pest":"6599ad31c3e81da6abf05929d7c1a2c8ba63ffea7fa41898e9385f8142d765ad","tests/oneormore.rs":"0379e54652714b6434560707961da2fd679f964bd9700408452fa6b57d6d1a1c","tests/reporting.pest":"f5bc8405ea117b76338e0003e359731a8aaf1a36672f31a6a639a4e67a65e331","tests/reporting.rs":"8b88238dc33abff5dbc76434a7468dceeb9db3dfa8826d44c8ea1d13d52431e8"},"package":"bcd6ab1236bbdb3a49027e920e693192ebfe8913f6d60e294de57463a493cfde"}
\ No newline at end of file
+{"files":{"Cargo.lock":"c254e36c8942c21064c4497ab5d5bb9205801cdb9633701dda27b16fe29d1819","Cargo.toml":"ab256fc6e1dc566e98be63bdb2fc7f82154b4c0796bce58edaf4e6d599d9a8ec","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","_README.md":"bde746653575153be4ae26ce950963ced5034449e352e60cfd8825260c666c16","examples/base.pest":"949b57af96904b47da714890dd1ab5ce8937a92aac71be1b5cc3c3573198ad24","examples/calc.pest":"4347730e9c77c74545b205e8aa5a1128c064056eb6bfe47d31d3e0f76d9c25ea","examples/calc.rs":"0ded248d3d04adde5eafc69e1ed5d8c120400f7a01181db4a30408c4b777b641","examples/help-menu.pest":"901550581cf040a346c78b64a3320e34da5e4b3941b127ba81820de0dedd2906","examples/help-menu.rs":"c6b9b4d860101a4e3ef0f9e59d967dc5ed9bd3ed4acd4b2e8f30ed2a61a899c9","src/lib.rs":"6cf6eee80ce0d6773bf584eb39b2e5cd978c7f853ba7976b94203e256c1a9f47","tests/grammar.pest":"4d172b9d3851292aed1b8e5ce95c49ef10fda2b3b269baaf5ad2c333fe3744b0","tests/grammar.rs":"fca526a09e4a6ebd27641be7377caae5a867a720e256ef60c324825cc19e5ea1","tests/grammar_inline.rs":"349527e75a1fc10e0208d3d88cbac427dd5999b8a2a79d2b9c981e73af22da37","tests/implicit.pest":"18cd082b71214f7d6bbf32fcf4cd9e3a0b10f99212a640db5327deddb434925e","tests/implicit.rs":"6837f56f6bf72e1c3de74339d4be19371b797b753b502958cde71bcbce11bc60","tests/lists.pest":"96d90ad5eb7b14648fa8720f0a48e680327080b07251a4dd74e1a023625e9c1a","tests/lists.rs":"2dc0cb9c07f5b077743ce9313488599347061ea486e0f5160bff50b3d07ca72c","tests/oneormore.pest":"6599ad31c3e81da6abf05929d7c1a2c8ba63ffea7fa41898e9385f8142d765ad","tests/oneormore.rs":"0379e54652714b6434560707961da2fd679f964bd9700408452fa6b57d6d1a1c","tests/opt.pest":"d9197350c125110e621ddc6c9ee7f558b3faca41dd57f5e86a94aa6ede724175","tests/opt.rs":"bdb2c883d8d474ade53a68a3e2f407b5d422c9b951a3e468ba853fa1d27a12e7","tests/reporting.pest":"f5bc8405ea117b76338e0003e359731a8aaf1a36672f31a6a639a4e67a65e331","tests/reporting.rs":"8b88238dc33abff5dbc76434a7468dceeb9db3dfa8826d44c8ea1d13d52431e8"},"package":"816518421cfc6887a0d62bf441b6ffb4536fcc926395a69e1a85852d4363f57e"}
\ No newline at end of file
diff --git a/crates/pest_derive/Android.bp b/crates/pest_derive/Android.bp
index 390f7a0..65e055f 100644
--- a/crates/pest_derive/Android.bp
+++ b/crates/pest_derive/Android.bp
@@ -17,7 +17,7 @@
     name: "libpest_derive",
     crate_name: "pest_derive",
     cargo_env_compat: true,
-    cargo_pkg_version: "2.7.6",
+    cargo_pkg_version: "2.7.15",
     crate_root: "src/lib.rs",
     edition: "2021",
     features: [
diff --git a/crates/pest_derive/Cargo.lock b/crates/pest_derive/Cargo.lock
index e037733..ef3adaf 100644
--- a/crates/pest_derive/Cargo.lock
+++ b/crates/pest_derive/Cargo.lock
@@ -3,19 +3,18 @@
 version = 3
 
 [[package]]
-name = "adler"
-version = "1.0.2"
+name = "adler2"
+version = "2.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
+checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627"
 
 [[package]]
 name = "ahash"
-version = "0.8.7"
+version = "0.8.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77c3a9648d43b9cd48db467b3f87fdd6e146bcc88ab0180006cef2179fe11d01"
+checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011"
 dependencies = [
  "cfg-if",
- "getrandom",
  "once_cell",
  "version_check",
  "zerocopy",
@@ -23,84 +22,95 @@
 
 [[package]]
 name = "aho-corasick"
-version = "1.1.2"
+version = "1.1.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0"
+checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
 dependencies = [
  "memchr",
 ]
 
 [[package]]
-name = "anstream"
-version = "0.6.5"
+name = "allocator-api2"
+version = "0.2.21"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d664a92ecae85fd0a7392615844904654d1d5f5514837f471ddef4a057aba1b6"
+checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"
+
+[[package]]
+name = "annotate-snippets"
+version = "0.11.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24e35ed54e5ea7997c14ed4c70ba043478db1112e98263b3b035907aa197d991"
+dependencies = [
+ "anstyle",
+ "unicode-width",
+]
+
+[[package]]
+name = "anstream"
+version = "0.6.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b"
 dependencies = [
  "anstyle",
  "anstyle-parse",
  "anstyle-query",
  "anstyle-wincon",
  "colorchoice",
+ "is_terminal_polyfill",
  "utf8parse",
 ]
 
 [[package]]
 name = "anstyle"
-version = "1.0.4"
+version = "1.0.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87"
+checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9"
 
 [[package]]
 name = "anstyle-parse"
-version = "0.2.3"
+version = "0.2.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c"
+checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9"
 dependencies = [
  "utf8parse",
 ]
 
 [[package]]
 name = "anstyle-query"
-version = "1.0.2"
+version = "1.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648"
+checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c"
 dependencies = [
- "windows-sys 0.52.0",
+ "windows-sys 0.59.0",
 ]
 
 [[package]]
 name = "anstyle-wincon"
-version = "3.0.2"
+version = "3.0.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7"
+checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125"
 dependencies = [
  "anstyle",
- "windows-sys 0.52.0",
+ "windows-sys 0.59.0",
 ]
 
 [[package]]
 name = "anyhow"
-version = "1.0.79"
+version = "1.0.94"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca"
+checksum = "c1fd03a028ef38ba2276dce7e33fcd6369c158a1bca17946c4b1b701891c1ff7"
 
 [[package]]
 name = "arc-swap"
-version = "1.6.0"
+version = "1.7.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6"
-
-[[package]]
-name = "arrayvec"
-version = "0.5.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b"
+checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457"
 
 [[package]]
 name = "autocfg"
-version = "1.1.0"
+version = "1.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
 
 [[package]]
 name = "base16ct"
@@ -110,9 +120,9 @@
 
 [[package]]
 name = "base64"
-version = "0.21.5"
+version = "0.22.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9"
+checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
 
 [[package]]
 name = "base64ct"
@@ -122,15 +132,9 @@
 
 [[package]]
 name = "bitflags"
-version = "1.3.2"
+version = "2.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
-
-[[package]]
-name = "bitflags"
-version = "2.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07"
+checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
 
 [[package]]
 name = "bitmaps"
@@ -152,35 +156,32 @@
 
 [[package]]
 name = "bstr"
-version = "1.9.0"
+version = "1.11.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c48f0051a4b4c5e0b6d365cd04af53aeaa209e3cc15ec2cdb69e73cc87fbd0dc"
+checksum = "1a68f1f47cdf0ec8ee4b941b2eee2a80cb796db73118c0dd09ac63fbe405be22"
 dependencies = [
  "memchr",
- "regex-automata",
+ "regex-automata 0.4.9",
  "serde",
 ]
 
 [[package]]
-name = "btoi"
-version = "0.4.3"
+name = "bumpalo"
+version = "3.16.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9dd6407f73a9b8b6162d8a2ef999fe6afd7cc15902ebf42c5cd296addf17e0ad"
-dependencies = [
- "num-traits",
-]
+checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
 
 [[package]]
-name = "bumpalo"
-version = "3.14.0"
+name = "byteorder"
+version = "1.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec"
+checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
 
 [[package]]
 name = "bytes"
-version = "1.5.0"
+version = "1.9.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223"
+checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b"
 
 [[package]]
 name = "bytesize"
@@ -190,27 +191,33 @@
 
 [[package]]
 name = "cargo"
-version = "0.72.2"
+version = "0.81.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "171aca76a3199e771ea0b94ec260984ed9cba62af8e478142974dbaa594d583b"
+checksum = "f24c9dcadcdad2f6fa2553b63d5e9c9700fa6932b75d53f3b11b8aea35ebab99"
 dependencies = [
+ "annotate-snippets",
+ "anstream",
+ "anstyle",
  "anyhow",
  "base64",
  "bytesize",
+ "cargo-credential",
+ "cargo-credential-libsecret",
+ "cargo-credential-macos-keychain",
+ "cargo-credential-wincred",
  "cargo-platform",
  "cargo-util",
+ "cargo-util-schemas",
  "clap",
+ "color-print",
  "crates-io",
  "curl",
  "curl-sys",
- "env_logger",
  "filetime",
  "flate2",
- "fwdansi",
  "git2",
  "git2-curl",
  "gix",
- "gix-features",
  "glob",
  "hex",
  "hmac",
@@ -219,62 +226,112 @@
  "humantime",
  "ignore",
  "im-rc",
- "indexmap 1.9.3",
- "is-terminal",
+ "indexmap",
  "itertools",
  "jobserver",
- "lazy_static",
  "lazycell",
  "libc",
  "libgit2-sys",
- "log",
  "memchr",
  "opener",
  "os_info",
  "pasetors",
  "pathdiff",
  "rand",
+ "regex",
+ "rusqlite",
  "rustfix",
+ "same-file",
  "semver",
  "serde",
- "serde-value",
+ "serde-untagged",
  "serde_ignored",
  "serde_json",
  "sha1",
  "shell-escape",
- "strip-ansi-escapes",
+ "supports-hyperlinks",
+ "supports-unicode",
  "tar",
  "tempfile",
- "termcolor",
  "time",
  "toml",
  "toml_edit",
+ "tracing",
+ "tracing-chrome",
+ "tracing-subscriber",
+ "unicase",
  "unicode-width",
- "unicode-xid",
  "url",
  "walkdir",
- "windows-sys 0.48.0",
+ "windows-sys 0.52.0",
+]
+
+[[package]]
+name = "cargo-credential"
+version = "0.4.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8951a7e8159904939f036c967e24b60636efd6a6f22379af6b32afc6b867a2b8"
+dependencies = [
+ "anyhow",
+ "libc",
+ "serde",
+ "serde_json",
+ "thiserror 1.0.69",
+ "time",
+ "windows-sys 0.59.0",
+]
+
+[[package]]
+name = "cargo-credential-libsecret"
+version = "0.4.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9327125ccc2cf986f111a3342fe0a431702017a85f1b68831ebbf4331519d27d"
+dependencies = [
+ "anyhow",
+ "cargo-credential",
+ "libloading",
+]
+
+[[package]]
+name = "cargo-credential-macos-keychain"
+version = "0.4.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d331053cb9e1d39bcbb2bf3b9979bad399e6f630f54c29fd64396a57887fb281"
+dependencies = [
+ "cargo-credential",
+ "security-framework",
+]
+
+[[package]]
+name = "cargo-credential-wincred"
+version = "0.4.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "97741d5bcaf92bc5cfa9678dd4bfb2a32d5109626ce8186fbcc6a3ea811eacaa"
+dependencies = [
+ "cargo-credential",
+ "windows-sys 0.59.0",
 ]
 
 [[package]]
 name = "cargo-platform"
-version = "0.1.6"
+version = "0.1.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ceed8ef69d8518a5dda55c07425450b58a4e1946f4951eab6d7191ee86c2443d"
+checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea"
 dependencies = [
  "serde",
 ]
 
 [[package]]
 name = "cargo-util"
-version = "0.2.8"
+version = "0.2.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bb2bdd1d8ab2353ddd763881eaba60cb53f1deee0ff9d271b9f0e4cdbcd063fb"
+checksum = "0b15bbe49616ee353fadadf6de5a24136f3fe8fdbd5eb0894be9f8a42c905674"
 dependencies = [
  "anyhow",
- "core-foundation",
+ "core-foundation 0.10.0",
  "filetime",
  "hex",
+ "ignore",
  "jobserver",
  "libc",
  "miow",
@@ -284,17 +341,34 @@
  "tempfile",
  "tracing",
  "walkdir",
- "windows-sys 0.48.0",
+ "windows-sys 0.59.0",
+]
+
+[[package]]
+name = "cargo-util-schemas"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34ddc7fc157e3dbbd88f05ef8be7c3ed3ecb05925a3f51f716d6103a607fb7c4"
+dependencies = [
+ "semver",
+ "serde",
+ "serde-untagged",
+ "serde-value",
+ "thiserror 1.0.69",
+ "toml",
+ "unicode-xid",
+ "url",
 ]
 
 [[package]]
 name = "cc"
-version = "1.0.83"
+version = "1.2.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0"
+checksum = "27f657647bcff5394bf56c7317665bbf790a137a50eaaa5c6bfbb9e27a518f2d"
 dependencies = [
  "jobserver",
  "libc",
+ "shlex",
 ]
 
 [[package]]
@@ -305,18 +379,18 @@
 
 [[package]]
 name = "clap"
-version = "4.4.12"
+version = "4.5.23"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dcfab8ba68f3668e89f6ff60f5b205cea56aa7b769451a59f34b8682f51c056d"
+checksum = "3135e7ec2ef7b10c6ed8950f0f792ed96ee093fa088608f1c76e569722700c84"
 dependencies = [
  "clap_builder",
 ]
 
 [[package]]
 name = "clap_builder"
-version = "4.4.12"
+version = "4.5.23"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fb7fb5e4e979aec3be7791562fcba452f94ad85e954da024396433e0e25a79e9"
+checksum = "30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838"
 dependencies = [
  "anstream",
  "anstyle",
@@ -327,21 +401,42 @@
 
 [[package]]
 name = "clap_lex"
-version = "0.6.0"
+version = "0.7.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1"
+checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6"
 
 [[package]]
 name = "clru"
-version = "0.6.1"
+version = "0.6.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b8191fa7302e03607ff0e237d4246cc043ff5b3cb9409d995172ba3bea16b807"
+checksum = "cbd0f76e066e64fdc5631e3bb46381254deab9ef1158292f27c8c57e3bf3fe59"
+
+[[package]]
+name = "color-print"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3aa954171903797d5623e047d9ab69d91b493657917bdfb8c2c80ecaf9cdb6f4"
+dependencies = [
+ "color-print-proc-macro",
+]
+
+[[package]]
+name = "color-print-proc-macro"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "692186b5ebe54007e45a59aea47ece9eb4108e141326c304cdc91699a7118a22"
+dependencies = [
+ "nom",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
 
 [[package]]
 name = "colorchoice"
-version = "1.0.0"
+version = "1.0.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7"
+checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990"
 
 [[package]]
 name = "const-oid"
@@ -360,83 +455,86 @@
 ]
 
 [[package]]
-name = "core-foundation-sys"
-version = "0.8.6"
+name = "core-foundation"
+version = "0.10.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f"
+checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63"
+dependencies = [
+ "core-foundation-sys",
+ "libc",
+]
+
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
 
 [[package]]
 name = "cpufeatures"
-version = "0.2.11"
+version = "0.2.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0"
+checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3"
 dependencies = [
  "libc",
 ]
 
 [[package]]
 name = "crates-io"
-version = "0.37.0"
+version = "0.40.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "876aa69b4afca5f2eb5e23daa3445930faf829bcb67075a20ffa884f11f8c57c"
+checksum = "6cee4e56fd9f9c23d0654bdcf8c6ad1943b66743b34baeb852fe5318d255c8d0"
 dependencies = [
- "anyhow",
  "curl",
  "percent-encoding",
  "serde",
  "serde_json",
+ "thiserror 1.0.69",
  "url",
 ]
 
 [[package]]
 name = "crc32fast"
-version = "1.3.2"
+version = "1.4.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d"
+checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
 dependencies = [
  "cfg-if",
 ]
 
 [[package]]
 name = "crossbeam-channel"
-version = "0.5.10"
+version = "0.5.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "82a9b73a36529d9c47029b9fb3a6f0ea3cc916a261195352ba19e770fc1748b2"
+checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2"
 dependencies = [
- "cfg-if",
  "crossbeam-utils",
 ]
 
 [[package]]
 name = "crossbeam-deque"
-version = "0.8.4"
+version = "0.8.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fca89a0e215bab21874660c67903c5f143333cab1da83d041c7ded6053774751"
+checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d"
 dependencies = [
- "cfg-if",
  "crossbeam-epoch",
  "crossbeam-utils",
 ]
 
 [[package]]
 name = "crossbeam-epoch"
-version = "0.9.17"
+version = "0.9.18"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0e3681d554572a651dda4186cd47240627c3d0114d45a95f6ad27f2f22e7548d"
+checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
 dependencies = [
- "autocfg",
- "cfg-if",
  "crossbeam-utils",
 ]
 
 [[package]]
 name = "crossbeam-utils"
-version = "0.8.18"
+version = "0.8.20"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3a430a770ebd84726f584a90ee7f020d28db52c6d02138900f22341f866d39c"
-dependencies = [
- "cfg-if",
-]
+checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80"
 
 [[package]]
 name = "crypto-bigint"
@@ -462,15 +560,15 @@
 
 [[package]]
 name = "ct-codecs"
-version = "1.1.1"
+version = "1.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f3b7eb4404b8195a9abb6356f4ac07d8ba267045c8d6d220ac4dc992e6cc75df"
+checksum = "026ac6ceace6298d2c557ef5ed798894962296469ec7842288ea64674201a2d1"
 
 [[package]]
 name = "curl"
-version = "0.4.44"
+version = "0.4.47"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "509bd11746c7ac09ebd19f0b17782eae80aadee26237658a6b4808afb5c11a22"
+checksum = "d9fb4d13a1be2b58f14d60adba57c9834b78c62fd86c3e76a148f732686e9265"
 dependencies = [
  "curl-sys",
  "libc",
@@ -478,14 +576,14 @@
  "openssl-sys",
  "schannel",
  "socket2",
- "winapi",
+ "windows-sys 0.52.0",
 ]
 
 [[package]]
 name = "curl-sys"
-version = "0.4.70+curl-8.5.0"
+version = "0.4.78+curl-8.11.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c0333d8849afe78a4c8102a429a446bfdd055832af071945520e835ae2d841e"
+checksum = "8eec768341c5c7789611ae51cf6c459099f22e64a5d5d0ce4892434e33821eaf"
 dependencies = [
  "cc",
  "libc",
@@ -494,14 +592,25 @@
  "openssl-sys",
  "pkg-config",
  "vcpkg",
- "windows-sys 0.48.0",
+ "windows-sys 0.52.0",
+]
+
+[[package]]
+name = "dbus"
+version = "0.9.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1bb21987b9fb1613058ba3843121dd18b163b254d8a6e797e144cbac14d96d1b"
+dependencies = [
+ "libc",
+ "libdbus-sys",
+ "winapi",
 ]
 
 [[package]]
 name = "der"
-version = "0.7.8"
+version = "0.7.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c"
+checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0"
 dependencies = [
  "const-oid",
  "pem-rfc7468",
@@ -515,6 +624,7 @@
 checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4"
 dependencies = [
  "powerfmt",
+ "serde",
 ]
 
 [[package]]
@@ -530,10 +640,21 @@
 ]
 
 [[package]]
-name = "dunce"
-version = "1.0.4"
+name = "displaydoc"
+version = "0.2.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b"
+checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "dunce"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813"
 
 [[package]]
 name = "ecdsa"
@@ -551,18 +672,18 @@
 
 [[package]]
 name = "ed25519-compact"
-version = "2.0.6"
+version = "2.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a667e6426df16c2ac478efa4a439d0e674cba769c5556e8cf221739251640c8c"
+checksum = "e9b3460f44bea8cd47f45a0c70892f1eff856d97cd55358b2f73f663789f6190"
 dependencies = [
  "getrandom",
 ]
 
 [[package]]
 name = "either"
-version = "1.9.0"
+version = "1.13.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07"
+checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0"
 
 [[package]]
 name = "elliptic-curve"
@@ -586,16 +707,12 @@
 ]
 
 [[package]]
-name = "env_logger"
-version = "0.10.1"
+name = "encoding_rs"
+version = "0.8.35"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "95b3f3e67048839cb0d0781f445682a35113da7121f7c949db0e2be96a4fbece"
+checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3"
 dependencies = [
- "humantime",
- "is-terminal",
- "log",
- "regex",
- "termcolor",
+ "cfg-if",
 ]
 
 [[package]]
@@ -605,29 +722,48 @@
 checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
 
 [[package]]
-name = "errno"
-version = "0.3.8"
+name = "erased-serde"
+version = "0.4.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245"
+checksum = "24e2389d65ab4fab27dc2a5de7b191e1f6617d1f1c8855c0dc569c94a4cbb18d"
+dependencies = [
+ "serde",
+ "typeid",
+]
+
+[[package]]
+name = "errno"
+version = "0.3.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d"
 dependencies = [
  "libc",
- "windows-sys 0.52.0",
+ "windows-sys 0.59.0",
 ]
 
 [[package]]
+name = "fallible-iterator"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649"
+
+[[package]]
+name = "fallible-streaming-iterator"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a"
+
+[[package]]
 name = "faster-hex"
-version = "0.8.1"
+version = "0.9.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "239f7bfb930f820ab16a9cd95afc26f88264cf6905c960b340a615384aa3338a"
-dependencies = [
- "serde",
-]
+checksum = "a2a2b11eda1d40935b26cf18f6833c526845ae8c41e58d09af6adeb6f0269183"
 
 [[package]]
 name = "fastrand"
-version = "2.0.1"
+version = "2.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5"
+checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4"
 
 [[package]]
 name = "ff"
@@ -641,27 +777,27 @@
 
 [[package]]
 name = "fiat-crypto"
-version = "0.2.5"
+version = "0.2.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "27573eac26f4dd11e2b1916c3fe1baa56407c83c71a773a8ba17ec0bca03b6b7"
+checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d"
 
 [[package]]
 name = "filetime"
-version = "0.2.23"
+version = "0.2.25"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd"
+checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586"
 dependencies = [
  "cfg-if",
  "libc",
- "redox_syscall",
- "windows-sys 0.52.0",
+ "libredox",
+ "windows-sys 0.59.0",
 ]
 
 [[package]]
 name = "flate2"
-version = "1.0.28"
+version = "1.0.35"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e"
+checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c"
 dependencies = [
  "crc32fast",
  "libz-sys",
@@ -669,6 +805,12 @@
 ]
 
 [[package]]
+name = "fnv"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+
+[[package]]
 name = "form_urlencoded"
 version = "1.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -678,16 +820,6 @@
 ]
 
 [[package]]
-name = "fwdansi"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "08c1f5787fe85505d1f7777268db5103d80a7a374d2316a7ce262e57baf8f208"
-dependencies = [
- "memchr",
- "termcolor",
-]
-
-[[package]]
 name = "generic-array"
 version = "0.14.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -700,9 +832,9 @@
 
 [[package]]
 name = "getrandom"
-version = "0.2.11"
+version = "0.2.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f"
+checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7"
 dependencies = [
  "cfg-if",
  "js-sys",
@@ -713,11 +845,11 @@
 
 [[package]]
 name = "git2"
-version = "0.17.2"
+version = "0.18.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7b989d6a7ca95a362cf2cfc5ad688b3a467be1f87e480b8dad07fee8c79b0044"
+checksum = "232e6a7bfe35766bf715e55a88b39a700596c0ccfd88cd3680b4cdb40d66ef70"
 dependencies = [
- "bitflags 1.3.2",
+ "bitflags",
  "libc",
  "libgit2-sys",
  "log",
@@ -728,9 +860,9 @@
 
 [[package]]
 name = "git2-curl"
-version = "0.18.0"
+version = "0.19.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f8f8b7432b72928cff76f69e59ed5327f94a52763731e71274960dee72fe5f8c"
+checksum = "78e26b61608c573ffd26fc79061a823aa5147449a1afe1f61679a21e2031f7c3"
 dependencies = [
  "curl",
  "git2",
@@ -740,18 +872,22 @@
 
 [[package]]
 name = "gix"
-version = "0.44.1"
+version = "0.63.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6bf41b61f7df395284f7a579c0fa1a7e012c5aede655174d4e91299ef1cac643"
+checksum = "984c5018adfa7a4536ade67990b3ebc6e11ab57b3d6cd9968de0947ca99b4b06"
 dependencies = [
  "gix-actor",
  "gix-attributes",
+ "gix-command",
+ "gix-commitgraph",
  "gix-config",
  "gix-credentials",
- "gix-date",
+ "gix-date 0.8.7",
  "gix-diff",
+ "gix-dir",
  "gix-discover",
  "gix-features",
+ "gix-filter",
  "gix-fs",
  "gix-glob",
  "gix-hash",
@@ -759,96 +895,116 @@
  "gix-ignore",
  "gix-index",
  "gix-lock",
- "gix-mailmap",
+ "gix-macros",
+ "gix-negotiate",
  "gix-object",
  "gix-odb",
  "gix-pack",
  "gix-path",
+ "gix-pathspec",
  "gix-prompt",
  "gix-protocol",
  "gix-ref",
  "gix-refspec",
  "gix-revision",
+ "gix-revwalk",
  "gix-sec",
+ "gix-submodule",
  "gix-tempfile",
+ "gix-trace",
  "gix-transport",
  "gix-traverse",
  "gix-url",
  "gix-utils",
  "gix-validate",
  "gix-worktree",
- "log",
  "once_cell",
+ "parking_lot",
  "prodash",
- "signal-hook",
  "smallvec",
- "thiserror",
- "unicode-normalization",
+ "thiserror 1.0.69",
 ]
 
 [[package]]
 name = "gix-actor"
-version = "0.20.0"
+version = "0.31.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "848efa0f1210cea8638f95691c82a46f98a74b9e3524f01d4955ebc25a8f84f3"
+checksum = "a0e454357e34b833cc3a00b6efbbd3dd4d18b24b9fb0c023876ec2645e8aa3f2"
 dependencies = [
  "bstr",
- "btoi",
- "gix-date",
+ "gix-date 0.8.7",
+ "gix-utils",
  "itoa",
- "nom",
- "thiserror",
+ "thiserror 1.0.69",
+ "winnow",
 ]
 
 [[package]]
 name = "gix-attributes"
-version = "0.12.0"
+version = "0.22.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3015baa01ad2122fbcaab7863c857a603eb7b7ec12ac8141207c42c6439805e2"
+checksum = "ebccbf25aa4a973dd352564a9000af69edca90623e8a16dad9cbc03713131311"
 dependencies = [
  "bstr",
  "gix-glob",
  "gix-path",
  "gix-quote",
+ "gix-trace",
  "kstring",
- "log",
  "smallvec",
- "thiserror",
+ "thiserror 1.0.69",
  "unicode-bom",
 ]
 
 [[package]]
 name = "gix-bitmap"
-version = "0.2.10"
+version = "0.2.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "78b6cd0f246180034ddafac9b00a112f19178135b21eb031b3f79355891f7325"
+checksum = "d48b897b4bbc881aea994b4a5bbb340a04979d7be9089791304e04a9fbc66b53"
 dependencies = [
- "thiserror",
+ "thiserror 2.0.4",
 ]
 
 [[package]]
 name = "gix-chunk"
-version = "0.4.7"
+version = "0.4.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "003ec6deacf68076a0c157271a127e0bb2c031c1a41f7168cbe5d248d9b85c78"
+checksum = "c6ffbeb3a5c0b8b84c3fe4133a6f8c82fa962f4caefe8d0762eced025d3eb4f7"
 dependencies = [
- "thiserror",
+ "thiserror 2.0.4",
 ]
 
 [[package]]
 name = "gix-command"
-version = "0.2.10"
+version = "0.3.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c576cfbf577f72c097b5f88aedea502cd62952bdc1fb3adcab4531d5525a4c7"
+checksum = "6d7d6b8f3a64453fd7e8191eb80b351eb7ac0839b40a1237cd2c137d5079fe53"
 dependencies = [
  "bstr",
+ "gix-path",
+ "gix-trace",
+ "shell-words",
+]
+
+[[package]]
+name = "gix-commitgraph"
+version = "0.24.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "133b06f67f565836ec0c473e2116a60fb74f80b6435e21d88013ac0e3c60fc78"
+dependencies = [
+ "bstr",
+ "gix-chunk",
+ "gix-features",
+ "gix-hash",
+ "memmap2",
+ "thiserror 1.0.69",
 ]
 
 [[package]]
 name = "gix-config"
-version = "0.22.0"
+version = "0.37.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1d252a0eddb6df74600d3d8872dc9fe98835a7da43110411d705b682f49d4ac1"
+checksum = "53fafe42957e11d98e354a66b6bd70aeea00faf2f62dd11164188224a507c840"
 dependencies = [
  "bstr",
  "gix-config-value",
@@ -857,33 +1013,32 @@
  "gix-path",
  "gix-ref",
  "gix-sec",
- "log",
  "memchr",
- "nom",
  "once_cell",
  "smallvec",
- "thiserror",
+ "thiserror 1.0.69",
  "unicode-bom",
+ "winnow",
 ]
 
 [[package]]
 name = "gix-config-value"
-version = "0.12.5"
+version = "0.14.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6e874f41437441c02991dcea76990b9058fadfc54b02ab4dd06ab2218af43897"
+checksum = "49aaeef5d98390a3bcf9dbc6440b520b793d1bf3ed99317dc407b02be995b28e"
 dependencies = [
- "bitflags 2.4.1",
+ "bitflags",
  "bstr",
  "gix-path",
  "libc",
- "thiserror",
+ "thiserror 2.0.4",
 ]
 
 [[package]]
 name = "gix-credentials"
-version = "0.14.0"
+version = "0.24.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4874a4fc11ffa844a3c2b87a66957bda30a73b577ef1acf15ac34df5745de5ff"
+checksum = "8ce391d305968782f1ae301c4a3d42c5701df7ff1d8bc03740300f6fd12bce78"
 dependencies = [
  "bstr",
  "gix-command",
@@ -891,85 +1046,144 @@
  "gix-path",
  "gix-prompt",
  "gix-sec",
+ "gix-trace",
  "gix-url",
- "thiserror",
+ "thiserror 1.0.69",
 ]
 
 [[package]]
 name = "gix-date"
-version = "0.5.1"
+version = "0.8.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bc164145670e9130a60a21670d9b6f0f4f8de04e5dd256c51fa5a0340c625902"
+checksum = "9eed6931f21491ee0aeb922751bd7ec97b4b2fe8fbfedcb678e2a2dce5f3b8c0"
 dependencies = [
  "bstr",
  "itoa",
- "thiserror",
+ "thiserror 1.0.69",
  "time",
 ]
 
 [[package]]
-name = "gix-diff"
-version = "0.29.0"
+name = "gix-date"
+version = "0.9.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "644a0f2768bc42d7a69289ada80c9e15c589caefc6a315d2307202df83ed1186"
+checksum = "691142b1a34d18e8ed6e6114bc1a2736516c5ad60ef3aa9bd1b694886e3ca92d"
 dependencies = [
+ "bstr",
+ "itoa",
+ "jiff",
+ "thiserror 2.0.4",
+]
+
+[[package]]
+name = "gix-diff"
+version = "0.44.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1996d5c8a305b59709467d80617c9fde48d9d75fd1f4179ea970912630886c9d"
+dependencies = [
+ "bstr",
  "gix-hash",
  "gix-object",
- "imara-diff",
- "thiserror",
+ "thiserror 1.0.69",
+]
+
+[[package]]
+name = "gix-dir"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "60c99f8c545abd63abe541d20ab6cda347de406c0a3f1c80aadc12d9b0e94974"
+dependencies = [
+ "bstr",
+ "gix-discover",
+ "gix-fs",
+ "gix-ignore",
+ "gix-index",
+ "gix-object",
+ "gix-path",
+ "gix-pathspec",
+ "gix-trace",
+ "gix-utils",
+ "gix-worktree",
+ "thiserror 1.0.69",
 ]
 
 [[package]]
 name = "gix-discover"
-version = "0.18.1"
+version = "0.32.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1a6b61363e63e7cdaa3e6f96acb0257ebdb3d8883e21eba5930c99f07f0a5fc0"
+checksum = "fc27c699b63da66b50d50c00668bc0b7e90c3a382ef302865e891559935f3dbf"
 dependencies = [
  "bstr",
  "dunce",
+ "gix-fs",
  "gix-hash",
  "gix-path",
  "gix-ref",
  "gix-sec",
- "thiserror",
+ "thiserror 1.0.69",
 ]
 
 [[package]]
 name = "gix-features"
-version = "0.29.0"
+version = "0.38.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cf69b0f5c701cc3ae22d3204b671907668f6437ca88862d355eaf9bc47a4f897"
+checksum = "ac7045ac9fe5f9c727f38799d002a7ed3583cd777e3322a7c4b43e3cf437dc69"
 dependencies = [
  "bytes",
  "crc32fast",
  "crossbeam-channel",
  "flate2",
  "gix-hash",
+ "gix-trace",
+ "gix-utils",
  "libc",
  "once_cell",
  "parking_lot",
  "prodash",
  "sha1_smol",
- "thiserror",
+ "thiserror 1.0.69",
  "walkdir",
 ]
 
 [[package]]
-name = "gix-fs"
-version = "0.1.1"
+name = "gix-filter"
+version = "0.11.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9b37a1832f691fdc09910bd267f9a2e413737c1f9ec68c6e31f9e802616278a9"
+checksum = "e6547738da28275f4dff4e9f3a0f28509f53f94dd6bd822733c91cb306bca61a"
 dependencies = [
+ "bstr",
+ "encoding_rs",
+ "gix-attributes",
+ "gix-command",
+ "gix-hash",
+ "gix-object",
+ "gix-packetline-blocking",
+ "gix-path",
+ "gix-quote",
+ "gix-trace",
+ "gix-utils",
+ "smallvec",
+ "thiserror 1.0.69",
+]
+
+[[package]]
+name = "gix-fs"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f2bfe6249cfea6d0c0e0990d5226a4cb36f030444ba9e35e0639275db8f98575"
+dependencies = [
+ "fastrand",
  "gix-features",
+ "gix-utils",
 ]
 
 [[package]]
 name = "gix-glob"
-version = "0.7.0"
+version = "0.16.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c07c98204529ac3f24b34754540a852593d2a4c7349008df389240266627a72a"
+checksum = "74908b4bbc0a0a40852737e5d7889f676f081e340d5451a16e5b4c50d592f111"
 dependencies = [
- "bitflags 2.4.1",
+ "bitflags",
  "bstr",
  "gix-features",
  "gix-path",
@@ -977,108 +1191,133 @@
 
 [[package]]
 name = "gix-hash"
-version = "0.11.4"
+version = "0.14.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4b422ff2ad9a0628baaad6da468cf05385bf3f5ab495ad5a33cce99b9f41092f"
+checksum = "f93d7df7366121b5018f947a04d37f034717e113dcf9ccd85c34b58e57a74d5e"
 dependencies = [
- "hex",
- "thiserror",
+ "faster-hex",
+ "thiserror 1.0.69",
 ]
 
 [[package]]
 name = "gix-hashtable"
-version = "0.2.4"
+version = "0.5.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "385f4ce6ecf3692d313ca3aa9bd3b3d8490de53368d6d94bedff3af8b6d9c58d"
+checksum = "7ddf80e16f3c19ac06ce415a38b8591993d3f73aede049cb561becb5b3a8e242"
 dependencies = [
  "gix-hash",
- "hashbrown 0.14.3",
+ "hashbrown 0.14.5",
  "parking_lot",
 ]
 
 [[package]]
 name = "gix-ignore"
-version = "0.2.0"
+version = "0.11.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ba205b6df563e2906768bb22834c82eb46c5fdfcd86ba2c347270bc8309a05b2"
+checksum = "e447cd96598460f5906a0f6c75e950a39f98c2705fc755ad2f2020c9e937fab7"
 dependencies = [
  "bstr",
  "gix-glob",
  "gix-path",
+ "gix-trace",
  "unicode-bom",
 ]
 
 [[package]]
 name = "gix-index"
-version = "0.16.1"
+version = "0.33.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f39c1ccc8f1912cbbd5191efc28dbc5f0d0598042aa56bc09427b7c34efab3ba"
+checksum = "9a9a44eb55bd84bb48f8a44980e951968ced21e171b22d115d1cdcef82a7d73f"
 dependencies = [
- "bitflags 2.4.1",
+ "bitflags",
  "bstr",
- "btoi",
  "filetime",
+ "fnv",
  "gix-bitmap",
  "gix-features",
+ "gix-fs",
  "gix-hash",
  "gix-lock",
  "gix-object",
  "gix-traverse",
+ "gix-utils",
+ "gix-validate",
+ "hashbrown 0.14.5",
  "itoa",
+ "libc",
  "memmap2",
+ "rustix",
  "smallvec",
- "thiserror",
+ "thiserror 1.0.69",
 ]
 
 [[package]]
 name = "gix-lock"
-version = "5.0.1"
+version = "14.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2c693d7f05730fa74a7c467150adc7cea393518410c65f0672f80226b8111555"
+checksum = "e3bc7fe297f1f4614774989c00ec8b1add59571dc9b024b4c00acb7dedd4e19d"
 dependencies = [
  "gix-tempfile",
  "gix-utils",
- "thiserror",
+ "thiserror 1.0.69",
 ]
 
 [[package]]
-name = "gix-mailmap"
-version = "0.12.0"
+name = "gix-macros"
+version = "0.1.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e8856cec3bdc3610c06970d28b6cb20a0c6621621cf9a8ec48cbd23f2630f362"
+checksum = "999ce923619f88194171a67fb3e6d613653b8d4d6078b529b15a765da0edcc17"
 dependencies = [
- "bstr",
- "gix-actor",
- "thiserror",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "gix-negotiate"
+version = "0.13.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ec879fb6307bb63519ba89be0024c6f61b4b9d61f1a91fd2ce572d89fe9c224"
+dependencies = [
+ "bitflags",
+ "gix-commitgraph",
+ "gix-date 0.8.7",
+ "gix-hash",
+ "gix-object",
+ "gix-revwalk",
+ "smallvec",
+ "thiserror 1.0.69",
 ]
 
 [[package]]
 name = "gix-object"
-version = "0.29.2"
+version = "0.42.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2d96bd620fd08accdd37f70b2183cfa0b001b4f1c6ade8b7f6e15cb3d9e261ce"
+checksum = "25da2f46b4e7c2fa7b413ce4dffb87f69eaf89c2057e386491f4c55cadbfe386"
 dependencies = [
  "bstr",
- "btoi",
  "gix-actor",
+ "gix-date 0.8.7",
  "gix-features",
  "gix-hash",
+ "gix-utils",
  "gix-validate",
- "hex",
  "itoa",
- "nom",
  "smallvec",
- "thiserror",
+ "thiserror 1.0.69",
+ "winnow",
 ]
 
 [[package]]
 name = "gix-odb"
-version = "0.45.0"
+version = "0.61.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bca2f324aa67672b6d0f2c0fa93f96eb6a7029d260e4c1df5dce3c015f5e5add"
+checksum = "20d384fe541d93d8a3bb7d5d5ef210780d6df4f50c4e684ccba32665a5e3bc9b"
 dependencies = [
  "arc-swap",
+ "gix-date 0.8.7",
  "gix-features",
+ "gix-fs",
  "gix-hash",
  "gix-object",
  "gix-pack",
@@ -1086,103 +1325,131 @@
  "gix-quote",
  "parking_lot",
  "tempfile",
- "thiserror",
+ "thiserror 1.0.69",
 ]
 
 [[package]]
 name = "gix-pack"
-version = "0.35.0"
+version = "0.51.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "164a515900a83257ae4aa80e741655bee7a2e39113fb535d7a5ac623b445ff20"
+checksum = "3e0594491fffe55df94ba1c111a6566b7f56b3f8d2e1efc750e77d572f5f5229"
 dependencies = [
  "clru",
  "gix-chunk",
- "gix-diff",
  "gix-features",
  "gix-hash",
  "gix-hashtable",
  "gix-object",
  "gix-path",
  "gix-tempfile",
- "gix-traverse",
  "memmap2",
  "parking_lot",
  "smallvec",
- "thiserror",
+ "thiserror 1.0.69",
 ]
 
 [[package]]
 name = "gix-packetline"
-version = "0.16.7"
+version = "0.17.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8a8384b1e964151aff0d5632dd9b191059d07dff358b96bd940f1b452600d7ab"
+checksum = "8c43ef4d5fe2fa222c606731c8bdbf4481413ee4ef46d61340ec39e4df4c5e49"
 dependencies = [
  "bstr",
  "faster-hex",
- "thiserror",
+ "gix-trace",
+ "thiserror 1.0.69",
+]
+
+[[package]]
+name = "gix-packetline-blocking"
+version = "0.17.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9802304baa798dd6f5ff8008a2b6516d54b74a69ca2d3a2b9e2d6c3b5556b40"
+dependencies = [
+ "bstr",
+ "faster-hex",
+ "gix-trace",
+ "thiserror 1.0.69",
 ]
 
 [[package]]
 name = "gix-path"
-version = "0.8.4"
+version = "0.10.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "18609c8cbec8508ea97c64938c33cd305b75dfc04a78d0c3b78b8b3fd618a77c"
+checksum = "afc292ef1a51e340aeb0e720800338c805975724c1dfbd243185452efd8645b7"
 dependencies = [
  "bstr",
  "gix-trace",
  "home",
  "once_cell",
- "thiserror",
+ "thiserror 2.0.4",
+]
+
+[[package]]
+name = "gix-pathspec"
+version = "0.7.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5d23bf239532b4414d0e63b8ab3a65481881f7237ed9647bb10c1e3cc54c5ceb"
+dependencies = [
+ "bitflags",
+ "bstr",
+ "gix-attributes",
+ "gix-config-value",
+ "gix-glob",
+ "gix-path",
+ "thiserror 1.0.69",
 ]
 
 [[package]]
 name = "gix-prompt"
-version = "0.5.5"
+version = "0.8.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2c22decaf4a063ccae2b2108820c8630c01bd6756656df3fe464b32b8958a5ea"
+checksum = "7a7822afc4bc9c5fbbc6ce80b00f41c129306b7685cac3248dbfa14784960594"
 dependencies = [
  "gix-command",
  "gix-config-value",
  "parking_lot",
  "rustix",
- "thiserror",
+ "thiserror 2.0.4",
 ]
 
 [[package]]
 name = "gix-protocol"
-version = "0.32.0"
+version = "0.45.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "877e49417f1730f4dbc2f7d9a2ab0f8b2f49ef08f97270691403ecde3d961e3a"
+checksum = "cc43a1006f01b5efee22a003928c9eb83dde2f52779ded9d4c0732ad93164e3e"
 dependencies = [
  "bstr",
- "btoi",
  "gix-credentials",
+ "gix-date 0.9.2",
  "gix-features",
  "gix-hash",
  "gix-transport",
+ "gix-utils",
  "maybe-async",
- "nom",
- "thiserror",
+ "thiserror 1.0.69",
+ "winnow",
 ]
 
 [[package]]
 name = "gix-quote"
-version = "0.4.10"
+version = "0.4.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9f7dc10303d73a960d10fb82f81188b036ac3e6b11b5795b20b1a60b51d1321f"
+checksum = "64a1e282216ec2ab2816cd57e6ed88f8009e634aec47562883c05ac8a7009a63"
 dependencies = [
  "bstr",
- "btoi",
- "thiserror",
+ "gix-utils",
+ "thiserror 2.0.4",
 ]
 
 [[package]]
 name = "gix-ref"
-version = "0.29.1"
+version = "0.44.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e03989e9d49954368e1b526578230fc7189d1634acdfbe79e9ba1de717e15d5"
+checksum = "3394a2997e5bc6b22ebc1e1a87b41eeefbcfcff3dbfa7c4bd73cb0ac8f1f3e2e"
 dependencies = [
  "gix-actor",
+ "gix-date 0.8.7",
  "gix-features",
  "gix-fs",
  "gix-hash",
@@ -1190,78 +1457,109 @@
  "gix-object",
  "gix-path",
  "gix-tempfile",
+ "gix-utils",
  "gix-validate",
  "memmap2",
- "nom",
- "thiserror",
+ "thiserror 1.0.69",
+ "winnow",
 ]
 
 [[package]]
 name = "gix-refspec"
-version = "0.10.1"
+version = "0.23.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0a6ea733820df67e4cd7797deb12727905824d8f5b7c59d943c456d314475892"
+checksum = "6868f8cd2e62555d1f7c78b784bece43ace40dd2a462daf3b588d5416e603f37"
 dependencies = [
  "bstr",
  "gix-hash",
  "gix-revision",
  "gix-validate",
  "smallvec",
- "thiserror",
+ "thiserror 1.0.69",
 ]
 
 [[package]]
 name = "gix-revision"
-version = "0.13.0"
+version = "0.27.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "810f35e9afeccca999d5d348b239f9c162353127d2e13ff3240e31b919e35476"
+checksum = "01b13e43c2118c4b0537ddac7d0821ae0dfa90b7b8dbf20c711e153fb749adce"
 dependencies = [
  "bstr",
- "gix-date",
+ "gix-date 0.8.7",
  "gix-hash",
  "gix-hashtable",
  "gix-object",
- "thiserror",
+ "gix-revwalk",
+ "gix-trace",
+ "thiserror 1.0.69",
+]
+
+[[package]]
+name = "gix-revwalk"
+version = "0.13.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1b030ccaab71af141f537e0225f19b9e74f25fefdba0372246b844491cab43e0"
+dependencies = [
+ "gix-commitgraph",
+ "gix-date 0.8.7",
+ "gix-hash",
+ "gix-hashtable",
+ "gix-object",
+ "smallvec",
+ "thiserror 1.0.69",
 ]
 
 [[package]]
 name = "gix-sec"
-version = "0.8.4"
+version = "0.10.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9615cbd6b456898aeb942cd75e5810c382fbfc48dbbff2fa23ebd2d33dcbe9c7"
+checksum = "a8b876ef997a955397809a2ec398d6a45b7a55b4918f2446344330f778d14fd6"
 dependencies = [
- "bitflags 2.4.1",
+ "bitflags",
  "gix-path",
  "libc",
- "windows",
+ "windows-sys 0.52.0",
+]
+
+[[package]]
+name = "gix-submodule"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "921cd49924ac14b6611b22e5fb7bbba74d8780dc7ad26153304b64d1272460ac"
+dependencies = [
+ "bstr",
+ "gix-config",
+ "gix-path",
+ "gix-pathspec",
+ "gix-refspec",
+ "gix-url",
+ "thiserror 1.0.69",
 ]
 
 [[package]]
 name = "gix-tempfile"
-version = "5.0.3"
+version = "14.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d71a0d32f34e71e86586124225caefd78dabc605d0486de580d717653addf182"
+checksum = "046b4927969fa816a150a0cda2e62c80016fe11fb3c3184e4dddf4e542f108aa"
 dependencies = [
  "gix-fs",
  "libc",
  "once_cell",
  "parking_lot",
- "signal-hook",
- "signal-hook-registry",
  "tempfile",
 ]
 
 [[package]]
 name = "gix-trace"
-version = "0.1.6"
+version = "0.1.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e8e1127ede0475b58f4fe9c0aaa0d9bb0bad2af90bbd93ccd307c8632b863d89"
+checksum = "04bdde120c29f1fc23a24d3e115aeeea3d60d8e65bab92cc5f9d90d9302eb952"
 
 [[package]]
 name = "gix-transport"
-version = "0.31.0"
+version = "0.42.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f01c2bf7b989c679695ef635fc7d9e80072e08101be4b53193c8e8b649900102"
+checksum = "421dcccab01b41a15d97b226ad97a8f9262295044e34fbd37b10e493b0a6481f"
 dependencies = [
  "base64",
  "bstr",
@@ -1273,62 +1571,68 @@
  "gix-quote",
  "gix-sec",
  "gix-url",
- "thiserror",
+ "thiserror 1.0.69",
 ]
 
 [[package]]
 name = "gix-traverse"
-version = "0.25.0"
+version = "0.39.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a5be1e807f288c33bb005075111886cceb43ed8a167b3182a0f62c186e2a0dd1"
+checksum = "e499a18c511e71cf4a20413b743b9f5bcf64b3d9e81e9c3c6cd399eae55a8840"
 dependencies = [
+ "bitflags",
+ "gix-commitgraph",
+ "gix-date 0.8.7",
  "gix-hash",
  "gix-hashtable",
  "gix-object",
- "thiserror",
+ "gix-revwalk",
+ "smallvec",
+ "thiserror 1.0.69",
 ]
 
 [[package]]
 name = "gix-url"
-version = "0.18.0"
+version = "0.27.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dfc77f89054297cc81491e31f1bab4027e554b5ef742a44bd7035db9a0f78b76"
+checksum = "fd280c5e84fb22e128ed2a053a0daeacb6379469be6a85e3d518a0636e160c89"
 dependencies = [
  "bstr",
  "gix-features",
  "gix-path",
  "home",
- "thiserror",
+ "thiserror 1.0.69",
  "url",
 ]
 
 [[package]]
 name = "gix-utils"
-version = "0.1.8"
+version = "0.1.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "de6225e2de30b6e9bca2d9f1cc4731640fcef0fb3cabddceee366e7e85d3e94f"
+checksum = "ba427e3e9599508ed98a6ddf8ed05493db114564e338e41f6a996d2e4790335f"
 dependencies = [
+ "bstr",
  "fastrand",
+ "unicode-normalization",
 ]
 
 [[package]]
 name = "gix-validate"
-version = "0.7.7"
+version = "0.8.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ba9b3737b2cef3dcd014633485f0034b0f1a931ee54aeb7d8f87f177f3c89040"
+checksum = "82c27dd34a49b1addf193c92070bcbf3beaf6e10f16a78544de6372e146a0acf"
 dependencies = [
  "bstr",
- "thiserror",
+ "thiserror 1.0.69",
 ]
 
 [[package]]
 name = "gix-worktree"
-version = "0.17.1"
+version = "0.34.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a69eaff0ae973a9d37c40f02ae5ae50fa726c8fc2fd3ab79d0a19eb61975aafa"
+checksum = "26f7326ebe0b9172220694ea69d344c536009a9b98fb0f9de092c440f3efe7a6"
 dependencies = [
  "bstr",
- "filetime",
  "gix-attributes",
  "gix-features",
  "gix-fs",
@@ -1338,8 +1642,7 @@
  "gix-index",
  "gix-object",
  "gix-path",
- "io-close",
- "thiserror",
+ "gix-validate",
 ]
 
 [[package]]
@@ -1350,15 +1653,15 @@
 
 [[package]]
 name = "globset"
-version = "0.4.14"
+version = "0.4.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57da3b9b5b85bd66f31093f8c408b90a74431672542466497dcbdfdc02034be1"
+checksum = "15f1ce686646e7f1e19bf7d5533fe443a45dbfb990e00629110797578b42fb19"
 dependencies = [
  "aho-corasick",
  "bstr",
  "log",
- "regex-automata",
- "regex-syntax",
+ "regex-automata 0.4.9",
+ "regex-syntax 0.8.5",
 ]
 
 [[package]]
@@ -1374,21 +1677,28 @@
 
 [[package]]
 name = "hashbrown"
-version = "0.12.3"
+version = "0.14.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
+checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
+dependencies = [
+ "ahash",
+ "allocator-api2",
+]
 
 [[package]]
 name = "hashbrown"
-version = "0.14.3"
+version = "0.15.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604"
+checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289"
 
 [[package]]
-name = "hermit-abi"
-version = "0.3.3"
+name = "hashlink"
+version = "0.9.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7"
+checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af"
+dependencies = [
+ "hashbrown 0.14.5",
+]
 
 [[package]]
 name = "hex"
@@ -1425,9 +1735,9 @@
 
 [[package]]
 name = "http-auth"
-version = "0.1.9"
+version = "0.1.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "643c9bbf6a4ea8a656d6b4cd53d34f79e3f841ad5203c1a55fb7d761923bc255"
+checksum = "150fa4a9462ef926824cf4519c84ed652ca8f4fbae34cb8af045b5cbcaf98822"
 dependencies = [
  "memchr",
 ]
@@ -1439,26 +1749,155 @@
 checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
 
 [[package]]
-name = "idna"
-version = "0.5.0"
+name = "icu_collections"
+version = "1.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6"
+checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526"
 dependencies = [
- "unicode-bidi",
- "unicode-normalization",
+ "displaydoc",
+ "yoke",
+ "zerofrom",
+ "zerovec",
+]
+
+[[package]]
+name = "icu_locid"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637"
+dependencies = [
+ "displaydoc",
+ "litemap",
+ "tinystr",
+ "writeable",
+ "zerovec",
+]
+
+[[package]]
+name = "icu_locid_transform"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e"
+dependencies = [
+ "displaydoc",
+ "icu_locid",
+ "icu_locid_transform_data",
+ "icu_provider",
+ "tinystr",
+ "zerovec",
+]
+
+[[package]]
+name = "icu_locid_transform_data"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e"
+
+[[package]]
+name = "icu_normalizer"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f"
+dependencies = [
+ "displaydoc",
+ "icu_collections",
+ "icu_normalizer_data",
+ "icu_properties",
+ "icu_provider",
+ "smallvec",
+ "utf16_iter",
+ "utf8_iter",
+ "write16",
+ "zerovec",
+]
+
+[[package]]
+name = "icu_normalizer_data"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516"
+
+[[package]]
+name = "icu_properties"
+version = "1.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5"
+dependencies = [
+ "displaydoc",
+ "icu_collections",
+ "icu_locid_transform",
+ "icu_properties_data",
+ "icu_provider",
+ "tinystr",
+ "zerovec",
+]
+
+[[package]]
+name = "icu_properties_data"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569"
+
+[[package]]
+name = "icu_provider"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9"
+dependencies = [
+ "displaydoc",
+ "icu_locid",
+ "icu_provider_macros",
+ "stable_deref_trait",
+ "tinystr",
+ "writeable",
+ "yoke",
+ "zerofrom",
+ "zerovec",
+]
+
+[[package]]
+name = "icu_provider_macros"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "idna"
+version = "1.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e"
+dependencies = [
+ "idna_adapter",
+ "smallvec",
+ "utf8_iter",
+]
+
+[[package]]
+name = "idna_adapter"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71"
+dependencies = [
+ "icu_normalizer",
+ "icu_properties",
 ]
 
 [[package]]
 name = "ignore"
-version = "0.4.21"
+version = "0.4.23"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "747ad1b4ae841a78e8aba0d63adbfbeaea26b517b63705d47856b73015d27060"
+checksum = "6d89fd380afde86567dfba715db065673989d6253f42b88179abd3eae47bda4b"
 dependencies = [
  "crossbeam-deque",
  "globset",
  "log",
  "memchr",
- "regex-automata",
+ "regex-automata 0.4.9",
  "same-file",
  "walkdir",
  "winapi-util",
@@ -1479,103 +1918,94 @@
 ]
 
 [[package]]
-name = "imara-diff"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e98c1d0ad70fc91b8b9654b1f33db55e59579d3b3de2bffdced0fdb810570cb8"
-dependencies = [
- "ahash",
- "hashbrown 0.12.3",
-]
-
-[[package]]
 name = "indexmap"
-version = "1.9.3"
+version = "2.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
-dependencies = [
- "autocfg",
- "hashbrown 0.12.3",
-]
-
-[[package]]
-name = "indexmap"
-version = "2.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f"
+checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f"
 dependencies = [
  "equivalent",
- "hashbrown 0.14.3",
+ "hashbrown 0.15.2",
 ]
 
 [[package]]
-name = "io-close"
-version = "0.3.7"
+name = "is_terminal_polyfill"
+version = "1.70.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9cadcf447f06744f8ce713d2d6239bb5bde2c357a452397a9ed90c625da390bc"
-dependencies = [
- "libc",
- "winapi",
-]
-
-[[package]]
-name = "is-terminal"
-version = "0.4.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0bad00257d07be169d870ab665980b06cdb366d792ad690bf2e76876dc503455"
-dependencies = [
- "hermit-abi",
- "rustix",
- "windows-sys 0.52.0",
-]
+checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf"
 
 [[package]]
 name = "itertools"
-version = "0.10.5"
+version = "0.12.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"
+checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569"
 dependencies = [
  "either",
 ]
 
 [[package]]
 name = "itoa"
-version = "1.0.10"
+version = "1.0.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c"
+checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674"
+
+[[package]]
+name = "jiff"
+version = "0.1.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "db69f08d4fb10524cacdb074c10b296299d71274ddbc830a8ee65666867002e9"
+dependencies = [
+ "jiff-tzdb-platform",
+ "windows-sys 0.59.0",
+]
+
+[[package]]
+name = "jiff-tzdb"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "91335e575850c5c4c673b9bd467b0e025f164ca59d0564f69d0c2ee0ffad4653"
+
+[[package]]
+name = "jiff-tzdb-platform"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9835f0060a626fe59f160437bc725491a6af23133ea906500027d1bd2f8f4329"
+dependencies = [
+ "jiff-tzdb",
+]
 
 [[package]]
 name = "jobserver"
-version = "0.1.27"
+version = "0.1.32"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d"
+checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0"
 dependencies = [
  "libc",
 ]
 
 [[package]]
 name = "js-sys"
-version = "0.3.66"
+version = "0.3.76"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca"
+checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7"
 dependencies = [
+ "once_cell",
  "wasm-bindgen",
 ]
 
 [[package]]
 name = "kstring"
-version = "2.0.0"
+version = "2.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ec3066350882a1cd6d950d055997f379ac37fd39f81cd4d8ed186032eb3c5747"
+checksum = "558bf9508a558512042d3095138b1f7b8fe90c5467d94f9f1da28b3731c5dbd1"
 dependencies = [
  "static_assertions",
 ]
 
 [[package]]
 name = "lazy_static"
-version = "1.4.0"
+version = "1.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
 
 [[package]]
 name = "lazycell"
@@ -1585,15 +2015,25 @@
 
 [[package]]
 name = "libc"
-version = "0.2.151"
+version = "0.2.167"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4"
+checksum = "09d6582e104315a817dff97f75133544b2e094ee22447d2acf4a74e189ba06fc"
+
+[[package]]
+name = "libdbus-sys"
+version = "0.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "06085512b750d640299b79be4bad3d2fa90a9c00b1fd9e1b46364f66f0485c72"
+dependencies = [
+ "cc",
+ "pkg-config",
+]
 
 [[package]]
 name = "libgit2-sys"
-version = "0.15.2+1.6.4"
+version = "0.16.2+1.7.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a80df2e11fb4a61f4ba2ab42dbe7f74468da143f1a75c74e11dee7c813f694fa"
+checksum = "ee4126d8b4ee5c9d9ea891dd875cfdc1e9d0950437179104b183d7d8a74d24e8"
 dependencies = [
  "cc",
  "libc",
@@ -1604,16 +2044,48 @@
 ]
 
 [[package]]
-name = "libnghttp2-sys"
-version = "0.1.9+1.58.0"
+name = "libloading"
+version = "0.8.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b57e858af2798e167e709b9d969325b6d8e9d50232fcbc494d7d54f976854a64"
+checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34"
+dependencies = [
+ "cfg-if",
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "libnghttp2-sys"
+version = "0.1.10+1.61.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "959c25552127d2e1fa72f0e52548ec04fc386e827ba71a7bd01db46a447dc135"
 dependencies = [
  "cc",
  "libc",
 ]
 
 [[package]]
+name = "libredox"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d"
+dependencies = [
+ "bitflags",
+ "libc",
+ "redox_syscall",
+]
+
+[[package]]
+name = "libsqlite3-sys"
+version = "0.28.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0c10584274047cb335c23d3e61bcef8e323adae7c5c8c760540f73610177fc3f"
+dependencies = [
+ "cc",
+ "pkg-config",
+ "vcpkg",
+]
+
+[[package]]
 name = "libssh2-sys"
 version = "0.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1629,9 +2101,9 @@
 
 [[package]]
 name = "libz-sys"
-version = "1.1.12"
+version = "1.1.20"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d97137b25e321a73eef1418d1d5d2eda4d77e12813f8e6dead84bc52c5870a7b"
+checksum = "d2d16453e800a8cf6dd2fc3eb4bc99b786a9b90c663b8559a5b1a041bf89e472"
 dependencies = [
  "cc",
  "libc",
@@ -1641,15 +2113,21 @@
 
 [[package]]
 name = "linux-raw-sys"
-version = "0.4.12"
+version = "0.4.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456"
+checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89"
+
+[[package]]
+name = "litemap"
+version = "0.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104"
 
 [[package]]
 name = "lock_api"
-version = "0.4.11"
+version = "0.4.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45"
+checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17"
 dependencies = [
  "autocfg",
  "scopeguard",
@@ -1657,32 +2135,41 @@
 
 [[package]]
 name = "log"
-version = "0.4.20"
+version = "0.4.22"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f"
+checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24"
+
+[[package]]
+name = "matchers"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558"
+dependencies = [
+ "regex-automata 0.1.10",
+]
 
 [[package]]
 name = "maybe-async"
-version = "0.2.7"
+version = "0.2.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0f1b8c13cb1f814b634a96b2c725449fe7ed464a7b8781de8688be5ffbd3f305"
+checksum = "5cf92c10c7e361d6b99666ec1c6f9805b0bea2c3bd8c78dc6fe98ac5bd78db11"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 1.0.109",
+ "syn",
 ]
 
 [[package]]
 name = "memchr"
-version = "2.7.1"
+version = "2.7.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149"
+checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
 
 [[package]]
 name = "memmap2"
-version = "0.5.10"
+version = "0.9.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327"
+checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f"
 dependencies = [
  "libc",
 ]
@@ -1695,11 +2182,11 @@
 
 [[package]]
 name = "miniz_oxide"
-version = "0.7.1"
+version = "0.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7"
+checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1"
 dependencies = [
- "adler",
+ "adler2",
 ]
 
 [[package]]
@@ -1722,37 +2209,64 @@
 ]
 
 [[package]]
-name = "num-traits"
-version = "0.2.17"
+name = "normpath"
+version = "1.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c"
+checksum = "c8911957c4b1549ac0dc74e30db9c8b0e66ddcd6d7acc33098f4c63a64a6d7ed"
+dependencies = [
+ "windows-sys 0.59.0",
+]
+
+[[package]]
+name = "nu-ansi-term"
+version = "0.46.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84"
+dependencies = [
+ "overload",
+ "winapi",
+]
+
+[[package]]
+name = "num-conv"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9"
+
+[[package]]
+name = "num-traits"
+version = "0.2.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
 dependencies = [
  "autocfg",
 ]
 
 [[package]]
 name = "num_threads"
-version = "0.1.6"
+version = "0.1.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44"
+checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9"
 dependencies = [
  "libc",
 ]
 
 [[package]]
 name = "once_cell"
-version = "1.19.0"
+version = "1.20.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
+checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775"
 
 [[package]]
 name = "opener"
-version = "0.5.2"
+version = "0.7.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "293c15678e37254c15bd2f092314abb4e51d7fdde05c2021279c12631b54f005"
+checksum = "d0812e5e4df08da354c851a3376fead46db31c2214f849d3de356d774d057681"
 dependencies = [
  "bstr",
- "winapi",
+ "dbus",
+ "normpath",
+ "windows-sys 0.59.0",
 ]
 
 [[package]]
@@ -1763,9 +2277,9 @@
 
 [[package]]
 name = "openssl-sys"
-version = "0.9.98"
+version = "0.9.104"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c1665caf8ab2dc9aef43d1c0023bd904633a6a05cb30b0ad59bec2ae986e57a7"
+checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741"
 dependencies = [
  "cc",
  "libc",
@@ -1784,9 +2298,9 @@
 
 [[package]]
 name = "orion"
-version = "0.17.6"
+version = "0.17.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7abdb10181903c8c4b016ba45d6d6d5af1a1e2a461aa4763a83b87f5df4695e5"
+checksum = "97ab5415cf60cd271259e576f2ddee7a5f9fed42659035224c01af766943fad3"
 dependencies = [
  "fiat-crypto",
  "subtle",
@@ -1795,16 +2309,21 @@
 
 [[package]]
 name = "os_info"
-version = "3.7.0"
+version = "3.9.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "006e42d5b888366f1880eda20371fedde764ed2213dc8496f49622fa0c99cd5e"
+checksum = "e5ca711d8b83edbb00b44d504503cd247c9c0bd8b0fa2694f2a1a3d8165379ce"
 dependencies = [
  "log",
- "serde",
- "winapi",
+ "windows-sys 0.52.0",
 ]
 
 [[package]]
+name = "overload"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
+
+[[package]]
 name = "p384"
 version = "0.13.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1818,9 +2337,9 @@
 
 [[package]]
 name = "parking_lot"
-version = "0.12.1"
+version = "0.12.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
+checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27"
 dependencies = [
  "lock_api",
  "parking_lot_core",
@@ -1828,15 +2347,15 @@
 
 [[package]]
 name = "parking_lot_core"
-version = "0.9.9"
+version = "0.9.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e"
+checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8"
 dependencies = [
  "cfg-if",
  "libc",
  "redox_syscall",
  "smallvec",
- "windows-targets 0.48.5",
+ "windows-targets 0.52.6",
 ]
 
 [[package]]
@@ -1862,9 +2381,9 @@
 
 [[package]]
 name = "pathdiff"
-version = "0.2.1"
+version = "0.2.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd"
+checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3"
 
 [[package]]
 name = "pem-rfc7468"
@@ -1883,18 +2402,18 @@
 
 [[package]]
 name = "pest"
-version = "2.7.6"
+version = "2.7.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1f200d8d83c44a45b21764d1916299752ca035d15ecd46faca3e9a2a2bf6ad06"
+checksum = "8b7cafe60d6cf8e62e1b9b2ea516a089c008945bb5a275416789e7db0bc199dc"
 dependencies = [
  "memchr",
- "thiserror",
+ "thiserror 2.0.4",
  "ucd-trie",
 ]
 
 [[package]]
 name = "pest_derive"
-version = "2.7.6"
+version = "2.7.15"
 dependencies = [
  "pest",
  "pest_generator",
@@ -1902,22 +2421,22 @@
 
 [[package]]
 name = "pest_generator"
-version = "2.7.6"
+version = "2.7.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2a31940305ffc96863a735bef7c7994a00b325a7138fdbc5bda0f1a0476d3275"
+checksum = "7d1396fd3a870fc7838768d171b4616d5c91f6cc25e377b673d714567d99377b"
 dependencies = [
  "pest",
  "pest_meta",
  "proc-macro2",
  "quote",
- "syn 2.0.47",
+ "syn",
 ]
 
 [[package]]
 name = "pest_meta"
-version = "2.7.6"
+version = "2.7.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a7ff62f5259e53b78d1af898941cdcdccfae7385cf7d793a6e55de5d05bb4b7d"
+checksum = "e1e58089ea25d717bfd31fb534e4f3afcc2cc569c70de3e239778991ea3b7dea"
 dependencies = [
  "cargo",
  "once_cell",
@@ -1927,9 +2446,9 @@
 
 [[package]]
 name = "pin-project-lite"
-version = "0.2.13"
+version = "0.2.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58"
+checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff"
 
 [[package]]
 name = "pkcs8"
@@ -1943,9 +2462,9 @@
 
 [[package]]
 name = "pkg-config"
-version = "0.3.28"
+version = "0.3.31"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "69d3587f8a9e599cc7ec2c00e331f71c4e69a5f9a4b8a6efd5b07466b9736f9a"
+checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2"
 
 [[package]]
 name = "powerfmt"
@@ -1955,9 +2474,12 @@
 
 [[package]]
 name = "ppv-lite86"
-version = "0.2.17"
+version = "0.2.20"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
+checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04"
+dependencies = [
+ "zerocopy",
+]
 
 [[package]]
 name = "primeorder"
@@ -1970,27 +2492,27 @@
 
 [[package]]
 name = "proc-macro2"
-version = "1.0.75"
+version = "1.0.92"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "907a61bd0f64c2f29cd1cf1dc34d05176426a3f504a78010f08416ddb7b13708"
+checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0"
 dependencies = [
  "unicode-ident",
 ]
 
 [[package]]
 name = "prodash"
-version = "23.1.2"
+version = "28.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9516b775656bc3e8985e19cd4b8c0c0de045095074e453d2c0a513b5f978392d"
+checksum = "744a264d26b88a6a7e37cbad97953fa233b94d585236310bcbc88474b4092d79"
 dependencies = [
  "parking_lot",
 ]
 
 [[package]]
 name = "quote"
-version = "1.0.35"
+version = "1.0.37"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef"
+checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af"
 dependencies = [
  "proc-macro2",
 ]
@@ -2036,41 +2558,56 @@
 
 [[package]]
 name = "redox_syscall"
-version = "0.4.1"
+version = "0.5.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa"
+checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f"
 dependencies = [
- "bitflags 1.3.2",
+ "bitflags",
 ]
 
 [[package]]
 name = "regex"
-version = "1.10.2"
+version = "1.11.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343"
+checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191"
 dependencies = [
  "aho-corasick",
  "memchr",
- "regex-automata",
- "regex-syntax",
+ "regex-automata 0.4.9",
+ "regex-syntax 0.8.5",
 ]
 
 [[package]]
 name = "regex-automata"
-version = "0.4.3"
+version = "0.1.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f"
+checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
+dependencies = [
+ "regex-syntax 0.6.29",
+]
+
+[[package]]
+name = "regex-automata"
+version = "0.4.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908"
 dependencies = [
  "aho-corasick",
  "memchr",
- "regex-syntax",
+ "regex-syntax 0.8.5",
 ]
 
 [[package]]
 name = "regex-syntax"
-version = "0.8.2"
+version = "0.6.29"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f"
+checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
+
+[[package]]
+name = "regex-syntax"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
 
 [[package]]
 name = "rfc6979"
@@ -2083,24 +2620,38 @@
 ]
 
 [[package]]
-name = "rustfix"
-version = "0.6.1"
+name = "rusqlite"
+version = "0.31.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ecd2853d9e26988467753bd9912c3a126f642d05d229a4b53f5752ee36c56481"
+checksum = "b838eba278d213a8beaf485bd313fd580ca4505a00d5871caeb1457c55322cae"
 dependencies = [
- "anyhow",
- "log",
+ "bitflags",
+ "fallible-iterator",
+ "fallible-streaming-iterator",
+ "hashlink",
+ "libsqlite3-sys",
+ "smallvec",
+]
+
+[[package]]
+name = "rustfix"
+version = "0.8.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "82fa69b198d894d84e23afde8e9ab2af4400b2cba20d6bf2b428a8b01c222c5a"
+dependencies = [
  "serde",
  "serde_json",
+ "thiserror 1.0.69",
+ "tracing",
 ]
 
 [[package]]
 name = "rustix"
-version = "0.38.28"
+version = "0.38.41"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "72e572a5e8ca657d7366229cdde4bd14c4eb5499a9573d4d366fe1b599daa316"
+checksum = "d7f649912bc1495e167a6edee79151c84b1bad49748cb4f1f1167f459f6224f6"
 dependencies = [
- "bitflags 2.4.1",
+ "bitflags",
  "errno",
  "libc",
  "linux-raw-sys",
@@ -2109,9 +2660,9 @@
 
 [[package]]
 name = "ryu"
-version = "1.0.16"
+version = "1.0.18"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c"
+checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f"
 
 [[package]]
 name = "same-file"
@@ -2124,11 +2675,11 @@
 
 [[package]]
 name = "schannel"
-version = "0.1.23"
+version = "0.1.27"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534"
+checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d"
 dependencies = [
- "windows-sys 0.52.0",
+ "windows-sys 0.59.0",
 ]
 
 [[package]]
@@ -2152,24 +2703,58 @@
 ]
 
 [[package]]
-name = "semver"
-version = "1.0.21"
+name = "security-framework"
+version = "2.11.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0"
+checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02"
+dependencies = [
+ "bitflags",
+ "core-foundation 0.9.4",
+ "core-foundation-sys",
+ "libc",
+ "security-framework-sys",
+]
+
+[[package]]
+name = "security-framework-sys"
+version = "2.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fa39c7303dc58b5543c94d22c1766b0d31f2ee58306363ea622b10bbc075eaa2"
+dependencies = [
+ "core-foundation-sys",
+ "libc",
+]
+
+[[package]]
+name = "semver"
+version = "1.0.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b"
 dependencies = [
  "serde",
 ]
 
 [[package]]
 name = "serde"
-version = "1.0.194"
+version = "1.0.215"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b114498256798c94a0689e1a15fec6005dee8ac1f41de56404b67afc2a4b773"
+checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f"
 dependencies = [
  "serde_derive",
 ]
 
 [[package]]
+name = "serde-untagged"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2676ba99bd82f75cae5cbd2c8eda6fa0b8760f18978ea840e980dd5567b5c5b6"
+dependencies = [
+ "erased-serde",
+ "serde",
+ "typeid",
+]
+
+[[package]]
 name = "serde-value"
 version = "0.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2181,13 +2766,13 @@
 
 [[package]]
 name = "serde_derive"
-version = "1.0.194"
+version = "1.0.215"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a3385e45322e8f9931410f01b3031ec534c3947d0e94c18049af4d9f9907d4e0"
+checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.47",
+ "syn",
 ]
 
 [[package]]
@@ -2201,20 +2786,21 @@
 
 [[package]]
 name = "serde_json"
-version = "1.0.111"
+version = "1.0.133"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "176e46fa42316f18edd598015a5166857fc835ec732f5215eac6b7bdbf0a84f4"
+checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377"
 dependencies = [
  "itoa",
+ "memchr",
  "ryu",
  "serde",
 ]
 
 [[package]]
 name = "serde_spanned"
-version = "0.6.5"
+version = "0.6.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1"
+checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1"
 dependencies = [
  "serde",
 ]
@@ -2232,9 +2818,9 @@
 
 [[package]]
 name = "sha1_smol"
-version = "1.0.0"
+version = "1.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012"
+checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d"
 
 [[package]]
 name = "sha2"
@@ -2248,29 +2834,31 @@
 ]
 
 [[package]]
+name = "sharded-slab"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6"
+dependencies = [
+ "lazy_static",
+]
+
+[[package]]
 name = "shell-escape"
 version = "0.1.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "45bb67a18fa91266cc7807181f62f9178a6873bfad7dc788c42e6430db40184f"
 
 [[package]]
-name = "signal-hook"
-version = "0.3.17"
+name = "shell-words"
+version = "1.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801"
-dependencies = [
- "libc",
- "signal-hook-registry",
-]
+checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde"
 
 [[package]]
-name = "signal-hook-registry"
-version = "1.4.1"
+name = "shlex"
+version = "1.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1"
-dependencies = [
- "libc",
-]
+checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
 
 [[package]]
 name = "signature"
@@ -2294,18 +2882,18 @@
 
 [[package]]
 name = "smallvec"
-version = "1.11.2"
+version = "1.13.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970"
+checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
 
 [[package]]
 name = "socket2"
-version = "0.4.10"
+version = "0.5.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d"
+checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8"
 dependencies = [
  "libc",
- "winapi",
+ "windows-sys 0.52.0",
 ]
 
 [[package]]
@@ -2319,37 +2907,46 @@
 ]
 
 [[package]]
+name = "stable_deref_trait"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
+
+[[package]]
 name = "static_assertions"
 version = "1.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
 
 [[package]]
-name = "strip-ansi-escapes"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "011cbb39cf7c1f62871aea3cc46e5817b0937b49e9447370c93cacbe93a766d8"
-dependencies = [
- "vte",
-]
-
-[[package]]
 name = "strsim"
-version = "0.10.0"
+version = "0.11.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
+checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
 
 [[package]]
 name = "subtle"
-version = "2.5.0"
+version = "2.6.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc"
+checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
+
+[[package]]
+name = "supports-hyperlinks"
+version = "3.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "804f44ed3c63152de6a9f90acbea1a110441de43006ea51bcce8f436196a288b"
+
+[[package]]
+name = "supports-unicode"
+version = "3.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b7401a30af6cb5818bb64852270bb722533397edcfc7344954a38f420819ece2"
 
 [[package]]
 name = "syn"
-version = "1.0.109"
+version = "2.0.90"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
+checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -2357,21 +2954,21 @@
 ]
 
 [[package]]
-name = "syn"
-version = "2.0.47"
+name = "synstructure"
+version = "0.13.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1726efe18f42ae774cc644f330953a5e7b3c3003d3edcecf18850fe9d4dd9afb"
+checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971"
 dependencies = [
  "proc-macro2",
  "quote",
- "unicode-ident",
+ "syn",
 ]
 
 [[package]]
 name = "tar"
-version = "0.4.40"
+version = "0.4.43"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b16afcea1f22891c49a00c751c7b63b2233284064f11a200fc624137c51e2ddb"
+checksum = "c65998313f8e17d0d553d28f91a0df93e4dbbbf770279c7bc21ca0f09ea1a1f6"
 dependencies = [
  "filetime",
  "libc",
@@ -2379,65 +2976,87 @@
 
 [[package]]
 name = "tempfile"
-version = "3.9.0"
+version = "3.14.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "01ce4141aa927a6d1bd34a041795abd0db1cccba5d5f24b009f694bdf3a1f3fa"
+checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c"
 dependencies = [
  "cfg-if",
  "fastrand",
- "redox_syscall",
+ "once_cell",
  "rustix",
- "windows-sys 0.52.0",
-]
-
-[[package]]
-name = "termcolor"
-version = "1.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ff1bc3d3f05aff0403e8ac0d92ced918ec05b666a43f83297ccef5bea8a3d449"
-dependencies = [
- "winapi-util",
+ "windows-sys 0.59.0",
 ]
 
 [[package]]
 name = "terminal_size"
-version = "0.3.0"
+version = "0.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "21bebf2b7c9e0a515f6e0f8c51dc0f8e4696391e6f1ff30379559f8365fb0df7"
+checksum = "5352447f921fda68cf61b4101566c0bdb5104eff6804d0678e5227580ab6a4e9"
 dependencies = [
  "rustix",
- "windows-sys 0.48.0",
+ "windows-sys 0.59.0",
 ]
 
 [[package]]
 name = "thiserror"
-version = "1.0.56"
+version = "1.0.69"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad"
+checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52"
 dependencies = [
- "thiserror-impl",
+ "thiserror-impl 1.0.69",
+]
+
+[[package]]
+name = "thiserror"
+version = "2.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2f49a1853cf82743e3b7950f77e0f4d622ca36cf4317cba00c767838bac8d490"
+dependencies = [
+ "thiserror-impl 2.0.4",
 ]
 
 [[package]]
 name = "thiserror-impl"
-version = "1.0.56"
+version = "1.0.69"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471"
+checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.47",
+ "syn",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "2.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8381894bb3efe0c4acac3ded651301ceee58a15d47c2e34885ed1908ad667061"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "thread_local"
+version = "1.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c"
+dependencies = [
+ "cfg-if",
+ "once_cell",
 ]
 
 [[package]]
 name = "time"
-version = "0.3.31"
+version = "0.3.37"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f657ba42c3f86e7680e53c8cd3af8abbe56b5491790b46e22e19c0d57463583e"
+checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21"
 dependencies = [
  "deranged",
  "itoa",
  "libc",
+ "num-conv",
  "num_threads",
  "powerfmt",
  "serde",
@@ -2453,18 +3072,29 @@
 
 [[package]]
 name = "time-macros"
-version = "0.2.16"
+version = "0.2.19"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "26197e33420244aeb70c3e8c78376ca46571bc4e701e4791c2cd9f57dcb3a43f"
+checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de"
 dependencies = [
+ "num-conv",
  "time-core",
 ]
 
 [[package]]
-name = "tinyvec"
-version = "1.6.0"
+name = "tinystr"
+version = "0.7.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50"
+checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f"
+dependencies = [
+ "displaydoc",
+ "zerovec",
+]
+
+[[package]]
+name = "tinyvec"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938"
 dependencies = [
  "tinyvec_macros",
 ]
@@ -2477,9 +3107,9 @@
 
 [[package]]
 name = "toml"
-version = "0.7.8"
+version = "0.8.19"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257"
+checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e"
 dependencies = [
  "serde",
  "serde_spanned",
@@ -2489,20 +3119,20 @@
 
 [[package]]
 name = "toml_datetime"
-version = "0.6.5"
+version = "0.6.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1"
+checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41"
 dependencies = [
  "serde",
 ]
 
 [[package]]
 name = "toml_edit"
-version = "0.19.15"
+version = "0.22.22"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421"
+checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5"
 dependencies = [
- "indexmap 2.1.0",
+ "indexmap",
  "serde",
  "serde_spanned",
  "toml_datetime",
@@ -2511,9 +3141,9 @@
 
 [[package]]
 name = "tracing"
-version = "0.1.40"
+version = "0.1.41"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef"
+checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0"
 dependencies = [
  "pin-project-lite",
  "tracing-attributes",
@@ -2522,25 +3152,72 @@
 
 [[package]]
 name = "tracing-attributes"
-version = "0.1.27"
+version = "0.1.28"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
+checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.47",
+ "syn",
+]
+
+[[package]]
+name = "tracing-chrome"
+version = "0.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bf0a738ed5d6450a9fb96e86a23ad808de2b727fd1394585da5cdd6788ffe724"
+dependencies = [
+ "serde_json",
+ "tracing-core",
+ "tracing-subscriber",
 ]
 
 [[package]]
 name = "tracing-core"
-version = "0.1.32"
+version = "0.1.33"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54"
+checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c"
 dependencies = [
  "once_cell",
+ "valuable",
 ]
 
 [[package]]
+name = "tracing-log"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3"
+dependencies = [
+ "log",
+ "once_cell",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-subscriber"
+version = "0.3.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008"
+dependencies = [
+ "matchers",
+ "nu-ansi-term",
+ "once_cell",
+ "regex",
+ "sharded-slab",
+ "smallvec",
+ "thread_local",
+ "tracing",
+ "tracing-core",
+ "tracing-log",
+]
+
+[[package]]
+name = "typeid"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0e13db2e0ccd5e14a544e8a246ba2312cd25223f616442d7f2cb0e3db614236e"
+
+[[package]]
 name = "typenum"
 version = "1.17.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2548,15 +3225,15 @@
 
 [[package]]
 name = "ucd-trie"
-version = "0.1.6"
+version = "0.1.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9"
+checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971"
 
 [[package]]
-name = "unicode-bidi"
-version = "0.3.14"
+name = "unicase"
+version = "2.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6f2528f27a9eb2b21e69c95319b30bd0efd85d09c379741b0f78ea1d86be2416"
+checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df"
 
 [[package]]
 name = "unicode-bom"
@@ -2566,36 +3243,36 @@
 
 [[package]]
 name = "unicode-ident"
-version = "1.0.12"
+version = "1.0.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
+checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83"
 
 [[package]]
 name = "unicode-normalization"
-version = "0.1.22"
+version = "0.1.24"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921"
+checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956"
 dependencies = [
  "tinyvec",
 ]
 
 [[package]]
 name = "unicode-width"
-version = "0.1.11"
+version = "0.1.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85"
+checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af"
 
 [[package]]
 name = "unicode-xid"
-version = "0.2.4"
+version = "0.2.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c"
+checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
 
 [[package]]
 name = "url"
-version = "2.5.0"
+version = "2.5.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633"
+checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60"
 dependencies = [
  "form_urlencoded",
  "idna",
@@ -2603,10 +3280,28 @@
 ]
 
 [[package]]
-name = "utf8parse"
-version = "0.2.1"
+name = "utf16_iter"
+version = "1.0.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a"
+checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246"
+
+[[package]]
+name = "utf8_iter"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
+
+[[package]]
+name = "utf8parse"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
+
+[[package]]
+name = "valuable"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
 
 [[package]]
 name = "vcpkg"
@@ -2616,36 +3311,15 @@
 
 [[package]]
 name = "version_check"
-version = "0.9.4"
+version = "0.9.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
-
-[[package]]
-name = "vte"
-version = "0.10.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6cbce692ab4ca2f1f3047fcf732430249c0e971bfdd2b234cf2c47ad93af5983"
-dependencies = [
- "arrayvec",
- "utf8parse",
- "vte_generate_state_changes",
-]
-
-[[package]]
-name = "vte_generate_state_changes"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d257817081c7dffcdbab24b9e62d2def62e2ff7d00b1c20062551e6cccc145ff"
-dependencies = [
- "proc-macro2",
- "quote",
-]
+checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
 
 [[package]]
 name = "walkdir"
-version = "2.4.0"
+version = "2.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee"
+checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b"
 dependencies = [
  "same-file",
  "winapi-util",
@@ -2659,34 +3333,34 @@
 
 [[package]]
 name = "wasm-bindgen"
-version = "0.2.89"
+version = "0.2.99"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e"
+checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396"
 dependencies = [
  "cfg-if",
+ "once_cell",
  "wasm-bindgen-macro",
 ]
 
 [[package]]
 name = "wasm-bindgen-backend"
-version = "0.2.89"
+version = "0.2.99"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826"
+checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79"
 dependencies = [
  "bumpalo",
  "log",
- "once_cell",
  "proc-macro2",
  "quote",
- "syn 2.0.47",
+ "syn",
  "wasm-bindgen-shared",
 ]
 
 [[package]]
 name = "wasm-bindgen-macro"
-version = "0.2.89"
+version = "0.2.99"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2"
+checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe"
 dependencies = [
  "quote",
  "wasm-bindgen-macro-support",
@@ -2694,22 +3368,22 @@
 
 [[package]]
 name = "wasm-bindgen-macro-support"
-version = "0.2.89"
+version = "0.2.99"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283"
+checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.47",
+ "syn",
  "wasm-bindgen-backend",
  "wasm-bindgen-shared",
 ]
 
 [[package]]
 name = "wasm-bindgen-shared"
-version = "0.2.89"
+version = "0.2.99"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f"
+checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6"
 
 [[package]]
 name = "winapi"
@@ -2729,11 +3403,11 @@
 
 [[package]]
 name = "winapi-util"
-version = "0.1.6"
+version = "0.1.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596"
+checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
 dependencies = [
- "winapi",
+ "windows-sys 0.59.0",
 ]
 
 [[package]]
@@ -2743,15 +3417,6 @@
 checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
 
 [[package]]
-name = "windows"
-version = "0.48.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f"
-dependencies = [
- "windows-targets 0.48.5",
-]
-
-[[package]]
 name = "windows-sys"
 version = "0.48.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2766,7 +3431,16 @@
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
 dependencies = [
- "windows-targets 0.52.0",
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.59.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
+dependencies = [
+ "windows-targets 0.52.6",
 ]
 
 [[package]]
@@ -2786,17 +3460,18 @@
 
 [[package]]
 name = "windows-targets"
-version = "0.52.0"
+version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd"
+checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
 dependencies = [
- "windows_aarch64_gnullvm 0.52.0",
- "windows_aarch64_msvc 0.52.0",
- "windows_i686_gnu 0.52.0",
- "windows_i686_msvc 0.52.0",
- "windows_x86_64_gnu 0.52.0",
- "windows_x86_64_gnullvm 0.52.0",
- "windows_x86_64_msvc 0.52.0",
+ "windows_aarch64_gnullvm 0.52.6",
+ "windows_aarch64_msvc 0.52.6",
+ "windows_i686_gnu 0.52.6",
+ "windows_i686_gnullvm",
+ "windows_i686_msvc 0.52.6",
+ "windows_x86_64_gnu 0.52.6",
+ "windows_x86_64_gnullvm 0.52.6",
+ "windows_x86_64_msvc 0.52.6",
 ]
 
 [[package]]
@@ -2807,9 +3482,9 @@
 
 [[package]]
 name = "windows_aarch64_gnullvm"
-version = "0.52.0"
+version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea"
+checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
 
 [[package]]
 name = "windows_aarch64_msvc"
@@ -2819,9 +3494,9 @@
 
 [[package]]
 name = "windows_aarch64_msvc"
-version = "0.52.0"
+version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef"
+checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
 
 [[package]]
 name = "windows_i686_gnu"
@@ -2831,9 +3506,15 @@
 
 [[package]]
 name = "windows_i686_gnu"
-version = "0.52.0"
+version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313"
+checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
+
+[[package]]
+name = "windows_i686_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
 
 [[package]]
 name = "windows_i686_msvc"
@@ -2843,9 +3524,9 @@
 
 [[package]]
 name = "windows_i686_msvc"
-version = "0.52.0"
+version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a"
+checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
 
 [[package]]
 name = "windows_x86_64_gnu"
@@ -2855,9 +3536,9 @@
 
 [[package]]
 name = "windows_x86_64_gnu"
-version = "0.52.0"
+version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd"
+checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
 
 [[package]]
 name = "windows_x86_64_gnullvm"
@@ -2867,9 +3548,9 @@
 
 [[package]]
 name = "windows_x86_64_gnullvm"
-version = "0.52.0"
+version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e"
+checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
 
 [[package]]
 name = "windows_x86_64_msvc"
@@ -2879,41 +3560,121 @@
 
 [[package]]
 name = "windows_x86_64_msvc"
-version = "0.52.0"
+version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04"
+checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
 
 [[package]]
 name = "winnow"
-version = "0.5.32"
+version = "0.6.20"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8434aeec7b290e8da5c3f0d628cb0eac6cabcb31d14bb74f779a08109a5914d6"
+checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b"
 dependencies = [
  "memchr",
 ]
 
 [[package]]
-name = "zerocopy"
-version = "0.7.32"
+name = "write16"
+version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be"
+checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936"
+
+[[package]]
+name = "writeable"
+version = "0.5.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51"
+
+[[package]]
+name = "yoke"
+version = "0.7.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40"
 dependencies = [
+ "serde",
+ "stable_deref_trait",
+ "yoke-derive",
+ "zerofrom",
+]
+
+[[package]]
+name = "yoke-derive"
+version = "0.7.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+ "synstructure",
+]
+
+[[package]]
+name = "zerocopy"
+version = "0.7.35"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0"
+dependencies = [
+ "byteorder",
  "zerocopy-derive",
 ]
 
 [[package]]
 name = "zerocopy-derive"
-version = "0.7.32"
+version = "0.7.35"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6"
+checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.47",
+ "syn",
+]
+
+[[package]]
+name = "zerofrom"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e"
+dependencies = [
+ "zerofrom-derive",
+]
+
+[[package]]
+name = "zerofrom-derive"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+ "synstructure",
 ]
 
 [[package]]
 name = "zeroize"
-version = "1.7.0"
+version = "1.8.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d"
+checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde"
+
+[[package]]
+name = "zerovec"
+version = "0.10.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079"
+dependencies = [
+ "yoke",
+ "zerofrom",
+ "zerovec-derive",
+]
+
+[[package]]
+name = "zerovec-derive"
+version = "0.10.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
diff --git a/crates/pest_derive/Cargo.toml b/crates/pest_derive/Cargo.toml
index a443792..dbb3b1e 100644
--- a/crates/pest_derive/Cargo.toml
+++ b/crates/pest_derive/Cargo.toml
@@ -13,7 +13,7 @@
 edition = "2021"
 rust-version = "1.61"
 name = "pest_derive"
-version = "2.7.6"
+version = "2.7.15"
 authors = ["Dragoș Tiselice <[email protected]>"]
 description = "pest's derive macro"
 homepage = "https://pest.rs/"
@@ -34,11 +34,11 @@
 proc-macro = true
 
 [dependencies.pest]
-version = "2.7.6"
+version = "2.7.15"
 default-features = false
 
 [dependencies.pest_generator]
-version = "2.7.6"
+version = "2.7.15"
 default-features = false
 
 [features]
diff --git a/crates/pest_derive/METADATA b/crates/pest_derive/METADATA
index 78f7c1a..2941e3d 100644
--- a/crates/pest_derive/METADATA
+++ b/crates/pest_derive/METADATA
@@ -1,17 +1,17 @@
 name: "pest_derive"
 description: "pest\'s derive macro"
 third_party {
-  version: "2.7.6"
+  version: "2.7.15"
   license_type: NOTICE
   last_upgrade_date {
-    year: 2024
-    month: 2
-    day: 5
+    year: 2025
+    month: 1
+    day: 16
   }
   homepage: "https://crates.io/crates/pest_derive"
   identifier {
     type: "Archive"
-    value: "https://static.crates.io/crates/pest_derive/pest_derive-2.7.6.crate"
-    version: "2.7.6"
+    value: "https://static.crates.io/crates/pest_derive/pest_derive-2.7.15.crate"
+    version: "2.7.15"
   }
 }
diff --git a/crates/pest_derive/src/lib.rs b/crates/pest_derive/src/lib.rs
index a908897..923eda7 100644
--- a/crates/pest_derive/src/lib.rs
+++ b/crates/pest_derive/src/lib.rs
@@ -180,7 +180,7 @@
 //! | `e?`                  | optionally matches `e`                                     |
 //! | `&e`                  | matches `e` without making progress                        |
 //! | `!e`                  | matches if `e` doesn't match without making progress       |
-//! | `PUSH(e)`             | matches `e` and pushes it's captured string down the stack |
+//! | `PUSH(e)`             | matches `e` and pushes its captured string down the stack  |
 //!
 //! where `e`, `e1`, and `e2` are expressions.
 //!
@@ -191,7 +191,7 @@
 //! // input: ab_bb_b
 //!
 //! identifier = @{ "a" ~ ("b"|"_")* ~ "b" }
-//! // matches:      a     b_bb_b       nothing -> error!      
+//! // matches:      a     b_bb_b       nothing -> error!
 //!
 //! identifier = @{ "a" ~ ("_"* ~ "b")* }
 //! // matches:      a     b, _bb, _b   in three repetitions
diff --git a/crates/pest_derive/tests/implicit.rs b/crates/pest_derive/tests/implicit.rs
index 48c8802..20dda84 100644
--- a/crates/pest_derive/tests/implicit.rs
+++ b/crates/pest_derive/tests/implicit.rs
@@ -35,3 +35,12 @@
     assert_eq!(pairs.clone().find_tagged("one_comp").count(), 2);
     assert_eq!(pairs.find_tagged("one_array").count(), 2);
 }
+
+#[test]
+#[cfg(feature = "grammar-extras")]
+fn test_implicit_whitespace_multitag() {
+    let successful_parse = TestImplicitParser::parse(Rule::program, "a a a");
+    assert!(successful_parse.is_ok());
+    let pairs = successful_parse.unwrap();
+    assert_eq!(pairs.clone().find_tagged("tail").count(), 2);
+}
diff --git a/crates/pest_derive/tests/opt.pest b/crates/pest_derive/tests/opt.pest
new file mode 100644
index 0000000..b5ff466
--- /dev/null
+++ b/crates/pest_derive/tests/opt.pest
@@ -0,0 +1,8 @@
+expr = {
+  SOI ~
+  #prefix=(STAR)? ~ #suffix=DOT?
+  ~ EOI
+}
+
+STAR={"*"}
+DOT={"."}
diff --git a/crates/pest_derive/tests/opt.rs b/crates/pest_derive/tests/opt.rs
new file mode 100644
index 0000000..5c07f84
--- /dev/null
+++ b/crates/pest_derive/tests/opt.rs
@@ -0,0 +1,42 @@
+// Licensed under the Apache License, Version 2.0
+// <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT
+// license <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. All files in the project carrying such notice may not be copied,
+// modified, or distributed except according to those terms.
+
+#![cfg_attr(not(feature = "std"), no_std)]
+extern crate alloc;
+extern crate pest;
+extern crate pest_derive;
+
+#[cfg(feature = "grammar-extras")]
+use pest::Parser;
+use pest_derive::Parser;
+
+#[derive(Parser)]
+#[grammar = "../tests/opt.pest"]
+struct TestOptParser;
+
+#[test]
+#[cfg(feature = "grammar-extras")]
+fn test_opt_tag() {
+    let successful_parse = TestOptParser::parse(Rule::expr, "*");
+    assert!(successful_parse.is_ok());
+    let pairs = successful_parse.unwrap();
+    assert!(pairs.find_first_tagged("prefix").is_some());
+    assert!(pairs.find_first_tagged("suffix").is_none());
+
+    // Test with no STAR or DOT
+    let parse_no_components = TestOptParser::parse(Rule::expr, "");
+    assert!(parse_no_components.is_ok());
+    let pairs_no_components = parse_no_components.unwrap();
+    assert!(pairs_no_components.find_first_tagged("prefix").is_none());
+    assert!(pairs_no_components.find_first_tagged("suffix").is_none());
+
+    // Test with only DOT
+    let parse_only_dot = TestOptParser::parse(Rule::expr, ".");
+    assert!(parse_only_dot.is_ok());
+    let pairs_only_dot = parse_only_dot.unwrap();
+    assert!(pairs_only_dot.find_first_tagged("prefix").is_none());
+    assert!(pairs_only_dot.find_first_tagged("suffix").is_some());
+}
diff --git a/crates/poll_token_derive/.android-checksum.json b/crates/poll_token_derive/.android-checksum.json
index 0949b79..90c8e9b 100644
--- a/crates/poll_token_derive/.android-checksum.json
+++ b/crates/poll_token_derive/.android-checksum.json
@@ -1 +1 @@
-{"package":null,"files":{".cargo-checksum.json":"bfd7e5ed15f2e788cc406bec500857f3d7c0d57bfbfadec50cb3f64ce488cf6b","Android.bp":"ebc8dffd29a827b40ad106969cf97d1be9ea94fe87cab39396c6e569b4ef2f73","Cargo.toml":"a2a97eacec3478e5f132be7d1a4a81c5872dea631572afd44e5db52d58e08610","LICENSE":"712a257bd71f6fbd14becdc9e6758cee2ebd1372d2661ba81182b3e4a9fd2f10","LICENSE-BSD-3-Clause":"712a257bd71f6fbd14becdc9e6758cee2ebd1372d2661ba81182b3e4a9fd2f10","METADATA":"2f25016b1916f6b9794d2d5258b529a09f03f4b42596791fd8b33b42037260cf","MODULE_LICENSE_BSD":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","cargo_embargo.json":"40d35609bf1a3c97edce3547cd7c42bfeb05e3d0e283601a2e181deb40f8c4ee","patches/license.patch":"90a4be2ff81cb8bb0a9ecdd5a968ab0265f985bbc5fde1e74f467b64af009119","poll_token_derive.rs":"90415ba6221357435e89891dc8ea5c37d418453dac6ddbb968ee754ccee4110b","tests.rs":"c8be977114275cec2b0c13b4e349ef27382005ed7eed29526d4ca8f236fa04a9"}}
\ No newline at end of file
+{"package":null,"files":{".cargo-checksum.json":"bfd7e5ed15f2e788cc406bec500857f3d7c0d57bfbfadec50cb3f64ce488cf6b","Android.bp":"ebc8dffd29a827b40ad106969cf97d1be9ea94fe87cab39396c6e569b4ef2f73","Cargo.toml":"a2a97eacec3478e5f132be7d1a4a81c5872dea631572afd44e5db52d58e08610","LICENSE":"712a257bd71f6fbd14becdc9e6758cee2ebd1372d2661ba81182b3e4a9fd2f10","LICENSE-BSD-3-Clause":"712a257bd71f6fbd14becdc9e6758cee2ebd1372d2661ba81182b3e4a9fd2f10","METADATA":"2f25016b1916f6b9794d2d5258b529a09f03f4b42596791fd8b33b42037260cf","MODULE_LICENSE_BSD":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","TEST_MAPPING":"ae9f901a99933ef2216ae116c57b3039c24f254ab655e45d7e50bf8d917d6089","cargo_embargo.json":"40d35609bf1a3c97edce3547cd7c42bfeb05e3d0e283601a2e181deb40f8c4ee","patches/license.patch":"90a4be2ff81cb8bb0a9ecdd5a968ab0265f985bbc5fde1e74f467b64af009119","poll_token_derive.rs":"90415ba6221357435e89891dc8ea5c37d418453dac6ddbb968ee754ccee4110b","tests.rs":"c8be977114275cec2b0c13b4e349ef27382005ed7eed29526d4ca8f236fa04a9"}}
\ No newline at end of file
diff --git a/crates/poll_token_derive/TEST_MAPPING b/crates/poll_token_derive/TEST_MAPPING
new file mode 100644
index 0000000..54979c3
--- /dev/null
+++ b/crates/poll_token_derive/TEST_MAPPING
@@ -0,0 +1,7 @@
+{
+  "postsubmit": [
+    {
+      "name": "poll_token_derive_test_poll_token_derive"
+    }
+  ]
+}
diff --git a/crates/protobuf-codegen/.android-checksum.json b/crates/protobuf-codegen/.android-checksum.json
index 0cb7499..7321fec 100644
--- a/crates/protobuf-codegen/.android-checksum.json
+++ b/crates/protobuf-codegen/.android-checksum.json
@@ -1 +1 @@
-{"package":null,"files":{".cargo-checksum.json":"276c172ff70be67ed9bf519621926a3783415a6fc89f4c7a83096d29b268e484","Android.bp":"e3da9c978ee5ff5b1ff1a005c290e0393179b0933c23d361403bbc593d7fba38","Cargo.lock":"f3e04b8af51189500fe066ca755e8828907651c06375c947480b4979f8fa036a","Cargo.toml":"c018a78a9746994908e5a40c019a62ee9f57e9eb15fcd085401e067ba4fa5b62","LICENSE":"da400930f43f095d66c5cb544996390738c3975ca660da460f257a0110f7300f","LICENSE.txt":"da400930f43f095d66c5cb544996390738c3975ca660da460f257a0110f7300f","METADATA":"93fc20c5e36a58eead6f98dcd82462d607acf7178c82208b59a66f7fdb51d42f","MODULE_LICENSE_MIT":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","NOTICE":"da400930f43f095d66c5cb544996390738c3975ca660da460f257a0110f7300f","README.md":"723be1af3b28f74efe6af5ecadd7c1168ee580a876569500c33499d8c59c14bd","cargo_embargo.json":"3f0b86247bdb5700134414c7f987272b0ef54320190137f7c3a49dc5209a3a84","src/bin/protoc-gen-rust.rs":"545ecb65dec23a52897e4ebe72667f95fb72b59bf18bc18c19e5e3727806b4e3","src/codegen/mod.rs":"2a6be0784c47c090d16d5bc2c476a0a395c5dbd9d15ad1cedbab2f09f8f5fcc7","src/compiler_plugin.rs":"c16e5a28e41bb5196a268abce98aa8e9f65625b0805bbaaecbd5d8ff8e96794e","src/customize/ctx.rs":"aa52fdc2286bb500f6646478471a5f5d79e0118129ae6006462cbd769539f20e","src/customize/mod.rs":"6affe70adf714f1a5d8038c6dcfbf05ca4f5170656faf84f4510da8643bf6a8a","src/customize/rustproto_proto.rs":"3f8108bc8ed01a903ccb67ba28fee70b7dbbaab42ada0a058ffd9a3cf3ef9c85","src/gen/all.rs":"fe7c7c6010765fffc9e81435391f933bcead64ed16f737ba168a8c52829e23be","src/gen/code_writer.rs":"84a76d602cfe0269d8dd23d2bfde524c546570f8468fb22ecdd0a86682144181","src/gen/descriptor.rs":"845f017d7f66b01a179b8f92e64cb739a58424e87b59a2683b22ac72140396de","src/gen/enums.rs":"91327ab53dda33fe11c15191e10eb9ad703b4b0ced86508f4d8c9fccef15fc54","src/gen/extensions.rs":"7df4021f6e15fa8cb1b11982b714bc794b13c872ba56a4b397bfa1a7a6fe44ce","src/gen/field/accessor.rs":"d50b42b8b8aab638a65a702e56f9d2ed412cf7199f41265735ab3e2355a5daef","src/gen/field/elem.rs":"aef55e3efb700ba50880ab4689b0bc2a36e92165fd60d29b153d20147aa3cb71","src/gen/field/mod.rs":"05a63cd0007836cf4e0de78413a8fd37e5b08fe4b6ccede846966ebbfc4c4430","src/gen/field/option_kind.rs":"be9021c6d3b6ec1f3cef187c300dd9976a26b3996faf2d04ea660676ac7bc525","src/gen/field/repeated.rs":"bc8fb36e5aed38d8bb27a2348c448145c441db67fff5385bbb645fcad830096d","src/gen/field/singular.rs":"aaa79e6ef50e2a3086777b996c4433087d64913eb1e64fea1948d92b5953e3b1","src/gen/field/tag.rs":"4e8b6633ab8f4d7824773154a1e8093a0bb8565279d596e4cffd7228eff61e23","src/gen/field/type_ext.rs":"d0cf98c155dd7bc54fd3382eb14d9eca13f3ef47038341a0e2bdbe4c68a2ba16","src/gen/file.rs":"c6b5507445f22e0005d38b0e61f5e70147f42dc7080b87b25326bb0e99864ecd","src/gen/file_and_mod.rs":"f4c715e868ec185c4d78b4902599e28a4f50edb28a42871696e2455e8e858c47","src/gen/file_descriptor.rs":"64699dc7e30d3416d450bb97e669db074f48b77187a8c0b621b7c4b517146340","src/gen/inside.rs":"766d68ae4ef1be207adc1f93d00692f2bd3a344204cae659671989f11d39056a","src/gen/map.rs":"889db9fbeeb160ef68dba567e9d930ed7b926d8735021e6d0ac0bd885d590f6b","src/gen/message.rs":"5827ef9a2452d051a7015722eedcb7058696307538566003a83ede40089a9783","src/gen/mod.rs":"ad365cb5ca4e83e108c32df47dcc8afad999c9e4048d31b9c872533983332ad5","src/gen/mod_rs.rs":"3926a6a3fb704c8d659c19358fced286456f10f9b7c09aef4b9d60a7ea5823f5","src/gen/oneof.rs":"c287dc63e1f214456a3722965c80522d2d30b1309efe1e6c9d3b8f77bdc68901","src/gen/paths.rs":"ea7cac2b6cac555a768ff44a35a3eb3cb4227124b2f84db17e0bd6cae98e322d","src/gen/protoc_insertion_point.rs":"eada56479e964dd48a33f2aec21450ab9f9e78ac35930d7fcc3526ba300ce1ed","src/gen/rust/component.rs":"1e4253378cd9819733df85b6e57fd55c8939fff4bd806af9060f688aa4fc39b3","src/gen/rust/ident.rs":"4b5eafd4428e119932968c620e2d1a18a868b640ca533418f1c0125be0162510","src/gen/rust/ident_with_path.rs":"0cb4eec8bd49a1d74e494cf51f4ff1fbe9ee58af844d83e825d05bf82e2d1c57","src/gen/rust/keywords.rs":"c71c1aed8852a35cd5ace27c65111f29761fe82d36b0d146cf9647c223c948c4","src/gen/rust/mod.rs":"6318f990fccf79ddfe03ad0c1268c98271ca90afaf4290a89a304e029e82135e","src/gen/rust/path.rs":"f479d5d11a6cee9a23a3cd74878112c16e8a3e999430f372e6f26ecd080f987a","src/gen/rust/quote.rs":"31ff75975e59c372cc389b0c6bea4b442dac09626ae9127b7e1953607d344b38","src/gen/rust/rel_path.rs":"ec91f1419eb011320275879efe1d8741f34eb9d4f8192cfd04f3f2a2dc30572d","src/gen/rust/snippets.rs":"7c71ce35ed5ac589af52f76297b481319f1426ab111336923bb2a031b0f53df6","src/gen/rust_types_values.rs":"22d723b45fc4ff550079c748c3f551c5677f59d41cb5ed4dfb40d6f10616ad93","src/gen/scope.rs":"66d7cf720bd7f47f857d926fcf2e17f3db684e2d5d078735ae5b960d1ab074a2","src/gen/strx.rs":"2ce719299d4f18f85603896f4978be054b7da3c2806771821caa19068b89c64b","src/gen/well_known_types.rs":"bbc30c2bf6eb67cc3917642dfcd71c53ba3ad46e84f6d03ba2de56ac60bdab97","src/gen_and_write.rs":"3860228dfc2150c0c2c84254af6ce0d866215576f8e503f32f320884cea4fdb7","src/lib.rs":"48fa5c44c277a2b4a06aa262d8a35dccf7ceb0fe42aa25b826596f7e14319b76","src/protoc_gen_rust.rs":"53ab8f0717582832900e60151c1c6a04efb481870de751af285062c7d0478b17"}}
\ No newline at end of file
+{"package":null,"files":{".cargo-checksum.json":"276c172ff70be67ed9bf519621926a3783415a6fc89f4c7a83096d29b268e484","Android.bp":"e3da9c978ee5ff5b1ff1a005c290e0393179b0933c23d361403bbc593d7fba38","Cargo.lock":"f3e04b8af51189500fe066ca755e8828907651c06375c947480b4979f8fa036a","Cargo.toml":"c018a78a9746994908e5a40c019a62ee9f57e9eb15fcd085401e067ba4fa5b62","LICENSE":"da400930f43f095d66c5cb544996390738c3975ca660da460f257a0110f7300f","LICENSE.txt":"da400930f43f095d66c5cb544996390738c3975ca660da460f257a0110f7300f","METADATA":"93fc20c5e36a58eead6f98dcd82462d607acf7178c82208b59a66f7fdb51d42f","MODULE_LICENSE_MIT":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","NOTICE":"da400930f43f095d66c5cb544996390738c3975ca660da460f257a0110f7300f","README.md":"723be1af3b28f74efe6af5ecadd7c1168ee580a876569500c33499d8c59c14bd","TEST_MAPPING":"08ee59c9179481b1baf486d63817526f90792ddf0cf5b776a8f3d7874dfb8009","cargo_embargo.json":"3f0b86247bdb5700134414c7f987272b0ef54320190137f7c3a49dc5209a3a84","src/bin/protoc-gen-rust.rs":"545ecb65dec23a52897e4ebe72667f95fb72b59bf18bc18c19e5e3727806b4e3","src/codegen/mod.rs":"2a6be0784c47c090d16d5bc2c476a0a395c5dbd9d15ad1cedbab2f09f8f5fcc7","src/compiler_plugin.rs":"c16e5a28e41bb5196a268abce98aa8e9f65625b0805bbaaecbd5d8ff8e96794e","src/customize/ctx.rs":"aa52fdc2286bb500f6646478471a5f5d79e0118129ae6006462cbd769539f20e","src/customize/mod.rs":"6affe70adf714f1a5d8038c6dcfbf05ca4f5170656faf84f4510da8643bf6a8a","src/customize/rustproto_proto.rs":"3f8108bc8ed01a903ccb67ba28fee70b7dbbaab42ada0a058ffd9a3cf3ef9c85","src/gen/all.rs":"fe7c7c6010765fffc9e81435391f933bcead64ed16f737ba168a8c52829e23be","src/gen/code_writer.rs":"84a76d602cfe0269d8dd23d2bfde524c546570f8468fb22ecdd0a86682144181","src/gen/descriptor.rs":"845f017d7f66b01a179b8f92e64cb739a58424e87b59a2683b22ac72140396de","src/gen/enums.rs":"91327ab53dda33fe11c15191e10eb9ad703b4b0ced86508f4d8c9fccef15fc54","src/gen/extensions.rs":"7df4021f6e15fa8cb1b11982b714bc794b13c872ba56a4b397bfa1a7a6fe44ce","src/gen/field/accessor.rs":"d50b42b8b8aab638a65a702e56f9d2ed412cf7199f41265735ab3e2355a5daef","src/gen/field/elem.rs":"aef55e3efb700ba50880ab4689b0bc2a36e92165fd60d29b153d20147aa3cb71","src/gen/field/mod.rs":"05a63cd0007836cf4e0de78413a8fd37e5b08fe4b6ccede846966ebbfc4c4430","src/gen/field/option_kind.rs":"be9021c6d3b6ec1f3cef187c300dd9976a26b3996faf2d04ea660676ac7bc525","src/gen/field/repeated.rs":"bc8fb36e5aed38d8bb27a2348c448145c441db67fff5385bbb645fcad830096d","src/gen/field/singular.rs":"aaa79e6ef50e2a3086777b996c4433087d64913eb1e64fea1948d92b5953e3b1","src/gen/field/tag.rs":"4e8b6633ab8f4d7824773154a1e8093a0bb8565279d596e4cffd7228eff61e23","src/gen/field/type_ext.rs":"d0cf98c155dd7bc54fd3382eb14d9eca13f3ef47038341a0e2bdbe4c68a2ba16","src/gen/file.rs":"c6b5507445f22e0005d38b0e61f5e70147f42dc7080b87b25326bb0e99864ecd","src/gen/file_and_mod.rs":"f4c715e868ec185c4d78b4902599e28a4f50edb28a42871696e2455e8e858c47","src/gen/file_descriptor.rs":"64699dc7e30d3416d450bb97e669db074f48b77187a8c0b621b7c4b517146340","src/gen/inside.rs":"766d68ae4ef1be207adc1f93d00692f2bd3a344204cae659671989f11d39056a","src/gen/map.rs":"889db9fbeeb160ef68dba567e9d930ed7b926d8735021e6d0ac0bd885d590f6b","src/gen/message.rs":"5827ef9a2452d051a7015722eedcb7058696307538566003a83ede40089a9783","src/gen/mod.rs":"ad365cb5ca4e83e108c32df47dcc8afad999c9e4048d31b9c872533983332ad5","src/gen/mod_rs.rs":"3926a6a3fb704c8d659c19358fced286456f10f9b7c09aef4b9d60a7ea5823f5","src/gen/oneof.rs":"c287dc63e1f214456a3722965c80522d2d30b1309efe1e6c9d3b8f77bdc68901","src/gen/paths.rs":"ea7cac2b6cac555a768ff44a35a3eb3cb4227124b2f84db17e0bd6cae98e322d","src/gen/protoc_insertion_point.rs":"eada56479e964dd48a33f2aec21450ab9f9e78ac35930d7fcc3526ba300ce1ed","src/gen/rust/component.rs":"1e4253378cd9819733df85b6e57fd55c8939fff4bd806af9060f688aa4fc39b3","src/gen/rust/ident.rs":"4b5eafd4428e119932968c620e2d1a18a868b640ca533418f1c0125be0162510","src/gen/rust/ident_with_path.rs":"0cb4eec8bd49a1d74e494cf51f4ff1fbe9ee58af844d83e825d05bf82e2d1c57","src/gen/rust/keywords.rs":"c71c1aed8852a35cd5ace27c65111f29761fe82d36b0d146cf9647c223c948c4","src/gen/rust/mod.rs":"6318f990fccf79ddfe03ad0c1268c98271ca90afaf4290a89a304e029e82135e","src/gen/rust/path.rs":"f479d5d11a6cee9a23a3cd74878112c16e8a3e999430f372e6f26ecd080f987a","src/gen/rust/quote.rs":"31ff75975e59c372cc389b0c6bea4b442dac09626ae9127b7e1953607d344b38","src/gen/rust/rel_path.rs":"ec91f1419eb011320275879efe1d8741f34eb9d4f8192cfd04f3f2a2dc30572d","src/gen/rust/snippets.rs":"7c71ce35ed5ac589af52f76297b481319f1426ab111336923bb2a031b0f53df6","src/gen/rust_types_values.rs":"22d723b45fc4ff550079c748c3f551c5677f59d41cb5ed4dfb40d6f10616ad93","src/gen/scope.rs":"66d7cf720bd7f47f857d926fcf2e17f3db684e2d5d078735ae5b960d1ab074a2","src/gen/strx.rs":"2ce719299d4f18f85603896f4978be054b7da3c2806771821caa19068b89c64b","src/gen/well_known_types.rs":"bbc30c2bf6eb67cc3917642dfcd71c53ba3ad46e84f6d03ba2de56ac60bdab97","src/gen_and_write.rs":"3860228dfc2150c0c2c84254af6ce0d866215576f8e503f32f320884cea4fdb7","src/lib.rs":"48fa5c44c277a2b4a06aa262d8a35dccf7ceb0fe42aa25b826596f7e14319b76","src/protoc_gen_rust.rs":"53ab8f0717582832900e60151c1c6a04efb481870de751af285062c7d0478b17"}}
\ No newline at end of file
diff --git a/crates/protobuf-codegen/TEST_MAPPING b/crates/protobuf-codegen/TEST_MAPPING
new file mode 100644
index 0000000..3195c27
--- /dev/null
+++ b/crates/protobuf-codegen/TEST_MAPPING
@@ -0,0 +1,7 @@
+{
+  "postsubmit": [
+    {
+      "name": "protobuf-codegen_test_src_lib"
+    }
+  ]
+}
diff --git a/crates/ring/.android-checksum.json b/crates/ring/.android-checksum.json
index 7fd8fcb..b6bc65b 100644
--- a/crates/ring/.android-checksum.json
+++ b/crates/ring/.android-checksum.json
@@ -1 +1 @@
-{"package":null,"files":{".cargo-checksum.json":"556d4a0ea242d61233a71371e326d560257064bbd6e66ee99bdc8ec029a3716c","Android.bp":"1bd0d0b60509b9b15c620db743b0215423380b381fc7e0bc6f009cdb201592e3","Cargo.toml":"85ba4c286c6e7fe20ce8fce527525f5896d161b1e12ced6aa59f9c3c5bdc6f1c","LICENSE":"0f0dcea25e2fdc3205bf134653c985d62dfdb433b3ed6bb2d8c9d8b87ac32f2d","METADATA":"e7cd5149d758002ec266ab19638360130bcf4d4df211c80edf9cc126eb65c7f8","MODULE_LICENSE_BSD_LIKE":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","TEST_MAPPING":"e903c9a1697f6935709eb6516d3cfbe77acfa875c8eff2dd8e8715a3c50b1bc3","benches/aead.rs":"b160f6ebd6a0456255530bd0ce81a80485c7cb66263ff377e9ecbfc45174882a","benches/x25519.rs":"79f179b3dd53b29697d084633fc8d0dc764bd0e214a02d1ad4f1bab01f6dc4d8","build.rs":"e8818df7edbaac861b24e55d073c2786faafb7dbafdd8ae011ae8f0e016190ee","cargo2android_cc.bp":"db5129d0f397381b98b26c2b36cca105cc2f750bc96f8f0540d08d0936848c5a","cargo_embargo.json":"651dc8b3403a5064a95bed223e2809257f925fa0ecb26c96cda50d85ee847d71","crypto/chacha/asm/chacha-armv4.pl":"ec8c60839dd40e0546a4e0ee009b10e303a4610b86dea95321ea5a81e382cc48","crypto/chacha/asm/chacha-armv8.pl":"8825e9bd25ba295b219178c602ae2d75d3dd450149b90729f6b49adaf9a027db","crypto/chacha/asm/chacha-x86.pl":"b02715d86e1efb72aefc606fc09ff5a028601050a30210a3bd83c578bfa775fd","crypto/chacha/asm/chacha-x86_64.pl":"369f2ab053d541e2a76b55167d64e092383a29659180674288717c4c358ac11f","crypto/cipher_extra/asm/chacha20_poly1305_armv8.pl":"df837dae96755534a72556a5559a989aa546a01764a87003e59a789eea62993a","crypto/cipher_extra/asm/chacha20_poly1305_x86_64.pl":"edbf724e0340ed0f52ad145523f3234d62302696b55d17833d264e6689930f07","crypto/constant_time_test.c":"34fa42c020d6a574cb1e5d2499fe7707dafc70d677e14afc2e47c6ec86998a07","crypto/cpu_intel.c":"fc4773b35d83790ec977be5c87feb3a323cb059afd6821c5d747c1f2a2bb0704","crypto/crypto.c":"88aa24082eaa926d7db7a1335f207a969d57bfa88e5a19ed1538ca84f611bb8d","crypto/curve25519/asm/x25519-asm-arm.S":"4a0d74105f936f1a4fb2e369e41db729a3083232f95328eeee6503b02673967c","crypto/curve25519/curve25519.c":"a3fdd7f7d28cf99e43d064d196e0ad23e2fa530fd92cb7707cfd54fab14fed07","crypto/curve25519/curve25519_64_adx.c":"8df1a750fd4506dda734420f039428f3f1b58d1133a81d5ad2d265fd3832a740","crypto/curve25519/curve25519_tables.h":"86b90bb968715f3173f1c86785657721e41c421d796f634a0cc042a717b722b9","crypto/curve25519/internal.h":"ced830d9222e25864ad818102f10eb8164b736f268d36ae6dd9c9d54f82ddebb","crypto/fipsmodule/aes/aes_nohw.c":"3180b1092e87c9d311a333f8668db25458f4494f449341b96abe0bef2ea834d4","crypto/fipsmodule/aes/asm/aesni-x86.pl":"843c5eb1752e8f9012025a52abeb5fb67950de3eb8836f4cc379225440501fec","crypto/fipsmodule/aes/asm/aesni-x86_64.pl":"20bb46a12ffdd95752d8a773c61a7ee0e4ca5c6267f5e941772c845b5f80a30b","crypto/fipsmodule/aes/asm/aesv8-armx.pl":"635a342bf209f7e443b60bc3c3a0480e85ffa00cdcfe55eef6b081c49c7d97c2","crypto/fipsmodule/aes/asm/bsaes-armv7.pl":"b111660c44c1d63add4311996c54da2088f5ab4c0960783c3b07a3018a4f9b61","crypto/fipsmodule/aes/asm/vpaes-x86.pl":"838eb8f8aa4941be28014e4c8e8c018aa7408b133ebdf756185d5f6b1c39cff0","crypto/fipsmodule/aes/asm/vpaes-x86_64.pl":"5b2cfcfb2b75294af08617e19eb60f0ff5fb4da318d90329d0a3d7dcc3f02985","crypto/fipsmodule/bn/asm/armv4-mont.pl":"23819df941448355161f7eccaaa576016d90751ccab12e6f11f9b07787903b4c","crypto/fipsmodule/bn/asm/armv8-mont.pl":"203e7f3fef3818bd4b9dc89a95ff45ff6df8640b8a42cceacbd08a473fcb251f","crypto/fipsmodule/bn/asm/x86-mont.pl":"fea72ab2e2e617e14d72fe1f84f7b5605aeebcfce79a07cb48159cb13fb83b94","crypto/fipsmodule/bn/asm/x86_64-mont.pl":"f8ad9237d0fad2797ed2dbebde0664ea3746d7eb761225bc0d8a148595b837f0","crypto/fipsmodule/bn/asm/x86_64-mont5.pl":"2b2a2aed0a106a1ab0b2cc91085357060f845814856425f2a1060c880389ad82","crypto/fipsmodule/bn/internal.h":"a331dc121feb04bfe207c05d0379094d16c5deb8376ab3702440219f54d15b02","crypto/fipsmodule/bn/montgomery.c":"d65afb255601a66eb67cf871fd864f714b1bb7f3e8bde0440f12d5a77e3d13bb","crypto/fipsmodule/bn/montgomery_inv.c":"a138c2ac2b3b93dc18224123fab1f476455c722add5acd336a782892069b1664","crypto/fipsmodule/bn/test/mod_exp_tests.txt":"d876130e6a37973a284ab740e2f198ab3864a7a7e5f7881677f6ee94bbf2b26a","crypto/fipsmodule/bn/test/mod_mul_tests.txt":"dbf727c4e7b5da79f3a9b9135099f11f2014d47884232f8fbb6f47bee8f4b716","crypto/fipsmodule/ec/asm/p256-armv8-asm.pl":"cf6fd3a011f85f9a4f4eae98d406f86c2d1440169b5891622068a5487032468e","crypto/fipsmodule/ec/asm/p256-x86_64-asm.pl":"45c4665446168415b09b1ed8aeeaecf81b23bd6040ef81079c5655b1aae1a064","crypto/fipsmodule/ec/ecp_nistz.c":"1d30b37bce5cfc8054dc7718dc2f1591b67158dc787c13f376fce85c8b0ac8f1","crypto/fipsmodule/ec/ecp_nistz.h":"b2ef637a56b87ff23273cc5638dd00a51413b867334189df36bff2df76af8b4f","crypto/fipsmodule/ec/ecp_nistz384.h":"8724db26c36812ebd2689614ad1cfd7208d6b5abcad8e1e6470ef48482efd428","crypto/fipsmodule/ec/ecp_nistz384.inl":"fcf50ba2d504b59f376e4cdc98526c25600c9ce441bb8def3524449202ece928","crypto/fipsmodule/ec/gfp_p256.c":"5bbffc7974552ec965862926a650788e879c4ec6361ee56ec6f9ea762b7e063f","crypto/fipsmodule/ec/gfp_p384.c":"d55c6422144b46c6fe7f536efc17b3f11fbba0e7123fc1f811e0232cc37b6700","crypto/fipsmodule/ec/p256-nistz-table.h":"313d89622b5defa34beac337b26086b72167747f5d9ac04b510546af83f44da2","crypto/fipsmodule/ec/p256-nistz.c":"986973cb3c7cfaf2bef9d74556e4cae4a8189ee9125f95c066e42123cbf42170","crypto/fipsmodule/ec/p256-nistz.h":"b1aa76a620cb88973af39d90dc671a531ab90a1d097c4889ec3536d9f6c4a1b8","crypto/fipsmodule/ec/p256.c":"10fc6d71a306efbd1943668e09a2d1107ecf58bbd351e1b3c3a9c6395cc91883","crypto/fipsmodule/ec/p256_shared.h":"3f4510671d24c14617b938c0eb012df79a964c68b7f7f4d7975b387cc256dcc6","crypto/fipsmodule/ec/p256_table.h":"37b938c6c6d3691bb21c08ed58dbda078a3558276a7d6cb9ab0a304474a3e232","crypto/fipsmodule/ec/util.h":"b6da0632b3d5e910246499aa0a72270501c52947597b5b987e02a59e6b44e4b2","crypto/fipsmodule/ecdsa/ecdsa_verify_tests.txt":"94381622232d288c9f4817f480b98919ea79848f6cefc2a98f8987a06026a538","crypto/fipsmodule/modes/asm/aesni-gcm-x86_64.pl":"b360bd8d4e9fc9f2b6656432199bafaa6154b717597fd2009eac58c751f7aeb8","crypto/fipsmodule/modes/asm/ghash-armv4.pl":"53f1334bcdac4d9b16b8c81d491b37740e14e187c58a41098600936aa5708572","crypto/fipsmodule/modes/asm/ghash-x86.pl":"0caaff63fbd074e9fdeb51a4017d0215311ef3b855a9124a604b36904ae38272","crypto/fipsmodule/modes/asm/ghash-x86_64.pl":"f1170e7bddf44b235ab69cef226cf9de992cac083c47c897c2157e918bae2c4a","crypto/fipsmodule/modes/asm/ghashv8-armx.pl":"b38d7fbdef9cd8314671862d0fe902e89784085fd5aac2705a1cd1395e86d0ea","crypto/fipsmodule/sha/asm/sha256-armv4.pl":"9ab2f7d1789c98c19f26a508d70d25a92a4230d6c3808eac07ffdb851eaa5b80","crypto/fipsmodule/sha/asm/sha512-armv4.pl":"71744360e0434f49335fb0a957887673d6e6ffdcf21d5245218e8ef9dc932b3b","crypto/fipsmodule/sha/asm/sha512-armv8.pl":"871a17be8afdc737c9ea18b96b43c2bbb9113de702ebcd79cc7d6dcb6be4ce7e","crypto/fipsmodule/sha/asm/sha512-x86_64.pl":"a79ebd54ee0aa02c32fc6e0fd884dacd32c3c66984303a9c4f67cde425d30070","crypto/internal.h":"997e82d00495eb2c6592b6c83784aa41e39426d9e6a33681d127ddef15802095","crypto/limbs/limbs.c":"f68080803e3f80d512c942787aabedbcf007b07e8bb1fa74cfd80e035eb087a1","crypto/limbs/limbs.h":"9d943fc9a83e58b736ea7a9cde0fea7ddeeb7b0a32619f7de018fa1f8e19b65d","crypto/limbs/limbs.inl":"29011066407f556d729738bd65ad02eefe45fd8fa36cc0b0e1375328cec09bd4","crypto/mem.c":"3ca6c0eea9658b12789c3c62d67720cd92078e83ff8d9dab6ee78cfda89df9ec","crypto/perlasm/arm-xlate.pl":"195a6d6cda7f37a5687b51ed7bf00d2d865d67ae1b7f01f4f7e8aea4a9709e01","crypto/perlasm/x86_64-xlate.pl":"83e9e89291c8ac1acbae2e3f14b64cdeb1f887c0d0135fb83b122b777cbd68c3","crypto/perlasm/x86asm.pl":"4aa8362188051f5eb42f1baf3261b5d5a349c0d7784f67b8480a49e942e29aca","crypto/perlasm/x86gas.pl":"c8d3ab9789f1f9db3ad64b630130833a03ce9b943430f7e48a43b24a04a7a35e","crypto/perlasm/x86nasm.pl":"da3209465a0539e0df617137967587f13192f52b3771eaafc7657e3c0d3b993c","crypto/poly1305/internal.h":"61bdb51ff2a13bc101b37e9f94ebd94b2827eb29e5434581f01c7a3e66d6e67f","crypto/poly1305/poly1305.c":"cd9e2dc0d4178a9908bfac003c0a9ad9a6f5f5e0b1db62bb50f6bac866ea76b5","crypto/poly1305/poly1305_arm.c":"fcc8370a3dfb8e5195467f2c5c43ad25610b0a9d2edea04ec380d8f06afed03f","crypto/poly1305/poly1305_arm_asm.S":"39d2e02de2b8291bc5e9c49333f07489a0030606d46ea7325df94a21ded8de53","crypto/poly1305/poly1305_vec.c":"2fd88ed4548048802bcf044b90c006710f24ec49735a488906f278bf07db3b0f","include/ring-core/aes.h":"e2dbe3be82dad0e868434d849b74b15fcf1834619337216465f362fda0052355","include/ring-core/arm_arch.h":"221e2131e845943899913f96cc3cf9eef89fb718b4a3a92304081ac7b8221ac0","include/ring-core/asm_base.h":"67bf7a4bc018949c2bce2627ad5d65a4f9aad4bc27fe32aa20f6645bc109d208","include/ring-core/base.h":"3910cadcc7f070680f59ed05e4b321e3ca49cee4f5d125d4e0676078c245d926","include/ring-core/check.h":"88728cf6f5b002d00bf84d79b4ca313a1ec5d59e44a4d4261f6ac1a26459015c","include/ring-core/mem.h":"4b0ddd8be7c6d8f4a43130c3ce6de7c16ca4502e3708088208f5363d3c5b711d","include/ring-core/poly1305.h":"f4fac0335346154c49273019e95c1da8ae6c9c6aaf0762a9dbe9cbe211c7f640","include/ring-core/target.h":"74bfa5c04b73bcf5a05706e1d47bb878455c546846d440eae1932b114325c6d2","include/ring-core/type_check.h":"08c6f03009335f83a3d8a922443ca90daa240f69990ebb2b30df382eaec4f167","patches/Android.bp.patch":"30ac8f0b1bdcaef960bb23132f235668ad3b84b972e0b385c54aa585532c3757","patches/hardcode_prefix.patch":"bb881cbb9fadc3be0f4edba9310be9500c67a02ca8740571530cd7718aa28b74","patches/ring_core_generated.patch":"c082d59343cbdc55e77811751f9114b95adb65a53b543c436cffedde9aaab0be","patches/test-data-files.patch":"0560100f1c9f9640678e0635746cbfd2fcecce83f3cb7b0232f882be95d454be","patches/unused_qualifications.patch":"1879f7b356e2685a97870d31f6ea3edcba436c1f8c4de1b10bd5892101dc42e4","pregenerated/aesni-gcm-x86_64-elf.S":"0a2034fc480bcd1a7e12a3a2f66bf557f1e0da0d52f224824b725d14e0150295","pregenerated/aesni-gcm-x86_64-macosx.S":"662684f3dd4c90b30953d37d21af29d9c498550f53ada733ee8fc0b3107944b4","pregenerated/aesni-gcm-x86_64-nasm.o":"bfe90f531243e1995c049500e9950f664b329b7adeccdd6866faf3bc30f01428","pregenerated/aesni-x86-elf.S":"0f062486e2d4499b26dc913d0a289cc1929d3d7156bd01387c62d008e476d3a8","pregenerated/aesni-x86-win32n.o":"30c214f4ecb1c8dbade05f660e30854c6e847596781672ad014a6d2bd32d0704","pregenerated/aesni-x86_64-elf.S":"fe1ba0e13dfc6f3551ddd376a7808d30ca3004b967fbfffc49bc4dfa7a334836","pregenerated/aesni-x86_64-macosx.S":"ee96626817e4fd9ede882046e65ca78ec93a90c01d8f4dbea01f13f58afd3ca8","pregenerated/aesni-x86_64-nasm.o":"b89e6490c53a6a3d1dc98a2357376d18944fa0ba055becd542c9810a76a61ccf","pregenerated/aesv8-armx-ios64.S":"86e1cee2fc3bdcdcacd942fded0d151dacfe7b9c104db864a269790e6b6446b5","pregenerated/aesv8-armx-linux32.S":"bc7d6dc80a6ddc50681885a72081519fbcbe9e3c181b88f26436510b05de5434","pregenerated/aesv8-armx-linux64.S":"ba64e37856921dcc985898d139de67896603a12602665ed5f09c5c02017d2f24","pregenerated/aesv8-armx-win64.S":"be73ca293be44818c77e4e906530cc96a7b45ba47f6e20d5c081fed75861186c","pregenerated/armv4-mont-linux32.S":"004decc5ea1b8cbfe8cf473e0b831e5a2e64ffac55f9b73789ca5973dbb09e79","pregenerated/armv8-mont-ios64.S":"b534fcf5412cedf2c6ecc8bca392413ee9cc6f3d96579acaff0c018ae6a14bb0","pregenerated/armv8-mont-linux64.S":"09dbcc750995c7e50200ce39a3d4fe9cc60ae91432d4104d4172b08b38f4020e","pregenerated/armv8-mont-win64.S":"446217397c3a9c0c671d3b498b82df9275155c0d19141d097fd15f92ebc93ddc","pregenerated/bsaes-armv7-linux32.S":"111934b6dcc77e10f2efb5568831d141afdf7ef160280895017f2e33ff781ad7","pregenerated/chacha-armv4-linux32.S":"407698dc80304fc54c198f2e102655eb557dc2918a6a263167343f54f8978298","pregenerated/chacha-armv8-ios64.S":"e780c5db3213d31adbc125616bc3fa473eeeb109f8975c7534e064a1c990f10b","pregenerated/chacha-armv8-linux64.S":"3bf78fde62ca427ffdb6f9c05a68e82bd0303dc7829b384dde1ff12d4165e148","pregenerated/chacha-armv8-win64.S":"5df9a896d56011498097ba1e3e4681ec40bb52e8d70c4e347d45c1438fe2a55b","pregenerated/chacha-x86-elf.S":"6db8896d11ab0af9b647544ef78fcf5271ab209cb34a121c93e1aff71442e3e1","pregenerated/chacha-x86-win32n.o":"e0841bc53d677acfc2688c935748a9d9a6c07a1b2ae4ce956d680d8251767a3f","pregenerated/chacha-x86_64-elf.S":"6cb4b3a097548cf7b1e22a05ae6c5428e0a2b864f660613e7b5e7539ded1fbd4","pregenerated/chacha-x86_64-macosx.S":"9faa1d932e3dde5d3120a54447e2c36aa31c5d64f757e2039eb4afc1f4bdba73","pregenerated/chacha-x86_64-nasm.o":"3540c7be5ba1fc3d58d3075dcf95357e4b930ccf19db741716d67cf6cf258303","pregenerated/chacha20_poly1305_armv8-ios64.S":"154d01c6efff12391f94b54993319fbc3df7ccc20d44b967fb37fb603e173684","pregenerated/chacha20_poly1305_armv8-linux64.S":"231e6cb33277be0c2218042346ca227801fea6ac9af8b03c09d43664445fd906","pregenerated/chacha20_poly1305_armv8-win64.S":"0deb47ea82fdefcec4f19c7097ef28e47ebb523f93bb30601cc2b86d91caac26","pregenerated/chacha20_poly1305_x86_64-elf.S":"d6aa65bcae2e7606a887a5775179a656a132d3328be94710cb1957d2c59bc102","pregenerated/chacha20_poly1305_x86_64-macosx.S":"9a3a78a2dee3968fc59747e2172259338ca044f062ce4d293d005ea5e990006d","pregenerated/chacha20_poly1305_x86_64-nasm.o":"e9c909c2d386f013b3d0a20988f4fd4e54ff9691e077fd183b65c979c08c7845","pregenerated/ghash-armv4-linux32.S":"f72d5ed518d56825364d4cc8d0a7b1a0d1feafdc22b4be208a247c0ec5bdb8c7","pregenerated/ghash-neon-armv8-ios64.S":"7990d52acd7ac5820ad504956f66e8efd68780d32beedeadf5013f67ea08ecd2","pregenerated/ghash-neon-armv8-linux64.S":"b84baecefd7f410c1e80af8d50b2cdd2a3710aa99cfb6dba9a0ec5a886b5bf81","pregenerated/ghash-neon-armv8-win64.S":"ea6630da9993f4d04bd0cdbfdc83dcce6557d6d09ab8b0546f035dbd76136f1c","pregenerated/ghash-x86-elf.S":"41bb10b7eb7adc20426b81b6d134b0870ad21795753628434e8d781200041304","pregenerated/ghash-x86-win32n.o":"db1d98a62a796371112c2a49753c35bf86060b9d569b21bf7d079c04f600d953","pregenerated/ghash-x86_64-elf.S":"095d8c47cc8610903a92bc15f9e6ed92aba6253c53ea22d689e1aa7e114ba96a","pregenerated/ghash-x86_64-macosx.S":"3443ee059661b4e7c19bad4cc487beb4da037588c165ad6fb5e21ca60d1777f3","pregenerated/ghash-x86_64-nasm.o":"8b520647268cc569c64fbf581d418137a2a76a6ff97a6277338b1b5539d78fbc","pregenerated/ghashv8-armx-ios64.S":"61ecfc6b33958fd61da895977beb6f6a08155e7d6ff1c498ab1dde7ef62510a2","pregenerated/ghashv8-armx-linux32.S":"948902d7cfe96268391b609fb3f07b95f3268c85ab7a5cc1e59cec3984481f6c","pregenerated/ghashv8-armx-linux64.S":"defdc3306c8a554ccce8ee63054fe6f1f88a8ebb045f85c491f5901ab3316b76","pregenerated/ghashv8-armx-win64.S":"beb39a157b869a50cf6af5cbe7d1a008c4793e6a46d2ec06ee18693a548cdf27","pregenerated/p256-armv8-asm-ios64.S":"ca1e3669a138784e246cb780957135c1502aab8df848804735eb482c10f740d0","pregenerated/p256-armv8-asm-linux64.S":"aa2f157d9337459fad2395c57dd5afe04230d7882d4974c80eefa7648ff9fa69","pregenerated/p256-armv8-asm-win64.S":"66475c0cca3a6e13ce6ec10e296e7f3640d96b7a2a486c5c8e4418a1215b8dee","pregenerated/p256-x86_64-asm-elf.S":"720368a2a6c856ca301326792eac619f668bff053cd09af91f995a96f9bd7f32","pregenerated/p256-x86_64-asm-macosx.S":"c24801a2bea4ba1293ee4769f923ab260c1dfcfc94c9a4cc70b53753cfb8a84d","pregenerated/p256-x86_64-asm-nasm.o":"39ec5a25ee084be38a0affe2a12bee191c254edbb1fe9b4b54590874932c94c3","pregenerated/sha256-armv4-linux32.S":"94ec5939fc8e5531704443975a878b75adb43301b1c45ea5db373059a6957251","pregenerated/sha256-armv8-ios64.S":"f03877b80a77f8f41d096414dfa2f1bbb3686bcf312752d968d559945416e661","pregenerated/sha256-armv8-linux64.S":"59720008497bf51f874b47799d3fc7c69e30deab6b8a1a6880c7214bd5aabb57","pregenerated/sha256-armv8-win64.S":"1c82ed2eab9ab1a533ee4f403de8f4215d33df0609f9ea28a4a1db1eac69ec2c","pregenerated/sha256-x86_64-elf.S":"e720874171489e54f9302a5617e5964cdf616a2b742b8101595fe5fc5d0e4995","pregenerated/sha256-x86_64-macosx.S":"db6351feec7a251607b4457b0124f2a6f8a9b061cd8814e0d8fb37963b2c6db9","pregenerated/sha256-x86_64-nasm.o":"c9393dea455d235399538b62cc8b1975914e15e63adaba2cc10c89d41a89388b","pregenerated/sha512-armv4-linux32.S":"2eed7f4d0c0eb3bcf7cc8e3af84ef7226d8746c66554bce1afa5c908e850c9ad","pregenerated/sha512-armv8-ios64.S":"07a33df3c09494c1522eedff1b84b56215f256425991cc73e3f2228f2e3c929b","pregenerated/sha512-armv8-linux64.S":"cf9c244e5daabec302f72770b95ff0e7196bb126f178a5145a97af79c2d45c57","pregenerated/sha512-armv8-win64.S":"c4f9ee35cf9eb78a6c55c021ca03e7f798b59cff9e3428defa38afa121ceb628","pregenerated/sha512-x86_64-elf.S":"2a23e4dfc497771011e142867b26f89fb51eb390f8d0e17d13cc844406872c2b","pregenerated/sha512-x86_64-macosx.S":"90baecf94f1e59304b509f438b383edab3a3ff6f3d8e3df8917babec9ed1b3e8","pregenerated/sha512-x86_64-nasm.o":"2d497c5e3991afb6b1a7f5bd44db75c0b39ea6dd342d2635d2d41f89fc139350","pregenerated/tmp/aesni-gcm-x86_64-nasm.asm":"69919ea8b12cb1616af08fd066272d5448b03806c2045a25108eebe7c8c0da5b","pregenerated/tmp/aesni-x86-win32n.asm":"43dc9537a28572cd2e8f787ff50aa22b1f21159aeb86f676d8c5bc815280c2b7","pregenerated/tmp/aesni-x86_64-nasm.asm":"0a193a39fbd93a4102887219439f9f073a1d77de70538164047edb029ed47579","pregenerated/tmp/chacha-x86-win32n.asm":"78420b4cc2e61a8c43c51b545fb9eaa5c7f1a12f571a90522875ec4c6d25ca88","pregenerated/tmp/chacha-x86_64-nasm.asm":"9605470406fbe81d49b690543185cca03cddd01bf25e08304ba5c0832ec9ab85","pregenerated/tmp/chacha20_poly1305_x86_64-nasm.asm":"366dc872069cc9f298ddca13c31d9b5c0ace30b2366a359478bcc989cc885991","pregenerated/tmp/ghash-x86-win32n.asm":"e4cafe53e83f3c7a25de591b5e2f91f82daa85aea3d106c154a077f594bb2b22","pregenerated/tmp/ghash-x86_64-nasm.asm":"293ffd2041fa9a686e480eae0c14854de26018cb4969fbf0ecf2612263d8b528","pregenerated/tmp/p256-x86_64-asm-nasm.asm":"d50eb8826e0782e21090c11ded95e3cf02f879bb0c2e3698e2f8e9b8e868b23f","pregenerated/tmp/ring_core_generated/prefix_symbols_asm.h":"a886bb6d29a7088e60d5fbbdebab8a75c39da429d2bab7d234d3a81c660142d1","pregenerated/tmp/ring_core_generated/prefix_symbols_nasm.inc":"e22be2805073f5bd2e4bf7204e03ea4ba581f79d06ccb6445ddfd2cecf79951d","pregenerated/tmp/sha256-x86_64-nasm.asm":"c6a82d9811d83c7d363fa2176c4ec18f7c5dde0dc1ae4324de06397ec9640a71","pregenerated/tmp/sha512-x86_64-nasm.asm":"f3d7354dee875e4b963569a4afa9239083dd1a3ddc40a9594cfb6f00cd072a3a","pregenerated/tmp/vpaes-x86-win32n.asm":"74abc1caf6a1559e1e7c34867b39e222fbb734d90a7f78cf670480b84aec51fc","pregenerated/tmp/vpaes-x86_64-nasm.asm":"cde1f163e144d945d88d7d722802973dc9550dc9c5c0c833d97cfd4814e65a0b","pregenerated/tmp/x86-mont-win32n.asm":"17f7fe749b903ab5eed4341173a4b184eddcc281c1b6dc3ec8653ea58ae3ea77","pregenerated/tmp/x86_64-mont-nasm.asm":"5a7f2b783a9b190001b3c78eeb1a3c9b4cfad3375b2cce34cc53cc93b0273bbc","pregenerated/tmp/x86_64-mont5-nasm.asm":"eb7d714adaab572d151a43d34f6b0c1a5c0c76ecff54ef2ded09dbbfda16db2d","pregenerated/vpaes-armv7-linux32.S":"df7c10eaafaf25ca05a096f0f411e4ed7ff4d6c03e468460eeccf6d7f19b612e","pregenerated/vpaes-armv8-ios64.S":"2b0df3497817e3928ca583f33d593be59c20a7ec6716ce6bf4bd08fe2eb01fd3","pregenerated/vpaes-armv8-linux64.S":"7440b07c5f97283b3ee367cff763cfddb7eb4bb73a9957e1627f8c19bcb5c7f4","pregenerated/vpaes-armv8-win64.S":"751b10e1ff5af08d9bdd8334636c66a6172d8c69125ceb9c18c6d3f36bf5b73e","pregenerated/vpaes-x86-elf.S":"8cae8eb8601fbf51ab9c65ce102c405fe8c34e0007274e492144587df8914b1b","pregenerated/vpaes-x86-win32n.o":"87106b5a0572be64b9e35a98963e7fb07b4bf5884bb5c1c53b50111641c3c52d","pregenerated/vpaes-x86_64-elf.S":"0dad8a208d46cefe3577691e01793522cfe6a864795ead091211eedb6b54fe9e","pregenerated/vpaes-x86_64-macosx.S":"e9abb999570841997580cdf9124f38a01c65d4653c26f1c41cd8a2a7d093b90d","pregenerated/vpaes-x86_64-nasm.o":"e7acb9b2f39dc9d103f4a53298adb95b967662742fdb30bd6601fcbf8e97280c","pregenerated/x86-mont-elf.S":"1fb95d2a8679ee92938f226d03f42396cead7e6223c6e875aa7cc516707bb2e7","pregenerated/x86-mont-win32n.o":"b9ecc95ad20ee7fff84343cd1279864fc738a86586d08f9aa86d51de9266d65c","pregenerated/x86_64-mont-elf.S":"98b547c41f73fdfdfda028b97bc6c53e024f01e1ace0dd08f718467a3d94b0c8","pregenerated/x86_64-mont-macosx.S":"5cf3a09f59a186a70fe630084e9f6e15e3ae1874eb00a03c06bf52cc0f8debad","pregenerated/x86_64-mont-nasm.o":"ae47bc95d086b40e21d5095b32c17e5579b7fd0d201820d34695c5f338d7c922","pregenerated/x86_64-mont5-elf.S":"e21d5bffd6d44874430ac17ff52a97b1d175b938cb677ac7dc4020181fca5749","pregenerated/x86_64-mont5-macosx.S":"9e92c1a5c8a3b4dbb72168a3b884c9dbbab50d4ffc6a6b10fd6db01eae7b5f14","pregenerated/x86_64-mont5-nasm.o":"fa55f92cb2f7496c063ed3bce4789617fb74ce217d5090538556161edad17bba","ring_core_generated/prefix_symbols.h":"25d42499182f38310acfae870f0531c48994e00150fba39f52dbae1537fcbaf6","ring_core_generated/prefix_symbols_asm.h":"46c7f29c240e19460771585c750081c16ffe6f392dccad6b35d0c473b6555dbb","ring_core_generated/prefix_symbols_nasm.inc":"f80d63dfadb79ed30bdf47e8c25bd26d8deb6e5801887c7811ec1c2b7b910c18","src/aead.rs":"e7ab8c5e6f221560bd7cc50503a1ad4061ea2dc5ee66f1aea82ee9a804ac00bf","src/aead/aes.rs":"cdc3dd2e99d22d0a999a2c81f6e9fe131c996584141c55417e0716a61704b58f","src/aead/aes_gcm.rs":"08ed15c3eacab1c06e71c4228f858cdbfb6cc77d48450a5d5d891cdfb7f35664","src/aead/aes_tests.txt":"a74925b842fd8ac5c0e6b65a5b153e7d2292a8b7242d7b7c6c7a83d9ed48182d","src/aead/block.rs":"5c60963432c6d610aa2c298ad5560dc6f3c7a43f5dc5048fbf4b7b0ec9ea9db0","src/aead/chacha.rs":"29de938b4256f0d10097f4a58baaa3f31e9b83e36d8544438eb8e2cfc297f2c4","src/aead/chacha/fallback.rs":"fb4eb78616d4c60bfcdcdad937eefa5c74ac18bbb36121f832ada3529b25b23b","src/aead/chacha20_poly1305.rs":"7a6e565a28bb6b8d174c3a4c08c440a9dc3da55461604f3871e09cae6d51bf84","src/aead/chacha20_poly1305_openssh.rs":"0c52e7b84a6079c5433b3783161d264e1327b858ec5eae51dec163c09427f8ea","src/aead/chacha_tests.txt":"c862c7e46a7c8fd1a9cf3959f6dd5202fbd63b8eea5744ea49ae29b0b8654ea8","src/aead/gcm.rs":"3e32c28889e5cdf22f5234ebc738213d5e98735ccf90217a74ba742eec4e6ba3","src/aead/gcm/gcm_nohw.rs":"8e1e495520d8f95a9ca2a711ba83404d06d2035f76bc96604da066195100ce00","src/aead/less_safe_key.rs":"493cd41ed33c78a67f00d03c3bb520d80f23e8b912f63a7dd8b74a21db28fd0f","src/aead/nonce.rs":"c02c9fe8e9821cf7355207f22e2d0b37993435ff41afd3def709970d256cfb36","src/aead/opening_key.rs":"94f8a639af80f20f1c6e719d880dffdd03ee4c146b27be10f37299646fad0a64","src/aead/poly1305.rs":"984f0cb6b3386c0f809b34c1f4fd295dccec20edc572eb1a16de60030c526219","src/aead/poly1305_test.txt":"9b2738c12bc3710e72c1e8f54b3cebc752adf795d8745e953a11e4e93850faae","src/aead/quic.rs":"911db775b518beeef83d5b883c099fb4c0c25394e71654d2cb8f96bb889c755c","src/aead/sealing_key.rs":"0e3207d79ce6e50f11e4d46b8bc50885f29cb08cf6732d87f998398b8b99f74d","src/aead/shift.rs":"83250b7552ec80e744c011e84ab9ce85f3a1fd6c7237852445b5bf6ee74b9f35","src/aead/unbound_key.rs":"57b67b77852b05c835394d259134f93c5a7de1ca207f0a05f57ee43cf1abc8da","src/agreement.rs":"d30a6f0e30ed8a954ccec39e50185d61f1b15cb0a337e7ad0dd19d8d2c8b1f36","src/arithmetic.rs":"28013a244c4d714b1890e02f544f8ce8710ebabafe5165bb1e2afac710f19230","src/arithmetic/bigint.rs":"d34aa503d229f0e6a0997c8a35954fa277428a2e32c4b33ac7be4657934db055","src/arithmetic/bigint/boxed_limbs.rs":"45c75b17d2d03d59336c280a8cc07eb9a13e51c57ee0864a3db7c2addd6c26b2","src/arithmetic/bigint/modulus.rs":"d3ee776c815635f5f56bd2d743b9c4cd3394e812b15aa29ac62bd0631bd19058","src/arithmetic/bigint/private_exponent.rs":"2413370c66f585bdd9c0928eded018ddd448255c99d847332ae3e230eb4aa89c","src/arithmetic/bigint_elem_exp_vartime_tests.txt":"3c2b56931d5dbb868f8343645fce2dbe7a966d824df5c9a07fcf1a166ae0b1c6","src/arithmetic/bigint_elem_reduced_once_tests.txt":"2a6a92671f91d372a07f90411cbcfbc66eaf6a34cf55208ef46a075492a325ab","src/arithmetic/bigint_elem_reduced_tests.txt":"2852d071315b641b63781fc193c705a9d040ced0e9e6eea87becc6c094f8843f","src/arithmetic/bigint_elem_squared_tests.txt":"4b7b93ee3e836bb16f7af91b74aa2045617c5613dadf3c3944f5194d67c4ce96","src/arithmetic/constant.rs":"77f2d1209d301290b87a434057083bfcced6dee4e1235e3d867e205ce88e9f3b","src/arithmetic/montgomery.rs":"2ef692d996e2c71b392dab73f83a7900825f769df27375d3c03bec1d57cec0dc","src/arithmetic/n0.rs":"dd793811593247da10002873f4ca5d954529f8dbf3ee716b87454fbfee9efe75","src/arithmetic/nonnegative.rs":"8dbe51ed03728cb32d9a61132f1e9676021fb2fd5ded19d9a476e2608d1e2e01","src/bits.rs":"1b7de3474880a285e5c2aef7074ea4d7e19c61d7dd5bfd9a9198101012957ab0","src/bssl.rs":"018ae96e68f901052589ed0d8453d247f16cce64ac90693e158cde91d19599f9","src/c.rs":"da9b37dc7c6ff3c9351decfb6941067a07437c4be522137815e6d8463b45cfdf","src/constant_time.rs":"9c499e2acc21a50bcfa76c71045ead0b9dc4c2febf908ba5c01914d2d21221d9","src/cpu.rs":"64e861ffece339f578393cac5aaa5fa14dbc3a35d2f120ded1e7bac3cc4fd531","src/cpu/arm.rs":"49e2308823da4b8097a6c6c069c9756cfb96dc3833d28494fca553eca8e319e0","src/cpu/intel.rs":"9f5e2a2e3e24e0542a8207659adf590f20b6207c0d12286ae32f0718aff43694","src/data/alg-rsa-encryption.der":"09c2e14354a83703ce5e8aedf311fcaa3704fb7a86a64d05a57dcff93849848e","src/debug.rs":"55c6bca18e85195284175d06c51fa47577c29920fd3b0dabc8c1ab2149b5c65d","src/digest.rs":"d85c5ff89ebcb7739dd648211c9fcb9bdac14086158e262d0072c0a97aaa9773","src/digest/sha1.rs":"148fe21153339a5ded6518167d4f3d78bb73146a348093c3c79ec8b648528338","src/digest/sha2.rs":"5ddca5851e0b0227840bec733e857b270870e888723d35c4d48127b934064f92","src/ec.rs":"698094e0af12a4b2889418fe642d4d3e508cf163ac124cb36ea0f614f29485f1","src/ec/curve25519.rs":"526b3870a6e13c6176bb82b9c2ba22bc4ff0a90bb5dab18d3b0064bf99322925","src/ec/curve25519/ed25519.rs":"7315176db6226648d0af31da3b54b9b381926d51dc6fde8d10d0c1fb9f2929d1","src/ec/curve25519/ed25519/ed25519_pkcs8_v2_template.der":"829aed070233fbd8e5ec80d9eb6c08b76fee8e3d1742ef6c8756153b9b5a6ef2","src/ec/curve25519/ed25519/signing.rs":"10c27c9fc1acadacdf2c37a50ba06bee53ca0695ae1add47897283b57fe4422b","src/ec/curve25519/ed25519/verification.rs":"9102a71098787c5762469951c57a1be8170017269a799467d997450997ed5563","src/ec/curve25519/ops.rs":"cc22ebeae654d37c8687d0335bea96905a2f18aba14d72b9d762b6cf2935e891","src/ec/curve25519/scalar.rs":"506248578d46df3881631d144c40423b13315c0a1591d6fb239abb0448030d14","src/ec/curve25519/x25519.rs":"51f5333ef49e1f118a90bef61ae8be25427be6018ea69d94ab2cdcccd36e898c","src/ec/keys.rs":"6e6546e5ff66622d07e8f21f350adbcb9e3b9894bddfae88495b4f19643f4c08","src/ec/suite_b.rs":"e4fe10a69f76fc57500a21e3d08d19132a8036badcb3ee07b28d43c13ebc36b0","src/ec/suite_b/curve.rs":"d91c344a015776414bc4826ad952a9108a94ab39c3d2bd0b3b2a13dd1f404ba2","src/ec/suite_b/ecdh.rs":"2e782375e4b3b7937b1860fbcd1b71cc328235bac688f97976a54e382f4b6a99","src/ec/suite_b/ecdsa.rs":"03e62a33cef8516c76efc2296a4e34b10b57413db77755b20a7f487868496937","src/ec/suite_b/ecdsa/digest_scalar.rs":"1a1c224387f37a84e51d40e648bdb5759a3dd622b5038847ff51241385eb84f4","src/ec/suite_b/ecdsa/ecPublicKey_p256_pkcs8_v1_template.der":"2fbfccae7d03b3b088170a5d433b9192b1a3345f614534a14ce2ad6ee0fb65b7","src/ec/suite_b/ecdsa/ecPublicKey_p384_pkcs8_v1_template.der":"7b5c1a09f24e65cd8c9cfc31a9618d93293764d4817a2879c37a8a1c311d5acf","src/ec/suite_b/ecdsa/ecdsa_digest_scalar_tests.txt":"ccd95b835c5bf410db5fb2e16e4dce2c1d377ceab7cfc9345e0bdbf4fdb37f05","src/ec/suite_b/ecdsa/ecdsa_sign_asn1_tests.txt":"743707b29c98468e43877860154da5a0a5f35ec080ec4e56c218d0a037748fd2","src/ec/suite_b/ecdsa/ecdsa_sign_fixed_tests.txt":"9c023664ed4a9416186f93654720ee97e89271191d97679caba0eea0d1dbd6f2","src/ec/suite_b/ecdsa/signing.rs":"8f71f0269f206323e592cd466954230b9aa1bbedd50e096bfd2152c33569c7fd","src/ec/suite_b/ecdsa/verification.rs":"0006716d7e1c8d677ce921ef9046022c9fc6818c7a2b5aea20f8850eec11373a","src/ec/suite_b/ops.rs":"5b7e7ade81a232493959ae27bdc635e53802e36cdf241f52c8c003c7ab04a7e3","src/ec/suite_b/ops/elem.rs":"99de9f51244b15109cc793b8992879e5ce80ee3e0d6377b6692cd27fc7fb3c92","src/ec/suite_b/ops/p256.rs":"8a8ed4080e11fb3df47313c36087ba39fea560938a54bf9f84d8b48b5f7536e8","src/ec/suite_b/ops/p256_elem_mul_tests.txt":"506e0bdb96904d8c515af72c59e79744bb1b121ba39883110d0a2c1eed62e9b8","src/ec/suite_b/ops/p256_elem_neg_tests.txt":"4301276289fc7a251b28511c9b91fe9e9ad82697639842f1bc74cac2566f2bab","src/ec/suite_b/ops/p256_elem_sum_tests.txt":"d9d6da4a4e1063df94092e3360798e3d75fc875b533d3c9021780110e6a7b925","src/ec/suite_b/ops/p256_point_double_tests.txt":"daf974e40d7dcef4bf09082b66b8deda4725aa6faf931efd38113232102fc6db","src/ec/suite_b/ops/p256_point_mul_base_tests.txt":"a5e3f9c7c617d05bbcd1f0cf6ac0eb65554cf77a4a60db15716a3f2c683e23c5","src/ec/suite_b/ops/p256_point_mul_serialized_tests.txt":"ee34a8fa42f61ecd203f4a4f1d36a25cbbf38a3477d27b8c8867eeff59d0c9ce","src/ec/suite_b/ops/p256_point_mul_tests.txt":"c2c5f0ddea40b16d927a5fabb7b448e75489c6b0abf95193f94cc35af3028307","src/ec/suite_b/ops/p256_point_sum_mixed_tests.txt":"d21b8f259cb7311916cfe198c68e012c1ea4c395cfd386619b4ad15cab0ea0c8","src/ec/suite_b/ops/p256_point_sum_tests.txt":"d4825a59a5cf44762d5270cab64649cb73c749bfffb6562acecb19ca91a7260f","src/ec/suite_b/ops/p256_scalar_mul_tests.txt":"8e289e0afe4d3c3b82cde5e518b680e28e6f1bfd432ac6ee0e674831048425a9","src/ec/suite_b/ops/p256_scalar_square_tests.txt":"aa8a450b9726ec8e9065c00aefb59c4a2e9cc82eafb8a60e14d30198846c05d5","src/ec/suite_b/ops/p384.rs":"8a739e3bc15216e566ea48f56c049351e334fb78ef4f026d3fead3c9df698cc5","src/ec/suite_b/ops/p384_elem_div_by_2_tests.txt":"7592ba70eb6fe146b19c47307c709a5aa03db36488679baef3a3536ba6ecd1f8","src/ec/suite_b/ops/p384_elem_mul_tests.txt":"5976c35dac4264e508c6bf2d6b6101c4c086caafbd883efe6dbf51e73f64f414","src/ec/suite_b/ops/p384_elem_neg_tests.txt":"ee5774efcc62a8de725797d38b744f64cac8b5166f169e45ea449b72695ed8af","src/ec/suite_b/ops/p384_elem_sum_tests.txt":"f0e9c52ee5b0527c5fe002182d2fa25936dab10544aee050f3a8cc30cc82cd5a","src/ec/suite_b/ops/p384_point_double_tests.txt":"a54d83bd4be1b621cd7ce86609302fc187a25cecce5b84c79eed44ab9286250a","src/ec/suite_b/ops/p384_point_mul_base_tests.txt":"e58eff0f20bbadc9ac71bd31d8f3e1947121c71ba03abe832f5b85201c7e0859","src/ec/suite_b/ops/p384_point_mul_tests.txt":"bb1a3fa122f71b81566d5feaaa56cda2fcb9f08467efe998c9c2cd3f7e670790","src/ec/suite_b/ops/p384_point_sum_tests.txt":"c451ccc839b022dcbb06bf97f23e91cee306adc747ae675a4eea71cf3d09696a","src/ec/suite_b/ops/p384_scalar_mul_tests.txt":"25a7dd3d6e8db83bd7158d90f07eb34fcc3fe89f976f48503872e5a8eb99fd85","src/ec/suite_b/private_key.rs":"5acd9cb7532f5f3baaf6d5d7a836a16813f0c8c89722844f0b05c50db66c798c","src/ec/suite_b/public_key.rs":"b0ab1542075fc91d4ab8de48fa35c3b748b31579e687943c544f2a71eabc4203","src/ec/suite_b/suite_b_public_key_tests.txt":"ee3ebae764b975b80e31f6fec3f1c0514ba0f50e4bb05ae9dc7d5ea51272e268","src/endian.rs":"e78027d3723b51f24692825ad51f52a08b2e4ebdb5075a5aa032e92667c500b6","src/error.rs":"b2f621d44f8ccd7882a56d4c122e28ac96b6bb0e6c2dd8b222786591bfe631be","src/hkdf.rs":"3995d694e02b8d04e083110de17aa8d2e061431cd5875887c0068bd05de69868","src/hmac.rs":"dad00547542fb4a477ceec89652a4c67dd13e766b0a4f686cd134649295b8cd7","src/hmac_generate_serializable_tests.txt":"fa1ae4388774c27b92f948092d820344062a55d4f1efcacf63496e8941a213e4","src/io.rs":"b26604c42c215fbfead69c5a2adc8408d7888414aba100f1f3259ba26bd112e4","src/io/der.rs":"d589d02d9a2a22599cd2b2eb2b7c62cff97063b6b1a39d7ecf9c5706060cd78d","src/io/der_writer.rs":"de21b634b9e4d43ef7acc3636a643c73c15eb22e50047e87c2ff49a65a2b0203","src/io/positive.rs":"b6a0db00973e6a247beb9bb8465c621a989096fec42afc0a5517fd227044e453","src/io/writer.rs":"f17e3fdd9a94a511b184b9c18f18ab80184f7523f77a39ac1bbdfb15e9a84bbc","src/lib.rs":"db9bd06f665071f0fe3fd5400edebd4acfeb8e9588855c6b1b2f9d4ad3314a01","src/limb.rs":"c14a5f5daf960608706751b930e39aac3b91630f390d03cbb0230bdf3c7871e7","src/pbkdf2.rs":"d8bc1763a27ce8680cd962947a2963f3126108bfc4bea76123721e280aa2b46b","src/pkcs8.rs":"1dfad6326e014f9b46db92fd5d8cb66e5d82af080e7fcd30593393b08f0400ac","src/polyfill.rs":"c6caa96d78fe2d9b0e6cbb802781b9fffd5e2378a16b1c84fc85dbe70f393e80","src/polyfill/array_flat_map.rs":"feb5d33833efe914d3befe7ded115edeb3f3f66f28cedcb745651757fdee72cf","src/polyfill/chunks_fixed.rs":"df3e20d51a0872ecb639a3c497c493c013da465efb61853f0db44dda890dd1d1","src/polyfill/leading_zeros_skipped.rs":"d5b1a9789a936ee34316fd463d7b11e8489d5e3bb7ee7e07e3877008cdc71558","src/polyfill/test.rs":"cc9aa7ae7eb6083c83a98a33123f90cb3ec023b5d80e9df08c4412fbe4139982","src/polyfill/unwrap_const.rs":"01ff27349b1fb9f22324d1dc596926c12ba23fcf7389ed7d6c71f14946f561c4","src/prefixed.rs":"c4baec131ca5569b965ae9357f82b0f008bb02da6344a00f318779ebe84dcb79","src/rand.rs":"d9de5d37c4985173aa78959cd06475ceadb6c77dd284ea9a83f89c3b386691d4","src/rsa.rs":"f8d3abf271aa9b75b7ce2c0c2567a91d1640e10281b86ed2a7f8fbc7a5a1d207","src/rsa/keypair.rs":"1cd5dbc9a7946fedf453146abc7384d9a97833f01b899134406a1bd32c2c5e2e","src/rsa/keypair_components.rs":"b6bb3e8cc48a152d70f59de5d8298e4ecc3b6dce51291eac285f7802ee30ca45","src/rsa/padding.rs":"a065ed746a4cbd0d1acba19b8685ff41d6ddaae62df61f0a91fe943bdce3135c","src/rsa/padding/pkcs1.rs":"357b346d095e4921b8491d2a1f4590c0c1a898460ebd84987ca0fb8168fd9fc8","src/rsa/padding/pss.rs":"dbf828cba0785ae224c4d6692d11adaf12fb7864d17334f6362d8c42e8f448d7","src/rsa/public_exponent.rs":"301976256ae1e14f62f0e2258cf04fa5ab1c18702cb13070e853b9853f3d7f70","src/rsa/public_key.rs":"057f15679b02326ba42a8b9b1048939898d818332d4815a2dbb58c12b859d242","src/rsa/public_key_components.rs":"646d5853c648f8708f1a00667b4421289463d7faeb850ee477cecd3e34b0db30","src/rsa/public_modulus.rs":"54dd806ce003722ff306995ab3ba6c620f327e8e3c746101e446a26b9ad1dc54","src/rsa/rsa_pss_padding_tests.txt":"a64094474a441012465a17c89db45421dd953ecebc2f8bbfbcc75c2afb4e3bf2","src/rsa/signature_rsa_example_private_key.der":"99edb08a0d633132592d236dd8cf27a96d03b3cb5a739bf38d4f215b6714ed18","src/rsa/signature_rsa_example_public_key.der":"602dd3d9b698e2648ea9da6a74dcebae374bcff33e63a4cb7d012a2410c3c015","src/rsa/verification.rs":"f84168bb4c60365919048372343e15a05f48ab3eccbe7f97a1f6a4c988272233","src/signature.rs":"d6a5a8bfd85071f2bf5611438faaea81a77073ab9a0e9ba23e05a0ee69f921db","src/test.rs":"4e3aa5efee8945926047bd50740ad64af4e677722113d1c692da2c8e5e241be3","src/test_1_syntax_error_tests.txt":"3ecdee10e5eb45f87f96fc3db987115c92c6aa2b362d4c9af6ad4ff86f787fb9","src/test_1_tests.txt":"231b2dc1527f8bd9b89a27474786252d2c7dcfcd89d424e153cf06f0533fc688","src/test_3_tests.txt":"3fc3b3c4a23f28f2a7a1082f67b2ffdec48b6adef5fe723238b5505d203a971a","tests/aead_aes_128_gcm_tests.txt":"351075f8427d1eb3d21681d378fd6421232c905626c02f8891c59fb3eac96727","tests/aead_aes_256_gcm_tests.txt":"55e5edd3d6980b5696ece825ef33caaade7efa39c13b437218543a50365322bd","tests/aead_chacha20_poly1305_openssh_tests.txt":"209d3b1b512b0e8cce2c8d05cd770c513b9a2c42ac3b718768aec2cf688e408e","tests/aead_chacha20_poly1305_tests.txt":"4622ca25937d2fac7070411ea8e30b83ebb6f23dfa7e99babd032bd84b807c29","tests/aead_tests.rs":"a529d783833e239d26649f932be8ded4f3ce709d812a0e891f0832c6312b72dc","tests/agreement_tests.rs":"1578c5e0a3bc6686a88d53ac4114a7f3257fc3a4913fbebe7dd3563ee2ad96a5","tests/agreement_tests.txt":"e8d90b167d03b9c0538bc856100bbf9bd1a653acb433e8197111f95fc48a602d","tests/constant_time_tests.rs":"b1d0511be43331b60c68ae972c9b48dce9ccf78cbe71327d5863e522c0203de7","tests/digest_tests.rs":"165017b2bb86297136b200c5ae6e49505eea3504da49a68f95a8edff99cd906d","tests/digest_tests.txt":"2e583df382b2f4a552f161852041c47f5dac222abbe8b823f155b34e810b9a76","tests/ecdsa_from_pkcs8_tests.txt":"cc7914e6da264a47723dff7834c0f52102e84ce35a5a8979f2436433071956d4","tests/ecdsa_test_private_key_p256.p8":"9426acca431bd887588a6f16b74b53d5cae792841b2c4bffeed58f8ef2452276","tests/ecdsa_test_public_key_p256.der":"aa3f70fe76d67a81a6a7d8d68adc21468fa8bbe983054f9b7ba5fe58da6980e4","tests/ecdsa_test_public_key_p256_debug.txt":"93326d98acea218576f7aec62bda471cad346ee9cd9d3f8651a060a9ae7f6251","tests/ecdsa_tests.rs":"2741331a8ed33fdd9ce3b754e360d43b7ec95bee3b2c12800f042a095c3673a1","tests/ecdsa_verify_asn1_tests.txt":"ab182130d2ab339c48bff56ea1e78d35aedb4f161085841917f2712643a322f7","tests/ecdsa_verify_fixed_tests.txt":"5fb5082dfcc11b2414b6c7e702ad2025ee1ec48bd562abc0fe91b03e30a53588","tests/ed25519_from_pkcs8_tests.txt":"f64f158cec635162ae8f1ef871bdbd63d5c2cf28d599177c862561e786021c1c","tests/ed25519_test_private_key.bin":"05ecb32435e3eb4dfe187786be6190a789fc89b690a134644743224ed40fa744","tests/ed25519_test_private_key.p8":"e85aa791586dcd9716b06dcea87235b9a414b452b8dedfc36f8ceac6f73f1f26","tests/ed25519_test_public_key.bin":"d5ad3a67d6f0b2513aec55c06da041f663c749d74ee298f546f074678be6a5c0","tests/ed25519_test_public_key.der":"8be9f74f8dccbfa700a8f7ef1e0a2a8d36820ac9712802dd3a5d9c57aebab1de","tests/ed25519_tests.rs":"0ed6f5ef4ad9b03aa0eabe7dfd81a736b3b05186db04c151e3e610d74fe19bd1","tests/ed25519_tests.txt":"acc9faec4ce9e23636eb646c646fb6165656e9ce9248b04514c70810af60ca78","tests/ed25519_verify_tests.txt":"92ed2f6838a034db2da4927c0476b522648462d8c2ef34a6f3efe3b45e5a9c99","tests/error_tests.rs":"43974816ccb135f3ba4cf2f17a5eb1ecb79b0c851581a09c102b86806221d047","tests/hkdf_tests.rs":"8beddebad946cbdfb789f177629a71d7f27679d9af0c680a144f82082f1eb5a5","tests/hkdf_tests.txt":"add79d91c995daf7308f8710e6504b1c476933e686b62bc0771b3c9a67eaeac4","tests/hmac_tests.rs":"54fb00890e7ab9d805537456d77eff2476c1e1f3d0f6be450648c88907370de6","tests/hmac_tests.txt":"ecfe7e6019812dc6c96a481e58f79a367635a906ce52bfc42e1725e1a9aa7fb0","tests/pbkdf2_tests.rs":"94a1b03a9841a18c35ec352894a5b466e8c0b6715d3c0223bbff221881170629","tests/pbkdf2_tests.txt":"4c2925750f500263a20ee56b0bbd9c06e7ee3d4853deb5b4ba35a78c9fb036cf","tests/quic_aes_128_tests.txt":"d229bb4ea6ab5f48360f117435ce2fbad042b8400d7f83cecb77c4f87660c0d2","tests/quic_aes_256_tests.txt":"13bedb2a4a333b47783046b573aea7ce9b4b01fc6d90a36609e890cd60a8de0d","tests/quic_chacha20_tests.txt":"fb95fd6664ca833875d129ab2bb0c6fb2631688911eab928dcbe9b5d04546e57","tests/quic_tests.rs":"2b18d63650f215e2b7819ba551c9e05d3d749ed2ed34df8d6bcc09b4a792c73d","tests/rand_tests.rs":"ec3478594d2642875e43e3e4ee64326d8529d8b01b48e501eb3da5f1b16d2c0c","tests/rsa_from_pkcs8_tests.txt":"195f0646e20c54f640798d1b776c7d0dba6fb2569ec32c6df5d11979771a0238","tests/rsa_pkcs1_sign_tests.txt":"6e0b52464253bcb2b5856477ca6ee03e70dc21ae05af8cf490c78a66c33c4eeb","tests/rsa_pkcs1_verify_tests.txt":"c562a894b0c35ba03abe929c44f8f01a5e3f8ee8f1861972b1b785912eff979f","tests/rsa_primitive_verify_tests.txt":"46af8c1052424f72e117298904bef114bd2764386af2df4bf77f20b3653c7043","tests/rsa_pss_sign_tests.txt":"c06f48a56a5307badabf7d7260745c2325b7649bf9b3fbb43c5f30b76fc1d605","tests/rsa_pss_verify_tests.txt":"720763006ab23ecbc9a133bcc380927e77b508ae6be054243e66bad184114363","tests/rsa_test_private_key_2048.p8":"3fb0ef9769108d42bb1710d1b407c2a325fe67dc3e63eb485776a99edd01546c","tests/rsa_test_public_key_2048.der":"c57d227ab8427b8b9cfc41307a584a773959b79a837a82dd52f227d8f3f97f2b","tests/rsa_test_public_key_2048_debug.txt":"ecac591e8d19f13bb8c2af94364da9ac2a68c706de5b15118093dff57463a441","tests/rsa_test_public_modulus.bin":"20135a01337d850581838936e951c7bb6f2b0c7f004c96b197db0a9a75fdbc44","tests/rsa_tests.rs":"6e8e4b7c132a6c18fd81b393ba8af22a816b981db1a1ae34a15fe7dbaca24624","tests/signature_tests.rs":"c8a6a8e7574a9d70aa5e7a4dedd903ce84b307524b3df2d3bfbc0ab741ae5682","third_party/NIST/SHAVS/SHA1LongMsg.rsp":"85a40ebc47d8ca913619c2b15de676b8028f03fd9aed84116cc1023210aa40dc","third_party/NIST/SHAVS/SHA1Monte.rsp":"c6b3423ff6ca199b93cff002958d7e5c37f9a3bf126a7284d40f9f91c50a97d4","third_party/NIST/SHAVS/SHA1ShortMsg.rsp":"febcd8773ae5a47694f68a6f588d14a1261c4b94f53122ef490c5b49bb525553","third_party/NIST/SHAVS/SHA224LongMsg.rsp":"468d940ad14f9be755341ec9a20c4bab1951cd770294406a7f7de9a9754068f0","third_party/NIST/SHAVS/SHA224Monte.rsp":"0bda5e571e5f12843382d5f9f51cec156c58eb61dd023a1473bb23a55575ba8f","third_party/NIST/SHAVS/SHA224ShortMsg.rsp":"cfc23bc09922e846c0e63cad2dac76a1583b8a20729d23cf4385f8d4394d424a","third_party/NIST/SHAVS/SHA256LongMsg.rsp":"f3312732aa22587da2ee354b44a8c0e2246135484442e6c81b6a478dc4bc7c37","third_party/NIST/SHAVS/SHA256Monte.rsp":"5c90aac35f309fd243587180fe26ed5f08f2c8a1dc56cca808949feba5f0c17b","third_party/NIST/SHAVS/SHA256ShortMsg.rsp":"182ed2d20a3dc717d35df089a7cbd613bfca8de2c3fe60530eea9b751bdfe5a4","third_party/NIST/SHAVS/SHA384LongMsg.rsp":"9ba4ed7586c3195fbda4e9c5e3288e8840cc5f04bb6fcc22862eb226efc054b8","third_party/NIST/SHAVS/SHA384Monte.rsp":"3086e17251383b89a45891ec2037c83e6bbdff25d4695ae8d67dfe24a6bd7364","third_party/NIST/SHAVS/SHA384ShortMsg.rsp":"afb8d74a7ed8b335c77124191eac7b3c25d448c12f1e3bc038797e5711fce27e","third_party/NIST/SHAVS/SHA512LongMsg.rsp":"0fae88d811c4ac42a0b4c3694b430cb63faa25d1d8ec55b85b6d313dd7e13430","third_party/NIST/SHAVS/SHA512Monte.rsp":"db6b5fc2eab66129f5528328bb890eec59a981bb093f526095e606f308b37f5a","third_party/NIST/SHAVS/SHA512ShortMsg.rsp":"2bcff98ffea78fd0aad601236f7b9654a72c080fdddfc81b7bf310a3116d2a7f","third_party/fiat/LICENSE":"a76af0ae37c0dc7a1d24edf21c81ad6b78876349eed250c41bb9a64825a97216","third_party/fiat/asm/fiat_curve25519_adx_mul.S":"5fc1c4bf4a58c0d30f1385ac8df51dddd5851a4f13f210173db9b05f044396c2","third_party/fiat/asm/fiat_curve25519_adx_square.S":"9ee9eb1cad78f2fe8ad8e94bbd52b31d2842aa093b3536caf8c1a29a51f63ff7","third_party/fiat/curve25519_32.h":"4bc636fa128f6f537aadc473c40c39bf251b0be435a6fa881efb84c2fd6675a9","third_party/fiat/curve25519_64.h":"cb0c26c8fc2dc48353c29db21e559e6d4ae5e2a933ed57651ed0e5c8f5084238","third_party/fiat/curve25519_64_adx.h":"163f2c77f27a00ff6666afd68a0f509a1e5ef0daf6c2fb52060062f62c732f0e","third_party/fiat/curve25519_64_msvc.h":"13d44788a5284062286969e61d3b7232093ac2f2397c4553e0d51ef83f75aadb","third_party/fiat/p256_32.h":"bf562b4db55564adc5f14f4dcab0febeb1e7afd4297bf3cf746414c8114dab9a","third_party/fiat/p256_64.h":"ac4e9337bf5c3a1e5201deff6ad9c9056fc2d45cfd8f9a427bf51181ceb6ab41","third_party/fiat/p256_64_msvc.h":"9a5c60f18267fb139f1433cffbea98a74382a7931d815d6449cb8a6fa74669f6"}}
\ No newline at end of file
+{"package":null,"files":{".cargo-checksum.json":"556d4a0ea242d61233a71371e326d560257064bbd6e66ee99bdc8ec029a3716c","Android.bp":"1bd0d0b60509b9b15c620db743b0215423380b381fc7e0bc6f009cdb201592e3","Cargo.toml":"85ba4c286c6e7fe20ce8fce527525f5896d161b1e12ced6aa59f9c3c5bdc6f1c","LICENSE":"0f0dcea25e2fdc3205bf134653c985d62dfdb433b3ed6bb2d8c9d8b87ac32f2d","METADATA":"e7cd5149d758002ec266ab19638360130bcf4d4df211c80edf9cc126eb65c7f8","MODULE_LICENSE_BSD_LIKE":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","TEST_MAPPING":"813ac88d58c70f70f7497ebf28ea9b6c4115b33e4ab456155198a6cd835ebc0f","benches/aead.rs":"b160f6ebd6a0456255530bd0ce81a80485c7cb66263ff377e9ecbfc45174882a","benches/x25519.rs":"79f179b3dd53b29697d084633fc8d0dc764bd0e214a02d1ad4f1bab01f6dc4d8","build.rs":"e8818df7edbaac861b24e55d073c2786faafb7dbafdd8ae011ae8f0e016190ee","cargo2android_cc.bp":"db5129d0f397381b98b26c2b36cca105cc2f750bc96f8f0540d08d0936848c5a","cargo_embargo.json":"651dc8b3403a5064a95bed223e2809257f925fa0ecb26c96cda50d85ee847d71","crypto/chacha/asm/chacha-armv4.pl":"ec8c60839dd40e0546a4e0ee009b10e303a4610b86dea95321ea5a81e382cc48","crypto/chacha/asm/chacha-armv8.pl":"8825e9bd25ba295b219178c602ae2d75d3dd450149b90729f6b49adaf9a027db","crypto/chacha/asm/chacha-x86.pl":"b02715d86e1efb72aefc606fc09ff5a028601050a30210a3bd83c578bfa775fd","crypto/chacha/asm/chacha-x86_64.pl":"369f2ab053d541e2a76b55167d64e092383a29659180674288717c4c358ac11f","crypto/cipher_extra/asm/chacha20_poly1305_armv8.pl":"df837dae96755534a72556a5559a989aa546a01764a87003e59a789eea62993a","crypto/cipher_extra/asm/chacha20_poly1305_x86_64.pl":"edbf724e0340ed0f52ad145523f3234d62302696b55d17833d264e6689930f07","crypto/constant_time_test.c":"34fa42c020d6a574cb1e5d2499fe7707dafc70d677e14afc2e47c6ec86998a07","crypto/cpu_intel.c":"fc4773b35d83790ec977be5c87feb3a323cb059afd6821c5d747c1f2a2bb0704","crypto/crypto.c":"88aa24082eaa926d7db7a1335f207a969d57bfa88e5a19ed1538ca84f611bb8d","crypto/curve25519/asm/x25519-asm-arm.S":"4a0d74105f936f1a4fb2e369e41db729a3083232f95328eeee6503b02673967c","crypto/curve25519/curve25519.c":"a3fdd7f7d28cf99e43d064d196e0ad23e2fa530fd92cb7707cfd54fab14fed07","crypto/curve25519/curve25519_64_adx.c":"8df1a750fd4506dda734420f039428f3f1b58d1133a81d5ad2d265fd3832a740","crypto/curve25519/curve25519_tables.h":"86b90bb968715f3173f1c86785657721e41c421d796f634a0cc042a717b722b9","crypto/curve25519/internal.h":"ced830d9222e25864ad818102f10eb8164b736f268d36ae6dd9c9d54f82ddebb","crypto/fipsmodule/aes/aes_nohw.c":"3180b1092e87c9d311a333f8668db25458f4494f449341b96abe0bef2ea834d4","crypto/fipsmodule/aes/asm/aesni-x86.pl":"843c5eb1752e8f9012025a52abeb5fb67950de3eb8836f4cc379225440501fec","crypto/fipsmodule/aes/asm/aesni-x86_64.pl":"20bb46a12ffdd95752d8a773c61a7ee0e4ca5c6267f5e941772c845b5f80a30b","crypto/fipsmodule/aes/asm/aesv8-armx.pl":"635a342bf209f7e443b60bc3c3a0480e85ffa00cdcfe55eef6b081c49c7d97c2","crypto/fipsmodule/aes/asm/bsaes-armv7.pl":"b111660c44c1d63add4311996c54da2088f5ab4c0960783c3b07a3018a4f9b61","crypto/fipsmodule/aes/asm/vpaes-x86.pl":"838eb8f8aa4941be28014e4c8e8c018aa7408b133ebdf756185d5f6b1c39cff0","crypto/fipsmodule/aes/asm/vpaes-x86_64.pl":"5b2cfcfb2b75294af08617e19eb60f0ff5fb4da318d90329d0a3d7dcc3f02985","crypto/fipsmodule/bn/asm/armv4-mont.pl":"23819df941448355161f7eccaaa576016d90751ccab12e6f11f9b07787903b4c","crypto/fipsmodule/bn/asm/armv8-mont.pl":"203e7f3fef3818bd4b9dc89a95ff45ff6df8640b8a42cceacbd08a473fcb251f","crypto/fipsmodule/bn/asm/x86-mont.pl":"fea72ab2e2e617e14d72fe1f84f7b5605aeebcfce79a07cb48159cb13fb83b94","crypto/fipsmodule/bn/asm/x86_64-mont.pl":"f8ad9237d0fad2797ed2dbebde0664ea3746d7eb761225bc0d8a148595b837f0","crypto/fipsmodule/bn/asm/x86_64-mont5.pl":"2b2a2aed0a106a1ab0b2cc91085357060f845814856425f2a1060c880389ad82","crypto/fipsmodule/bn/internal.h":"a331dc121feb04bfe207c05d0379094d16c5deb8376ab3702440219f54d15b02","crypto/fipsmodule/bn/montgomery.c":"d65afb255601a66eb67cf871fd864f714b1bb7f3e8bde0440f12d5a77e3d13bb","crypto/fipsmodule/bn/montgomery_inv.c":"a138c2ac2b3b93dc18224123fab1f476455c722add5acd336a782892069b1664","crypto/fipsmodule/bn/test/mod_exp_tests.txt":"d876130e6a37973a284ab740e2f198ab3864a7a7e5f7881677f6ee94bbf2b26a","crypto/fipsmodule/bn/test/mod_mul_tests.txt":"dbf727c4e7b5da79f3a9b9135099f11f2014d47884232f8fbb6f47bee8f4b716","crypto/fipsmodule/ec/asm/p256-armv8-asm.pl":"cf6fd3a011f85f9a4f4eae98d406f86c2d1440169b5891622068a5487032468e","crypto/fipsmodule/ec/asm/p256-x86_64-asm.pl":"45c4665446168415b09b1ed8aeeaecf81b23bd6040ef81079c5655b1aae1a064","crypto/fipsmodule/ec/ecp_nistz.c":"1d30b37bce5cfc8054dc7718dc2f1591b67158dc787c13f376fce85c8b0ac8f1","crypto/fipsmodule/ec/ecp_nistz.h":"b2ef637a56b87ff23273cc5638dd00a51413b867334189df36bff2df76af8b4f","crypto/fipsmodule/ec/ecp_nistz384.h":"8724db26c36812ebd2689614ad1cfd7208d6b5abcad8e1e6470ef48482efd428","crypto/fipsmodule/ec/ecp_nistz384.inl":"fcf50ba2d504b59f376e4cdc98526c25600c9ce441bb8def3524449202ece928","crypto/fipsmodule/ec/gfp_p256.c":"5bbffc7974552ec965862926a650788e879c4ec6361ee56ec6f9ea762b7e063f","crypto/fipsmodule/ec/gfp_p384.c":"d55c6422144b46c6fe7f536efc17b3f11fbba0e7123fc1f811e0232cc37b6700","crypto/fipsmodule/ec/p256-nistz-table.h":"313d89622b5defa34beac337b26086b72167747f5d9ac04b510546af83f44da2","crypto/fipsmodule/ec/p256-nistz.c":"986973cb3c7cfaf2bef9d74556e4cae4a8189ee9125f95c066e42123cbf42170","crypto/fipsmodule/ec/p256-nistz.h":"b1aa76a620cb88973af39d90dc671a531ab90a1d097c4889ec3536d9f6c4a1b8","crypto/fipsmodule/ec/p256.c":"10fc6d71a306efbd1943668e09a2d1107ecf58bbd351e1b3c3a9c6395cc91883","crypto/fipsmodule/ec/p256_shared.h":"3f4510671d24c14617b938c0eb012df79a964c68b7f7f4d7975b387cc256dcc6","crypto/fipsmodule/ec/p256_table.h":"37b938c6c6d3691bb21c08ed58dbda078a3558276a7d6cb9ab0a304474a3e232","crypto/fipsmodule/ec/util.h":"b6da0632b3d5e910246499aa0a72270501c52947597b5b987e02a59e6b44e4b2","crypto/fipsmodule/ecdsa/ecdsa_verify_tests.txt":"94381622232d288c9f4817f480b98919ea79848f6cefc2a98f8987a06026a538","crypto/fipsmodule/modes/asm/aesni-gcm-x86_64.pl":"b360bd8d4e9fc9f2b6656432199bafaa6154b717597fd2009eac58c751f7aeb8","crypto/fipsmodule/modes/asm/ghash-armv4.pl":"53f1334bcdac4d9b16b8c81d491b37740e14e187c58a41098600936aa5708572","crypto/fipsmodule/modes/asm/ghash-x86.pl":"0caaff63fbd074e9fdeb51a4017d0215311ef3b855a9124a604b36904ae38272","crypto/fipsmodule/modes/asm/ghash-x86_64.pl":"f1170e7bddf44b235ab69cef226cf9de992cac083c47c897c2157e918bae2c4a","crypto/fipsmodule/modes/asm/ghashv8-armx.pl":"b38d7fbdef9cd8314671862d0fe902e89784085fd5aac2705a1cd1395e86d0ea","crypto/fipsmodule/sha/asm/sha256-armv4.pl":"9ab2f7d1789c98c19f26a508d70d25a92a4230d6c3808eac07ffdb851eaa5b80","crypto/fipsmodule/sha/asm/sha512-armv4.pl":"71744360e0434f49335fb0a957887673d6e6ffdcf21d5245218e8ef9dc932b3b","crypto/fipsmodule/sha/asm/sha512-armv8.pl":"871a17be8afdc737c9ea18b96b43c2bbb9113de702ebcd79cc7d6dcb6be4ce7e","crypto/fipsmodule/sha/asm/sha512-x86_64.pl":"a79ebd54ee0aa02c32fc6e0fd884dacd32c3c66984303a9c4f67cde425d30070","crypto/internal.h":"997e82d00495eb2c6592b6c83784aa41e39426d9e6a33681d127ddef15802095","crypto/limbs/limbs.c":"f68080803e3f80d512c942787aabedbcf007b07e8bb1fa74cfd80e035eb087a1","crypto/limbs/limbs.h":"9d943fc9a83e58b736ea7a9cde0fea7ddeeb7b0a32619f7de018fa1f8e19b65d","crypto/limbs/limbs.inl":"29011066407f556d729738bd65ad02eefe45fd8fa36cc0b0e1375328cec09bd4","crypto/mem.c":"3ca6c0eea9658b12789c3c62d67720cd92078e83ff8d9dab6ee78cfda89df9ec","crypto/perlasm/arm-xlate.pl":"195a6d6cda7f37a5687b51ed7bf00d2d865d67ae1b7f01f4f7e8aea4a9709e01","crypto/perlasm/x86_64-xlate.pl":"83e9e89291c8ac1acbae2e3f14b64cdeb1f887c0d0135fb83b122b777cbd68c3","crypto/perlasm/x86asm.pl":"4aa8362188051f5eb42f1baf3261b5d5a349c0d7784f67b8480a49e942e29aca","crypto/perlasm/x86gas.pl":"c8d3ab9789f1f9db3ad64b630130833a03ce9b943430f7e48a43b24a04a7a35e","crypto/perlasm/x86nasm.pl":"da3209465a0539e0df617137967587f13192f52b3771eaafc7657e3c0d3b993c","crypto/poly1305/internal.h":"61bdb51ff2a13bc101b37e9f94ebd94b2827eb29e5434581f01c7a3e66d6e67f","crypto/poly1305/poly1305.c":"cd9e2dc0d4178a9908bfac003c0a9ad9a6f5f5e0b1db62bb50f6bac866ea76b5","crypto/poly1305/poly1305_arm.c":"fcc8370a3dfb8e5195467f2c5c43ad25610b0a9d2edea04ec380d8f06afed03f","crypto/poly1305/poly1305_arm_asm.S":"39d2e02de2b8291bc5e9c49333f07489a0030606d46ea7325df94a21ded8de53","crypto/poly1305/poly1305_vec.c":"2fd88ed4548048802bcf044b90c006710f24ec49735a488906f278bf07db3b0f","include/ring-core/aes.h":"e2dbe3be82dad0e868434d849b74b15fcf1834619337216465f362fda0052355","include/ring-core/arm_arch.h":"221e2131e845943899913f96cc3cf9eef89fb718b4a3a92304081ac7b8221ac0","include/ring-core/asm_base.h":"67bf7a4bc018949c2bce2627ad5d65a4f9aad4bc27fe32aa20f6645bc109d208","include/ring-core/base.h":"3910cadcc7f070680f59ed05e4b321e3ca49cee4f5d125d4e0676078c245d926","include/ring-core/check.h":"88728cf6f5b002d00bf84d79b4ca313a1ec5d59e44a4d4261f6ac1a26459015c","include/ring-core/mem.h":"4b0ddd8be7c6d8f4a43130c3ce6de7c16ca4502e3708088208f5363d3c5b711d","include/ring-core/poly1305.h":"f4fac0335346154c49273019e95c1da8ae6c9c6aaf0762a9dbe9cbe211c7f640","include/ring-core/target.h":"74bfa5c04b73bcf5a05706e1d47bb878455c546846d440eae1932b114325c6d2","include/ring-core/type_check.h":"08c6f03009335f83a3d8a922443ca90daa240f69990ebb2b30df382eaec4f167","patches/Android.bp.patch":"30ac8f0b1bdcaef960bb23132f235668ad3b84b972e0b385c54aa585532c3757","patches/hardcode_prefix.patch":"bb881cbb9fadc3be0f4edba9310be9500c67a02ca8740571530cd7718aa28b74","patches/ring_core_generated.patch":"c082d59343cbdc55e77811751f9114b95adb65a53b543c436cffedde9aaab0be","patches/test-data-files.patch":"0560100f1c9f9640678e0635746cbfd2fcecce83f3cb7b0232f882be95d454be","patches/unused_qualifications.patch":"1879f7b356e2685a97870d31f6ea3edcba436c1f8c4de1b10bd5892101dc42e4","pregenerated/aesni-gcm-x86_64-elf.S":"0a2034fc480bcd1a7e12a3a2f66bf557f1e0da0d52f224824b725d14e0150295","pregenerated/aesni-gcm-x86_64-macosx.S":"662684f3dd4c90b30953d37d21af29d9c498550f53ada733ee8fc0b3107944b4","pregenerated/aesni-gcm-x86_64-nasm.o":"bfe90f531243e1995c049500e9950f664b329b7adeccdd6866faf3bc30f01428","pregenerated/aesni-x86-elf.S":"0f062486e2d4499b26dc913d0a289cc1929d3d7156bd01387c62d008e476d3a8","pregenerated/aesni-x86-win32n.o":"30c214f4ecb1c8dbade05f660e30854c6e847596781672ad014a6d2bd32d0704","pregenerated/aesni-x86_64-elf.S":"fe1ba0e13dfc6f3551ddd376a7808d30ca3004b967fbfffc49bc4dfa7a334836","pregenerated/aesni-x86_64-macosx.S":"ee96626817e4fd9ede882046e65ca78ec93a90c01d8f4dbea01f13f58afd3ca8","pregenerated/aesni-x86_64-nasm.o":"b89e6490c53a6a3d1dc98a2357376d18944fa0ba055becd542c9810a76a61ccf","pregenerated/aesv8-armx-ios64.S":"86e1cee2fc3bdcdcacd942fded0d151dacfe7b9c104db864a269790e6b6446b5","pregenerated/aesv8-armx-linux32.S":"bc7d6dc80a6ddc50681885a72081519fbcbe9e3c181b88f26436510b05de5434","pregenerated/aesv8-armx-linux64.S":"ba64e37856921dcc985898d139de67896603a12602665ed5f09c5c02017d2f24","pregenerated/aesv8-armx-win64.S":"be73ca293be44818c77e4e906530cc96a7b45ba47f6e20d5c081fed75861186c","pregenerated/armv4-mont-linux32.S":"004decc5ea1b8cbfe8cf473e0b831e5a2e64ffac55f9b73789ca5973dbb09e79","pregenerated/armv8-mont-ios64.S":"b534fcf5412cedf2c6ecc8bca392413ee9cc6f3d96579acaff0c018ae6a14bb0","pregenerated/armv8-mont-linux64.S":"09dbcc750995c7e50200ce39a3d4fe9cc60ae91432d4104d4172b08b38f4020e","pregenerated/armv8-mont-win64.S":"446217397c3a9c0c671d3b498b82df9275155c0d19141d097fd15f92ebc93ddc","pregenerated/bsaes-armv7-linux32.S":"111934b6dcc77e10f2efb5568831d141afdf7ef160280895017f2e33ff781ad7","pregenerated/chacha-armv4-linux32.S":"407698dc80304fc54c198f2e102655eb557dc2918a6a263167343f54f8978298","pregenerated/chacha-armv8-ios64.S":"e780c5db3213d31adbc125616bc3fa473eeeb109f8975c7534e064a1c990f10b","pregenerated/chacha-armv8-linux64.S":"3bf78fde62ca427ffdb6f9c05a68e82bd0303dc7829b384dde1ff12d4165e148","pregenerated/chacha-armv8-win64.S":"5df9a896d56011498097ba1e3e4681ec40bb52e8d70c4e347d45c1438fe2a55b","pregenerated/chacha-x86-elf.S":"6db8896d11ab0af9b647544ef78fcf5271ab209cb34a121c93e1aff71442e3e1","pregenerated/chacha-x86-win32n.o":"e0841bc53d677acfc2688c935748a9d9a6c07a1b2ae4ce956d680d8251767a3f","pregenerated/chacha-x86_64-elf.S":"6cb4b3a097548cf7b1e22a05ae6c5428e0a2b864f660613e7b5e7539ded1fbd4","pregenerated/chacha-x86_64-macosx.S":"9faa1d932e3dde5d3120a54447e2c36aa31c5d64f757e2039eb4afc1f4bdba73","pregenerated/chacha-x86_64-nasm.o":"3540c7be5ba1fc3d58d3075dcf95357e4b930ccf19db741716d67cf6cf258303","pregenerated/chacha20_poly1305_armv8-ios64.S":"154d01c6efff12391f94b54993319fbc3df7ccc20d44b967fb37fb603e173684","pregenerated/chacha20_poly1305_armv8-linux64.S":"231e6cb33277be0c2218042346ca227801fea6ac9af8b03c09d43664445fd906","pregenerated/chacha20_poly1305_armv8-win64.S":"0deb47ea82fdefcec4f19c7097ef28e47ebb523f93bb30601cc2b86d91caac26","pregenerated/chacha20_poly1305_x86_64-elf.S":"d6aa65bcae2e7606a887a5775179a656a132d3328be94710cb1957d2c59bc102","pregenerated/chacha20_poly1305_x86_64-macosx.S":"9a3a78a2dee3968fc59747e2172259338ca044f062ce4d293d005ea5e990006d","pregenerated/chacha20_poly1305_x86_64-nasm.o":"e9c909c2d386f013b3d0a20988f4fd4e54ff9691e077fd183b65c979c08c7845","pregenerated/ghash-armv4-linux32.S":"f72d5ed518d56825364d4cc8d0a7b1a0d1feafdc22b4be208a247c0ec5bdb8c7","pregenerated/ghash-neon-armv8-ios64.S":"7990d52acd7ac5820ad504956f66e8efd68780d32beedeadf5013f67ea08ecd2","pregenerated/ghash-neon-armv8-linux64.S":"b84baecefd7f410c1e80af8d50b2cdd2a3710aa99cfb6dba9a0ec5a886b5bf81","pregenerated/ghash-neon-armv8-win64.S":"ea6630da9993f4d04bd0cdbfdc83dcce6557d6d09ab8b0546f035dbd76136f1c","pregenerated/ghash-x86-elf.S":"41bb10b7eb7adc20426b81b6d134b0870ad21795753628434e8d781200041304","pregenerated/ghash-x86-win32n.o":"db1d98a62a796371112c2a49753c35bf86060b9d569b21bf7d079c04f600d953","pregenerated/ghash-x86_64-elf.S":"095d8c47cc8610903a92bc15f9e6ed92aba6253c53ea22d689e1aa7e114ba96a","pregenerated/ghash-x86_64-macosx.S":"3443ee059661b4e7c19bad4cc487beb4da037588c165ad6fb5e21ca60d1777f3","pregenerated/ghash-x86_64-nasm.o":"8b520647268cc569c64fbf581d418137a2a76a6ff97a6277338b1b5539d78fbc","pregenerated/ghashv8-armx-ios64.S":"61ecfc6b33958fd61da895977beb6f6a08155e7d6ff1c498ab1dde7ef62510a2","pregenerated/ghashv8-armx-linux32.S":"948902d7cfe96268391b609fb3f07b95f3268c85ab7a5cc1e59cec3984481f6c","pregenerated/ghashv8-armx-linux64.S":"defdc3306c8a554ccce8ee63054fe6f1f88a8ebb045f85c491f5901ab3316b76","pregenerated/ghashv8-armx-win64.S":"beb39a157b869a50cf6af5cbe7d1a008c4793e6a46d2ec06ee18693a548cdf27","pregenerated/p256-armv8-asm-ios64.S":"ca1e3669a138784e246cb780957135c1502aab8df848804735eb482c10f740d0","pregenerated/p256-armv8-asm-linux64.S":"aa2f157d9337459fad2395c57dd5afe04230d7882d4974c80eefa7648ff9fa69","pregenerated/p256-armv8-asm-win64.S":"66475c0cca3a6e13ce6ec10e296e7f3640d96b7a2a486c5c8e4418a1215b8dee","pregenerated/p256-x86_64-asm-elf.S":"720368a2a6c856ca301326792eac619f668bff053cd09af91f995a96f9bd7f32","pregenerated/p256-x86_64-asm-macosx.S":"c24801a2bea4ba1293ee4769f923ab260c1dfcfc94c9a4cc70b53753cfb8a84d","pregenerated/p256-x86_64-asm-nasm.o":"39ec5a25ee084be38a0affe2a12bee191c254edbb1fe9b4b54590874932c94c3","pregenerated/sha256-armv4-linux32.S":"94ec5939fc8e5531704443975a878b75adb43301b1c45ea5db373059a6957251","pregenerated/sha256-armv8-ios64.S":"f03877b80a77f8f41d096414dfa2f1bbb3686bcf312752d968d559945416e661","pregenerated/sha256-armv8-linux64.S":"59720008497bf51f874b47799d3fc7c69e30deab6b8a1a6880c7214bd5aabb57","pregenerated/sha256-armv8-win64.S":"1c82ed2eab9ab1a533ee4f403de8f4215d33df0609f9ea28a4a1db1eac69ec2c","pregenerated/sha256-x86_64-elf.S":"e720874171489e54f9302a5617e5964cdf616a2b742b8101595fe5fc5d0e4995","pregenerated/sha256-x86_64-macosx.S":"db6351feec7a251607b4457b0124f2a6f8a9b061cd8814e0d8fb37963b2c6db9","pregenerated/sha256-x86_64-nasm.o":"c9393dea455d235399538b62cc8b1975914e15e63adaba2cc10c89d41a89388b","pregenerated/sha512-armv4-linux32.S":"2eed7f4d0c0eb3bcf7cc8e3af84ef7226d8746c66554bce1afa5c908e850c9ad","pregenerated/sha512-armv8-ios64.S":"07a33df3c09494c1522eedff1b84b56215f256425991cc73e3f2228f2e3c929b","pregenerated/sha512-armv8-linux64.S":"cf9c244e5daabec302f72770b95ff0e7196bb126f178a5145a97af79c2d45c57","pregenerated/sha512-armv8-win64.S":"c4f9ee35cf9eb78a6c55c021ca03e7f798b59cff9e3428defa38afa121ceb628","pregenerated/sha512-x86_64-elf.S":"2a23e4dfc497771011e142867b26f89fb51eb390f8d0e17d13cc844406872c2b","pregenerated/sha512-x86_64-macosx.S":"90baecf94f1e59304b509f438b383edab3a3ff6f3d8e3df8917babec9ed1b3e8","pregenerated/sha512-x86_64-nasm.o":"2d497c5e3991afb6b1a7f5bd44db75c0b39ea6dd342d2635d2d41f89fc139350","pregenerated/tmp/aesni-gcm-x86_64-nasm.asm":"69919ea8b12cb1616af08fd066272d5448b03806c2045a25108eebe7c8c0da5b","pregenerated/tmp/aesni-x86-win32n.asm":"43dc9537a28572cd2e8f787ff50aa22b1f21159aeb86f676d8c5bc815280c2b7","pregenerated/tmp/aesni-x86_64-nasm.asm":"0a193a39fbd93a4102887219439f9f073a1d77de70538164047edb029ed47579","pregenerated/tmp/chacha-x86-win32n.asm":"78420b4cc2e61a8c43c51b545fb9eaa5c7f1a12f571a90522875ec4c6d25ca88","pregenerated/tmp/chacha-x86_64-nasm.asm":"9605470406fbe81d49b690543185cca03cddd01bf25e08304ba5c0832ec9ab85","pregenerated/tmp/chacha20_poly1305_x86_64-nasm.asm":"366dc872069cc9f298ddca13c31d9b5c0ace30b2366a359478bcc989cc885991","pregenerated/tmp/ghash-x86-win32n.asm":"e4cafe53e83f3c7a25de591b5e2f91f82daa85aea3d106c154a077f594bb2b22","pregenerated/tmp/ghash-x86_64-nasm.asm":"293ffd2041fa9a686e480eae0c14854de26018cb4969fbf0ecf2612263d8b528","pregenerated/tmp/p256-x86_64-asm-nasm.asm":"d50eb8826e0782e21090c11ded95e3cf02f879bb0c2e3698e2f8e9b8e868b23f","pregenerated/tmp/ring_core_generated/prefix_symbols_asm.h":"a886bb6d29a7088e60d5fbbdebab8a75c39da429d2bab7d234d3a81c660142d1","pregenerated/tmp/ring_core_generated/prefix_symbols_nasm.inc":"e22be2805073f5bd2e4bf7204e03ea4ba581f79d06ccb6445ddfd2cecf79951d","pregenerated/tmp/sha256-x86_64-nasm.asm":"c6a82d9811d83c7d363fa2176c4ec18f7c5dde0dc1ae4324de06397ec9640a71","pregenerated/tmp/sha512-x86_64-nasm.asm":"f3d7354dee875e4b963569a4afa9239083dd1a3ddc40a9594cfb6f00cd072a3a","pregenerated/tmp/vpaes-x86-win32n.asm":"74abc1caf6a1559e1e7c34867b39e222fbb734d90a7f78cf670480b84aec51fc","pregenerated/tmp/vpaes-x86_64-nasm.asm":"cde1f163e144d945d88d7d722802973dc9550dc9c5c0c833d97cfd4814e65a0b","pregenerated/tmp/x86-mont-win32n.asm":"17f7fe749b903ab5eed4341173a4b184eddcc281c1b6dc3ec8653ea58ae3ea77","pregenerated/tmp/x86_64-mont-nasm.asm":"5a7f2b783a9b190001b3c78eeb1a3c9b4cfad3375b2cce34cc53cc93b0273bbc","pregenerated/tmp/x86_64-mont5-nasm.asm":"eb7d714adaab572d151a43d34f6b0c1a5c0c76ecff54ef2ded09dbbfda16db2d","pregenerated/vpaes-armv7-linux32.S":"df7c10eaafaf25ca05a096f0f411e4ed7ff4d6c03e468460eeccf6d7f19b612e","pregenerated/vpaes-armv8-ios64.S":"2b0df3497817e3928ca583f33d593be59c20a7ec6716ce6bf4bd08fe2eb01fd3","pregenerated/vpaes-armv8-linux64.S":"7440b07c5f97283b3ee367cff763cfddb7eb4bb73a9957e1627f8c19bcb5c7f4","pregenerated/vpaes-armv8-win64.S":"751b10e1ff5af08d9bdd8334636c66a6172d8c69125ceb9c18c6d3f36bf5b73e","pregenerated/vpaes-x86-elf.S":"8cae8eb8601fbf51ab9c65ce102c405fe8c34e0007274e492144587df8914b1b","pregenerated/vpaes-x86-win32n.o":"87106b5a0572be64b9e35a98963e7fb07b4bf5884bb5c1c53b50111641c3c52d","pregenerated/vpaes-x86_64-elf.S":"0dad8a208d46cefe3577691e01793522cfe6a864795ead091211eedb6b54fe9e","pregenerated/vpaes-x86_64-macosx.S":"e9abb999570841997580cdf9124f38a01c65d4653c26f1c41cd8a2a7d093b90d","pregenerated/vpaes-x86_64-nasm.o":"e7acb9b2f39dc9d103f4a53298adb95b967662742fdb30bd6601fcbf8e97280c","pregenerated/x86-mont-elf.S":"1fb95d2a8679ee92938f226d03f42396cead7e6223c6e875aa7cc516707bb2e7","pregenerated/x86-mont-win32n.o":"b9ecc95ad20ee7fff84343cd1279864fc738a86586d08f9aa86d51de9266d65c","pregenerated/x86_64-mont-elf.S":"98b547c41f73fdfdfda028b97bc6c53e024f01e1ace0dd08f718467a3d94b0c8","pregenerated/x86_64-mont-macosx.S":"5cf3a09f59a186a70fe630084e9f6e15e3ae1874eb00a03c06bf52cc0f8debad","pregenerated/x86_64-mont-nasm.o":"ae47bc95d086b40e21d5095b32c17e5579b7fd0d201820d34695c5f338d7c922","pregenerated/x86_64-mont5-elf.S":"e21d5bffd6d44874430ac17ff52a97b1d175b938cb677ac7dc4020181fca5749","pregenerated/x86_64-mont5-macosx.S":"9e92c1a5c8a3b4dbb72168a3b884c9dbbab50d4ffc6a6b10fd6db01eae7b5f14","pregenerated/x86_64-mont5-nasm.o":"fa55f92cb2f7496c063ed3bce4789617fb74ce217d5090538556161edad17bba","ring_core_generated/prefix_symbols.h":"25d42499182f38310acfae870f0531c48994e00150fba39f52dbae1537fcbaf6","ring_core_generated/prefix_symbols_asm.h":"46c7f29c240e19460771585c750081c16ffe6f392dccad6b35d0c473b6555dbb","ring_core_generated/prefix_symbols_nasm.inc":"f80d63dfadb79ed30bdf47e8c25bd26d8deb6e5801887c7811ec1c2b7b910c18","src/aead.rs":"e7ab8c5e6f221560bd7cc50503a1ad4061ea2dc5ee66f1aea82ee9a804ac00bf","src/aead/aes.rs":"cdc3dd2e99d22d0a999a2c81f6e9fe131c996584141c55417e0716a61704b58f","src/aead/aes_gcm.rs":"08ed15c3eacab1c06e71c4228f858cdbfb6cc77d48450a5d5d891cdfb7f35664","src/aead/aes_tests.txt":"a74925b842fd8ac5c0e6b65a5b153e7d2292a8b7242d7b7c6c7a83d9ed48182d","src/aead/block.rs":"5c60963432c6d610aa2c298ad5560dc6f3c7a43f5dc5048fbf4b7b0ec9ea9db0","src/aead/chacha.rs":"29de938b4256f0d10097f4a58baaa3f31e9b83e36d8544438eb8e2cfc297f2c4","src/aead/chacha/fallback.rs":"fb4eb78616d4c60bfcdcdad937eefa5c74ac18bbb36121f832ada3529b25b23b","src/aead/chacha20_poly1305.rs":"7a6e565a28bb6b8d174c3a4c08c440a9dc3da55461604f3871e09cae6d51bf84","src/aead/chacha20_poly1305_openssh.rs":"0c52e7b84a6079c5433b3783161d264e1327b858ec5eae51dec163c09427f8ea","src/aead/chacha_tests.txt":"c862c7e46a7c8fd1a9cf3959f6dd5202fbd63b8eea5744ea49ae29b0b8654ea8","src/aead/gcm.rs":"3e32c28889e5cdf22f5234ebc738213d5e98735ccf90217a74ba742eec4e6ba3","src/aead/gcm/gcm_nohw.rs":"8e1e495520d8f95a9ca2a711ba83404d06d2035f76bc96604da066195100ce00","src/aead/less_safe_key.rs":"493cd41ed33c78a67f00d03c3bb520d80f23e8b912f63a7dd8b74a21db28fd0f","src/aead/nonce.rs":"c02c9fe8e9821cf7355207f22e2d0b37993435ff41afd3def709970d256cfb36","src/aead/opening_key.rs":"94f8a639af80f20f1c6e719d880dffdd03ee4c146b27be10f37299646fad0a64","src/aead/poly1305.rs":"984f0cb6b3386c0f809b34c1f4fd295dccec20edc572eb1a16de60030c526219","src/aead/poly1305_test.txt":"9b2738c12bc3710e72c1e8f54b3cebc752adf795d8745e953a11e4e93850faae","src/aead/quic.rs":"911db775b518beeef83d5b883c099fb4c0c25394e71654d2cb8f96bb889c755c","src/aead/sealing_key.rs":"0e3207d79ce6e50f11e4d46b8bc50885f29cb08cf6732d87f998398b8b99f74d","src/aead/shift.rs":"83250b7552ec80e744c011e84ab9ce85f3a1fd6c7237852445b5bf6ee74b9f35","src/aead/unbound_key.rs":"57b67b77852b05c835394d259134f93c5a7de1ca207f0a05f57ee43cf1abc8da","src/agreement.rs":"d30a6f0e30ed8a954ccec39e50185d61f1b15cb0a337e7ad0dd19d8d2c8b1f36","src/arithmetic.rs":"28013a244c4d714b1890e02f544f8ce8710ebabafe5165bb1e2afac710f19230","src/arithmetic/bigint.rs":"d34aa503d229f0e6a0997c8a35954fa277428a2e32c4b33ac7be4657934db055","src/arithmetic/bigint/boxed_limbs.rs":"45c75b17d2d03d59336c280a8cc07eb9a13e51c57ee0864a3db7c2addd6c26b2","src/arithmetic/bigint/modulus.rs":"d3ee776c815635f5f56bd2d743b9c4cd3394e812b15aa29ac62bd0631bd19058","src/arithmetic/bigint/private_exponent.rs":"2413370c66f585bdd9c0928eded018ddd448255c99d847332ae3e230eb4aa89c","src/arithmetic/bigint_elem_exp_vartime_tests.txt":"3c2b56931d5dbb868f8343645fce2dbe7a966d824df5c9a07fcf1a166ae0b1c6","src/arithmetic/bigint_elem_reduced_once_tests.txt":"2a6a92671f91d372a07f90411cbcfbc66eaf6a34cf55208ef46a075492a325ab","src/arithmetic/bigint_elem_reduced_tests.txt":"2852d071315b641b63781fc193c705a9d040ced0e9e6eea87becc6c094f8843f","src/arithmetic/bigint_elem_squared_tests.txt":"4b7b93ee3e836bb16f7af91b74aa2045617c5613dadf3c3944f5194d67c4ce96","src/arithmetic/constant.rs":"77f2d1209d301290b87a434057083bfcced6dee4e1235e3d867e205ce88e9f3b","src/arithmetic/montgomery.rs":"2ef692d996e2c71b392dab73f83a7900825f769df27375d3c03bec1d57cec0dc","src/arithmetic/n0.rs":"dd793811593247da10002873f4ca5d954529f8dbf3ee716b87454fbfee9efe75","src/arithmetic/nonnegative.rs":"8dbe51ed03728cb32d9a61132f1e9676021fb2fd5ded19d9a476e2608d1e2e01","src/bits.rs":"1b7de3474880a285e5c2aef7074ea4d7e19c61d7dd5bfd9a9198101012957ab0","src/bssl.rs":"018ae96e68f901052589ed0d8453d247f16cce64ac90693e158cde91d19599f9","src/c.rs":"da9b37dc7c6ff3c9351decfb6941067a07437c4be522137815e6d8463b45cfdf","src/constant_time.rs":"9c499e2acc21a50bcfa76c71045ead0b9dc4c2febf908ba5c01914d2d21221d9","src/cpu.rs":"64e861ffece339f578393cac5aaa5fa14dbc3a35d2f120ded1e7bac3cc4fd531","src/cpu/arm.rs":"49e2308823da4b8097a6c6c069c9756cfb96dc3833d28494fca553eca8e319e0","src/cpu/intel.rs":"9f5e2a2e3e24e0542a8207659adf590f20b6207c0d12286ae32f0718aff43694","src/data/alg-rsa-encryption.der":"09c2e14354a83703ce5e8aedf311fcaa3704fb7a86a64d05a57dcff93849848e","src/debug.rs":"55c6bca18e85195284175d06c51fa47577c29920fd3b0dabc8c1ab2149b5c65d","src/digest.rs":"d85c5ff89ebcb7739dd648211c9fcb9bdac14086158e262d0072c0a97aaa9773","src/digest/sha1.rs":"148fe21153339a5ded6518167d4f3d78bb73146a348093c3c79ec8b648528338","src/digest/sha2.rs":"5ddca5851e0b0227840bec733e857b270870e888723d35c4d48127b934064f92","src/ec.rs":"698094e0af12a4b2889418fe642d4d3e508cf163ac124cb36ea0f614f29485f1","src/ec/curve25519.rs":"526b3870a6e13c6176bb82b9c2ba22bc4ff0a90bb5dab18d3b0064bf99322925","src/ec/curve25519/ed25519.rs":"7315176db6226648d0af31da3b54b9b381926d51dc6fde8d10d0c1fb9f2929d1","src/ec/curve25519/ed25519/ed25519_pkcs8_v2_template.der":"829aed070233fbd8e5ec80d9eb6c08b76fee8e3d1742ef6c8756153b9b5a6ef2","src/ec/curve25519/ed25519/signing.rs":"10c27c9fc1acadacdf2c37a50ba06bee53ca0695ae1add47897283b57fe4422b","src/ec/curve25519/ed25519/verification.rs":"9102a71098787c5762469951c57a1be8170017269a799467d997450997ed5563","src/ec/curve25519/ops.rs":"cc22ebeae654d37c8687d0335bea96905a2f18aba14d72b9d762b6cf2935e891","src/ec/curve25519/scalar.rs":"506248578d46df3881631d144c40423b13315c0a1591d6fb239abb0448030d14","src/ec/curve25519/x25519.rs":"51f5333ef49e1f118a90bef61ae8be25427be6018ea69d94ab2cdcccd36e898c","src/ec/keys.rs":"6e6546e5ff66622d07e8f21f350adbcb9e3b9894bddfae88495b4f19643f4c08","src/ec/suite_b.rs":"e4fe10a69f76fc57500a21e3d08d19132a8036badcb3ee07b28d43c13ebc36b0","src/ec/suite_b/curve.rs":"d91c344a015776414bc4826ad952a9108a94ab39c3d2bd0b3b2a13dd1f404ba2","src/ec/suite_b/ecdh.rs":"2e782375e4b3b7937b1860fbcd1b71cc328235bac688f97976a54e382f4b6a99","src/ec/suite_b/ecdsa.rs":"03e62a33cef8516c76efc2296a4e34b10b57413db77755b20a7f487868496937","src/ec/suite_b/ecdsa/digest_scalar.rs":"1a1c224387f37a84e51d40e648bdb5759a3dd622b5038847ff51241385eb84f4","src/ec/suite_b/ecdsa/ecPublicKey_p256_pkcs8_v1_template.der":"2fbfccae7d03b3b088170a5d433b9192b1a3345f614534a14ce2ad6ee0fb65b7","src/ec/suite_b/ecdsa/ecPublicKey_p384_pkcs8_v1_template.der":"7b5c1a09f24e65cd8c9cfc31a9618d93293764d4817a2879c37a8a1c311d5acf","src/ec/suite_b/ecdsa/ecdsa_digest_scalar_tests.txt":"ccd95b835c5bf410db5fb2e16e4dce2c1d377ceab7cfc9345e0bdbf4fdb37f05","src/ec/suite_b/ecdsa/ecdsa_sign_asn1_tests.txt":"743707b29c98468e43877860154da5a0a5f35ec080ec4e56c218d0a037748fd2","src/ec/suite_b/ecdsa/ecdsa_sign_fixed_tests.txt":"9c023664ed4a9416186f93654720ee97e89271191d97679caba0eea0d1dbd6f2","src/ec/suite_b/ecdsa/signing.rs":"8f71f0269f206323e592cd466954230b9aa1bbedd50e096bfd2152c33569c7fd","src/ec/suite_b/ecdsa/verification.rs":"0006716d7e1c8d677ce921ef9046022c9fc6818c7a2b5aea20f8850eec11373a","src/ec/suite_b/ops.rs":"5b7e7ade81a232493959ae27bdc635e53802e36cdf241f52c8c003c7ab04a7e3","src/ec/suite_b/ops/elem.rs":"99de9f51244b15109cc793b8992879e5ce80ee3e0d6377b6692cd27fc7fb3c92","src/ec/suite_b/ops/p256.rs":"8a8ed4080e11fb3df47313c36087ba39fea560938a54bf9f84d8b48b5f7536e8","src/ec/suite_b/ops/p256_elem_mul_tests.txt":"506e0bdb96904d8c515af72c59e79744bb1b121ba39883110d0a2c1eed62e9b8","src/ec/suite_b/ops/p256_elem_neg_tests.txt":"4301276289fc7a251b28511c9b91fe9e9ad82697639842f1bc74cac2566f2bab","src/ec/suite_b/ops/p256_elem_sum_tests.txt":"d9d6da4a4e1063df94092e3360798e3d75fc875b533d3c9021780110e6a7b925","src/ec/suite_b/ops/p256_point_double_tests.txt":"daf974e40d7dcef4bf09082b66b8deda4725aa6faf931efd38113232102fc6db","src/ec/suite_b/ops/p256_point_mul_base_tests.txt":"a5e3f9c7c617d05bbcd1f0cf6ac0eb65554cf77a4a60db15716a3f2c683e23c5","src/ec/suite_b/ops/p256_point_mul_serialized_tests.txt":"ee34a8fa42f61ecd203f4a4f1d36a25cbbf38a3477d27b8c8867eeff59d0c9ce","src/ec/suite_b/ops/p256_point_mul_tests.txt":"c2c5f0ddea40b16d927a5fabb7b448e75489c6b0abf95193f94cc35af3028307","src/ec/suite_b/ops/p256_point_sum_mixed_tests.txt":"d21b8f259cb7311916cfe198c68e012c1ea4c395cfd386619b4ad15cab0ea0c8","src/ec/suite_b/ops/p256_point_sum_tests.txt":"d4825a59a5cf44762d5270cab64649cb73c749bfffb6562acecb19ca91a7260f","src/ec/suite_b/ops/p256_scalar_mul_tests.txt":"8e289e0afe4d3c3b82cde5e518b680e28e6f1bfd432ac6ee0e674831048425a9","src/ec/suite_b/ops/p256_scalar_square_tests.txt":"aa8a450b9726ec8e9065c00aefb59c4a2e9cc82eafb8a60e14d30198846c05d5","src/ec/suite_b/ops/p384.rs":"8a739e3bc15216e566ea48f56c049351e334fb78ef4f026d3fead3c9df698cc5","src/ec/suite_b/ops/p384_elem_div_by_2_tests.txt":"7592ba70eb6fe146b19c47307c709a5aa03db36488679baef3a3536ba6ecd1f8","src/ec/suite_b/ops/p384_elem_mul_tests.txt":"5976c35dac4264e508c6bf2d6b6101c4c086caafbd883efe6dbf51e73f64f414","src/ec/suite_b/ops/p384_elem_neg_tests.txt":"ee5774efcc62a8de725797d38b744f64cac8b5166f169e45ea449b72695ed8af","src/ec/suite_b/ops/p384_elem_sum_tests.txt":"f0e9c52ee5b0527c5fe002182d2fa25936dab10544aee050f3a8cc30cc82cd5a","src/ec/suite_b/ops/p384_point_double_tests.txt":"a54d83bd4be1b621cd7ce86609302fc187a25cecce5b84c79eed44ab9286250a","src/ec/suite_b/ops/p384_point_mul_base_tests.txt":"e58eff0f20bbadc9ac71bd31d8f3e1947121c71ba03abe832f5b85201c7e0859","src/ec/suite_b/ops/p384_point_mul_tests.txt":"bb1a3fa122f71b81566d5feaaa56cda2fcb9f08467efe998c9c2cd3f7e670790","src/ec/suite_b/ops/p384_point_sum_tests.txt":"c451ccc839b022dcbb06bf97f23e91cee306adc747ae675a4eea71cf3d09696a","src/ec/suite_b/ops/p384_scalar_mul_tests.txt":"25a7dd3d6e8db83bd7158d90f07eb34fcc3fe89f976f48503872e5a8eb99fd85","src/ec/suite_b/private_key.rs":"5acd9cb7532f5f3baaf6d5d7a836a16813f0c8c89722844f0b05c50db66c798c","src/ec/suite_b/public_key.rs":"b0ab1542075fc91d4ab8de48fa35c3b748b31579e687943c544f2a71eabc4203","src/ec/suite_b/suite_b_public_key_tests.txt":"ee3ebae764b975b80e31f6fec3f1c0514ba0f50e4bb05ae9dc7d5ea51272e268","src/endian.rs":"e78027d3723b51f24692825ad51f52a08b2e4ebdb5075a5aa032e92667c500b6","src/error.rs":"b2f621d44f8ccd7882a56d4c122e28ac96b6bb0e6c2dd8b222786591bfe631be","src/hkdf.rs":"3995d694e02b8d04e083110de17aa8d2e061431cd5875887c0068bd05de69868","src/hmac.rs":"dad00547542fb4a477ceec89652a4c67dd13e766b0a4f686cd134649295b8cd7","src/hmac_generate_serializable_tests.txt":"fa1ae4388774c27b92f948092d820344062a55d4f1efcacf63496e8941a213e4","src/io.rs":"b26604c42c215fbfead69c5a2adc8408d7888414aba100f1f3259ba26bd112e4","src/io/der.rs":"d589d02d9a2a22599cd2b2eb2b7c62cff97063b6b1a39d7ecf9c5706060cd78d","src/io/der_writer.rs":"de21b634b9e4d43ef7acc3636a643c73c15eb22e50047e87c2ff49a65a2b0203","src/io/positive.rs":"b6a0db00973e6a247beb9bb8465c621a989096fec42afc0a5517fd227044e453","src/io/writer.rs":"f17e3fdd9a94a511b184b9c18f18ab80184f7523f77a39ac1bbdfb15e9a84bbc","src/lib.rs":"db9bd06f665071f0fe3fd5400edebd4acfeb8e9588855c6b1b2f9d4ad3314a01","src/limb.rs":"c14a5f5daf960608706751b930e39aac3b91630f390d03cbb0230bdf3c7871e7","src/pbkdf2.rs":"d8bc1763a27ce8680cd962947a2963f3126108bfc4bea76123721e280aa2b46b","src/pkcs8.rs":"1dfad6326e014f9b46db92fd5d8cb66e5d82af080e7fcd30593393b08f0400ac","src/polyfill.rs":"c6caa96d78fe2d9b0e6cbb802781b9fffd5e2378a16b1c84fc85dbe70f393e80","src/polyfill/array_flat_map.rs":"feb5d33833efe914d3befe7ded115edeb3f3f66f28cedcb745651757fdee72cf","src/polyfill/chunks_fixed.rs":"df3e20d51a0872ecb639a3c497c493c013da465efb61853f0db44dda890dd1d1","src/polyfill/leading_zeros_skipped.rs":"d5b1a9789a936ee34316fd463d7b11e8489d5e3bb7ee7e07e3877008cdc71558","src/polyfill/test.rs":"cc9aa7ae7eb6083c83a98a33123f90cb3ec023b5d80e9df08c4412fbe4139982","src/polyfill/unwrap_const.rs":"01ff27349b1fb9f22324d1dc596926c12ba23fcf7389ed7d6c71f14946f561c4","src/prefixed.rs":"c4baec131ca5569b965ae9357f82b0f008bb02da6344a00f318779ebe84dcb79","src/rand.rs":"d9de5d37c4985173aa78959cd06475ceadb6c77dd284ea9a83f89c3b386691d4","src/rsa.rs":"f8d3abf271aa9b75b7ce2c0c2567a91d1640e10281b86ed2a7f8fbc7a5a1d207","src/rsa/keypair.rs":"1cd5dbc9a7946fedf453146abc7384d9a97833f01b899134406a1bd32c2c5e2e","src/rsa/keypair_components.rs":"b6bb3e8cc48a152d70f59de5d8298e4ecc3b6dce51291eac285f7802ee30ca45","src/rsa/padding.rs":"a065ed746a4cbd0d1acba19b8685ff41d6ddaae62df61f0a91fe943bdce3135c","src/rsa/padding/pkcs1.rs":"357b346d095e4921b8491d2a1f4590c0c1a898460ebd84987ca0fb8168fd9fc8","src/rsa/padding/pss.rs":"dbf828cba0785ae224c4d6692d11adaf12fb7864d17334f6362d8c42e8f448d7","src/rsa/public_exponent.rs":"301976256ae1e14f62f0e2258cf04fa5ab1c18702cb13070e853b9853f3d7f70","src/rsa/public_key.rs":"057f15679b02326ba42a8b9b1048939898d818332d4815a2dbb58c12b859d242","src/rsa/public_key_components.rs":"646d5853c648f8708f1a00667b4421289463d7faeb850ee477cecd3e34b0db30","src/rsa/public_modulus.rs":"54dd806ce003722ff306995ab3ba6c620f327e8e3c746101e446a26b9ad1dc54","src/rsa/rsa_pss_padding_tests.txt":"a64094474a441012465a17c89db45421dd953ecebc2f8bbfbcc75c2afb4e3bf2","src/rsa/signature_rsa_example_private_key.der":"99edb08a0d633132592d236dd8cf27a96d03b3cb5a739bf38d4f215b6714ed18","src/rsa/signature_rsa_example_public_key.der":"602dd3d9b698e2648ea9da6a74dcebae374bcff33e63a4cb7d012a2410c3c015","src/rsa/verification.rs":"f84168bb4c60365919048372343e15a05f48ab3eccbe7f97a1f6a4c988272233","src/signature.rs":"d6a5a8bfd85071f2bf5611438faaea81a77073ab9a0e9ba23e05a0ee69f921db","src/test.rs":"4e3aa5efee8945926047bd50740ad64af4e677722113d1c692da2c8e5e241be3","src/test_1_syntax_error_tests.txt":"3ecdee10e5eb45f87f96fc3db987115c92c6aa2b362d4c9af6ad4ff86f787fb9","src/test_1_tests.txt":"231b2dc1527f8bd9b89a27474786252d2c7dcfcd89d424e153cf06f0533fc688","src/test_3_tests.txt":"3fc3b3c4a23f28f2a7a1082f67b2ffdec48b6adef5fe723238b5505d203a971a","tests/aead_aes_128_gcm_tests.txt":"351075f8427d1eb3d21681d378fd6421232c905626c02f8891c59fb3eac96727","tests/aead_aes_256_gcm_tests.txt":"55e5edd3d6980b5696ece825ef33caaade7efa39c13b437218543a50365322bd","tests/aead_chacha20_poly1305_openssh_tests.txt":"209d3b1b512b0e8cce2c8d05cd770c513b9a2c42ac3b718768aec2cf688e408e","tests/aead_chacha20_poly1305_tests.txt":"4622ca25937d2fac7070411ea8e30b83ebb6f23dfa7e99babd032bd84b807c29","tests/aead_tests.rs":"a529d783833e239d26649f932be8ded4f3ce709d812a0e891f0832c6312b72dc","tests/agreement_tests.rs":"1578c5e0a3bc6686a88d53ac4114a7f3257fc3a4913fbebe7dd3563ee2ad96a5","tests/agreement_tests.txt":"e8d90b167d03b9c0538bc856100bbf9bd1a653acb433e8197111f95fc48a602d","tests/constant_time_tests.rs":"b1d0511be43331b60c68ae972c9b48dce9ccf78cbe71327d5863e522c0203de7","tests/digest_tests.rs":"165017b2bb86297136b200c5ae6e49505eea3504da49a68f95a8edff99cd906d","tests/digest_tests.txt":"2e583df382b2f4a552f161852041c47f5dac222abbe8b823f155b34e810b9a76","tests/ecdsa_from_pkcs8_tests.txt":"cc7914e6da264a47723dff7834c0f52102e84ce35a5a8979f2436433071956d4","tests/ecdsa_test_private_key_p256.p8":"9426acca431bd887588a6f16b74b53d5cae792841b2c4bffeed58f8ef2452276","tests/ecdsa_test_public_key_p256.der":"aa3f70fe76d67a81a6a7d8d68adc21468fa8bbe983054f9b7ba5fe58da6980e4","tests/ecdsa_test_public_key_p256_debug.txt":"93326d98acea218576f7aec62bda471cad346ee9cd9d3f8651a060a9ae7f6251","tests/ecdsa_tests.rs":"2741331a8ed33fdd9ce3b754e360d43b7ec95bee3b2c12800f042a095c3673a1","tests/ecdsa_verify_asn1_tests.txt":"ab182130d2ab339c48bff56ea1e78d35aedb4f161085841917f2712643a322f7","tests/ecdsa_verify_fixed_tests.txt":"5fb5082dfcc11b2414b6c7e702ad2025ee1ec48bd562abc0fe91b03e30a53588","tests/ed25519_from_pkcs8_tests.txt":"f64f158cec635162ae8f1ef871bdbd63d5c2cf28d599177c862561e786021c1c","tests/ed25519_test_private_key.bin":"05ecb32435e3eb4dfe187786be6190a789fc89b690a134644743224ed40fa744","tests/ed25519_test_private_key.p8":"e85aa791586dcd9716b06dcea87235b9a414b452b8dedfc36f8ceac6f73f1f26","tests/ed25519_test_public_key.bin":"d5ad3a67d6f0b2513aec55c06da041f663c749d74ee298f546f074678be6a5c0","tests/ed25519_test_public_key.der":"8be9f74f8dccbfa700a8f7ef1e0a2a8d36820ac9712802dd3a5d9c57aebab1de","tests/ed25519_tests.rs":"0ed6f5ef4ad9b03aa0eabe7dfd81a736b3b05186db04c151e3e610d74fe19bd1","tests/ed25519_tests.txt":"acc9faec4ce9e23636eb646c646fb6165656e9ce9248b04514c70810af60ca78","tests/ed25519_verify_tests.txt":"92ed2f6838a034db2da4927c0476b522648462d8c2ef34a6f3efe3b45e5a9c99","tests/error_tests.rs":"43974816ccb135f3ba4cf2f17a5eb1ecb79b0c851581a09c102b86806221d047","tests/hkdf_tests.rs":"8beddebad946cbdfb789f177629a71d7f27679d9af0c680a144f82082f1eb5a5","tests/hkdf_tests.txt":"add79d91c995daf7308f8710e6504b1c476933e686b62bc0771b3c9a67eaeac4","tests/hmac_tests.rs":"54fb00890e7ab9d805537456d77eff2476c1e1f3d0f6be450648c88907370de6","tests/hmac_tests.txt":"ecfe7e6019812dc6c96a481e58f79a367635a906ce52bfc42e1725e1a9aa7fb0","tests/pbkdf2_tests.rs":"94a1b03a9841a18c35ec352894a5b466e8c0b6715d3c0223bbff221881170629","tests/pbkdf2_tests.txt":"4c2925750f500263a20ee56b0bbd9c06e7ee3d4853deb5b4ba35a78c9fb036cf","tests/quic_aes_128_tests.txt":"d229bb4ea6ab5f48360f117435ce2fbad042b8400d7f83cecb77c4f87660c0d2","tests/quic_aes_256_tests.txt":"13bedb2a4a333b47783046b573aea7ce9b4b01fc6d90a36609e890cd60a8de0d","tests/quic_chacha20_tests.txt":"fb95fd6664ca833875d129ab2bb0c6fb2631688911eab928dcbe9b5d04546e57","tests/quic_tests.rs":"2b18d63650f215e2b7819ba551c9e05d3d749ed2ed34df8d6bcc09b4a792c73d","tests/rand_tests.rs":"ec3478594d2642875e43e3e4ee64326d8529d8b01b48e501eb3da5f1b16d2c0c","tests/rsa_from_pkcs8_tests.txt":"195f0646e20c54f640798d1b776c7d0dba6fb2569ec32c6df5d11979771a0238","tests/rsa_pkcs1_sign_tests.txt":"6e0b52464253bcb2b5856477ca6ee03e70dc21ae05af8cf490c78a66c33c4eeb","tests/rsa_pkcs1_verify_tests.txt":"c562a894b0c35ba03abe929c44f8f01a5e3f8ee8f1861972b1b785912eff979f","tests/rsa_primitive_verify_tests.txt":"46af8c1052424f72e117298904bef114bd2764386af2df4bf77f20b3653c7043","tests/rsa_pss_sign_tests.txt":"c06f48a56a5307badabf7d7260745c2325b7649bf9b3fbb43c5f30b76fc1d605","tests/rsa_pss_verify_tests.txt":"720763006ab23ecbc9a133bcc380927e77b508ae6be054243e66bad184114363","tests/rsa_test_private_key_2048.p8":"3fb0ef9769108d42bb1710d1b407c2a325fe67dc3e63eb485776a99edd01546c","tests/rsa_test_public_key_2048.der":"c57d227ab8427b8b9cfc41307a584a773959b79a837a82dd52f227d8f3f97f2b","tests/rsa_test_public_key_2048_debug.txt":"ecac591e8d19f13bb8c2af94364da9ac2a68c706de5b15118093dff57463a441","tests/rsa_test_public_modulus.bin":"20135a01337d850581838936e951c7bb6f2b0c7f004c96b197db0a9a75fdbc44","tests/rsa_tests.rs":"6e8e4b7c132a6c18fd81b393ba8af22a816b981db1a1ae34a15fe7dbaca24624","tests/signature_tests.rs":"c8a6a8e7574a9d70aa5e7a4dedd903ce84b307524b3df2d3bfbc0ab741ae5682","third_party/NIST/SHAVS/SHA1LongMsg.rsp":"85a40ebc47d8ca913619c2b15de676b8028f03fd9aed84116cc1023210aa40dc","third_party/NIST/SHAVS/SHA1Monte.rsp":"c6b3423ff6ca199b93cff002958d7e5c37f9a3bf126a7284d40f9f91c50a97d4","third_party/NIST/SHAVS/SHA1ShortMsg.rsp":"febcd8773ae5a47694f68a6f588d14a1261c4b94f53122ef490c5b49bb525553","third_party/NIST/SHAVS/SHA224LongMsg.rsp":"468d940ad14f9be755341ec9a20c4bab1951cd770294406a7f7de9a9754068f0","third_party/NIST/SHAVS/SHA224Monte.rsp":"0bda5e571e5f12843382d5f9f51cec156c58eb61dd023a1473bb23a55575ba8f","third_party/NIST/SHAVS/SHA224ShortMsg.rsp":"cfc23bc09922e846c0e63cad2dac76a1583b8a20729d23cf4385f8d4394d424a","third_party/NIST/SHAVS/SHA256LongMsg.rsp":"f3312732aa22587da2ee354b44a8c0e2246135484442e6c81b6a478dc4bc7c37","third_party/NIST/SHAVS/SHA256Monte.rsp":"5c90aac35f309fd243587180fe26ed5f08f2c8a1dc56cca808949feba5f0c17b","third_party/NIST/SHAVS/SHA256ShortMsg.rsp":"182ed2d20a3dc717d35df089a7cbd613bfca8de2c3fe60530eea9b751bdfe5a4","third_party/NIST/SHAVS/SHA384LongMsg.rsp":"9ba4ed7586c3195fbda4e9c5e3288e8840cc5f04bb6fcc22862eb226efc054b8","third_party/NIST/SHAVS/SHA384Monte.rsp":"3086e17251383b89a45891ec2037c83e6bbdff25d4695ae8d67dfe24a6bd7364","third_party/NIST/SHAVS/SHA384ShortMsg.rsp":"afb8d74a7ed8b335c77124191eac7b3c25d448c12f1e3bc038797e5711fce27e","third_party/NIST/SHAVS/SHA512LongMsg.rsp":"0fae88d811c4ac42a0b4c3694b430cb63faa25d1d8ec55b85b6d313dd7e13430","third_party/NIST/SHAVS/SHA512Monte.rsp":"db6b5fc2eab66129f5528328bb890eec59a981bb093f526095e606f308b37f5a","third_party/NIST/SHAVS/SHA512ShortMsg.rsp":"2bcff98ffea78fd0aad601236f7b9654a72c080fdddfc81b7bf310a3116d2a7f","third_party/fiat/LICENSE":"a76af0ae37c0dc7a1d24edf21c81ad6b78876349eed250c41bb9a64825a97216","third_party/fiat/asm/fiat_curve25519_adx_mul.S":"5fc1c4bf4a58c0d30f1385ac8df51dddd5851a4f13f210173db9b05f044396c2","third_party/fiat/asm/fiat_curve25519_adx_square.S":"9ee9eb1cad78f2fe8ad8e94bbd52b31d2842aa093b3536caf8c1a29a51f63ff7","third_party/fiat/curve25519_32.h":"4bc636fa128f6f537aadc473c40c39bf251b0be435a6fa881efb84c2fd6675a9","third_party/fiat/curve25519_64.h":"cb0c26c8fc2dc48353c29db21e559e6d4ae5e2a933ed57651ed0e5c8f5084238","third_party/fiat/curve25519_64_adx.h":"163f2c77f27a00ff6666afd68a0f509a1e5ef0daf6c2fb52060062f62c732f0e","third_party/fiat/curve25519_64_msvc.h":"13d44788a5284062286969e61d3b7232093ac2f2397c4553e0d51ef83f75aadb","third_party/fiat/p256_32.h":"bf562b4db55564adc5f14f4dcab0febeb1e7afd4297bf3cf746414c8114dab9a","third_party/fiat/p256_64.h":"ac4e9337bf5c3a1e5201deff6ad9c9056fc2d45cfd8f9a427bf51181ceb6ab41","third_party/fiat/p256_64_msvc.h":"9a5c60f18267fb139f1433cffbea98a74382a7931d815d6449cb8a6fa74669f6"}}
\ No newline at end of file
diff --git a/crates/ring/TEST_MAPPING b/crates/ring/TEST_MAPPING
index d53283e..301553f 100644
--- a/crates/ring/TEST_MAPPING
+++ b/crates/ring/TEST_MAPPING
@@ -1,34 +1,15 @@
-// Generated by update_crate_tests.py for tests that depend on this crate.
 {
   "imports": [
     {
-      "path": "external/rust/crates/quiche"
+      "path": "external/rust/android-crates-io/crates/quiche"
     },
     {
-      "path": "external/rust/crates/webpki"
+      "path": "external/rust/android-crates-io/crates/webpki"
     },
     {
       "path": "packages/modules/DnsResolver"
     }
   ],
-  "postsubmit": [
-    {
-      "name": "ring_test_src_lib",
-      "options": [
-        {
-          "test-timeout": "100000"
-        }
-      ]
-    },
-    {
-      "name": "ring_test_tests_digest_tests",
-      "options": [
-        {
-          "test-timeout": "600000"
-        }
-      ]
-    }
-  ],
   "presubmit": [
     {
       "name": "ring_test_tests_aead_tests"
@@ -104,5 +85,16 @@
     {
       "name": "ring_test_tests_signature_tests"
     }
+  ],
+  "postsubmit": [
+    {
+      "name": "ring_test_src_lib"
+    },
+    {
+      "name": "ring_test_tests_digest_tests"
+    },
+    {
+      "name": "ring_test_tests_error_tests"
+    }
   ]
 }
diff --git a/crates/tracing-core/.android-checksum.json b/crates/tracing-core/.android-checksum.json
index 1c7c51e..6229911 100644
--- a/crates/tracing-core/.android-checksum.json
+++ b/crates/tracing-core/.android-checksum.json
@@ -1 +1 @@
-{"package":null,"files":{".cargo-checksum.json":"33bef475fcd2aff93d3a734a76c46287f2c2c2794c2b44eee92c59dec7640089","Android.bp":"c5f1955c1b1ecad79608d1eac34d091996762561bba28000d13fcfd2541f913a","CHANGELOG.md":"c542c47dcdce0f2ae1f0704f7248a8667f529f738bb507a4d9ba53ed4df87e4a","Cargo.toml":"fe6f275a57654dba28b6200cc23241211046f44ebd061ae3d8a97038e02e0da5","LICENSE":"81b5afff24bf73e7d6660ff9e03a493ba57f494dad837134a654b3945a3199d7","METADATA":"142f0858ebd6777ec2dbade702de005c8c7c757ac8840f8c1100675c115c60e9","MODULE_LICENSE_MIT":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"bda66c2feeee6c4926ac25c50703674504ed3f937e6c6e5f249304c67bab3511","TEST_MAPPING":"704033c7d7f45c6a99e2cf1a1115c0c333e2603b7220f483bdb179d40f5d2980","cargo_embargo.json":"4ddd8358d79bc3ec472e58f0e295a8006b443eb4db00a52da3afafbc7cc5bd11","src/callsite.rs":"7eee7d857cf8365307c3c510cf03b5be867ccf7fd394c72dea388e2d8c2e06f7","src/dispatcher.rs":"4cf26e32842c9e6faf2f89617f19cf626d0af0c91f91f987da1b9f498a1235d6","src/event.rs":"bdd69cbccc2b6940f31c70ff3021956eba5113902c55a7259fb6b381d0273eac","src/field.rs":"554563d29b2fa88c259a240a0254bdc1cc54019a1b4fe1c600dab21433b9bb48","src/lazy.rs":"2dd856721f3731f51efbff05c05d42fb5cb46ffe64d2b653ce054d2ccf7bcca4","src/lib.rs":"6fa735052cb8b8dd3227ac3ec2fecca36d099cc05918bebb075cb0a6b737a94d","src/metadata.rs":"fdaa30a7e84f8d937d27b7d16e8e6bd3c4e9ff946329293e7c1231ac2bdde338","src/parent.rs":"64808c21ae93bb80079504ab8de09c26478fbded7d6b7bc59d0bf60e707d3924","src/span.rs":"2d44f4ab124f760e48783678f231ddc8648c561abdff50af93c17d59af5eb2f2","src/spin/LICENSE":"88b2256ca5a6436d06c356182cc3a7d96001ff1c5e589a5fb1389df349dc88db","src/spin/mod.rs":"aa4fb3264d71b15e01d3a3892d4fb6e4733aff3f29e59a0553cbee810c91e41c","src/spin/mutex.rs":"cc07680d8594fc347df312dfc98815f75b8b6e8200ef9ef648b09303251f1048","src/spin/once.rs":"45271adc68ef4ef30fb6ad6a6e71ec9f949e235c0ef549a7df510fa9e81cb33a","src/stdlib.rs":"4a22d5ba8b601331161cfdc96ebe7a2ab7946b4e359ebe228ae121f8d8b26de8","src/subscriber.rs":"a4592cea08396d2256d2bdad399f6b5b64138fa025c0e428b3d61a8e7cfdd7b0","tests/common/mod.rs":"08e619aede8f777d9d7afe3213d1aee19975f7231cc4e2a31fe8aac64ace0a37","tests/dispatch.rs":"302ecf444f9f97dbed98860a1fcc3b78bbf913888f5e7ab2ff56e32013c694a4","tests/global_dispatch.rs":"c05b0a5019baa302f2f138064f72a0c556429092e76ecc79bc17e9c29f321777","tests/local_dispatch_before_init.rs":"b8f9490bfcc09efe5769489f2698da716c6420a3aa29cb1601494ca238f97b55","tests/macros.rs":"f7c49d00ab05d2c3d826790a65dd02e8d6f3c03683acaec5b44015709e4fb7f4","tests/missed_register_callsite.rs":"e6cae36eda5f7e303de89d426c0cf8f19fbd1d5803104bf9f8eda5542e7b59ef"}}
\ No newline at end of file
+{"package":null,"files":{".cargo-checksum.json":"33bef475fcd2aff93d3a734a76c46287f2c2c2794c2b44eee92c59dec7640089","Android.bp":"c5f1955c1b1ecad79608d1eac34d091996762561bba28000d13fcfd2541f913a","CHANGELOG.md":"c542c47dcdce0f2ae1f0704f7248a8667f529f738bb507a4d9ba53ed4df87e4a","Cargo.toml":"fe6f275a57654dba28b6200cc23241211046f44ebd061ae3d8a97038e02e0da5","LICENSE":"81b5afff24bf73e7d6660ff9e03a493ba57f494dad837134a654b3945a3199d7","METADATA":"142f0858ebd6777ec2dbade702de005c8c7c757ac8840f8c1100675c115c60e9","MODULE_LICENSE_MIT":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"bda66c2feeee6c4926ac25c50703674504ed3f937e6c6e5f249304c67bab3511","TEST_MAPPING":"e84f0a6f5128a8f242d1e0a1f8e52dc3c3efe90dacbf979bdd86aeb5533fd7c5","cargo_embargo.json":"4ddd8358d79bc3ec472e58f0e295a8006b443eb4db00a52da3afafbc7cc5bd11","src/callsite.rs":"7eee7d857cf8365307c3c510cf03b5be867ccf7fd394c72dea388e2d8c2e06f7","src/dispatcher.rs":"4cf26e32842c9e6faf2f89617f19cf626d0af0c91f91f987da1b9f498a1235d6","src/event.rs":"bdd69cbccc2b6940f31c70ff3021956eba5113902c55a7259fb6b381d0273eac","src/field.rs":"554563d29b2fa88c259a240a0254bdc1cc54019a1b4fe1c600dab21433b9bb48","src/lazy.rs":"2dd856721f3731f51efbff05c05d42fb5cb46ffe64d2b653ce054d2ccf7bcca4","src/lib.rs":"6fa735052cb8b8dd3227ac3ec2fecca36d099cc05918bebb075cb0a6b737a94d","src/metadata.rs":"fdaa30a7e84f8d937d27b7d16e8e6bd3c4e9ff946329293e7c1231ac2bdde338","src/parent.rs":"64808c21ae93bb80079504ab8de09c26478fbded7d6b7bc59d0bf60e707d3924","src/span.rs":"2d44f4ab124f760e48783678f231ddc8648c561abdff50af93c17d59af5eb2f2","src/spin/LICENSE":"88b2256ca5a6436d06c356182cc3a7d96001ff1c5e589a5fb1389df349dc88db","src/spin/mod.rs":"aa4fb3264d71b15e01d3a3892d4fb6e4733aff3f29e59a0553cbee810c91e41c","src/spin/mutex.rs":"cc07680d8594fc347df312dfc98815f75b8b6e8200ef9ef648b09303251f1048","src/spin/once.rs":"45271adc68ef4ef30fb6ad6a6e71ec9f949e235c0ef549a7df510fa9e81cb33a","src/stdlib.rs":"4a22d5ba8b601331161cfdc96ebe7a2ab7946b4e359ebe228ae121f8d8b26de8","src/subscriber.rs":"a4592cea08396d2256d2bdad399f6b5b64138fa025c0e428b3d61a8e7cfdd7b0","tests/common/mod.rs":"08e619aede8f777d9d7afe3213d1aee19975f7231cc4e2a31fe8aac64ace0a37","tests/dispatch.rs":"302ecf444f9f97dbed98860a1fcc3b78bbf913888f5e7ab2ff56e32013c694a4","tests/global_dispatch.rs":"c05b0a5019baa302f2f138064f72a0c556429092e76ecc79bc17e9c29f321777","tests/local_dispatch_before_init.rs":"b8f9490bfcc09efe5769489f2698da716c6420a3aa29cb1601494ca238f97b55","tests/macros.rs":"f7c49d00ab05d2c3d826790a65dd02e8d6f3c03683acaec5b44015709e4fb7f4","tests/missed_register_callsite.rs":"e6cae36eda5f7e303de89d426c0cf8f19fbd1d5803104bf9f8eda5542e7b59ef"}}
\ No newline at end of file
diff --git a/crates/tracing-core/TEST_MAPPING b/crates/tracing-core/TEST_MAPPING
index de884d0..ac5984d 100644
--- a/crates/tracing-core/TEST_MAPPING
+++ b/crates/tracing-core/TEST_MAPPING
@@ -14,6 +14,9 @@
     },
     {
       "name": "tracing-core_test_tests_macros"
+    },
+    {
+      "name": "tracing-core_test_tests_missed_register_callsite"
     }
   ]
 }
diff --git a/crates/unicode-width/.android-checksum.json b/crates/unicode-width/.android-checksum.json
index 10cc959..7b71256 100644
--- a/crates/unicode-width/.android-checksum.json
+++ b/crates/unicode-width/.android-checksum.json
@@ -1 +1 @@
-{"package":null,"files":{".cargo-checksum.json":"8e3de79aede94fea16efd285eae4b73ac34bcdb596e05e50cd255dd47675a143","Android.bp":"cc28bddc721b0cc6eb8b2c192fa5dbc85fd71edf61b2e88c0e555ad5514a5e8c","COPYRIGHT":"ab4c8a47ea97e53eb239f5454701fbf35c618d980af54cfe659793662b2a1ebd","Cargo.toml":"3429fa23367d8e29c709a0aabe1fb18c1bb80612db9a1ef585156f3f8cc29d50","LICENSE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","LICENSE-APACHE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","LICENSE-MIT":"8ff981830ebf3fe518679fabc276f8aade7e253f47946d0d8df0dd30f83d96f5","METADATA":"7d1c3abdb74949d730d12adfb04ee54974fe621c8f50c14b25bd26b387b99757","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","NOTICE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","README.md":"1a904e49fb4a2398c64528b291872775352286f62be026a071827f266d55cbcf","TEST_MAPPING":"368cbc275d5c38a75491369719657516ca1b6635f8a914ed481a9ec063d1dc2c","benches/benches.rs":"d48c520608bf761120af28e5aa91520fcbc3fc45a7defe7cd35e671fc67bc913","cargo_embargo.json":"e35f70a87f8cbf6318a380d6c4228142aff731c4f6137f4f3cebbdb2c259795c","scripts/unicode.py":"432f2fc902e270597267ccee9a53959f6a939c5626d822b6b8717387d5714285","src/lib.rs":"51493ace5866fac830607c2b06528c7649c277d9ff7557caa8fb640d83390026","src/tables.rs":"91569fec1e0748594a2569959020fa9d241904ced4c1f7705d9057e2af062332","tests/emoji-test.txt":"749bf24573e3f2611cadfd7ecec727dc3e9bce7f3d96ce7fff1a970e0a31dc65","tests/tests.rs":"59c61b342185d5245b0142e4d3eeac7c01d114a841818e5842e96bb8f25794e6"}}
\ No newline at end of file
+{"package":null,"files":{".cargo-checksum.json":"8e3de79aede94fea16efd285eae4b73ac34bcdb596e05e50cd255dd47675a143","Android.bp":"cc28bddc721b0cc6eb8b2c192fa5dbc85fd71edf61b2e88c0e555ad5514a5e8c","COPYRIGHT":"ab4c8a47ea97e53eb239f5454701fbf35c618d980af54cfe659793662b2a1ebd","Cargo.toml":"3429fa23367d8e29c709a0aabe1fb18c1bb80612db9a1ef585156f3f8cc29d50","LICENSE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","LICENSE-APACHE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","LICENSE-MIT":"8ff981830ebf3fe518679fabc276f8aade7e253f47946d0d8df0dd30f83d96f5","METADATA":"7d1c3abdb74949d730d12adfb04ee54974fe621c8f50c14b25bd26b387b99757","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","NOTICE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","README.md":"1a904e49fb4a2398c64528b291872775352286f62be026a071827f266d55cbcf","TEST_MAPPING":"8cf5470ec46a37c85e3e258fd833253eabdc5d1d902cc69d16e167100850bd06","benches/benches.rs":"d48c520608bf761120af28e5aa91520fcbc3fc45a7defe7cd35e671fc67bc913","cargo_embargo.json":"e35f70a87f8cbf6318a380d6c4228142aff731c4f6137f4f3cebbdb2c259795c","scripts/unicode.py":"432f2fc902e270597267ccee9a53959f6a939c5626d822b6b8717387d5714285","src/lib.rs":"51493ace5866fac830607c2b06528c7649c277d9ff7557caa8fb640d83390026","src/tables.rs":"91569fec1e0748594a2569959020fa9d241904ced4c1f7705d9057e2af062332","tests/emoji-test.txt":"749bf24573e3f2611cadfd7ecec727dc3e9bce7f3d96ce7fff1a970e0a31dc65","tests/tests.rs":"59c61b342185d5245b0142e4d3eeac7c01d114a841818e5842e96bb8f25794e6"}}
\ No newline at end of file
diff --git a/crates/unicode-width/TEST_MAPPING b/crates/unicode-width/TEST_MAPPING
index 3480b99..1d0c51f 100644
--- a/crates/unicode-width/TEST_MAPPING
+++ b/crates/unicode-width/TEST_MAPPING
@@ -1,4 +1,3 @@
-// Generated by update_crate_tests.py for tests that depend on this crate.
 {
   "imports": [
     {
@@ -23,5 +22,10 @@
     {
       "name": "unicode-width_test_src_lib"
     }
+  ],
+  "postsubmit": [
+    {
+      "name": "unicode-width_test_tests_tests"
+    }
   ]
 }
diff --git a/crates/uniffi/.android-checksum.json b/crates/uniffi/.android-checksum.json
deleted file mode 100644
index 31d780d..0000000
--- a/crates/uniffi/.android-checksum.json
+++ /dev/null
@@ -1 +0,0 @@
-{"package":null,"files":{".cargo-checksum.json":"87145b9244d01fd7b23baea9962f302bd4224ad0a9a7debb64deb746ef24637e","Android.bp":"8598544d3bbfd43b9624ac6e01520d96b5f8de3a74f9407b6924c9ec2a7b8ecd","Cargo.toml":"d9dddbe6eae510cfbeaaf647fbf98437ab8a3d5e342f04b2bd7b26be067a756d","LICENSE":"eb272adec43829624ef944827cee5edc5896c80ceaccea3e8e471dadeaeee408","METADATA":"726d842d7c7715de38d31b6c4180e6d2666a16e44ee88c14140f348371b57d53","MODULE_LICENSE_MPL":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"8528d929c10fb2ef91706a54de19896a66a8636432d18835228fd13c183506c4","cargo_embargo.json":"aa45a963da01d3f018be316cd5b7646a5b413ce2611c5218f2914d2e8a9efd0e","patches/LICENSE.patch":"cfb7d0c0c947397e0cf46698509020438a9a3305875ecf9b75fafeb30815ac80","release.toml":"b180bd4f15b968670e59328f9d6a62709171bc6a228b74517e7649c8275832ec","src/cli.rs":"293811dbcad26468e977cc08c4ceb20f54070c8e078fc88008dec14960d97a24","src/lib.rs":"cd61cb4d59c930b15cef97505bbd619a7e11e552678cde84b19ff4f9bb90972e","tests/ui/proc_macro_arc.rs":"83afba680f86eda03ead32b5101923333e60fc2d67d9a8f190eb2fd4a656b03c","tests/ui/proc_macro_arc.stderr":"0d9b0714bac01ceab20c3003c9a87809d87fceaa01dff064dbc892be12608926","tests/ui/version_mismatch.rs":"8746b7a0f666df5c13c5af33628af2a6af4a3efd572ffafd77a3f51982e20d1b","tests/ui/version_mismatch.stderr":"0ad5318c94fe48145da64ad386a03e4a804f8f99d5dad2d1ad2ff6231e7e713c"}}
\ No newline at end of file
diff --git a/crates/uniffi/.cargo-checksum.json b/crates/uniffi/.cargo-checksum.json
deleted file mode 100644
index 98c4aca..0000000
--- a/crates/uniffi/.cargo-checksum.json
+++ /dev/null
@@ -1 +0,0 @@
-{"files":{"Cargo.toml":"eb974d356d4da93a076434ff428c448f70e036a724bd9a0a7eae6b9ddff2346e","README.md":"37c1af00ec81a9f1bc206ab3578356e5f9ad4077dc46dd1bb623d81d804948b8","release.toml":"1aa1b131d4cc93b5eba8758a4401c70bc0d7fe5861e2ec147e9259fe7c0da472","src/cli.rs":"5c0b9bb93665f2f49f7e90335e65206887e26e96f2a533eb1203be27c9380c84","src/lib.rs":"422503d7cbac1360852287b1810c99663669625b9abf080a5fec22058bb73d8c","tests/ui/proc_macro_arc.rs":"fedc429603753e8ef953642a7295323ccb3f76fd3ae1ab181ad90c5eb88212bb","tests/ui/proc_macro_arc.stderr":"a24af227b907328c9cac6317ec9f43dbc45d7f7c77c603e5d72db7fa050e8b01","tests/ui/version_mismatch.rs":"16ea359e5853517ee0d0704c015ae8c825533109fbefd715130d0f4a51f15898","tests/ui/version_mismatch.stderr":"21dcb836253312ba8e3a0502cce6ff279818aaaadcea9628a41b196e0c8c94b6"},"package":"a5566fae48a5cb017005bf9cd622af5236b2a203a13fb548afde3506d3c68277"}
\ No newline at end of file
diff --git a/crates/uniffi/Android.bp b/crates/uniffi/Android.bp
deleted file mode 100644
index 1e80d29..0000000
--- a/crates/uniffi/Android.bp
+++ /dev/null
@@ -1,36 +0,0 @@
-// This file is generated by cargo_embargo.
-// Do not modify this file because the changes will be overridden on upgrade.
-
-package {
-    default_applicable_licenses: ["external_rust_crates_uniffi_license"],
-    default_team: "trendy_team_android_rust",
-}
-
-license {
-    name: "external_rust_crates_uniffi_license",
-    visibility: [":__subpackages__"],
-    license_kinds: ["SPDX-license-identifier-MPL-2.0"],
-    license_text: ["LICENSE"],
-}
-
-rust_library {
-    name: "libuniffi",
-    host_supported: true,
-    crate_name: "uniffi",
-    cargo_env_compat: true,
-    cargo_pkg_version: "0.27.1",
-    crate_root: "src/lib.rs",
-    edition: "2021",
-    features: ["default"],
-    rustlibs: [
-        "libanyhow",
-        "libuniffi_core",
-    ],
-    proc_macros: ["libuniffi_macros"],
-    apex_available: [
-        "//apex_available:platform",
-        "//apex_available:anyapex",
-    ],
-    product_available: true,
-    vendor_available: true,
-}
diff --git a/crates/uniffi/Cargo.toml b/crates/uniffi/Cargo.toml
deleted file mode 100644
index 374e365..0000000
--- a/crates/uniffi/Cargo.toml
+++ /dev/null
@@ -1,72 +0,0 @@
-# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
-#
-# When uploading crates to the registry Cargo will automatically
-# "normalize" Cargo.toml files for maximal compatibility
-# with all versions of Cargo and also rewrite `path` dependencies
-# to registry (e.g., crates.io) dependencies.
-#
-# If you are reading this file be aware that the original Cargo.toml
-# will likely look very different (and much more reasonable).
-# See Cargo.toml.orig for the original contents.
-
-[package]
-edition = "2021"
-name = "uniffi"
-version = "0.27.1"
-authors = ["Firefox Sync Team <[email protected]>"]
-description = "a multi-language bindings generator for rust"
-homepage = "https://mozilla.github.io/uniffi-rs"
-documentation = "https://mozilla.github.io/uniffi-rs"
-readme = "README.md"
-keywords = [
-    "ffi",
-    "bindgen",
-]
-license = "MPL-2.0"
-repository = "https://github.com/mozilla/uniffi-rs"
-
-[dependencies.anyhow]
-version = "1"
-
-[dependencies.camino]
-version = "1.0.8"
-optional = true
-
-[dependencies.clap]
-version = "4"
-features = [
-    "cargo",
-    "std",
-    "derive",
-]
-optional = true
-
-[dependencies.uniffi_bindgen]
-version = "=0.27.1"
-optional = true
-
-[dependencies.uniffi_build]
-version = "=0.27.1"
-optional = true
-
-[dependencies.uniffi_core]
-version = "=0.27.1"
-
-[dependencies.uniffi_macros]
-version = "=0.27.1"
-
-[dev-dependencies.trybuild]
-version = "1"
-
-[features]
-bindgen = ["dep:uniffi_bindgen"]
-bindgen-tests = ["dep:uniffi_bindgen"]
-build = ["dep:uniffi_build"]
-cli = [
-    "bindgen",
-    "uniffi_bindgen?/clap",
-    "dep:clap",
-    "dep:camino",
-]
-default = []
-tokio = ["uniffi_core/tokio"]
diff --git a/crates/uniffi/LICENSE b/crates/uniffi/LICENSE
deleted file mode 100644
index a612ad9..0000000
--- a/crates/uniffi/LICENSE
+++ /dev/null
@@ -1,373 +0,0 @@
-Mozilla Public License Version 2.0
-==================================
-
-1. Definitions
---------------
-
-1.1. "Contributor"
-    means each individual or legal entity that creates, contributes to
-    the creation of, or owns Covered Software.
-
-1.2. "Contributor Version"
-    means the combination of the Contributions of others (if any) used
-    by a Contributor and that particular Contributor's Contribution.
-
-1.3. "Contribution"
-    means Covered Software of a particular Contributor.
-
-1.4. "Covered Software"
-    means Source Code Form to which the initial Contributor has attached
-    the notice in Exhibit A, the Executable Form of such Source Code
-    Form, and Modifications of such Source Code Form, in each case
-    including portions thereof.
-
-1.5. "Incompatible With Secondary Licenses"
-    means
-
-    (a) that the initial Contributor has attached the notice described
-        in Exhibit B to the Covered Software; or
-
-    (b) that the Covered Software was made available under the terms of
-        version 1.1 or earlier of the License, but not also under the
-        terms of a Secondary License.
-
-1.6. "Executable Form"
-    means any form of the work other than Source Code Form.
-
-1.7. "Larger Work"
-    means a work that combines Covered Software with other material, in
-    a separate file or files, that is not Covered Software.
-
-1.8. "License"
-    means this document.
-
-1.9. "Licensable"
-    means having the right to grant, to the maximum extent possible,
-    whether at the time of the initial grant or subsequently, any and
-    all of the rights conveyed by this License.
-
-1.10. "Modifications"
-    means any of the following:
-
-    (a) any file in Source Code Form that results from an addition to,
-        deletion from, or modification of the contents of Covered
-        Software; or
-
-    (b) any new file in Source Code Form that contains any Covered
-        Software.
-
-1.11. "Patent Claims" of a Contributor
-    means any patent claim(s), including without limitation, method,
-    process, and apparatus claims, in any patent Licensable by such
-    Contributor that would be infringed, but for the grant of the
-    License, by the making, using, selling, offering for sale, having
-    made, import, or transfer of either its Contributions or its
-    Contributor Version.
-
-1.12. "Secondary License"
-    means either the GNU General Public License, Version 2.0, the GNU
-    Lesser General Public License, Version 2.1, the GNU Affero General
-    Public License, Version 3.0, or any later versions of those
-    licenses.
-
-1.13. "Source Code Form"
-    means the form of the work preferred for making modifications.
-
-1.14. "You" (or "Your")
-    means an individual or a legal entity exercising rights under this
-    License. For legal entities, "You" includes any entity that
-    controls, is controlled by, or is under common control with You. For
-    purposes of this definition, "control" means (a) the power, direct
-    or indirect, to cause the direction or management of such entity,
-    whether by contract or otherwise, or (b) ownership of more than
-    fifty percent (50%) of the outstanding shares or beneficial
-    ownership of such entity.
-
-2. License Grants and Conditions
---------------------------------
-
-2.1. Grants
-
-Each Contributor hereby grants You a world-wide, royalty-free,
-non-exclusive license:
-
-(a) under intellectual property rights (other than patent or trademark)
-    Licensable by such Contributor to use, reproduce, make available,
-    modify, display, perform, distribute, and otherwise exploit its
-    Contributions, either on an unmodified basis, with Modifications, or
-    as part of a Larger Work; and
-
-(b) under Patent Claims of such Contributor to make, use, sell, offer
-    for sale, have made, import, and otherwise transfer either its
-    Contributions or its Contributor Version.
-
-2.2. Effective Date
-
-The licenses granted in Section 2.1 with respect to any Contribution
-become effective for each Contribution on the date the Contributor first
-distributes such Contribution.
-
-2.3. Limitations on Grant Scope
-
-The licenses granted in this Section 2 are the only rights granted under
-this License. No additional rights or licenses will be implied from the
-distribution or licensing of Covered Software under this License.
-Notwithstanding Section 2.1(b) above, no patent license is granted by a
-Contributor:
-
-(a) for any code that a Contributor has removed from Covered Software;
-    or
-
-(b) for infringements caused by: (i) Your and any other third party's
-    modifications of Covered Software, or (ii) the combination of its
-    Contributions with other software (except as part of its Contributor
-    Version); or
-
-(c) under Patent Claims infringed by Covered Software in the absence of
-    its Contributions.
-
-This License does not grant any rights in the trademarks, service marks,
-or logos of any Contributor (except as may be necessary to comply with
-the notice requirements in Section 3.4).
-
-2.4. Subsequent Licenses
-
-No Contributor makes additional grants as a result of Your choice to
-distribute the Covered Software under a subsequent version of this
-License (see Section 10.2) or under the terms of a Secondary License (if
-permitted under the terms of Section 3.3).
-
-2.5. Representation
-
-Each Contributor represents that the Contributor believes its
-Contributions are its original creation(s) or it has sufficient rights
-to grant the rights to its Contributions conveyed by this License.
-
-2.6. Fair Use
-
-This License is not intended to limit any rights You have under
-applicable copyright doctrines of fair use, fair dealing, or other
-equivalents.
-
-2.7. Conditions
-
-Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
-in Section 2.1.
-
-3. Responsibilities
--------------------
-
-3.1. Distribution of Source Form
-
-All distribution of Covered Software in Source Code Form, including any
-Modifications that You create or to which You contribute, must be under
-the terms of this License. You must inform recipients that the Source
-Code Form of the Covered Software is governed by the terms of this
-License, and how they can obtain a copy of this License. You may not
-attempt to alter or restrict the recipients' rights in the Source Code
-Form.
-
-3.2. Distribution of Executable Form
-
-If You distribute Covered Software in Executable Form then:
-
-(a) such Covered Software must also be made available in Source Code
-    Form, as described in Section 3.1, and You must inform recipients of
-    the Executable Form how they can obtain a copy of such Source Code
-    Form by reasonable means in a timely manner, at a charge no more
-    than the cost of distribution to the recipient; and
-
-(b) You may distribute such Executable Form under the terms of this
-    License, or sublicense it under different terms, provided that the
-    license for the Executable Form does not attempt to limit or alter
-    the recipients' rights in the Source Code Form under this License.
-
-3.3. Distribution of a Larger Work
-
-You may create and distribute a Larger Work under terms of Your choice,
-provided that You also comply with the requirements of this License for
-the Covered Software. If the Larger Work is a combination of Covered
-Software with a work governed by one or more Secondary Licenses, and the
-Covered Software is not Incompatible With Secondary Licenses, this
-License permits You to additionally distribute such Covered Software
-under the terms of such Secondary License(s), so that the recipient of
-the Larger Work may, at their option, further distribute the Covered
-Software under the terms of either this License or such Secondary
-License(s).
-
-3.4. Notices
-
-You may not remove or alter the substance of any license notices
-(including copyright notices, patent notices, disclaimers of warranty,
-or limitations of liability) contained within the Source Code Form of
-the Covered Software, except that You may alter any license notices to
-the extent required to remedy known factual inaccuracies.
-
-3.5. Application of Additional Terms
-
-You may choose to offer, and to charge a fee for, warranty, support,
-indemnity or liability obligations to one or more recipients of Covered
-Software. However, You may do so only on Your own behalf, and not on
-behalf of any Contributor. You must make it absolutely clear that any
-such warranty, support, indemnity, or liability obligation is offered by
-You alone, and You hereby agree to indemnify every Contributor for any
-liability incurred by such Contributor as a result of warranty, support,
-indemnity or liability terms You offer. You may include additional
-disclaimers of warranty and limitations of liability specific to any
-jurisdiction.
-
-4. Inability to Comply Due to Statute or Regulation
----------------------------------------------------
-
-If it is impossible for You to comply with any of the terms of this
-License with respect to some or all of the Covered Software due to
-statute, judicial order, or regulation then You must: (a) comply with
-the terms of this License to the maximum extent possible; and (b)
-describe the limitations and the code they affect. Such description must
-be placed in a text file included with all distributions of the Covered
-Software under this License. Except to the extent prohibited by statute
-or regulation, such description must be sufficiently detailed for a
-recipient of ordinary skill to be able to understand it.
-
-5. Termination
---------------
-
-5.1. The rights granted under this License will terminate automatically
-if You fail to comply with any of its terms. However, if You become
-compliant, then the rights granted under this License from a particular
-Contributor are reinstated (a) provisionally, unless and until such
-Contributor explicitly and finally terminates Your grants, and (b) on an
-ongoing basis, if such Contributor fails to notify You of the
-non-compliance by some reasonable means prior to 60 days after You have
-come back into compliance. Moreover, Your grants from a particular
-Contributor are reinstated on an ongoing basis if such Contributor
-notifies You of the non-compliance by some reasonable means, this is the
-first time You have received notice of non-compliance with this License
-from such Contributor, and You become compliant prior to 30 days after
-Your receipt of the notice.
-
-5.2. If You initiate litigation against any entity by asserting a patent
-infringement claim (excluding declaratory judgment actions,
-counter-claims, and cross-claims) alleging that a Contributor Version
-directly or indirectly infringes any patent, then the rights granted to
-You by any and all Contributors for the Covered Software under Section
-2.1 of this License shall terminate.
-
-5.3. In the event of termination under Sections 5.1 or 5.2 above, all
-end user license agreements (excluding distributors and resellers) which
-have been validly granted by You or Your distributors under this License
-prior to termination shall survive termination.
-
-************************************************************************
-*                                                                      *
-*  6. Disclaimer of Warranty                                           *
-*  -------------------------                                           *
-*                                                                      *
-*  Covered Software is provided under this License on an "as is"       *
-*  basis, without warranty of any kind, either expressed, implied, or  *
-*  statutory, including, without limitation, warranties that the       *
-*  Covered Software is free of defects, merchantable, fit for a        *
-*  particular purpose or non-infringing. The entire risk as to the     *
-*  quality and performance of the Covered Software is with You.        *
-*  Should any Covered Software prove defective in any respect, You     *
-*  (not any Contributor) assume the cost of any necessary servicing,   *
-*  repair, or correction. This disclaimer of warranty constitutes an   *
-*  essential part of this License. No use of any Covered Software is   *
-*  authorized under this License except under this disclaimer.         *
-*                                                                      *
-************************************************************************
-
-************************************************************************
-*                                                                      *
-*  7. Limitation of Liability                                          *
-*  --------------------------                                          *
-*                                                                      *
-*  Under no circumstances and under no legal theory, whether tort      *
-*  (including negligence), contract, or otherwise, shall any           *
-*  Contributor, or anyone who distributes Covered Software as          *
-*  permitted above, be liable to You for any direct, indirect,         *
-*  special, incidental, or consequential damages of any character      *
-*  including, without limitation, damages for lost profits, loss of    *
-*  goodwill, work stoppage, computer failure or malfunction, or any    *
-*  and all other commercial damages or losses, even if such party      *
-*  shall have been informed of the possibility of such damages. This   *
-*  limitation of liability shall not apply to liability for death or   *
-*  personal injury resulting from such party's negligence to the       *
-*  extent applicable law prohibits such limitation. Some               *
-*  jurisdictions do not allow the exclusion or limitation of           *
-*  incidental or consequential damages, so this exclusion and          *
-*  limitation may not apply to You.                                    *
-*                                                                      *
-************************************************************************
-
-8. Litigation
--------------
-
-Any litigation relating to this License may be brought only in the
-courts of a jurisdiction where the defendant maintains its principal
-place of business and such litigation shall be governed by laws of that
-jurisdiction, without reference to its conflict-of-law provisions.
-Nothing in this Section shall prevent a party's ability to bring
-cross-claims or counter-claims.
-
-9. Miscellaneous
-----------------
-
-This License represents the complete agreement concerning the subject
-matter hereof. If any provision of this License is held to be
-unenforceable, such provision shall be reformed only to the extent
-necessary to make it enforceable. Any law or regulation which provides
-that the language of a contract shall be construed against the drafter
-shall not be used to construe this License against a Contributor.
-
-10. Versions of the License
----------------------------
-
-10.1. New Versions
-
-Mozilla Foundation is the license steward. Except as provided in Section
-10.3, no one other than the license steward has the right to modify or
-publish new versions of this License. Each version will be given a
-distinguishing version number.
-
-10.2. Effect of New Versions
-
-You may distribute the Covered Software under the terms of the version
-of the License under which You originally received the Covered Software,
-or under the terms of any subsequent version published by the license
-steward.
-
-10.3. Modified Versions
-
-If you create software not governed by this License, and you want to
-create a new license for such software, you may create and use a
-modified version of this License if you rename the license and remove
-any references to the name of the license steward (except to note that
-such modified license differs from this License).
-
-10.4. Distributing Source Code Form that is Incompatible With Secondary
-Licenses
-
-If You choose to distribute Source Code Form that is Incompatible With
-Secondary Licenses under the terms of this version of the License, the
-notice described in Exhibit B of this License must be attached.
-
-Exhibit A - Source Code Form License Notice
--------------------------------------------
-
-  This Source Code Form is subject to the terms of the Mozilla Public
-  License, v. 2.0. If a copy of the MPL was not distributed with this
-  file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-If it is not possible or desirable to put the notice in a particular
-file, then You may include the notice in a location (such as a LICENSE
-file in a relevant directory) where a recipient would be likely to look
-for such a notice.
-
-You may add additional accurate notices of copyright ownership.
-
-Exhibit B - "Incompatible With Secondary Licenses" Notice
----------------------------------------------------------
-
-  This Source Code Form is "Incompatible With Secondary Licenses", as
-  defined by the Mozilla Public License, v. 2.0.
diff --git a/crates/uniffi/METADATA b/crates/uniffi/METADATA
deleted file mode 100644
index 6f17645..0000000
--- a/crates/uniffi/METADATA
+++ /dev/null
@@ -1,17 +0,0 @@
-name: "uniffi"
-description: "a multi-language bindings generator for rust"
-third_party {
-  version: "0.27.1"
-  license_type: RECIPROCAL
-  last_upgrade_date {
-    year: 2024
-    month: 5
-    day: 6
-  }
-  homepage: "https://crates.io/crates/uniffi"
-  identifier {
-    type: "Archive"
-    value: "https://static.crates.io/crates/uniffi/uniffi-0.27.1.crate"
-    version: "0.27.1"
-  }
-}
diff --git a/crates/uniffi/MODULE_LICENSE_MPL b/crates/uniffi/MODULE_LICENSE_MPL
deleted file mode 100644
index e69de29..0000000
--- a/crates/uniffi/MODULE_LICENSE_MPL
+++ /dev/null
diff --git a/crates/uniffi/README.md b/crates/uniffi/README.md
deleted file mode 100644
index 64ac348..0000000
--- a/crates/uniffi/README.md
+++ /dev/null
@@ -1,81 +0,0 @@
-# UniFFI - a multi-language bindings generator for Rust
-
-UniFFI is a toolkit for building cross-platform software components in Rust.
-
-For the impatient, see [**the UniFFI user guide**](https://mozilla.github.io/uniffi-rs/)
-or [**the UniFFI examples**](https://github.com/mozilla/uniffi-rs/tree/main/examples#example-uniffi-components).
-
-By writing your core business logic in Rust and describing its interface in an "object model",
-you can use UniFFI to help you:
-
-* Compile your Rust code into a shared library for use on different target platforms.
-* Generate bindings to load and use the library from different target languages.
-
-You can describe your object model in an [interface definition file](https://mozilla.github.io/uniffi-rs/udl_file_spec.html)
-or [by using proc-macros](https://mozilla.github.io/uniffi-rs/proc_macro/index.html).
-
-UniFFI is currently used extensively by Mozilla in Firefox mobile and desktop browsers;
-written once in Rust, auto-generated bindings allow that functionality to be called
-from both Kotlin (for Android apps) and Swift (for iOS apps).
-It also has a growing community of users shipping various cool things to many users.
-
-UniFFI comes with support for **Kotlin**, **Swift**, **Python** and **Ruby** with 3rd party bindings available for **C#** and **Golang**.
-Additional foreign language bindings can be developed externally and we welcome contributions to list them here.
-See [Third-party foreign language bindings](#third-party-foreign-language-bindings).
-
-## User Guide
-
-You can read more about using the tool in [**the UniFFI user guide**](https://mozilla.github.io/uniffi-rs/).
-
-We consider it ready for production use, but UniFFI is a long way from a 1.0 release with lots of internal work still going on.
-We try hard to avoid breaking simple consumers, but more advanced things might break as you upgrade over time.
-
-### Etymology and Pronunciation
-
-ˈjuːnɪfaɪ. Pronounced to rhyme with "unify".
-
-A portmanteau word that also puns with "unify", to signify the joining of one codebase accessed from many languages.
-
-uni - [Latin ūni-, from ūnus, one]
-FFI - [Abbreviation, Foreign Function Interface]
-
-## Alternative tools
-
-Other tools we know of which try and solve a similarly shaped problem are:
-
-* [Diplomat](https://github.com/rust-diplomat/diplomat/) - see our [writeup of
-  the different approach taken by that tool](docs/diplomat-and-macros.md)
-* [Interoptopus](https://github.com/ralfbiedert/interoptopus/)
-
-(Please open a PR if you think other tools should be listed!)
-
-## Third-party foreign language bindings
-
-* [Kotlin Multiplatform support](https://gitlab.com/trixnity/uniffi-kotlin-multiplatform-bindings). The repository contains Kotlin Multiplatform bindings generation for UniFFI, letting you target both JVM and Native.
-* [Go bindings](https://github.com/NordSecurity/uniffi-bindgen-go)
-* [C# bindings](https://github.com/NordSecurity/uniffi-bindgen-cs)
-* [Dart bindings](https://github.com/NiallBunting/uniffi-rs-dart)
-
-### External resources
-
-There are a few third-party resources that make it easier to work with UniFFI:
-
-* [Plugin support for `.udl` files](https://github.com/Lonami/uniffi-dl) for the IDEA platform ([*uniffi-dl* in the JetBrains marketplace](https://plugins.jetbrains.com/plugin/20527-uniffi-dl)). It provides syntax highlighting, code folding, code completion, reference resolution and navigation (among others features) for the [UniFFI Definition Language (UDL)](https://mozilla.github.io/uniffi-rs/).
-* [cargo swift](https://github.com/antoniusnaumann/cargo-swift), a cargo plugin to build a Swift Package from Rust code. It provides an init command for setting up a UniFFI crate and a package command for building a Swift package from Rust code - without the need for additional configuration or build scripts.
-* [Cargo NDK Gradle Plugin](https://github.com/willir/cargo-ndk-android-gradle) allows you to build Rust code using [`cargo-ndk`](https://github.com/bbqsrc/cargo-ndk), which generally makes Android library builds less painful.
-* [`uniffi-starter`](https://github.com/ianthetechie/uniffi-starter) is a minimal project demonstrates a wide range of UniFFI in a complete project in a compact manner. It includes a full Android library build process, an XCFramework generation script, and example Swift package structure. 
-
-(Please open a PR if you think other resources should be listed!)
-
-## Contributing
-
-If this tool sounds interesting to you, please help us develop it! You can:
-
-* View the [contributor guidelines](./docs/contributing.md).
-* File or work on [issues](https://github.com/mozilla/uniffi-rs/issues) here in GitHub.
-* Join discussions in the [#uniffi:mozilla.org](https://matrix.to/#/#uniffi:mozilla.org)
-  room on Matrix.
-
-## Code of Conduct
-
-This project is governed by Mozilla's [Community Participation Guidelines](./CODE_OF_CONDUCT.md).
diff --git a/crates/uniffi/cargo_embargo.json b/crates/uniffi/cargo_embargo.json
deleted file mode 100644
index cb908d7..0000000
--- a/crates/uniffi/cargo_embargo.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-  "run_cargo": false
-}
diff --git a/crates/uniffi/patches/LICENSE.patch b/crates/uniffi/patches/LICENSE.patch
deleted file mode 100644
index fecc0b4..0000000
--- a/crates/uniffi/patches/LICENSE.patch
+++ /dev/null
@@ -1,379 +0,0 @@
-diff --git b/LICENSE a/LICENSE
-new file mode 100644
-index 0000000..a612ad9
---- /dev/null
-+++ a/LICENSE
-@@ -0,0 +1,373 @@
-+Mozilla Public License Version 2.0
-+==================================
-+
-+1. Definitions
-+--------------
-+
-+1.1. "Contributor"
-+    means each individual or legal entity that creates, contributes to
-+    the creation of, or owns Covered Software.
-+
-+1.2. "Contributor Version"
-+    means the combination of the Contributions of others (if any) used
-+    by a Contributor and that particular Contributor's Contribution.
-+
-+1.3. "Contribution"
-+    means Covered Software of a particular Contributor.
-+
-+1.4. "Covered Software"
-+    means Source Code Form to which the initial Contributor has attached
-+    the notice in Exhibit A, the Executable Form of such Source Code
-+    Form, and Modifications of such Source Code Form, in each case
-+    including portions thereof.
-+
-+1.5. "Incompatible With Secondary Licenses"
-+    means
-+
-+    (a) that the initial Contributor has attached the notice described
-+        in Exhibit B to the Covered Software; or
-+
-+    (b) that the Covered Software was made available under the terms of
-+        version 1.1 or earlier of the License, but not also under the
-+        terms of a Secondary License.
-+
-+1.6. "Executable Form"
-+    means any form of the work other than Source Code Form.
-+
-+1.7. "Larger Work"
-+    means a work that combines Covered Software with other material, in
-+    a separate file or files, that is not Covered Software.
-+
-+1.8. "License"
-+    means this document.
-+
-+1.9. "Licensable"
-+    means having the right to grant, to the maximum extent possible,
-+    whether at the time of the initial grant or subsequently, any and
-+    all of the rights conveyed by this License.
-+
-+1.10. "Modifications"
-+    means any of the following:
-+
-+    (a) any file in Source Code Form that results from an addition to,
-+        deletion from, or modification of the contents of Covered
-+        Software; or
-+
-+    (b) any new file in Source Code Form that contains any Covered
-+        Software.
-+
-+1.11. "Patent Claims" of a Contributor
-+    means any patent claim(s), including without limitation, method,
-+    process, and apparatus claims, in any patent Licensable by such
-+    Contributor that would be infringed, but for the grant of the
-+    License, by the making, using, selling, offering for sale, having
-+    made, import, or transfer of either its Contributions or its
-+    Contributor Version.
-+
-+1.12. "Secondary License"
-+    means either the GNU General Public License, Version 2.0, the GNU
-+    Lesser General Public License, Version 2.1, the GNU Affero General
-+    Public License, Version 3.0, or any later versions of those
-+    licenses.
-+
-+1.13. "Source Code Form"
-+    means the form of the work preferred for making modifications.
-+
-+1.14. "You" (or "Your")
-+    means an individual or a legal entity exercising rights under this
-+    License. For legal entities, "You" includes any entity that
-+    controls, is controlled by, or is under common control with You. For
-+    purposes of this definition, "control" means (a) the power, direct
-+    or indirect, to cause the direction or management of such entity,
-+    whether by contract or otherwise, or (b) ownership of more than
-+    fifty percent (50%) of the outstanding shares or beneficial
-+    ownership of such entity.
-+
-+2. License Grants and Conditions
-+--------------------------------
-+
-+2.1. Grants
-+
-+Each Contributor hereby grants You a world-wide, royalty-free,
-+non-exclusive license:
-+
-+(a) under intellectual property rights (other than patent or trademark)
-+    Licensable by such Contributor to use, reproduce, make available,
-+    modify, display, perform, distribute, and otherwise exploit its
-+    Contributions, either on an unmodified basis, with Modifications, or
-+    as part of a Larger Work; and
-+
-+(b) under Patent Claims of such Contributor to make, use, sell, offer
-+    for sale, have made, import, and otherwise transfer either its
-+    Contributions or its Contributor Version.
-+
-+2.2. Effective Date
-+
-+The licenses granted in Section 2.1 with respect to any Contribution
-+become effective for each Contribution on the date the Contributor first
-+distributes such Contribution.
-+
-+2.3. Limitations on Grant Scope
-+
-+The licenses granted in this Section 2 are the only rights granted under
-+this License. No additional rights or licenses will be implied from the
-+distribution or licensing of Covered Software under this License.
-+Notwithstanding Section 2.1(b) above, no patent license is granted by a
-+Contributor:
-+
-+(a) for any code that a Contributor has removed from Covered Software;
-+    or
-+
-+(b) for infringements caused by: (i) Your and any other third party's
-+    modifications of Covered Software, or (ii) the combination of its
-+    Contributions with other software (except as part of its Contributor
-+    Version); or
-+
-+(c) under Patent Claims infringed by Covered Software in the absence of
-+    its Contributions.
-+
-+This License does not grant any rights in the trademarks, service marks,
-+or logos of any Contributor (except as may be necessary to comply with
-+the notice requirements in Section 3.4).
-+
-+2.4. Subsequent Licenses
-+
-+No Contributor makes additional grants as a result of Your choice to
-+distribute the Covered Software under a subsequent version of this
-+License (see Section 10.2) or under the terms of a Secondary License (if
-+permitted under the terms of Section 3.3).
-+
-+2.5. Representation
-+
-+Each Contributor represents that the Contributor believes its
-+Contributions are its original creation(s) or it has sufficient rights
-+to grant the rights to its Contributions conveyed by this License.
-+
-+2.6. Fair Use
-+
-+This License is not intended to limit any rights You have under
-+applicable copyright doctrines of fair use, fair dealing, or other
-+equivalents.
-+
-+2.7. Conditions
-+
-+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
-+in Section 2.1.
-+
-+3. Responsibilities
-+-------------------
-+
-+3.1. Distribution of Source Form
-+
-+All distribution of Covered Software in Source Code Form, including any
-+Modifications that You create or to which You contribute, must be under
-+the terms of this License. You must inform recipients that the Source
-+Code Form of the Covered Software is governed by the terms of this
-+License, and how they can obtain a copy of this License. You may not
-+attempt to alter or restrict the recipients' rights in the Source Code
-+Form.
-+
-+3.2. Distribution of Executable Form
-+
-+If You distribute Covered Software in Executable Form then:
-+
-+(a) such Covered Software must also be made available in Source Code
-+    Form, as described in Section 3.1, and You must inform recipients of
-+    the Executable Form how they can obtain a copy of such Source Code
-+    Form by reasonable means in a timely manner, at a charge no more
-+    than the cost of distribution to the recipient; and
-+
-+(b) You may distribute such Executable Form under the terms of this
-+    License, or sublicense it under different terms, provided that the
-+    license for the Executable Form does not attempt to limit or alter
-+    the recipients' rights in the Source Code Form under this License.
-+
-+3.3. Distribution of a Larger Work
-+
-+You may create and distribute a Larger Work under terms of Your choice,
-+provided that You also comply with the requirements of this License for
-+the Covered Software. If the Larger Work is a combination of Covered
-+Software with a work governed by one or more Secondary Licenses, and the
-+Covered Software is not Incompatible With Secondary Licenses, this
-+License permits You to additionally distribute such Covered Software
-+under the terms of such Secondary License(s), so that the recipient of
-+the Larger Work may, at their option, further distribute the Covered
-+Software under the terms of either this License or such Secondary
-+License(s).
-+
-+3.4. Notices
-+
-+You may not remove or alter the substance of any license notices
-+(including copyright notices, patent notices, disclaimers of warranty,
-+or limitations of liability) contained within the Source Code Form of
-+the Covered Software, except that You may alter any license notices to
-+the extent required to remedy known factual inaccuracies.
-+
-+3.5. Application of Additional Terms
-+
-+You may choose to offer, and to charge a fee for, warranty, support,
-+indemnity or liability obligations to one or more recipients of Covered
-+Software. However, You may do so only on Your own behalf, and not on
-+behalf of any Contributor. You must make it absolutely clear that any
-+such warranty, support, indemnity, or liability obligation is offered by
-+You alone, and You hereby agree to indemnify every Contributor for any
-+liability incurred by such Contributor as a result of warranty, support,
-+indemnity or liability terms You offer. You may include additional
-+disclaimers of warranty and limitations of liability specific to any
-+jurisdiction.
-+
-+4. Inability to Comply Due to Statute or Regulation
-+---------------------------------------------------
-+
-+If it is impossible for You to comply with any of the terms of this
-+License with respect to some or all of the Covered Software due to
-+statute, judicial order, or regulation then You must: (a) comply with
-+the terms of this License to the maximum extent possible; and (b)
-+describe the limitations and the code they affect. Such description must
-+be placed in a text file included with all distributions of the Covered
-+Software under this License. Except to the extent prohibited by statute
-+or regulation, such description must be sufficiently detailed for a
-+recipient of ordinary skill to be able to understand it.
-+
-+5. Termination
-+--------------
-+
-+5.1. The rights granted under this License will terminate automatically
-+if You fail to comply with any of its terms. However, if You become
-+compliant, then the rights granted under this License from a particular
-+Contributor are reinstated (a) provisionally, unless and until such
-+Contributor explicitly and finally terminates Your grants, and (b) on an
-+ongoing basis, if such Contributor fails to notify You of the
-+non-compliance by some reasonable means prior to 60 days after You have
-+come back into compliance. Moreover, Your grants from a particular
-+Contributor are reinstated on an ongoing basis if such Contributor
-+notifies You of the non-compliance by some reasonable means, this is the
-+first time You have received notice of non-compliance with this License
-+from such Contributor, and You become compliant prior to 30 days after
-+Your receipt of the notice.
-+
-+5.2. If You initiate litigation against any entity by asserting a patent
-+infringement claim (excluding declaratory judgment actions,
-+counter-claims, and cross-claims) alleging that a Contributor Version
-+directly or indirectly infringes any patent, then the rights granted to
-+You by any and all Contributors for the Covered Software under Section
-+2.1 of this License shall terminate.
-+
-+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
-+end user license agreements (excluding distributors and resellers) which
-+have been validly granted by You or Your distributors under this License
-+prior to termination shall survive termination.
-+
-+************************************************************************
-+*                                                                      *
-+*  6. Disclaimer of Warranty                                           *
-+*  -------------------------                                           *
-+*                                                                      *
-+*  Covered Software is provided under this License on an "as is"       *
-+*  basis, without warranty of any kind, either expressed, implied, or  *
-+*  statutory, including, without limitation, warranties that the       *
-+*  Covered Software is free of defects, merchantable, fit for a        *
-+*  particular purpose or non-infringing. The entire risk as to the     *
-+*  quality and performance of the Covered Software is with You.        *
-+*  Should any Covered Software prove defective in any respect, You     *
-+*  (not any Contributor) assume the cost of any necessary servicing,   *
-+*  repair, or correction. This disclaimer of warranty constitutes an   *
-+*  essential part of this License. No use of any Covered Software is   *
-+*  authorized under this License except under this disclaimer.         *
-+*                                                                      *
-+************************************************************************
-+
-+************************************************************************
-+*                                                                      *
-+*  7. Limitation of Liability                                          *
-+*  --------------------------                                          *
-+*                                                                      *
-+*  Under no circumstances and under no legal theory, whether tort      *
-+*  (including negligence), contract, or otherwise, shall any           *
-+*  Contributor, or anyone who distributes Covered Software as          *
-+*  permitted above, be liable to You for any direct, indirect,         *
-+*  special, incidental, or consequential damages of any character      *
-+*  including, without limitation, damages for lost profits, loss of    *
-+*  goodwill, work stoppage, computer failure or malfunction, or any    *
-+*  and all other commercial damages or losses, even if such party      *
-+*  shall have been informed of the possibility of such damages. This   *
-+*  limitation of liability shall not apply to liability for death or   *
-+*  personal injury resulting from such party's negligence to the       *
-+*  extent applicable law prohibits such limitation. Some               *
-+*  jurisdictions do not allow the exclusion or limitation of           *
-+*  incidental or consequential damages, so this exclusion and          *
-+*  limitation may not apply to You.                                    *
-+*                                                                      *
-+************************************************************************
-+
-+8. Litigation
-+-------------
-+
-+Any litigation relating to this License may be brought only in the
-+courts of a jurisdiction where the defendant maintains its principal
-+place of business and such litigation shall be governed by laws of that
-+jurisdiction, without reference to its conflict-of-law provisions.
-+Nothing in this Section shall prevent a party's ability to bring
-+cross-claims or counter-claims.
-+
-+9. Miscellaneous
-+----------------
-+
-+This License represents the complete agreement concerning the subject
-+matter hereof. If any provision of this License is held to be
-+unenforceable, such provision shall be reformed only to the extent
-+necessary to make it enforceable. Any law or regulation which provides
-+that the language of a contract shall be construed against the drafter
-+shall not be used to construe this License against a Contributor.
-+
-+10. Versions of the License
-+---------------------------
-+
-+10.1. New Versions
-+
-+Mozilla Foundation is the license steward. Except as provided in Section
-+10.3, no one other than the license steward has the right to modify or
-+publish new versions of this License. Each version will be given a
-+distinguishing version number.
-+
-+10.2. Effect of New Versions
-+
-+You may distribute the Covered Software under the terms of the version
-+of the License under which You originally received the Covered Software,
-+or under the terms of any subsequent version published by the license
-+steward.
-+
-+10.3. Modified Versions
-+
-+If you create software not governed by this License, and you want to
-+create a new license for such software, you may create and use a
-+modified version of this License if you rename the license and remove
-+any references to the name of the license steward (except to note that
-+such modified license differs from this License).
-+
-+10.4. Distributing Source Code Form that is Incompatible With Secondary
-+Licenses
-+
-+If You choose to distribute Source Code Form that is Incompatible With
-+Secondary Licenses under the terms of this version of the License, the
-+notice described in Exhibit B of this License must be attached.
-+
-+Exhibit A - Source Code Form License Notice
-+-------------------------------------------
-+
-+  This Source Code Form is subject to the terms of the Mozilla Public
-+  License, v. 2.0. If a copy of the MPL was not distributed with this
-+  file, You can obtain one at http://mozilla.org/MPL/2.0/.
-+
-+If it is not possible or desirable to put the notice in a particular
-+file, then You may include the notice in a location (such as a LICENSE
-+file in a relevant directory) where a recipient would be likely to look
-+for such a notice.
-+
-+You may add additional accurate notices of copyright ownership.
-+
-+Exhibit B - "Incompatible With Secondary Licenses" Notice
-+---------------------------------------------------------
-+
-+  This Source Code Form is "Incompatible With Secondary Licenses", as
-+  defined by the Mozilla Public License, v. 2.0.
diff --git a/crates/uniffi/release.toml b/crates/uniffi/release.toml
deleted file mode 100644
index 36154d8..0000000
--- a/crates/uniffi/release.toml
+++ /dev/null
@@ -1,16 +0,0 @@
-# Note that this `release.toml` exists to capture things that must only be
-# done once for `cargo release-uniffi`.
-#
-# [../uniffi_core/release.toml](../uniffi_core/release.toml) captures things that must only be done for `cargo release-backend-crates`
-#
-# All other config exists in [../release.toml](../release.toml).
-
-tag = true
-
-# This is how we manage the sections in CHANGELOG.md
-pre-release-replacements = [
-  {file="../CHANGELOG.md", search="\\[\\[UnreleasedUniFFIVersion\\]\\]", replace="v{{version}}", exactly=2},
-  {file="../CHANGELOG.md", search="\\.\\.\\.HEAD\\)", replace="...{{tag_name}})", exactly=1},
-  {file="../CHANGELOG.md", search="\\[\\[NextUnreleasedUniFFIVersion\\]\\]", replace="[[UnreleasedUniFFIVersion]]", exactly=2},
-  {file="../CHANGELOG.md", search="\\.\\.\\.NEXT_HEAD\\)", replace="...HEAD)", exactly=1},
-]
diff --git a/crates/uniffi/src/cli.rs b/crates/uniffi/src/cli.rs
deleted file mode 100644
index 77d7f21..0000000
--- a/crates/uniffi/src/cli.rs
+++ /dev/null
@@ -1,145 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-use camino::Utf8PathBuf;
-use clap::{Parser, Subcommand};
-use uniffi_bindgen::bindings::TargetLanguage;
-use uniffi_bindgen::BindingGeneratorDefault;
-
-// Structs to help our cmdline parsing. Note that docstrings below form part
-// of the "help" output.
-
-/// Scaffolding and bindings generator for Rust
-#[derive(Parser)]
-#[clap(name = "uniffi-bindgen")]
-#[clap(version = clap::crate_version!())]
-#[clap(propagate_version = true)]
-struct Cli {
-    #[clap(subcommand)]
-    command: Commands,
-}
-
-#[derive(Subcommand)]
-enum Commands {
-    /// Generate foreign language bindings
-    Generate {
-        /// Foreign language(s) for which to build bindings.
-        #[clap(long, short, value_enum)]
-        language: Vec<TargetLanguage>,
-
-        /// Directory in which to write generated files. Default is same folder as .udl file.
-        #[clap(long, short)]
-        out_dir: Option<Utf8PathBuf>,
-
-        /// Do not try to format the generated bindings.
-        #[clap(long, short)]
-        no_format: bool,
-
-        /// Path to optional uniffi config file. This config is merged with the `uniffi.toml` config present in each crate, with its values taking precedence.
-        #[clap(long, short)]
-        config: Option<Utf8PathBuf>,
-
-        /// Extract proc-macro metadata from a native lib (cdylib or staticlib) for this crate.
-        #[clap(long)]
-        lib_file: Option<Utf8PathBuf>,
-
-        /// Pass in a cdylib path rather than a UDL file
-        #[clap(long = "library")]
-        library_mode: bool,
-
-        /// When `--library` is passed, only generate bindings for one crate.
-        /// When `--library` is not passed, use this as the crate name instead of attempting to
-        /// locate and parse Cargo.toml.
-        #[clap(long = "crate")]
-        crate_name: Option<String>,
-
-        /// Path to the UDL file, or cdylib if `library-mode` is specified
-        source: Utf8PathBuf,
-    },
-
-    /// Generate Rust scaffolding code
-    Scaffolding {
-        /// Directory in which to write generated files. Default is same folder as .udl file.
-        #[clap(long, short)]
-        out_dir: Option<Utf8PathBuf>,
-
-        /// Do not try to format the generated bindings.
-        #[clap(long, short)]
-        no_format: bool,
-
-        /// Path to the UDL file.
-        udl_file: Utf8PathBuf,
-    },
-
-    /// Print a debug representation of the interface from a dynamic library
-    PrintRepr {
-        /// Path to the library file (.so, .dll, .dylib, or .a)
-        path: Utf8PathBuf,
-    },
-}
-
-pub fn run_main() -> anyhow::Result<()> {
-    let cli = Cli::parse();
-    match cli.command {
-        Commands::Generate {
-            language,
-            out_dir,
-            no_format,
-            config,
-            lib_file,
-            source,
-            crate_name,
-            library_mode,
-        } => {
-            if library_mode {
-                if lib_file.is_some() {
-                    panic!("--lib-file is not compatible with --library.")
-                }
-                let out_dir = out_dir.expect("--out-dir is required when using --library");
-                if language.is_empty() {
-                    panic!("please specify at least one language with --language")
-                }
-                uniffi_bindgen::library_mode::generate_bindings(
-                    &source,
-                    crate_name,
-                    &BindingGeneratorDefault {
-                        target_languages: language,
-                        try_format_code: !no_format,
-                    },
-                    config.as_deref(),
-                    &out_dir,
-                    !no_format,
-                )?;
-            } else {
-                uniffi_bindgen::generate_bindings(
-                    &source,
-                    config.as_deref(),
-                    BindingGeneratorDefault {
-                        target_languages: language,
-                        try_format_code: !no_format,
-                    },
-                    out_dir.as_deref(),
-                    lib_file.as_deref(),
-                    crate_name.as_deref(),
-                    !no_format,
-                )?;
-            }
-        }
-        Commands::Scaffolding {
-            out_dir,
-            no_format,
-            udl_file,
-        } => {
-            uniffi_bindgen::generate_component_scaffolding(
-                &udl_file,
-                out_dir.as_deref(),
-                !no_format,
-            )?;
-        }
-        Commands::PrintRepr { path } => {
-            uniffi_bindgen::print_repr(&path)?;
-        }
-    };
-    Ok(())
-}
diff --git a/crates/uniffi/src/lib.rs b/crates/uniffi/src/lib.rs
deleted file mode 100644
index 319b3c7..0000000
--- a/crates/uniffi/src/lib.rs
+++ /dev/null
@@ -1,43 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-/// Reexport items from other uniffi creates
-pub use uniffi_core::*;
-pub use uniffi_macros::*;
-#[cfg(feature = "cli")]
-mod cli;
-#[cfg(feature = "bindgen-tests")]
-pub use uniffi_bindgen::bindings::kotlin::run_test as kotlin_run_test;
-#[cfg(feature = "bindgen-tests")]
-pub use uniffi_bindgen::bindings::python::run_test as python_run_test;
-#[cfg(feature = "bindgen-tests")]
-pub use uniffi_bindgen::bindings::ruby::run_test as ruby_run_test;
-#[cfg(feature = "bindgen-tests")]
-pub use uniffi_bindgen::bindings::swift::run_test as swift_run_test;
-#[cfg(feature = "bindgen")]
-pub use uniffi_bindgen::{
-    bindings::kotlin::gen_kotlin::KotlinBindingGenerator,
-    bindings::python::gen_python::PythonBindingGenerator,
-    bindings::ruby::gen_ruby::RubyBindingGenerator,
-    bindings::swift::gen_swift::SwiftBindingGenerator, bindings::TargetLanguage, generate_bindings,
-    generate_component_scaffolding, generate_component_scaffolding_for_crate, print_repr,
-};
-#[cfg(feature = "build")]
-pub use uniffi_build::{generate_scaffolding, generate_scaffolding_for_crate};
-#[cfg(feature = "bindgen-tests")]
-pub use uniffi_macros::build_foreign_language_testcases;
-
-#[cfg(feature = "cli")]
-pub fn uniffi_bindgen_main() {
-    cli::run_main().unwrap();
-}
-
-#[cfg(test)]
-mod test {
-    #[test]
-    fn trybuild_ui_tests() {
-        let t = trybuild::TestCases::new();
-        t.compile_fail("tests/ui/*.rs");
-    }
-}
diff --git a/crates/uniffi/tests/ui/proc_macro_arc.rs b/crates/uniffi/tests/ui/proc_macro_arc.rs
deleted file mode 100644
index 9db3376..0000000
--- a/crates/uniffi/tests/ui/proc_macro_arc.rs
+++ /dev/null
@@ -1,24 +0,0 @@
-use std::sync::Arc;
-
-fn main() {}
-
-// Normally this is defined by the scaffolding code, manually define it for the UI test
-pub struct UniFfiTag;
-
-pub struct Foo;
-
-#[uniffi::export]
-fn make_foo() -> Arc<Foo> {
-    Arc::new(Foo)
-}
-
-mod child {
-    use std::sync::Arc;
-
-    enum Foo {}
-
-    #[uniffi::export]
-    fn take_foo(foo: Arc<Foo>) {
-        match &*foo {}
-    }
-}
diff --git a/crates/uniffi/tests/ui/proc_macro_arc.stderr b/crates/uniffi/tests/ui/proc_macro_arc.stderr
deleted file mode 100644
index 0654a29..0000000
--- a/crates/uniffi/tests/ui/proc_macro_arc.stderr
+++ /dev/null
@@ -1,22 +0,0 @@
-error[E0277]: the trait bound `Foo: FfiConverterArc<UniFfiTag>` is not satisfied
-  --> tests/ui/proc_macro_arc.rs:10:1
-   |
-10 | #[uniffi::export]
-   | ^^^^^^^^^^^^^^^^^ the trait `FfiConverterArc<UniFfiTag>` is not implemented for `Foo`
-   |
-   = help: the trait `LowerReturn<UT>` is implemented for `Arc<T>`
-   = note: required for `Arc<Foo>` to implement `FfiConverter<UniFfiTag>`
-   = note: required for `Arc<Foo>` to implement `Lower<UniFfiTag>`
-   = note: required for `Arc<Foo>` to implement `LowerReturn<UniFfiTag>`
-   = note: this error originates in the attribute macro `uniffi::export` (in Nightly builds, run with -Z macro-backtrace for more info)
-
-error[E0277]: the trait bound `child::Foo: FfiConverterArc<UniFfiTag>` is not satisfied
-  --> tests/ui/proc_macro_arc.rs:20:5
-   |
-20 |     #[uniffi::export]
-   |     ^^^^^^^^^^^^^^^^^ the trait `FfiConverterArc<UniFfiTag>` is not implemented for `child::Foo`
-   |
-   = help: the trait `Lift<UT>` is implemented for `Arc<T>`
-   = note: required for `Arc<child::Foo>` to implement `FfiConverter<UniFfiTag>`
-   = note: required for `Arc<child::Foo>` to implement `Lift<UniFfiTag>`
-   = note: this error originates in the attribute macro `uniffi::export` (in Nightly builds, run with -Z macro-backtrace for more info)
diff --git a/crates/uniffi/tests/ui/version_mismatch.rs b/crates/uniffi/tests/ui/version_mismatch.rs
deleted file mode 100644
index 6a7edb8..0000000
--- a/crates/uniffi/tests/ui/version_mismatch.rs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This should fail with a version mismatch.
-uniffi::assert_compatible_version!("0.0.1"); // An error message would go here.
-
-fn main() {}
diff --git a/crates/uniffi/tests/ui/version_mismatch.stderr b/crates/uniffi/tests/ui/version_mismatch.stderr
deleted file mode 100644
index bc30714..0000000
--- a/crates/uniffi/tests/ui/version_mismatch.stderr
+++ /dev/null
@@ -1,7 +0,0 @@
-error[E0080]: evaluation of constant value failed
- --> tests/ui/version_mismatch.rs:2:1
-  |
-2 | uniffi::assert_compatible_version!("0.0.1"); // An error message would go here.
-  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ attempt to compute `0_usize - 1_usize`, which would overflow
-  |
-  = note: this error originates in the macro `uniffi::deps::static_assertions::const_assert` which comes from the expansion of the macro `uniffi::assert_compatible_version` (in Nightly builds, run with -Z macro-backtrace for more info)
diff --git a/crates/uniffi_checksum_derive/.android-checksum.json b/crates/uniffi_checksum_derive/.android-checksum.json
deleted file mode 100644
index 0e4e901..0000000
--- a/crates/uniffi_checksum_derive/.android-checksum.json
+++ /dev/null
@@ -1 +0,0 @@
-{"package":null,"files":{".cargo-checksum.json":"07326c062a9496cbb64cbf846bf79f0346f34f8c2fb40d1ade0bb56be70e45f6","Android.bp":"0ea0d8b9a9025021c0755e3b7fc1f970255f929c7baf3d57827df3c88129b08e","Cargo.toml":"d93ef126d7c68f76635059863633ffa5710ababa4b3c118003205b64f45e1d7b","LICENSE":"eb272adec43829624ef944827cee5edc5896c80ceaccea3e8e471dadeaeee408","METADATA":"3cc77205d0eb0c55c3803c9db6b0be6c67cac8c972feb6e312d57c25e73b33e9","MODULE_LICENSE_MPL":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"bd32a92f1fa622e318f77b7ddfff8737bdbbe2e0df26dc9f1fde0705f3a9c18d","cargo_embargo.json":"aa45a963da01d3f018be316cd5b7646a5b413ce2611c5218f2914d2e8a9efd0e","patches/LICENSE.patch":"cfb7d0c0c947397e0cf46698509020438a9a3305875ecf9b75fafeb30815ac80","src/lib.rs":"aada73e8c5d693e82160d6712fb6ce86a3c158ee5527abe84ecb400f649b772e"}}
\ No newline at end of file
diff --git a/crates/uniffi_checksum_derive/.cargo-checksum.json b/crates/uniffi_checksum_derive/.cargo-checksum.json
deleted file mode 100644
index 7eab913..0000000
--- a/crates/uniffi_checksum_derive/.cargo-checksum.json
+++ /dev/null
@@ -1 +0,0 @@
-{"files":{"Cargo.toml":"ac014f3069d42e6b486aae8a602cf023c36661d123364574c8307cb6825b8abb","README.md":"1163018760cf0243c8f6fc8a497852f4357db23c22e48fe243abd27b500bc95d","src/lib.rs":"3301ac9be2750c348f677c1fcf721daa37945901434d6cd6958d7926c987e4ea"},"package":"802d2051a700e3ec894c79f80d2705b69d85844dafbbe5d1a92776f8f48b563a"}
\ No newline at end of file
diff --git a/crates/uniffi_checksum_derive/Android.bp b/crates/uniffi_checksum_derive/Android.bp
deleted file mode 100644
index 2eff054..0000000
--- a/crates/uniffi_checksum_derive/Android.bp
+++ /dev/null
@@ -1,30 +0,0 @@
-// This file is generated by cargo_embargo.
-// Do not modify this file because the changes will be overridden on upgrade.
-
-package {
-    default_applicable_licenses: ["external_rust_crates_uniffi_checksum_derive_license"],
-    default_team: "trendy_team_android_rust",
-}
-
-license {
-    name: "external_rust_crates_uniffi_checksum_derive_license",
-    visibility: [":__subpackages__"],
-    license_kinds: ["SPDX-license-identifier-MPL-2.0"],
-    license_text: ["LICENSE"],
-}
-
-rust_proc_macro {
-    name: "libuniffi_checksum_derive",
-    crate_name: "uniffi_checksum_derive",
-    cargo_env_compat: true,
-    cargo_pkg_version: "0.28.3",
-    crate_root: "src/lib.rs",
-    edition: "2021",
-    features: ["default"],
-    rustlibs: [
-        "libquote",
-        "libsyn",
-    ],
-    product_available: true,
-    vendor_available: true,
-}
diff --git a/crates/uniffi_checksum_derive/Cargo.toml b/crates/uniffi_checksum_derive/Cargo.toml
deleted file mode 100644
index a25112f..0000000
--- a/crates/uniffi_checksum_derive/Cargo.toml
+++ /dev/null
@@ -1,43 +0,0 @@
-# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
-#
-# When uploading crates to the registry Cargo will automatically
-# "normalize" Cargo.toml files for maximal compatibility
-# with all versions of Cargo and also rewrite `path` dependencies
-# to registry (e.g., crates.io) dependencies.
-#
-# If you are reading this file be aware that the original Cargo.toml
-# will likely look very different (and much more reasonable).
-# See Cargo.toml.orig for the original contents.
-
-[package]
-edition = "2021"
-name = "uniffi_checksum_derive"
-version = "0.28.3"
-authors = ["Firefox Sync Team <[email protected]>"]
-description = "a multi-language bindings generator for rust (checksum custom derive)"
-homepage = "https://mozilla.github.io/uniffi-rs"
-documentation = "https://mozilla.github.io/uniffi-rs"
-readme = "README.md"
-keywords = [
-    "ffi",
-    "bindgen",
-]
-license = "MPL-2.0"
-repository = "https://github.com/mozilla/uniffi-rs"
-
-[lib]
-proc-macro = true
-
-[dependencies.quote]
-version = "1.0"
-
-[dependencies.syn]
-version = "2.0"
-features = [
-    "derive",
-    "parsing",
-]
-
-[features]
-default = []
-nightly = []
diff --git a/crates/uniffi_checksum_derive/LICENSE b/crates/uniffi_checksum_derive/LICENSE
deleted file mode 100644
index a612ad9..0000000
--- a/crates/uniffi_checksum_derive/LICENSE
+++ /dev/null
@@ -1,373 +0,0 @@
-Mozilla Public License Version 2.0
-==================================
-
-1. Definitions
---------------
-
-1.1. "Contributor"
-    means each individual or legal entity that creates, contributes to
-    the creation of, or owns Covered Software.
-
-1.2. "Contributor Version"
-    means the combination of the Contributions of others (if any) used
-    by a Contributor and that particular Contributor's Contribution.
-
-1.3. "Contribution"
-    means Covered Software of a particular Contributor.
-
-1.4. "Covered Software"
-    means Source Code Form to which the initial Contributor has attached
-    the notice in Exhibit A, the Executable Form of such Source Code
-    Form, and Modifications of such Source Code Form, in each case
-    including portions thereof.
-
-1.5. "Incompatible With Secondary Licenses"
-    means
-
-    (a) that the initial Contributor has attached the notice described
-        in Exhibit B to the Covered Software; or
-
-    (b) that the Covered Software was made available under the terms of
-        version 1.1 or earlier of the License, but not also under the
-        terms of a Secondary License.
-
-1.6. "Executable Form"
-    means any form of the work other than Source Code Form.
-
-1.7. "Larger Work"
-    means a work that combines Covered Software with other material, in
-    a separate file or files, that is not Covered Software.
-
-1.8. "License"
-    means this document.
-
-1.9. "Licensable"
-    means having the right to grant, to the maximum extent possible,
-    whether at the time of the initial grant or subsequently, any and
-    all of the rights conveyed by this License.
-
-1.10. "Modifications"
-    means any of the following:
-
-    (a) any file in Source Code Form that results from an addition to,
-        deletion from, or modification of the contents of Covered
-        Software; or
-
-    (b) any new file in Source Code Form that contains any Covered
-        Software.
-
-1.11. "Patent Claims" of a Contributor
-    means any patent claim(s), including without limitation, method,
-    process, and apparatus claims, in any patent Licensable by such
-    Contributor that would be infringed, but for the grant of the
-    License, by the making, using, selling, offering for sale, having
-    made, import, or transfer of either its Contributions or its
-    Contributor Version.
-
-1.12. "Secondary License"
-    means either the GNU General Public License, Version 2.0, the GNU
-    Lesser General Public License, Version 2.1, the GNU Affero General
-    Public License, Version 3.0, or any later versions of those
-    licenses.
-
-1.13. "Source Code Form"
-    means the form of the work preferred for making modifications.
-
-1.14. "You" (or "Your")
-    means an individual or a legal entity exercising rights under this
-    License. For legal entities, "You" includes any entity that
-    controls, is controlled by, or is under common control with You. For
-    purposes of this definition, "control" means (a) the power, direct
-    or indirect, to cause the direction or management of such entity,
-    whether by contract or otherwise, or (b) ownership of more than
-    fifty percent (50%) of the outstanding shares or beneficial
-    ownership of such entity.
-
-2. License Grants and Conditions
---------------------------------
-
-2.1. Grants
-
-Each Contributor hereby grants You a world-wide, royalty-free,
-non-exclusive license:
-
-(a) under intellectual property rights (other than patent or trademark)
-    Licensable by such Contributor to use, reproduce, make available,
-    modify, display, perform, distribute, and otherwise exploit its
-    Contributions, either on an unmodified basis, with Modifications, or
-    as part of a Larger Work; and
-
-(b) under Patent Claims of such Contributor to make, use, sell, offer
-    for sale, have made, import, and otherwise transfer either its
-    Contributions or its Contributor Version.
-
-2.2. Effective Date
-
-The licenses granted in Section 2.1 with respect to any Contribution
-become effective for each Contribution on the date the Contributor first
-distributes such Contribution.
-
-2.3. Limitations on Grant Scope
-
-The licenses granted in this Section 2 are the only rights granted under
-this License. No additional rights or licenses will be implied from the
-distribution or licensing of Covered Software under this License.
-Notwithstanding Section 2.1(b) above, no patent license is granted by a
-Contributor:
-
-(a) for any code that a Contributor has removed from Covered Software;
-    or
-
-(b) for infringements caused by: (i) Your and any other third party's
-    modifications of Covered Software, or (ii) the combination of its
-    Contributions with other software (except as part of its Contributor
-    Version); or
-
-(c) under Patent Claims infringed by Covered Software in the absence of
-    its Contributions.
-
-This License does not grant any rights in the trademarks, service marks,
-or logos of any Contributor (except as may be necessary to comply with
-the notice requirements in Section 3.4).
-
-2.4. Subsequent Licenses
-
-No Contributor makes additional grants as a result of Your choice to
-distribute the Covered Software under a subsequent version of this
-License (see Section 10.2) or under the terms of a Secondary License (if
-permitted under the terms of Section 3.3).
-
-2.5. Representation
-
-Each Contributor represents that the Contributor believes its
-Contributions are its original creation(s) or it has sufficient rights
-to grant the rights to its Contributions conveyed by this License.
-
-2.6. Fair Use
-
-This License is not intended to limit any rights You have under
-applicable copyright doctrines of fair use, fair dealing, or other
-equivalents.
-
-2.7. Conditions
-
-Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
-in Section 2.1.
-
-3. Responsibilities
--------------------
-
-3.1. Distribution of Source Form
-
-All distribution of Covered Software in Source Code Form, including any
-Modifications that You create or to which You contribute, must be under
-the terms of this License. You must inform recipients that the Source
-Code Form of the Covered Software is governed by the terms of this
-License, and how they can obtain a copy of this License. You may not
-attempt to alter or restrict the recipients' rights in the Source Code
-Form.
-
-3.2. Distribution of Executable Form
-
-If You distribute Covered Software in Executable Form then:
-
-(a) such Covered Software must also be made available in Source Code
-    Form, as described in Section 3.1, and You must inform recipients of
-    the Executable Form how they can obtain a copy of such Source Code
-    Form by reasonable means in a timely manner, at a charge no more
-    than the cost of distribution to the recipient; and
-
-(b) You may distribute such Executable Form under the terms of this
-    License, or sublicense it under different terms, provided that the
-    license for the Executable Form does not attempt to limit or alter
-    the recipients' rights in the Source Code Form under this License.
-
-3.3. Distribution of a Larger Work
-
-You may create and distribute a Larger Work under terms of Your choice,
-provided that You also comply with the requirements of this License for
-the Covered Software. If the Larger Work is a combination of Covered
-Software with a work governed by one or more Secondary Licenses, and the
-Covered Software is not Incompatible With Secondary Licenses, this
-License permits You to additionally distribute such Covered Software
-under the terms of such Secondary License(s), so that the recipient of
-the Larger Work may, at their option, further distribute the Covered
-Software under the terms of either this License or such Secondary
-License(s).
-
-3.4. Notices
-
-You may not remove or alter the substance of any license notices
-(including copyright notices, patent notices, disclaimers of warranty,
-or limitations of liability) contained within the Source Code Form of
-the Covered Software, except that You may alter any license notices to
-the extent required to remedy known factual inaccuracies.
-
-3.5. Application of Additional Terms
-
-You may choose to offer, and to charge a fee for, warranty, support,
-indemnity or liability obligations to one or more recipients of Covered
-Software. However, You may do so only on Your own behalf, and not on
-behalf of any Contributor. You must make it absolutely clear that any
-such warranty, support, indemnity, or liability obligation is offered by
-You alone, and You hereby agree to indemnify every Contributor for any
-liability incurred by such Contributor as a result of warranty, support,
-indemnity or liability terms You offer. You may include additional
-disclaimers of warranty and limitations of liability specific to any
-jurisdiction.
-
-4. Inability to Comply Due to Statute or Regulation
----------------------------------------------------
-
-If it is impossible for You to comply with any of the terms of this
-License with respect to some or all of the Covered Software due to
-statute, judicial order, or regulation then You must: (a) comply with
-the terms of this License to the maximum extent possible; and (b)
-describe the limitations and the code they affect. Such description must
-be placed in a text file included with all distributions of the Covered
-Software under this License. Except to the extent prohibited by statute
-or regulation, such description must be sufficiently detailed for a
-recipient of ordinary skill to be able to understand it.
-
-5. Termination
---------------
-
-5.1. The rights granted under this License will terminate automatically
-if You fail to comply with any of its terms. However, if You become
-compliant, then the rights granted under this License from a particular
-Contributor are reinstated (a) provisionally, unless and until such
-Contributor explicitly and finally terminates Your grants, and (b) on an
-ongoing basis, if such Contributor fails to notify You of the
-non-compliance by some reasonable means prior to 60 days after You have
-come back into compliance. Moreover, Your grants from a particular
-Contributor are reinstated on an ongoing basis if such Contributor
-notifies You of the non-compliance by some reasonable means, this is the
-first time You have received notice of non-compliance with this License
-from such Contributor, and You become compliant prior to 30 days after
-Your receipt of the notice.
-
-5.2. If You initiate litigation against any entity by asserting a patent
-infringement claim (excluding declaratory judgment actions,
-counter-claims, and cross-claims) alleging that a Contributor Version
-directly or indirectly infringes any patent, then the rights granted to
-You by any and all Contributors for the Covered Software under Section
-2.1 of this License shall terminate.
-
-5.3. In the event of termination under Sections 5.1 or 5.2 above, all
-end user license agreements (excluding distributors and resellers) which
-have been validly granted by You or Your distributors under this License
-prior to termination shall survive termination.
-
-************************************************************************
-*                                                                      *
-*  6. Disclaimer of Warranty                                           *
-*  -------------------------                                           *
-*                                                                      *
-*  Covered Software is provided under this License on an "as is"       *
-*  basis, without warranty of any kind, either expressed, implied, or  *
-*  statutory, including, without limitation, warranties that the       *
-*  Covered Software is free of defects, merchantable, fit for a        *
-*  particular purpose or non-infringing. The entire risk as to the     *
-*  quality and performance of the Covered Software is with You.        *
-*  Should any Covered Software prove defective in any respect, You     *
-*  (not any Contributor) assume the cost of any necessary servicing,   *
-*  repair, or correction. This disclaimer of warranty constitutes an   *
-*  essential part of this License. No use of any Covered Software is   *
-*  authorized under this License except under this disclaimer.         *
-*                                                                      *
-************************************************************************
-
-************************************************************************
-*                                                                      *
-*  7. Limitation of Liability                                          *
-*  --------------------------                                          *
-*                                                                      *
-*  Under no circumstances and under no legal theory, whether tort      *
-*  (including negligence), contract, or otherwise, shall any           *
-*  Contributor, or anyone who distributes Covered Software as          *
-*  permitted above, be liable to You for any direct, indirect,         *
-*  special, incidental, or consequential damages of any character      *
-*  including, without limitation, damages for lost profits, loss of    *
-*  goodwill, work stoppage, computer failure or malfunction, or any    *
-*  and all other commercial damages or losses, even if such party      *
-*  shall have been informed of the possibility of such damages. This   *
-*  limitation of liability shall not apply to liability for death or   *
-*  personal injury resulting from such party's negligence to the       *
-*  extent applicable law prohibits such limitation. Some               *
-*  jurisdictions do not allow the exclusion or limitation of           *
-*  incidental or consequential damages, so this exclusion and          *
-*  limitation may not apply to You.                                    *
-*                                                                      *
-************************************************************************
-
-8. Litigation
--------------
-
-Any litigation relating to this License may be brought only in the
-courts of a jurisdiction where the defendant maintains its principal
-place of business and such litigation shall be governed by laws of that
-jurisdiction, without reference to its conflict-of-law provisions.
-Nothing in this Section shall prevent a party's ability to bring
-cross-claims or counter-claims.
-
-9. Miscellaneous
-----------------
-
-This License represents the complete agreement concerning the subject
-matter hereof. If any provision of this License is held to be
-unenforceable, such provision shall be reformed only to the extent
-necessary to make it enforceable. Any law or regulation which provides
-that the language of a contract shall be construed against the drafter
-shall not be used to construe this License against a Contributor.
-
-10. Versions of the License
----------------------------
-
-10.1. New Versions
-
-Mozilla Foundation is the license steward. Except as provided in Section
-10.3, no one other than the license steward has the right to modify or
-publish new versions of this License. Each version will be given a
-distinguishing version number.
-
-10.2. Effect of New Versions
-
-You may distribute the Covered Software under the terms of the version
-of the License under which You originally received the Covered Software,
-or under the terms of any subsequent version published by the license
-steward.
-
-10.3. Modified Versions
-
-If you create software not governed by this License, and you want to
-create a new license for such software, you may create and use a
-modified version of this License if you rename the license and remove
-any references to the name of the license steward (except to note that
-such modified license differs from this License).
-
-10.4. Distributing Source Code Form that is Incompatible With Secondary
-Licenses
-
-If You choose to distribute Source Code Form that is Incompatible With
-Secondary Licenses under the terms of this version of the License, the
-notice described in Exhibit B of this License must be attached.
-
-Exhibit A - Source Code Form License Notice
--------------------------------------------
-
-  This Source Code Form is subject to the terms of the Mozilla Public
-  License, v. 2.0. If a copy of the MPL was not distributed with this
-  file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-If it is not possible or desirable to put the notice in a particular
-file, then You may include the notice in a location (such as a LICENSE
-file in a relevant directory) where a recipient would be likely to look
-for such a notice.
-
-You may add additional accurate notices of copyright ownership.
-
-Exhibit B - "Incompatible With Secondary Licenses" Notice
----------------------------------------------------------
-
-  This Source Code Form is "Incompatible With Secondary Licenses", as
-  defined by the Mozilla Public License, v. 2.0.
diff --git a/crates/uniffi_checksum_derive/METADATA b/crates/uniffi_checksum_derive/METADATA
deleted file mode 100644
index 8f57a2f..0000000
--- a/crates/uniffi_checksum_derive/METADATA
+++ /dev/null
@@ -1,17 +0,0 @@
-name: "uniffi_checksum_derive"
-description: "a multi-language bindings generator for rust (checksum custom derive)"
-third_party {
-  version: "0.28.3"
-  license_type: RECIPROCAL
-  last_upgrade_date {
-    year: 2024
-    month: 12
-    day: 20
-  }
-  homepage: "https://crates.io/crates/uniffi_checksum_derive"
-  identifier {
-    type: "Archive"
-    value: "https://static.crates.io/crates/uniffi_checksum_derive/uniffi_checksum_derive-0.28.3.crate"
-    version: "0.28.3"
-  }
-}
diff --git a/crates/uniffi_checksum_derive/README.md b/crates/uniffi_checksum_derive/README.md
deleted file mode 100644
index 50348a9..0000000
--- a/crates/uniffi_checksum_derive/README.md
+++ /dev/null
@@ -1,80 +0,0 @@
-# UniFFI - a multi-language bindings generator for Rust
-
-UniFFI is a toolkit for building cross-platform software components in Rust.
-
-For the impatient, see [**the UniFFI user guide**](https://mozilla.github.io/uniffi-rs/)
-or [**the UniFFI examples**](https://github.com/mozilla/uniffi-rs/tree/main/examples#example-uniffi-components).
-
-By writing your core business logic in Rust and describing its interface in an "object model",
-you can use UniFFI to help you:
-
-* Compile your Rust code into a shared library for use on different target platforms.
-* Generate bindings to load and use the library from different target languages.
-
-You can describe your object model in an [interface definition file](https://mozilla.github.io/uniffi-rs/udl_file_spec.html)
-or [by using proc-macros](https://mozilla.github.io/uniffi-rs/proc_macro/index.html).
-
-UniFFI is currently used extensively by Mozilla in Firefox mobile and desktop browsers;
-written once in Rust, auto-generated bindings allow that functionality to be called
-from both Kotlin (for Android apps) and Swift (for iOS apps).
-It also has a growing community of users shipping various cool things to many users.
-
-UniFFI comes with support for **Kotlin**, **Swift**, **Python** and **Ruby** with 3rd party bindings available for **C#** and **Golang**.
-Additional foreign language bindings can be developed externally and we welcome contributions to list them here.
-See [Third-party foreign language bindings](#third-party-foreign-language-bindings).
-
-## User Guide
-
-You can read more about using the tool in [**the UniFFI user guide**](https://mozilla.github.io/uniffi-rs/).
-
-We consider it ready for production use, but UniFFI is a long way from a 1.0 release with lots of internal work still going on.
-We try hard to avoid breaking simple consumers, but more advanced things might break as you upgrade over time.
-
-### Etymology and Pronunciation
-
-ˈjuːnɪfaɪ. Pronounced to rhyme with "unify".
-
-A portmanteau word that also puns with "unify", to signify the joining of one codebase accessed from many languages.
-
-uni - [Latin ūni-, from ūnus, one]
-FFI - [Abbreviation, Foreign Function Interface]
-
-## Alternative tools
-
-Other tools we know of which try and solve a similarly shaped problem are:
-
-* [Diplomat](https://github.com/rust-diplomat/diplomat/), which is focused more on C/C++ interop.
-* [Interoptopus](https://github.com/ralfbiedert/interoptopus/)
-
-(Please open a PR if you think other tools should be listed!)
-
-## Third-party foreign language bindings
-
-* [Kotlin Multiplatform support](https://gitlab.com/trixnity/uniffi-kotlin-multiplatform-bindings). The repository contains Kotlin Multiplatform bindings generation for UniFFI, letting you target both JVM and Native.
-* [Go bindings](https://github.com/NordSecurity/uniffi-bindgen-go)
-* [C# bindings](https://github.com/NordSecurity/uniffi-bindgen-cs)
-* [Dart bindings](https://github.com/NiallBunting/uniffi-rs-dart)
-
-### External resources
-
-There are a few third-party resources that make it easier to work with UniFFI:
-
-* [Plugin support for `.udl` files](https://github.com/Lonami/uniffi-dl) for the IDEA platform ([*uniffi-dl* in the JetBrains marketplace](https://plugins.jetbrains.com/plugin/20527-uniffi-dl)). It provides syntax highlighting, code folding, code completion, reference resolution and navigation (among others features) for the [UniFFI Definition Language (UDL)](https://mozilla.github.io/uniffi-rs/).
-* [cargo swift](https://github.com/antoniusnaumann/cargo-swift), a cargo plugin to build a Swift Package from Rust code. It provides an init command for setting up a UniFFI crate and a package command for building a Swift package from Rust code - without the need for additional configuration or build scripts.
-* [Cargo NDK Gradle Plugin](https://github.com/willir/cargo-ndk-android-gradle) allows you to build Rust code using [`cargo-ndk`](https://github.com/bbqsrc/cargo-ndk), which generally makes Android library builds less painful.
-* [`uniffi-starter`](https://github.com/ianthetechie/uniffi-starter) is a minimal project demonstrates a wide range of UniFFI in a complete project in a compact manner. It includes a full Android library build process, an XCFramework generation script, and example Swift package structure. 
-
-(Please open a PR if you think other resources should be listed!)
-
-## Contributing
-
-If this tool sounds interesting to you, please help us develop it! You can:
-
-* View the [contributor guidelines](./docs/contributing.md).
-* File or work on [issues](https://github.com/mozilla/uniffi-rs/issues) here in GitHub.
-* Join discussions in the [#uniffi:mozilla.org](https://matrix.to/#/#uniffi:mozilla.org)
-  room on Matrix.
-
-## Code of Conduct
-
-This project is governed by Mozilla's [Community Participation Guidelines](./CODE_OF_CONDUCT.md).
diff --git a/crates/uniffi_checksum_derive/cargo_embargo.json b/crates/uniffi_checksum_derive/cargo_embargo.json
deleted file mode 100644
index cb908d7..0000000
--- a/crates/uniffi_checksum_derive/cargo_embargo.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-  "run_cargo": false
-}
diff --git a/crates/uniffi_checksum_derive/patches/LICENSE.patch b/crates/uniffi_checksum_derive/patches/LICENSE.patch
deleted file mode 100644
index fecc0b4..0000000
--- a/crates/uniffi_checksum_derive/patches/LICENSE.patch
+++ /dev/null
@@ -1,379 +0,0 @@
-diff --git b/LICENSE a/LICENSE
-new file mode 100644
-index 0000000..a612ad9
---- /dev/null
-+++ a/LICENSE
-@@ -0,0 +1,373 @@
-+Mozilla Public License Version 2.0
-+==================================
-+
-+1. Definitions
-+--------------
-+
-+1.1. "Contributor"
-+    means each individual or legal entity that creates, contributes to
-+    the creation of, or owns Covered Software.
-+
-+1.2. "Contributor Version"
-+    means the combination of the Contributions of others (if any) used
-+    by a Contributor and that particular Contributor's Contribution.
-+
-+1.3. "Contribution"
-+    means Covered Software of a particular Contributor.
-+
-+1.4. "Covered Software"
-+    means Source Code Form to which the initial Contributor has attached
-+    the notice in Exhibit A, the Executable Form of such Source Code
-+    Form, and Modifications of such Source Code Form, in each case
-+    including portions thereof.
-+
-+1.5. "Incompatible With Secondary Licenses"
-+    means
-+
-+    (a) that the initial Contributor has attached the notice described
-+        in Exhibit B to the Covered Software; or
-+
-+    (b) that the Covered Software was made available under the terms of
-+        version 1.1 or earlier of the License, but not also under the
-+        terms of a Secondary License.
-+
-+1.6. "Executable Form"
-+    means any form of the work other than Source Code Form.
-+
-+1.7. "Larger Work"
-+    means a work that combines Covered Software with other material, in
-+    a separate file or files, that is not Covered Software.
-+
-+1.8. "License"
-+    means this document.
-+
-+1.9. "Licensable"
-+    means having the right to grant, to the maximum extent possible,
-+    whether at the time of the initial grant or subsequently, any and
-+    all of the rights conveyed by this License.
-+
-+1.10. "Modifications"
-+    means any of the following:
-+
-+    (a) any file in Source Code Form that results from an addition to,
-+        deletion from, or modification of the contents of Covered
-+        Software; or
-+
-+    (b) any new file in Source Code Form that contains any Covered
-+        Software.
-+
-+1.11. "Patent Claims" of a Contributor
-+    means any patent claim(s), including without limitation, method,
-+    process, and apparatus claims, in any patent Licensable by such
-+    Contributor that would be infringed, but for the grant of the
-+    License, by the making, using, selling, offering for sale, having
-+    made, import, or transfer of either its Contributions or its
-+    Contributor Version.
-+
-+1.12. "Secondary License"
-+    means either the GNU General Public License, Version 2.0, the GNU
-+    Lesser General Public License, Version 2.1, the GNU Affero General
-+    Public License, Version 3.0, or any later versions of those
-+    licenses.
-+
-+1.13. "Source Code Form"
-+    means the form of the work preferred for making modifications.
-+
-+1.14. "You" (or "Your")
-+    means an individual or a legal entity exercising rights under this
-+    License. For legal entities, "You" includes any entity that
-+    controls, is controlled by, or is under common control with You. For
-+    purposes of this definition, "control" means (a) the power, direct
-+    or indirect, to cause the direction or management of such entity,
-+    whether by contract or otherwise, or (b) ownership of more than
-+    fifty percent (50%) of the outstanding shares or beneficial
-+    ownership of such entity.
-+
-+2. License Grants and Conditions
-+--------------------------------
-+
-+2.1. Grants
-+
-+Each Contributor hereby grants You a world-wide, royalty-free,
-+non-exclusive license:
-+
-+(a) under intellectual property rights (other than patent or trademark)
-+    Licensable by such Contributor to use, reproduce, make available,
-+    modify, display, perform, distribute, and otherwise exploit its
-+    Contributions, either on an unmodified basis, with Modifications, or
-+    as part of a Larger Work; and
-+
-+(b) under Patent Claims of such Contributor to make, use, sell, offer
-+    for sale, have made, import, and otherwise transfer either its
-+    Contributions or its Contributor Version.
-+
-+2.2. Effective Date
-+
-+The licenses granted in Section 2.1 with respect to any Contribution
-+become effective for each Contribution on the date the Contributor first
-+distributes such Contribution.
-+
-+2.3. Limitations on Grant Scope
-+
-+The licenses granted in this Section 2 are the only rights granted under
-+this License. No additional rights or licenses will be implied from the
-+distribution or licensing of Covered Software under this License.
-+Notwithstanding Section 2.1(b) above, no patent license is granted by a
-+Contributor:
-+
-+(a) for any code that a Contributor has removed from Covered Software;
-+    or
-+
-+(b) for infringements caused by: (i) Your and any other third party's
-+    modifications of Covered Software, or (ii) the combination of its
-+    Contributions with other software (except as part of its Contributor
-+    Version); or
-+
-+(c) under Patent Claims infringed by Covered Software in the absence of
-+    its Contributions.
-+
-+This License does not grant any rights in the trademarks, service marks,
-+or logos of any Contributor (except as may be necessary to comply with
-+the notice requirements in Section 3.4).
-+
-+2.4. Subsequent Licenses
-+
-+No Contributor makes additional grants as a result of Your choice to
-+distribute the Covered Software under a subsequent version of this
-+License (see Section 10.2) or under the terms of a Secondary License (if
-+permitted under the terms of Section 3.3).
-+
-+2.5. Representation
-+
-+Each Contributor represents that the Contributor believes its
-+Contributions are its original creation(s) or it has sufficient rights
-+to grant the rights to its Contributions conveyed by this License.
-+
-+2.6. Fair Use
-+
-+This License is not intended to limit any rights You have under
-+applicable copyright doctrines of fair use, fair dealing, or other
-+equivalents.
-+
-+2.7. Conditions
-+
-+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
-+in Section 2.1.
-+
-+3. Responsibilities
-+-------------------
-+
-+3.1. Distribution of Source Form
-+
-+All distribution of Covered Software in Source Code Form, including any
-+Modifications that You create or to which You contribute, must be under
-+the terms of this License. You must inform recipients that the Source
-+Code Form of the Covered Software is governed by the terms of this
-+License, and how they can obtain a copy of this License. You may not
-+attempt to alter or restrict the recipients' rights in the Source Code
-+Form.
-+
-+3.2. Distribution of Executable Form
-+
-+If You distribute Covered Software in Executable Form then:
-+
-+(a) such Covered Software must also be made available in Source Code
-+    Form, as described in Section 3.1, and You must inform recipients of
-+    the Executable Form how they can obtain a copy of such Source Code
-+    Form by reasonable means in a timely manner, at a charge no more
-+    than the cost of distribution to the recipient; and
-+
-+(b) You may distribute such Executable Form under the terms of this
-+    License, or sublicense it under different terms, provided that the
-+    license for the Executable Form does not attempt to limit or alter
-+    the recipients' rights in the Source Code Form under this License.
-+
-+3.3. Distribution of a Larger Work
-+
-+You may create and distribute a Larger Work under terms of Your choice,
-+provided that You also comply with the requirements of this License for
-+the Covered Software. If the Larger Work is a combination of Covered
-+Software with a work governed by one or more Secondary Licenses, and the
-+Covered Software is not Incompatible With Secondary Licenses, this
-+License permits You to additionally distribute such Covered Software
-+under the terms of such Secondary License(s), so that the recipient of
-+the Larger Work may, at their option, further distribute the Covered
-+Software under the terms of either this License or such Secondary
-+License(s).
-+
-+3.4. Notices
-+
-+You may not remove or alter the substance of any license notices
-+(including copyright notices, patent notices, disclaimers of warranty,
-+or limitations of liability) contained within the Source Code Form of
-+the Covered Software, except that You may alter any license notices to
-+the extent required to remedy known factual inaccuracies.
-+
-+3.5. Application of Additional Terms
-+
-+You may choose to offer, and to charge a fee for, warranty, support,
-+indemnity or liability obligations to one or more recipients of Covered
-+Software. However, You may do so only on Your own behalf, and not on
-+behalf of any Contributor. You must make it absolutely clear that any
-+such warranty, support, indemnity, or liability obligation is offered by
-+You alone, and You hereby agree to indemnify every Contributor for any
-+liability incurred by such Contributor as a result of warranty, support,
-+indemnity or liability terms You offer. You may include additional
-+disclaimers of warranty and limitations of liability specific to any
-+jurisdiction.
-+
-+4. Inability to Comply Due to Statute or Regulation
-+---------------------------------------------------
-+
-+If it is impossible for You to comply with any of the terms of this
-+License with respect to some or all of the Covered Software due to
-+statute, judicial order, or regulation then You must: (a) comply with
-+the terms of this License to the maximum extent possible; and (b)
-+describe the limitations and the code they affect. Such description must
-+be placed in a text file included with all distributions of the Covered
-+Software under this License. Except to the extent prohibited by statute
-+or regulation, such description must be sufficiently detailed for a
-+recipient of ordinary skill to be able to understand it.
-+
-+5. Termination
-+--------------
-+
-+5.1. The rights granted under this License will terminate automatically
-+if You fail to comply with any of its terms. However, if You become
-+compliant, then the rights granted under this License from a particular
-+Contributor are reinstated (a) provisionally, unless and until such
-+Contributor explicitly and finally terminates Your grants, and (b) on an
-+ongoing basis, if such Contributor fails to notify You of the
-+non-compliance by some reasonable means prior to 60 days after You have
-+come back into compliance. Moreover, Your grants from a particular
-+Contributor are reinstated on an ongoing basis if such Contributor
-+notifies You of the non-compliance by some reasonable means, this is the
-+first time You have received notice of non-compliance with this License
-+from such Contributor, and You become compliant prior to 30 days after
-+Your receipt of the notice.
-+
-+5.2. If You initiate litigation against any entity by asserting a patent
-+infringement claim (excluding declaratory judgment actions,
-+counter-claims, and cross-claims) alleging that a Contributor Version
-+directly or indirectly infringes any patent, then the rights granted to
-+You by any and all Contributors for the Covered Software under Section
-+2.1 of this License shall terminate.
-+
-+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
-+end user license agreements (excluding distributors and resellers) which
-+have been validly granted by You or Your distributors under this License
-+prior to termination shall survive termination.
-+
-+************************************************************************
-+*                                                                      *
-+*  6. Disclaimer of Warranty                                           *
-+*  -------------------------                                           *
-+*                                                                      *
-+*  Covered Software is provided under this License on an "as is"       *
-+*  basis, without warranty of any kind, either expressed, implied, or  *
-+*  statutory, including, without limitation, warranties that the       *
-+*  Covered Software is free of defects, merchantable, fit for a        *
-+*  particular purpose or non-infringing. The entire risk as to the     *
-+*  quality and performance of the Covered Software is with You.        *
-+*  Should any Covered Software prove defective in any respect, You     *
-+*  (not any Contributor) assume the cost of any necessary servicing,   *
-+*  repair, or correction. This disclaimer of warranty constitutes an   *
-+*  essential part of this License. No use of any Covered Software is   *
-+*  authorized under this License except under this disclaimer.         *
-+*                                                                      *
-+************************************************************************
-+
-+************************************************************************
-+*                                                                      *
-+*  7. Limitation of Liability                                          *
-+*  --------------------------                                          *
-+*                                                                      *
-+*  Under no circumstances and under no legal theory, whether tort      *
-+*  (including negligence), contract, or otherwise, shall any           *
-+*  Contributor, or anyone who distributes Covered Software as          *
-+*  permitted above, be liable to You for any direct, indirect,         *
-+*  special, incidental, or consequential damages of any character      *
-+*  including, without limitation, damages for lost profits, loss of    *
-+*  goodwill, work stoppage, computer failure or malfunction, or any    *
-+*  and all other commercial damages or losses, even if such party      *
-+*  shall have been informed of the possibility of such damages. This   *
-+*  limitation of liability shall not apply to liability for death or   *
-+*  personal injury resulting from such party's negligence to the       *
-+*  extent applicable law prohibits such limitation. Some               *
-+*  jurisdictions do not allow the exclusion or limitation of           *
-+*  incidental or consequential damages, so this exclusion and          *
-+*  limitation may not apply to You.                                    *
-+*                                                                      *
-+************************************************************************
-+
-+8. Litigation
-+-------------
-+
-+Any litigation relating to this License may be brought only in the
-+courts of a jurisdiction where the defendant maintains its principal
-+place of business and such litigation shall be governed by laws of that
-+jurisdiction, without reference to its conflict-of-law provisions.
-+Nothing in this Section shall prevent a party's ability to bring
-+cross-claims or counter-claims.
-+
-+9. Miscellaneous
-+----------------
-+
-+This License represents the complete agreement concerning the subject
-+matter hereof. If any provision of this License is held to be
-+unenforceable, such provision shall be reformed only to the extent
-+necessary to make it enforceable. Any law or regulation which provides
-+that the language of a contract shall be construed against the drafter
-+shall not be used to construe this License against a Contributor.
-+
-+10. Versions of the License
-+---------------------------
-+
-+10.1. New Versions
-+
-+Mozilla Foundation is the license steward. Except as provided in Section
-+10.3, no one other than the license steward has the right to modify or
-+publish new versions of this License. Each version will be given a
-+distinguishing version number.
-+
-+10.2. Effect of New Versions
-+
-+You may distribute the Covered Software under the terms of the version
-+of the License under which You originally received the Covered Software,
-+or under the terms of any subsequent version published by the license
-+steward.
-+
-+10.3. Modified Versions
-+
-+If you create software not governed by this License, and you want to
-+create a new license for such software, you may create and use a
-+modified version of this License if you rename the license and remove
-+any references to the name of the license steward (except to note that
-+such modified license differs from this License).
-+
-+10.4. Distributing Source Code Form that is Incompatible With Secondary
-+Licenses
-+
-+If You choose to distribute Source Code Form that is Incompatible With
-+Secondary Licenses under the terms of this version of the License, the
-+notice described in Exhibit B of this License must be attached.
-+
-+Exhibit A - Source Code Form License Notice
-+-------------------------------------------
-+
-+  This Source Code Form is subject to the terms of the Mozilla Public
-+  License, v. 2.0. If a copy of the MPL was not distributed with this
-+  file, You can obtain one at http://mozilla.org/MPL/2.0/.
-+
-+If it is not possible or desirable to put the notice in a particular
-+file, then You may include the notice in a location (such as a LICENSE
-+file in a relevant directory) where a recipient would be likely to look
-+for such a notice.
-+
-+You may add additional accurate notices of copyright ownership.
-+
-+Exhibit B - "Incompatible With Secondary Licenses" Notice
-+---------------------------------------------------------
-+
-+  This Source Code Form is "Incompatible With Secondary Licenses", as
-+  defined by the Mozilla Public License, v. 2.0.
diff --git a/crates/uniffi_checksum_derive/src/lib.rs b/crates/uniffi_checksum_derive/src/lib.rs
deleted file mode 100644
index 449183d..0000000
--- a/crates/uniffi_checksum_derive/src/lib.rs
+++ /dev/null
@@ -1,137 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-//! Custom derive for uniffi_meta::Checksum
-
-use proc_macro::TokenStream;
-use quote::{format_ident, quote};
-use syn::{
-    parse_macro_input, Attribute, Data, DeriveInput, Expr, ExprLit, Fields, Index, Lit, Meta,
-};
-
-fn has_ignore_attribute(attrs: &[Attribute]) -> bool {
-    attrs.iter().any(|attr| {
-        if attr.path().is_ident("checksum_ignore") {
-            if let Meta::List(_) | Meta::NameValue(_) = &attr.meta {
-                panic!("#[checksum_ignore] doesn't accept extra information");
-            }
-            true
-        } else {
-            false
-        }
-    })
-}
-
-#[proc_macro_derive(Checksum, attributes(checksum_ignore))]
-pub fn checksum_derive(input: TokenStream) -> TokenStream {
-    let input: DeriveInput = parse_macro_input!(input);
-
-    let name = input.ident;
-
-    let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl();
-
-    let code = match input.data {
-        Data::Enum(enum_)
-            if enum_.variants.len() == 1
-                && enum_
-                    .variants
-                    .iter()
-                    .all(|variant| matches!(variant.fields, Fields::Unit)) =>
-        {
-            quote!()
-        }
-        Data::Enum(enum_) => {
-            let mut next_discriminant = 0u64;
-            let match_inner = enum_.variants.iter().map(|variant| {
-                let ident = &variant.ident;
-                if has_ignore_attribute(&variant.attrs) {
-                    panic!("#[checksum_ignore] is not supported in enums");
-                }
-                match &variant.discriminant {
-                    Some((_, Expr::Lit(ExprLit { lit: Lit::Int(value), .. }))) => {
-                        next_discriminant = value.base10_parse::<u64>().unwrap();
-                    }
-                    Some(_) => {
-                        panic!("#[derive(Checksum)] doesn't support non-numeric explicit discriminants in enums");
-                    }
-                    None => {}
-                }
-                let discriminant = quote! { state.write(&#next_discriminant.to_le_bytes()) };
-                next_discriminant += 1;
-                match &variant.fields {
-                    Fields::Unnamed(fields) => {
-                        let field_idents = fields
-                            .unnamed
-                            .iter()
-                            .enumerate()
-                            .map(|(num, _)| format_ident!("__self_{}", num));
-                        let field_stmts = field_idents
-                            .clone()
-                            .map(|ident| quote! { Checksum::checksum(#ident, state); });
-                        quote! {
-                            Self::#ident(#(#field_idents,)*) => {
-                                #discriminant;
-                                #(#field_stmts)*
-                            }
-                        }
-                    }
-                    Fields::Named(fields) => {
-                        let field_idents = fields
-                            .named
-                            .iter()
-                            .map(|field| field.ident.as_ref().unwrap());
-                        let field_stmts = fields.named.iter()
-                            .filter(|field| !has_ignore_attribute(&field.attrs))
-                            .map(|field| {
-                                    let ident = field.ident.as_ref().unwrap();
-                                    quote! { Checksum::checksum(#ident, state); }
-                            });
-                        quote! {
-                            Self::#ident { #(#field_idents,)* } => {
-                                #discriminant;
-                                #(#field_stmts)*
-                            }
-                        }
-                    }
-                    Fields::Unit => quote! { Self::#ident => #discriminant, },
-                }
-            });
-            quote! {
-                match self {
-                    #(#match_inner)*
-                }
-            }
-        }
-        Data::Struct(struct_) => {
-            let stmts = struct_
-                .fields
-                .iter()
-                .enumerate()
-                .filter(|&(_num, field)| (!has_ignore_attribute(&field.attrs)))
-                .map(|(num, field)| match field.ident.as_ref() {
-                    Some(ident) => quote! { Checksum::checksum(&self.#ident, state); },
-                    None => {
-                        let i = Index::from(num);
-                        quote! { Checksum::checksum(&self.#i, state); }
-                    }
-                });
-            quote! {
-                #(#stmts)*
-            }
-        }
-        Data::Union(_) => {
-            panic!("#[derive(Checksum)] is not supported for unions");
-        }
-    };
-
-    quote! {
-        #[automatically_derived]
-        impl #impl_generics Checksum for #name #ty_generics #where_clause {
-            fn checksum<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
-                #code
-            }
-        }
-    }
-    .into()
-}
diff --git a/crates/uniffi_core/.android-checksum.json b/crates/uniffi_core/.android-checksum.json
deleted file mode 100644
index 8c3719f..0000000
--- a/crates/uniffi_core/.android-checksum.json
+++ /dev/null
@@ -1 +0,0 @@
-{"package":null,"files":{".cargo-checksum.json":"14dab0f570843032868764ad21e02c3c1c67c09a041c70f0bdd8783bf420d0ce","Android.bp":"1d0e67b07620bfb8a67da7d26f0b74b266ede993469c3d76280955c7a08df2ca","Cargo.toml":"1e4e6809674b75a111db5bdbada0e3cb4d4a12303e1e3cba7c59abba63b4361b","LICENSE":"eb272adec43829624ef944827cee5edc5896c80ceaccea3e8e471dadeaeee408","METADATA":"f6e7f68c75e5a1ff75be32b76b76757716382d284df39098fce2e5dca444ce9e","MODULE_LICENSE_MPL":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"8528d929c10fb2ef91706a54de19896a66a8636432d18835228fd13c183506c4","TEST_MAPPING":"bd231adfd10dc1f63d95d16bf864fe7442c41be44b45109af252fe79ae7bd43d","cargo_embargo.json":"9f85647b222182436a6732595dfb841ecde75035ec4db2d52019accd1d896e22","patches/LICENSE.patch":"cfb7d0c0c947397e0cf46698509020438a9a3305875ecf9b75fafeb30815ac80","release.toml":"6a735d0b83145b4d8de35d639db667a55391ec01272062bf3df4e03d74a89deb","src/ffi/callbackinterface.rs":"d4a46b5c26fdcdc5b2d026a725095f0966f503e63a2f996329b9644cb0d40a03","src/ffi/ffidefault.rs":"94acaecc83ce7b3a69b497664d13f19d6fe8d5777bac3f9a5d6fb8db0322042d","src/ffi/foreignbytes.rs":"fb1d54ab93b7ef471583ef7a4c5f4853685298bce6635105836bb45d8733b545","src/ffi/foreigncallbacks.rs":"61c51fdc9431e50c09d365bc7f7dc9a01ec6b86f54e3f2ed0b97b2a0dc2f5e35","src/ffi/foreignfuture.rs":"10bdd919d7c23ed0f10fc877c7665665ed235bcfb0d7bba6f1ee7db5bc962e62","src/ffi/handle.rs":"7ab48f0ca466cf1997c46bf0e425bdc2b49680cffb1dd75657494190d736c000","src/ffi/mod.rs":"30dc2af4ece6b99e138fefc8eeaa56fc8f16e6dcc9526c92ee635f10330e489e","src/ffi/rustbuffer.rs":"66d8d23e222b0aa778eba63ffc7ddd722f0fa1bf4385d282065b3b266f55f97f","src/ffi/rustcalls.rs":"02f1c26feafbd8fd90240786c16978b5103ddf9e42728cabc672c33d36f1d3bd","src/ffi/rustfuture/future.rs":"1fd230e11f39a4fc1c1d11bcc97c824f292a6ce5b2b539e4382657f9e3593e19","src/ffi/rustfuture/mod.rs":"cf5fed69d61c19533d4b4713d305332a2e4e408d893099ba6eab0181783e14b6","src/ffi/rustfuture/scheduler.rs":"2b7d550ebaaf928529da8291183471a0028054dfffd0356e2c2c9bfe8c758894","src/ffi/rustfuture/tests.rs":"ba475494043f00a5f127df964c3479505ebd1e55aedb045e1359b40a6c3ff263","src/ffi_converter_impls.rs":"496d3dfff2b3a5e9b91a6dd20feb895ef9fc8ad1c75082fed9e3b5f541aa84c6","src/ffi_converter_traits.rs":"a8c0fa62bf65d173982363af979f3dddfcbb61b189d1008c091ef57bdc92aa85","src/lib.rs":"d8f4c356f2d43fba825d834a776ea34347e772165bf7e27361e99cdcb9881341","src/metadata.rs":"93966520566fadb65d051829a3757a679e16d274e6ebfe8ad19972dc5baa27bb","src/panichook.rs":"338cb7385aa8107a0e6d01e5572ad20e088d6ac189fa390cd830c65133d1e6a4"}}
\ No newline at end of file
diff --git a/crates/uniffi_core/.cargo-checksum.json b/crates/uniffi_core/.cargo-checksum.json
deleted file mode 100644
index 573f7a7..0000000
--- a/crates/uniffi_core/.cargo-checksum.json
+++ /dev/null
@@ -1 +0,0 @@
-{"files":{"Cargo.toml":"c8969fbc6e8f6694e260ab78c94f9b4195d61afb7836b4c130b542d3b91b9200","README.md":"37c1af00ec81a9f1bc206ab3578356e5f9ad4077dc46dd1bb623d81d804948b8","release.toml":"b150796411fc6ff90b481218cb50f8ac7c07f5845aebdb8e17877d47e55b05b9","src/ffi/callbackinterface.rs":"f0184cf76bd86abb2815d260a87f85bd7060f5373ac6ef6f71955ece2a5075af","src/ffi/ffidefault.rs":"0db83fbcbc274c4c0daf7fb27833400568839b77a3496155840734c511d801e0","src/ffi/foreignbytes.rs":"d2b46e1a6317aa64801b855e0d12af6bcdef118d8036603d11c3cdaf6f35fdfe","src/ffi/foreigncallbacks.rs":"2b820a34b78705f5debc302a25c64d515a4aa7b3bdade083f4c1cfa2803664ae","src/ffi/foreignfuture.rs":"c1d621e41ea6af0c1d3959b46af8567c3fdc4164e7a82d635fcbb1da2c0737ac","src/ffi/handle.rs":"91f91469a81cb19edebb8bba433df62658cc66f6b54d5dc8520eb5793a85abd9","src/ffi/mod.rs":"30eea545299747838bf11b0698cfb71cedd3ca04d8cfb703c53198fcc44045c1","src/ffi/rustbuffer.rs":"0e725347f916834b17156413f406d5ca6c064b2cbc7437b051fe6692ad72c2aa","src/ffi/rustcalls.rs":"51c6499871c7d5eb4f80cabc806f26dd1df3b1090a2419d0d967aa9c5299a0a6","src/ffi/rustfuture/future.rs":"426cd0ad3c8cf008a7052a7d89856b6c6d5053b94e24325f5666d0281a40ec7f","src/ffi/rustfuture/mod.rs":"44568267e591f5b37f77acfdd6e60ae55ce48ab0a17fd81af3aeb31baa3d53e6","src/ffi/rustfuture/scheduler.rs":"c6484fff14c04596df5f306f2090366435dcff92561d317fde1ea9c097a9576b","src/ffi/rustfuture/tests.rs":"211241fb484a3a103eb0418e7d295850ea021bcd583fa1488f5efc68f33d5ab8","src/ffi_converter_impls.rs":"397c813f2e765462d7a7be524e6ac75e813a91a8ffd11c7e7df05f853213f77b","src/ffi_converter_traits.rs":"24c8cf6ada9b2f63b265e62c0f9092d640e533d0d7234e9156f92c3d1902f430","src/lib.rs":"1f6a031bbb160dfe46455a8bc24596f63b1e478f45579bfff62a62f58900bee4","src/metadata.rs":"83e463c377c0f501e58ac4eb5cc47c433c1473cecd47305fa89283e736b48d96","src/panichook.rs":"9f49c7994a8e5489c1105c488bb3f8c5571bc5f813e7be90441eca15da5c9851"},"package":"0ea3eb5474d50fc149b7e4d86b9c5bd4a61dcc167f0683902bf18ae7bbb3deef"}
\ No newline at end of file
diff --git a/crates/uniffi_core/Android.bp b/crates/uniffi_core/Android.bp
deleted file mode 100644
index 6ab9670..0000000
--- a/crates/uniffi_core/Android.bp
+++ /dev/null
@@ -1,69 +0,0 @@
-// This file is generated by cargo_embargo.
-// Do not modify this file because the changes will be overridden on upgrade.
-
-package {
-    default_applicable_licenses: ["external_rust_crates_uniffi_core_license"],
-    default_team: "trendy_team_android_rust",
-}
-
-license {
-    name: "external_rust_crates_uniffi_core_license",
-    visibility: [":__subpackages__"],
-    license_kinds: ["SPDX-license-identifier-MPL-2.0"],
-    license_text: ["LICENSE"],
-}
-
-rust_library {
-    name: "libuniffi_core",
-    host_supported: true,
-    crate_name: "uniffi_core",
-    cargo_env_compat: true,
-    cargo_pkg_version: "0.27.1",
-    crate_root: "src/lib.rs",
-    edition: "2021",
-    features: ["default"],
-    rustlibs: [
-        "libanyhow",
-        "libbytes",
-        "libcamino",
-        "liblog_rust",
-        "libonce_cell",
-        "liboneshot_uniffi",
-        "libstatic_assertions",
-    ],
-    proc_macros: ["libpaste"],
-    aliases: ["oneshot_uniffi:oneshot"],
-    apex_available: [
-        "//apex_available:platform",
-        "//apex_available:anyapex",
-    ],
-    product_available: true,
-    vendor_available: true,
-}
-
-rust_test {
-    name: "uniffi_core_test_src_lib",
-    host_supported: true,
-    crate_name: "uniffi_core",
-    cargo_env_compat: true,
-    cargo_pkg_version: "0.27.1",
-    crate_root: "src/lib.rs",
-    test_suites: ["general-tests"],
-    auto_gen_config: true,
-    test_options: {
-        unit_test: true,
-    },
-    edition: "2021",
-    features: ["default"],
-    rustlibs: [
-        "libanyhow",
-        "libbytes",
-        "libcamino",
-        "liblog_rust",
-        "libonce_cell",
-        "liboneshot_uniffi",
-        "libstatic_assertions",
-    ],
-    proc_macros: ["libpaste"],
-    aliases: ["oneshot_uniffi:oneshot"],
-}
diff --git a/crates/uniffi_core/Cargo.toml b/crates/uniffi_core/Cargo.toml
deleted file mode 100644
index ce36a21..0000000
--- a/crates/uniffi_core/Cargo.toml
+++ /dev/null
@@ -1,60 +0,0 @@
-# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
-#
-# When uploading crates to the registry Cargo will automatically
-# "normalize" Cargo.toml files for maximal compatibility
-# with all versions of Cargo and also rewrite `path` dependencies
-# to registry (e.g., crates.io) dependencies.
-#
-# If you are reading this file be aware that the original Cargo.toml
-# will likely look very different (and much more reasonable).
-# See Cargo.toml.orig for the original contents.
-
-[package]
-edition = "2021"
-name = "uniffi_core"
-version = "0.27.1"
-authors = ["Firefox Sync Team <[email protected]>"]
-description = "a multi-language bindings generator for rust (runtime support code)"
-homepage = "https://mozilla.github.io/uniffi-rs"
-documentation = "https://mozilla.github.io/uniffi-rs"
-readme = "README.md"
-keywords = [
-    "ffi",
-    "bindgen",
-]
-license = "MPL-2.0"
-repository = "https://github.com/mozilla/uniffi-rs"
-
-[dependencies.anyhow]
-version = "1"
-
-[dependencies.async-compat]
-version = "0.2.1"
-optional = true
-
-[dependencies.bytes]
-version = "1.3"
-
-[dependencies.camino]
-version = "1.0.8"
-
-[dependencies.log]
-version = "0.4"
-
-[dependencies.once_cell]
-version = "1.10.0"
-
-[dependencies.oneshot]
-version = "0.1.6"
-features = ["async"]
-package = "oneshot-uniffi"
-
-[dependencies.paste]
-version = "1.0"
-
-[dependencies.static_assertions]
-version = "1.1.0"
-
-[features]
-default = []
-tokio = ["dep:async-compat"]
diff --git a/crates/uniffi_core/LICENSE b/crates/uniffi_core/LICENSE
deleted file mode 100644
index a612ad9..0000000
--- a/crates/uniffi_core/LICENSE
+++ /dev/null
@@ -1,373 +0,0 @@
-Mozilla Public License Version 2.0
-==================================
-
-1. Definitions
---------------
-
-1.1. "Contributor"
-    means each individual or legal entity that creates, contributes to
-    the creation of, or owns Covered Software.
-
-1.2. "Contributor Version"
-    means the combination of the Contributions of others (if any) used
-    by a Contributor and that particular Contributor's Contribution.
-
-1.3. "Contribution"
-    means Covered Software of a particular Contributor.
-
-1.4. "Covered Software"
-    means Source Code Form to which the initial Contributor has attached
-    the notice in Exhibit A, the Executable Form of such Source Code
-    Form, and Modifications of such Source Code Form, in each case
-    including portions thereof.
-
-1.5. "Incompatible With Secondary Licenses"
-    means
-
-    (a) that the initial Contributor has attached the notice described
-        in Exhibit B to the Covered Software; or
-
-    (b) that the Covered Software was made available under the terms of
-        version 1.1 or earlier of the License, but not also under the
-        terms of a Secondary License.
-
-1.6. "Executable Form"
-    means any form of the work other than Source Code Form.
-
-1.7. "Larger Work"
-    means a work that combines Covered Software with other material, in
-    a separate file or files, that is not Covered Software.
-
-1.8. "License"
-    means this document.
-
-1.9. "Licensable"
-    means having the right to grant, to the maximum extent possible,
-    whether at the time of the initial grant or subsequently, any and
-    all of the rights conveyed by this License.
-
-1.10. "Modifications"
-    means any of the following:
-
-    (a) any file in Source Code Form that results from an addition to,
-        deletion from, or modification of the contents of Covered
-        Software; or
-
-    (b) any new file in Source Code Form that contains any Covered
-        Software.
-
-1.11. "Patent Claims" of a Contributor
-    means any patent claim(s), including without limitation, method,
-    process, and apparatus claims, in any patent Licensable by such
-    Contributor that would be infringed, but for the grant of the
-    License, by the making, using, selling, offering for sale, having
-    made, import, or transfer of either its Contributions or its
-    Contributor Version.
-
-1.12. "Secondary License"
-    means either the GNU General Public License, Version 2.0, the GNU
-    Lesser General Public License, Version 2.1, the GNU Affero General
-    Public License, Version 3.0, or any later versions of those
-    licenses.
-
-1.13. "Source Code Form"
-    means the form of the work preferred for making modifications.
-
-1.14. "You" (or "Your")
-    means an individual or a legal entity exercising rights under this
-    License. For legal entities, "You" includes any entity that
-    controls, is controlled by, or is under common control with You. For
-    purposes of this definition, "control" means (a) the power, direct
-    or indirect, to cause the direction or management of such entity,
-    whether by contract or otherwise, or (b) ownership of more than
-    fifty percent (50%) of the outstanding shares or beneficial
-    ownership of such entity.
-
-2. License Grants and Conditions
---------------------------------
-
-2.1. Grants
-
-Each Contributor hereby grants You a world-wide, royalty-free,
-non-exclusive license:
-
-(a) under intellectual property rights (other than patent or trademark)
-    Licensable by such Contributor to use, reproduce, make available,
-    modify, display, perform, distribute, and otherwise exploit its
-    Contributions, either on an unmodified basis, with Modifications, or
-    as part of a Larger Work; and
-
-(b) under Patent Claims of such Contributor to make, use, sell, offer
-    for sale, have made, import, and otherwise transfer either its
-    Contributions or its Contributor Version.
-
-2.2. Effective Date
-
-The licenses granted in Section 2.1 with respect to any Contribution
-become effective for each Contribution on the date the Contributor first
-distributes such Contribution.
-
-2.3. Limitations on Grant Scope
-
-The licenses granted in this Section 2 are the only rights granted under
-this License. No additional rights or licenses will be implied from the
-distribution or licensing of Covered Software under this License.
-Notwithstanding Section 2.1(b) above, no patent license is granted by a
-Contributor:
-
-(a) for any code that a Contributor has removed from Covered Software;
-    or
-
-(b) for infringements caused by: (i) Your and any other third party's
-    modifications of Covered Software, or (ii) the combination of its
-    Contributions with other software (except as part of its Contributor
-    Version); or
-
-(c) under Patent Claims infringed by Covered Software in the absence of
-    its Contributions.
-
-This License does not grant any rights in the trademarks, service marks,
-or logos of any Contributor (except as may be necessary to comply with
-the notice requirements in Section 3.4).
-
-2.4. Subsequent Licenses
-
-No Contributor makes additional grants as a result of Your choice to
-distribute the Covered Software under a subsequent version of this
-License (see Section 10.2) or under the terms of a Secondary License (if
-permitted under the terms of Section 3.3).
-
-2.5. Representation
-
-Each Contributor represents that the Contributor believes its
-Contributions are its original creation(s) or it has sufficient rights
-to grant the rights to its Contributions conveyed by this License.
-
-2.6. Fair Use
-
-This License is not intended to limit any rights You have under
-applicable copyright doctrines of fair use, fair dealing, or other
-equivalents.
-
-2.7. Conditions
-
-Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
-in Section 2.1.
-
-3. Responsibilities
--------------------
-
-3.1. Distribution of Source Form
-
-All distribution of Covered Software in Source Code Form, including any
-Modifications that You create or to which You contribute, must be under
-the terms of this License. You must inform recipients that the Source
-Code Form of the Covered Software is governed by the terms of this
-License, and how they can obtain a copy of this License. You may not
-attempt to alter or restrict the recipients' rights in the Source Code
-Form.
-
-3.2. Distribution of Executable Form
-
-If You distribute Covered Software in Executable Form then:
-
-(a) such Covered Software must also be made available in Source Code
-    Form, as described in Section 3.1, and You must inform recipients of
-    the Executable Form how they can obtain a copy of such Source Code
-    Form by reasonable means in a timely manner, at a charge no more
-    than the cost of distribution to the recipient; and
-
-(b) You may distribute such Executable Form under the terms of this
-    License, or sublicense it under different terms, provided that the
-    license for the Executable Form does not attempt to limit or alter
-    the recipients' rights in the Source Code Form under this License.
-
-3.3. Distribution of a Larger Work
-
-You may create and distribute a Larger Work under terms of Your choice,
-provided that You also comply with the requirements of this License for
-the Covered Software. If the Larger Work is a combination of Covered
-Software with a work governed by one or more Secondary Licenses, and the
-Covered Software is not Incompatible With Secondary Licenses, this
-License permits You to additionally distribute such Covered Software
-under the terms of such Secondary License(s), so that the recipient of
-the Larger Work may, at their option, further distribute the Covered
-Software under the terms of either this License or such Secondary
-License(s).
-
-3.4. Notices
-
-You may not remove or alter the substance of any license notices
-(including copyright notices, patent notices, disclaimers of warranty,
-or limitations of liability) contained within the Source Code Form of
-the Covered Software, except that You may alter any license notices to
-the extent required to remedy known factual inaccuracies.
-
-3.5. Application of Additional Terms
-
-You may choose to offer, and to charge a fee for, warranty, support,
-indemnity or liability obligations to one or more recipients of Covered
-Software. However, You may do so only on Your own behalf, and not on
-behalf of any Contributor. You must make it absolutely clear that any
-such warranty, support, indemnity, or liability obligation is offered by
-You alone, and You hereby agree to indemnify every Contributor for any
-liability incurred by such Contributor as a result of warranty, support,
-indemnity or liability terms You offer. You may include additional
-disclaimers of warranty and limitations of liability specific to any
-jurisdiction.
-
-4. Inability to Comply Due to Statute or Regulation
----------------------------------------------------
-
-If it is impossible for You to comply with any of the terms of this
-License with respect to some or all of the Covered Software due to
-statute, judicial order, or regulation then You must: (a) comply with
-the terms of this License to the maximum extent possible; and (b)
-describe the limitations and the code they affect. Such description must
-be placed in a text file included with all distributions of the Covered
-Software under this License. Except to the extent prohibited by statute
-or regulation, such description must be sufficiently detailed for a
-recipient of ordinary skill to be able to understand it.
-
-5. Termination
---------------
-
-5.1. The rights granted under this License will terminate automatically
-if You fail to comply with any of its terms. However, if You become
-compliant, then the rights granted under this License from a particular
-Contributor are reinstated (a) provisionally, unless and until such
-Contributor explicitly and finally terminates Your grants, and (b) on an
-ongoing basis, if such Contributor fails to notify You of the
-non-compliance by some reasonable means prior to 60 days after You have
-come back into compliance. Moreover, Your grants from a particular
-Contributor are reinstated on an ongoing basis if such Contributor
-notifies You of the non-compliance by some reasonable means, this is the
-first time You have received notice of non-compliance with this License
-from such Contributor, and You become compliant prior to 30 days after
-Your receipt of the notice.
-
-5.2. If You initiate litigation against any entity by asserting a patent
-infringement claim (excluding declaratory judgment actions,
-counter-claims, and cross-claims) alleging that a Contributor Version
-directly or indirectly infringes any patent, then the rights granted to
-You by any and all Contributors for the Covered Software under Section
-2.1 of this License shall terminate.
-
-5.3. In the event of termination under Sections 5.1 or 5.2 above, all
-end user license agreements (excluding distributors and resellers) which
-have been validly granted by You or Your distributors under this License
-prior to termination shall survive termination.
-
-************************************************************************
-*                                                                      *
-*  6. Disclaimer of Warranty                                           *
-*  -------------------------                                           *
-*                                                                      *
-*  Covered Software is provided under this License on an "as is"       *
-*  basis, without warranty of any kind, either expressed, implied, or  *
-*  statutory, including, without limitation, warranties that the       *
-*  Covered Software is free of defects, merchantable, fit for a        *
-*  particular purpose or non-infringing. The entire risk as to the     *
-*  quality and performance of the Covered Software is with You.        *
-*  Should any Covered Software prove defective in any respect, You     *
-*  (not any Contributor) assume the cost of any necessary servicing,   *
-*  repair, or correction. This disclaimer of warranty constitutes an   *
-*  essential part of this License. No use of any Covered Software is   *
-*  authorized under this License except under this disclaimer.         *
-*                                                                      *
-************************************************************************
-
-************************************************************************
-*                                                                      *
-*  7. Limitation of Liability                                          *
-*  --------------------------                                          *
-*                                                                      *
-*  Under no circumstances and under no legal theory, whether tort      *
-*  (including negligence), contract, or otherwise, shall any           *
-*  Contributor, or anyone who distributes Covered Software as          *
-*  permitted above, be liable to You for any direct, indirect,         *
-*  special, incidental, or consequential damages of any character      *
-*  including, without limitation, damages for lost profits, loss of    *
-*  goodwill, work stoppage, computer failure or malfunction, or any    *
-*  and all other commercial damages or losses, even if such party      *
-*  shall have been informed of the possibility of such damages. This   *
-*  limitation of liability shall not apply to liability for death or   *
-*  personal injury resulting from such party's negligence to the       *
-*  extent applicable law prohibits such limitation. Some               *
-*  jurisdictions do not allow the exclusion or limitation of           *
-*  incidental or consequential damages, so this exclusion and          *
-*  limitation may not apply to You.                                    *
-*                                                                      *
-************************************************************************
-
-8. Litigation
--------------
-
-Any litigation relating to this License may be brought only in the
-courts of a jurisdiction where the defendant maintains its principal
-place of business and such litigation shall be governed by laws of that
-jurisdiction, without reference to its conflict-of-law provisions.
-Nothing in this Section shall prevent a party's ability to bring
-cross-claims or counter-claims.
-
-9. Miscellaneous
-----------------
-
-This License represents the complete agreement concerning the subject
-matter hereof. If any provision of this License is held to be
-unenforceable, such provision shall be reformed only to the extent
-necessary to make it enforceable. Any law or regulation which provides
-that the language of a contract shall be construed against the drafter
-shall not be used to construe this License against a Contributor.
-
-10. Versions of the License
----------------------------
-
-10.1. New Versions
-
-Mozilla Foundation is the license steward. Except as provided in Section
-10.3, no one other than the license steward has the right to modify or
-publish new versions of this License. Each version will be given a
-distinguishing version number.
-
-10.2. Effect of New Versions
-
-You may distribute the Covered Software under the terms of the version
-of the License under which You originally received the Covered Software,
-or under the terms of any subsequent version published by the license
-steward.
-
-10.3. Modified Versions
-
-If you create software not governed by this License, and you want to
-create a new license for such software, you may create and use a
-modified version of this License if you rename the license and remove
-any references to the name of the license steward (except to note that
-such modified license differs from this License).
-
-10.4. Distributing Source Code Form that is Incompatible With Secondary
-Licenses
-
-If You choose to distribute Source Code Form that is Incompatible With
-Secondary Licenses under the terms of this version of the License, the
-notice described in Exhibit B of this License must be attached.
-
-Exhibit A - Source Code Form License Notice
--------------------------------------------
-
-  This Source Code Form is subject to the terms of the Mozilla Public
-  License, v. 2.0. If a copy of the MPL was not distributed with this
-  file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-If it is not possible or desirable to put the notice in a particular
-file, then You may include the notice in a location (such as a LICENSE
-file in a relevant directory) where a recipient would be likely to look
-for such a notice.
-
-You may add additional accurate notices of copyright ownership.
-
-Exhibit B - "Incompatible With Secondary Licenses" Notice
----------------------------------------------------------
-
-  This Source Code Form is "Incompatible With Secondary Licenses", as
-  defined by the Mozilla Public License, v. 2.0.
diff --git a/crates/uniffi_core/METADATA b/crates/uniffi_core/METADATA
deleted file mode 100644
index 586808c..0000000
--- a/crates/uniffi_core/METADATA
+++ /dev/null
@@ -1,17 +0,0 @@
-name: "uniffi_core"
-description: "a multi-language bindings generator for rust (runtime support code)"
-third_party {
-  version: "0.27.1"
-  license_type: RECIPROCAL
-  last_upgrade_date {
-    year: 2024
-    month: 5
-    day: 6
-  }
-  homepage: "https://crates.io/crates/uniffi_core"
-  identifier {
-    type: "Archive"
-    value: "https://static.crates.io/crates/uniffi_core/uniffi_core-0.27.1.crate"
-    version: "0.27.1"
-  }
-}
diff --git a/crates/uniffi_core/MODULE_LICENSE_MPL b/crates/uniffi_core/MODULE_LICENSE_MPL
deleted file mode 100644
index e69de29..0000000
--- a/crates/uniffi_core/MODULE_LICENSE_MPL
+++ /dev/null
diff --git a/crates/uniffi_core/README.md b/crates/uniffi_core/README.md
deleted file mode 100644
index 64ac348..0000000
--- a/crates/uniffi_core/README.md
+++ /dev/null
@@ -1,81 +0,0 @@
-# UniFFI - a multi-language bindings generator for Rust
-
-UniFFI is a toolkit for building cross-platform software components in Rust.
-
-For the impatient, see [**the UniFFI user guide**](https://mozilla.github.io/uniffi-rs/)
-or [**the UniFFI examples**](https://github.com/mozilla/uniffi-rs/tree/main/examples#example-uniffi-components).
-
-By writing your core business logic in Rust and describing its interface in an "object model",
-you can use UniFFI to help you:
-
-* Compile your Rust code into a shared library for use on different target platforms.
-* Generate bindings to load and use the library from different target languages.
-
-You can describe your object model in an [interface definition file](https://mozilla.github.io/uniffi-rs/udl_file_spec.html)
-or [by using proc-macros](https://mozilla.github.io/uniffi-rs/proc_macro/index.html).
-
-UniFFI is currently used extensively by Mozilla in Firefox mobile and desktop browsers;
-written once in Rust, auto-generated bindings allow that functionality to be called
-from both Kotlin (for Android apps) and Swift (for iOS apps).
-It also has a growing community of users shipping various cool things to many users.
-
-UniFFI comes with support for **Kotlin**, **Swift**, **Python** and **Ruby** with 3rd party bindings available for **C#** and **Golang**.
-Additional foreign language bindings can be developed externally and we welcome contributions to list them here.
-See [Third-party foreign language bindings](#third-party-foreign-language-bindings).
-
-## User Guide
-
-You can read more about using the tool in [**the UniFFI user guide**](https://mozilla.github.io/uniffi-rs/).
-
-We consider it ready for production use, but UniFFI is a long way from a 1.0 release with lots of internal work still going on.
-We try hard to avoid breaking simple consumers, but more advanced things might break as you upgrade over time.
-
-### Etymology and Pronunciation
-
-ˈjuːnɪfaɪ. Pronounced to rhyme with "unify".
-
-A portmanteau word that also puns with "unify", to signify the joining of one codebase accessed from many languages.
-
-uni - [Latin ūni-, from ūnus, one]
-FFI - [Abbreviation, Foreign Function Interface]
-
-## Alternative tools
-
-Other tools we know of which try and solve a similarly shaped problem are:
-
-* [Diplomat](https://github.com/rust-diplomat/diplomat/) - see our [writeup of
-  the different approach taken by that tool](docs/diplomat-and-macros.md)
-* [Interoptopus](https://github.com/ralfbiedert/interoptopus/)
-
-(Please open a PR if you think other tools should be listed!)
-
-## Third-party foreign language bindings
-
-* [Kotlin Multiplatform support](https://gitlab.com/trixnity/uniffi-kotlin-multiplatform-bindings). The repository contains Kotlin Multiplatform bindings generation for UniFFI, letting you target both JVM and Native.
-* [Go bindings](https://github.com/NordSecurity/uniffi-bindgen-go)
-* [C# bindings](https://github.com/NordSecurity/uniffi-bindgen-cs)
-* [Dart bindings](https://github.com/NiallBunting/uniffi-rs-dart)
-
-### External resources
-
-There are a few third-party resources that make it easier to work with UniFFI:
-
-* [Plugin support for `.udl` files](https://github.com/Lonami/uniffi-dl) for the IDEA platform ([*uniffi-dl* in the JetBrains marketplace](https://plugins.jetbrains.com/plugin/20527-uniffi-dl)). It provides syntax highlighting, code folding, code completion, reference resolution and navigation (among others features) for the [UniFFI Definition Language (UDL)](https://mozilla.github.io/uniffi-rs/).
-* [cargo swift](https://github.com/antoniusnaumann/cargo-swift), a cargo plugin to build a Swift Package from Rust code. It provides an init command for setting up a UniFFI crate and a package command for building a Swift package from Rust code - without the need for additional configuration or build scripts.
-* [Cargo NDK Gradle Plugin](https://github.com/willir/cargo-ndk-android-gradle) allows you to build Rust code using [`cargo-ndk`](https://github.com/bbqsrc/cargo-ndk), which generally makes Android library builds less painful.
-* [`uniffi-starter`](https://github.com/ianthetechie/uniffi-starter) is a minimal project demonstrates a wide range of UniFFI in a complete project in a compact manner. It includes a full Android library build process, an XCFramework generation script, and example Swift package structure. 
-
-(Please open a PR if you think other resources should be listed!)
-
-## Contributing
-
-If this tool sounds interesting to you, please help us develop it! You can:
-
-* View the [contributor guidelines](./docs/contributing.md).
-* File or work on [issues](https://github.com/mozilla/uniffi-rs/issues) here in GitHub.
-* Join discussions in the [#uniffi:mozilla.org](https://matrix.to/#/#uniffi:mozilla.org)
-  room on Matrix.
-
-## Code of Conduct
-
-This project is governed by Mozilla's [Community Participation Guidelines](./CODE_OF_CONDUCT.md).
diff --git a/crates/uniffi_core/TEST_MAPPING b/crates/uniffi_core/TEST_MAPPING
deleted file mode 100644
index 2a309fd..0000000
--- a/crates/uniffi_core/TEST_MAPPING
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  "postsubmit": [
-    {
-      "name": "uniffi_core_test_src_lib"
-    }
-  ]
-}
diff --git a/crates/uniffi_core/cargo_embargo.json b/crates/uniffi_core/cargo_embargo.json
deleted file mode 100644
index d40889a..0000000
--- a/crates/uniffi_core/cargo_embargo.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
-    "run_cargo": false,
-    "tests": true
-}
diff --git a/crates/uniffi_core/patches/LICENSE.patch b/crates/uniffi_core/patches/LICENSE.patch
deleted file mode 100644
index fecc0b4..0000000
--- a/crates/uniffi_core/patches/LICENSE.patch
+++ /dev/null
@@ -1,379 +0,0 @@
-diff --git b/LICENSE a/LICENSE
-new file mode 100644
-index 0000000..a612ad9
---- /dev/null
-+++ a/LICENSE
-@@ -0,0 +1,373 @@
-+Mozilla Public License Version 2.0
-+==================================
-+
-+1. Definitions
-+--------------
-+
-+1.1. "Contributor"
-+    means each individual or legal entity that creates, contributes to
-+    the creation of, or owns Covered Software.
-+
-+1.2. "Contributor Version"
-+    means the combination of the Contributions of others (if any) used
-+    by a Contributor and that particular Contributor's Contribution.
-+
-+1.3. "Contribution"
-+    means Covered Software of a particular Contributor.
-+
-+1.4. "Covered Software"
-+    means Source Code Form to which the initial Contributor has attached
-+    the notice in Exhibit A, the Executable Form of such Source Code
-+    Form, and Modifications of such Source Code Form, in each case
-+    including portions thereof.
-+
-+1.5. "Incompatible With Secondary Licenses"
-+    means
-+
-+    (a) that the initial Contributor has attached the notice described
-+        in Exhibit B to the Covered Software; or
-+
-+    (b) that the Covered Software was made available under the terms of
-+        version 1.1 or earlier of the License, but not also under the
-+        terms of a Secondary License.
-+
-+1.6. "Executable Form"
-+    means any form of the work other than Source Code Form.
-+
-+1.7. "Larger Work"
-+    means a work that combines Covered Software with other material, in
-+    a separate file or files, that is not Covered Software.
-+
-+1.8. "License"
-+    means this document.
-+
-+1.9. "Licensable"
-+    means having the right to grant, to the maximum extent possible,
-+    whether at the time of the initial grant or subsequently, any and
-+    all of the rights conveyed by this License.
-+
-+1.10. "Modifications"
-+    means any of the following:
-+
-+    (a) any file in Source Code Form that results from an addition to,
-+        deletion from, or modification of the contents of Covered
-+        Software; or
-+
-+    (b) any new file in Source Code Form that contains any Covered
-+        Software.
-+
-+1.11. "Patent Claims" of a Contributor
-+    means any patent claim(s), including without limitation, method,
-+    process, and apparatus claims, in any patent Licensable by such
-+    Contributor that would be infringed, but for the grant of the
-+    License, by the making, using, selling, offering for sale, having
-+    made, import, or transfer of either its Contributions or its
-+    Contributor Version.
-+
-+1.12. "Secondary License"
-+    means either the GNU General Public License, Version 2.0, the GNU
-+    Lesser General Public License, Version 2.1, the GNU Affero General
-+    Public License, Version 3.0, or any later versions of those
-+    licenses.
-+
-+1.13. "Source Code Form"
-+    means the form of the work preferred for making modifications.
-+
-+1.14. "You" (or "Your")
-+    means an individual or a legal entity exercising rights under this
-+    License. For legal entities, "You" includes any entity that
-+    controls, is controlled by, or is under common control with You. For
-+    purposes of this definition, "control" means (a) the power, direct
-+    or indirect, to cause the direction or management of such entity,
-+    whether by contract or otherwise, or (b) ownership of more than
-+    fifty percent (50%) of the outstanding shares or beneficial
-+    ownership of such entity.
-+
-+2. License Grants and Conditions
-+--------------------------------
-+
-+2.1. Grants
-+
-+Each Contributor hereby grants You a world-wide, royalty-free,
-+non-exclusive license:
-+
-+(a) under intellectual property rights (other than patent or trademark)
-+    Licensable by such Contributor to use, reproduce, make available,
-+    modify, display, perform, distribute, and otherwise exploit its
-+    Contributions, either on an unmodified basis, with Modifications, or
-+    as part of a Larger Work; and
-+
-+(b) under Patent Claims of such Contributor to make, use, sell, offer
-+    for sale, have made, import, and otherwise transfer either its
-+    Contributions or its Contributor Version.
-+
-+2.2. Effective Date
-+
-+The licenses granted in Section 2.1 with respect to any Contribution
-+become effective for each Contribution on the date the Contributor first
-+distributes such Contribution.
-+
-+2.3. Limitations on Grant Scope
-+
-+The licenses granted in this Section 2 are the only rights granted under
-+this License. No additional rights or licenses will be implied from the
-+distribution or licensing of Covered Software under this License.
-+Notwithstanding Section 2.1(b) above, no patent license is granted by a
-+Contributor:
-+
-+(a) for any code that a Contributor has removed from Covered Software;
-+    or
-+
-+(b) for infringements caused by: (i) Your and any other third party's
-+    modifications of Covered Software, or (ii) the combination of its
-+    Contributions with other software (except as part of its Contributor
-+    Version); or
-+
-+(c) under Patent Claims infringed by Covered Software in the absence of
-+    its Contributions.
-+
-+This License does not grant any rights in the trademarks, service marks,
-+or logos of any Contributor (except as may be necessary to comply with
-+the notice requirements in Section 3.4).
-+
-+2.4. Subsequent Licenses
-+
-+No Contributor makes additional grants as a result of Your choice to
-+distribute the Covered Software under a subsequent version of this
-+License (see Section 10.2) or under the terms of a Secondary License (if
-+permitted under the terms of Section 3.3).
-+
-+2.5. Representation
-+
-+Each Contributor represents that the Contributor believes its
-+Contributions are its original creation(s) or it has sufficient rights
-+to grant the rights to its Contributions conveyed by this License.
-+
-+2.6. Fair Use
-+
-+This License is not intended to limit any rights You have under
-+applicable copyright doctrines of fair use, fair dealing, or other
-+equivalents.
-+
-+2.7. Conditions
-+
-+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
-+in Section 2.1.
-+
-+3. Responsibilities
-+-------------------
-+
-+3.1. Distribution of Source Form
-+
-+All distribution of Covered Software in Source Code Form, including any
-+Modifications that You create or to which You contribute, must be under
-+the terms of this License. You must inform recipients that the Source
-+Code Form of the Covered Software is governed by the terms of this
-+License, and how they can obtain a copy of this License. You may not
-+attempt to alter or restrict the recipients' rights in the Source Code
-+Form.
-+
-+3.2. Distribution of Executable Form
-+
-+If You distribute Covered Software in Executable Form then:
-+
-+(a) such Covered Software must also be made available in Source Code
-+    Form, as described in Section 3.1, and You must inform recipients of
-+    the Executable Form how they can obtain a copy of such Source Code
-+    Form by reasonable means in a timely manner, at a charge no more
-+    than the cost of distribution to the recipient; and
-+
-+(b) You may distribute such Executable Form under the terms of this
-+    License, or sublicense it under different terms, provided that the
-+    license for the Executable Form does not attempt to limit or alter
-+    the recipients' rights in the Source Code Form under this License.
-+
-+3.3. Distribution of a Larger Work
-+
-+You may create and distribute a Larger Work under terms of Your choice,
-+provided that You also comply with the requirements of this License for
-+the Covered Software. If the Larger Work is a combination of Covered
-+Software with a work governed by one or more Secondary Licenses, and the
-+Covered Software is not Incompatible With Secondary Licenses, this
-+License permits You to additionally distribute such Covered Software
-+under the terms of such Secondary License(s), so that the recipient of
-+the Larger Work may, at their option, further distribute the Covered
-+Software under the terms of either this License or such Secondary
-+License(s).
-+
-+3.4. Notices
-+
-+You may not remove or alter the substance of any license notices
-+(including copyright notices, patent notices, disclaimers of warranty,
-+or limitations of liability) contained within the Source Code Form of
-+the Covered Software, except that You may alter any license notices to
-+the extent required to remedy known factual inaccuracies.
-+
-+3.5. Application of Additional Terms
-+
-+You may choose to offer, and to charge a fee for, warranty, support,
-+indemnity or liability obligations to one or more recipients of Covered
-+Software. However, You may do so only on Your own behalf, and not on
-+behalf of any Contributor. You must make it absolutely clear that any
-+such warranty, support, indemnity, or liability obligation is offered by
-+You alone, and You hereby agree to indemnify every Contributor for any
-+liability incurred by such Contributor as a result of warranty, support,
-+indemnity or liability terms You offer. You may include additional
-+disclaimers of warranty and limitations of liability specific to any
-+jurisdiction.
-+
-+4. Inability to Comply Due to Statute or Regulation
-+---------------------------------------------------
-+
-+If it is impossible for You to comply with any of the terms of this
-+License with respect to some or all of the Covered Software due to
-+statute, judicial order, or regulation then You must: (a) comply with
-+the terms of this License to the maximum extent possible; and (b)
-+describe the limitations and the code they affect. Such description must
-+be placed in a text file included with all distributions of the Covered
-+Software under this License. Except to the extent prohibited by statute
-+or regulation, such description must be sufficiently detailed for a
-+recipient of ordinary skill to be able to understand it.
-+
-+5. Termination
-+--------------
-+
-+5.1. The rights granted under this License will terminate automatically
-+if You fail to comply with any of its terms. However, if You become
-+compliant, then the rights granted under this License from a particular
-+Contributor are reinstated (a) provisionally, unless and until such
-+Contributor explicitly and finally terminates Your grants, and (b) on an
-+ongoing basis, if such Contributor fails to notify You of the
-+non-compliance by some reasonable means prior to 60 days after You have
-+come back into compliance. Moreover, Your grants from a particular
-+Contributor are reinstated on an ongoing basis if such Contributor
-+notifies You of the non-compliance by some reasonable means, this is the
-+first time You have received notice of non-compliance with this License
-+from such Contributor, and You become compliant prior to 30 days after
-+Your receipt of the notice.
-+
-+5.2. If You initiate litigation against any entity by asserting a patent
-+infringement claim (excluding declaratory judgment actions,
-+counter-claims, and cross-claims) alleging that a Contributor Version
-+directly or indirectly infringes any patent, then the rights granted to
-+You by any and all Contributors for the Covered Software under Section
-+2.1 of this License shall terminate.
-+
-+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
-+end user license agreements (excluding distributors and resellers) which
-+have been validly granted by You or Your distributors under this License
-+prior to termination shall survive termination.
-+
-+************************************************************************
-+*                                                                      *
-+*  6. Disclaimer of Warranty                                           *
-+*  -------------------------                                           *
-+*                                                                      *
-+*  Covered Software is provided under this License on an "as is"       *
-+*  basis, without warranty of any kind, either expressed, implied, or  *
-+*  statutory, including, without limitation, warranties that the       *
-+*  Covered Software is free of defects, merchantable, fit for a        *
-+*  particular purpose or non-infringing. The entire risk as to the     *
-+*  quality and performance of the Covered Software is with You.        *
-+*  Should any Covered Software prove defective in any respect, You     *
-+*  (not any Contributor) assume the cost of any necessary servicing,   *
-+*  repair, or correction. This disclaimer of warranty constitutes an   *
-+*  essential part of this License. No use of any Covered Software is   *
-+*  authorized under this License except under this disclaimer.         *
-+*                                                                      *
-+************************************************************************
-+
-+************************************************************************
-+*                                                                      *
-+*  7. Limitation of Liability                                          *
-+*  --------------------------                                          *
-+*                                                                      *
-+*  Under no circumstances and under no legal theory, whether tort      *
-+*  (including negligence), contract, or otherwise, shall any           *
-+*  Contributor, or anyone who distributes Covered Software as          *
-+*  permitted above, be liable to You for any direct, indirect,         *
-+*  special, incidental, or consequential damages of any character      *
-+*  including, without limitation, damages for lost profits, loss of    *
-+*  goodwill, work stoppage, computer failure or malfunction, or any    *
-+*  and all other commercial damages or losses, even if such party      *
-+*  shall have been informed of the possibility of such damages. This   *
-+*  limitation of liability shall not apply to liability for death or   *
-+*  personal injury resulting from such party's negligence to the       *
-+*  extent applicable law prohibits such limitation. Some               *
-+*  jurisdictions do not allow the exclusion or limitation of           *
-+*  incidental or consequential damages, so this exclusion and          *
-+*  limitation may not apply to You.                                    *
-+*                                                                      *
-+************************************************************************
-+
-+8. Litigation
-+-------------
-+
-+Any litigation relating to this License may be brought only in the
-+courts of a jurisdiction where the defendant maintains its principal
-+place of business and such litigation shall be governed by laws of that
-+jurisdiction, without reference to its conflict-of-law provisions.
-+Nothing in this Section shall prevent a party's ability to bring
-+cross-claims or counter-claims.
-+
-+9. Miscellaneous
-+----------------
-+
-+This License represents the complete agreement concerning the subject
-+matter hereof. If any provision of this License is held to be
-+unenforceable, such provision shall be reformed only to the extent
-+necessary to make it enforceable. Any law or regulation which provides
-+that the language of a contract shall be construed against the drafter
-+shall not be used to construe this License against a Contributor.
-+
-+10. Versions of the License
-+---------------------------
-+
-+10.1. New Versions
-+
-+Mozilla Foundation is the license steward. Except as provided in Section
-+10.3, no one other than the license steward has the right to modify or
-+publish new versions of this License. Each version will be given a
-+distinguishing version number.
-+
-+10.2. Effect of New Versions
-+
-+You may distribute the Covered Software under the terms of the version
-+of the License under which You originally received the Covered Software,
-+or under the terms of any subsequent version published by the license
-+steward.
-+
-+10.3. Modified Versions
-+
-+If you create software not governed by this License, and you want to
-+create a new license for such software, you may create and use a
-+modified version of this License if you rename the license and remove
-+any references to the name of the license steward (except to note that
-+such modified license differs from this License).
-+
-+10.4. Distributing Source Code Form that is Incompatible With Secondary
-+Licenses
-+
-+If You choose to distribute Source Code Form that is Incompatible With
-+Secondary Licenses under the terms of this version of the License, the
-+notice described in Exhibit B of this License must be attached.
-+
-+Exhibit A - Source Code Form License Notice
-+-------------------------------------------
-+
-+  This Source Code Form is subject to the terms of the Mozilla Public
-+  License, v. 2.0. If a copy of the MPL was not distributed with this
-+  file, You can obtain one at http://mozilla.org/MPL/2.0/.
-+
-+If it is not possible or desirable to put the notice in a particular
-+file, then You may include the notice in a location (such as a LICENSE
-+file in a relevant directory) where a recipient would be likely to look
-+for such a notice.
-+
-+You may add additional accurate notices of copyright ownership.
-+
-+Exhibit B - "Incompatible With Secondary Licenses" Notice
-+---------------------------------------------------------
-+
-+  This Source Code Form is "Incompatible With Secondary Licenses", as
-+  defined by the Mozilla Public License, v. 2.0.
diff --git a/crates/uniffi_core/release.toml b/crates/uniffi_core/release.toml
deleted file mode 100644
index 2ff9c83..0000000
--- a/crates/uniffi_core/release.toml
+++ /dev/null
@@ -1,15 +0,0 @@
-# Note that this `release.toml` exists to capture things that must only be
-# done once for `cargo release-backend-crates`.
-#
-# [../uniffi/release.toml](../uniffi/release.toml) captures things that must only be done for `cargo release-uniffi`
-#
-# All other config exists in [../release.toml](../release.toml).
-
-tag = false
-
-# This is how we manage the sections in CHANGELOG.md
-pre-release-replacements = [
-  {file="../CHANGELOG.md", search="\\[\\[UnreleasedBackendVersion\\]\\]", replace="v{{version}}", exactly=1},
-  {file="../CHANGELOG.md", search="\\[\\[ReleaseDate\\]\\]", replace="{{date}}", exactly=1},
-  {file="../CHANGELOG.md", search="<!-- next-header -->", replace="<!-- next-header -->\n\n## [[NextUnreleasedUniFFIVersion]] (backend crates: [[UnreleasedBackendVersion]]) - (_[[ReleaseDate]]_)\n\n[All changes in [[NextUnreleasedUniFFIVersion]]](https://github.com/mozilla/uniffi-rs/compare/v{{version}}...NEXT_HEAD).", exactly=1},
-]
diff --git a/crates/uniffi_core/src/ffi/callbackinterface.rs b/crates/uniffi_core/src/ffi/callbackinterface.rs
deleted file mode 100644
index e7a4faa..0000000
--- a/crates/uniffi_core/src/ffi/callbackinterface.rs
+++ /dev/null
@@ -1,209 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-//! Callback interfaces are traits specified in UDL which can be implemented by foreign languages.
-//!
-//! # Using callback interfaces
-//!
-//! 1. Define a Rust trait.
-//!
-//! This toy example defines a way of Rust accessing a key-value store exposed
-//! by the host operating system (e.g. the key chain).
-//!
-//! ```
-//! trait Keychain: Send {
-//!   fn get(&self, key: String) -> Option<String>;
-//!   fn put(&self, key: String, value: String);
-//! }
-//! ```
-//!
-//! 2. Define a callback interface in the UDL
-//!
-//! ```idl
-//! callback interface Keychain {
-//!     string? get(string key);
-//!     void put(string key, string data);
-//! };
-//! ```
-//!
-//! 3. And allow it to be passed into Rust.
-//!
-//! Here, we define a constructor to pass the keychain to rust, and then another method
-//! which may use it.
-//!
-//! In UDL:
-//! ```idl
-//! object Authenticator {
-//!     constructor(Keychain keychain);
-//!     void login();
-//! }
-//! ```
-//!
-//! In Rust:
-//!
-//! ```
-//!# trait Keychain: Send {
-//!#  fn get(&self, key: String) -> Option<String>;
-//!#  fn put(&self, key: String, value: String);
-//!# }
-//! struct Authenticator {
-//!   keychain: Box<dyn Keychain>,
-//! }
-//!
-//! impl Authenticator {
-//!   pub fn new(keychain: Box<dyn Keychain>) -> Self {
-//!     Self { keychain }
-//!   }
-//!   pub fn login(&self) {
-//!     let username = self.keychain.get("username".into());
-//!     let password = self.keychain.get("password".into());
-//!   }
-//! }
-//! ```
-//! 4. Create an foreign language implementation of the callback interface.
-//!
-//! In this example, here's a Kotlin implementation.
-//!
-//! ```kotlin
-//! class AndroidKeychain: Keychain {
-//!     override fun get(key: String): String? {
-//!         // … elide the implementation.
-//!         return value
-//!     }
-//!     override fun put(key: String) {
-//!         // … elide the implementation.
-//!     }
-//! }
-//! ```
-//! 5. Pass the implementation to Rust.
-//!
-//! Again, in Kotlin
-//!
-//! ```kotlin
-//! val authenticator = Authenticator(AndroidKeychain())
-//! authenticator.login()
-//! ```
-//!
-//! # How it works.
-//!
-//! ## High level
-//!
-//! Uniffi generates a protocol or interface in client code in the foreign language must implement.
-//!
-//! For each callback interface, UniFFI defines a VTable.
-//! This is a `repr(C)` struct where each field is a `repr(C)` callback function pointer.
-//! There is one field for each method, plus an extra field for the `uniffi_free` method.
-//! The foreign code registers one VTable per callback interface with Rust.
-//!
-//! VTable methods have a similar signature to Rust scaffolding functions.
-//! The one difference is that values are returned via an out pointer to work around a Python bug (https://bugs.python.org/issue5710).
-//!
-//! The foreign object that implements the interface is represented by an opaque handle.
-//! UniFFI generates a struct that implements the trait by calling VTable methods, passing the handle as the first parameter.
-//! When the struct is dropped, the `uniffi_free` method is called.
-
-use std::fmt;
-
-/// Used when internal/unexpected error happened when calling a foreign callback, for example when
-/// a unknown exception is raised
-///
-/// User callback error types must implement a From impl from this type to their own error type.
-#[derive(Debug)]
-pub struct UnexpectedUniFFICallbackError {
-    pub reason: String,
-}
-
-impl UnexpectedUniFFICallbackError {
-    pub fn new(reason: impl fmt::Display) -> Self {
-        Self {
-            reason: reason.to_string(),
-        }
-    }
-}
-
-impl fmt::Display for UnexpectedUniFFICallbackError {
-    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
-        write!(
-            f,
-            "UnexpectedUniFFICallbackError(reason: {:?})",
-            self.reason
-        )
-    }
-}
-
-impl std::error::Error for UnexpectedUniFFICallbackError {}
-
-// Autoref-based specialization for converting UnexpectedUniFFICallbackError into error types.
-//
-// For more details, see:
-// https://github.com/dtolnay/case-studies/blob/master/autoref-specialization/README.md
-
-// Define two ZST types:
-//   - One implements `try_convert_unexpected_callback_error` by always returning an error value.
-//   - The specialized version implements it using `From<UnexpectedUniFFICallbackError>`
-
-#[doc(hidden)]
-#[derive(Debug)]
-pub struct UnexpectedUniFFICallbackErrorConverterGeneric;
-
-impl UnexpectedUniFFICallbackErrorConverterGeneric {
-    pub fn try_convert_unexpected_callback_error<E>(
-        &self,
-        e: UnexpectedUniFFICallbackError,
-    ) -> anyhow::Result<E> {
-        Err(e.into())
-    }
-}
-
-#[doc(hidden)]
-#[derive(Debug)]
-pub struct UnexpectedUniFFICallbackErrorConverterSpecialized;
-
-impl UnexpectedUniFFICallbackErrorConverterSpecialized {
-    pub fn try_convert_unexpected_callback_error<E>(
-        &self,
-        e: UnexpectedUniFFICallbackError,
-    ) -> anyhow::Result<E>
-    where
-        E: From<UnexpectedUniFFICallbackError>,
-    {
-        Ok(E::from(e))
-    }
-}
-
-// Macro to convert an UnexpectedUniFFICallbackError value for a particular type.  This is used in
-// the `ConvertError` implementation.
-#[doc(hidden)]
-#[macro_export]
-macro_rules! convert_unexpected_error {
-    ($error:ident, $ty:ty) => {{
-        // Trait for generic conversion, implemented for all &T.
-        pub trait GetConverterGeneric {
-            fn get_converter(&self) -> $crate::UnexpectedUniFFICallbackErrorConverterGeneric;
-        }
-
-        impl<T> GetConverterGeneric for &T {
-            fn get_converter(&self) -> $crate::UnexpectedUniFFICallbackErrorConverterGeneric {
-                $crate::UnexpectedUniFFICallbackErrorConverterGeneric
-            }
-        }
-        // Trait for specialized conversion, implemented for all T that implements
-        // `Into<ErrorType>`.  I.e. it's implemented for UnexpectedUniFFICallbackError when
-        // ErrorType implements From<UnexpectedUniFFICallbackError>.
-        pub trait GetConverterSpecialized {
-            fn get_converter(&self) -> $crate::UnexpectedUniFFICallbackErrorConverterSpecialized;
-        }
-
-        impl<T: Into<$ty>> GetConverterSpecialized for T {
-            fn get_converter(&self) -> $crate::UnexpectedUniFFICallbackErrorConverterSpecialized {
-                $crate::UnexpectedUniFFICallbackErrorConverterSpecialized
-            }
-        }
-        // Here's the hack.  Because of the auto-ref rules, this will use `GetConverterSpecialized`
-        // if it's implemented and `GetConverterGeneric` if not.
-        (&$error)
-            .get_converter()
-            .try_convert_unexpected_callback_error($error)
-    }};
-}
diff --git a/crates/uniffi_core/src/ffi/ffidefault.rs b/crates/uniffi_core/src/ffi/ffidefault.rs
deleted file mode 100644
index a992ab7..0000000
--- a/crates/uniffi_core/src/ffi/ffidefault.rs
+++ /dev/null
@@ -1,71 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-//! FfiDefault trait
-//!
-//! When we make a FFI call into Rust we always need to return a value, even if that value will be
-//! ignored because we're flagging an exception.  This trait defines what that value is for our
-//! supported FFI types.
-
-use paste::paste;
-
-pub trait FfiDefault {
-    fn ffi_default() -> Self;
-}
-
-// Most types can be handled by delegating to Default
-macro_rules! impl_ffi_default_with_default {
-    ($($T:ty,)+) => { impl_ffi_default_with_default!($($T),+); };
-    ($($T:ty),*) => {
-            $(
-                paste! {
-                    impl FfiDefault for $T {
-                        fn ffi_default() -> Self {
-                            $T::default()
-                        }
-                    }
-                }
-            )*
-    };
-}
-
-impl_ffi_default_with_default! {
-    bool, i8, u8, i16, u16, i32, u32, i64, u64, f32, f64
-}
-
-// Implement FfiDefault for the remaining types
-impl FfiDefault for () {
-    fn ffi_default() {}
-}
-
-impl FfiDefault for crate::Handle {
-    fn ffi_default() -> Self {
-        Self::default()
-    }
-}
-
-impl FfiDefault for *const std::ffi::c_void {
-    fn ffi_default() -> Self {
-        std::ptr::null()
-    }
-}
-
-impl FfiDefault for crate::RustBuffer {
-    fn ffi_default() -> Self {
-        unsafe { Self::from_raw_parts(std::ptr::null_mut(), 0, 0) }
-    }
-}
-
-impl FfiDefault for crate::ForeignFuture {
-    fn ffi_default() -> Self {
-        extern "C" fn free(_handle: u64) {}
-        crate::ForeignFuture { handle: 0, free }
-    }
-}
-
-impl<T> FfiDefault for Option<T> {
-    fn ffi_default() -> Self {
-        None
-    }
-}
diff --git a/crates/uniffi_core/src/ffi/foreignbytes.rs b/crates/uniffi_core/src/ffi/foreignbytes.rs
deleted file mode 100644
index 9516f61..0000000
--- a/crates/uniffi_core/src/ffi/foreignbytes.rs
+++ /dev/null
@@ -1,118 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-/// Support for reading a slice of foreign-language-allocated bytes over the FFI.
-///
-/// Foreign language code can pass a slice of bytes by providing a data pointer
-/// and length, and this struct provides a convenient wrapper for working with
-/// that pair. Naturally, this can be tremendously unsafe! So here are the details:
-///
-///   * The foreign language code must ensure the provided buffer stays alive
-///     and unchanged for the duration of the call to which the `ForeignBytes`
-///     struct was provided.
-///
-/// To work with the bytes in Rust code, use `as_slice()` to view the data
-/// as a `&[u8]`.
-///
-/// Implementation note: all the fields of this struct are private and it has no
-/// constructors, so consuming crates cant create instances of it. If you've
-/// got a `ForeignBytes`, then you received it over the FFI and are assuming that
-/// the foreign language code is upholding the above invariants.
-///
-/// This struct is based on `ByteBuffer` from the `ffi-support` crate, but modified
-/// to give a read-only view of externally-provided bytes.
-#[repr(C)]
-pub struct ForeignBytes {
-    /// The length of the pointed-to data.
-    /// We use an `i32` for compatibility with JNA.
-    len: i32,
-    /// The pointer to the foreign-owned bytes.
-    data: *const u8,
-}
-
-impl ForeignBytes {
-    /// Creates a `ForeignBytes` from its constituent fields.
-    ///
-    /// This is intended mainly as an internal convenience function and should not
-    /// be used outside of this module.
-    ///
-    /// # Safety
-    ///
-    /// You must ensure that the raw parts uphold the documented invariants of this class.
-    pub unsafe fn from_raw_parts(data: *const u8, len: i32) -> Self {
-        Self { len, data }
-    }
-
-    /// View the foreign bytes as a `&[u8]`.
-    ///
-    /// # Panics
-    ///
-    /// Panics if the provided struct has a null pointer but non-zero length.
-    /// Panics if the provided length is negative.
-    pub fn as_slice(&self) -> &[u8] {
-        if self.data.is_null() {
-            assert!(self.len == 0, "null ForeignBytes had non-zero length");
-            &[]
-        } else {
-            unsafe { std::slice::from_raw_parts(self.data, self.len()) }
-        }
-    }
-
-    /// Get the length of this slice of bytes.
-    ///
-    /// # Panics
-    ///
-    /// Panics if the provided length is negative.
-    pub fn len(&self) -> usize {
-        self.len
-            .try_into()
-            .expect("bytes length negative or overflowed")
-    }
-
-    /// Returns true if the length of this slice of bytes is 0.
-    pub fn is_empty(&self) -> bool {
-        self.len == 0
-    }
-}
-
-#[cfg(test)]
-mod test {
-    use super::*;
-    #[test]
-    fn test_foreignbytes_access() {
-        let v = [1u8, 2, 3];
-        let fbuf = unsafe { ForeignBytes::from_raw_parts(v.as_ptr(), 3) };
-        assert_eq!(fbuf.len(), 3);
-        assert_eq!(fbuf.as_slice(), &[1u8, 2, 3]);
-    }
-
-    #[test]
-    fn test_foreignbytes_empty() {
-        let v = Vec::<u8>::new();
-        let fbuf = unsafe { ForeignBytes::from_raw_parts(v.as_ptr(), 0) };
-        assert_eq!(fbuf.len(), 0);
-        assert_eq!(fbuf.as_slice(), &[0u8; 0]);
-    }
-
-    #[test]
-    fn test_foreignbytes_null_means_empty() {
-        let fbuf = unsafe { ForeignBytes::from_raw_parts(std::ptr::null_mut(), 0) };
-        assert_eq!(fbuf.as_slice(), &[0u8; 0]);
-    }
-
-    #[test]
-    #[should_panic]
-    fn test_foreignbytes_null_must_have_zero_length() {
-        let fbuf = unsafe { ForeignBytes::from_raw_parts(std::ptr::null_mut(), 12) };
-        fbuf.as_slice();
-    }
-
-    #[test]
-    #[should_panic]
-    fn test_foreignbytes_provided_len_must_be_non_negative() {
-        let v = [0u8, 1, 2];
-        let fbuf = unsafe { ForeignBytes::from_raw_parts(v.as_ptr(), -1) };
-        fbuf.as_slice();
-    }
-}
diff --git a/crates/uniffi_core/src/ffi/foreigncallbacks.rs b/crates/uniffi_core/src/ffi/foreigncallbacks.rs
deleted file mode 100644
index 326ff12..0000000
--- a/crates/uniffi_core/src/ffi/foreigncallbacks.rs
+++ /dev/null
@@ -1,39 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-//! This module contains code to handle foreign callbacks - C-ABI functions that are defined by a
-//! foreign language, then registered with UniFFI.  These callbacks are used to implement callback
-//! interfaces, async scheduling etc. Foreign callbacks are registered at startup, when the foreign
-//! code loads the exported library. For each callback type, we also define a "cell" type for
-//! storing the callback.
-
-use std::{
-    ptr::{null_mut, NonNull},
-    sync::atomic::{AtomicPtr, Ordering},
-};
-
-// Cell type that stores any NonNull<T>
-#[doc(hidden)]
-pub struct UniffiForeignPointerCell<T>(AtomicPtr<T>);
-
-impl<T> UniffiForeignPointerCell<T> {
-    pub const fn new() -> Self {
-        Self(AtomicPtr::new(null_mut()))
-    }
-
-    pub fn set(&self, callback: NonNull<T>) {
-        self.0.store(callback.as_ptr(), Ordering::Relaxed);
-    }
-
-    pub fn get(&self) -> &T {
-        unsafe {
-            NonNull::new(self.0.load(Ordering::Relaxed))
-                .expect("Foreign pointer not set.  This is likely a uniffi bug.")
-                .as_mut()
-        }
-    }
-}
-
-unsafe impl<T> Send for UniffiForeignPointerCell<T> {}
-unsafe impl<T> Sync for UniffiForeignPointerCell<T> {}
diff --git a/crates/uniffi_core/src/ffi/foreignfuture.rs b/crates/uniffi_core/src/ffi/foreignfuture.rs
deleted file mode 100644
index be6a214..0000000
--- a/crates/uniffi_core/src/ffi/foreignfuture.rs
+++ /dev/null
@@ -1,241 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-//! This module defines a Rust Future that wraps an async foreign function call.
-//!
-//! The general idea is to create a [oneshot::Channel], hand the sender to the foreign side, and
-//! await the receiver side on the Rust side.
-//!
-//! The foreign side should:
-//!   * Input a [ForeignFutureCallback] and a `u64` handle in their scaffolding function.
-//!     This is the sender, converted to a raw pointer, and an extern "C" function that sends the result.
-//!   * Return a [ForeignFuture], which represents the foreign task object corresponding to the async function.
-//!   * Call the [ForeignFutureCallback] when the async function completes with:
-//!     * The `u64` handle initially passed in
-//!     * The `ForeignFutureResult` for the call
-//!   * Wait for the [ForeignFutureHandle::free] function to be called to free the task object.
-//!     If this is called before the task completes, then the task will be cancelled.
-
-use crate::{LiftReturn, RustCallStatus, UnexpectedUniFFICallbackError};
-
-/// Handle for a foreign future
-pub type ForeignFutureHandle = u64;
-
-/// Handle for a callback data associated with a foreign future.
-pub type ForeignFutureCallbackData = *mut ();
-
-/// Callback that's passed to a foreign async functions.
-///
-/// See `LiftReturn` trait for how this is implemented.
-pub type ForeignFutureCallback<FfiType> =
-    extern "C" fn(oneshot_handle: u64, ForeignFutureResult<FfiType>);
-
-/// C struct that represents the result of a foreign future
-#[repr(C)]
-pub struct ForeignFutureResult<T> {
-    // Note: for void returns, T is `()`, which isn't directly representable with C since it's a ZST.
-    // Foreign code should treat that case as if there was no `return_value` field.
-    return_value: T,
-    call_status: RustCallStatus,
-}
-
-/// Perform a call to a foreign async method
-
-/// C struct that represents the foreign future.
-///
-/// This is what's returned by the async scaffolding functions.
-#[repr(C)]
-pub struct ForeignFuture {
-    pub handle: ForeignFutureHandle,
-    pub free: extern "C" fn(handle: ForeignFutureHandle),
-}
-
-impl Drop for ForeignFuture {
-    fn drop(&mut self) {
-        (self.free)(self.handle)
-    }
-}
-
-unsafe impl Send for ForeignFuture {}
-
-pub async fn foreign_async_call<F, T, UT>(call_scaffolding_function: F) -> T
-where
-    F: FnOnce(ForeignFutureCallback<T::ReturnType>, u64) -> ForeignFuture,
-    T: LiftReturn<UT>,
-{
-    let (sender, receiver) = oneshot::channel::<ForeignFutureResult<T::ReturnType>>();
-    // Keep the ForeignFuture around, even though we don't ever use it.
-    // The important thing is that the ForeignFuture will be dropped when this Future is.
-    let _foreign_future =
-        call_scaffolding_function(foreign_future_complete::<T, UT>, sender.into_raw() as u64);
-    match receiver.await {
-        Ok(result) => T::lift_foreign_return(result.return_value, result.call_status),
-        Err(e) => {
-            // This shouldn't happen in practice, but we can do our best to recover
-            T::handle_callback_unexpected_error(UnexpectedUniFFICallbackError::new(format!(
-                "Error awaiting foreign future: {e}"
-            )))
-        }
-    }
-}
-
-pub extern "C" fn foreign_future_complete<T: LiftReturn<UT>, UT>(
-    oneshot_handle: u64,
-    result: ForeignFutureResult<T::ReturnType>,
-) {
-    let channel = unsafe { oneshot::Sender::from_raw(oneshot_handle as *mut ()) };
-    // Ignore errors in send.
-    //
-    // Error means the receiver was already dropped which will happen when the future is cancelled.
-    let _ = channel.send(result);
-}
-
-#[cfg(test)]
-mod test {
-    use super::*;
-    use crate::{Lower, RustBuffer};
-    use once_cell::sync::OnceCell;
-    use std::{
-        future::Future,
-        pin::Pin,
-        sync::{
-            atomic::{AtomicU32, Ordering},
-            Arc,
-        },
-        task::{Context, Poll, Wake},
-    };
-
-    struct MockForeignFuture {
-        freed: Arc<AtomicU32>,
-        callback_info: Arc<OnceCell<(ForeignFutureCallback<RustBuffer>, u64)>>,
-        rust_future: Option<Pin<Box<dyn Future<Output = String>>>>,
-    }
-
-    impl MockForeignFuture {
-        fn new() -> Self {
-            let callback_info = Arc::new(OnceCell::new());
-            let freed = Arc::new(AtomicU32::new(0));
-
-            let rust_future: Pin<Box<dyn Future<Output = String>>> = {
-                let callback_info = callback_info.clone();
-                let freed = freed.clone();
-                Box::pin(foreign_async_call::<_, String, crate::UniFfiTag>(
-                    move |callback, data| {
-                        callback_info.set((callback, data)).unwrap();
-                        ForeignFuture {
-                            handle: Arc::into_raw(freed) as *mut () as u64,
-                            free: Self::free,
-                        }
-                    },
-                ))
-            };
-            let rust_future = Some(rust_future);
-            let mut mock_foreign_future = Self {
-                freed,
-                callback_info,
-                rust_future,
-            };
-            // Poll the future once, to start it up.   This ensures that `callback_info` is set.
-            let _ = mock_foreign_future.poll();
-            mock_foreign_future
-        }
-
-        fn poll(&mut self) -> Poll<String> {
-            let waker = Arc::new(NoopWaker).into();
-            let mut context = Context::from_waker(&waker);
-            self.rust_future
-                .as_mut()
-                .unwrap()
-                .as_mut()
-                .poll(&mut context)
-        }
-
-        fn complete_success(&self, value: String) {
-            let (callback, data) = self.callback_info.get().unwrap();
-            callback(
-                *data,
-                ForeignFutureResult {
-                    return_value: <String as Lower<crate::UniFfiTag>>::lower(value),
-                    call_status: RustCallStatus::new(),
-                },
-            );
-        }
-
-        fn complete_error(&self, error_message: String) {
-            let (callback, data) = self.callback_info.get().unwrap();
-            callback(
-                *data,
-                ForeignFutureResult {
-                    return_value: RustBuffer::default(),
-                    call_status: RustCallStatus::error(error_message),
-                },
-            );
-        }
-
-        fn drop_future(&mut self) {
-            self.rust_future = None
-        }
-
-        fn free_count(&self) -> u32 {
-            self.freed.load(Ordering::Relaxed)
-        }
-
-        extern "C" fn free(handle: u64) {
-            let flag = unsafe { Arc::from_raw(handle as *mut AtomicU32) };
-            flag.fetch_add(1, Ordering::Relaxed);
-        }
-    }
-
-    struct NoopWaker;
-
-    impl Wake for NoopWaker {
-        fn wake(self: Arc<Self>) {}
-    }
-
-    #[test]
-    fn test_foreign_future() {
-        let mut mock_foreign_future = MockForeignFuture::new();
-        assert_eq!(mock_foreign_future.poll(), Poll::Pending);
-        mock_foreign_future.complete_success("It worked!".to_owned());
-        assert_eq!(
-            mock_foreign_future.poll(),
-            Poll::Ready("It worked!".to_owned())
-        );
-        // Since the future is complete, it should free the foreign future
-        assert_eq!(mock_foreign_future.free_count(), 1);
-    }
-
-    #[test]
-    #[should_panic]
-    fn test_foreign_future_error() {
-        let mut mock_foreign_future = MockForeignFuture::new();
-        assert_eq!(mock_foreign_future.poll(), Poll::Pending);
-        mock_foreign_future.complete_error("It Failed!".to_owned());
-        let _ = mock_foreign_future.poll();
-    }
-
-    #[test]
-    fn test_drop_after_complete() {
-        let mut mock_foreign_future = MockForeignFuture::new();
-        mock_foreign_future.complete_success("It worked!".to_owned());
-        assert_eq!(mock_foreign_future.free_count(), 0);
-        assert_eq!(
-            mock_foreign_future.poll(),
-            Poll::Ready("It worked!".to_owned())
-        );
-        // Dropping the future after it's complete should not panic, and not cause a double-free
-        mock_foreign_future.drop_future();
-        assert_eq!(mock_foreign_future.free_count(), 1);
-    }
-
-    #[test]
-    fn test_drop_before_complete() {
-        let mut mock_foreign_future = MockForeignFuture::new();
-        mock_foreign_future.complete_success("It worked!".to_owned());
-        // Dropping the future before it's complete should cancel the future
-        assert_eq!(mock_foreign_future.free_count(), 0);
-        mock_foreign_future.drop_future();
-        assert_eq!(mock_foreign_future.free_count(), 1);
-    }
-}
diff --git a/crates/uniffi_core/src/ffi/handle.rs b/crates/uniffi_core/src/ffi/handle.rs
deleted file mode 100644
index 8ee2f46..0000000
--- a/crates/uniffi_core/src/ffi/handle.rs
+++ /dev/null
@@ -1,46 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-/// Object handle
-///
-/// Handles opaque `u64` values used to pass objects across the FFI, both for objects implemented in
-/// Rust and ones implemented in the foreign language.
-///
-/// Rust handles are generated by leaking a raw pointer
-/// Foreign handles are generated with a handle map that only generates odd values.
-/// For all currently supported architectures and hopefully any ones we add in the future:
-/// * 0 is an invalid value.
-/// * The lowest bit will always be set for foreign handles and never set for Rust ones (since the
-///   leaked pointer will be aligned).
-///
-/// Rust handles are mainly managed is through the [crate::HandleAlloc] trait.
-#[derive(Copy, Clone, Default, Debug, PartialEq, Eq)]
-#[repr(transparent)]
-pub struct Handle(u64);
-
-impl Handle {
-    pub fn from_pointer<T>(ptr: *const T) -> Self {
-        Self(ptr as u64)
-    }
-
-    pub fn as_pointer<T>(&self) -> *const T {
-        self.0 as *const T
-    }
-
-    pub fn from_raw(raw: u64) -> Option<Self> {
-        if raw == 0 {
-            None
-        } else {
-            Some(Self(raw))
-        }
-    }
-
-    pub fn from_raw_unchecked(raw: u64) -> Self {
-        Self(raw)
-    }
-
-    pub fn as_raw(&self) -> u64 {
-        self.0
-    }
-}
diff --git a/crates/uniffi_core/src/ffi/mod.rs b/crates/uniffi_core/src/ffi/mod.rs
deleted file mode 100644
index acaf2b0..0000000
--- a/crates/uniffi_core/src/ffi/mod.rs
+++ /dev/null
@@ -1,25 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-//! Types that can cross the FFI boundary.
-
-pub mod callbackinterface;
-pub mod ffidefault;
-pub mod foreignbytes;
-pub mod foreigncallbacks;
-pub mod foreignfuture;
-pub mod handle;
-pub mod rustbuffer;
-pub mod rustcalls;
-pub mod rustfuture;
-
-pub use callbackinterface::*;
-pub use ffidefault::FfiDefault;
-pub use foreignbytes::*;
-pub use foreigncallbacks::*;
-pub use foreignfuture::*;
-pub use handle::*;
-pub use rustbuffer::*;
-pub use rustcalls::*;
-pub use rustfuture::*;
diff --git a/crates/uniffi_core/src/ffi/rustbuffer.rs b/crates/uniffi_core/src/ffi/rustbuffer.rs
deleted file mode 100644
index 8b29729..0000000
--- a/crates/uniffi_core/src/ffi/rustbuffer.rs
+++ /dev/null
@@ -1,331 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-use crate::ffi::{rust_call, ForeignBytes, RustCallStatus};
-
-/// Support for passing an allocated-by-Rust buffer of bytes over the FFI.
-///
-/// We can pass a `Vec<u8>` to foreign language code by decomposing it into
-/// its raw parts (buffer pointer, length, and capacity) and passing those
-/// around as a struct. Naturally, this can be tremendously unsafe! So here
-/// are the details:
-///
-///   * `RustBuffer` structs must only ever be constructed from a `Vec<u8>`,
-///     either explicitly via `RustBuffer::from_vec` or indirectly by calling
-///     one of the `RustBuffer::new*` constructors.
-///
-///   * `RustBuffer` structs do not implement `Drop`, since they are intended
-///     to be passed to foreign-language code outside of the control of Rust's
-///     ownership system. To avoid memory leaks they *must* passed back into
-///     Rust and either explicitly destroyed using `RustBuffer::destroy`, or
-///     converted back to a `Vec<u8>` using `RustBuffer::destroy_into_vec`
-///     (which will then be dropped via Rust's usual ownership-tracking system).
-///
-/// Foreign-language code should not construct `RustBuffer` structs other than
-/// by receiving them from a call into the Rust code, and should not modify them
-/// apart from the following safe operations:
-///
-///   * Writing bytes into the buffer pointed to by `data`, without writing
-///     beyond the indicated `capacity`.
-///
-///   * Adjusting the `len` property to indicate the amount of data written,
-///     while ensuring that 0 <= `len` <= `capacity`.
-///
-///   * As a special case, constructing a `RustBuffer` with zero capacity, zero
-///     length, and a null `data` pointer to indicate an empty buffer.
-///
-/// In particular, it is not safe for foreign-language code to construct a `RustBuffer`
-/// that points to its own allocated memory; use the `ForeignBytes` struct to
-/// pass a view of foreign-owned memory in to Rust code.
-///
-/// Implementation note: all the fields of this struct are private, so you can't
-/// manually construct instances that don't come from a `Vec<u8>`. If you've got
-/// a `RustBuffer` then it either came from a public constructor (all of which
-/// are safe) or it came from foreign-language code (which should have in turn
-/// received it by calling some Rust function, and should be respecting the
-/// invariants listed above).
-///
-/// This struct is based on `ByteBuffer` from the `ffi-support` crate, but modified
-/// to retain unallocated capacity rather than truncating to the occupied length.
-#[repr(C)]
-#[derive(Debug)]
-pub struct RustBuffer {
-    /// The allocated capacity of the underlying `Vec<u8>`.
-    /// In Rust this is a `usize`, but we use an `u64` to keep the foreign binding code simple.
-    capacity: u64,
-    /// The occupied length of the underlying `Vec<u8>`.
-    /// In Rust this is a `usize`, but we use an `u64` to keep the foreign binding code simple.
-    len: u64,
-    /// The pointer to the allocated buffer of the `Vec<u8>`.
-    data: *mut u8,
-}
-
-// Mark `RustBuffer` as safe to send between threads, despite the `u8` pointer.  The only mutable
-// use of that pointer is in `destroy_into_vec()` which requires a &mut on the `RustBuffer`.  This
-// is required to send `RustBuffer` inside a `RustFuture`
-unsafe impl Send for RustBuffer {}
-
-impl RustBuffer {
-    /// Creates an empty `RustBuffer`.
-    ///
-    /// The buffer will not allocate.
-    /// The resulting vector will not be automatically dropped; you must
-    /// arrange to call `destroy` or `destroy_into_vec` when finished with it.
-    pub fn new() -> Self {
-        Self::from_vec(Vec::new())
-    }
-
-    /// Creates a `RustBuffer` from its constituent fields.
-    ///
-    /// This is intended mainly as an internal convenience function and should not
-    /// be used outside of this module.
-    ///
-    /// # Safety
-    ///
-    /// You must ensure that the raw parts uphold the documented invariants of this class.
-    pub unsafe fn from_raw_parts(data: *mut u8, len: u64, capacity: u64) -> Self {
-        Self {
-            capacity,
-            len,
-            data,
-        }
-    }
-
-    /// Get the current length of the buffer, as a `usize`.
-    ///
-    /// This is mostly a helper function to convert the `i32` length field
-    /// into a `usize`, which is what Rust code usually expects.
-    ///
-    /// # Panics
-    ///
-    /// Panics if called on an invalid struct obtained from foreign-language code,
-    /// in which the `len` field is negative.
-    pub fn len(&self) -> usize {
-        self.len
-            .try_into()
-            .expect("buffer length negative or overflowed")
-    }
-
-    /// Get a pointer to the data
-    pub fn data_pointer(&self) -> *const u8 {
-        self.data
-    }
-
-    /// Returns true if the length of the buffer is 0.
-    pub fn is_empty(&self) -> bool {
-        self.len == 0
-    }
-
-    /// Creates a `RustBuffer` zero-filed to the requested size.
-    ///
-    /// The resulting vector will not be automatically dropped; you must
-    /// arrange to call `destroy` or `destroy_into_vec` when finished with it.
-    ///
-    /// # Panics
-    ///
-    /// Panics if the requested size is too large to fit in an `i32`, and
-    /// hence would risk incompatibility with some foreign-language code.
-    pub fn new_with_size(size: u64) -> Self {
-        Self::from_vec(vec![0u8; size as usize])
-    }
-
-    /// Consumes a `Vec<u8>` and returns its raw parts as a `RustBuffer`.
-    ///
-    /// The resulting vector will not be automatically dropped; you must
-    /// arrange to call `destroy` or `destroy_into_vec` when finished with it.
-    ///
-    /// # Panics
-    ///
-    /// Panics if the vector's length or capacity are too large to fit in an `i32`,
-    /// and hence would risk incompatibility with some foreign-language code.
-    pub fn from_vec(v: Vec<u8>) -> Self {
-        let capacity = u64::try_from(v.capacity()).expect("buffer capacity cannot fit into a u64.");
-        let len = u64::try_from(v.len()).expect("buffer length cannot fit into a u64.");
-        let mut v = std::mem::ManuallyDrop::new(v);
-        unsafe { Self::from_raw_parts(v.as_mut_ptr(), len, capacity) }
-    }
-
-    /// Converts this `RustBuffer` back into an owned `Vec<u8>`.
-    ///
-    /// This restores ownership of the underlying buffer to Rust, meaning it will
-    /// be dropped when the `Vec<u8>` is dropped. The `RustBuffer` *must* have been
-    /// previously obtained from a valid `Vec<u8>` owned by this Rust code.
-    ///
-    /// # Panics
-    ///
-    /// Panics if called on an invalid struct obtained from foreign-language code,
-    /// which does not respect the invairiants on `len` and `capacity`.
-    pub fn destroy_into_vec(self) -> Vec<u8> {
-        // Rust will never give us a null `data` pointer for a `Vec`, but
-        // foreign-language code can use it to cheaply pass an empty buffer.
-        if self.data.is_null() {
-            assert!(self.capacity == 0, "null RustBuffer had non-zero capacity");
-            assert!(self.len == 0, "null RustBuffer had non-zero length");
-            vec![]
-        } else {
-            let capacity: usize = self
-                .capacity
-                .try_into()
-                .expect("buffer capacity negative or overflowed");
-            let len: usize = self
-                .len
-                .try_into()
-                .expect("buffer length negative or overflowed");
-            assert!(len <= capacity, "RustBuffer length exceeds capacity");
-            unsafe { Vec::from_raw_parts(self.data, len, capacity) }
-        }
-    }
-
-    /// Reclaim memory stored in this `RustBuffer`.
-    ///
-    /// # Panics
-    ///
-    /// Panics if called on an invalid struct obtained from foreign-language code,
-    /// which does not respect the invairiants on `len` and `capacity`.
-    pub fn destroy(self) {
-        drop(self.destroy_into_vec());
-    }
-}
-
-impl Default for RustBuffer {
-    fn default() -> Self {
-        Self::new()
-    }
-}
-
-// Functions for the RustBuffer functionality.
-//
-// The scaffolding code re-exports these functions, prefixed with the component name and UDL hash
-// This creates a separate set of functions for each UniFFIed component, which is needed in the
-// case where we create multiple dylib artifacts since each dylib will have its own allocator.
-
-/// This helper allocates a new byte buffer owned by the Rust code, and returns it
-/// to the foreign-language code as a `RustBuffer` struct. Callers must eventually
-/// free the resulting buffer, either by explicitly calling [`uniffi_rustbuffer_free`] defined
-/// below, or by passing ownership of the buffer back into Rust code.
-pub fn uniffi_rustbuffer_alloc(size: u64, call_status: &mut RustCallStatus) -> RustBuffer {
-    rust_call(call_status, || Ok(RustBuffer::new_with_size(size)))
-}
-
-/// This helper copies bytes owned by the foreign-language code into a new byte buffer owned
-/// by the Rust code, and returns it as a `RustBuffer` struct. Callers must eventually
-/// free the resulting buffer, either by explicitly calling the destructor defined below,
-/// or by passing ownership of the buffer back into Rust code.
-///
-/// # Safety
-/// This function will dereference a provided pointer in order to copy bytes from it, so
-/// make sure the `ForeignBytes` struct contains a valid pointer and length.
-pub fn uniffi_rustbuffer_from_bytes(
-    bytes: ForeignBytes,
-    call_status: &mut RustCallStatus,
-) -> RustBuffer {
-    rust_call(call_status, || {
-        let bytes = bytes.as_slice();
-        Ok(RustBuffer::from_vec(bytes.to_vec()))
-    })
-}
-
-/// Free a byte buffer that had previously been passed to the foreign language code.
-///
-/// # Safety
-/// The argument *must* be a uniquely-owned `RustBuffer` previously obtained from a call
-/// into the Rust code that returned a buffer, or you'll risk freeing unowned memory or
-/// corrupting the allocator state.
-pub fn uniffi_rustbuffer_free(buf: RustBuffer, call_status: &mut RustCallStatus) {
-    rust_call(call_status, || {
-        RustBuffer::destroy(buf);
-        Ok(())
-    })
-}
-
-/// Reserve additional capacity in a byte buffer that had previously been passed to the
-/// foreign language code.
-///
-/// The first argument *must* be a uniquely-owned `RustBuffer` previously
-/// obtained from a call into the Rust code that returned a buffer. Its underlying data pointer
-/// will be reallocated if necessary and returned in a new `RustBuffer` struct.
-///
-/// The second argument must be the minimum number of *additional* bytes to reserve
-/// capacity for in the buffer; it is likely to reserve additional capacity in practice
-/// due to amortized growth strategy of Rust vectors.
-///
-/// # Safety
-/// The first argument *must* be a uniquely-owned `RustBuffer` previously obtained from a call
-/// into the Rust code that returned a buffer, or you'll risk freeing unowned memory or
-/// corrupting the allocator state.
-pub fn uniffi_rustbuffer_reserve(
-    buf: RustBuffer,
-    additional: u64,
-    call_status: &mut RustCallStatus,
-) -> RustBuffer {
-    rust_call(call_status, || {
-        let additional: usize = additional
-            .try_into()
-            .expect("additional buffer length negative or overflowed");
-        let mut v = buf.destroy_into_vec();
-        v.reserve(additional);
-        Ok(RustBuffer::from_vec(v))
-    })
-}
-
-#[cfg(test)]
-mod test {
-    use super::*;
-    #[test]
-    fn test_rustbuffer_from_vec() {
-        let rbuf = RustBuffer::from_vec(vec![1u8, 2, 3]);
-        assert_eq!(rbuf.len(), 3);
-        assert_eq!(rbuf.destroy_into_vec(), vec![1u8, 2, 3]);
-    }
-
-    #[test]
-    fn test_rustbuffer_empty() {
-        let rbuf = RustBuffer::new();
-        assert_eq!(rbuf.len(), 0);
-        // Rust will never give us a null pointer, even for an empty buffer.
-        assert!(!rbuf.data.is_null());
-        assert_eq!(rbuf.destroy_into_vec(), Vec::<u8>::new());
-    }
-
-    #[test]
-    fn test_rustbuffer_new_with_size() {
-        let rbuf = RustBuffer::new_with_size(5);
-        assert_eq!(rbuf.destroy_into_vec().as_slice(), &[0u8, 0, 0, 0, 0]);
-
-        let rbuf = RustBuffer::new_with_size(0);
-        assert!(!rbuf.data.is_null());
-        assert_eq!(rbuf.destroy_into_vec().as_slice(), &[0u8; 0]);
-    }
-
-    #[test]
-    fn test_rustbuffer_null_means_empty() {
-        // This is how foreign-language code might cheaply indicate an empty buffer.
-        let rbuf = unsafe { RustBuffer::from_raw_parts(std::ptr::null_mut(), 0, 0) };
-        assert_eq!(rbuf.destroy_into_vec().as_slice(), &[0u8; 0]);
-    }
-
-    #[test]
-    #[should_panic]
-    fn test_rustbuffer_null_must_have_no_capacity() {
-        // We guard against foreign-language code providing this kind of invalid struct.
-        let rbuf = unsafe { RustBuffer::from_raw_parts(std::ptr::null_mut(), 0, 1) };
-        rbuf.destroy_into_vec();
-    }
-    #[test]
-    #[should_panic]
-    fn test_rustbuffer_null_must_have_zero_length() {
-        // We guard against foreign-language code providing this kind of invalid struct.
-        let rbuf = unsafe { RustBuffer::from_raw_parts(std::ptr::null_mut(), 12, 0) };
-        rbuf.destroy_into_vec();
-    }
-
-    #[test]
-    #[should_panic]
-    fn test_rustbuffer_provided_len_must_not_exceed_capacity() {
-        // We guard against foreign-language code providing this kind of invalid struct.
-        let mut v = vec![0u8, 1, 2];
-        let rbuf = unsafe { RustBuffer::from_raw_parts(v.as_mut_ptr(), 3, 2) };
-        rbuf.destroy_into_vec();
-    }
-}
diff --git a/crates/uniffi_core/src/ffi/rustcalls.rs b/crates/uniffi_core/src/ffi/rustcalls.rs
deleted file mode 100644
index 16b0c76..0000000
--- a/crates/uniffi_core/src/ffi/rustcalls.rs
+++ /dev/null
@@ -1,252 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-//! # Low-level support for calling rust functions
-//!
-//! This module helps the scaffolding code make calls to rust functions and pass back the result to the FFI bindings code.
-//!
-//! It handles:
-//!    - Catching panics
-//!    - Adapting the result of `Return::lower_return()` into either a return value or an
-//!      exception
-
-use crate::{FfiDefault, Lower, RustBuffer, UniFfiTag};
-use std::mem::MaybeUninit;
-use std::panic;
-
-/// Represents the success/error of a rust call
-///
-/// ## Usage
-///
-/// - The consumer code creates a [RustCallStatus] with an empty [RustBuffer] and
-///   [RustCallStatusCode::Success] (0) as the status code
-/// - A pointer to this object is passed to the rust FFI function.  This is an
-///   "out parameter" which will be updated with any error that occurred during the function's
-///   execution.
-/// - After the call, if `code` is [RustCallStatusCode::Error] or [RustCallStatusCode::UnexpectedError]
-///   then `error_buf` will be updated to contain a serialized error object.   See
-///   [RustCallStatusCode] for what gets serialized. The consumer is responsible for freeing `error_buf`.
-///
-/// ## Layout/fields
-///
-/// The layout of this struct is important since consumers on the other side of the FFI need to
-/// construct it.  If this were a C struct, it would look like:
-///
-/// ```c,no_run
-/// struct RustCallStatus {
-///     int8_t code;
-///     RustBuffer error_buf;
-/// };
-/// ```
-#[repr(C)]
-pub struct RustCallStatus {
-    pub code: RustCallStatusCode,
-    // code is signed because unsigned types are experimental in Kotlin
-    pub error_buf: MaybeUninit<RustBuffer>,
-    // error_buf is MaybeUninit to avoid dropping the value that the consumer code sends in:
-    //   - Consumers should send in a zeroed out RustBuffer.  In this case dropping is a no-op and
-    //     avoiding the drop is a small optimization.
-    //   - If consumers pass in invalid data, then we should avoid trying to drop it.  In
-    //     particular, we don't want to try to free any data the consumer has allocated.
-    //
-    // `MaybeUninit` requires unsafe code, since we are preventing rust from dropping the value.
-    // To use this safely we need to make sure that no code paths set this twice, since that will
-    // leak the first `RustBuffer`.
-}
-
-impl RustCallStatus {
-    pub fn new() -> Self {
-        Self {
-            code: RustCallStatusCode::Success,
-            error_buf: MaybeUninit::new(RustBuffer::new()),
-        }
-    }
-
-    pub fn cancelled() -> Self {
-        Self {
-            code: RustCallStatusCode::Cancelled,
-            error_buf: MaybeUninit::new(RustBuffer::new()),
-        }
-    }
-
-    pub fn error(message: impl Into<String>) -> Self {
-        Self {
-            code: RustCallStatusCode::UnexpectedError,
-            error_buf: MaybeUninit::new(<String as Lower<UniFfiTag>>::lower(message.into())),
-        }
-    }
-}
-
-impl Default for RustCallStatus {
-    fn default() -> Self {
-        Self {
-            code: RustCallStatusCode::Success,
-            error_buf: MaybeUninit::uninit(),
-        }
-    }
-}
-
-/// Result of a FFI call to a Rust function
-#[repr(i8)]
-#[derive(Debug, PartialEq, Eq)]
-pub enum RustCallStatusCode {
-    /// Successful call.
-    Success = 0,
-    /// Expected error, corresponding to the `Result::Err` variant.  [RustCallStatus::error_buf]
-    /// will contain the serialized error.
-    Error = 1,
-    /// Unexpected error.  [RustCallStatus::error_buf] will contain a serialized message string
-    UnexpectedError = 2,
-    /// Async function cancelled.  [RustCallStatus::error_buf] will be empty and does not need to
-    /// be freed.
-    ///
-    /// This is only returned for async functions and only if the bindings code uses the
-    /// [rust_future_cancel] call.
-    Cancelled = 3,
-}
-
-/// Handle a scaffolding calls
-///
-/// `callback` is responsible for making the actual Rust call and returning a special result type:
-///   - For successful calls, return `Ok(value)`
-///   - For errors that should be translated into thrown exceptions in the foreign code, serialize
-///     the error into a `RustBuffer`, then return `Ok(buf)`
-///   - The success type, must implement `FfiDefault`.
-///   - `Return::lower_return` returns `Result<>` types that meet the above criteria>
-/// - If the function returns a `Ok` value it will be unwrapped and returned
-/// - If the function returns a `Err` value:
-///     - `out_status.code` will be set to [RustCallStatusCode::Error].
-///     - `out_status.error_buf` will be set to a newly allocated `RustBuffer` containing the error.  The calling
-///       code is responsible for freeing the `RustBuffer`
-///     - `FfiDefault::ffi_default()` is returned, although foreign code should ignore this value
-/// - If the function panics:
-///     - `out_status.code` will be set to `CALL_PANIC`
-///     - `out_status.error_buf` will be set to a newly allocated `RustBuffer` containing a
-///       serialized error message.  The calling code is responsible for freeing the `RustBuffer`
-///     - `FfiDefault::ffi_default()` is returned, although foreign code should ignore this value
-pub fn rust_call<F, R>(out_status: &mut RustCallStatus, callback: F) -> R
-where
-    F: panic::UnwindSafe + FnOnce() -> Result<R, RustBuffer>,
-    R: FfiDefault,
-{
-    rust_call_with_out_status(out_status, callback).unwrap_or_else(R::ffi_default)
-}
-
-/// Make a Rust call and update `RustCallStatus` based on the result.
-///
-/// If the call succeeds this returns Some(v) and doesn't touch out_status
-/// If the call fails (including Err results), this returns None and updates out_status
-///
-/// This contains the shared code between `rust_call` and `rustfuture::do_wake`.
-pub(crate) fn rust_call_with_out_status<F, R>(
-    out_status: &mut RustCallStatus,
-    callback: F,
-) -> Option<R>
-where
-    F: panic::UnwindSafe + FnOnce() -> Result<R, RustBuffer>,
-{
-    let result = panic::catch_unwind(|| {
-        crate::panichook::ensure_setup();
-        callback()
-    });
-    match result {
-        // Happy path.  Note: no need to update out_status in this case because the calling code
-        // initializes it to [RustCallStatusCode::Success]
-        Ok(Ok(v)) => Some(v),
-        // Callback returned an Err.
-        Ok(Err(buf)) => {
-            out_status.code = RustCallStatusCode::Error;
-            unsafe {
-                // Unsafe because we're setting the `MaybeUninit` value, see above for safety
-                // invariants.
-                out_status.error_buf.as_mut_ptr().write(buf);
-            }
-            None
-        }
-        // Callback panicked
-        Err(cause) => {
-            out_status.code = RustCallStatusCode::UnexpectedError;
-            // Try to coerce the cause into a RustBuffer containing a String.  Since this code can
-            // panic, we need to use a second catch_unwind().
-            let message_result = panic::catch_unwind(panic::AssertUnwindSafe(move || {
-                // The documentation suggests that it will *usually* be a str or String.
-                let message = if let Some(s) = cause.downcast_ref::<&'static str>() {
-                    (*s).to_string()
-                } else if let Some(s) = cause.downcast_ref::<String>() {
-                    s.clone()
-                } else {
-                    "Unknown panic!".to_string()
-                };
-                log::error!("Caught a panic calling rust code: {:?}", message);
-                <String as Lower<UniFfiTag>>::lower(message)
-            }));
-            if let Ok(buf) = message_result {
-                unsafe {
-                    // Unsafe because we're setting the `MaybeUninit` value, see above for safety
-                    // invariants.
-                    out_status.error_buf.as_mut_ptr().write(buf);
-                }
-            }
-            // Ignore the error case.  We've done all that we can at this point.  In the bindings
-            // code, we handle this by checking if `error_buf` still has an empty `RustBuffer` and
-            // using a generic message.
-            None
-        }
-    }
-}
-
-#[cfg(test)]
-mod test {
-    use super::*;
-    use crate::{test_util::TestError, Lift, LowerReturn};
-
-    fn create_call_status() -> RustCallStatus {
-        RustCallStatus {
-            code: RustCallStatusCode::Success,
-            error_buf: MaybeUninit::new(RustBuffer::new()),
-        }
-    }
-
-    fn test_callback(a: u8) -> Result<i8, TestError> {
-        match a {
-            0 => Ok(100),
-            1 => Err(TestError("Error".to_owned())),
-            x => panic!("Unexpected value: {x}"),
-        }
-    }
-
-    #[test]
-    fn test_rust_call() {
-        let mut status = create_call_status();
-        let return_value = rust_call(&mut status, || {
-            <Result<i8, TestError> as LowerReturn<UniFfiTag>>::lower_return(test_callback(0))
-        });
-
-        assert_eq!(status.code, RustCallStatusCode::Success);
-        assert_eq!(return_value, 100);
-
-        rust_call(&mut status, || {
-            <Result<i8, TestError> as LowerReturn<UniFfiTag>>::lower_return(test_callback(1))
-        });
-        assert_eq!(status.code, RustCallStatusCode::Error);
-        unsafe {
-            assert_eq!(
-                <TestError as Lift<UniFfiTag>>::try_lift(status.error_buf.assume_init()).unwrap(),
-                TestError("Error".to_owned())
-            );
-        }
-
-        let mut status = create_call_status();
-        rust_call(&mut status, || {
-            <Result<i8, TestError> as LowerReturn<UniFfiTag>>::lower_return(test_callback(2))
-        });
-        assert_eq!(status.code, RustCallStatusCode::UnexpectedError);
-        unsafe {
-            assert_eq!(
-                <String as Lift<UniFfiTag>>::try_lift(status.error_buf.assume_init()).unwrap(),
-                "Unexpected value: 2"
-            );
-        }
-    }
-}
diff --git a/crates/uniffi_core/src/ffi/rustfuture/future.rs b/crates/uniffi_core/src/ffi/rustfuture/future.rs
deleted file mode 100644
index 93c34e7..0000000
--- a/crates/uniffi_core/src/ffi/rustfuture/future.rs
+++ /dev/null
@@ -1,320 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-//! [`RustFuture`] represents a [`Future`] that can be sent to the foreign code over FFI.
-//!
-//! This type is not instantiated directly, but via the procedural macros, such as `#[uniffi::export]`.
-//!
-//! # The big picture
-//!
-//! We implement async foreign functions using a simplified version of the Future API:
-//!
-//! 0. At startup, register a [RustFutureContinuationCallback] by calling
-//!    rust_future_continuation_callback_set.
-//! 1. Call the scaffolding function to get a [Handle]
-//! 2a. In a loop:
-//!   - Call [rust_future_poll]
-//!   - Suspend the function until the [rust_future_poll] continuation function is called
-//!   - If the continuation was function was called with [RustFuturePoll::Ready], then break
-//!     otherwise continue.
-//! 2b. If the async function is cancelled, then call [rust_future_cancel].  This causes the
-//!     continuation function to be called with [RustFuturePoll::Ready] and the [RustFuture] to
-//!     enter a cancelled state.
-//! 3. Call [rust_future_complete] to get the result of the future.
-//! 4. Call [rust_future_free] to free the future, ideally in a finally block.  This:
-//!    - Releases any resources held by the future
-//!    - Calls any continuation callbacks that have not been called yet
-//!
-//! Note: Technically, the foreign code calls the scaffolding versions of the `rust_future_*`
-//! functions.  These are generated by the scaffolding macro, specially prefixed, and extern "C",
-//! and manually monomorphized in the case of [rust_future_complete].  See
-//! `uniffi_macros/src/setup_scaffolding.rs` for details.
-//!
-//! ## How does `Future` work exactly?
-//!
-//! A [`Future`] in Rust does nothing. When calling an async function, it just
-//! returns a `Future` but nothing has happened yet. To start the computation,
-//! the future must be polled. It returns [`Poll::Ready(r)`][`Poll::Ready`] if
-//! the result is ready, [`Poll::Pending`] otherwise. `Poll::Pending` basically
-//! means:
-//!
-//! > Please, try to poll me later, maybe the result will be ready!
-//!
-//! This model is very different than what other languages do, but it can actually
-//! be translated quite easily, fortunately for us!
-//!
-//! But… wait a minute… who is responsible to poll the `Future` if a `Future` does
-//! nothing? Well, it's _the executor_. The executor is responsible _to drive_ the
-//! `Future`: that's where they are polled.
-//!
-//! But… wait another minute… how does the executor know when to poll a [`Future`]?
-//! Does it poll them randomly in an endless loop? Well, no, actually it depends
-//! on the executor! A well-designed `Future` and executor work as follows.
-//! Normally, when [`Future::poll`] is called, a [`Context`] argument is
-//! passed to it. It contains a [`Waker`]. The [`Waker`] is built on top of a
-//! [`RawWaker`] which implements whatever is necessary. Usually, a waker will
-//! signal the executor to poll a particular `Future`. A `Future` will clone
-//! or pass-by-ref the waker to somewhere, as a callback, a completion, a
-//! function, or anything, to the system that is responsible to notify when a
-//! task is completed. So, to recap, the waker is _not_ responsible for waking the
-//! `Future`, it _is_ responsible for _signaling_ the executor that a particular
-//! `Future` should be polled again. That's why the documentation of
-//! [`Poll::Pending`] specifies:
-//!
-//! > When a function returns `Pending`, the function must also ensure that the
-//! > current task is scheduled to be awoken when progress can be made.
-//!
-//! “awakening” is done by using the `Waker`.
-//!
-//! [`Future`]: https://doc.rust-lang.org/std/future/trait.Future.html
-//! [`Future::poll`]: https://doc.rust-lang.org/std/future/trait.Future.html#tymethod.poll
-//! [`Pol::Ready`]: https://doc.rust-lang.org/std/task/enum.Poll.html#variant.Ready
-//! [`Poll::Pending`]: https://doc.rust-lang.org/std/task/enum.Poll.html#variant.Pending
-//! [`Context`]: https://doc.rust-lang.org/std/task/struct.Context.html
-//! [`Waker`]: https://doc.rust-lang.org/std/task/struct.Waker.html
-//! [`RawWaker`]: https://doc.rust-lang.org/std/task/struct.RawWaker.html
-
-use std::{
-    future::Future,
-    marker::PhantomData,
-    ops::Deref,
-    panic,
-    pin::Pin,
-    sync::{Arc, Mutex},
-    task::{Context, Poll, Wake},
-};
-
-use super::{RustFutureContinuationCallback, RustFuturePoll, Scheduler};
-use crate::{rust_call_with_out_status, FfiDefault, LowerReturn, RustCallStatus};
-
-/// Wraps the actual future we're polling
-struct WrappedFuture<F, T, UT>
-where
-    // See rust_future_new for an explanation of these trait bounds
-    F: Future<Output = T> + Send + 'static,
-    T: LowerReturn<UT> + Send + 'static,
-    UT: Send + 'static,
-{
-    // Note: this could be a single enum, but that would make it easy to mess up the future pinning
-    // guarantee.   For example you might want to call `std::mem::take()` to try to get the result,
-    // but if the future happened to be stored that would move and break all internal references.
-    future: Option<F>,
-    result: Option<Result<T::ReturnType, RustCallStatus>>,
-}
-
-impl<F, T, UT> WrappedFuture<F, T, UT>
-where
-    // See rust_future_new for an explanation of these trait bounds
-    F: Future<Output = T> + Send + 'static,
-    T: LowerReturn<UT> + Send + 'static,
-    UT: Send + 'static,
-{
-    fn new(future: F) -> Self {
-        Self {
-            future: Some(future),
-            result: None,
-        }
-    }
-
-    // Poll the future and check if it's ready or not
-    fn poll(&mut self, context: &mut Context<'_>) -> bool {
-        if self.result.is_some() {
-            true
-        } else if let Some(future) = &mut self.future {
-            // SAFETY: We can call Pin::new_unchecked because:
-            //    - This is the only time we get a &mut to `self.future`
-            //    - We never poll the future after it's moved (for example by using take())
-            //    - We never move RustFuture, which contains us.
-            //    - RustFuture is private to this module so no other code can move it.
-            let pinned = unsafe { Pin::new_unchecked(future) };
-            // Run the poll and lift the result if it's ready
-            let mut out_status = RustCallStatus::default();
-            let result: Option<Poll<T::ReturnType>> = rust_call_with_out_status(
-                &mut out_status,
-                // This closure uses a `&mut F` value, which means it's not UnwindSafe by
-                // default.  If the future panics, it may be in an invalid state.
-                //
-                // However, we can safely use `AssertUnwindSafe` since a panic will lead the `None`
-                // case below and we will never poll the future again.
-                panic::AssertUnwindSafe(|| match pinned.poll(context) {
-                    Poll::Pending => Ok(Poll::Pending),
-                    Poll::Ready(v) => T::lower_return(v).map(Poll::Ready),
-                }),
-            );
-            match result {
-                Some(Poll::Pending) => false,
-                Some(Poll::Ready(v)) => {
-                    self.future = None;
-                    self.result = Some(Ok(v));
-                    true
-                }
-                None => {
-                    self.future = None;
-                    self.result = Some(Err(out_status));
-                    true
-                }
-            }
-        } else {
-            log::error!("poll with neither future nor result set");
-            true
-        }
-    }
-
-    fn complete(&mut self, out_status: &mut RustCallStatus) -> T::ReturnType {
-        let mut return_value = T::ReturnType::ffi_default();
-        match self.result.take() {
-            Some(Ok(v)) => return_value = v,
-            Some(Err(call_status)) => *out_status = call_status,
-            None => *out_status = RustCallStatus::cancelled(),
-        }
-        self.free();
-        return_value
-    }
-
-    fn free(&mut self) {
-        self.future = None;
-        self.result = None;
-    }
-}
-
-// If F and T are Send, then WrappedFuture is too
-//
-// Rust will not mark it Send by default when T::ReturnType is a raw pointer.  This is promising
-// that we will treat the raw pointer properly, for example by not returning it twice.
-unsafe impl<F, T, UT> Send for WrappedFuture<F, T, UT>
-where
-    // See rust_future_new for an explanation of these trait bounds
-    F: Future<Output = T> + Send + 'static,
-    T: LowerReturn<UT> + Send + 'static,
-    UT: Send + 'static,
-{
-}
-
-/// Future that the foreign code is awaiting
-pub(super) struct RustFuture<F, T, UT>
-where
-    // See rust_future_new for an explanation of these trait bounds
-    F: Future<Output = T> + Send + 'static,
-    T: LowerReturn<UT> + Send + 'static,
-    UT: Send + 'static,
-{
-    // This Mutex should never block if our code is working correctly, since there should not be
-    // multiple threads calling [Self::poll] and/or [Self::complete] at the same time.
-    future: Mutex<WrappedFuture<F, T, UT>>,
-    scheduler: Mutex<Scheduler>,
-    // UT is used as the generic parameter for [LowerReturn].
-    // Let's model this with PhantomData as a function that inputs a UT value.
-    _phantom: PhantomData<fn(UT) -> ()>,
-}
-
-impl<F, T, UT> RustFuture<F, T, UT>
-where
-    // See rust_future_new for an explanation of these trait bounds
-    F: Future<Output = T> + Send + 'static,
-    T: LowerReturn<UT> + Send + 'static,
-    UT: Send + 'static,
-{
-    pub(super) fn new(future: F, _tag: UT) -> Arc<Self> {
-        Arc::new(Self {
-            future: Mutex::new(WrappedFuture::new(future)),
-            scheduler: Mutex::new(Scheduler::new()),
-            _phantom: PhantomData,
-        })
-    }
-
-    pub(super) fn poll(self: Arc<Self>, callback: RustFutureContinuationCallback, data: u64) {
-        let ready = self.is_cancelled() || {
-            let mut locked = self.future.lock().unwrap();
-            let waker: std::task::Waker = Arc::clone(&self).into();
-            locked.poll(&mut Context::from_waker(&waker))
-        };
-        if ready {
-            callback(data, RustFuturePoll::Ready)
-        } else {
-            self.scheduler.lock().unwrap().store(callback, data);
-        }
-    }
-
-    pub(super) fn is_cancelled(&self) -> bool {
-        self.scheduler.lock().unwrap().is_cancelled()
-    }
-
-    pub(super) fn wake(&self) {
-        self.scheduler.lock().unwrap().wake();
-    }
-
-    pub(super) fn cancel(&self) {
-        self.scheduler.lock().unwrap().cancel();
-    }
-
-    pub(super) fn complete(&self, call_status: &mut RustCallStatus) -> T::ReturnType {
-        self.future.lock().unwrap().complete(call_status)
-    }
-
-    pub(super) fn free(self: Arc<Self>) {
-        // Call cancel() to send any leftover data to the continuation callback
-        self.scheduler.lock().unwrap().cancel();
-        // Ensure we drop our inner future, releasing all held references
-        self.future.lock().unwrap().free();
-    }
-}
-
-impl<F, T, UT> Wake for RustFuture<F, T, UT>
-where
-    // See rust_future_new for an explanation of these trait bounds
-    F: Future<Output = T> + Send + 'static,
-    T: LowerReturn<UT> + Send + 'static,
-    UT: Send + 'static,
-{
-    fn wake(self: Arc<Self>) {
-        self.deref().wake()
-    }
-
-    fn wake_by_ref(self: &Arc<Self>) {
-        self.deref().wake()
-    }
-}
-
-/// RustFuture FFI trait.  This allows `Arc<RustFuture<F, T, UT>>` to be cast to
-/// `Arc<dyn RustFutureFfi<T::ReturnType>>`, which is needed to implement the public FFI API.  In particular, this
-/// allows you to use RustFuture functionality without knowing the concrete Future type, which is
-/// unnamable.
-///
-/// This is parametrized on the ReturnType rather than the `T` directly, to reduce the number of
-/// scaffolding functions we need to generate.  If it was parametrized on `T`, then we would need
-/// to create a poll, cancel, complete, and free scaffolding function for each exported async
-/// function.  That would add ~1kb binary size per exported function based on a quick estimate on a
-/// x86-64 machine . By parametrizing on `T::ReturnType` we can instead monomorphize by hand and
-/// only create those functions for each of the 13 possible FFI return types.
-#[doc(hidden)]
-pub trait RustFutureFfi<ReturnType>: Send + Sync {
-    fn ffi_poll(self: Arc<Self>, callback: RustFutureContinuationCallback, data: u64);
-    fn ffi_cancel(&self);
-    fn ffi_complete(&self, call_status: &mut RustCallStatus) -> ReturnType;
-    fn ffi_free(self: Arc<Self>);
-}
-
-impl<F, T, UT> RustFutureFfi<T::ReturnType> for RustFuture<F, T, UT>
-where
-    // See rust_future_new for an explanation of these trait bounds
-    F: Future<Output = T> + Send + 'static,
-    T: LowerReturn<UT> + Send + 'static,
-    UT: Send + 'static,
-{
-    fn ffi_poll(self: Arc<Self>, callback: RustFutureContinuationCallback, data: u64) {
-        self.poll(callback, data)
-    }
-
-    fn ffi_cancel(&self) {
-        self.cancel()
-    }
-
-    fn ffi_complete(&self, call_status: &mut RustCallStatus) -> T::ReturnType {
-        self.complete(call_status)
-    }
-
-    fn ffi_free(self: Arc<Self>) {
-        self.free();
-    }
-}
diff --git a/crates/uniffi_core/src/ffi/rustfuture/mod.rs b/crates/uniffi_core/src/ffi/rustfuture/mod.rs
deleted file mode 100644
index 3d3505e..0000000
--- a/crates/uniffi_core/src/ffi/rustfuture/mod.rs
+++ /dev/null
@@ -1,141 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-use std::{future::Future, sync::Arc};
-
-mod future;
-mod scheduler;
-use future::*;
-use scheduler::*;
-
-#[cfg(test)]
-mod tests;
-
-use crate::{derive_ffi_traits, Handle, HandleAlloc, LowerReturn, RustCallStatus};
-
-/// Result code for [rust_future_poll].  This is passed to the continuation function.
-#[repr(i8)]
-#[derive(Debug, PartialEq, Eq)]
-pub enum RustFuturePoll {
-    /// The future is ready and is waiting for [rust_future_complete] to be called
-    Ready = 0,
-    /// The future might be ready and [rust_future_poll] should be called again
-    MaybeReady = 1,
-}
-
-/// Foreign callback that's passed to [rust_future_poll]
-///
-/// The Rust side of things calls this when the foreign side should call [rust_future_poll] again
-/// to continue progress on the future.
-pub type RustFutureContinuationCallback = extern "C" fn(callback_data: u64, RustFuturePoll);
-
-// === Public FFI API ===
-
-/// Create a new [Handle] for a Rust future
-///
-/// For each exported async function, UniFFI will create a scaffolding function that uses this to
-/// create the [Handle] to pass to the foreign code.
-pub fn rust_future_new<F, T, UT>(future: F, tag: UT) -> Handle
-where
-    // F is the future type returned by the exported async function.  It needs to be Send + `static
-    // since it will move between threads for an indeterminate amount of time as the foreign
-    // executor calls polls it and the Rust executor wakes it.  It does not need to by `Sync`,
-    // since we synchronize all access to the values.
-    F: Future<Output = T> + Send + 'static,
-    // T is the output of the Future.  It needs to implement [LowerReturn].  Also it must be Send +
-    // 'static for the same reason as F.
-    T: LowerReturn<UT> + Send + 'static,
-    // The UniFfiTag ZST. The Send + 'static bound is to keep rustc happy.
-    UT: Send + 'static,
-    // Needed to allocate a handle
-    dyn RustFutureFfi<T::ReturnType>: HandleAlloc<UT>,
-{
-    <dyn RustFutureFfi<T::ReturnType> as HandleAlloc<UT>>::new_handle(
-        RustFuture::new(future, tag) as Arc<dyn RustFutureFfi<T::ReturnType>>
-    )
-}
-
-/// Poll a Rust future
-///
-/// When the future is ready to progress the continuation will be called with the `data` value and
-/// a [RustFuturePoll] value. For each [rust_future_poll] call the continuation will be called
-/// exactly once.
-///
-/// # Safety
-///
-/// The [Handle] must not previously have been passed to [rust_future_free]
-pub unsafe fn rust_future_poll<ReturnType, UT>(
-    handle: Handle,
-    callback: RustFutureContinuationCallback,
-    data: u64,
-) where
-    dyn RustFutureFfi<ReturnType>: HandleAlloc<UT>,
-{
-    <dyn RustFutureFfi<ReturnType> as HandleAlloc<UT>>::get_arc(handle).ffi_poll(callback, data)
-}
-
-/// Cancel a Rust future
-///
-/// Any current and future continuations will be immediately called with RustFuturePoll::Ready.
-///
-/// This is needed for languages like Swift, which continuation to wait for the continuation to be
-/// called when tasks are cancelled.
-///
-/// # Safety
-///
-/// The [Handle] must not previously have been passed to [rust_future_free]
-pub unsafe fn rust_future_cancel<ReturnType, UT>(handle: Handle)
-where
-    dyn RustFutureFfi<ReturnType>: HandleAlloc<UT>,
-{
-    <dyn RustFutureFfi<ReturnType> as HandleAlloc<UT>>::get_arc(handle).ffi_cancel()
-}
-
-/// Complete a Rust future
-///
-/// Note: the actually extern "C" scaffolding functions can't be generic, so we generate one for
-/// each supported FFI type.
-///
-/// # Safety
-///
-/// - The [Handle] must not previously have been passed to [rust_future_free]
-/// - The `T` param must correctly correspond to the [rust_future_new] call.  It must
-///   be `<Output as LowerReturn<UT>>::ReturnType`
-pub unsafe fn rust_future_complete<ReturnType, UT>(
-    handle: Handle,
-    out_status: &mut RustCallStatus,
-) -> ReturnType
-where
-    dyn RustFutureFfi<ReturnType>: HandleAlloc<UT>,
-{
-    <dyn RustFutureFfi<ReturnType> as HandleAlloc<UT>>::get_arc(handle).ffi_complete(out_status)
-}
-
-/// Free a Rust future, dropping the strong reference and releasing all references held by the
-/// future.
-///
-/// # Safety
-///
-/// The [Handle] must not previously have been passed to [rust_future_free]
-pub unsafe fn rust_future_free<ReturnType, UT>(handle: Handle)
-where
-    dyn RustFutureFfi<ReturnType>: HandleAlloc<UT>,
-{
-    <dyn RustFutureFfi<ReturnType> as HandleAlloc<UT>>::consume_handle(handle).ffi_free()
-}
-
-// Derive HandleAlloc for dyn RustFutureFfi<T> for all FFI return types
-derive_ffi_traits!(impl<UT> HandleAlloc<UT> for dyn RustFutureFfi<u8>);
-derive_ffi_traits!(impl<UT> HandleAlloc<UT> for dyn RustFutureFfi<i8>);
-derive_ffi_traits!(impl<UT> HandleAlloc<UT> for dyn RustFutureFfi<u16>);
-derive_ffi_traits!(impl<UT> HandleAlloc<UT> for dyn RustFutureFfi<i16>);
-derive_ffi_traits!(impl<UT> HandleAlloc<UT> for dyn RustFutureFfi<u32>);
-derive_ffi_traits!(impl<UT> HandleAlloc<UT> for dyn RustFutureFfi<i32>);
-derive_ffi_traits!(impl<UT> HandleAlloc<UT> for dyn RustFutureFfi<u64>);
-derive_ffi_traits!(impl<UT> HandleAlloc<UT> for dyn RustFutureFfi<i64>);
-derive_ffi_traits!(impl<UT> HandleAlloc<UT> for dyn RustFutureFfi<f32>);
-derive_ffi_traits!(impl<UT> HandleAlloc<UT> for dyn RustFutureFfi<f64>);
-derive_ffi_traits!(impl<UT> HandleAlloc<UT> for dyn RustFutureFfi<*const std::ffi::c_void>);
-derive_ffi_traits!(impl<UT> HandleAlloc<UT> for dyn RustFutureFfi<crate::RustBuffer>);
-derive_ffi_traits!(impl<UT> HandleAlloc<UT> for dyn RustFutureFfi<()>);
diff --git a/crates/uniffi_core/src/ffi/rustfuture/scheduler.rs b/crates/uniffi_core/src/ffi/rustfuture/scheduler.rs
deleted file mode 100644
index 629ee0c..0000000
--- a/crates/uniffi_core/src/ffi/rustfuture/scheduler.rs
+++ /dev/null
@@ -1,96 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-use std::mem;
-
-use super::{RustFutureContinuationCallback, RustFuturePoll};
-
-/// Schedules a [crate::RustFuture] by managing the continuation data
-///
-/// This struct manages the continuation callback and data that comes from the foreign side.  It
-/// is responsible for calling the continuation callback when the future is ready to be woken up.
-///
-/// The basic guarantees are:
-///
-/// * Each callback will be invoked exactly once, with its associated data.
-/// * If `wake()` is called, the callback will be invoked to wake up the future -- either
-///   immediately or the next time we get a callback.
-/// * If `cancel()` is called, the same will happen and the schedule will stay in the cancelled
-///   state, invoking any future callbacks as soon as they're stored.
-
-#[derive(Debug)]
-pub(super) enum Scheduler {
-    /// No continuations set, neither wake() nor cancel() called.
-    Empty,
-    /// `wake()` was called when there was no continuation set.  The next time `store` is called,
-    /// the continuation should be immediately invoked with `RustFuturePoll::MaybeReady`
-    Waked,
-    /// The future has been cancelled, any future `store` calls should immediately result in the
-    /// continuation being called with `RustFuturePoll::Ready`.
-    Cancelled,
-    /// Continuation set, the next time `wake()`  is called is called, we should invoke it.
-    Set(RustFutureContinuationCallback, u64),
-}
-
-impl Scheduler {
-    pub(super) fn new() -> Self {
-        Self::Empty
-    }
-
-    /// Store new continuation data if we are in the `Empty` state.  If we are in the `Waked` or
-    /// `Cancelled` state, call the continuation immediately with the data.
-    pub(super) fn store(&mut self, callback: RustFutureContinuationCallback, data: u64) {
-        match self {
-            Self::Empty => *self = Self::Set(callback, data),
-            Self::Set(old_callback, old_data) => {
-                log::error!(
-                    "store: observed `Self::Set` state.  Is poll() being called from multiple threads at once?"
-                );
-                old_callback(*old_data, RustFuturePoll::Ready);
-                *self = Self::Set(callback, data);
-            }
-            Self::Waked => {
-                *self = Self::Empty;
-                callback(data, RustFuturePoll::MaybeReady);
-            }
-            Self::Cancelled => {
-                callback(data, RustFuturePoll::Ready);
-            }
-        }
-    }
-
-    pub(super) fn wake(&mut self) {
-        match self {
-            // If we had a continuation set, then call it and transition to the `Empty` state.
-            Self::Set(callback, old_data) => {
-                let old_data = *old_data;
-                let callback = *callback;
-                *self = Self::Empty;
-                callback(old_data, RustFuturePoll::MaybeReady);
-            }
-            // If we were in the `Empty` state, then transition to `Waked`.  The next time `store`
-            // is called, we will immediately call the continuation.
-            Self::Empty => *self = Self::Waked,
-            // This is a no-op if we were in the `Cancelled` or `Waked` state.
-            _ => (),
-        }
-    }
-
-    pub(super) fn cancel(&mut self) {
-        if let Self::Set(callback, old_data) = mem::replace(self, Self::Cancelled) {
-            callback(old_data, RustFuturePoll::Ready);
-        }
-    }
-
-    pub(super) fn is_cancelled(&self) -> bool {
-        matches!(self, Self::Cancelled)
-    }
-}
-
-// The `*const ()` data pointer references an object on the foreign side.
-// This object must be `Sync` in Rust terminology -- it must be safe for us to pass the pointer to the continuation callback from any thread.
-// If the foreign side upholds their side of the contract, then `Scheduler` is Send + Sync.
-
-unsafe impl Send for Scheduler {}
-unsafe impl Sync for Scheduler {}
diff --git a/crates/uniffi_core/src/ffi/rustfuture/tests.rs b/crates/uniffi_core/src/ffi/rustfuture/tests.rs
deleted file mode 100644
index 886ee27..0000000
--- a/crates/uniffi_core/src/ffi/rustfuture/tests.rs
+++ /dev/null
@@ -1,223 +0,0 @@
-use once_cell::sync::OnceCell;
-use std::{
-    future::Future,
-    panic,
-    pin::Pin,
-    sync::{Arc, Mutex},
-    task::{Context, Poll, Waker},
-};
-
-use super::*;
-use crate::{test_util::TestError, Lift, RustBuffer, RustCallStatusCode};
-
-// Sender/Receiver pair that we use for testing
-struct Channel {
-    result: Option<Result<String, TestError>>,
-    waker: Option<Waker>,
-}
-
-struct Sender(Arc<Mutex<Channel>>);
-
-impl Sender {
-    fn wake(&self) {
-        let inner = self.0.lock().unwrap();
-        if let Some(waker) = &inner.waker {
-            waker.wake_by_ref();
-        }
-    }
-
-    fn send(&self, value: Result<String, TestError>) {
-        let mut inner = self.0.lock().unwrap();
-        if inner.result.replace(value).is_some() {
-            panic!("value already sent");
-        }
-        if let Some(waker) = &inner.waker {
-            waker.wake_by_ref();
-        }
-    }
-}
-
-struct Receiver(Arc<Mutex<Channel>>);
-
-impl Future for Receiver {
-    type Output = Result<String, TestError>;
-
-    fn poll(self: Pin<&mut Self>, context: &mut Context<'_>) -> Poll<Result<String, TestError>> {
-        let mut inner = self.0.lock().unwrap();
-        match &inner.result {
-            Some(v) => Poll::Ready(v.clone()),
-            None => {
-                inner.waker = Some(context.waker().clone());
-                Poll::Pending
-            }
-        }
-    }
-}
-
-// Create a sender and rust future that we can use for testing
-fn channel() -> (Sender, Arc<dyn RustFutureFfi<RustBuffer>>) {
-    let channel = Arc::new(Mutex::new(Channel {
-        result: None,
-        waker: None,
-    }));
-    let rust_future = RustFuture::new(Receiver(channel.clone()), crate::UniFfiTag);
-    (Sender(channel), rust_future)
-}
-
-/// Poll a Rust future and get an OnceCell that's set when the continuation is called
-fn poll(rust_future: &Arc<dyn RustFutureFfi<RustBuffer>>) -> Arc<OnceCell<RustFuturePoll>> {
-    let cell = Arc::new(OnceCell::new());
-    let handle = Arc::into_raw(cell.clone()) as u64;
-    rust_future.clone().ffi_poll(poll_continuation, handle);
-    cell
-}
-
-extern "C" fn poll_continuation(data: u64, code: RustFuturePoll) {
-    let cell = unsafe { Arc::from_raw(data as *const OnceCell<RustFuturePoll>) };
-    cell.set(code).expect("Error setting OnceCell");
-}
-
-fn complete(rust_future: Arc<dyn RustFutureFfi<RustBuffer>>) -> (RustBuffer, RustCallStatus) {
-    let mut out_status_code = RustCallStatus::default();
-    let return_value = rust_future.ffi_complete(&mut out_status_code);
-    (return_value, out_status_code)
-}
-
-#[test]
-fn test_success() {
-    let (sender, rust_future) = channel();
-
-    // Test polling the rust future before it's ready
-    let continuation_result = poll(&rust_future);
-    assert_eq!(continuation_result.get(), None);
-    sender.wake();
-    assert_eq!(continuation_result.get(), Some(&RustFuturePoll::MaybeReady));
-
-    // Test polling the rust future when it's ready
-    let continuation_result = poll(&rust_future);
-    assert_eq!(continuation_result.get(), None);
-    sender.send(Ok("All done".into()));
-    assert_eq!(continuation_result.get(), Some(&RustFuturePoll::MaybeReady));
-
-    // Future polls should immediately return ready
-    let continuation_result = poll(&rust_future);
-    assert_eq!(continuation_result.get(), Some(&RustFuturePoll::Ready));
-
-    // Complete the future
-    let (return_buf, call_status) = complete(rust_future);
-    assert_eq!(call_status.code, RustCallStatusCode::Success);
-    assert_eq!(
-        <String as Lift<crate::UniFfiTag>>::try_lift(return_buf).unwrap(),
-        "All done"
-    );
-}
-
-#[test]
-fn test_error() {
-    let (sender, rust_future) = channel();
-
-    let continuation_result = poll(&rust_future);
-    assert_eq!(continuation_result.get(), None);
-    sender.send(Err("Something went wrong".into()));
-    assert_eq!(continuation_result.get(), Some(&RustFuturePoll::MaybeReady));
-
-    let continuation_result = poll(&rust_future);
-    assert_eq!(continuation_result.get(), Some(&RustFuturePoll::Ready));
-
-    let (_, call_status) = complete(rust_future);
-    assert_eq!(call_status.code, RustCallStatusCode::Error);
-    unsafe {
-        assert_eq!(
-            <TestError as Lift<crate::UniFfiTag>>::try_lift_from_rust_buffer(
-                call_status.error_buf.assume_init()
-            )
-            .unwrap(),
-            TestError::from("Something went wrong"),
-        )
-    }
-}
-
-// Once `complete` is called, the inner future should be released, even if wakers still hold a
-// reference to the RustFuture
-#[test]
-fn test_cancel() {
-    let (_sender, rust_future) = channel();
-
-    let continuation_result = poll(&rust_future);
-    assert_eq!(continuation_result.get(), None);
-    rust_future.ffi_cancel();
-    // Cancellation should immediately invoke the callback with RustFuturePoll::Ready
-    assert_eq!(continuation_result.get(), Some(&RustFuturePoll::Ready));
-
-    // Future polls should immediately invoke the callback with RustFuturePoll::Ready
-    let continuation_result = poll(&rust_future);
-    assert_eq!(continuation_result.get(), Some(&RustFuturePoll::Ready));
-
-    let (_, call_status) = complete(rust_future);
-    assert_eq!(call_status.code, RustCallStatusCode::Cancelled);
-}
-
-// Once `free` is called, the inner future should be released, even if wakers still hold a
-// reference to the RustFuture
-#[test]
-fn test_release_future() {
-    let (sender, rust_future) = channel();
-    // Create a weak reference to the channel to use to check if rust_future has dropped its
-    // future.
-    let channel_weak = Arc::downgrade(&sender.0);
-    drop(sender);
-    // Create an extra ref to rust_future, simulating a waker that still holds a reference to
-    // it
-    let rust_future2 = rust_future.clone();
-
-    // Complete the rust future
-    rust_future.ffi_free();
-    // Even though rust_future is still alive, the channel shouldn't be
-    assert!(Arc::strong_count(&rust_future2) > 0);
-    assert_eq!(channel_weak.strong_count(), 0);
-    assert!(channel_weak.upgrade().is_none());
-}
-
-// If `free` is called with a continuation still stored, we should call it them then.
-//
-// This shouldn't happen in practice, but it seems like good defensive programming
-#[test]
-fn test_complete_with_stored_continuation() {
-    let (_sender, rust_future) = channel();
-
-    let continuation_result = poll(&rust_future);
-    rust_future.ffi_free();
-    assert_eq!(continuation_result.get(), Some(&RustFuturePoll::Ready));
-}
-
-// Test what happens if we see a `wake()` call while we're polling the future.  This can
-// happen, for example, with futures that are handled by a tokio thread pool.  We should
-// schedule another poll of the future in this case.
-#[test]
-fn test_wake_during_poll() {
-    let mut first_time = true;
-    let future = std::future::poll_fn(move |ctx| {
-        if first_time {
-            first_time = false;
-            // Wake the future while we are in the middle of polling it
-            ctx.waker().clone().wake();
-            Poll::Pending
-        } else {
-            // The second time we're polled, we're ready
-            Poll::Ready("All done".to_owned())
-        }
-    });
-    let rust_future: Arc<dyn RustFutureFfi<RustBuffer>> = RustFuture::new(future, crate::UniFfiTag);
-    let continuation_result = poll(&rust_future);
-    // The continuation function should called immediately
-    assert_eq!(continuation_result.get(), Some(&RustFuturePoll::MaybeReady));
-    // A second poll should finish the future
-    let continuation_result = poll(&rust_future);
-    assert_eq!(continuation_result.get(), Some(&RustFuturePoll::Ready));
-    let (return_buf, call_status) = complete(rust_future);
-    assert_eq!(call_status.code, RustCallStatusCode::Success);
-    assert_eq!(
-        <String as Lift<crate::UniFfiTag>>::try_lift(return_buf).unwrap(),
-        "All done"
-    );
-}
diff --git a/crates/uniffi_core/src/ffi_converter_impls.rs b/crates/uniffi_core/src/ffi_converter_impls.rs
deleted file mode 100644
index aec0931..0000000
--- a/crates/uniffi_core/src/ffi_converter_impls.rs
+++ /dev/null
@@ -1,537 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-/// This module contains builtin `FFIConverter` implementations.  These cover:
-///   - Simple privitive types: u8, i32, String, Arc<T>, etc
-///   - Composite types: Vec<T>, Option<T>, etc.
-///   - SystemTime and Duration, which maybe shouldn`t be built-in, but have been historically and
-///     we want to continue to support them for now.
-///
-/// As described in
-/// https://mozilla.github.io/uniffi-rs/internals/lifting_and_lowering.html#code-generation-and-the-fficonverter-trait,
-/// we use the following system:
-///
-///   - Each UniFFIed crate defines a unit struct named `UniFfiTag`
-///   - We define an `impl FFIConverter<UniFfiTag> for Type` for each type that we want to pass
-///     across the FFI.
-///   - When generating the code, we use the `<T as ::uniffi::FFIConverter<crate::UniFfiTag>>` impl
-///     to lift/lower/serialize types for a crate.
-///
-/// This crate needs to implement `FFIConverter<UT>` on `UniFfiTag` instances for all UniFFI
-/// consumer crates.  To do this, it defines blanket impls like `impl<UT> FFIConverter<UT> for u8`.
-/// "UT" means an arbitrary `UniFfiTag` type.
-use crate::{
-    check_remaining, derive_ffi_traits, ffi_converter_rust_buffer_lift_and_lower, metadata,
-    ConvertError, FfiConverter, Lift, LiftRef, LiftReturn, Lower, LowerReturn, MetadataBuffer,
-    Result, RustBuffer, UnexpectedUniFFICallbackError,
-};
-use anyhow::bail;
-use bytes::buf::{Buf, BufMut};
-use paste::paste;
-use std::{
-    collections::HashMap,
-    convert::TryFrom,
-    error::Error,
-    sync::Arc,
-    time::{Duration, SystemTime},
-};
-
-/// Blanket implementation of `FfiConverter` for numeric primitives.
-///
-/// Numeric primitives have a straightforward mapping into C-compatible numeric types,
-/// sice they are themselves a C-compatible numeric type!
-macro_rules! impl_ffi_converter_for_num_primitive {
-    ($T:ty, $type_code:expr) => {
-        paste! {
-            unsafe impl<UT> FfiConverter<UT> for $T {
-                type FfiType = $T;
-
-                fn lower(obj: $T) -> Self::FfiType {
-                    obj
-                }
-
-                fn try_lift(v: Self::FfiType) -> Result<$T> {
-                    Ok(v)
-                }
-
-                fn write(obj: $T, buf: &mut Vec<u8>) {
-                    buf.[<put_ $T>](obj);
-                }
-
-                fn try_read(buf: &mut &[u8]) -> Result<$T> {
-                    check_remaining(buf, std::mem::size_of::<$T>())?;
-                    Ok(buf.[<get_ $T>]())
-                }
-
-                const TYPE_ID_META: MetadataBuffer = MetadataBuffer::from_code($type_code);
-            }
-        }
-    };
-}
-
-impl_ffi_converter_for_num_primitive!(u8, metadata::codes::TYPE_U8);
-impl_ffi_converter_for_num_primitive!(i8, metadata::codes::TYPE_I8);
-impl_ffi_converter_for_num_primitive!(u16, metadata::codes::TYPE_U16);
-impl_ffi_converter_for_num_primitive!(i16, metadata::codes::TYPE_I16);
-impl_ffi_converter_for_num_primitive!(u32, metadata::codes::TYPE_U32);
-impl_ffi_converter_for_num_primitive!(i32, metadata::codes::TYPE_I32);
-impl_ffi_converter_for_num_primitive!(u64, metadata::codes::TYPE_U64);
-impl_ffi_converter_for_num_primitive!(i64, metadata::codes::TYPE_I64);
-impl_ffi_converter_for_num_primitive!(f32, metadata::codes::TYPE_F32);
-impl_ffi_converter_for_num_primitive!(f64, metadata::codes::TYPE_F64);
-
-/// Support for passing boolean values via the FFI.
-///
-/// Booleans are passed as an `i8` in order to avoid problems with handling
-/// C-compatible boolean values on JVM-based languages.
-unsafe impl<UT> FfiConverter<UT> for bool {
-    type FfiType = i8;
-
-    fn lower(obj: bool) -> Self::FfiType {
-        i8::from(obj)
-    }
-
-    fn try_lift(v: Self::FfiType) -> Result<bool> {
-        Ok(match v {
-            0 => false,
-            1 => true,
-            _ => bail!("unexpected byte for Boolean"),
-        })
-    }
-
-    fn write(obj: bool, buf: &mut Vec<u8>) {
-        buf.put_i8(<Self as FfiConverter<UT>>::lower(obj));
-    }
-
-    fn try_read(buf: &mut &[u8]) -> Result<bool> {
-        check_remaining(buf, 1)?;
-        <Self as FfiConverter<UT>>::try_lift(buf.get_i8())
-    }
-
-    const TYPE_ID_META: MetadataBuffer = MetadataBuffer::from_code(metadata::codes::TYPE_BOOL);
-}
-
-/// Support for passing Strings via the FFI.
-///
-/// Unlike many other implementations of `FfiConverter`, this passes a struct containing
-/// a raw pointer rather than copying the data from one side to the other. This is a
-/// safety hazard, but turns out to be pretty nice for useability. This struct
-/// *must* be a valid `RustBuffer` and it *must* contain valid utf-8 data (in other
-/// words, it *must* be a `Vec<u8>` suitable for use as an actual rust `String`).
-///
-/// When serialized in a buffer, strings are represented as a i32 byte length
-/// followed by utf8-encoded bytes. (It's a signed integer because unsigned types are
-/// currently experimental in Kotlin).
-unsafe impl<UT> FfiConverter<UT> for String {
-    type FfiType = RustBuffer;
-
-    // This returns a struct with a raw pointer to the underlying bytes, so it's very
-    // important that it consume ownership of the String, which is relinquished to the
-    // foreign language code (and can be restored by it passing the pointer back).
-    fn lower(obj: String) -> Self::FfiType {
-        RustBuffer::from_vec(obj.into_bytes())
-    }
-
-    // The argument here *must* be a uniquely-owned `RustBuffer` previously obtained
-    // from `lower` above, and hence must be the bytes of a valid rust string.
-    fn try_lift(v: Self::FfiType) -> Result<String> {
-        let v = v.destroy_into_vec();
-        // This turns the buffer back into a `String` without copying the data
-        // and without re-checking it for validity of the utf8. If the `RustBuffer`
-        // came from a valid String then there's no point in re-checking the utf8,
-        // and if it didn't then bad things are probably going to happen regardless
-        // of whether we check for valid utf8 data or not.
-        Ok(unsafe { String::from_utf8_unchecked(v) })
-    }
-
-    fn write(obj: String, buf: &mut Vec<u8>) {
-        // N.B. `len()` gives us the length in bytes, not in chars or graphemes.
-        // TODO: it would be nice not to panic here.
-        let len = i32::try_from(obj.len()).unwrap();
-        buf.put_i32(len); // We limit strings to u32::MAX bytes
-        buf.put(obj.as_bytes());
-    }
-
-    fn try_read(buf: &mut &[u8]) -> Result<String> {
-        check_remaining(buf, 4)?;
-        let len = usize::try_from(buf.get_i32())?;
-        check_remaining(buf, len)?;
-        // N.B: In the general case `Buf::chunk()` may return partial data.
-        // But in the specific case of `<&[u8] as Buf>` it returns the full slice,
-        // so there is no risk of having less than `len` bytes available here.
-        let bytes = &buf.chunk()[..len];
-        let res = String::from_utf8(bytes.to_vec())?;
-        buf.advance(len);
-        Ok(res)
-    }
-
-    const TYPE_ID_META: MetadataBuffer = MetadataBuffer::from_code(metadata::codes::TYPE_STRING);
-}
-
-/// Support for passing timestamp values via the FFI.
-///
-/// Timestamps values are currently always passed by serializing to a buffer.
-///
-/// Timestamps are represented on the buffer by an i64 that indicates the
-/// direction and the magnitude in seconds of the offset from epoch, and a
-/// u32 that indicates the nanosecond portion of the offset magnitude. The
-/// nanosecond portion is expected to be between 0 and 999,999,999.
-///
-/// To build an epoch offset the absolute value of the seconds portion of the
-/// offset should be combined with the nanosecond portion. This is because
-/// the sign of the seconds portion represents the direction of the offset
-/// overall. The sign of the seconds portion can then be used to determine
-/// if the total offset should be added to or subtracted from the unix epoch.
-unsafe impl<UT> FfiConverter<UT> for SystemTime {
-    ffi_converter_rust_buffer_lift_and_lower!(UT);
-
-    fn write(obj: SystemTime, buf: &mut Vec<u8>) {
-        let mut sign = 1;
-        let epoch_offset = obj
-            .duration_since(SystemTime::UNIX_EPOCH)
-            .unwrap_or_else(|error| {
-                sign = -1;
-                error.duration()
-            });
-        // This panic should never happen as SystemTime typically stores seconds as i64
-        let seconds = sign
-            * i64::try_from(epoch_offset.as_secs())
-                .expect("SystemTime overflow, seconds greater than i64::MAX");
-
-        buf.put_i64(seconds);
-        buf.put_u32(epoch_offset.subsec_nanos());
-    }
-
-    fn try_read(buf: &mut &[u8]) -> Result<SystemTime> {
-        check_remaining(buf, 12)?;
-        let seconds = buf.get_i64();
-        let nanos = buf.get_u32();
-        let epoch_offset = Duration::new(seconds.wrapping_abs() as u64, nanos);
-
-        if seconds >= 0 {
-            Ok(SystemTime::UNIX_EPOCH + epoch_offset)
-        } else {
-            Ok(SystemTime::UNIX_EPOCH - epoch_offset)
-        }
-    }
-
-    const TYPE_ID_META: MetadataBuffer =
-        MetadataBuffer::from_code(metadata::codes::TYPE_SYSTEM_TIME);
-}
-
-/// Support for passing duration values via the FFI.
-///
-/// Duration values are currently always passed by serializing to a buffer.
-///
-/// Durations are represented on the buffer by a u64 that indicates the
-/// magnitude in seconds, and a u32 that indicates the nanosecond portion
-/// of the magnitude. The nanosecond portion is expected to be between 0
-/// and 999,999,999.
-unsafe impl<UT> FfiConverter<UT> for Duration {
-    ffi_converter_rust_buffer_lift_and_lower!(UT);
-
-    fn write(obj: Duration, buf: &mut Vec<u8>) {
-        buf.put_u64(obj.as_secs());
-        buf.put_u32(obj.subsec_nanos());
-    }
-
-    fn try_read(buf: &mut &[u8]) -> Result<Duration> {
-        check_remaining(buf, 12)?;
-        Ok(Duration::new(buf.get_u64(), buf.get_u32()))
-    }
-
-    const TYPE_ID_META: MetadataBuffer = MetadataBuffer::from_code(metadata::codes::TYPE_DURATION);
-}
-
-// Support for passing optional values via the FFI.
-//
-// Optional values are currently always passed by serializing to a buffer.
-// We write either a zero byte for `None`, or a one byte followed by the containing
-// item for `Some`.
-//
-// In future we could do the same optimization as rust uses internally, where the
-// `None` option is represented as a null pointer and the `Some` as a valid pointer,
-// but that seems more fiddly and less safe in the short term, so it can wait.
-
-unsafe impl<UT, T: Lower<UT>> Lower<UT> for Option<T> {
-    type FfiType = RustBuffer;
-
-    fn write(obj: Option<T>, buf: &mut Vec<u8>) {
-        match obj {
-            None => buf.put_i8(0),
-            Some(v) => {
-                buf.put_i8(1);
-                T::write(v, buf);
-            }
-        }
-    }
-
-    fn lower(obj: Option<T>) -> RustBuffer {
-        Self::lower_into_rust_buffer(obj)
-    }
-
-    const TYPE_ID_META: MetadataBuffer =
-        MetadataBuffer::from_code(metadata::codes::TYPE_OPTION).concat(T::TYPE_ID_META);
-}
-
-unsafe impl<UT, T: Lift<UT>> Lift<UT> for Option<T> {
-    type FfiType = RustBuffer;
-
-    fn try_read(buf: &mut &[u8]) -> Result<Option<T>> {
-        check_remaining(buf, 1)?;
-        Ok(match buf.get_i8() {
-            0 => None,
-            1 => Some(T::try_read(buf)?),
-            _ => bail!("unexpected tag byte for Option"),
-        })
-    }
-
-    fn try_lift(buf: RustBuffer) -> Result<Option<T>> {
-        Self::try_lift_from_rust_buffer(buf)
-    }
-
-    const TYPE_ID_META: MetadataBuffer =
-        MetadataBuffer::from_code(metadata::codes::TYPE_OPTION).concat(T::TYPE_ID_META);
-}
-
-// Support for passing vectors of values via the FFI.
-//
-// Vectors are currently always passed by serializing to a buffer.
-// We write a `i32` item count followed by each item in turn.
-// (It's a signed type due to limits of the JVM).
-//
-// Ideally we would pass `Vec<u8>` directly as a `RustBuffer` rather
-// than serializing, and perhaps even pass other vector types using a
-// similar struct. But that's for future work.
-
-unsafe impl<UT, T: Lower<UT>> Lower<UT> for Vec<T> {
-    type FfiType = RustBuffer;
-
-    fn write(obj: Vec<T>, buf: &mut Vec<u8>) {
-        // TODO: would be nice not to panic here :-/
-        let len = i32::try_from(obj.len()).unwrap();
-        buf.put_i32(len); // We limit arrays to i32::MAX items
-        for item in obj {
-            <T as Lower<UT>>::write(item, buf);
-        }
-    }
-
-    fn lower(obj: Vec<T>) -> RustBuffer {
-        Self::lower_into_rust_buffer(obj)
-    }
-
-    const TYPE_ID_META: MetadataBuffer =
-        MetadataBuffer::from_code(metadata::codes::TYPE_VEC).concat(T::TYPE_ID_META);
-}
-
-/// Support for associative arrays via the FFI - `record<u32, u64>` in UDL.
-/// HashMaps are currently always passed by serializing to a buffer.
-/// We write a `i32` entries count followed by each entry (string
-/// key followed by the value) in turn.
-/// (It's a signed type due to limits of the JVM).
-unsafe impl<UT, T: Lift<UT>> Lift<UT> for Vec<T> {
-    type FfiType = RustBuffer;
-
-    fn try_read(buf: &mut &[u8]) -> Result<Vec<T>> {
-        check_remaining(buf, 4)?;
-        let len = usize::try_from(buf.get_i32())?;
-        let mut vec = Vec::with_capacity(len);
-        for _ in 0..len {
-            vec.push(<T as Lift<UT>>::try_read(buf)?)
-        }
-        Ok(vec)
-    }
-
-    fn try_lift(buf: RustBuffer) -> Result<Vec<T>> {
-        Self::try_lift_from_rust_buffer(buf)
-    }
-
-    const TYPE_ID_META: MetadataBuffer =
-        MetadataBuffer::from_code(metadata::codes::TYPE_VEC).concat(T::TYPE_ID_META);
-}
-
-unsafe impl<K, V, UT> Lower<UT> for HashMap<K, V>
-where
-    K: Lower<UT> + std::hash::Hash + Eq,
-    V: Lower<UT>,
-{
-    type FfiType = RustBuffer;
-
-    fn write(obj: HashMap<K, V>, buf: &mut Vec<u8>) {
-        // TODO: would be nice not to panic here :-/
-        let len = i32::try_from(obj.len()).unwrap();
-        buf.put_i32(len); // We limit HashMaps to i32::MAX entries
-        for (key, value) in obj {
-            <K as Lower<UT>>::write(key, buf);
-            <V as Lower<UT>>::write(value, buf);
-        }
-    }
-
-    fn lower(obj: HashMap<K, V>) -> RustBuffer {
-        Self::lower_into_rust_buffer(obj)
-    }
-
-    const TYPE_ID_META: MetadataBuffer = MetadataBuffer::from_code(metadata::codes::TYPE_HASH_MAP)
-        .concat(K::TYPE_ID_META)
-        .concat(V::TYPE_ID_META);
-}
-
-unsafe impl<K, V, UT> Lift<UT> for HashMap<K, V>
-where
-    K: Lift<UT> + std::hash::Hash + Eq,
-    V: Lift<UT>,
-{
-    type FfiType = RustBuffer;
-
-    fn try_read(buf: &mut &[u8]) -> Result<HashMap<K, V>> {
-        check_remaining(buf, 4)?;
-        let len = usize::try_from(buf.get_i32())?;
-        let mut map = HashMap::with_capacity(len);
-        for _ in 0..len {
-            let key = <K as Lift<UT>>::try_read(buf)?;
-            let value = <V as Lift<UT>>::try_read(buf)?;
-            map.insert(key, value);
-        }
-        Ok(map)
-    }
-
-    fn try_lift(buf: RustBuffer) -> Result<HashMap<K, V>> {
-        Self::try_lift_from_rust_buffer(buf)
-    }
-
-    const TYPE_ID_META: MetadataBuffer = MetadataBuffer::from_code(metadata::codes::TYPE_HASH_MAP)
-        .concat(K::TYPE_ID_META)
-        .concat(V::TYPE_ID_META);
-}
-
-derive_ffi_traits!(blanket u8);
-derive_ffi_traits!(blanket i8);
-derive_ffi_traits!(blanket u16);
-derive_ffi_traits!(blanket i16);
-derive_ffi_traits!(blanket u32);
-derive_ffi_traits!(blanket i32);
-derive_ffi_traits!(blanket u64);
-derive_ffi_traits!(blanket i64);
-derive_ffi_traits!(blanket f32);
-derive_ffi_traits!(blanket f64);
-derive_ffi_traits!(blanket bool);
-derive_ffi_traits!(blanket String);
-derive_ffi_traits!(blanket Duration);
-derive_ffi_traits!(blanket SystemTime);
-
-// For composite types, derive LowerReturn, LiftReturn, etc, from Lift/Lower.
-//
-// Note that this means we don't get specialized return handling.  For example, if we could return
-// an `Option<Result<>>` we would always return that type directly and never throw.
-derive_ffi_traits!(impl<T, UT> LowerReturn<UT> for Option<T> where Option<T>: Lower<UT>);
-derive_ffi_traits!(impl<T, UT> LiftReturn<UT> for Option<T> where Option<T>: Lift<UT>);
-derive_ffi_traits!(impl<T, UT> LiftRef<UT> for Option<T> where Option<T>: Lift<UT>);
-
-derive_ffi_traits!(impl<T, UT> LowerReturn<UT> for Vec<T> where Vec<T>: Lower<UT>);
-derive_ffi_traits!(impl<T, UT> LiftReturn<UT> for Vec<T> where Vec<T>: Lift<UT>);
-derive_ffi_traits!(impl<T, UT> LiftRef<UT> for Vec<T> where Vec<T>: Lift<UT>);
-
-derive_ffi_traits!(impl<K, V, UT> LowerReturn<UT> for HashMap<K, V> where HashMap<K, V>: Lower<UT>);
-derive_ffi_traits!(impl<K, V, UT> LiftReturn<UT> for HashMap<K, V> where HashMap<K, V>: Lift<UT>);
-derive_ffi_traits!(impl<K, V, UT> LiftRef<UT> for HashMap<K, V> where HashMap<K, V>: Lift<UT>);
-
-// For Arc we derive all the traits, but have to write it all out because we need an unsized T bound
-derive_ffi_traits!(impl<T, UT> Lower<UT> for Arc<T> where Arc<T>: FfiConverter<UT>, T: ?Sized);
-derive_ffi_traits!(impl<T, UT> Lift<UT> for Arc<T> where Arc<T>: FfiConverter<UT>, T: ?Sized);
-derive_ffi_traits!(impl<T, UT> LowerReturn<UT> for Arc<T> where Arc<T>: Lower<UT>, T: ?Sized);
-derive_ffi_traits!(impl<T, UT> LiftReturn<UT> for Arc<T> where Arc<T>: Lift<UT>, T: ?Sized);
-derive_ffi_traits!(impl<T, UT> LiftRef<UT> for Arc<T> where Arc<T>: Lift<UT>, T: ?Sized);
-
-// Implement LowerReturn/LiftReturn for the unit type (void returns)
-
-unsafe impl<UT> LowerReturn<UT> for () {
-    type ReturnType = ();
-
-    fn lower_return(_: ()) -> Result<Self::ReturnType, RustBuffer> {
-        Ok(())
-    }
-
-    const TYPE_ID_META: MetadataBuffer = MetadataBuffer::from_code(metadata::codes::TYPE_UNIT);
-}
-
-unsafe impl<UT> LiftReturn<UT> for () {
-    type ReturnType = ();
-
-    fn try_lift_successful_return(_: ()) -> Result<Self> {
-        Ok(())
-    }
-
-    const TYPE_ID_META: MetadataBuffer = MetadataBuffer::from_code(metadata::codes::TYPE_UNIT);
-}
-
-// Implement LowerReturn/LiftReturn for `Result<R, E>`.  This is where we handle exceptions/Err
-// results.
-
-unsafe impl<UT, R, E> LowerReturn<UT> for Result<R, E>
-where
-    R: LowerReturn<UT>,
-    E: Lower<UT> + Error + Send + Sync + 'static,
-{
-    type ReturnType = R::ReturnType;
-
-    fn lower_return(v: Self) -> Result<Self::ReturnType, RustBuffer> {
-        match v {
-            Ok(r) => R::lower_return(r),
-            Err(e) => Err(E::lower_into_rust_buffer(e)),
-        }
-    }
-
-    fn handle_failed_lift(arg_name: &str, err: anyhow::Error) -> Self {
-        match err.downcast::<E>() {
-            Ok(actual_error) => Err(actual_error),
-            Err(ohno) => panic!("Failed to convert arg '{arg_name}': {ohno}"),
-        }
-    }
-
-    const TYPE_ID_META: MetadataBuffer = MetadataBuffer::from_code(metadata::codes::TYPE_RESULT)
-        .concat(R::TYPE_ID_META)
-        .concat(E::TYPE_ID_META);
-}
-
-unsafe impl<UT, R, E> LiftReturn<UT> for Result<R, E>
-where
-    R: LiftReturn<UT>,
-    E: Lift<UT, FfiType = RustBuffer> + ConvertError<UT>,
-{
-    type ReturnType = R::ReturnType;
-
-    fn try_lift_successful_return(v: R::ReturnType) -> Result<Self> {
-        R::try_lift_successful_return(v).map(Ok)
-    }
-
-    fn lift_error(buf: RustBuffer) -> Self {
-        match E::try_lift_from_rust_buffer(buf) {
-            Ok(lifted_error) => Err(lifted_error),
-            Err(anyhow_error) => {
-                Self::handle_callback_unexpected_error(UnexpectedUniFFICallbackError {
-                    reason: format!("Error lifting from rust buffer: {anyhow_error}"),
-                })
-            }
-        }
-    }
-
-    fn handle_callback_unexpected_error(e: UnexpectedUniFFICallbackError) -> Self {
-        Err(E::try_convert_unexpected_callback_error(e).unwrap_or_else(|e| panic!("{e}")))
-    }
-
-    const TYPE_ID_META: MetadataBuffer = MetadataBuffer::from_code(metadata::codes::TYPE_RESULT)
-        .concat(R::TYPE_ID_META)
-        .concat(E::TYPE_ID_META);
-}
-
-unsafe impl<T, UT> LiftRef<UT> for [T]
-where
-    T: Lift<UT>,
-{
-    type LiftType = Vec<T>;
-}
-
-unsafe impl<UT> LiftRef<UT> for str {
-    type LiftType = String;
-}
diff --git a/crates/uniffi_core/src/ffi_converter_traits.rs b/crates/uniffi_core/src/ffi_converter_traits.rs
deleted file mode 100644
index 4e7b9e0..0000000
--- a/crates/uniffi_core/src/ffi_converter_traits.rs
+++ /dev/null
@@ -1,603 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-//! Traits that define how to transfer values via the FFI layer.
-//!
-//! These traits define how to pass values over the FFI in various ways: as arguments or as return
-//! values, from Rust to the foreign side and vice-versa.  These traits are mainly used by the
-//! proc-macro generated code.  The goal is to allow the proc-macros to go from a type name to the
-//! correct function for a given FFI operation.
-//!
-//! The traits form a sort-of tree structure from general to specific:
-//! ```ignore
-//!
-//!                   [FfiConverter]
-//!                        |
-//!           -----------------------------
-//!           |                           |
-//!       [Lower]                      [Lift]
-//!           |                           |
-//!           |                       --------------
-//!           |                       |            |
-//!       [LowerReturn]           [LiftRef]  [LiftReturn]
-//! ```
-//!
-//! The `derive_ffi_traits` macro can be used to derive the specific traits from the general ones.
-//! Here's the main ways we implement these traits:
-//!
-//! * For most types we implement [FfiConverter] and use [derive_ffi_traits] to implement the rest
-//! * If a type can only be lifted/lowered, then we implement [Lift] or [Lower] and use
-//!   [derive_ffi_traits] to implement the rest
-//! * If a type needs special-case handling, like `Result<>` and `()`, we implement the traits
-//!   directly.
-//!
-//! FfiConverter has a generic parameter, that's filled in with a type local to the UniFFI consumer crate.
-//! This allows us to work around the Rust orphan rules for remote types. See
-//! `https://mozilla.github.io/uniffi-rs/internals/lifting_and_lowering.html#code-generation-and-the-fficonverter-trait`
-//! for details.
-//!
-//! ## Safety
-//!
-//! All traits are unsafe (implementing it requires `unsafe impl`) because we can't guarantee
-//! that it's safe to pass your type out to foreign-language code and back again. Buggy
-//! implementations of this trait might violate some assumptions made by the generated code,
-//! or might not match with the corresponding code in the generated foreign-language bindings.
-//! These traits should not be used directly, only in generated code, and the generated code should
-//! have fixture tests to test that everything works correctly together.
-
-use std::{borrow::Borrow, sync::Arc};
-
-use anyhow::bail;
-use bytes::Buf;
-
-use crate::{
-    FfiDefault, Handle, MetadataBuffer, Result, RustBuffer, RustCallStatus, RustCallStatusCode,
-    UnexpectedUniFFICallbackError,
-};
-
-/// Generalized FFI conversions
-///
-/// This trait is not used directly by the code generation, but implement this and calling
-/// [derive_ffi_traits] is a simple way to implement all the traits that are.
-///
-/// ## Safety
-///
-/// All traits are unsafe (implementing it requires `unsafe impl`) because we can't guarantee
-/// that it's safe to pass your type out to foreign-language code and back again. Buggy
-/// implementations of this trait might violate some assumptions made by the generated code,
-/// or might not match with the corresponding code in the generated foreign-language bindings.
-/// These traits should not be used directly, only in generated code, and the generated code should
-/// have fixture tests to test that everything works correctly together.
-pub unsafe trait FfiConverter<UT>: Sized {
-    /// The low-level type used for passing values of this type over the FFI.
-    ///
-    /// This must be a C-compatible type (e.g. a numeric primitive, a `#[repr(C)]` struct) into
-    /// which values of the target rust type can be converted.
-    ///
-    /// For complex data types, we currently recommend using `RustBuffer` and serializing
-    /// the data for transfer. In theory it could be possible to build a matching
-    /// `#[repr(C)]` struct for a complex data type and pass that instead, but explicit
-    /// serialization is simpler and safer as a starting point.
-    ///
-    /// If a type implements multiple FFI traits, `FfiType` must be the same for all of them.
-    type FfiType: FfiDefault;
-
-    /// Lower a rust value of the target type, into an FFI value of type Self::FfiType.
-    ///
-    /// This trait method is used for sending data from rust to the foreign language code,
-    /// by (hopefully cheaply!) converting it into something that can be passed over the FFI
-    /// and reconstructed on the other side.
-    ///
-    /// Note that this method takes an owned value; this allows it to transfer ownership in turn to
-    /// the foreign language code, e.g. by boxing the value and passing a pointer.
-    fn lower(obj: Self) -> Self::FfiType;
-
-    /// Lift a rust value of the target type, from an FFI value of type Self::FfiType.
-    ///
-    /// This trait method is used for receiving data from the foreign language code in rust,
-    /// by (hopefully cheaply!) converting it from a low-level FFI value of type Self::FfiType
-    /// into a high-level rust value of the target type.
-    ///
-    /// Since we cannot statically guarantee that the foreign-language code will send valid
-    /// values of type Self::FfiType, this method is fallible.
-    fn try_lift(v: Self::FfiType) -> Result<Self>;
-
-    /// Write a rust value into a buffer, to send over the FFI in serialized form.
-    ///
-    /// This trait method can be used for sending data from rust to the foreign language code,
-    /// in cases where we're not able to use a special-purpose FFI type and must fall back to
-    /// sending serialized bytes.
-    ///
-    /// Note that this method takes an owned value because it's transferring ownership
-    /// to the foreign language code via the RustBuffer.
-    fn write(obj: Self, buf: &mut Vec<u8>);
-
-    /// Read a rust value from a buffer, received over the FFI in serialized form.
-    ///
-    /// This trait method can be used for receiving data from the foreign language code in rust,
-    /// in cases where we're not able to use a special-purpose FFI type and must fall back to
-    /// receiving serialized bytes.
-    ///
-    /// Since we cannot statically guarantee that the foreign-language code will send valid
-    /// serialized bytes for the target type, this method is fallible.
-    ///
-    /// Note the slightly unusual type here - we want a mutable reference to a slice of bytes,
-    /// because we want to be able to advance the start of the slice after reading an item
-    /// from it (but will not mutate the actual contents of the slice).
-    fn try_read(buf: &mut &[u8]) -> Result<Self>;
-
-    /// Type ID metadata, serialized into a [MetadataBuffer].
-    ///
-    /// If a type implements multiple FFI traits, `TYPE_ID_META` must be the same for all of them.
-    const TYPE_ID_META: MetadataBuffer;
-}
-
-/// FfiConverter for Arc-types
-///
-/// This trait gets around the orphan rule limitations, which prevent library crates from
-/// implementing `FfiConverter` on an Arc. When this is implemented for T, we generate an
-/// `FfiConverter` impl for Arc<T>.
-///
-/// Note: There's no need for `FfiConverterBox`, since Box is a fundamental type.
-///
-/// ## Safety
-///
-/// All traits are unsafe (implementing it requires `unsafe impl`) because we can't guarantee
-/// that it's safe to pass your type out to foreign-language code and back again. Buggy
-/// implementations of this trait might violate some assumptions made by the generated code,
-/// or might not match with the corresponding code in the generated foreign-language bindings.
-/// These traits should not be used directly, only in generated code, and the generated code should
-/// have fixture tests to test that everything works correctly together.
-pub unsafe trait FfiConverterArc<UT>: Send + Sync {
-    type FfiType: FfiDefault;
-
-    fn lower(obj: Arc<Self>) -> Self::FfiType;
-    fn try_lift(v: Self::FfiType) -> Result<Arc<Self>>;
-    fn write(obj: Arc<Self>, buf: &mut Vec<u8>);
-    fn try_read(buf: &mut &[u8]) -> Result<Arc<Self>>;
-
-    const TYPE_ID_META: MetadataBuffer;
-}
-
-unsafe impl<T, UT> FfiConverter<UT> for Arc<T>
-where
-    T: FfiConverterArc<UT> + ?Sized,
-{
-    type FfiType = T::FfiType;
-
-    fn lower(obj: Self) -> Self::FfiType {
-        T::lower(obj)
-    }
-
-    fn try_lift(v: Self::FfiType) -> Result<Self> {
-        T::try_lift(v)
-    }
-
-    fn write(obj: Self, buf: &mut Vec<u8>) {
-        T::write(obj, buf)
-    }
-
-    fn try_read(buf: &mut &[u8]) -> Result<Self> {
-        T::try_read(buf)
-    }
-
-    const TYPE_ID_META: MetadataBuffer = T::TYPE_ID_META;
-}
-
-/// Lift values passed by the foreign code over the FFI into Rust values
-///
-/// This is used by the code generation to handle arguments.  It's usually derived from
-/// [FfiConverter], except for types that only support lifting but not lowering.
-///
-/// See [FfiConverter] for a discussion of the methods
-///
-/// ## Safety
-///
-/// All traits are unsafe (implementing it requires `unsafe impl`) because we can't guarantee
-/// that it's safe to pass your type out to foreign-language code and back again. Buggy
-/// implementations of this trait might violate some assumptions made by the generated code,
-/// or might not match with the corresponding code in the generated foreign-language bindings.
-/// These traits should not be used directly, only in generated code, and the generated code should
-/// have fixture tests to test that everything works correctly together.
-pub unsafe trait Lift<UT>: Sized {
-    type FfiType;
-
-    fn try_lift(v: Self::FfiType) -> Result<Self>;
-
-    fn try_read(buf: &mut &[u8]) -> Result<Self>;
-
-    /// Convenience method
-    fn try_lift_from_rust_buffer(v: RustBuffer) -> Result<Self> {
-        let vec = v.destroy_into_vec();
-        let mut buf = vec.as_slice();
-        let value = Self::try_read(&mut buf)?;
-        match Buf::remaining(&buf) {
-            0 => Ok(value),
-            n => bail!("junk data left in buffer after lifting (count: {n})",),
-        }
-    }
-
-    const TYPE_ID_META: MetadataBuffer;
-}
-
-/// Lower Rust values to pass them to the foreign code
-///
-/// This is used to pass arguments to callback interfaces. It's usually derived from
-/// [FfiConverter], except for types that only support lowering but not lifting.
-///
-/// See [FfiConverter] for a discussion of the methods
-///
-/// ## Safety
-///
-/// All traits are unsafe (implementing it requires `unsafe impl`) because we can't guarantee
-/// that it's safe to pass your type out to foreign-language code and back again. Buggy
-/// implementations of this trait might violate some assumptions made by the generated code,
-/// or might not match with the corresponding code in the generated foreign-language bindings.
-/// These traits should not be used directly, only in generated code, and the generated code should
-/// have fixture tests to test that everything works correctly together.
-pub unsafe trait Lower<UT>: Sized {
-    type FfiType: FfiDefault;
-
-    fn lower(obj: Self) -> Self::FfiType;
-
-    fn write(obj: Self, buf: &mut Vec<u8>);
-
-    /// Convenience method
-    fn lower_into_rust_buffer(obj: Self) -> RustBuffer {
-        let mut buf = ::std::vec::Vec::new();
-        Self::write(obj, &mut buf);
-        RustBuffer::from_vec(buf)
-    }
-
-    const TYPE_ID_META: MetadataBuffer;
-}
-
-/// Return Rust values to the foreign code
-///
-/// This is usually derived from [Lift], but we special case types like `Result<>` and `()`.
-///
-/// ## Safety
-///
-/// All traits are unsafe (implementing it requires `unsafe impl`) because we can't guarantee
-/// that it's safe to pass your type out to foreign-language code and back again. Buggy
-/// implementations of this trait might violate some assumptions made by the generated code,
-/// or might not match with the corresponding code in the generated foreign-language bindings.
-/// These traits should not be used directly, only in generated code, and the generated code should
-/// have fixture tests to test that everything works correctly together.
-pub unsafe trait LowerReturn<UT>: Sized {
-    /// The type that should be returned by scaffolding functions for this type.
-    ///
-    /// When derived, it's the same as `FfiType`.
-    type ReturnType: FfiDefault;
-
-    /// Lower this value for scaffolding function return
-    ///
-    /// This method converts values into the `Result<>` type that [rust_call] expects. For
-    /// successful calls, return `Ok(lower_return)`.  For errors that should be translated into
-    /// thrown exceptions on the foreign code, serialize the error into a RustBuffer and return
-    /// `Err(buf)`
-    fn lower_return(obj: Self) -> Result<Self::ReturnType, RustBuffer>;
-
-    /// If possible, get a serialized error for failed argument lifts
-    ///
-    /// By default, we just panic and let `rust_call` handle things.  However, for `Result<_, E>`
-    /// returns, if the anyhow error can be downcast to `E`, then serialize that and return it.
-    /// This results in the foreign code throwing a "normal" exception, rather than an unexpected
-    /// exception.
-    fn handle_failed_lift(arg_name: &str, e: anyhow::Error) -> Self {
-        panic!("Failed to convert arg '{arg_name}': {e}")
-    }
-
-    const TYPE_ID_META: MetadataBuffer;
-}
-
-/// Return foreign values to Rust
-///
-/// This is usually derived from [Lower], but we special case types like `Result<>` and `()`.
-///
-/// ## Safety
-///
-/// All traits are unsafe (implementing it requires `unsafe impl`) because we can't guarantee
-/// that it's safe to pass your type out to foreign-language code and back again. Buggy
-/// implementations of this trait might violate some assumptions made by the generated code,
-/// or might not match with the corresponding code in the generated foreign-language bindings.
-/// These traits should not be used directly, only in generated code, and the generated code should
-/// have fixture tests to test that everything works correctly together.
-pub unsafe trait LiftReturn<UT>: Sized {
-    /// FFI return type for trait interfaces
-    type ReturnType;
-
-    /// Lift a successfully returned value from a trait interface
-    fn try_lift_successful_return(v: Self::ReturnType) -> Result<Self>;
-
-    /// Lift a foreign returned value from a trait interface
-    ///
-    /// When we call a foreign-implemented trait interface method, we pass a &mut RustCallStatus
-    /// and get [Self::ReturnType] returned.  This method takes both of those and lifts `Self` from
-    /// it.
-    fn lift_foreign_return(ffi_return: Self::ReturnType, call_status: RustCallStatus) -> Self {
-        match call_status.code {
-            RustCallStatusCode::Success => Self::try_lift_successful_return(ffi_return)
-                .unwrap_or_else(|e| {
-                    Self::handle_callback_unexpected_error(UnexpectedUniFFICallbackError::new(e))
-                }),
-            RustCallStatusCode::Error => {
-                Self::lift_error(unsafe { call_status.error_buf.assume_init() })
-            }
-            _ => {
-                let e = <String as FfiConverter<crate::UniFfiTag>>::try_lift(unsafe {
-                    call_status.error_buf.assume_init()
-                })
-                .unwrap_or_else(|e| format!("(Error lifting message: {e}"));
-                Self::handle_callback_unexpected_error(UnexpectedUniFFICallbackError::new(e))
-            }
-        }
-    }
-
-    /// Lift a Rust value for a callback interface method error result
-    ///
-    /// This is called for "expected errors" -- the callback method returns a Result<> type and the
-    /// foreign code throws an exception that corresponds to the error type.
-    fn lift_error(_buf: RustBuffer) -> Self {
-        panic!("Callback interface method returned unexpected error")
-    }
-
-    /// Lift a Rust value for an unexpected callback interface error
-    ///
-    /// The main reason this is called is when the callback interface throws an error type that
-    /// doesn't match the Rust trait definition.  It's also called for corner cases, like when the
-    /// foreign code doesn't follow the FFI contract.
-    ///
-    /// The default implementation panics unconditionally.  Errors used in callback interfaces
-    /// handle this using the `From<UnexpectedUniFFICallbackError>` impl that the library author
-    /// must provide.
-    fn handle_callback_unexpected_error(e: UnexpectedUniFFICallbackError) -> Self {
-        panic!("Callback interface failure: {e}")
-    }
-
-    const TYPE_ID_META: MetadataBuffer;
-}
-
-/// Lift references
-///
-/// This is usually derived from [Lift] and also implemented for the inner `T` value of smart
-/// pointers.  For example, if `Lift` is implemented for `Arc<T>`, then we implement this to lift
-///
-/// ## Safety
-///
-/// All traits are unsafe (implementing it requires `unsafe impl`) because we can't guarantee
-/// that it's safe to pass your type out to foreign-language code and back again. Buggy
-/// implementations of this trait might violate some assumptions made by the generated code,
-/// or might not match with the corresponding code in the generated foreign-language bindings.
-/// These traits should not be used directly, only in generated code, and the generated code should
-/// have fixture tests to test that everything works correctly together.
-/// `&T` using the Arc.
-pub unsafe trait LiftRef<UT> {
-    type LiftType: Lift<UT> + Borrow<Self>;
-}
-
-pub trait ConvertError<UT>: Sized {
-    fn try_convert_unexpected_callback_error(e: UnexpectedUniFFICallbackError) -> Result<Self>;
-}
-
-/// Manage handles for `Arc<Self>` instances
-///
-/// Handles are used to manage objects that are passed across the FFI.  They general usage is:
-///
-/// * Rust creates an `Arc<>`
-/// * Rust uses `new_handle` to create a handle that represents the Arc reference
-/// * Rust passes the handle to the foreign code as a `u64`
-/// * The foreign code passes the handle back to `Rust` to refer to the object:
-///   * Handle are usually passed as borrowed values.  When an FFI function inputs a handle as an
-///     argument, the foreign code simply passes a copy of the `u64` to Rust, which calls `get_arc`
-///     to get a new `Arc<>` clone for it.
-///   * Handles are returned as owned values.  When an FFI function returns a handle, the foreign
-///     code either stops using the handle after returning it or calls `clone_handle` and returns
-///     the clone.
-/// * Eventually the foreign code may destroy their handle by passing it into a "free" FFI
-///   function. This functions input an owned handle and consume it.
-///
-/// The foreign code also defines their own handles.  These represent foreign objects that are
-/// passed to Rust.  Using foreign handles is essentially the same as above, but in reverse.
-///
-/// Handles must always be `Send` and the objects they reference must always be `Sync`.
-/// This means that it must be safe to send handles to other threads and use them there.
-///
-/// Note: this only needs to be derived for unsized types, there's a blanket impl for `T: Sized`.
-///
-/// ## Safety
-///
-/// All traits are unsafe (implementing it requires `unsafe impl`) because we can't guarantee
-/// that it's safe to pass your type out to foreign-language code and back again. Buggy
-/// implementations of this trait might violate some assumptions made by the generated code,
-/// or might not match with the corresponding code in the generated foreign-language bindings.
-/// These traits should not be used directly, only in generated code, and the generated code should
-/// have fixture tests to test that everything works correctly together.
-/// `&T` using the Arc.
-pub unsafe trait HandleAlloc<UT>: Send + Sync {
-    /// Create a new handle for an Arc value
-    ///
-    /// Use this to lower an Arc into a handle value before passing it across the FFI.
-    /// The newly-created handle will have reference count = 1.
-    fn new_handle(value: Arc<Self>) -> Handle;
-
-    /// Clone a handle
-    ///
-    /// This creates a new handle from an existing one.
-    /// It's used when the foreign code wants to pass back an owned handle and still keep a copy
-    /// for themselves.
-    fn clone_handle(handle: Handle) -> Handle;
-
-    /// Get a clone of the `Arc<>` using a "borrowed" handle.
-    ///
-    /// Take care that the handle can not be destroyed between when it's passed and when
-    /// `get_arc()` is called.  #1797 is a cautionary tale.
-    fn get_arc(handle: Handle) -> Arc<Self> {
-        Self::consume_handle(Self::clone_handle(handle))
-    }
-
-    /// Consume a handle, getting back the initial `Arc<>`
-    fn consume_handle(handle: Handle) -> Arc<Self>;
-}
-
-/// Derive FFI traits
-///
-/// This can be used to derive:
-///   * [Lower] and [Lift] from [FfiConverter]
-///   * [LowerReturn] from [Lower]
-///   * [LiftReturn] and [LiftRef] from [Lift]
-///
-/// Usage:
-/// ```ignore
-///
-/// // Derive everything from [FfiConverter] for all Uniffi tags
-/// ::uniffi::derive_ffi_traits!(blanket Foo)
-/// // Derive everything from [FfiConverter] for the local crate::UniFfiTag
-/// ::uniffi::derive_ffi_traits!(local Foo)
-/// // To derive a specific trait, write out the impl item minus the actual  block
-/// ::uniffi::derive_ffi_traits!(impl<T, UT> LowerReturn<UT> for Option<T>)
-/// ```
-#[macro_export]
-#[allow(clippy::crate_in_macro_def)]
-macro_rules! derive_ffi_traits {
-    (blanket $ty:ty) => {
-        $crate::derive_ffi_traits!(impl<UT> Lower<UT> for $ty);
-        $crate::derive_ffi_traits!(impl<UT> Lift<UT> for $ty);
-        $crate::derive_ffi_traits!(impl<UT> LowerReturn<UT> for $ty);
-        $crate::derive_ffi_traits!(impl<UT> LiftReturn<UT> for $ty);
-        $crate::derive_ffi_traits!(impl<UT> LiftRef<UT> for $ty);
-        $crate::derive_ffi_traits!(impl<UT> ConvertError<UT> for $ty);
-    };
-
-    (local $ty:ty) => {
-        $crate::derive_ffi_traits!(impl Lower<crate::UniFfiTag> for $ty);
-        $crate::derive_ffi_traits!(impl Lift<crate::UniFfiTag> for $ty);
-        $crate::derive_ffi_traits!(impl LowerReturn<crate::UniFfiTag> for $ty);
-        $crate::derive_ffi_traits!(impl LiftReturn<crate::UniFfiTag> for $ty);
-        $crate::derive_ffi_traits!(impl LiftRef<crate::UniFfiTag> for $ty);
-        $crate::derive_ffi_traits!(impl ConvertError<crate::UniFfiTag> for $ty);
-    };
-
-    (impl $(<$($generic:ident),*>)? $(::uniffi::)? Lower<$ut:path> for $ty:ty $(where $($where:tt)*)?) => {
-        unsafe impl $(<$($generic),*>)* $crate::Lower<$ut> for $ty $(where $($where)*)*
-        {
-            type FfiType = <Self as $crate::FfiConverter<$ut>>::FfiType;
-
-            fn lower(obj: Self) -> Self::FfiType {
-                <Self as $crate::FfiConverter<$ut>>::lower(obj)
-            }
-
-            fn write(obj: Self, buf: &mut ::std::vec::Vec<u8>) {
-                <Self as $crate::FfiConverter<$ut>>::write(obj, buf)
-            }
-
-            const TYPE_ID_META: $crate::MetadataBuffer = <Self as $crate::FfiConverter<$ut>>::TYPE_ID_META;
-        }
-    };
-
-    (impl $(<$($generic:ident),*>)? $(::uniffi::)? Lift<$ut:path> for $ty:ty $(where $($where:tt)*)?) => {
-        unsafe impl $(<$($generic),*>)* $crate::Lift<$ut> for $ty $(where $($where)*)*
-        {
-            type FfiType = <Self as $crate::FfiConverter<$ut>>::FfiType;
-
-            fn try_lift(v: Self::FfiType) -> $crate::deps::anyhow::Result<Self> {
-                <Self as $crate::FfiConverter<$ut>>::try_lift(v)
-            }
-
-            fn try_read(buf: &mut &[u8]) -> $crate::deps::anyhow::Result<Self> {
-                <Self as $crate::FfiConverter<$ut>>::try_read(buf)
-            }
-
-            const TYPE_ID_META: $crate::MetadataBuffer = <Self as $crate::FfiConverter<$ut>>::TYPE_ID_META;
-        }
-    };
-
-    (impl $(<$($generic:ident),*>)? $(::uniffi::)? LowerReturn<$ut:path> for $ty:ty $(where $($where:tt)*)?) => {
-        unsafe impl $(<$($generic),*>)* $crate::LowerReturn<$ut> for $ty $(where $($where)*)*
-        {
-            type ReturnType = <Self as $crate::Lower<$ut>>::FfiType;
-
-            fn lower_return(obj: Self) -> $crate::deps::anyhow::Result<Self::ReturnType, $crate::RustBuffer> {
-                Ok(<Self as $crate::Lower<$ut>>::lower(obj))
-            }
-
-            const TYPE_ID_META: $crate::MetadataBuffer =<Self as $crate::Lower<$ut>>::TYPE_ID_META;
-        }
-    };
-
-    (impl $(<$($generic:ident),*>)? $(::uniffi::)? LiftReturn<$ut:path> for $ty:ty $(where $($where:tt)*)?) => {
-        unsafe impl $(<$($generic),*>)* $crate::LiftReturn<$ut> for $ty $(where $($where)*)*
-        {
-            type ReturnType = <Self as $crate::Lift<$ut>>::FfiType;
-
-            fn try_lift_successful_return(v: Self::ReturnType) -> $crate::Result<Self> {
-                <Self as $crate::Lift<$ut>>::try_lift(v)
-            }
-
-            const TYPE_ID_META: $crate::MetadataBuffer = <Self as $crate::Lift<$ut>>::TYPE_ID_META;
-        }
-    };
-
-    (impl $(<$($generic:ident),*>)? $(::uniffi::)? LiftRef<$ut:path> for $ty:ty $(where $($where:tt)*)?) => {
-        unsafe impl $(<$($generic),*>)* $crate::LiftRef<$ut> for $ty $(where $($where)*)*
-        {
-            type LiftType = Self;
-        }
-    };
-
-    (impl $(<$($generic:ident),*>)? $(::uniffi::)? ConvertError<$ut:path> for $ty:ty $(where $($where:tt)*)?) => {
-        impl $(<$($generic),*>)* $crate::ConvertError<$ut> for $ty $(where $($where)*)*
-        {
-            fn try_convert_unexpected_callback_error(e: $crate::UnexpectedUniFFICallbackError) -> $crate::deps::anyhow::Result<Self> {
-                $crate::convert_unexpected_error!(e, $ty)
-            }
-        }
-    };
-
-    (impl $(<$($generic:ident),*>)? $(::uniffi::)? HandleAlloc<$ut:path> for $ty:ty $(where $($where:tt)*)?) => {
-        // Derived HandleAlloc implementation.
-        //
-        // This is only needed for !Sized types like `dyn Trait`, below is a blanket implementation
-        // for any sized type.
-        unsafe impl $(<$($generic),*>)* $crate::HandleAlloc<$ut> for $ty $(where $($where)*)*
-        {
-            // To implement HandleAlloc for an unsized type, wrap it with a second Arc which
-            // converts the wide pointer into a normal pointer.
-
-            fn new_handle(value: ::std::sync::Arc<Self>) -> $crate::Handle {
-                $crate::Handle::from_pointer(::std::sync::Arc::into_raw(::std::sync::Arc::new(value)))
-            }
-
-            fn clone_handle(handle: $crate::Handle) -> $crate::Handle {
-                unsafe {
-                    ::std::sync::Arc::<::std::sync::Arc<Self>>::increment_strong_count(handle.as_pointer::<::std::sync::Arc<Self>>());
-                }
-                handle
-            }
-
-            fn consume_handle(handle: $crate::Handle) -> ::std::sync::Arc<Self> {
-                unsafe {
-                    ::std::sync::Arc::<Self>::clone(
-                        &std::sync::Arc::<::std::sync::Arc::<Self>>::from_raw(handle.as_pointer::<::std::sync::Arc<Self>>())
-                    )
-                }
-            }
-        }
-    };
-}
-
-unsafe impl<T: Send + Sync, UT> HandleAlloc<UT> for T {
-    fn new_handle(value: Arc<Self>) -> Handle {
-        Handle::from_pointer(Arc::into_raw(value))
-    }
-
-    fn clone_handle(handle: Handle) -> Handle {
-        unsafe { Arc::increment_strong_count(handle.as_pointer::<T>()) };
-        handle
-    }
-
-    fn consume_handle(handle: Handle) -> Arc<Self> {
-        unsafe { Arc::from_raw(handle.as_pointer()) }
-    }
-}
diff --git a/crates/uniffi_core/src/lib.rs b/crates/uniffi_core/src/lib.rs
deleted file mode 100644
index 1f3a240..0000000
--- a/crates/uniffi_core/src/lib.rs
+++ /dev/null
@@ -1,324 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-//! # Runtime support code for uniffi
-//!
-//! This crate provides the small amount of runtime code that is required by the generated uniffi
-//! component scaffolding in order to transfer data back and forth across the C-style FFI layer,
-//! as well as some utilities for testing the generated bindings.
-//!
-//! The key concept here is the [`FfiConverter`] trait, which is responsible for converting between
-//! a Rust type and a low-level C-style type that can be passed across the FFI:
-//!
-//!  * How to [represent](FfiConverter::FfiType) values of the Rust type in the low-level C-style type
-//!    system of the FFI layer.
-//!  * How to ["lower"](FfiConverter::lower) values of the Rust type into an appropriate low-level
-//!    FFI value.
-//!  * How to ["lift"](FfiConverter::try_lift) low-level FFI values back into values of the Rust
-//!    type.
-//!  * How to [write](FfiConverter::write) values of the Rust type into a buffer, for cases
-//!    where they are part of a compound data structure that is serialized for transfer.
-//!  * How to [read](FfiConverter::try_read) values of the Rust type from buffer, for cases
-//!    where they are received as part of a compound data structure that was serialized for transfer.
-//!  * How to [return](FfiConverter::lower_return) values of the Rust type from scaffolding
-//!    functions.
-//!
-//! This logic encapsulates the Rust-side handling of data transfer. Each foreign-language binding
-//! must also implement a matching set of data-handling rules for each data type.
-//!
-//! In addition to the core `FfiConverter` trait, we provide a handful of struct definitions useful
-//! for passing core rust types over the FFI, such as [`RustBuffer`].
-
-#![warn(rust_2018_idioms, unused_qualifications)]
-
-use anyhow::bail;
-use bytes::buf::Buf;
-
-// Make Result<> public to support external impls of FfiConverter
-pub use anyhow::Result;
-
-pub mod ffi;
-mod ffi_converter_impls;
-mod ffi_converter_traits;
-pub mod metadata;
-
-pub use ffi::*;
-pub use ffi_converter_traits::{
-    ConvertError, FfiConverter, FfiConverterArc, HandleAlloc, Lift, LiftRef, LiftReturn, Lower,
-    LowerReturn,
-};
-pub use metadata::*;
-
-// Re-export the libs that we use in the generated code,
-// so the consumer doesn't have to depend on them directly.
-pub mod deps {
-    pub use anyhow;
-    #[cfg(feature = "tokio")]
-    pub use async_compat;
-    pub use bytes;
-    pub use log;
-    pub use oneshot;
-    pub use static_assertions;
-}
-
-mod panichook;
-
-const PACKAGE_VERSION: &str = env!("CARGO_PKG_VERSION");
-
-// For the significance of this magic number 10 here, and the reason that
-// it can't be a named constant, see the `check_compatible_version` function.
-static_assertions::const_assert!(PACKAGE_VERSION.as_bytes().len() < 10);
-
-/// Check whether the uniffi runtime version is compatible a given uniffi_bindgen version.
-///
-/// The result of this check may be used to ensure that generated Rust scaffolding is
-/// using a compatible version of the uniffi runtime crate. It's a `const fn` so that it
-/// can be used to perform such a check at compile time.
-#[allow(clippy::len_zero)]
-pub const fn check_compatible_version(bindgen_version: &'static str) -> bool {
-    // While UniFFI is still under heavy development, we require that
-    // the runtime support crate be precisely the same version as the
-    // build-time bindgen crate.
-    //
-    // What we want to achieve here is checking two strings for equality.
-    // Unfortunately Rust doesn't yet support calling the `&str` equals method
-    // in a const context. We can hack around that by doing a byte-by-byte
-    // comparison of the underlying bytes.
-    let package_version = PACKAGE_VERSION.as_bytes();
-    let bindgen_version = bindgen_version.as_bytes();
-    // What we want to achieve here is a loop over the underlying bytes,
-    // something like:
-    // ```
-    //  if package_version.len() != bindgen_version.len() {
-    //      return false
-    //  }
-    //  for i in 0..package_version.len() {
-    //      if package_version[i] != bindgen_version[i] {
-    //          return false
-    //      }
-    //  }
-    //  return true
-    // ```
-    // Unfortunately stable Rust doesn't allow `if` or `for` in const contexts,
-    // so code like the above would only work in nightly. We can hack around it by
-    // statically asserting that the string is shorter than a certain length
-    // (currently 10 bytes) and then manually unrolling that many iterations of the loop.
-    //
-    // Yes, I am aware that this is horrific, but the externally-visible
-    // behaviour is quite nice for consumers!
-    package_version.len() == bindgen_version.len()
-        && (package_version.len() == 0 || package_version[0] == bindgen_version[0])
-        && (package_version.len() <= 1 || package_version[1] == bindgen_version[1])
-        && (package_version.len() <= 2 || package_version[2] == bindgen_version[2])
-        && (package_version.len() <= 3 || package_version[3] == bindgen_version[3])
-        && (package_version.len() <= 4 || package_version[4] == bindgen_version[4])
-        && (package_version.len() <= 5 || package_version[5] == bindgen_version[5])
-        && (package_version.len() <= 6 || package_version[6] == bindgen_version[6])
-        && (package_version.len() <= 7 || package_version[7] == bindgen_version[7])
-        && (package_version.len() <= 8 || package_version[8] == bindgen_version[8])
-        && (package_version.len() <= 9 || package_version[9] == bindgen_version[9])
-        && package_version.len() < 10
-}
-
-/// Assert that the uniffi runtime version matches an expected value.
-///
-/// This is a helper hook for the generated Rust scaffolding, to produce a compile-time
-/// error if the version of `uniffi_bindgen` used to generate the scaffolding was
-/// incompatible with the version of `uniffi` being used at runtime.
-#[macro_export]
-macro_rules! assert_compatible_version {
-    ($v:expr $(,)?) => {
-        uniffi::deps::static_assertions::const_assert!(uniffi::check_compatible_version($v));
-    };
-}
-
-/// Struct to use when we want to lift/lower/serialize types inside the `uniffi` crate.
-struct UniFfiTag;
-
-/// A helper function to ensure we don't read past the end of a buffer.
-///
-/// Rust won't actually let us read past the end of a buffer, but the `Buf` trait does not support
-/// returning an explicit error in this case, and will instead panic. This is a look-before-you-leap
-/// helper function to instead return an explicit error, to help with debugging.
-pub fn check_remaining(buf: &[u8], num_bytes: usize) -> Result<()> {
-    if buf.remaining() < num_bytes {
-        bail!(
-            "not enough bytes remaining in buffer ({} < {num_bytes})",
-            buf.remaining(),
-        );
-    }
-    Ok(())
-}
-
-/// Macro to implement lowering/lifting using a `RustBuffer`
-///
-/// For complex types where it's too fiddly or too unsafe to convert them into a special-purpose
-/// C-compatible value, you can use this trait to implement `lower()` in terms of `write()` and
-/// `lift` in terms of `read()`.
-///
-/// This macro implements the boilerplate needed to define `lower`, `lift` and `FFIType`.
-#[macro_export]
-macro_rules! ffi_converter_rust_buffer_lift_and_lower {
-    ($uniffi_tag:ty) => {
-        type FfiType = $crate::RustBuffer;
-
-        fn lower(v: Self) -> $crate::RustBuffer {
-            let mut buf = ::std::vec::Vec::new();
-            <Self as $crate::FfiConverter<$uniffi_tag>>::write(v, &mut buf);
-            $crate::RustBuffer::from_vec(buf)
-        }
-
-        fn try_lift(buf: $crate::RustBuffer) -> $crate::Result<Self> {
-            let vec = buf.destroy_into_vec();
-            let mut buf = vec.as_slice();
-            let value = <Self as $crate::FfiConverter<$uniffi_tag>>::try_read(&mut buf)?;
-            match $crate::deps::bytes::Buf::remaining(&buf) {
-                0 => Ok(value),
-                n => $crate::deps::anyhow::bail!(
-                    "junk data left in buffer after lifting (count: {n})",
-                ),
-            }
-        }
-    };
-}
-
-/// Macro to implement `FfiConverter<T>` for a UniFfiTag using a different UniFfiTag
-///
-/// This is used for external types
-#[macro_export]
-macro_rules! ffi_converter_forward {
-    // Forward a `FfiConverter` implementation
-    ($T:ty, $existing_impl_tag:ty, $new_impl_tag:ty) => {
-        ::uniffi::do_ffi_converter_forward!(
-            FfiConverter,
-            $T,
-            $T,
-            $existing_impl_tag,
-            $new_impl_tag
-        );
-
-        $crate::derive_ffi_traits!(local $T);
-    };
-}
-
-/// Macro to implement `FfiConverterArc<T>` for a UniFfiTag using a different UniFfiTag
-///
-/// This is used for external types
-#[macro_export]
-macro_rules! ffi_converter_arc_forward {
-    ($T:ty, $existing_impl_tag:ty, $new_impl_tag:ty) => {
-        ::uniffi::do_ffi_converter_forward!(
-            FfiConverterArc,
-            ::std::sync::Arc<$T>,
-            $T,
-            $existing_impl_tag,
-            $new_impl_tag
-        );
-
-        // Note: no need to call derive_ffi_traits! because there is a blanket impl for all Arc<T>
-    };
-}
-
-// Generic code between the two macros above
-#[doc(hidden)]
-#[macro_export]
-macro_rules! do_ffi_converter_forward {
-    ($trait:ident, $rust_type:ty, $T:ty, $existing_impl_tag:ty, $new_impl_tag:ty) => {
-        unsafe impl $crate::$trait<$new_impl_tag> for $T {
-            type FfiType = <$T as $crate::$trait<$existing_impl_tag>>::FfiType;
-
-            fn lower(obj: $rust_type) -> Self::FfiType {
-                <$T as $crate::$trait<$existing_impl_tag>>::lower(obj)
-            }
-
-            fn try_lift(v: Self::FfiType) -> $crate::Result<$rust_type> {
-                <$T as $crate::$trait<$existing_impl_tag>>::try_lift(v)
-            }
-
-            fn write(obj: $rust_type, buf: &mut Vec<u8>) {
-                <$T as $crate::$trait<$existing_impl_tag>>::write(obj, buf)
-            }
-
-            fn try_read(buf: &mut &[u8]) -> $crate::Result<$rust_type> {
-                <$T as $crate::$trait<$existing_impl_tag>>::try_read(buf)
-            }
-
-            const TYPE_ID_META: ::uniffi::MetadataBuffer =
-                <$T as $crate::$trait<$existing_impl_tag>>::TYPE_ID_META;
-        }
-    };
-}
-
-#[cfg(test)]
-mod test {
-    use super::{FfiConverter, UniFfiTag};
-    use std::time::{Duration, SystemTime};
-
-    #[test]
-    fn timestamp_roundtrip_post_epoch() {
-        let expected = SystemTime::UNIX_EPOCH + Duration::new(100, 100);
-        let result =
-            <SystemTime as FfiConverter<UniFfiTag>>::try_lift(<SystemTime as FfiConverter<
-                UniFfiTag,
-            >>::lower(expected))
-            .expect("Failed to lift!");
-        assert_eq!(expected, result)
-    }
-
-    #[test]
-    fn timestamp_roundtrip_pre_epoch() {
-        let expected = SystemTime::UNIX_EPOCH - Duration::new(100, 100);
-        let result =
-            <SystemTime as FfiConverter<UniFfiTag>>::try_lift(<SystemTime as FfiConverter<
-                UniFfiTag,
-            >>::lower(expected))
-            .expect("Failed to lift!");
-        assert_eq!(
-            expected, result,
-            "Expected results after lowering and lifting to be equal"
-        )
-    }
-}
-
-#[cfg(test)]
-pub mod test_util {
-    use std::{error::Error, fmt};
-
-    use super::*;
-
-    #[derive(Clone, Debug, PartialEq, Eq)]
-    pub struct TestError(pub String);
-
-    // Use FfiConverter to simplify lifting TestError out of RustBuffer to check it
-    unsafe impl<UT> FfiConverter<UT> for TestError {
-        ffi_converter_rust_buffer_lift_and_lower!(UniFfiTag);
-
-        fn write(obj: TestError, buf: &mut Vec<u8>) {
-            <String as FfiConverter<UniFfiTag>>::write(obj.0, buf);
-        }
-
-        fn try_read(buf: &mut &[u8]) -> Result<TestError> {
-            <String as FfiConverter<UniFfiTag>>::try_read(buf).map(TestError)
-        }
-
-        // Use a dummy value here since we don't actually need TYPE_ID_META
-        const TYPE_ID_META: MetadataBuffer = MetadataBuffer::new();
-    }
-
-    impl fmt::Display for TestError {
-        fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
-            write!(f, "{}", self.0)
-        }
-    }
-
-    impl Error for TestError {}
-
-    impl<T: Into<String>> From<T> for TestError {
-        fn from(v: T) -> Self {
-            Self(v.into())
-        }
-    }
-
-    derive_ffi_traits!(blanket TestError);
-}
diff --git a/crates/uniffi_core/src/metadata.rs b/crates/uniffi_core/src/metadata.rs
deleted file mode 100644
index dc61a1b..0000000
--- a/crates/uniffi_core/src/metadata.rs
+++ /dev/null
@@ -1,281 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-//! Pack UniFFI interface metadata into byte arrays
-//!
-//! In order to generate foreign bindings, we store interface metadata inside the library file
-//! using exported static byte arrays.  The foreign bindings code reads that metadata from the
-//! library files and generates bindings based on that.
-//!
-//! The metadata static variables are generated by the proc-macros, which is an issue because the
-//! proc-macros don't have knowledge of the entire interface -- they can only see the item they're
-//! wrapping.  For example, when a proc-macro sees a type name, it doesn't know anything about the
-//! actual type: it could be a Record, an Enum, or even a type alias for a `Vec<>`/`Result<>`.
-//!
-//! This module helps bridge the gap by providing tools that allow the proc-macros to generate code
-//! to encode the interface metadata:
-//!   - A set of const functions to build up metadata buffers with const expressions
-//!   - The `export_static_metadata_var!` macro, which creates the static variable from a const metadata
-//!     buffer.
-//!   - The `FfiConverter::TYPE_ID_META` const which encodes an identifier for that type in a
-//!     metadata buffer.
-//!
-//! `uniffi_bindgen::macro_metadata` contains the code to read the metadata from a library file.
-//! `fixtures/metadata` has the tests.
-
-/// Metadata constants, make sure to keep this in sync with copy in `uniffi_meta::reader`
-pub mod codes {
-    // Top-level metadata item codes
-    pub const FUNC: u8 = 0;
-    pub const METHOD: u8 = 1;
-    pub const RECORD: u8 = 2;
-    pub const ENUM: u8 = 3;
-    pub const INTERFACE: u8 = 4;
-    pub const NAMESPACE: u8 = 6;
-    pub const CONSTRUCTOR: u8 = 7;
-    pub const UDL_FILE: u8 = 8;
-    pub const CALLBACK_INTERFACE: u8 = 9;
-    pub const TRAIT_METHOD: u8 = 10;
-    pub const UNIFFI_TRAIT: u8 = 11;
-    pub const TRAIT_INTERFACE: u8 = 12;
-    pub const CALLBACK_TRAIT_INTERFACE: u8 = 13;
-    pub const UNKNOWN: u8 = 255;
-
-    // Type codes
-    pub const TYPE_U8: u8 = 0;
-    pub const TYPE_U16: u8 = 1;
-    pub const TYPE_U32: u8 = 2;
-    pub const TYPE_U64: u8 = 3;
-    pub const TYPE_I8: u8 = 4;
-    pub const TYPE_I16: u8 = 5;
-    pub const TYPE_I32: u8 = 6;
-    pub const TYPE_I64: u8 = 7;
-    pub const TYPE_F32: u8 = 8;
-    pub const TYPE_F64: u8 = 9;
-    pub const TYPE_BOOL: u8 = 10;
-    pub const TYPE_STRING: u8 = 11;
-    pub const TYPE_OPTION: u8 = 12;
-    pub const TYPE_RECORD: u8 = 13;
-    pub const TYPE_ENUM: u8 = 14;
-    // 15 no longer used.
-    pub const TYPE_INTERFACE: u8 = 16;
-    pub const TYPE_VEC: u8 = 17;
-    pub const TYPE_HASH_MAP: u8 = 18;
-    pub const TYPE_SYSTEM_TIME: u8 = 19;
-    pub const TYPE_DURATION: u8 = 20;
-    pub const TYPE_CALLBACK_INTERFACE: u8 = 21;
-    pub const TYPE_CUSTOM: u8 = 22;
-    pub const TYPE_RESULT: u8 = 23;
-    pub const TYPE_TRAIT_INTERFACE: u8 = 24;
-    pub const TYPE_CALLBACK_TRAIT_INTERFACE: u8 = 25;
-    pub const TYPE_UNIT: u8 = 255;
-
-    // Literal codes for LiteralMetadata
-    pub const LIT_STR: u8 = 0;
-    pub const LIT_INT: u8 = 1;
-    pub const LIT_FLOAT: u8 = 2;
-    pub const LIT_BOOL: u8 = 3;
-    pub const LIT_NONE: u8 = 4;
-    pub const LIT_SOME: u8 = 5;
-    pub const LIT_EMPTY_SEQ: u8 = 6;
-}
-
-// For large errors (e.g. enums) a buffer size of ~4k - ~8k
-// is not enough. See issues on Github: #1968 and #2041 and
-// for an example see fixture/large-error
-const BUF_SIZE: usize = 16384;
-
-// This struct is a kludge around the fact that Rust const generic support doesn't quite handle our
-// needs.
-//
-// We'd like to have code like this in `FfiConverter`:
-//
-// ```
-//   const TYPE_ID_META_SIZE: usize;
-//   const TYPE_ID_META: [u8, Self::TYPE_ID_META_SIZE];
-// ```
-//
-// This would define a metadata buffer, correctly size for the data needed. However, associated
-// consts as generic params aren't supported yet.
-//
-// To work around this, we use `const MetadataBuffer` values, which contain fixed-sized buffers
-// with enough capacity to store our largest metadata arrays.  Since the `MetadataBuffer` values
-// are const, they're only stored at compile time and the extra bytes don't end up contributing to
-// the final binary size.  This was tested on Rust `1.66.0` with `--release` by increasing
-// `BUF_SIZE` and checking the compiled library sizes.
-#[derive(Debug)]
-pub struct MetadataBuffer {
-    pub bytes: [u8; BUF_SIZE],
-    pub size: usize,
-}
-
-impl MetadataBuffer {
-    pub const fn new() -> Self {
-        Self {
-            bytes: [0; BUF_SIZE],
-            size: 0,
-        }
-    }
-
-    pub const fn from_code(value: u8) -> Self {
-        Self::new().concat_value(value)
-    }
-
-    // Concatenate another buffer to this one.
-    //
-    // This consumes self, which is convenient for the proc-macro code and also allows us to avoid
-    // allocated an extra buffer.
-    pub const fn concat(mut self, other: MetadataBuffer) -> MetadataBuffer {
-        assert!(self.size + other.size <= BUF_SIZE);
-        // It would be nice to use `copy_from_slice()`, but that's not allowed in const functions
-        // as of Rust 1.66.
-        let mut i = 0;
-        while i < other.size {
-            self.bytes[self.size] = other.bytes[i];
-            self.size += 1;
-            i += 1;
-        }
-        self
-    }
-
-    // Concatenate a `u8` value to this buffer
-    //
-    // This consumes self, which is convenient for the proc-macro code and also allows us to avoid
-    // allocated an extra buffer.
-    pub const fn concat_value(mut self, value: u8) -> Self {
-        assert!(self.size < BUF_SIZE);
-        self.bytes[self.size] = value;
-        self.size += 1;
-        self
-    }
-
-    // Concatenate a `u32` value to this buffer
-    //
-    // This consumes self, which is convenient for the proc-macro code and also allows us to avoid
-    // allocated an extra buffer.
-    pub const fn concat_u32(mut self, value: u32) -> Self {
-        assert!(self.size + 4 <= BUF_SIZE);
-        // store the value as little-endian
-        self.bytes[self.size] = value as u8;
-        self.bytes[self.size + 1] = (value >> 8) as u8;
-        self.bytes[self.size + 2] = (value >> 16) as u8;
-        self.bytes[self.size + 3] = (value >> 24) as u8;
-        self.size += 4;
-        self
-    }
-
-    // Concatenate a `bool` value to this buffer
-    //
-    // This consumes self, which is convenient for the proc-macro code and also allows us to avoid
-    // allocated an extra buffer.
-    pub const fn concat_bool(self, value: bool) -> Self {
-        self.concat_value(value as u8)
-    }
-
-    // Option<bool>
-    pub const fn concat_option_bool(self, value: Option<bool>) -> Self {
-        self.concat_value(match value {
-            None => 0,
-            Some(false) => 1,
-            Some(true) => 2,
-        })
-    }
-
-    // Concatenate a string to this buffer. The maximum string length is 255 bytes. For longer strings,
-    // use `concat_long_str()`.
-    //
-    // Strings are encoded as a `u8` length, followed by the utf8 data.
-    //
-    // This consumes self, which is convenient for the proc-macro code and also allows us to avoid
-    // allocated an extra buffer.
-    pub const fn concat_str(mut self, string: &str) -> Self {
-        assert!(string.len() < 256);
-        assert!(self.size + string.len() < BUF_SIZE);
-        self.bytes[self.size] = string.len() as u8;
-        self.size += 1;
-        let bytes = string.as_bytes();
-        let mut i = 0;
-        while i < bytes.len() {
-            self.bytes[self.size] = bytes[i];
-            self.size += 1;
-            i += 1;
-        }
-        self
-    }
-
-    // Concatenate a longer string to this buffer.
-    //
-    // Strings are encoded as a `u16` length, followed by the utf8 data.
-    //
-    // This consumes self, which is convenient for the proc-macro code and also allows us to avoid
-    // allocated an extra buffer.
-    pub const fn concat_long_str(mut self, string: &str) -> Self {
-        assert!(self.size + string.len() + 1 < BUF_SIZE);
-        let [lo, hi] = (string.len() as u16).to_le_bytes();
-        self.bytes[self.size] = lo;
-        self.bytes[self.size + 1] = hi;
-        self.size += 2;
-        let bytes = string.as_bytes();
-        let mut i = 0;
-        while i < bytes.len() {
-            self.bytes[self.size] = bytes[i];
-            self.size += 1;
-            i += 1;
-        }
-        self
-    }
-
-    // Create an array from this MetadataBuffer
-    //
-    // SIZE should always be `self.size`.  This is part of the kludge to hold us over until Rust
-    // gets better const generic support.
-    pub const fn into_array<const SIZE: usize>(self) -> [u8; SIZE] {
-        let mut result: [u8; SIZE] = [0; SIZE];
-        let mut i = 0;
-        while i < SIZE {
-            result[i] = self.bytes[i];
-            i += 1;
-        }
-        result
-    }
-
-    // Create a checksum from this MetadataBuffer
-    //
-    // This is used by the bindings code to verify that the library they link to is the same one
-    // that the bindings were generated from.
-    pub const fn checksum(&self) -> u16 {
-        calc_checksum(&self.bytes, self.size)
-    }
-}
-
-impl AsRef<[u8]> for MetadataBuffer {
-    fn as_ref(&self) -> &[u8] {
-        &self.bytes[..self.size]
-    }
-}
-
-// Create a checksum for a MetadataBuffer
-//
-// This is used by the bindings code to verify that the library they link to is the same one
-// that the bindings were generated from.
-pub const fn checksum_metadata(buf: &[u8]) -> u16 {
-    calc_checksum(buf, buf.len())
-}
-
-const fn calc_checksum(bytes: &[u8], size: usize) -> u16 {
-    // Taken from the fnv_hash() function from the FNV crate (https://github.com/servo/rust-fnv/blob/master/lib.rs).
-    // fnv_hash() hasn't been released in a version yet.
-    const INITIAL_STATE: u64 = 0xcbf29ce484222325;
-    const PRIME: u64 = 0x100000001b3;
-
-    let mut hash = INITIAL_STATE;
-    let mut i = 0;
-    while i < size {
-        hash ^= bytes[i] as u64;
-        hash = hash.wrapping_mul(PRIME);
-        i += 1;
-    }
-    // Convert the 64-bit hash to a 16-bit hash by XORing everything together
-    (hash ^ (hash >> 16) ^ (hash >> 32) ^ (hash >> 48)) as u16
-}
diff --git a/crates/uniffi_core/src/panichook.rs b/crates/uniffi_core/src/panichook.rs
deleted file mode 100644
index ef0ab86..0000000
--- a/crates/uniffi_core/src/panichook.rs
+++ /dev/null
@@ -1,34 +0,0 @@
-/// Initialize our panic handling hook to optionally log panics
-#[cfg(feature = "log_panics")]
-pub fn ensure_setup() {
-    use std::sync::Once;
-    static INIT_BACKTRACES: Once = Once::new();
-    INIT_BACKTRACES.call_once(move || {
-        #[cfg(all(feature = "log_backtraces", not(target_os = "android")))]
-        {
-            std::env::set_var("RUST_BACKTRACE", "1");
-        }
-        // Turn on a panic hook which logs both backtraces and the panic
-        // "Location" (file/line). We do both in case we've been stripped,
-        // ).
-        std::panic::set_hook(Box::new(move |panic_info| {
-            let (file, line) = if let Some(loc) = panic_info.location() {
-                (loc.file(), loc.line())
-            } else {
-                // Apparently this won't happen but rust has reserved the
-                // ability to start returning None from location in some cases
-                // in the future.
-                ("<unknown>", 0)
-            };
-            log::error!("### Rust `panic!` hit at file '{file}', line {line}");
-            #[cfg(all(feature = "log_backtraces", not(target_os = "android")))]
-            {
-                log::error!("  Complete stack trace:\n{:?}", backtrace::Backtrace::new());
-            }
-        }));
-    });
-}
-
-/// Initialize our panic handling hook to optionally log panics
-#[cfg(not(feature = "log_panics"))]
-pub fn ensure_setup() {}
diff --git a/crates/uniffi_macros/.android-checksum.json b/crates/uniffi_macros/.android-checksum.json
deleted file mode 100644
index 5143233..0000000
--- a/crates/uniffi_macros/.android-checksum.json
+++ /dev/null
@@ -1 +0,0 @@
-{"package":null,"files":{".cargo-checksum.json":"078d1853ddcdf6e02a6bb45ea68637e45ab113d251e105557d2a83d40a8ea962","Android.bp":"04b0293e53b483757c7046da410acbc28adf2d9b78850d2e39947ad9025e6a4c","Cargo.toml":"aeef463a13b4c4532b4262d438c6f770c8cdfccf2e219116c31b80f7814e158b","LICENSE":"eb272adec43829624ef944827cee5edc5896c80ceaccea3e8e471dadeaeee408","METADATA":"e296ce486f2a84905aae91f7eee48a53e314f3c71c5de3656de51eeff48c3f26","MODULE_LICENSE_MPL":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"8528d929c10fb2ef91706a54de19896a66a8636432d18835228fd13c183506c4","cargo_embargo.json":"aa45a963da01d3f018be316cd5b7646a5b413ce2611c5218f2914d2e8a9efd0e","patches/LICENSE.patch":"cfb7d0c0c947397e0cf46698509020438a9a3305875ecf9b75fafeb30815ac80","patches/mod_path.patch":"b7e3cba1f151ea4ec4c7a666d03b350063a4c418728039ae5d945ece2231259a","patches/update-toml.patch":"795d489f5fa00029154c3967d1e112bbb28a846235600f63133226af9beebb7e","src/custom.rs":"2579cc147761228f0289e538b4b6adc81ba97d2f4e0848f151da58289370864d","src/default.rs":"b2ea2c09f644a356825a970fc2661b7a007013e6124c8ce553de5b3d44de0e89","src/enum_.rs":"91e0a1f900ede45f145ff35f06d40c9e5e565bd42a46a66c576b4d23310baee4","src/error.rs":"0d59aaf0db26791dda7fd800bb9b7ba86402c4ab73909013dd0d844b5c3dfea5","src/export.rs":"bf10a2ca73427fbe3ffa4b3b43cd69011818010dbb4ea0073345d0d9e7ed0e12","src/export/attributes.rs":"daa9203fa8c54799421cb1db8189ee49328f320d431c9b278fc918aa42eb5e7b","src/export/callback_interface.rs":"e34761b1969e7be02a97ddb4473ca7b7e41faba28c58518668997fa0be2ebc4b","src/export/item.rs":"6d5810862e14e10bdbb057e055e85a469fcea77439c6800a258051ff9d06e7ac","src/export/scaffolding.rs":"d60a55561289a9d32afbfca22a13ef9978f0bbbaf5e14011662d189942783164","src/export/trait_interface.rs":"552ad3b53128857b0dbb5ba5aee557686fb044f0aed493d22ca2edb9bea3276a","src/export/utrait.rs":"279a4c17dc527e45c15dfca80c5e5b05c2df864bb87883f5b726ca9952f82886","src/fnsig.rs":"b1b382a9c1999409fb3b9a7913e356064889943640e9d76572d227404cd2e1b1","src/lib.rs":"b615afce6f1303c2762d3290639c584dfa1a018b0b3011cfc9d2dbb8b80c2aad","src/object.rs":"1863a4e8a7424695f93d2dc65e7914ce991517b2a1207850570e2ba374bd8d17","src/record.rs":"d5ffcd93db830b4549a665ab155a19d80106975b0a518a29bc2b706728ae345a","src/setup_scaffolding.rs":"59b2f09765902bd61b4eb801965007c67cca3fac4c3835d0e9f02eee9684b948","src/test.rs":"6c677591981839e383bbc5d3eb77b566ac4120145d98a2730f21f0f82ac2da78","src/util.rs":"da238cfe5cf05db80511e828d3570dea58e178f8ea1d843e294a575b93cc17e9"}}
\ No newline at end of file
diff --git a/crates/uniffi_macros/.cargo-checksum.json b/crates/uniffi_macros/.cargo-checksum.json
deleted file mode 100644
index 9db0492..0000000
--- a/crates/uniffi_macros/.cargo-checksum.json
+++ /dev/null
@@ -1 +0,0 @@
-{"files":{"Cargo.toml":"a292239ca3c72852768fdf0e7bc2dd6386af7bf1ab0ef56dff01e1c9e781b2ca","README.md":"37c1af00ec81a9f1bc206ab3578356e5f9ad4077dc46dd1bb623d81d804948b8","src/custom.rs":"36cd6c2eeb8efdc34e59dff634a22e79471ab17f49ceb0f131da5f144313f7e4","src/default.rs":"77466ac54da69094bcdccc5927d0980b1e9dd0095647ca825830673c48847a53","src/enum_.rs":"afe0a6534d8e7f68047e3f1afad9369d5d5650f4c7555e8d4173f24126c715ba","src/error.rs":"30168378da9a23e6530ffe68647bf6618d07a0aaa236d5009137a922798a0e88","src/export.rs":"42c5e784c1dccc796c8b6ea29c2dc1811e48a531488a3ed0e2a59330778a7e41","src/export/attributes.rs":"c848f8c309c4cf7a168f038834752dc4816b5c853768d7c331ea4cd5ce0841b7","src/export/callback_interface.rs":"794b0665dc7eb02ea854c61c8bb2781e0b4ac1de646d95a8fd7791f770f2e6e3","src/export/item.rs":"4e86875692c2d2993fde12e78dbde2cbffa5675ede143577d5620126401efe05","src/export/scaffolding.rs":"b25167d2213b6d6c5ba653622f26791e8c3e74a5ecce6512ec27009fc8bf68e4","src/export/trait_interface.rs":"f07f9908ee28661de4586d89b693f3d93dae5e5cba8a089eff25f20bbf6b373b","src/export/utrait.rs":"b55533d3eef8262944d3c0d9a3a9cba0615d2d5af8608f0919abc7699989e2a8","src/fnsig.rs":"5e434a1cc87166c5245424bb14e896eb766bf680d4d50d4b8536852f91487d7c","src/lib.rs":"a28bbfd2d1dc835306ff6072f75761bb6b3a158477bba966057776c527fe6d70","src/object.rs":"5419ed64c8120aef811a77c2205f58a7a537bdf34ae04f9c92dd3aaa176eed39","src/record.rs":"29072542cc2f3e027bd7c59b45ba913458f8213d1b2b33bc70d140baa98fcdc8","src/setup_scaffolding.rs":"173fdc916967d54bd6532def16d12e5bb85467813a46a031d3338b77625756bb","src/test.rs":"1673f282bb35d6b0740ad0e5f11826c2852d7a0db29604c2258f457415b537e8","src/util.rs":"a2c3693343e78dffb2a7f7b39eeb9b7f298b66688f1766a7c08113cf9431ef4c"},"package":"18331d35003f46f0d04047fbe4227291815b83a937a8c32bc057f990962182c4"}
\ No newline at end of file
diff --git a/crates/uniffi_macros/Android.bp b/crates/uniffi_macros/Android.bp
deleted file mode 100644
index bbb16c5..0000000
--- a/crates/uniffi_macros/Android.bp
+++ /dev/null
@@ -1,38 +0,0 @@
-// This file is generated by cargo_embargo.
-// Do not modify this file because the changes will be overridden on upgrade.
-
-package {
-    default_applicable_licenses: ["external_rust_crates_uniffi_macros_license"],
-    default_team: "trendy_team_android_rust",
-}
-
-license {
-    name: "external_rust_crates_uniffi_macros_license",
-    visibility: [":__subpackages__"],
-    license_kinds: ["SPDX-license-identifier-MPL-2.0"],
-    license_text: ["LICENSE"],
-}
-
-rust_proc_macro {
-    name: "libuniffi_macros",
-    crate_name: "uniffi_macros",
-    cargo_env_compat: true,
-    cargo_pkg_version: "0.27.1",
-    crate_root: "src/lib.rs",
-    edition: "2021",
-    features: ["default"],
-    rustlibs: [
-        "libbincode",
-        "libcamino",
-        "libfs_err",
-        "libonce_cell",
-        "libproc_macro2",
-        "libquote",
-        "libserde",
-        "libsyn",
-        "libtoml",
-        "libuniffi_meta",
-    ],
-    product_available: true,
-    vendor_available: true,
-}
diff --git a/crates/uniffi_macros/Cargo.toml b/crates/uniffi_macros/Cargo.toml
deleted file mode 100644
index 5ae193e..0000000
--- a/crates/uniffi_macros/Cargo.toml
+++ /dev/null
@@ -1,73 +0,0 @@
-# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
-#
-# When uploading crates to the registry Cargo will automatically
-# "normalize" Cargo.toml files for maximal compatibility
-# with all versions of Cargo and also rewrite `path` dependencies
-# to registry (e.g., crates.io) dependencies.
-#
-# If you are reading this file be aware that the original Cargo.toml
-# will likely look very different (and much more reasonable).
-# See Cargo.toml.orig for the original contents.
-
-[package]
-edition = "2021"
-name = "uniffi_macros"
-version = "0.27.1"
-authors = ["Firefox Sync Team <[email protected]>"]
-description = "a multi-language bindings generator for rust (convenience macros)"
-homepage = "https://mozilla.github.io/uniffi-rs"
-documentation = "https://mozilla.github.io/uniffi-rs"
-readme = "README.md"
-keywords = [
-    "ffi",
-    "bindgen",
-]
-license = "MPL-2.0"
-repository = "https://github.com/mozilla/uniffi-rs"
-
-[lib]
-proc-macro = true
-
-[dependencies.bincode]
-version = "1.3"
-
-[dependencies.camino]
-version = "1.0.8"
-
-[dependencies.fs-err]
-version = "2.7.0"
-
-[dependencies.once_cell]
-version = "1.10.0"
-
-[dependencies.proc-macro2]
-version = "1.0"
-
-[dependencies.quote]
-version = "1.0"
-
-[dependencies.serde]
-version = "1.0.136"
-features = ["derive"]
-
-[dependencies.syn]
-version = "2.0"
-features = [
-    "full",
-    "visit-mut",
-]
-
-[dependencies.toml]
-version = "0.5.9"
-
-[dependencies.uniffi_build]
-version = "=0.27.1"
-optional = true
-
-[dependencies.uniffi_meta]
-version = "=0.27.1"
-
-[features]
-default = []
-nightly = []
-trybuild = ["dep:uniffi_build"]
diff --git a/crates/uniffi_macros/LICENSE b/crates/uniffi_macros/LICENSE
deleted file mode 100644
index a612ad9..0000000
--- a/crates/uniffi_macros/LICENSE
+++ /dev/null
@@ -1,373 +0,0 @@
-Mozilla Public License Version 2.0
-==================================
-
-1. Definitions
---------------
-
-1.1. "Contributor"
-    means each individual or legal entity that creates, contributes to
-    the creation of, or owns Covered Software.
-
-1.2. "Contributor Version"
-    means the combination of the Contributions of others (if any) used
-    by a Contributor and that particular Contributor's Contribution.
-
-1.3. "Contribution"
-    means Covered Software of a particular Contributor.
-
-1.4. "Covered Software"
-    means Source Code Form to which the initial Contributor has attached
-    the notice in Exhibit A, the Executable Form of such Source Code
-    Form, and Modifications of such Source Code Form, in each case
-    including portions thereof.
-
-1.5. "Incompatible With Secondary Licenses"
-    means
-
-    (a) that the initial Contributor has attached the notice described
-        in Exhibit B to the Covered Software; or
-
-    (b) that the Covered Software was made available under the terms of
-        version 1.1 or earlier of the License, but not also under the
-        terms of a Secondary License.
-
-1.6. "Executable Form"
-    means any form of the work other than Source Code Form.
-
-1.7. "Larger Work"
-    means a work that combines Covered Software with other material, in
-    a separate file or files, that is not Covered Software.
-
-1.8. "License"
-    means this document.
-
-1.9. "Licensable"
-    means having the right to grant, to the maximum extent possible,
-    whether at the time of the initial grant or subsequently, any and
-    all of the rights conveyed by this License.
-
-1.10. "Modifications"
-    means any of the following:
-
-    (a) any file in Source Code Form that results from an addition to,
-        deletion from, or modification of the contents of Covered
-        Software; or
-
-    (b) any new file in Source Code Form that contains any Covered
-        Software.
-
-1.11. "Patent Claims" of a Contributor
-    means any patent claim(s), including without limitation, method,
-    process, and apparatus claims, in any patent Licensable by such
-    Contributor that would be infringed, but for the grant of the
-    License, by the making, using, selling, offering for sale, having
-    made, import, or transfer of either its Contributions or its
-    Contributor Version.
-
-1.12. "Secondary License"
-    means either the GNU General Public License, Version 2.0, the GNU
-    Lesser General Public License, Version 2.1, the GNU Affero General
-    Public License, Version 3.0, or any later versions of those
-    licenses.
-
-1.13. "Source Code Form"
-    means the form of the work preferred for making modifications.
-
-1.14. "You" (or "Your")
-    means an individual or a legal entity exercising rights under this
-    License. For legal entities, "You" includes any entity that
-    controls, is controlled by, or is under common control with You. For
-    purposes of this definition, "control" means (a) the power, direct
-    or indirect, to cause the direction or management of such entity,
-    whether by contract or otherwise, or (b) ownership of more than
-    fifty percent (50%) of the outstanding shares or beneficial
-    ownership of such entity.
-
-2. License Grants and Conditions
---------------------------------
-
-2.1. Grants
-
-Each Contributor hereby grants You a world-wide, royalty-free,
-non-exclusive license:
-
-(a) under intellectual property rights (other than patent or trademark)
-    Licensable by such Contributor to use, reproduce, make available,
-    modify, display, perform, distribute, and otherwise exploit its
-    Contributions, either on an unmodified basis, with Modifications, or
-    as part of a Larger Work; and
-
-(b) under Patent Claims of such Contributor to make, use, sell, offer
-    for sale, have made, import, and otherwise transfer either its
-    Contributions or its Contributor Version.
-
-2.2. Effective Date
-
-The licenses granted in Section 2.1 with respect to any Contribution
-become effective for each Contribution on the date the Contributor first
-distributes such Contribution.
-
-2.3. Limitations on Grant Scope
-
-The licenses granted in this Section 2 are the only rights granted under
-this License. No additional rights or licenses will be implied from the
-distribution or licensing of Covered Software under this License.
-Notwithstanding Section 2.1(b) above, no patent license is granted by a
-Contributor:
-
-(a) for any code that a Contributor has removed from Covered Software;
-    or
-
-(b) for infringements caused by: (i) Your and any other third party's
-    modifications of Covered Software, or (ii) the combination of its
-    Contributions with other software (except as part of its Contributor
-    Version); or
-
-(c) under Patent Claims infringed by Covered Software in the absence of
-    its Contributions.
-
-This License does not grant any rights in the trademarks, service marks,
-or logos of any Contributor (except as may be necessary to comply with
-the notice requirements in Section 3.4).
-
-2.4. Subsequent Licenses
-
-No Contributor makes additional grants as a result of Your choice to
-distribute the Covered Software under a subsequent version of this
-License (see Section 10.2) or under the terms of a Secondary License (if
-permitted under the terms of Section 3.3).
-
-2.5. Representation
-
-Each Contributor represents that the Contributor believes its
-Contributions are its original creation(s) or it has sufficient rights
-to grant the rights to its Contributions conveyed by this License.
-
-2.6. Fair Use
-
-This License is not intended to limit any rights You have under
-applicable copyright doctrines of fair use, fair dealing, or other
-equivalents.
-
-2.7. Conditions
-
-Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
-in Section 2.1.
-
-3. Responsibilities
--------------------
-
-3.1. Distribution of Source Form
-
-All distribution of Covered Software in Source Code Form, including any
-Modifications that You create or to which You contribute, must be under
-the terms of this License. You must inform recipients that the Source
-Code Form of the Covered Software is governed by the terms of this
-License, and how they can obtain a copy of this License. You may not
-attempt to alter or restrict the recipients' rights in the Source Code
-Form.
-
-3.2. Distribution of Executable Form
-
-If You distribute Covered Software in Executable Form then:
-
-(a) such Covered Software must also be made available in Source Code
-    Form, as described in Section 3.1, and You must inform recipients of
-    the Executable Form how they can obtain a copy of such Source Code
-    Form by reasonable means in a timely manner, at a charge no more
-    than the cost of distribution to the recipient; and
-
-(b) You may distribute such Executable Form under the terms of this
-    License, or sublicense it under different terms, provided that the
-    license for the Executable Form does not attempt to limit or alter
-    the recipients' rights in the Source Code Form under this License.
-
-3.3. Distribution of a Larger Work
-
-You may create and distribute a Larger Work under terms of Your choice,
-provided that You also comply with the requirements of this License for
-the Covered Software. If the Larger Work is a combination of Covered
-Software with a work governed by one or more Secondary Licenses, and the
-Covered Software is not Incompatible With Secondary Licenses, this
-License permits You to additionally distribute such Covered Software
-under the terms of such Secondary License(s), so that the recipient of
-the Larger Work may, at their option, further distribute the Covered
-Software under the terms of either this License or such Secondary
-License(s).
-
-3.4. Notices
-
-You may not remove or alter the substance of any license notices
-(including copyright notices, patent notices, disclaimers of warranty,
-or limitations of liability) contained within the Source Code Form of
-the Covered Software, except that You may alter any license notices to
-the extent required to remedy known factual inaccuracies.
-
-3.5. Application of Additional Terms
-
-You may choose to offer, and to charge a fee for, warranty, support,
-indemnity or liability obligations to one or more recipients of Covered
-Software. However, You may do so only on Your own behalf, and not on
-behalf of any Contributor. You must make it absolutely clear that any
-such warranty, support, indemnity, or liability obligation is offered by
-You alone, and You hereby agree to indemnify every Contributor for any
-liability incurred by such Contributor as a result of warranty, support,
-indemnity or liability terms You offer. You may include additional
-disclaimers of warranty and limitations of liability specific to any
-jurisdiction.
-
-4. Inability to Comply Due to Statute or Regulation
----------------------------------------------------
-
-If it is impossible for You to comply with any of the terms of this
-License with respect to some or all of the Covered Software due to
-statute, judicial order, or regulation then You must: (a) comply with
-the terms of this License to the maximum extent possible; and (b)
-describe the limitations and the code they affect. Such description must
-be placed in a text file included with all distributions of the Covered
-Software under this License. Except to the extent prohibited by statute
-or regulation, such description must be sufficiently detailed for a
-recipient of ordinary skill to be able to understand it.
-
-5. Termination
---------------
-
-5.1. The rights granted under this License will terminate automatically
-if You fail to comply with any of its terms. However, if You become
-compliant, then the rights granted under this License from a particular
-Contributor are reinstated (a) provisionally, unless and until such
-Contributor explicitly and finally terminates Your grants, and (b) on an
-ongoing basis, if such Contributor fails to notify You of the
-non-compliance by some reasonable means prior to 60 days after You have
-come back into compliance. Moreover, Your grants from a particular
-Contributor are reinstated on an ongoing basis if such Contributor
-notifies You of the non-compliance by some reasonable means, this is the
-first time You have received notice of non-compliance with this License
-from such Contributor, and You become compliant prior to 30 days after
-Your receipt of the notice.
-
-5.2. If You initiate litigation against any entity by asserting a patent
-infringement claim (excluding declaratory judgment actions,
-counter-claims, and cross-claims) alleging that a Contributor Version
-directly or indirectly infringes any patent, then the rights granted to
-You by any and all Contributors for the Covered Software under Section
-2.1 of this License shall terminate.
-
-5.3. In the event of termination under Sections 5.1 or 5.2 above, all
-end user license agreements (excluding distributors and resellers) which
-have been validly granted by You or Your distributors under this License
-prior to termination shall survive termination.
-
-************************************************************************
-*                                                                      *
-*  6. Disclaimer of Warranty                                           *
-*  -------------------------                                           *
-*                                                                      *
-*  Covered Software is provided under this License on an "as is"       *
-*  basis, without warranty of any kind, either expressed, implied, or  *
-*  statutory, including, without limitation, warranties that the       *
-*  Covered Software is free of defects, merchantable, fit for a        *
-*  particular purpose or non-infringing. The entire risk as to the     *
-*  quality and performance of the Covered Software is with You.        *
-*  Should any Covered Software prove defective in any respect, You     *
-*  (not any Contributor) assume the cost of any necessary servicing,   *
-*  repair, or correction. This disclaimer of warranty constitutes an   *
-*  essential part of this License. No use of any Covered Software is   *
-*  authorized under this License except under this disclaimer.         *
-*                                                                      *
-************************************************************************
-
-************************************************************************
-*                                                                      *
-*  7. Limitation of Liability                                          *
-*  --------------------------                                          *
-*                                                                      *
-*  Under no circumstances and under no legal theory, whether tort      *
-*  (including negligence), contract, or otherwise, shall any           *
-*  Contributor, or anyone who distributes Covered Software as          *
-*  permitted above, be liable to You for any direct, indirect,         *
-*  special, incidental, or consequential damages of any character      *
-*  including, without limitation, damages for lost profits, loss of    *
-*  goodwill, work stoppage, computer failure or malfunction, or any    *
-*  and all other commercial damages or losses, even if such party      *
-*  shall have been informed of the possibility of such damages. This   *
-*  limitation of liability shall not apply to liability for death or   *
-*  personal injury resulting from such party's negligence to the       *
-*  extent applicable law prohibits such limitation. Some               *
-*  jurisdictions do not allow the exclusion or limitation of           *
-*  incidental or consequential damages, so this exclusion and          *
-*  limitation may not apply to You.                                    *
-*                                                                      *
-************************************************************************
-
-8. Litigation
--------------
-
-Any litigation relating to this License may be brought only in the
-courts of a jurisdiction where the defendant maintains its principal
-place of business and such litigation shall be governed by laws of that
-jurisdiction, without reference to its conflict-of-law provisions.
-Nothing in this Section shall prevent a party's ability to bring
-cross-claims or counter-claims.
-
-9. Miscellaneous
-----------------
-
-This License represents the complete agreement concerning the subject
-matter hereof. If any provision of this License is held to be
-unenforceable, such provision shall be reformed only to the extent
-necessary to make it enforceable. Any law or regulation which provides
-that the language of a contract shall be construed against the drafter
-shall not be used to construe this License against a Contributor.
-
-10. Versions of the License
----------------------------
-
-10.1. New Versions
-
-Mozilla Foundation is the license steward. Except as provided in Section
-10.3, no one other than the license steward has the right to modify or
-publish new versions of this License. Each version will be given a
-distinguishing version number.
-
-10.2. Effect of New Versions
-
-You may distribute the Covered Software under the terms of the version
-of the License under which You originally received the Covered Software,
-or under the terms of any subsequent version published by the license
-steward.
-
-10.3. Modified Versions
-
-If you create software not governed by this License, and you want to
-create a new license for such software, you may create and use a
-modified version of this License if you rename the license and remove
-any references to the name of the license steward (except to note that
-such modified license differs from this License).
-
-10.4. Distributing Source Code Form that is Incompatible With Secondary
-Licenses
-
-If You choose to distribute Source Code Form that is Incompatible With
-Secondary Licenses under the terms of this version of the License, the
-notice described in Exhibit B of this License must be attached.
-
-Exhibit A - Source Code Form License Notice
--------------------------------------------
-
-  This Source Code Form is subject to the terms of the Mozilla Public
-  License, v. 2.0. If a copy of the MPL was not distributed with this
-  file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-If it is not possible or desirable to put the notice in a particular
-file, then You may include the notice in a location (such as a LICENSE
-file in a relevant directory) where a recipient would be likely to look
-for such a notice.
-
-You may add additional accurate notices of copyright ownership.
-
-Exhibit B - "Incompatible With Secondary Licenses" Notice
----------------------------------------------------------
-
-  This Source Code Form is "Incompatible With Secondary Licenses", as
-  defined by the Mozilla Public License, v. 2.0.
diff --git a/crates/uniffi_macros/METADATA b/crates/uniffi_macros/METADATA
deleted file mode 100644
index e1b19c1..0000000
--- a/crates/uniffi_macros/METADATA
+++ /dev/null
@@ -1,17 +0,0 @@
-name: "uniffi_macros"
-description: "a multi-language bindings generator for rust (convenience macros)"
-third_party {
-  version: "0.27.1"
-  license_type: RECIPROCAL
-  last_upgrade_date {
-    year: 2024
-    month: 5
-    day: 6
-  }
-  homepage: "https://crates.io/crates/uniffi_macros"
-  identifier {
-    type: "Archive"
-    value: "https://static.crates.io/crates/uniffi_macros/uniffi_macros-0.27.1.crate"
-    version: "0.27.1"
-  }
-}
diff --git a/crates/uniffi_macros/MODULE_LICENSE_MPL b/crates/uniffi_macros/MODULE_LICENSE_MPL
deleted file mode 100644
index e69de29..0000000
--- a/crates/uniffi_macros/MODULE_LICENSE_MPL
+++ /dev/null
diff --git a/crates/uniffi_macros/README.md b/crates/uniffi_macros/README.md
deleted file mode 100644
index 64ac348..0000000
--- a/crates/uniffi_macros/README.md
+++ /dev/null
@@ -1,81 +0,0 @@
-# UniFFI - a multi-language bindings generator for Rust
-
-UniFFI is a toolkit for building cross-platform software components in Rust.
-
-For the impatient, see [**the UniFFI user guide**](https://mozilla.github.io/uniffi-rs/)
-or [**the UniFFI examples**](https://github.com/mozilla/uniffi-rs/tree/main/examples#example-uniffi-components).
-
-By writing your core business logic in Rust and describing its interface in an "object model",
-you can use UniFFI to help you:
-
-* Compile your Rust code into a shared library for use on different target platforms.
-* Generate bindings to load and use the library from different target languages.
-
-You can describe your object model in an [interface definition file](https://mozilla.github.io/uniffi-rs/udl_file_spec.html)
-or [by using proc-macros](https://mozilla.github.io/uniffi-rs/proc_macro/index.html).
-
-UniFFI is currently used extensively by Mozilla in Firefox mobile and desktop browsers;
-written once in Rust, auto-generated bindings allow that functionality to be called
-from both Kotlin (for Android apps) and Swift (for iOS apps).
-It also has a growing community of users shipping various cool things to many users.
-
-UniFFI comes with support for **Kotlin**, **Swift**, **Python** and **Ruby** with 3rd party bindings available for **C#** and **Golang**.
-Additional foreign language bindings can be developed externally and we welcome contributions to list them here.
-See [Third-party foreign language bindings](#third-party-foreign-language-bindings).
-
-## User Guide
-
-You can read more about using the tool in [**the UniFFI user guide**](https://mozilla.github.io/uniffi-rs/).
-
-We consider it ready for production use, but UniFFI is a long way from a 1.0 release with lots of internal work still going on.
-We try hard to avoid breaking simple consumers, but more advanced things might break as you upgrade over time.
-
-### Etymology and Pronunciation
-
-ˈjuːnɪfaɪ. Pronounced to rhyme with "unify".
-
-A portmanteau word that also puns with "unify", to signify the joining of one codebase accessed from many languages.
-
-uni - [Latin ūni-, from ūnus, one]
-FFI - [Abbreviation, Foreign Function Interface]
-
-## Alternative tools
-
-Other tools we know of which try and solve a similarly shaped problem are:
-
-* [Diplomat](https://github.com/rust-diplomat/diplomat/) - see our [writeup of
-  the different approach taken by that tool](docs/diplomat-and-macros.md)
-* [Interoptopus](https://github.com/ralfbiedert/interoptopus/)
-
-(Please open a PR if you think other tools should be listed!)
-
-## Third-party foreign language bindings
-
-* [Kotlin Multiplatform support](https://gitlab.com/trixnity/uniffi-kotlin-multiplatform-bindings). The repository contains Kotlin Multiplatform bindings generation for UniFFI, letting you target both JVM and Native.
-* [Go bindings](https://github.com/NordSecurity/uniffi-bindgen-go)
-* [C# bindings](https://github.com/NordSecurity/uniffi-bindgen-cs)
-* [Dart bindings](https://github.com/NiallBunting/uniffi-rs-dart)
-
-### External resources
-
-There are a few third-party resources that make it easier to work with UniFFI:
-
-* [Plugin support for `.udl` files](https://github.com/Lonami/uniffi-dl) for the IDEA platform ([*uniffi-dl* in the JetBrains marketplace](https://plugins.jetbrains.com/plugin/20527-uniffi-dl)). It provides syntax highlighting, code folding, code completion, reference resolution and navigation (among others features) for the [UniFFI Definition Language (UDL)](https://mozilla.github.io/uniffi-rs/).
-* [cargo swift](https://github.com/antoniusnaumann/cargo-swift), a cargo plugin to build a Swift Package from Rust code. It provides an init command for setting up a UniFFI crate and a package command for building a Swift package from Rust code - without the need for additional configuration or build scripts.
-* [Cargo NDK Gradle Plugin](https://github.com/willir/cargo-ndk-android-gradle) allows you to build Rust code using [`cargo-ndk`](https://github.com/bbqsrc/cargo-ndk), which generally makes Android library builds less painful.
-* [`uniffi-starter`](https://github.com/ianthetechie/uniffi-starter) is a minimal project demonstrates a wide range of UniFFI in a complete project in a compact manner. It includes a full Android library build process, an XCFramework generation script, and example Swift package structure. 
-
-(Please open a PR if you think other resources should be listed!)
-
-## Contributing
-
-If this tool sounds interesting to you, please help us develop it! You can:
-
-* View the [contributor guidelines](./docs/contributing.md).
-* File or work on [issues](https://github.com/mozilla/uniffi-rs/issues) here in GitHub.
-* Join discussions in the [#uniffi:mozilla.org](https://matrix.to/#/#uniffi:mozilla.org)
-  room on Matrix.
-
-## Code of Conduct
-
-This project is governed by Mozilla's [Community Participation Guidelines](./CODE_OF_CONDUCT.md).
diff --git a/crates/uniffi_macros/cargo_embargo.json b/crates/uniffi_macros/cargo_embargo.json
deleted file mode 100644
index cb908d7..0000000
--- a/crates/uniffi_macros/cargo_embargo.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-  "run_cargo": false
-}
diff --git a/crates/uniffi_macros/patches/LICENSE.patch b/crates/uniffi_macros/patches/LICENSE.patch
deleted file mode 100644
index fecc0b4..0000000
--- a/crates/uniffi_macros/patches/LICENSE.patch
+++ /dev/null
@@ -1,379 +0,0 @@
-diff --git b/LICENSE a/LICENSE
-new file mode 100644
-index 0000000..a612ad9
---- /dev/null
-+++ a/LICENSE
-@@ -0,0 +1,373 @@
-+Mozilla Public License Version 2.0
-+==================================
-+
-+1. Definitions
-+--------------
-+
-+1.1. "Contributor"
-+    means each individual or legal entity that creates, contributes to
-+    the creation of, or owns Covered Software.
-+
-+1.2. "Contributor Version"
-+    means the combination of the Contributions of others (if any) used
-+    by a Contributor and that particular Contributor's Contribution.
-+
-+1.3. "Contribution"
-+    means Covered Software of a particular Contributor.
-+
-+1.4. "Covered Software"
-+    means Source Code Form to which the initial Contributor has attached
-+    the notice in Exhibit A, the Executable Form of such Source Code
-+    Form, and Modifications of such Source Code Form, in each case
-+    including portions thereof.
-+
-+1.5. "Incompatible With Secondary Licenses"
-+    means
-+
-+    (a) that the initial Contributor has attached the notice described
-+        in Exhibit B to the Covered Software; or
-+
-+    (b) that the Covered Software was made available under the terms of
-+        version 1.1 or earlier of the License, but not also under the
-+        terms of a Secondary License.
-+
-+1.6. "Executable Form"
-+    means any form of the work other than Source Code Form.
-+
-+1.7. "Larger Work"
-+    means a work that combines Covered Software with other material, in
-+    a separate file or files, that is not Covered Software.
-+
-+1.8. "License"
-+    means this document.
-+
-+1.9. "Licensable"
-+    means having the right to grant, to the maximum extent possible,
-+    whether at the time of the initial grant or subsequently, any and
-+    all of the rights conveyed by this License.
-+
-+1.10. "Modifications"
-+    means any of the following:
-+
-+    (a) any file in Source Code Form that results from an addition to,
-+        deletion from, or modification of the contents of Covered
-+        Software; or
-+
-+    (b) any new file in Source Code Form that contains any Covered
-+        Software.
-+
-+1.11. "Patent Claims" of a Contributor
-+    means any patent claim(s), including without limitation, method,
-+    process, and apparatus claims, in any patent Licensable by such
-+    Contributor that would be infringed, but for the grant of the
-+    License, by the making, using, selling, offering for sale, having
-+    made, import, or transfer of either its Contributions or its
-+    Contributor Version.
-+
-+1.12. "Secondary License"
-+    means either the GNU General Public License, Version 2.0, the GNU
-+    Lesser General Public License, Version 2.1, the GNU Affero General
-+    Public License, Version 3.0, or any later versions of those
-+    licenses.
-+
-+1.13. "Source Code Form"
-+    means the form of the work preferred for making modifications.
-+
-+1.14. "You" (or "Your")
-+    means an individual or a legal entity exercising rights under this
-+    License. For legal entities, "You" includes any entity that
-+    controls, is controlled by, or is under common control with You. For
-+    purposes of this definition, "control" means (a) the power, direct
-+    or indirect, to cause the direction or management of such entity,
-+    whether by contract or otherwise, or (b) ownership of more than
-+    fifty percent (50%) of the outstanding shares or beneficial
-+    ownership of such entity.
-+
-+2. License Grants and Conditions
-+--------------------------------
-+
-+2.1. Grants
-+
-+Each Contributor hereby grants You a world-wide, royalty-free,
-+non-exclusive license:
-+
-+(a) under intellectual property rights (other than patent or trademark)
-+    Licensable by such Contributor to use, reproduce, make available,
-+    modify, display, perform, distribute, and otherwise exploit its
-+    Contributions, either on an unmodified basis, with Modifications, or
-+    as part of a Larger Work; and
-+
-+(b) under Patent Claims of such Contributor to make, use, sell, offer
-+    for sale, have made, import, and otherwise transfer either its
-+    Contributions or its Contributor Version.
-+
-+2.2. Effective Date
-+
-+The licenses granted in Section 2.1 with respect to any Contribution
-+become effective for each Contribution on the date the Contributor first
-+distributes such Contribution.
-+
-+2.3. Limitations on Grant Scope
-+
-+The licenses granted in this Section 2 are the only rights granted under
-+this License. No additional rights or licenses will be implied from the
-+distribution or licensing of Covered Software under this License.
-+Notwithstanding Section 2.1(b) above, no patent license is granted by a
-+Contributor:
-+
-+(a) for any code that a Contributor has removed from Covered Software;
-+    or
-+
-+(b) for infringements caused by: (i) Your and any other third party's
-+    modifications of Covered Software, or (ii) the combination of its
-+    Contributions with other software (except as part of its Contributor
-+    Version); or
-+
-+(c) under Patent Claims infringed by Covered Software in the absence of
-+    its Contributions.
-+
-+This License does not grant any rights in the trademarks, service marks,
-+or logos of any Contributor (except as may be necessary to comply with
-+the notice requirements in Section 3.4).
-+
-+2.4. Subsequent Licenses
-+
-+No Contributor makes additional grants as a result of Your choice to
-+distribute the Covered Software under a subsequent version of this
-+License (see Section 10.2) or under the terms of a Secondary License (if
-+permitted under the terms of Section 3.3).
-+
-+2.5. Representation
-+
-+Each Contributor represents that the Contributor believes its
-+Contributions are its original creation(s) or it has sufficient rights
-+to grant the rights to its Contributions conveyed by this License.
-+
-+2.6. Fair Use
-+
-+This License is not intended to limit any rights You have under
-+applicable copyright doctrines of fair use, fair dealing, or other
-+equivalents.
-+
-+2.7. Conditions
-+
-+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
-+in Section 2.1.
-+
-+3. Responsibilities
-+-------------------
-+
-+3.1. Distribution of Source Form
-+
-+All distribution of Covered Software in Source Code Form, including any
-+Modifications that You create or to which You contribute, must be under
-+the terms of this License. You must inform recipients that the Source
-+Code Form of the Covered Software is governed by the terms of this
-+License, and how they can obtain a copy of this License. You may not
-+attempt to alter or restrict the recipients' rights in the Source Code
-+Form.
-+
-+3.2. Distribution of Executable Form
-+
-+If You distribute Covered Software in Executable Form then:
-+
-+(a) such Covered Software must also be made available in Source Code
-+    Form, as described in Section 3.1, and You must inform recipients of
-+    the Executable Form how they can obtain a copy of such Source Code
-+    Form by reasonable means in a timely manner, at a charge no more
-+    than the cost of distribution to the recipient; and
-+
-+(b) You may distribute such Executable Form under the terms of this
-+    License, or sublicense it under different terms, provided that the
-+    license for the Executable Form does not attempt to limit or alter
-+    the recipients' rights in the Source Code Form under this License.
-+
-+3.3. Distribution of a Larger Work
-+
-+You may create and distribute a Larger Work under terms of Your choice,
-+provided that You also comply with the requirements of this License for
-+the Covered Software. If the Larger Work is a combination of Covered
-+Software with a work governed by one or more Secondary Licenses, and the
-+Covered Software is not Incompatible With Secondary Licenses, this
-+License permits You to additionally distribute such Covered Software
-+under the terms of such Secondary License(s), so that the recipient of
-+the Larger Work may, at their option, further distribute the Covered
-+Software under the terms of either this License or such Secondary
-+License(s).
-+
-+3.4. Notices
-+
-+You may not remove or alter the substance of any license notices
-+(including copyright notices, patent notices, disclaimers of warranty,
-+or limitations of liability) contained within the Source Code Form of
-+the Covered Software, except that You may alter any license notices to
-+the extent required to remedy known factual inaccuracies.
-+
-+3.5. Application of Additional Terms
-+
-+You may choose to offer, and to charge a fee for, warranty, support,
-+indemnity or liability obligations to one or more recipients of Covered
-+Software. However, You may do so only on Your own behalf, and not on
-+behalf of any Contributor. You must make it absolutely clear that any
-+such warranty, support, indemnity, or liability obligation is offered by
-+You alone, and You hereby agree to indemnify every Contributor for any
-+liability incurred by such Contributor as a result of warranty, support,
-+indemnity or liability terms You offer. You may include additional
-+disclaimers of warranty and limitations of liability specific to any
-+jurisdiction.
-+
-+4. Inability to Comply Due to Statute or Regulation
-+---------------------------------------------------
-+
-+If it is impossible for You to comply with any of the terms of this
-+License with respect to some or all of the Covered Software due to
-+statute, judicial order, or regulation then You must: (a) comply with
-+the terms of this License to the maximum extent possible; and (b)
-+describe the limitations and the code they affect. Such description must
-+be placed in a text file included with all distributions of the Covered
-+Software under this License. Except to the extent prohibited by statute
-+or regulation, such description must be sufficiently detailed for a
-+recipient of ordinary skill to be able to understand it.
-+
-+5. Termination
-+--------------
-+
-+5.1. The rights granted under this License will terminate automatically
-+if You fail to comply with any of its terms. However, if You become
-+compliant, then the rights granted under this License from a particular
-+Contributor are reinstated (a) provisionally, unless and until such
-+Contributor explicitly and finally terminates Your grants, and (b) on an
-+ongoing basis, if such Contributor fails to notify You of the
-+non-compliance by some reasonable means prior to 60 days after You have
-+come back into compliance. Moreover, Your grants from a particular
-+Contributor are reinstated on an ongoing basis if such Contributor
-+notifies You of the non-compliance by some reasonable means, this is the
-+first time You have received notice of non-compliance with this License
-+from such Contributor, and You become compliant prior to 30 days after
-+Your receipt of the notice.
-+
-+5.2. If You initiate litigation against any entity by asserting a patent
-+infringement claim (excluding declaratory judgment actions,
-+counter-claims, and cross-claims) alleging that a Contributor Version
-+directly or indirectly infringes any patent, then the rights granted to
-+You by any and all Contributors for the Covered Software under Section
-+2.1 of this License shall terminate.
-+
-+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
-+end user license agreements (excluding distributors and resellers) which
-+have been validly granted by You or Your distributors under this License
-+prior to termination shall survive termination.
-+
-+************************************************************************
-+*                                                                      *
-+*  6. Disclaimer of Warranty                                           *
-+*  -------------------------                                           *
-+*                                                                      *
-+*  Covered Software is provided under this License on an "as is"       *
-+*  basis, without warranty of any kind, either expressed, implied, or  *
-+*  statutory, including, without limitation, warranties that the       *
-+*  Covered Software is free of defects, merchantable, fit for a        *
-+*  particular purpose or non-infringing. The entire risk as to the     *
-+*  quality and performance of the Covered Software is with You.        *
-+*  Should any Covered Software prove defective in any respect, You     *
-+*  (not any Contributor) assume the cost of any necessary servicing,   *
-+*  repair, or correction. This disclaimer of warranty constitutes an   *
-+*  essential part of this License. No use of any Covered Software is   *
-+*  authorized under this License except under this disclaimer.         *
-+*                                                                      *
-+************************************************************************
-+
-+************************************************************************
-+*                                                                      *
-+*  7. Limitation of Liability                                          *
-+*  --------------------------                                          *
-+*                                                                      *
-+*  Under no circumstances and under no legal theory, whether tort      *
-+*  (including negligence), contract, or otherwise, shall any           *
-+*  Contributor, or anyone who distributes Covered Software as          *
-+*  permitted above, be liable to You for any direct, indirect,         *
-+*  special, incidental, or consequential damages of any character      *
-+*  including, without limitation, damages for lost profits, loss of    *
-+*  goodwill, work stoppage, computer failure or malfunction, or any    *
-+*  and all other commercial damages or losses, even if such party      *
-+*  shall have been informed of the possibility of such damages. This   *
-+*  limitation of liability shall not apply to liability for death or   *
-+*  personal injury resulting from such party's negligence to the       *
-+*  extent applicable law prohibits such limitation. Some               *
-+*  jurisdictions do not allow the exclusion or limitation of           *
-+*  incidental or consequential damages, so this exclusion and          *
-+*  limitation may not apply to You.                                    *
-+*                                                                      *
-+************************************************************************
-+
-+8. Litigation
-+-------------
-+
-+Any litigation relating to this License may be brought only in the
-+courts of a jurisdiction where the defendant maintains its principal
-+place of business and such litigation shall be governed by laws of that
-+jurisdiction, without reference to its conflict-of-law provisions.
-+Nothing in this Section shall prevent a party's ability to bring
-+cross-claims or counter-claims.
-+
-+9. Miscellaneous
-+----------------
-+
-+This License represents the complete agreement concerning the subject
-+matter hereof. If any provision of this License is held to be
-+unenforceable, such provision shall be reformed only to the extent
-+necessary to make it enforceable. Any law or regulation which provides
-+that the language of a contract shall be construed against the drafter
-+shall not be used to construe this License against a Contributor.
-+
-+10. Versions of the License
-+---------------------------
-+
-+10.1. New Versions
-+
-+Mozilla Foundation is the license steward. Except as provided in Section
-+10.3, no one other than the license steward has the right to modify or
-+publish new versions of this License. Each version will be given a
-+distinguishing version number.
-+
-+10.2. Effect of New Versions
-+
-+You may distribute the Covered Software under the terms of the version
-+of the License under which You originally received the Covered Software,
-+or under the terms of any subsequent version published by the license
-+steward.
-+
-+10.3. Modified Versions
-+
-+If you create software not governed by this License, and you want to
-+create a new license for such software, you may create and use a
-+modified version of this License if you rename the license and remove
-+any references to the name of the license steward (except to note that
-+such modified license differs from this License).
-+
-+10.4. Distributing Source Code Form that is Incompatible With Secondary
-+Licenses
-+
-+If You choose to distribute Source Code Form that is Incompatible With
-+Secondary Licenses under the terms of this version of the License, the
-+notice described in Exhibit B of this License must be attached.
-+
-+Exhibit A - Source Code Form License Notice
-+-------------------------------------------
-+
-+  This Source Code Form is subject to the terms of the Mozilla Public
-+  License, v. 2.0. If a copy of the MPL was not distributed with this
-+  file, You can obtain one at http://mozilla.org/MPL/2.0/.
-+
-+If it is not possible or desirable to put the notice in a particular
-+file, then You may include the notice in a location (such as a LICENSE
-+file in a relevant directory) where a recipient would be likely to look
-+for such a notice.
-+
-+You may add additional accurate notices of copyright ownership.
-+
-+Exhibit B - "Incompatible With Secondary Licenses" Notice
-+---------------------------------------------------------
-+
-+  This Source Code Form is "Incompatible With Secondary Licenses", as
-+  defined by the Mozilla Public License, v. 2.0.
diff --git a/crates/uniffi_macros/patches/mod_path.patch b/crates/uniffi_macros/patches/mod_path.patch
deleted file mode 100644
index 39eb133..0000000
--- a/crates/uniffi_macros/patches/mod_path.patch
+++ /dev/null
@@ -1,28 +0,0 @@
-diff --git a/src/util.rs b/src/util.rs
-index 3019c40..49a9651 100644
---- a/src/util.rs
-+++ b/src/util.rs
-@@ -18,7 +18,13 @@ pub fn manifest_path() -> Result<PathBuf, String> {
-     Ok(StdPath::new(&manifest_dir).join("Cargo.toml"))
- }
- 
--#[cfg(not(feature = "nightly"))]
-+#[cfg(soong)]
-+pub fn mod_path() -> syn::Result<String> {
-+    Ok(std::env::var("CARGO_CRATE_NAME")
-+        .expect("`CARGO_CRATE_NAME` should be set when building with Soong"))
-+}
-+
-+#[cfg(all(not(soong), not(feature = "nightly")))]
- pub fn mod_path() -> syn::Result<String> {
-     // Without the nightly feature and TokenStream::expand_expr, just return the crate name
- 
-@@ -64,7 +70,7 @@ pub fn mod_path() -> syn::Result<String> {
-         .map_err(|e| syn::Error::new(Span::call_site(), e))
- }
- 
--#[cfg(feature = "nightly")]
-+#[cfg(all(not(soong), feature = "nightly"))]
- pub fn mod_path() -> syn::Result<String> {
-     use proc_macro::TokenStream;
- 
diff --git a/crates/uniffi_macros/patches/update-toml.patch b/crates/uniffi_macros/patches/update-toml.patch
deleted file mode 100644
index 03ad81a..0000000
--- a/crates/uniffi_macros/patches/update-toml.patch
+++ /dev/null
@@ -1,14 +0,0 @@
---- a/src/util.rs	2006-07-24 03:21:28.000000000 +0200
-+++ b/src/util.rs	2024-03-21 14:59:03.494909986 +0100
-@@ -46,8 +46,9 @@
-     static LIB_CRATE_MOD_PATH: Lazy<Result<String, String>> = Lazy::new(|| {
-         let file = manifest_path()?;
-         let cargo_toml_bytes = fs::read(file).map_err(|e| e.to_string())?;
--
--        let cargo_toml = toml::from_slice::<CargoToml>(&cargo_toml_bytes)
-+        let cargo_toml_string = String::from_utf8(cargo_toml_bytes)
-+            .map_err(|e| format!("Could not UTF-8 decode `Cargo.toml`: {e}"))?;
-+        let cargo_toml = toml::from_str::<CargoToml>(&cargo_toml_string)
-             .map_err(|e| format!("Failed to parse `Cargo.toml`: {e}"))?;
- 
-         let lib_crate_name = cargo_toml
diff --git a/crates/uniffi_macros/src/custom.rs b/crates/uniffi_macros/src/custom.rs
deleted file mode 100644
index 9d8e5ac..0000000
--- a/crates/uniffi_macros/src/custom.rs
+++ /dev/null
@@ -1,85 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-use crate::util::{derive_all_ffi_traits, ident_to_string, mod_path, tagged_impl_header};
-use proc_macro2::{Ident, TokenStream};
-use quote::quote;
-use syn::Path;
-
-// Generate an FfiConverter impl based on the UniffiCustomTypeConverter
-// implementation that the library supplies
-pub(crate) fn expand_ffi_converter_custom_type(
-    ident: &Ident,
-    builtin: &Path,
-    udl_mode: bool,
-) -> syn::Result<TokenStream> {
-    let impl_spec = tagged_impl_header("FfiConverter", ident, udl_mode);
-    let derive_ffi_traits = derive_all_ffi_traits(ident, udl_mode);
-    let name = ident_to_string(ident);
-    let mod_path = mod_path()?;
-
-    Ok(quote! {
-        #[automatically_derived]
-        unsafe #impl_spec {
-            // Note: the builtin type needs to implement both `Lower` and `Lift'.  We use the
-            // `Lower` trait to get the associated type `FfiType` and const `TYPE_ID_META`.  These
-            // can't differ between `Lower` and `Lift`.
-            type FfiType = <#builtin as ::uniffi::Lower<crate::UniFfiTag>>::FfiType;
-            fn lower(obj: #ident ) -> Self::FfiType {
-                <#builtin as ::uniffi::Lower<crate::UniFfiTag>>::lower(<#ident as crate::UniffiCustomTypeConverter>::from_custom(obj))
-            }
-
-            fn try_lift(v: Self::FfiType) -> uniffi::Result<#ident> {
-                <#ident as crate::UniffiCustomTypeConverter>::into_custom(<#builtin as ::uniffi::Lift<crate::UniFfiTag>>::try_lift(v)?)
-            }
-
-            fn write(obj: #ident, buf: &mut Vec<u8>) {
-                <#builtin as ::uniffi::Lower<crate::UniFfiTag>>::write(<#ident as crate::UniffiCustomTypeConverter>::from_custom(obj), buf);
-            }
-
-            fn try_read(buf: &mut &[u8]) -> uniffi::Result<#ident> {
-                <#ident as crate::UniffiCustomTypeConverter>::into_custom(<#builtin as ::uniffi::Lift<crate::UniFfiTag>>::try_read(buf)?)
-            }
-
-            const TYPE_ID_META: ::uniffi::MetadataBuffer = ::uniffi::MetadataBuffer::from_code(::uniffi::metadata::codes::TYPE_CUSTOM)
-                .concat_str(#mod_path)
-                .concat_str(#name)
-                .concat(<#builtin as ::uniffi::Lower<crate::UniFfiTag>>::TYPE_ID_META);
-        }
-
-        #derive_ffi_traits
-    })
-}
-
-// Generate an FfiConverter impl *and* an UniffiCustomTypeConverter.
-pub(crate) fn expand_ffi_converter_custom_newtype(
-    ident: &Ident,
-    builtin: &Path,
-    udl_mode: bool,
-) -> syn::Result<TokenStream> {
-    let ffi_converter = expand_ffi_converter_custom_type(ident, builtin, udl_mode)?;
-    let type_converter = custom_ffi_type_converter(ident, builtin)?;
-
-    Ok(quote! {
-        #ffi_converter
-
-        #type_converter
-    })
-}
-
-fn custom_ffi_type_converter(ident: &Ident, builtin: &Path) -> syn::Result<TokenStream> {
-    Ok(quote! {
-        impl crate::UniffiCustomTypeConverter for #ident {
-            type Builtin = #builtin;
-
-            fn into_custom(val: Self::Builtin) -> uniffi::Result<Self> {
-                Ok(#ident(val))
-            }
-
-            fn from_custom(obj: Self) -> Self::Builtin {
-                obj.0
-            }
-        }
-    })
-}
diff --git a/crates/uniffi_macros/src/default.rs b/crates/uniffi_macros/src/default.rs
deleted file mode 100644
index 000c205..0000000
--- a/crates/uniffi_macros/src/default.rs
+++ /dev/null
@@ -1,133 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-use crate::util::kw;
-use proc_macro2::TokenStream;
-use quote::{quote, ToTokens};
-use syn::{
-    bracketed, parenthesized,
-    parse::{Nothing, Parse, ParseStream},
-    token::{Bracket, Paren},
-    Lit,
-};
-
-/// Default value
-#[derive(Clone)]
-pub enum DefaultValue {
-    Literal(Lit),
-    None(kw::None),
-    Some {
-        some: kw::Some,
-        paren: Paren,
-        inner: Box<DefaultValue>,
-    },
-    EmptySeq(Bracket),
-}
-
-impl ToTokens for DefaultValue {
-    fn to_tokens(&self, tokens: &mut TokenStream) {
-        match self {
-            DefaultValue::Literal(lit) => lit.to_tokens(tokens),
-            DefaultValue::None(kw) => kw.to_tokens(tokens),
-            DefaultValue::Some { inner, .. } => tokens.extend(quote! { Some(#inner) }),
-            DefaultValue::EmptySeq(_) => tokens.extend(quote! { [] }),
-        }
-    }
-}
-
-impl Parse for DefaultValue {
-    fn parse(input: ParseStream<'_>) -> syn::Result<Self> {
-        let lookahead = input.lookahead1();
-        if lookahead.peek(kw::None) {
-            let none_kw: kw::None = input.parse()?;
-            Ok(Self::None(none_kw))
-        } else if lookahead.peek(kw::Some) {
-            let some: kw::Some = input.parse()?;
-            let content;
-            let paren = parenthesized!(content in input);
-            Ok(Self::Some {
-                some,
-                paren,
-                inner: content.parse()?,
-            })
-        } else if lookahead.peek(Bracket) {
-            let content;
-            let bracket = bracketed!(content in input);
-            content.parse::<Nothing>()?;
-            Ok(Self::EmptySeq(bracket))
-        } else {
-            Ok(Self::Literal(input.parse()?))
-        }
-    }
-}
-
-impl DefaultValue {
-    fn metadata_calls(&self) -> syn::Result<TokenStream> {
-        match self {
-            DefaultValue::Literal(Lit::Int(i)) if !i.suffix().is_empty() => Err(
-                syn::Error::new_spanned(i, "integer literals with suffix not supported here"),
-            ),
-            DefaultValue::Literal(Lit::Float(f)) if !f.suffix().is_empty() => Err(
-                syn::Error::new_spanned(f, "float literals with suffix not supported here"),
-            ),
-
-            DefaultValue::Literal(Lit::Str(s)) => Ok(quote! {
-                .concat_value(::uniffi::metadata::codes::LIT_STR)
-                .concat_str(#s)
-            }),
-            DefaultValue::Literal(Lit::Int(i)) => {
-                let digits = i.base10_digits();
-                Ok(quote! {
-                    .concat_value(::uniffi::metadata::codes::LIT_INT)
-                    .concat_str(#digits)
-                })
-            }
-            DefaultValue::Literal(Lit::Float(f)) => {
-                let digits = f.base10_digits();
-                Ok(quote! {
-                    .concat_value(::uniffi::metadata::codes::LIT_FLOAT)
-                    .concat_str(#digits)
-                })
-            }
-            DefaultValue::Literal(Lit::Bool(b)) => Ok(quote! {
-                .concat_value(::uniffi::metadata::codes::LIT_BOOL)
-                .concat_bool(#b)
-            }),
-
-            DefaultValue::Literal(_) => Err(syn::Error::new_spanned(
-                self,
-                "this type of literal is not currently supported as a default",
-            )),
-
-            DefaultValue::EmptySeq(_) => Ok(quote! {
-                .concat_value(::uniffi::metadata::codes::LIT_EMPTY_SEQ)
-            }),
-
-            DefaultValue::None(_) => Ok(quote! {
-                .concat_value(::uniffi::metadata::codes::LIT_NONE)
-            }),
-
-            DefaultValue::Some { inner, .. } => {
-                let inner_calls = inner.metadata_calls()?;
-                Ok(quote! {
-                    .concat_value(::uniffi::metadata::codes::LIT_SOME)
-                    #inner_calls
-                })
-            }
-        }
-    }
-}
-
-pub fn default_value_metadata_calls(default: &Option<DefaultValue>) -> syn::Result<TokenStream> {
-    Ok(match default {
-        Some(default) => {
-            let metadata_calls = default.metadata_calls()?;
-            quote! {
-                .concat_bool(true)
-                #metadata_calls
-            }
-        }
-        None => quote! { .concat_bool(false) },
-    })
-}
diff --git a/crates/uniffi_macros/src/enum_.rs b/crates/uniffi_macros/src/enum_.rs
deleted file mode 100644
index fd98da3..0000000
--- a/crates/uniffi_macros/src/enum_.rs
+++ /dev/null
@@ -1,371 +0,0 @@
-use proc_macro2::{Ident, Span, TokenStream};
-use quote::quote;
-use syn::{
-    parse::{Parse, ParseStream},
-    spanned::Spanned,
-    Attribute, Data, DataEnum, DeriveInput, Expr, Index, Lit, Variant,
-};
-
-use crate::util::{
-    create_metadata_items, derive_all_ffi_traits, either_attribute_arg, extract_docstring,
-    ident_to_string, kw, mod_path, parse_comma_separated, tagged_impl_header,
-    try_metadata_value_from_usize, try_read_field, AttributeSliceExt, UniffiAttributeArgs,
-};
-
-fn extract_repr(attrs: &[Attribute]) -> syn::Result<Option<Ident>> {
-    let mut result = None;
-    for attr in attrs {
-        if attr.path().is_ident("repr") {
-            attr.parse_nested_meta(|meta| {
-                result = match meta.path.get_ident() {
-                    Some(i) => {
-                        let s = i.to_string();
-                        match s.as_str() {
-                            "u8" | "u16" | "u32" | "u64" | "usize" | "i8" | "i16" | "i32"
-                            | "i64" | "isize" => Some(i.clone()),
-                            // while the default repr for an enum is `isize` we don't apply that default here.
-                            _ => None,
-                        }
-                    }
-                    _ => None,
-                };
-                Ok(())
-            })?
-        }
-    }
-    Ok(result)
-}
-
-pub fn expand_enum(
-    input: DeriveInput,
-    // Attributes from #[derive_error_for_udl()], if we are in udl mode
-    attr_from_udl_mode: Option<EnumAttr>,
-    udl_mode: bool,
-) -> syn::Result<TokenStream> {
-    let enum_ = match input.data {
-        Data::Enum(e) => e,
-        _ => {
-            return Err(syn::Error::new(
-                Span::call_site(),
-                "This derive must only be used on enums",
-            ))
-        }
-    };
-    let ident = &input.ident;
-    let docstring = extract_docstring(&input.attrs)?;
-    let discr_type = extract_repr(&input.attrs)?;
-    let mut attr: EnumAttr = input.attrs.parse_uniffi_attr_args()?;
-    if let Some(attr_from_udl_mode) = attr_from_udl_mode {
-        attr = attr.merge(attr_from_udl_mode)?;
-    }
-    let ffi_converter_impl = enum_ffi_converter_impl(ident, &enum_, udl_mode, &attr);
-
-    let meta_static_var = (!udl_mode).then(|| {
-        enum_meta_static_var(ident, docstring, discr_type, &enum_, &attr)
-            .unwrap_or_else(syn::Error::into_compile_error)
-    });
-
-    Ok(quote! {
-        #ffi_converter_impl
-        #meta_static_var
-    })
-}
-
-pub(crate) fn enum_ffi_converter_impl(
-    ident: &Ident,
-    enum_: &DataEnum,
-    udl_mode: bool,
-    attr: &EnumAttr,
-) -> TokenStream {
-    enum_or_error_ffi_converter_impl(
-        ident,
-        enum_,
-        udl_mode,
-        attr,
-        quote! { ::uniffi::metadata::codes::TYPE_ENUM },
-    )
-}
-
-pub(crate) fn rich_error_ffi_converter_impl(
-    ident: &Ident,
-    enum_: &DataEnum,
-    udl_mode: bool,
-    attr: &EnumAttr,
-) -> TokenStream {
-    enum_or_error_ffi_converter_impl(
-        ident,
-        enum_,
-        udl_mode,
-        attr,
-        quote! { ::uniffi::metadata::codes::TYPE_ENUM },
-    )
-}
-
-fn enum_or_error_ffi_converter_impl(
-    ident: &Ident,
-    enum_: &DataEnum,
-    udl_mode: bool,
-    attr: &EnumAttr,
-    metadata_type_code: TokenStream,
-) -> TokenStream {
-    let name = ident_to_string(ident);
-    let impl_spec = tagged_impl_header("FfiConverter", ident, udl_mode);
-    let derive_ffi_traits = derive_all_ffi_traits(ident, udl_mode);
-    let mod_path = match mod_path() {
-        Ok(p) => p,
-        Err(e) => return e.into_compile_error(),
-    };
-    let mut write_match_arms: Vec<_> = enum_
-        .variants
-        .iter()
-        .enumerate()
-        .map(|(i, v)| {
-            let v_ident = &v.ident;
-            let field_idents = v
-                .fields
-                .iter()
-                .enumerate()
-                .map(|(i, f)| {
-                    f.ident
-                        .clone()
-                        .unwrap_or_else(|| Ident::new(&format!("e{i}"), f.span()))
-                })
-                .collect::<Vec<Ident>>();
-            let idx = Index::from(i + 1);
-            let write_fields =
-                std::iter::zip(v.fields.iter(), field_idents.iter()).map(|(f, ident)| {
-                    let ty = &f.ty;
-                    quote! {
-                        <#ty as ::uniffi::Lower<crate::UniFfiTag>>::write(#ident, buf);
-                    }
-                });
-            let is_tuple = v.fields.iter().any(|f| f.ident.is_none());
-            let fields = if is_tuple {
-                quote! { ( #(#field_idents),* ) }
-            } else {
-                quote! { { #(#field_idents),* } }
-            };
-
-            quote! {
-                Self::#v_ident #fields => {
-                    ::uniffi::deps::bytes::BufMut::put_i32(buf, #idx);
-                    #(#write_fields)*
-                }
-            }
-        })
-        .collect();
-    if attr.non_exhaustive.is_some() {
-        write_match_arms.push(quote! {
-            _ => panic!("Unexpected variant in non-exhaustive enum"),
-        })
-    }
-    let write_impl = quote! {
-        match obj { #(#write_match_arms)* }
-    };
-
-    let try_read_match_arms = enum_.variants.iter().enumerate().map(|(i, v)| {
-        let idx = Index::from(i + 1);
-        let v_ident = &v.ident;
-        let is_tuple = v.fields.iter().any(|f| f.ident.is_none());
-        let try_read_fields = v.fields.iter().map(try_read_field);
-
-        if is_tuple {
-            quote! {
-                #idx => Self::#v_ident ( #(#try_read_fields)* ),
-            }
-        } else {
-            quote! {
-                #idx => Self::#v_ident { #(#try_read_fields)* },
-            }
-        }
-    });
-    let error_format_string = format!("Invalid {ident} enum value: {{}}");
-    let try_read_impl = quote! {
-        ::uniffi::check_remaining(buf, 4)?;
-
-        Ok(match ::uniffi::deps::bytes::Buf::get_i32(buf) {
-            #(#try_read_match_arms)*
-            v => ::uniffi::deps::anyhow::bail!(#error_format_string, v),
-        })
-    };
-
-    quote! {
-        #[automatically_derived]
-        unsafe #impl_spec {
-            ::uniffi::ffi_converter_rust_buffer_lift_and_lower!(crate::UniFfiTag);
-
-            fn write(obj: Self, buf: &mut ::std::vec::Vec<u8>) {
-                #write_impl
-            }
-
-            fn try_read(buf: &mut &[::std::primitive::u8]) -> ::uniffi::deps::anyhow::Result<Self> {
-                #try_read_impl
-            }
-
-            const TYPE_ID_META: ::uniffi::MetadataBuffer = ::uniffi::MetadataBuffer::from_code(#metadata_type_code)
-                .concat_str(#mod_path)
-                .concat_str(#name);
-        }
-
-        #derive_ffi_traits
-    }
-}
-
-pub(crate) fn enum_meta_static_var(
-    ident: &Ident,
-    docstring: String,
-    discr_type: Option<Ident>,
-    enum_: &DataEnum,
-    attr: &EnumAttr,
-) -> syn::Result<TokenStream> {
-    let name = ident_to_string(ident);
-    let module_path = mod_path()?;
-    let non_exhaustive = attr.non_exhaustive.is_some();
-
-    let mut metadata_expr = quote! {
-        ::uniffi::MetadataBuffer::from_code(::uniffi::metadata::codes::ENUM)
-            .concat_str(#module_path)
-            .concat_str(#name)
-            .concat_option_bool(None) // forced_flatness
-    };
-    metadata_expr.extend(match discr_type {
-        None => quote! { .concat_bool(false) },
-        Some(t) => quote! { .concat_bool(true).concat(<#t as ::uniffi::Lower<crate::UniFfiTag>>::TYPE_ID_META) }
-    });
-    metadata_expr.extend(variant_metadata(enum_)?);
-    metadata_expr.extend(quote! {
-        .concat_bool(#non_exhaustive)
-        .concat_long_str(#docstring)
-    });
-    Ok(create_metadata_items("enum", &name, metadata_expr, None))
-}
-
-fn variant_value(v: &Variant) -> syn::Result<TokenStream> {
-    let Some((_, e)) = &v.discriminant else {
-        return Ok(quote! { .concat_bool(false) });
-    };
-    // Attempting to expose an enum value which we don't understand is a hard-error
-    // rather than silently ignoring it. If we had the ability to emit a warning that
-    // might make more sense.
-
-    // We can't sanely handle most expressions other than literals, but we can handle
-    // negative literals.
-    let mut negate = false;
-    let lit = match e {
-        Expr::Lit(lit) => lit,
-        Expr::Unary(expr_unary) if matches!(expr_unary.op, syn::UnOp::Neg(_)) => {
-            negate = true;
-            match *expr_unary.expr {
-                Expr::Lit(ref lit) => lit,
-                _ => {
-                    return Err(syn::Error::new_spanned(
-                        e,
-                        "UniFFI disciminant values must be a literal",
-                    ));
-                }
-            }
-        }
-        _ => {
-            return Err(syn::Error::new_spanned(
-                e,
-                "UniFFI disciminant values must be a literal",
-            ));
-        }
-    };
-    let Lit::Int(ref intlit) = lit.lit else {
-        return Err(syn::Error::new_spanned(
-            v,
-            "UniFFI disciminant values must be a literal integer",
-        ));
-    };
-    if !intlit.suffix().is_empty() {
-        return Err(syn::Error::new_spanned(
-            intlit,
-            "integer literals with suffix not supported by UniFFI here",
-        ));
-    }
-    let digits = if negate {
-        format!("-{}", intlit.base10_digits())
-    } else {
-        intlit.base10_digits().to_string()
-    };
-    Ok(quote! {
-        .concat_bool(true)
-        .concat_value(::uniffi::metadata::codes::LIT_INT)
-        .concat_str(#digits)
-    })
-}
-
-pub fn variant_metadata(enum_: &DataEnum) -> syn::Result<Vec<TokenStream>> {
-    let variants_len =
-        try_metadata_value_from_usize(enum_.variants.len(), "UniFFI limits enums to 256 variants")?;
-    std::iter::once(Ok(quote! { .concat_value(#variants_len) }))
-        .chain(enum_.variants.iter().map(|v| {
-            let fields_len = try_metadata_value_from_usize(
-                v.fields.len(),
-                "UniFFI limits enum variants to 256 fields",
-            )?;
-
-            let field_names = v
-                .fields
-                .iter()
-                .map(|f| f.ident.as_ref().map(ident_to_string).unwrap_or_default())
-                .collect::<Vec<_>>();
-
-            let name = ident_to_string(&v.ident);
-            let value_tokens = variant_value(v)?;
-            let docstring = extract_docstring(&v.attrs)?;
-            let field_types = v.fields.iter().map(|f| &f.ty);
-            let field_docstrings = v
-                .fields
-                .iter()
-                .map(|f| extract_docstring(&f.attrs))
-                .collect::<syn::Result<Vec<_>>>()?;
-
-            Ok(quote! {
-                .concat_str(#name)
-                #value_tokens
-                .concat_value(#fields_len)
-                    #(
-                        .concat_str(#field_names)
-                        .concat(<#field_types as ::uniffi::Lower<crate::UniFfiTag>>::TYPE_ID_META)
-                        // field defaults not yet supported for enums
-                        .concat_bool(false)
-                        .concat_long_str(#field_docstrings)
-                    )*
-                .concat_long_str(#docstring)
-            })
-        }))
-        .collect()
-}
-
-#[derive(Default)]
-pub struct EnumAttr {
-    pub non_exhaustive: Option<kw::non_exhaustive>,
-}
-
-// So ErrorAttr can be used with `parse_macro_input!`
-impl Parse for EnumAttr {
-    fn parse(input: ParseStream<'_>) -> syn::Result<Self> {
-        parse_comma_separated(input)
-    }
-}
-
-impl UniffiAttributeArgs for EnumAttr {
-    fn parse_one(input: ParseStream<'_>) -> syn::Result<Self> {
-        let lookahead = input.lookahead1();
-        if lookahead.peek(kw::non_exhaustive) {
-            Ok(Self {
-                non_exhaustive: input.parse()?,
-            })
-        } else {
-            Err(lookahead.error())
-        }
-    }
-
-    fn merge(self, other: Self) -> syn::Result<Self> {
-        Ok(Self {
-            non_exhaustive: either_attribute_arg(self.non_exhaustive, other.non_exhaustive)?,
-        })
-    }
-}
diff --git a/crates/uniffi_macros/src/error.rs b/crates/uniffi_macros/src/error.rs
deleted file mode 100644
index 804b438..0000000
--- a/crates/uniffi_macros/src/error.rs
+++ /dev/null
@@ -1,312 +0,0 @@
-use proc_macro2::{Ident, Span, TokenStream};
-use quote::quote;
-use syn::{
-    parse::{Parse, ParseStream},
-    Data, DataEnum, DeriveInput, Index,
-};
-
-use crate::{
-    enum_::{rich_error_ffi_converter_impl, variant_metadata, EnumAttr},
-    util::{
-        chain, create_metadata_items, derive_ffi_traits, either_attribute_arg, extract_docstring,
-        ident_to_string, kw, mod_path, parse_comma_separated, tagged_impl_header,
-        try_metadata_value_from_usize, AttributeSliceExt, UniffiAttributeArgs,
-    },
-};
-
-pub fn expand_error(
-    input: DeriveInput,
-    // Attributes from #[derive_error_for_udl()], if we are in udl mode
-    attr_from_udl_mode: Option<ErrorAttr>,
-    udl_mode: bool,
-) -> syn::Result<TokenStream> {
-    let enum_ = match input.data {
-        Data::Enum(e) => e,
-        _ => {
-            return Err(syn::Error::new(
-                Span::call_site(),
-                "This derive currently only supports enums",
-            ));
-        }
-    };
-    let ident = &input.ident;
-    let docstring = extract_docstring(&input.attrs)?;
-    let mut attr: ErrorAttr = input.attrs.parse_uniffi_attr_args()?;
-    if let Some(attr_from_udl_mode) = attr_from_udl_mode {
-        attr = attr.merge(attr_from_udl_mode)?;
-    }
-    let ffi_converter_impl = error_ffi_converter_impl(ident, &enum_, &attr, udl_mode)?;
-    let meta_static_var = (!udl_mode).then(|| {
-        error_meta_static_var(ident, docstring, &enum_, &attr)
-            .unwrap_or_else(syn::Error::into_compile_error)
-    });
-
-    let variant_errors: TokenStream = enum_
-        .variants
-        .iter()
-        .flat_map(|variant| {
-            chain(
-                variant.attrs.uniffi_attr_args_not_allowed_here(),
-                variant
-                    .fields
-                    .iter()
-                    .flat_map(|field| field.attrs.uniffi_attr_args_not_allowed_here()),
-            )
-        })
-        .map(syn::Error::into_compile_error)
-        .collect();
-
-    Ok(quote! {
-        #ffi_converter_impl
-        #meta_static_var
-        #variant_errors
-    })
-}
-
-fn error_ffi_converter_impl(
-    ident: &Ident,
-    enum_: &DataEnum,
-    attr: &ErrorAttr,
-    udl_mode: bool,
-) -> syn::Result<TokenStream> {
-    Ok(if attr.flat.is_some() {
-        flat_error_ffi_converter_impl(ident, enum_, udl_mode, attr)
-    } else {
-        rich_error_ffi_converter_impl(ident, enum_, udl_mode, &attr.clone().try_into()?)
-    })
-}
-
-// FfiConverters for "flat errors"
-//
-// These are errors where we only lower the to_string() value, rather than any associated data.
-// We lower the to_string() value unconditionally, whether the enum has associated data or not.
-fn flat_error_ffi_converter_impl(
-    ident: &Ident,
-    enum_: &DataEnum,
-    udl_mode: bool,
-    attr: &ErrorAttr,
-) -> TokenStream {
-    let name = ident_to_string(ident);
-    let lower_impl_spec = tagged_impl_header("Lower", ident, udl_mode);
-    let lift_impl_spec = tagged_impl_header("Lift", ident, udl_mode);
-    let derive_ffi_traits = derive_ffi_traits(ident, udl_mode, &["ConvertError"]);
-    let mod_path = match mod_path() {
-        Ok(p) => p,
-        Err(e) => return e.into_compile_error(),
-    };
-
-    let lower_impl = {
-        let mut match_arms: Vec<_> = enum_.variants.iter().enumerate().map(|(i, v)| {
-            let v_ident = &v.ident;
-            let idx = Index::from(i + 1);
-
-            quote! {
-                Self::#v_ident { .. } => {
-                    ::uniffi::deps::bytes::BufMut::put_i32(buf, #idx);
-                    <::std::string::String as ::uniffi::Lower<crate::UniFfiTag>>::write(error_msg, buf);
-                }
-            }
-        }).collect();
-        if attr.non_exhaustive.is_some() {
-            match_arms.push(quote! {
-                _ => panic!("Unexpected variant in non-exhaustive enum"),
-            })
-        }
-
-        quote! {
-            #[automatically_derived]
-            unsafe #lower_impl_spec {
-                type FfiType = ::uniffi::RustBuffer;
-
-                fn write(obj: Self, buf: &mut ::std::vec::Vec<u8>) {
-                    let error_msg = ::std::string::ToString::to_string(&obj);
-                    match obj { #(#match_arms)* }
-                }
-
-                fn lower(obj: Self) -> ::uniffi::RustBuffer {
-                    <Self as ::uniffi::Lower<crate::UniFfiTag>>::lower_into_rust_buffer(obj)
-                }
-
-                const TYPE_ID_META: ::uniffi::MetadataBuffer = ::uniffi::MetadataBuffer::from_code(::uniffi::metadata::codes::TYPE_ENUM)
-                    .concat_str(#mod_path)
-                    .concat_str(#name);
-            }
-        }
-    };
-
-    let lift_impl = if attr.with_try_read.is_some() {
-        let match_arms = enum_.variants.iter().enumerate().map(|(i, v)| {
-            let v_ident = &v.ident;
-            let idx = Index::from(i + 1);
-
-            quote! {
-                #idx => Self::#v_ident,
-            }
-        });
-        quote! {
-            #[automatically_derived]
-            unsafe #lift_impl_spec {
-                type FfiType = ::uniffi::RustBuffer;
-
-                fn try_read(buf: &mut &[::std::primitive::u8]) -> ::uniffi::deps::anyhow::Result<Self> {
-                    Ok(match ::uniffi::deps::bytes::Buf::get_i32(buf) {
-                        #(#match_arms)*
-                        v => ::uniffi::deps::anyhow::bail!("Invalid #ident enum value: {}", v),
-                    })
-                }
-
-                fn try_lift(v: ::uniffi::RustBuffer) -> ::uniffi::deps::anyhow::Result<Self> {
-                    <Self as ::uniffi::Lift<crate::UniFfiTag>>::try_lift_from_rust_buffer(v)
-                }
-
-                const TYPE_ID_META: ::uniffi::MetadataBuffer = <Self as ::uniffi::Lower<crate::UniFfiTag>>::TYPE_ID_META;
-            }
-
-        }
-    } else {
-        quote! {
-            // Lifting flat errors is not currently supported, but we still define the trait so
-            // that dicts containing flat errors don't cause compile errors (see ReturnOnlyDict in
-            // coverall.rs).
-            //
-            // Note: it would be better to not derive `Lift` for dictionaries containing flat
-            // errors, but getting the trait bounds and derived impls there would be much harder.
-            // For now, we just fail at runtime.
-            #[automatically_derived]
-            unsafe #lift_impl_spec {
-                type FfiType = ::uniffi::RustBuffer;
-
-                fn try_read(buf: &mut &[::std::primitive::u8]) -> ::uniffi::deps::anyhow::Result<Self> {
-                    panic!("Can't lift flat errors")
-                }
-
-                fn try_lift(v: ::uniffi::RustBuffer) -> ::uniffi::deps::anyhow::Result<Self> {
-                    panic!("Can't lift flat errors")
-                }
-
-                const TYPE_ID_META: ::uniffi::MetadataBuffer = <Self as ::uniffi::Lower<crate::UniFfiTag>>::TYPE_ID_META;
-            }
-        }
-    };
-
-    quote! {
-        #lower_impl
-        #lift_impl
-        #derive_ffi_traits
-    }
-}
-
-pub(crate) fn error_meta_static_var(
-    ident: &Ident,
-    docstring: String,
-    enum_: &DataEnum,
-    attr: &ErrorAttr,
-) -> syn::Result<TokenStream> {
-    let name = ident_to_string(ident);
-    let module_path = mod_path()?;
-    let flat = attr.flat.is_some();
-    let non_exhaustive = attr.non_exhaustive.is_some();
-    let mut metadata_expr = quote! {
-            ::uniffi::MetadataBuffer::from_code(::uniffi::metadata::codes::ENUM)
-                .concat_str(#module_path)
-                .concat_str(#name)
-                .concat_option_bool(Some(#flat))
-                .concat_bool(false) // discr_type: None
-    };
-    if flat {
-        metadata_expr.extend(flat_error_variant_metadata(enum_)?)
-    } else {
-        metadata_expr.extend(variant_metadata(enum_)?);
-    }
-    metadata_expr.extend(quote! {
-        .concat_bool(#non_exhaustive)
-        .concat_long_str(#docstring)
-    });
-    Ok(create_metadata_items("error", &name, metadata_expr, None))
-}
-
-pub fn flat_error_variant_metadata(enum_: &DataEnum) -> syn::Result<Vec<TokenStream>> {
-    let variants_len =
-        try_metadata_value_from_usize(enum_.variants.len(), "UniFFI limits enums to 256 variants")?;
-    std::iter::once(Ok(quote! { .concat_value(#variants_len) }))
-        .chain(enum_.variants.iter().map(|v| {
-            let name = ident_to_string(&v.ident);
-            let docstring = extract_docstring(&v.attrs)?;
-            Ok(quote! {
-                .concat_str(#name)
-                .concat_long_str(#docstring)
-            })
-        }))
-        .collect()
-}
-
-#[derive(Clone, Default)]
-pub struct ErrorAttr {
-    pub flat: Option<kw::flat_error>,
-    pub with_try_read: Option<kw::with_try_read>,
-    pub non_exhaustive: Option<kw::non_exhaustive>,
-}
-
-impl UniffiAttributeArgs for ErrorAttr {
-    fn parse_one(input: ParseStream<'_>) -> syn::Result<Self> {
-        let lookahead = input.lookahead1();
-        if lookahead.peek(kw::flat_error) {
-            Ok(Self {
-                flat: input.parse()?,
-                ..Self::default()
-            })
-        } else if lookahead.peek(kw::with_try_read) {
-            Ok(Self {
-                with_try_read: input.parse()?,
-                ..Self::default()
-            })
-        } else if lookahead.peek(kw::non_exhaustive) {
-            Ok(Self {
-                non_exhaustive: input.parse()?,
-                ..Self::default()
-            })
-        } else if lookahead.peek(kw::handle_unknown_callback_error) {
-            // Not used anymore, but still allowed
-            Ok(Self::default())
-        } else {
-            Err(lookahead.error())
-        }
-    }
-
-    fn merge(self, other: Self) -> syn::Result<Self> {
-        Ok(Self {
-            flat: either_attribute_arg(self.flat, other.flat)?,
-            with_try_read: either_attribute_arg(self.with_try_read, other.with_try_read)?,
-            non_exhaustive: either_attribute_arg(self.non_exhaustive, other.non_exhaustive)?,
-        })
-    }
-}
-
-// So ErrorAttr can be used with `parse_macro_input!`
-impl Parse for ErrorAttr {
-    fn parse(input: ParseStream<'_>) -> syn::Result<Self> {
-        parse_comma_separated(input)
-    }
-}
-
-impl TryFrom<ErrorAttr> for EnumAttr {
-    type Error = syn::Error;
-
-    fn try_from(error_attr: ErrorAttr) -> Result<Self, Self::Error> {
-        if error_attr.flat.is_some() {
-            Err(syn::Error::new(
-                Span::call_site(),
-                "flat attribute not valid for rich enum errors",
-            ))
-        } else if error_attr.with_try_read.is_some() {
-            Err(syn::Error::new(
-                Span::call_site(),
-                "with_try_read attribute not valid for rich enum errors",
-            ))
-        } else {
-            Ok(EnumAttr {
-                non_exhaustive: error_attr.non_exhaustive,
-            })
-        }
-    }
-}
diff --git a/crates/uniffi_macros/src/export.rs b/crates/uniffi_macros/src/export.rs
deleted file mode 100644
index 41657a6..0000000
--- a/crates/uniffi_macros/src/export.rs
+++ /dev/null
@@ -1,182 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-use proc_macro2::TokenStream;
-use quote::{quote, quote_spanned};
-use syn::{visit_mut::VisitMut, Item, Type};
-
-mod attributes;
-mod callback_interface;
-mod item;
-mod scaffolding;
-mod trait_interface;
-mod utrait;
-
-use self::{
-    item::{ExportItem, ImplItem},
-    scaffolding::{
-        gen_constructor_scaffolding, gen_ffi_function, gen_fn_scaffolding, gen_method_scaffolding,
-    },
-};
-use crate::util::{ident_to_string, mod_path};
-pub use attributes::{DefaultMap, ExportFnArgs, ExportedImplFnArgs};
-pub use callback_interface::ffi_converter_callback_interface_impl;
-
-// TODO(jplatte): Ensure no generics, …
-// TODO(jplatte): Aggregate errors instead of short-circuiting, wherever possible
-
-pub(crate) fn expand_export(
-    mut item: Item,
-    all_args: proc_macro::TokenStream,
-    udl_mode: bool,
-) -> syn::Result<TokenStream> {
-    let mod_path = mod_path()?;
-    // If the input is an `impl` block, rewrite any uses of the `Self` type
-    // alias to the actual type, so we don't have to special-case it in the
-    // metadata collection or scaffolding code generation (which generates
-    // new functions outside of the `impl`).
-    rewrite_self_type(&mut item);
-
-    let metadata = ExportItem::new(item, all_args)?;
-
-    match metadata {
-        ExportItem::Function { sig, args } => {
-            gen_fn_scaffolding(sig, &args.async_runtime, udl_mode)
-        }
-        ExportItem::Impl {
-            items,
-            self_ident,
-            args,
-        } => {
-            if let Some(rt) = &args.async_runtime {
-                if items
-                    .iter()
-                    .all(|item| !matches!(item, ImplItem::Method(sig) if sig.is_async))
-                {
-                    return Err(syn::Error::new_spanned(
-                        rt,
-                        "no async methods in this impl block",
-                    ));
-                }
-            }
-
-            let item_tokens: TokenStream = items
-                .into_iter()
-                .map(|item| match item {
-                    ImplItem::Constructor(sig) => {
-                        gen_constructor_scaffolding(sig, &args.async_runtime, udl_mode)
-                    }
-                    ImplItem::Method(sig) => {
-                        gen_method_scaffolding(sig, &args.async_runtime, udl_mode)
-                    }
-                })
-                .collect::<syn::Result<_>>()?;
-            Ok(quote_spanned! { self_ident.span() => #item_tokens })
-        }
-        ExportItem::Trait {
-            items,
-            self_ident,
-            with_foreign,
-            callback_interface_only: false,
-            docstring,
-            args,
-        } => trait_interface::gen_trait_scaffolding(
-            &mod_path,
-            args,
-            self_ident,
-            items,
-            udl_mode,
-            with_foreign,
-            docstring,
-        ),
-        ExportItem::Trait {
-            items,
-            self_ident,
-            callback_interface_only: true,
-            docstring,
-            ..
-        } => {
-            let trait_name = ident_to_string(&self_ident);
-            let trait_impl_ident = callback_interface::trait_impl_ident(&trait_name);
-            let trait_impl = callback_interface::trait_impl(&mod_path, &self_ident, &items)
-                .unwrap_or_else(|e| e.into_compile_error());
-            let metadata_items = (!udl_mode).then(|| {
-                let items =
-                    callback_interface::metadata_items(&self_ident, &items, &mod_path, docstring)
-                        .unwrap_or_else(|e| vec![e.into_compile_error()]);
-                quote! { #(#items)* }
-            });
-            let ffi_converter_tokens =
-                ffi_converter_callback_interface_impl(&self_ident, &trait_impl_ident, udl_mode);
-
-            Ok(quote! {
-                #trait_impl
-
-                #ffi_converter_tokens
-
-                #metadata_items
-            })
-        }
-        ExportItem::Struct {
-            self_ident,
-            uniffi_traits,
-            ..
-        } => {
-            assert!(!udl_mode);
-            utrait::expand_uniffi_trait_export(self_ident, uniffi_traits)
-        }
-    }
-}
-
-/// Rewrite Self type alias usage in an impl block to the type itself.
-///
-/// For example,
-///
-/// ```ignore
-/// impl some::module::Foo {
-///     fn method(
-///         self: Arc<Self>,
-///         arg: Option<Bar<(), Self>>,
-///     ) -> Result<Self, Error> {
-///         todo!()
-///     }
-/// }
-/// ```
-///
-/// will be rewritten to
-///
-///  ```ignore
-/// impl some::module::Foo {
-///     fn method(
-///         self: Arc<some::module::Foo>,
-///         arg: Option<Bar<(), some::module::Foo>>,
-///     ) -> Result<some::module::Foo, Error> {
-///         todo!()
-///     }
-/// }
-/// ```
-pub fn rewrite_self_type(item: &mut Item) {
-    let item = match item {
-        Item::Impl(i) => i,
-        _ => return,
-    };
-
-    struct RewriteSelfVisitor<'a>(&'a Type);
-
-    impl<'a> VisitMut for RewriteSelfVisitor<'a> {
-        fn visit_type_mut(&mut self, i: &mut Type) {
-            match i {
-                Type::Path(p) if p.qself.is_none() && p.path.is_ident("Self") => {
-                    *i = self.0.clone();
-                }
-                _ => syn::visit_mut::visit_type_mut(self, i),
-            }
-        }
-    }
-
-    let mut visitor = RewriteSelfVisitor(&item.self_ty);
-    for item in &mut item.items {
-        visitor.visit_impl_item_mut(item);
-    }
-}
diff --git a/crates/uniffi_macros/src/export/attributes.rs b/crates/uniffi_macros/src/export/attributes.rs
deleted file mode 100644
index be7e890..0000000
--- a/crates/uniffi_macros/src/export/attributes.rs
+++ /dev/null
@@ -1,403 +0,0 @@
-use std::collections::{HashMap, HashSet};
-
-use crate::{
-    default::DefaultValue,
-    util::{either_attribute_arg, kw, parse_comma_separated, UniffiAttributeArgs},
-};
-
-use proc_macro2::TokenStream;
-use quote::ToTokens;
-use syn::{
-    parenthesized,
-    parse::{Parse, ParseStream},
-    Attribute, Ident, LitStr, Meta, PathArguments, PathSegment, Token,
-};
-use uniffi_meta::UniffiTraitDiscriminants;
-
-#[derive(Default)]
-pub struct ExportTraitArgs {
-    pub(crate) async_runtime: Option<AsyncRuntime>,
-    pub(crate) callback_interface: Option<kw::callback_interface>,
-    pub(crate) with_foreign: Option<kw::with_foreign>,
-}
-
-impl Parse for ExportTraitArgs {
-    fn parse(input: ParseStream<'_>) -> syn::Result<Self> {
-        parse_comma_separated(input)
-    }
-}
-
-impl UniffiAttributeArgs for ExportTraitArgs {
-    fn parse_one(input: ParseStream<'_>) -> syn::Result<Self> {
-        let lookahead = input.lookahead1();
-        if lookahead.peek(kw::async_runtime) {
-            let _: kw::async_runtime = input.parse()?;
-            let _: Token![=] = input.parse()?;
-            Ok(Self {
-                async_runtime: Some(input.parse()?),
-                ..Self::default()
-            })
-        } else if lookahead.peek(kw::callback_interface) {
-            Ok(Self {
-                callback_interface: input.parse()?,
-                ..Self::default()
-            })
-        } else if lookahead.peek(kw::with_foreign) {
-            Ok(Self {
-                with_foreign: input.parse()?,
-                ..Self::default()
-            })
-        } else {
-            Ok(Self::default())
-        }
-    }
-
-    fn merge(self, other: Self) -> syn::Result<Self> {
-        let merged = Self {
-            async_runtime: either_attribute_arg(self.async_runtime, other.async_runtime)?,
-            callback_interface: either_attribute_arg(
-                self.callback_interface,
-                other.callback_interface,
-            )?,
-            with_foreign: either_attribute_arg(self.with_foreign, other.with_foreign)?,
-        };
-        if merged.callback_interface.is_some() && merged.with_foreign.is_some() {
-            return Err(syn::Error::new(
-                merged.callback_interface.unwrap().span,
-                "`callback_interface` and `with_foreign` are mutually exclusive",
-            ));
-        }
-        Ok(merged)
-    }
-}
-
-#[derive(Clone, Default)]
-pub struct ExportFnArgs {
-    pub(crate) async_runtime: Option<AsyncRuntime>,
-    pub(crate) name: Option<String>,
-    pub(crate) defaults: DefaultMap,
-}
-
-impl Parse for ExportFnArgs {
-    fn parse(input: ParseStream<'_>) -> syn::Result<Self> {
-        parse_comma_separated(input)
-    }
-}
-
-impl UniffiAttributeArgs for ExportFnArgs {
-    fn parse_one(input: ParseStream<'_>) -> syn::Result<Self> {
-        let lookahead = input.lookahead1();
-        if lookahead.peek(kw::async_runtime) {
-            let _: kw::async_runtime = input.parse()?;
-            let _: Token![=] = input.parse()?;
-            Ok(Self {
-                async_runtime: Some(input.parse()?),
-                ..Self::default()
-            })
-        } else if lookahead.peek(kw::name) {
-            let _: kw::name = input.parse()?;
-            let _: Token![=] = input.parse()?;
-            let name = Some(input.parse::<LitStr>()?.value());
-            Ok(Self {
-                name,
-                ..Self::default()
-            })
-        } else if lookahead.peek(kw::default) {
-            Ok(Self {
-                defaults: DefaultMap::parse(input)?,
-                ..Self::default()
-            })
-        } else {
-            Err(syn::Error::new(
-                input.span(),
-                format!("uniffi::export attribute `{input}` is not supported here."),
-            ))
-        }
-    }
-
-    fn merge(self, other: Self) -> syn::Result<Self> {
-        Ok(Self {
-            async_runtime: either_attribute_arg(self.async_runtime, other.async_runtime)?,
-            name: either_attribute_arg(self.name, other.name)?,
-            defaults: self.defaults.merge(other.defaults),
-        })
-    }
-}
-
-#[derive(Default)]
-pub struct ExportImplArgs {
-    pub(crate) async_runtime: Option<AsyncRuntime>,
-}
-
-impl Parse for ExportImplArgs {
-    fn parse(input: ParseStream<'_>) -> syn::Result<Self> {
-        parse_comma_separated(input)
-    }
-}
-
-impl UniffiAttributeArgs for ExportImplArgs {
-    fn parse_one(input: ParseStream<'_>) -> syn::Result<Self> {
-        let lookahead = input.lookahead1();
-        if lookahead.peek(kw::async_runtime) {
-            let _: kw::async_runtime = input.parse()?;
-            let _: Token![=] = input.parse()?;
-            Ok(Self {
-                async_runtime: Some(input.parse()?),
-            })
-        } else {
-            Err(syn::Error::new(
-                input.span(),
-                format!("uniffi::export attribute `{input}` is not supported here."),
-            ))
-        }
-    }
-
-    fn merge(self, other: Self) -> syn::Result<Self> {
-        Ok(Self {
-            async_runtime: either_attribute_arg(self.async_runtime, other.async_runtime)?,
-        })
-    }
-}
-
-#[derive(Default)]
-pub struct ExportStructArgs {
-    pub(crate) traits: HashSet<UniffiTraitDiscriminants>,
-}
-
-impl Parse for ExportStructArgs {
-    fn parse(input: ParseStream<'_>) -> syn::Result<Self> {
-        parse_comma_separated(input)
-    }
-}
-
-impl UniffiAttributeArgs for ExportStructArgs {
-    fn parse_one(input: ParseStream<'_>) -> syn::Result<Self> {
-        let lookahead = input.lookahead1();
-        if lookahead.peek(kw::Debug) {
-            input.parse::<Option<kw::Debug>>()?;
-            Ok(Self {
-                traits: HashSet::from([UniffiTraitDiscriminants::Debug]),
-            })
-        } else if lookahead.peek(kw::Display) {
-            input.parse::<Option<kw::Display>>()?;
-            Ok(Self {
-                traits: HashSet::from([UniffiTraitDiscriminants::Display]),
-            })
-        } else if lookahead.peek(kw::Hash) {
-            input.parse::<Option<kw::Hash>>()?;
-            Ok(Self {
-                traits: HashSet::from([UniffiTraitDiscriminants::Hash]),
-            })
-        } else if lookahead.peek(kw::Eq) {
-            input.parse::<Option<kw::Eq>>()?;
-            Ok(Self {
-                traits: HashSet::from([UniffiTraitDiscriminants::Eq]),
-            })
-        } else {
-            Err(syn::Error::new(
-                input.span(),
-                format!(
-                    "uniffi::export struct attributes must be builtin trait names; `{input}` is invalid"
-                ),
-            ))
-        }
-    }
-
-    fn merge(self, other: Self) -> syn::Result<Self> {
-        let mut traits = self.traits;
-        traits.extend(other.traits);
-        Ok(Self { traits })
-    }
-}
-
-#[derive(Clone)]
-pub(crate) enum AsyncRuntime {
-    Tokio(LitStr),
-}
-
-impl Parse for AsyncRuntime {
-    fn parse(input: ParseStream<'_>) -> syn::Result<Self> {
-        let lit: LitStr = input.parse()?;
-        match lit.value().as_str() {
-            "tokio" => Ok(Self::Tokio(lit)),
-            _ => Err(syn::Error::new_spanned(
-                lit,
-                "unknown async runtime, currently only `tokio` is supported",
-            )),
-        }
-    }
-}
-
-impl ToTokens for AsyncRuntime {
-    fn to_tokens(&self, tokens: &mut TokenStream) {
-        match self {
-            AsyncRuntime::Tokio(lit) => lit.to_tokens(tokens),
-        }
-    }
-}
-
-/// Arguments for function inside an impl block
-///
-/// This stores the parsed arguments for `uniffi::constructor` and `uniffi::method`
-#[derive(Clone, Default)]
-pub struct ExportedImplFnArgs {
-    pub(crate) name: Option<String>,
-    pub(crate) defaults: DefaultMap,
-}
-
-impl Parse for ExportedImplFnArgs {
-    fn parse(input: ParseStream<'_>) -> syn::Result<Self> {
-        parse_comma_separated(input)
-    }
-}
-
-impl UniffiAttributeArgs for ExportedImplFnArgs {
-    fn parse_one(input: ParseStream<'_>) -> syn::Result<Self> {
-        let lookahead = input.lookahead1();
-        if lookahead.peek(kw::name) {
-            let _: kw::name = input.parse()?;
-            let _: Token![=] = input.parse()?;
-            let name = Some(input.parse::<LitStr>()?.value());
-            Ok(Self {
-                name,
-                ..Self::default()
-            })
-        } else if lookahead.peek(kw::default) {
-            Ok(Self {
-                defaults: DefaultMap::parse(input)?,
-                ..Self::default()
-            })
-        } else {
-            Err(syn::Error::new(
-                input.span(),
-                format!("uniffi::constructor/method attribute `{input}` is not supported here."),
-            ))
-        }
-    }
-
-    fn merge(self, other: Self) -> syn::Result<Self> {
-        Ok(Self {
-            name: either_attribute_arg(self.name, other.name)?,
-            defaults: self.defaults.merge(other.defaults),
-        })
-    }
-}
-
-#[derive(Default)]
-pub(super) struct ExportedImplFnAttributes {
-    pub constructor: bool,
-    pub args: ExportedImplFnArgs,
-}
-
-impl ExportedImplFnAttributes {
-    pub fn new(attrs: &[Attribute]) -> syn::Result<Self> {
-        let mut this = Self::default();
-        for attr in attrs {
-            let segs = &attr.path().segments;
-
-            let fst = segs
-                .first()
-                .expect("attributes have at least one path segment");
-            if fst.ident != "uniffi" {
-                continue;
-            }
-            ensure_no_path_args(fst)?;
-
-            let args = match &attr.meta {
-                Meta::List(_) => attr.parse_args::<ExportedImplFnArgs>()?,
-                _ => Default::default(),
-            };
-            this.args = args;
-
-            if segs.len() != 2 {
-                return Err(syn::Error::new_spanned(
-                    segs,
-                    "unsupported uniffi attribute",
-                ));
-            }
-            let snd = &segs[1];
-            ensure_no_path_args(snd)?;
-
-            match snd.ident.to_string().as_str() {
-                "constructor" => {
-                    if this.constructor {
-                        return Err(syn::Error::new_spanned(
-                            attr,
-                            "duplicate constructor attribute",
-                        ));
-                    }
-                    this.constructor = true;
-                }
-                "method" => {
-                    if this.constructor {
-                        return Err(syn::Error::new_spanned(
-                            attr,
-                            "confused constructor/method attributes",
-                        ));
-                    }
-                }
-                _ => return Err(syn::Error::new_spanned(snd, "unknown uniffi attribute")),
-            }
-        }
-
-        Ok(this)
-    }
-}
-
-fn ensure_no_path_args(seg: &PathSegment) -> syn::Result<()> {
-    if matches!(seg.arguments, PathArguments::None) {
-        Ok(())
-    } else {
-        Err(syn::Error::new_spanned(&seg.arguments, "unexpected syntax"))
-    }
-}
-
-/// Maps arguments to defaults for functions
-#[derive(Clone, Default)]
-pub struct DefaultMap {
-    map: HashMap<Ident, DefaultValue>,
-}
-
-impl DefaultMap {
-    pub fn merge(self, other: Self) -> Self {
-        let mut map = self.map;
-        map.extend(other.map);
-        Self { map }
-    }
-
-    pub fn remove(&mut self, ident: &Ident) -> Option<DefaultValue> {
-        self.map.remove(ident)
-    }
-
-    pub fn idents(&self) -> Vec<&Ident> {
-        self.map.keys().collect()
-    }
-}
-
-impl Parse for DefaultMap {
-    fn parse(input: ParseStream<'_>) -> syn::Result<Self> {
-        let _: kw::default = input.parse()?;
-        let content;
-        let _ = parenthesized!(content in input);
-        let pairs = content.parse_terminated(DefaultPair::parse, Token![,])?;
-        Ok(Self {
-            map: pairs.into_iter().map(|p| (p.name, p.value)).collect(),
-        })
-    }
-}
-
-pub struct DefaultPair {
-    pub name: Ident,
-    pub eq_token: Token![=],
-    pub value: DefaultValue,
-}
-
-impl Parse for DefaultPair {
-    fn parse(input: ParseStream<'_>) -> syn::Result<Self> {
-        Ok(Self {
-            name: input.parse()?,
-            eq_token: input.parse()?,
-            value: input.parse()?,
-        })
-    }
-}
diff --git a/crates/uniffi_macros/src/export/callback_interface.rs b/crates/uniffi_macros/src/export/callback_interface.rs
deleted file mode 100644
index fe14538..0000000
--- a/crates/uniffi_macros/src/export/callback_interface.rs
+++ /dev/null
@@ -1,263 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-use crate::{
-    export::ImplItem,
-    fnsig::{FnKind, FnSignature, ReceiverArg},
-    util::{
-        create_metadata_items, derive_ffi_traits, ident_to_string, mod_path, tagged_impl_header,
-    },
-};
-use proc_macro2::{Span, TokenStream};
-use quote::{format_ident, quote};
-use std::iter;
-use syn::Ident;
-
-/// Generate a trait impl that calls foreign callbacks
-///
-/// This generates:
-///    * A `repr(C)` VTable struct where each field is the FFI function for the trait method.
-///    * A FFI function for foreign code to set their VTable for the interface
-///    * An implementation of the trait using that VTable
-pub(super) fn trait_impl(
-    mod_path: &str,
-    trait_ident: &Ident,
-    items: &[ImplItem],
-) -> syn::Result<TokenStream> {
-    let trait_name = ident_to_string(trait_ident);
-    let trait_impl_ident = trait_impl_ident(&trait_name);
-    let vtable_type = format_ident!("UniFfiTraitVtable{trait_name}");
-    let vtable_cell = format_ident!("UNIFFI_TRAIT_CELL_{}", trait_name.to_uppercase());
-    let init_ident = Ident::new(
-        &uniffi_meta::init_callback_vtable_fn_symbol_name(mod_path, &trait_name),
-        Span::call_site(),
-    );
-    let methods = items
-        .iter()
-        .map(|item| match item {
-            ImplItem::Constructor(sig) => Err(syn::Error::new(
-                sig.span,
-                "Constructors not allowed in trait interfaces",
-            )),
-            ImplItem::Method(sig) => Ok(sig),
-        })
-        .collect::<syn::Result<Vec<_>>>()?;
-
-    let vtable_fields = methods.iter()
-        .map(|sig| {
-            let ident = &sig.ident;
-            let param_names = sig.scaffolding_param_names();
-            let param_types = sig.scaffolding_param_types();
-            let lift_return = sig.lift_return_impl();
-            if !sig.is_async {
-                quote! {
-                    #ident: extern "C" fn(
-                        uniffi_handle: u64,
-                        #(#param_names: #param_types,)*
-                        uniffi_out_return: &mut #lift_return::ReturnType,
-                        uniffi_out_call_status: &mut ::uniffi::RustCallStatus,
-                    ),
-                }
-            } else {
-                quote! {
-                    #ident: extern "C" fn(
-                        uniffi_handle: u64,
-                        #(#param_names: #param_types,)*
-                        uniffi_future_callback: ::uniffi::ForeignFutureCallback<#lift_return::ReturnType>,
-                        uniffi_callback_data: u64,
-                        uniffi_out_return: &mut ::uniffi::ForeignFuture,
-                    ),
-                }
-            }
-        });
-
-    let trait_impl_methods = methods
-        .iter()
-        .map(|sig| gen_method_impl(sig, &vtable_cell))
-        .collect::<syn::Result<Vec<_>>>()?;
-    let has_async_method = methods.iter().any(|m| m.is_async);
-    let impl_attributes = has_async_method.then(|| quote! { #[::async_trait::async_trait] });
-
-    Ok(quote! {
-        struct #vtable_type {
-            #(#vtable_fields)*
-            uniffi_free: extern "C" fn(handle: u64),
-        }
-
-        static #vtable_cell: ::uniffi::UniffiForeignPointerCell::<#vtable_type> = ::uniffi::UniffiForeignPointerCell::<#vtable_type>::new();
-
-        #[no_mangle]
-        extern "C" fn #init_ident(vtable: ::std::ptr::NonNull<#vtable_type>) {
-            #vtable_cell.set(vtable);
-        }
-
-        #[derive(Debug)]
-        struct #trait_impl_ident {
-            handle: u64,
-        }
-
-        impl #trait_impl_ident {
-            fn new(handle: u64) -> Self {
-                Self { handle }
-            }
-        }
-
-        ::uniffi::deps::static_assertions::assert_impl_all!(#trait_impl_ident: ::core::marker::Send);
-
-        #impl_attributes
-        impl #trait_ident for #trait_impl_ident {
-            #(#trait_impl_methods)*
-        }
-
-        impl ::std::ops::Drop for #trait_impl_ident {
-            fn drop(&mut self) {
-                let vtable = #vtable_cell.get();
-                (vtable.uniffi_free)(self.handle);
-            }
-        }
-    })
-}
-
-pub fn trait_impl_ident(trait_name: &str) -> Ident {
-    Ident::new(
-        &format!("UniFFICallbackHandler{trait_name}"),
-        Span::call_site(),
-    )
-}
-
-pub fn ffi_converter_callback_interface_impl(
-    trait_ident: &Ident,
-    trait_impl_ident: &Ident,
-    udl_mode: bool,
-) -> TokenStream {
-    let trait_name = ident_to_string(trait_ident);
-    let dyn_trait = quote! { dyn #trait_ident };
-    let box_dyn_trait = quote! { ::std::boxed::Box<#dyn_trait> };
-    let lift_impl_spec = tagged_impl_header("Lift", &box_dyn_trait, udl_mode);
-    let derive_ffi_traits = derive_ffi_traits(&box_dyn_trait, udl_mode, &["LiftRef", "LiftReturn"]);
-    let mod_path = match mod_path() {
-        Ok(p) => p,
-        Err(e) => return e.into_compile_error(),
-    };
-
-    quote! {
-        #[doc(hidden)]
-        #[automatically_derived]
-        unsafe #lift_impl_spec {
-            type FfiType = u64;
-
-            fn try_lift(v: Self::FfiType) -> ::uniffi::deps::anyhow::Result<Self> {
-                Ok(::std::boxed::Box::new(<#trait_impl_ident>::new(v)))
-            }
-
-            fn try_read(buf: &mut &[u8]) -> ::uniffi::deps::anyhow::Result<Self> {
-                use uniffi::deps::bytes::Buf;
-                ::uniffi::check_remaining(buf, 8)?;
-                <Self as ::uniffi::Lift<crate::UniFfiTag>>::try_lift(buf.get_u64())
-            }
-
-            const TYPE_ID_META: ::uniffi::MetadataBuffer = ::uniffi::MetadataBuffer::from_code(
-                ::uniffi::metadata::codes::TYPE_CALLBACK_INTERFACE,
-            )
-            .concat_str(#mod_path)
-            .concat_str(#trait_name);
-        }
-
-        #derive_ffi_traits
-    }
-}
-
-/// Generate a single method for [trait_impl].  This implements a trait method by invoking a
-/// foreign-supplied callback.
-fn gen_method_impl(sig: &FnSignature, vtable_cell: &Ident) -> syn::Result<TokenStream> {
-    let FnSignature {
-        ident,
-        is_async,
-        return_ty,
-        kind,
-        receiver,
-        name,
-        span,
-        ..
-    } = sig;
-
-    if !matches!(kind, FnKind::TraitMethod { .. }) {
-        return Err(syn::Error::new(
-            *span,
-            format!(
-                "Internal UniFFI error: Unexpected function kind for callback interface {name}: {kind:?}",
-            ),
-        ));
-    }
-
-    let self_param = match receiver {
-        Some(ReceiverArg::Ref) => quote! { &self },
-        Some(ReceiverArg::Arc) => quote! { self: Arc<Self> },
-        None => {
-            return Err(syn::Error::new(
-                *span,
-                "callback interface methods must take &self as their first argument",
-            ));
-        }
-    };
-
-    let params = sig.params();
-    let lower_exprs = sig.args.iter().map(|a| {
-        let lower_impl = a.lower_impl();
-        let ident = &a.ident;
-        quote! { #lower_impl::lower(#ident) }
-    });
-
-    let lift_return = sig.lift_return_impl();
-
-    if !is_async {
-        Ok(quote! {
-            fn #ident(#self_param, #(#params),*) -> #return_ty {
-                let vtable = #vtable_cell.get();
-                let mut uniffi_call_status = ::uniffi::RustCallStatus::new();
-                let mut uniffi_return_value: #lift_return::ReturnType = ::uniffi::FfiDefault::ffi_default();
-                (vtable.#ident)(self.handle, #(#lower_exprs,)* &mut uniffi_return_value, &mut uniffi_call_status);
-                #lift_return::lift_foreign_return(uniffi_return_value, uniffi_call_status)
-            }
-        })
-    } else {
-        Ok(quote! {
-            async fn #ident(#self_param, #(#params),*) -> #return_ty {
-                let vtable = #vtable_cell.get();
-                ::uniffi::foreign_async_call::<_, #return_ty, crate::UniFfiTag>(move |uniffi_future_callback, uniffi_future_callback_data| {
-                    let mut uniffi_foreign_future: ::uniffi::ForeignFuture = ::uniffi::FfiDefault::ffi_default();
-                    (vtable.#ident)(self.handle, #(#lower_exprs,)* uniffi_future_callback, uniffi_future_callback_data, &mut uniffi_foreign_future);
-                    uniffi_foreign_future
-                }).await
-            }
-        })
-    }
-}
-
-pub(super) fn metadata_items(
-    self_ident: &Ident,
-    items: &[ImplItem],
-    module_path: &str,
-    docstring: String,
-) -> syn::Result<Vec<TokenStream>> {
-    let trait_name = ident_to_string(self_ident);
-    let callback_interface_items = create_metadata_items(
-        "callback_interface",
-        &trait_name,
-        quote! {
-            ::uniffi::MetadataBuffer::from_code(::uniffi::metadata::codes::CALLBACK_INTERFACE)
-                .concat_str(#module_path)
-                .concat_str(#trait_name)
-                .concat_long_str(#docstring)
-        },
-        None,
-    );
-
-    iter::once(Ok(callback_interface_items))
-        .chain(items.iter().map(|item| match item {
-            ImplItem::Method(sig) => sig.metadata_items_for_callback_interface(),
-            _ => unreachable!("traits have no constructors"),
-        }))
-        .collect()
-}
diff --git a/crates/uniffi_macros/src/export/item.rs b/crates/uniffi_macros/src/export/item.rs
deleted file mode 100644
index da3c945..0000000
--- a/crates/uniffi_macros/src/export/item.rs
+++ /dev/null
@@ -1,228 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-use crate::fnsig::FnSignature;
-use proc_macro::TokenStream;
-use proc_macro2::{Ident, Span};
-use quote::ToTokens;
-
-use super::attributes::{
-    ExportFnArgs, ExportImplArgs, ExportStructArgs, ExportTraitArgs, ExportedImplFnArgs,
-    ExportedImplFnAttributes,
-};
-use crate::util::extract_docstring;
-use uniffi_meta::UniffiTraitDiscriminants;
-
-pub(super) enum ExportItem {
-    Function {
-        sig: FnSignature,
-        args: ExportFnArgs,
-    },
-    Impl {
-        self_ident: Ident,
-        items: Vec<ImplItem>,
-        args: ExportImplArgs,
-    },
-    Trait {
-        self_ident: Ident,
-        items: Vec<ImplItem>,
-        with_foreign: bool,
-        callback_interface_only: bool,
-        docstring: String,
-        args: ExportTraitArgs,
-    },
-    Struct {
-        self_ident: Ident,
-        uniffi_traits: Vec<UniffiTraitDiscriminants>,
-    },
-}
-
-impl ExportItem {
-    pub fn new(item: syn::Item, attr_args: TokenStream) -> syn::Result<Self> {
-        match item {
-            syn::Item::Fn(item) => {
-                let args: ExportFnArgs = syn::parse(attr_args)?;
-                let docstring = extract_docstring(&item.attrs)?;
-                let sig = FnSignature::new_function(item.sig, args.clone(), docstring)?;
-                Ok(Self::Function { sig, args })
-            }
-            syn::Item::Impl(item) => Self::from_impl(item, attr_args),
-            syn::Item::Trait(item) => Self::from_trait(item, attr_args),
-            syn::Item::Struct(item) => Self::from_struct(item, attr_args),
-            // FIXME: Support const / static?
-            _ => Err(syn::Error::new(
-                Span::call_site(),
-                "unsupported item: only functions and impl \
-                 blocks may be annotated with this attribute",
-            )),
-        }
-    }
-
-    pub fn from_impl(item: syn::ItemImpl, attr_args: TokenStream) -> syn::Result<Self> {
-        let args: ExportImplArgs = syn::parse(attr_args)?;
-        if !item.generics.params.is_empty() || item.generics.where_clause.is_some() {
-            return Err(syn::Error::new_spanned(
-                &item.generics,
-                "generic impls are not currently supported by uniffi::export",
-            ));
-        }
-
-        let type_path = type_as_type_path(&item.self_ty)?;
-
-        if type_path.qself.is_some() {
-            return Err(syn::Error::new_spanned(
-                type_path,
-                "qualified self types are not currently supported by uniffi::export",
-            ));
-        }
-
-        let self_ident = match type_path.path.get_ident() {
-            Some(id) => id,
-            None => {
-                return Err(syn::Error::new_spanned(
-                    type_path,
-                    "qualified paths in self-types are not currently supported by uniffi::export",
-                ));
-            }
-        };
-
-        let items = item
-            .items
-            .into_iter()
-            .map(|item| {
-                let impl_fn = match item {
-                    syn::ImplItem::Fn(m) => m,
-                    _ => {
-                        return Err(syn::Error::new_spanned(
-                            item,
-                            "only fn's are supported in impl blocks annotated with uniffi::export",
-                        ));
-                    }
-                };
-
-                let docstring = extract_docstring(&impl_fn.attrs)?;
-                let attrs = ExportedImplFnAttributes::new(&impl_fn.attrs)?;
-                let item = if attrs.constructor {
-                    ImplItem::Constructor(FnSignature::new_constructor(
-                        self_ident.clone(),
-                        impl_fn.sig,
-                        attrs.args,
-                        docstring,
-                    )?)
-                } else {
-                    ImplItem::Method(FnSignature::new_method(
-                        self_ident.clone(),
-                        impl_fn.sig,
-                        attrs.args,
-                        docstring,
-                    )?)
-                };
-
-                Ok(item)
-            })
-            .collect::<syn::Result<_>>()?;
-
-        Ok(Self::Impl {
-            items,
-            self_ident: self_ident.to_owned(),
-            args,
-        })
-    }
-
-    fn from_trait(item: syn::ItemTrait, attr_args: TokenStream) -> syn::Result<Self> {
-        let args: ExportTraitArgs = syn::parse(attr_args)?;
-        let with_foreign = args.callback_interface.is_some() || args.with_foreign.is_some();
-        let callback_interface_only = args.callback_interface.is_some();
-
-        if !item.generics.params.is_empty() || item.generics.where_clause.is_some() {
-            return Err(syn::Error::new_spanned(
-                &item.generics,
-                "generic impls are not currently supported by uniffi::export",
-            ));
-        }
-
-        let self_ident = item.ident.to_owned();
-        let docstring = extract_docstring(&item.attrs)?;
-        let items = item
-            .items
-            .into_iter()
-            .enumerate()
-            .map(|(i, item)| {
-                let tim = match item {
-                    syn::TraitItem::Fn(tim) => tim,
-                    _ => {
-                        return Err(syn::Error::new_spanned(
-                            item,
-                            "only fn's are supported in traits annotated with uniffi::export",
-                        ));
-                    }
-                };
-
-                let docstring = extract_docstring(&tim.attrs)?;
-                let attrs = ExportedImplFnAttributes::new(&tim.attrs)?;
-                let item = if attrs.constructor {
-                    return Err(syn::Error::new_spanned(
-                        tim,
-                        "exported traits can not have constructors",
-                    ));
-                } else {
-                    ImplItem::Method(FnSignature::new_trait_method(
-                        self_ident.clone(),
-                        tim.sig,
-                        ExportedImplFnArgs::default(),
-                        i as u32,
-                        docstring,
-                    )?)
-                };
-
-                Ok(item)
-            })
-            .collect::<syn::Result<_>>()?;
-
-        Ok(Self::Trait {
-            items,
-            self_ident,
-            with_foreign,
-            callback_interface_only,
-            docstring,
-            args,
-        })
-    }
-
-    fn from_struct(item: syn::ItemStruct, attr_args: TokenStream) -> syn::Result<Self> {
-        let args: ExportStructArgs = syn::parse(attr_args)?;
-        let uniffi_traits: Vec<UniffiTraitDiscriminants> = args.traits.into_iter().collect();
-        if uniffi_traits.is_empty() {
-            Err(syn::Error::new(Span::call_site(),
-                "uniffi::export on a struct must supply a builtin trait name. Did you mean `#[derive(uniffi::Object)]`?"
-            ))
-        } else {
-            Ok(Self::Struct {
-                self_ident: item.ident,
-                uniffi_traits,
-            })
-        }
-    }
-}
-
-pub(super) enum ImplItem {
-    Constructor(FnSignature),
-    Method(FnSignature),
-}
-
-fn type_as_type_path(ty: &syn::Type) -> syn::Result<&syn::TypePath> {
-    match ty {
-        syn::Type::Group(g) => type_as_type_path(&g.elem),
-        syn::Type::Paren(p) => type_as_type_path(&p.elem),
-        syn::Type::Path(p) => Ok(p),
-        _ => Err(type_not_supported(ty)),
-    }
-}
-
-fn type_not_supported(ty: &impl ToTokens) -> syn::Error {
-    syn::Error::new_spanned(
-        ty,
-        "this type is not currently supported by uniffi::export in this position",
-    )
-}
diff --git a/crates/uniffi_macros/src/export/scaffolding.rs b/crates/uniffi_macros/src/export/scaffolding.rs
deleted file mode 100644
index fa7b61d..0000000
--- a/crates/uniffi_macros/src/export/scaffolding.rs
+++ /dev/null
@@ -1,305 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-use proc_macro2::{Ident, TokenStream};
-use quote::quote;
-use std::iter;
-
-use super::attributes::AsyncRuntime;
-use crate::fnsig::{FnKind, FnSignature};
-
-pub(super) fn gen_fn_scaffolding(
-    sig: FnSignature,
-    ar: &Option<AsyncRuntime>,
-    udl_mode: bool,
-) -> syn::Result<TokenStream> {
-    if sig.receiver.is_some() {
-        return Err(syn::Error::new(
-            sig.span,
-            "Unexpected self param (Note: uniffi::export must be used on the impl block, not its containing fn's)"
-        ));
-    }
-    if !sig.is_async {
-        if let Some(async_runtime) = ar {
-            return Err(syn::Error::new_spanned(
-                async_runtime,
-                "this attribute is only allowed on async functions",
-            ));
-        }
-    }
-    let metadata_items = (!udl_mode).then(|| {
-        sig.metadata_items()
-            .unwrap_or_else(syn::Error::into_compile_error)
-    });
-    let scaffolding_func = gen_ffi_function(&sig, ar, udl_mode)?;
-    Ok(quote! {
-        #scaffolding_func
-        #metadata_items
-    })
-}
-
-pub(super) fn gen_constructor_scaffolding(
-    sig: FnSignature,
-    ar: &Option<AsyncRuntime>,
-    udl_mode: bool,
-) -> syn::Result<TokenStream> {
-    if sig.receiver.is_some() {
-        return Err(syn::Error::new(
-            sig.span,
-            "constructors must not have a self parameter",
-        ));
-    }
-    let metadata_items = (!udl_mode).then(|| {
-        sig.metadata_items()
-            .unwrap_or_else(syn::Error::into_compile_error)
-    });
-    let scaffolding_func = gen_ffi_function(&sig, ar, udl_mode)?;
-    Ok(quote! {
-        #scaffolding_func
-        #metadata_items
-    })
-}
-
-pub(super) fn gen_method_scaffolding(
-    sig: FnSignature,
-    ar: &Option<AsyncRuntime>,
-    udl_mode: bool,
-) -> syn::Result<TokenStream> {
-    let scaffolding_func = if sig.receiver.is_none() {
-        return Err(syn::Error::new(
-            sig.span,
-            "associated functions are not currently supported",
-        ));
-    } else {
-        gen_ffi_function(&sig, ar, udl_mode)?
-    };
-
-    let metadata_items = (!udl_mode).then(|| {
-        sig.metadata_items()
-            .unwrap_or_else(syn::Error::into_compile_error)
-    });
-    Ok(quote! {
-        #scaffolding_func
-        #metadata_items
-    })
-}
-
-// Pieces of code for the scaffolding function
-struct ScaffoldingBits {
-    /// Parameter names for the scaffolding function
-    param_names: Vec<TokenStream>,
-    /// Parameter types for the scaffolding function
-    param_types: Vec<TokenStream>,
-    /// Lift closure.  See `FnSignature::lift_closure` for an explanation of this.
-    lift_closure: TokenStream,
-    /// Expression to call the Rust function after a successful lift.
-    rust_fn_call: TokenStream,
-    /// Convert the result of `rust_fn_call`, stored in a variable named `uniffi_result` into its final value.
-    /// This is used to do things like error conversion / Arc wrapping
-    convert_result: TokenStream,
-}
-
-impl ScaffoldingBits {
-    fn new_for_function(sig: &FnSignature, udl_mode: bool) -> Self {
-        let ident = &sig.ident;
-        let call_params = sig.rust_call_params(false);
-        let rust_fn_call = quote! { #ident(#call_params) };
-        // UDL mode adds an extra conversion (#1749)
-        let convert_result = if udl_mode && sig.looks_like_result {
-            quote! { uniffi_result.map_err(::std::convert::Into::into) }
-        } else {
-            quote! { uniffi_result }
-        };
-
-        Self {
-            param_names: sig.scaffolding_param_names().collect(),
-            param_types: sig.scaffolding_param_types().collect(),
-            lift_closure: sig.lift_closure(None),
-            rust_fn_call,
-            convert_result,
-        }
-    }
-
-    fn new_for_method(
-        sig: &FnSignature,
-        self_ident: &Ident,
-        is_trait: bool,
-        udl_mode: bool,
-    ) -> Self {
-        let ident = &sig.ident;
-        let lift_impl = if is_trait {
-            quote! {
-                <::std::sync::Arc<dyn #self_ident> as ::uniffi::Lift<crate::UniFfiTag>>
-            }
-        } else {
-            quote! {
-                <::std::sync::Arc<#self_ident> as ::uniffi::Lift<crate::UniFfiTag>>
-            }
-        };
-        let try_lift_self = if is_trait {
-            // For trait interfaces we need to special case this.  Trait interfaces normally lift
-            // foreign trait impl pointers.  However, for a method call, we want to lift a Rust
-            // pointer.
-            quote! {
-                {
-                    let boxed_foreign_arc = unsafe { Box::from_raw(uniffi_self_lowered as *mut ::std::sync::Arc<dyn #self_ident>) };
-                    // Take a clone for our own use.
-                    Ok(*boxed_foreign_arc)
-                }
-            }
-        } else {
-            quote! { #lift_impl::try_lift(uniffi_self_lowered) }
-        };
-
-        let lift_closure = sig.lift_closure(Some(quote! {
-            match #try_lift_self {
-                Ok(v) => v,
-                Err(e) => return Err(("self", e))
-            }
-        }));
-        let call_params = sig.rust_call_params(true);
-        let rust_fn_call = quote! { uniffi_args.0.#ident(#call_params) };
-        // UDL mode adds an extra conversion (#1749)
-        let convert_result = if udl_mode && sig.looks_like_result {
-            quote! { uniffi_result .map_err(::std::convert::Into::into) }
-        } else {
-            quote! { uniffi_result }
-        };
-
-        Self {
-            param_names: iter::once(quote! { uniffi_self_lowered })
-                .chain(sig.scaffolding_param_names())
-                .collect(),
-            param_types: iter::once(quote! { #lift_impl::FfiType })
-                .chain(sig.scaffolding_param_types())
-                .collect(),
-            lift_closure,
-            rust_fn_call,
-            convert_result,
-        }
-    }
-
-    fn new_for_constructor(sig: &FnSignature, self_ident: &Ident, udl_mode: bool) -> Self {
-        let ident = &sig.ident;
-        let call_params = sig.rust_call_params(false);
-        let rust_fn_call = quote! { #self_ident::#ident(#call_params) };
-        // UDL mode adds extra conversions (#1749)
-        let convert_result = match (udl_mode, sig.looks_like_result) {
-            // For UDL
-            (true, false) => quote! { ::std::sync::Arc::new(uniffi_result) },
-            (true, true) => {
-                quote! { uniffi_result.map(::std::sync::Arc::new).map_err(::std::convert::Into::into) }
-            }
-            (false, _) => quote! { uniffi_result },
-        };
-
-        Self {
-            param_names: sig.scaffolding_param_names().collect(),
-            param_types: sig.scaffolding_param_types().collect(),
-            lift_closure: sig.lift_closure(None),
-            rust_fn_call,
-            convert_result,
-        }
-    }
-}
-
-/// Generate a scaffolding function
-///
-/// `pre_fn_call` is the statements that we should execute before the rust call
-/// `rust_fn` is the Rust function to call.
-pub(super) fn gen_ffi_function(
-    sig: &FnSignature,
-    ar: &Option<AsyncRuntime>,
-    udl_mode: bool,
-) -> syn::Result<TokenStream> {
-    let ScaffoldingBits {
-        param_names,
-        param_types,
-        lift_closure,
-        rust_fn_call,
-        convert_result,
-    } = match &sig.kind {
-        FnKind::Function => ScaffoldingBits::new_for_function(sig, udl_mode),
-        FnKind::Method { self_ident } => {
-            ScaffoldingBits::new_for_method(sig, self_ident, false, udl_mode)
-        }
-        FnKind::TraitMethod { self_ident, .. } => {
-            ScaffoldingBits::new_for_method(sig, self_ident, true, udl_mode)
-        }
-        FnKind::Constructor { self_ident } => {
-            ScaffoldingBits::new_for_constructor(sig, self_ident, udl_mode)
-        }
-    };
-    // Scaffolding functions are logically `pub`, but we don't use that in UDL mode since UDL has
-    // historically not required types to be `pub`
-    let vis = match udl_mode {
-        false => quote! { pub },
-        true => quote! {},
-    };
-
-    let ffi_ident = sig.scaffolding_fn_ident()?;
-    let name = &sig.name;
-    let return_ty = &sig.return_ty;
-    let return_impl = &sig.lower_return_impl();
-
-    Ok(if !sig.is_async {
-        quote! {
-            #[doc(hidden)]
-            #[no_mangle]
-            #vis extern "C" fn #ffi_ident(
-                #(#param_names: #param_types,)*
-                call_status: &mut ::uniffi::RustCallStatus,
-            ) -> #return_impl::ReturnType {
-                ::uniffi::deps::log::debug!(#name);
-                let uniffi_lift_args = #lift_closure;
-                ::uniffi::rust_call(call_status, || {
-                    #return_impl::lower_return(
-                        match uniffi_lift_args() {
-                            Ok(uniffi_args) => {
-                                let uniffi_result = #rust_fn_call;
-                                #convert_result
-                            }
-                            Err((arg_name, anyhow_error)) => {
-                                #return_impl::handle_failed_lift(arg_name, anyhow_error)
-                            },
-                        }
-                    )
-                })
-            }
-        }
-    } else {
-        let mut future_expr = rust_fn_call;
-        if matches!(ar, Some(AsyncRuntime::Tokio(_))) {
-            future_expr = quote! { ::uniffi::deps::async_compat::Compat::new(#future_expr) }
-        }
-
-        quote! {
-            #[doc(hidden)]
-            #[no_mangle]
-            pub extern "C" fn #ffi_ident(#(#param_names: #param_types,)*) -> ::uniffi::Handle {
-                ::uniffi::deps::log::debug!(#name);
-                let uniffi_lift_args = #lift_closure;
-                match uniffi_lift_args() {
-                    Ok(uniffi_args) => {
-                        ::uniffi::rust_future_new::<_, #return_ty, _>(
-                            async move {
-                                let uniffi_result = #future_expr.await;
-                                #convert_result
-                            },
-                            crate::UniFfiTag
-                        )
-                    },
-                    Err((arg_name, anyhow_error)) => {
-                        ::uniffi::rust_future_new::<_, #return_ty, _>(
-                            async move {
-                                #return_impl::handle_failed_lift(arg_name, anyhow_error)
-                            },
-                            crate::UniFfiTag,
-                        )
-                    },
-                }
-            }
-        }
-    })
-}
diff --git a/crates/uniffi_macros/src/export/trait_interface.rs b/crates/uniffi_macros/src/export/trait_interface.rs
deleted file mode 100644
index 83587ae..0000000
--- a/crates/uniffi_macros/src/export/trait_interface.rs
+++ /dev/null
@@ -1,183 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-use proc_macro2::{Ident, Span, TokenStream};
-use quote::{quote, quote_spanned};
-
-use uniffi_meta::ObjectImpl;
-
-use crate::{
-    export::{
-        attributes::ExportTraitArgs, callback_interface, gen_method_scaffolding, item::ImplItem,
-    },
-    object::interface_meta_static_var,
-    util::{ident_to_string, tagged_impl_header},
-};
-
-pub(super) fn gen_trait_scaffolding(
-    mod_path: &str,
-    args: ExportTraitArgs,
-    self_ident: Ident,
-    items: Vec<ImplItem>,
-    udl_mode: bool,
-    with_foreign: bool,
-    docstring: String,
-) -> syn::Result<TokenStream> {
-    if let Some(rt) = args.async_runtime {
-        return Err(syn::Error::new_spanned(rt, "not supported for traits"));
-    }
-    let trait_name = ident_to_string(&self_ident);
-    let trait_impl = with_foreign.then(|| {
-        callback_interface::trait_impl(mod_path, &self_ident, &items)
-            .unwrap_or_else(|e| e.into_compile_error())
-    });
-
-    let clone_fn_ident = Ident::new(
-        &uniffi_meta::clone_fn_symbol_name(mod_path, &trait_name),
-        Span::call_site(),
-    );
-    let free_fn_ident = Ident::new(
-        &uniffi_meta::free_fn_symbol_name(mod_path, &trait_name),
-        Span::call_site(),
-    );
-
-    let helper_fn_tokens = quote! {
-        #[doc(hidden)]
-        #[no_mangle]
-        /// Clone a pointer to this object type
-        ///
-        /// Safety: Only pass pointers returned by a UniFFI call.  Do not pass pointers that were
-        /// passed to the free function.
-        pub unsafe extern "C" fn #clone_fn_ident(
-            ptr: *const ::std::ffi::c_void,
-            call_status: &mut ::uniffi::RustCallStatus
-        ) -> *const ::std::ffi::c_void {
-            uniffi::rust_call(call_status, || {
-                let ptr = ptr as *mut std::sync::Arc<dyn #self_ident>;
-                let arc = unsafe { ::std::sync::Arc::clone(&*ptr) };
-                Ok(::std::boxed::Box::into_raw(::std::boxed::Box::new(arc)) as  *const ::std::ffi::c_void)
-            })
-        }
-
-        #[doc(hidden)]
-        #[no_mangle]
-        /// Free a pointer to this object type
-        ///
-        /// Safety: Only pass pointers returned by a UniFFI call.  Do not pass pointers that were
-        /// passed to the free function.
-        ///
-        /// Note: clippy doesn't complain about this being unsafe, but it definitely is since it
-        /// calls `Box::from_raw`.
-        pub unsafe extern "C" fn #free_fn_ident(
-            ptr: *const ::std::ffi::c_void,
-            call_status: &mut ::uniffi::RustCallStatus
-        ) {
-            uniffi::rust_call(call_status, || {
-                assert!(!ptr.is_null());
-                drop(unsafe { ::std::boxed::Box::from_raw(ptr as *mut std::sync::Arc<dyn #self_ident>) });
-                Ok(())
-            });
-        }
-    };
-
-    let impl_tokens: TokenStream = items
-        .into_iter()
-        .map(|item| match item {
-            ImplItem::Method(sig) => gen_method_scaffolding(sig, &None, udl_mode),
-            _ => unreachable!("traits have no constructors"),
-        })
-        .collect::<syn::Result<_>>()?;
-
-    let meta_static_var = (!udl_mode).then(|| {
-        let imp = if with_foreign {
-            ObjectImpl::CallbackTrait
-        } else {
-            ObjectImpl::Trait
-        };
-        interface_meta_static_var(&self_ident, imp, mod_path, docstring)
-            .unwrap_or_else(syn::Error::into_compile_error)
-    });
-    let ffi_converter_tokens = ffi_converter(mod_path, &self_ident, udl_mode, with_foreign);
-
-    Ok(quote_spanned! { self_ident.span() =>
-        #meta_static_var
-        #helper_fn_tokens
-        #trait_impl
-        #impl_tokens
-        #ffi_converter_tokens
-    })
-}
-
-pub(crate) fn ffi_converter(
-    mod_path: &str,
-    trait_ident: &Ident,
-    udl_mode: bool,
-    with_foreign: bool,
-) -> TokenStream {
-    let impl_spec = tagged_impl_header("FfiConverterArc", &quote! { dyn #trait_ident }, udl_mode);
-    let lift_ref_impl_spec = tagged_impl_header("LiftRef", &quote! { dyn #trait_ident }, udl_mode);
-    let trait_name = ident_to_string(trait_ident);
-    let try_lift = if with_foreign {
-        let trait_impl_ident = callback_interface::trait_impl_ident(&trait_name);
-        quote! {
-            fn try_lift(v: Self::FfiType) -> ::uniffi::deps::anyhow::Result<::std::sync::Arc<Self>> {
-                Ok(::std::sync::Arc::new(<#trait_impl_ident>::new(v as u64)))
-            }
-        }
-    } else {
-        quote! {
-            fn try_lift(v: Self::FfiType) -> ::uniffi::deps::anyhow::Result<::std::sync::Arc<Self>> {
-                unsafe {
-                    Ok(*::std::boxed::Box::from_raw(v as *mut ::std::sync::Arc<Self>))
-                }
-            }
-        }
-    };
-    let metadata_code = if with_foreign {
-        quote! { ::uniffi::metadata::codes::TYPE_CALLBACK_TRAIT_INTERFACE }
-    } else {
-        quote! { ::uniffi::metadata::codes::TYPE_TRAIT_INTERFACE }
-    };
-
-    quote! {
-        // All traits must be `Sync + Send`. The generated scaffolding will fail to compile
-        // if they are not, but unfortunately it fails with an unactionably obscure error message.
-        // By asserting the requirement explicitly, we help Rust produce a more scrutable error message
-        // and thus help the user debug why the requirement isn't being met.
-        uniffi::deps::static_assertions::assert_impl_all!(dyn #trait_ident: ::core::marker::Sync, ::core::marker::Send);
-
-        unsafe #impl_spec {
-            type FfiType = *const ::std::os::raw::c_void;
-
-            fn lower(obj: ::std::sync::Arc<Self>) -> Self::FfiType {
-                ::std::boxed::Box::into_raw(::std::boxed::Box::new(obj)) as *const ::std::os::raw::c_void
-            }
-
-            #try_lift
-
-            fn write(obj: ::std::sync::Arc<Self>, buf: &mut Vec<u8>) {
-                ::uniffi::deps::static_assertions::const_assert!(::std::mem::size_of::<*const ::std::ffi::c_void>() <= 8);
-                ::uniffi::deps::bytes::BufMut::put_u64(
-                    buf,
-                    <Self as ::uniffi::FfiConverterArc<crate::UniFfiTag>>::lower(obj) as u64,
-                );
-            }
-
-            fn try_read(buf: &mut &[u8]) -> ::uniffi::Result<::std::sync::Arc<Self>> {
-                ::uniffi::deps::static_assertions::const_assert!(::std::mem::size_of::<*const ::std::ffi::c_void>() <= 8);
-                ::uniffi::check_remaining(buf, 8)?;
-                <Self as ::uniffi::FfiConverterArc<crate::UniFfiTag>>::try_lift(
-                    ::uniffi::deps::bytes::Buf::get_u64(buf) as Self::FfiType)
-            }
-
-            const TYPE_ID_META: ::uniffi::MetadataBuffer = ::uniffi::MetadataBuffer::from_code(#metadata_code)
-                .concat_str(#mod_path)
-                .concat_str(#trait_name);
-        }
-
-        unsafe #lift_ref_impl_spec {
-            type LiftType = ::std::sync::Arc<dyn #trait_ident>;
-        }
-    }
-}
diff --git a/crates/uniffi_macros/src/export/utrait.rs b/crates/uniffi_macros/src/export/utrait.rs
deleted file mode 100644
index 9007ae2..0000000
--- a/crates/uniffi_macros/src/export/utrait.rs
+++ /dev/null
@@ -1,183 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-use proc_macro2::{Ident, TokenStream};
-use quote::quote;
-use syn::ext::IdentExt;
-
-use super::gen_ffi_function;
-use crate::export::ExportedImplFnArgs;
-use crate::fnsig::FnSignature;
-use crate::util::extract_docstring;
-use uniffi_meta::UniffiTraitDiscriminants;
-
-pub(crate) fn expand_uniffi_trait_export(
-    self_ident: Ident,
-    uniffi_traits: Vec<UniffiTraitDiscriminants>,
-) -> syn::Result<TokenStream> {
-    let udl_mode = false;
-    let mut impl_items = Vec::new();
-    let mut global_items = Vec::new();
-    for trait_id in uniffi_traits {
-        match trait_id {
-            UniffiTraitDiscriminants::Debug => {
-                let method = quote! {
-                    fn uniffi_trait_debug(&self) -> String {
-                        ::uniffi::deps::static_assertions::assert_impl_all!(#self_ident: ::std::fmt::Debug);
-                        format!("{:?}", self)
-                    }
-                };
-                let (ffi_func, method_meta) =
-                    process_uniffi_trait_method(&method, &self_ident, udl_mode)?;
-                // metadata for the trait - which includes metadata for the method.
-                let discr = UniffiTraitDiscriminants::Debug as u8;
-                let trait_meta = crate::util::create_metadata_items(
-                    "uniffi_trait",
-                    &format!("{}_Debug", self_ident.unraw()),
-                    quote! {
-                        ::uniffi::MetadataBuffer::from_code(::uniffi::metadata::codes::UNIFFI_TRAIT)
-                        .concat_value(#discr)
-                        .concat(#method_meta)
-                    },
-                    None,
-                );
-                impl_items.push(method);
-                global_items.push(ffi_func);
-                global_items.push(trait_meta);
-            }
-            UniffiTraitDiscriminants::Display => {
-                let method = quote! {
-                    fn uniffi_trait_display(&self) -> String {
-                        ::uniffi::deps::static_assertions::assert_impl_all!(#self_ident: ::std::fmt::Display);
-                        format!("{}", self)
-                    }
-                };
-                let (ffi_func, method_meta) =
-                    process_uniffi_trait_method(&method, &self_ident, udl_mode)?;
-                // metadata for the trait - which includes metadata for the method.
-                let discr = UniffiTraitDiscriminants::Display as u8;
-                let trait_meta = crate::util::create_metadata_items(
-                    "uniffi_trait",
-                    &format!("{}_Display", self_ident.unraw()),
-                    quote! {
-                        ::uniffi::MetadataBuffer::from_code(::uniffi::metadata::codes::UNIFFI_TRAIT)
-                        .concat_value(#discr)
-                        .concat(#method_meta)
-                    },
-                    None,
-                );
-                impl_items.push(method);
-                global_items.push(ffi_func);
-                global_items.push(trait_meta);
-            }
-            UniffiTraitDiscriminants::Hash => {
-                let method = quote! {
-                    fn uniffi_trait_hash(&self) -> u64 {
-                        use ::std::hash::{Hash, Hasher};
-                        ::uniffi::deps::static_assertions::assert_impl_all!(#self_ident: Hash);
-                        let mut s = ::std::collections::hash_map::DefaultHasher::new();
-                        Hash::hash(self, &mut s);
-                        s.finish()
-                    }
-                };
-                let (ffi_func, method_meta) =
-                    process_uniffi_trait_method(&method, &self_ident, udl_mode)?;
-                // metadata for the trait - which includes metadata for the hash method.
-                let discr = UniffiTraitDiscriminants::Hash as u8;
-                let trait_meta = crate::util::create_metadata_items(
-                    "uniffi_trait",
-                    &format!("{}_Hash", self_ident.unraw()),
-                    quote! {
-                        ::uniffi::MetadataBuffer::from_code(::uniffi::metadata::codes::UNIFFI_TRAIT)
-                        .concat_value(#discr)
-                        .concat(#method_meta)
-                    },
-                    None,
-                );
-                impl_items.push(method);
-                global_items.push(ffi_func);
-                global_items.push(trait_meta);
-            }
-            UniffiTraitDiscriminants::Eq => {
-                let method_eq = quote! {
-                    fn uniffi_trait_eq_eq(&self, other: &#self_ident) -> bool {
-                        use ::std::cmp::PartialEq;
-                        uniffi::deps::static_assertions::assert_impl_all!(#self_ident: PartialEq); // This object has a trait method which requires `PartialEq` be implemented.
-                        PartialEq::eq(self, other)
-                    }
-                };
-                let method_ne = quote! {
-                    fn uniffi_trait_eq_ne(&self, other: &#self_ident) -> bool {
-                        use ::std::cmp::PartialEq;
-                        uniffi::deps::static_assertions::assert_impl_all!(#self_ident: PartialEq); // This object has a trait method which requires `PartialEq` be implemented.
-                        PartialEq::ne(self, other)
-                    }
-                };
-                let (ffi_func_eq, method_meta_eq) =
-                    process_uniffi_trait_method(&method_eq, &self_ident, udl_mode)?;
-                let (ffi_func_ne, method_meta_ne) =
-                    process_uniffi_trait_method(&method_ne, &self_ident, udl_mode)?;
-                // metadata for the trait itself.
-                let discr = UniffiTraitDiscriminants::Eq as u8;
-                let trait_meta = crate::util::create_metadata_items(
-                    "uniffi_trait",
-                    &format!("{}_Eq", self_ident.unraw()),
-                    quote! {
-                        ::uniffi::MetadataBuffer::from_code(::uniffi::metadata::codes::UNIFFI_TRAIT)
-                        .concat_value(#discr)
-                        .concat(#method_meta_eq)
-                        .concat(#method_meta_ne)
-                    },
-                    None,
-                );
-                impl_items.push(method_eq);
-                impl_items.push(method_ne);
-                global_items.push(ffi_func_eq);
-                global_items.push(ffi_func_ne);
-                global_items.push(trait_meta);
-            }
-        }
-    }
-    Ok(quote! {
-        #[doc(hidden)]
-        impl #self_ident {
-            #(#impl_items)*
-        }
-        #(#global_items)*
-    })
-}
-
-fn process_uniffi_trait_method(
-    method: &TokenStream,
-    self_ident: &Ident,
-    udl_mode: bool,
-) -> syn::Result<(TokenStream, TokenStream)> {
-    let item = syn::parse(method.clone().into())?;
-
-    let syn::Item::Fn(item) = item else {
-        unreachable!()
-    };
-
-    let docstring = extract_docstring(&item.attrs)?;
-
-    let ffi_func = gen_ffi_function(
-        &FnSignature::new_method(
-            self_ident.clone(),
-            item.sig.clone(),
-            ExportedImplFnArgs::default(),
-            docstring.clone(),
-        )?,
-        &None,
-        udl_mode,
-    )?;
-    // metadata for the method, which will be packed inside metadata for the trait.
-    let method_meta = FnSignature::new_method(
-        self_ident.clone(),
-        item.sig,
-        ExportedImplFnArgs::default(),
-        docstring,
-    )?
-    .metadata_expr()?;
-    Ok((ffi_func, method_meta))
-}
diff --git a/crates/uniffi_macros/src/fnsig.rs b/crates/uniffi_macros/src/fnsig.rs
deleted file mode 100644
index 9c59125..0000000
--- a/crates/uniffi_macros/src/fnsig.rs
+++ /dev/null
@@ -1,584 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-use crate::{
-    default::{default_value_metadata_calls, DefaultValue},
-    export::{DefaultMap, ExportFnArgs, ExportedImplFnArgs},
-    util::{create_metadata_items, ident_to_string, mod_path, try_metadata_value_from_usize},
-};
-use proc_macro2::{Span, TokenStream};
-use quote::quote;
-use syn::{spanned::Spanned, FnArg, Ident, Pat, Receiver, ReturnType, Type};
-
-pub(crate) struct FnSignature {
-    pub kind: FnKind,
-    pub span: Span,
-    pub mod_path: String,
-    // The identifier of the Rust function.
-    pub ident: Ident,
-    // The foreign name for this function, usually == ident.
-    pub name: String,
-    pub is_async: bool,
-    pub receiver: Option<ReceiverArg>,
-    pub args: Vec<NamedArg>,
-    pub return_ty: TokenStream,
-    // Does this the return type look like a result?
-    // Only use this in UDL mode.
-    // In general, it's not reliable because it fails for type aliases.
-    pub looks_like_result: bool,
-    pub docstring: String,
-}
-
-impl FnSignature {
-    pub(crate) fn new_function(
-        sig: syn::Signature,
-        args: ExportFnArgs,
-        docstring: String,
-    ) -> syn::Result<Self> {
-        Self::new(FnKind::Function, sig, args.name, args.defaults, docstring)
-    }
-
-    pub(crate) fn new_method(
-        self_ident: Ident,
-        sig: syn::Signature,
-        args: ExportedImplFnArgs,
-        docstring: String,
-    ) -> syn::Result<Self> {
-        Self::new(
-            FnKind::Method { self_ident },
-            sig,
-            args.name,
-            args.defaults,
-            docstring,
-        )
-    }
-
-    pub(crate) fn new_constructor(
-        self_ident: Ident,
-        sig: syn::Signature,
-        args: ExportedImplFnArgs,
-        docstring: String,
-    ) -> syn::Result<Self> {
-        Self::new(
-            FnKind::Constructor { self_ident },
-            sig,
-            args.name,
-            args.defaults,
-            docstring,
-        )
-    }
-
-    pub(crate) fn new_trait_method(
-        self_ident: Ident,
-        sig: syn::Signature,
-        args: ExportedImplFnArgs,
-        index: u32,
-        docstring: String,
-    ) -> syn::Result<Self> {
-        Self::new(
-            FnKind::TraitMethod { self_ident, index },
-            sig,
-            args.name,
-            args.defaults,
-            docstring,
-        )
-    }
-
-    pub(crate) fn new(
-        kind: FnKind,
-        sig: syn::Signature,
-        name: Option<String>,
-        mut defaults: DefaultMap,
-        docstring: String,
-    ) -> syn::Result<Self> {
-        let span = sig.span();
-        let ident = sig.ident;
-        let looks_like_result = looks_like_result(&sig.output);
-        let output = match sig.output {
-            ReturnType::Default => quote! { () },
-            ReturnType::Type(_, ty) => quote! { #ty },
-        };
-        let is_async = sig.asyncness.is_some();
-
-        let mut input_iter = sig
-            .inputs
-            .into_iter()
-            .map(|a| Arg::new(a, &mut defaults))
-            .peekable();
-
-        let receiver = input_iter
-            .next_if(|a| matches!(a, Ok(a) if a.is_receiver()))
-            .map(|a| match a {
-                Ok(Arg {
-                    kind: ArgKind::Receiver(r),
-                    ..
-                }) => r,
-                _ => unreachable!(),
-            });
-        let args = input_iter
-            .map(|a| {
-                a.and_then(|a| match a.kind {
-                    ArgKind::Named(named) => Ok(named),
-                    ArgKind::Receiver(_) => {
-                        Err(syn::Error::new(a.span, "Unexpected receiver argument"))
-                    }
-                })
-            })
-            .collect::<syn::Result<Vec<_>>>()?;
-
-        if let Some(ident) = defaults.idents().first() {
-            return Err(syn::Error::new(
-                ident.span(),
-                format!("Unknown default argument: {}", ident),
-            ));
-        }
-
-        Ok(Self {
-            kind,
-            span,
-            mod_path: mod_path()?,
-            name: name.unwrap_or_else(|| ident_to_string(&ident)),
-            ident,
-            is_async,
-            receiver,
-            args,
-            return_ty: output,
-            looks_like_result,
-            docstring,
-        })
-    }
-
-    pub fn lower_return_impl(&self) -> TokenStream {
-        let return_ty = &self.return_ty;
-        quote! {
-            <#return_ty as ::uniffi::LowerReturn<crate::UniFfiTag>>
-        }
-    }
-
-    pub fn lift_return_impl(&self) -> TokenStream {
-        let return_ty = &self.return_ty;
-        quote! {
-            <#return_ty as ::uniffi::LiftReturn<crate::UniFfiTag>>
-        }
-    }
-
-    /// Generate a closure that tries to lift all arguments into a tuple.
-    ///
-    /// The closure moves all scaffolding arguments into itself and returns:
-    ///   - The lifted argument tuple on success
-    ///   - The field name and error on failure (`Err(&'static str, anyhow::Error>`)
-    pub fn lift_closure(&self, self_lift: Option<TokenStream>) -> TokenStream {
-        let arg_lifts = self.args.iter().map(|arg| {
-            let ident = &arg.ident;
-            let lift_impl = arg.lift_impl();
-            let name = &arg.name;
-            quote! {
-                match #lift_impl::try_lift(#ident) {
-                    Ok(v) => v,
-                    Err(e) => return Err((#name, e)),
-                }
-            }
-        });
-        let all_lifts = self_lift.into_iter().chain(arg_lifts);
-        quote! {
-            move || Ok((
-                #(#all_lifts,)*
-            ))
-        }
-    }
-
-    /// Call a Rust function from a [Self::lift_closure] success.
-    ///
-    /// This takes an Ok value returned by `lift_closure` with the name `uniffi_args` and generates
-    /// a series of parameters to pass to the Rust function.
-    pub fn rust_call_params(&self, self_lift: bool) -> TokenStream {
-        let start_idx = if self_lift { 1 } else { 0 };
-        let args = self.args.iter().enumerate().map(|(i, arg)| {
-            let idx = syn::Index::from(i + start_idx);
-            let ty = &arg.ty;
-            match &arg.ref_type {
-                None => quote! { uniffi_args.#idx },
-                Some(ref_type) => quote! {
-                    <#ty as ::std::borrow::Borrow<#ref_type>>::borrow(&uniffi_args.#idx)
-                },
-            }
-        });
-        quote! { #(#args),* }
-    }
-
-    /// Parameters expressions for each of our arguments
-    pub fn params(&self) -> impl Iterator<Item = TokenStream> + '_ {
-        self.args.iter().map(NamedArg::param)
-    }
-
-    /// Name of the scaffolding function to generate for this function
-    pub fn scaffolding_fn_ident(&self) -> syn::Result<Ident> {
-        let name = &self.name;
-        let name = match &self.kind {
-            FnKind::Function => uniffi_meta::fn_symbol_name(&self.mod_path, name),
-            FnKind::Method { self_ident } | FnKind::TraitMethod { self_ident, .. } => {
-                uniffi_meta::method_symbol_name(&self.mod_path, &ident_to_string(self_ident), name)
-            }
-            FnKind::Constructor { self_ident } => uniffi_meta::constructor_symbol_name(
-                &self.mod_path,
-                &ident_to_string(self_ident),
-                name,
-            ),
-        };
-        Ok(Ident::new(&name, Span::call_site()))
-    }
-
-    /// Scaffolding parameters expressions for each of our arguments
-    pub fn scaffolding_param_names(&self) -> impl Iterator<Item = TokenStream> + '_ {
-        self.args.iter().map(|a| {
-            let ident = &a.ident;
-            quote! { #ident }
-        })
-    }
-
-    pub fn scaffolding_param_types(&self) -> impl Iterator<Item = TokenStream> + '_ {
-        self.args.iter().map(|a| {
-            let lift_impl = a.lift_impl();
-            quote! { #lift_impl::FfiType }
-        })
-    }
-
-    /// Generate metadata items for this function
-    pub(crate) fn metadata_expr(&self) -> syn::Result<TokenStream> {
-        let Self {
-            name,
-            return_ty,
-            is_async,
-            mod_path,
-            docstring,
-            ..
-        } = &self;
-        let args_len = try_metadata_value_from_usize(
-            // Use param_lifts to calculate this instead of sig.inputs to avoid counting any self
-            // params
-            self.args.len(),
-            "UniFFI limits functions to 256 arguments",
-        )?;
-        let arg_metadata_calls = self
-            .args
-            .iter()
-            .map(NamedArg::arg_metadata)
-            .collect::<syn::Result<Vec<_>>>()?;
-
-        match &self.kind {
-            FnKind::Function => Ok(quote! {
-                ::uniffi::MetadataBuffer::from_code(::uniffi::metadata::codes::FUNC)
-                    .concat_str(#mod_path)
-                    .concat_str(#name)
-                    .concat_bool(#is_async)
-                    .concat_value(#args_len)
-                    #(#arg_metadata_calls)*
-                    .concat(<#return_ty as ::uniffi::LowerReturn<crate::UniFfiTag>>::TYPE_ID_META)
-                    .concat_long_str(#docstring)
-            }),
-
-            FnKind::Method { self_ident } => {
-                let object_name = ident_to_string(self_ident);
-                Ok(quote! {
-                    ::uniffi::MetadataBuffer::from_code(::uniffi::metadata::codes::METHOD)
-                        .concat_str(#mod_path)
-                        .concat_str(#object_name)
-                        .concat_str(#name)
-                        .concat_bool(#is_async)
-                        .concat_value(#args_len)
-                        #(#arg_metadata_calls)*
-                        .concat(<#return_ty as ::uniffi::LowerReturn<crate::UniFfiTag>>::TYPE_ID_META)
-                        .concat_long_str(#docstring)
-                })
-            }
-
-            FnKind::TraitMethod { self_ident, index } => {
-                let object_name = ident_to_string(self_ident);
-                Ok(quote! {
-                    ::uniffi::MetadataBuffer::from_code(::uniffi::metadata::codes::TRAIT_METHOD)
-                        .concat_str(#mod_path)
-                        .concat_str(#object_name)
-                        .concat_u32(#index)
-                        .concat_str(#name)
-                        .concat_bool(#is_async)
-                        .concat_value(#args_len)
-                        #(#arg_metadata_calls)*
-                        .concat(<#return_ty as ::uniffi::LowerReturn<crate::UniFfiTag>>::TYPE_ID_META)
-                        .concat_long_str(#docstring)
-                })
-            }
-
-            FnKind::Constructor { self_ident } => {
-                let object_name = ident_to_string(self_ident);
-                Ok(quote! {
-                    ::uniffi::MetadataBuffer::from_code(::uniffi::metadata::codes::CONSTRUCTOR)
-                        .concat_str(#mod_path)
-                        .concat_str(#object_name)
-                        .concat_str(#name)
-                        .concat_bool(#is_async)
-                        .concat_value(#args_len)
-                        #(#arg_metadata_calls)*
-                        .concat(<#return_ty as ::uniffi::LowerReturn<crate::UniFfiTag>>::TYPE_ID_META)
-                        .concat_long_str(#docstring)
-                })
-            }
-        }
-    }
-
-    pub(crate) fn metadata_items(&self) -> syn::Result<TokenStream> {
-        let Self { name, .. } = &self;
-        match &self.kind {
-            FnKind::Function => Ok(create_metadata_items(
-                "func",
-                name,
-                self.metadata_expr()?,
-                Some(self.checksum_symbol_name()),
-            )),
-
-            FnKind::Method { self_ident } => {
-                let object_name = ident_to_string(self_ident);
-                Ok(create_metadata_items(
-                    "method",
-                    &format!("{object_name}_{name}"),
-                    self.metadata_expr()?,
-                    Some(self.checksum_symbol_name()),
-                ))
-            }
-
-            FnKind::TraitMethod { self_ident, .. } => {
-                let object_name = ident_to_string(self_ident);
-                Ok(create_metadata_items(
-                    "method",
-                    &format!("{object_name}_{name}"),
-                    self.metadata_expr()?,
-                    Some(self.checksum_symbol_name()),
-                ))
-            }
-
-            FnKind::Constructor { self_ident } => {
-                let object_name = ident_to_string(self_ident);
-                Ok(create_metadata_items(
-                    "constructor",
-                    &format!("{object_name}_{name}"),
-                    self.metadata_expr()?,
-                    Some(self.checksum_symbol_name()),
-                ))
-            }
-        }
-    }
-
-    /// Generate metadata items for callback interfaces
-    ///
-    /// Unfortunately, most of this is duplicate code from [Self::metadata_items] and
-    /// [Self::metadata_expr].  However, one issue with that code is that it needs to assume if the
-    /// arguments are being lifted vs lowered in order to get TYPE_ID_META.  That code uses
-    /// `<Type as Lift>::TYPE_ID_META` for arguments and `<Type as LowerReturn>::TYPE_ID_META` for
-    /// return types, which works for accidental/historical reasons.
-    ///
-    /// The one exception is callback interfaces (#1947), which are handled by this method.
-    ///
-    /// TODO: fix the metadata system so that this is not needed.
-    pub(crate) fn metadata_items_for_callback_interface(&self) -> syn::Result<TokenStream> {
-        let Self {
-            name,
-            return_ty,
-            is_async,
-            mod_path,
-            docstring,
-            ..
-        } = &self;
-        match &self.kind {
-            FnKind::TraitMethod {
-                self_ident, index, ..
-            } => {
-                let object_name = ident_to_string(self_ident);
-                let args_len = try_metadata_value_from_usize(
-                    // Use param_lifts to calculate this instead of sig.inputs to avoid counting any self
-                    // params
-                    self.args.len(),
-                    "UniFFI limits functions to 256 arguments",
-                )?;
-                let arg_metadata_calls = self
-                    .args
-                    .iter()
-                    .map(NamedArg::arg_metadata)
-                    .collect::<syn::Result<Vec<_>>>()?;
-                let metadata_expr = quote! {
-                    ::uniffi::MetadataBuffer::from_code(::uniffi::metadata::codes::TRAIT_METHOD)
-                        .concat_str(#mod_path)
-                        .concat_str(#object_name)
-                        .concat_u32(#index)
-                        .concat_str(#name)
-                        .concat_bool(#is_async)
-                        .concat_value(#args_len)
-                        #(#arg_metadata_calls)*
-                        .concat(<#return_ty as ::uniffi::LiftReturn<crate::UniFfiTag>>::TYPE_ID_META)
-                        .concat_long_str(#docstring)
-                };
-                Ok(create_metadata_items(
-                    "method",
-                    &format!("{object_name}_{name}"),
-                    metadata_expr,
-                    Some(self.checksum_symbol_name()),
-                ))
-            }
-
-            // This should never happen and indicates an error in the internal code
-            _ => panic!(
-                "metadata_items_for_callback_interface can only be called with `TraitMethod` sigs"
-            ),
-        }
-    }
-
-    pub(crate) fn checksum_symbol_name(&self) -> String {
-        let name = &self.name;
-        match &self.kind {
-            FnKind::Function => uniffi_meta::fn_checksum_symbol_name(&self.mod_path, name),
-            FnKind::Method { self_ident } | FnKind::TraitMethod { self_ident, .. } => {
-                uniffi_meta::method_checksum_symbol_name(
-                    &self.mod_path,
-                    &ident_to_string(self_ident),
-                    name,
-                )
-            }
-            FnKind::Constructor { self_ident } => uniffi_meta::constructor_checksum_symbol_name(
-                &self.mod_path,
-                &ident_to_string(self_ident),
-                name,
-            ),
-        }
-    }
-}
-
-pub(crate) struct Arg {
-    pub(crate) span: Span,
-    pub(crate) kind: ArgKind,
-}
-
-pub(crate) enum ArgKind {
-    Receiver(ReceiverArg),
-    Named(NamedArg),
-}
-
-impl Arg {
-    fn new(syn_arg: FnArg, defaults: &mut DefaultMap) -> syn::Result<Self> {
-        let span = syn_arg.span();
-        let kind = match syn_arg {
-            FnArg::Typed(p) => match *p.pat {
-                Pat::Ident(i) => Ok(ArgKind::Named(NamedArg::new(i.ident, &p.ty, defaults)?)),
-                _ => Err(syn::Error::new_spanned(p, "Argument name missing")),
-            },
-            FnArg::Receiver(receiver) => Ok(ArgKind::Receiver(ReceiverArg::from(receiver))),
-        }?;
-
-        Ok(Self { span, kind })
-    }
-
-    pub(crate) fn is_receiver(&self) -> bool {
-        matches!(self.kind, ArgKind::Receiver(_))
-    }
-}
-
-pub(crate) enum ReceiverArg {
-    Ref,
-    Arc,
-}
-
-impl From<Receiver> for ReceiverArg {
-    fn from(receiver: Receiver) -> Self {
-        if let Type::Path(p) = *receiver.ty {
-            if let Some(segment) = p.path.segments.last() {
-                // This comparison will fail if a user uses a typedef for Arc.  Maybe we could
-                // implement some system like TYPE_ID_META to figure this out from the type system.
-                // However, this seems good enough for now.
-                if segment.ident == "Arc" {
-                    return ReceiverArg::Arc;
-                }
-            }
-        }
-        Self::Ref
-    }
-}
-
-pub(crate) struct NamedArg {
-    pub(crate) ident: Ident,
-    pub(crate) name: String,
-    pub(crate) ty: TokenStream,
-    pub(crate) ref_type: Option<Type>,
-    pub(crate) default: Option<DefaultValue>,
-}
-
-impl NamedArg {
-    pub(crate) fn new(ident: Ident, ty: &Type, defaults: &mut DefaultMap) -> syn::Result<Self> {
-        Ok(match ty {
-            Type::Reference(r) => {
-                let inner = &r.elem;
-                Self {
-                    name: ident_to_string(&ident),
-                    ty: quote! { <#inner as ::uniffi::LiftRef<crate::UniFfiTag>>::LiftType },
-                    ref_type: Some(*inner.clone()),
-                    default: defaults.remove(&ident),
-                    ident,
-                }
-            }
-            _ => Self {
-                name: ident_to_string(&ident),
-                ty: quote! { #ty },
-                ref_type: None,
-                default: defaults.remove(&ident),
-                ident,
-            },
-        })
-    }
-
-    pub(crate) fn lift_impl(&self) -> TokenStream {
-        let ty = &self.ty;
-        quote! { <#ty as ::uniffi::Lift<crate::UniFfiTag>> }
-    }
-
-    pub(crate) fn lower_impl(&self) -> TokenStream {
-        let ty = &self.ty;
-        quote! { <#ty as ::uniffi::Lower<crate::UniFfiTag>> }
-    }
-
-    /// Generate the parameter for this Arg
-    pub(crate) fn param(&self) -> TokenStream {
-        let ident = &self.ident;
-        let ty = &self.ty;
-        quote! { #ident: #ty }
-    }
-
-    pub(crate) fn arg_metadata(&self) -> syn::Result<TokenStream> {
-        let name = &self.name;
-        let lift_impl = self.lift_impl();
-        let default_calls = default_value_metadata_calls(&self.default)?;
-        Ok(quote! {
-            .concat_str(#name)
-            .concat(#lift_impl::TYPE_ID_META)
-            #default_calls
-        })
-    }
-}
-
-fn looks_like_result(return_type: &ReturnType) -> bool {
-    if let ReturnType::Type(_, ty) = return_type {
-        if let Type::Path(p) = &**ty {
-            if let Some(seg) = p.path.segments.last() {
-                if seg.ident == "Result" {
-                    return true;
-                }
-            }
-        }
-    }
-
-    false
-}
-
-#[derive(Debug)]
-pub(crate) enum FnKind {
-    Function,
-    Constructor { self_ident: Ident },
-    Method { self_ident: Ident },
-    TraitMethod { self_ident: Ident, index: u32 },
-}
diff --git a/crates/uniffi_macros/src/lib.rs b/crates/uniffi_macros/src/lib.rs
deleted file mode 100644
index 929400c..0000000
--- a/crates/uniffi_macros/src/lib.rs
+++ /dev/null
@@ -1,393 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-#![cfg_attr(feature = "nightly", feature(proc_macro_expand))]
-#![warn(rust_2018_idioms, unused_qualifications)]
-
-//! Macros for `uniffi`.
-
-#[cfg(feature = "trybuild")]
-use camino::Utf8Path;
-use proc_macro::TokenStream;
-use quote::quote;
-use syn::{
-    parse::{Parse, ParseStream},
-    parse_macro_input, Ident, LitStr, Path, Token,
-};
-
-mod custom;
-mod default;
-mod enum_;
-mod error;
-mod export;
-mod fnsig;
-mod object;
-mod record;
-mod setup_scaffolding;
-mod test;
-mod util;
-
-use self::{
-    enum_::expand_enum, error::expand_error, export::expand_export, object::expand_object,
-    record::expand_record,
-};
-
-struct CustomTypeInfo {
-    ident: Ident,
-    builtin: Path,
-}
-
-impl Parse for CustomTypeInfo {
-    fn parse(input: ParseStream<'_>) -> syn::Result<Self> {
-        let ident = input.parse()?;
-        input.parse::<Token![,]>()?;
-        let builtin = input.parse()?;
-        Ok(Self { ident, builtin })
-    }
-}
-
-/// A macro to build testcases for a component's generated bindings.
-///
-/// This macro provides some plumbing to write automated tests for the generated
-/// foreign language bindings of a component. As a component author, you can write
-/// script files in the target foreign language(s) that exercise you component API,
-/// and then call this macro to produce a `cargo test` testcase from each one.
-/// The generated code will execute your script file with appropriate configuration and
-/// environment to let it load the component bindings, and will pass iff the script
-/// exits successfully.
-///
-/// To use it, invoke the macro with the name of a fixture/example crate as the first argument,
-/// then one or more file paths relative to the crate root directory. It will produce one `#[test]`
-/// function per file, in a manner designed to play nicely with `cargo test` and its test filtering
-/// options.
-#[proc_macro]
-pub fn build_foreign_language_testcases(tokens: TokenStream) -> TokenStream {
-    test::build_foreign_language_testcases(tokens)
-}
-
-/// Top-level initialization macro
-///
-/// The optional namespace argument is only used by the scaffolding templates to pass in the
-/// CI namespace.
-#[proc_macro]
-pub fn setup_scaffolding(tokens: TokenStream) -> TokenStream {
-    let namespace = match syn::parse_macro_input!(tokens as Option<LitStr>) {
-        Some(lit_str) => lit_str.value(),
-        None => match util::mod_path() {
-            Ok(v) => v,
-            Err(e) => return e.into_compile_error().into(),
-        },
-    };
-    setup_scaffolding::setup_scaffolding(namespace)
-        .unwrap_or_else(syn::Error::into_compile_error)
-        .into()
-}
-
-#[proc_macro_attribute]
-pub fn export(attr_args: TokenStream, input: TokenStream) -> TokenStream {
-    do_export(attr_args, input, false)
-}
-
-fn do_export(attr_args: TokenStream, input: TokenStream, udl_mode: bool) -> TokenStream {
-    let copied_input = (!udl_mode).then(|| proc_macro2::TokenStream::from(input.clone()));
-
-    let gen_output = || {
-        let item = syn::parse(input)?;
-        expand_export(item, attr_args, udl_mode)
-    };
-    let output = gen_output().unwrap_or_else(syn::Error::into_compile_error);
-
-    quote! {
-        #copied_input
-        #output
-    }
-    .into()
-}
-
-#[proc_macro_derive(Record, attributes(uniffi))]
-pub fn derive_record(input: TokenStream) -> TokenStream {
-    expand_record(parse_macro_input!(input), false)
-        .unwrap_or_else(syn::Error::into_compile_error)
-        .into()
-}
-
-#[proc_macro_derive(Enum)]
-pub fn derive_enum(input: TokenStream) -> TokenStream {
-    expand_enum(parse_macro_input!(input), None, false)
-        .unwrap_or_else(syn::Error::into_compile_error)
-        .into()
-}
-
-#[proc_macro_derive(Object)]
-pub fn derive_object(input: TokenStream) -> TokenStream {
-    expand_object(parse_macro_input!(input), false)
-        .unwrap_or_else(syn::Error::into_compile_error)
-        .into()
-}
-
-#[proc_macro_derive(Error, attributes(uniffi))]
-pub fn derive_error(input: TokenStream) -> TokenStream {
-    expand_error(parse_macro_input!(input), None, false)
-        .unwrap_or_else(syn::Error::into_compile_error)
-        .into()
-}
-
-/// Generate the `FfiConverter` implementation for a Custom Type - ie,
-/// for a `<T>` which implements `UniffiCustomTypeConverter`.
-#[proc_macro]
-pub fn custom_type(tokens: TokenStream) -> TokenStream {
-    let input: CustomTypeInfo = syn::parse_macro_input!(tokens);
-    custom::expand_ffi_converter_custom_type(&input.ident, &input.builtin, true)
-        .unwrap_or_else(syn::Error::into_compile_error)
-        .into()
-}
-
-/// Generate the `FfiConverter` and the `UniffiCustomTypeConverter` implementations for a
-/// Custom Type - ie, for a `<T>` which implements `UniffiCustomTypeConverter` via the
-/// newtype idiom.
-#[proc_macro]
-pub fn custom_newtype(tokens: TokenStream) -> TokenStream {
-    let input: CustomTypeInfo = syn::parse_macro_input!(tokens);
-    custom::expand_ffi_converter_custom_newtype(&input.ident, &input.builtin, true)
-        .unwrap_or_else(syn::Error::into_compile_error)
-        .into()
-}
-
-// == derive_for_udl and export_for_udl ==
-//
-// The Askama templates generate placeholder items wrapped with these attributes. The goal is to
-// have all scaffolding generation go through the same code path.
-//
-// The one difference is that derive-style attributes are not allowed inside attribute macro
-// inputs.  Instead, we take the attributes from the macro invocation itself.
-//
-// Instead of:
-//
-// ```
-// #[derive(Error)
-// #[uniffi(flat_error])
-// enum { .. }
-// ```
-//
-// We have:
-//
-// ```
-// #[derive_error_for_udl(flat_error)]
-// enum { ... }
-//  ```
-//
-// # Differences between UDL-mode and normal mode
-//
-// ## Metadata symbols / checksum functions
-//
-// In UDL mode, we don't export the static metadata symbols or generate the checksum
-// functions.  This could be changed, but there doesn't seem to be much benefit at this point.
-//
-// ## The FfiConverter<UT> parameter
-//
-// In UDL-mode, we only implement `FfiConverter` for the local tag (`FfiConverter<crate::UniFfiTag>`)
-//
-// The reason for this split is remote types, i.e. types defined in remote crates that we
-// don't control and therefore can't define a blanket impl on because of the orphan rules.
-//
-// With UDL, we handle this by only implementing `FfiConverter<crate::UniFfiTag>` for the
-// type.  This gets around the orphan rules since a local type is in the trait, but requires
-// a `uniffi::ffi_converter_forward!` call if the type is used in a second local crate (an
-// External typedef).  This is natural for UDL-based generation, since you always need to
-// define the external type in the UDL file.
-//
-// With proc-macros this system isn't so natural.  Instead, we create a blanket implementation
-// for all UT and support for remote types is still TODO.
-
-#[doc(hidden)]
-#[proc_macro_attribute]
-pub fn derive_record_for_udl(_attrs: TokenStream, input: TokenStream) -> TokenStream {
-    expand_record(syn::parse_macro_input!(input), true)
-        .unwrap_or_else(syn::Error::into_compile_error)
-        .into()
-}
-
-#[doc(hidden)]
-#[proc_macro_attribute]
-pub fn derive_enum_for_udl(attrs: TokenStream, input: TokenStream) -> TokenStream {
-    expand_enum(
-        syn::parse_macro_input!(input),
-        Some(syn::parse_macro_input!(attrs)),
-        true,
-    )
-    .unwrap_or_else(syn::Error::into_compile_error)
-    .into()
-}
-
-#[doc(hidden)]
-#[proc_macro_attribute]
-pub fn derive_error_for_udl(attrs: TokenStream, input: TokenStream) -> TokenStream {
-    expand_error(
-        syn::parse_macro_input!(input),
-        Some(syn::parse_macro_input!(attrs)),
-        true,
-    )
-    .unwrap_or_else(syn::Error::into_compile_error)
-    .into()
-}
-
-#[doc(hidden)]
-#[proc_macro_attribute]
-pub fn derive_object_for_udl(_attrs: TokenStream, input: TokenStream) -> TokenStream {
-    expand_object(syn::parse_macro_input!(input), true)
-        .unwrap_or_else(syn::Error::into_compile_error)
-        .into()
-}
-
-#[doc(hidden)]
-#[proc_macro_attribute]
-pub fn export_for_udl(attrs: TokenStream, input: TokenStream) -> TokenStream {
-    do_export(attrs, input, true)
-}
-
-/// A helper macro to include generated component scaffolding.
-///
-/// This is a simple convenience macro to include the UniFFI component
-/// scaffolding as built by `uniffi_build::generate_scaffolding`.
-/// Use it like so:
-///
-/// ```rs
-/// uniffi_macros::include_scaffolding!("my_component_name");
-/// ```
-///
-/// This will expand to the appropriate `include!` invocation to include
-/// the generated `my_component_name.uniffi.rs` (which it assumes has
-/// been successfully built by your crate's `build.rs` script).
-#[proc_macro]
-pub fn include_scaffolding(udl_stem: TokenStream) -> TokenStream {
-    let udl_stem = syn::parse_macro_input!(udl_stem as LitStr);
-    if std::env::var("OUT_DIR").is_err() {
-        quote! {
-            compile_error!("This macro assumes the crate has a build.rs script, but $OUT_DIR is not present");
-        }
-    } else {
-        let toml_path = match util::manifest_path() {
-            Ok(path) => path.display().to_string(),
-            Err(_) => {
-                return quote! {
-                    compile_error!("This macro assumes the crate has a build.rs script, but $OUT_DIR is not present");
-                }.into();
-            }
-        };
-
-        quote! {
-            // FIXME(HACK):
-            // Include the `Cargo.toml` file into the build.
-            // That way cargo tracks the file and other tools relying on file
-            // tracking see it as well.
-            // See https://bugzilla.mozilla.org/show_bug.cgi?id=1846223
-            // In the future we should handle that by using the `track_path::path` API,
-            // see https://github.com/rust-lang/rust/pull/84029
-            #[allow(dead_code)]
-            mod __unused {
-                const _: &[u8] = include_bytes!(#toml_path);
-            }
-
-            include!(concat!(env!("OUT_DIR"), "/", #udl_stem, ".uniffi.rs"));
-        }
-    }.into()
-}
-
-// Use a UniFFI types from dependent crates that uses UDL files
-// See the derive_for_udl and export_for_udl section for a discussion of why this is needed.
-#[proc_macro]
-pub fn use_udl_record(tokens: TokenStream) -> TokenStream {
-    use_udl_simple_type(tokens)
-}
-
-#[proc_macro]
-pub fn use_udl_enum(tokens: TokenStream) -> TokenStream {
-    use_udl_simple_type(tokens)
-}
-
-#[proc_macro]
-pub fn use_udl_error(tokens: TokenStream) -> TokenStream {
-    use_udl_simple_type(tokens)
-}
-
-fn use_udl_simple_type(tokens: TokenStream) -> TokenStream {
-    let util::ExternalTypeItem {
-        crate_ident,
-        type_ident,
-        ..
-    } = parse_macro_input!(tokens);
-    quote! {
-        ::uniffi::ffi_converter_forward!(#type_ident, #crate_ident::UniFfiTag, crate::UniFfiTag);
-    }
-    .into()
-}
-
-#[proc_macro]
-pub fn use_udl_object(tokens: TokenStream) -> TokenStream {
-    let util::ExternalTypeItem {
-        crate_ident,
-        type_ident,
-        ..
-    } = parse_macro_input!(tokens);
-    quote! {
-        ::uniffi::ffi_converter_arc_forward!(#type_ident, #crate_ident::UniFfiTag, crate::UniFfiTag);
-    }.into()
-}
-
-/// A helper macro to generate and include component scaffolding.
-///
-/// This is a convenience macro designed for writing `trybuild`-style tests and
-/// probably shouldn't be used for production code. Given the path to a `.udl` file,
-/// if will run `uniffi-bindgen` to produce the corresponding Rust scaffolding and then
-/// include it directly into the calling file. Like so:
-///
-/// ```rs
-/// uniffi_macros::generate_and_include_scaffolding!("path/to/my/interface.udl");
-/// ```
-#[proc_macro]
-#[cfg(feature = "trybuild")]
-pub fn generate_and_include_scaffolding(udl_file: TokenStream) -> TokenStream {
-    let udl_file = syn::parse_macro_input!(udl_file as LitStr);
-    let udl_file_string = udl_file.value();
-    let udl_file_path = Utf8Path::new(&udl_file_string);
-    if std::env::var("OUT_DIR").is_err() {
-        quote! {
-            compile_error!("This macro assumes the crate has a build.rs script, but $OUT_DIR is not present");
-        }
-    } else if let Err(e) = uniffi_build::generate_scaffolding(udl_file_path) {
-        let err = format!("{e:#}");
-        quote! {
-            compile_error!(concat!("Failed to generate scaffolding from UDL file at ", #udl_file, ": ", #err));
-        }
-    } else {
-        // We know the filename is good because `generate_scaffolding` succeeded,
-        // so this `unwrap` will never fail.
-        let name = LitStr::new(udl_file_path.file_stem().unwrap(), udl_file.span());
-        quote! {
-            uniffi_macros::include_scaffolding!(#name);
-        }
-    }.into()
-}
-
-/// An attribute for constructors.
-///
-/// Constructors are in `impl` blocks which have a `#[uniffi::export]` attribute,
-///
-/// This exists so `#[uniffi::export]` can emit its input verbatim without
-/// causing unexpected errors in the entire exported block.
-/// This happens very often when the proc-macro is run on an incomplete
-/// input by rust-analyzer while the developer is typing.
-///
-/// So much better to do nothing here then let the impl block find the attribute.
-#[proc_macro_attribute]
-pub fn constructor(_attrs: TokenStream, input: TokenStream) -> TokenStream {
-    input
-}
-
-/// An attribute for methods.
-///
-/// Everything above applies here too.
-#[proc_macro_attribute]
-pub fn method(_attrs: TokenStream, input: TokenStream) -> TokenStream {
-    input
-}
diff --git a/crates/uniffi_macros/src/object.rs b/crates/uniffi_macros/src/object.rs
deleted file mode 100644
index 6bcc07a..0000000
--- a/crates/uniffi_macros/src/object.rs
+++ /dev/null
@@ -1,179 +0,0 @@
-use proc_macro2::{Ident, Span, TokenStream};
-use quote::quote;
-use syn::DeriveInput;
-
-use crate::util::{
-    create_metadata_items, extract_docstring, ident_to_string, mod_path, tagged_impl_header,
-};
-use uniffi_meta::ObjectImpl;
-
-pub fn expand_object(input: DeriveInput, udl_mode: bool) -> syn::Result<TokenStream> {
-    let module_path = mod_path()?;
-    let ident = &input.ident;
-    let docstring = extract_docstring(&input.attrs)?;
-    let name = ident_to_string(ident);
-    let clone_fn_ident = Ident::new(
-        &uniffi_meta::clone_fn_symbol_name(&module_path, &name),
-        Span::call_site(),
-    );
-    let free_fn_ident = Ident::new(
-        &uniffi_meta::free_fn_symbol_name(&module_path, &name),
-        Span::call_site(),
-    );
-    let meta_static_var = (!udl_mode).then(|| {
-        interface_meta_static_var(ident, ObjectImpl::Struct, &module_path, docstring)
-            .unwrap_or_else(syn::Error::into_compile_error)
-    });
-    let interface_impl = interface_impl(ident, udl_mode);
-
-    Ok(quote! {
-        #[doc(hidden)]
-        #[no_mangle]
-        pub unsafe extern "C" fn #clone_fn_ident(
-            ptr: *const ::std::ffi::c_void,
-            call_status: &mut ::uniffi::RustCallStatus
-        ) -> *const ::std::ffi::c_void {
-            uniffi::rust_call(call_status, || {
-                unsafe { ::std::sync::Arc::increment_strong_count(ptr) };
-                Ok(ptr)
-            })
-        }
-
-        #[doc(hidden)]
-        #[no_mangle]
-        pub unsafe extern "C" fn #free_fn_ident(
-            ptr: *const ::std::ffi::c_void,
-            call_status: &mut ::uniffi::RustCallStatus
-        ) {
-            uniffi::rust_call(call_status, || {
-                assert!(!ptr.is_null());
-                let ptr = ptr.cast::<#ident>();
-                unsafe {
-                    ::std::sync::Arc::decrement_strong_count(ptr);
-                }
-                Ok(())
-            });
-        }
-
-        #interface_impl
-        #meta_static_var
-    })
-}
-
-pub(crate) fn interface_impl(ident: &Ident, udl_mode: bool) -> TokenStream {
-    let name = ident_to_string(ident);
-    let impl_spec = tagged_impl_header("FfiConverterArc", ident, udl_mode);
-    let lower_return_impl_spec = tagged_impl_header("LowerReturn", ident, udl_mode);
-    let lift_ref_impl_spec = tagged_impl_header("LiftRef", ident, udl_mode);
-    let mod_path = match mod_path() {
-        Ok(p) => p,
-        Err(e) => return e.into_compile_error(),
-    };
-
-    quote! {
-        // All Object structs must be `Sync + Send`. The generated scaffolding will fail to compile
-        // if they are not, but unfortunately it fails with an unactionably obscure error message.
-        // By asserting the requirement explicitly, we help Rust produce a more scrutable error message
-        // and thus help the user debug why the requirement isn't being met.
-        uniffi::deps::static_assertions::assert_impl_all!(#ident: ::core::marker::Sync, ::core::marker::Send);
-
-        #[doc(hidden)]
-        #[automatically_derived]
-        /// Support for passing reference-counted shared objects via the FFI.
-        ///
-        /// To avoid dealing with complex lifetime semantics over the FFI, any data passed
-        /// by reference must be encapsulated in an `Arc`, and must be safe to share
-        /// across threads.
-        unsafe #impl_spec {
-            // Don't use a pointer to <T> as that requires a `pub <T>`
-            type FfiType = *const ::std::os::raw::c_void;
-
-            /// When lowering, we have an owned `Arc` and we transfer that ownership
-            /// to the foreign-language code, "leaking" it out of Rust's ownership system
-            /// as a raw pointer. This works safely because we have unique ownership of `self`.
-            /// The foreign-language code is responsible for freeing this by calling the
-            /// `ffi_object_free` FFI function provided by the corresponding UniFFI type.
-            ///
-            /// Safety: when freeing the resulting pointer, the foreign-language code must
-            /// call the destructor function specific to the type `T`. Calling the destructor
-            /// function for other types may lead to undefined behaviour.
-            fn lower(obj: ::std::sync::Arc<Self>) -> Self::FfiType {
-                ::std::sync::Arc::into_raw(obj) as Self::FfiType
-            }
-
-            /// When lifting, we receive an owned `Arc` that the foreign language code cloned.
-            fn try_lift(v: Self::FfiType) -> ::uniffi::Result<::std::sync::Arc<Self>> {
-                let v = v as *const #ident;
-                Ok(unsafe { ::std::sync::Arc::<Self>::from_raw(v) })
-            }
-
-            /// When writing as a field of a complex structure, make a clone and transfer ownership
-            /// of it to the foreign-language code by writing its pointer into the buffer.
-            /// The foreign-language code is responsible for freeing this by calling the
-            /// `ffi_object_free` FFI function provided by the corresponding UniFFI type.
-            ///
-            /// Safety: when freeing the resulting pointer, the foreign-language code must
-            /// call the destructor function specific to the type `T`. Calling the destructor
-            /// function for other types may lead to undefined behaviour.
-            fn write(obj: ::std::sync::Arc<Self>, buf: &mut Vec<u8>) {
-                ::uniffi::deps::static_assertions::const_assert!(::std::mem::size_of::<*const ::std::ffi::c_void>() <= 8);
-                ::uniffi::deps::bytes::BufMut::put_u64(buf, <Self as ::uniffi::FfiConverterArc<crate::UniFfiTag>>::lower(obj) as u64);
-            }
-
-            /// When reading as a field of a complex structure, we receive a "borrow" of the `Arc`
-            /// that is owned by the foreign-language code, and make a clone for our own use.
-            ///
-            /// Safety: the buffer must contain a pointer previously obtained by calling
-            /// the `lower()` or `write()` method of this impl.
-            fn try_read(buf: &mut &[u8]) -> ::uniffi::Result<::std::sync::Arc<Self>> {
-                ::uniffi::deps::static_assertions::const_assert!(::std::mem::size_of::<*const ::std::ffi::c_void>() <= 8);
-                ::uniffi::check_remaining(buf, 8)?;
-                <Self as ::uniffi::FfiConverterArc<crate::UniFfiTag>>::try_lift(::uniffi::deps::bytes::Buf::get_u64(buf) as Self::FfiType)
-            }
-
-            const TYPE_ID_META: ::uniffi::MetadataBuffer = ::uniffi::MetadataBuffer::from_code(::uniffi::metadata::codes::TYPE_INTERFACE)
-                .concat_str(#mod_path)
-                .concat_str(#name);
-        }
-
-        unsafe #lower_return_impl_spec {
-            type ReturnType = <Self as ::uniffi::FfiConverterArc<crate::UniFfiTag>>::FfiType;
-
-            fn lower_return(obj: Self) -> ::std::result::Result<Self::ReturnType, ::uniffi::RustBuffer> {
-                Ok(<Self as ::uniffi::FfiConverterArc<crate::UniFfiTag>>::lower(::std::sync::Arc::new(obj)))
-            }
-
-            const TYPE_ID_META: ::uniffi::MetadataBuffer = <Self as ::uniffi::FfiConverterArc<crate::UniFfiTag>>::TYPE_ID_META;
-        }
-
-        unsafe #lift_ref_impl_spec {
-            type LiftType = ::std::sync::Arc<Self>;
-        }
-    }
-}
-
-pub(crate) fn interface_meta_static_var(
-    ident: &Ident,
-    imp: ObjectImpl,
-    module_path: &str,
-    docstring: String,
-) -> syn::Result<TokenStream> {
-    let name = ident_to_string(ident);
-    let code = match imp {
-        ObjectImpl::Struct => quote! { ::uniffi::metadata::codes::INTERFACE },
-        ObjectImpl::Trait => quote! { ::uniffi::metadata::codes::TRAIT_INTERFACE },
-        ObjectImpl::CallbackTrait => quote! { ::uniffi::metadata::codes::CALLBACK_TRAIT_INTERFACE },
-    };
-
-    Ok(create_metadata_items(
-        "interface",
-        &name,
-        quote! {
-            ::uniffi::MetadataBuffer::from_code(#code)
-                .concat_str(#module_path)
-                .concat_str(#name)
-                .concat_long_str(#docstring)
-        },
-        None,
-    ))
-}
diff --git a/crates/uniffi_macros/src/record.rs b/crates/uniffi_macros/src/record.rs
deleted file mode 100644
index 41f5d01..0000000
--- a/crates/uniffi_macros/src/record.rs
+++ /dev/null
@@ -1,155 +0,0 @@
-use proc_macro2::{Ident, Span, TokenStream};
-use quote::quote;
-use syn::{parse::ParseStream, Data, DataStruct, DeriveInput, Field, Token};
-
-use crate::{
-    default::{default_value_metadata_calls, DefaultValue},
-    util::{
-        create_metadata_items, derive_all_ffi_traits, either_attribute_arg, extract_docstring,
-        ident_to_string, kw, mod_path, tagged_impl_header, try_metadata_value_from_usize,
-        try_read_field, AttributeSliceExt, UniffiAttributeArgs,
-    },
-};
-
-pub fn expand_record(input: DeriveInput, udl_mode: bool) -> syn::Result<TokenStream> {
-    if let Some(e) = input.attrs.uniffi_attr_args_not_allowed_here() {
-        return Err(e);
-    }
-    let record = match input.data {
-        Data::Struct(s) => s,
-        _ => {
-            return Err(syn::Error::new(
-                Span::call_site(),
-                "This derive must only be used on structs",
-            ));
-        }
-    };
-
-    let ident = &input.ident;
-    let docstring = extract_docstring(&input.attrs)?;
-    let ffi_converter = record_ffi_converter_impl(ident, &record, udl_mode)
-        .unwrap_or_else(syn::Error::into_compile_error);
-    let meta_static_var = (!udl_mode).then(|| {
-        record_meta_static_var(ident, docstring, &record)
-            .unwrap_or_else(syn::Error::into_compile_error)
-    });
-
-    Ok(quote! {
-        #ffi_converter
-        #meta_static_var
-    })
-}
-
-pub(crate) fn record_ffi_converter_impl(
-    ident: &Ident,
-    record: &DataStruct,
-    udl_mode: bool,
-) -> syn::Result<TokenStream> {
-    let impl_spec = tagged_impl_header("FfiConverter", ident, udl_mode);
-    let derive_ffi_traits = derive_all_ffi_traits(ident, udl_mode);
-    let name = ident_to_string(ident);
-    let mod_path = mod_path()?;
-    let write_impl: TokenStream = record.fields.iter().map(write_field).collect();
-    let try_read_fields: TokenStream = record.fields.iter().map(try_read_field).collect();
-
-    Ok(quote! {
-        #[automatically_derived]
-        unsafe #impl_spec {
-            ::uniffi::ffi_converter_rust_buffer_lift_and_lower!(crate::UniFfiTag);
-
-            fn write(obj: Self, buf: &mut ::std::vec::Vec<u8>) {
-                #write_impl
-            }
-
-            fn try_read(buf: &mut &[::std::primitive::u8]) -> ::uniffi::deps::anyhow::Result<Self> {
-                Ok(Self { #try_read_fields })
-            }
-
-            const TYPE_ID_META: ::uniffi::MetadataBuffer = ::uniffi::MetadataBuffer::from_code(::uniffi::metadata::codes::TYPE_RECORD)
-                .concat_str(#mod_path)
-                .concat_str(#name);
-        }
-
-        #derive_ffi_traits
-    })
-}
-
-fn write_field(f: &Field) -> TokenStream {
-    let ident = &f.ident;
-    let ty = &f.ty;
-
-    quote! {
-        <#ty as ::uniffi::Lower<crate::UniFfiTag>>::write(obj.#ident, buf);
-    }
-}
-
-#[derive(Default)]
-pub struct FieldAttributeArguments {
-    pub(crate) default: Option<DefaultValue>,
-}
-
-impl UniffiAttributeArgs for FieldAttributeArguments {
-    fn parse_one(input: ParseStream<'_>) -> syn::Result<Self> {
-        let _: kw::default = input.parse()?;
-        let _: Token![=] = input.parse()?;
-        let default = input.parse()?;
-        Ok(Self {
-            default: Some(default),
-        })
-    }
-
-    fn merge(self, other: Self) -> syn::Result<Self> {
-        Ok(Self {
-            default: either_attribute_arg(self.default, other.default)?,
-        })
-    }
-}
-
-pub(crate) fn record_meta_static_var(
-    ident: &Ident,
-    docstring: String,
-    record: &DataStruct,
-) -> syn::Result<TokenStream> {
-    let name = ident_to_string(ident);
-    let module_path = mod_path()?;
-    let fields_len =
-        try_metadata_value_from_usize(record.fields.len(), "UniFFI limits structs to 256 fields")?;
-
-    let concat_fields: TokenStream = record
-        .fields
-        .iter()
-        .map(|f| {
-            let attrs = f
-                .attrs
-                .parse_uniffi_attr_args::<FieldAttributeArguments>()?;
-
-            let name = ident_to_string(f.ident.as_ref().unwrap());
-            let docstring = extract_docstring(&f.attrs)?;
-            let ty = &f.ty;
-            let default = default_value_metadata_calls(&attrs.default)?;
-
-            // Note: fields need to implement both `Lower` and `Lift` to be used in a record.  The
-            // TYPE_ID_META should be the same for both traits.
-            Ok(quote! {
-                .concat_str(#name)
-                .concat(<#ty as ::uniffi::Lower<crate::UniFfiTag>>::TYPE_ID_META)
-                #default
-                .concat_long_str(#docstring)
-            })
-        })
-        .collect::<syn::Result<_>>()?;
-
-    Ok(create_metadata_items(
-        "record",
-        &name,
-        quote! {
-            ::uniffi::MetadataBuffer::from_code(::uniffi::metadata::codes::RECORD)
-                .concat_str(#module_path)
-                .concat_str(#name)
-                .concat_value(#fields_len)
-                #concat_fields
-                .concat_long_str(#docstring)
-        },
-        None,
-    ))
-}
diff --git a/crates/uniffi_macros/src/setup_scaffolding.rs b/crates/uniffi_macros/src/setup_scaffolding.rs
deleted file mode 100644
index c82e938..0000000
--- a/crates/uniffi_macros/src/setup_scaffolding.rs
+++ /dev/null
@@ -1,199 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-use proc_macro2::TokenStream;
-use quote::{format_ident, quote};
-use syn::Result;
-
-use crate::util::mod_path;
-use uniffi_meta::UNIFFI_CONTRACT_VERSION;
-
-pub fn setup_scaffolding(namespace: String) -> Result<TokenStream> {
-    let module_path = mod_path()?;
-    let ffi_contract_version_ident = format_ident!("ffi_{module_path}_uniffi_contract_version");
-    let namespace_upper = namespace.to_ascii_uppercase();
-    let namespace_const_ident = format_ident!("UNIFFI_META_CONST_NAMESPACE_{namespace_upper}");
-    let namespace_static_ident = format_ident!("UNIFFI_META_NAMESPACE_{namespace_upper}");
-    let ffi_rustbuffer_alloc_ident = format_ident!("ffi_{module_path}_rustbuffer_alloc");
-    let ffi_rustbuffer_from_bytes_ident = format_ident!("ffi_{module_path}_rustbuffer_from_bytes");
-    let ffi_rustbuffer_free_ident = format_ident!("ffi_{module_path}_rustbuffer_free");
-    let ffi_rustbuffer_reserve_ident = format_ident!("ffi_{module_path}_rustbuffer_reserve");
-    let reexport_hack_ident = format_ident!("{module_path}_uniffi_reexport_hack");
-    let ffi_rust_future_scaffolding_fns = rust_future_scaffolding_fns(&module_path);
-
-    Ok(quote! {
-        // Unit struct to parameterize the FfiConverter trait.
-        //
-        // We use FfiConverter<UniFfiTag> to handle lowering/lifting/serializing types for this crate.  See
-        // https://mozilla.github.io/uniffi-rs/internals/lifting_and_lowering.html#code-generation-and-the-fficonverter-trait
-        // for details.
-        //
-        // This is pub, since we need to access it to support external types
-        #[doc(hidden)]
-        pub struct UniFfiTag;
-
-        #[allow(clippy::missing_safety_doc, missing_docs)]
-        #[doc(hidden)]
-        #[no_mangle]
-        pub extern "C" fn #ffi_contract_version_ident() -> u32 {
-            #UNIFFI_CONTRACT_VERSION
-        }
-
-
-        /// Export namespace metadata.
-        ///
-        /// See `uniffi_bindgen::macro_metadata` for how this is used.
-
-        const #namespace_const_ident: ::uniffi::MetadataBuffer = ::uniffi::MetadataBuffer::from_code(::uniffi::metadata::codes::NAMESPACE)
-            .concat_str(#module_path)
-            .concat_str(#namespace);
-
-        #[doc(hidden)]
-        #[no_mangle]
-        pub static #namespace_static_ident: [u8; #namespace_const_ident.size] = #namespace_const_ident.into_array();
-
-        // Everybody gets basic buffer support, since it's needed for passing complex types over the FFI.
-        //
-        // See `uniffi/src/ffi/rustbuffer.rs` for documentation on these functions
-
-        #[allow(clippy::missing_safety_doc, missing_docs)]
-        #[doc(hidden)]
-        #[no_mangle]
-        pub extern "C" fn #ffi_rustbuffer_alloc_ident(size: u64, call_status: &mut uniffi::RustCallStatus) -> uniffi::RustBuffer {
-            uniffi::ffi::uniffi_rustbuffer_alloc(size, call_status)
-        }
-
-        #[allow(clippy::missing_safety_doc, missing_docs)]
-        #[doc(hidden)]
-        #[no_mangle]
-        pub unsafe extern "C" fn #ffi_rustbuffer_from_bytes_ident(bytes: uniffi::ForeignBytes, call_status: &mut uniffi::RustCallStatus) -> uniffi::RustBuffer {
-            uniffi::ffi::uniffi_rustbuffer_from_bytes(bytes, call_status)
-        }
-
-        #[allow(clippy::missing_safety_doc, missing_docs)]
-        #[doc(hidden)]
-        #[no_mangle]
-        pub unsafe extern "C" fn #ffi_rustbuffer_free_ident(buf: uniffi::RustBuffer, call_status: &mut uniffi::RustCallStatus) {
-            uniffi::ffi::uniffi_rustbuffer_free(buf, call_status);
-        }
-
-        #[allow(clippy::missing_safety_doc, missing_docs)]
-        #[doc(hidden)]
-        #[no_mangle]
-        pub unsafe extern "C" fn #ffi_rustbuffer_reserve_ident(buf: uniffi::RustBuffer, additional: u64, call_status: &mut uniffi::RustCallStatus) -> uniffi::RustBuffer {
-            uniffi::ffi::uniffi_rustbuffer_reserve(buf, additional, call_status)
-        }
-
-        #ffi_rust_future_scaffolding_fns
-
-        // Code to re-export the UniFFI scaffolding functions.
-        //
-        // Rust won't always re-export the functions from dependencies
-        // ([rust-lang#50007](https://github.com/rust-lang/rust/issues/50007))
-        //
-        // A workaround for this is to have the dependent crate reference a function from its dependency in
-        // an extern "C" function. This is clearly hacky and brittle, but at least we have some unittests
-        // that check if this works (fixtures/reexport-scaffolding-macro).
-        //
-        // The main way we use this macro is for that contain multiple UniFFI components (libxul,
-        // megazord).  The combined library has a cargo dependency for each component and calls
-        // uniffi_reexport_scaffolding!() for each one.
-
-        #[allow(missing_docs)]
-        #[doc(hidden)]
-        pub const fn uniffi_reexport_hack() {}
-
-        #[doc(hidden)]
-        #[macro_export]
-        macro_rules! uniffi_reexport_scaffolding {
-            () => {
-                #[doc(hidden)]
-                #[no_mangle]
-                pub extern "C" fn #reexport_hack_ident() {
-                    $crate::uniffi_reexport_hack()
-                }
-            };
-        }
-
-        // A trait that's in our crate for our external wrapped types to implement.
-        #[allow(unused)]
-        #[doc(hidden)]
-        pub trait UniffiCustomTypeConverter {
-            type Builtin;
-            fn into_custom(val: Self::Builtin) -> uniffi::Result<Self> where Self: Sized;
-            fn from_custom(obj: Self) -> Self::Builtin;
-        }
-    })
-}
-
-/// Generates the rust_future_* functions
-///
-/// The foreign side uses a type-erased `Handle` to interact with futures, which presents
-/// a problem when creating scaffolding functions.  What is the `ReturnType` parameter of `RustFutureFfi`?
-///
-/// Handle this by using some brute-force monomorphization.  For each possible ffi type, we
-/// generate a set of scaffolding functions.  The bindings code is responsible for calling the one
-/// corresponds the scaffolding function that created the `Handle`.
-///
-/// This introduces safety issues, but we do get some type checking.  If the bindings code calls
-/// the wrong rust_future_complete function, they should get an unexpected return type, which
-/// hopefully will result in a compile-time error.
-fn rust_future_scaffolding_fns(module_path: &str) -> TokenStream {
-    let fn_info = [
-        (quote! { u8 }, "u8"),
-        (quote! { i8 }, "i8"),
-        (quote! { u16 }, "u16"),
-        (quote! { i16 }, "i16"),
-        (quote! { u32 }, "u32"),
-        (quote! { i32 }, "i32"),
-        (quote! { u64 }, "u64"),
-        (quote! { i64 }, "i64"),
-        (quote! { f32 }, "f32"),
-        (quote! { f64 }, "f64"),
-        (quote! { *const ::std::ffi::c_void }, "pointer"),
-        (quote! { ::uniffi::RustBuffer }, "rust_buffer"),
-        (quote! { () }, "void"),
-    ];
-    fn_info.iter()
-    .map(|(return_type, fn_suffix)| {
-        let ffi_rust_future_poll = format_ident!("ffi_{module_path}_rust_future_poll_{fn_suffix}");
-        let ffi_rust_future_cancel = format_ident!("ffi_{module_path}_rust_future_cancel_{fn_suffix}");
-        let ffi_rust_future_complete = format_ident!("ffi_{module_path}_rust_future_complete_{fn_suffix}");
-        let ffi_rust_future_free = format_ident!("ffi_{module_path}_rust_future_free_{fn_suffix}");
-
-        quote! {
-            #[allow(clippy::missing_safety_doc, missing_docs)]
-            #[doc(hidden)]
-            #[no_mangle]
-            pub unsafe extern "C" fn #ffi_rust_future_poll(handle: ::uniffi::Handle, callback: ::uniffi::RustFutureContinuationCallback, data: u64) {
-                ::uniffi::ffi::rust_future_poll::<#return_type, crate::UniFfiTag>(handle, callback, data);
-            }
-
-            #[allow(clippy::missing_safety_doc, missing_docs)]
-            #[doc(hidden)]
-            #[no_mangle]
-            pub unsafe extern "C" fn #ffi_rust_future_cancel(handle: ::uniffi::Handle) {
-                ::uniffi::ffi::rust_future_cancel::<#return_type, crate::UniFfiTag>(handle)
-            }
-
-            #[allow(clippy::missing_safety_doc, missing_docs)]
-            #[doc(hidden)]
-            #[no_mangle]
-            pub unsafe extern "C" fn #ffi_rust_future_complete(
-                handle: ::uniffi::Handle,
-                out_status: &mut ::uniffi::RustCallStatus
-            ) -> #return_type {
-                ::uniffi::ffi::rust_future_complete::<#return_type, crate::UniFfiTag>(handle, out_status)
-            }
-
-            #[allow(clippy::missing_safety_doc, missing_docs)]
-            #[doc(hidden)]
-            #[no_mangle]
-            pub unsafe extern "C" fn #ffi_rust_future_free(handle: ::uniffi::Handle) {
-                ::uniffi::ffi::rust_future_free::<#return_type, crate::UniFfiTag>(handle)
-            }
-        }
-    })
-    .collect()
-}
diff --git a/crates/uniffi_macros/src/test.rs b/crates/uniffi_macros/src/test.rs
deleted file mode 100644
index da7a343..0000000
--- a/crates/uniffi_macros/src/test.rs
+++ /dev/null
@@ -1,90 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-use camino::{Utf8Path, Utf8PathBuf};
-use proc_macro::TokenStream;
-use quote::{format_ident, quote};
-use std::env;
-use syn::{parse_macro_input, punctuated::Punctuated, LitStr, Token};
-
-pub(crate) fn build_foreign_language_testcases(tokens: TokenStream) -> TokenStream {
-    let input = parse_macro_input!(tokens as BuildForeignLanguageTestCaseInput);
-    // we resolve each path relative to the crate root directory.
-    let pkg_dir = env::var("CARGO_MANIFEST_DIR")
-        .expect("Missing $CARGO_MANIFEST_DIR, cannot build tests for generated bindings");
-
-    // For each test file found, generate a matching testcase.
-    let test_functions = input
-        .test_scripts
-        .iter()
-        .map(|file_path| {
-            let test_file_pathbuf: Utf8PathBuf = [&pkg_dir, file_path].iter().collect();
-            let test_file_path = test_file_pathbuf.to_string();
-            let test_file_name = test_file_pathbuf
-                .file_name()
-                .expect("Test file has no name, cannot build tests for generated bindings");
-            let test_name = format_ident!(
-                "uniffi_foreign_language_testcase_{}",
-                test_file_name.replace(|c: char| !c.is_alphanumeric(), "_")
-            );
-            let run_test = match test_file_pathbuf.extension() {
-                Some("kts") => quote! {
-                    uniffi::kotlin_run_test
-                },
-                Some("swift") => quote! {
-                    uniffi::swift_run_test
-                },
-                Some("py") => quote! {
-                    uniffi::python_run_test
-                },
-                Some("rb") => quote! {
-                    uniffi::ruby_run_test
-                },
-                _ => panic!("Unexpected extension for test script: {test_file_name}"),
-            };
-            let maybe_ignore = if should_skip_path(&test_file_pathbuf) {
-                quote! { #[ignore] }
-            } else {
-                quote! {}
-            };
-            quote! {
-                #maybe_ignore
-                #[test]
-                fn #test_name () -> uniffi::deps::anyhow::Result<()> {
-                    #run_test(
-                        std::env!("CARGO_TARGET_TMPDIR"),
-                        std::env!("CARGO_PKG_NAME"),
-                        #test_file_path)
-                }
-            }
-        })
-        .collect::<Vec<proc_macro2::TokenStream>>();
-    let test_module = quote! {
-        #(#test_functions)*
-    };
-    TokenStream::from(test_module)
-}
-
-// UNIFFI_TESTS_DISABLE_EXTENSIONS contains a comma-sep'd list of extensions (without leading `.`)
-fn should_skip_path(path: &Utf8Path) -> bool {
-    let ext = path.extension().expect("File has no extension!");
-    env::var("UNIFFI_TESTS_DISABLE_EXTENSIONS")
-        .map(|v| v.split(',').any(|look| look == ext))
-        .unwrap_or(false)
-}
-
-struct BuildForeignLanguageTestCaseInput {
-    test_scripts: Vec<String>,
-}
-
-impl syn::parse::Parse for BuildForeignLanguageTestCaseInput {
-    fn parse(input: syn::parse::ParseStream<'_>) -> syn::Result<Self> {
-        let test_scripts = Punctuated::<LitStr, Token![,]>::parse_terminated(input)?
-            .iter()
-            .map(|s| s.value())
-            .collect();
-
-        Ok(Self { test_scripts })
-    }
-}
diff --git a/crates/uniffi_macros/src/util.rs b/crates/uniffi_macros/src/util.rs
deleted file mode 100644
index 49a9651..0000000
--- a/crates/uniffi_macros/src/util.rs
+++ /dev/null
@@ -1,308 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-use proc_macro2::{Ident, Span, TokenStream};
-use quote::{format_ident, quote, ToTokens};
-use std::path::{Path as StdPath, PathBuf};
-use syn::{
-    ext::IdentExt,
-    parse::{Parse, ParseStream},
-    Attribute, Expr, Lit, Token,
-};
-
-pub fn manifest_path() -> Result<PathBuf, String> {
-    let manifest_dir =
-        std::env::var_os("CARGO_MANIFEST_DIR").ok_or("`CARGO_MANIFEST_DIR` is not set")?;
-
-    Ok(StdPath::new(&manifest_dir).join("Cargo.toml"))
-}
-
-#[cfg(soong)]
-pub fn mod_path() -> syn::Result<String> {
-    Ok(std::env::var("CARGO_CRATE_NAME")
-        .expect("`CARGO_CRATE_NAME` should be set when building with Soong"))
-}
-
-#[cfg(all(not(soong), not(feature = "nightly")))]
-pub fn mod_path() -> syn::Result<String> {
-    // Without the nightly feature and TokenStream::expand_expr, just return the crate name
-
-    use fs_err as fs;
-    use once_cell::sync::Lazy;
-    use serde::Deserialize;
-
-    #[derive(Deserialize)]
-    struct CargoToml {
-        package: Package,
-        #[serde(default)]
-        lib: Lib,
-    }
-
-    #[derive(Deserialize)]
-    struct Package {
-        name: String,
-    }
-
-    #[derive(Default, Deserialize)]
-    struct Lib {
-        name: Option<String>,
-    }
-
-    static LIB_CRATE_MOD_PATH: Lazy<Result<String, String>> = Lazy::new(|| {
-        let file = manifest_path()?;
-        let cargo_toml_bytes = fs::read(file).map_err(|e| e.to_string())?;
-        let cargo_toml_string = String::from_utf8(cargo_toml_bytes)
-            .map_err(|e| format!("Could not UTF-8 decode `Cargo.toml`: {e}"))?;
-        let cargo_toml = toml::from_str::<CargoToml>(&cargo_toml_string)
-            .map_err(|e| format!("Failed to parse `Cargo.toml`: {e}"))?;
-
-        let lib_crate_name = cargo_toml
-            .lib
-            .name
-            .unwrap_or_else(|| cargo_toml.package.name.replace('-', "_"));
-
-        Ok(lib_crate_name)
-    });
-
-    LIB_CRATE_MOD_PATH
-        .clone()
-        .map_err(|e| syn::Error::new(Span::call_site(), e))
-}
-
-#[cfg(all(not(soong), feature = "nightly"))]
-pub fn mod_path() -> syn::Result<String> {
-    use proc_macro::TokenStream;
-
-    let module_path_invoc = TokenStream::from(quote! { ::core::module_path!() });
-    // We ask the compiler what `module_path!()` expands to here.
-    // This is a nightly feature, tracked at https://github.com/rust-lang/rust/issues/90765
-    let expanded_module_path = TokenStream::expand_expr(&module_path_invoc)
-        .map_err(|e| syn::Error::new(Span::call_site(), e))?;
-    Ok(syn::parse::<syn::LitStr>(expanded_module_path)?.value())
-}
-
-pub fn try_read_field(f: &syn::Field) -> TokenStream {
-    let ident = &f.ident;
-    let ty = &f.ty;
-
-    match ident {
-        Some(ident) => quote! {
-            #ident: <#ty as ::uniffi::Lift<crate::UniFfiTag>>::try_read(buf)?,
-        },
-        None => quote! {
-            <#ty as ::uniffi::Lift<crate::UniFfiTag>>::try_read(buf)?,
-        },
-    }
-}
-
-pub fn ident_to_string(ident: &Ident) -> String {
-    ident.unraw().to_string()
-}
-
-pub fn crate_name() -> String {
-    std::env::var("CARGO_CRATE_NAME").unwrap().replace('-', "_")
-}
-
-pub fn create_metadata_items(
-    kind: &str,
-    name: &str,
-    metadata_expr: TokenStream,
-    checksum_fn_name: Option<String>,
-) -> TokenStream {
-    let crate_name = crate_name();
-    let crate_name_upper = crate_name.to_uppercase();
-    let kind_upper = kind.to_uppercase();
-    let name_upper = name.to_uppercase();
-    let const_ident =
-        format_ident!("UNIFFI_META_CONST_{crate_name_upper}_{kind_upper}_{name_upper}");
-    let static_ident = format_ident!("UNIFFI_META_{crate_name_upper}_{kind_upper}_{name_upper}");
-
-    let checksum_fn = checksum_fn_name.map(|name| {
-        let ident = Ident::new(&name, Span::call_site());
-        quote! {
-            #[doc(hidden)]
-            #[no_mangle]
-            pub extern "C" fn #ident() -> u16 {
-                #const_ident.checksum()
-            }
-        }
-    });
-
-    quote! {
-        const #const_ident: ::uniffi::MetadataBuffer = #metadata_expr;
-        #[no_mangle]
-        #[doc(hidden)]
-        pub static #static_ident: [u8; #const_ident.size] = #const_ident.into_array();
-
-        #checksum_fn
-    }
-}
-
-pub fn try_metadata_value_from_usize(value: usize, error_message: &str) -> syn::Result<u8> {
-    value
-        .try_into()
-        .map_err(|_| syn::Error::new(Span::call_site(), error_message))
-}
-
-pub fn chain<T>(
-    a: impl IntoIterator<Item = T>,
-    b: impl IntoIterator<Item = T>,
-) -> impl Iterator<Item = T> {
-    a.into_iter().chain(b)
-}
-
-pub trait UniffiAttributeArgs: Default {
-    fn parse_one(input: ParseStream<'_>) -> syn::Result<Self>;
-    fn merge(self, other: Self) -> syn::Result<Self>;
-}
-
-pub fn parse_comma_separated<T: UniffiAttributeArgs>(input: ParseStream<'_>) -> syn::Result<T> {
-    let punctuated = input.parse_terminated(T::parse_one, Token![,])?;
-    punctuated.into_iter().try_fold(T::default(), T::merge)
-}
-
-#[derive(Default)]
-struct ArgumentNotAllowedHere;
-
-impl UniffiAttributeArgs for ArgumentNotAllowedHere {
-    fn parse_one(input: ParseStream<'_>) -> syn::Result<Self> {
-        Err(syn::Error::new(
-            input.span(),
-            "attribute arguments are not currently recognized in this position",
-        ))
-    }
-
-    fn merge(self, _other: Self) -> syn::Result<Self> {
-        Ok(Self)
-    }
-}
-
-pub trait AttributeSliceExt {
-    fn parse_uniffi_attr_args<T: UniffiAttributeArgs>(&self) -> syn::Result<T>;
-    fn uniffi_attr_args_not_allowed_here(&self) -> Option<syn::Error> {
-        self.parse_uniffi_attr_args::<ArgumentNotAllowedHere>()
-            .err()
-    }
-}
-
-impl AttributeSliceExt for [Attribute] {
-    fn parse_uniffi_attr_args<T: UniffiAttributeArgs>(&self) -> syn::Result<T> {
-        self.iter()
-            .filter(|attr| attr.path().is_ident("uniffi"))
-            .try_fold(T::default(), |res, attr| {
-                let parsed = attr.parse_args_with(parse_comma_separated)?;
-                res.merge(parsed)
-            })
-    }
-}
-
-pub fn either_attribute_arg<T: ToTokens>(a: Option<T>, b: Option<T>) -> syn::Result<Option<T>> {
-    match (a, b) {
-        (None, None) => Ok(None),
-        (Some(val), None) | (None, Some(val)) => Ok(Some(val)),
-        (Some(a), Some(b)) => {
-            let mut error = syn::Error::new_spanned(a, "redundant attribute argument");
-            error.combine(syn::Error::new_spanned(b, "note: first one here"));
-            Err(error)
-        }
-    }
-}
-
-pub(crate) fn tagged_impl_header(
-    trait_name: &str,
-    ident: &impl ToTokens,
-    udl_mode: bool,
-) -> TokenStream {
-    let trait_name = Ident::new(trait_name, Span::call_site());
-    if udl_mode {
-        quote! { impl ::uniffi::#trait_name<crate::UniFfiTag> for #ident }
-    } else {
-        quote! { impl<T> ::uniffi::#trait_name<T> for #ident }
-    }
-}
-
-pub(crate) fn derive_all_ffi_traits(ty: &Ident, udl_mode: bool) -> TokenStream {
-    if udl_mode {
-        quote! { ::uniffi::derive_ffi_traits!(local #ty); }
-    } else {
-        quote! { ::uniffi::derive_ffi_traits!(blanket #ty); }
-    }
-}
-
-pub(crate) fn derive_ffi_traits(
-    ty: impl ToTokens,
-    udl_mode: bool,
-    trait_names: &[&str],
-) -> TokenStream {
-    let trait_idents = trait_names
-        .iter()
-        .map(|name| Ident::new(name, Span::call_site()));
-    if udl_mode {
-        quote! {
-            #(
-                ::uniffi::derive_ffi_traits!(impl #trait_idents<crate::UniFfiTag> for #ty);
-            )*
-        }
-    } else {
-        quote! {
-            #(
-                ::uniffi::derive_ffi_traits!(impl<UT> #trait_idents<UT> for #ty);
-            )*
-        }
-    }
-}
-
-/// Custom keywords
-pub mod kw {
-    syn::custom_keyword!(async_runtime);
-    syn::custom_keyword!(callback_interface);
-    syn::custom_keyword!(with_foreign);
-    syn::custom_keyword!(default);
-    syn::custom_keyword!(flat_error);
-    syn::custom_keyword!(None);
-    syn::custom_keyword!(Some);
-    syn::custom_keyword!(with_try_read);
-    syn::custom_keyword!(name);
-    syn::custom_keyword!(non_exhaustive);
-    syn::custom_keyword!(Debug);
-    syn::custom_keyword!(Display);
-    syn::custom_keyword!(Eq);
-    syn::custom_keyword!(Hash);
-    // Not used anymore
-    syn::custom_keyword!(handle_unknown_callback_error);
-}
-
-/// Specifies a type from a dependent crate
-pub struct ExternalTypeItem {
-    pub crate_ident: Ident,
-    pub sep: Token![,],
-    pub type_ident: Ident,
-}
-
-impl Parse for ExternalTypeItem {
-    fn parse(input: ParseStream<'_>) -> syn::Result<Self> {
-        Ok(Self {
-            crate_ident: input.parse()?,
-            sep: input.parse()?,
-            type_ident: input.parse()?,
-        })
-    }
-}
-
-pub(crate) fn extract_docstring(attrs: &[Attribute]) -> syn::Result<String> {
-    return attrs
-        .iter()
-        .filter(|attr| attr.path().is_ident("doc"))
-        .map(|attr| {
-            let name_value = attr.meta.require_name_value()?;
-            if let Expr::Lit(expr) = &name_value.value {
-                if let Lit::Str(lit_str) = &expr.lit {
-                    return Ok(lit_str.value().trim().to_owned());
-                }
-            }
-            Err(syn::Error::new_spanned(attr, "Cannot parse doc attribute"))
-        })
-        .collect::<syn::Result<Vec<_>>>()
-        .map(|lines| lines.join("\n"));
-}
diff --git a/crates/uniffi_meta/.android-checksum.json b/crates/uniffi_meta/.android-checksum.json
deleted file mode 100644
index 711706a..0000000
--- a/crates/uniffi_meta/.android-checksum.json
+++ /dev/null
@@ -1 +0,0 @@
-{"package":null,"files":{".cargo-checksum.json":"45f77790707753404b1bc7e19fb442ded60f1c2d6c8efed309197983d949d5d6","Android.bp":"9fc901886f763aa2ace498fbbe3c1d980ce19cf8892b375f7bd4ce2bcd65e4f2","Cargo.toml":"3d6b296442d4affb4c0bb9166275efba29d6d18f0a367091d03450d2db975fee","LICENSE":"eb272adec43829624ef944827cee5edc5896c80ceaccea3e8e471dadeaeee408","METADATA":"cc99fba745625b9da9ddda4355deedca9a34492baf2fdc947cb867ab58d4796d","MODULE_LICENSE_MPL":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"8528d929c10fb2ef91706a54de19896a66a8636432d18835228fd13c183506c4","TEST_MAPPING":"70025572b8e1bb23ad738b5bccaffc4e2dc0194e7d5b159acfe789fdc0e9a3e9","cargo_embargo.json":"9f85647b222182436a6732595dfb841ecde75035ec4db2d52019accd1d896e22","patches/LICENSE.patch":"cfb7d0c0c947397e0cf46698509020438a9a3305875ecf9b75fafeb30815ac80","src/ffi_names.rs":"ed9a42ce3ee9a47861d1ada0ab59d74c420a77da29695810eef8b2a8f5a4346c","src/group.rs":"90130152ef0ecf5f70c7c204670b21f85d1f83a9a50ba3fb057b20980e1e711c","src/lib.rs":"5d1c14de4f84ef728df16310f92fd6173c469e60771a994e4e9035b340848011","src/metadata.rs":"26d55780cdabf4adb494c506d3505c4db0e9733055a41f2b12a2f5ef5f9efbfc","src/reader.rs":"0482a4615b090f0d1f721ef0e68cf93e085814f4b1dd45e89de4fb309a8d68c2","src/types.rs":"f73ba48dffe6d1efd44e94fa721afd4f23fd997c84e54ae5be01ed46e243e5f8"}}
\ No newline at end of file
diff --git a/crates/uniffi_meta/.cargo-checksum.json b/crates/uniffi_meta/.cargo-checksum.json
deleted file mode 100644
index 31b45ce..0000000
--- a/crates/uniffi_meta/.cargo-checksum.json
+++ /dev/null
@@ -1 +0,0 @@
-{"files":{"Cargo.toml":"5620cf9840477b158641547703ba353e3ad8427ec7b20b9dd5e5f5fe4df7d6d2","README.md":"37c1af00ec81a9f1bc206ab3578356e5f9ad4077dc46dd1bb623d81d804948b8","src/ffi_names.rs":"ca38b700a0a103c9faaf456ed91b67adf46d4e750aee9e9cd01ad97fb1840494","src/group.rs":"d0a43f3c528aba9403649715981ad3a8849d7a370f4ef9e2d618b88f60a3102f","src/lib.rs":"3f00d5214e2785e4b3045bc48899f6f6b1dce32ab3da6be3ebce716ee9d24c5f","src/metadata.rs":"3f236b337a1fd5082ea9cc4fee6800193a903ee88b81f1c3202843402f122a14","src/reader.rs":"579e2b87d8dd9d703b8811294abfb992621c0a46765800e4db2fad2906db2208","src/types.rs":"c2c5188da8cdf5af7f8496d4660bcfaa971b81ed73b64486c05b47256048544f"},"package":"f7224422c4cfd181c7ca9fca2154abca4d21db962f926f270f996edd38b0c4b8"}
\ No newline at end of file
diff --git a/crates/uniffi_meta/Android.bp b/crates/uniffi_meta/Android.bp
deleted file mode 100644
index 345bf84..0000000
--- a/crates/uniffi_meta/Android.bp
+++ /dev/null
@@ -1,57 +0,0 @@
-// This file is generated by cargo_embargo.
-// Do not modify this file because the changes will be overridden on upgrade.
-
-package {
-    default_applicable_licenses: ["external_rust_crates_uniffi_meta_license"],
-    default_team: "trendy_team_android_rust",
-}
-
-license {
-    name: "external_rust_crates_uniffi_meta_license",
-    visibility: [":__subpackages__"],
-    license_kinds: ["SPDX-license-identifier-MPL-2.0"],
-    license_text: ["LICENSE"],
-}
-
-rust_library {
-    name: "libuniffi_meta",
-    host_supported: true,
-    crate_name: "uniffi_meta",
-    cargo_env_compat: true,
-    cargo_pkg_version: "0.27.1",
-    crate_root: "src/lib.rs",
-    edition: "2021",
-    rustlibs: [
-        "libanyhow",
-        "libbytes",
-        "libsiphasher",
-    ],
-    proc_macros: ["libuniffi_checksum_derive"],
-    apex_available: [
-        "//apex_available:platform",
-        "//apex_available:anyapex",
-    ],
-    product_available: true,
-    vendor_available: true,
-}
-
-rust_test {
-    name: "uniffi_meta_test_src_lib",
-    host_supported: true,
-    crate_name: "uniffi_meta",
-    cargo_env_compat: true,
-    cargo_pkg_version: "0.27.1",
-    crate_root: "src/lib.rs",
-    test_suites: ["general-tests"],
-    auto_gen_config: true,
-    test_options: {
-        unit_test: true,
-    },
-    edition: "2021",
-    rustlibs: [
-        "libanyhow",
-        "libbytes",
-        "libsiphasher",
-    ],
-    proc_macros: ["libuniffi_checksum_derive"],
-}
diff --git a/crates/uniffi_meta/Cargo.toml b/crates/uniffi_meta/Cargo.toml
deleted file mode 100644
index 04d8170..0000000
--- a/crates/uniffi_meta/Cargo.toml
+++ /dev/null
@@ -1,36 +0,0 @@
-# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
-#
-# When uploading crates to the registry Cargo will automatically
-# "normalize" Cargo.toml files for maximal compatibility
-# with all versions of Cargo and also rewrite `path` dependencies
-# to registry (e.g., crates.io) dependencies.
-#
-# If you are reading this file be aware that the original Cargo.toml
-# will likely look very different (and much more reasonable).
-# See Cargo.toml.orig for the original contents.
-
-[package]
-edition = "2021"
-name = "uniffi_meta"
-version = "0.27.1"
-description = "uniffi_meta"
-homepage = "https://mozilla.github.io/uniffi-rs"
-readme = "README.md"
-keywords = [
-    "ffi",
-    "bindgen",
-]
-license = "MPL-2.0"
-repository = "https://github.com/mozilla/uniffi-rs"
-
-[dependencies.anyhow]
-version = "1"
-
-[dependencies.bytes]
-version = "1.3"
-
-[dependencies.siphasher]
-version = "0.3"
-
-[dependencies.uniffi_checksum_derive]
-version = "0.27.1"
diff --git a/crates/uniffi_meta/LICENSE b/crates/uniffi_meta/LICENSE
deleted file mode 100644
index a612ad9..0000000
--- a/crates/uniffi_meta/LICENSE
+++ /dev/null
@@ -1,373 +0,0 @@
-Mozilla Public License Version 2.0
-==================================
-
-1. Definitions
---------------
-
-1.1. "Contributor"
-    means each individual or legal entity that creates, contributes to
-    the creation of, or owns Covered Software.
-
-1.2. "Contributor Version"
-    means the combination of the Contributions of others (if any) used
-    by a Contributor and that particular Contributor's Contribution.
-
-1.3. "Contribution"
-    means Covered Software of a particular Contributor.
-
-1.4. "Covered Software"
-    means Source Code Form to which the initial Contributor has attached
-    the notice in Exhibit A, the Executable Form of such Source Code
-    Form, and Modifications of such Source Code Form, in each case
-    including portions thereof.
-
-1.5. "Incompatible With Secondary Licenses"
-    means
-
-    (a) that the initial Contributor has attached the notice described
-        in Exhibit B to the Covered Software; or
-
-    (b) that the Covered Software was made available under the terms of
-        version 1.1 or earlier of the License, but not also under the
-        terms of a Secondary License.
-
-1.6. "Executable Form"
-    means any form of the work other than Source Code Form.
-
-1.7. "Larger Work"
-    means a work that combines Covered Software with other material, in
-    a separate file or files, that is not Covered Software.
-
-1.8. "License"
-    means this document.
-
-1.9. "Licensable"
-    means having the right to grant, to the maximum extent possible,
-    whether at the time of the initial grant or subsequently, any and
-    all of the rights conveyed by this License.
-
-1.10. "Modifications"
-    means any of the following:
-
-    (a) any file in Source Code Form that results from an addition to,
-        deletion from, or modification of the contents of Covered
-        Software; or
-
-    (b) any new file in Source Code Form that contains any Covered
-        Software.
-
-1.11. "Patent Claims" of a Contributor
-    means any patent claim(s), including without limitation, method,
-    process, and apparatus claims, in any patent Licensable by such
-    Contributor that would be infringed, but for the grant of the
-    License, by the making, using, selling, offering for sale, having
-    made, import, or transfer of either its Contributions or its
-    Contributor Version.
-
-1.12. "Secondary License"
-    means either the GNU General Public License, Version 2.0, the GNU
-    Lesser General Public License, Version 2.1, the GNU Affero General
-    Public License, Version 3.0, or any later versions of those
-    licenses.
-
-1.13. "Source Code Form"
-    means the form of the work preferred for making modifications.
-
-1.14. "You" (or "Your")
-    means an individual or a legal entity exercising rights under this
-    License. For legal entities, "You" includes any entity that
-    controls, is controlled by, or is under common control with You. For
-    purposes of this definition, "control" means (a) the power, direct
-    or indirect, to cause the direction or management of such entity,
-    whether by contract or otherwise, or (b) ownership of more than
-    fifty percent (50%) of the outstanding shares or beneficial
-    ownership of such entity.
-
-2. License Grants and Conditions
---------------------------------
-
-2.1. Grants
-
-Each Contributor hereby grants You a world-wide, royalty-free,
-non-exclusive license:
-
-(a) under intellectual property rights (other than patent or trademark)
-    Licensable by such Contributor to use, reproduce, make available,
-    modify, display, perform, distribute, and otherwise exploit its
-    Contributions, either on an unmodified basis, with Modifications, or
-    as part of a Larger Work; and
-
-(b) under Patent Claims of such Contributor to make, use, sell, offer
-    for sale, have made, import, and otherwise transfer either its
-    Contributions or its Contributor Version.
-
-2.2. Effective Date
-
-The licenses granted in Section 2.1 with respect to any Contribution
-become effective for each Contribution on the date the Contributor first
-distributes such Contribution.
-
-2.3. Limitations on Grant Scope
-
-The licenses granted in this Section 2 are the only rights granted under
-this License. No additional rights or licenses will be implied from the
-distribution or licensing of Covered Software under this License.
-Notwithstanding Section 2.1(b) above, no patent license is granted by a
-Contributor:
-
-(a) for any code that a Contributor has removed from Covered Software;
-    or
-
-(b) for infringements caused by: (i) Your and any other third party's
-    modifications of Covered Software, or (ii) the combination of its
-    Contributions with other software (except as part of its Contributor
-    Version); or
-
-(c) under Patent Claims infringed by Covered Software in the absence of
-    its Contributions.
-
-This License does not grant any rights in the trademarks, service marks,
-or logos of any Contributor (except as may be necessary to comply with
-the notice requirements in Section 3.4).
-
-2.4. Subsequent Licenses
-
-No Contributor makes additional grants as a result of Your choice to
-distribute the Covered Software under a subsequent version of this
-License (see Section 10.2) or under the terms of a Secondary License (if
-permitted under the terms of Section 3.3).
-
-2.5. Representation
-
-Each Contributor represents that the Contributor believes its
-Contributions are its original creation(s) or it has sufficient rights
-to grant the rights to its Contributions conveyed by this License.
-
-2.6. Fair Use
-
-This License is not intended to limit any rights You have under
-applicable copyright doctrines of fair use, fair dealing, or other
-equivalents.
-
-2.7. Conditions
-
-Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
-in Section 2.1.
-
-3. Responsibilities
--------------------
-
-3.1. Distribution of Source Form
-
-All distribution of Covered Software in Source Code Form, including any
-Modifications that You create or to which You contribute, must be under
-the terms of this License. You must inform recipients that the Source
-Code Form of the Covered Software is governed by the terms of this
-License, and how they can obtain a copy of this License. You may not
-attempt to alter or restrict the recipients' rights in the Source Code
-Form.
-
-3.2. Distribution of Executable Form
-
-If You distribute Covered Software in Executable Form then:
-
-(a) such Covered Software must also be made available in Source Code
-    Form, as described in Section 3.1, and You must inform recipients of
-    the Executable Form how they can obtain a copy of such Source Code
-    Form by reasonable means in a timely manner, at a charge no more
-    than the cost of distribution to the recipient; and
-
-(b) You may distribute such Executable Form under the terms of this
-    License, or sublicense it under different terms, provided that the
-    license for the Executable Form does not attempt to limit or alter
-    the recipients' rights in the Source Code Form under this License.
-
-3.3. Distribution of a Larger Work
-
-You may create and distribute a Larger Work under terms of Your choice,
-provided that You also comply with the requirements of this License for
-the Covered Software. If the Larger Work is a combination of Covered
-Software with a work governed by one or more Secondary Licenses, and the
-Covered Software is not Incompatible With Secondary Licenses, this
-License permits You to additionally distribute such Covered Software
-under the terms of such Secondary License(s), so that the recipient of
-the Larger Work may, at their option, further distribute the Covered
-Software under the terms of either this License or such Secondary
-License(s).
-
-3.4. Notices
-
-You may not remove or alter the substance of any license notices
-(including copyright notices, patent notices, disclaimers of warranty,
-or limitations of liability) contained within the Source Code Form of
-the Covered Software, except that You may alter any license notices to
-the extent required to remedy known factual inaccuracies.
-
-3.5. Application of Additional Terms
-
-You may choose to offer, and to charge a fee for, warranty, support,
-indemnity or liability obligations to one or more recipients of Covered
-Software. However, You may do so only on Your own behalf, and not on
-behalf of any Contributor. You must make it absolutely clear that any
-such warranty, support, indemnity, or liability obligation is offered by
-You alone, and You hereby agree to indemnify every Contributor for any
-liability incurred by such Contributor as a result of warranty, support,
-indemnity or liability terms You offer. You may include additional
-disclaimers of warranty and limitations of liability specific to any
-jurisdiction.
-
-4. Inability to Comply Due to Statute or Regulation
----------------------------------------------------
-
-If it is impossible for You to comply with any of the terms of this
-License with respect to some or all of the Covered Software due to
-statute, judicial order, or regulation then You must: (a) comply with
-the terms of this License to the maximum extent possible; and (b)
-describe the limitations and the code they affect. Such description must
-be placed in a text file included with all distributions of the Covered
-Software under this License. Except to the extent prohibited by statute
-or regulation, such description must be sufficiently detailed for a
-recipient of ordinary skill to be able to understand it.
-
-5. Termination
---------------
-
-5.1. The rights granted under this License will terminate automatically
-if You fail to comply with any of its terms. However, if You become
-compliant, then the rights granted under this License from a particular
-Contributor are reinstated (a) provisionally, unless and until such
-Contributor explicitly and finally terminates Your grants, and (b) on an
-ongoing basis, if such Contributor fails to notify You of the
-non-compliance by some reasonable means prior to 60 days after You have
-come back into compliance. Moreover, Your grants from a particular
-Contributor are reinstated on an ongoing basis if such Contributor
-notifies You of the non-compliance by some reasonable means, this is the
-first time You have received notice of non-compliance with this License
-from such Contributor, and You become compliant prior to 30 days after
-Your receipt of the notice.
-
-5.2. If You initiate litigation against any entity by asserting a patent
-infringement claim (excluding declaratory judgment actions,
-counter-claims, and cross-claims) alleging that a Contributor Version
-directly or indirectly infringes any patent, then the rights granted to
-You by any and all Contributors for the Covered Software under Section
-2.1 of this License shall terminate.
-
-5.3. In the event of termination under Sections 5.1 or 5.2 above, all
-end user license agreements (excluding distributors and resellers) which
-have been validly granted by You or Your distributors under this License
-prior to termination shall survive termination.
-
-************************************************************************
-*                                                                      *
-*  6. Disclaimer of Warranty                                           *
-*  -------------------------                                           *
-*                                                                      *
-*  Covered Software is provided under this License on an "as is"       *
-*  basis, without warranty of any kind, either expressed, implied, or  *
-*  statutory, including, without limitation, warranties that the       *
-*  Covered Software is free of defects, merchantable, fit for a        *
-*  particular purpose or non-infringing. The entire risk as to the     *
-*  quality and performance of the Covered Software is with You.        *
-*  Should any Covered Software prove defective in any respect, You     *
-*  (not any Contributor) assume the cost of any necessary servicing,   *
-*  repair, or correction. This disclaimer of warranty constitutes an   *
-*  essential part of this License. No use of any Covered Software is   *
-*  authorized under this License except under this disclaimer.         *
-*                                                                      *
-************************************************************************
-
-************************************************************************
-*                                                                      *
-*  7. Limitation of Liability                                          *
-*  --------------------------                                          *
-*                                                                      *
-*  Under no circumstances and under no legal theory, whether tort      *
-*  (including negligence), contract, or otherwise, shall any           *
-*  Contributor, or anyone who distributes Covered Software as          *
-*  permitted above, be liable to You for any direct, indirect,         *
-*  special, incidental, or consequential damages of any character      *
-*  including, without limitation, damages for lost profits, loss of    *
-*  goodwill, work stoppage, computer failure or malfunction, or any    *
-*  and all other commercial damages or losses, even if such party      *
-*  shall have been informed of the possibility of such damages. This   *
-*  limitation of liability shall not apply to liability for death or   *
-*  personal injury resulting from such party's negligence to the       *
-*  extent applicable law prohibits such limitation. Some               *
-*  jurisdictions do not allow the exclusion or limitation of           *
-*  incidental or consequential damages, so this exclusion and          *
-*  limitation may not apply to You.                                    *
-*                                                                      *
-************************************************************************
-
-8. Litigation
--------------
-
-Any litigation relating to this License may be brought only in the
-courts of a jurisdiction where the defendant maintains its principal
-place of business and such litigation shall be governed by laws of that
-jurisdiction, without reference to its conflict-of-law provisions.
-Nothing in this Section shall prevent a party's ability to bring
-cross-claims or counter-claims.
-
-9. Miscellaneous
-----------------
-
-This License represents the complete agreement concerning the subject
-matter hereof. If any provision of this License is held to be
-unenforceable, such provision shall be reformed only to the extent
-necessary to make it enforceable. Any law or regulation which provides
-that the language of a contract shall be construed against the drafter
-shall not be used to construe this License against a Contributor.
-
-10. Versions of the License
----------------------------
-
-10.1. New Versions
-
-Mozilla Foundation is the license steward. Except as provided in Section
-10.3, no one other than the license steward has the right to modify or
-publish new versions of this License. Each version will be given a
-distinguishing version number.
-
-10.2. Effect of New Versions
-
-You may distribute the Covered Software under the terms of the version
-of the License under which You originally received the Covered Software,
-or under the terms of any subsequent version published by the license
-steward.
-
-10.3. Modified Versions
-
-If you create software not governed by this License, and you want to
-create a new license for such software, you may create and use a
-modified version of this License if you rename the license and remove
-any references to the name of the license steward (except to note that
-such modified license differs from this License).
-
-10.4. Distributing Source Code Form that is Incompatible With Secondary
-Licenses
-
-If You choose to distribute Source Code Form that is Incompatible With
-Secondary Licenses under the terms of this version of the License, the
-notice described in Exhibit B of this License must be attached.
-
-Exhibit A - Source Code Form License Notice
--------------------------------------------
-
-  This Source Code Form is subject to the terms of the Mozilla Public
-  License, v. 2.0. If a copy of the MPL was not distributed with this
-  file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-If it is not possible or desirable to put the notice in a particular
-file, then You may include the notice in a location (such as a LICENSE
-file in a relevant directory) where a recipient would be likely to look
-for such a notice.
-
-You may add additional accurate notices of copyright ownership.
-
-Exhibit B - "Incompatible With Secondary Licenses" Notice
----------------------------------------------------------
-
-  This Source Code Form is "Incompatible With Secondary Licenses", as
-  defined by the Mozilla Public License, v. 2.0.
diff --git a/crates/uniffi_meta/METADATA b/crates/uniffi_meta/METADATA
deleted file mode 100644
index 48c46b8..0000000
--- a/crates/uniffi_meta/METADATA
+++ /dev/null
@@ -1,17 +0,0 @@
-name: "uniffi_meta"
-description: "uniffi_meta"
-third_party {
-  version: "0.27.1"
-  license_type: RECIPROCAL
-  last_upgrade_date {
-    year: 2024
-    month: 5
-    day: 6
-  }
-  homepage: "https://crates.io/crates/uniffi_meta"
-  identifier {
-    type: "Archive"
-    value: "https://static.crates.io/crates/uniffi_meta/uniffi_meta-0.27.1.crate"
-    version: "0.27.1"
-  }
-}
diff --git a/crates/uniffi_meta/MODULE_LICENSE_MPL b/crates/uniffi_meta/MODULE_LICENSE_MPL
deleted file mode 100644
index e69de29..0000000
--- a/crates/uniffi_meta/MODULE_LICENSE_MPL
+++ /dev/null
diff --git a/crates/uniffi_meta/README.md b/crates/uniffi_meta/README.md
deleted file mode 100644
index 64ac348..0000000
--- a/crates/uniffi_meta/README.md
+++ /dev/null
@@ -1,81 +0,0 @@
-# UniFFI - a multi-language bindings generator for Rust
-
-UniFFI is a toolkit for building cross-platform software components in Rust.
-
-For the impatient, see [**the UniFFI user guide**](https://mozilla.github.io/uniffi-rs/)
-or [**the UniFFI examples**](https://github.com/mozilla/uniffi-rs/tree/main/examples#example-uniffi-components).
-
-By writing your core business logic in Rust and describing its interface in an "object model",
-you can use UniFFI to help you:
-
-* Compile your Rust code into a shared library for use on different target platforms.
-* Generate bindings to load and use the library from different target languages.
-
-You can describe your object model in an [interface definition file](https://mozilla.github.io/uniffi-rs/udl_file_spec.html)
-or [by using proc-macros](https://mozilla.github.io/uniffi-rs/proc_macro/index.html).
-
-UniFFI is currently used extensively by Mozilla in Firefox mobile and desktop browsers;
-written once in Rust, auto-generated bindings allow that functionality to be called
-from both Kotlin (for Android apps) and Swift (for iOS apps).
-It also has a growing community of users shipping various cool things to many users.
-
-UniFFI comes with support for **Kotlin**, **Swift**, **Python** and **Ruby** with 3rd party bindings available for **C#** and **Golang**.
-Additional foreign language bindings can be developed externally and we welcome contributions to list them here.
-See [Third-party foreign language bindings](#third-party-foreign-language-bindings).
-
-## User Guide
-
-You can read more about using the tool in [**the UniFFI user guide**](https://mozilla.github.io/uniffi-rs/).
-
-We consider it ready for production use, but UniFFI is a long way from a 1.0 release with lots of internal work still going on.
-We try hard to avoid breaking simple consumers, but more advanced things might break as you upgrade over time.
-
-### Etymology and Pronunciation
-
-ˈjuːnɪfaɪ. Pronounced to rhyme with "unify".
-
-A portmanteau word that also puns with "unify", to signify the joining of one codebase accessed from many languages.
-
-uni - [Latin ūni-, from ūnus, one]
-FFI - [Abbreviation, Foreign Function Interface]
-
-## Alternative tools
-
-Other tools we know of which try and solve a similarly shaped problem are:
-
-* [Diplomat](https://github.com/rust-diplomat/diplomat/) - see our [writeup of
-  the different approach taken by that tool](docs/diplomat-and-macros.md)
-* [Interoptopus](https://github.com/ralfbiedert/interoptopus/)
-
-(Please open a PR if you think other tools should be listed!)
-
-## Third-party foreign language bindings
-
-* [Kotlin Multiplatform support](https://gitlab.com/trixnity/uniffi-kotlin-multiplatform-bindings). The repository contains Kotlin Multiplatform bindings generation for UniFFI, letting you target both JVM and Native.
-* [Go bindings](https://github.com/NordSecurity/uniffi-bindgen-go)
-* [C# bindings](https://github.com/NordSecurity/uniffi-bindgen-cs)
-* [Dart bindings](https://github.com/NiallBunting/uniffi-rs-dart)
-
-### External resources
-
-There are a few third-party resources that make it easier to work with UniFFI:
-
-* [Plugin support for `.udl` files](https://github.com/Lonami/uniffi-dl) for the IDEA platform ([*uniffi-dl* in the JetBrains marketplace](https://plugins.jetbrains.com/plugin/20527-uniffi-dl)). It provides syntax highlighting, code folding, code completion, reference resolution and navigation (among others features) for the [UniFFI Definition Language (UDL)](https://mozilla.github.io/uniffi-rs/).
-* [cargo swift](https://github.com/antoniusnaumann/cargo-swift), a cargo plugin to build a Swift Package from Rust code. It provides an init command for setting up a UniFFI crate and a package command for building a Swift package from Rust code - without the need for additional configuration or build scripts.
-* [Cargo NDK Gradle Plugin](https://github.com/willir/cargo-ndk-android-gradle) allows you to build Rust code using [`cargo-ndk`](https://github.com/bbqsrc/cargo-ndk), which generally makes Android library builds less painful.
-* [`uniffi-starter`](https://github.com/ianthetechie/uniffi-starter) is a minimal project demonstrates a wide range of UniFFI in a complete project in a compact manner. It includes a full Android library build process, an XCFramework generation script, and example Swift package structure. 
-
-(Please open a PR if you think other resources should be listed!)
-
-## Contributing
-
-If this tool sounds interesting to you, please help us develop it! You can:
-
-* View the [contributor guidelines](./docs/contributing.md).
-* File or work on [issues](https://github.com/mozilla/uniffi-rs/issues) here in GitHub.
-* Join discussions in the [#uniffi:mozilla.org](https://matrix.to/#/#uniffi:mozilla.org)
-  room on Matrix.
-
-## Code of Conduct
-
-This project is governed by Mozilla's [Community Participation Guidelines](./CODE_OF_CONDUCT.md).
diff --git a/crates/uniffi_meta/TEST_MAPPING b/crates/uniffi_meta/TEST_MAPPING
deleted file mode 100644
index 63b7853..0000000
--- a/crates/uniffi_meta/TEST_MAPPING
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  "postsubmit": [
-    {
-      "name": "uniffi_meta_test_src_lib"
-    }
-  ]
-}
diff --git a/crates/uniffi_meta/cargo_embargo.json b/crates/uniffi_meta/cargo_embargo.json
deleted file mode 100644
index d40889a..0000000
--- a/crates/uniffi_meta/cargo_embargo.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
-    "run_cargo": false,
-    "tests": true
-}
diff --git a/crates/uniffi_meta/patches/LICENSE.patch b/crates/uniffi_meta/patches/LICENSE.patch
deleted file mode 100644
index fecc0b4..0000000
--- a/crates/uniffi_meta/patches/LICENSE.patch
+++ /dev/null
@@ -1,379 +0,0 @@
-diff --git b/LICENSE a/LICENSE
-new file mode 100644
-index 0000000..a612ad9
---- /dev/null
-+++ a/LICENSE
-@@ -0,0 +1,373 @@
-+Mozilla Public License Version 2.0
-+==================================
-+
-+1. Definitions
-+--------------
-+
-+1.1. "Contributor"
-+    means each individual or legal entity that creates, contributes to
-+    the creation of, or owns Covered Software.
-+
-+1.2. "Contributor Version"
-+    means the combination of the Contributions of others (if any) used
-+    by a Contributor and that particular Contributor's Contribution.
-+
-+1.3. "Contribution"
-+    means Covered Software of a particular Contributor.
-+
-+1.4. "Covered Software"
-+    means Source Code Form to which the initial Contributor has attached
-+    the notice in Exhibit A, the Executable Form of such Source Code
-+    Form, and Modifications of such Source Code Form, in each case
-+    including portions thereof.
-+
-+1.5. "Incompatible With Secondary Licenses"
-+    means
-+
-+    (a) that the initial Contributor has attached the notice described
-+        in Exhibit B to the Covered Software; or
-+
-+    (b) that the Covered Software was made available under the terms of
-+        version 1.1 or earlier of the License, but not also under the
-+        terms of a Secondary License.
-+
-+1.6. "Executable Form"
-+    means any form of the work other than Source Code Form.
-+
-+1.7. "Larger Work"
-+    means a work that combines Covered Software with other material, in
-+    a separate file or files, that is not Covered Software.
-+
-+1.8. "License"
-+    means this document.
-+
-+1.9. "Licensable"
-+    means having the right to grant, to the maximum extent possible,
-+    whether at the time of the initial grant or subsequently, any and
-+    all of the rights conveyed by this License.
-+
-+1.10. "Modifications"
-+    means any of the following:
-+
-+    (a) any file in Source Code Form that results from an addition to,
-+        deletion from, or modification of the contents of Covered
-+        Software; or
-+
-+    (b) any new file in Source Code Form that contains any Covered
-+        Software.
-+
-+1.11. "Patent Claims" of a Contributor
-+    means any patent claim(s), including without limitation, method,
-+    process, and apparatus claims, in any patent Licensable by such
-+    Contributor that would be infringed, but for the grant of the
-+    License, by the making, using, selling, offering for sale, having
-+    made, import, or transfer of either its Contributions or its
-+    Contributor Version.
-+
-+1.12. "Secondary License"
-+    means either the GNU General Public License, Version 2.0, the GNU
-+    Lesser General Public License, Version 2.1, the GNU Affero General
-+    Public License, Version 3.0, or any later versions of those
-+    licenses.
-+
-+1.13. "Source Code Form"
-+    means the form of the work preferred for making modifications.
-+
-+1.14. "You" (or "Your")
-+    means an individual or a legal entity exercising rights under this
-+    License. For legal entities, "You" includes any entity that
-+    controls, is controlled by, or is under common control with You. For
-+    purposes of this definition, "control" means (a) the power, direct
-+    or indirect, to cause the direction or management of such entity,
-+    whether by contract or otherwise, or (b) ownership of more than
-+    fifty percent (50%) of the outstanding shares or beneficial
-+    ownership of such entity.
-+
-+2. License Grants and Conditions
-+--------------------------------
-+
-+2.1. Grants
-+
-+Each Contributor hereby grants You a world-wide, royalty-free,
-+non-exclusive license:
-+
-+(a) under intellectual property rights (other than patent or trademark)
-+    Licensable by such Contributor to use, reproduce, make available,
-+    modify, display, perform, distribute, and otherwise exploit its
-+    Contributions, either on an unmodified basis, with Modifications, or
-+    as part of a Larger Work; and
-+
-+(b) under Patent Claims of such Contributor to make, use, sell, offer
-+    for sale, have made, import, and otherwise transfer either its
-+    Contributions or its Contributor Version.
-+
-+2.2. Effective Date
-+
-+The licenses granted in Section 2.1 with respect to any Contribution
-+become effective for each Contribution on the date the Contributor first
-+distributes such Contribution.
-+
-+2.3. Limitations on Grant Scope
-+
-+The licenses granted in this Section 2 are the only rights granted under
-+this License. No additional rights or licenses will be implied from the
-+distribution or licensing of Covered Software under this License.
-+Notwithstanding Section 2.1(b) above, no patent license is granted by a
-+Contributor:
-+
-+(a) for any code that a Contributor has removed from Covered Software;
-+    or
-+
-+(b) for infringements caused by: (i) Your and any other third party's
-+    modifications of Covered Software, or (ii) the combination of its
-+    Contributions with other software (except as part of its Contributor
-+    Version); or
-+
-+(c) under Patent Claims infringed by Covered Software in the absence of
-+    its Contributions.
-+
-+This License does not grant any rights in the trademarks, service marks,
-+or logos of any Contributor (except as may be necessary to comply with
-+the notice requirements in Section 3.4).
-+
-+2.4. Subsequent Licenses
-+
-+No Contributor makes additional grants as a result of Your choice to
-+distribute the Covered Software under a subsequent version of this
-+License (see Section 10.2) or under the terms of a Secondary License (if
-+permitted under the terms of Section 3.3).
-+
-+2.5. Representation
-+
-+Each Contributor represents that the Contributor believes its
-+Contributions are its original creation(s) or it has sufficient rights
-+to grant the rights to its Contributions conveyed by this License.
-+
-+2.6. Fair Use
-+
-+This License is not intended to limit any rights You have under
-+applicable copyright doctrines of fair use, fair dealing, or other
-+equivalents.
-+
-+2.7. Conditions
-+
-+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
-+in Section 2.1.
-+
-+3. Responsibilities
-+-------------------
-+
-+3.1. Distribution of Source Form
-+
-+All distribution of Covered Software in Source Code Form, including any
-+Modifications that You create or to which You contribute, must be under
-+the terms of this License. You must inform recipients that the Source
-+Code Form of the Covered Software is governed by the terms of this
-+License, and how they can obtain a copy of this License. You may not
-+attempt to alter or restrict the recipients' rights in the Source Code
-+Form.
-+
-+3.2. Distribution of Executable Form
-+
-+If You distribute Covered Software in Executable Form then:
-+
-+(a) such Covered Software must also be made available in Source Code
-+    Form, as described in Section 3.1, and You must inform recipients of
-+    the Executable Form how they can obtain a copy of such Source Code
-+    Form by reasonable means in a timely manner, at a charge no more
-+    than the cost of distribution to the recipient; and
-+
-+(b) You may distribute such Executable Form under the terms of this
-+    License, or sublicense it under different terms, provided that the
-+    license for the Executable Form does not attempt to limit or alter
-+    the recipients' rights in the Source Code Form under this License.
-+
-+3.3. Distribution of a Larger Work
-+
-+You may create and distribute a Larger Work under terms of Your choice,
-+provided that You also comply with the requirements of this License for
-+the Covered Software. If the Larger Work is a combination of Covered
-+Software with a work governed by one or more Secondary Licenses, and the
-+Covered Software is not Incompatible With Secondary Licenses, this
-+License permits You to additionally distribute such Covered Software
-+under the terms of such Secondary License(s), so that the recipient of
-+the Larger Work may, at their option, further distribute the Covered
-+Software under the terms of either this License or such Secondary
-+License(s).
-+
-+3.4. Notices
-+
-+You may not remove or alter the substance of any license notices
-+(including copyright notices, patent notices, disclaimers of warranty,
-+or limitations of liability) contained within the Source Code Form of
-+the Covered Software, except that You may alter any license notices to
-+the extent required to remedy known factual inaccuracies.
-+
-+3.5. Application of Additional Terms
-+
-+You may choose to offer, and to charge a fee for, warranty, support,
-+indemnity or liability obligations to one or more recipients of Covered
-+Software. However, You may do so only on Your own behalf, and not on
-+behalf of any Contributor. You must make it absolutely clear that any
-+such warranty, support, indemnity, or liability obligation is offered by
-+You alone, and You hereby agree to indemnify every Contributor for any
-+liability incurred by such Contributor as a result of warranty, support,
-+indemnity or liability terms You offer. You may include additional
-+disclaimers of warranty and limitations of liability specific to any
-+jurisdiction.
-+
-+4. Inability to Comply Due to Statute or Regulation
-+---------------------------------------------------
-+
-+If it is impossible for You to comply with any of the terms of this
-+License with respect to some or all of the Covered Software due to
-+statute, judicial order, or regulation then You must: (a) comply with
-+the terms of this License to the maximum extent possible; and (b)
-+describe the limitations and the code they affect. Such description must
-+be placed in a text file included with all distributions of the Covered
-+Software under this License. Except to the extent prohibited by statute
-+or regulation, such description must be sufficiently detailed for a
-+recipient of ordinary skill to be able to understand it.
-+
-+5. Termination
-+--------------
-+
-+5.1. The rights granted under this License will terminate automatically
-+if You fail to comply with any of its terms. However, if You become
-+compliant, then the rights granted under this License from a particular
-+Contributor are reinstated (a) provisionally, unless and until such
-+Contributor explicitly and finally terminates Your grants, and (b) on an
-+ongoing basis, if such Contributor fails to notify You of the
-+non-compliance by some reasonable means prior to 60 days after You have
-+come back into compliance. Moreover, Your grants from a particular
-+Contributor are reinstated on an ongoing basis if such Contributor
-+notifies You of the non-compliance by some reasonable means, this is the
-+first time You have received notice of non-compliance with this License
-+from such Contributor, and You become compliant prior to 30 days after
-+Your receipt of the notice.
-+
-+5.2. If You initiate litigation against any entity by asserting a patent
-+infringement claim (excluding declaratory judgment actions,
-+counter-claims, and cross-claims) alleging that a Contributor Version
-+directly or indirectly infringes any patent, then the rights granted to
-+You by any and all Contributors for the Covered Software under Section
-+2.1 of this License shall terminate.
-+
-+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
-+end user license agreements (excluding distributors and resellers) which
-+have been validly granted by You or Your distributors under this License
-+prior to termination shall survive termination.
-+
-+************************************************************************
-+*                                                                      *
-+*  6. Disclaimer of Warranty                                           *
-+*  -------------------------                                           *
-+*                                                                      *
-+*  Covered Software is provided under this License on an "as is"       *
-+*  basis, without warranty of any kind, either expressed, implied, or  *
-+*  statutory, including, without limitation, warranties that the       *
-+*  Covered Software is free of defects, merchantable, fit for a        *
-+*  particular purpose or non-infringing. The entire risk as to the     *
-+*  quality and performance of the Covered Software is with You.        *
-+*  Should any Covered Software prove defective in any respect, You     *
-+*  (not any Contributor) assume the cost of any necessary servicing,   *
-+*  repair, or correction. This disclaimer of warranty constitutes an   *
-+*  essential part of this License. No use of any Covered Software is   *
-+*  authorized under this License except under this disclaimer.         *
-+*                                                                      *
-+************************************************************************
-+
-+************************************************************************
-+*                                                                      *
-+*  7. Limitation of Liability                                          *
-+*  --------------------------                                          *
-+*                                                                      *
-+*  Under no circumstances and under no legal theory, whether tort      *
-+*  (including negligence), contract, or otherwise, shall any           *
-+*  Contributor, or anyone who distributes Covered Software as          *
-+*  permitted above, be liable to You for any direct, indirect,         *
-+*  special, incidental, or consequential damages of any character      *
-+*  including, without limitation, damages for lost profits, loss of    *
-+*  goodwill, work stoppage, computer failure or malfunction, or any    *
-+*  and all other commercial damages or losses, even if such party      *
-+*  shall have been informed of the possibility of such damages. This   *
-+*  limitation of liability shall not apply to liability for death or   *
-+*  personal injury resulting from such party's negligence to the       *
-+*  extent applicable law prohibits such limitation. Some               *
-+*  jurisdictions do not allow the exclusion or limitation of           *
-+*  incidental or consequential damages, so this exclusion and          *
-+*  limitation may not apply to You.                                    *
-+*                                                                      *
-+************************************************************************
-+
-+8. Litigation
-+-------------
-+
-+Any litigation relating to this License may be brought only in the
-+courts of a jurisdiction where the defendant maintains its principal
-+place of business and such litigation shall be governed by laws of that
-+jurisdiction, without reference to its conflict-of-law provisions.
-+Nothing in this Section shall prevent a party's ability to bring
-+cross-claims or counter-claims.
-+
-+9. Miscellaneous
-+----------------
-+
-+This License represents the complete agreement concerning the subject
-+matter hereof. If any provision of this License is held to be
-+unenforceable, such provision shall be reformed only to the extent
-+necessary to make it enforceable. Any law or regulation which provides
-+that the language of a contract shall be construed against the drafter
-+shall not be used to construe this License against a Contributor.
-+
-+10. Versions of the License
-+---------------------------
-+
-+10.1. New Versions
-+
-+Mozilla Foundation is the license steward. Except as provided in Section
-+10.3, no one other than the license steward has the right to modify or
-+publish new versions of this License. Each version will be given a
-+distinguishing version number.
-+
-+10.2. Effect of New Versions
-+
-+You may distribute the Covered Software under the terms of the version
-+of the License under which You originally received the Covered Software,
-+or under the terms of any subsequent version published by the license
-+steward.
-+
-+10.3. Modified Versions
-+
-+If you create software not governed by this License, and you want to
-+create a new license for such software, you may create and use a
-+modified version of this License if you rename the license and remove
-+any references to the name of the license steward (except to note that
-+such modified license differs from this License).
-+
-+10.4. Distributing Source Code Form that is Incompatible With Secondary
-+Licenses
-+
-+If You choose to distribute Source Code Form that is Incompatible With
-+Secondary Licenses under the terms of this version of the License, the
-+notice described in Exhibit B of this License must be attached.
-+
-+Exhibit A - Source Code Form License Notice
-+-------------------------------------------
-+
-+  This Source Code Form is subject to the terms of the Mozilla Public
-+  License, v. 2.0. If a copy of the MPL was not distributed with this
-+  file, You can obtain one at http://mozilla.org/MPL/2.0/.
-+
-+If it is not possible or desirable to put the notice in a particular
-+file, then You may include the notice in a location (such as a LICENSE
-+file in a relevant directory) where a recipient would be likely to look
-+for such a notice.
-+
-+You may add additional accurate notices of copyright ownership.
-+
-+Exhibit B - "Incompatible With Secondary Licenses" Notice
-+---------------------------------------------------------
-+
-+  This Source Code Form is "Incompatible With Secondary Licenses", as
-+  defined by the Mozilla Public License, v. 2.0.
diff --git a/crates/uniffi_meta/src/ffi_names.rs b/crates/uniffi_meta/src/ffi_names.rs
deleted file mode 100644
index 5c931a0..0000000
--- a/crates/uniffi_meta/src/ffi_names.rs
+++ /dev/null
@@ -1,75 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-//! Functions to calculate names for FFI symbols
-//!
-//! All of these functions input a `namespace` parameter which is:
-//!   - The UDL namespace for UDL-based generation
-//!   - The "module path" of the item for proc-macro based generation.  Right now this is actually just the
-//!     crate name, but we eventually hope to make this the full module path.
-//!
-//! This could cause collisions in the case where you combine UDL and proc-macro generation and you
-//! set the UDL namespace to the name of another crate. This seems so pathological that it's not
-//! worth the code complexity to prevent it.
-
-/// FFI symbol name for a top-level function
-pub fn fn_symbol_name(namespace: &str, name: &str) -> String {
-    let name = name.to_ascii_lowercase();
-    format!("uniffi_{namespace}_fn_func_{name}")
-}
-
-/// FFI symbol name for an object constructor
-pub fn constructor_symbol_name(namespace: &str, object_name: &str, name: &str) -> String {
-    let object_name = object_name.to_ascii_lowercase();
-    let name = name.to_ascii_lowercase();
-    format!("uniffi_{namespace}_fn_constructor_{object_name}_{name}")
-}
-
-/// FFI symbol name for an object method
-pub fn method_symbol_name(namespace: &str, object_name: &str, name: &str) -> String {
-    let object_name = object_name.to_ascii_lowercase();
-    let name = name.to_ascii_lowercase();
-    format!("uniffi_{namespace}_fn_method_{object_name}_{name}")
-}
-
-/// FFI symbol name for the `clone` function for an object.
-pub fn clone_fn_symbol_name(namespace: &str, object_name: &str) -> String {
-    let object_name = object_name.to_ascii_lowercase();
-    format!("uniffi_{namespace}_fn_clone_{object_name}")
-}
-
-/// FFI symbol name for the `free` function for an object.
-pub fn free_fn_symbol_name(namespace: &str, object_name: &str) -> String {
-    let object_name = object_name.to_ascii_lowercase();
-    format!("uniffi_{namespace}_fn_free_{object_name}")
-}
-
-/// FFI symbol name for the `init_callback` function for a callback interface
-pub fn init_callback_vtable_fn_symbol_name(
-    namespace: &str,
-    callback_interface_name: &str,
-) -> String {
-    let callback_interface_name = callback_interface_name.to_ascii_lowercase();
-    format!("uniffi_{namespace}_fn_init_callback_vtable_{callback_interface_name}")
-}
-
-/// FFI checksum symbol name for a top-level function
-pub fn fn_checksum_symbol_name(namespace: &str, name: &str) -> String {
-    let name = name.to_ascii_lowercase();
-    format!("uniffi_{namespace}_checksum_func_{name}")
-}
-
-/// FFI checksum symbol name for an object constructor
-pub fn constructor_checksum_symbol_name(namespace: &str, object_name: &str, name: &str) -> String {
-    let object_name = object_name.to_ascii_lowercase();
-    let name = name.to_ascii_lowercase();
-    format!("uniffi_{namespace}_checksum_constructor_{object_name}_{name}")
-}
-
-/// FFI checksum symbol name for an object method
-pub fn method_checksum_symbol_name(namespace: &str, object_name: &str, name: &str) -> String {
-    let object_name = object_name.to_ascii_lowercase();
-    let name = name.to_ascii_lowercase();
-    format!("uniffi_{namespace}_checksum_method_{object_name}_{name}")
-}
diff --git a/crates/uniffi_meta/src/group.rs b/crates/uniffi_meta/src/group.rs
deleted file mode 100644
index a41776b..0000000
--- a/crates/uniffi_meta/src/group.rs
+++ /dev/null
@@ -1,270 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-use std::collections::{BTreeSet, HashMap};
-
-use crate::*;
-use anyhow::{bail, Result};
-
-type MetadataGroupMap = HashMap<String, MetadataGroup>;
-
-// Create empty metadata groups based on the metadata items.
-pub fn create_metadata_groups(items: &[Metadata]) -> MetadataGroupMap {
-    // Map crate names to MetadataGroup instances
-    items
-        .iter()
-        .filter_map(|i| match i {
-            Metadata::Namespace(namespace) => {
-                let group = MetadataGroup {
-                    namespace: namespace.clone(),
-                    namespace_docstring: None,
-                    items: BTreeSet::new(),
-                };
-                Some((namespace.crate_name.clone(), group))
-            }
-            Metadata::UdlFile(udl) => {
-                let namespace = NamespaceMetadata {
-                    crate_name: udl.module_path.clone(),
-                    name: udl.namespace.clone(),
-                };
-                let group = MetadataGroup {
-                    namespace,
-                    namespace_docstring: None,
-                    items: BTreeSet::new(),
-                };
-                Some((udl.module_path.clone(), group))
-            }
-            _ => None,
-        })
-        .collect::<HashMap<_, _>>()
-}
-
-/// Consume the items into the previously created metadata groups.
-pub fn group_metadata(group_map: &mut MetadataGroupMap, items: Vec<Metadata>) -> Result<()> {
-    for item in items {
-        if matches!(&item, Metadata::Namespace(_)) {
-            continue;
-        }
-
-        let crate_name = calc_crate_name(item.module_path()).to_owned(); // XXX - kill clone?
-
-        let item = fixup_external_type(item, group_map);
-        let group = match group_map.get_mut(&crate_name) {
-            Some(ns) => ns,
-            None => bail!("Unknown namespace for {item:?} ({crate_name})"),
-        };
-        if group.items.contains(&item) {
-            bail!("Duplicate metadata item: {item:?}");
-        }
-        group.add_item(item);
-    }
-    Ok(())
-}
-
-#[derive(Debug)]
-pub struct MetadataGroup {
-    pub namespace: NamespaceMetadata,
-    pub namespace_docstring: Option<String>,
-    pub items: BTreeSet<Metadata>,
-}
-
-impl MetadataGroup {
-    pub fn add_item(&mut self, item: Metadata) {
-        self.items.insert(item);
-    }
-}
-
-pub fn fixup_external_type(item: Metadata, group_map: &MetadataGroupMap) -> Metadata {
-    let crate_name = calc_crate_name(item.module_path()).to_owned();
-    let converter = ExternalTypeConverter {
-        crate_name: &crate_name,
-        crate_to_namespace: group_map,
-    };
-    converter.convert_item(item)
-}
-
-/// Convert metadata items by replacing types from external crates with Type::External
-struct ExternalTypeConverter<'a> {
-    crate_name: &'a str,
-    crate_to_namespace: &'a MetadataGroupMap,
-}
-
-impl<'a> ExternalTypeConverter<'a> {
-    fn crate_to_namespace(&self, crate_name: &str) -> String {
-        self.crate_to_namespace
-            .get(crate_name)
-            .unwrap_or_else(|| panic!("Can't find namespace for module {crate_name}"))
-            .namespace
-            .name
-            .clone()
-    }
-
-    fn convert_item(&self, item: Metadata) -> Metadata {
-        match item {
-            Metadata::Func(meta) => Metadata::Func(FnMetadata {
-                inputs: self.convert_params(meta.inputs),
-                return_type: self.convert_optional(meta.return_type),
-                throws: self.convert_optional(meta.throws),
-                ..meta
-            }),
-            Metadata::Method(meta) => Metadata::Method(MethodMetadata {
-                inputs: self.convert_params(meta.inputs),
-                return_type: self.convert_optional(meta.return_type),
-                throws: self.convert_optional(meta.throws),
-                ..meta
-            }),
-            Metadata::TraitMethod(meta) => Metadata::TraitMethod(TraitMethodMetadata {
-                inputs: self.convert_params(meta.inputs),
-                return_type: self.convert_optional(meta.return_type),
-                throws: self.convert_optional(meta.throws),
-                ..meta
-            }),
-            Metadata::Constructor(meta) => Metadata::Constructor(ConstructorMetadata {
-                inputs: self.convert_params(meta.inputs),
-                throws: self.convert_optional(meta.throws),
-                ..meta
-            }),
-            Metadata::Record(meta) => Metadata::Record(RecordMetadata {
-                fields: self.convert_fields(meta.fields),
-                ..meta
-            }),
-            Metadata::Enum(meta) => Metadata::Enum(self.convert_enum(meta)),
-            _ => item,
-        }
-    }
-
-    fn convert_params(&self, params: Vec<FnParamMetadata>) -> Vec<FnParamMetadata> {
-        params
-            .into_iter()
-            .map(|param| FnParamMetadata {
-                ty: self.convert_type(param.ty),
-                ..param
-            })
-            .collect()
-    }
-
-    fn convert_fields(&self, fields: Vec<FieldMetadata>) -> Vec<FieldMetadata> {
-        fields
-            .into_iter()
-            .map(|field| FieldMetadata {
-                ty: self.convert_type(field.ty),
-                ..field
-            })
-            .collect()
-    }
-
-    fn convert_enum(&self, enum_: EnumMetadata) -> EnumMetadata {
-        EnumMetadata {
-            variants: enum_
-                .variants
-                .into_iter()
-                .map(|variant| VariantMetadata {
-                    fields: self.convert_fields(variant.fields),
-                    ..variant
-                })
-                .collect(),
-            ..enum_
-        }
-    }
-
-    fn convert_optional(&self, ty: Option<Type>) -> Option<Type> {
-        ty.map(|ty| self.convert_type(ty))
-    }
-
-    fn convert_type(&self, ty: Type) -> Type {
-        match ty {
-            // Convert `ty` if it's external
-            Type::Enum { module_path, name } | Type::Record { module_path, name }
-                if self.is_module_path_external(&module_path) =>
-            {
-                Type::External {
-                    namespace: self.crate_to_namespace(&module_path),
-                    module_path,
-                    name,
-                    kind: ExternalKind::DataClass,
-                    tagged: false,
-                }
-            }
-            Type::Custom {
-                module_path, name, ..
-            } if self.is_module_path_external(&module_path) => {
-                // For now, it's safe to assume that all custom types are data classes.
-                // There's no reason to use a custom type with an interface.
-                Type::External {
-                    namespace: self.crate_to_namespace(&module_path),
-                    module_path,
-                    name,
-                    kind: ExternalKind::DataClass,
-                    tagged: false,
-                }
-            }
-            Type::Object {
-                module_path, name, ..
-            } if self.is_module_path_external(&module_path) => Type::External {
-                namespace: self.crate_to_namespace(&module_path),
-                module_path,
-                name,
-                kind: ExternalKind::Interface,
-                tagged: false,
-            },
-            Type::CallbackInterface { module_path, name }
-                if self.is_module_path_external(&module_path) =>
-            {
-                panic!("External callback interfaces not supported ({name})")
-            }
-            // Convert child types
-            Type::Custom {
-                module_path,
-                name,
-                builtin,
-                ..
-            } => Type::Custom {
-                module_path,
-                name,
-                builtin: Box::new(self.convert_type(*builtin)),
-            },
-            Type::Optional { inner_type } => Type::Optional {
-                inner_type: Box::new(self.convert_type(*inner_type)),
-            },
-            Type::Sequence { inner_type } => Type::Sequence {
-                inner_type: Box::new(self.convert_type(*inner_type)),
-            },
-            Type::Map {
-                key_type,
-                value_type,
-            } => Type::Map {
-                key_type: Box::new(self.convert_type(*key_type)),
-                value_type: Box::new(self.convert_type(*value_type)),
-            },
-            // Existing External types probably need namespace fixed.
-            Type::External {
-                namespace,
-                module_path,
-                name,
-                kind,
-                tagged,
-            } => {
-                assert!(namespace.is_empty());
-                Type::External {
-                    namespace: self.crate_to_namespace(&module_path),
-                    module_path,
-                    name,
-                    kind,
-                    tagged,
-                }
-            }
-
-            // Otherwise, just return the type unchanged
-            _ => ty,
-        }
-    }
-
-    fn is_module_path_external(&self, module_path: &str) -> bool {
-        calc_crate_name(module_path) != self.crate_name
-    }
-}
-
-fn calc_crate_name(module_path: &str) -> &str {
-    module_path.split("::").next().unwrap()
-}
diff --git a/crates/uniffi_meta/src/lib.rs b/crates/uniffi_meta/src/lib.rs
deleted file mode 100644
index 90f7b2d..0000000
--- a/crates/uniffi_meta/src/lib.rs
+++ /dev/null
@@ -1,551 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-use std::{collections::BTreeMap, hash::Hasher};
-pub use uniffi_checksum_derive::Checksum;
-
-mod ffi_names;
-pub use ffi_names::*;
-
-mod group;
-pub use group::{create_metadata_groups, fixup_external_type, group_metadata, MetadataGroup};
-
-mod reader;
-pub use reader::{read_metadata, read_metadata_type};
-
-mod types;
-pub use types::{AsType, ExternalKind, ObjectImpl, Type, TypeIterator};
-
-mod metadata;
-
-// This needs to match the minor version of the `uniffi` crate.  See
-// `docs/uniffi-versioning.md` for details.
-//
-// Once we get to 1.0, then we'll need to update the scheme to something like 100 + major_version
-pub const UNIFFI_CONTRACT_VERSION: u32 = 26;
-
-/// Similar to std::hash::Hash.
-///
-/// Implementations of this trait are expected to update the hasher state in
-/// the same way across platforms. #[derive(Checksum)] will do the right thing.
-pub trait Checksum {
-    fn checksum<H: Hasher>(&self, state: &mut H);
-}
-
-impl Checksum for bool {
-    fn checksum<H: Hasher>(&self, state: &mut H) {
-        state.write_u8(*self as u8);
-    }
-}
-
-impl Checksum for u64 {
-    fn checksum<H: Hasher>(&self, state: &mut H) {
-        state.write(&self.to_le_bytes());
-    }
-}
-
-impl Checksum for i64 {
-    fn checksum<H: Hasher>(&self, state: &mut H) {
-        state.write(&self.to_le_bytes());
-    }
-}
-
-impl<T: Checksum> Checksum for Box<T> {
-    fn checksum<H: Hasher>(&self, state: &mut H) {
-        (**self).checksum(state)
-    }
-}
-
-impl<T: Checksum> Checksum for [T] {
-    fn checksum<H: Hasher>(&self, state: &mut H) {
-        state.write(&(self.len() as u64).to_le_bytes());
-        for item in self {
-            Checksum::checksum(item, state);
-        }
-    }
-}
-
-impl<T: Checksum> Checksum for Vec<T> {
-    fn checksum<H: Hasher>(&self, state: &mut H) {
-        Checksum::checksum(&**self, state);
-    }
-}
-
-impl<K: Checksum, V: Checksum> Checksum for BTreeMap<K, V> {
-    fn checksum<H: Hasher>(&self, state: &mut H) {
-        state.write(&(self.len() as u64).to_le_bytes());
-        for (key, value) in self {
-            Checksum::checksum(key, state);
-            Checksum::checksum(value, state);
-        }
-    }
-}
-
-impl<T: Checksum> Checksum for Option<T> {
-    fn checksum<H: Hasher>(&self, state: &mut H) {
-        match self {
-            None => state.write(&0u64.to_le_bytes()),
-            Some(value) => {
-                state.write(&1u64.to_le_bytes());
-                Checksum::checksum(value, state)
-            }
-        }
-    }
-}
-
-impl Checksum for str {
-    fn checksum<H: Hasher>(&self, state: &mut H) {
-        state.write(self.as_bytes());
-        state.write_u8(0xff);
-    }
-}
-
-impl Checksum for String {
-    fn checksum<H: Hasher>(&self, state: &mut H) {
-        (**self).checksum(state)
-    }
-}
-
-impl Checksum for &str {
-    fn checksum<H: Hasher>(&self, state: &mut H) {
-        (**self).checksum(state)
-    }
-}
-
-// The namespace of a Component interface.
-//
-// This is used to match up the macro metadata with the UDL items.
-#[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord)]
-pub struct NamespaceMetadata {
-    pub crate_name: String,
-    pub name: String,
-}
-
-// UDL file included with `include_scaffolding!()`
-//
-// This is to find the UDL files in library mode generation
-#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
-pub struct UdlFile {
-    // The module path specified when the UDL file was parsed.
-    pub module_path: String,
-    pub namespace: String,
-    // the base filename of the udl file - no path, no extension.
-    pub file_stub: String,
-}
-
-#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
-pub struct FnMetadata {
-    pub module_path: String,
-    pub name: String,
-    pub is_async: bool,
-    pub inputs: Vec<FnParamMetadata>,
-    pub return_type: Option<Type>,
-    pub throws: Option<Type>,
-    pub checksum: Option<u16>,
-    pub docstring: Option<String>,
-}
-
-impl FnMetadata {
-    pub fn ffi_symbol_name(&self) -> String {
-        fn_symbol_name(&self.module_path, &self.name)
-    }
-
-    pub fn checksum_symbol_name(&self) -> String {
-        fn_checksum_symbol_name(&self.module_path, &self.name)
-    }
-}
-
-#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
-pub struct ConstructorMetadata {
-    pub module_path: String,
-    pub self_name: String,
-    pub name: String,
-    pub is_async: bool,
-    pub inputs: Vec<FnParamMetadata>,
-    pub throws: Option<Type>,
-    pub checksum: Option<u16>,
-    pub docstring: Option<String>,
-}
-
-impl ConstructorMetadata {
-    pub fn ffi_symbol_name(&self) -> String {
-        constructor_symbol_name(&self.module_path, &self.self_name, &self.name)
-    }
-
-    pub fn checksum_symbol_name(&self) -> String {
-        constructor_checksum_symbol_name(&self.module_path, &self.self_name, &self.name)
-    }
-
-    pub fn is_primary(&self) -> bool {
-        self.name == "new"
-    }
-}
-
-#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
-pub struct MethodMetadata {
-    pub module_path: String,
-    pub self_name: String,
-    pub name: String,
-    pub is_async: bool,
-    pub inputs: Vec<FnParamMetadata>,
-    pub return_type: Option<Type>,
-    pub throws: Option<Type>,
-    pub takes_self_by_arc: bool, // unused except by rust udl bindgen.
-    pub checksum: Option<u16>,
-    pub docstring: Option<String>,
-}
-
-impl MethodMetadata {
-    pub fn ffi_symbol_name(&self) -> String {
-        method_symbol_name(&self.module_path, &self.self_name, &self.name)
-    }
-
-    pub fn checksum_symbol_name(&self) -> String {
-        method_checksum_symbol_name(&self.module_path, &self.self_name, &self.name)
-    }
-}
-
-#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
-pub struct TraitMethodMetadata {
-    pub module_path: String,
-    pub trait_name: String,
-    // Note: the position of `index` is important since it causes callback interface methods to be
-    // ordered correctly in MetadataGroup.items
-    pub index: u32,
-    pub name: String,
-    pub is_async: bool,
-    pub inputs: Vec<FnParamMetadata>,
-    pub return_type: Option<Type>,
-    pub throws: Option<Type>,
-    pub takes_self_by_arc: bool, // unused except by rust udl bindgen.
-    pub checksum: Option<u16>,
-    pub docstring: Option<String>,
-}
-
-impl TraitMethodMetadata {
-    pub fn ffi_symbol_name(&self) -> String {
-        method_symbol_name(&self.module_path, &self.trait_name, &self.name)
-    }
-
-    pub fn checksum_symbol_name(&self) -> String {
-        method_checksum_symbol_name(&self.module_path, &self.trait_name, &self.name)
-    }
-}
-
-#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
-pub struct FnParamMetadata {
-    pub name: String,
-    pub ty: Type,
-    pub by_ref: bool,
-    pub optional: bool,
-    pub default: Option<LiteralMetadata>,
-}
-
-impl FnParamMetadata {
-    pub fn simple(name: &str, ty: Type) -> Self {
-        Self {
-            name: name.to_string(),
-            ty,
-            by_ref: false,
-            optional: false,
-            default: None,
-        }
-    }
-}
-
-#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Checksum)]
-pub enum LiteralMetadata {
-    Boolean(bool),
-    String(String),
-    // Integers are represented as the widest representation we can.
-    // Number formatting vary with language and radix, so we avoid a lot of parsing and
-    // formatting duplication by using only signed and unsigned variants.
-    UInt(u64, Radix, Type),
-    Int(i64, Radix, Type),
-    // Pass the string representation through as typed in the UDL.
-    // This avoids a lot of uncertainty around precision and accuracy,
-    // though bindings for languages less sophisticated number parsing than WebIDL
-    // will have to do extra work.
-    Float(String, Type),
-    Enum(String, Type),
-    EmptySequence,
-    EmptyMap,
-    None,
-    Some { inner: Box<LiteralMetadata> },
-}
-
-impl LiteralMetadata {
-    pub fn new_uint(v: u64) -> Self {
-        LiteralMetadata::UInt(v, Radix::Decimal, Type::UInt64)
-    }
-    pub fn new_int(v: i64) -> Self {
-        LiteralMetadata::Int(v, Radix::Decimal, Type::Int64)
-    }
-}
-
-// Represent the radix of integer literal values.
-// We preserve the radix into the generated bindings for readability reasons.
-#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Checksum)]
-pub enum Radix {
-    Decimal = 10,
-    Octal = 8,
-    Hexadecimal = 16,
-}
-
-#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
-pub struct RecordMetadata {
-    pub module_path: String,
-    pub name: String,
-    pub fields: Vec<FieldMetadata>,
-    pub docstring: Option<String>,
-}
-
-#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
-pub struct FieldMetadata {
-    pub name: String,
-    pub ty: Type,
-    pub default: Option<LiteralMetadata>,
-    pub docstring: Option<String>,
-}
-
-#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
-pub struct EnumMetadata {
-    pub module_path: String,
-    pub name: String,
-    pub forced_flatness: Option<bool>,
-    pub variants: Vec<VariantMetadata>,
-    pub discr_type: Option<Type>,
-    pub non_exhaustive: bool,
-    pub docstring: Option<String>,
-}
-
-#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
-pub struct VariantMetadata {
-    pub name: String,
-    pub discr: Option<LiteralMetadata>,
-    pub fields: Vec<FieldMetadata>,
-    pub docstring: Option<String>,
-}
-
-#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
-pub struct ObjectMetadata {
-    pub module_path: String,
-    pub name: String,
-    pub imp: types::ObjectImpl,
-    pub docstring: Option<String>,
-}
-
-#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
-pub struct CallbackInterfaceMetadata {
-    pub module_path: String,
-    pub name: String,
-    pub docstring: Option<String>,
-}
-
-impl ObjectMetadata {
-    /// FFI symbol name for the `clone` function for this object.
-    ///
-    /// This function is used to increment the reference count before lowering an object to pass
-    /// back to Rust.
-    pub fn clone_ffi_symbol_name(&self) -> String {
-        clone_fn_symbol_name(&self.module_path, &self.name)
-    }
-
-    /// FFI symbol name for the `free` function for this object.
-    ///
-    /// This function is used to free the memory used by this object.
-    pub fn free_ffi_symbol_name(&self) -> String {
-        free_fn_symbol_name(&self.module_path, &self.name)
-    }
-}
-
-/// The list of traits we support generating helper methods for.
-#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
-pub enum UniffiTraitMetadata {
-    Debug {
-        fmt: MethodMetadata,
-    },
-    Display {
-        fmt: MethodMetadata,
-    },
-    Eq {
-        eq: MethodMetadata,
-        ne: MethodMetadata,
-    },
-    Hash {
-        hash: MethodMetadata,
-    },
-}
-
-impl UniffiTraitMetadata {
-    fn module_path(&self) -> &String {
-        &match self {
-            UniffiTraitMetadata::Debug { fmt } => fmt,
-            UniffiTraitMetadata::Display { fmt } => fmt,
-            UniffiTraitMetadata::Eq { eq, .. } => eq,
-            UniffiTraitMetadata::Hash { hash } => hash,
-        }
-        .module_path
-    }
-
-    pub fn self_name(&self) -> &String {
-        &match self {
-            UniffiTraitMetadata::Debug { fmt } => fmt,
-            UniffiTraitMetadata::Display { fmt } => fmt,
-            UniffiTraitMetadata::Eq { eq, .. } => eq,
-            UniffiTraitMetadata::Hash { hash } => hash,
-        }
-        .self_name
-    }
-}
-
-#[repr(u8)]
-#[derive(Eq, PartialEq, Hash)]
-pub enum UniffiTraitDiscriminants {
-    Debug,
-    Display,
-    Eq,
-    Hash,
-}
-
-impl UniffiTraitDiscriminants {
-    pub fn from(v: u8) -> anyhow::Result<Self> {
-        Ok(match v {
-            0 => UniffiTraitDiscriminants::Debug,
-            1 => UniffiTraitDiscriminants::Display,
-            2 => UniffiTraitDiscriminants::Eq,
-            3 => UniffiTraitDiscriminants::Hash,
-            _ => anyhow::bail!("invalid trait discriminant {v}"),
-        })
-    }
-}
-
-#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
-pub struct CustomTypeMetadata {
-    pub module_path: String,
-    pub name: String,
-    pub builtin: Type,
-}
-
-/// Returns the last 16 bits of the value's hash as computed with [`SipHasher13`].
-///
-/// This is used as a safeguard against different UniFFI versions being used for scaffolding and
-/// bindings generation.
-pub fn checksum<T: Checksum>(val: &T) -> u16 {
-    let mut hasher = siphasher::sip::SipHasher13::new();
-    val.checksum(&mut hasher);
-    (hasher.finish() & 0x000000000000FFFF) as u16
-}
-
-/// Enum covering all the possible metadata types
-#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
-pub enum Metadata {
-    Namespace(NamespaceMetadata),
-    UdlFile(UdlFile),
-    Func(FnMetadata),
-    Object(ObjectMetadata),
-    CallbackInterface(CallbackInterfaceMetadata),
-    Record(RecordMetadata),
-    Enum(EnumMetadata),
-    Constructor(ConstructorMetadata),
-    Method(MethodMetadata),
-    TraitMethod(TraitMethodMetadata),
-    CustomType(CustomTypeMetadata),
-    UniffiTrait(UniffiTraitMetadata),
-}
-
-impl Metadata {
-    pub fn read(data: &[u8]) -> anyhow::Result<Self> {
-        read_metadata(data)
-    }
-
-    pub(crate) fn module_path(&self) -> &String {
-        match self {
-            Metadata::Namespace(meta) => &meta.crate_name,
-            Metadata::UdlFile(meta) => &meta.module_path,
-            Metadata::Func(meta) => &meta.module_path,
-            Metadata::Constructor(meta) => &meta.module_path,
-            Metadata::Method(meta) => &meta.module_path,
-            Metadata::Record(meta) => &meta.module_path,
-            Metadata::Enum(meta) => &meta.module_path,
-            Metadata::Object(meta) => &meta.module_path,
-            Metadata::CallbackInterface(meta) => &meta.module_path,
-            Metadata::TraitMethod(meta) => &meta.module_path,
-            Metadata::CustomType(meta) => &meta.module_path,
-            Metadata::UniffiTrait(meta) => meta.module_path(),
-        }
-    }
-}
-
-impl From<NamespaceMetadata> for Metadata {
-    fn from(value: NamespaceMetadata) -> Metadata {
-        Self::Namespace(value)
-    }
-}
-
-impl From<UdlFile> for Metadata {
-    fn from(value: UdlFile) -> Metadata {
-        Self::UdlFile(value)
-    }
-}
-
-impl From<FnMetadata> for Metadata {
-    fn from(value: FnMetadata) -> Metadata {
-        Self::Func(value)
-    }
-}
-
-impl From<ConstructorMetadata> for Metadata {
-    fn from(c: ConstructorMetadata) -> Self {
-        Self::Constructor(c)
-    }
-}
-
-impl From<MethodMetadata> for Metadata {
-    fn from(m: MethodMetadata) -> Self {
-        Self::Method(m)
-    }
-}
-
-impl From<RecordMetadata> for Metadata {
-    fn from(r: RecordMetadata) -> Self {
-        Self::Record(r)
-    }
-}
-
-impl From<EnumMetadata> for Metadata {
-    fn from(e: EnumMetadata) -> Self {
-        Self::Enum(e)
-    }
-}
-
-impl From<ObjectMetadata> for Metadata {
-    fn from(v: ObjectMetadata) -> Self {
-        Self::Object(v)
-    }
-}
-
-impl From<CallbackInterfaceMetadata> for Metadata {
-    fn from(v: CallbackInterfaceMetadata) -> Self {
-        Self::CallbackInterface(v)
-    }
-}
-
-impl From<TraitMethodMetadata> for Metadata {
-    fn from(v: TraitMethodMetadata) -> Self {
-        Self::TraitMethod(v)
-    }
-}
-
-impl From<CustomTypeMetadata> for Metadata {
-    fn from(v: CustomTypeMetadata) -> Self {
-        Self::CustomType(v)
-    }
-}
-
-impl From<UniffiTraitMetadata> for Metadata {
-    fn from(v: UniffiTraitMetadata) -> Self {
-        Self::UniffiTrait(v)
-    }
-}
diff --git a/crates/uniffi_meta/src/metadata.rs b/crates/uniffi_meta/src/metadata.rs
deleted file mode 100644
index 9cfb77a..0000000
--- a/crates/uniffi_meta/src/metadata.rs
+++ /dev/null
@@ -1,90 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-// Copied from uniffi_core/src/metadata.rs
-// Due to a [Rust bug](https://github.com/rust-lang/rust/issues/113104) we don't want to pull in
-// `uniffi_core`.
-// This is the easy way out of that issue and is a temporary hacky solution.
-
-/// Metadata constants, make sure to keep this in sync with copy in `uniffi_core::metadata`
-pub mod codes {
-    // Top-level metadata item codes
-    pub const FUNC: u8 = 0;
-    pub const METHOD: u8 = 1;
-    pub const RECORD: u8 = 2;
-    pub const ENUM: u8 = 3;
-    pub const INTERFACE: u8 = 4;
-    pub const NAMESPACE: u8 = 6;
-    pub const CONSTRUCTOR: u8 = 7;
-    pub const UDL_FILE: u8 = 8;
-    pub const CALLBACK_INTERFACE: u8 = 9;
-    pub const TRAIT_METHOD: u8 = 10;
-    pub const UNIFFI_TRAIT: u8 = 11;
-    pub const TRAIT_INTERFACE: u8 = 12;
-    pub const CALLBACK_TRAIT_INTERFACE: u8 = 13;
-    //pub const UNKNOWN: u8 = 255;
-
-    // Type codes
-    pub const TYPE_U8: u8 = 0;
-    pub const TYPE_U16: u8 = 1;
-    pub const TYPE_U32: u8 = 2;
-    pub const TYPE_U64: u8 = 3;
-    pub const TYPE_I8: u8 = 4;
-    pub const TYPE_I16: u8 = 5;
-    pub const TYPE_I32: u8 = 6;
-    pub const TYPE_I64: u8 = 7;
-    pub const TYPE_F32: u8 = 8;
-    pub const TYPE_F64: u8 = 9;
-    pub const TYPE_BOOL: u8 = 10;
-    pub const TYPE_STRING: u8 = 11;
-    pub const TYPE_OPTION: u8 = 12;
-    pub const TYPE_RECORD: u8 = 13;
-    pub const TYPE_ENUM: u8 = 14;
-    // 15 no longer used.
-    pub const TYPE_INTERFACE: u8 = 16;
-    pub const TYPE_VEC: u8 = 17;
-    pub const TYPE_HASH_MAP: u8 = 18;
-    pub const TYPE_SYSTEM_TIME: u8 = 19;
-    pub const TYPE_DURATION: u8 = 20;
-    pub const TYPE_CALLBACK_INTERFACE: u8 = 21;
-    pub const TYPE_CUSTOM: u8 = 22;
-    pub const TYPE_RESULT: u8 = 23;
-    pub const TYPE_TRAIT_INTERFACE: u8 = 24;
-    pub const TYPE_CALLBACK_TRAIT_INTERFACE: u8 = 25;
-    pub const TYPE_UNIT: u8 = 255;
-
-    // Literal codes
-    pub const LIT_STR: u8 = 0;
-    pub const LIT_INT: u8 = 1;
-    pub const LIT_FLOAT: u8 = 2;
-    pub const LIT_BOOL: u8 = 3;
-    pub const LIT_NONE: u8 = 4;
-    pub const LIT_SOME: u8 = 5;
-    pub const LIT_EMPTY_SEQ: u8 = 6;
-}
-
-// Create a checksum for a MetadataBuffer
-//
-// This is used by the bindings code to verify that the library they link to is the same one
-// that the bindings were generated from.
-pub const fn checksum_metadata(buf: &[u8]) -> u16 {
-    calc_checksum(buf, buf.len())
-}
-
-const fn calc_checksum(bytes: &[u8], size: usize) -> u16 {
-    // Taken from the fnv_hash() function from the FNV crate (https://github.com/servo/rust-fnv/blob/master/lib.rs).
-    // fnv_hash() hasn't been released in a version yet.
-    const INITIAL_STATE: u64 = 0xcbf29ce484222325;
-    const PRIME: u64 = 0x100000001b3;
-
-    let mut hash = INITIAL_STATE;
-    let mut i = 0;
-    while i < size {
-        hash ^= bytes[i] as u64;
-        hash = hash.wrapping_mul(PRIME);
-        i += 1;
-    }
-    // Convert the 64-bit hash to a 16-bit hash by XORing everything together
-    (hash ^ (hash >> 16) ^ (hash >> 32) ^ (hash >> 48)) as u16
-}
diff --git a/crates/uniffi_meta/src/reader.rs b/crates/uniffi_meta/src/reader.rs
deleted file mode 100644
index 6fec6cb..0000000
--- a/crates/uniffi_meta/src/reader.rs
+++ /dev/null
@@ -1,557 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-use crate::metadata::{checksum_metadata, codes};
-use crate::*;
-use anyhow::{bail, ensure, Context, Result};
-
-pub fn read_metadata(data: &[u8]) -> Result<Metadata> {
-    MetadataReader::new(data).read_metadata()
-}
-
-// Read a metadata type, this is pub so that we can test it in the metadata fixture
-pub fn read_metadata_type(data: &[u8]) -> Result<Type> {
-    MetadataReader::new(data).read_type()
-}
-
-/// Helper struct for read_metadata()
-struct MetadataReader<'a> {
-    // This points to the initial data we were passed in
-    initial_data: &'a [u8],
-    // This points to the remaining data to be read
-    buf: &'a [u8],
-}
-
-impl<'a> MetadataReader<'a> {
-    fn new(data: &'a [u8]) -> Self {
-        Self {
-            initial_data: data,
-            buf: data,
-        }
-    }
-
-    // Read a top-level metadata item
-    //
-    // This consumes self because MetadataReader is only intended to read a single item.
-    fn read_metadata(mut self) -> Result<Metadata> {
-        let value = self.read_u8()?;
-        Ok(match value {
-            codes::NAMESPACE => NamespaceMetadata {
-                crate_name: self.read_string()?,
-                name: self.read_string()?,
-            }
-            .into(),
-            codes::UDL_FILE => UdlFile {
-                module_path: self.read_string()?,
-                namespace: self.read_string()?,
-                file_stub: self.read_string()?,
-            }
-            .into(),
-            codes::FUNC => self.read_func()?.into(),
-            codes::CONSTRUCTOR => self.read_constructor()?.into(),
-            codes::METHOD => self.read_method()?.into(),
-            codes::RECORD => self.read_record()?.into(),
-            codes::ENUM => self.read_enum()?.into(),
-            codes::INTERFACE => self.read_object(ObjectImpl::Struct)?.into(),
-            codes::TRAIT_INTERFACE => self.read_object(ObjectImpl::Trait)?.into(),
-            codes::CALLBACK_TRAIT_INTERFACE => self.read_object(ObjectImpl::CallbackTrait)?.into(),
-            codes::CALLBACK_INTERFACE => self.read_callback_interface()?.into(),
-            codes::TRAIT_METHOD => self.read_trait_method()?.into(),
-            codes::UNIFFI_TRAIT => self.read_uniffi_trait()?.into(),
-            _ => bail!("Unexpected metadata code: {value:?}"),
-        })
-    }
-
-    fn read_u8(&mut self) -> Result<u8> {
-        if !self.buf.is_empty() {
-            let value = self.buf[0];
-            self.buf = &self.buf[1..];
-            Ok(value)
-        } else {
-            bail!("Buffer is empty")
-        }
-    }
-
-    fn peek_u8(&mut self) -> Result<u8> {
-        if !self.buf.is_empty() {
-            Ok(self.buf[0])
-        } else {
-            bail!("Buffer is empty")
-        }
-    }
-
-    fn read_u16(&mut self) -> Result<u16> {
-        if self.buf.len() >= 2 {
-            // read the value as little-endian
-            let value = u16::from_le_bytes([self.buf[0], self.buf[1]]);
-            self.buf = &self.buf[2..];
-            Ok(value)
-        } else {
-            bail!("Not enough data left in buffer to read a u16 value");
-        }
-    }
-
-    fn read_u32(&mut self) -> Result<u32> {
-        if self.buf.len() >= 4 {
-            // read the value as little-endian
-            let value = self.buf[0] as u32
-                + ((self.buf[1] as u32) << 8)
-                + ((self.buf[2] as u32) << 16)
-                + ((self.buf[3] as u32) << 24);
-            self.buf = &self.buf[4..];
-            Ok(value)
-        } else {
-            bail!("Not enough data left in buffer to read a u32 value");
-        }
-    }
-
-    fn read_bool(&mut self) -> Result<bool> {
-        Ok(self.read_u8()? == 1)
-    }
-
-    fn read_string(&mut self) -> Result<String> {
-        let size = self.read_u8()? as usize;
-        let slice;
-        (slice, self.buf) = self.buf.split_at(size);
-        String::from_utf8(slice.into()).context("Invalid string data")
-    }
-
-    fn read_long_string(&mut self) -> Result<String> {
-        let size = self.read_u16()? as usize;
-        let slice;
-        (slice, self.buf) = self.buf.split_at(size);
-        String::from_utf8(slice.into()).context("Invalid string data")
-    }
-
-    fn read_optional_long_string(&mut self) -> Result<Option<String>> {
-        Ok(Some(self.read_long_string()?).filter(|str| !str.is_empty()))
-    }
-
-    fn read_type(&mut self) -> Result<Type> {
-        let value = self.read_u8()?;
-        Ok(match value {
-            codes::TYPE_U8 => Type::UInt8,
-            codes::TYPE_I8 => Type::Int8,
-            codes::TYPE_U16 => Type::UInt16,
-            codes::TYPE_I16 => Type::Int16,
-            codes::TYPE_U32 => Type::UInt32,
-            codes::TYPE_I32 => Type::Int32,
-            codes::TYPE_U64 => Type::UInt64,
-            codes::TYPE_I64 => Type::Int64,
-            codes::TYPE_F32 => Type::Float32,
-            codes::TYPE_F64 => Type::Float64,
-            codes::TYPE_BOOL => Type::Boolean,
-            codes::TYPE_STRING => Type::String,
-            codes::TYPE_DURATION => Type::Duration,
-            codes::TYPE_SYSTEM_TIME => Type::Timestamp,
-            codes::TYPE_RECORD => Type::Record {
-                module_path: self.read_string()?,
-                name: self.read_string()?,
-            },
-            codes::TYPE_ENUM => Type::Enum {
-                module_path: self.read_string()?,
-                name: self.read_string()?,
-            },
-            codes::TYPE_INTERFACE => Type::Object {
-                module_path: self.read_string()?,
-                name: self.read_string()?,
-                imp: ObjectImpl::Struct,
-            },
-            codes::TYPE_TRAIT_INTERFACE => Type::Object {
-                module_path: self.read_string()?,
-                name: self.read_string()?,
-                imp: ObjectImpl::Trait,
-            },
-            codes::TYPE_CALLBACK_TRAIT_INTERFACE => Type::Object {
-                module_path: self.read_string()?,
-                name: self.read_string()?,
-                imp: ObjectImpl::CallbackTrait,
-            },
-            codes::TYPE_CALLBACK_INTERFACE => Type::CallbackInterface {
-                module_path: self.read_string()?,
-                name: self.read_string()?,
-            },
-            codes::TYPE_CUSTOM => Type::Custom {
-                module_path: self.read_string()?,
-                name: self.read_string()?,
-                builtin: Box::new(self.read_type()?),
-            },
-            codes::TYPE_OPTION => Type::Optional {
-                inner_type: Box::new(self.read_type()?),
-            },
-            codes::TYPE_VEC => {
-                let inner_type = self.read_type()?;
-                if inner_type == Type::UInt8 {
-                    Type::Bytes
-                } else {
-                    Type::Sequence {
-                        inner_type: Box::new(inner_type),
-                    }
-                }
-            }
-            codes::TYPE_HASH_MAP => Type::Map {
-                key_type: Box::new(self.read_type()?),
-                value_type: Box::new(self.read_type()?),
-            },
-            codes::TYPE_UNIT => bail!("Unexpected TYPE_UNIT"),
-            codes::TYPE_RESULT => bail!("Unexpected TYPE_RESULT"),
-            _ => bail!("Unexpected metadata type code: {value:?}"),
-        })
-    }
-
-    fn read_optional_type(&mut self) -> Result<Option<Type>> {
-        Ok(match self.peek_u8()? {
-            codes::TYPE_UNIT => {
-                _ = self.read_u8();
-                None
-            }
-            _ => Some(self.read_type()?),
-        })
-    }
-
-    fn read_return_type(&mut self) -> Result<(Option<Type>, Option<Type>)> {
-        Ok(match self.peek_u8()? {
-            codes::TYPE_UNIT => {
-                _ = self.read_u8();
-                (None, None)
-            }
-            codes::TYPE_RESULT => {
-                _ = self.read_u8();
-                (self.read_optional_type()?, self.read_optional_type()?)
-            }
-            _ => (Some(self.read_type()?), None),
-        })
-    }
-
-    fn read_func(&mut self) -> Result<FnMetadata> {
-        let module_path = self.read_string()?;
-        let name = self.read_string()?;
-        let is_async = self.read_bool()?;
-        let inputs = self.read_inputs()?;
-        let (return_type, throws) = self.read_return_type()?;
-        let docstring = self.read_optional_long_string()?;
-        Ok(FnMetadata {
-            module_path,
-            name,
-            is_async,
-            inputs,
-            return_type,
-            throws,
-            docstring,
-            checksum: self.calc_checksum(),
-        })
-    }
-
-    fn read_constructor(&mut self) -> Result<ConstructorMetadata> {
-        let module_path = self.read_string()?;
-        let self_name = self.read_string()?;
-        let name = self.read_string()?;
-        let is_async = self.read_bool()?;
-        let inputs = self.read_inputs()?;
-        let (return_type, throws) = self.read_return_type()?;
-        let docstring = self.read_optional_long_string()?;
-
-        return_type
-            .filter(|t| {
-                matches!(
-                    t,
-                    Type::Object { name, imp: ObjectImpl::Struct, .. } if name == &self_name
-                )
-            })
-            .context("Constructor return type must be Arc<Self>")?;
-
-        Ok(ConstructorMetadata {
-            module_path,
-            self_name,
-            is_async,
-            name,
-            inputs,
-            throws,
-            checksum: self.calc_checksum(),
-            docstring,
-        })
-    }
-
-    fn read_method(&mut self) -> Result<MethodMetadata> {
-        let module_path = self.read_string()?;
-        let self_name = self.read_string()?;
-        let name = self.read_string()?;
-        let is_async = self.read_bool()?;
-        let inputs = self.read_inputs()?;
-        let (return_type, throws) = self.read_return_type()?;
-        let docstring = self.read_optional_long_string()?;
-        Ok(MethodMetadata {
-            module_path,
-            self_name,
-            name,
-            is_async,
-            inputs,
-            return_type,
-            throws,
-            takes_self_by_arc: false, // not emitted by macros
-            checksum: self.calc_checksum(),
-            docstring,
-        })
-    }
-
-    fn read_record(&mut self) -> Result<RecordMetadata> {
-        Ok(RecordMetadata {
-            module_path: self.read_string()?,
-            name: self.read_string()?,
-            fields: self.read_fields()?,
-            docstring: self.read_optional_long_string()?,
-        })
-    }
-
-    fn read_enum(&mut self) -> Result<EnumMetadata> {
-        let module_path = self.read_string()?;
-        let name = self.read_string()?;
-        let forced_flatness = match self.read_u8()? {
-            0 => None,
-            1 => Some(false),
-            2 => Some(true),
-            _ => unreachable!("invalid flatness"),
-        };
-        let discr_type = if self.read_bool()? {
-            Some(self.read_type()?)
-        } else {
-            None
-        };
-        let variants = if forced_flatness == Some(true) {
-            self.read_flat_variants()?
-        } else {
-            self.read_variants()?
-        };
-
-        Ok(EnumMetadata {
-            module_path,
-            name,
-            forced_flatness,
-            discr_type,
-            variants,
-            non_exhaustive: self.read_bool()?,
-            docstring: self.read_optional_long_string()?,
-        })
-    }
-
-    fn read_object(&mut self, imp: ObjectImpl) -> Result<ObjectMetadata> {
-        Ok(ObjectMetadata {
-            module_path: self.read_string()?,
-            name: self.read_string()?,
-            imp,
-            docstring: self.read_optional_long_string()?,
-        })
-    }
-
-    fn read_uniffi_trait(&mut self) -> Result<UniffiTraitMetadata> {
-        let code = self.read_u8()?;
-        let mut read_metadata_method = || -> Result<MethodMetadata> {
-            let code = self.read_u8()?;
-            ensure!(code == codes::METHOD, "expected METHOD but read {code}");
-            self.read_method()
-        };
-
-        Ok(match UniffiTraitDiscriminants::from(code)? {
-            UniffiTraitDiscriminants::Debug => UniffiTraitMetadata::Debug {
-                fmt: read_metadata_method()?,
-            },
-            UniffiTraitDiscriminants::Display => UniffiTraitMetadata::Display {
-                fmt: read_metadata_method()?,
-            },
-            UniffiTraitDiscriminants::Eq => UniffiTraitMetadata::Eq {
-                eq: read_metadata_method()?,
-                ne: read_metadata_method()?,
-            },
-            UniffiTraitDiscriminants::Hash => UniffiTraitMetadata::Hash {
-                hash: read_metadata_method()?,
-            },
-        })
-    }
-
-    fn read_callback_interface(&mut self) -> Result<CallbackInterfaceMetadata> {
-        Ok(CallbackInterfaceMetadata {
-            module_path: self.read_string()?,
-            name: self.read_string()?,
-            docstring: self.read_optional_long_string()?,
-        })
-    }
-
-    fn read_trait_method(&mut self) -> Result<TraitMethodMetadata> {
-        let module_path = self.read_string()?;
-        let trait_name = self.read_string()?;
-        let index = self.read_u32()?;
-        let name = self.read_string()?;
-        let is_async = self.read_bool()?;
-        let inputs = self.read_inputs()?;
-        let (return_type, throws) = self.read_return_type()?;
-        let docstring = self.read_optional_long_string()?;
-        Ok(TraitMethodMetadata {
-            module_path,
-            trait_name,
-            index,
-            name,
-            is_async,
-            inputs,
-            return_type,
-            throws,
-            takes_self_by_arc: false, // not emitted by macros
-            checksum: self.calc_checksum(),
-            docstring,
-        })
-    }
-
-    fn read_fields(&mut self) -> Result<Vec<FieldMetadata>> {
-        let len = self.read_u8()?;
-        (0..len)
-            .map(|_| {
-                let name = self.read_string()?;
-                let ty = self.read_type()?;
-                let default = self.read_optional_default(&name, &ty)?;
-                Ok(FieldMetadata {
-                    name,
-                    ty,
-                    default,
-                    docstring: self.read_optional_long_string()?,
-                })
-            })
-            .collect()
-    }
-
-    fn read_variants(&mut self) -> Result<Vec<VariantMetadata>> {
-        let len = self.read_u8()?;
-        (0..len)
-            .map(|_| {
-                Ok(VariantMetadata {
-                    name: self.read_string()?,
-                    discr: self.read_optional_default("<variant-value>", &Type::UInt64)?,
-                    fields: self.read_fields()?,
-                    docstring: self.read_optional_long_string()?,
-                })
-            })
-            .collect()
-    }
-
-    fn read_flat_variants(&mut self) -> Result<Vec<VariantMetadata>> {
-        let len = self.read_u8()?;
-        (0..len)
-            .map(|_| {
-                Ok(VariantMetadata {
-                    name: self.read_string()?,
-                    discr: None,
-                    fields: vec![],
-                    docstring: self.read_optional_long_string()?,
-                })
-            })
-            .collect()
-    }
-
-    fn read_inputs(&mut self) -> Result<Vec<FnParamMetadata>> {
-        let len = self.read_u8()?;
-        (0..len)
-            .map(|_| {
-                let name = self.read_string()?;
-                let ty = self.read_type()?;
-                let default = self.read_optional_default(&name, &ty)?;
-                Ok(FnParamMetadata {
-                    name,
-                    ty,
-                    default,
-                    // not emitted by macros
-                    by_ref: false,
-                    optional: false,
-                })
-            })
-            .collect()
-    }
-
-    fn calc_checksum(&self) -> Option<u16> {
-        let bytes_read = self.initial_data.len() - self.buf.len();
-        let metadata_buf = &self.initial_data[..bytes_read];
-        Some(checksum_metadata(metadata_buf))
-    }
-
-    fn read_optional_default(&mut self, name: &str, ty: &Type) -> Result<Option<LiteralMetadata>> {
-        if self.read_bool()? {
-            Ok(Some(self.read_default(name, ty)?))
-        } else {
-            Ok(None)
-        }
-    }
-
-    fn read_default(&mut self, name: &str, ty: &Type) -> Result<LiteralMetadata> {
-        let literal_kind = self.read_u8()?;
-
-        Ok(match literal_kind {
-            codes::LIT_STR => {
-                ensure!(
-                    matches!(ty, Type::String),
-                    "field {name} of type {ty:?} can't have a default value of type string"
-                );
-                LiteralMetadata::String(self.read_string()?)
-            }
-            codes::LIT_INT => {
-                let base10_digits = self.read_string()?;
-                // procmacros emit the type for discriminant values based purely on whether the constant
-                // is positive or negative.
-                let ty = if !base10_digits.is_empty()
-                    && base10_digits.as_bytes()[0] == b'-'
-                    && ty == &Type::UInt64
-                {
-                    &Type::Int64
-                } else {
-                    ty
-                };
-                macro_rules! parse_int {
-                    ($ty:ident, $variant:ident) => {
-                        LiteralMetadata::$variant(
-                            base10_digits
-                                .parse::<$ty>()
-                                .with_context(|| {
-                                    format!("parsing default for field {name}: {base10_digits}")
-                                })?
-                                .into(),
-                            Radix::Decimal,
-                            ty.to_owned(),
-                        )
-                    };
-                }
-
-                match ty {
-                    Type::UInt8 => parse_int!(u8, UInt),
-                    Type::Int8 => parse_int!(i8, Int),
-                    Type::UInt16 => parse_int!(u16, UInt),
-                    Type::Int16 => parse_int!(i16, Int),
-                    Type::UInt32 => parse_int!(u32, UInt),
-                    Type::Int32 => parse_int!(i32, Int),
-                    Type::UInt64 => parse_int!(u64, UInt),
-                    Type::Int64 => parse_int!(i64, Int),
-                    _ => {
-                        bail!("field {name} of type {ty:?} can't have a default value of type integer");
-                    }
-                }
-            }
-            codes::LIT_FLOAT => match ty {
-                Type::Float32 | Type::Float64 => {
-                    LiteralMetadata::Float(self.read_string()?, ty.to_owned())
-                }
-                _ => {
-                    bail!("field {name} of type {ty:?} can't have a default value of type float");
-                }
-            },
-            codes::LIT_BOOL => LiteralMetadata::Boolean(self.read_bool()?),
-            codes::LIT_NONE => match ty {
-                Type::Optional { .. } => LiteralMetadata::None,
-                _ => bail!("field {name} of type {ty:?} can't have a default value of None"),
-            },
-            codes::LIT_SOME => match ty {
-                Type::Optional { inner_type, .. } => LiteralMetadata::Some {
-                    inner: Box::new(self.read_default(name, inner_type)?),
-                },
-                _ => bail!("field {name} of type {ty:?} can't have a default value of None"),
-            },
-            codes::LIT_EMPTY_SEQ => LiteralMetadata::EmptySequence,
-            _ => bail!("Unexpected literal kind code: {literal_kind:?}"),
-        })
-    }
-}
diff --git a/crates/uniffi_meta/src/types.rs b/crates/uniffi_meta/src/types.rs
deleted file mode 100644
index 51bf156..0000000
--- a/crates/uniffi_meta/src/types.rs
+++ /dev/null
@@ -1,174 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-//! # Basic typesystem for defining a component interface.
-//!
-//! This module provides the "API-level" typesystem of a UniFFI Rust Component, that is,
-//! the types provided by the Rust implementation and consumed callers of the foreign language
-//! bindings. Think "objects" and "enums" and "records".
-//!
-//! The [`Type`] enum represents high-level types that would appear in the public API of
-//! a component, such as enums and records as well as primitives like ints and strings.
-//! The Rust code that implements a component, and the foreign language bindings that consume it,
-//! will both typically deal with such types as their core concern.
-//!
-//! As a developer working on UniFFI itself, you're likely to spend a fair bit of time thinking
-//! about how these API-level types map into the lower-level types of the FFI layer as represented
-//! by the [`ffi::FfiType`](super::ffi::FfiType) enum, but that's a detail that is invisible to end users.
-
-use crate::Checksum;
-
-#[derive(Debug, Copy, Clone, Eq, PartialEq, Checksum, Ord, PartialOrd)]
-pub enum ObjectImpl {
-    // A single Rust type
-    Struct,
-    // A trait that's can be implemented by Rust types
-    Trait,
-    // A trait + a callback interface -- can be implemented by both Rust and foreign types.
-    CallbackTrait,
-}
-
-impl ObjectImpl {
-    /// Return the fully qualified name which should be used by Rust code for
-    /// an object with the given name.
-    /// Includes `r#`, traits get a leading `dyn`. If we ever supported associated types, then
-    /// this would also include them.
-    pub fn rust_name_for(&self, name: &str) -> String {
-        if self.is_trait_interface() {
-            format!("dyn r#{name}")
-        } else {
-            format!("r#{name}")
-        }
-    }
-
-    pub fn is_trait_interface(&self) -> bool {
-        matches!(self, Self::Trait | Self::CallbackTrait)
-    }
-
-    pub fn has_callback_interface(&self) -> bool {
-        matches!(self, Self::CallbackTrait)
-    }
-}
-
-#[derive(Debug, Clone, Copy, Eq, PartialEq, Checksum, Ord, PartialOrd)]
-pub enum ExternalKind {
-    Interface,
-    Trait,
-    // Either a record or enum
-    DataClass,
-}
-
-/// Represents all the different high-level types that can be used in a component interface.
-/// At this level we identify user-defined types by name, without knowing any details
-/// of their internal structure apart from what type of thing they are (record, enum, etc).
-#[derive(Debug, Clone, Eq, PartialEq, Checksum, Ord, PartialOrd)]
-pub enum Type {
-    // Primitive types.
-    UInt8,
-    Int8,
-    UInt16,
-    Int16,
-    UInt32,
-    Int32,
-    UInt64,
-    Int64,
-    Float32,
-    Float64,
-    Boolean,
-    String,
-    Bytes,
-    Timestamp,
-    Duration,
-    Object {
-        // The module path to the object
-        module_path: String,
-        // The name in the "type universe"
-        name: String,
-        // How the object is implemented.
-        imp: ObjectImpl,
-    },
-    // Types defined in the component API, each of which has a string name.
-    Record {
-        module_path: String,
-        name: String,
-    },
-    Enum {
-        module_path: String,
-        name: String,
-    },
-    CallbackInterface {
-        module_path: String,
-        name: String,
-    },
-    // Structurally recursive types.
-    Optional {
-        inner_type: Box<Type>,
-    },
-    Sequence {
-        inner_type: Box<Type>,
-    },
-    Map {
-        key_type: Box<Type>,
-        value_type: Box<Type>,
-    },
-    // An FfiConverter we `use` from an external crate
-    External {
-        module_path: String,
-        name: String,
-        #[checksum_ignore] // The namespace is not known generating scaffolding.
-        namespace: String,
-        kind: ExternalKind,
-        tagged: bool, // does its FfiConverter use <UniFFITag>?
-    },
-    // Custom type on the scaffolding side
-    Custom {
-        module_path: String,
-        name: String,
-        builtin: Box<Type>,
-    },
-}
-
-impl Type {
-    pub fn iter_types(&self) -> TypeIterator<'_> {
-        let nested_types = match self {
-            Type::Optional { inner_type } | Type::Sequence { inner_type } => {
-                inner_type.iter_types()
-            }
-            Type::Map {
-                key_type,
-                value_type,
-            } => Box::new(key_type.iter_types().chain(value_type.iter_types())),
-            _ => Box::new(std::iter::empty()),
-        };
-        Box::new(std::iter::once(self).chain(nested_types))
-    }
-}
-
-// A trait so various things can turn into a type.
-pub trait AsType: core::fmt::Debug {
-    fn as_type(&self) -> Type;
-}
-
-impl AsType for Type {
-    fn as_type(&self) -> Type {
-        self.clone()
-    }
-}
-
-// Needed to handle &&Type and &&&Type values, which we sometimes end up with in the template code
-impl<T, C> AsType for T
-where
-    T: std::ops::Deref<Target = C> + std::fmt::Debug,
-    C: AsType,
-{
-    fn as_type(&self) -> Type {
-        self.deref().as_type()
-    }
-}
-
-/// An abstract type for an iterator over &Type references.
-///
-/// Ideally we would not need to name this type explicitly, and could just
-/// use an `impl Iterator<Item = &Type>` on any method that yields types.
-pub type TypeIterator<'a> = Box<dyn Iterator<Item = &'a Type> + 'a>;
diff --git a/crates/uniffi_checksum_derive/MODULE_LICENSE_MPL b/extra_versions/pseudo_crate/deleted-crates.txt
similarity index 100%
rename from crates/uniffi_checksum_derive/MODULE_LICENSE_MPL
rename to extra_versions/pseudo_crate/deleted-crates.txt
diff --git a/pseudo_crate/Cargo.lock b/pseudo_crate/Cargo.lock
index 2ab4697..45cde80 100644
--- a/pseudo_crate/Cargo.lock
+++ b/pseudo_crate/Cargo.lock
@@ -303,7 +303,6 @@
  "num_enum_derive",
  "octets 0.3.0",
  "once_cell",
- "oneshot-uniffi",
  "oorandom",
  "open-enum",
  "open-enum-derive",
@@ -385,7 +384,7 @@
  "shared_child",
  "shared_library",
  "shlex",
- "siphasher 1.0.1",
+ "siphasher",
  "slab",
  "smallvec",
  "smccc",
@@ -446,11 +445,6 @@
  "unicode-segmentation",
  "unicode-width 0.2.0",
  "unicode-xid 0.2.6",
- "uniffi",
- "uniffi_checksum_derive 0.28.3",
- "uniffi_core",
- "uniffi_macros",
- "uniffi_meta",
  "unsafe-libyaml",
  "untrusted 0.7.1",
  "url",
@@ -3560,12 +3554,6 @@
 ]
 
 [[package]]
-name = "oneshot-uniffi"
-version = "0.1.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6c548d5c78976f6955d72d0ced18c48ca07030f7a1d4024529fedd7c1c01b29c"
-
-[[package]]
 name = "oorandom"
 version = "11.1.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3828,9 +3816,9 @@
 
 [[package]]
 name = "pest_derive"
-version = "2.7.6"
+version = "2.7.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bcd6ab1236bbdb3a49027e920e693192ebfe8913f6d60e294de57463a493cfde"
+checksum = "816518421cfc6887a0d62bf441b6ffb4536fcc926395a69e1a85852d4363f57e"
 dependencies = [
  "pest",
  "pest_generator",
@@ -4808,12 +4796,6 @@
 
 [[package]]
 name = "siphasher"
-version = "0.3.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d"
-
-[[package]]
-name = "siphasher"
 version = "1.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d"
@@ -5650,83 +5632,6 @@
 checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
 
 [[package]]
-name = "uniffi"
-version = "0.27.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a5566fae48a5cb017005bf9cd622af5236b2a203a13fb548afde3506d3c68277"
-dependencies = [
- "anyhow",
- "uniffi_core",
- "uniffi_macros",
-]
-
-[[package]]
-name = "uniffi_checksum_derive"
-version = "0.27.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d5c400339a9d1d17be34257d0b407e91d64af335e5b4fa49f4bf28467fc8d635"
-dependencies = [
- "quote 1.0.38",
- "syn 2.0.96",
-]
-
-[[package]]
-name = "uniffi_checksum_derive"
-version = "0.28.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "802d2051a700e3ec894c79f80d2705b69d85844dafbbe5d1a92776f8f48b563a"
-dependencies = [
- "quote 1.0.38",
- "syn 2.0.96",
-]
-
-[[package]]
-name = "uniffi_core"
-version = "0.27.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0ea3eb5474d50fc149b7e4d86b9c5bd4a61dcc167f0683902bf18ae7bbb3deef"
-dependencies = [
- "anyhow",
- "bytes",
- "camino",
- "log",
- "once_cell",
- "oneshot-uniffi",
- "paste",
- "static_assertions",
-]
-
-[[package]]
-name = "uniffi_macros"
-version = "0.27.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "18331d35003f46f0d04047fbe4227291815b83a937a8c32bc057f990962182c4"
-dependencies = [
- "bincode",
- "camino",
- "fs-err",
- "once_cell",
- "proc-macro2 1.0.93",
- "quote 1.0.38",
- "serde",
- "syn 2.0.96",
- "toml 0.5.11",
- "uniffi_meta",
-]
-
-[[package]]
-name = "uniffi_meta"
-version = "0.27.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f7224422c4cfd181c7ca9fca2154abca4d21db962f926f270f996edd38b0c4b8"
-dependencies = [
- "anyhow",
- "bytes",
- "siphasher 0.3.11",
- "uniffi_checksum_derive 0.27.3",
-]
-
-[[package]]
 name = "uninit"
 version = "0.5.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
diff --git a/pseudo_crate/Cargo.toml b/pseudo_crate/Cargo.toml
index 2470391..f858156 100644
--- a/pseudo_crate/Cargo.toml
+++ b/pseudo_crate/Cargo.toml
@@ -218,7 +218,6 @@
 num_enum_derive = "=0.7.3"
 octets = "=0.3.0"
 once_cell = "=1.20.2"
-oneshot-uniffi = "=0.1.6"
 oorandom = "=11.1.4"
 open-enum = "=0.5.2"
 open-enum-derive = "=0.5.2"
@@ -235,7 +234,7 @@
 percent-encoding = "=2.3.1"
 percore = "=0.1.0"
 pest = "=2.7.15"
-pest_derive = "=2.7.6"
+pest_derive = "=2.7.15"
 pest_generator = "=2.7.15"
 pest_meta = "=2.7.15"
 petgraph = "=0.6.5"
@@ -361,11 +360,6 @@
 unicode-segmentation = "=1.12.0"
 unicode-width = "=0.2.0"
 unicode-xid = "=0.2.6"
-uniffi = "=0.27.1"
-uniffi_checksum_derive = "=0.28.3"
-uniffi_core = "=0.27.1"
-uniffi_macros = "=0.27.1"
-uniffi_meta = "=0.27.1"
 unsafe-libyaml = "=0.2.11"
 untrusted = "=0.7.1"
 url = "=2.5.2"
diff --git a/pseudo_crate/deleted-crates.txt b/pseudo_crate/deleted-crates.txt
new file mode 100644
index 0000000..d49145d
--- /dev/null
+++ b/pseudo_crate/deleted-crates.txt
@@ -0,0 +1,6 @@
+oneshot-uniffi
+uniffi
+uniffi_checksum_derive
+uniffi_core
+uniffi_macros
+uniffi_meta