From 76c8e99b4c03bc068964e69d2b2c90207a7af0b1 Mon Sep 17 00:00:00 2001 From: Conner Swann <2635475+yourbuddyconner@users.noreply.github.com> Date: Fri, 25 Oct 2024 23:25:16 -0700 Subject: [PATCH 01/11] restructuring --- Cargo.lock | 771 ++++---------------------------- Cargo.toml | 9 +- crates/zkdb-core/Cargo.toml | 12 + crates/zkdb-core/src/lib.rs | 33 ++ crates/zkdb-lib/Cargo.toml | 17 + crates/zkdb-lib/src/bin/cli.rs | 102 +++++ crates/zkdb-lib/src/lib.rs | 164 +++++++ crates/zkdb-merkle/Cargo.toml | 3 +- crates/zkdb-merkle/src/main.rs | 181 ++++---- docs/design/structure.md | 53 +++ elf/riscv32im-succinct-zkvm-elf | Bin 370092 -> 308932 bytes 11 files changed, 555 insertions(+), 790 deletions(-) create mode 100644 crates/zkdb-core/Cargo.toml create mode 100644 crates/zkdb-core/src/lib.rs create mode 100644 crates/zkdb-lib/Cargo.toml create mode 100644 crates/zkdb-lib/src/bin/cli.rs create mode 100644 crates/zkdb-lib/src/lib.rs create mode 100644 docs/design/structure.md diff --git a/Cargo.lock b/Cargo.lock index 9110186..18b73dd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -49,17 +49,6 @@ dependencies = [ "cpufeatures", ] -[[package]] -name = "ahash" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" -dependencies = [ - "getrandom", - "once_cell", - "version_check", -] - [[package]] name = "ahash" version = "0.8.11" @@ -67,8 +56,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", - "const-random", - "getrandom", "once_cell", "version_check", "zerocopy", @@ -143,7 +130,7 @@ checksum = "867a5469d61480fea08c7333ffeca52d5b621f5ca2e44f271b117ec1fc9a0525" dependencies = [ "alloy-sol-macro-input", "const-hex", - "heck 0.5.0", + "heck", "indexmap 2.6.0", "proc-macro-error", "proc-macro2", @@ -161,7 +148,7 @@ checksum = "2e482dc33a32b6fadbc0f599adea520bd3aaa585c141a80b404d0a3e3fa72528" dependencies = [ "const-hex", "dunce", - "heck 0.5.0", + "heck", "proc-macro2", "quote", "syn 2.0.82", @@ -395,167 +382,6 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" -[[package]] -name = "arrow" -version = "53.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9ba0d7248932f4e2a12fb37f0a2e3ec82b3bdedbac2a1dce186e036843b8f8c" -dependencies = [ - "arrow-arith", - "arrow-array", - "arrow-buffer", - "arrow-cast", - "arrow-data", - "arrow-ord", - "arrow-row", - "arrow-schema", - "arrow-select", - "arrow-string", -] - -[[package]] -name = "arrow-arith" -version = "53.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d60afcdc004841a5c8d8da4f4fa22d64eb19c0c01ef4bcedd77f175a7cf6e38f" -dependencies = [ - "arrow-array", - "arrow-buffer", - "arrow-data", - "arrow-schema", - "chrono", - "half", - "num", -] - -[[package]] -name = "arrow-array" -version = "53.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f16835e8599dbbb1659fd869d865254c4cf32c6c2bb60b6942ac9fc36bfa5da" -dependencies = [ - "ahash 0.8.11", - "arrow-buffer", - "arrow-data", - "arrow-schema", - "chrono", - "half", - "hashbrown 0.14.5", - "num", -] - -[[package]] -name = "arrow-buffer" -version = "53.2.0" -source = "git+https://github.com/yourbuddyconner/arrow-rs?branch=master#623773fe51401c67975f276ac03afa3199af2b3b" -dependencies = [ - "bytes", - "half", - "num", -] - -[[package]] -name = "arrow-cast" -version = "53.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "450e4abb5775bca0740bec0bcf1b1a5ae07eff43bd625661c4436d8e8e4540c4" -dependencies = [ - "arrow-array", - "arrow-buffer", - "arrow-data", - "arrow-schema", - "arrow-select", - "atoi", - "base64 0.22.1", - "chrono", - "comfy-table", - "half", - "lexical-core", - "num", - "ryu", -] - -[[package]] -name = "arrow-data" -version = "53.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b1e618bbf714c7a9e8d97203c806734f012ff71ae3adc8ad1b075689f540634" -dependencies = [ - "arrow-buffer", - "arrow-schema", - "half", - "num", -] - -[[package]] -name = "arrow-ord" -version = "53.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2427f37b4459a4b9e533045abe87a5183a5e0995a3fc2c2fd45027ae2cc4ef3f" -dependencies = [ - "arrow-array", - "arrow-buffer", - "arrow-data", - "arrow-schema", - "arrow-select", - "half", - "num", -] - -[[package]] -name = "arrow-row" -version = "53.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15959657d92e2261a7a323517640af87f5afd9fd8a6492e424ebee2203c567f6" -dependencies = [ - "ahash 0.8.11", - "arrow-array", - "arrow-buffer", - "arrow-data", - "arrow-schema", - "half", -] - -[[package]] -name = "arrow-schema" -version = "53.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbf0388a18fd7f7f3fe3de01852d30f54ed5182f9004db700fbe3ba843ed2794" -dependencies = [ - "bitflags 2.6.0", -] - -[[package]] -name = "arrow-select" -version = "53.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b83e5723d307a38bf00ecd2972cd078d1339c7fd3eb044f609958a9a24463f3a" -dependencies = [ - "ahash 0.8.11", - "arrow-array", - "arrow-buffer", - "arrow-data", - "arrow-schema", - "num", -] - -[[package]] -name = "arrow-string" -version = "53.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ab3db7c09dd826e74079661d84ed01ed06547cf75d52c2818ef776d0d852305" -dependencies = [ - "arrow-array", - "arrow-buffer", - "arrow-data", - "arrow-schema", - "arrow-select", - "memchr", - "num", - "regex", - "regex-syntax 0.8.5", -] - [[package]] name = "async-trait" version = "0.1.83" @@ -578,21 +404,23 @@ dependencies = [ "rustc_version 0.4.1", ] -[[package]] -name = "atoi" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" -dependencies = [ - "num-traits", -] - [[package]] name = "atomic-waker" version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" +[[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 = "auto_impl" version = "1.2.0" @@ -844,30 +672,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "borsh" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6362ed55def622cddc70a4746a68554d7b687713770de539e59a739b249f8ed" -dependencies = [ - "borsh-derive", - "cfg_aliases", -] - -[[package]] -name = "borsh-derive" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3ef8005764f53cd4dca619f5bf64cafd4664dada50ece25e4d81de54c80cc0b" -dependencies = [ - "once_cell", - "proc-macro-crate 3.2.0", - "proc-macro2", - "quote", - "syn 2.0.82", - "syn_derive", -] - [[package]] name = "bs58" version = "0.5.1" @@ -890,28 +694,6 @@ version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" -[[package]] -name = "bytecheck" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" -dependencies = [ - "bytecheck_derive", - "ptr_meta", - "simdutf8", -] - -[[package]] -name = "bytecheck_derive" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "bytemuck" version = "1.19.0" @@ -965,12 +747,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "cast" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" - [[package]] name = "cc" version = "1.1.31" @@ -997,12 +773,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" -[[package]] -name = "cfg_aliases" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" - [[package]] name = "chrono" version = "0.4.38" @@ -1037,6 +807,21 @@ dependencies = [ "libloading", ] +[[package]] +name = "clap" +version = "2.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" +dependencies = [ + "ansi_term", + "atty", + "bitflags 1.3.2", + "strsim 0.8.0", + "textwrap", + "unicode-width", + "vec_map", +] + [[package]] name = "clap" version = "4.5.20" @@ -1056,7 +841,7 @@ dependencies = [ "anstream", "anstyle", "clap_lex", - "strsim", + "strsim 0.11.1", ] [[package]] @@ -1065,7 +850,7 @@ version = "4.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" dependencies = [ - "heck 0.5.0", + "heck", "proc-macro2", "quote", "syn 2.0.82", @@ -1141,17 +926,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" -[[package]] -name = "comfy-table" -version = "7.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b34115915337defe99b2aff5c2ce6771e5fbc4079f4b506301f5cf394c8452f7" -dependencies = [ - "strum 0.26.3", - "strum_macros 0.26.4", - "unicode-width", -] - [[package]] name = "console" version = "0.15.8" @@ -1184,26 +958,6 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" -[[package]] -name = "const-random" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" -dependencies = [ - "const-random-macro", -] - -[[package]] -name = "const-random-macro" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" -dependencies = [ - "getrandom", - "once_cell", - "tiny-keccak", -] - [[package]] name = "constant_time_eq" version = "0.3.1" @@ -1241,15 +995,6 @@ dependencies = [ "libc", ] -[[package]] -name = "crc32fast" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" -dependencies = [ - "cfg-if", -] - [[package]] name = "crossbeam-deque" version = "0.8.5" @@ -1379,7 +1124,7 @@ dependencies = [ "ident_case", "proc-macro2", "quote", - "strsim", + "strsim 0.11.1", "syn 2.0.82", ] @@ -1605,25 +1350,6 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" -[[package]] -name = "duckdb" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86844939330ba6ce345c4b5333d3be45c4f0c092779bf9617bba92efb8b841f5" -dependencies = [ - "arrow", - "cast", - "fallible-iterator", - "fallible-streaming-iterator", - "hashlink", - "libduckdb-sys", - "memchr", - "num-integer", - "rust_decimal", - "smallvec", - "strum 0.25.0", -] - [[package]] name = "dunce" version = "1.0.5" @@ -1782,7 +1508,7 @@ dependencies = [ "sha2", "sha3", "thiserror", - "uuid 0.8.2", + "uuid", ] [[package]] @@ -1938,7 +1664,7 @@ dependencies = [ "rlp", "serde", "serde_json", - "strum 0.26.3", + "strum", "syn 2.0.82", "tempfile", "thiserror", @@ -2037,18 +1763,6 @@ dependencies = [ "once_cell", ] -[[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 = "fastrand" version = "2.1.1" @@ -2112,18 +1826,6 @@ version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" -[[package]] -name = "filetime" -version = "0.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" -dependencies = [ - "cfg-if", - "libc", - "libredox", - "windows-sys 0.59.0", -] - [[package]] name = "fixed-hash" version = "0.8.0" @@ -2136,16 +1838,6 @@ dependencies = [ "static_assertions", ] -[[package]] -name = "flate2" -version = "1.0.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - [[package]] name = "fnv" version = "1.0.7" @@ -2176,16 +1868,6 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "fs2" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" -dependencies = [ - "libc", - "winapi", -] - [[package]] name = "funty" version = "2.0.0" @@ -2448,17 +2130,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "half" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" -dependencies = [ - "cfg-if", - "crunchy", - "num-traits", -] - [[package]] name = "halo2" version = "0.1.0-beta.2" @@ -2487,9 +2158,6 @@ name = "hashbrown" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" -dependencies = [ - "ahash 0.7.8", -] [[package]] name = "hashbrown" @@ -2497,7 +2165,7 @@ version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ - "ahash 0.8.11", + "ahash", "allocator-api2", "serde", ] @@ -2517,26 +2185,20 @@ dependencies = [ "fxhash", ] -[[package]] -name = "hashlink" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" -dependencies = [ - "hashbrown 0.14.5", -] - [[package]] name = "heck" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] -name = "heck" -version = "0.5.0" +name = "hermit-abi" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] [[package]] name = "hermit-abi" @@ -3032,91 +2694,12 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" -[[package]] -name = "lexical-core" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0431c65b318a590c1de6b8fd6e72798c92291d27762d94c9e6c37ed7a73d8458" -dependencies = [ - "lexical-parse-float", - "lexical-parse-integer", - "lexical-util", - "lexical-write-float", - "lexical-write-integer", -] - -[[package]] -name = "lexical-parse-float" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb17a4bdb9b418051aa59d41d65b1c9be5affab314a872e5ad7f06231fb3b4e0" -dependencies = [ - "lexical-parse-integer", - "lexical-util", - "static_assertions", -] - -[[package]] -name = "lexical-parse-integer" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5df98f4a4ab53bf8b175b363a34c7af608fe31f93cc1fb1bf07130622ca4ef61" -dependencies = [ - "lexical-util", - "static_assertions", -] - -[[package]] -name = "lexical-util" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85314db53332e5c192b6bca611fb10c114a80d1b831ddac0af1e9be1b9232ca0" -dependencies = [ - "static_assertions", -] - -[[package]] -name = "lexical-write-float" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e7c3ad4e37db81c1cbe7cf34610340adc09c322871972f74877a712abc6c809" -dependencies = [ - "lexical-util", - "lexical-write-integer", - "static_assertions", -] - -[[package]] -name = "lexical-write-integer" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb89e9f6958b83258afa3deed90b5de9ef68eef090ad5086c791cd2345610162" -dependencies = [ - "lexical-util", - "static_assertions", -] - [[package]] name = "libc" version = "0.2.161" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" -[[package]] -name = "libduckdb-sys" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac2de5219db852597558df5dcd617ffccd5cbd7b9f5402ccbf899aca6cb6047" -dependencies = [ - "autocfg", - "flate2", - "pkg-config", - "serde", - "serde_json", - "tar", - "vcpkg", -] - [[package]] name = "libgit2-sys" version = "0.17.0+1.8.1" @@ -3153,7 +2736,6 @@ checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ "bitflags 2.6.0", "libc", - "redox_syscall 0.5.7", ] [[package]] @@ -3883,17 +3465,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "parking_lot" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" -dependencies = [ - "instant", - "lock_api", - "parking_lot_core 0.8.6", -] - [[package]] name = "parking_lot" version = "0.12.3" @@ -3901,21 +3472,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", - "parking_lot_core 0.9.10", -] - -[[package]] -name = "parking_lot_core" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" -dependencies = [ - "cfg-if", - "instant", - "libc", - "redox_syscall 0.2.16", - "smallvec", - "winapi", + "parking_lot_core", ] [[package]] @@ -3926,7 +3483,7 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.7", + "redox_syscall", "smallvec", "windows-targets 0.52.6", ] @@ -4245,26 +3802,6 @@ dependencies = [ "cc", ] -[[package]] -name = "ptr_meta" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" -dependencies = [ - "ptr_meta_derive", -] - -[[package]] -name = "ptr_meta_derive" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "quick-error" version = "1.2.3" @@ -4402,15 +3939,6 @@ dependencies = [ "rayon", ] -[[package]] -name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags 1.3.2", -] - [[package]] name = "redox_syscall" version = "0.5.7" @@ -4475,15 +4003,6 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" -[[package]] -name = "rend" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" -dependencies = [ - "bytecheck", -] - [[package]] name = "reqwest" version = "0.11.27" @@ -4634,35 +4153,6 @@ dependencies = [ "digest 0.10.7", ] -[[package]] -name = "rkyv" -version = "0.7.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9008cd6385b9e161d8229e1f6549dd23c3d022f132a2ea37ac3a10ac4935779b" -dependencies = [ - "bitvec", - "bytecheck", - "bytes", - "hashbrown 0.12.3", - "ptr_meta", - "rend", - "rkyv_derive", - "seahash", - "tinyvec", - "uuid 1.11.0", -] - -[[package]] -name = "rkyv_derive" -version = "0.7.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "503d1d27590a2b0a3a4ca4c94755aa2875657196ecbf401a42eff41d7de532c0" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "rlp" version = "0.5.2" @@ -4735,22 +4225,6 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" -[[package]] -name = "rust_decimal" -version = "1.36.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b082d80e3e3cc52b2ed634388d436fe1f4de6af5786cc2de9ba9737527bdf555" -dependencies = [ - "arrayvec", - "borsh", - "bytes", - "num-traits", - "rand", - "rkyv", - "serde", - "serde_json", -] - [[package]] name = "rustc-demangle" version = "0.1.24" @@ -4954,12 +4428,6 @@ version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49c1eeaf4b6a87c7479688c6d52b9f1153cedd3c489300564f932b065c6eab95" -[[package]] -name = "seahash" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" - [[package]] name = "sec1" version = "0.7.3" @@ -5138,7 +4606,7 @@ dependencies = [ "futures", "log", "once_cell", - "parking_lot 0.12.3", + "parking_lot", "scc", "serial_test_derive", ] @@ -5219,12 +4687,6 @@ dependencies = [ "rand_core", ] -[[package]] -name = "simdutf8" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" - [[package]] name = "simple_asn1" version = "0.6.2" @@ -5252,22 +4714,6 @@ dependencies = [ "autocfg", ] -[[package]] -name = "sled" -version = "0.34.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f96b4737c2ce5987354855aed3797279def4ebf734436c6aa4552cf8e169935" -dependencies = [ - "crc32fast", - "crossbeam-epoch", - "crossbeam-utils", - "fs2", - "fxhash", - "libc", - "log", - "parking_lot 0.11.2", -] - [[package]] name = "smallvec" version = "1.13.2" @@ -5303,7 +4749,7 @@ dependencies = [ "anyhow", "cargo_metadata", "chrono", - "clap", + "clap 4.5.20", "dirs", ] @@ -5336,8 +4782,8 @@ dependencies = [ "sp1-derive", "sp1-primitives", "sp1-stark", - "strum 0.26.3", - "strum_macros 0.26.4", + "strum", + "strum_macros", "thiserror", "tiny-keccak", "tracing", @@ -5400,8 +4846,8 @@ dependencies = [ "sp1-primitives", "sp1-stark", "static_assertions", - "strum 0.26.3", - "strum_macros 0.26.4", + "strum", + "strum_macros", "tempfile", "thiserror", "tracing", @@ -5488,7 +4934,7 @@ checksum = "166e9f9fd29ecdfd4fd452d49052abdfbe735317f00016e94fde8410f90b4134" dependencies = [ "anyhow", "bincode", - "clap", + "clap 4.5.20", "dirs", "hex", "itertools 0.13.0", @@ -5760,8 +5206,8 @@ dependencies = [ "sp1-core-machine", "sp1-prover", "sp1-stark", - "strum 0.26.3", - "strum_macros 0.26.4", + "strum", + "strum_macros", "sysinfo", "tempfile", "thiserror", @@ -5864,18 +5310,15 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "strsim" -version = "0.11.1" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" [[package]] -name = "strum" -version = "0.25.0" +name = "strsim" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" -dependencies = [ - "strum_macros 0.25.3", -] +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "strum" @@ -5883,20 +5326,7 @@ version = "0.26.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" dependencies = [ - "strum_macros 0.26.4", -] - -[[package]] -name = "strum_macros" -version = "0.25.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" -dependencies = [ - "heck 0.4.1", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.82", + "strum_macros", ] [[package]] @@ -5905,7 +5335,7 @@ version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" dependencies = [ - "heck 0.5.0", + "heck", "proc-macro2", "quote", "rustversion", @@ -5961,18 +5391,6 @@ dependencies = [ "syn 2.0.82", ] -[[package]] -name = "syn_derive" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b" -dependencies = [ - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.82", -] - [[package]] name = "sync_wrapper" version = "0.1.2" @@ -6051,17 +5469,6 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" -[[package]] -name = "tar" -version = "0.4.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ff6c40d3aedb5e06b57c6f669ad17ab063dd1e63d977c6a88e7f4dfa4f04020" -dependencies = [ - "filetime", - "libc", - "xattr", -] - [[package]] name = "tempfile" version = "3.13.0" @@ -6086,6 +5493,15 @@ dependencies = [ "winapi", ] +[[package]] +name = "textwrap" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +dependencies = [ + "unicode-width", +] + [[package]] name = "thiserror" version = "1.0.65" @@ -6183,7 +5599,7 @@ dependencies = [ "bytes", "libc", "mio", - "parking_lot 0.12.3", + "parking_lot", "pin-project-lite", "signal-hook-registry", "socket2", @@ -6535,12 +5951,6 @@ dependencies = [ "serde", ] -[[package]] -name = "uuid" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" - [[package]] name = "valuable" version = "0.1.0" @@ -7020,17 +6430,6 @@ dependencies = [ "tap", ] -[[package]] -name = "xattr" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" -dependencies = [ - "libc", - "linux-raw-sys", - "rustix", -] - [[package]] name = "zerocopy" version = "0.7.35" @@ -7077,7 +6476,7 @@ name = "zkDB-script" version = "0.1.0" dependencies = [ "alloy-sol-types", - "clap", + "clap 4.5.20", "hex", "prettytable-rs", "serde", @@ -7088,34 +6487,38 @@ dependencies = [ ] [[package]] -name = "zkdb-duckdb" +name = "zkdb-core" version = "0.1.0" dependencies = [ - "duckdb", - "ruint", - "sp1-zkvm", + "serde", + "serde_json", ] [[package]] -name = "zkdb-merkle" +name = "zkdb-lib" version = "0.1.0" dependencies = [ - "base64 0.13.1", "bincode", - "hex", - "rs_merkle", + "clap 2.34.0", "serde", "serde_json", - "sp1-zkvm", + "sp1-sdk", + "thiserror", + "zkdb-core", ] [[package]] -name = "zkdb-sled" +name = "zkdb-merkle" version = "0.1.0" dependencies = [ - "ruint", - "sled", + "base64 0.13.1", + "bincode", + "hex", + "rs_merkle", + "serde", + "serde_json", "sp1-zkvm", + "zkdb-core", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 3faac11..8465e1e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,8 +1,8 @@ [workspace] members = [ - "crates/zkdb-sled", - "crates/zkdb-duckdb", "crates/zkdb-merkle", + "crates/zkdb-core", + "crates/zkdb-lib", "crates/script", ] resolver = "2" @@ -10,7 +10,4 @@ resolver = "2" [workspace.dependencies] alloy-sol-types = "0.7.7" rs_merkle = "1.4.2" -prettytable-rs = "0.10" - -[patch.crates-io] -arrow-buffer = { git = "https://github.com/yourbuddyconner/arrow-rs", branch = "master", package = "arrow-buffer" } \ No newline at end of file +prettytable-rs = "0.10" \ No newline at end of file diff --git a/crates/zkdb-core/Cargo.toml b/crates/zkdb-core/Cargo.toml new file mode 100644 index 0000000..ae7e175 --- /dev/null +++ b/crates/zkdb-core/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "zkdb-core" +version = "0.1.0" +edition = "2021" + +[features] +default = ["std"] +std = ["serde/std", "serde_json/std"] + +[dependencies] +serde = { version = "1.0", default-features = false, features = ["derive"] } +serde_json = { version = "1.0", default-features = false, features = ["alloc"] } diff --git a/crates/zkdb-core/src/lib.rs b/crates/zkdb-core/src/lib.rs new file mode 100644 index 0000000..413fead --- /dev/null +++ b/crates/zkdb-core/src/lib.rs @@ -0,0 +1,33 @@ +#![cfg_attr(not(feature = "std"), no_std)] + +extern crate alloc; + +use alloc::string::String; +use alloc::vec::Vec; +use serde::{Deserialize, Serialize}; + +pub trait DatabaseEngine { + fn execute_query( + &mut self, + state: &[u8], + command: &Command, + ) -> Result; +} + +#[derive(Serialize, Deserialize, Debug)] +pub enum Command { + Insert { key: String, value: String }, + Query { key: String }, + Prove { key: String }, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct QueryResult { + pub data: serde_json::Value, + pub new_state: Vec, +} + +#[derive(Debug, Serialize, Deserialize)] +pub enum DatabaseError { + QueryExecutionFailed(String), +} diff --git a/crates/zkdb-lib/Cargo.toml b/crates/zkdb-lib/Cargo.toml new file mode 100644 index 0000000..550d8d3 --- /dev/null +++ b/crates/zkdb-lib/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "zkdb-lib" +version = "0.1.0" +edition = "2021" + +[dependencies] +zkdb-core = { path = "../zkdb-core" } +sp1-sdk = { version = "2.0.0" } +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" +thiserror = "1.0" +bincode = "1.3" +clap = "2.33" + +[[bin]] +name = "cli" +path = "src/bin/cli.rs" diff --git a/crates/zkdb-lib/src/bin/cli.rs b/crates/zkdb-lib/src/bin/cli.rs new file mode 100644 index 0000000..3bc42fe --- /dev/null +++ b/crates/zkdb-lib/src/bin/cli.rs @@ -0,0 +1,102 @@ +use clap::{App, Arg, SubCommand}; +use std::fs; +use zkdb_core::{DatabaseError, QueryResult}; +use zkdb_lib::{Command, Database}; + +fn main() -> Result<(), Box> { + let matches = App::new("zkDB CLI") + .version("1.0") + .author("Your Name") + .about("Interact with zkDB") + .subcommand( + SubCommand::with_name("init") + .about("Initialize a new database") + .arg( + Arg::with_name("elf_path") + .required(true) + .help("Path to the ELF file"), + ), + ) + .subcommand( + SubCommand::with_name("query") + .about("Execute a query") + .arg( + Arg::with_name("command") + .required(true) + .help("Query command to execute"), + ) + .arg( + Arg::with_name("generate_proof") + .long("generate-proof") + .help("Generate a proof for the query"), + ), + ) + .subcommand( + SubCommand::with_name("verify").about("Verify a proof").arg( + Arg::with_name("proof_path") + .required(true) + .help("Path to the proof file"), + ), + ) + .get_matches(); + + match matches.subcommand() { + ("init", Some(init_matches)) => { + let elf_path = init_matches.value_of("elf_path").unwrap(); + let elf_data = fs::read(elf_path)?; + let initial_state = vec![]; // Empty initial state + let db = Database::new(Box::leak(elf_data.into_boxed_slice()), initial_state); + println!("Database initialized with ELF from {}", elf_path); + // Here you might want to save the database state to a file + } + ("query", Some(query_matches)) => { + let command_str = query_matches.value_of("command").unwrap(); + let generate_proof = query_matches.is_present("generate_proof"); + + // For this example, we'll assume the database is already initialized + // In a real application, you'd load the database state from a file + let elf_data = include_bytes!("../../../../elf/riscv32im-succinct-zkvm-elf"); + let mut db = Database::new(elf_data, vec![]); + + let command = parse_command(command_str)?; + match db.execute_query(command, generate_proof) { + Ok(result) => print_query_result(result), + Err(e) => eprintln!("Query execution failed: {}", e), + } + } + ("verify", Some(verify_matches)) => { + let proof_path = verify_matches.value_of("proof_path").unwrap(); + let proof_data = fs::read(proof_path)?; + let proven_output: zkdb_lib::ProvenOutput = bincode::deserialize(&proof_data)?; + + // Again, assuming the database is already initialized + let elf_data = include_bytes!("../../../../elf/riscv32im-succinct-zkvm-elf"); + let db = Database::new(elf_data, vec![]); + + match db.verify_proof(&proven_output) { + Ok(true) => println!("Proof verified successfully"), + Ok(false) => println!("Proof verification failed"), + Err(e) => eprintln!("Proof verification error: {}", e), + } + } + _ => { + println!("Invalid command. Use --help for usage information."); + } + } + + Ok(()) +} + +fn parse_command(command_str: &str) -> Result> { + // This is a placeholder. You'll need to implement proper parsing based on your Command enum + Ok(Command::Query(command_str.to_string())) +} + +fn print_query_result(result: QueryResult) { + println!("Query Result:"); + println!("New State: {:?}", result.new_state); + println!("Output: {:?}", result.data); + // if let Some(proof) = result.proof { + // println!("Proof generated: {:?}", proof); + // } +} diff --git a/crates/zkdb-lib/src/lib.rs b/crates/zkdb-lib/src/lib.rs new file mode 100644 index 0000000..bf4813f --- /dev/null +++ b/crates/zkdb-lib/src/lib.rs @@ -0,0 +1,164 @@ +use sp1_sdk::{ + HashableKey, ProverClient, SP1ProofWithPublicValues, SP1ProvingKey, SP1PublicValues, SP1Stdin, + SP1VerifyingKey, +}; +use thiserror::Error; + +// reexport zkdb_core +pub use zkdb_core::{Command, QueryResult}; + +pub struct Database { + elf: &'static [u8], + state: Vec, + executor: SP1Executor, +} + +impl Database { + pub fn new(elf: &'static [u8], initial_state: Vec) -> Self { + Database { + elf, + state: initial_state, + executor: SP1Executor::new(elf), + } + } + + pub fn get_elf(&self) -> &'static [u8] { + self.elf + } + + pub fn execute_query( + &mut self, + command: Command, + generate_proof: bool, + ) -> Result { + let result = self + .executor + .execute_query(&self.state, &command, generate_proof)?; + self.state.clone_from(&result.new_state); + Ok(result) + } + + pub fn verify_proof(&self, proof: &ProvenOutput) -> Result { + self.executor.verify_proof(proof) + } + + pub fn get_state(&self) -> &[u8] { + &self.state + } +} + +#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)] +pub struct ProvenOutput { + pub proof_data: SP1ProofWithPublicValues, + pub vk: Vec, +} + +#[derive(Error, Debug, serde::Serialize, serde::Deserialize)] +pub enum DatabaseError { + #[error("Query execution failed: {0}")] + QueryExecutionFailed(String), + #[error("Proof generation failed: {0}")] + ProofGenerationFailed(String), + #[error("Proof verification failed: {0}")] + ProofVerificationFailed(String), +} + +pub struct SP1Executor { + client: ProverClient, + elf: &'static [u8], + pk: SP1ProvingKey, + vk: SP1VerifyingKey, +} + +impl SP1Executor { + pub fn new(elf: &'static [u8]) -> Self { + let client = ProverClient::new(); + let (pk, vk) = client.setup(elf); + SP1Executor { + client, + elf, + pk, + vk, + } + } + + pub fn execute_query( + &self, + state: &[u8], + command: &Command, + generate_proof: bool, + ) -> Result { + let mut stdin = SP1Stdin::new(); + stdin.write(&state.to_vec()); + stdin.write( + &serde_json::to_vec(command) + .map_err(|e| DatabaseError::QueryExecutionFailed(e.to_string()))?, + ); + stdin.write(&[generate_proof as u8]); + + if generate_proof { + let proof = self + .client + .prove(&self.pk, stdin.clone()) + .run() + .map_err(|e| DatabaseError::ProofGenerationFailed(e.to_string()))?; + + let (output, _) = self + .client + .execute(self.elf, stdin.clone()) + .run() + .map_err(|e| DatabaseError::QueryExecutionFailed(e.to_string()))?; + + self.parse_output( + output, + Some(ProvenOutput { + proof_data: proof, + vk: self.vk.bytes32().as_bytes().to_vec(), + }), + ) + } else { + let (output, _) = self + .client + .execute(self.elf, stdin) + .run() + .map_err(|e| DatabaseError::QueryExecutionFailed(e.to_string()))?; + // No proof is generated, so we don't need to pass it to the parser. + self.parse_output(output, None) + } + } + + fn parse_output( + &self, + output: SP1PublicValues, + proof: Option, + ) -> Result { + let output_str = String::from_utf8(output.to_vec()) + .map_err(|e| DatabaseError::QueryExecutionFailed(e.to_string()))?; + let output_json: serde_json::Value = serde_json::from_str(&output_str) + .map_err(|e| DatabaseError::QueryExecutionFailed(e.to_string()))?; + + let data = output_json["result"].clone(); + + let new_state = output_json["state"] + .as_str() + .ok_or_else(|| { + DatabaseError::QueryExecutionFailed("Missing state in output".to_string()) + })? + .as_bytes() + .to_vec(); + + // If a proof is provided, verify it. + if let Some(proof) = proof { + self.verify_proof(&proof)?; + } + + Ok(QueryResult { data, new_state }) + } + + pub fn verify_proof(&self, proof: &ProvenOutput) -> Result { + self.client + .verify(&proof.proof_data, &self.vk) + .map(|_| true) + .map_err(|e| DatabaseError::ProofVerificationFailed(e.to_string())) + } +} diff --git a/crates/zkdb-merkle/Cargo.toml b/crates/zkdb-merkle/Cargo.toml index 92090f7..76945cb 100644 --- a/crates/zkdb-merkle/Cargo.toml +++ b/crates/zkdb-merkle/Cargo.toml @@ -10,4 +10,5 @@ serde = { version = "1.0", default-features = false, features = ["derive", "allo serde_json = { version = "1.0", default-features = false, features = ["alloc"] } base64 = { version = "0.13", default-features = false, features = ["alloc"] } hex = { version = "0.4", default-features = false, features = ["alloc"] } -bincode = { version = "1.3", default-features = false } \ No newline at end of file +bincode = { version = "1.3", default-features = false } +zkdb-core = { path = "../zkdb-core", default-features = false} diff --git a/crates/zkdb-merkle/src/main.rs b/crates/zkdb-merkle/src/main.rs index e4ee1e1..07ab341 100644 --- a/crates/zkdb-merkle/src/main.rs +++ b/crates/zkdb-merkle/src/main.rs @@ -4,12 +4,10 @@ //! State is managed by passing the Merkle tree in and out as serialized data. #![no_main] -#![no_std] +sp1_zkvm::entrypoint!(main); extern crate alloc; -sp1_zkvm::entrypoint!(main); - use crate::alloc::string::ToString; use alloc::collections::BTreeMap; use alloc::string::String; @@ -18,6 +16,7 @@ use rs_merkle::{algorithms::Sha256, Hasher, MerkleTree}; use serde::ser::{SerializeSeq, Serializer}; use serde::{Deserialize, Serialize}; use sp1_zkvm::io; +use zkdb_core::{Command, DatabaseEngine, DatabaseError, QueryResult}; /// Key-value pair type. type Key = String; @@ -41,83 +40,82 @@ impl MerkleState { } } -/// The main entry point for the SP1 program. +/// Custom wrapper for MerkleProof serialization +struct ProofWrapper(rs_merkle::MerkleProof); + +impl Serialize for ProofWrapper { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + let proof_hashes = self.0.proof_hashes(); + let mut seq = serializer.serialize_seq(Some(proof_hashes.len()))?; + for hash in proof_hashes { + seq.serialize_element(&hex::encode(hash))?; + } + seq.end() + } +} + +pub struct MerkleEngine; + +impl DatabaseEngine for MerkleEngine { + fn execute_query( + &mut self, + state: &[u8], + command: &Command, + ) -> Result { + main_internal(state, command) + } +} + pub fn main() { - // Read input data: command and state. - let command_input: String = io::read(); - - // Parse the input (expecting JSON format). - let input: serde_json::Value = - serde_json::from_str(&command_input).expect("Invalid JSON input"); - - // Extract command and parameters. - let command = input - .get("command") - .expect("Missing command") - .as_str() - .expect("Invalid command"); - let params = input.get("params").unwrap_or(&serde_json::Value::Null); - let state_data = input.get("state").and_then(|s| s.as_str()); - - // Deserialize state or create a new one. - let mut merkle_state = if let Some(state_str) = state_data { - let decoded = base64::decode(state_str).expect("Failed to decode state"); - serde_json::from_slice(&decoded).expect("Failed to deserialize state") - } else { - MerkleState::new() - }; + let state: Vec = io::read(); + let command: Command = io::read(); + + let result = main_internal(&state, &command).unwrap_or_else(|e| QueryResult { + data: serde_json::json!({"error": e}), + new_state: state, + }); + + let output = serde_json::to_vec(&result).expect("Failed to serialize output"); + sp1_zkvm::io::commit_slice(&output); +} + +fn main_internal(state: &[u8], command: &Command) -> Result { + let mut merkle_state: MerkleState = bincode::deserialize(state) + .map_err(|e| DatabaseError::QueryExecutionFailed(e.to_string()))?; - // Perform the requested command. - let result = match command { - "insert" => { - let key = params - .get("key") - .expect("Missing key") - .as_str() - .expect("Invalid key"); - let value = params - .get("value") - .expect("Missing value") - .as_str() - .expect("Invalid value"); - insert(&mut merkle_state, key.to_string(), value.to_string()) + let (result, new_state) = match command { + Command::Insert { key, value } => { + let insert_result = insert(&mut merkle_state, key.clone(), value.clone())?; + (insert_result, merkle_state) } - "query" => { - let key = params - .get("key") - .expect("Missing key") - .as_str() - .expect("Invalid key"); - query(&merkle_state, key) + Command::Query { key } => { + let query_result = query(&merkle_state, key)?; + (query_result, merkle_state) } - "prove" => { - let key = params - .get("key") - .expect("Missing key") - .as_str() - .expect("Invalid key"); - prove(&merkle_state, key) + Command::Prove { key } => { + let prove_result = prove(&merkle_state, key)?; + (prove_result, merkle_state) } - _ => Err("Unknown command".to_string()), }; - // Serialize updated state. - let serialized_state = serde_json::to_vec(&merkle_state).expect("Failed to serialize state"); - let encoded_state = base64::encode(serialized_state); + let new_state_bytes = bincode::serialize(&new_state) + .map_err(|e| DatabaseError::QueryExecutionFailed(e.to_string()))?; - // Prepare the output. - let output = serde_json::json!({ - "result": result.unwrap_or_else(|e| serde_json::json!({"error": e})), - "state": encoded_state, - }); - - // Write the result as public output. - let output_str = serde_json::to_string(&output).expect("Failed to serialize output"); - sp1_zkvm::io::commit_slice(output_str.as_bytes()); + Ok(QueryResult { + data: result, + new_state: new_state_bytes, + }) } /// Inserts a new key-value pair into the Merkle tree. -fn insert(state: &mut MerkleState, key: Key, value: Value) -> Result { +fn insert( + state: &mut MerkleState, + key: String, + value: String, +) -> Result { // Hash the value. let leaf = Sha256::hash(value.as_bytes()); // Insert into the tree. @@ -129,54 +127,39 @@ fn insert(state: &mut MerkleState, key: Key, value: Value) -> Result Result { +fn query(state: &MerkleState, key: &str) -> Result { if let Some(&index) = state.key_indices.get(key) { let value_hash = &state.leaves[index]; Ok(serde_json::json!({"value_hash": hex::encode(value_hash)})) } else { - Err("Key not found".to_string()) + Err(DatabaseError::QueryExecutionFailed( + "Key not found".to_string(), + )) } } -/// Generates a proof for a given key. -fn prove(state: &MerkleState, key: &str) -> Result { +/// Generates a Merkle Inclusion Proof for a given key. +fn prove(state: &MerkleState, key: &str) -> Result { if let Some(&index) = state.key_indices.get(key) { - // Create Merkle tree. let merkle_tree = MerkleTree::::from_leaves(&state.leaves); - // Generate proof. let proof = merkle_tree.proof(&[index]); - // Get the root. - let root = merkle_tree.root().ok_or("Tree is empty")?; + let root = merkle_tree + .root() + .ok_or_else(|| DatabaseError::QueryExecutionFailed("Tree is empty".to_string()))?; - // Custom serialization for MerkleProof - let proof_serialized = - serde_json::to_value(ProofWrapper(proof)).expect("Failed to serialize proof"); + let proof_serialized = serde_json::to_value(ProofWrapper(proof)) + .map_err(|e| DatabaseError::QueryExecutionFailed(e.to_string()))?; let proof_encoded = base64::encode(serde_json::to_string(&proof_serialized).unwrap()); Ok(serde_json::json!({ "root": hex::encode(root), "proof": proof_encoded, - "indices": [index], + "index": index, "leaf": hex::encode(state.leaves[index]), })) } else { - Err("Key not found".to_string()) - } -} - -// Custom wrapper for MerkleProof serialization -struct ProofWrapper(rs_merkle::MerkleProof); - -impl Serialize for ProofWrapper { - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - let proof_hashes = self.0.proof_hashes(); - let mut seq = serializer.serialize_seq(Some(proof_hashes.len()))?; - for hash in proof_hashes { - seq.serialize_element(&hex::encode(hash))?; - } - seq.end() + Err(DatabaseError::QueryExecutionFailed( + "Key not found".to_string(), + )) } } diff --git a/docs/design/structure.md b/docs/design/structure.md new file mode 100644 index 0000000..1add389 --- /dev/null +++ b/docs/design/structure.md @@ -0,0 +1,53 @@ +# zkDB Crate Structure + +The zkDB project will consist of several crates, each serving a specific purpose. The main crates are: + +## zkdb-core + +This crate will serve as the base for various database engines implemented as SP1 programs. It will provide common utilities, data structures, and interfaces that can be shared across different database engines. + +### zkdb-merkle + +This crate will implement a Merkle tree-based database engine as an SP1 program. It will provide functionality for inserting, querying, and generating proofs for key-value pairs stored in a Merkle tree. + +### zkdb-duckdb + +This crate will implement a database engine based on DuckDB, a lightweight and embeddable SQL database management system. It will provide functionality for executing SQL queries and generating proofs for the query results. + +### Other Database Engines + +Additional crates can be added to implement other database engines as SP1 programs, such as a time-series database, a graph database, or any other specialized database system. + +## zkdb-lib + +This crate will serve as the primary interface for interacting with the various database engines. It will provide a high-level API for creating, querying, and managing databases, as well as generating and verifying proofs. + +The `zkdb-lib` crate will act as a wrapper around the different `zkdb-core` crates, abstracting away the underlying implementation details and providing a consistent interface for working with different database engines. + +## zkdb-cli + +This crate will provide a command-line interface (CLI) for interacting with the zkDB system. It will allow users to create, manage, and query databases, as well as generate and verify proofs from the command line. + +The `zkdb-cli` crate will depend on the `zkdb-lib` crate to interact with the underlying database engines. + +## Additional Crates + +Depending on the project's requirements, additional crates may be added to provide supplementary functionality, such as: + +- `zkdb-types`: A crate for defining common data types and structures used across the zkDB project. +- `zkdb-utils`: A crate containing utility functions and helpers used throughout the project. +- `zkdb-tests`: A crate for housing integration and end-to-end tests for the zkDB system. + +## Dependencies + +The zkDB crates will depend on various external crates, including: + +- `sp1-sdk`: The SP1 Software Development Kit, which provides utilities for developing and proving SP1 programs. +- `serde`, `serde_json`: For serialization and deserialization of data structures. +- `clap`: For parsing command-line arguments in the `zkdb-cli` crate. +- `tracing`, `log`: For logging and debugging purposes. +- `duckdb`: The DuckDB crate, used in the `zkdb-duckdb` crate. +- Any other crates required by the specific database engines or utilities. + +This crate structure separates concerns and allows for modular development and testing of different database engines. The `zkdb-lib` crate acts as a unified interface, making it easier to work with and switch between different database engines without modifying the application code. + diff --git a/elf/riscv32im-succinct-zkvm-elf b/elf/riscv32im-succinct-zkvm-elf index 60bf292a6d3f7dedc8e909c335a216a82067d9d8..3f52cc360fcea884e9f29d04a38c2094b2dcab6b 100755 GIT binary patch delta 116202 zcmbq+d3+Vs+5b5+cjn$KB!LMDAWOm|frNl)K%j0D;YM(&(Ta5!z2H_YP?oCI-ibFi zETRTSIAX1avZz&SXo#_`%T3`TTC`Y&TI+&F)V{TCY(Wu${JzgQb90jz-{tfBBcHi* zmghXrbDrlp&-0vfCQtsMVEaD?H4e#|TUpE|F~+i61FP+;Pv1RLWAtaBh~+WH@z`C9 zvN@yW-`2YrqrX6p`sMFvZ26JV^tXE3WIf|uZOhl8py!=8**kFK!cm6JbZ5=ZDf31% z%Sg`j42M~!nR0 zV(!K3Lsooy$Qo7-WHOmh2;|xu=Vn;(K(-gp=uw^+;5qZl6-@VZZ^8Uo{#b^Wm|yB6 ztb3o$AK{m?mb?Xn`L|G><5RxRo3U`c-?_v4Y@tti;(f2^M?-x;?|ROUo{vh-8O3e% zY>1b5My)Q2B*)INz)jBpH=Br??unAirZLJhnwb>`Vf$pcP~0~Lsds0Y-!Dh?W5=ud zc%eVWFwbEA7_7#-_==x@lNOg|aj2pt(d^}4dB>bLLj7 z-|YL|^10(xdv}ia+}v~hHb8VR-2a{JO}fD!gay6jH?;OE6?sGrTMEiaDu#+ini1#nZ%D;%S>E0)74n^J@%s%| z{Sp`VD;08##C)&uyh`t}MFVWo@5Gv&R={AYJ?XfV4xc7>pZC_H$89ME%)=PGCH{og zV*Hj>H9QUp3HTD?toAl8zBMS@IV-%9CDrP8qTah{$+YiFEr=i2CbhsAi7_-GadFS? zgZBv%k8UlCQs!^=)>N_<<9X;D49nVbCSjf*syUDpxwmk`+deYi z%Uc?XdiB6=Qy7CT073?fT>FehQ)!Q0uT8-qmVrTv)}xGLs-?*O)yg1b+@QWW!1Qnd zi`AG+KeLR*&OC`(gX64f-X3NZ2DvAe@mS48OrKf9sy_Jy<&QFNZ3Aoh*yQ?|*P{K> zQ!sD?vzEuZQXN|Mf5KY!?_qY+c2E%D{-8+-Il>zD-(hbY&|K|WKEo3$4a@TmsV?$dnOOiH_u>^8*8#+j|Nz5$M>23(wR)( zc^!-G{ISHY>XVO|H6+Bn2bS}yPeVMmvyjDpAH*EiX;s&K%23X#KD`+2$Dn*llzGdR zF-vdg@*Y5^`|jjb9}nVH*P7gJIsgjhvdGBbAS>gmF1un2gkwFkC%i7_%QLFEm?Ia- z*&RbN4(O$v$4c9oj`_9AHZr>e^EVn?C+1OZKpifcaSp zsMq++#es-vhP=<7xi~t%^O1daNxNp3eSn!oYlhh-r8dKrl6S^JT{KJ7Li0PX>Xdax zxI!pdFM}BU-7XuLZbckIA#d5WsNdA3|KTFPevYa)WxeSwTZ;NMU9mr0>(?(( z^?@&jK*TZm?SV*kP_r5um>%7Q#zwr$Zi1HoViQS&;ThZzYVmto57!xyY$IDQZ8u;6 z3Ov&Kiq(1D3OROt9;Rua(hYa5jY+rJ{iNyn(DZz0dcI!H^JC@hmR?b3#VV>TeH^!9 zjDK86M{um?!w27}ℜc+A*RPM{fKh=OG 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

L~)X$ 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 From d41327a25b1fe5f6ab074cc14ecf9d82b6f71192 Mon Sep 17 00:00:00 2001 From: Conner Swann <2635475+yourbuddyconner@users.noreply.github.com> Date: Mon, 28 Oct 2024 09:22:51 -0700 Subject: [PATCH 02/11] a mess --- Cargo.lock | 827 ++++++-------------------- Cargo.toml | 15 +- crates/zkdb-core/Cargo.toml | 2 +- crates/zkdb-duckdb/Cargo.toml | 10 - crates/zkdb-duckdb/src/main.rs | 65 -- crates/zkdb-lib/Cargo.toml | 17 +- crates/zkdb-lib/src/lib.rs | 9 +- crates/zkdb-lib/tests/merkle_tests.rs | 89 +++ crates/zkdb-merkle/Cargo.toml | 18 +- crates/zkdb-merkle/src/lib.rs | 6 + crates/zkdb-sled/Cargo.toml | 9 - crates/zkdb-sled/src/main.rs | 53 -- docs/design/structure.md | 118 +++- elf/zkdb-merkle | Bin 0 -> 311512 bytes 14 files changed, 398 insertions(+), 840 deletions(-) delete mode 100644 crates/zkdb-duckdb/Cargo.toml delete mode 100644 crates/zkdb-duckdb/src/main.rs create mode 100644 crates/zkdb-lib/tests/merkle_tests.rs create mode 100644 crates/zkdb-merkle/src/lib.rs delete mode 100644 crates/zkdb-sled/Cargo.toml delete mode 100644 crates/zkdb-sled/src/main.rs create mode 100755 elf/zkdb-merkle diff --git a/Cargo.lock b/Cargo.lock index 18b73dd..67034af 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -131,7 +131,7 @@ dependencies = [ "alloy-sol-macro-input", "const-hex", "heck", - "indexmap 2.6.0", + "indexmap", "proc-macro-error", "proc-macro2", "quote", @@ -167,21 +167,6 @@ dependencies = [ "serde", ] -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - [[package]] name = "ansi_term" version = "0.12.1" @@ -410,17 +395,6 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" -[[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 = "auto_impl" version = "1.2.0" @@ -466,7 +440,7 @@ dependencies = [ "serde_urlencoded", "sync_wrapper 1.0.1", "tokio", - "tower 0.5.1", + "tower", "tower-layer", "tower-service", "tracing", @@ -556,16 +530,14 @@ dependencies = [ [[package]] name = "bindgen" -version = "0.69.5" +version = "0.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" +checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f" dependencies = [ "bitflags 2.6.0", "cexpr", "clang-sys", - "itertools 0.12.1", - "lazy_static", - "lazycell", + "itertools 0.10.5", "log", "prettyplease", "proc-macro2", @@ -574,7 +546,6 @@ dependencies = [ "rustc-hash 1.1.0", "shlex", "syn 2.0.82", - "which", ] [[package]] @@ -647,7 +618,6 @@ dependencies = [ "cc", "cfg-if", "constant_time_eq", - "rayon-core", ] [[package]] @@ -779,11 +749,7 @@ version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ - "android-tzdata", - "iana-time-zone", "num-traits", - "serde", - "windows-targets 0.52.6", ] [[package]] @@ -807,21 +773,6 @@ dependencies = [ "libloading", ] -[[package]] -name = "clap" -version = "2.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" -dependencies = [ - "ansi_term", - "atty", - "bitflags 1.3.2", - "strsim 0.8.0", - "textwrap", - "unicode-width", - "vec_map", -] - [[package]] name = "clap" version = "4.5.20" @@ -841,7 +792,7 @@ dependencies = [ "anstream", "anstyle", "clap_lex", - "strsim 0.11.1", + "strsim", ] [[package]] @@ -862,12 +813,6 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" -[[package]] -name = "cobs" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15" - [[package]] name = "coins-bip32" version = "0.8.7" @@ -932,7 +877,7 @@ version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" dependencies = [ - "encode_unicode 0.3.6", + "encode_unicode", "lazy_static", "libc", "unicode-width", @@ -1048,27 +993,6 @@ dependencies = [ "typenum", ] -[[package]] -name = "csv" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe" -dependencies = [ - "csv-core", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "csv-core" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70" -dependencies = [ - "memchr", -] - [[package]] name = "ctr" version = "0.9.2" @@ -1104,41 +1028,6 @@ dependencies = [ "syn 2.0.82", ] -[[package]] -name = "darling" -version = "0.20.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.20.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim 0.11.1", - "syn 2.0.82", -] - -[[package]] -name = "darling_macro" -version = "0.20.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" -dependencies = [ - "darling_core", - "quote", - "syn 2.0.82", -] - [[package]] name = "dashu" version = "0.4.2" @@ -1234,7 +1123,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" dependencies = [ "powerfmt", - "serde", ] [[package]] @@ -1311,16 +1199,6 @@ dependencies = [ "dirs-sys", ] -[[package]] -name = "dirs-next" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" -dependencies = [ - "cfg-if", - "dirs-sys-next", -] - [[package]] name = "dirs-sys" version = "0.4.1" @@ -1333,17 +1211,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "dirs-sys-next" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" -dependencies = [ - "libc", - "redox_users", - "winapi", -] - [[package]] name = "downcast-rs" version = "1.2.1" @@ -1401,30 +1268,12 @@ dependencies = [ "zeroize", ] -[[package]] -name = "embedded-io" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" - -[[package]] -name = "embedded-io" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" - [[package]] name = "encode_unicode" version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" -[[package]] -name = "encode_unicode" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" - [[package]] name = "encoding_rs" version = "0.8.34" @@ -1844,6 +1693,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f81ec6369c545a7d40e4589b5597581fa1c441fe1cce96dd1de43159910a36a2" + [[package]] name = "foreign-types" version = "0.3.2" @@ -2026,10 +1881,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", - "js-sys", "libc", "wasi", - "wasm-bindgen", ] [[package]] @@ -2104,7 +1957,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.6.0", + "indexmap", "slab", "tokio", "tokio-util", @@ -2123,7 +1976,7 @@ dependencies = [ "futures-core", "futures-sink", "http 1.1.0", - "indexmap 2.6.0", + "indexmap", "slab", "tokio", "tokio-util", @@ -2153,12 +2006,6 @@ dependencies = [ "rayon", ] -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - [[package]] name = "hashbrown" version = "0.14.5" @@ -2175,6 +2022,11 @@ name = "hashbrown" version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] [[package]] name = "hashers" @@ -2191,27 +2043,12 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" -[[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.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" -[[package]] -name = "hermit-abi" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" - [[package]] name = "hex" version = "0.4.3" @@ -2233,15 +2070,6 @@ dependencies = [ "digest 0.10.7", ] -[[package]] -name = "home" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" -dependencies = [ - "windows-sys 0.52.0", -] - [[package]] name = "http" version = "0.2.12" @@ -2373,6 +2201,19 @@ dependencies = [ "webpki-roots", ] +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper 0.14.31", + "native-tls", + "tokio", + "tokio-native-tls", +] + [[package]] name = "hyper-tls" version = "0.6.0" @@ -2408,35 +2249,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "iana-time-zone" -version = "0.1.61" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows-core", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - [[package]] name = "idna" version = "0.5.0" @@ -2491,17 +2303,6 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" -[[package]] -name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", - "serde", -] - [[package]] name = "indexmap" version = "2.6.0" @@ -2510,7 +2311,6 @@ checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", "hashbrown 0.15.0", - "serde", ] [[package]] @@ -2550,17 +2350,6 @@ version = "2.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" -[[package]] -name = "is-terminal" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b" -dependencies = [ - "hermit-abi 0.4.0", - "libc", - "windows-sys 0.52.0", -] - [[package]] name = "is_terminal_polyfill" version = "1.70.1" @@ -2688,12 +2477,6 @@ dependencies = [ "spin 0.9.8", ] -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - [[package]] name = "libc" version = "0.2.161" @@ -2772,6 +2555,15 @@ version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +[[package]] +name = "lru" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" +dependencies = [ + "hashbrown 0.15.0", +] + [[package]] name = "matchers" version = "0.1.0" @@ -2826,7 +2618,7 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ - "hermit-abi 0.3.9", + "hermit-abi", "libc", "wasi", "windows-sys 0.52.0", @@ -2996,7 +2788,7 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.3.9", + "hermit-abi", "libc", ] @@ -3072,12 +2864,6 @@ version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" -[[package]] -name = "oneshot" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e296cf87e61c9cfc1a61c3c63a0f7f286ed4554e0e22be84e8a38e1d264a2a29" - [[package]] name = "open-fastrlp" version = "0.1.4" @@ -3161,9 +2947,9 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "p3-air" -version = "0.1.3-succinct" +version = "0.1.4-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45e909ef66fa5d77ff0fd3cb5af4b33b27fa6fb68d02b9b1e70edbc29383e565" +checksum = "066f571b2e645505ed5972dd0e1e252ba03352150830c9566769ca711c0f1e9b" dependencies = [ "p3-field", "p3-matrix", @@ -3171,9 +2957,9 @@ dependencies = [ [[package]] name = "p3-baby-bear" -version = "0.1.3-succinct" +version = "0.1.4-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46965470aac1cddfe52f535424b59d52f2fffef0fdeb9dbed19da39b1d8f048a" +checksum = "ff00f571044d299310d9659c6e51c98422de3bf94b8577f7f30cf59cf2043e40" dependencies = [ "num-bigint 0.4.6", "p3-field", @@ -3186,9 +2972,9 @@ dependencies = [ [[package]] name = "p3-blake3" -version = "0.1.3-succinct" +version = "0.1.4-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36ef32d6ea21dd5cf9fec8a31bf0c64e6ceee8901dbf50966b83a443093c2aba" +checksum = "cc4cb69ae54a279bbbd477566d1bdb71aa879b528fd658d0fcfc36f54b00217c" dependencies = [ "blake3", "p3-symmetric", @@ -3196,9 +2982,9 @@ dependencies = [ [[package]] name = "p3-bn254-fr" -version = "0.1.3-succinct" +version = "0.1.4-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e3edfca6be3b3109adf8e3330baec30c3fc5f9f4d63d27aaec1b471ca51ed67" +checksum = "bf19917f986d45e9abb6d177e875824ced6eed096480d574fce16f2c45c721ea" dependencies = [ "ff 0.13.0", "num-bigint 0.4.6", @@ -3211,25 +2997,27 @@ dependencies = [ [[package]] name = "p3-challenger" -version = "0.1.3-succinct" +version = "0.1.4-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6662ea899a5d848b60c699944491d72757873b5e1fd46798e4712f90a03a4e9" +checksum = "3be7e4fbce4566a93091107eadfafa0b5374bd1ffd3e0f6b850da3ff72eb183f" dependencies = [ "p3-field", "p3-maybe-rayon", "p3-symmetric", "p3-util", + "serde", "tracing", ] [[package]] name = "p3-commit" -version = "0.1.3-succinct" +version = "0.1.4-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc3563918b5cc44ef5280bf9b51753e70dc78802de25e3fb81ed6c94617ccb6e" +checksum = "7a03eb0f99d68a712c41e658e9a7782a0705d4ffcfb6232a43bd3f1ef9591002" dependencies = [ "itertools 0.12.1", "p3-challenger", + "p3-dft", "p3-field", "p3-matrix", "p3-util", @@ -3238,9 +3026,9 @@ dependencies = [ [[package]] name = "p3-dft" -version = "0.1.3-succinct" +version = "0.1.4-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "510095701819d83c9509fe825bbf1ebfe50426ae75149df5fe1dcfd18261323a" +checksum = "1556de968523fbe5d804ab50600ea306fcceea3500cfd7601e40882480524664" dependencies = [ "p3-field", "p3-matrix", @@ -3251,9 +3039,9 @@ dependencies = [ [[package]] name = "p3-field" -version = "0.1.3-succinct" +version = "0.1.4-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61f1977a0a65789f719aa824119c332c4676b000bdbfe94d312fb6244a70d601" +checksum = "cec2af6e1ac47a2035af5165e668d64612c4b9ccabd06df37fc1fd381fdf8a71" dependencies = [ "itertools 0.12.1", "num-bigint 0.4.6", @@ -3265,9 +3053,9 @@ dependencies = [ [[package]] name = "p3-fri" -version = "0.1.3-succinct" +version = "0.1.4-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c22ddb958f200d9289cc73ff68847b0167ca0c14557b791dd9e318f98c2d1b28" +checksum = "f351ee9f9d4256455164565cd91e3e6d2487cc2a5355515fa2b6d479269188dd" dependencies = [ "itertools 0.12.1", "p3-challenger", @@ -3284,30 +3072,20 @@ dependencies = [ [[package]] name = "p3-interpolation" -version = "0.1.3-succinct" +version = "0.1.4-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d032cda212f6b408d7d5b0b9a8270a9455acb93742fe55a0880d82be8e90e500" +checksum = "d24d0f2907a374ebe4545fcff3120d6376d9630cf0bef30feedcfc5908ea2c37" dependencies = [ "p3-field", "p3-matrix", "p3-util", ] -[[package]] -name = "p3-keccak" -version = "0.1.3-succinct" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c56abdd5a8a780049d2f8e92cea1df57b55a2ef50a40d1103f2732f7a00e4b1" -dependencies = [ - "p3-symmetric", - "tiny-keccak", -] - [[package]] name = "p3-keccak-air" -version = "0.1.3-succinct" +version = "0.1.4-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8398f1694ccc38513df0b8cab5f9ef7325423f27cd9e4fa20bdc77d5079cf1b" +checksum = "e66badd47cedf6570e91a0cabc389b80dfd53ba1a6e9a45a3923fd54b86122ff" dependencies = [ "p3-air", "p3-field", @@ -3315,15 +3093,13 @@ dependencies = [ "p3-maybe-rayon", "p3-util", "tracing", - "tracing-forest", - "tracing-subscriber", ] [[package]] name = "p3-matrix" -version = "0.1.3-succinct" +version = "0.1.4-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d548ee0b834f8e2ebc5037073acd101a3b0ca41a2d1d28a15ba0ccd9059495b0" +checksum = "fa272f3ae77ed8d73478aa7c89e712efb15bda3ff4aff10fadfe11a012cd5389" dependencies = [ "itertools 0.12.1", "p3-field", @@ -3336,18 +3112,18 @@ dependencies = [ [[package]] name = "p3-maybe-rayon" -version = "0.1.3-succinct" +version = "0.1.4-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55f5575d3d61bedb3e05681abb0f36b8bb339d65aa395d50756bfa64e9cd3f46" +checksum = "3eecad6292021858f282d643d9d1284ab112a200494d589863a9c4080e578ef0" dependencies = [ "rayon", ] [[package]] name = "p3-mds" -version = "0.1.3-succinct" +version = "0.1.4-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6e57ed310d59245f93e24ee805ea7aa16fc9c505551b76a15f5e50f29d177e" +checksum = "716c4dbe68a02f1541eb09149d07b8663a3a5951b1864a31cd67ff3bb0826e57" dependencies = [ "itertools 0.12.1", "p3-dft", @@ -3360,9 +3136,9 @@ dependencies = [ [[package]] name = "p3-merkle-tree" -version = "0.1.3-succinct" +version = "0.1.4-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af46b41cba75d483ec8a553cbab1d2d794935ae3403d75394acfa4fb2c977cce" +checksum = "ad7ebab52a03c26025988663a135aed62f5084a2e2ea262176dc8748efb593e5" dependencies = [ "itertools 0.12.1", "p3-commit", @@ -3377,22 +3153,23 @@ dependencies = [ [[package]] name = "p3-poseidon2" -version = "0.1.3-succinct" +version = "0.1.4-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adaba6f14c197203530e233badce0ca1126ba3bf3c9ff766505b497bdad0bee1" +checksum = "39c042efa15beab7a8c4d0ca9b9e4cbda7582be0c08e121e830fec45f082935b" dependencies = [ "gcd", "p3-field", "p3-mds", "p3-symmetric", "rand", + "serde", ] [[package]] name = "p3-symmetric" -version = "0.1.3-succinct" +version = "0.1.4-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57ecc4282566eb14f48be7707f6745c4dff6be664984d59ec0fb1849cd82b5c2" +checksum = "b9896a831f5b688adc13f6fbe1dcf66ecfaa4622a500f81aa745610e777acb72" dependencies = [ "itertools 0.12.1", "p3-field", @@ -3401,9 +3178,9 @@ dependencies = [ [[package]] name = "p3-uni-stark" -version = "0.1.3-succinct" +version = "0.1.4-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1af5c038b22b058bf1d49fb1ea3dd6c240a3e46c3278fde5c444e0034f7ffe37" +checksum = "8437ebcd060c8a5479898030b114a93da8a86eb4c2e5f313d9eeaaf40c6e6f61" dependencies = [ "itertools 0.12.1", "p3-air", @@ -3414,18 +3191,15 @@ dependencies = [ "p3-matrix", "p3-maybe-rayon", "p3-util", - "postcard", "serde", "tracing", - "tracing-forest", - "tracing-subscriber", ] [[package]] name = "p3-util" -version = "0.1.3-succinct" +version = "0.1.4-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79f3fef0e00d9d7246385e758c4cd39b4efcbbcea31752471491ab502631385e" +checksum = "dedb9d27ba47ac314c6fac4ca54e55c3e486c864d51ec5ba55dbe47b75121157" dependencies = [ "serde", ] @@ -3633,18 +3407,6 @@ version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" -[[package]] -name = "postcard" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f7f0a8d620d71c457dd1d47df76bb18960378da56af4527aaa10f515eee732e" -dependencies = [ - "cobs", - "embedded-io 0.4.0", - "embedded-io 0.6.1", - "serde", -] - [[package]] name = "powerfmt" version = "0.2.0" @@ -3670,20 +3432,6 @@ dependencies = [ "syn 2.0.82", ] -[[package]] -name = "prettytable-rs" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eea25e07510aa6ab6547308ebe3c036016d162b8da920dbb079e3ba8acf3d95a" -dependencies = [ - "csv", - "encode_unicode 1.0.0", - "is-terminal", - "lazy_static", - "term", - "unicode-width", -] - [[package]] name = "primitive-types" version = "0.12.2" @@ -3772,9 +3520,9 @@ dependencies = [ [[package]] name = "prost" -version = "0.12.6" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29" +checksum = "7b0487d90e047de87f984913713b85c601c05609aad5b0df4b4573fbf69aa13f" dependencies = [ "bytes", "prost-derive", @@ -3782,26 +3530,17 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.12.6" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" +checksum = "e9552f850d5f0964a4e4d0bf306459ac29323ddfbae05e35a7c0d35cb0803cc5" dependencies = [ "anyhow", - "itertools 0.12.1", + "itertools 0.10.5", "proc-macro2", "quote", "syn 2.0.82", ] -[[package]] -name = "psm" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa37f80ca58604976033fae9515a8a2989fc13797d953f7c04fb8fa36a11f205" -dependencies = [ - "cc", -] - [[package]] name = "quick-error" version = "1.2.3" @@ -4018,19 +3757,23 @@ dependencies = [ "http 0.2.12", "http-body 0.4.6", "hyper 0.14.31", + "hyper-tls 0.5.0", "ipnet", "js-sys", "log", "mime", + "native-tls", "once_cell", "percent-encoding", "pin-project-lite", + "rustls-pemfile 1.0.4", "serde", "serde_json", "serde_urlencoded", "sync_wrapper 0.1.2", "system-configuration 0.5.1", "tokio", + "tokio-native-tls", "tower-service", "url", "wasm-bindgen", @@ -4056,7 +3799,7 @@ dependencies = [ "http-body-util", "hyper 1.5.0", "hyper-rustls", - "hyper-tls", + "hyper-tls 0.6.0", "hyper-util", "ipnet", "js-sys", @@ -4068,7 +3811,7 @@ dependencies = [ "pin-project-lite", "quinn", "rustls", - "rustls-pemfile", + "rustls-pemfile 2.2.0", "rustls-pki-types", "serde", "serde_json", @@ -4294,6 +4037,15 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.7", +] + [[package]] name = "rustls-pemfile" version = "2.2.0" @@ -4567,36 +4319,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_with" -version = "3.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e28bdad6db2b8340e449f7108f020b3b092e8583a9e3fb82713e1d4e71fe817" -dependencies = [ - "base64 0.22.1", - "chrono", - "hex", - "indexmap 1.9.3", - "indexmap 2.6.0", - "serde", - "serde_derive", - "serde_json", - "serde_with_macros", - "time", -] - -[[package]] -name = "serde_with_macros" -version = "3.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d846214a9854ef724f3da161b426242d8de7c1fc7de2f89bb1efcb154dca79d" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.82", -] - [[package]] name = "serial_test" version = "3.1.1" @@ -4740,31 +4462,16 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "sp1-build" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8216e07a9c463c6ee091cdc817cfc10c25446cfd4d020812818177e0a3d1c943" -dependencies = [ - "anyhow", - "cargo_metadata", - "chrono", - "clap 4.5.20", - "dirs", -] - [[package]] name = "sp1-core-executor" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9855631556145c827f959527a2f60cb2c6ededfb42afcee49e41dab5f507ce7b" +version = "3.0.0" +source = "git+https://github.com/succinctlabs/sp1.git#b5c6a41816db138a84371178a84538356cd9addd" dependencies = [ "bincode", "bytemuck", "elf", "enum-map", "eyre", - "generic-array 1.1.0", "hashbrown 0.14.5", "hex", "itertools 0.13.0", @@ -4772,14 +4479,11 @@ dependencies = [ "nohash-hasher", "num", "p3-field", - "p3-keccak-air", "p3-maybe-rayon", "rand", "rrs-succinct", "serde", - "serde_with", "sp1-curves", - "sp1-derive", "sp1-primitives", "sp1-stark", "strum", @@ -4793,18 +4497,11 @@ dependencies = [ [[package]] name = "sp1-core-machine" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7d9c51416ef52b258fa637538c02a2ac06ecaeec79d075c620013a77f035dee" +version = "3.0.0" +source = "git+https://github.com/succinctlabs/sp1.git#b5c6a41816db138a84371178a84538356cd9addd" dependencies = [ - "anyhow", - "arrayref", "bincode", - "blake3", - "bytemuck", "cfg-if", - "curve25519-dalek", - "elf", "elliptic-curve", "generic-array 1.1.0", "hashbrown 0.14.5", @@ -4812,32 +4509,20 @@ dependencies = [ "itertools 0.13.0", "k256", "log", - "nohash-hasher", "num", - "num-bigint 0.4.6", "num_cpus", "p3-air", "p3-baby-bear", "p3-blake3", "p3-challenger", - "p3-commit", - "p3-dft", "p3-field", - "p3-fri", - "p3-keccak", "p3-keccak-air", "p3-matrix", "p3-maybe-rayon", - "p3-merkle-tree", - "p3-poseidon2", - "p3-symmetric", "p3-uni-stark", "p3-util", "rand", - "rayon-scan", - "rrs-succinct", "serde", - "serde_with", "size", "snowbridge-amcl", "sp1-core-executor", @@ -4859,10 +4544,10 @@ dependencies = [ [[package]] name = "sp1-curves" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7c33d4d3f5e3590cc8c8d8a3d074097020bc0be0b9dd35fe43e04c586440c85" +version = "3.0.0" +source = "git+https://github.com/succinctlabs/sp1.git#b5c6a41816db138a84371178a84538356cd9addd" dependencies = [ + "cfg-if", "curve25519-dalek", "dashu", "elliptic-curve", @@ -4880,24 +4565,13 @@ dependencies = [ [[package]] name = "sp1-derive" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e33825340e1b21b37a29f5304fbd18a1c7c97ba1376fa35b7c017fd95dd627e" +version = "3.0.0" +source = "git+https://github.com/succinctlabs/sp1.git#b5c6a41816db138a84371178a84538356cd9addd" dependencies = [ - "proc-macro2", "quote", "syn 1.0.109", ] -[[package]] -name = "sp1-helper" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f08124c62d09764810783355cff518477e3f36c8e83343623859afeca6f3eeb" -dependencies = [ - "sp1-build", -] - [[package]] name = "sp1-lib" version = "2.0.0" @@ -4914,39 +4588,44 @@ dependencies = [ [[package]] name = "sp1-primitives" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efbeba375fe59917f162f1808c280d2e39e4698dc7eeac83936b6e70c2f8dbbc" +version = "3.0.0" +source = "git+https://github.com/succinctlabs/sp1.git#b5c6a41816db138a84371178a84538356cd9addd" dependencies = [ - "itertools 0.13.0", + "bincode", + "hex", "lazy_static", + "num-bigint 0.4.6", "p3-baby-bear", "p3-field", "p3-poseidon2", "p3-symmetric", + "serde", + "sha2", ] [[package]] name = "sp1-prover" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "166e9f9fd29ecdfd4fd452d49052abdfbe735317f00016e94fde8410f90b4134" +version = "3.0.0" +source = "git+https://github.com/succinctlabs/sp1.git#b5c6a41816db138a84371178a84538356cd9addd" dependencies = [ "anyhow", "bincode", - "clap 4.5.20", + "clap", "dirs", - "hex", + "eyre", "itertools 0.13.0", + "lazy_static", + "lru", "num-bigint 0.4.6", - "oneshot", "p3-baby-bear", "p3-bn254-fr", "p3-challenger", "p3-commit", "p3-field", "p3-matrix", + "p3-symmetric", "rayon", + "reqwest 0.11.27", "serde", "serde_json", "serial_test", @@ -4957,7 +4636,6 @@ dependencies = [ "sp1-recursion-compiler", "sp1-recursion-core", "sp1-recursion-gnark-ffi", - "sp1-recursion-program", "sp1-stark", "subtle-encoding", "tempfile", @@ -4968,53 +4646,52 @@ dependencies = [ [[package]] name = "sp1-recursion-circuit" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3ccdda16cd078f32c6707212b8e8f3e423992eeff6ace898d3e15bf94e78a16" +version = "3.0.0" +source = "git+https://github.com/succinctlabs/sp1.git#b5c6a41816db138a84371178a84538356cd9addd" dependencies = [ - "bincode", + "hashbrown 0.14.5", "itertools 0.13.0", + "num-traits", "p3-air", "p3-baby-bear", "p3-bn254-fr", + "p3-challenger", "p3-commit", + "p3-dft", "p3-field", "p3-fri", "p3-matrix", + "p3-symmetric", "p3-util", + "rand", + "rayon", "serde", + "sp1-core-executor", "sp1-core-machine", + "sp1-derive", + "sp1-primitives", "sp1-recursion-compiler", "sp1-recursion-core", - "sp1-recursion-derive", - "sp1-recursion-program", + "sp1-recursion-gnark-ffi", "sp1-stark", + "tracing", ] [[package]] name = "sp1-recursion-compiler" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae17b6c8506b3521e78450cf28f76c2426b5b2f132bb89660d3d61eb155439c4" +version = "3.0.0" +source = "git+https://github.com/succinctlabs/sp1.git#b5c6a41816db138a84371178a84538356cd9addd" dependencies = [ "backtrace", "itertools 0.13.0", - "p3-air", "p3-baby-bear", "p3-bn254-fr", - "p3-commit", "p3-field", - "p3-fri", - "p3-matrix", - "p3-poseidon2", "p3-symmetric", - "p3-util", - "rayon", "serde", "sp1-core-machine", "sp1-primitives", "sp1-recursion-core", - "sp1-recursion-core-v2", "sp1-recursion-derive", "sp1-stark", "tracing", @@ -5023,54 +4700,13 @@ dependencies = [ [[package]] name = "sp1-recursion-core" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8414c3d16cd2fedd293989cef601915d4e1efab662e3a08923606970dc8ae7e6" -dependencies = [ - "arrayref", - "backtrace", - "ff 0.13.0", - "hashbrown 0.14.5", - "itertools 0.13.0", - "num_cpus", - "p3-air", - "p3-baby-bear", - "p3-bn254-fr", - "p3-challenger", - "p3-commit", - "p3-dft", - "p3-field", - "p3-fri", - "p3-matrix", - "p3-maybe-rayon", - "p3-merkle-tree", - "p3-poseidon2", - "p3-symmetric", - "p3-util", - "serde", - "serde_with", - "sp1-core-executor", - "sp1-core-machine", - "sp1-derive", - "sp1-primitives", - "sp1-stark", - "static_assertions", - "tracing", - "zkhash", -] - -[[package]] -name = "sp1-recursion-core-v2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d0a2af67ca6f7db964b7f1ffdb48f6e26f10e3cc027a11bdd17b224f8747650" +version = "3.0.0" +source = "git+https://github.com/succinctlabs/sp1.git#b5c6a41816db138a84371178a84538356cd9addd" dependencies = [ - "arrayref", "backtrace", "ff 0.13.0", "hashbrown 0.14.5", "itertools 0.13.0", - "num_cpus", "p3-air", "p3-baby-bear", "p3-bn254-fr", @@ -5086,12 +4722,9 @@ dependencies = [ "p3-symmetric", "p3-util", "serde", - "serde_with", - "sp1-core-executor", "sp1-core-machine", "sp1-derive", "sp1-primitives", - "sp1-recursion-core", "sp1-stark", "static_assertions", "thiserror", @@ -5102,20 +4735,17 @@ dependencies = [ [[package]] name = "sp1-recursion-derive" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4921db3912a60ee3896242ce336203066377e6eddd1c26d099e8bf6b9c470a21" +version = "3.0.0" +source = "git+https://github.com/succinctlabs/sp1.git#b5c6a41816db138a84371178a84538356cd9addd" dependencies = [ - "proc-macro2", "quote", "syn 1.0.109", ] [[package]] name = "sp1-recursion-gnark-ffi" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "718b2e92bfd3ce91fcef2ac0b3a8d31746dbc3ad4071f3bec45aa2e5e025adb1" +version = "3.0.0" +source = "git+https://github.com/succinctlabs/sp1.git#b5c6a41816db138a84371178a84538356cd9addd" dependencies = [ "anyhow", "bincode", @@ -5128,7 +4758,6 @@ dependencies = [ "p3-baby-bear", "p3-field", "p3-symmetric", - "rand", "serde", "serde_json", "sha2", @@ -5138,43 +4767,10 @@ dependencies = [ "tempfile", ] -[[package]] -name = "sp1-recursion-program" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "676661b42f5d55c64932ad400ec920bd8b8098b1500b13c483a541bf3b396dd1" -dependencies = [ - "itertools 0.13.0", - "p3-air", - "p3-baby-bear", - "p3-challenger", - "p3-commit", - "p3-dft", - "p3-field", - "p3-fri", - "p3-matrix", - "p3-maybe-rayon", - "p3-merkle-tree", - "p3-poseidon2", - "p3-symmetric", - "p3-util", - "rand", - "serde", - "sp1-core-executor", - "sp1-core-machine", - "sp1-primitives", - "sp1-recursion-compiler", - "sp1-recursion-core", - "sp1-stark", - "stacker", - "tracing", -] - [[package]] name = "sp1-sdk" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b289585392a3639f6541bce32dd89e03e7893f42e9b9bcf6bee7d54183d5e05" +version = "3.0.0" +source = "git+https://github.com/succinctlabs/sp1.git#b5c6a41816db138a84371178a84538356cd9addd" dependencies = [ "alloy-sol-types", "anyhow", @@ -5184,31 +4780,25 @@ dependencies = [ "dirs", "ethers", "futures", - "getrandom", "hashbrown 0.14.5", "hex", "indicatif", "itertools 0.13.0", "log", - "num-bigint 0.4.6", "p3-baby-bear", - "p3-commit", "p3-field", "p3-fri", - "p3-matrix", "prost", "reqwest 0.12.8", "reqwest-middleware", "serde", - "serde_json", - "sha2", "sp1-core-executor", "sp1-core-machine", + "sp1-primitives", "sp1-prover", "sp1-stark", "strum", "strum_macros", - "sysinfo", "tempfile", "thiserror", "tokio", @@ -5219,14 +4809,14 @@ dependencies = [ [[package]] name = "sp1-stark" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4048fc99a6c1123f5040b5ade1ae2839ca1be421e4c427fc7d1fd9bbf6e174f5" +version = "3.0.0" +source = "git+https://github.com/succinctlabs/sp1.git#b5c6a41816db138a84371178a84538356cd9addd" dependencies = [ "arrayref", "getrandom", "hashbrown 0.14.5", "itertools 0.13.0", + "num-traits", "p3-air", "p3-baby-bear", "p3-challenger", @@ -5245,7 +4835,10 @@ dependencies = [ "serde", "sp1-derive", "sp1-primitives", + "strum", + "strum_macros", "sysinfo", + "thiserror", "tracing", ] @@ -5289,31 +4882,12 @@ dependencies = [ "der", ] -[[package]] -name = "stacker" -version = "0.1.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "799c883d55abdb5e98af1a7b3f23b9b6de8ecada0ecac058672d7635eb48ca7b" -dependencies = [ - "cc", - "cfg-if", - "libc", - "psm", - "windows-sys 0.59.0", -] - [[package]] name = "static_assertions" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" -[[package]] -name = "strsim" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" - [[package]] name = "strsim" version = "0.11.1" @@ -5482,26 +5056,6 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "term" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" -dependencies = [ - "dirs-next", - "rustversion", - "winapi", -] - -[[package]] -name = "textwrap" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" -dependencies = [ - "unicode-width", -] - [[package]] name = "thiserror" version = "1.0.65" @@ -5679,7 +5233,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.6.0", + "indexmap", "toml_datetime", "winnow 0.5.40", ] @@ -5690,23 +5244,13 @@ version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ - "indexmap 2.6.0", + "indexmap", "serde", "serde_spanned", "toml_datetime", "winnow 0.6.20", ] -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "tower-layer", - "tower-service", -] - [[package]] name = "tower" version = "0.5.1" @@ -5828,13 +5372,12 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "twirp-rs" -version = "0.3.0" +version = "0.13.0-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfa3161d8eee0abcad4e762f4215381a430cc1281870d575b0f1e4fbfc74b8ce" +checksum = "27dfcc06b8d9262bc2d4b8d1847c56af9971a52dd8a0076876de9db763227d0d" dependencies = [ "async-trait", "axum", - "bytes", "futures", "http 1.1.0", "http-body-util", @@ -5845,7 +5388,7 @@ dependencies = [ "serde_json", "thiserror", "tokio", - "tower 0.4.13", + "tower", "url", ] @@ -6134,18 +5677,6 @@ dependencies = [ "rustls-pki-types", ] -[[package]] -name = "which" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" -dependencies = [ - "either", - "home", - "once_cell", - "rustix", -] - [[package]] name = "winapi" version = "0.3.9" @@ -6472,43 +6003,27 @@ dependencies = [ ] [[package]] -name = "zkDB-script" +name = "zkdb_core" version = "0.1.0" dependencies = [ - "alloy-sol-types", - "clap 4.5.20", - "hex", - "prettytable-rs", "serde", "serde_json", - "sp1-helper", - "sp1-sdk", - "tracing", ] [[package]] -name = "zkdb-core" +name = "zkdb_lib" version = "0.1.0" dependencies = [ "serde", "serde_json", -] - -[[package]] -name = "zkdb-lib" -version = "0.1.0" -dependencies = [ - "bincode", - "clap 2.34.0", - "serde", - "serde_json", "sp1-sdk", "thiserror", - "zkdb-core", + "zkdb_core", + "zkdb_merkle", ] [[package]] -name = "zkdb-merkle" +name = "zkdb_merkle" version = "0.1.0" dependencies = [ "base64 0.13.1", @@ -6518,7 +6033,7 @@ dependencies = [ "serde", "serde_json", "sp1-zkvm", - "zkdb-core", + "zkdb_core", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 8465e1e..412d0fb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,11 +3,22 @@ members = [ "crates/zkdb-merkle", "crates/zkdb-core", "crates/zkdb-lib", - "crates/script", ] resolver = "2" [workspace.dependencies] alloy-sol-types = "0.7.7" rs_merkle = "1.4.2" -prettytable-rs = "0.10" \ No newline at end of file +prettytable-rs = "0.10" +sp1-sdk = { git = "https://github.com/succinctlabs/sp1.git" } +thiserror = "1.0" +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" +zkdb_core = { path = "crates/zkdb-core" } +zkdb_merkle = { path = "crates/zkdb-merkle" } +zkdb_lib = { path = "crates/zkdb-lib" } + +sp1-zkvm = "2.0.0" +base64 = { version = "0.13", features = ["alloc"] } +hex = { version = "0.4", features = ["alloc"] } +bincode = { version = "1.3" } diff --git a/crates/zkdb-core/Cargo.toml b/crates/zkdb-core/Cargo.toml index ae7e175..50b31dd 100644 --- a/crates/zkdb-core/Cargo.toml +++ b/crates/zkdb-core/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "zkdb-core" +name = "zkdb_core" version = "0.1.0" edition = "2021" diff --git a/crates/zkdb-duckdb/Cargo.toml b/crates/zkdb-duckdb/Cargo.toml deleted file mode 100644 index e0a867e..0000000 --- a/crates/zkdb-duckdb/Cargo.toml +++ /dev/null @@ -1,10 +0,0 @@ -[package] -version = "0.1.0" -name = "zkdb-duckdb" -edition = "2021" - -[dependencies] -sp1-zkvm = "2.0.0" -ruint = "1.7.0" -duckdb = { version = "1.1.1", default-features = false, features = [] } - diff --git a/crates/zkdb-duckdb/src/main.rs b/crates/zkdb-duckdb/src/main.rs deleted file mode 100644 index fe21d7e..0000000 --- a/crates/zkdb-duckdb/src/main.rs +++ /dev/null @@ -1,65 +0,0 @@ -//! A SP1 program for time series analysis and forecasting. -//! -//! This program demonstrates how to perform time series calculations within a zero-knowledge proof system. -//! It takes a series of timestamps and corresponding forecast values as input, performs statistical -//! calculations, and outputs the results in a format compatible with Solidity smart contracts. - -// These two lines are necessary for the program to properly compile. -// -// Under the hood, we wrap your main function with some extra code so that it behaves properly -// inside the zkVM. -#![no_main] -sp1_zkvm::entrypoint!(main); - -use duckdb::{params, Connection}; -use sp1_zkvm::io; - -/// The main entry point for the SP1 program. -/// -/// This function performs the following steps: -/// 1. Reads input data (timestamps and forecast values) from the prover. -/// 2. Creates a TimeSeries instance and calculates statistical measures. -/// 3. Converts the results to Solidity-compatible formats. -/// 4. Encodes the public values for verification in a smart contract. -/// 5. Commits the encoded data as public output of the ZK proof. -pub fn main() { - // Read input data (for simplicity, we'll just use a single integer) - let input_value: i32 = io::read(); - - // Perform database operations - let result = perform_db_operations(input_value); - - // Write the result as public output - sp1_zkvm::io::commit_slice(&[result as u8]); -} - -fn perform_db_operations(input_value: i32) -> i32 { - // Create an in-memory DuckDB connection - let conn = Connection::open_in_memory().unwrap(); - - // Create a table - conn.execute( - "CREATE TABLE test (id INTEGER PRIMARY KEY, value INTEGER)", - params![], - ) - .unwrap(); - - // Insert the input value - conn.execute("INSERT INTO test (value) VALUES (?)", params![input_value]) - .unwrap(); - - // Query the inserted value - let mut stmt = conn.prepare("SELECT value FROM test WHERE id = 1").unwrap(); - let mut rows = stmt.query(params![]).unwrap(); - - let result = if let Some(row) = rows.next().unwrap() { - row.get(0).unwrap() - } else { - -1 // Return -1 if no row was found - }; - - // Close the connection - conn.close().unwrap(); - - result -} diff --git a/crates/zkdb-lib/Cargo.toml b/crates/zkdb-lib/Cargo.toml index 550d8d3..2af68dc 100644 --- a/crates/zkdb-lib/Cargo.toml +++ b/crates/zkdb-lib/Cargo.toml @@ -1,17 +1,16 @@ [package] -name = "zkdb-lib" +name = "zkdb_lib" version = "0.1.0" edition = "2021" [dependencies] -zkdb-core = { path = "../zkdb-core" } -sp1-sdk = { version = "2.0.0" } -serde = { version = "1.0", features = ["derive"] } -serde_json = "1.0" -thiserror = "1.0" -bincode = "1.3" -clap = "2.33" +sp1-sdk = { workspace = true } +thiserror = { workspace = true } +serde = { workspace = true } +serde_json = { workspace = true } +zkdb_core = { workspace = true } +zkdb_merkle = { workspace = true } [[bin]] name = "cli" -path = "src/bin/cli.rs" +path = "src/bin/cli.rs" \ No newline at end of file diff --git a/crates/zkdb-lib/src/lib.rs b/crates/zkdb-lib/src/lib.rs index bf4813f..293e6d9 100644 --- a/crates/zkdb-lib/src/lib.rs +++ b/crates/zkdb-lib/src/lib.rs @@ -2,7 +2,11 @@ use sp1_sdk::{ HashableKey, ProverClient, SP1ProofWithPublicValues, SP1ProvingKey, SP1PublicValues, SP1Stdin, SP1VerifyingKey, }; +use std::env; +use std::fs; +use std::path::{Path, PathBuf}; use thiserror::Error; +use zkdb_merkle::get_elf; // reexport zkdb_core pub use zkdb_core::{Command, QueryResult}; @@ -14,11 +18,12 @@ pub struct Database { } impl Database { - pub fn new(elf: &'static [u8], initial_state: Vec) -> Self { + pub fn new(initial_state: Vec) -> Self { + let elf = get_elf(); Database { elf, state: initial_state, - executor: SP1Executor::new(elf), + executor: SP1Executor::new(&elf), } } diff --git a/crates/zkdb-lib/tests/merkle_tests.rs b/crates/zkdb-lib/tests/merkle_tests.rs new file mode 100644 index 0000000..2390bff --- /dev/null +++ b/crates/zkdb-lib/tests/merkle_tests.rs @@ -0,0 +1,89 @@ +use serde_json::json; +use zkdb_lib::{Command, Database, QueryResult}; + +fn setup_database() -> Database { + let initial_state = Vec::new(); // Empty initial state + Database::new(initial_state) +} + +#[test] +fn test_insert_and_get() { + let mut db = setup_database(); + + // Insert a key-value pair + let insert_command = Command::Insert { + key: "test_key".to_string(), + value: "test_value".to_string(), + }; + let insert_result = db.execute_query(insert_command, false).unwrap(); + assert!(insert_result.data.is_null()); // Insert should return null + + // Get the inserted value + let get_command = Command::Get { + key: "test_key".to_string(), + }; + let get_result = db.execute_query(get_command, false).unwrap(); + assert_eq!(get_result.data, json!("test_value")); +} + +#[test] +fn test_proof_generation_and_verification() { + let mut db = setup_database(); + + // Insert a key-value pair with proof generation + let insert_command = Command::Insert { + key: "proof_key".to_string(), + value: "proof_value".to_string(), + }; + let insert_result = db.execute_query(insert_command, true).unwrap(); + + // Verify the proof + assert!(db.verify_proof(&insert_result.new_state).unwrap()); + + // Get the inserted value with proof generation + let get_command = Command::Get { + key: "proof_key".to_string(), + }; + let get_result = db.execute_query(get_command, true).unwrap(); + + // Verify the proof + assert!(db.verify_proof(&get_result.new_state).unwrap()); + assert_eq!(get_result.data, json!("proof_value")); +} + +#[test] +fn test_multiple_operations() { + let mut db = setup_database(); + + // Insert multiple key-value pairs + for i in 0..5 { + let insert_command = Command::Insert { + key: format!("key_{}", i), + value: format!("value_{}", i), + }; + db.execute_query(insert_command, false).unwrap(); + } + + // Verify all inserted values + for i in 0..5 { + let get_command = Command::Get { + key: format!("key_{}", i), + }; + let get_result = db.execute_query(get_command, false).unwrap(); + assert_eq!(get_result.data, json!(format!("value_{}", i))); + } + + // Update a value + let update_command = Command::Insert { + key: "key_2".to_string(), + value: "updated_value".to_string(), + }; + db.execute_query(update_command, false).unwrap(); + + // Verify the updated value + let get_command = Command::Get { + key: "key_2".to_string(), + }; + let get_result = db.execute_query(get_command, false).unwrap(); + assert_eq!(get_result.data, json!("updated_value")); +} diff --git a/crates/zkdb-merkle/Cargo.toml b/crates/zkdb-merkle/Cargo.toml index 76945cb..0fdd499 100644 --- a/crates/zkdb-merkle/Cargo.toml +++ b/crates/zkdb-merkle/Cargo.toml @@ -1,14 +1,14 @@ [package] version = "0.1.0" -name = "zkdb-merkle" +name = "zkdb_merkle" edition = "2021" [dependencies] -sp1-zkvm = "2.0.0" -rs_merkle = { version = "1.4.2", default-features = false } -serde = { version = "1.0", default-features = false, features = ["derive", "alloc"] } -serde_json = { version = "1.0", default-features = false, features = ["alloc"] } -base64 = { version = "0.13", default-features = false, features = ["alloc"] } -hex = { version = "0.4", default-features = false, features = ["alloc"] } -bincode = { version = "1.3", default-features = false } -zkdb-core = { path = "../zkdb-core", default-features = false} +sp1-zkvm = { workspace = true } +rs_merkle = { workspace = true } +serde = { workspace = true, features = ["derive", "alloc"] } +serde_json = { workspace = true, features = ["alloc"] } +base64 = { workspace = true, features = ["alloc"] } +hex = { workspace = true, features = ["alloc"] } +bincode = { workspace = true } +zkdb_core = { workspace = true } diff --git a/crates/zkdb-merkle/src/lib.rs b/crates/zkdb-merkle/src/lib.rs new file mode 100644 index 0000000..bc5d8f0 --- /dev/null +++ b/crates/zkdb-merkle/src/lib.rs @@ -0,0 +1,6 @@ +use std::env; +use std::path::PathBuf; + +pub fn get_elf() -> &'static [u8] { + include_bytes!(env!("SP1_ELF_zkdb_merkle")) +} diff --git a/crates/zkdb-sled/Cargo.toml b/crates/zkdb-sled/Cargo.toml deleted file mode 100644 index e8e6490..0000000 --- a/crates/zkdb-sled/Cargo.toml +++ /dev/null @@ -1,9 +0,0 @@ -[package] -version = "0.1.0" -name = "zkdb-sled" -edition = "2021" - -[dependencies] -sp1-zkvm = "2.0.0" -ruint = "1.7.0" -sled = "0.34.6" \ No newline at end of file diff --git a/crates/zkdb-sled/src/main.rs b/crates/zkdb-sled/src/main.rs deleted file mode 100644 index b070e5b..0000000 --- a/crates/zkdb-sled/src/main.rs +++ /dev/null @@ -1,53 +0,0 @@ -//! A SP1 program for time series analysis and forecasting. -//! -//! This program demonstrates how to perform time series calculations within a zero-knowledge proof system. -//! It takes a series of timestamps and corresponding forecast values as input, performs statistical -//! calculations, and outputs the results in a format compatible with Solidity smart contracts. - -#![no_main] -sp1_zkvm::entrypoint!(main); - -use sled; -use sp1_zkvm::io; - -/// The main entry point for the SP1 program. -/// -/// This function performs the following steps: -/// 1. Reads input data from the prover. -/// 2. Performs database operations using sled. -/// 3. Outputs the result as public output of the ZK proof. -pub fn main() { - // Read input data (for simplicity, we'll just use a single integer) - let input_value: i32 = io::read(); - - // Perform database operations - let result = perform_db_operations(input_value); - - // Write the result as public output - sp1_zkvm::io::commit_slice(&[result as u8]); -} - -fn perform_db_operations(input_value: i32) -> i32 { - // Open a sled database in memory - let config = sled::Config::new().temporary(true); - let db = config.open().unwrap(); - - // Insert the input value with a key - db.insert(b"id-1", &input_value.to_be_bytes()).unwrap(); - - // Retrieve the value - let retrieved = db.get(b"id-1").unwrap(); - - let result = if let Some(value) = retrieved { - let bytes = value.as_ref(); - let int_bytes: [u8; 4] = bytes.try_into().expect("Slice with incorrect length"); - i32::from_be_bytes(int_bytes) - } else { - -1 // Return -1 if no value was found - }; - - // Close the database - db.flush().unwrap(); - - result -} diff --git a/docs/design/structure.md b/docs/design/structure.md index 1add389..5e26aa0 100644 --- a/docs/design/structure.md +++ b/docs/design/structure.md @@ -1,53 +1,123 @@ # zkDB Crate Structure -The zkDB project will consist of several crates, each serving a specific purpose. The main crates are: +The zkDB project consists of several crates, each serving a specific purpose: ## zkdb-core -This crate will serve as the base for various database engines implemented as SP1 programs. It will provide common utilities, data structures, and interfaces that can be shared across different database engines. +This crate provides the foundation for building SP1 Programs that implement database functionality: -### zkdb-merkle +- Core traits like `DatabaseEngine` for implementing SP1 programs +- Common data structures for commands and results used within SP1 +- No-std compatible for SP1 runtime environment +- Serialization interfaces for SP1 program I/O +- Error types specific to SP1 program execution -This crate will implement a Merkle tree-based database engine as an SP1 program. It will provide functionality for inserting, querying, and generating proofs for key-value pairs stored in a Merkle tree. +## zkdb-registry -### zkdb-duckdb +This crate manages pre-compiled SP1 program ELF binaries: -This crate will implement a database engine based on DuckDB, a lightweight and embeddable SQL database management system. It will provide functionality for executing SQL queries and generating proofs for the query results. +- Stores pre-compiled ELF files as embedded binary data +- Provides a registry pattern for zkdb-lib to access different SP1 programs +- Handles versioning and metadata for ELF binaries +- Example structure: + ```rust + pub struct ZkVMRegistry { + merkle_elf: &'static [u8], + // other SP1 program ELFs... + } + ``` -### Other Database Engines +## zkdb-merkle -Additional crates can be added to implement other database engines as SP1 programs, such as a time-series database, a graph database, or any other specialized database system. +An example implementation of a database engine as an SP1 program: + +- Built using zkdb-core traits and interfaces +- Implements Merkle tree operations inside SP1 +- Demonstrates how to build a database engine using zkdb-core +- Compiles to an ELF that gets stored in zkdb-registry ## zkdb-lib -This crate will serve as the primary interface for interacting with the various database engines. It will provide a high-level API for creating, querying, and managing databases, as well as generating and verifying proofs. +The primary interface crate that applications will use to interact with zkDB: -The `zkdb-lib` crate will act as a wrapper around the different `zkdb-core` crates, abstracting away the underlying implementation details and providing a consistent interface for working with different database engines. +- High-level API for all database operations +- Manages SP1 program execution through the registry +- Handles state management and serialization +- Provides proof generation and verification +- Example usage: + ```rust + let db = Database::new(DatabaseType::Merkle); + db.execute_query(Command::Insert { key, value })?; + ``` ## zkdb-cli -This crate will provide a command-line interface (CLI) for interacting with the zkDB system. It will allow users to create, manage, and query databases, as well as generate and verify proofs from the command line. +Command-line interface built on top of zkdb-lib: -The `zkdb-cli` crate will depend on the `zkdb-lib` crate to interact with the underlying database engines. +- User-friendly commands for database operations +- Built entirely using zkdb-lib's public API +- Proof management utilities +- Configuration handling ## Additional Crates -Depending on the project's requirements, additional crates may be added to provide supplementary functionality, such as: +### zkdb-types (future) +- Common data types for both SP1 programs and client code +- Serialization formats +- Type conversion utilities + +### zkdb-utils (future) +- Shared utility functions +- Helper methods +- Common tools + +## Architecture Flow -- `zkdb-types`: A crate for defining common data types and structures used across the zkDB project. -- `zkdb-utils`: A crate containing utility functions and helpers used throughout the project. -- `zkdb-tests`: A crate for housing integration and end-to-end tests for the zkDB system. +1. SP1 Program Development: + - Use zkdb-core to implement database logic + - Compile to ELF binary + - Store in zkdb-registry + +2. Client Usage: + - Applications use zkdb-lib + - zkdb-lib loads appropriate ELF from registry + - zkdb-lib handles all SP1 execution details ## Dependencies -The zkDB crates will depend on various external crates, including: +The project uses different dependencies for SP1 programs vs client code: + +### SP1 Program Dependencies (zkdb-core, database implementations) +- `sp1-zkvm`: Core SP1 functionality +- `serde` with no-std features +- Domain-specific libraries (e.g., rs_merkle) + +### Client Dependencies (zkdb-lib, zkdb-cli) +- `sp1-sdk`: SP1 prover/verifier functionality +- Full `serde` stack +- `clap` and other user-facing utilities + +## Build Process + +1. SP1 Programs: + - Implement using zkdb-core + - Compile to ELF + - Add to zkdb-registry + +2. Client Libraries: + - Use zkdb-lib which loads from registry + - No direct SP1 program compilation needed + +## State Management + +- SP1 programs define their state format using zkdb-core +- zkdb-lib handles state serialization and management +- State is passed between operations in a format specific to each engine -- `sp1-sdk`: The SP1 Software Development Kit, which provides utilities for developing and proving SP1 programs. -- `serde`, `serde_json`: For serialization and deserialization of data structures. -- `clap`: For parsing command-line arguments in the `zkdb-cli` crate. -- `tracing`, `log`: For logging and debugging purposes. -- `duckdb`: The DuckDB crate, used in the `zkdb-duckdb` crate. -- Any other crates required by the specific database engines or utilities. +## Proof System -This crate structure separates concerns and allows for modular development and testing of different database engines. The `zkdb-lib` crate acts as a unified interface, making it easier to work with and switch between different database engines without modifying the application code. +- SP1 programs focus on computation logic +- zkdb-lib handles all proof generation and verification +- Proof artifacts are managed consistently across engines +This architecture cleanly separates SP1 program development (using zkdb-core) from client usage (through zkdb-lib), with zkdb-registry serving as the bridge between them. \ No newline at end of file diff --git a/elf/zkdb-merkle b/elf/zkdb-merkle new file mode 100755 index 0000000000000000000000000000000000000000..8e7de1d9487ca167e9c4087fc0f794e412c8de2d GIT binary patch literal 311512 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

xAW$1hPYz@jaX5*K*IpIN`t?(j0~tGi@KeNN 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 literal 0 HcmV?d00001 From 395c3ddd0e416fc49201a8c8990f9680a03b6652 Mon Sep 17 00:00:00 2001 From: Conner Swann <2635475+yourbuddyconner@users.noreply.github.com> Date: Mon, 28 Oct 2024 17:48:08 -0700 Subject: [PATCH 03/11] got the binaries wired up to build, refactored core commands --- .gitignore | 5 +- Cargo.lock | 50 +++++++++- Cargo.toml | 3 + crates/zkdb-core/src/lib.rs | 4 +- crates/zkdb-lib/Cargo.toml | 8 +- crates/zkdb-lib/build.rs | 44 +++++++++ crates/zkdb-lib/src/bin/cli.rs | 161 ++++++++++++++++++++++++--------- crates/zkdb-lib/src/lib.rs | 124 +++++++++++++++++-------- crates/zkdb-merkle/Cargo.toml | 6 +- crates/zkdb-merkle/src/lib.rs | 6 -- crates/zkdb-merkle/src/main.rs | 88 +++++++++++------- 11 files changed, 371 insertions(+), 128 deletions(-) create mode 100644 crates/zkdb-lib/build.rs delete mode 100644 crates/zkdb-merkle/src/lib.rs diff --git a/.gitignore b/.gitignore index 174aa94..debf68b 100644 --- a/.gitignore +++ b/.gitignore @@ -16,4 +16,7 @@ pgo-data.profdata **/proof-with-io.json # Env -.env \ No newline at end of file +.env + +./elf/* +**/*/db_state.bin diff --git a/Cargo.lock b/Cargo.lock index 67034af..9c7b9c9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -167,6 +167,21 @@ dependencies = [ "serde", ] +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "ansi_term" version = "0.12.1" @@ -749,7 +764,12 @@ version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", "num-traits", + "wasm-bindgen", + "windows-targets 0.52.6", ] [[package]] @@ -2249,6 +2269,29 @@ dependencies = [ "tracing", ] +[[package]] +name = "iana-time-zone" +version = "0.1.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + [[package]] name = "idna" version = "0.5.0" @@ -6014,12 +6057,17 @@ dependencies = [ name = "zkdb_lib" version = "0.1.0" dependencies = [ + "bincode", + "chrono", + "clap", + "hex", "serde", "serde_json", "sp1-sdk", "thiserror", + "tracing", + "tracing-subscriber", "zkdb_core", - "zkdb_merkle", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 412d0fb..c032628 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,6 +17,9 @@ serde_json = "1.0" zkdb_core = { path = "crates/zkdb-core" } zkdb_merkle = { path = "crates/zkdb-merkle" } zkdb_lib = { path = "crates/zkdb-lib" } +clap = { version = "4.5.20", features = ["derive"] } +tracing = { version = "0.1", features = ["log"] } +tracing-subscriber = { version = "0.3", features = ["env-filter"] } sp1-zkvm = "2.0.0" base64 = { version = "0.13", features = ["alloc"] } diff --git a/crates/zkdb-core/src/lib.rs b/crates/zkdb-core/src/lib.rs index 413fead..a4f760d 100644 --- a/crates/zkdb-core/src/lib.rs +++ b/crates/zkdb-core/src/lib.rs @@ -14,11 +14,11 @@ pub trait DatabaseEngine { ) -> Result; } -#[derive(Serialize, Deserialize, Debug)] +#[derive(Debug, Serialize, Deserialize, Clone)] pub enum Command { - Insert { key: String, value: String }, Query { key: String }, Prove { key: String }, + Insert { key: String, value: String }, } #[derive(Serialize, Deserialize, Debug)] diff --git a/crates/zkdb-lib/Cargo.toml b/crates/zkdb-lib/Cargo.toml index 2af68dc..4ea4599 100644 --- a/crates/zkdb-lib/Cargo.toml +++ b/crates/zkdb-lib/Cargo.toml @@ -2,6 +2,7 @@ name = "zkdb_lib" version = "0.1.0" edition = "2021" +build = "build.rs" [dependencies] sp1-sdk = { workspace = true } @@ -9,7 +10,12 @@ thiserror = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } zkdb_core = { workspace = true } -zkdb_merkle = { workspace = true } +clap = { workspace = true } +bincode = { workspace = true } +chrono = "0.4" +tracing = { workspace = true } +hex = { workspace = true } +tracing-subscriber = { workspace = true } [[bin]] name = "cli" diff --git a/crates/zkdb-lib/build.rs b/crates/zkdb-lib/build.rs new file mode 100644 index 0000000..663f854 --- /dev/null +++ b/crates/zkdb-lib/build.rs @@ -0,0 +1,44 @@ +use std::env; +use std::path::PathBuf; +use std::process::Command; + +fn main() { + let target_dir = env::var("CARGO_MANIFEST_DIR").unwrap(); + let binding = PathBuf::from(&target_dir); + let workspace_root = &binding.parent().unwrap().parent().unwrap(); + + // Run cargo prove build + let status = Command::new("cargo") + .current_dir(workspace_root.join("crates/zkdb-merkle")) + .args([ + "prove", + "build", + "--output-directory", + "$CARGO_MANIFEST_DIR/elf", + "--elf-name", + "zkdb_merkle", + ]) + .status() + .expect("Failed to execute cargo prove build"); + + if !status.success() { + panic!("Failed to build zkdb_merkle with cargo prove build"); + } + + let elf_path = workspace_root + .join("target/elf-compilation/riscv32im-succinct-zkvm-elf/release/zkdb_merkle"); + + if !elf_path.exists() { + panic!( + "zkdb_merkle.elf not found at {:?} after cargo prove build", + elf_path + ); + } + + // set the ELF env variable + let elf_path_str = elf_path.to_str().unwrap(); + println!("cargo:rustc-env=ZKDB_ELF_PATH={}", elf_path_str); + + // Tell cargo to rerun this script if the ELF file changes + println!("cargo:rerun-if-changed={}", elf_path.display()); +} diff --git a/crates/zkdb-lib/src/bin/cli.rs b/crates/zkdb-lib/src/bin/cli.rs index 3bc42fe..0230e33 100644 --- a/crates/zkdb-lib/src/bin/cli.rs +++ b/crates/zkdb-lib/src/bin/cli.rs @@ -1,77 +1,114 @@ -use clap::{App, Arg, SubCommand}; +use bincode; +use clap::{Arg, Command}; use std::fs; -use zkdb_core::{DatabaseError, QueryResult}; -use zkdb_lib::{Command, Database}; +use std::path::PathBuf; +use tracing_subscriber::{self, EnvFilter}; +use zkdb_core::QueryResult; +use zkdb_lib::{Command as DbCommand, Database}; + +pub fn init_logging() { + tracing_subscriber::fmt() + .with_env_filter(EnvFilter::from_default_env()) + .init(); +} fn main() -> Result<(), Box> { - let matches = App::new("zkDB CLI") + init_logging(); + + let matches = Command::new("zkDB CLI") .version("1.0") .author("Your Name") .about("Interact with zkDB") .subcommand( - SubCommand::with_name("init") - .about("Initialize a new database") - .arg( - Arg::with_name("elf_path") - .required(true) - .help("Path to the ELF file"), - ), + Command::new("init").about("Initialize a new database").arg( + Arg::new("state_path") + .long("state") + .default_value("db_state.bin") + .help("Path to save the initial database state"), + ), ) .subcommand( - SubCommand::with_name("query") + Command::new("query") .about("Execute a query") .arg( - Arg::with_name("command") + Arg::new("command") .required(true) .help("Query command to execute"), ) .arg( - Arg::with_name("generate_proof") + Arg::new("generate_proof") .long("generate-proof") .help("Generate a proof for the query"), + ) + .arg( + Arg::new("state_path") + .long("state") + .default_value("db_state.bin") + .help("Path to database state file"), ), ) .subcommand( - SubCommand::with_name("verify").about("Verify a proof").arg( - Arg::with_name("proof_path") + Command::new("verify").about("Verify a proof").arg( + Arg::new("proof_path") .required(true) .help("Path to the proof file"), ), ) + .subcommand( + Command::new("insert") + .about("Insert a key-value pair into the database") + .arg(Arg::new("key").required(true).help("Key to insert")) + .arg(Arg::new("value").required(true).help("Value to insert")) + .arg( + Arg::new("state_path") + .long("state") + .default_value("db_state.bin") + .help("Path to database state file"), + ), + ) .get_matches(); match matches.subcommand() { - ("init", Some(init_matches)) => { - let elf_path = init_matches.value_of("elf_path").unwrap(); - let elf_data = fs::read(elf_path)?; + Some(("init", init_matches)) => { + let state_path = init_matches.get_one::("state_path").unwrap(); let initial_state = vec![]; // Empty initial state - let db = Database::new(Box::leak(elf_data.into_boxed_slice()), initial_state); - println!("Database initialized with ELF from {}", elf_path); - // Here you might want to save the database state to a file + let db = Database::new(initial_state); + println!("Initializing new database"); + let db_state = db.get_state(); + fs::write(state_path, bincode::serialize(&db_state)?)?; + println!("Database state saved to: {}", state_path); } - ("query", Some(query_matches)) => { - let command_str = query_matches.value_of("command").unwrap(); - let generate_proof = query_matches.is_present("generate_proof"); + Some(("query", query_matches)) => { + let command_str = query_matches.get_one::("command").unwrap(); + let generate_proof = query_matches.contains_id("generate_proof"); + let state_path = query_matches.get_one::("state_path").unwrap(); - // For this example, we'll assume the database is already initialized - // In a real application, you'd load the database state from a file - let elf_data = include_bytes!("../../../../elf/riscv32im-succinct-zkvm-elf"); - let mut db = Database::new(elf_data, vec![]); + let db_state: Vec = bincode::deserialize(&fs::read(state_path)?)?; + let mut db = Database::new(db_state); let command = parse_command(command_str)?; match db.execute_query(command, generate_proof) { - Ok(result) => print_query_result(result), + Ok(result) => { + fs::write(state_path, bincode::serialize(&db.get_state())?)?; + + print_query_result(&result); + + if generate_proof { + let proof_path = format!("proof_{}.bin", chrono::Utc::now().timestamp()); + fs::write(&proof_path, bincode::serialize(&result)?)?; + println!("Proof saved to: {}", proof_path); + } + } Err(e) => eprintln!("Query execution failed: {}", e), } } - ("verify", Some(verify_matches)) => { - let proof_path = verify_matches.value_of("proof_path").unwrap(); - let proof_data = fs::read(proof_path)?; - let proven_output: zkdb_lib::ProvenOutput = bincode::deserialize(&proof_data)?; + Some(("verify", verify_matches)) => { + let proof_path = verify_matches.get_one::("proof_path").unwrap(); + let proven_output: zkdb_lib::ProvenOutput = + bincode::deserialize(&fs::read(proof_path)?)?; - // Again, assuming the database is already initialized - let elf_data = include_bytes!("../../../../elf/riscv32im-succinct-zkvm-elf"); - let db = Database::new(elf_data, vec![]); + let db_state: Vec = bincode::deserialize(&fs::read("db_state.bin")?)?; + let db = Database::new(db_state); match db.verify_proof(&proven_output) { Ok(true) => println!("Proof verified successfully"), @@ -79,6 +116,28 @@ fn main() -> Result<(), Box> { Err(e) => eprintln!("Proof verification error: {}", e), } } + Some(("insert", insert_matches)) => { + let key = insert_matches.get_one::("key").unwrap(); + let value = insert_matches.get_one::("value").unwrap(); + let state_path = insert_matches.get_one::("state_path").unwrap(); + + let db_state: Vec = bincode::deserialize(&fs::read(state_path)?)?; + let mut db = Database::new(db_state); + + let command = DbCommand::Insert { + key: key.clone(), + value: value.clone(), + }; + + match db.execute_query(command, false) { + Ok(result) => { + fs::write(state_path, bincode::serialize(&db.get_state())?)?; + println!("Successfully inserted key '{}' with value '{}'", key, value); + print_query_result(&result); + } + Err(e) => eprintln!("Insert failed: {}", e), + } + } _ => { println!("Invalid command. Use --help for usage information."); } @@ -87,16 +146,30 @@ fn main() -> Result<(), Box> { Ok(()) } -fn parse_command(command_str: &str) -> Result> { - // This is a placeholder. You'll need to implement proper parsing based on your Command enum - Ok(Command::Query(command_str.to_string())) +fn parse_command(command_str: &str) -> Result> { + if let Some(parts) = command_str.split_once(':') { + match parts.0 { + "insert" => { + let (key, value) = parts + .1 + .split_once('=') + .ok_or("Invalid insert format. Use 'insert:key=value'")?; + return Ok(DbCommand::Insert { + key: key.to_string(), + value: value.to_string(), + }); + } + _ => {} + } + } + + Ok(DbCommand::Query { + key: command_str.to_string(), + }) } -fn print_query_result(result: QueryResult) { +fn print_query_result(result: &QueryResult) { println!("Query Result:"); println!("New State: {:?}", result.new_state); println!("Output: {:?}", result.data); - // if let Some(proof) = result.proof { - // println!("Proof generated: {:?}", proof); - // } } diff --git a/crates/zkdb-lib/src/lib.rs b/crates/zkdb-lib/src/lib.rs index 293e6d9..d199b06 100644 --- a/crates/zkdb-lib/src/lib.rs +++ b/crates/zkdb-lib/src/lib.rs @@ -1,12 +1,13 @@ +use serde::{Deserialize, Serialize}; use sp1_sdk::{ HashableKey, ProverClient, SP1ProofWithPublicValues, SP1ProvingKey, SP1PublicValues, SP1Stdin, SP1VerifyingKey, }; use std::env; use std::fs; -use std::path::{Path, PathBuf}; +use std::path::Path; use thiserror::Error; -use zkdb_merkle::get_elf; +use tracing::{debug, error, instrument}; // reexport zkdb_core pub use zkdb_core::{Command, QueryResult}; @@ -17,9 +18,17 @@ pub struct Database { executor: SP1Executor, } +pub fn get_elf() -> &'static [u8] { + debug!("Loading ELF binary from {}", env!("ZKDB_ELF_PATH")); + include_bytes!(env!("ZKDB_ELF_PATH")) +} + impl Database { + #[instrument(skip(initial_state))] pub fn new(initial_state: Vec) -> Self { + debug!("Creating new Database instance"); let elf = get_elf(); + debug!("Loaded ELF binary, size: {} bytes", elf.len()); Database { elf, state: initial_state, @@ -27,29 +36,40 @@ impl Database { } } - pub fn get_elf(&self) -> &'static [u8] { - self.elf - } - + #[instrument(skip(self, command))] pub fn execute_query( &mut self, command: Command, generate_proof: bool, ) -> Result { + debug!(?generate_proof, "Executing query"); let result = self .executor .execute_query(&self.state, &command, generate_proof)?; + debug!("Query executed successfully, updating state"); self.state.clone_from(&result.new_state); Ok(result) } + #[instrument(skip(self, proof))] pub fn verify_proof(&self, proof: &ProvenOutput) -> Result { + debug!("Verifying proof"); self.executor.verify_proof(proof) } + #[instrument(skip(self))] pub fn get_state(&self) -> &[u8] { &self.state } + + #[instrument(skip(self, path))] + pub fn save_state(&self, path: &Path) -> Result<(), DatabaseError> { + debug!(path = ?path, "Saving database state"); + fs::write(path, bincode::serialize(&self.state).unwrap()).map_err(|e| { + error!(error = ?e, "Failed to save state"); + DatabaseError::QueryExecutionFailed(e.to_string()) + }) + } } #[derive(Clone, Debug, serde::Serialize, serde::Deserialize)] @@ -76,9 +96,13 @@ pub struct SP1Executor { } impl SP1Executor { + #[instrument(skip(elf))] pub fn new(elf: &'static [u8]) -> Self { + debug!("Creating new SP1Executor"); let client = ProverClient::new(); + debug!("Generated ProverClient"); let (pk, vk) = client.setup(elf); + debug!("Generated proving and verifying keys"); SP1Executor { client, elf, @@ -87,32 +111,42 @@ impl SP1Executor { } } + #[instrument(skip(self, state, command))] pub fn execute_query( &self, state: &[u8], command: &Command, generate_proof: bool, ) -> Result { + debug!(?generate_proof, "Preparing query execution"); + debug!(?command, "Command to execute"); + let mut stdin = SP1Stdin::new(); stdin.write(&state.to_vec()); - stdin.write( - &serde_json::to_vec(command) - .map_err(|e| DatabaseError::QueryExecutionFailed(e.to_string()))?, - ); - stdin.write(&[generate_proof as u8]); + stdin.write(command); + debug!(?stdin, "Stdin prepared"); if generate_proof { + debug!("Generating proof"); let proof = self .client .prove(&self.pk, stdin.clone()) .run() - .map_err(|e| DatabaseError::ProofGenerationFailed(e.to_string()))?; + .map_err(|e| { + error!(error = ?e, "Proof generation failed"); + DatabaseError::ProofGenerationFailed(e.to_string()) + })?; + debug!("Proof generated successfully"); let (output, _) = self .client .execute(self.elf, stdin.clone()) .run() - .map_err(|e| DatabaseError::QueryExecutionFailed(e.to_string()))?; + .map_err(|e| { + error!(error = ?e, "Query execution failed"); + DatabaseError::QueryExecutionFailed(e.to_string()) + })?; + debug!("Query executed with proof"); self.parse_output( output, @@ -122,48 +156,64 @@ impl SP1Executor { }), ) } else { - let (output, _) = self - .client - .execute(self.elf, stdin) - .run() - .map_err(|e| DatabaseError::QueryExecutionFailed(e.to_string()))?; - // No proof is generated, so we don't need to pass it to the parser. + debug!("Executing query without proof"); + let (output, _) = self.client.execute(self.elf, stdin).run().map_err(|e| { + error!(error = ?e, "Query execution failed"); + DatabaseError::QueryExecutionFailed(e.to_string()) + })?; + debug!("Query executed successfully"); self.parse_output(output, None) } } + #[instrument(skip(self, output, proof))] fn parse_output( &self, output: SP1PublicValues, proof: Option, ) -> Result { - let output_str = String::from_utf8(output.to_vec()) - .map_err(|e| DatabaseError::QueryExecutionFailed(e.to_string()))?; - let output_json: serde_json::Value = serde_json::from_str(&output_str) - .map_err(|e| DatabaseError::QueryExecutionFailed(e.to_string()))?; - - let data = output_json["result"].clone(); - - let new_state = output_json["state"] - .as_str() - .ok_or_else(|| { - DatabaseError::QueryExecutionFailed("Missing state in output".to_string()) - })? - .as_bytes() - .to_vec(); - - // If a proof is provided, verify it. + debug!("Parsing query output"); + let output_str = String::from_utf8(output.to_vec()).map_err(|e| { + error!(error = ?e, "Failed to parse output as UTF-8"); + DatabaseError::QueryExecutionFailed(e.to_string()) + })?; + + let output_json: serde_json::Value = serde_json::from_str(&output_str).map_err(|e| { + error!(error = ?e, "Failed to parse output as JSON"); + DatabaseError::QueryExecutionFailed(e.to_string()) + })?; + + debug!(?output_json, "Parsed output JSON"); + + let data = output_json["data"].clone(); + let new_state = output_json["new_state"] + .as_array() + .unwrap() + .iter() + .map(|v| v.as_u64().unwrap() as u8) + .collect(); + if let Some(proof) = proof { + debug!("Verifying generated proof"); self.verify_proof(&proof)?; + debug!("Proof verified successfully"); } Ok(QueryResult { data, new_state }) } + #[instrument(skip(self, proof))] pub fn verify_proof(&self, proof: &ProvenOutput) -> Result { + debug!("Verifying proof"); self.client .verify(&proof.proof_data, &self.vk) - .map(|_| true) - .map_err(|e| DatabaseError::ProofVerificationFailed(e.to_string())) + .map(|_| { + debug!("Proof verified successfully"); + true + }) + .map_err(|e| { + error!(error = ?e, "Proof verification failed"); + DatabaseError::ProofVerificationFailed(e.to_string()) + }) } } diff --git a/crates/zkdb-merkle/Cargo.toml b/crates/zkdb-merkle/Cargo.toml index 0fdd499..c84d303 100644 --- a/crates/zkdb-merkle/Cargo.toml +++ b/crates/zkdb-merkle/Cargo.toml @@ -1,8 +1,12 @@ [package] -version = "0.1.0" name = "zkdb_merkle" +version = "0.1.0" edition = "2021" +[[bin]] +name = "zkdb_merkle" +path = "src/main.rs" + [dependencies] sp1-zkvm = { workspace = true } rs_merkle = { workspace = true } diff --git a/crates/zkdb-merkle/src/lib.rs b/crates/zkdb-merkle/src/lib.rs deleted file mode 100644 index bc5d8f0..0000000 --- a/crates/zkdb-merkle/src/lib.rs +++ /dev/null @@ -1,6 +0,0 @@ -use std::env; -use std::path::PathBuf; - -pub fn get_elf() -> &'static [u8] { - include_bytes!(env!("SP1_ELF_zkdb_merkle")) -} diff --git a/crates/zkdb-merkle/src/main.rs b/crates/zkdb-merkle/src/main.rs index 07ab341..44bc347 100644 --- a/crates/zkdb-merkle/src/main.rs +++ b/crates/zkdb-merkle/src/main.rs @@ -3,15 +3,15 @@ //! Supports `insert`, `query`, and `prove` commands. //! State is managed by passing the Merkle tree in and out as serialized data. -#![no_main] sp1_zkvm::entrypoint!(main); extern crate alloc; -use crate::alloc::string::ToString; use alloc::collections::BTreeMap; use alloc::string::String; +use alloc::string::ToString; use alloc::vec::Vec; +use rs_merkle::proof_serializers; use rs_merkle::{algorithms::Sha256, Hasher, MerkleTree}; use serde::ser::{SerializeSeq, Serializer}; use serde::{Deserialize, Serialize}; @@ -70,11 +70,17 @@ impl DatabaseEngine for MerkleEngine { } pub fn main() { - let state: Vec = io::read(); - let command: Command = io::read(); + let state: Vec = io::read::>(); + let command: Command = io::read::(); let result = main_internal(&state, &command).unwrap_or_else(|e| QueryResult { - data: serde_json::json!({"error": e}), + data: serde_json::json!({ + "error": { + "type": "QueryExecutionFailed", + "state_len": state.len(), + "details": format!("{:?}", e), + } + }), new_state: state, }); @@ -83,31 +89,29 @@ pub fn main() { } fn main_internal(state: &[u8], command: &Command) -> Result { - let mut merkle_state: MerkleState = bincode::deserialize(state) - .map_err(|e| DatabaseError::QueryExecutionFailed(e.to_string()))?; + // if the state is empty, initialize it + let mut merkle_state: MerkleState = if state.is_empty() { + MerkleState::new() + } else { + bincode::deserialize(state) + .map_err(|e| DatabaseError::QueryExecutionFailed(e.to_string()))? + }; - let (result, new_state) = match command { + let (result) = match command { Command::Insert { key, value } => { let insert_result = insert(&mut merkle_state, key.clone(), value.clone())?; - (insert_result, merkle_state) + (insert_result) } Command::Query { key } => { let query_result = query(&merkle_state, key)?; - (query_result, merkle_state) + (query_result) } Command::Prove { key } => { let prove_result = prove(&merkle_state, key)?; - (prove_result, merkle_state) + (prove_result) } }; - - let new_state_bytes = bincode::serialize(&new_state) - .map_err(|e| DatabaseError::QueryExecutionFailed(e.to_string()))?; - - Ok(QueryResult { - data: result, - new_state: new_state_bytes, - }) + Ok(result) } /// Inserts a new key-value pair into the Merkle tree. @@ -115,22 +119,34 @@ fn insert( state: &mut MerkleState, key: String, value: String, -) -> Result { +) -> Result { // Hash the value. let leaf = Sha256::hash(value.as_bytes()); // Insert into the tree. state.leaves.push(leaf); let index = state.leaves.len() - 1; - state.key_indices.insert(key, index); + state.key_indices.insert(key.clone(), index); - Ok(serde_json::json!({"status": "inserted"})) + Ok(QueryResult { + data: serde_json::json!({ + "key": key.clone(), + "value": value.clone(), + "index": index, + "leaf": hex::encode(leaf), + "inserted": true, + }), + new_state: bincode::serialize(&state).unwrap(), + }) } /// Queries the value associated with a key. -fn query(state: &MerkleState, key: &str) -> Result { +fn query(state: &MerkleState, key: &str) -> Result { if let Some(&index) = state.key_indices.get(key) { let value_hash = &state.leaves[index]; - Ok(serde_json::json!({"value_hash": hex::encode(value_hash)})) + Ok(QueryResult { + data: serde_json::json!({"value_hash": hex::encode(value_hash)}), + new_state: bincode::serialize(&state).unwrap(), + }) } else { Err(DatabaseError::QueryExecutionFailed( "Key not found".to_string(), @@ -139,7 +155,7 @@ fn query(state: &MerkleState, key: &str) -> Result Result { +fn prove(state: &MerkleState, key: &str) -> Result { if let Some(&index) = state.key_indices.get(key) { let merkle_tree = MerkleTree::::from_leaves(&state.leaves); let proof = merkle_tree.proof(&[index]); @@ -147,16 +163,18 @@ fn prove(state: &MerkleState, key: &str) -> Result = proof.serialize::(); + let proof_encoded = base64::encode(proof_serialized); + + Ok(QueryResult { + data: serde_json::json!({ + "root": hex::encode(root), + "proof": proof_encoded, + "index": index, + "leaf": hex::encode(state.leaves[index]), + }), + new_state: bincode::serialize(&state).unwrap(), + }) } else { Err(DatabaseError::QueryExecutionFailed( "Key not found".to_string(), From bc220fcc06df050a36b133c84326e2a31a15e87d Mon Sep 17 00:00:00 2001 From: Conner Swann <2635475+yourbuddyconner@users.noreply.github.com> Date: Mon, 28 Oct 2024 17:52:48 -0700 Subject: [PATCH 04/11] docs --- docs/design/structure.md | 37 ++++++++++--------------------------- 1 file changed, 10 insertions(+), 27 deletions(-) diff --git a/docs/design/structure.md b/docs/design/structure.md index 5e26aa0..df8b202 100644 --- a/docs/design/structure.md +++ b/docs/design/structure.md @@ -12,21 +12,6 @@ This crate provides the foundation for building SP1 Programs that implement data - Serialization interfaces for SP1 program I/O - Error types specific to SP1 program execution -## zkdb-registry - -This crate manages pre-compiled SP1 program ELF binaries: - -- Stores pre-compiled ELF files as embedded binary data -- Provides a registry pattern for zkdb-lib to access different SP1 programs -- Handles versioning and metadata for ELF binaries -- Example structure: - ```rust - pub struct ZkVMRegistry { - merkle_elf: &'static [u8], - // other SP1 program ELFs... - } - ``` - ## zkdb-merkle An example implementation of a database engine as an SP1 program: @@ -34,14 +19,14 @@ An example implementation of a database engine as an SP1 program: - Built using zkdb-core traits and interfaces - Implements Merkle tree operations inside SP1 - Demonstrates how to build a database engine using zkdb-core -- Compiles to an ELF that gets stored in zkdb-registry +- Compiles to an ELF that is used by zkdb-lib ## zkdb-lib The primary interface crate that applications will use to interact with zkDB: - High-level API for all database operations -- Manages SP1 program execution through the registry +- Directly includes compiled SP1 program ELF binaries - Handles state management and serialization - Provides proof generation and verification - Example usage: @@ -59,14 +44,14 @@ Command-line interface built on top of zkdb-lib: - Proof management utilities - Configuration handling -## Additional Crates +## Additional Crates (future) -### zkdb-types (future) +### zkdb-types - Common data types for both SP1 programs and client code - Serialization formats - Type conversion utilities -### zkdb-utils (future) +### zkdb-utils - Shared utility functions - Helper methods - Common tools @@ -76,11 +61,11 @@ Command-line interface built on top of zkdb-lib: 1. SP1 Program Development: - Use zkdb-core to implement database logic - Compile to ELF binary - - Store in zkdb-registry + - Include directly in zkdb-lib 2. Client Usage: - Applications use zkdb-lib - - zkdb-lib loads appropriate ELF from registry + - zkdb-lib uses embedded ELF binaries - zkdb-lib handles all SP1 execution details ## Dependencies @@ -102,11 +87,11 @@ The project uses different dependencies for SP1 programs vs client code: 1. SP1 Programs: - Implement using zkdb-core - Compile to ELF - - Add to zkdb-registry + - ELF binary is included directly in zkdb-lib 2. Client Libraries: - - Use zkdb-lib which loads from registry - - No direct SP1 program compilation needed + - Use zkdb-lib which contains the ELF binaries + - No separate registry or loading mechanism needed ## State Management @@ -119,5 +104,3 @@ The project uses different dependencies for SP1 programs vs client code: - SP1 programs focus on computation logic - zkdb-lib handles all proof generation and verification - Proof artifacts are managed consistently across engines - -This architecture cleanly separates SP1 program development (using zkdb-core) from client usage (through zkdb-lib), with zkdb-registry serving as the bridge between them. \ No newline at end of file From 0257f31752495417c9d23dbe9fd62ac22c5f68bf Mon Sep 17 00:00:00 2001 From: Conner Swann <2635475+yourbuddyconner@users.noreply.github.com> Date: Tue, 29 Oct 2024 16:24:13 -0700 Subject: [PATCH 05/11] build cli, removed elfs --- crates/zkdb-lib/build.rs | 5 +- crates/zkdb-lib/src/bin/cli.rs | 108 ++++++++++++++++++++++++++++---- elf/riscv32im-succinct-zkvm-elf | Bin 308932 -> 0 bytes elf/zkdb-merkle | Bin 311512 -> 0 bytes 4 files changed, 101 insertions(+), 12 deletions(-) delete mode 100755 elf/riscv32im-succinct-zkvm-elf delete mode 100755 elf/zkdb-merkle diff --git a/crates/zkdb-lib/build.rs b/crates/zkdb-lib/build.rs index 663f854..edf73f8 100644 --- a/crates/zkdb-lib/build.rs +++ b/crates/zkdb-lib/build.rs @@ -14,7 +14,10 @@ fn main() { "prove", "build", "--output-directory", - "$CARGO_MANIFEST_DIR/elf", + &workspace_root + .join("target/elf-compilation") + .display() + .to_string(), "--elf-name", "zkdb_merkle", ]) diff --git a/crates/zkdb-lib/src/bin/cli.rs b/crates/zkdb-lib/src/bin/cli.rs index 0230e33..bf3466c 100644 --- a/crates/zkdb-lib/src/bin/cli.rs +++ b/crates/zkdb-lib/src/bin/cli.rs @@ -4,6 +4,7 @@ use std::fs; use std::path::PathBuf; use tracing_subscriber::{self, EnvFilter}; use zkdb_core::QueryResult; +use zkdb_lib::ProvenOutput; use zkdb_lib::{Command as DbCommand, Database}; pub fn init_logging() { @@ -20,12 +21,20 @@ fn main() -> Result<(), Box> { .author("Your Name") .about("Interact with zkDB") .subcommand( - Command::new("init").about("Initialize a new database").arg( - Arg::new("state_path") - .long("state") - .default_value("db_state.bin") - .help("Path to save the initial database state"), - ), + Command::new("init") + .about("Initialize a new database") + .arg( + Arg::new("state_path") + .long("state") + .default_value("db_state.bin") + .help("Path to save the initial database state"), + ) + .arg( + Arg::new("no_proof") + .long("no-proof") + .help("Disable SP1 proof generation") + .action(clap::ArgAction::SetTrue), + ), ) .subcommand( Command::new("query") @@ -36,9 +45,10 @@ fn main() -> Result<(), Box> { .help("Query command to execute"), ) .arg( - Arg::new("generate_proof") - .long("generate-proof") - .help("Generate a proof for the query"), + Arg::new("no_proof") + .long("no-proof") + .help("Disable SP1 proof generation") + .action(clap::ArgAction::SetTrue), ) .arg( Arg::new("state_path") @@ -59,11 +69,37 @@ fn main() -> Result<(), Box> { .about("Insert a key-value pair into the database") .arg(Arg::new("key").required(true).help("Key to insert")) .arg(Arg::new("value").required(true).help("Value to insert")) + .arg( + Arg::new("no_proof") + .long("no-proof") + .help("Disable SP1 proof generation") + .action(clap::ArgAction::SetTrue), + ) + .arg( + Arg::new("state_path") + .long("state") + .default_value("db_state.bin") + .help("Path to database state file"), + ), + ) + .subcommand( + Command::new("prove") + .about("Generate a Merkle proof for a key") + .arg( + Arg::new("key") + .required(true) + .help("Key to generate proof for"), + ) .arg( Arg::new("state_path") .long("state") .default_value("db_state.bin") .help("Path to database state file"), + ) + .arg( + Arg::new("output_path") + .long("output") + .help("Path to save the proof (defaults to proof__.bin)"), ), ) .get_matches(); @@ -71,6 +107,7 @@ fn main() -> Result<(), Box> { match matches.subcommand() { Some(("init", init_matches)) => { let state_path = init_matches.get_one::("state_path").unwrap(); + let generate_proof = !init_matches.get_flag("no_proof"); let initial_state = vec![]; // Empty initial state let db = Database::new(initial_state); println!("Initializing new database"); @@ -80,7 +117,7 @@ fn main() -> Result<(), Box> { } Some(("query", query_matches)) => { let command_str = query_matches.get_one::("command").unwrap(); - let generate_proof = query_matches.contains_id("generate_proof"); + let generate_proof = !query_matches.get_flag("no_proof"); let state_path = query_matches.get_one::("state_path").unwrap(); let db_state: Vec = bincode::deserialize(&fs::read(state_path)?)?; @@ -119,6 +156,7 @@ fn main() -> Result<(), Box> { Some(("insert", insert_matches)) => { let key = insert_matches.get_one::("key").unwrap(); let value = insert_matches.get_one::("value").unwrap(); + let generate_proof = !insert_matches.get_flag("no_proof"); let state_path = insert_matches.get_one::("state_path").unwrap(); let db_state: Vec = bincode::deserialize(&fs::read(state_path)?)?; @@ -129,7 +167,7 @@ fn main() -> Result<(), Box> { value: value.clone(), }; - match db.execute_query(command, false) { + match db.execute_query(command, generate_proof) { Ok(result) => { fs::write(state_path, bincode::serialize(&db.get_state())?)?; println!("Successfully inserted key '{}' with value '{}'", key, value); @@ -138,6 +176,34 @@ fn main() -> Result<(), Box> { Err(e) => eprintln!("Insert failed: {}", e), } } + Some(("prove", prove_matches)) => { + let key = prove_matches.get_one::("key").unwrap(); + let state_path = prove_matches.get_one::("state_path").unwrap(); + + let db_state: Vec = bincode::deserialize(&fs::read(state_path)?)?; + let mut db = Database::new(db_state); + + let command = DbCommand::Prove { key: key.clone() }; + + match db.execute_query(command, true) { + Ok(result) => { + let output_path = prove_matches + .get_one::("output_path") + .map(|s| s.to_string()) + .unwrap_or_else(|| { + format!("proof_{}_{}.bin", key, chrono::Utc::now().timestamp()) + }); + + fs::write(&output_path, bincode::serialize(&result)?)?; + + println!("Merkle Proof Generation:"); + println!("------------------------"); + print_proof_result(&result); + println!("\nProof saved to: {}", output_path); + } + Err(e) => eprintln!("Proof generation failed: {}", e), + } + } _ => { println!("Invalid command. Use --help for usage information."); } @@ -173,3 +239,23 @@ fn print_query_result(result: &QueryResult) { println!("New State: {:?}", result.new_state); println!("Output: {:?}", result.data); } + +fn print_proof_result(result: &QueryResult) { + if let Ok(proof_data) = serde_json::from_value::(result.data.clone()) { + if let Some(root) = proof_data.get("root") { + println!("Merkle Root: {}", root.as_str().unwrap_or("N/A")); + } + if let Some(index) = proof_data.get("index") { + println!("Leaf Index: {}", index.as_u64().unwrap_or(0)); + } + if let Some(leaf) = proof_data.get("leaf") { + println!("Leaf Hash: {}", leaf.as_str().unwrap_or("N/A")); + } + println!("\nProof Details:"); + if let Some(proof) = proof_data.get("proof") { + println!("Proof (base64): {}", proof.as_str().unwrap_or("N/A")); + } + } else { + println!("Raw Result: {:?}", result.data); + } +} diff --git a/elf/riscv32im-succinct-zkvm-elf b/elf/riscv32im-succinct-zkvm-elf deleted file mode 100755 index 3f52cc360fcea884e9f29d04a38c2094b2dcab6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 308932 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

xAW$1hPYz@jaX5*K*IpIN`t?(j0~tGi@KeNN zScX@16?Lx<+I{gxa53+&b|1jznxXG=_Jy1|s|;`0%^G(9cGI?F{BJ=cOMl0j__`r3 z`Jvrgp@(yR3SA37Z5u2!?px5}ODBMw4E5Rzc4qr zcc1&Fa(n*FJm-4OgBq4w@FcRVh_+vW3||Xx+K61+0H2zR-`_BFi6Uek^s#jcdwKsk zOn#@fm7Ct2mB=>e;ad1~dwb?=>erF4ZO6E87DIoJq6=0WL7H8gq4wuG5?M9pIC*C3Ej@`zOP{`8dPv=DKYg{IG~W=Bf#e zSHTZQG$Iey({|`(4E&Jq+{$d*7fRbl1Z}^HMedsW2Kq4Z(3_QFWt+S zeowbu@E~V&`<2;8_Yh*c*`t(8{W{869l{ZH86^-{@#sM>*#p=cfF1 zxc)tJKW$!Vct3ZG=j-h&Tf2dNn5 z{gM9fe~NY)L%nZ|H=NOLDEFFQabFSK-}4G_m@U|$Y8>y6O^p21q^rIVF=#%`{sDRgA6Q+ZF$nfe4c zIzV2bTge-AhSWLAt>^m)^KE?FD06~QEV{E_|1Q3GAF{@|YqL5`U-vF@2Jb~VQwsm2J3~T-K-Oa50LBYJFH258tCj7z?Vl{tk)M>SHIvv;2Ex#oyVGI=wrR@akoK7H|HDv zyIch~!0_u?4_VOoF8Iues|`}%Edob);exO zj?hq^%t7c8SmXJAKmGg-#K%eH}UJ zoALQ`=9L2rnWJIt0v0&UeCwTm1+dok!TQZs;LwiuxJsL%zz^+F{v8XkiGCYA{RBVv zJ>cor^z9qal4=` z3-HO$vQA0TAI5&iW$?a-RrcPU22H$oneuPoIt|_)y$abtn^Ifg+igR=l`D-D_EKlh zKeG>rePe<#%o(vt_>ALRbQ5jbW|${d6ggua;EYS7$a(o+bS?z*q_$$`IC#KGHO1bG zx1v{^#`!^X<3;}6_ofoNd1^wFB&1f{cPaY6ggjqPyFyt@QFLPH-34>HATPACj z3JF8U+YLn9-Zo%P0&3MO5U6tvgH@|sl`w_m_kGshCnO;Z_V)d~pZEPEpPjwW8lJV* zGe2uR>)o&D?zSnq{mL(p$^V(>K0gIMLZ8sJeLZ^l&`;12{-QhAOdvnf4pmqBbFRVn zJot4CZ@9_R}X#OX|-O_g$&rIEo=YlgaaAuW{Gsy2Ju42sx_&DRxC+q3IyUE|9`~T7Q4t~Js-%HC;LD(rwVzI-|DqDZ96(yA}?UYu55g zHTMdp7G&&l&LqPR6ikWRG`Hen=7}5};JaJ19e%wzOU=8$1aGvL0~6)#-MgT9c8&?wqG*dDS39YY`HR6)x#WIZ+y5k6oP z>gU+g?)3RUS)SqppD7z=Un{(6vTlsi^X*}ea_9Z#Va}`QRX5)&y1;Pf)z3oX?`h6} zY|Z`G@8Q?fhug0e>CU;xdNZg+-iOW$AINjQfvg|;SI#s&&3jqCdjHY;BxgN>9 zMt27E$EJcFhe40i7f|Pmx;-3vy!k8GCFQz(Ewny%b6(^t<+|~i2kc1ZIz5v8ZS3xW z*h&YKtz`e{B6!71z{y!hY)AV~D>e5kh4hiHyV-X`$HTE*k1;1f?8h%KrdL(H$mDtS zO`eXgqQ})N)glXPI15JE<;T=I+q)_I2xY0~@%^7_&b(~s_PfI)jnEgl5Z&ygr?=;> z@^Klu&qr_f@x-Zu?(^?Bfj69;cKXxC=x+^mo3?<{+nKK>`u~&2`)>FH?JxIfe>b$h zLTEqJhXdMQA++zkN4D(9Az69CoUnU@qOdliU-Gb1ZGW2T1=uWQawcfiM_&WN;t(-;M#&ae%-WIV1 ze3&+QzNlRE0mYBt9fKyq2cXFm|5wdGFTxh^-`xsmYc~AkcAkt+_>r4TLHlj!GCu9o zuLJEn%bTQt zINL=Bpj`NYe8+J_R-fZsa~F101bMnS-&wH&zEL*ZzV_cV_b(zh3$ZcwAVd9U}Mn|LPL_V9R-afiezwQw2WmBPZZZqB~%Zw&H`qj+izAdD>3jLy^z_0R6wF z0^xT9&`if^3hjSdAIr#?79fL#ZT!E8hMEM zy4r7h&kC)3+vpwm@+PQuBhOCI-31l8Q#Fz?qi5{fK|OSVp>Ht$6@vSWRmKDV8Mk@3 z{O<-^z}Fb~3atyCRJocn6k6X0{Ro~w>(0!n>!TgDIUpvrAV+f3`=_Hs$T> z8Sl`G@%;dk(s^b=<8|nc-h1T5di*(*J;D?JcO(PeAU68Lb?}O_<2&x0Ydv||^lfMp zU7=|vH1M+M^lF|w`3~P1giZq;J6HOA=Z0%2TgAK2cl>wvpW2{r#&r+REzEsQ75Oyk z&>^rZcK$D7P(O!%)uI#q2Xyrf#W%bd)Q^b~exI|io3P2I0~2y8if(g|e2FRO*K|eh zW+)v7e~q(qH1*&1b*h)4@y{{;+kKtt259_A_^S8rR=`)$6C!u;l<_IP!#WxV*`Kg^ zsJ-((+In2^)kGK@z2y%0hokrhG?VL0y^D2N1`j!cUXEP7=KGp6;>X4L-30xZczg;myO`xp(>gg4LRP zIWRr6OSh-eN1pVtA06&e-5Et6`#XVSwzSW;_0&1U`JR37+mX7x3>u!fi+-TtW#|vo zi;(lcZQ92-WiOm7|3@<6$Kq$}F0b>TVd{FiC-R!Z8S?ICUW(tfY`D_*n(#L&S-lUO zLROD?fV`8mm#kC#-WGnZ`bX|8o9LZ;R(&Ibma*2rqxx^g);_eCcqGqBhrD^Mfu?+& z*v_kCPum*KOK(y-u^LBoFYim0PORP^#y;U&WRj~#?gEBM_4qSBLjyUmrr(*}Rx*$h9DHaKVJW}3P!w!^Y@;N}|I zfwwHbM(Nhz3-9oj<@b2Hb-xY3bWn3Af!~LY(9VtE%W-rXJwy30lGL9%2Hj}Cs&7wY ztwxo2do^~Vl4E#>`7VnX*(Ba)YJ9&ydqkI^^)UQ&}vDoJ7K00i3XEC<9_$;Ep zi*4>KM*o#}wCKWDsuO+546a8-+_J$u(jFa3!U2d-|WZV#!meO|9=)){UP#ltw+DlIK(oM zlaohb&kFsfcwU4Ie1_-e@EyqWOUTcyjB^M)5T0**Ec7;1e4t_EzkS_c<{X;5p8Q#M@6D0}#NXtMMJ@|))4lOBq1m9@o3YG3zx>i$X9jTq1m{n*#7(;_d@ z-+)&9!NBD}uQ%Dcz5Pp!<4rGqJZCX5-Gtxcmzw+hO`5w9-D=t>^fbzHX5YDzvi6&v zkH(DBF6(gRFU7w$Jn~1@AgdOfoPpoAmU&*w`Tvc|hb48zPwx0WEcIUVB7TDZf_{h4 z&OfRcyV57DT+x3*5uOnfSyhF6$$tl#zLhcVM%G+{Z<+Qga)Iq8U}KH_cNbmTy*nS@ z8c$%8Hr#;Fuke+b@D=EHFFZkP+WabbIPx$GPY|0ne>S?oZs-d6%{RAcBRr*r=O)Ed z@U4YJH}H50@?|;lh4Rksmp%EyT#EkX?Dpl0|L#sc%o%dvy@Mxn>**K3WWYDzb#@;5 z%8WJe5Eq!Pf+xHKOu|zfV7dd|^bS5R^gG2-6ZM6sEEk^g z4luz}9>3W0mru$ACV0x@@D%Z%^X_g9FyD-&gQwu2w4r#)LFl(9PjQ5&>^}@l2Nh3o zgs1TCCV!*8xs#spc}g?ikeOpPTk@2BAx6aL1k{I0=fK#3k`3>9jQr2@G{CpO$&VqMMCVsIS+jj&qznwlF z)a+OP0pHkb^!=~UEpZ>A+w$q~l%Jtz|8S`M?>;n-^%@3TM_C_eeg`u9N3W>*)ETaF zqS24N1DX09{bk<-9~}w5>41-Bu(n^M?i;GEn=C>X%;(!Lu(9ExKbS?#jd{pNH)p== zX&{Ei@T1W1&BHY3 z3ciorgWfvQTkqz%zyM7W+j8Cz+TF=>0=#7xPjqSaTshbAF0n7!_ky0Q_G8R>TMrli zWVmzHxwLm2n-=~5x_`tDeVw*<=mz?MOBwf>?bQFd=5E`Lzx;E^#^JhSLuYSaMVu2l z8~LiL>&{ya47c;`r&{Fs+wo(~gFY#{n6k{9^D<=}%2Lmr%Q}fneVMY)GJgvu>CRN_ z<@|QVC!J~VlR>YkdhkcxSvWxPN@p7UWc&j|-7WC(>Pm1M`px@=&v$>%`a{3_!4t)I zAE!O&m-k4`bLyLmj_TgkL0k1I2ACN0fGM#+*Mwd<-{Iu#MgBI!vv<-Kv?O&a+IUBQ z&W8^Ccefe+@~(r(JD%`x)kX-JRb#5yzb&!<8N!D=+7&+J@gR?O)qB6+sc(_V=v;SO zV%tLh{m==@Ol1d~)EB)F|Enb zjVbdaZ8HDMt5lopOW}PfymB@%VCJNMBXI83BF&BDb=rqc0M874Ab##(7fe&b@a|R* zCSnwh9Z`O61rsp}$6lrU-0~jT%9;|Ra6jfbnRx;xS77=9`#VSL>=6Zrmn_ByBE0h+ z^p+J0MnnA5Q)ki764j6K8GVF3?fb<2v1L^(eKfY^+xVdZ#Lr)VX3j^}{smfkNq4R& z!gkz?Jv<8f{S3JMSLk36y6uaMZKtwT#Sh}V{CU1zhpzc~)&cy!aw6lM%2RyU)36)I zlN(le-x~H5mkkrWKRgcKTIDd^8FEzfNVBPxD?&e`iM^Z8qy<6}hN7e|vd-)NyCid>nqi6j|l_yuN?wHxY zDeI5!Epz?KXCtBK8?Ivv_kdT7^~#@lW5W02y!^k=hWx$}KD`Ehu!T13X=f@t z8u%-uk7cw2ALZQ*KBm68Ti~16W$;<-oU6qa3%YY&24?DCIbL%{exT|**S(=RqrS*p zEN^-|`?_1e4fGiQ-Q^y8_da0hl9@|PADuNHJ9yt#WckzB21`2Cy~U|J4L`*tJmfN3!>NnNGe1Jhz) z^55Ob@X^B~iBt20Z!6vY;U@B9LBlOGX{XMEX*c|Can%W!cEj%$&-U8s_mr|_+{s61 zOJIXf&pVer9-GM}4{p~mrrn>V{)ei*^YWYU7JOefATQ|CdHGg&3-+4-?rwPj`{#P% z)I70+RT~L(tA4YA2|ao_dbG?FF=}TqdNN}%K8rv4%KPCDPp}qO$+=bJAM$rF^0$@e z4)o|n=+Vg>Xyk`O-93vm=cRGj!tb)zhyD_Hu^2xtayadep7#!GJBRbMI{xTY#Ey}b5+C|-5B0x*FB(}n z{ZW3$R_1rvW9ASia?789r#r~md~9FlFoq3({Uwy&jotjN@CD@dll0SyJq<5@5xzM0 zZD?#T@&bBi+|G9B{m~uNy_fbM7$$qLlIX5sA7HaYdX-dYX3jT^ZO0_4)^-);zxM&`>MV>7Z{|@GsW;=zC9Dh zuX2~{*(4u$v*-r&9cGQ7VQK5C?V3F-a-yxPV!*P>YfH8BCNdBE@hDH`Ugc~~e1uKk z%$c_Du=eZ^*#8mm{SLnHb;TFlX8L&fF?iVbe4aE0e~-|v(D2uJLc@V;WIrZ(rr`&3 zrG8JoqGDmUY-28jM*)+>!uP(6@)38i>_X3hh6k71l}Ke*hn8 zYQw*_0zK+D@GYYq{A!5U}iz(Zp$Mt$%RXic2TvE@mn6C_5LaldF4b7$cP2!r47 zM5UK(C#C^!Nw;$)bS&o`y4r!K+%D}bMxUO>-&XX|Cf4*8+Q4rhy1|vdM}Axfj$h4M z!UwN>96k;{`|s`+mo~t0=r&gnKYI6n`j5V zEbZ{_-hLCj|6|TEEGMqSQ_cgBl{P}&Ik$g{Znpr_BLY(+atB|=3SgSP0+^QajxS>c zF!}FpIsbq1IC023@ntO`#=BYBh7rL-@nsF(4~=a=-avOlOS+w_xRLo;)9qXZFx|O~ zv0Y6&mHegDosM?PJ*?FVH9v`Q=$bDhgC9W#GnT|>%7!~Tz7KpqR_%&>v#&v~9)@1c z-U<7a^YIJ)MeV&HA3Su5?8UF-yo%oZ7<%)2-y@DxL>vh_f%`O6EJY&~cD6ZppNM<(9soqa+V_VyjWfQ;ok{&;C4L0(!VAJtfkXm79I z-cDrWMA`!{upPVaxmN957V`I8^OUym?|J&x4a_NYX|G~!uR>Nsm$F}6+CeruS3#E} zp-cbWeFl0$R=fBVB9`nKC{s^QZ-*8fbRubIJ9g#c&_cSM?KdH-p#|RAL#^6oPc?h9 zfx{o0o7e(wmjiLueM9fv_ z(tI29zzAr4V63`UyS3rr&HRS`m?E~B2G>!chsc?!nFw@%kLxiK=FAbqx{0>(P-8>=N}{fKp{UC9ly>>|mxQTn*# z*Dz|!!JQ&q@+8}tL&?2S+Rxs(k+leRaBm8CjiT?&Fu9{^b%%ZMAbEmJ?$YJ|%mT^N z!5z1z9vdd*Qc{jP0Qqf6lo&>>-c{DGN8ShOT_k-3?IrYAxl_sv@an+FyVvQ~hN_qD zTeVTDCH!$k%!y^O8;VSC924{xQ?WF)m(=Q%h+3}s~lB{^ONX)CUZHlOmZm2Zb${wFm;1x=9%CDuLTza zX_#!u>nM3py5Ne>a=6dHgKd<+b|_qYP6qg$!5M{&aKU+*&m)NZ@A{d6LZFp>BN~qK`u*xwn$1t)-u;TX)YTq#E0v$FDvdF4%B1reziwMbIzt>Tto+T5Pf@@9?R@W8?!0NRFx4u#JpyK0IX# z_(cxg$K+0uxS!K2`8mm36q9?vYM@2$z7p_L(^~Vj4liF{%g?x9gfT3F-WrdFi&r1D z&FZ7!vFdpwJZ|+-$s3i3Cdb%TFoR z@P!Wq!{dG!439m}B;S(>-!aMeWQGgAWkTatJ!@k$TNg^6*>GSFIK*1S>$uY*RH$-! z!SjvUOz?b)k~!qjYFF!RrhXVM1g7E*?e(lbd9n&*EyLp)fs-;Gef@&+N9}C#j1^8l z79JO*{c`H8KI(86OnB_o$859lm~E9Gbxh=29G($vJZ6jww#RP%Y5!P8%kc(DdqV; zIhy~Ii^8LUTgF1a4mcrWf{tiI!N#`}uq6tm4792E5AuBE#;n9T;d$`3b?_qSRmtkO zspjltSsnjNcUkSr?{|=EA>)ECLl@avVqBKj4tE3Ymv)N2;>rAC;^chu>S%kr+JUEg z-x^xG&sXa!weLG-0eowtrs%yXI##XkoZ7MJT+(69ybydg!DkbEHo<2Td=7%oL3E@b zI#Li^vIMW|SySd~V~_dDWNo3{@K{-sa(E1M)-_+{M-zqBM_b$1y-&Wmzk2n-Yk$6l z$9Xs&RCBLzrUzbw7qoW*uj9qQqVkahNW905*b~J6PL29q`8v_@&QV;#bfvv~>=5C_kWbN78ms$v^l&y{W}x zgEwXvwTjl%axDE8OTQ_8OVV!?o&!x4((h<~E7(E*9$h%5xk>mM zeEImYQqdP09wsN^apWC&4$F^AIpn5COWC!*5B= zSi?Hi%3OJC7cO9Z#=}<>zL}e39lGXA>7NbXQ+h6Q#yE~M2IfrGf%eDkU@iE6HS_i4 z4(1FQO%6@)I{u3V;=c==ZTJppTWex z679C8@osC{@Fe;fazDK$0j!&WQ9q-l$v=co3 zDfK<@ruz8bqVF*$UHHV@Dx6YttLsO?#phV?CX0Eon3oXxw23}#hQ}du$10f{lDwEQ zPf9;4ie3;N{|I_x;W6m=s9l53I4(6V*2G;G^U*iu-oz7feMcf1mAfnYd-{p!mp*T= zGbborE`Yv1*&60#u?|Udf@iDdLI7c)@*|dh5uJa8@O5PRQBUqi3*b-4adgT8;b-VzW^_BU*q8a{@1#w!)xyPv$A#W$ z@0ce~3m6-}DSa)7+^3%c;eYWrjA-y!qOcr24%xb=HY*k=$`(B-fsUMpRqjoYvp2TY z#=R1o1a^_tqEqw%U-eN1pXjEdt8~Ga-26Adx1$$)g0GNf9*%(< zo-R8fJO|xk0lG0Th@AFx=2De|8hg4)&5g(r(LEI$$Y_y4=ti=R4r_N}-Lz+rCC7|t z^)Wx6=6}g};16B06uuDjby8%rtbMiUe;r-9;>Ys8(iP2TJ=_3C&>zF2gUDz2EwWI_ zwE~gXjmX|RJJB(Gxvl+H=pLQX$Jh8@{QkT6sPMG<%1dUUxBOb&H<65RH}8^F>K=+A zx2|=PJNt2e1bOrCxkUU;LQma!o=?|3+VkwMnism~OYdGMFQWLlF^lxFo--1A`hXh^GxKS=nAINPow4-WD@r*Zh*GS6|Hyi z1?b)53#nIxciY%8ia#no)QJA!^9A2d!v@B8SKjX1-S>zcnJDyawLP`?T(H%&jRD3T zL>CJt3bAd@*MrzPk{jI=TKkmzyk8&uJR4gcyIW*Z<1yh~eT?U|GmS^a?U>OwnUi)e zr+caLp}_OUia!YZ0Ubc@oWz#3QcHW!y{z;8xTW>Q3k7cs@IgJpO+E0y&!OKF2kKI~ zGn>1&7Fhv%wiV#sSeZkmThgzd7gMJ96ed19iidpojDz1xuS zBt)M+BaT0_le%5934Y3b5$BPMNa18q?zj*gD)wyCK<>@W7u`u@pTa{c`WEYP+_4HY z&t@xKr0$b2liuAUp``j zuQd!A0?G*cmRI(CL*) zwko(o$+vCmHi4-_WWH~2-m&Zoflph3{OrIVI0zd`?m(8HfQ|bo^+L!gRMW>!FcVxi>;o`1?U`jq4SdH3=9wD~jP`3e`!)M!tKMSt$nVHuD3 za|(h=p263{!bd#5-tZ)Ia*{2Lj1>LO@OXjP`tdXl;VTCpupgn>3?)OAkB3-85?vOmSVAJk%jkj34iW5d5_ z8Y^|UhjLu_$)<4$@iXBk3gcgkJz@pL2PHg#weDd9gG1uqFcjVcOY5S{!!}Q4V<`M@ zh7ioS^udOS9}2;st|{m6D%o zrbXb4k!Bnj-&u@lWB!N~SbC z;a0C;9#_CW&Jh1JJ^WMmEhybp`=#{Z$3J__HEm^JOEPb@x_q$@( zUUu!NU=90m@I)ba*)1;LXB<2(wqEJ%|GsUdCA-^J#63^4n`FIxI(Vx)Z;*BGz1G+^ z-u{q6@dXE!?iL$Je7Ck7zi>7CBjDF^cQUxXOwC>C6x%$|8CxL!{Bm%MI3s?0iBqQg zO5nF;&eUCij=D=Gp60s>=hDCDdGkva)Dt|dJ3I+u7Agh>T;2LF`*i)ssS6Ewe7~>$ z|Dk*T;&VAGom}}zF8i0>b<=Yo4XN-QVe4NQy zo`0$Xrin-G`2KjF^2+qF7>~ z=(9oaSnLA@Z^H=BK8R;K&`T_LQ%(YXTVnW$+9-P$l%CM1z3uzRz92e&y|M{X-x3|z zP1gE4vGtvZi9Rf{nf7Fy#M1Bsl;f97`=asd;*0Kz`-*QF7*!l-bg&~mHpgO~#^YD* zF}C<_*1J#GguZ31)L7`>SY_&thx>h(*9>Ub*Y%bBi;q%%zB*v9i=s<`ixYFv(GGS- z+IAwxpk+%F`tE_#qSJ`JFa0_}>Jd*wC+41c##FGEIY0-SgAFcw(3q31eG>Wdf3VZv z|L_N&PP=fKemvh-Hy$B0T3`8Ij956ive6S~JlBFRv_<(viynO1Ne-!3e$i;%RP439 zQ}{)Dz>h7he3M-?srH|U4u?(sRpfh(?C0SBMYZ|DN12Bqf^)HXDeh0fHhH9${U;*l zwZTe9%#8k;{wcfMqmOq5PH#-5mW)H{F>W(mPVma-P49Sf(qMQtbTr$xO8vG} zjO0;g!Vvo6TaP~CdjxK0{$Lg357$h*;7okX)4!v$h3@Q{=)K~jShh&{E8euTm}}-s z!KHAy;Un;;hYoi-{}HmLM;x`c-Yk1cVqf*{hD+2|h-?ZbYHI{Hf<_&Dn>iQ%m8_Q| z^RDJG-XcCPu_utDL7^SN&2Zro=CYLiEc_;PU*PSnjKzaimp?_?llehM^?BBd>9$%Q zGmk1cpxTMkrq@ni^CvWvZeQAJ9huq29qH|SKgoWBwhY+^AG>9f+Dj=s%pN*Ki_I<$ zG1pq`a8byK9_e&;9@O#cV4s!KcO&)+`YO06whO!+UsE}}I31&Dc-LTm0RB?+b^Mcv5!#tYJER-*v^b=>Hb=WnTN$*6*bZq={6PNu_EU{X=uXBW z``TEy3^k@U#_~6hDgOGW8q<8~TgFs$|4f z`{b=kMnsVjg|sES= zeLreWw1>LSiO)+GD&J2EK5CjZr}bx0#xavM%AcX|MN2Smr(9#BE~zJ`u+FQa_~@Fn z60iPT@W+dXvzOM}m#gGSAXX#$9Yv-#=w8_+^SBq#6y7KMZd*r~?W{?cPSD%$*Lw|p zUBc}By}&72V^{KPMB{;*s5J&dfgXRnq>8=GR?V-~e&`zZ zHd{+qb?v!UeR_MFyZU{c`R?WCV}6u;5jo)LM5XWb#u3&?_wXnFUSBb&k|yzaH!VJ; zf5R5PNMhtk?b7Edp;`;FCpg~aM4J|5&2{601> z7>GR^w7ToyPFe?Fsm`=a#1;<848P8~V@cj4U{t6y#h}bLMys9%AJ@~5cL*IT1 z8QY_*$5)fgTc14mk)xdRC=JA{%s_WOqwI54M*9$ZO4XD7)yP;~>@Q_sVqe+V z8g_^{NfKL2{4XmTg~up+A%TAu9jePm+kFh+tRBlnKC1D?xBI%(OTEj8PICr%wlCcu zb(Jr;cNk5yKl09iXPtoi%bNa3~WQA@0s_%MA248kR^-iK8iBGbpRmCVp zClZ}Z)=6xCb=HORH?|cec5RW@`C@!$+-q*tXsydl^q*~N%(2Ey^b%wNXL6j4nR?`4 zE&B^N8?|C6vLQ1Ndp7rHbdgcfxt&;R?Bcl6h_*R97HK#zy~vX^}66E@+yXQ?06 z|39N2^>r51(~n*})4X?|^PW1AwmiMR&=G$g@-DWgPVq8_^Xn0-p)}Ig1mD6hG_xfj zdE{bmrvl^qw@$;+#J$JWYH_h8rg;U4na$In_HKUaJBnOx_XzhWKl?DX+- zGjMjD`DBeVJm3#uqfvhL zL9Ml8Q@c}R8N_*yJH&M($%Cb_cWOO(ZAIBDA^f<2v1a(bCT$-4Or4zr4s}*e!C4di znbh~sO9;K3EsVzB6-GrL4c|XAj1A%=>j@*g{N#DmPRwIvlyhi(%;AAe9o`(idFDCv z;Jf22;M?{o;PdA2?+4$v&jP+b0N*M3j$_@Xbne)mO#ypJkyekr$Q=Df@)d~Pd83A3 zZKCk~l!*+8*k*$nTTa|)hWeHQe>p#^T?8)X+p}}g6RdpEF-2A_`=+w#IQNVHB*VE z1$xXf+L=o3hPnGRV-o(yWyGI$HIv(@O-nR~v{iw|4%xd9HuiL^GCuM5jWp>}-(Hp^ z=e$>!y&w1x$OV+Sw=*0d9!A@V3ike{@VA{4?2!E5kQar?iFf)Cyl1S~5$`@m_T^Dpb*@8`Nt_z3Hi5sr%-F4SqCxDbB-%Aw>XdYYUo!~^#-7cEi$ne?9~ zxn)wClVVL;daj9caBn9$WKOI}8|8M=&cT#77t&Vp#G1(W^qTNJVCT;7drk7T^<0xY zat`)d6K7|)HOZaAULJo<^5%D~i9PFxha2;Iu8HvBo@*j8fb^QI?ugy~`Al2Z#40+m zCL$NiD?+OVY-Ig@MFd>l3yB%5WS+5+zo~p+v2e0bUzMC7^P66)BH70kek7=c9sU-} z*+H!!yrl0KIJBzt2_<8!)Jq~Gln#BH&{F(ldyw;favshR+YYfAl{ACUy=J#dIdGuP%&d%1I>;iHD$+=F>$Mgr@ zV%lYYVWQ~S&O}`kw~ik@TNZDV^li}>=`J?-egf!L$a z;E;)|^E%2z)%kq~-z;@I6`aJcV*_U!tcM}|Oys2Z+Xi)xDb{~Bc>%uC85>w**h{*# zQ^R}``-0ABSN^9SXM?-?Dvm1t80L&W=Uv;`uXIeoJ=n~#vleL1f~*e48fbky>i~U+ z66@I;vM|ds)>kt>;DDN+iOdgw%#SmFia$q};`fAKcAuBpZ71esFnT}pW-wQ(PmQ@E zPUXy>PoE1qrSH~7S+dtai`~3V_(RZ^Gy3v=@5%ssW{8iGZz;2g^M~nq$LCf&h4{HY z_X?MkuUl|cL&lsGi$`BK@bws+SvJV)5->Q+3y!J1{XF}OKZFaxwb9^O0k}5)yVx}k zfJ;B*EY(l+aPhy3jT4kRNbOAcu)nt?Hiz+Ekkak%4cF?k&OyH9XinCz0+F1@G-noP zwHGpWQ`2Jyp0;G&V{!pCSiS2Y$Yzt*GE?0J~>12ZgzE8~Osn>b2O>(J9d$rjr=AO6^9K8K8 z!>B)Jz--S=+cI(F zg7k@>ez`f&SoIwLQx=}>@AWX)S8ODhQ*2|k7n(H*uqFZ4B*2>JtO@tHm2n3e`;I@e zS$IHD&K)o=e0YMhnqhnmJI#kBJXUxbdSpNNBj-0x4O>GV_P*uLUs&eMAIe%C>15sq z8FkP$ZAv{k57!zrJHS8FMla>;GO~d@oD2DTZG@sLhrFFm4!G&}Z;(gG{sFwA-|@~^ zPCsJQ+1~t^IbH3^e1MOC+t}kGJ5M>^S?T$1U1T0j)b*Tiq3v$JAC6=$DswUqbUMKU z=p`%IPd3r)4X;x@SZfWK9g&TX=$y&_N0il>x$1$#-MzFg2#eaBdkCyBQs#E z+QxeqUY**`1$TtTM6X~CPF+ss`82)^PiuMQ1n zpLC9#1&>%ORKKzQp&+(Xe>+1P;ACV94(ZOEeCYbAQaf}AUF6rL&b$C?5emerw`L^f zWN57~1v;FMJ{k~v=OZolE;$b8OlGg_sN>F@v9f2j-I;TVytg|6cV}JxLjgSHPcy zcgfl+Jx+9x0?`q~r|t2o*0&}Svr3ZdE2Wu44KG4!N<^YE-Y zJxR)_R{pkxS8K9=;CS}JUqLxcsTi~<&u&~_}fHxkn>>Z;6Y=3 zIdqENa(;zoTv)>$0!{cVH*h{;!f_+js3+D3b>q2UAY6z~Y*v!JWp^HjUj}XNyc7Nt zdo()(zBmw>toE#aT7D*cJWuI$mz`_WRqLvq;wIpe+$rGh2y>9kJ3f3l+uQD%mzG5? z{tdX=))~21Y!uRdt}WED1p?yJi!I2u?3}N%ZVk}VZY^@G;#1=INjA`$8#%|jkaKO{n@4VCQluWjq<`U@Y&Gy8YukyUU z-I+RBbL#WPIL%Y#{aCDh3bF#c&c3uPwxu@U`Hvfn^qi2>q1}(a3}C(C&EVm%jofQN z4%i3zdv&z{*8ljY;1m(R_UM-AA7!S*zs`u^gK z6Y>4hpqq1Bnca{5ZaMJw;DBdo(XfH$unD{+Cy!LA5bh`1ktmln? zBYt-2P5AGP;tHSdfTtQ~2W!bCRM)8ZLl1g;#2hTSYuM*8II$kRk#&z`Zwy2pyjgep zO=uU}gS}ym$mXEk4}BnerB;&j$LGOW+Wa#5>4F~Z#sX%4ej8xyM4!(v1Fa)#j~hG3 zaaJR!@Q+x<7h`vB42m8Un>ovLCPpp0X(H>VK}%l-zJbBmH`iw*eh#b_eZr^2ueU$m zPjETI&dO?U-SgE>__5{SJ8?FWYo)1DbIpcQx8{%J{5SPT$y~#pO77FpT}H$_SW1pN zgWO8AgKk}eZ_Ny8>_Kan`9N=GZ>vu$#5IJ^$F!_~>fi6%Mi-O*Wj-Ws;VgI-z53>l zMMkSN2X{a1I(O+{-dgwYDJIxo;qmDvX;;NPpmV+VInnMh8{Zi(NeNd~ChZ^nZT2W{j(bM*_#HEzDI0c3uW_ ziY}6aF27J@!ty z1?^2EI{0`Z8ayt!b%e(ur-Q_}+7r=~?i`G=ua!8JFY^+0aI27Lu>s8G;yOo*Rs%q}x=|j(= z&-5PS)5eP=PLvqq;Z{+ZqE^EM948_a4)}Xd)e$#ri zTC0=FZR{#1bQYP|Aal^CjAtGUf9|_zsW*LyZzNHNY*>?0^r3j0xl{Ead+R?1jdb`FHW@U`N+*4z&WC5It=Hd;%Oqt_IY;wK%jW`>aQp<6~J_ zW5Z*oA5;4`u+Ji9X&JtrqsRi{gv4RllPc!|>}=|0Hjr;;!ZER3SuZ_eGT-DWacd@) zMRGRkv1)6)(@!J6`Jdp|FO^1;PwR4C!w%&hw(mMLAa=_dJ(e?*y}8A@^MiBo<80Jh zN1E->=*aN+PmU(gWgYR496LB5_6oj$CS=3GW4e=BL|mlJu&o3AVzYjzPj2NXy&RtLNd+|ev01pTl^#FU>U%(Gh25rT?wDR z6x`sxg9Yo+J94yyU7|Mm@sIyQP+YmNDa)QL=7$vblYz?-kTH8r~68?xh= zaY67{?A@wM-`OgPF2AVDfdck zhP}X2>nFY&;T^F>6`5jpM67GeT-x;Tobii1?}7J>3Aqowoi;Zgc9DTk#lWXx;8QV> z=i>8H`TAUIV~_E)9iAoe1dmPbSlCBj=(=?^$d?M;fdBT^k%Z@>r}c66Rm+l`$!9+M zie241UvjT=t9_q+MR(m+8$89&u2KfhKBG$RgJ5 zps7o~PM!hwUa)@HrbXZhI*nsx2yS=9g7a*N2^iN)E-SHPosdSEYW9t+6#6lojJr&G zZX0JNqU2^z5&x;gPaV}(J)GO=zEjH{ef+5so375V>_fz+?{02)GD7&P-o%f8$~KL& zYEyK_UTq3LIc>aK%@_GKx{XohOJpf$ZoGK6r$2t!o2E{8zNU9s<)^~$uXOCBC3D&( z_kH>NpVT?)I19Q8zHsF8c;)-X$IN=ohd0SS8{}@i+1cSNIQU`xkgP2G!P=GRwVL>C zg$^XIC;Er7@on=+r;^9!6v_E^RORq6Q#oPD9oG-rEg6sFC&K4Y8bp2|Tb8IiueLd( zQ}zTYpJTihdWj3v4=A6x8kGdI@upy?31aee^5sK%G^ z&^<$Fvt43p>fC_ehUhm^UvvR!1DqVxx_H77=n}p+>PYJc4#W9I#c_&eAyb)X5I zBOdVjuPcp&fMJsCzgS}^81mUqK!2@=n+}t=1Ua}V*ac@soqht&xZ#?w;S(6bo{d@m zrQ+z!O>2Jbe~GW#>4&{T3?n^ft@$STTA%npd{9S_Q7GVC%>Ej3ehbaTw9p`t!;ZP}kLZHu#0H0giMsj7mnql{P5z#U zwm;fg!cQ;4uB9IIFSdjD2~_M=?U{ximRh-@FRDIOeej##R%LQlc=T#wrhCwlI9FV} z`Y5@cIUkW3NUXsjw|0t_SUX=!Jh_dy>kj-T`0ldykPGk=;*>$o)DGqx^3`%CSH)eG z-e8)~(~kP)?|*y>y|BMGmYsi;vSRo8KCVsJWjS)L0XcI_$zjn2N0?dAs26|jvek;P zj|!BWhG%4Y?Ir)nJqX^MjA??e7OV0182fT^!(+=kCc2YO8XmB{_>=<1y776?Qdwn7V7=m2|t75(Sed7 ziNZ3$c|8ro+2Fsz`wD1x9QYVy43Aoa4d^#fyiK>k_1K_Lz`eLscNm+*gB0#tSw4OU zuE+b!cZWHMjmQev(1PRuB}WN1bJ};3?7{`LE=lNKa-vEf7Iu-8rH=H!s^23jH$Laf z!0`>_AP2|E#h-{0V;Td088Zdm433Wl$0av3xEt=j0pHUeV(6cUukd)da4=`>8zr}X zyHV_&#j*v@IdATe=S_5JWy1^-9jE*_GVAyWSi9pbxo;Fr&w9Zq_Qqr=yv_CS793E% zc-GITdsfYXr>A@EtG&>SH5^<5zKNd%o%sxSmc}oheezq@3!NFFf>C#j%5nbZ>+oRh&|JGyT-LK1PQ6@M)!95SmdsHtmU?lco`T%?E@&@HfLV zy*Q8bxvHPX`+Lv``9cz@V8B>|TwH@Mb!|1Wpz&{~5n%Ue1Y9{ajd=5f-{!!Z`&id5 zUMGA`F+3ZsOV1U)Xn@0Mz9w-+4+r-u9E3(rl=b9zk9NKDXx8(mJdf5YIY<&4 zd&A=l!oJZg%Mt&B#Gtp&(e2z^bk&sRe0+F7;sxmH1^h(GBJQ_L>9I#{3B=x7n-jY! zub=Xl^zW}FE|Iwr8Ptcb_ZfRrr-{Mqlye^>CS2?3Y&^;Pd7CMXHPyeN|u<-1fegjy-9< z$YT?mjjv1fN#E81&W=Na-%Ba`rFY*>CG$%h)?3S>ELkVVDjuMoq2lv6-^%?g+8{gQ zr9s{6dU43aUZ-+MxBAi7y!uUl_Uc<7*j5AeOLOduf)Rbx|8xD`_D&~hrXm*kG4?{I zHReu%z4hjnPfFU_u}!O!V?C5 zt@Yh~&|%9M$2y?3PH#C-a?Y$1RW%}!SFe3ZI{hW)kC%4N_ z1HIv=MHX_uft)$z|BjNq=Yb34Yvnv`SI!l3$q4RX*O8wk*x_(4p13o)6<6bnuf{LK zxvneJ9)JzB-xbrL{b0C|I_%Y>9Cc~)ptPT?LGPknSnKp)fXc>duKoxt^N|;v-ySPb9gy0!#LhVj7wuS|-;$FDc+^P;I#P5=y z<*w$=NX^@t+~X#DhZES9PMy{6G=aO6cjxY+{HBh26Mt6Ckb(FE;BN=XRk;RUR0=OC zHQc~d?)J0F>^m;u4m+2-_!8W+=W1@^8SdaSxQp{Xz8QKXxeA}L!Tz(19DAvFB1~j*??Wl7&@Fh2c`w@*0_v*0^ygCLj1AA+(eFXWd_C(3KE!RAGe#Ewx`RUG2L_W#<+IMdqVCRqJ zzRi$sKV{`aGPE+c&C;E=i}C*#qlcmsgeGYY{s3n;_mxh&iM!7;^vK;?nH$zObXaSB z+-i@s)pIZ8T=q2A3-8zLrKT>hIQR!;pLXxQ!I>`I54yuAnx=oVELll* zQ~tT8(z|J+2X7F6gFQ9MxCU~+)NO&-^g~(lv_sQ7>+|aW)0w+$R>@e#oRRU}`h3Pe z@2N>npwudP2KiyceqP^t&~y?X53u{=Kb?3mz(S?&xi|h?@H{bTi07-y7<^prb6uq!W^dwJXiU~`r53wy zFZ~nW5Al1bS?;zo!rB_qrww}uvYz%l{gC#|HTZPA_8iK~9muQV`?YX<4Q+Y#ozQJ^ zH*%@ybfOoFKWN!Y>fE-RcUQh@*2m~=ABxT-J}|om9>E%S#|uwJ8m+zgiSpZ4ww1ZW zfY4D&?Fztd3c)rUZ?0b z=mp?a9X6ehSJu@>-I|&Ds(2Iq)hS)eF$GUI0?RS>Z1a0^hVJc8k=T}xr?ltkUNgXZ z_zHTX!YA5`ShS~c2Zu&`A>KnbqDz9Op&4Z!p5hxp=Rbj~rDMUHv+{}b70WsaPsc=+ z&ad#Y2)b(`C(*U&!o>3;=1SJ#E&l3DMIY@0Uw8LzFM$tTYzPJWT<}2ASzmRZ*+JbN z@}9fc7-vfS-Y0Y<;iu#%>8{hLyMsh`N{LRLDii%je0O2?yvto1276`_>=-tYoYx(d_@yfu1L?1+7OT)|g2PHcg2YXGC86LcE_W^I0 z96D8w2;0)Gh_$8ESt0xqS@yNp_&LAgf!Ix(^6jNXn&inA{_a>uJ0o+W+)qA6i-d$< zHg^iIjLhQ<<-4JCjIr=a&K`#gpi#;z8L-&waPB?AK0nUp4IW31uBVl4%{%;x{i+wK z90Ud8qcFypS&V^4wb~ZKS_LmtF02(@#!`7rDjCuExH_UV}c-32oNQ$$-}mV(ty*a#>gt9m#nZ z-^iR7``ZtpBR+(#_{#y{!9QzG!bXOpU-5gZHlV{9K>cd;&Jg+n`=4S*Z_G)Y&$_SY zJ#&iY{^l=+JDO8)fX9b!*; zHd)%{Q@QD?;U{Sx7tK_5pyFl8E6;4hr2CG`+1Va840bwl99h(YpJZ?9|JU<=&dwzC zsj>H+{U+Gwq9?gaQd*>vKV+T_Y|Qfs{}H-8@P85>e@+(rnX|Z4kY9Q6P3->QeTkTF#Op&6CkJS1J3U7F-q_$SVTB_kf>4d~K|8 z#!~^eX15kzxl7?}PP&+em^_ID<@>zvoe9L zFF4}QcyN?l<5IS!_WGLLu>Tm$mko6_^&-U-s%QN>R&uK-Z~kMPuBSH8NZB0 znI3SIuI?L-_-}nU2KEhyw%&u|SDckg<45#*4~}2yec*@X&4*vcqD&7s8h&K=jUO(# zGP4C=pyh1NsAVS#%d(C0^=$Hd$o-W$qEAWNUGhnI5sDd|C!5gaJ4O8I_Q^SR2Q#ofim2-wuv1=;%y^`N6*$auk>)$Kk9n%tP z&_UOjTI8lfT5Cqebo&SFDf(%Oa|B7v-S=(1b)hxgSci_d+SJ{Bg?j58Yo==~!+vPR z-!evz%-c=;n>_><<0n{b&5YIDsJokPMsGb(_if`9^vvN|y7NkQ znOA?e=4`Sxch2rob;f;ORb{=LYoB*+~Hnuci*~yPP zohyfMR=!emu7roFXViZt{in$p`bu?%UdpFex61>lmBPU z;JFi@KoXlm`L!*3=OE7MKl#6njI-%}EyRh~#qiz}y(9ue8hY zrDnMJRU;c~feYP}yAtdXrtW+rr_A1n{((;Aa@O9-DL`iYtQ6gNL%49ydVHJfk)uDw zPo1fFVu8Y^d+mvw6;X9&FmB2hul{|wc)~{fog0XcZ|qh6E}K2rUil)g{Mgl7!($)$ zJ-*rB<2(IBukv^DjlH@J-TI8*VT+Gv-0GM4+Zx-F9i+^9v2}eMuYl$@bbF5i_aC~w zm&cm=1)Rzp)}wqI{Mw9|SCrXen^u}-^3A_5@}FAY=*Pa(U#Z{hYvnh;ACG@8?CQsR zf3T|`?|p%BeznZOM-KHwmMl|qrrnh&3T_LJE+h`izP>$0#79hMH6CdFPTg3MbxMX> z!9Um`>V{0^OG}{tyBYa<F!MAYQa?MS0L*Sp>t1SKM(Sh+}f(m zj8w6WoOG=6k0LcqJefORz9tIG)m@jucVg3*@EdR-yIMc08!dK0g#E-KGi|ABA(KPp z+gyC9>_Z|xi0@>KrA00|q(z$dYmt(-&<(Y+$o~Db5d|J>8tS%Yg=Fu;y4ZDV*wb{b z==p=}68uKk2J*eNVogUZD>KOaAkWW7f3030N$%qJmA>w9_OiS+@TYw22lU;c*uRax z7hNS>Sh%tEw$xzuAq3UDqMO(mjT<7?JM^`ZSUGy^oWtlRFEcN@`E9c1KE?Z{DrJL- z-jdc&Y;2rXZSSD;{0XiTXZB#nmUBYEKm5(GSMSUb*yTJ8w6hgl+wOpiC-5eIRrtb3 zUh}?l_k!Zx>@j8y!Nb>kmTkC#dsz2*-`Ss{%9alC$_C%*SysE8GYa^D<@-f`+4vxE z^rOT$@K<8=<2S60?WttnLgPC2$E}0z)+t?WPwjoOmo8D%xF3CceWIxPb>b!Kr5`7! ze7$W1x7q!%v2zv$9QMfx?~c8@>R$Und?}*4fnVGkyMd(G9nO?>Z`1L&6;bBSZ#9wQ7;M@5?^C46#oIS6pz!orJzoa)3RK1IuLp zqT;E-|HR+EfPQCoSh0Co{<@TJQ}{NQ{FYg{3-Cc_4>TUdW=>1fan_{2r0^`e_VKcL@?BDkKxzCF;KBgCG< zq+>s+0eo6oVcvI0DL$`^;(Hc@hq?|u(`ywI4qPk6dPyq;o+tQPAAXwo6x|8yUB4Fl z`u;}047K!Y=tlwr1TPT!#X)C5U>)$?g_gjVmB@#{>CmD5&*<0^=rUySog33IC*?Vj zAg{rPuQBZc{P{G{Ez~Q}EM9gC@F#`u$G=Ih#*o+^U(zbJ|1MLu?+#P4286z?Y>Tl2 zy^t z=fL;7G%ts3A@l&cn=S019mXkb{dZxV?qrAVl94eXx(6LUwhwgv2>fJjv8CIvZn0K~ zd^|nJmYk6SykO3!?S(E-3fSBS`~z6bEu{E>Tug*pL3ju>}5ILAZ^c#;B_0OYhhn(7y{c_&-f8S+NHQA6KIeZu>foeiC`7mA!Vea@cUlVL_6%^MatS48nf@Ana=yCV`9uTfi{*4iAIx@KDHBBZ!=a z_>g+wXJJ#@3x90v6PF@>2iieHbw~W0bnPi%%SR%{4khEfECH*C6@_uoyxR7vp-q~a z&eZ}w*Ef~0A4W=?lAN)Js~vDi>P`YHNUzk&d1*5QKRnE%cF#%DJ5raXeB?)6`t(of zZh}7bz!x&(W5V~VsvBfR!UqU?QQ>{Qt`4Gm)ya}V8PpyjzcfJDf2Wl{vqjn%dHGwv zEUTei)L+{7Y4HRP5<9Q%Y|ic4vMR&!1X;FlGAGT~l|^N1(+a2P(x!4!=y&tpa{8 z#|3^}546o2<*b!;XJsQO#(RXoi!r(92|nuHAV1Uh4gEOCfQ@ej3_)FWo&ucbALEd%Bl4FJDzc z+NI*BpNHKY-{3CDCP6&`??sTIgFwR&AE%Mb{Qt5JM!M&}Eh}@7mFWkNmAz~Lr$ko9 zGjw|-zNJ(9f}2k5-(t=Q|E_ll@>e6dmCD4s+h5AE`RRfz+i~jy_#EA23k;zb&%mh_~m-BH}G}NrWYGv&w>&7cC-)pm|NZ+ahMRhd=K`zf-fQXi_jmPZN#3JswIejq2gd; zaLV2b|4_XTbd%Yz8STTKztj(!m+jwc;i$phVx+@Ss)HQr;ta5_qkX{z&It9|chLEL zNrM>aHpEMTZ9!&e1AGTRX2`H{IYyAB?Syt&w4|8%XjePzx%*qYD2p%JrQ9X7E2UK` zky~%Ep`g*=iwU07l-^OW>F~iPvMSL_$T5}zUk=`WCwMEJd@k_h$%H3|ZivVl;K_-s zL3q1Q@;UY@3uP|IHRe{d!dRtN5FI*^Wr#kS>~{gr{(&uhfZy2DLi+R;elf&e_em}< zxTTfL@vRJSp7gKf@~`D5j?mIMd63V9cu}$j8Hc>rOw5B^E(NcPz7qX`JoO^~pUUNm zJ3^lXo~`}Xo7@WQjl3`Qqph%}gJgb$S73uC!jE3?-|Po_ydOIuS3=etySxc_dsSbu zj>vpyW=hN8w*;AS48E6%xKT1cHrb#zS+{_%Uq7vFQ-MxRfNc9*`yMi)A$Sr2u9BQn zoCz%WL*~`Nf;RtHCr2U+llPFDwKT1THg6-i5%MNM23Zb%guI8`tcBO+@bePdnSyng z;_6?K(ps;az#XT6ydc&qrzQ9;fed7vC8kZX!Mhi-Toc$?6*dCz4w>R2{BQ>mewE0j z0#B}x<7{f!V8A~S9|89DxnKf!^cu*Ta-|=W-bTdCcM&0elOn|#`vBU5hdQ`i#22im zc+V_~H!@Z6rRxQLl$1y7Uj#1&*aO~TKNQH|$BD5^t)TURdye5z4F?^WkY0KK^wtF9a4wu~inUE_&>4=}{w#ugCiDk#^G}WXV|?9@ zFWsmeAIN46{b66MgFZl}C&-zYL((5|rcp{qZGX6{b@lv`+amr5z9l-eMZbbhK7gEg z`%{02j4$+u=mU}_2S9xn9D& zNYM|ulWtxRr>-OB#TorLxsl?pq7B`yi+H^(^y9WLjzq@%)Q^|w2a*4UdC~h-=tufL z_d}SMMXxX~4@8aUMex}o^I`>g!${s=n3p7_FfRmuvN88`^8$X7^rdE9jo=4Iwzx3k}&e;z)!GO zrut)@;n}A(X!<$$W4zMJYv8d!%f+l-p{G-J8DIrEIdFHL}Zplg)0@xRE{ zUGZQS8DR~gzE$mst`Rtz=o%4k0=hbbPfo#)4grIa@l`od#WJ46wIf z244!uSi}#CP2Y{R0DU0%IWiVRrXn(lMz6SzK@5hJ0Kf#~MLzwKio|hctAb2OK8%%Q zl@`xJR!M5opa+KTt%k%t(ZwJzVnfEZgbwi{yXd%xNjoB9(vO2iG<=)%2D+(>PD)`< zj{#zS>Jj;gPJdTV_CJz6478Nk7_iS8=4V}fuL+H#?LcqF82Pci7fMmTl*9;y-yq}h#91-$ zZLvrr`ySqwBA!4=G=U^Tr^va%oK(`fH-C<13j`TmNa@H<`jW(uQyH4R!A` zXuRXddm%sdGbxK}7*i=|7x1mFeueIvw6E%y=V|+$Dzr&k?@7$tm;NAxf3nO09xxUA z6p?<&vVhkK9f6Ir7=AK@W>o3XBW$2|gx%5__(6`?*w7bqtB(Sw9Yx$X1z^Zhq^UV7 z=;nxDj;7-12To=~_7=S-cTP@;*|K6I8v19_E-p=)#bi8%t_J1YfsRfV-GR-l0&VYw zn9xBY=ul-Tt>Cw{5EkFeDqN}w$i0oI~@c) zf_6T3>fYm=I#aEFK|8)=e?k>xY6WCw#Gm*<0hwAKGPOQrW&!kH!Rb{r&rY ze@vciYw+p&G$w+-Otvr{QN&+^=&b&${xrg)dqEcz+PPO1ps$~NII(^p*J5o;3okkS zi+uzn4<`+{3YkK8#;7V5sQKvq1H-esrDSrm}RneVp0{&=!A#4(9uv3+YGzPNnDLbLx*&>B~hZbol znLm?019qe;$eY$8CS?TlJMfwC(7eYAjySD|6Ob;}>WWq-P~3<& zetZqS9|F1SusOv@2C3*+3F5-4!Pj)B7^@(PK3gH;ZUL9wVkw55Nb##j0NEqjXS5(kPI zu^Rq>n8QZjXnN~^;O|w6n0o;t=3O6=Q!D@X{MCCRrYGY0lwBouf%h6)nFIE3*FdjS zL)ycvtQN8U`eND$GG5(9iot#cb`+kQ+EKj48j62ZC*uG7k?_Z2?pNsL?m^ygs1`9V z2a2@$KZrDa^*?YXGK#6XNc^?m@#pI)rYB^(vh%3(?R$->%m(^B$Tk#wdK zkdC=eKTGkx)A79n?5-&1IML5!Ncc=#e6fUCSS;bcNr7%HMZ$Nxg}pm>L`=?pidh&5 zS?#_EK0G2`JeuMUhu}U8>!%sg6YzdJ+LC~>twg*r%AM~D_^U;p@f44J-aPLt;*(<# zUwEj9=huSw$Ji`HoL{~f;+o_4+ghwE?Eky=maHp^AG2PNZ8&qx=dubBf9o3&{}O9m zYKir6yOuwGl}Z`11M*%T_7CAYDwiC?@rGh-d@(Nh zDrUM&L~OnMe7PT8(jV#A>tp~w+?X&ihq#~YTRT0D%BJX}utU6s4T1vg836u*%2)XG zHbJ=xXSU8r;*%*tnqo3@)DAp}9p&Q$nodckaRZ1>nUc|xq;B-lMcvra2)s|~#trbr z`y@S|@=7VbGi596#6GK6lQP0SmC?h5l;O+`NFeozd`h5Slqj;9qY=<~kaA$#9IzT= z0DfAzwT7SBMZ~=C2iah(N|43cZmr^tA7MUTVLoZSbMA11BXJ^RS>_> zeBd?AX-SQUseXn1gCnpGC!w9t(PwC22YX5JOooWfl#ublnoJO}t0iJ4;}q;d&mfa- z5p#ol5WC$Td=_M_n6tH7dL{MJ@iI#oOODiM%E?J=?R--Xx+q?HP^Hx)z@MhQe=Xr_ z7~Vj{AKfozeWCl_v6!nM^ac7BP~X3jY(oAZ9C-1F!-R$@K>O5#X^UXGLtP9^vU+=^*$30ym{N7N9=V z^J6m4sTkux6(@6`Xm1DXwY;Drd)L`?_y>5;AoBnmaRKXKKSiImg3laaUh-1KNVcf> zCC&U;1HhLTE=9SB#7x7OE14YNBl1kilq~f|kMVv(bSF3mfoje#4e{fTT+_C3t)4Sr z+K=}|UF5FNs94!B6DDsr=0T2lzbYptcO2%Pl&fmScvoZJA>dFhA!iC3@JmNf4Bs5< zx*Fr6#`=jxTVjblm9$&J((Z6XTkD4LB+m`0=WWwJJot4t`AfH9y9y z5M@d&h%S$;TULg$ykm9!zXrH^FJj~o!0$U$eCB&UR)IRbs=;Fl@c_k44tNl>Q{zzm zmdOQwplhebSoW3`hnX_o5>bkaUTun#e=Tb+!}$yL<`-sB|dAL0ww!Y&Iq zUqJdNH((@}0S~N*$#{o(nE^ZL7Qpcq^pC(2`sYKVe{wOC7Y04rFz5_RRXn6-Wml3hO$|kJqF97@t)*??i4);;3&~Iv4Y+ElZeRl*1nZ-=UwNV)WOj`1v6!R#6Mx zRxSER>Y_l8E~0;sxg2WWGIRVN9Dcxi_(&SZ2fIR$=VJRE+Gr zipjf)Ig|PkS&XH&D;Tfs$V2L+te}@beXzHr7$6qbxN64hmQW{RNExxq^o$tUSCbH)d!|-M8kH6HrbFkNU7Ddw5Xo(E+psAR5R)4C?Y?y3T-=d>(l`IWkooP z#()8ya>`CXeBPaCPrjTjP)CK(FwTK|Y@3PcQN#X@q7oIh(;F$^Z}N&@Z$zX$!uICuiY^ow74w&p%3hZmOM@ zlQvLT_aVX=8&27u z;aoVKEbC3=TaM^!Oa=e{W4iY~f=|S!_o|~#IR8hG0p*27urndXR4RP45K{{4O84za zE$&Zq&Lc8QdO#~dXQM6mfHp0lwJxoVpz9IRsQtRMw%Rml`_JF0_G;78y6DnWg04sS zE@`(mP3o&nOZ!I9^=RwU%IZ>S2ik$=UD!diITAQzv%1CkhdpBn}~Z z6nc0G!6PBidxWN}NP|w9$Q_R%r-&gB4Fk_QoZ`gtI(~II#hw#WH1<6Sc*DA!qDw0L zm;@Wxz2%MM6|qiU=}j@#u!%!np#xFo5XdSa!@-Z)V4rOU>VZ8)fqH5(k>3*g{(K-S zJ)yYn)t~b}0ge~yxd7e`WnhmzS93v|AA9fl)nXCXos^HVP(GtUejB-nE-n{w9@el8 zK|Y)D4EdizK7+hw9SC`-LR&tOhgh`F2{`ux=wzCuA1w#JkA0@JHOd$cK2cuXgEpq5 zjQqSL@7Dp}b4$9dVXTWK+&Hvx_zuv6Vi7y>)ey#p$b>e)JsJ^zGe(fp_>e$>-}kwN z^(jfY#>h3`^Lq*XCq91yzuyh~y)pRvZ^0u-z^k7gA?A}uh~eWbVKT+=Z$y72Vem1Q zKv$*^# z=fmf6?sLd*#;DKKkFQf8?g8XFeG@-!eqBA2z=-%7M-emG1~?V5zU~FUUTxZ%ojyuR z8-TyA3BXw**%Wtt8~E!0A!Z$S$(Gb@NZzxN_b7TTba(e0K?4``Cj0UvZ7;#L5rDXK z1jnh|eENd^8yJ8O50LmQ5Ru=L`Qri5KL?0>+5-O@7);|XjY3}V;fCP7kEekTSEDZc zzSJ4-!H2)7M0*Uthog+OkP{3H!akLuE1$bG6M6GRdH2AFFEq&JkE=!6azI}$LB7p+ z0iMzt^Q&7Y>u?`!=*N!v9k4UWkNeR?#J;*I4)QNuf-%mNiul7v zaUVhD-2`8qa`Os*I!sL8b)~raYxVq6SIlD#csol!F8RzA&`L3LEDAV$B*o`gig@W! z@F8mOrsh}|cyGCuVy{RP^b&#h(dWh0DsCBIx~014k@vY1cH@xz!%_{AY2Cu#ur@g`zs!DPhHo+)KIr%32g zodq78>^0X!b6WkSRN8M}%i=nBYq8*@W!DdyKRXbW^FZw^CtkO5zV z4nQxAbaPrlcm>4wcvmms;n%^LKbTMG{b;lob1&f^tj1mw7sw@$=T0pJ zyg*i!Or`jxOC{VQBMH+4I$ZGZPSghIb`KlyV|s|#{_w$AjI%{PtP}AOc%N(}2Jd~J zdH9`(vj@y?z+U~Sr$i0un)OB{Y|R~GzDp+LVshDu7)7Q;b5l~otq1;De?`QMMLSRy z%BjZQeTunTDB|v*Z}pXci>8K-ob^zVD;F(K-j>gyo`(3f#O(eSga+ERjd;jsdR9bo>?f;1eQ-WOtavkuKOgi8b z4Hn*0D&f8K6MgL=&`BXJzmqmCz&}r*y=gr;sY8IPESg8t5$Prl{HABH@UF1F$i1D{G9botByi{Rgdd@4DgEb-$# z@SG}^aYH~`I2-8kKsU@W|EED?B#|mc@&<5KC*mxiNBi@wh?TvO@E&gv>s2gfXBF8A z{gg`w31dy>RR;Pk=&ti)`Q$(q%|X^W4Bl#i7{0LOXlHX>U#KShVPn9g*ogNi!5S*} z1CCI^E`qi~R^cVU>EO?onCmk~(MD5+0UJ?dCCIs{cc7yHTuWf1OqRmG*2<7ixk;s* z#h$KA8>HD#Tyh1@)M4xR47|Spy9nO%$ud8uBx?~{cN6Yb7x*BUGIxJ*kSzNEHYXd8H5 zAwC)Qu+oSYE!DRqfLnltljnGE46S2`b_+t^imWGcg;b8C(RYds=>A z#Mk4kR{;nfpkak0S$4z1XxU}LOEZ=p>RT63vFDl zf`5qXmHIiZ7r_P6fd9tcaq$0IJo2|#*)(J^;!mcH6;@D}r{(PfIrIViKYYg;zQx>$ zM76Lv$bb`M7)RI`j?^F~2K2#%5_#oOj8mVn3)_^0{fD3f5LVN(k zXA|NAkmpbF0Pi$j5C5*b0lkj{q4TtSWj*gxCiwp`)z5JELagNT^?U|+?aTlwuLL|_ zX7ACQSOs1gXYWY>Yi;xHBRB486M4UyH1^c#4Ov;zE2XA3i zLZ$3Q`7alVm|1&8tQGR6r&F58Wp!u=>P0>y_!0Fc?-6SpalX;cCYs0Rs!&!FZV~FK zyJEyIS|K9!u$gWWcKIMFJ7}F8`HXbw2A|TGOhBCU>r!^;k0jlI`(T7~bNUnCcmwc3 za_++i6Siy?(YNVyNgqYr>(@A&Fj~ZY{G*p?{j88~;Fi zWZdG96!-BXzBw&ri`MILi;%DG3iP_V_Ng{Xxg>A!@cDSB9UD#1#^+oUVcm<#d^<9Uu@HkkjU-%wq z@ytKr3i#j2O--HJ-mYOESISZpQd7{*_nh2~Vh7rYQWS_EC0An3@LT@Wq#?#0mr-oO zD=Mj!O!y;=vM~c*t-%>GHN>VvXZD)H$p@hih^6iL_8nVM2p@-hIS2c%Hs6sN8ny{- zy52kXaiNTTbw>|t#OM>;HpEO6ViEh-evXF-Tm#(F2qzJk1^jDaR)=dMP!Dj03gfJj zvZaLrpN+lUc!xH96$c1-ALTdT3dDf~eh|vk#e3A@wCUP1-H2TP_34p3AF;<#h#!tJ z-g87Zp~dIRXv{tF0o0BAGjhf-J1ZCZG|)8od5|$?{cAAS!0`mHrGrm-or{>>MfH3h zXfOPOnVR#s6PS>Tgf_?m5^3Ng4!nq#hfGRRNzO4yywV=vnsVq^aRT!VQb`~c3C zNUy5bT&Srdx-MQ;2>g$BnB)9;(pG^Fqpq;ibHyp3HKa|N?lmM< z7YKCzbJ_kV+w&b@N(A5HMr9|tb5j3CWmD%-whU#8GY}&)^Qqwb!|K%-5M6*~by*$xhMia}%ah|= zjg0C)>4Zv?JO%cPWZIZQUnAiNtxHZy;*!M*CIxf>x+gvb^ka*JVtPO(F@6Kv{F{0v z7WU$^cwX{`;=sT2v2z3)6B8Q<+W>SjguX-?y`&Ul{zduN=WHtJjWQLKgsoE0v;ufHy2gUDhK;sJ?nf(>l#?moXH>o( zp5aFby?b0P{7Xg*5?~bh6t)`8*}CRG3EUCgbg-+#z;CjC?2OVzh(cWzaz_e<;8)!AFh9 zi>ym6-i@D?C-A;$a{&9|hIkCxw6wW-q@MJ&d9cHZv}s8yZQW_f+O)z{;0fJ#`Q0%7 zpi|(Lp`Qng%AhlbKMwqJoc-XB1OFUlF#K_*Ns*4T)_#yWxonbR9~SY?QApbA0hWRP zo#B7cs`g$&3d4ilFgSZd(Pm;OjRvZujBdoPh^cmlhdBj*Q#QY0=XD=D*(I}g}V5pZ@M$)Vn(%`9ZUcDZx z$k7w%f_aX@DeDMew*az_%s{&)?xZ#dQrp5$yZaoiMD9jBRi!a`{Tu90l`ni>qFZ5d%PlIM*x%XAViM3f`xn-*g7nD>=_o%aa@>^n&cwaB|!QSYHF0Dx7&K2R)Fd zVEscUA%{*v2AzZ~rL7;%FcisP%aTd}3$SHLVat-jmZb+6QV8%Vz<2|kNz*^WnM$E; zyEKE$9e5k~3d0WcTF{F^u2h0vHh=WL0*kHQ*05FGeF)rfICHZx>=C#GpH@p?kh}L8 z2AS^xgUJS37?hs)Uw}c?cARtO#ypLHk0oFbv44F4gG?p%Ae&0DRm5ANZktf^AX@horpYpI}kD-tqzKct5NG z7WZjkG40YxuJAJ~61e)WVX*+P2);R;z~Yg2;3E}WJkDg7fo_0@Cg1uHcr%hMB=AS} zqLG+81kTxfLp>ithm5SXuxMl?W|IohckpOy3uR7O1sHREtFPe@>)Aqc+Yo#I0DCq% z*aQC5EH4CK_MgHYWu}ecQ|ZT5R@QOEc87RAh?SQz@K|i1N}Y6E|D3)x4-~#NF1OacHl}N zm*icb=nK%dLIz<=FW?RuYSSCOsTqjHaRxR?8@$IoLkvH7Umy8onTWk9wq;<;;(FE8)3@LwH~bCq zRTI41lr< zzE0Eirv&{ujB?JHe=3i(f!J}ieR`(rQ-#nc`a(6v06t13V)$EDW4vJh5`&&EtDqRJ z3Vlfual>JUqv3z1nS}Uc7@M20#pS8tUnBE_Ux-SR4?B07TE#AS2EV6g6kl$Rb7P4O zPbFq@?`WUxAbUZ^#hgQ5fZxysV4Rvj#vyeWadO}z;&)bZ2R@r6u%{KOkZ#C26bWg3 z5#l_jpA+6QzSpt#A+KhFU&@7@0rAICmjd6zf2>B;Fh80z;xb`arg}yPc ze+&I8L0^_tWB>aIVQfg>_`{a4aa5^@Eku(~Z26Xc%p}h}cYVRH6a9>n(h@rAO6Y5(WIxXr@&j4V%m{ohM}Os2Dt5I3e7jUcbm_#W zmKjdcis83Xr4sh6!nc^jwkJjc4Y@PAtuyevn>zCDL{BcyIh1o?|%CzhGhHQs`+23?J_6vYbo zG=Pr6_9QtghHbM7K4=r`$TOEN!9MF5ut!;o7=_G_o_?X8tMS1e*z+o!cVWzqfe+_u zALt7+MO?-CddU_s$~A=#2%eMA)TiK?_{1~6^03iG!e)BD-l^jxlzj%a0@zSfQ2wiP z9|?RyriVVJNWsgpRpg8Ya{eOrw_TX z3u~ZfkzsC(U~?Ps+K5~2MbV@k6@_25t2^X*v?~zu`$n`4?Q&8A-^hDm47zLEG@+R2 zfT7nRv@i+0gp~NY5&gA3I|O=F=~2i$h4o}lJtro8vaTo3G;pV;EU1o)_k|8fDkFZ) zQd>k<6dj~>4JVLtwp3gB-WcItQh^Q z#JQKy=|W#ee8VK?!9yki=R;pjZ0efwb9If^1L1=~%Lq^W1)fOh3B3WnWmlI8{G^rDZ`K_$D%rBFG-(>`XD~JNa`R7ORelb&ZLSj8wW%sjh+&Mt{qNtSI~^m`kuGh>*P*d-+J}bkT!H_wM5u=619}wvJ3c@EiD&13 zEcc(fi17c#LV({C!i;_aOgzJL11=Uj+X=Pj#1~(==I3j$eS{W4|7abqR#-OHH*O^m7 zLpn@V$4rS(3#(&laCju@uS5L~C}%LPj=21T|ZjgC-H#gYvcmQ##6E$W3 zm=8?ZwD@p#3VDGBPYn-Mc2fc#Q111~jsnc2;!f7lKwQmnH9Qlzvc@%Nuae3>@b@d? ztM?DSdj9&GxUbSfb7VY| z3C}7#heyV#V$9=|36C%_TE`9;?dId=>(h-+tbI>*RzwC zo0q$nhZp1J>E-3+?d9X;>($BI&D-7E!<+H;^!D=h_V)4i_3q^3=Hu?;;lucN`gr+x z`}p|y`gHPj^L6+2@MU~GeZ73WeSLg=eLHnR6FZ^$PAIw)KI?>6|1D_xSCp_32BxT+ zQ?;;T4IJ!>HK97Iq)Kol;mXD}0apz!ivlHe5_dP;rw0SeVu-c#=BDh@RT&Qa#te;g zq;T|=@Q0--;JTyVv=E*f@b#FhDC7SpGtsc31svH~*C z3yx`cr7h}HS&KfGH8glqLneO!xsH1JMJ58$0^_5jfppcOfgq^;!>5MF1*)gTt0P(U z0B~NtgQu(e3!V9*or```Qaz9yHI<@5fBsDK^tLFeo-t8Vg~k)|6_NfQWO;^VN>St&X5r{Jz zAE8A7A@LI@B10@1E-cc2g?tIc_x9{S&~8U}0q>%VT4oMC6HRlZy5R1L%M2IklLhW% zUKXACG$+boLwou*a3Cq{j^%O?2(q+{=ZIkY_xj^NDCc2KxW;9$qtVaXzVMri||1~xRkj3y7%x8 z=-I1xpT7P24;c8}pus}|hYkxGK4Ro3Ej5`G7Cw1O#MH>B=xH&raq-h(voS^!$T-~r@R7Xz` z##KA27}IzHyZ;Kpy*+hH|NlDY{}RBT#A)Gs4dxsyFxBw948J=xdNu@uPUN$O^d@*V zY4mLLRl3Pn&-7Q%7GFJoKv^vsmG=?93IE+tUoL*PZ1kLm-|ZSbf1@kUH`b9#z;zT? z4K82wF9BCpJzyF&MBv(r>jR#Zq83yfu6#USz}*w~y|_O{nhk!B!0!V5&cyGXxR>Le zg?AKWE^KT-HPm)N$cRhi}!5b>0gJWU|9~Z2Q2#<~Xhxd`n zsF2BEP5&VYEF+O@{wYPE(w`{wgw7K_|85TfE=Dc0l4{z_ycgHfrkB;LlGDos9h~%?dIB#_99NF_6NsCLm--5H z8mWv6gUl4FY~5Zr$_?K=Owh`jE{To;P0#=EnVu%p0bV{TDHlB*47jw{71vqW2DL`x z8;D#KrTca|?gZB);oeX_NhZG^pxpmZ2S81m{-rGMkM=a^9P*_ts0nx`ZTyUmwX`f= z_ZJcu89yCIl(2B*Fb(`4qF%$cm|}luWASo!mBZk%PTiLoZCY>rbHBug$&cpT zoBiE7V}m0a^RT_6LvE}NZM*X6IBQd7Cx^h-Pv-4-ocqdu@L_Wm-@#^AtM9H38L(`` zFYhlTkZn>dY?^hvAi8S5MGWHJ$DE>=7ACZ1%QoSK>N- z!FM6nLGwMM#E(y&7)HM-h&0MEpTF~uL)WjIU-qZN(c67zzOt7eAHGCoaO-|WKh8Aj z{a@Cy3y-EzcXrOIj54`5;zMh?$Y|no=ERP7C;A_5vt+_{2eabTj5Z&Jthl&k$xuVv zG#lf+*KZ!bxO2BWrDS^4{tdKdudTzl2lpOsyOBTq@WGJg-!16fuiwGma|ZjZ-Mb{e zS<}0lZr!;va_Z%Kzx)=ojj^)$e%^x_X5SC*@}&6Lo)>4#Oxs?YFfw^u#X0X*+xPC) z%WZmMTT-tuo60GLgMSYiw&4ehm8q2MkHof4H+DEadN@1IG)V5b<+r5|Z_G2g;lA=i zplv`zRk>|!=?>4XJKp+#G_l+mR1^5b#XfNCsv%=1uexg*GJNqd$^GEpJ5~%@VS2jK zwme|#`D?ugo*Xgy-ox$cA1swqQX=l&n#S&X@|$&Y2S2l4%zoVGl5Y27Z#~JIPN{?0t~K4|J?opPbgP@SF^lFOS#o%(@n5y=ESn$o>$r4_ zylsrjcEh*lPd>DHxAv!P-*r0ibGk#(7}=^)x~keuzv-EA>x{rdTe&_;ncj3l*>6%)<>1Kk218Ciy*AFmHf`PwqojL(Nu!L{q~7gkT6sGx*@7zg zuBcS=HoMZ?w%v?BM7!67-!;p#tLCfkTbwLhAj-6OwJ&bj!NM`M2Ta@R{~EUak6C?& zzDSB%?!wzT-!2V2I{Z>+(_w2*PgjnyOqp)qV?yFLA+fvn*N;oGGTV6S!i|ZQ?KT`W zJ>+qj8QyGe=v2QU1t(`uX!3T+<}r^fujDS6bU*y#rLwMPO9sxKYxZctjF>_b*FD9q z(j}!G>zgIrSvFcPwjy)yqRHLtPphpa`giYh-KFwYP}gCr`_{iO+mbEmKEN;Y*zgr6 z-k5sqv3p)74lDkpQ*h#p4`)=P|Fjx9M667l7W}M3?ZvQPEJvEB58AM1Nlw_dS)-@N zSq6=^zq!5dZ{2=S4*qCaSoP3Pp}5{`_>+nVq|$jvH;v zn|Q%Nv+nqncGm)1v|158r~Qy@o8&$#qUXo#vOW5+mHKrYPj86Nv^7bMuU_QZP4O%v zt-1BM?C)c|e;9AjYPIa;k3LNwl{Q^Dx<=LXPHInB728|%f6;5tfpgSvrasaei`F=q z_ImhjK>w|iu0C_VbEMbOn@wehu52iJKBT01-ovv$#_Y84ZEesm;MM)artRm1H$9VX zIHUv16Vce|+1NHzg(GT3fpATJdtN#wBF%{H6OI_j_q- z9slR!YG30G<;MLFtldjDOKdyRmg`V*FfgX5<&&UYmK}%n>TU8<;^GHC|C%>1V5r%w z6NdNZtXyijeEq6L*A&N_t#U20s5jd_WBS2IMKM!5S|u*}wMYGq!L>iUIh;^=>L;@$ z`##>R`_}G^-OIdDj%=u1$%4@C9?U_J_3QDLIXSri&Xjda&Wsf89a;7;tDv3v7D=b^ z)_PS}_nz7E!S=SfeaiX{{r85Ci#fHoUrW_s~YiyVKB?%DQ+wcg2rmt6|Y>x%|XT0G@M6FR$gc0$}Y zgD*SJDf!-f{49q7!F9E5E;iB6bKm#DZ!T+NFz@p67PpJD3tKy1^1PBv&$yZ}^xCo0 zlcJ2K_Gq!sr+MwP4iC32ztVhU^nz;xhS%Dhe|u{7;D<$XXTI6=ZMVJeXv0^o7t1^T zRDbs9dXJBZ)y<2X-()LKyHE6fXLaV|`DINL?8n&JUTJ-F-1|ME%MtMw6G~@&zh6I) zv$=S3(&pD=P1j^EFFe@&cZaue%fFrc%+>a{vgvxQ#q*zzY5UM4v-ul~XTP`GkajgY z@8GM0F4=R>n3g$dy)mpyBF=a8uIpJNp?aQLa$c6FKe z$Bg*kr>Qe@>f18p$nuqbVH_P-W6%s-xd^@L~0Xz}os);2be`pHAQwtc8N z@OWT$L)H-Qm`y&c1hE;wVk(&J#A&;Pm{9?)`2Rp5LFm zA@Cyo%aJX=bboF(M1Q;WjSFczn{Ums>n3h-KTdx1k*f2?z@~$m^t~)PVp%Pn&~(!K z((V>J3>5n7+WcDM!_OS@A;rtI_@U9xAG*6O8F{pA9@pv5rgT38rLlN%x8G`C)pQR& zZDGz6ljtb0Kn@(UPp%tR=QDoVKocUVCd{-j->q;CtOH zPuLCm?fCLtU22oxuCcYOH*FWpuPZnne}2gg<=L?(+?&m}ZDTcgMZrx&<7Z)qLVmW~ z^!;(O%o*43M|EqS(K>mO*}7$8?Nq0e+Ly7byM24Tq*nHY-{I;s)wgoS*Ssj00 z5O#Y)#I>Zv)EAMjzcp`LD>u&YocVNZv~w{*Nr~s(((HyrWHMw{ZSyTxN@nzf${8i2b!K)Z~W7B zpV0t(j&8kP>Cc{dxV~p0H{8Dyza*rwm8h);-gw^`8xRXl~y5(1(E0W7+KwQjJRvynkVLVX@nk1AXn% z4qop@zX@@)zFpkvWJRRrdaHYv9KxcSDJM(`7yJ;^G)M0dTN_Q)y(!2Y*yb}{XgciY@l6PNjzWMZ@$9_-qupDq? zz>#$)qM8m|vnY7}jU~IgW^Ju{5;D@l=(i%~ufaFg9jJfB(W|6+c4 z&hOtfD`+z9RkyLt_e?b~aq*ac*K)(w#S7KeO-~M27%5$D&oo=!d6s#Xinr}YHhFyI z?y>4-Jyxu||KaV~*N?mM(Z8J^ZzVA^w^}vUdz9_v%2x9_m6_?4+r4)F5R{emtD~XU z(k*t^UuqWFyFI$QycB%DL(Ru@@^#HQb2%*W#_ZC8 zse$&I4iip~^(qQnz9V!{jAXjC-NG{Up|%OTroYVHzT{eg`8)sOsGQxcO#Y%57SBE` zcLX#{5w$neMP@TFbMBhVf%nzT*H_FRr1YixHo4*w*S9cA&Al)=!sI)A zvsFK%YSZMAsV0uGRcF@Ntjv{1)I58&&-?C?${)P;(?P?H9>4i^P9NvWFOvbyO^1k& zwcOe(c&;5UEuXvpa#Itp^Lfv24!B}9=ElqVzcyRk&AK_hg^6KT^Mm)Cn9<3mKR+9^ zCam9{;6Z#_Sz5cvwv&#jERJt>9H<&IY|7-5Ei40bIxkN?S67oV99{)4)Z zanIVk_pV##`c5}$cJCCG9nrhz{fLYQQ||n*#qvPtFa1x+q!<$qWtFaX?UEd!$AD>Zga=21*+^pk^US&VD zxa;_B{oGu~TVw1hhRV|X=FQAe*Vq40zVo0}We;B;ktn1f&x5(2{zohGS3kb_OBCka zd1UJEKWw!$v|re?s`a{KY-pz4+mcfoy#jP|C`r%{I_3Bkm zr``1p`6d07{hoW55}I&{sXx!`P~P?CCF>x|s1DP*2VY-%VL`h4P6h4gXmeoTDkCi`gQP(WZM2z>HKxY ztG=yz)qK>z_FlVYUrO0@;L#(GnuSd*w*^%z>o%=_R&luhnc66e-S+0SynD00$6S_1 zuUkIS^x=x!pI_#T>rvU{X;R@IF1CGt9VZ$-?x|P7R{KeM3;(dVbI3-tcTQeGxc!_V z*A+jRI_8dAm$<6sCKFe;JbuST+j-+G`vmXJ8*q2To0>DtBQ4kU^Ow(aI#;~!aV6(f z=4{q(@2zg@q+Lh$@eE3L>>AnZOvNP5gGe1~7zi~6GdXUe?1S>mVJSr?PLq@ZznU<^%SNt)2B|jsInKP}FUcc4g5E!^~w< z&#mr#@%5ZP4x4oyXdY+(4?nZx<5uG=>#|Gz2HZ@ddL^!Vd1=tLyXKqy z6MNfVrAn3*?(?6gXycH4y~9-N5{CZv#_$bmZz*lAZg+N0>{+!_y<=}*%jpB?*;_kj zFX?(JE^6D%8JR&(96|@JDC_1PI(AXs`$Cy{j!oY7-M?R6oZC0L{mL6tj0@=DTX&n& zR?cR&yxST|sh-E)seE=z99?q0Mqp513!tVX%?u(D*j z)Z!cSSshK1)1>R>y!d70U*80_v%mDyHql0(1D9VF_j>F4V3_r$)v2ESYDegw-Wzdt zk<}jJZq)eCwDALe6O(%5zov~J;FUt$x*Gju(v2SQb8>^*iS~6;s>2uQ*Ui7opNb71 zjsMiY*f)Muj?ez0z2(z;f02Lla@)rFRZrKuHO`;qP;ks3j-%j{kd5~Dn)huVM6JM&-qo0auVzhSbj<$^yibJQrpk@m)#j4 zyY~9i_$F2L{q4NC!>9bpBOC4}_DHa8_{bwY_y!n2#fE-#bpU@4NnOMzSz}!Ij7M zoZdR->|bqIGJn})It{&CUDnjr=iOM6{{r8u%}+TKvL6>DRFe5Pp1p?eph>u3Q&n^r z^QVf_Q)PWv+;8^(;qFb~YRdok|8wrW)oqb>?cE3=Dnb%MhzSkZqoT-Y(?a&FV=(r8 z%{I1dBl{LY$i8LYvdl2l$Tq6`f4$G*ek3#B$K&_-J^qi!?|2;dKF{m@+1GRK`Fy(A z>(m>RN5~w#kgQQdSBAAN+&cvJ>)z={t-f99RD;l0>-8PE^eMe2-Cwscw@*gau9}m~ zIn9fN>NXdy97xJto#Fk|nsa}AZrif)KM$VecUC>Np99w`u0=j~5jDVR_&4L-*br+UNGR-tpF{UxDq7&snd$%)>_Rv|paMKGn%3+No&X zk!d4dZJQlA@aMrvmPe!h@{Rv%(T3Z_pIZE(>}>nyu>0vVFUI_6p7e3nlbrs}yN8W% z9J}-Nl@9GbH!(d}YSI7NqP6$>ZvNTHZe;G|T8FEQIy1(k+q?OHM6Fuv*ES{7>8}+R zYId_LHD5JgRl%0r=@v0|2_>KCe3x+$)*l65j!HmKGI5s); z!2NLTIX&8MXnpU)ct?xey;YK9Q&YD(%$a{Jb^T4D zKldLxF>zI2b1TzVH@2IPs1^NUOIDP@ZtErH8}b}%ZYGa?eB)8G_Er06uU|U4#$lj( zR>vA!PsP1ke01{Ty=~0X&;I=|p{MVe`r|xn-l@LGS~JG;*7W!(qqO}#7ykIB#NKDy z;XzgOe71%=tY|dP`o7sQyR9wz>W^RCxPPGP<5Fwu`VqEsi`%Updvatqy*+#%dl&!C zcRuF1B^-?HcEbEonpsWbY8H*T*B$;mUE8O--6E^P^IL8Nrf<4eFrwkHEe{Ua?TM(P zU#IXFBhT1lJEB5ZJ z6)%3Y%gBuUd)tg{&bLndF`~cs)yf6NV|x5mrLN^gpD5ddrKc_Lbqd@1qVLBl%2s3U z*DBrLbAJC_`TbMhJGE+WTF0+>%HHKpiKqJ-9HY8t;BePVv~t?e!13TN`~ql?a04=er@Z+q8fYUbbL zlaI!=^h_SQZ<_Nw$Lm`fdv9D+Ftzk~+g&zq@0g!mIJw!}!%i_FZ#8)Wu2&ViRP_RtuASdmz8>%<~M9smS;V8uASL(A>=EXz*&tJmo4t^?gH_q|(fw)S}8jhMt`J6??Yt4fXJvsS@xGfgH2 zAHVzf!HX4dDwo<-wte;da>A!Ge@)+c{9Uc)W|q#+BTtErt9KDP5x*6p2MWU@GM>#SjwJzF~8%{|rSgN-_TV4mIP!G~X1SdL1ox!dvV z`*AHYta4thsd95k_o0v1jxG-GoNM=P!*r(_nj2H%o}K@=%-hN9Q_ye=uZ`1Rs3Z6f zim`5^8#`E6@t?b`s`0*KSrb>(?W5QKwqvxz)_3}rpF)x*l=N&pMs3lezwNHv9*v)x zu5Ic$fB7_A@SHRP~wUkUFhe=UQh1I^Ohbe_=sJeRGSrS8I|#&(@qD zb*JUQpmEmSr*4=Y;E`kmZ=Rgk*0*lvKr^3~Gv-ywdHnKj ziv4ci9_d!&e@ysjmU^d#l||%Z{kROfqPcCB)vnckaqyPW9o+&|W?Mhlv`S6xbHwGw zort>K^sE-|UOu-=$lqHxoU_=Uwprg!`?z)EK?U(k=8Wy}+@@QQ%Y(RS6S6x!)!J`g z7*em{ua-Rw>#j{)bN}e0-iHcCOh~ld`oqU_CO_QpTsrh+U)!}aoP#|_X`jD-+Lx=j z%kRz8DwZyvdudny6rP%07;ZS^!M!TaM|h3v&}Q%4!dH9Gwdrx)$t!s5tWMK^?_*Qk zW!3cV>n;2r^lebJ-m1SHcGmp4US_8%#yuKlZ~oNwP5%`|?tVS0It}XXy3Z(V#`V66 zMZG2sYiPk|)*4tT`Avs+$4e5bUpsEYSIIhhsq>Z%-Mt2cs=~t>G6B=8XB7 zyEJlAU-R?Ut=@*7__JZ(P28j@^?5|b>!I5d{vN)|tBX||yProc4*IFnGUGSh z9v&LlYoW{h;P5zwdCNh&8=5qF_~EeS0hhh%*4@mHRc$@1b$;qr+l|i)&d%H1ZRktO zuLeTQz|+HAtHTa8!z^yi|_Hb=86S=*g|?0so+ zpx)Cl2OK}lcHiomUDsvJ)ehCR&nz}?xI1ZaQ?F0IO`GcUs`u|hZ6@@eHMYa(y&+rw zblXtmZ0a~?h25-eTa&tES`1hBxH{GRz3O3o`(Bj?^|(3ztcUugbp!pyM0+Lrvu%O0bY1TsdS5^MdGa7@(_!|b0{uIA-`~+; z>&QXJ?9cpCn78@qrTf#ib;`_qxX-Lwb*SN0F8_P<^Mq4FR?pgbQ;jfc@ z`IojKMayn=uza269$fg_lw;Lht_S$|yV{hyo-<9|$O+c`deRPCsQe&-aH)6Y~lwte!;1^b50j2n$T zQRQ{hHlmmZjHapl?Lkta9&Uia?FPp1O@ z@ToE-W7(}eKe{yO+IZi`+0_(Ip@Dpm#k^h0`Bjsb`E_@-7`%YLePeirs>#dFtPrTdJm}KFe06PZ&6&k~DWmUzQI}*3F{iQ?1p7|K6FxFo$&LE`98}Ml3mVRa>}%LdSYj&`91Df^^KM# zfz^BTxbJg+Q#Y%Y-kx)9n=X9q@t5`SZdOBj%_%*w$N8y~wSQK}CA(iezB%%~PkqaN z(e^*MuGT)@aOYP$o8x6w_LMzbG5D9Gcjj~{TD2^x%*lIIrsDDL9<`QTecyVu!BLB{ zQ#~g3Uc2?}_^HM7e>oFh^SM&YBAf9+%u zy03NAlsO-scRD|;&n2(NHiLf)Eq$K)ZuOe<&?MF2rH=fI(6Swao2-w%lybW2o`>d& zs(&_f%K6!JoT|%+El+ydOxPUttK05cS5{8`t;a&gHx6_D?3drjym#w~mbvfm4NWy~ zw0_vkNejHJqHIT|bh~iHdSWN5-=7}vw;Qu^@#R0qw{x)A89eJ^@kvk90ovpBcbb@Y zzvq&yOxkN+;IEgz__`_(Z8A1 zaE|NOqxz4Rf67)5?^JftYDcuX(bo9&lP4FRwR&8tw4d4HWJ{0epOd@ZC=1>?ww2k? zS&h03Z$3EW#q{PGJ)OH+b!w1P!+Pe#sK@m><-UG8$gXNYYU0wN>q?g%h#dLTgJUk% zLG7n-r>ES{uo^RCO`Tho_Dk<<$WC*&In!&o=k#G0ZC9sXxm>vL_dZP%Cw{IQs&t8( zU2S6bm7VRX*QkGZxmAD5u_>>ry_&o>eB1W1uTCuSvt2RgxyPVEGd?Wov+}u5KznD! zL9@{r*?av0J{>o6&Hc;b#2;46a(6_xpS|~OXf3}@RT{Y6KK75}(LO2by*BTfI?pMi zyZe5}q#pZY2KDQZ*l@H(P;AokwfLo~75_dgua!fU-Ugi?1+Q7Wdfxa3DdQ|3J1&m8 zY?2tQ4J`4>*ytHt$>PXiJ+r*#ExI>tmOHoUs@XR6>Ka&$Grd@6TJXr>MyGuon~k0n zTX}F~pBo98(*~Agm&P4CV!us-lJ}MQ$rgU#Vk8_pWN3+;(b{-C@$<`Jd-?_h;;F(&ZU#}0YZJya1|FUGn z^_|TO^KUQmYxwe_S*MrUn;o2gHJ*97*)NJ`O6#i6w7=eqPMlfP=GQtC9|YQ8e{(c# za|``Xdw%f!ywiAy+1ZzGY!+N>w|8AX{gEp#Otw1wY)jb46LwEKzW>>_ZL1A-jS^pu z@UZvVUic~W;*ej|X03wK%56ld48TssLhqsMyceHQ1$Ub|>TuZx$Q=JM=hCF&`*vxf@{%~6t+m~*! zAJ*CR3Z79bEO)-M!Oy&M zi(`Y7On;YAj%PZRhBkZj=+B~6xi2Tb%`+dh#((pSUQ452pFS{fkXL|>{ke13-n`+o ze~cI$Fy8-?Lt#H{!MgnE&3%N^u5@8P?vuKw;!GTM|CRQXBF^h_P~y+zy29h zH>`BE|8u+C8TJu7s$M%3zr0uTr<1+R{_%883#(%oJ55>mYrhTtRv$;zTG(Kiu|b?F z*1OT=AMD=W-Zd(_>xH1HdZ!OhJh{^4c1%dep2g{PQwJ>Xp49Y&rP;)F5%J!S(z=Xp z{i>5umhJyLYs&s>tteKoj2tp7j#dvTH0)%gEbm1_mR=mB7JoE@X%5|T!ge~;VUE3L6Fz2olX zg%_r0!wtQ0{C^aFoDh((w&xK1YYYGC;iPnNDy(aY9D&#Ig%t~QML6gk-~b=j|1I1K zRuTDZ5Z}M94}TitENKLO@CUzOKY^n#RsWaC@8=CpXw_u z7>L5cUg1Uk{#Y|eYYe_}lM*=yFTN+?75vn=uZ0*a!=)uT;v4u_5RP>NSpF-lFpiFD zHCR|Prx}2yX$kSMBjACstU-P)KN-u`qcqrq0Sk;{@Ya3|Ru3X+L*f&L3u}1=uOnmV z)qA}8pMsb72PeqOnYsNN#rNg?G~zq*NG_L$YYKcai!QxrNrJch;yyI_o$iOQr3cb7 z`%3TO%aM*sh!(RgSzPgmC?c`6Cfm=CSrwV&=cikB79AcLkChhDDKQCAp-o)53_q-c z!5M-x6U<@VYYNW!;Q9D8!RI7=E{9fvGX~#h;4=W%N8_^?pLEFU_qb-R+zy;p&}hYi zxZsbSjm_&A`zK{<(UIgP^^-fur62@rDeh?so2K=HB!(- z2Qt<366!Y9*y#9#)Il+*7s)Xw4AgY2`M~BKg8xE!Bqb!I_+$4EtQ?POUK5LiuyAIG zxCF${$cXcj%Jc@}ZHjmo;FIddGkjA1AdF}~4Ym)_3?Gc;k`Z0Hbqx(~)w1;up!K!O9o0ftj=f&6;Onw2+3d=-N=WmM8WFF-QrqT{{jtoJ*2YAo3Ly$$a*z_Aoi&nl|lh#osB@Bqhf_iu?DD^aQK=q8ceE3UiLu7vozzx8XR|6tblaaac z*pUF6T%aSa*ca?ckXcn&CpQr5a$_lfsqM-wS6q}ynMiAg2GgP-Atq?F!VVS)F9z-# z;!`fC3jIkMPD^z(^dBNc{nPLy_!mFOh}!}8v^F;uc`mPYaa@eH1Ez8i#t?bsRexF; zlIT7!;wZ5A0Z2EWAsW_E*;n8 z{L8`jIMf_$z3^p#l>4QJ$XnL0!lka#dT*gfTYuR!qD%BZszU4qY$6eaO(DAJwx#G4 zokCmrFjsW;EvZ#RM|Da_k*-BY(H0Qx8$lHzR$gjbwVDhDP^}PDk@}MB_QIv=NQ$kgl{&O2Ae_$$`Q2ii4G4bD0^eQ~zN8HBTZ8y=kC8J7?x_92(hE-9VV zZqwFdOj+Z~g{^bN`apDnSVSp|8MKrV6UG19EJ)a^h2}Nr0i%;*M^Jx`(KR|U4g(x@ z^eG&7ZD&B*ik}Aa3cKhLwIiJm|EepeBOv1tdu{xv1L#+wgjWG1(Oi$Pl4W@ z`TkhxS>XiF%3aCykzit?PjZuOfh zm$(-5I@ls>q+M$?SRagSYX*Gj0WqiuU0}S}$+3IkFh;_dOuOBrV9lto<4$x`B>FjI zGe%8J{*e}u$RtwU{YLgQ3SD4-p$pU`q7Ou&&?Y>QVpoV{Q(venzv0v?YWh>RDENl5 zmpVoag^@b?a#^^W5H@+DJgqBC?FWA89%;fY@6m&4+2GVTMvFy{Nd`1|pg?rXcip4w z4XUR}9ubGNyELjNB-To%u2mx^ihRLTka}17{$((Aue3BAJsLVM`7&(>LNgBBHl(J| zq##-|5`AtmdRf|&D>a_JQMV~=}Z!OTk<51ZVl*iGP-f0?*(B=wh#ciUtM_!cjjV8jHt@{t$e!_ zn&O89(!G&5kw~CES)4_svOTjjv2stq)?C6As}|}sjq`N8+bz!Zxjo{XSnj{6U#0JK zQh!QJZG!q)YX8(8s9&Y;bW*=d8rjys>5G&43%ReR{+s%G@{g{OM)u?<&4;KDr)Lv% zjclm@Cx0mn`c8KAo&5g^{d2^ws@zbVe)v8T=R|y8h;t*(-8fI+%*R=P^9@c_7Wyxo z?l>FaY>zVm=LVeFIB(*7g7X#51Mu%XJ}V(_YT)$2*%GG)eRwx~CgPk1o3Z$uk8=~w zESzU?-o*JB=l}YArF?%T&dQULXY3W{YbQ}ql=olXo8STtdG59k^RM#$uw%x?9lHLD z?Wg{4jT!2F;+Sy_X<)|;G-%A&zuYnT8KJ+y4VbX4PZTy28yt%c2b1gstmj9!?D73u zGYmGd*yRf?EK-9FfBK_w>-@!?jCfF;qCBE|D>`I0n}d7q*;wLGBrSCJn;~U zBD4{<)L#t7N&Sge8lDsWKe3k^UOGJC%DwoHGv*|o6XBHYBAD;;wg1!4lnVR|#x>!Y z?Ek@k6_%?w!yOnIn;e~fNG#i5F=)_OBJ)D9{F16XA1i+7%1wQOXDqK=In5}IhsIB% z8D->QG)6PV-QCEemQkO+-vlS_J|a|W?hV2sKRe>2_Nd#@P@GKCUairwm=-i|rt$j5 zCsanysKFz`g`H6Z51SmWid}CwVLvMx^JMOX@5JADfe9)-74=NS{6*N>QjFJV_){JB z6t_k=Wv0HZ4o*%VfB2JEDfA2s6l%4h!bs0pVX89Y%@r1UmgZKxwW5l`u9BmkliG!M z<9|{OQEXT4R2))VR9seEGr4YfLvd4an}4YHNby|tLh)KtsQRe*NBNmIsoAu7r_Qrh zu3R;0`n-i}em^i}r@nzWo6r_arYkMHgDU0xZy*KpMROTQdP;++@hAZ zk6)X%?K^bp92Fh5XRm{!f!fH}s!F3Kej7LC-!g1Gd(K7!qo&OV4xTmFJR$t(>o>jo z7nf+ehAv%J&$Fg`w-p(y*RI>JaqEFYIr_#X)=qvc+Wh$2hP?9`26pyUt2b}){M8%n z$x|v#wdyt88~FMKbqEgW+O2!f-eLVB21E}WlAJbX+_ZI@x9`Zlv~7EQ!jXCXs*ciA zs_H5SDtXU(=@Xok-jy9yZidc!b@T#NrnS>I>$|DkRPJgY<4&!|H#W2}Qrk9d(?mHy zZRlmA=c;tj;{$wEKj?X?j0_A70yH&MCWeiaetPx>Diec{_Kh1HVF9)JEyQ^{d*( z*hs&UrJuf0BM()T^!@%(T}^@vjoP+x2vT>g)ZV}-{e4>_CuO_#jg_WqBmE`@M&ldV z88lTocIPYCuQYMlz*OV(oN2)WDoye-vzfJdLc7)bCp0mrtqRkxVbs>hUC(mDjy};p zsG1m<2T+w*^ie(OMs342&&M~Y%sc6us?_6W{GuA7S4nATU^X|RoneZ9`g@~fb)t3K zkya*FCOr)8(tjS`PC2<%W$Q^HF8ccE*X!stcjXi7D(zK@@c}O8etP`)OSLCFOaD+S zSY@PAOf(M+ZkB%BU!PZX({u1qj5qaAMVWLrO5f(|RLMhSXrM6FPhUDQUuCYWq#Uja z*Edn|l}%K>NSwR6YNzp`CQgV;Bef|^4Gq%IRX3W1J;#-Ldiweb1AVoDp}CQxv7L#1 zB{Nf#$|^IZg@vUdUKLZ>@^(sl0|(ww;bNmv)=}0quE%?+ycPBN4T?>Q&8jWxe-xkf zN)=^Ft>M@)FV(#%)%SkbKXuNs6=yD7tYluxuW6h1 zJ^F<83y+Habvs!_-X$f^N=aQHE~_=k$zhn<|a;ebsH%Ci*GH&dT1ZUWVxtZ5@ql41-na)AYBjGpVBTUacB`yM}>@ zo?iNIX5-%(@S58CP=8gWA5l6eD_4@II^vHX<#&A6M9{XB(vHvKezutRCdoUa%8#8z zg=VnA-p0(Xjkv!#QB|1pkH%+JboEPduR-%unMD`kQ*6O+Oq)~i;21Z9*g97LE*oy? zzUc-&>D~!XhUk`E{PAKK_ASGMWZ||LS}|;B-bK$@Xg)`WZH{<9D1XW~*ZBRgt}lKF z6F2>&XvZH58TqY)d`<;??S%=(z7Uf93wave!TkP$3UG+?283Awc+NQ zagv7G{(}ce(?4z<>}Y{UCL&C6{&w7sPr$?CB>a~6&FiT#q06dyO3fPi=K;WbM@ZYAb)!Q0;*1@-~B7T_`;jJ;UBu{Ra|xhV^iwmcV_J0P0!^9jqr@ZHqHsO<@&c} z5LFM4OH#0>w-*<2O8hM+74ffleg@;g@u|szHTT7S*uU5(#){^$-zbRh_>DbdrG54> z{p;AWXL#54?ZN}ww`(8T6>enrBPI7T9|O}|Pv(E{o!X$xJSq~+>AsindIMsj=~u1r z|ZpP&5s|z)X&MfDVX)2_SGc*rcaRP&eCT%J^4e0 z+Lw#xJg^VJNuM&)zH`(ka%j5~RT^%NUIf?IGJ~_IqH!_NM7X^1$f#4>OXHF7+d~h< z#)!JkpCjsVWtv7SwGoX<`A3a-BiF`ml^!+TVj9`R({^>7P}byx1TYbf{dQMYZ6BYV6maP4*J#p+%f?scz1eq3)Z5kIBZ zGgT#g)#oeo$a|%e!WsVp6ug0&R~Q@em?-e6imLoD zrAlGQ>nrad6A)Vi@=>AIH&XCkF5W6HupaMjXrj;{k-X9uA{;9H)C$F7C0~g*pa7MM zQvn>0n`h;(e1wM6AFSY1ypcu`qQIOIako?G@rxAp7M1uKYCGe4N-v~Mp{U8XM$Rh~ zCPN^a0FdXXZ4?yGp>%!p^ynL}Uzx+~iQ`+Se#CXIo}vneJW%PW)d~Y= z)qEw_SXE!moANe#d}a7*F8HVy#b>}xGZk{cAkKh`NH65-)x(byNp%yG5@?PQg`Y3t z@O*wS{)&NSARbB!5B$HpT7&00^dkU%UjOn_l_nB16nbkQ0dLwQp{e%G6ZeMxrtJ%p zAn8v+;Eknd`~n|`XHe3ggy6E^&J*tYp{-NjLC1qO_RW+R?Vla{oL5GC_SDkTRmu{# z-2Hq_;Ldjs9Vyv4T>Jj>U4cz*3~BjhPWL0`B?SWemyDae)#cK!9wn~?p18D|w|m%+ zSKF2p3%vWxZ(C<&4qXvhQX=rV>94B|ue$utQ6(xZg%{T~EnrUjylo3hOa$(6VNc%? z7XA}9Xo0797#*t@-v8(7Ws?N%>UGQ~LVM^;i?SI4cdKz= z&Wy>O7WOWiFYw{9wG!Qie|nHowp`#@`=0Jwb@;(=v&z;9Jbz5e)QjPpK5i<@6!_w@ zjkD$@2JX)(%My5qb>*WU3)RyelpPXykGFSpx9U62e=5rnICI>nOQ#;USYoBk6Ij1# zo!U8OVc44On!s1*CJ$cX=C--L_O8IDXSs=g@BX=TfVM#3m-gm!qts6ijn%#qIB#l5 zf??jF8B4Uq0((T;J?>d$@8wE#!DUQ1ny~Tc} z`ZWHMcBtTfsngI_pPc&U{LRrwiQjLZJN)J`xZ~VPe3Za{{+ehX^_st3laCd+!|*pt zm#mFj(~3_Kc=C`jS)jbVoqsbkgfcq~mP`#+*F6t4s}3tYD$ zIC$8>mx^M6?Ux7ac{6j%bbV!sz#fx&{ATvX<&p;D1YM}*J?D?7>&%ulRniO!@AQ}~ zU;TNR+4F8nD^V|Q+W(fuJu^}1DDdQq8%Fl~AuxTq(oNvH_cE0M1+GWeD?J3Br48)o zxqQ&fY^9IDE%(h>zM@KlYqypD0&jA7k~Q~^-O6{$K!I-!e{dlF=)#wkRlx#()2Grs z);II?LFm3yg@=;rD^-Q}Wyc`y^xNF`=C3prmu)w}j{4sUZJBwyY`^(m?B#j8Y`f*V zw*NkFm)&psu6yYQq>e_MHRD#%-CN`DuW9663vOih+a>oh)4ZA9VUd~Ut#ltCbAZGZ z<^?-n|IWN$_GhaU?tl98oq50P54EC-%f^*55H}pcul%^<(52xn(onG*DbJX!lEb+t zxsmz4#Q6B1?x$sU4R9aJ=5He~o4>K;_z9SvyUXt1fIBdpC$aG4gx-S@A79|L2N>af zIr=cWEwu)_nCxhm17X_IzN9pT=lEKM#vMr`*|GyrH;{V}6^Xu;)c#inhp`wEcu}{5v_4@XY z9)#CluzZ{TLX>;N{u|=^MTZjc`#x-YOL=!1*Qss^kD0_WmET*B6t>XU2rqr&uLCyK z(0fw!QcW^F601eevm&?`a8K_Vyu~N|{$z&V{pq)3yPM*k?Xv&mQhEbJe2Y|c{>6O| z?CE|}w*RKT#j_Ck&8{@q((jpih`0wnzp-WeX7RVOZ<~L)X1fl4R)b$O8dlt9(aigJ z^+kW(zou7BPPRY%U3<*sQ<8O0M11frvJ}P<$qoL7%9m?{k(Td`nSMfp<42j(rAWwZQNC+?TPQO^u1p-WU=s=(R6D_@ zydT$~$3VBmC#9jhACxB_p@r>5`HFd$_-}dQhJ5oqfFEJtj?&DAM`;d(z8E?^XQDWl z*Q224LihcSJ_-6m=-;bX>!7O+{(GItg-!6Gf3GtX*FxB3!;bQxqPUtNKXRe_e@FL% zUhpq^2<7MDGObkw?lriU2)!8Yg_&odX-N4tLUF`%2F~$_lwT3w=4TdkAL!H%RFsBm z&;y}Id`B;aJ_&k7`Ay+lsn74LxDwc&tnt3X}42)ZkJY z^bqKoqF!NNu^cw}uo3PGDhP-C$%akt@iMJ&CxE(MQCtdObLm8xHb@GqeEn3R1N{iS zqB=ogxKRh2gZvWP(>HOYJPU%2=46@n6~32GFX=JRUqSy~8^E8C=2WLD)-`aCKjq9h zLjPWVxxpq6HtS%s9N!U#3j0lpOEK(hPfPtr(6{x=N*{ea^x2|6X65@ZALz@Wr+-He zgajhVN(p7iprS$NQ3?n`oFd9<*<2iNg69Fm@7~?*{}(@jIj>i%g2@U zhtPwdyMITg8xV3|QMr+O4fHVR%SHF!jMo9s^P&5EXRIYZqG0plN|{z8`teoWAbpag zf3I&?2c5fGaeqyI=0JCY9`l|4iOS#wY+|mJX%FE$@<|gW&nxEX&DURGAj~ev&I~{7 zmcUL<@AvAvFYFSpe?Q-PLLdDvdK&bp(EY{ue3K`Op|ATFeIN8}=oQs3%F}%4InaYd z|Gz1>kI-L1|F^d0h?}3~H~!rw05-ul%d|OCI?B(rC@xX3c?FyA#dQ+&Lg;~#ALaYY zb4Ll1&Z&s*R}NX*x5YN2|O;bJ3c-cED1SlCZ`f_n=w z%z%`N?3WlXHCa~aOMA?Kn~l$OeQiZ$M}1o^>^z=hoD<{X74@y(f}a$RV%X0A19>CO z-x9yIU2H`0VB+p>3Wu*SzY+VG|BO48VHn)(`>WzULIZs?^c?6B_>TPh=3a;LID^7{ z{iW^(#8wVn=kiI-;^uW^J3UU!A33h*%jp}`Q?bk9D#*p+9-UlD1Ma2 z0N6}|4aJpgm})G{3nHM;h8|XdPGyk}JrDXTu}(z%SDm0Rvnb5sitqm@eb=BbhJHy5 zv%>aH{*=Hj;9Z&4gz_Qw+qgTLp-#R3lK0=VQGe(mAHJXVFz8{>eZ+Wtl{a3vHX3>& zbg9mU{8!p3Z9CxR(x)Ky_+~)ZZX4*m)wg zFL&rBr5HcOI`iFU2pZUi!ghICnYIAmQ768sgXCWtY{IlCqyO-a;8_bsI7 zLw7gUes_NL5qco>sbZSGDHB^Oyi*8$M+G{yLtp6rCR(kn80YWKCnI3zVXD=ph+e;x(K9k9Y~`ha0YyR(lQi#BlSUV>tDr8a%kq2-0d_ ziE;J%uYNQH_F+GK>8rkJONr3uLzmjhH~MVohoFD2uh;=y9sK=zeF?f7bm?9wk?o5p z4+^2jcGPM!#q|7V9#C1h;m4|i&Zz77j(q#7?vWk{{Vwz{aSZ<|OwyyE+jfO6x__u< z1{cyNK@ZjGiHt1FA=W{k4P6+gD+oUa`smOv{qHyND}a6odU^%*k@7@^ggJKCYG;V? zPyb))k}uq(^g_G%AKg$oW8uc9uU4BwZj@OHHYZ7+0X;uLt9^*?73Fg#^u>|d@7_n{ zL0=BtL@e8H^5GTqsRN{Zs^Gbo310rrg`WPM@I9crM}0s1VCWvu14Z{=wOP7EJ5WR? z`DucK12x{h^}Opf=D2SCu`NuhW)T!@PzrI%^oDCaz zH}I}Au)gmAFRwmI3u%36r#vJ}Ye98cwXZ3u&>v_?N zY_6pSvA}B#1BP)t+5x9B(@PrGp#I?ciQeIH^%JQsls~A-$cKt6(pD!>YotrOum;P` zS;P4w&+$?q*BlPiG2*^8^a>sQ_7wm&gA3yM;1`2*d=zZU@E_nrFvW%JE#Yqlqc;O* zo9V)D4UW)gxO6G}?x}{FLM>JJHt+3N{_5p15=9XZ} zZ<*VHDZgdz2o7PmD|k7>y}+0XNQXWb4%Qt-+GZIbls7$R!`r6Zt2JW&M`7F{Hd`n9 zCzP*3!F2^w`l)}%E1=v0Fohp1aWvyU)u&&;536dpOz2d9j!O*0!E>jBF+OJ zf`4*-dJkS+L#KZR&#$Rt4$rzX8T;DcLtZ-FQ_{r%6kJ2nVJ~x2Fq=Ou!MdYJo4-yB z&mGU#C_gNI6XR=!dP95*OyS|ZTY-;k6yy65o{-*-@sILj2-u{7Mhb%G62T!pI!*9GTJ+_JIk$ESW(j(iy15;~NzMD=%+ z#DWY?2ZuqY@s0GW63co%I1lxWf~EdNfoJn+u#cep!j=9K%l3o7`OP%kY{|cq63hBo za7=TJh;V-qJaw?RW}W>12kZex^A*B#Q)6u|*h=C~;DDdRJq5{r1h@lOwqFPC!SF?J z0pf2jx&H*d#UmuG)7+y-T}tYD8w%hoWbZHz#4=v`&Sju zalIJs2u@)*4IIVrTJXo-8u(5J&us)-_0b4KycKNA@b6$MAMsFd^xT=!C-V_7rC;V8 za2ePc7byQ;ODyZfV9F1f{{d5Z$V@NXPuZ-Oa4GT#NW<@X4zJBqZYksp-aP!t&Dm(5`@{xZJ-Q~YIq z#<-{aGD61_7O#=K8^4mLG^e+PA45jxk#yzFS9M8h@7ilCfQ9j_D zr8;&1v*ByNx&!wE`$hX)j4R}S1epAz=LN*o8G8z^J$S|%o&TM{s6!2auX zdN??X;b^eW2Aw_x%*J;pSa%d@i+&fwPs2ruU;ZA^f0?%+|Hwai{x;>f7{95K{go49 z{B}_J!+paXF+S-M4`;%o^ezJjZq`Uq;Dz5a9Pxf8vPWot=b)>GRF!lEcMa^!=vuIb z;o6n4Mv&odU^j;8_k3@g!5jb_*c ze3xNsZ~?>4;A==PK7{lK;Y$v~Nn{Upm-OXe6U1M(KZP%Bew_m!V&Z=Z9LwbAEwI%N zUHTq@LmB=9yqw`8Z~?=gz-Bvj?s;?M7sEziO}s9C4Z&>qe&D>_I`=KWIeT;*2;R3> z$L+yp`*qw2oN_?NUBO0iRfYL4jo)LzlaSu#oS2^*B?jV9aNEF?zv7|bvcQ!8G9Lg_ ze#@K%q6qxF(%z0p{pE6$oQ~i`VA58UA=KEl(pEA>L5mY~A{u4~~Q|3bOKMcPI zQ+j2+1bhV?j0=?hns~NPEbDc_R30)n0JHr;6R_?m(w@x{%jY95QhRQ;S1ga7QhVMC zrt&J5^n+;c)SlC%@qhD4vHqD!{p-_HV*F8Ug!|vFxng-nN&d|TQ+Xz;#PC`$@uB`= z0Jz|Y2CnJgxft-ZY>hy~am0AfyRM)rxW(Xrp}P8a0<1cwv(E)bF?=2z!|)YwBEvVq z>lnTVwmPoi#DnLafM+oL2l!BeE_^Fw_6)?Y5*$$Zv;Z#w%l9`wfk%Ud{DHmzypqwg z!Q2Ur7#w^!1@>af^Ab3K(QkqGA$)}tp2`Zp6)^Gf1V=FT^t**E!b7x$_zeK7nfS~E zr!)48zz^UbMT^pN9Gt=E=fHn6`g`ypMyD4+JHme($$f1+gU@I52H-r#eLwI=Mjr&O z4fpnv`?+AN91VyLo?8wMgf7qLPJ_J|{W3TOI;y7-{}ON%SkC{Nh!~r{b-@vg`v&0o z$bVE@!F@k)))@_m4xWnwTbZXBN$Ew$1*$uO!Z54KMp*D;mKfXyW*kGO$Y0aBJH6KVt<#2i`4&HZWim8 z8cg?(UBOhpX?SZ@FDmgaaQclDZUimEN~)pABm&RiS=0y zZ#|gWE3J$q```1#`Yh{j!PLK}NbYx@$Cnct@p%;N_gxUn!vvQpe?Eb!ykz%&7sc|C z`FAk&2R$YKCS4NSzkEMm3a0j-F6pB#S8<0}Js1w*oI_>|?=sjQv8e$3=~>)`p({y^~mu&p+Uv&}F6{CCNYW zP;h#7Vtiya22*@wHV0FDWUd0H@MU%av+boCSa;xl9QV%@egQ60{pp4KXO`>Z{+Z=w zR6fWrFUfv3%7gMRQQ~|s<*%&QV#1^H=m_?|q=7XZJl6%hD)g8TQU3$d>!@}HU)b#48&g0h4zLkK@!XUcLe(~ z?z@6B8SVuRxuFX$9K7$Yj-$a8o_Hv@Az+HH%tOI!`3wi^jw0>f=+7vBGzzhN+HDf^ zkKVta@^Z)&(B|7N?z_^*@Pw+2)EW2E`+d@#j7LkdrW{)x&% z_HPUmKPu1F;GPdOQj~e_H*oAj9d7~KCSh-RSWx*~2d6*M>9@f%7=8fGWVisF$M7HE z9q zz_|>c2In(;9{if&t6=wJo%>s0wtYMR>y9FAG};H{Uz$Q}50kct_0LMG-*G#|{83B# z8!+WBt&^knGjx}jUp|t3jeTPLFs&2DpFv=XzmQ)TuQq}yeljoHFXo5LjSqGtQu`md4P2cbWu_Cn(`#aDyzZU$H*@yVNF`;*gK z?Y7t+G?IVU!Bl_dOZ@nbSpR(`_X8h@;z`Zvl>`;6lup~i|*A@e9OS(zdS$Ng!EJR!gzrEsKvOa z_>o_#Vhw%Z;JMb&Sq=gxDyoSxr{X$-+4yu}{G;CodXW2Da(z^CVT?}UjRY5_>iVM` zaL_vqhrK?9{@^qCA#|aDCa9Sr+`GZ+pB2QWMhoX+rWa0tT>!Lu1QcE$XW;YQ#@h9kjwpW#S2cy18b z7wsniOzE8?v8XG!Mc_0>KPIuPp9b$^^uHyR^^f3>j9v{zM=a~L@YNUj9e@iIeyGH< z-W#08=#wRu_32tnD#E|7oNc3EIqKMvL)KV;6uS1*PyfGPiF{TjYfe#?9t zUnzfOeu%G>zcN3=*K~$ofoC)PH#mdgkKi2)mw~exR-tKJV%P}$kYO`$A;UIcw*5GQ zbw`o5D#O%Xnt^>vG?EF=wE|CNxE+}FFPL#p?Xe5Ph6Aqq>1`mdNQ%Ro<_F?oT;FgS@0}f&I^Wc;C z8$-5|`;XvQM(1mC+$MxC>mJ~#jNS;m82-!giv+J@^daD5aF1!BkiLcBY(~!jJHWl1 zKj*-A8T~r=1;Y=(g|N4h{4;XL_`vJ(!wMXQ^q`su;k5v37`;9CJ>rAg5J67?`!o7j z@Km^$^K%opC!_BI4`=f8J~)NZUw|t^m&?<#7U~b9JAqa3-$x2R2%O32UBI0g|HpuH z8U1H)J?L_N{SGc*^h4l<@L$%SgE@sRe~Q4q&^@H^9c$zF2u7~~-UOZ6Gu6i*!EAfz z0rq9=`+@^T=<3H*a4w_I1ove0{oqMpjpTm;I1AiZ;>vYUf57s1?FW9va5VTH;%6w? z&jwTfAsz~DA$TZQm_H%@*%Hh8DKOP%ne)I@KV`lGruHUtKA7r@%=f`mzA_hpss76R zCz#4d=0Y&FKbhZyseENF0aN>zS%HF~_AIj+O!ZA>Q!w=>GFySE{mE<(rv6A~4Vc=C z%r(GN|77+6Q+<%RKA75%%)Vf14>C6gQ~i=T5KQ$&<_=)$Ph<`OQ+dhU9qf+slsODc z^+)FZV5%=N$AA;T`nW*#ah}Aoz63lBx{;*kNG$7T!RgR>Nq;A?tbYbmeUzE6E7m`m z4Zu`CWv&FK`Y5v{nA)0n=yP^p-BF}g zWM7twZPeWu3yH#pCy*{U%?cfcpyK)Z2Xsibw`ml=&=}IAwHPz zuVQpc&+&5Za~YlH3l|tB`=WC89~hnNOBp76jpx_#s{z&>MOqJr$-Xn#YNRfG-N0@P z_W`r%jbz+Y_=6ZG|E86*pUvoGzmQ?F-(SxDD5I18NruV(1vo@sS0DZ==l(5YPwqc4 zOzs`MFkfQayMpf;==`ezUZ>V^9Wa}IZ?Ntt(!O~p+UMdT-S0MdB>E?F@Dnk-0!eSo zxTpAZ0mmBR?+h!%`Z-TxF$|tt41Tdr_xslcV!DYD4!q9^b{~bm!(}bDcN=f?KeNFY z@TvWG1CuTu3a+=L%N!0S|7DH>v*{fS)*VIKc!nwdGr<~nU3}(&i`VPMqr+g;Z@Tv> zo`XHWX7H5aXHg&Xd)Nm`>@Tqxrh;n?CjVsa04D!r{t-<6$=nmn#y=daJMjJ$!xaB1 z<#;~W-9wk2C1BRSmF4U+!J4`{`<-B#Yl(+Gw+HOut<#T}Pydx0tbGKYiZzX?zF(-{EC6@JL;ET|CNq;G^tQUc){AKFCxS~DeFWIVPnVtv;O#k-YmsGL4ZaDT#|6rt1`^A<~m?1UzzKJsk~%v0%rT$0I=@B`Y48} ze~SSZGvyx#UI+j1SYODGMc^6Db@gWjIH-k=*MegLbi4`tk>Ty&|BtqEba9f{Lik`(4jv?{!Wlvv&q<|Nr;%o=-9}zq8hQ?$3JG zv!0uTXFp489|P<3eG*)JcJ8`XVM*V2M)+@6bkWy$DlGgDTQeN~qrt^z=dObk7XCJP zdUcWh!$;(gRQwX(F$#-(cZ7eFq6`0o!oq((cpLL)`&m|d+Blf|tFri0`%V3!We;K0HnTp`(kOv_Sbxzp9YGOX34x%=cbi(@!{d zm|x`gdvzf{iZ{To>CXpW^mm0mezXun>+T>-xRwJU44EG^;}Y(F-=8ZX7L)p%dQ zgtr0#qYuI7QGX&S{;CVXrxO3Zj?S;zjyDX4ukokh*I4-FU3mLhQu`cqjlT@uNci3! z`8jwS*pKHTCvVDo`BA*`xZUZej_}Ld^jcoyCn2w~@U0l(mpAXVyv9#OUgHpa{z&={ zc=NEl#(yU9kI+{u+=s5Qq~o-=42P%ji{RII8oWc5?>oT<=fSsv_a$7Z|DE8C z3QK(bw++Xq@$zR4(+>e(g1oQ4zy&ug6D%r9F6jEchaYj|X20_Vb->4txHWfTjLCJ`a2g*xPr1 z@35zT4162(kT0bCZgtqxzYmuB_xKKQ1I)6U;eYHpi#`2du(St{p8(zr7Pp>+e}coF zz5y)t@A31&SAb<%NBCdqu&2Kce5>MrGgyzue+e!=J9oVctjC}CDY}d=!h4%)ub+ml zvCvz8QMBjlplkd^@a?3>>!Z8D6Y$Hh?)AH1`@z3+yrp|AzpqgAHP8j?@kP`B+R?TA z@{5Y_{}#GnJ-%rAzBF8oC7i32{6nEje(Yyy?UCRWA1v_Wz(*+jc<@?<{}6nf!cPHj zQ#b(Y`f7uV5Bssey1wrCv5n8@8}@(J@3irm{tBK3OZY~AfPeW5TR#bb%6i?C@3r-L zlEbTiY4fuJEc;1c1(x(4=J3%fJ-&VD@)?7!F=Dk_Rr&RyYb^BTZ!hX+9J>s+uduO&Ne_~OQq{9jN0B)x|^e87D+eV+a*6`thxz2NiFSIgj+ z@%+o+3DUQY0?*sCO7DYCv~-)MCAEiwFZcCu5PnI&{Vc1!Loo3@nlD73e9mD@=e!>HUC{S;^q)KI>Awa`emq`EL%Ih1P{;pN zhdn(6OMX30!QTXX{m^&V(_aLZ^6+>Xtn2$saPir>>uj*D?+4s!%g49(mn(j$&v%c6 zcd4R_eg3y2;a#EVzWwX+y#cz$lC~A^Eb8xHpldAja}|9Q-wgjK{kjo;jlTiE#u8rb z;v)Y4gs!oW&wh77AH_d_U(fc-e=F`Vz!LC?{nDGYwH=$RQykI*wX{>wb1u-@~1iM z>0R(YL4UBLzrkToe=GQA=nrx9PdV)A*Ma{N`tLdVPaO92pMie_-S_7e8!YzpCxY)) z^3QSD)1L=k`uBzW%N_Rg^T7{;?(_Fihdupj@Ilah{oLlTr~eRq7<6C0kAAMjo_-Mc z8PL7{I>up7Uk6?X{V{wY^?R1Xo_-Fv3*D#hGKW3=L*Pm1zI?y#u%~|;ydAo)pWi#h zVoyH+{BkA#bca3tNbnmJeZpZ+p8;P4{jq!@>3^5Qp8h`Y-$VE5|BAz&eiQhUioVNX zPv7Txyc-AImv6&iPmjT0hwjU_0J_w+|nYNFpw`4QhKVA1cM{&w)?D*SJPMc;e+ z>~yLtH3RVUk_fb@LRyTeOv@CKG-*4-9FxWmrd`Z zme}%m7WEGSiA_yJ2y`h0zC2TOh*=lI{c zY>CMqYQ==hNO5eh^sK*Z$z*vvb#@!MeWEpV0sO zd;|aQx4}|Ahq?MY=x!UnZ|?`~!=6d_ZT&2(Z2?R9tR)hu&uhU_9=`q_@Id+(*w^10 zu;icMsW1H3V9B57{}-_2&+|X(K}$?|8~rc+7cAxb$3}i>?H6Dvzk?nAV-5;R`L!Kh zuJZ5O!?O1l^_@t0D2!O`FopjFy2e7EeqSL!ijRVSlz!T!!~7Z_3%|zezzy-M|`TzuI71lH~O?`W@5pNGOE?eUWj;EoRR zcd^4yLtjXJu3lp4U9gmY;^_ZL`;q#)!{J9gc!?=*PhSI;{IwkYIVwHAed+vdfvz!P zwOdsFNAV2&qx4hXUzGP*&;^_E)YY%1|BItbxKiKpxlqa93|-@If|vh8G2c4jH2jwe zi~Lne{>{@X(SKIq^1SYeMzc$)r)FC4}~zd*?g z{zhg68||4d-^NDw?Oyy_=gBoW}2i@D-GY)(DHt?a)eg59( zu%~|j97Ffzdy~VS{_o)9pg)l>B>($twAj-h0-k~{{Z;6(!=8RP`2Ely=jfXp_Vg{_ z9nc@^=odNc>F)-A4Z1JiFFNe${|x>vbUz=v&tXrmb=cnq-Oq=g;;^R&;Ge7bPjlGQ zyWoe?KYaS%;IOB^75qf#zI;FBu%}-KZbA3$?`p>{eLO1pr<+q}1v8O)~yh5%2 z90qfM_(~Q2I)^>|Wbl`u`|>!)VNZVr_-iWs4>|1VSAs=fdHf0R&lLan9QO1d zfotf$CH#`|dQ9J9PhSoe{pj%_VA0PW9|{)z>~S5e$Hx}9_^^KstjEVoueCAy{tQ^gpK~2PLWSqYH?3b!gRU`RwRL~DQhxDSQtLq1SiWt2u%K^(-v4-! zpDp0mD?AInRN?L5%a#57Qt*|E{z}2j=j>-`?R8*XK5qsWpPjq@60FN-`d*u#lVFna zxtj4_;xqMyz52l4TVmof?HPM?tzb2Od@We=Bld^PcWwYn`VVk;|A#Cw`7`4m^mnQB zNcmnplHN}%y7-GfHFiCm5>8CdR-X4Ckl9&7*13r!P zuM>XL$}P5WEUEp2qkAmBFH`v)#h-+Kl)mA^MfvQ2E_fA!K0Zyq*U=?h(I4{JrsRJE zU1OoY{v$>Bqxb=vhUpImZ@a3n|61VJfKNqG^s#&n{OE9a8jr!RaRxpQ{)>^5{Co=B z0Gsl5=@)E2_@Xvjy2oq4w-LY54}>rcJ{5k`UY)#P&wr1jdn~^tevj{iu5oRg^)13* z4ujEVOMX1Q7%chm_D|}hrL~WPrT#^KOaD3veJ<_&a)*Bmmh$rY{b~DgXFBQi@@Igh zeEfLuQLvP^vF8{Meg>BE_5Q5(Lx;n^O65oT?>E3we=QR1`;)HEgI_dUza+D^;bTR8 zkK#k%*YqcWb$K2JELXnr|2@CjgQDrDZ0qNZAAW^iZ1ehH6s6h zMHl&h8j-(A(MA3nBl6!-bdi_5&Z+X+1zqE1r{f=@{h9iv2I}C;;a`oMuMffY!}}GE z?y>y7OVQ7TE_k!5Pfh=@qigw7KVF0{-)sDF_%#;#qpm9W{}H-iufIm=2Tcs~3;hZu zzY@A&t*(msUz_(|V#+^(N&4S=6u+;p zZ>scN16^YYd*7>z{C@_z#zJ4M=+{Hn_$y$Y-kZS1XXmbe2kZ3Ss_2rw-;BsVU`rt_ z?eW22E&nh@_xU?lrSCB48aKf@eTkBn@Sg$J;jdP7AO58({0?-D2jEkwKcmlR;TM3< z2K(_#a&w20{{(c6g}&nxMfs27Ps2Y-zwnd8{2E^ezs3^Ysn-niYy2hnH5UG}75|OU zSCb#_AG*(B;gcR+o3#1&_<`V!@cZ$#;jpL2U@0Gu4+rb|ISO2SxZeV->*wvXcPT$_ z&)yA|{9cEUwEt&5Y>6o^Pk#ki>T9i|pP<5*`aK;i`PKSK=l?24w`p2pe(g}@^N-L4 zoBl_CmXD?%Fg1)H4SqfO-v>UiKb{G`cSK&W{Vb`y*U>$`4E$!~AL8WY`^G;O{9lEx z@h#ws;rIG@=`{8=*o>#d|5WgmVBcP!2X1|$z!Lu4r;6}j4t)dkr|`X`|AXMwivJd{ z@N504<>NDk!;|n2_;eBe;m`$7EGfndO~2UDMNU#6pR;!q@}u~@@Q>1OQ2duczeuIu z1bA%`-oHYZ`m&#;wXcJv{5}3QSjyMq?}4Q}J^m3`%G=|e;NK@cUmwe7EcWz6z*7Dm z9}1T8^|%g}^7ps}eks`dzs4N)^b9Qd^Z0bI?r&#+i_gwoXMuHpJ4eyIKCG$od56#y zmar~e0AB+CD1Gf`it-kDjsFIIjfH;u2*1Xc!>_UMpa0n+{EtAtOqIt~;Oi9r6!<2E zuLIw#@Rz{4{B8snpPjpI2J7!8 zjS9aCyjkHlf#(#Kvf1#3BD{;B>-3D$-vwRs3;p#<{=LvO7W%zkEW#hf?}uO0F9)CW zPs8hhg6(IC`K9sQj$hM%J;JZ?z3^)+au?h<9KOc?4Zp_A=Fs2&%6c0~@%FM{9lyrM zIDSuG2R?#JHjm&7KYw5TZ^QB$p9#Ol63$x1e>QZDg?^c$zZ|;8LcinY;rKK@AAXI6 zf8*B*{x?F`Sm>K?Dd?m4Lik7NHz@vhK-XC0?^X0mpldAj4PPIQPvgIVU*pTcS5V%j zKT~5jgD+87!aL$y!{H6#t-I6b6#oOEYb@cd{*U4CG~N$>jfH=Dg#V;(56f%(2;?;u z`3r9y=GXW@_%#;(9g6=CpliGeEbY^Nme!sOJ{RoQOEx&{>CXqhQ}J&E?@<2i0a(i0 z^G|@KK0KZQKhhz&|7IJw`0U*E60p|SZ$bY`f4pR=wI~1NQP`8ppZyZBq{rBA=;u#^ zrMy-zvHZ_@H1;U@Ka5Dk9{ny@^51g!JQcqmPw!FX^;gg}mb9M#-Qn`r`2Fx}Ec}Px zHq5W_2jSQFqu_6oABGd7FTMr-7MScC{Gc;g|4?)Z|Dx{?hp%w}zsACU-3b5TKNyzR zxQ)EVB7g7g!~7cm3H%xh|2O|@m|x?g;n(;$@EzoD336UvUjCzDd5!1b*I43PcE>Qk z#xI6n<8#3~h|hjF?*YC+wddD^rMx};E#Pk`d=Xgc$J5^pmiqJfQt)>a{#)>E3SR;K zp2GhC{(-{RfNxj$GvFU8d_DL_3V#JG<>%wS3H)P){~dg%!ncBTfBZhU`0U(u2Uz#V zyC1Q{q<1MyVn0QXTw?NL>I-}pSkmY5)nG}V$G-wgdOUvWW9W}yV}B!m#ABD3^7Y}r z3@qj6@n^tN9v&|{kT*{87&rzw25gs1Q?!Doa2ka$HOJYk!~CL!QI0!#Wmei~TP?{NgaPT{A6 zmw&3D9|^uy;bXz?-BHkw2me&z_25UyCF$nFc~h`%4`bls!+Q^4-5yS$zNI`4hDqxC zO<>8tZx1(uCI22D`}?ecQ-2MLUdFGtfhBz>Ir*=FC4DQPOL&hvh&SL#-%}la0a)^X zs^fnbSn@Ca8R7pnSn~fF$G>v<5>r1b9sP8bAK#vI{hkk9<2Qnz`PsrBK`^!DKatSn z!+JGzjpf_375&rDHU1p<62dd(VR}9KQ1RadUE`mFuNdLqa90uk%I(;T3O@;a+X(*- zML!w3#**H9ep-Y#icf`K)Bg;7z;%T`Quvd*3;EYT*I4Mc-c!&=@tfcur62IKg8yw2 zpTZ)4s>1JtuCdV1SMHj};*z?~7J{!772>qZJTkPp8!P0&_eiHZ{YQNo6!O~tlJp}InKZY+P zygzf;)BE6?p+D5o-{i2TzYQ$y$>Vo|?*Tu~@qgZ7PyZ*dv=5JO0&9Kp4RG<{z7Vk1 zClA7&mHKKdwff=hU};a6EwT8&l)Uf1t5y9x@Xwi_D7+tdIq5l&NG1RBxk1s}&^7)O z@J9H3|J)3|c%;3b{mbF@pz&Mb*I44a@K?k98owQWjfH>T-xU1sfqo$IlYNu^FF7oH zlt}GHu;kBvm>+^$;NRy9$?uZ0E%x*Wflq+$+h5aRPfx&-e~+I5o(4aeFC@Hihdq4? zEal_zR`8_?|2gy!2=A?6-G1Hi2Hw8vhdfMEI9VeEeK>j>RG;_5Eb9gl9iXYYnh2pBP+xcJ4YH ztjp&pMfd4n{oh4<8-uQKADj^1p#&=Fc^~+EuwRe*KKKH#&)*-t1pNeF?)WFb*MJj; zKMcMHEX#Bfo_sbg_4$!jK8$}3zo!2RyzL7`d{2BS{uzaz13p#Zv%zore372_gD(gB z^nMk54ftTvz98YN^!yZjsKN)oocdLGE%-8p zXTcXK{BH1Og}(?sU*UVe+Z2BME2s~Jp9Nm4u;lN;#~&iU_$)C$HQoxp#=>yVih}>o zp-cO;pQW{zfhGSQzZxv<)#EpSrM-ImR4ER=sw}J0c_$A=l7mM_q2R={X z*Mhaay+HW$5AOkhwZ8rR$Fo0)@QuDCezFR`H4cz8d_38;bEllA`;^ccE)6^dp|&^Jn{;#<#<-@txqy3E%7c$GsAJ5bX8m zYOus_KTB)R0>2QvjxVHtY<1Yv&jw3)9=`&7CD`|;4>|1V9|KE#9$y32<^Nf5@!|b> zurB{kP=1pCbxZB|{x6DO%I{8a^3@_g64v>ud=7loFg_T3(!Un`Yrz{8o&`@U{BH1C z!uR9h_29mW@2B87upfVxzZ!j~=*NIBRr1r|9g6-A@b$#!$DhxEYd00?y9<0SbU*$a zbUyt-rSBNC3!z%7LjeJ%D2c$Eu(J$SRCzXW^$c%`F% z0K84n`P#%Uza@q8k@VOPwj}%-e;r)=x1zk4y$=1N!h0I{E`=qWEC09%@A=U0RqcBt zcwg$H4xg0IYaJFjDUl1n(q8R{_m05QzC6AdEbYtV_kyK;d3+gI+Ly;40!#by_)4&} zFONR~miFQC4zRQjk3SEV_TljjU}+y7e-$kK#p7GR8x{T!u=E#CzYTn@!aoE{d-e3Y zz|!75{yA9MyT`u7qVzER;OSlWZ9Ctzt09zO#t?Z@NQV6EStCG`A*{}inC+bN1J`fPSYe!HTJfAys! z@~>2MKOfNT^S#hDmZa?Wbe~@OCv=U4zCqDH2wmfkf>){jBK$iP|F@uP{9SNsg#Xuy zfB!eI97d*{jkrRCsfu%m}XKC%}V5u*U zj|5BkdweWd>c`{b!BYMnuLnPCqQHL&J`wt3VUYZt=dkC0EqDO^!H)hhhduq1V5x79 zuLYm4`0sGo(|-z<`uF%=u&Gb;1@}b@ro26U*#+G94&I+HBz;eF*wZ8MHER9s>EJKG zFC&Za4;=RV6JV)Nk7vNQgCFAf-{r8UzYlyj^d~y{R~+{Ao4}8wz8~o5yBzlPecoI% z?ZM-RfY-wB{e`i^o_;u3+Ly;ifwzH;zl8j3aoE#m!P5Rb-VWCK?WN%2vvb!g!CJpP zob>?F2ZzHX{+ZV)e$iK#fu;SPCUjG(!|nM_N4Ifc3xaPQ;TP=bfASVf_gH=(zPg|v z4P9fQuU%8nNAYp+kJ2ww{3k-!SHC5Nc;O5_;&CC4lj8t_6Yd#4nGBaAo8C6T<|)DC9Q`ZJDh)wUkbm*!hhwn3jXt; zU!%hNd+-h5KZH-x_wV3)6n#{Fp9_b>6Z&N*6yZMv`lYJf2L71Br-QFj_zbX=w@=?$U@32p&jCw$d;ALUBOQ|cEw2F=pPjqj1lH}dc?jn- zso#4ZVEgM7SnB`v4u20U<*}4NWWM{PCqM^FjDp9(l3$}A!Iy(2zaIYtEcqii!{1!B z#N^-OtzgNo=f4UpkX0_Yk`*z498@o$8#jT{;rp2NYf8ZyJ&Rx}uBxe~id~SJ6d& z|Gym0&m+ObhxfO@IzI<1y2!5`kw0G1CH|8~{>_Rm^4E;W zU#sXM|M?O5FDtspOI~&T{v5i-zXI#}u3c1=j)cDtSeMV!-fQK>e3)`{So z{I?WcCGa!})n6xcD$$gLQrmR&}h^11#~R(>^XX1rGX5?=(? z;r+3qOL)%&>+n`9y2wwB$j>Rd$ZsE!e~F@t{0BzlKcwg)|Ircos}x=2zdIs-yP}Ky zk4NNxs^}tr@Oy^ye+anv?A-Mvu+INsiZ1fc8<9Uv(Ix)Qi2MNj>$_K&^~y&u3p^cs zTDa2OZ!UNiEbkfbOCkin0xa(xd;CVQyoW6QQK4T1miLZ5{k>p$Us~piLjNdO-k09b z;m?8Ped-CO9zy?Du)Ozks-qupiS?JSb@=&z#r=2gewv5ZmeoEDmiMu7dmH&S_Mp7S zz27p6p8=Nh=b~RE{4>F_Uv$FZtHH8=)u+Gr*Q77zegj8;=ilJ3j_iGlCjEbB{nwW- zwc-5$Ea$a-_#e0&|H0Gk{Tsr6)CVcA!&cVrb>SU%1^dtb&7MaQ`ek5wul7nuf7pkS zC;r1-_&Yv=KbiQKJNn%pCBBcZtX<>qi3rMjWZRf;NqGDG1L=Pt`~MvM&%w!3d!Lrj z@BTRJW$dRq+tGh`m0fS}$W&Gs4$c--kzXZ$q z4j-bX%9es`_N(|70>@Mr&eh1p*v z>3Ju(1>WHJKlDZM*V2An{5!rx`%hQ$W`r%@<8Pq+f5v`G$N!>#Vm?iMu6FzfGydQH z5Y8JcxBSO}Z}`=Uygi)*-tV3jwZk3%pZ~KxAMWK>-H8AH&9om!e?C~=`*@U#?ic`uJ@H}tQ7<-W}e9sX~y+~4W@!zo{a-XALU)B6_Xq43y$&_1pz`p@m(Mjuk1`?~PX3!EawMXPW}Pk zr9aZ1PjmPp@QOnz-(@!Zhu=o}R#Se@wD>6SVdyXU96)}L1DnR@@C(4QpL{h~%HuMy ztlw>R@!tks=ib9Qpteu#zreCT_X@{<-1i6$e7M7xgJr+=Ne(~k`@`*d1}yu>*E;&Y zfpzhO_Z zIe&JI%kMd0IbTLLO?i9*EaxkIeLUcYv=7=BZc9V&fn_~mqvO90EboQ-@)`dT{$lW< zj()%$;@>UW*A!Um^Dl$tJn@At{kPwV|C#o-FY+=TJ$onp`_(IJ-+X|L|D|AguWUa< z->0_rr|3`kmpT61z;gfK?Jm7PyPN*-kzzdi%{}>wfONXNiX|X4%o+zR~cCLPfa-bN5HcG=cWf*{$GP-J^M75zYiRO4xl}s z>*}LcpUbw*)#@`-{mxvcR?jw%4Q4u9vRZw%J3Cven;*TYEnBil;ToUqomub9&CQH= zx6WnIXSZ*e>vZ|Od3J8b{$+pHUVM7LJGLd8Iej9lHyeXa$R}&`dT|;APwj2mT5mLJ ztG3mHW^L^GCq$iziK$)?^rj{zvfkYI)Z}c`otw$B*5p(_YX;4=oyq=0wrbsmRfe-( zSDf{_VXfDNw_ZPipC@O7O1xV-GpA=W_4@H!=T;rP>e>81h5w~dc(LOq=dzi}&cv!? zH>}zlxo4ju64C7R#Q0p$-W;UeB#Ar8pw|k!Q8!#utFP-!PEFSPL6!~%y{Op>JKcV- z-|WRm!^X_3Hq%t zGi6Pj+v<702^v`x_L}{E*bZ7@+USRID@xP2nKe5Qg1RXhayJV-0VW_o3-H#L)m z({nSeW`AaCdTe}hY~@y}sW37Hvlvx6^iS5V!kDqtVWSI5lP5kQypN zjCKprRNmN&X3>ZBY-VN(b-hM@`9M2y*iX96cH9fwQ9rPq#8i7YCWC+^wq74>ne%d6 zn~hbS*;VpO(N<^Ot(zpw5LRgr{XskFG+IHNb>n6yb`8R*Tl8@=Y=l`qP1}QhrRv9o&3$r7!47;WonCfg*DCBlNHb%1( z4z3z=NGl?R_|fpXSd z506C*Fpc1-qk=J;yI@QL6KwMqjM)MS#-suaU-j4+5RC4ntsBi| zG^`(+r2SXTU@;1o=Fq4^nIbUi8Pzm00?PMhs3{%G;AFZYKldV`rhxOli?AETDhxn& zUgH$2E19^_ZFi$yoF%P(FY2U&e$bA?MlbDTX}i_#*2BCDm9rX+WsHQPHjFZtf@1!J z9y7D3s&P|}RawK_jw(-P-b2b+a|Kq;YBMLLh3X4p-|S=4-c2_v4TDK#)%-erLOi+R zEDhdhlWHk3{ejLHo8DPb#&z&`ta_8d#xtEhHod=MJWf%>W7Uhx=~(hpy-68s)09Cm zLn|+1$-5P*-Xe?sUmm_u7}UP>r0V&1E{%Nn$EvE{3&f9vfN9`ji1W9x>Oy0egjOS2 zO>Dn6=3Z!08X8qt>Xkx|wTx`b$hM4Z%g9DX;YLQ`Mn>UACf>-z8<}_`BO4jn$jC-U zHa4=ck&TUPY-D328ynf!$i_ytZK!QSZCCJ>S-ob82T2)(T>lOGK^iuDc<{Sf+DiLD zqu0gZ(GOd#C~2cs^U^Qn%tymg&g!w}O|vx2C^x6Y#}iI&-4Zp8gJyio^u+xBAaT+R z@HNTrt+V4VHm(`xAxaxz+>R59BFGxe?!cJaRDiKncbiPoDx9~?)J}Dun;mJ~NGI)8 zauLqX_0#FjuhDEL{ce_Z+d%xv-6cl;n0?sZ8PIi%c4W z=1G#&lRDccraJw&Gdt#7P_1SsZDwf_cLzz9S{IZlQaAfBEz@~0O4G5rMf zSUwA&S8T&a$B(@E1W`MT2T_U-F&ng-xQVeMIzg}3Cne0QY{qr}&_z%xZE_J8EfDu< zv$4CkQ!QI{r?zGNdi|)WZSrM*`=n~3Lypj`&93ug`h}_W*<>H?-M-#F*%RNQ324X# z+MAj@Gn>Ihdd$q!7L|q(pQXt1A9pHj-n*;4vAw7rC3q;)u#<*a*G@sHB5_RTQ&5xm z$cV+WQ(I?x8LhI{h#OfWO_Q|OYBl1%=}qapLhb39sWZp>BGr$wFiSe!s1paQo;8gW zZH2gg*Undlq5Bz2x%buCnx?fD9(yxdQlv8Xwc{5*^YOE^C7N+$Xhp`1DT^2Z%lny` z#F%87zf4Ooy;S-${WhotTf5DfO~H6Go!*pmJ7=7+xwWO)-_kza^-!a5m{th88PQs` zZf7=&TlFOBwFYsNCH;2XiaQ;guvGN>$IG=Q32l$DWnWmxY5zVNE?SU1eP%grSC{uuV!IFFOs z=1ep=+c^47M$9-F4Eh77!bB|?)h=b^)umbo?REP>(rRP%g`Gy&Z&@*87#1t3d$%?l zGhh$mZqiAbY0yp7+HCaOUq;RQ1U}|=#x$ZE1z3IEUcy8pVl5#_y4_B{*~Y|N+!#B$ zn%f;jVJzjGg#Bit?bkLJ7x-SS(JnRzc_iglf}eBHYNVZu%O>|!=B~Rlxd%7xvF4rX45ETB$KN z?1E+2bh8(=f>x)|$@;Az2;x>VWanAb=ytpPF3ws^ncu4IcfakHpuz?=Mz8y6f|XlG zqBStwO#{a4=I=NyFMs2n$d@KdtIO1D?zt~zH%|GyHBk^DR5I?No{sI7<=*QXKtydVcJhyN!F8Hs7WU)CY1ST!DE28>F}8V}E?}3y{1--3 zB|gHIly;|5VNz>HK z_MpudV`h6WKgTysX8mOCnj=r5DXk~SK`N8ub}Q+18=cNzu!a>2HyX9WMiVdjAnWx9 zK_8YVYr@5HO{*XGdZBFFsLE>H$c5=s9yV3PzIgl7r~ouk)!6JJSiW>wSskcUPKcq+%j@3z%&qPowkj(Y7^t#Eetg59M6)t z*Y5NhX~&&)GWyN7Tbk_xjHV%)yrv7WnQS>Vus~=gWhQ&cLZR8-<#q4^;h9pit~-X+ z1sH9?N*OO0u}d0k3+C38N0rhuHd|?at+TS6t!kxN3!_5%TuU*PM=9>P{OlHFSBML+ zjgA4Z*85SfGiU}Oi&$PvlsEs$gi)7T3)REw zHw%89Mz7uNno%;JzBJ-Ai`zI8E{)4{8#@Bo0mzO&3_sm*vxZa;gZ_ZcW(f<#Nt$+&!bWMeOd+p2 z`IuE3c3)>T$52*}bMmjVT~<>4VUq}Rhtn$w4qaA@Y+2ex^Th<$jv9k3VlZjYwmt3XDx=8vRoCuobphO-7C7&G|t`JwAG7p9#3m&>}K7>c#^7@ z0}9Q#ck(}S-%ain8 zP*&UIlScGUzMob8Hp*I=S!IPFb{S%3oMNrGYS~$hmG4!nEM}6I9~vR%k;9hqjmaik z*=9J7Ehp3XS08lyopvMcaZr^3r_uFO4z#Z|7h=aQ=kU^?Gw5Z5q|-^WZa;1m%z4b4 zvN;K!{UzZbj6)`H-A<>`ZX|vpCwp&V+e+3mDnZ+45@wCSU2dyCOi8Dry(6u{OgXgU%CjA^Lz&`IL zgJzS3E+$)HKaK~ju-ET%klR;pIVW|1^(hUSg`Uvw&E=2kVYqb)Wb*O4G+wqYN=HN{ z*Hoo4v==9n&pyj#q-&da@;+WFV|s^?u?mVr=KZBqm{#N>lqr)5rI@XjOBX_WQT|q; zN}W}&0ON4B$*W!i_?Ud2ia4t`OMIG6ycp@qizKfEV{(}!y9Fz0aeL7eOfT2-Ownpg z%d3~PY??*D7%QUB*oT(Sp-VFoG^|>0SRYlfoKh-j$ACcXX(>|xZiRz>jd}~nv(ww< zQP}~=?obY_+7C><8C$np-i$ASRlh;8{!lJxY->)!n-sGeAqlsR$-r)t;5eZD(iWrL z0v*^r(1G0q&5>!tV%_FVTi{J+u+w~IX8j!^oiJ+RS;0lsiMu%FjE*Ldr_%QOSGhm;YDZ|p3=WW<&u#aI%vnZq%aC)4aP zDq*&HbOlwL-P~!`Q}Ge7C5%IpDL&4)$c|w%C5D@NkF0hMX`-*O7r5RWU}yK*jYhNC z&e~bu4uK}()E2+BMVJ?w0!K0IS?qqD@=wB;Rf@RP=yOd%%Q?c-)@wGta>c^vy#e+l z{!BKzb%NRG$>z80LtVA*q*bd<=Ks;FB)#?Vsoie@kckxTvTh>_Ij-1hVUTn9Gng*Wo5h* z&-Cz~a_-9*bf}H7%~MmSmu@O=G=h+89R^V+>}2f@+aRT5nPT9x2h0pkdr@0X zz_>ZYBW|_;SFP$|(Y-uBxeZmyTFh$7Sq5 zW=E|2fKz2LQyB$_r5{`!q0tW0siz6a9yE@IJ z7jSJ*(6$%8EOrHc&tvBAdgwAIQtnSA}WNEV4-}vX`|Z;7D-LUP z{CupEzs)=ah3%RE=6o|EYgyC?Tbv4Oaz$c?tsH4H?6ZqIVG&03Im^101x%f@{im{k zX&&v|Wl)|Z(-IkID#u_NEn`w;0n@%2zA6hC{mVJv$^xbbvqD}~!0vowF}<>Y)fClh z+WLD7T~t~R)=+F$uW9SQDAZPY3|8AzuW9QODKuPp45s4HaFvVIbfBbqP1}Bo-mDsf z9b}X0HErEHXyeK;ScP7_PurvON%fkxr|i?}ecI}%w0ccjJB9(Ka;B}jr+Q7>y8sxr zs>WcAZmgrq0(N+;Uek6*4>nij7>ugKIaOJ}^tiNoP1^%k0T&Hdj>2@gpi#Z9?WUrj zQN6Mmei*fahH2>HA{JEmeGPIRI~;&}G+<%bR<~w|HJ(j)`MxR{7){Xn)EWJd?-Q#g z77CmY-3}*ft6SZbPjU&w4e=%@TL$^O3Tl4q1b<6unqQ_xNxt`(DcP8VS(WFEFqzt-ItIrucob4?x`mpIW2{mhD zyIGnx&b++LtZ0w-tqxJecN_Gx+1||fv|Rj6VX;f7&#lKDrdmO#*JA7LJO=jfHb!H} zsa0=Wb_Fp*G9JOgAr%H8V*q zNs)BE;@E5{zflopPGk2+oGrC28{kHJ)QvGiIlU~0Np zP%IU&tA1GSRr6ps$Q0h-@)*nzv=@C;X83gK!U`&De6~9?P*%=^scAEPuhv@anj^z+ zQ_yYow(-%TxBs+8`$ra1x&xgey=QGx)Jt!WdWlu z3)gvR6SV8g#W}Qc0aF{rIkZv%I~&K~ubKzD^q-#*sw`$|gWJa{3z*u_R_VOE@ab^O z+xKklm|>H+{knb0J!+=)SN8my!KSJo+U_JUNg-?gidqxI$j0M6=f()KO11m?YhZ55 z8tYAMl?Mveop|(->+I_0*wH6G_k;}#ugHd{9JvllihbY>)^XXs+v#$#t=kBkThttJ zikcDo5V>=Kw+zB44f?%i$fn(_(GIxTtyq-B6g-`MdA%$>%Kz2QCgmdHetXRca&T%j z@kRaSfIINpIPRKU8P*r~xhPQ6hV9`;=5Kr>lQQ#*LuPxL;;?;Cb}akH2HNfU?Q>I1 zatj*oz!bNjjcqnB#_(9cF;g>JI&-^F}GoWcT~7UgAF6>U(eWIVvO>_kTx+d zd|z4G4Z9)tP6gd&C&6MhAs92+?pi7avo@tKSBYWHwy>>3){VFkh&zS{T$at&Y1yOX zI#M~SZF2K9nslBbSh%H7YuyI-oyASAJLV7(Z(NvjYN#J+rY zJ3(MVsMk+Yx4uawglzVdWS6wgTrtKhU zCozWw*>YnOZ7RPQ&dZaY59Fn+*7=5Rq~qZ4;wMfl`Dy0YZau>cV0d9%=Q6*H)e|&~ z`VAV!;9%X!u(&O{b`d+kC^Qu{*6DJsc%2Qs?U2_k21&%r7EQZH$*hM3PB|Gqa~7`I zloN4d9JI5-Y}?{+<|etLt=XW9abXw7p;##m?bZ;Z#Z8Kgf_6%wHnVkht~b`tIL*0< zhob^+B5ZfL-7Ddy$!4o*b~Tyo}|>GlL0?JwU@= zry%1wrUs`iyX-fy`>td($oq4TYrr@k)8$BO7%)!^<3LfUIqSnsN4=2S0%&GQD`?{`YbC|@@={JSw74-) z8iOs3d`?y>Z##=sHMyZ)DrGg4RY_KN8Lg08Q418`@Rgc-`6AK0oyTq&{O#X*m1}wq zK&0)6Bkt^j%#w&_hQcgr#c?A_8-p;7twQ)8IIU-Vd1g{rnxv6-P|BaT%~H<2NJRA# zEWE(w@#iy`a@PNW2bUO%{|8i~xPR!~`AncZ>%$!qg=oDm)^A<-7s~@OD$$OnPBoj} zUwHV+gRolMs0+I<(0a`6%$Mn`*-YGO;g{ugE^KU0(ED?+=qK`R2RftcL{T$X+f*6b zNDmb@$dL)*0>PVG0?fprB@cJCw`6mhr~0$a(R-$$nMp{DBlCyM{LLStwap*W!p$Exf0E%s#TOUz z%3;*hPM28P2%6lD%G+*p*`}G!M9{R0AKbn%7~e)J`;AtUR~3>p#`oP!<#q}+12$!x z&)$Z@Z3b=`#mvj*vOagP&dkjcBu9f=U2YZcv^Z*ttz?2^lI`Y2a?ZBNt~;XT!fh5* zm`<_Fx5)u2HiZQ8=9<*49ZyaEY%9+<*h)QPXtJ_p>R;|(;qQEuDh)sHEv1~McS$=U zeET=u#~fUdpC)#@;h=CWmWF9ss9l1~%~!f%?nRToP5tJ3Y8GgxwgU_ol`H0uL&%Iw zJbIUfobGNkxP~O=LPlO5#h1`%71w^3a^{+~l+&iiRL;<@=;|T3Em@|VrDj<(&c3E7tLh()+SX&Z}h_dEXe(kyGJ3j|>EW7VF|$pY-Q@#hV@ z5%D4+x8XFhARKV%OPhy9xj8Bta8?mRq$f{BdM92ft2G2n(ayV@vuZ$Q#y9UUAXR5G zY?|}#)yVW(s?LPKd~Sh)Fg>t1cgzI@jVKy$IXOp!2I$#F+8S`GNaki-_RcX(D_~n= zu6Rnt>==UPahWd{urcH{R4!nu)W$=hRgFiy%_tnB7@gWN0ZD`Bd!w49H2K?x;fYEVev_MMxUGaGkG%|}8A*9GP$AunOTXF)_q+A& z12DNx4?F!da#J2^^};fDtQZeWd8qlYU(RZbH02pvpob?L zo_C_x5j@R}J1Uj7%=0aBex-8hR4?s7N=>>?^pK=o!{OgYO# zt={qNq}JY#Q_-%jS`02wGcwr?411hOnPJw=ZOxdz7jvsUOq22vQAS5&rp`0Go3V3f zcsGWCTP-sw&yCJK5BtSLXn<#fqkXtzgC^78LBG%CT&&l`-15?jdjos_pEaZNIw}<^ z_9~ULnj95}TgnAY@u_7#SG(ncrk+OZ+=eOWfC8b^xo>!ZSynN>Vv3ofJt&_}tHY~d z*&yJ!B-d!L<~?Av_J!tBR?1!sQ01(-&Mjxndul0bK0=prR*$}V?75yQjXhU>rJT8* zF6CsVR<)j(msVvhhWzpbRL@n>Z_7i?ZTfQ7+>|P3rSqw+>ZSa}xL?kywyDoIjz^nj z#%H(kVxRG+;zREA=EkO`=YrPs)a>kdcVhe4410)p3wJZeQafC2%mr7xnKqDJ=vAw& zuzt$ZyBF=IdI2-(ubkHEy%t|%_*lzy;V%e>L-Hx5S+*aJgBZJC%6|j)jFzoHbgF zq=ny<(-7|vq zErx&oIs(Np*ivanWlO)(^jA8?FY4+_h@aP8Qaxs(C{Q2Xm`Lyc^#U0}1@tEo< z&ZUX2V+zJL}~K19}NqXDn+&NWl>Ym7H8 z@h6UN=}fQ(dCQimNo!h&2acVZ82D`0jChkI$TyGWez-g=&gn^z^Mp0KnH`4NtgLtU zd+dPeumv>9ngLG{*kxZT7d653gP*26bLX%$v1pL-0 z4ZGZ_z>YaKO7&tkIlH1R<;<;xQqJ74Ddnu5&RhYNhG~>*KF=s+FEmvtD@v+rVM%kg zTP-jp7G*>X`SndFw5nxKPJq0{(?aImCQCb>9-qi&#=2X_C+5Z{XX}}4ooqA*vd5Hd zl%cye&sbSzK5f+@t*xS@5n7a_$>3rnot-9z-d?8GRm)-|O_y9uYGva;OHdN0@jF;u zRk?ueTBcEUi;3Op*hNV$I!?Rs+EoqNj;m*O(QU$RHdstPZKqq5q_yd!W)~wa2jWe` zFq@N@v>4ZuHDlPqQ?&pI%Iy)^EQkNh7o@t6u z{kQU$yhX-aXOnYd6WQeO7c*I>pMPToZ~BWClRIi2A_KO2ICGchsM z%lBxcCK+;E)19njPYCCx03V(r_?GF3>`1B9-Jdsd<+N#Hs@s{U*N-*7 zEib1%U7d2?GvzsqZW4#xm?$G^ocHjyOr4p@Z{Fl98h{f?>}g(?V{?CuI1c1Wc#_-V zts!0$k+N~;g`?StaZa+*Mzd|rmH}fKPnMW3q_K|;I^z=r(cw)F)+Q6qakc{9KrDiY zSwfNPXhPchOlR5%WU`3D86BSb>$V%b62c3S|F5~~<~nF{1TkyG{YJCP_4{njk{aDI zT{C-J`TvnaVOooVT=gI1^4-yx4{+8oIY0N7E?BZ@l7E^AlEo| z7~i(WE%8=vou&4WmaBZbgEp;@Q~Ri5BmFziMxwJ}&+n3!Fkl0JKjsV!10@?UOn3$_2c=CuhHn_`}Z68L8!`kNVG1a)GEzZ{K5`W$-6EG4HrR6Pevk!rkM93p3pHqQJ6|K<`QmP$9k6Sx{*D_wn;7-tjE8D_ zQ70WRr1Dw?O9~mM$+&VPvC21WhU`UbgdvZ*Bs@`!+tBF$Qu%a`^7MONq%jTDSVvYn zj_rNpRMJPYGJ+v0O>?AKj*a=|R@xYYhHZ@*+dF8E91qAE-HbaIf-Z+utj>u>I%Lat zNQ{|Hb8@7gn@pOVW?^e_i$gpSr{~D9+;H9;pR(hF?aSe0c9yVn?wH%kd8U&ma(J=U zu-nU4&^U=3G-gxL=VM#vFp{1DRG}s$uAXOr;gpY@5dB&rGqp7c#Q}w?DEN&kH~ec{^^A!L+d3 z8eDbLZ4WwO61dIdwo%9NezWFRNt!qv$3^bVP80>)y%5h=9Km3Ga(s64*ru5& zDRrJ|;Wms$hZ}OZvpWu*4IZUwD~LIZ#iK>s=*{8ANDL=#)0n4((~~=AxqBuzU|JY; z-sa_;Z01Z^K$~LzVE!JXVY+K@h?x`)x(tAWAn7G2y7>~jxR7~wCvEqVcHD0b5^m`J z?S-7B+-*Uc<0Rz8ywob@k@mK@G!H0&w9R-&(CuE=S_KtCPNW{krY2gmC%^? z{1V=7t(;h@NGN%gf2=$wb^9Mvc)`TUpo-I5C-aLT)Iv z+3^NkX@=CUk?zCqU-M;Mk1ThMBputO6$W;U_gW5NAy zzm;-mj0rUNN3?7iwUy;H_M+LT$$H(GYV|t0fLXhrPt2#@MmZSFnlj$lIm{U2#oTtz zsGr&48!?nO2XV}h&bX1VOPaezRI8oGV^i4@?P70syFsTDcX}KHx1Ax)N84bmZHsW! zkQ`3`kR6!|*Xz&On$2u?4~vNfm}ig-wNPDwTs?*U<$_+@h1x~C;Eq)WdNCNquYdr` zG~|>-+QkRJ1J|}8*>=iR!tw4`2|Le-HfTveKO3&AQ^dOVb}rGxj1s+0o67)NgRt9( z+;EY|<^>rt8rV*0J55;^XH<0;V7aK~b5=1YU@Et#Ie{MeYzv&4#&(x$*Jy|Ql$5mu zlC-AW$2168HNKMoR-|# zI~0ni_UfI9O;g;+yml>!lX4^!ZshN2ge2lLNrQPrJQ5sPvX@@-YY71vK-7(Yz zncH!c5RJh^loZ(UInC1?1Y5G1(gO@uJn=LNE zmN)JtOG6iI>mHq(W4lMNKu=;W)QmZn8FHer&6|)`o0_ysZiB{puZm}K?dme$Z*ciJ z2ReIPLf7oXRt?47&Meoh#kNHTp=+7e)j~E>iy^P1$6|eKuofF>s7=>wIUfXY@V~qc%|e z@}fXzklIdR>UE)zo7|BzIo@MJFvgPG*qP%~6WoMpFR|xbIGY(em^6b1M)7Yisa-A$ z;6g-hzlnOyo;XX8m>d#ibr=TIV@=%}3Lr8~h%M zlN*|NECc&7Wm=W+5UPDbtbIRz33a%+LA zk)a?=Po6(xyrtLUI-)_=>EM7!^S9CNPsXA!3?pvz>?D!QCM8v4Tl?c@_Q#7Sk%!W! z+FB6Io`HVpOi#~Di4DkAr#$)5!-9w~mGxA1_YeZCYMQH2P;RQ)>$Q75t^?#1+c4pV z0aNqJd_(ih%rQeV24S;tl10N7VT{eVDPv`r^`G&=eg7EVrE9HvEh8R;U;Eo zI?p6!H-Eb3nZ->vW~|O}X2TfY;A1dCj{{k|^ypQ`iFqvlttU|!rEt0d)9^ve^M}-7 zYF%f0m%B(d@ydcMhA94*ERMNQg_j#`YfNp9taWEo*RfBwFj<(%&XhN%&y+OU^zAnH zwj$i6F+PWYpbjex_4;w{FEeKtOqm44gC4txxkrKhg9qAa7WbK?`UZI-^7 zy3TSckin51A0FfAh=Zu#3vkl5JI&awIu!D;oh-$6t`tPrkv+EbTj!#gGquw`R)2%z zQCQ$1JyEo45rB3+H^a%PIhNw5wr<+YTq&Pk$ixDF4Ayop!FJ{S@PuNlW*)jV<2_j_ z(Vm;ObDr*AKi2ayVy*CYC&vfc_}Q3ux5a$*gUHCmc@2A;-^92%-q4M>eLZZ@#j_+} zWUaao;%&}(Rzh^ViRlK}%xt<^(z}jGBkFf%yOb!-dRAFl^bcmo&M{^NAW88&lCkwx zOQXWK6SQ&UF*oUOQ<%xDTi(+u;FQcfc(lOGXOFXdZjl+V^BzYWV`I?%U(!TTgDRy? zduV=)OKVyOjl!}ubFjppt~J*+_Stb|v=}oemaxQU(BO?u+wn(b<2CD#KJuhBlqq&Z zr_*Vsm=;||8aw8Vva1Ui+xDVFxkz%%-V@2Tr!}XJtv>G9<2I}(KzX5wnNXIbSO{&u zwjw%@b)T8QStrIY_ZwaquTxwrm_jWU=Oe3lbs8e$Hk3@aW7Bi?!rN99TJC+!Jz7J~ z4yKKG&w5E@Osq!J8ztPx)()7L;$sMKf-r>IC#|e9*TJ(?)|DaW1oK<>V8b=)_A~XuCY{?o6&d1%ypUyLv+D>IFCt%XqHR|} zO^BfRB7BBnw z{AM-lo0P@NA^)UpF7pm#?Y2Ba-Q;rrKJV!zRtMz6LZN_~Y*CPFY0Va-G3-aI9e&Ar zCaJ-4i@UvMx7ERBXvrzSd|1K-j&{LMjFmAqJ;AFXV#>H-1I=U}>kvcnxvVRj9wz;h zFtZLrmFx=S8d!9M_btv}es(6Mx@pwwY@HSFJlA?>9N_M}|8EF)k)l z#AK31qqCPA#Nr;? zh|LzUD8Nw4!VWjeHG)3tg|_R@pU%8_hG_nf1V$rkLAt%WveSt*8@i;G`TYdgs(4X2 z5SlPG7WZYv(u@~MWjthT&fn7a&~iqM&0fGoL!GEYRX6)>jNyf%%?n5MUDhR~?~;bC z+y`PhZ?ovU?N*PivmM?M57RDox9PmY=G}0;E@0rzt7BqLNoUPAizrDm3XJ=Uc_>aY zDq0jpIJ13g%w^JZbK9M5WiI#Q945Cdi0h>lGexx4*oZ^BX&u^VNV`Wb<0YLIH{3?- zG2yjv*LjDX;Hh(h8?PVtTKDblY8e}P%!KKs%+LpTtE#nvmh%VC(^jhm5bk-KQndhD z!9oqfj=0j)-L){(fW01Od=mF38jpP__&d3XvDIhqHzSo)N@DvI<5Inz@6#W8R!N@l z+0Kz}GdDFmPqgVZPaiCLT&vroZZWn~CPKU`I^S^02zA#S#e8yC|S`}r6J3}@>6)b}q(rY!dOdQrkaFIxyRqD=;F8_@4G z;$*IKdNxJ}m27hnXT-k#Zl7@r2VdnTe1A9EweD{dcB?Y;^dT`M_TH?CaFk-_v3;Nw zvHiUI0O{=Wc@k2sF9vSU`Qig`E{u5sSX@zHm}Ok()@|YPWrppR2==~62Tagnw)Ak% zDN_eG!Cgevupg+C_OOAtM+a}Hvx4?MJsEu*uV}#7(8AeQxv_@}wzbesbmuX}I+NS$ z^&=;@i{YTmMFts+uwD>yaYcd~!>F2k5Y8s6-k&Ov^4!+M$Ol+?vORjRM|6T?E+-WuiEEs%W0Hp?^J;yMA21a5SG}smx^EM*> z73_A~WQS*e&4xMtW|shsWwCi`N>+M%?1_qa9lFoKmL$z=`(Ph|@uxWdgxJ)QeZ0#u zIm$~yk@vJYKDT8@wj7@{GtM5R@iVi^JC9R4pRvYJKS)y!0mN)w>4%Nbd%}j62KKnA z$oRR*hdpFKciG)87AY^mMO+EkkZVEyAx=<~v4z#PTT_x;1?^DHaOYl#Ovp7Be&Y1VFK ztya@^#@MR7{`N^zPpZ-7d$0G9#@*(n^g!9=j~|U8!uYp!SB#7gQ~Ct=rSrg5Yd~#M zLDpAldo1n({J(qh7woag>3wV?zJ>M1$H1bA$=Jes?9f!QGd<$YHx4Bvsher-VL8EC z*7-i1k#ng*JNzA=OI^L4wo1nQVIDc#x`Ex9q8s_zmBV~xX3xU=&rI~`%+mit8QDHyM4WVvS$i-w?5&HNfc-6=5L5n zIsC8JWwDfXKGQr4kIImT*LLFFx*1Q#@9Tnq%CJaSsRR+ zO|~&K>?H92zM3CuoYFhdNbFD=w+E5wob4XZhH&&I2-^|yE%><`3 z05{W{F93Z7z?jK^e|cFBs&5*bn%d$|tedVe%p*?jtrPMB7`v!)6VC3BaHqGMc8iTY zxsCsb{iyEjc93*{vj0-)R(*d+ zNGNffNrZ`mV>4pas?Wq4JF(g}GhsIp55b1VK)e8p;St!v6YvK7&i$ya?!M(JcMT&F zwe7aMPTjg6=bn4c|NM_OZ&tb6)M@Z)9Kt|H2=}GtT%^~KgxR)@7U!0lX2ex%Pwo3n zTWH(xp4k$_6+)5+sIx`*o^(!SrA&}9p6NsRxTcPX_)t*qQYXKw#GToWHUfj5W50 z*9&FnNdyAsvU;=hBmEr$f%DgIH4cW{b9NXIdZ755RA$fO;>LI<%@G&p>EuqK&0rbZ zFsqpxL21r}dUGn@z0(QVQxrW(e*)wHhDS0Vky_Wp*vKlQ9ts2o6yx(eI-#`84#MdW z5c&fJ;Ae3n;Ya1=le`A0)|?p%kn8A80bV!g7(wKns2dRQY&u+DQ8Y~VZDudlRiC|= zXOEAbA1o+0e|Gq4@$Av7XNMmr*QS<= zmy+1-WdH);Wvpa-)2t?og=UjjT)k5{HxD~C(GSDvGZ?$^^-U1=-YfubEz0)`Qt>5( zo2D71zH-tkk_H88{19RT^n~TbHD)6|b0{LHPG~)*WzoiHoHSyx5#E&}C)R?R`r4S* zrUY|lf8Q*vRd{R5a2VL-OKNX$ZmEGYRSEtDHTc~E=sXL-52#ugUiT2Lpb?e;b8O z)i`?T4*5_<4>rUTMgY6QMwZ9y z1HLwq61`*fMoA&rR)>A>;S}>LNTWb1)De3J+tTzbN?D03t%H>z$PpmaRUQ>2uYmVz z3f&azE5sNEIhG%voxVIfU4Q~SJv%vEoV_}H!j(b+K>a`oi57&g$#XD4<(wizKBe|z zC@{prhK(QldR=C;E>mXdZCc`V)R#fd|Jyd>W3lL88<|~cn!YnL?Zq$2^q)A z-M3RiV5T6?j~LGb>`by@Bw7D~B>$>IWLc1?pOMBz#UBuG5vg3{J{0sN$JX3W_d66^ z3~d4##OMo-@Z?%jDPx)hOYIczEWy%Cxg=PxWzP}}*DOJv9X|vd6eQx}oGvn7haF^O zlAAY@I_`T1XD26zFHRTFpG+E)kQCDjd_Nm$(nKbUwkI$(@+Ju*b*BZyl$J#i=QT_| z+IdH<+aTdTcpE4tI3pw!z~pK5VKchMx#cI1mg_iP4d1%HP^=Xmx$Khb5w{W%se3z2 zR5ceD5r}XC?#FyR;H|jgRN6oW3K{eHTxN~zZc#zinJgB-O*+yx=>oyV`GM}(1zc3c z1rS2gt3C_7qvDV6UxCLjV9v95^F6s$2k_(^fwQ}Y>YbDy?x>6ayNI@DHPi|0+BA_G z>w;uufWK8rZc2lvMvubA!~6DlcMBIm_Q}!l<3~q}mycd>3OzVJdvPicnUKH( z@t5#qRUGts1|WI3S$q3dF-j&+-^!fL6%D4I!*3$$lcr=AwjlN>)?3?oO1fD>8XqAg z4=ym65_QVGw9OD%=5TGU;F_FX-z(lW7BqnWII(h@!(*V@0=QxQ0v;-=&wwjeggYPGACG7#2qSQyD}sye zkCQDzV#|0zQ=-hcap3AOJqy4nrWa)ohqDd0Ih;gf4iedngThZEiV^6Z9q5bgjvayJ zlI34lB{pda)|jKUnr$Qm=xFaS^2j<$2_7grNJj-MzG};3pr-vc2&s<+0;@qr1p}Lt zX<(T_zOj~sEC6O6I4F>K4HjzbH>puzxru#$ZM~uFLu=HpoEtSMo-wH32+a?Ya7z=SA0#a7u0Rjgv#;}C)dW@AL`;0KmK_dTNPdCjrzB9Z zaw#LNx2pRBaAFwbxEMMCB-M%)7Yq5mQV3UvZ9(8#_!me!TWu5RE%69k;(lO$Sk%Q0 z@u$}?!M?x27B-Goq<@?KN zK++T>hyjI4$f0w!~D30C4x_meSs6D@Y;b1UyYh|CEkH0a{Ku0NmF=1w6B}V28#6>$9X==`pk5g)y)j(v6--AyD7^xwug8fWLX0rk_f1|3 zG$x6UZxB{qISE3pn#L2y!zK#N=uL}+o+F}r5QmnSI3fn^JEs-aQ#3dtqtn|r$Ba3x zm_IuM<5YCE0;OxcreYiSR{Wu)y((VsX{rgI3F)3KNzf1;!aFvi4E5fJ&ds)&@;c?C zoHYCUpNk`0XjwpFYX*lN*6R-q6y+ud{Z;{}MKKu--FTe-Qyf+S5oZr#QmdhdmdN-j z>(=`2BCNGFxKPJi(M`^sTXENOFe_~B2Rke79EvT9ke-KMT`0q`7RA5{YWx_`4*91f zclGS#)v00A<)8QkJTaj-%-dE}(Q-)jv)4H4=rR z*bA(L@YBFS-oqLWYOEHB5!|0RAaUpin@}Ey#uCU+9k!(9rjV#2_Y0Fq&;f8_agIy98@c?=B%Uo2E;`H!;i@Dm^2a2tIrupfoeM?;zeXcE&*C zW?(qhEWivl!!ks76P|_qzK>12zFERCCc(XkS_bMTC{!WCkqrm>3v%%wTN9U{q3!P+ zX%3wVDI8VCxCRVPmp zl6|fAu*qU|VyE&8;YT3Viu7nhmaCQhpe%XM6iLCvB+wtjJLzfeQRr%wTBVd}r)B{(EwHo$e5tT+%M3&;`5B~wp^5G31jize zL*Nq^1p5NIUjbRV;aXv7e8>z1XnWJ(U{__?ya@0j9N?ATrj&0o#{1~4tvNb&Yvpns z_K3Niy8ZmzFoikUBf>)HuK|!XwSm?&o7q4&`m^6aO29zgmQtV&h7TA5)pT%mJrIFf z&MgXvC7Bq@8(C?YSAlVcCk%KF+^I~bX@hUASJwk72|zN_0`7d^nGFQ?a1$q>%TYcM zoj@drC(BylIIzGe;K!v-3g%D_+E+JXT!i(TxJ1Y@)r?!cbLykz>)T71qa2J|1936% zA{0I$b^wnOh!$)6h8e~%K6uC|CG0NvVQNaj>>c18<&?7Tn>iYTiIS&7KVf%;6v8v+ z(zpcE$1@}tAH)m^W|7a3V2r*&2|2kdxH}p6RB+ge4?KdG7ql@>WS=_fT7AOpi=Urp z1=UH_T zOzReoGV@486qq_ZJjoXzx4^^f7=pnI4CVx8dFs-^iZ;os21-IwzNdDHv1SL?&}g5UHMF|`>+zoNBvTKs#Lk<%2 zyiB102mK^kv?|!hf{uI@Vrzn@1VqKAg|G`lLNAJO38oud66~awjWj7qExofc7gvHg znCQt9j*75a$R)z|tW~UINVgP6@X6`o`03MEho_5^vlqfYP51@QwS+pFRO=RQVLh85 zt=ew$J#U!mJIP&g_OXTyjZ8jCMlSEVi<-3KJ!5s_Ktof*2!Q3WzppAcEsM9W`T0b? zN%;AB{e|+Oxy?z9P+Fl{T+E}T6uK62OMzl()UMv+#I7J7A6fUSa;lYaTUS57iEpC0Y_MAH8 zh7^(l790afVWNlxjs*^5!detFMA)S}Lxi*m^Bgmu@sB%rZL z-Gik88ieISPSZCOji(a)4T~BYY@KRVD~g3>bLso|G`crJ_$9VklLS>$07=yzNS8pU zIZ|Gi_@q%xVks5iTFAjA2Rqb$^?}P2yT_$eqhvji0a6I53L9mGMwtHZTYOYr-J$2lmG=|g+RuGuKKCcb=N|Gqxvyvb zCi1@QeNO%+uV3)uo>%ry|KW2#wQu+?pOJsR;~*S)>(@%z8=MV{ja lyguP2&tU&O`SS;RzqfDrZsp0d^*{F)KKJF%?O#`)`!CRwQCI)~ From 6b2c8b97c80288917af5a6839ee585a8b9381b23 Mon Sep 17 00:00:00 2001 From: Conner Swann <2635475+yourbuddyconner@users.noreply.github.com> Date: Tue, 29 Oct 2024 16:40:21 -0700 Subject: [PATCH 06/11] ci --- .github/workflows/foundry-test.yml | 40 ----------------------- .github/workflows/prove.yml | 52 ++++++++++++++++++++---------- crates/zkdb-merkle/src/main.rs | 37 +++------------------ 3 files changed, 40 insertions(+), 89 deletions(-) delete mode 100644 .github/workflows/foundry-test.yml diff --git a/.github/workflows/foundry-test.yml b/.github/workflows/foundry-test.yml deleted file mode 100644 index f00e456..0000000 --- a/.github/workflows/foundry-test.yml +++ /dev/null @@ -1,40 +0,0 @@ -name: Foundry Test - -on: - workflow_dispatch: - push: - branches: [ main ] - pull_request: - -env: - FOUNDRY_PROFILE: ci - -jobs: - check: - strategy: - fail-fast: true - - name: Foundry project - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - submodules: recursive - - - name: Install Foundry - uses: foundry-rs/foundry-toolchain@v1 - with: - version: nightly - - - name: Run Forge build - run: | - cd contracts - forge --version - forge build --sizes - id: build - - - name: Run Forge tests - run: | - cd contracts - forge test -vvv - id: test diff --git a/.github/workflows/prove.yml b/.github/workflows/prove.yml index a6aa804..d570167 100644 --- a/.github/workflows/prove.yml +++ b/.github/workflows/prove.yml @@ -1,4 +1,4 @@ -name: Build Program +name: Rust CI on: workflow_dispatch: @@ -6,34 +6,52 @@ on: branches: [main] pull_request: -env: - FOUNDRY_PROFILE: ci - jobs: check: - strategy: - fail-fast: true - - name: Build + name: Check and Lint runs-on: ubuntu-20.04 + env: + CARGO_NET_GIT_FETCH_WITH_CLI: "true" + RUST_BACKTRACE: "1" + SP1_PATH: "/home/runner/.sp1" + RUSTUP_HOME: "/home/runner/.rustup" + steps: - uses: actions/checkout@v4 - with: - submodules: recursive - name: Install rust toolchain uses: actions-rs/toolchain@v1 with: - profile: minimal - toolchain: 1.79.0 + toolchain: 1.81.0 + components: clippy, rustfmt - name: Install SP1 toolchain run: | curl -L https://sp1.succinct.xyz | bash - ~/.sp1/bin/sp1up - ~/.sp1/bin/cargo-prove prove --version + ~/.sp1/bin/sp1up + echo "$SP1_PATH/bin" >> $GITHUB_PATH - - name: Build SP1 program + - name: Verify SP1 installation run: | - cd program - ~/.sp1/bin/cargo-prove prove build + cargo prove --version + rustc --print target-list + + - name: Run cargo fmt + uses: actions-rs/cargo@v1 + with: + command: fmt + args: --all -- --check + env: + CARGO_INCREMENTAL: 1 + + - name: debug env + run: | + echo $PATH + + - name: Run cargo clippy + uses: actions-rs/cargo@v1 + env: + CARGO_INCREMENTAL: 1 + with: + command: clippy + args: --all-features --all-targets -- -D warnings -A incomplete-features diff --git a/crates/zkdb-merkle/src/main.rs b/crates/zkdb-merkle/src/main.rs index 44bc347..c9a6ea5 100644 --- a/crates/zkdb-merkle/src/main.rs +++ b/crates/zkdb-merkle/src/main.rs @@ -13,14 +13,13 @@ use alloc::string::ToString; use alloc::vec::Vec; use rs_merkle::proof_serializers; use rs_merkle::{algorithms::Sha256, Hasher, MerkleTree}; -use serde::ser::{SerializeSeq, Serializer}; use serde::{Deserialize, Serialize}; use sp1_zkvm::io; use zkdb_core::{Command, DatabaseEngine, DatabaseError, QueryResult}; /// Key-value pair type. type Key = String; -type Value = String; +// type Value = String; /// Serializable state of the Merkle tree. #[derive(Serialize, Deserialize)] @@ -40,23 +39,6 @@ impl MerkleState { } } -/// Custom wrapper for MerkleProof serialization -struct ProofWrapper(rs_merkle::MerkleProof); - -impl Serialize for ProofWrapper { - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - let proof_hashes = self.0.proof_hashes(); - let mut seq = serializer.serialize_seq(Some(proof_hashes.len()))?; - for hash in proof_hashes { - seq.serialize_element(&hex::encode(hash))?; - } - seq.end() - } -} - pub struct MerkleEngine; impl DatabaseEngine for MerkleEngine { @@ -97,19 +79,10 @@ fn main_internal(state: &[u8], command: &Command) -> Result { - let insert_result = insert(&mut merkle_state, key.clone(), value.clone())?; - (insert_result) - } - Command::Query { key } => { - let query_result = query(&merkle_state, key)?; - (query_result) - } - Command::Prove { key } => { - let prove_result = prove(&merkle_state, key)?; - (prove_result) - } + let result = match command { + Command::Insert { key, value } => insert(&mut merkle_state, key.clone(), value.clone())?, + Command::Query { key } => query(&merkle_state, key)?, + Command::Prove { key } => prove(&merkle_state, key)?, }; Ok(result) } From 14ec49b502e9c760532442406926583eee73b86d Mon Sep 17 00:00:00 2001 From: Conner Swann <2635475+yourbuddyconner@users.noreply.github.com> Date: Tue, 29 Oct 2024 18:45:41 -0700 Subject: [PATCH 07/11] getting somewhere --- .github/workflows/prove.yml | 8 ++++---- .vscode/settings.json | 10 +--------- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/.github/workflows/prove.yml b/.github/workflows/prove.yml index d570167..a7237ad 100644 --- a/.github/workflows/prove.yml +++ b/.github/workflows/prove.yml @@ -47,11 +47,11 @@ jobs: - name: debug env run: | echo $PATH - - - name: Run cargo clippy + + - name: Run cargo check uses: actions-rs/cargo@v1 env: CARGO_INCREMENTAL: 1 with: - command: clippy - args: --all-features --all-targets -- -D warnings -A incomplete-features + command: check + args: --all-targets diff --git a/.vscode/settings.json b/.vscode/settings.json index 40183f4..234862f 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -3,15 +3,7 @@ "Cargo.toml", ], "rust-analyzer.check.overrideCommand": [ - "cargo", - "clippy", - "--workspace", - "--message-format=json", - "--all-features", - "--all-targets", - "--", - "-A", - "incomplete-features" + ], "rust-analyzer.runnables.extraEnv": { "RUST_LOG": "debug", From 33b74b5f9d37cbc1434b1f94451518524123f055 Mon Sep 17 00:00:00 2001 From: Conner Swann <2635475+yourbuddyconner@users.noreply.github.com> Date: Tue, 29 Oct 2024 21:04:21 -0700 Subject: [PATCH 08/11] skip build if clippy --- .gitignore | 3 ++- crates/zkdb-lib/build.rs | 20 ++++++++++++-------- crates/zkdb-lib/src/bin/cli.rs | 26 ++++++++++---------------- crates/zkdb-lib/src/lib.rs | 5 +---- crates/zkdb-lib/tests/merkle_tests.rs | 20 +++++++------------- 5 files changed, 32 insertions(+), 42 deletions(-) diff --git a/.gitignore b/.gitignore index debf68b..6d60135 100644 --- a/.gitignore +++ b/.gitignore @@ -18,5 +18,6 @@ pgo-data.profdata # Env .env -./elf/* +elf +elf/* **/*/db_state.bin diff --git a/crates/zkdb-lib/build.rs b/crates/zkdb-lib/build.rs index edf73f8..ecf051d 100644 --- a/crates/zkdb-lib/build.rs +++ b/crates/zkdb-lib/build.rs @@ -6,8 +6,19 @@ fn main() { let target_dir = env::var("CARGO_MANIFEST_DIR").unwrap(); let binding = PathBuf::from(&target_dir); let workspace_root = &binding.parent().unwrap().parent().unwrap(); + let elf_path = workspace_root + .join("target/elf-compilation/riscv32im-succinct-zkvm-elf/release/zkdb_merkle"); + // Set the ELF env variable. + let elf_path_str = elf_path.to_str().unwrap(); + println!("cargo:rustc-env=ZKDB_ELF_PATH={}", elf_path_str); + + // Skip RISC-V compilation if running under clippy. + if env::var("CLIPPY_ARGS").is_ok() { + println!("cargo:warning=Skipping RISC-V compilation during clippy check"); + return; + } - // Run cargo prove build + // Run cargo prove build. let status = Command::new("cargo") .current_dir(workspace_root.join("crates/zkdb-merkle")) .args([ @@ -28,9 +39,6 @@ fn main() { panic!("Failed to build zkdb_merkle with cargo prove build"); } - let elf_path = workspace_root - .join("target/elf-compilation/riscv32im-succinct-zkvm-elf/release/zkdb_merkle"); - if !elf_path.exists() { panic!( "zkdb_merkle.elf not found at {:?} after cargo prove build", @@ -38,10 +46,6 @@ fn main() { ); } - // set the ELF env variable - let elf_path_str = elf_path.to_str().unwrap(); - println!("cargo:rustc-env=ZKDB_ELF_PATH={}", elf_path_str); - // Tell cargo to rerun this script if the ELF file changes println!("cargo:rerun-if-changed={}", elf_path.display()); } diff --git a/crates/zkdb-lib/src/bin/cli.rs b/crates/zkdb-lib/src/bin/cli.rs index bf3466c..43ae9c2 100644 --- a/crates/zkdb-lib/src/bin/cli.rs +++ b/crates/zkdb-lib/src/bin/cli.rs @@ -1,10 +1,7 @@ -use bincode; use clap::{Arg, Command}; use std::fs; -use std::path::PathBuf; use tracing_subscriber::{self, EnvFilter}; use zkdb_core::QueryResult; -use zkdb_lib::ProvenOutput; use zkdb_lib::{Command as DbCommand, Database}; pub fn init_logging() { @@ -107,7 +104,7 @@ fn main() -> Result<(), Box> { match matches.subcommand() { Some(("init", init_matches)) => { let state_path = init_matches.get_one::("state_path").unwrap(); - let generate_proof = !init_matches.get_flag("no_proof"); + let _generate_proof = !init_matches.get_flag("no_proof"); let initial_state = vec![]; // Empty initial state let db = Database::new(initial_state); println!("Initializing new database"); @@ -214,18 +211,15 @@ fn main() -> Result<(), Box> { fn parse_command(command_str: &str) -> Result> { if let Some(parts) = command_str.split_once(':') { - match parts.0 { - "insert" => { - let (key, value) = parts - .1 - .split_once('=') - .ok_or("Invalid insert format. Use 'insert:key=value'")?; - return Ok(DbCommand::Insert { - key: key.to_string(), - value: value.to_string(), - }); - } - _ => {} + if parts.0 == "insert" { + let (key, value) = parts + .1 + .split_once('=') + .ok_or("Invalid insert format. Use 'insert:key=value'")?; + return Ok(DbCommand::Insert { + key: key.to_string(), + value: value.to_string(), + }); } } diff --git a/crates/zkdb-lib/src/lib.rs b/crates/zkdb-lib/src/lib.rs index d199b06..7d7a9a7 100644 --- a/crates/zkdb-lib/src/lib.rs +++ b/crates/zkdb-lib/src/lib.rs @@ -1,4 +1,3 @@ -use serde::{Deserialize, Serialize}; use sp1_sdk::{ HashableKey, ProverClient, SP1ProofWithPublicValues, SP1ProvingKey, SP1PublicValues, SP1Stdin, SP1VerifyingKey, @@ -13,7 +12,6 @@ use tracing::{debug, error, instrument}; pub use zkdb_core::{Command, QueryResult}; pub struct Database { - elf: &'static [u8], state: Vec, executor: SP1Executor, } @@ -30,9 +28,8 @@ impl Database { let elf = get_elf(); debug!("Loaded ELF binary, size: {} bytes", elf.len()); Database { - elf, state: initial_state, - executor: SP1Executor::new(&elf), + executor: SP1Executor::new(elf), } } diff --git a/crates/zkdb-lib/tests/merkle_tests.rs b/crates/zkdb-lib/tests/merkle_tests.rs index 2390bff..3b28224 100644 --- a/crates/zkdb-lib/tests/merkle_tests.rs +++ b/crates/zkdb-lib/tests/merkle_tests.rs @@ -18,8 +18,8 @@ fn test_insert_and_get() { let insert_result = db.execute_query(insert_command, false).unwrap(); assert!(insert_result.data.is_null()); // Insert should return null - // Get the inserted value - let get_command = Command::Get { + // Query the inserted value + let get_command = Command::Query { key: "test_key".to_string(), }; let get_result = db.execute_query(get_command, false).unwrap(); @@ -35,19 +35,13 @@ fn test_proof_generation_and_verification() { key: "proof_key".to_string(), value: "proof_value".to_string(), }; - let insert_result = db.execute_query(insert_command, true).unwrap(); + let _insert_result = db.execute_query(insert_command, true).unwrap(); - // Verify the proof - assert!(db.verify_proof(&insert_result.new_state).unwrap()); - - // Get the inserted value with proof generation - let get_command = Command::Get { + // Query the inserted value with proof generation + let get_command = Command::Query { key: "proof_key".to_string(), }; let get_result = db.execute_query(get_command, true).unwrap(); - - // Verify the proof - assert!(db.verify_proof(&get_result.new_state).unwrap()); assert_eq!(get_result.data, json!("proof_value")); } @@ -66,7 +60,7 @@ fn test_multiple_operations() { // Verify all inserted values for i in 0..5 { - let get_command = Command::Get { + let get_command = Command::Query { key: format!("key_{}", i), }; let get_result = db.execute_query(get_command, false).unwrap(); @@ -81,7 +75,7 @@ fn test_multiple_operations() { db.execute_query(update_command, false).unwrap(); // Verify the updated value - let get_command = Command::Get { + let get_command = Command::Query { key: "key_2".to_string(), }; let get_result = db.execute_query(get_command, false).unwrap(); From c06027147c0815c65027f8040b2c1240cd97921e Mon Sep 17 00:00:00 2001 From: Conner Swann <2635475+yourbuddyconner@users.noreply.github.com> Date: Tue, 29 Oct 2024 21:12:29 -0700 Subject: [PATCH 09/11] ci --- .github/workflows/{prove.yml => lint.yml} | 5 ----- 1 file changed, 5 deletions(-) rename .github/workflows/{prove.yml => lint.yml} (91%) diff --git a/.github/workflows/prove.yml b/.github/workflows/lint.yml similarity index 91% rename from .github/workflows/prove.yml rename to .github/workflows/lint.yml index a7237ad..a7ebafa 100644 --- a/.github/workflows/prove.yml +++ b/.github/workflows/lint.yml @@ -34,7 +34,6 @@ jobs: - name: Verify SP1 installation run: | cargo prove --version - rustc --print target-list - name: Run cargo fmt uses: actions-rs/cargo@v1 @@ -44,10 +43,6 @@ jobs: env: CARGO_INCREMENTAL: 1 - - name: debug env - run: | - echo $PATH - - name: Run cargo check uses: actions-rs/cargo@v1 env: From 953508b972b5ef4acc50270a304e6d8de434af07 Mon Sep 17 00:00:00 2001 From: Conner Swann <2635475+yourbuddyconner@users.noreply.github.com> Date: Tue, 29 Oct 2024 21:58:59 -0700 Subject: [PATCH 10/11] removed script crate, cleaned up tests --- .github/workflows/lint.yml | 2 +- Cargo.lock | 47 +- Cargo.toml | 5 + crates/script/Cargo.lock | 5960 --------------------- crates/script/Cargo.toml | 30 - crates/script/build.rs | 7 - crates/script/merkle_state.txt | 1 - crates/script/src/bin/db.rs | 86 - crates/script/src/bin/merkle.rs | 147 - crates/script/src/bin/merkle_benchmark.rs | 123 - crates/script/tests/integration_tests.rs | 64 - crates/zkdb-lib/Cargo.toml | 3 + crates/zkdb-lib/src/bin/cli.rs | 6 +- crates/zkdb-lib/src/lib.rs | 21 +- crates/zkdb-lib/tests/merkle_tests.rs | 15 +- crates/zkdb-merkle/src/main.rs | 8 +- 16 files changed, 88 insertions(+), 6437 deletions(-) delete mode 100644 crates/script/Cargo.lock delete mode 100644 crates/script/Cargo.toml delete mode 100644 crates/script/build.rs delete mode 100644 crates/script/merkle_state.txt delete mode 100644 crates/script/src/bin/db.rs delete mode 100644 crates/script/src/bin/merkle.rs delete mode 100644 crates/script/src/bin/merkle_benchmark.rs delete mode 100644 crates/script/tests/integration_tests.rs diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index a7ebafa..04888c1 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -49,4 +49,4 @@ jobs: CARGO_INCREMENTAL: 1 with: command: check - args: --all-targets + args: --all-targets \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 9c7b9c9..fe5369c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -552,7 +552,7 @@ dependencies = [ "bitflags 2.6.0", "cexpr", "clang-sys", - "itertools 0.10.5", + "itertools 0.13.0", "log", "prettyplease", "proc-macro2", @@ -1048,6 +1048,19 @@ dependencies = [ "syn 2.0.82", ] +[[package]] +name = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + [[package]] name = "dashu" version = "0.4.2" @@ -3578,7 +3591,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e9552f850d5f0964a4e4d0bf306459ac29323ddfbae05e35a7c0d35cb0803cc5" dependencies = [ "anyhow", - "itertools 0.10.5", + "itertools 0.13.0", "proc-macro2", "quote", "syn 2.0.82", @@ -4362,6 +4375,20 @@ dependencies = [ "serde", ] +[[package]] +name = "serial_test" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e56dd856803e253c8f298af3f4d7eb0ae5e23a737252cd90bb4f3b435033b2d" +dependencies = [ + "dashmap", + "futures", + "lazy_static", + "log", + "parking_lot", + "serial_test_derive 2.0.0", +] + [[package]] name = "serial_test" version = "3.1.1" @@ -4373,7 +4400,18 @@ dependencies = [ "once_cell", "parking_lot", "scc", - "serial_test_derive", + "serial_test_derive 3.1.1", +] + +[[package]] +name = "serial_test_derive" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91d129178576168c589c9ec973feedf7d3126c01ac2bf08795109aa35b69fb8f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.82", ] [[package]] @@ -4671,7 +4709,7 @@ dependencies = [ "reqwest 0.11.27", "serde", "serde_json", - "serial_test", + "serial_test 3.1.1", "sp1-core-executor", "sp1-core-machine", "sp1-primitives", @@ -6063,6 +6101,7 @@ dependencies = [ "hex", "serde", "serde_json", + "serial_test 2.0.0", "sp1-sdk", "thiserror", "tracing", diff --git a/Cargo.toml b/Cargo.toml index c032628..8ae2711 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,6 +6,11 @@ members = [ ] resolver = "2" +default-members = [ + "crates/zkdb-core", + "crates/zkdb-lib", +] + [workspace.dependencies] alloy-sol-types = "0.7.7" rs_merkle = "1.4.2" diff --git a/crates/script/Cargo.lock b/crates/script/Cargo.lock deleted file mode 100644 index 7307219..0000000 --- a/crates/script/Cargo.lock +++ /dev/null @@ -1,5960 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "Inflector" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" -dependencies = [ - "lazy_static", - "regex", -] - -[[package]] -name = "addchain" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2e69442aa5628ea6951fa33e24efe8313f4321a91bd729fc2f75bdfc858570" -dependencies = [ - "num-bigint 0.3.3", - "num-integer", - "num-traits", -] - -[[package]] -name = "addr2line" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "aes" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" -dependencies = [ - "cfg-if", - "cipher", - "cpufeatures", -] - -[[package]] -name = "ahash" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" -dependencies = [ - "cfg-if", - "once_cell", - "version_check", - "zerocopy", -] - -[[package]] -name = "aho-corasick" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" -dependencies = [ - "memchr", -] - -[[package]] -name = "allocator-api2" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" - -[[package]] -name = "alloy-primitives" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccb3ead547f4532bc8af961649942f0b9c16ee9226e26caa3f38420651cc0bf4" -dependencies = [ - "alloy-rlp", - "bytes", - "cfg-if", - "const-hex", - "derive_more", - "hex-literal", - "itoa", - "k256", - "keccak-asm", - "proptest", - "rand", - "ruint", - "serde", - "tiny-keccak", -] - -[[package]] -name = "alloy-rlp" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a43b18702501396fa9bcdeecd533bc85fac75150d308fc0f6800a01e6234a003" -dependencies = [ - "arrayvec", - "bytes", -] - -[[package]] -name = "alloy-sol-macro" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b40397ddcdcc266f59f959770f601ce1280e699a91fc1862f29cef91707cd09" -dependencies = [ - "alloy-sol-macro-expander", - "alloy-sol-macro-input", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.72", -] - -[[package]] -name = "alloy-sol-macro-expander" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "867a5469d61480fea08c7333ffeca52d5b621f5ca2e44f271b117ec1fc9a0525" -dependencies = [ - "alloy-sol-macro-input", - "const-hex", - "heck", - "indexmap 2.2.6", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.72", - "syn-solidity", - "tiny-keccak", -] - -[[package]] -name = "alloy-sol-macro-input" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e482dc33a32b6fadbc0f599adea520bd3aaa585c141a80b404d0a3e3fa72528" -dependencies = [ - "const-hex", - "dunce", - "heck", - "proc-macro2", - "quote", - "syn 2.0.72", - "syn-solidity", -] - -[[package]] -name = "alloy-sol-types" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a91ca40fa20793ae9c3841b83e74569d1cc9af29a2f5237314fd3452d51e38c7" -dependencies = [ - "alloy-primitives", - "alloy-sol-macro", - "const-hex", - "serde", -] - -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "ansi_term" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" -dependencies = [ - "winapi", -] - -[[package]] -name = "anstream" -version = "0.6.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" - -[[package]] -name = "anstyle-parse" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" -dependencies = [ - "anstyle", - "windows-sys 0.52.0", -] - -[[package]] -name = "anyhow" -version = "1.0.86" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" - -[[package]] -name = "ark-ff" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b3235cc41ee7a12aaaf2c575a2ad7b46713a8a50bda2fc3b003a04845c05dd6" -dependencies = [ - "ark-ff-asm 0.3.0", - "ark-ff-macros 0.3.0", - "ark-serialize 0.3.0", - "ark-std 0.3.0", - "derivative", - "num-bigint 0.4.6", - "num-traits", - "paste", - "rustc_version 0.3.3", - "zeroize", -] - -[[package]] -name = "ark-ff" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" -dependencies = [ - "ark-ff-asm 0.4.2", - "ark-ff-macros 0.4.2", - "ark-serialize 0.4.2", - "ark-std 0.4.0", - "derivative", - "digest 0.10.7", - "itertools 0.10.5", - "num-bigint 0.4.6", - "num-traits", - "paste", - "rustc_version 0.4.0", - "zeroize", -] - -[[package]] -name = "ark-ff-asm" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db02d390bf6643fb404d3d22d31aee1c4bc4459600aef9113833d17e786c6e44" -dependencies = [ - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-asm" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" -dependencies = [ - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-macros" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" -dependencies = [ - "num-bigint 0.4.6", - "num-traits", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-macros" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" -dependencies = [ - "num-bigint 0.4.6", - "num-traits", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-serialize" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6c2b318ee6e10f8c2853e73a83adc0ccb88995aa978d8a3408d492ab2ee671" -dependencies = [ - "ark-std 0.3.0", - "digest 0.9.0", -] - -[[package]] -name = "ark-serialize" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" -dependencies = [ - "ark-std 0.4.0", - "digest 0.10.7", - "num-bigint 0.4.6", -] - -[[package]] -name = "ark-std" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" -dependencies = [ - "num-traits", - "rand", -] - -[[package]] -name = "ark-std" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" -dependencies = [ - "num-traits", - "rand", -] - -[[package]] -name = "arrayref" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d151e35f61089500b617991b791fc8bfd237ae50cd5950803758a179b41e67a" - -[[package]] -name = "arrayvec" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" - -[[package]] -name = "async-trait" -version = "0.1.81" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.72", -] - -[[package]] -name = "async_io_stream" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" -dependencies = [ - "futures", - "pharos", - "rustc_version 0.4.0", -] - -[[package]] -name = "atomic-waker" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" - -[[package]] -name = "auto_impl" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.72", -] - -[[package]] -name = "autocfg" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" - -[[package]] -name = "axum" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1236b4b292f6c4d6dc34604bb5120d85c3fe1d1aa596bd5cc52ca054d13e7b9e" -dependencies = [ - "async-trait", - "axum-core", - "bytes", - "futures-util", - "http 1.1.0", - "http-body 1.0.1", - "http-body-util", - "hyper 1.4.1", - "hyper-util", - "itoa", - "matchit", - "memchr", - "mime", - "percent-encoding", - "pin-project-lite", - "rustversion", - "serde", - "serde_json", - "serde_path_to_error", - "serde_urlencoded", - "sync_wrapper 0.1.2", - "tokio", - "tower", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "axum-core" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15c63fd72d41492dc4f497196f5da1fb04fb7529e631d73630d1b491e47a2e3" -dependencies = [ - "async-trait", - "bytes", - "futures-util", - "http 1.1.0", - "http-body 1.0.1", - "http-body-util", - "mime", - "pin-project-lite", - "rustversion", - "sync_wrapper 0.1.2", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "backtrace" -version = "0.3.73" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" -dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", - "serde", -] - -[[package]] -name = "base16ct" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" - -[[package]] -name = "base64" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" - -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "base64ct" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" - -[[package]] -name = "bech32" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" - -[[package]] -name = "bincode" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" -dependencies = [ - "serde", -] - -[[package]] -name = "bindgen" -version = "0.69.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" -dependencies = [ - "bitflags 2.6.0", - "cexpr", - "clang-sys", - "itertools 0.12.1", - "lazy_static", - "lazycell", - "log", - "prettyplease", - "proc-macro2", - "quote", - "regex", - "rustc-hash", - "shlex", - "syn 2.0.72", - "which", -] - -[[package]] -name = "bit-set" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" -dependencies = [ - "bit-vec", -] - -[[package]] -name = "bit-vec" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" - -[[package]] -name = "bitvec" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" -dependencies = [ - "funty", - "radium", - "tap", - "wyz", -] - -[[package]] -name = "blake2" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "blake2b_simd" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23285ad32269793932e830392f2fe2f83e26488fd3ec778883a93c8323735780" -dependencies = [ - "arrayref", - "arrayvec", - "constant_time_eq", -] - -[[package]] -name = "blake3" -version = "1.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9ec96fe9a81b5e365f9db71fe00edc4fe4ca2cc7dcb7861f0603012a7caa210" -dependencies = [ - "arrayref", - "arrayvec", - "cc", - "cfg-if", - "constant_time_eq", - "rayon-core", -] - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array 0.14.7", -] - -[[package]] -name = "bls12_381" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3c196a77437e7cc2fb515ce413a6401291578b5afc8ecb29a3c7ab957f05941" -dependencies = [ - "ff 0.12.1", - "group 0.12.1", - "pairing", - "rand_core", - "subtle", -] - -[[package]] -name = "bs58" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" -dependencies = [ - "sha2", - "tinyvec", -] - -[[package]] -name = "bumpalo" -version = "3.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" - -[[package]] -name = "byte-slice-cast" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" - -[[package]] -name = "bytemuck" -version = "1.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b236fc92302c97ed75b38da1f4917b5cdda4984745740f153a5d3059e48d725e" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a12916984aab3fa6e39d655a33e09c0071eb36d6ab3aea5c2d78551f1df6d952" -dependencies = [ - "serde", -] - -[[package]] -name = "camino" -version = "1.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0ec6b951b160caa93cc0c7b209e5a3bff7aae9062213451ac99493cd844c239" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo-platform" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo_metadata" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" -dependencies = [ - "camino", - "cargo-platform", - "semver 1.0.23", - "serde", - "serde_json", - "thiserror", -] - -[[package]] -name = "cc" -version = "1.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2aba8f4e9906c7ce3c73463f62a7f0c65183ada1a2d47e397cc8810827f9694f" -dependencies = [ - "jobserver", - "libc", -] - -[[package]] -name = "cexpr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" -dependencies = [ - "nom", -] - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "chrono" -version = "0.4.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" -dependencies = [ - "android-tzdata", - "iana-time-zone", - "num-traits", - "serde", - "windows-targets 0.52.6", -] - -[[package]] -name = "cipher" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" -dependencies = [ - "crypto-common", - "inout", -] - -[[package]] -name = "clang-sys" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" -dependencies = [ - "glob", - "libc", - "libloading", -] - -[[package]] -name = "clap" -version = "4.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f6b81fb3c84f5563d509c59b5a48d935f689e993afa90fe39047f05adef9142" -dependencies = [ - "clap_builder", - "clap_derive", -] - -[[package]] -name = "clap_builder" -version = "4.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca6706fd5224857d9ac5eb9355f6683563cc0541c7cd9d014043b57cbec78ac" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim", -] - -[[package]] -name = "clap_derive" -version = "4.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bac35c6dafb060fd4d275d9a4ffae97917c13a6327903a8be2153cd964f7085" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.72", -] - -[[package]] -name = "clap_lex" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70" - -[[package]] -name = "cobs" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15" - -[[package]] -name = "coins-bip32" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b6be4a5df2098cd811f3194f64ddb96c267606bffd9689ac7b0160097b01ad3" -dependencies = [ - "bs58", - "coins-core", - "digest 0.10.7", - "hmac", - "k256", - "serde", - "sha2", - "thiserror", -] - -[[package]] -name = "coins-bip39" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3db8fba409ce3dc04f7d804074039eb68b960b0829161f8e06c95fea3f122528" -dependencies = [ - "bitvec", - "coins-bip32", - "hmac", - "once_cell", - "pbkdf2 0.12.2", - "rand", - "sha2", - "thiserror", -] - -[[package]] -name = "coins-core" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5286a0843c21f8367f7be734f89df9b822e0321d8bcce8d6e735aadff7d74979" -dependencies = [ - "base64 0.21.7", - "bech32", - "bs58", - "digest 0.10.7", - "generic-array 0.14.7", - "hex", - "ripemd", - "serde", - "serde_derive", - "sha2", - "sha3", - "thiserror", -] - -[[package]] -name = "colorchoice" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" - -[[package]] -name = "console" -version = "0.15.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" -dependencies = [ - "encode_unicode", - "lazy_static", - "libc", - "unicode-width", - "windows-sys 0.52.0", -] - -[[package]] -name = "const-hex" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94fb8a24a26d37e1ffd45343323dc9fe6654ceea44c12f2fcb3d7ac29e610bc6" -dependencies = [ - "cfg-if", - "cpufeatures", - "hex", - "proptest", - "serde", -] - -[[package]] -name = "const-oid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - -[[package]] -name = "constant_time_eq" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" - -[[package]] -name = "convert_case" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" - -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" - -[[package]] -name = "cpufeatures" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" -dependencies = [ - "libc", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" - -[[package]] -name = "crunchy" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" - -[[package]] -name = "crypto-bigint" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" -dependencies = [ - "generic-array 0.14.7", - "rand_core", - "subtle", - "zeroize", -] - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array 0.14.7", - "typenum", -] - -[[package]] -name = "ctr" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" -dependencies = [ - "cipher", -] - -[[package]] -name = "curve25519-dalek" -version = "4.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" -dependencies = [ - "cfg-if", - "cpufeatures", - "curve25519-dalek-derive", - "fiat-crypto", - "rustc_version 0.4.0", - "subtle", - "zeroize", -] - -[[package]] -name = "curve25519-dalek-derive" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.72", -] - -[[package]] -name = "darling" -version = "0.20.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.20.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 2.0.72", -] - -[[package]] -name = "darling_macro" -version = "0.20.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" -dependencies = [ - "darling_core", - "quote", - "syn 2.0.72", -] - -[[package]] -name = "der" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" -dependencies = [ - "const-oid", - "zeroize", -] - -[[package]] -name = "deranged" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" -dependencies = [ - "powerfmt", - "serde", -] - -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "derive_more" -version = "0.99.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" -dependencies = [ - "convert_case", - "proc-macro2", - "quote", - "rustc_version 0.4.0", - "syn 2.0.72", -] - -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array 0.14.7", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "const-oid", - "crypto-common", - "subtle", -] - -[[package]] -name = "dirs" -version = "5.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" -dependencies = [ - "dirs-sys", -] - -[[package]] -name = "dirs-sys" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" -dependencies = [ - "libc", - "option-ext", - "redox_users", - "windows-sys 0.48.0", -] - -[[package]] -name = "downcast-rs" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" - -[[package]] -name = "dunce" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" - -[[package]] -name = "ecdsa" -version = "0.16.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" -dependencies = [ - "der", - "digest 0.10.7", - "elliptic-curve", - "rfc6979", - "signature", - "spki", -] - -[[package]] -name = "either" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" - -[[package]] -name = "elf" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4445909572dbd556c457c849c4ca58623d84b27c8fff1e74b0b4227d8b90d17b" - -[[package]] -name = "elliptic-curve" -version = "0.13.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" -dependencies = [ - "base16ct", - "crypto-bigint", - "digest 0.10.7", - "ff 0.13.0", - "generic-array 0.14.7", - "group 0.13.0", - "pkcs8", - "rand_core", - "sec1", - "subtle", - "zeroize", -] - -[[package]] -name = "embedded-io" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" - -[[package]] -name = "encode_unicode" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" - -[[package]] -name = "encoding_rs" -version = "0.8.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "enr" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a3d8dc56e02f954cac8eb489772c552c473346fc34f67412bb6244fd647f7e4" -dependencies = [ - "base64 0.21.7", - "bytes", - "hex", - "k256", - "log", - "rand", - "rlp", - "serde", - "sha3", - "zeroize", -] - -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "errno" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "eth-keystore" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fda3bf123be441da5260717e0661c25a2fd9cb2b2c1d20bf2e05580047158ab" -dependencies = [ - "aes", - "ctr", - "digest 0.10.7", - "hex", - "hmac", - "pbkdf2 0.11.0", - "rand", - "scrypt", - "serde", - "serde_json", - "sha2", - "sha3", - "thiserror", - "uuid", -] - -[[package]] -name = "ethabi" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7413c5f74cc903ea37386a8965a936cbeb334bd270862fdece542c1b2dcbc898" -dependencies = [ - "ethereum-types", - "hex", - "once_cell", - "regex", - "serde", - "serde_json", - "sha3", - "thiserror", - "uint", -] - -[[package]] -name = "ethbloom" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" -dependencies = [ - "crunchy", - "fixed-hash", - "impl-codec", - "impl-rlp", - "impl-serde", - "scale-info", - "tiny-keccak", -] - -[[package]] -name = "ethereum-types" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" -dependencies = [ - "ethbloom", - "fixed-hash", - "impl-codec", - "impl-rlp", - "impl-serde", - "primitive-types", - "scale-info", - "uint", -] - -[[package]] -name = "ethers" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "816841ea989f0c69e459af1cf23a6b0033b19a55424a1ea3a30099becdb8dec0" -dependencies = [ - "ethers-addressbook", - "ethers-contract", - "ethers-core", - "ethers-middleware", - "ethers-providers", - "ethers-signers", -] - -[[package]] -name = "ethers-addressbook" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5495afd16b4faa556c3bba1f21b98b4983e53c1755022377051a975c3b021759" -dependencies = [ - "ethers-core", - "once_cell", - "serde", - "serde_json", -] - -[[package]] -name = "ethers-contract" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fceafa3578c836eeb874af87abacfb041f92b4da0a78a5edd042564b8ecdaaa" -dependencies = [ - "const-hex", - "ethers-contract-abigen", - "ethers-contract-derive", - "ethers-core", - "ethers-providers", - "futures-util", - "once_cell", - "pin-project", - "serde", - "serde_json", - "thiserror", -] - -[[package]] -name = "ethers-contract-abigen" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04ba01fbc2331a38c429eb95d4a570166781f14290ef9fdb144278a90b5a739b" -dependencies = [ - "Inflector", - "const-hex", - "dunce", - "ethers-core", - "eyre", - "prettyplease", - "proc-macro2", - "quote", - "regex", - "serde", - "serde_json", - "syn 2.0.72", - "toml", - "walkdir", -] - -[[package]] -name = "ethers-contract-derive" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87689dcabc0051cde10caaade298f9e9093d65f6125c14575db3fd8c669a168f" -dependencies = [ - "Inflector", - "const-hex", - "ethers-contract-abigen", - "ethers-core", - "proc-macro2", - "quote", - "serde_json", - "syn 2.0.72", -] - -[[package]] -name = "ethers-core" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82d80cc6ad30b14a48ab786523af33b37f28a8623fc06afd55324816ef18fb1f" -dependencies = [ - "arrayvec", - "bytes", - "cargo_metadata", - "chrono", - "const-hex", - "elliptic-curve", - "ethabi", - "generic-array 0.14.7", - "k256", - "num_enum 0.7.2", - "once_cell", - "open-fastrlp", - "rand", - "rlp", - "serde", - "serde_json", - "strum", - "syn 2.0.72", - "tempfile", - "thiserror", - "tiny-keccak", - "unicode-xid", -] - -[[package]] -name = "ethers-middleware" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48f9fdf09aec667c099909d91908d5eaf9be1bd0e2500ba4172c1d28bfaa43de" -dependencies = [ - "async-trait", - "auto_impl", - "ethers-contract", - "ethers-core", - "ethers-providers", - "ethers-signers", - "futures-channel", - "futures-locks", - "futures-util", - "instant", - "reqwest 0.11.27", - "serde", - "serde_json", - "thiserror", - "tokio", - "tracing", - "tracing-futures", - "url", -] - -[[package]] -name = "ethers-providers" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6434c9a33891f1effc9c75472e12666db2fa5a0fec4b29af6221680a6fe83ab2" -dependencies = [ - "async-trait", - "auto_impl", - "base64 0.21.7", - "bytes", - "const-hex", - "enr", - "ethers-core", - "futures-core", - "futures-timer", - "futures-util", - "hashers", - "http 0.2.12", - "instant", - "jsonwebtoken", - "once_cell", - "pin-project", - "reqwest 0.11.27", - "serde", - "serde_json", - "thiserror", - "tokio", - "tracing", - "tracing-futures", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "ws_stream_wasm", -] - -[[package]] -name = "ethers-signers" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "228875491c782ad851773b652dd8ecac62cda8571d3bc32a5853644dd26766c2" -dependencies = [ - "async-trait", - "coins-bip32", - "coins-bip39", - "const-hex", - "elliptic-curve", - "eth-keystore", - "ethers-core", - "rand", - "sha2", - "thiserror", - "tracing", -] - -[[package]] -name = "eyre" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" -dependencies = [ - "indenter", - "once_cell", -] - -[[package]] -name = "fastrand" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" - -[[package]] -name = "fastrlp" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139834ddba373bbdd213dffe02c8d110508dcf1726c2be27e8d1f7d7e1856418" -dependencies = [ - "arrayvec", - "auto_impl", - "bytes", -] - -[[package]] -name = "ff" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" -dependencies = [ - "bitvec", - "rand_core", - "subtle", -] - -[[package]] -name = "ff" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" -dependencies = [ - "bitvec", - "byteorder", - "ff_derive", - "rand_core", - "subtle", -] - -[[package]] -name = "ff_derive" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9f54704be45ed286151c5e11531316eaef5b8f5af7d597b806fdb8af108d84a" -dependencies = [ - "addchain", - "cfg-if", - "num-bigint 0.3.3", - "num-integer", - "num-traits", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "fiat-crypto" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" - -[[package]] -name = "fibonacci-script" -version = "0.1.0" -dependencies = [ - "alloy-sol-types", - "clap", - "hex", - "serde", - "serde_json", - "sp1-helper", - "sp1-sdk", - "tracing", -] - -[[package]] -name = "fixed-hash" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" -dependencies = [ - "byteorder", - "rand", - "rustc-hex", - "static_assertions", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - -[[package]] -name = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - -[[package]] -name = "futures" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" - -[[package]] -name = "futures-executor" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" - -[[package]] -name = "futures-locks" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45ec6fe3675af967e67c5536c0b9d44e34e6c52f86bedc4ea49c5317b8e94d06" -dependencies = [ - "futures-channel", - "futures-task", -] - -[[package]] -name = "futures-macro" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.72", -] - -[[package]] -name = "futures-sink" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" - -[[package]] -name = "futures-task" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" - -[[package]] -name = "futures-timer" -version = "3.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" -dependencies = [ - "gloo-timers", - "send_wrapper 0.4.0", -] - -[[package]] -name = "futures-util" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - -[[package]] -name = "gcd" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d758ba1b47b00caf47f24925c0074ecb20d6dfcffe7f6d53395c0465674841a" - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", - "zeroize", -] - -[[package]] -name = "generic-array" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96512db27971c2c3eece70a1e106fbe6c87760234e31e8f7e5634912fe52794a" -dependencies = [ - "serde", - "typenum", -] - -[[package]] -name = "getrandom" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - -[[package]] -name = "gimli" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" - -[[package]] -name = "git2" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b903b73e45dc0c6c596f2d37eccece7c1c8bb6e4407b001096387c63d0d93724" -dependencies = [ - "bitflags 2.6.0", - "libc", - "libgit2-sys", - "log", - "url", -] - -[[package]] -name = "glob" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" - -[[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 = "group" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" -dependencies = [ - "ff 0.12.1", - "memuse", - "rand_core", - "subtle", -] - -[[package]] -name = "group" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" -dependencies = [ - "ff 0.13.0", - "rand_core", - "subtle", -] - -[[package]] -name = "h2" -version = "0.3.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http 0.2.12", - "indexmap 2.2.6", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "h2" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa82e28a107a8cc405f0839610bdc9b15f1e25ec7d696aa5cf173edbcb1486ab" -dependencies = [ - "atomic-waker", - "bytes", - "fnv", - "futures-core", - "futures-sink", - "http 1.1.0", - "indexmap 2.2.6", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "halo2" -version = "0.1.0-beta.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a23c779b38253fe1538102da44ad5bd5378495a61d2c4ee18d64eaa61ae5995" -dependencies = [ - "halo2_proofs", -] - -[[package]] -name = "halo2_proofs" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e925780549adee8364c7f2b685c753f6f3df23bde520c67416e93bf615933760" -dependencies = [ - "blake2b_simd", - "ff 0.12.1", - "group 0.12.1", - "pasta_curves 0.4.1", - "rand_core", - "rayon", -] - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -dependencies = [ - "ahash", - "allocator-api2", - "serde", -] - -[[package]] -name = "hashers" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2bca93b15ea5a746f220e56587f71e73c6165eab783df9e26590069953e3c30" -dependencies = [ - "fxhash", -] - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "hex-literal" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "home" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "http" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" -dependencies = [ - "bytes", - "http 0.2.12", - "pin-project-lite", -] - -[[package]] -name = "http-body" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" -dependencies = [ - "bytes", - "http 1.1.0", -] - -[[package]] -name = "http-body-util" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" -dependencies = [ - "bytes", - "futures-util", - "http 1.1.0", - "http-body 1.0.1", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" - -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - -[[package]] -name = "hyper" -version = "0.14.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2 0.3.26", - "http 0.2.12", - "http-body 0.4.6", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", -] - -[[package]] -name = "hyper" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "h2 0.4.5", - "http 1.1.0", - "http-body 1.0.1", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.27.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155" -dependencies = [ - "futures-util", - "http 1.1.0", - "hyper 1.4.1", - "hyper-util", - "rustls", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tower-service", - "webpki-roots", -] - -[[package]] -name = "hyper-tls" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" -dependencies = [ - "bytes", - "http-body-util", - "hyper 1.4.1", - "hyper-util", - "native-tls", - "tokio", - "tokio-native-tls", - "tower-service", -] - -[[package]] -name = "hyper-util" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ab92f4f49ee4fb4f997c784b7a2e0fa70050211e0b6a287f898c3c9785ca956" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http 1.1.0", - "http-body 1.0.1", - "hyper 1.4.1", - "pin-project-lite", - "socket2", - "tokio", - "tower", - "tower-service", - "tracing", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows-core", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "idna" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "impl-codec" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" -dependencies = [ - "parity-scale-codec", -] - -[[package]] -name = "impl-rlp" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28220f89297a075ddc7245cd538076ee98b01f2a9c23a53a4f1105d5a322808" -dependencies = [ - "rlp", -] - -[[package]] -name = "impl-serde" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" -dependencies = [ - "serde", -] - -[[package]] -name = "impl-trait-for-tuples" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "indenter" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" - -[[package]] -name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", - "serde", -] - -[[package]] -name = "indexmap" -version = "2.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" -dependencies = [ - "equivalent", - "hashbrown 0.14.5", - "serde", -] - -[[package]] -name = "indicatif" -version = "0.17.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "763a5a8f45087d6bcea4222e7b72c291a054edf80e4ef6efd2a4979878c7bea3" -dependencies = [ - "console", - "instant", - "number_prefix", - "portable-atomic", - "unicode-width", -] - -[[package]] -name = "inout" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" -dependencies = [ - "generic-array 0.14.7", -] - -[[package]] -name = "instant" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "ipnet" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" - -[[package]] -name = "is_terminal_polyfill" -version = "1.70.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" - -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" - -[[package]] -name = "jobserver" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" -dependencies = [ - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "jsonwebtoken" -version = "8.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6971da4d9c3aa03c3d8f3ff0f4155b534aad021292003895a469716b2a230378" -dependencies = [ - "base64 0.21.7", - "pem", - "ring 0.16.20", - "serde", - "serde_json", - "simple_asn1", -] - -[[package]] -name = "jubjub" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a575df5f985fe1cd5b2b05664ff6accfc46559032b954529fd225a2168d27b0f" -dependencies = [ - "bitvec", - "bls12_381", - "ff 0.12.1", - "group 0.12.1", - "rand_core", - "subtle", -] - -[[package]] -name = "k256" -version = "0.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" -dependencies = [ - "cfg-if", - "ecdsa", - "elliptic-curve", - "once_cell", - "sha2", - "signature", -] - -[[package]] -name = "keccak" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" -dependencies = [ - "cpufeatures", -] - -[[package]] -name = "keccak-asm" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47a3633291834c4fbebf8673acbc1b04ec9d151418ff9b8e26dcd79129928758" -dependencies = [ - "digest 0.10.7", - "sha3-asm", -] - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" -dependencies = [ - "spin 0.9.8", -] - -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - -[[package]] -name = "libc" -version = "0.2.155" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" - -[[package]] -name = "libgit2-sys" -version = "0.17.0+1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10472326a8a6477c3c20a64547b0059e4b0d086869eee31e6d7da728a8eb7224" -dependencies = [ - "cc", - "libc", - "libz-sys", - "pkg-config", -] - -[[package]] -name = "libloading" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" -dependencies = [ - "cfg-if", - "windows-targets 0.52.6", -] - -[[package]] -name = "libm" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" - -[[package]] -name = "libredox" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" -dependencies = [ - "bitflags 2.6.0", - "libc", -] - -[[package]] -name = "libz-sys" -version = "1.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c15da26e5af7e25c90b37a2d75cdbf940cf4a55316de9d84c679c9b8bfabf82e" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "linux-raw-sys" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" - -[[package]] -name = "lock_api" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -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 = "matchit" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" - -[[package]] -name = "memchr" -version = "2.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" - -[[package]] -name = "memuse" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2145869435ace5ea6ea3d35f59be559317ec9a0d04e1812d5f185a87b6d36f1a" - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "miniz_oxide" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" -dependencies = [ - "adler", -] - -[[package]] -name = "mio" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4569e456d394deccd22ce1c1913e6ea0e54519f577285001215d33557431afe4" -dependencies = [ - "hermit-abi", - "libc", - "wasi", - "windows-sys 0.52.0", -] - -[[package]] -name = "native-tls" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" -dependencies = [ - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - -[[package]] -name = "nohash-hasher" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" - -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[package]] -name = "ntapi" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" -dependencies = [ - "winapi", -] - -[[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" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" -dependencies = [ - "num-bigint 0.4.6", - "num-complex", - "num-integer", - "num-iter", - "num-rational", - "num-traits", -] - -[[package]] -name = "num-bigint" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6f7833f2cbf2360a6cfd58cd41a53aa7a90bd4c202f5b1c7dd2ed73c57b2c3" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-bigint" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" -dependencies = [ - "num-integer", - "num-traits", -] - -[[package]] -name = "num-complex" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-conv" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-iter" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" -dependencies = [ - "num-bigint 0.4.6", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", - "libm", -] - -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "num_enum" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" -dependencies = [ - "num_enum_derive 0.5.11", -] - -[[package]] -name = "num_enum" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845" -dependencies = [ - "num_enum_derive 0.7.2", -] - -[[package]] -name = "num_enum_derive" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" -dependencies = [ - "proc-macro-crate 1.3.1", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "num_enum_derive" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" -dependencies = [ - "proc-macro-crate 3.1.0", - "proc-macro2", - "quote", - "syn 2.0.72", -] - -[[package]] -name = "num_threads" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" -dependencies = [ - "libc", -] - -[[package]] -name = "number_prefix" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" - -[[package]] -name = "object" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "081b846d1d56ddfc18fdf1a922e4f6e07a11768ea1b92dec44e42b72712ccfce" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" - -[[package]] -name = "oneshot" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e296cf87e61c9cfc1a61c3c63a0f7f286ed4554e0e22be84e8a38e1d264a2a29" - -[[package]] -name = "open-fastrlp" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "786393f80485445794f6043fd3138854dd109cc6c4bd1a6383db304c9ce9b9ce" -dependencies = [ - "arrayvec", - "auto_impl", - "bytes", - "ethereum-types", - "open-fastrlp-derive", -] - -[[package]] -name = "open-fastrlp-derive" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "003b2be5c6c53c1cfeb0a238b8a1c3915cd410feb684457a36c10038f764bb1c" -dependencies = [ - "bytes", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "openssl" -version = "0.10.66" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" -dependencies = [ - "bitflags 2.6.0", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.72", -] - -[[package]] -name = "openssl-probe" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" - -[[package]] -name = "openssl-sys" -version = "0.9.103" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "option-ext" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" - -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - -[[package]] -name = "p3-air" -version = "0.1.3-succinct" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45e909ef66fa5d77ff0fd3cb5af4b33b27fa6fb68d02b9b1e70edbc29383e565" -dependencies = [ - "p3-field", - "p3-matrix", -] - -[[package]] -name = "p3-baby-bear" -version = "0.1.3-succinct" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46965470aac1cddfe52f535424b59d52f2fffef0fdeb9dbed19da39b1d8f048a" -dependencies = [ - "num-bigint 0.4.6", - "p3-field", - "p3-mds", - "p3-poseidon2", - "p3-symmetric", - "rand", - "serde", -] - -[[package]] -name = "p3-blake3" -version = "0.1.3-succinct" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36ef32d6ea21dd5cf9fec8a31bf0c64e6ceee8901dbf50966b83a443093c2aba" -dependencies = [ - "blake3", - "p3-symmetric", -] - -[[package]] -name = "p3-bn254-fr" -version = "0.1.3-succinct" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e3edfca6be3b3109adf8e3330baec30c3fc5f9f4d63d27aaec1b471ca51ed67" -dependencies = [ - "ff 0.13.0", - "num-bigint 0.4.6", - "p3-field", - "p3-poseidon2", - "p3-symmetric", - "rand", - "serde", -] - -[[package]] -name = "p3-challenger" -version = "0.1.3-succinct" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6662ea899a5d848b60c699944491d72757873b5e1fd46798e4712f90a03a4e9" -dependencies = [ - "p3-field", - "p3-maybe-rayon", - "p3-symmetric", - "p3-util", - "tracing", -] - -[[package]] -name = "p3-commit" -version = "0.1.3-succinct" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc3563918b5cc44ef5280bf9b51753e70dc78802de25e3fb81ed6c94617ccb6e" -dependencies = [ - "itertools 0.12.1", - "p3-challenger", - "p3-field", - "p3-matrix", - "p3-util", - "serde", -] - -[[package]] -name = "p3-dft" -version = "0.1.3-succinct" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "510095701819d83c9509fe825bbf1ebfe50426ae75149df5fe1dcfd18261323a" -dependencies = [ - "p3-field", - "p3-matrix", - "p3-maybe-rayon", - "p3-util", - "tracing", -] - -[[package]] -name = "p3-field" -version = "0.1.3-succinct" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61f1977a0a65789f719aa824119c332c4676b000bdbfe94d312fb6244a70d601" -dependencies = [ - "itertools 0.12.1", - "num-bigint 0.4.6", - "num-traits", - "p3-util", - "rand", - "serde", -] - -[[package]] -name = "p3-fri" -version = "0.1.3-succinct" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c22ddb958f200d9289cc73ff68847b0167ca0c14557b791dd9e318f98c2d1b28" -dependencies = [ - "itertools 0.12.1", - "p3-challenger", - "p3-commit", - "p3-dft", - "p3-field", - "p3-interpolation", - "p3-matrix", - "p3-maybe-rayon", - "p3-util", - "serde", - "tracing", -] - -[[package]] -name = "p3-interpolation" -version = "0.1.3-succinct" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d032cda212f6b408d7d5b0b9a8270a9455acb93742fe55a0880d82be8e90e500" -dependencies = [ - "p3-field", - "p3-matrix", - "p3-util", -] - -[[package]] -name = "p3-keccak" -version = "0.1.3-succinct" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c56abdd5a8a780049d2f8e92cea1df57b55a2ef50a40d1103f2732f7a00e4b1" -dependencies = [ - "p3-symmetric", - "tiny-keccak", -] - -[[package]] -name = "p3-keccak-air" -version = "0.1.3-succinct" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8398f1694ccc38513df0b8cab5f9ef7325423f27cd9e4fa20bdc77d5079cf1b" -dependencies = [ - "p3-air", - "p3-field", - "p3-matrix", - "p3-maybe-rayon", - "p3-util", - "tracing", - "tracing-forest", - "tracing-subscriber", -] - -[[package]] -name = "p3-matrix" -version = "0.1.3-succinct" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d548ee0b834f8e2ebc5037073acd101a3b0ca41a2d1d28a15ba0ccd9059495b0" -dependencies = [ - "itertools 0.12.1", - "p3-field", - "p3-maybe-rayon", - "p3-util", - "rand", - "serde", - "tracing", -] - -[[package]] -name = "p3-maybe-rayon" -version = "0.1.3-succinct" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55f5575d3d61bedb3e05681abb0f36b8bb339d65aa395d50756bfa64e9cd3f46" -dependencies = [ - "rayon", -] - -[[package]] -name = "p3-mds" -version = "0.1.3-succinct" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6e57ed310d59245f93e24ee805ea7aa16fc9c505551b76a15f5e50f29d177e" -dependencies = [ - "itertools 0.12.1", - "p3-dft", - "p3-field", - "p3-matrix", - "p3-symmetric", - "p3-util", - "rand", -] - -[[package]] -name = "p3-merkle-tree" -version = "0.1.3-succinct" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af46b41cba75d483ec8a553cbab1d2d794935ae3403d75394acfa4fb2c977cce" -dependencies = [ - "itertools 0.12.1", - "p3-commit", - "p3-field", - "p3-matrix", - "p3-maybe-rayon", - "p3-symmetric", - "p3-util", - "serde", - "tracing", -] - -[[package]] -name = "p3-poseidon2" -version = "0.1.3-succinct" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adaba6f14c197203530e233badce0ca1126ba3bf3c9ff766505b497bdad0bee1" -dependencies = [ - "gcd", - "p3-field", - "p3-mds", - "p3-symmetric", - "rand", -] - -[[package]] -name = "p3-symmetric" -version = "0.1.3-succinct" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57ecc4282566eb14f48be7707f6745c4dff6be664984d59ec0fb1849cd82b5c2" -dependencies = [ - "itertools 0.12.1", - "p3-field", - "serde", -] - -[[package]] -name = "p3-uni-stark" -version = "0.1.3-succinct" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1af5c038b22b058bf1d49fb1ea3dd6c240a3e46c3278fde5c444e0034f7ffe37" -dependencies = [ - "itertools 0.12.1", - "p3-air", - "p3-challenger", - "p3-commit", - "p3-dft", - "p3-field", - "p3-matrix", - "p3-maybe-rayon", - "p3-util", - "postcard", - "serde", - "tracing", - "tracing-forest", - "tracing-subscriber", -] - -[[package]] -name = "p3-util" -version = "0.1.3-succinct" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79f3fef0e00d9d7246385e758c4cd39b4efcbbcea31752471491ab502631385e" -dependencies = [ - "serde", -] - -[[package]] -name = "pairing" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "135590d8bdba2b31346f9cd1fb2a912329f5135e832a4f422942eb6ead8b6b3b" -dependencies = [ - "group 0.12.1", -] - -[[package]] -name = "parity-scale-codec" -version = "3.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" -dependencies = [ - "arrayvec", - "bitvec", - "byte-slice-cast", - "impl-trait-for-tuples", - "parity-scale-codec-derive", - "serde", -] - -[[package]] -name = "parity-scale-codec-derive" -version = "3.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d830939c76d294956402033aee57a6da7b438f2294eb94864c37b0569053a42c" -dependencies = [ - "proc-macro-crate 3.1.0", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "parking_lot" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-targets 0.52.6", -] - -[[package]] -name = "pasta_curves" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc65faf8e7313b4b1fbaa9f7ca917a0eed499a9663be71477f87993604341d8" -dependencies = [ - "blake2b_simd", - "ff 0.12.1", - "group 0.12.1", - "lazy_static", - "rand", - "static_assertions", - "subtle", -] - -[[package]] -name = "pasta_curves" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e57598f73cc7e1b2ac63c79c517b31a0877cd7c402cdcaa311b5208de7a095" -dependencies = [ - "blake2b_simd", - "ff 0.13.0", - "group 0.13.0", - "lazy_static", - "rand", - "static_assertions", - "subtle", -] - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "pbkdf2" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "pbkdf2" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" -dependencies = [ - "digest 0.10.7", - "hmac", -] - -[[package]] -name = "pem" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" -dependencies = [ - "base64 0.13.1", -] - -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "pest" -version = "2.7.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd53dff83f26735fdc1ca837098ccf133605d794cdae66acfc2bfac3ec809d95" -dependencies = [ - "memchr", - "thiserror", - "ucd-trie", -] - -[[package]] -name = "pharos" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" -dependencies = [ - "futures", - "rustc_version 0.4.0", -] - -[[package]] -name = "pin-project" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.72", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der", - "spki", -] - -[[package]] -name = "pkg-config" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" - -[[package]] -name = "portable-atomic" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da544ee218f0d287a911e9c99a39a8c9bc8fcad3cb8db5959940044ecfc67265" - -[[package]] -name = "postcard" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a55c51ee6c0db07e68448e336cf8ea4131a620edefebf9893e759b2d793420f8" -dependencies = [ - "cobs", - "embedded-io", - "serde", -] - -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - -[[package]] -name = "ppv-lite86" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - -[[package]] -name = "prettyplease" -version = "0.2.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" -dependencies = [ - "proc-macro2", - "syn 2.0.72", -] - -[[package]] -name = "primitive-types" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" -dependencies = [ - "fixed-hash", - "impl-codec", - "impl-rlp", - "impl-serde", - "scale-info", - "uint", -] - -[[package]] -name = "proc-macro-crate" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" -dependencies = [ - "once_cell", - "toml_edit 0.19.15", -] - -[[package]] -name = "proc-macro-crate" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" -dependencies = [ - "toml_edit 0.21.1", -] - -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn 1.0.109", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - -[[package]] -name = "proc-macro2" -version = "1.0.86" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "proptest" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c2511913b88df1637da85cc8d96ec8e43a3f8bb8ccb71ee1ac240d6f3df58d" -dependencies = [ - "bit-set", - "bit-vec", - "bitflags 2.6.0", - "lazy_static", - "num-traits", - "rand", - "rand_chacha", - "rand_xorshift", - "regex-syntax 0.8.4", - "rusty-fork", - "tempfile", - "unarray", -] - -[[package]] -name = "prost" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29" -dependencies = [ - "bytes", - "prost-derive", -] - -[[package]] -name = "prost-derive" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" -dependencies = [ - "anyhow", - "itertools 0.12.1", - "proc-macro2", - "quote", - "syn 2.0.72", -] - -[[package]] -name = "psm" -version = "0.1.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5787f7cda34e3033a72192c018bc5883100330f362ef279a8cbccfce8bb4e874" -dependencies = [ - "cc", -] - -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - -[[package]] -name = "quinn" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4ceeeeabace7857413798eb1ffa1e9c905a9946a57d81fb69b4b71c4d8eb3ad" -dependencies = [ - "bytes", - "pin-project-lite", - "quinn-proto", - "quinn-udp", - "rustc-hash", - "rustls", - "thiserror", - "tokio", - "tracing", -] - -[[package]] -name = "quinn-proto" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddf517c03a109db8100448a4be38d498df8a210a99fe0e1b9eaf39e78c640efe" -dependencies = [ - "bytes", - "rand", - "ring 0.17.8", - "rustc-hash", - "rustls", - "slab", - "thiserror", - "tinyvec", - "tracing", -] - -[[package]] -name = "quinn-udp" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bffec3605b73c6f1754535084a85229fa8a30f86014e6c81aeec4abb68b0285" -dependencies = [ - "libc", - "once_cell", - "socket2", - "windows-sys 0.52.0", -] - -[[package]] -name = "quote" -version = "1.0.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "radium" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "rand_xorshift" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" -dependencies = [ - "rand_core", -] - -[[package]] -name = "rayon" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - -[[package]] -name = "rayon-scan" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f87cc11a0140b4b0da0ffc889885760c61b13672d80a908920b2c0df078fa14" -dependencies = [ - "rayon", -] - -[[package]] -name = "redox_syscall" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" -dependencies = [ - "bitflags 2.6.0", -] - -[[package]] -name = "redox_users" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" -dependencies = [ - "getrandom", - "libredox", - "thiserror", -] - -[[package]] -name = "regex" -version = "1.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata 0.4.7", - "regex-syntax 0.8.4", -] - -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax 0.6.29", -] - -[[package]] -name = "regex-automata" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax 0.8.4", -] - -[[package]] -name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - -[[package]] -name = "regex-syntax" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" - -[[package]] -name = "reqwest" -version = "0.11.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" -dependencies = [ - "base64 0.21.7", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2 0.3.26", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.30", - "ipnet", - "js-sys", - "log", - "mime", - "once_cell", - "percent-encoding", - "pin-project-lite", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper 0.1.2", - "system-configuration", - "tokio", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "winreg 0.50.0", -] - -[[package]] -name = "reqwest" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7d6d2a27d57148378eb5e111173f4276ad26340ecc5c49a4a2152167a2d6a37" -dependencies = [ - "base64 0.22.1", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2 0.4.5", - "http 1.1.0", - "http-body 1.0.1", - "http-body-util", - "hyper 1.4.1", - "hyper-rustls", - "hyper-tls", - "hyper-util", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "quinn", - "rustls", - "rustls-pemfile", - "rustls-pki-types", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper 1.0.1", - "system-configuration", - "tokio", - "tokio-native-tls", - "tokio-rustls", - "tokio-util", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", - "webpki-roots", - "winreg 0.52.0", -] - -[[package]] -name = "reqwest-middleware" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39346a33ddfe6be00cbc17a34ce996818b97b230b87229f10114693becca1268" -dependencies = [ - "anyhow", - "async-trait", - "http 1.1.0", - "reqwest 0.12.5", - "serde", - "thiserror", - "tower-service", -] - -[[package]] -name = "rfc6979" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" -dependencies = [ - "hmac", - "subtle", -] - -[[package]] -name = "ring" -version = "0.16.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" -dependencies = [ - "cc", - "libc", - "once_cell", - "spin 0.5.2", - "untrusted 0.7.1", - "web-sys", - "winapi", -] - -[[package]] -name = "ring" -version = "0.17.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" -dependencies = [ - "cc", - "cfg-if", - "getrandom", - "libc", - "spin 0.9.8", - "untrusted 0.9.0", - "windows-sys 0.52.0", -] - -[[package]] -name = "ripemd" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "rlp" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" -dependencies = [ - "bytes", - "rlp-derive", - "rustc-hex", -] - -[[package]] -name = "rlp-derive" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e33d7b2abe0c340d8797fe2907d3f20d3b5ea5908683618bfe80df7f621f672a" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "rrs-succinct" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3372685893a9f67d18e98e792d690017287fd17379a83d798d958e517d380fa9" -dependencies = [ - "downcast-rs", - "num_enum 0.5.11", - "paste", -] - -[[package]] -name = "ruint" -version = "1.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c3cc4c2511671f327125da14133d0c5c5d137f006a1017a16f557bc85b16286" -dependencies = [ - "alloy-rlp", - "ark-ff 0.3.0", - "ark-ff 0.4.2", - "bytes", - "fastrlp", - "num-bigint 0.4.6", - "num-traits", - "parity-scale-codec", - "primitive-types", - "proptest", - "rand", - "rlp", - "ruint-macro", - "serde", - "valuable", - "zeroize", -] - -[[package]] -name = "ruint-macro" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" - -[[package]] -name = "rustc-demangle" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" - -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - -[[package]] -name = "rustc-hex" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" - -[[package]] -name = "rustc_version" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" -dependencies = [ - "semver 0.11.0", -] - -[[package]] -name = "rustc_version" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" -dependencies = [ - "semver 1.0.23", -] - -[[package]] -name = "rustix" -version = "0.38.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" -dependencies = [ - "bitflags 2.6.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.52.0", -] - -[[package]] -name = "rustls" -version = "0.23.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c58f8c84392efc0a126acce10fa59ff7b3d2ac06ab451a33f2741989b806b044" -dependencies = [ - "once_cell", - "ring 0.17.8", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-pemfile" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" -dependencies = [ - "base64 0.22.1", - "rustls-pki-types", -] - -[[package]] -name = "rustls-pki-types" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" - -[[package]] -name = "rustls-webpki" -version = "0.102.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e6b52d4fda176fd835fdc55a835d4a89b8499cad995885a21149d5ad62f852e" -dependencies = [ - "ring 0.17.8", - "rustls-pki-types", - "untrusted 0.9.0", -] - -[[package]] -name = "rustversion" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" - -[[package]] -name = "rusty-fork" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" -dependencies = [ - "fnv", - "quick-error", - "tempfile", - "wait-timeout", -] - -[[package]] -name = "ryu" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" - -[[package]] -name = "salsa20" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" -dependencies = [ - "cipher", -] - -[[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 = "scale-info" -version = "2.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca070c12893629e2cc820a9761bedf6ce1dcddc9852984d1dc734b8bd9bd024" -dependencies = [ - "cfg-if", - "derive_more", - "parity-scale-codec", - "scale-info-derive", -] - -[[package]] -name = "scale-info-derive" -version = "2.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d35494501194174bda522a32605929eefc9ecf7e0a326c26db1fdd85881eb62" -dependencies = [ - "proc-macro-crate 3.1.0", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "scc" -version = "2.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4465c22496331e20eb047ff46e7366455bc01c0c02015c4a376de0b2cd3a1af" -dependencies = [ - "sdd", -] - -[[package]] -name = "schannel" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "scrypt" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f9e24d2b632954ded8ab2ef9fea0a0c769ea56ea98bddbafbad22caeeadf45d" -dependencies = [ - "hmac", - "pbkdf2 0.11.0", - "salsa20", - "sha2", -] - -[[package]] -name = "sdd" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85f05a494052771fc5bd0619742363b5e24e5ad72ab3111ec2e27925b8edc5f3" - -[[package]] -name = "sec1" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" -dependencies = [ - "base16ct", - "der", - "generic-array 0.14.7", - "pkcs8", - "subtle", - "zeroize", -] - -[[package]] -name = "security-framework" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" -dependencies = [ - "bitflags 2.6.0", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "semver" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" -dependencies = [ - "semver-parser", -] - -[[package]] -name = "semver" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" -dependencies = [ - "serde", -] - -[[package]] -name = "semver-parser" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" -dependencies = [ - "pest", -] - -[[package]] -name = "send_wrapper" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f638d531eccd6e23b980caf34876660d38e265409d8e99b397ab71eb3612fad0" - -[[package]] -name = "send_wrapper" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" - -[[package]] -name = "serde" -version = "1.0.204" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.204" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.72", -] - -[[package]] -name = "serde_json" -version = "1.0.122" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784b6203951c57ff748476b126ccb5e8e2959a5c19e5c617ab1956be3dbc68da" -dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", -] - -[[package]] -name = "serde_path_to_error" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6" -dependencies = [ - "itoa", - "serde", -] - -[[package]] -name = "serde_spanned" -version = "0.6.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_with" -version = "3.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cecfa94848272156ea67b2b1a53f20fc7bc638c4a46d2f8abde08f05f4b857" -dependencies = [ - "base64 0.22.1", - "chrono", - "hex", - "indexmap 1.9.3", - "indexmap 2.2.6", - "serde", - "serde_derive", - "serde_json", - "serde_with_macros", - "time", -] - -[[package]] -name = "serde_with_macros" -version = "3.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8fee4991ef4f274617a51ad4af30519438dacb2f56ac773b08a1922ff743350" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.72", -] - -[[package]] -name = "serial_test" -version = "3.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b4b487fe2acf240a021cf57c6b2b4903b1e78ca0ecd862a71b71d2a51fed77d" -dependencies = [ - "futures", - "log", - "once_cell", - "parking_lot", - "scc", - "serial_test_derive", -] - -[[package]] -name = "serial_test_derive" -version = "3.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82fe9db325bcef1fbcde82e078a5cc4efdf787e96b3b9cf45b50b529f2083d67" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.72", -] - -[[package]] -name = "sha2" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.10.7", -] - -[[package]] -name = "sha3" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" -dependencies = [ - "digest 0.10.7", - "keccak", -] - -[[package]] -name = "sha3-asm" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9b57fd861253bff08bb1919e995f90ba8f4889de2726091c8876f3a4e823b40" -dependencies = [ - "cc", - "cfg-if", -] - -[[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 = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "signal-hook-registry" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" -dependencies = [ - "libc", -] - -[[package]] -name = "signature" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" -dependencies = [ - "digest 0.10.7", - "rand_core", -] - -[[package]] -name = "simple_asn1" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" -dependencies = [ - "num-bigint 0.4.6", - "num-traits", - "thiserror", - "time", -] - -[[package]] -name = "size" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fed904c7fb2856d868b92464fc8fa597fce366edea1a9cbfaa8cb5fe080bd6d" - -[[package]] -name = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - -[[package]] -name = "smallvec" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" - -[[package]] -name = "snowbridge-amcl" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "460a9ed63cdf03c1b9847e8a12a5f5ba19c4efd5869e4a737e05be25d7c427e5" -dependencies = [ - "parity-scale-codec", - "scale-info", -] - -[[package]] -name = "socket2" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "sp1-build" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "260c285956e8205d332c9a5acbd828462399b04caf72d0620718a20447bac91d" -dependencies = [ - "anyhow", - "cargo_metadata", - "clap", - "dirs", -] - -[[package]] -name = "sp1-core" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e916b2084e5de5e45c1dc3244dc212af9c8334dda3246acde7fc6e5ab4a7fc1" -dependencies = [ - "anyhow", - "arrayref", - "bincode", - "blake3", - "bytemuck", - "cfg-if", - "curve25519-dalek", - "elf", - "elliptic-curve", - "generic-array 1.1.0", - "hashbrown 0.14.5", - "hex", - "itertools 0.13.0", - "k256", - "log", - "nohash-hasher", - "num", - "num-bigint 0.4.6", - "num_cpus", - "p3-air", - "p3-baby-bear", - "p3-blake3", - "p3-challenger", - "p3-commit", - "p3-dft", - "p3-field", - "p3-fri", - "p3-keccak", - "p3-keccak-air", - "p3-matrix", - "p3-maybe-rayon", - "p3-merkle-tree", - "p3-poseidon2", - "p3-symmetric", - "p3-uni-stark", - "p3-util", - "rand", - "rayon-scan", - "rrs-succinct", - "serde", - "serde_with", - "size", - "snowbridge-amcl", - "sp1-derive", - "sp1-primitives", - "static_assertions", - "strum", - "strum_macros", - "tempfile", - "thiserror", - "tracing", - "tracing-forest", - "tracing-subscriber", - "typenum", - "web-time", -] - -[[package]] -name = "sp1-derive" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dbc1d9a05a0e83f548907d50539e5e59873bbf6a82793ce87a195345ca7ddf9" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "sp1-helper" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71dce2545791b5c0c2e65f81eb76d74d51804cbbe758643978dc0bbcdbbaa127" -dependencies = [ - "cargo_metadata", - "chrono", - "sp1-build", -] - -[[package]] -name = "sp1-primitives" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb04c7a047b000dbab6b6e143f10e79a2cc5294d98fed74dc5dc11d374cef297" -dependencies = [ - "itertools 0.13.0", - "lazy_static", - "p3-baby-bear", - "p3-field", - "p3-poseidon2", - "p3-symmetric", -] - -[[package]] -name = "sp1-prover" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "906ed35cdb4d24050b1d00aa51abfdb986883c5280ca6b34b1cd50e673cfad02" -dependencies = [ - "anyhow", - "bincode", - "clap", - "dirs", - "hex", - "itertools 0.13.0", - "num-bigint 0.4.6", - "oneshot", - "p3-baby-bear", - "p3-bn254-fr", - "p3-challenger", - "p3-commit", - "p3-field", - "p3-matrix", - "rayon", - "serde", - "serde_json", - "serial_test", - "sp1-core", - "sp1-primitives", - "sp1-recursion-circuit", - "sp1-recursion-compiler", - "sp1-recursion-core", - "sp1-recursion-gnark-ffi", - "sp1-recursion-program", - "subtle-encoding", - "tempfile", - "thiserror", - "tracing", - "tracing-subscriber", -] - -[[package]] -name = "sp1-recursion-circuit" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a620b1c84ea7776deebf9eed2a5310c040f1b5b1db0709a2b36b86516f743d" -dependencies = [ - "bincode", - "itertools 0.13.0", - "p3-air", - "p3-baby-bear", - "p3-bn254-fr", - "p3-commit", - "p3-field", - "p3-fri", - "p3-matrix", - "p3-util", - "serde", - "sp1-core", - "sp1-recursion-compiler", - "sp1-recursion-core", - "sp1-recursion-derive", - "sp1-recursion-program", -] - -[[package]] -name = "sp1-recursion-compiler" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb5ef5565d25bf41f00280f0e09ab27cd39b8c8986af12c083e85a4061a49621" -dependencies = [ - "backtrace", - "itertools 0.13.0", - "p3-air", - "p3-baby-bear", - "p3-bn254-fr", - "p3-commit", - "p3-field", - "p3-fri", - "p3-matrix", - "p3-poseidon2", - "p3-symmetric", - "p3-util", - "serde", - "sp1-core", - "sp1-primitives", - "sp1-recursion-core", - "sp1-recursion-derive", - "tracing", -] - -[[package]] -name = "sp1-recursion-core" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5785177a892714601fd2f3e5e79af43d222bdedc415fb7cbdd52c9b1ee4dc3e2" -dependencies = [ - "arrayref", - "backtrace", - "ff 0.13.0", - "hashbrown 0.14.5", - "itertools 0.13.0", - "num_cpus", - "p3-air", - "p3-baby-bear", - "p3-bn254-fr", - "p3-challenger", - "p3-commit", - "p3-dft", - "p3-field", - "p3-fri", - "p3-matrix", - "p3-maybe-rayon", - "p3-merkle-tree", - "p3-poseidon2", - "p3-symmetric", - "p3-util", - "serde", - "serde_with", - "sp1-core", - "sp1-derive", - "sp1-primitives", - "static_assertions", - "tracing", - "zkhash", -] - -[[package]] -name = "sp1-recursion-derive" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5970fa689c5b3e41d2ea4a81f9207594b9befc2ba5ad9d8727b6bdbc7ba054e" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "sp1-recursion-gnark-ffi" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6aacdfec9e2895f0166125b89f3f058a25cdbbdce300839a46b240d3bafbac13" -dependencies = [ - "anyhow", - "bincode", - "bindgen", - "cc", - "cfg-if", - "hex", - "log", - "num-bigint 0.4.6", - "p3-baby-bear", - "p3-field", - "p3-symmetric", - "rand", - "serde", - "serde_json", - "sha2", - "sp1-core", - "sp1-recursion-compiler", - "tempfile", -] - -[[package]] -name = "sp1-recursion-program" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40b570d8e40b8faad877e7c8604de8bc51f61dbee8ee7e0efe3ae7610585e69c" -dependencies = [ - "itertools 0.13.0", - "p3-air", - "p3-baby-bear", - "p3-challenger", - "p3-commit", - "p3-dft", - "p3-field", - "p3-fri", - "p3-matrix", - "p3-maybe-rayon", - "p3-merkle-tree", - "p3-poseidon2", - "p3-symmetric", - "p3-util", - "rand", - "serde", - "sp1-core", - "sp1-primitives", - "sp1-recursion-compiler", - "sp1-recursion-core", - "stacker", - "tracing", -] - -[[package]] -name = "sp1-sdk" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6924c2ba6d0a522b17f29368f6db8ebd1bf2a424eb4d6e67308f1be4df9d860c" -dependencies = [ - "alloy-sol-types", - "anyhow", - "async-trait", - "axum", - "bincode", - "cfg-if", - "dirs", - "ethers", - "futures", - "hashbrown 0.14.5", - "hex", - "indicatif", - "log", - "num-bigint 0.4.6", - "p3-baby-bear", - "p3-commit", - "p3-field", - "p3-fri", - "p3-matrix", - "prost", - "reqwest 0.12.5", - "reqwest-middleware", - "serde", - "serde_json", - "sha2", - "sp1-core", - "sp1-prover", - "strum", - "strum_macros", - "sysinfo", - "tempfile", - "thiserror", - "tokio", - "tracing", - "twirp-rs", - "vergen", -] - -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" - -[[package]] -name = "spki" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der", -] - -[[package]] -name = "stacker" -version = "0.1.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c886bd4480155fd3ef527d45e9ac8dd7118a898a46530b7b94c3e21866259fce" -dependencies = [ - "cc", - "cfg-if", - "libc", - "psm", - "winapi", -] - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[package]] -name = "strum" -version = "0.26.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.72", -] - -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - -[[package]] -name = "subtle-encoding" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dcb1ed7b8330c5eed5441052651dd7a12c75e2ed88f2ec024ae1fa3a5e59945" -dependencies = [ - "zeroize", -] - -[[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.72" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc4b9b9bf2add8093d3f2c0204471e951b2285580335de42f9d2534f3ae7a8af" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn-solidity" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c837dc8852cb7074e46b444afb81783140dab12c58867b49fb3898fbafedf7ea" -dependencies = [ - "paste", - "proc-macro2", - "quote", - "syn 2.0.72", -] - -[[package]] -name = "sync_wrapper" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - -[[package]] -name = "sync_wrapper" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" - -[[package]] -name = "sysinfo" -version = "0.30.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a5b4ddaee55fb2bea2bf0e5000747e5f5c0de765e5a5ff87f4cd106439f4bb3" -dependencies = [ - "cfg-if", - "core-foundation-sys", - "libc", - "ntapi", - "once_cell", - "rayon", - "windows", -] - -[[package]] -name = "system-configuration" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - -[[package]] -name = "tempfile" -version = "3.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" -dependencies = [ - "cfg-if", - "fastrand", - "rustix", - "windows-sys 0.52.0", -] - -[[package]] -name = "thiserror" -version = "1.0.63" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.63" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.72", -] - -[[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.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" -dependencies = [ - "deranged", - "itoa", - "libc", - "num-conv", - "num_threads", - "powerfmt", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" - -[[package]] -name = "time-macros" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" -dependencies = [ - "num-conv", - "time-core", -] - -[[package]] -name = "tiny-keccak" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" -dependencies = [ - "crunchy", -] - -[[package]] -name = "tinyvec" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "tokio" -version = "1.39.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daa4fb1bc778bd6f04cbfc4bb2d06a7396a8f299dc33ea1900cedaa316f467b1" -dependencies = [ - "backtrace", - "bytes", - "libc", - "mio", - "parking_lot", - "pin-project-lite", - "signal-hook-registry", - "socket2", - "tokio-macros", - "windows-sys 0.52.0", -] - -[[package]] -name = "tokio-macros" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.72", -] - -[[package]] -name = "tokio-native-tls" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" -dependencies = [ - "native-tls", - "tokio", -] - -[[package]] -name = "tokio-rustls" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" -dependencies = [ - "rustls", - "rustls-pki-types", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.7.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "toml" -version = "0.8.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac2caab0bf757388c6c0ae23b3293fdb463fee59434529014f85e3263b995c28" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime", - "toml_edit 0.22.16", -] - -[[package]] -name = "toml_datetime" -version = "0.6.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_edit" -version = "0.19.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" -dependencies = [ - "indexmap 2.2.6", - "toml_datetime", - "winnow 0.5.40", -] - -[[package]] -name = "toml_edit" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" -dependencies = [ - "indexmap 2.2.6", - "toml_datetime", - "winnow 0.5.40", -] - -[[package]] -name = "toml_edit" -version = "0.22.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "278f3d518e152219c994ce877758516bca5e118eaed6996192a774fb9fbf0788" -dependencies = [ - "indexmap 2.2.6", - "serde", - "serde_spanned", - "toml_datetime", - "winnow 0.6.15", -] - -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "pin-project", - "pin-project-lite", - "tokio", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower-layer" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" - -[[package]] -name = "tower-service" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" - -[[package]] -name = "tracing" -version = "0.1.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" -dependencies = [ - "log", - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.72", -] - -[[package]] -name = "tracing-core" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" -dependencies = [ - "once_cell", - "valuable", -] - -[[package]] -name = "tracing-forest" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee40835db14ddd1e3ba414292272eddde9dad04d3d4b65509656414d1c42592f" -dependencies = [ - "ansi_term", - "smallvec", - "thiserror", - "tracing", - "tracing-subscriber", -] - -[[package]] -name = "tracing-futures" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" -dependencies = [ - "pin-project", - "tracing", -] - -[[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.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" -dependencies = [ - "matchers", - "nu-ansi-term", - "once_cell", - "regex", - "sharded-slab", - "smallvec", - "thread_local", - "tracing", - "tracing-core", - "tracing-log", -] - -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "twirp-rs" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfa3161d8eee0abcad4e762f4215381a430cc1281870d575b0f1e4fbfc74b8ce" -dependencies = [ - "async-trait", - "axum", - "bytes", - "futures", - "http 1.1.0", - "http-body-util", - "hyper 1.4.1", - "prost", - "reqwest 0.12.5", - "serde", - "serde_json", - "thiserror", - "tokio", - "tower", - "url", -] - -[[package]] -name = "typenum" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" - -[[package]] -name = "ucd-trie" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" - -[[package]] -name = "uint" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" -dependencies = [ - "byteorder", - "crunchy", - "hex", - "static_assertions", -] - -[[package]] -name = "unarray" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" - -[[package]] -name = "unicode-bidi" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" - -[[package]] -name = "unicode-ident" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[package]] -name = "unicode-normalization" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-width" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" - -[[package]] -name = "unicode-xid" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" - -[[package]] -name = "untrusted" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "url" -version = "2.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", -] - -[[package]] -name = "utf8parse" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" - -[[package]] -name = "uuid" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" -dependencies = [ - "getrandom", - "serde", -] - -[[package]] -name = "valuable" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "vergen" -version = "8.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2990d9ea5967266ea0ccf413a4aa5c42a93dbcfda9cb49a97de6931726b12566" -dependencies = [ - "anyhow", - "cfg-if", - "git2", - "rustversion", - "time", -] - -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "wait-timeout" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" -dependencies = [ - "libc", -] - -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasm-bindgen" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" -dependencies = [ - "cfg-if", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn 2.0.72", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" -dependencies = [ - "cfg-if", - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.72", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" - -[[package]] -name = "wasm-streams" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129" -dependencies = [ - "futures-util", - "js-sys", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "web-sys" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "web-time" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webpki-roots" -version = "0.26.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd7c23921eeb1713a4e851530e9b9756e4fb0e89978582942612524cf09f01cd" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "which" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" -dependencies = [ - "either", - "home", - "once_cell", - "rustix", -] - -[[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.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" -dependencies = [ - "windows-sys 0.52.0", -] - -[[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" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" -dependencies = [ - "windows-core", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-core" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "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]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[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_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -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" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[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_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[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_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "winnow" -version = "0.5.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" -dependencies = [ - "memchr", -] - -[[package]] -name = "winnow" -version = "0.6.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "557404e450152cd6795bb558bca69e43c585055f4606e3bcae5894fc6dac9ba0" -dependencies = [ - "memchr", -] - -[[package]] -name = "winreg" -version = "0.50.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - -[[package]] -name = "winreg" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - -[[package]] -name = "ws_stream_wasm" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7999f5f4217fe3818726b66257a4475f71e74ffd190776ad053fa159e50737f5" -dependencies = [ - "async_io_stream", - "futures", - "js-sys", - "log", - "pharos", - "rustc_version 0.4.0", - "send_wrapper 0.6.0", - "thiserror", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - -[[package]] -name = "zerocopy" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.72", -] - -[[package]] -name = "zeroize" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" -dependencies = [ - "zeroize_derive", -] - -[[package]] -name = "zeroize_derive" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.72", -] - -[[package]] -name = "zkhash" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4352d1081da6922701401cdd4cbf29a2723feb4cfabb5771f6fee8e9276da1c7" -dependencies = [ - "ark-ff 0.4.2", - "ark-std 0.4.0", - "bitvec", - "blake2", - "bls12_381", - "byteorder", - "cfg-if", - "group 0.12.1", - "group 0.13.0", - "halo2", - "hex", - "jubjub", - "lazy_static", - "pasta_curves 0.5.1", - "rand", - "serde", - "sha2", - "sha3", - "subtle", -] diff --git a/crates/script/Cargo.toml b/crates/script/Cargo.toml deleted file mode 100644 index 7c495de..0000000 --- a/crates/script/Cargo.toml +++ /dev/null @@ -1,30 +0,0 @@ -[package] -version = "0.1.0" -name = "zkDB-script" -edition = "2021" -default-run = "db" - -[[bin]] -name = "db" -path = "src/bin/db.rs" - -[[bin]] -name = "merkle" -path = "src/bin/merkle.rs" - - -[dependencies] -sp1-sdk = "2.0.0" -serde_json = { version = "1.0", default-features = false, features = ["alloc"] } -serde = { version = "1.0", default-features = false, features = ["derive"] } -clap = { version = "4.0", features = ["derive", "env"] } -tracing = "0.1.40" -hex = "0.4.3" -alloy-sol-types = { workspace = true } -prettytable-rs = "0.10" - -[dev-dependencies] -sp1-sdk = "2.0.0" - -[build-dependencies] -sp1-helper = "2.0.0" diff --git a/crates/script/build.rs b/crates/script/build.rs deleted file mode 100644 index a0e32e3..0000000 --- a/crates/script/build.rs +++ /dev/null @@ -1,7 +0,0 @@ -// use sp1_helper::build_program_with_args; - -fn main() { - // build_program_with_args("../data-hash", Default::default()); - // build_program_with_args("../moving-average", Default::default()); - // build_program_with_args("../zkdb-merkle", Default::default()); -} diff --git a/crates/script/merkle_state.txt b/crates/script/merkle_state.txt deleted file mode 100644 index 190fa53..0000000 --- a/crates/script/merkle_state.txt +++ /dev/null @@ -1 +0,0 @@ -eyJsZWF2ZXMiOltbMjUyLDIyMiw0Myw0NiwyMTksMTY1LDEwNywyNDQsOCw5NiwzMSwxODMsMzMsMjU0LDE1NSw5Miw1MSwxNDEsMTYsMjM4LDY2LDE1OCwxNjAsNzksMTc0LDg1LDE3LDE4MiwxNDMsMTkxLDE0MywxODVdLFsxMDYsMjE2LDE1MywzOSw5OSwxMzgsNzksMzcsMTQ4LDE3NCwzNywxMTQsMjA4LDE2OSwxMDYsNzMsNjgsNTgsOTQsNDksMTAsMTI0LDE3OSwxMDUsMTM2LDE1MSwxMjYsMjUyLDIyOCwxMDgsMTU0LDJdLFsxMzgsMTA0LDIzNywxMDEsMjM0LDIyMiwyMDAsMTE0LDI0Niw5NSw2OSwxODcsMjQ3LDI2LDIyLDEyMSwyMDgsMTY3LDE0LDE4OSwyMzIsMTM3LDE2OSwzOCwxNjksODcsMjQ1LDg1LDIyNCwxNzUsNDUsMTc2XV0sImtleV9pbmRpY2VzIjp7ImFub3RoZXJrZXkiOjIsImZvbyI6MCwibXlrZXkiOjF9fQ== \ No newline at end of file diff --git a/crates/script/src/bin/db.rs b/crates/script/src/bin/db.rs deleted file mode 100644 index b799753..0000000 --- a/crates/script/src/bin/db.rs +++ /dev/null @@ -1,86 +0,0 @@ -//! An end-to-end example of using the SP1 SDK to generate a proof of a program that can be executed -//! or have a core proof generated. -//! -//! You can run this script using the following command: -//! ```shell -//! RUST_LOG=info cargo run --release -- --execute -//! ``` -//! or -//! ```shell -//! RUST_LOG=info cargo run --release -- --prove -//! ``` - -use clap::Parser; -use sp1_sdk::{ProverClient, SP1Stdin}; -use tracing::log::{error, info}; - -/// The ELF file for the Succinct RISC-V zkDB program. -pub const ZKDB_ELF: &[u8] = include_bytes!("../../../../elf/riscv32im-succinct-zkvm-elf"); - -/// The arguments for the command. -#[derive(Parser, Debug)] -#[clap(author, version, about, long_about = None)] -struct Args { - #[clap(long)] - execute: bool, - - #[clap(long)] - prove: bool, -} - -fn main() { - // Setup the logger. - sp1_sdk::utils::setup_logger(); - - // Parse the command line arguments. - let args = Args::parse(); - - if args.execute == args.prove { - eprintln!("Error: You must specify either --execute or --prove"); - std::process::exit(1); - } - - // Setup the prover client. - let client = ProverClient::new(); - - // Setup the inputs. - let mut stdin = SP1Stdin::new(); - // Use a sample input value - let input_value: i32 = 42; - stdin.write(&input_value); - - info!("Input value: {}", input_value); - - if args.execute { - // Execute the program - info!("Executing the program..."); - match client.execute(ZKDB_ELF, stdin).run() { - Ok((output, report)) => { - info!("Program executed successfully."); - - // Read the output. - let result: i32 = output.as_slice()[0] as i32; - info!("Result: {}", result); - - // Record the number of cycles executed. - info!("Number of cycles: {}", report.total_instruction_count()); - } - Err(e) => error!("Execution failed: {:?}", e), - } - } else { - // Setup the program for proving. - let (pk, vk) = client.setup(ZKDB_ELF); - - // Generate the proof - let proof = client - .prove(&pk, stdin) - .run() - .expect("failed to generate proof"); - - println!("Successfully generated proof!"); - - // Verify the proof. - client.verify(&proof, &vk).expect("failed to verify proof"); - println!("Successfully verified proof!"); - } -} diff --git a/crates/script/src/bin/merkle.rs b/crates/script/src/bin/merkle.rs deleted file mode 100644 index 1c0f7ed..0000000 --- a/crates/script/src/bin/merkle.rs +++ /dev/null @@ -1,147 +0,0 @@ -//! An end-to-end example of using the SP1 SDK to generate a proof of a Merkle tree program that can be executed -//! or have a core proof generated. -//! -//! You can run this script using the following command: -//! ```shell -//! RUST_LOG=info cargo run --bin merkle --release -- --execute -//! ``` -//! or -//! ```shell -//! RUST_LOG=info cargo run --bin merkle --release -- --prove -//! ``` - -use clap::{Parser, Subcommand}; -use serde_json::Value; -use sp1_sdk::{ProverClient, SP1Stdin}; -use std::fs; -use tracing::log::{error, info}; - -/// The ELF file for the zkdb-merkle program. -pub const ZKDB_MERKLE_ELF: &[u8] = include_bytes!("../../../../elf/riscv32im-succinct-zkvm-elf"); - -/// Commands for the Merkle client. -#[derive(Subcommand, Debug)] -enum Command { - Insert { - key: String, - value: String, - #[clap(long, help = "Generate and verify an SP1 proof")] - prove: bool, - }, - Query { - key: String, - #[clap(long, help = "Generate and verify an SP1 proof")] - prove: bool, - }, - Prove { - key: String, - }, -} - -/// The arguments for the command. -#[derive(Parser, Debug)] -#[clap(author, version, about, long_about = None)] -struct Args { - #[clap(subcommand)] - command: Command, -} - -fn main() { - // Setup the logger. - sp1_sdk::utils::setup_logger(); - - // Parse the command line arguments. - let args = Args::parse(); - - // Load state from file or initialize. - let state_file = "merkle_state.txt"; - let state = if let Ok(encoded_state) = fs::read_to_string(state_file) { - Some(encoded_state) - } else { - None - }; - - // Prepare the command input. - let command_json = match &args.command { - Command::Insert { key, value, prove } => serde_json::json!({ - "command": "insert", - "params": { - "key": key, - "value": value - }, - "state": state, - }), - Command::Query { key, prove } => serde_json::json!({ - "command": "query", - "params": { - "key": key, - }, - "state": state, - }), - Command::Prove { key } => serde_json::json!({ - "command": "prove", - "params": { - "key": key, - }, - "state": state, - }), - }; - - let command_str = serde_json::to_string(&command_json).unwrap(); - - // Setup the inputs. - let mut stdin = SP1Stdin::new(); - stdin.write(&command_str); - - // Setup the prover client. - let client = ProverClient::new(); - - // Execute the program. - info!("Executing the program..."); - match client.execute(ZKDB_MERKLE_ELF, stdin.clone()).run() { - Ok((output, report)) => { - info!("Program executed successfully."); - - // Read the output. - let output_str = String::from_utf8(output.as_slice().to_vec()).expect("Invalid UTF-8"); - let output_json: Value = - serde_json::from_str(&output_str).expect("Invalid JSON output"); - - // Display the result. - println!( - "Result: {}", - serde_json::to_string_pretty(&output_json["result"]).unwrap() - ); - - // Save the updated state. - if let Some(state_encoded) = output_json.get("state").and_then(|s| s.as_str()) { - fs::write(state_file, state_encoded).expect("Failed to save state"); - println!("State updated and saved."); - } - - // Record the number of cycles executed. - info!("Number of cycles: {}", report.total_instruction_count()); - - // Generate and verify proof if requested - match &args.command { - Command::Insert { prove, .. } | Command::Query { prove, .. } => { - if *prove { - info!("Generating and verifying proof..."); - let (pk, vk) = client.setup(ZKDB_MERKLE_ELF); - let proof = client - .prove(&pk, stdin.clone()) - .run() - .expect("Failed to generate proof"); - println!("Proof generated successfully."); - client.verify(&proof, &vk).expect("Failed to verify proof"); - println!("Proof verified successfully."); - } - } - Command::Prove { key } => { - // Handle additional logic for the Prove subcommand if necessary - } - } - } - Err(e) => error!("Execution failed: {:?}", e), - } -} diff --git a/crates/script/src/bin/merkle_benchmark.rs b/crates/script/src/bin/merkle_benchmark.rs deleted file mode 100644 index fbbc333..0000000 --- a/crates/script/src/bin/merkle_benchmark.rs +++ /dev/null @@ -1,123 +0,0 @@ -use clap::Parser; -use prettytable::{row, Table}; -use sp1_sdk::{ProverClient, SP1Stdin}; -use std::time::Instant; -use tracing::log::{error, info}; - -/// The ELF file for the zkdb-merkle program. -pub const ZKDB_MERKLE_ELF: &[u8] = include_bytes!("../../../../elf/riscv32im-succinct-zkvm-elf"); - -#[derive(Parser, Debug)] -struct Args { - #[clap(long, default_value = "100")] - iterations: usize, -} - -struct BenchmarkResult { - operation: String, - cycles: u64, - total_time: std::time::Duration, - avg_time: std::time::Duration, -} - -fn main() { - sp1_sdk::utils::setup_logger(); - let args = Args::parse(); - - let client = ProverClient::new(); - - let insert_result = benchmark_operation(&client, "insert", args.iterations); - let query_result = benchmark_operation(&client, "query", args.iterations); - let prove_result = benchmark_operation(&client, "prove", args.iterations); - - print_results(&[insert_result, query_result, prove_result]); -} - -fn benchmark_operation( - client: &ProverClient, - operation: &str, - iterations: usize, -) -> BenchmarkResult { - let mut total_time = std::time::Duration::new(0, 0); - let cycles; - - // Execute once to get the cycle count - let command = create_command(operation, 0); - let mut stdin = SP1Stdin::new(); - stdin.write(&command); - - match client.execute(ZKDB_MERKLE_ELF, stdin).run() { - Ok((_, report)) => { - cycles = report.total_instruction_count(); - } - Err(e) => { - error!("Execution failed: {:?}", e); - cycles = 0; - } - } - - // Run multiple iterations for timing - for i in 0..iterations { - let command = create_command(operation, i); - let mut stdin = SP1Stdin::new(); - stdin.write(&command); - - let start = Instant::now(); - match client.execute(ZKDB_MERKLE_ELF, stdin).run() { - Ok(_) => { - total_time += start.elapsed(); - } - Err(e) => error!("Execution failed: {:?}", e), - } - } - - BenchmarkResult { - operation: operation.to_string(), - cycles, - total_time, - avg_time: total_time / iterations as u32, - } -} - -fn create_command(operation: &str, i: usize) -> String { - match operation { - "insert" => format!( - "{{ - \"command\": \"insert\", - \"params\": {{ - \"key\": \"key{}\", - \"value\": \"value{}\" - }}, - \"state\": null - }}", - i, i - ), - "query" | "prove" => format!( - "{{ - \"command\": \"{}\", - \"params\": {{ - \"key\": \"key{}\" - }}, - \"state\": null - }}", - operation, i - ), - _ => panic!("Unknown operation: {}", operation), - } -} - -fn print_results(results: &[BenchmarkResult]) { - let mut table = Table::new(); - table.add_row(row!["Operation", "Cycles", "Total Time", "Avg Time"]); - - for result in results { - table.add_row(row![ - result.operation, - result.cycles, - format!("{:?}", result.total_time), - format!("{:?}", result.avg_time) - ]); - } - - table.printstd(); -} diff --git a/crates/script/tests/integration_tests.rs b/crates/script/tests/integration_tests.rs deleted file mode 100644 index 45e6ed1..0000000 --- a/crates/script/tests/integration_tests.rs +++ /dev/null @@ -1,64 +0,0 @@ -use serde_json::Value; -use sp1_sdk::{ProverClient, SP1Stdin}; - -#[test] -fn test_insert_query_prove() { - let client = ProverClient::new(); - let mut state = None; - - // Insert - let insert_command = serde_json::json!({ - "command": "insert", - "params": { - "key": "testkey", - "value": "testvalue" - }, - "state": state, - }); - let output = run_program(&client, insert_command); - assert_eq!(output["result"]["status"], "inserted"); - state = output - .get("state") - .and_then(|s| s.as_str()) - .map(String::from); - - // Query - let query_command = serde_json::json!({ - "command": "query", - "params": { - "key": "testkey", - }, - "state": state.clone(), - }); - let output = run_program(&client, query_command); - assert!(output["result"]["value_hash"].is_string()); - - // Prove - let prove_command = serde_json::json!({ - "command": "prove", - "params": { - "key": "testkey", - }, - "state": state.clone(), - }); - let output = run_program(&client, prove_command); - assert!(output["result"]["root"].is_string()); - assert!(output["result"]["proof"].is_string()); -} - -fn run_program(client: &ProverClient, input_json: serde_json::Value) -> Value { - let command_str = serde_json::to_string(&input_json).unwrap(); - let mut stdin = SP1Stdin::new(); - stdin.write(&command_str); - - // Update the ELF file path - let zkdb_merkle_elf = include_bytes!("../../../elf/riscv32im-succinct-zkvm-elf"); - - let (output, _) = client - .execute(zkdb_merkle_elf, stdin) - .run() - .expect("Failed to execute program"); - - let output_str = String::from_utf8(output.as_slice().to_vec()).expect("Invalid UTF-8"); - serde_json::from_str(&output_str).expect("Invalid JSON output") -} diff --git a/crates/zkdb-lib/Cargo.toml b/crates/zkdb-lib/Cargo.toml index 4ea4599..4ae84b4 100644 --- a/crates/zkdb-lib/Cargo.toml +++ b/crates/zkdb-lib/Cargo.toml @@ -17,6 +17,9 @@ tracing = { workspace = true } hex = { workspace = true } tracing-subscriber = { workspace = true } +[dev-dependencies] +serial_test = "2.0" + [[bin]] name = "cli" path = "src/bin/cli.rs" \ No newline at end of file diff --git a/crates/zkdb-lib/src/bin/cli.rs b/crates/zkdb-lib/src/bin/cli.rs index 43ae9c2..84987e7 100644 --- a/crates/zkdb-lib/src/bin/cli.rs +++ b/crates/zkdb-lib/src/bin/cli.rs @@ -2,7 +2,7 @@ use clap::{Arg, Command}; use std::fs; use tracing_subscriber::{self, EnvFilter}; use zkdb_core::QueryResult; -use zkdb_lib::{Command as DbCommand, Database}; +use zkdb_lib::{Command as DbCommand, Database, ProvenQueryResult}; pub fn init_logging() { tracing_subscriber::fmt() @@ -228,13 +228,13 @@ fn parse_command(command_str: &str) -> Result(result.data.clone()) { if let Some(root) = proof_data.get("root") { println!("Merkle Root: {}", root.as_str().unwrap_or("N/A")); diff --git a/crates/zkdb-lib/src/lib.rs b/crates/zkdb-lib/src/lib.rs index 7d7a9a7..ebd0b7d 100644 --- a/crates/zkdb-lib/src/lib.rs +++ b/crates/zkdb-lib/src/lib.rs @@ -16,6 +16,13 @@ pub struct Database { executor: SP1Executor, } +#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)] +pub struct ProvenQueryResult { + pub data: serde_json::Value, + pub new_state: Vec, + pub sp1_proof: Option, +} + pub fn get_elf() -> &'static [u8] { debug!("Loading ELF binary from {}", env!("ZKDB_ELF_PATH")); include_bytes!(env!("ZKDB_ELF_PATH")) @@ -38,7 +45,7 @@ impl Database { &mut self, command: Command, generate_proof: bool, - ) -> Result { + ) -> Result { debug!(?generate_proof, "Executing query"); let result = self .executor @@ -114,7 +121,7 @@ impl SP1Executor { state: &[u8], command: &Command, generate_proof: bool, - ) -> Result { + ) -> Result { debug!(?generate_proof, "Preparing query execution"); debug!(?command, "Command to execute"); @@ -168,7 +175,7 @@ impl SP1Executor { &self, output: SP1PublicValues, proof: Option, - ) -> Result { + ) -> Result { debug!("Parsing query output"); let output_str = String::from_utf8(output.to_vec()).map_err(|e| { error!(error = ?e, "Failed to parse output as UTF-8"); @@ -190,13 +197,17 @@ impl SP1Executor { .map(|v| v.as_u64().unwrap() as u8) .collect(); - if let Some(proof) = proof { + if let Some(proof) = proof.clone() { debug!("Verifying generated proof"); self.verify_proof(&proof)?; debug!("Proof verified successfully"); } - Ok(QueryResult { data, new_state }) + Ok(ProvenQueryResult { + data, + new_state, + sp1_proof: proof, + }) } #[instrument(skip(self, proof))] diff --git a/crates/zkdb-lib/tests/merkle_tests.rs b/crates/zkdb-lib/tests/merkle_tests.rs index 3b28224..b28e3a2 100644 --- a/crates/zkdb-lib/tests/merkle_tests.rs +++ b/crates/zkdb-lib/tests/merkle_tests.rs @@ -1,4 +1,5 @@ use serde_json::json; +use serial_test::serial; use zkdb_lib::{Command, Database, QueryResult}; fn setup_database() -> Database { @@ -7,6 +8,7 @@ fn setup_database() -> Database { } #[test] +#[serial] fn test_insert_and_get() { let mut db = setup_database(); @@ -16,17 +18,19 @@ fn test_insert_and_get() { value: "test_value".to_string(), }; let insert_result = db.execute_query(insert_command, false).unwrap(); - assert!(insert_result.data.is_null()); // Insert should return null + // data.inserted should be true + assert!(insert_result.data["inserted"].as_bool().unwrap()); // Query the inserted value let get_command = Command::Query { key: "test_key".to_string(), }; let get_result = db.execute_query(get_command, false).unwrap(); - assert_eq!(get_result.data, json!("test_value")); + assert!(get_result.data["found"].as_bool().unwrap()); } #[test] +#[serial] fn test_proof_generation_and_verification() { let mut db = setup_database(); @@ -42,10 +46,11 @@ fn test_proof_generation_and_verification() { key: "proof_key".to_string(), }; let get_result = db.execute_query(get_command, true).unwrap(); - assert_eq!(get_result.data, json!("proof_value")); + assert!(get_result.data["found"].as_bool().unwrap()); } #[test] +#[serial] fn test_multiple_operations() { let mut db = setup_database(); @@ -64,7 +69,7 @@ fn test_multiple_operations() { key: format!("key_{}", i), }; let get_result = db.execute_query(get_command, false).unwrap(); - assert_eq!(get_result.data, json!(format!("value_{}", i))); + assert!(get_result.data["found"].as_bool().unwrap()); } // Update a value @@ -79,5 +84,5 @@ fn test_multiple_operations() { key: "key_2".to_string(), }; let get_result = db.execute_query(get_command, false).unwrap(); - assert_eq!(get_result.data, json!("updated_value")); + assert!(get_result.data["found"].as_bool().unwrap()); } diff --git a/crates/zkdb-merkle/src/main.rs b/crates/zkdb-merkle/src/main.rs index c9a6ea5..db4da44 100644 --- a/crates/zkdb-merkle/src/main.rs +++ b/crates/zkdb-merkle/src/main.rs @@ -117,7 +117,13 @@ fn query(state: &MerkleState, key: &str) -> Result { if let Some(&index) = state.key_indices.get(key) { let value_hash = &state.leaves[index]; Ok(QueryResult { - data: serde_json::json!({"value_hash": hex::encode(value_hash)}), + data: serde_json::json!({ + "key": key.to_string(), + "value": hex::encode(value_hash), + "index": index, + "leaf": hex::encode(value_hash), + "found": true, + }), new_state: bincode::serialize(&state).unwrap(), }) } else { From 94402d0998dafd2855175e0af255cbd15f53ad7a Mon Sep 17 00:00:00 2001 From: Conner Swann <2635475+yourbuddyconner@users.noreply.github.com> Date: Thu, 14 Nov 2024 22:52:00 -0800 Subject: [PATCH 11/11] docs, tests, zkdb-bench, zkdb-store --- .cursorrules | 2 + Cargo.lock | 301 +++++++++++++++++-- Cargo.toml | 14 +- crates/zkdb-bench/Cargo.toml | 19 ++ crates/zkdb-bench/benches/db_operations.rs | 162 +++++++++++ crates/zkdb-core/Cargo.toml | 2 +- crates/zkdb-lib/Cargo.toml | 11 +- crates/zkdb-lib/src/bin/cli.rs | 320 ++++++--------------- crates/zkdb-lib/src/lib.rs | 136 ++++++++- crates/zkdb-lib/tests/merkle_tests.rs | 223 +++++++++++--- crates/zkdb-lib/tests/storage_tests.rs | 36 +++ crates/zkdb-merkle/Cargo.toml | 6 +- crates/zkdb-merkle/src/main.rs | 22 +- crates/zkdb-store/Cargo.toml | 11 + crates/zkdb-store/src/file.rs | 58 ++++ crates/zkdb-store/src/lib.rs | 41 +++ crates/zkdb-store/src/rocks.rs | 59 ++++ docs/design/structure.md | 124 ++++++++ 18 files changed, 1217 insertions(+), 330 deletions(-) create mode 100644 .cursorrules create mode 100644 crates/zkdb-bench/Cargo.toml create mode 100644 crates/zkdb-bench/benches/db_operations.rs create mode 100644 crates/zkdb-lib/tests/storage_tests.rs create mode 100644 crates/zkdb-store/Cargo.toml create mode 100644 crates/zkdb-store/src/file.rs create mode 100644 crates/zkdb-store/src/lib.rs create mode 100644 crates/zkdb-store/src/rocks.rs diff --git a/.cursorrules b/.cursorrules new file mode 100644 index 0000000..151becc --- /dev/null +++ b/.cursorrules @@ -0,0 +1,2 @@ +When writing comments always put a period at the end of the comment. +When writing logs always make them lowercase unless they begin with an acronym. \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index fe5369c..1054c04 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -182,6 +182,12 @@ dependencies = [ "libc", ] +[[package]] +name = "anes" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" + [[package]] name = "ansi_term" version = "0.12.1" @@ -543,6 +549,27 @@ dependencies = [ "serde", ] +[[package]] +name = "bindgen" +version = "0.65.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfdf7b466f9a4903edc73f95d6d2bcd5baf8ae620638762244d3f60143643cc5" +dependencies = [ + "bitflags 1.3.2", + "cexpr", + "clang-sys", + "lazy_static", + "lazycell", + "peeking_take_while", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "rustc-hash 1.1.0", + "shlex", + "syn 2.0.82", +] + [[package]] name = "bindgen" version = "0.70.1" @@ -700,6 +727,17 @@ dependencies = [ "serde", ] +[[package]] +name = "bzip2-sys" +version = "0.1.11+1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + [[package]] name = "camino" version = "1.1.9" @@ -732,6 +770,12 @@ dependencies = [ "thiserror", ] +[[package]] +name = "cast" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" + [[package]] name = "cc" version = "1.1.31" @@ -772,6 +816,33 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "ciborium" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" + +[[package]] +name = "ciborium-ll" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" +dependencies = [ + "ciborium-io", + "half", +] + [[package]] name = "cipher" version = "0.4.4" @@ -960,6 +1031,44 @@ dependencies = [ "libc", ] +[[package]] +name = "criterion" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f" +dependencies = [ + "anes", + "cast", + "ciborium", + "clap", + "criterion-plot", + "futures", + "is-terminal", + "itertools 0.10.5", + "num-traits", + "once_cell", + "oorandom", + "plotters", + "rayon", + "regex", + "serde", + "serde_derive", + "serde_json", + "tinytemplate", + "tokio", + "walkdir", +] + +[[package]] +name = "criterion-plot" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" +dependencies = [ + "cast", + "itertools 0.10.5", +] + [[package]] name = "crossbeam-deque" version = "0.8.5" @@ -2016,6 +2125,16 @@ dependencies = [ "tracing", ] +[[package]] +name = "half" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" +dependencies = [ + "cfg-if", + "crunchy", +] + [[package]] name = "halo2" version = "0.1.0-beta.2" @@ -2082,6 +2201,12 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" +[[package]] +name = "hermit-abi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" + [[package]] name = "hex" version = "0.4.3" @@ -2406,6 +2531,17 @@ version = "2.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" +[[package]] +name = "is-terminal" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b" +dependencies = [ + "hermit-abi 0.4.0", + "libc", + "windows-sys 0.52.0", +] + [[package]] name = "is_terminal_polyfill" version = "1.70.1" @@ -2533,6 +2669,12 @@ dependencies = [ "spin 0.9.8", ] +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + [[package]] name = "libc" version = "0.2.161" @@ -2577,6 +2719,22 @@ dependencies = [ "libc", ] +[[package]] +name = "librocksdb-sys" +version = "0.11.0+8.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3386f101bcb4bd252d8e9d2fb41ec3b0862a15a62b478c355b2982efa469e3e" +dependencies = [ + "bindgen 0.65.1", + "bzip2-sys", + "cc", + "glob", + "libc", + "libz-sys", + "lz4-sys", + "zstd-sys", +] + [[package]] name = "libz-sys" version = "1.1.20" @@ -2620,6 +2778,16 @@ dependencies = [ "hashbrown 0.15.0", ] +[[package]] +name = "lz4-sys" +version = "1.11.1+lz4-1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bd8c0d6c6ed0cd30b3652886bb8711dc4bb01d637a68105a3d5158039b418e6" +dependencies = [ + "cc", + "libc", +] + [[package]] name = "matchers" version = "0.1.0" @@ -2674,7 +2842,7 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ - "hermit-abi", + "hermit-abi 0.3.9", "libc", "wasi", "windows-sys 0.52.0", @@ -2844,7 +3012,7 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi", + "hermit-abi 0.3.9", "libc", ] @@ -2920,6 +3088,12 @@ version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" +[[package]] +name = "oorandom" +version = "11.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b410bbe7e14ab526a0e86877eb47c6996a2bd7746f027ba551028c925390e4e9" + [[package]] name = "open-fastrlp" version = "0.1.4" @@ -3373,6 +3547,12 @@ dependencies = [ "hmac", ] +[[package]] +name = "peeking_take_while" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" + [[package]] name = "pem" version = "1.1.1" @@ -3457,6 +3637,34 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" +[[package]] +name = "plotters" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747" +dependencies = [ + "num-traits", + "plotters-backend", + "plotters-svg", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "plotters-backend" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a" + +[[package]] +name = "plotters-svg" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670" +dependencies = [ + "plotters-backend", +] + [[package]] name = "portable-atomic" version = "1.9.0" @@ -3974,6 +4182,16 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "rocksdb" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb6f170a4041d50a0ce04b0d2e14916d6ca863ea2e422689a5b694395d299ffe" +dependencies = [ + "libc", + "librocksdb-sys", +] + [[package]] name = "rrs-succinct" version = "0.1.0" @@ -4655,16 +4873,12 @@ dependencies = [ [[package]] name = "sp1-lib" -version = "2.0.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413956de14568d7fb462213b9505ad4607d75c875301b9eca567cfb2e58eaac1" +checksum = "9c372b16988e765af85ccf958b18b26d89c05886f2592d313a285415dcc769cb" dependencies = [ - "anyhow", "bincode", - "cfg-if", - "hex", "serde", - "snowbridge-amcl", ] [[package]] @@ -4830,7 +5044,7 @@ source = "git+https://github.com/succinctlabs/sp1.git#b5c6a41816db138a84371178a8 dependencies = [ "anyhow", "bincode", - "bindgen", + "bindgen 0.70.1", "cc", "cfg-if", "hex", @@ -4925,18 +5139,15 @@ dependencies = [ [[package]] name = "sp1-zkvm" -version = "2.0.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66c525f67cfd3f65950f01c713a72c41a5d44d289155644c8ace4ec264098039" +checksum = "ce08dc324dade0709260b01c76c8eeb665f2ef7c652c2002e2edf5a492ded7f1" dependencies = [ - "bincode", "cfg-if", "getrandom", "lazy_static", "libm", - "once_cell", "rand", - "serde", "sha2", "sp1-lib", ] @@ -5209,6 +5420,16 @@ dependencies = [ "crunchy", ] +[[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 = "tinyvec" version = "1.8.0" @@ -6084,7 +6305,22 @@ dependencies = [ ] [[package]] -name = "zkdb_core" +name = "zkdb-bench" +version = "0.1.0" +dependencies = [ + "criterion", + "hex", + "sha2", + "tempfile", + "tokio", + "tracing", + "tracing-subscriber", + "zkdb-lib", + "zkdb-store", +] + +[[package]] +name = "zkdb-core" version = "0.1.0" dependencies = [ "serde", @@ -6092,25 +6328,31 @@ dependencies = [ ] [[package]] -name = "zkdb_lib" +name = "zkdb-lib" version = "0.1.0" dependencies = [ "bincode", "chrono", "clap", "hex", + "rs_merkle", "serde", "serde_json", "serial_test 2.0.0", + "sha2", "sp1-sdk", + "tempfile", "thiserror", + "tokio", "tracing", "tracing-subscriber", - "zkdb_core", + "zkdb-core", + "zkdb-merkle", + "zkdb-store", ] [[package]] -name = "zkdb_merkle" +name = "zkdb-merkle" version = "0.1.0" dependencies = [ "base64 0.13.1", @@ -6120,7 +6362,18 @@ dependencies = [ "serde", "serde_json", "sp1-zkvm", - "zkdb_core", + "zkdb-core", +] + +[[package]] +name = "zkdb-store" +version = "0.1.0" +dependencies = [ + "async-trait", + "rocksdb", + "serde", + "thiserror", + "tokio", ] [[package]] @@ -6149,3 +6402,13 @@ dependencies = [ "sha3", "subtle", ] + +[[package]] +name = "zstd-sys" +version = "2.0.13+zstd.1.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/Cargo.toml b/Cargo.toml index 8ae2711..8c5dd1f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,8 +1,10 @@ [workspace] members = [ - "crates/zkdb-merkle", "crates/zkdb-core", "crates/zkdb-lib", + "crates/zkdb-merkle", + "crates/zkdb-store", + "crates/zkdb-bench", ] resolver = "2" @@ -19,14 +21,16 @@ sp1-sdk = { git = "https://github.com/succinctlabs/sp1.git" } thiserror = "1.0" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" -zkdb_core = { path = "crates/zkdb-core" } -zkdb_merkle = { path = "crates/zkdb-merkle" } -zkdb_lib = { path = "crates/zkdb-lib" } +zkdb-core = { path = "crates/zkdb-core" } +zkdb-merkle = { path = "crates/zkdb-merkle" } +zkdb-lib = { path = "crates/zkdb-lib" } +zkdb-store = { path = "crates/zkdb-store" } clap = { version = "4.5.20", features = ["derive"] } tracing = { version = "0.1", features = ["log"] } tracing-subscriber = { version = "0.3", features = ["env-filter"] } -sp1-zkvm = "2.0.0" +sp1-zkvm = "3.0.0" base64 = { version = "0.13", features = ["alloc"] } hex = { version = "0.4", features = ["alloc"] } bincode = { version = "1.3" } +sha2 = { version = "0.10" } \ No newline at end of file diff --git a/crates/zkdb-bench/Cargo.toml b/crates/zkdb-bench/Cargo.toml new file mode 100644 index 0000000..af3cced --- /dev/null +++ b/crates/zkdb-bench/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "zkdb-bench" +version = "0.1.0" +edition = "2021" + +[[bench]] +name = "db_operations" +harness = false + +[dependencies] +zkdb-lib = { workspace = true } +zkdb-store = { workspace = true } +criterion = { version = "0.5", features = ["async_tokio"] } +tokio = { version = "1.0", features = ["full"] } +tempfile = "3.8" +sha2 = { workspace = true } +hex = { workspace = true } +tracing = { workspace = true } +tracing-subscriber = { workspace = true } \ No newline at end of file diff --git a/crates/zkdb-bench/benches/db_operations.rs b/crates/zkdb-bench/benches/db_operations.rs new file mode 100644 index 0000000..77a5233 --- /dev/null +++ b/crates/zkdb-bench/benches/db_operations.rs @@ -0,0 +1,162 @@ +use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion}; +use std::sync::Arc; +use tempfile::TempDir; +use tokio::runtime::Runtime; +use zkdb_lib::{Database, DatabaseType}; +use zkdb_store::file::FileStore; + +// Helper function to set up a clean database for each benchmark +async fn setup_db() -> (Database, Arc, TempDir) { + let temp_dir = tempfile::tempdir().unwrap(); + + // Create a subdirectory for the database files + let db_path = temp_dir.path().join("db"); + + // Create store first, which will handle directory creation + let store = Arc::new(FileStore::new(&db_path).await.unwrap()); + + // Then create database + let db = Database::new(DatabaseType::Merkle, store.clone(), None) + .await + .unwrap(); + + (db, store, temp_dir) +} + +fn create_benchmark_runtime() -> Runtime { + tokio::runtime::Builder::new_multi_thread() + .worker_threads(2) + .enable_all() + .build() + .unwrap() +} + +// Benchmark single put operation +fn bench_put(c: &mut Criterion) { + let rt = create_benchmark_runtime(); + + let mut group = c.benchmark_group("put_operations"); + group + .sample_size(10) + .measurement_time(std::time::Duration::from_secs(20)) + .warm_up_time(std::time::Duration::from_secs(5)); + + for size in [10, 100].iter() { + group.bench_with_input(BenchmarkId::from_parameter(size), size, |b, size| { + let value = vec![0u8; *size]; + b.to_async(&rt).iter_batched( + || setup_db(), + |setup_future| async { + let (mut db, _, _) = setup_future.await; + db.put("test_key", &value, false).await.unwrap(); + }, + criterion::BatchSize::SmallInput, + ); + }); + } + group.finish(); +} + +// Benchmark single get operation +fn bench_get(c: &mut Criterion) { + let rt = create_benchmark_runtime(); + + let mut group = c.benchmark_group("get_operations"); + group + .sample_size(10) + .measurement_time(std::time::Duration::from_secs(20)) + .warm_up_time(std::time::Duration::from_secs(5)); + + for size in [10, 100].iter() { + group.bench_with_input(BenchmarkId::from_parameter(size), size, |b, size| { + let value = vec![0u8; *size]; + b.to_async(&rt).iter_batched( + || async { + let (mut db, _, _) = setup_db().await; + db.put("test_key", &value, false).await.unwrap(); + db + }, + |db| async move { + // Now we await the setup future first + let db = db.await; + db.get("test_key", false).await.unwrap() + }, + criterion::BatchSize::SmallInput, + ); + }); + } + group.finish(); +} + +// Benchmark proof generation +fn bench_proof_generation(c: &mut Criterion) { + let rt = create_benchmark_runtime(); + + let mut group = c.benchmark_group("proof_generation"); + group + .sample_size(10) + .measurement_time(std::time::Duration::from_secs(20)) + .warm_up_time(std::time::Duration::from_secs(5)); + + for size in [10, 100].iter() { + group.bench_with_input(BenchmarkId::from_parameter(size), size, |b, size| { + b.to_async(&rt).iter_batched( + || async { + let (mut db, _, _) = setup_db().await; + for i in 0..*size { + let key = format!("key_{}", i); + let value = vec![i as u8; 100]; + db.put(&key, &value, false).await.unwrap(); + } + let key = format!("key_{}", size - 1); + (db, key) + }, + |future_result| async move { + // Await the setup future to get the db and key + let (db, key) = future_result.await; + db.get(&key, true).await.unwrap() + }, + criterion::BatchSize::SmallInput, + ); + }); + } + group.finish(); +} + +// Benchmark batch operations +fn bench_batch_operations(c: &mut Criterion) { + let rt = create_benchmark_runtime(); + + let mut group = c.benchmark_group("batch_operations"); + group + .sample_size(10) + .measurement_time(std::time::Duration::from_secs(20)) + .warm_up_time(std::time::Duration::from_secs(5)); + + for size in [10, 100].iter() { + group.bench_with_input(BenchmarkId::from_parameter(size), size, |b, size| { + b.to_async(&rt).iter_batched( + || setup_db(), + |setup_future| async { + let (mut db, _, _) = setup_future.await; + for i in 0..*size { + let key = format!("key_{}", i); + let value = vec![i as u8; 100]; + db.put(&key, &value, false).await.unwrap(); + } + }, + criterion::BatchSize::SmallInput, + ); + }); + } + group.finish(); +} + +criterion_group!( + benches, + bench_put, + bench_get, + bench_proof_generation, + bench_batch_operations +); +criterion_main!(benches); diff --git a/crates/zkdb-core/Cargo.toml b/crates/zkdb-core/Cargo.toml index 50b31dd..ae7e175 100644 --- a/crates/zkdb-core/Cargo.toml +++ b/crates/zkdb-core/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "zkdb_core" +name = "zkdb-core" version = "0.1.0" edition = "2021" diff --git a/crates/zkdb-lib/Cargo.toml b/crates/zkdb-lib/Cargo.toml index 4ae84b4..2a316b6 100644 --- a/crates/zkdb-lib/Cargo.toml +++ b/crates/zkdb-lib/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "zkdb_lib" +name = "zkdb-lib" version = "0.1.0" edition = "2021" build = "build.rs" @@ -9,16 +9,23 @@ sp1-sdk = { workspace = true } thiserror = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } -zkdb_core = { workspace = true } +zkdb-core = { workspace = true } +zkdb-merkle = { workspace = true } +zkdb-store = { workspace = true } clap = { workspace = true } bincode = { workspace = true } chrono = "0.4" tracing = { workspace = true } hex = { workspace = true } tracing-subscriber = { workspace = true } +tokio = { version = "1.0", features = ["full"] } +sha2 = { workspace = true } [dev-dependencies] serial_test = "2.0" +tempfile = "3.8" +rs_merkle = { workspace = true } + [[bin]] name = "cli" diff --git a/crates/zkdb-lib/src/bin/cli.rs b/crates/zkdb-lib/src/bin/cli.rs index 84987e7..69097c6 100644 --- a/crates/zkdb-lib/src/bin/cli.rs +++ b/crates/zkdb-lib/src/bin/cli.rs @@ -1,255 +1,97 @@ -use clap::{Arg, Command}; -use std::fs; -use tracing_subscriber::{self, EnvFilter}; -use zkdb_core::QueryResult; -use zkdb_lib::{Command as DbCommand, Database, ProvenQueryResult}; - -pub fn init_logging() { - tracing_subscriber::fmt() - .with_env_filter(EnvFilter::from_default_env()) - .init(); +use clap::{Parser, Subcommand}; +use std::path::PathBuf; +use std::sync::Arc; +use tracing::info; +use zkdb_lib::{Database, DatabaseType}; +use zkdb_store::file::FileStore; + +#[derive(Parser)] +#[command(author, version, about, long_about = None)] +struct Cli { + /// Path to the database storage directory + #[arg(short, long, default_value = ".zkdb")] + data_dir: PathBuf, + + /// Path to the state file + #[arg(short, long, default_value = ".zkdb/state.bin")] + state_file: PathBuf, + + #[command(subcommand)] + command: Commands, } -fn main() -> Result<(), Box> { - init_logging(); - - let matches = Command::new("zkDB CLI") - .version("1.0") - .author("Your Name") - .about("Interact with zkDB") - .subcommand( - Command::new("init") - .about("Initialize a new database") - .arg( - Arg::new("state_path") - .long("state") - .default_value("db_state.bin") - .help("Path to save the initial database state"), - ) - .arg( - Arg::new("no_proof") - .long("no-proof") - .help("Disable SP1 proof generation") - .action(clap::ArgAction::SetTrue), - ), - ) - .subcommand( - Command::new("query") - .about("Execute a query") - .arg( - Arg::new("command") - .required(true) - .help("Query command to execute"), - ) - .arg( - Arg::new("no_proof") - .long("no-proof") - .help("Disable SP1 proof generation") - .action(clap::ArgAction::SetTrue), - ) - .arg( - Arg::new("state_path") - .long("state") - .default_value("db_state.bin") - .help("Path to database state file"), - ), - ) - .subcommand( - Command::new("verify").about("Verify a proof").arg( - Arg::new("proof_path") - .required(true) - .help("Path to the proof file"), - ), - ) - .subcommand( - Command::new("insert") - .about("Insert a key-value pair into the database") - .arg(Arg::new("key").required(true).help("Key to insert")) - .arg(Arg::new("value").required(true).help("Value to insert")) - .arg( - Arg::new("no_proof") - .long("no-proof") - .help("Disable SP1 proof generation") - .action(clap::ArgAction::SetTrue), - ) - .arg( - Arg::new("state_path") - .long("state") - .default_value("db_state.bin") - .help("Path to database state file"), - ), - ) - .subcommand( - Command::new("prove") - .about("Generate a Merkle proof for a key") - .arg( - Arg::new("key") - .required(true) - .help("Key to generate proof for"), - ) - .arg( - Arg::new("state_path") - .long("state") - .default_value("db_state.bin") - .help("Path to database state file"), - ) - .arg( - Arg::new("output_path") - .long("output") - .help("Path to save the proof (defaults to proof__.bin)"), - ), - ) - .get_matches(); - - match matches.subcommand() { - Some(("init", init_matches)) => { - let state_path = init_matches.get_one::("state_path").unwrap(); - let _generate_proof = !init_matches.get_flag("no_proof"); - let initial_state = vec![]; // Empty initial state - let db = Database::new(initial_state); - println!("Initializing new database"); - let db_state = db.get_state(); - fs::write(state_path, bincode::serialize(&db_state)?)?; - println!("Database state saved to: {}", state_path); - } - Some(("query", query_matches)) => { - let command_str = query_matches.get_one::("command").unwrap(); - let generate_proof = !query_matches.get_flag("no_proof"); - let state_path = query_matches.get_one::("state_path").unwrap(); - - let db_state: Vec = bincode::deserialize(&fs::read(state_path)?)?; - let mut db = Database::new(db_state); - - let command = parse_command(command_str)?; - match db.execute_query(command, generate_proof) { - Ok(result) => { - fs::write(state_path, bincode::serialize(&db.get_state())?)?; +#[derive(Subcommand)] +enum Commands { + /// Insert a key-value pair + Put { + /// Key to insert + key: String, + /// Value to insert + value: String, + /// Generate proof + #[arg(short, long)] + proof: bool, + }, + /// Query a value by key + Get { + /// Key to query + key: String, + /// Generate proof + #[arg(short, long)] + proof: bool, + }, + /// Initialize a new database + Init, +} - print_query_result(&result); +#[tokio::main] +async fn main() -> Result<(), Box> { + tracing_subscriber::fmt::init(); + let cli = Cli::parse(); - if generate_proof { - let proof_path = format!("proof_{}.bin", chrono::Utc::now().timestamp()); - fs::write(&proof_path, bincode::serialize(&result)?)?; - println!("Proof saved to: {}", proof_path); - } - } - Err(e) => eprintln!("Query execution failed: {}", e), - } - } - Some(("verify", verify_matches)) => { - let proof_path = verify_matches.get_one::("proof_path").unwrap(); - let proven_output: zkdb_lib::ProvenOutput = - bincode::deserialize(&fs::read(proof_path)?)?; + // Create data directory if it doesn't exist + tokio::fs::create_dir_all(&cli.data_dir).await?; - let db_state: Vec = bincode::deserialize(&fs::read("db_state.bin")?)?; - let db = Database::new(db_state); + // Initialize store + let store = FileStore::new(&cli.data_dir).await?; - match db.verify_proof(&proven_output) { - Ok(true) => println!("Proof verified successfully"), - Ok(false) => println!("Proof verification failed"), - Err(e) => eprintln!("Proof verification error: {}", e), - } + // Load existing state if available + let state_bytes = if cli.state_file.exists() { + Some(tokio::fs::read(&cli.state_file).await?) + } else { + None + }; + + // Initialize database + let mut db = Database::new(DatabaseType::Merkle, Arc::new(store), state_bytes).await?; + + match cli.command { + Commands::Put { key, value, proof } => { + info!("Inserting key: {}", key); + db.put(&key, value.as_bytes(), proof).await?; + // Save state after modification + db.save_state(&cli.state_file)?; + println!("Successfully inserted key: {}", key); } - Some(("insert", insert_matches)) => { - let key = insert_matches.get_one::("key").unwrap(); - let value = insert_matches.get_one::("value").unwrap(); - let generate_proof = !insert_matches.get_flag("no_proof"); - let state_path = insert_matches.get_one::("state_path").unwrap(); - - let db_state: Vec = bincode::deserialize(&fs::read(state_path)?)?; - let mut db = Database::new(db_state); - - let command = DbCommand::Insert { - key: key.clone(), - value: value.clone(), - }; - - match db.execute_query(command, generate_proof) { - Ok(result) => { - fs::write(state_path, bincode::serialize(&db.get_state())?)?; - println!("Successfully inserted key '{}' with value '{}'", key, value); - print_query_result(&result); + Commands::Get { key, proof } => { + info!("Querying key: {}", key); + match db.get(&key, proof).await { + Ok(value) => { + println!("Value: {:?}", String::from_utf8_lossy(&value)); } - Err(e) => eprintln!("Insert failed: {}", e), - } - } - Some(("prove", prove_matches)) => { - let key = prove_matches.get_one::("key").unwrap(); - let state_path = prove_matches.get_one::("state_path").unwrap(); - - let db_state: Vec = bincode::deserialize(&fs::read(state_path)?)?; - let mut db = Database::new(db_state); - - let command = DbCommand::Prove { key: key.clone() }; - - match db.execute_query(command, true) { - Ok(result) => { - let output_path = prove_matches - .get_one::("output_path") - .map(|s| s.to_string()) - .unwrap_or_else(|| { - format!("proof_{}_{}.bin", key, chrono::Utc::now().timestamp()) - }); - - fs::write(&output_path, bincode::serialize(&result)?)?; - - println!("Merkle Proof Generation:"); - println!("------------------------"); - print_proof_result(&result); - println!("\nProof saved to: {}", output_path); + Err(e) => { + println!("Error retrieving key {}: {}", key, e); } - Err(e) => eprintln!("Proof generation failed: {}", e), } } - _ => { - println!("Invalid command. Use --help for usage information."); + Commands::Init => { + info!("Initializing new database"); + // Save initial empty state + db.save_state(&cli.state_file)?; + println!("Database initialized at {:?}", cli.data_dir); + println!("State file created at {:?}", cli.state_file); } } Ok(()) } - -fn parse_command(command_str: &str) -> Result> { - if let Some(parts) = command_str.split_once(':') { - if parts.0 == "insert" { - let (key, value) = parts - .1 - .split_once('=') - .ok_or("Invalid insert format. Use 'insert:key=value'")?; - return Ok(DbCommand::Insert { - key: key.to_string(), - value: value.to_string(), - }); - } - } - - Ok(DbCommand::Query { - key: command_str.to_string(), - }) -} - -fn print_query_result(result: &ProvenQueryResult) { - println!("Query Result:"); - println!("New State: {:?}", result.new_state); - println!("Output: {:?}", result.data); -} - -fn print_proof_result(result: &ProvenQueryResult) { - if let Ok(proof_data) = serde_json::from_value::(result.data.clone()) { - if let Some(root) = proof_data.get("root") { - println!("Merkle Root: {}", root.as_str().unwrap_or("N/A")); - } - if let Some(index) = proof_data.get("index") { - println!("Leaf Index: {}", index.as_u64().unwrap_or(0)); - } - if let Some(leaf) = proof_data.get("leaf") { - println!("Leaf Hash: {}", leaf.as_str().unwrap_or("N/A")); - } - println!("\nProof Details:"); - if let Some(proof) = proof_data.get("proof") { - println!("Proof (base64): {}", proof.as_str().unwrap_or("N/A")); - } - } else { - println!("Raw Result: {:?}", result.data); - } -} diff --git a/crates/zkdb-lib/src/lib.rs b/crates/zkdb-lib/src/lib.rs index ebd0b7d..1c1b2d9 100644 --- a/crates/zkdb-lib/src/lib.rs +++ b/crates/zkdb-lib/src/lib.rs @@ -1,3 +1,4 @@ +use sha2::{Digest, Sha256}; use sp1_sdk::{ HashableKey, ProverClient, SP1ProofWithPublicValues, SP1ProvingKey, SP1PublicValues, SP1Stdin, SP1VerifyingKey, @@ -5,13 +6,23 @@ use sp1_sdk::{ use std::env; use std::fs; use std::path::Path; +use std::sync::Arc; use thiserror::Error; use tracing::{debug, error, instrument}; +use zkdb_store::{Store, StoreError}; // reexport zkdb_core pub use zkdb_core::{Command, QueryResult}; +#[derive(Debug, Clone)] +pub enum DatabaseType { + Merkle, +} + pub struct Database { + #[allow(dead_code)] + engine: DatabaseType, + store: Arc, state: Vec, executor: SP1Executor, } @@ -29,15 +40,107 @@ pub fn get_elf() -> &'static [u8] { } impl Database { - #[instrument(skip(initial_state))] - pub fn new(initial_state: Vec) -> Self { + #[instrument(skip(store))] + pub async fn new( + engine: DatabaseType, + store: Arc, + // bincoded state is optional, defaults to empty + state: Option>, + ) -> Result { debug!("Creating new Database instance"); let elf = get_elf(); debug!("Loaded ELF binary, size: {} bytes", elf.len()); - Database { - state: initial_state, + + Ok(Database { + engine, + store, + state: state.unwrap_or_default(), executor: SP1Executor::new(elf), + }) + } + + #[instrument(skip(self, value))] + pub async fn put( + &mut self, + key: &str, + value: &[u8], + generate_proof: bool, + ) -> Result<(), DatabaseError> { + // 1. Store the actual value + self.store.put(key, value).await?; + + // 2. Calculate hash for Merkle tree + let mut hasher = Sha256::new(); + hasher.update(value); + let value_hash = hex::encode(hasher.finalize()); + debug!("PUT: Original value: {:?}", String::from_utf8_lossy(value)); + debug!("PUT: Calculated hash: {}", value_hash); + + // 3. Store hash in Merkle tree via SP1 + let command = Command::Insert { + key: key.to_string(), + value: value_hash, + }; + + let result = self + .executor + .execute_query(&self.state, &command, generate_proof)?; + + debug!("PUT: Result from executor: {:?}", result.data); + + // update state + self.set_state(result.new_state); + + Ok(()) + } + + #[instrument(skip(self))] + pub async fn get(&self, key: &str, generate_proof: bool) -> Result, DatabaseError> { + // 1. Get hash from Merkle tree for verification + let command = Command::Query { + key: key.to_string(), + }; + let result = self + .executor + .execute_query(&self.state, &command, generate_proof)?; + debug!("GET: Query Result: {:?}", result.data); + + if result.data.get("error").is_some() { + return Err(DatabaseError::QueryExecutionFailed(format!( + "Query execution failed, error: {:?}", + result.data + ))); } + + let merkle_hash = result + .data + .get("value") + .and_then(|v| v.as_str()) + .ok_or_else(|| { + DatabaseError::QueryExecutionFailed("Invalid result format".to_string()) + })?; + + // 2. Get actual value from store + let value = self.store.get(key).await?; + debug!( + "GET: Retrieved value from store: {:?}", + String::from_utf8_lossy(&value) + ); + + // 3. Verify hash matches + let mut hasher = Sha256::new(); + hasher.update(&value); + let computed_hash = hex::encode(hasher.finalize()); + debug!("GET: Computed hash of retrieved value: {}", computed_hash); + + if computed_hash != merkle_hash { + return Err(DatabaseError::Store(StoreError::Storage( + "Value hash mismatch - data may be corrupted".to_string(), + ))); + } + + // Return the actual value + Ok(value) } #[instrument(skip(self, command))] @@ -66,12 +169,17 @@ impl Database { &self.state } + #[instrument(skip(self))] + pub fn set_state(&mut self, state: Vec) { + self.state.clone_from(&state); + } + #[instrument(skip(self, path))] pub fn save_state(&self, path: &Path) -> Result<(), DatabaseError> { debug!(path = ?path, "Saving database state"); - fs::write(path, bincode::serialize(&self.state).unwrap()).map_err(|e| { + fs::write(path, &self.state).map_err(|e| { error!(error = ?e, "Failed to save state"); - DatabaseError::QueryExecutionFailed(e.to_string()) + DatabaseError::QueryExecutionFailed(format!("Failed to save state: {}", e)) }) } } @@ -90,6 +198,8 @@ pub enum DatabaseError { ProofGenerationFailed(String), #[error("Proof verification failed: {0}")] ProofVerificationFailed(String), + #[error("Store error: {0}")] + Store(#[from] StoreError), } pub struct SP1Executor { @@ -148,7 +258,10 @@ impl SP1Executor { .run() .map_err(|e| { error!(error = ?e, "Query execution failed"); - DatabaseError::QueryExecutionFailed(e.to_string()) + DatabaseError::QueryExecutionFailed(format!( + "Failed to execute query with proof: {}", + e + )) })?; debug!("Query executed with proof"); @@ -163,7 +276,10 @@ impl SP1Executor { debug!("Executing query without proof"); let (output, _) = self.client.execute(self.elf, stdin).run().map_err(|e| { error!(error = ?e, "Query execution failed"); - DatabaseError::QueryExecutionFailed(e.to_string()) + DatabaseError::QueryExecutionFailed(format!( + "Failed to execute query without proof: {}", + e + )) })?; debug!("Query executed successfully"); self.parse_output(output, None) @@ -179,12 +295,12 @@ impl SP1Executor { debug!("Parsing query output"); let output_str = String::from_utf8(output.to_vec()).map_err(|e| { error!(error = ?e, "Failed to parse output as UTF-8"); - DatabaseError::QueryExecutionFailed(e.to_string()) + DatabaseError::QueryExecutionFailed(format!("Failed to parse output as UTF-8: {}", e)) })?; let output_json: serde_json::Value = serde_json::from_str(&output_str).map_err(|e| { error!(error = ?e, "Failed to parse output as JSON"); - DatabaseError::QueryExecutionFailed(e.to_string()) + DatabaseError::QueryExecutionFailed(format!("Failed to parse output as JSON: {}", e)) })?; debug!(?output_json, "Parsed output JSON"); diff --git a/crates/zkdb-lib/tests/merkle_tests.rs b/crates/zkdb-lib/tests/merkle_tests.rs index b28e3a2..2860e00 100644 --- a/crates/zkdb-lib/tests/merkle_tests.rs +++ b/crates/zkdb-lib/tests/merkle_tests.rs @@ -1,88 +1,223 @@ -use serde_json::json; +use hex; use serial_test::serial; -use zkdb_lib::{Command, Database, QueryResult}; +use sha2::{Digest, Sha256}; +use std::sync::Arc; +use tempfile; +use zkdb_lib::{Command, Database, DatabaseType}; +use zkdb_store::file::FileStore; -fn setup_database() -> Database { - let initial_state = Vec::new(); // Empty initial state - Database::new(initial_state) +fn init() { + let _ = tracing_subscriber::fmt() + .with_env_filter("debug") + .with_test_writer() + .try_init(); } -#[test] +async fn setup_database() -> (Database, Arc) { + let temp_dir = tempfile::tempdir().unwrap(); + let store = Arc::new(FileStore::new(temp_dir.path()).await.unwrap()); + let db = Database::new(DatabaseType::Merkle, store.clone(), None) + .await + .unwrap(); + (db, store) +} + +#[tokio::test] #[serial] -fn test_insert_and_get() { - let mut db = setup_database(); +async fn test_insert_and_get() { + init(); + let (mut db, _store) = setup_database().await; // Insert a key-value pair + let key = "test_key"; + let value = b"test_value"; + + // First hash the value like the Database::put method does + let mut hasher = Sha256::new(); + hasher.update(value); + let value_hash = hex::encode(hasher.finalize()); + + // Now send the hash to the Merkle tree let insert_command = Command::Insert { - key: "test_key".to_string(), - value: "test_value".to_string(), + key: key.to_string(), + value: value_hash.clone(), // Send the hex-encoded hash }; + + tracing::debug!("Executing insert command"); let insert_result = db.execute_query(insert_command, false).unwrap(); - // data.inserted should be true + tracing::debug!("Insert result: {:?}", insert_result.data); assert!(insert_result.data["inserted"].as_bool().unwrap()); // Query the inserted value let get_command = Command::Query { - key: "test_key".to_string(), + key: key.to_string(), }; + + tracing::debug!("Executing query command"); let get_result = db.execute_query(get_command, false).unwrap(); + tracing::debug!("Query result: {:?}", get_result.data); assert!(get_result.data["found"].as_bool().unwrap()); + + // Verify the returned hash matches + assert_eq!(get_result.data["value"].as_str().unwrap(), value_hash); } -#[test] +#[tokio::test] #[serial] -fn test_proof_generation_and_verification() { - let mut db = setup_database(); +async fn test_proof_generation_and_verification() { + init(); + let (mut db, _store) = setup_database().await; + + let key = "proof_key"; + let value = b"proof_value"; - // Insert a key-value pair with proof generation + // Hash the value before sending to Merkle tree + let mut hasher = Sha256::new(); + hasher.update(value); + let value_hash = hex::encode(hasher.finalize()); + + // Insert with proof generation + tracing::debug!("Inserting value with proof generation"); let insert_command = Command::Insert { - key: "proof_key".to_string(), - value: "proof_value".to_string(), + key: key.to_string(), + value: value_hash, // Send the hex-encoded hash }; - let _insert_result = db.execute_query(insert_command, true).unwrap(); + let insert_result = db.execute_query(insert_command, true).unwrap(); + tracing::debug!("Insert with proof result: {:?}", insert_result.data); + assert!(insert_result.sp1_proof.is_some()); - // Query the inserted value with proof generation - let get_command = Command::Query { - key: "proof_key".to_string(), + // Generate proof + tracing::debug!("Generating proof for key"); + let prove_command = Command::Prove { + key: key.to_string(), }; - let get_result = db.execute_query(get_command, true).unwrap(); - assert!(get_result.data["found"].as_bool().unwrap()); + let prove_result = db.execute_query(prove_command, true).unwrap(); + tracing::debug!("Proof generation result: {:?}", prove_result.data); + + // Verify proof exists + assert!(prove_result.data["proof"].is_string()); + assert!(prove_result.data["root"].is_string()); } -#[test] +#[tokio::test] #[serial] -fn test_multiple_operations() { - let mut db = setup_database(); +async fn test_multiple_operations() { + init(); + let (mut db, _store) = setup_database().await; // Insert multiple key-value pairs for i in 0..5 { + let key = format!("key_{}", i); + let value = format!("value_{}", i); + let value_bytes = value.as_bytes(); + + // Hash the value before sending to Merkle tree + let mut hasher = Sha256::new(); + hasher.update(value_bytes); + let value_hash = hex::encode(hasher.finalize()); + let insert_command = Command::Insert { - key: format!("key_{}", i), - value: format!("value_{}", i), + key: key.clone(), + value: value_hash, // Send the hex-encoded hash }; - db.execute_query(insert_command, false).unwrap(); + + tracing::debug!("Inserting key-value pair {}", i); + let result = db.execute_query(insert_command, false).unwrap(); + tracing::debug!("Insert result for pair {}: {:?}", i, result.data); + assert!(result.data["inserted"].as_bool().unwrap()); } - // Verify all inserted values + // Verify all values for i in 0..5 { - let get_command = Command::Query { - key: format!("key_{}", i), + let key = format!("key_{}", i); + let get_command = Command::Query { key: key.clone() }; + + tracing::debug!("Querying key {}", key); + let result = db.execute_query(get_command, false).unwrap(); + tracing::debug!("Query result for key {}: {:?}", key, result.data); + assert!(result.data["found"].as_bool().unwrap()); + } +} + +#[tokio::test] +#[serial] +async fn test_merkle_tree_properties() { + init(); + let (mut db, _store) = setup_database().await; + + // Insert some values and collect their hashes + let mut value_hashes = Vec::new(); + for i in 0..4 { + let key = format!("key_{}", i); + let value = format!("value_{}", i); + + // Hash the value before sending to Merkle tree + let mut hasher = Sha256::new(); + hasher.update(value.as_bytes()); + let value_hash = hex::encode(hasher.finalize()); + + tracing::debug!("Inserting test value {}", i); + let insert_command = Command::Insert { + key: key.clone(), + value: value_hash.clone(), // Send the hex-encoded hash }; - let get_result = db.execute_query(get_command, false).unwrap(); - assert!(get_result.data["found"].as_bool().unwrap()); + let result = db.execute_query(insert_command, false).unwrap(); + value_hashes.push(result.data["leaf"].as_str().unwrap().to_string()); + } + + // Generate and verify proofs for each value + for (i, hash) in value_hashes.iter().enumerate() { + let key = format!("key_{}", i); + let prove_command = Command::Prove { key: key.clone() }; + + tracing::debug!("Generating proof for key {}", key); + let result = db.execute_query(prove_command, false).unwrap(); + tracing::debug!("Proof result for key {}: {:?}", key, result.data); + + // Verify proof contains necessary components + assert!(result.data["proof"].is_string()); + assert!(result.data["root"].is_string()); + assert_eq!(result.data["leaf"].as_str().unwrap(), hash); } +} - // Update a value - let update_command = Command::Insert { - key: "key_2".to_string(), - value: "updated_value".to_string(), +#[tokio::test] +#[serial] +async fn test_state_consistency() { + init(); + let (mut db, _store) = setup_database().await; + + // Insert initial value + let key = "state_test_key"; + let value = b"state_test_value"; + + // Hash the value before sending to Merkle tree + let mut hasher = Sha256::new(); + hasher.update(value); + let value_hash = hex::encode(hasher.finalize()); + + tracing::debug!("Inserting initial value"); + let insert_command = Command::Insert { + key: key.to_string(), + value: value_hash, // Send the hex-encoded hash }; - db.execute_query(update_command, false).unwrap(); + db.execute_query(insert_command, false).unwrap(); + + // Get current state + let state = db.get_state().to_vec(); + tracing::debug!("Current state size: {} bytes", state.len()); - // Verify the updated value + // Create new database with saved state + let (mut new_db, _) = setup_database().await; + new_db.set_state(state); + + // Verify value exists in new database let get_command = Command::Query { - key: "key_2".to_string(), + key: key.to_string(), }; - let get_result = db.execute_query(get_command, false).unwrap(); - assert!(get_result.data["found"].as_bool().unwrap()); + + tracing::debug!("Querying value from new database instance"); + let result = new_db.execute_query(get_command, false).unwrap(); + tracing::debug!("Query result from new instance: {:?}", result.data); + assert!(result.data["found"].as_bool().unwrap()); } diff --git a/crates/zkdb-lib/tests/storage_tests.rs b/crates/zkdb-lib/tests/storage_tests.rs new file mode 100644 index 0000000..91e4d0f --- /dev/null +++ b/crates/zkdb-lib/tests/storage_tests.rs @@ -0,0 +1,36 @@ +use std::sync::Arc; +use zkdb_lib::{Database, DatabaseType}; +use zkdb_store::file::FileStore; + +// Add this function to set up logging for tests +fn init() { + let _ = tracing_subscriber::fmt() + .with_env_filter("debug") // Set default level to debug + .with_test_writer() // Use test writer to see output in test runs + .try_init(); // Initialize the subscriber +} + +#[tokio::test] +async fn test_storage_integration() { + // Initialize logging + init(); + + // Create temporary directory for test + let temp_dir = tempfile::tempdir().unwrap(); + let store = FileStore::new(temp_dir.path()).await.unwrap(); + + let mut db = Database::new(DatabaseType::Merkle, Arc::new(store), None) + .await + .unwrap(); + + // Test basic operations + let key = "test_key"; + let value = b"test_value"; + + // Put value + db.put(key, value, false).await.unwrap(); + + // Get value and verify it matches + let retrieved = db.get(key, false).await.unwrap(); + assert_eq!(&retrieved, value); +} diff --git a/crates/zkdb-merkle/Cargo.toml b/crates/zkdb-merkle/Cargo.toml index c84d303..8e12fd4 100644 --- a/crates/zkdb-merkle/Cargo.toml +++ b/crates/zkdb-merkle/Cargo.toml @@ -1,10 +1,10 @@ [package] -name = "zkdb_merkle" +name = "zkdb-merkle" version = "0.1.0" edition = "2021" [[bin]] -name = "zkdb_merkle" +name = "zkdb-merkle" path = "src/main.rs" [dependencies] @@ -15,4 +15,4 @@ serde_json = { workspace = true, features = ["alloc"] } base64 = { workspace = true, features = ["alloc"] } hex = { workspace = true, features = ["alloc"] } bincode = { workspace = true } -zkdb_core = { workspace = true } +zkdb-core = { workspace = true } diff --git a/crates/zkdb-merkle/src/main.rs b/crates/zkdb-merkle/src/main.rs index db4da44..77289f8 100644 --- a/crates/zkdb-merkle/src/main.rs +++ b/crates/zkdb-merkle/src/main.rs @@ -12,7 +12,7 @@ use alloc::string::String; use alloc::string::ToString; use alloc::vec::Vec; use rs_merkle::proof_serializers; -use rs_merkle::{algorithms::Sha256, Hasher, MerkleTree}; +use rs_merkle::{algorithms::Sha256, MerkleTree}; use serde::{Deserialize, Serialize}; use sp1_zkvm::io; use zkdb_core::{Command, DatabaseEngine, DatabaseError, QueryResult}; @@ -75,8 +75,9 @@ fn main_internal(state: &[u8], command: &Command) -> Result Result { - // Hash the value. - let leaf = Sha256::hash(value.as_bytes()); - // Insert into the tree. + // Convert hex string back to bytes + let value_bytes = hex::decode(&value).map_err(|e| { + DatabaseError::QueryExecutionFailed(format!("Failed to decode hex value: {}", e)) + })?; + + // Convert to fixed size array for Merkle tree + let mut leaf = [0u8; 32]; + leaf.copy_from_slice(&value_bytes); + + // Insert into the tree state.leaves.push(leaf); let index = state.leaves.len() - 1; state.key_indices.insert(key.clone(), index); @@ -105,7 +113,7 @@ fn insert( "key": key.clone(), "value": value.clone(), "index": index, - "leaf": hex::encode(leaf), + "leaf": value.clone(), "inserted": true, }), new_state: bincode::serialize(&state).unwrap(), diff --git a/crates/zkdb-store/Cargo.toml b/crates/zkdb-store/Cargo.toml new file mode 100644 index 0000000..21b0ecf --- /dev/null +++ b/crates/zkdb-store/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "zkdb-store" +version = "0.1.0" +edition = "2021" + +[dependencies] +async-trait = "0.1" +thiserror = "1.0" +tokio = { version = "1.0", features = ["full"] } +serde = { version = "1.0", features = ["derive"] } +rocksdb = "0.21" \ No newline at end of file diff --git a/crates/zkdb-store/src/file.rs b/crates/zkdb-store/src/file.rs new file mode 100644 index 0000000..085bfee --- /dev/null +++ b/crates/zkdb-store/src/file.rs @@ -0,0 +1,58 @@ +use crate::{Store, StoreError, StoreResult}; +use async_trait::async_trait; +use std::path::{Path, PathBuf}; +use tokio::fs; + +pub struct FileStore { + base_path: PathBuf, +} + +impl FileStore { + pub async fn new>(base_path: P) -> StoreResult { + let base_path = base_path.as_ref().to_owned(); + fs::create_dir_all(&base_path).await?; + Ok(Self { base_path }) + } + + fn key_to_path(&self, key: &str) -> PathBuf { + self.base_path.join(key) + } + + async fn ensure_parent_exists(&self, path: &Path) -> StoreResult<()> { + if let Some(parent) = path.parent() { + fs::create_dir_all(parent).await?; + } + Ok(()) + } +} + +#[async_trait] +impl Store for FileStore { + async fn put(&self, key: &str, value: &[u8]) -> StoreResult<()> { + let path = self.key_to_path(key); + self.ensure_parent_exists(&path).await?; + fs::write(path, value).await?; + Ok(()) + } + + async fn get(&self, key: &str) -> StoreResult> { + let path = self.key_to_path(key); + fs::read(path).await.map_err(|e| match e.kind() { + std::io::ErrorKind::NotFound => StoreError::NotFound(key.to_string()), + _ => StoreError::Io(e.to_string()), + }) + } + + async fn delete(&self, key: &str) -> StoreResult<()> { + let path = self.key_to_path(key); + fs::remove_file(path).await.map_err(|e| match e.kind() { + std::io::ErrorKind::NotFound => StoreError::NotFound(key.to_string()), + _ => StoreError::Io(e.to_string()), + }) + } + + async fn exists(&self, key: &str) -> StoreResult { + let path = self.key_to_path(key); + Ok(path.exists()) + } +} diff --git a/crates/zkdb-store/src/lib.rs b/crates/zkdb-store/src/lib.rs new file mode 100644 index 0000000..71c69e6 --- /dev/null +++ b/crates/zkdb-store/src/lib.rs @@ -0,0 +1,41 @@ +use async_trait::async_trait; +use serde::{Deserialize, Serialize}; +use thiserror::Error; + +#[derive(Debug, Error, Serialize, Deserialize)] +pub enum StoreError { + #[error("IO error: {0}")] + Io(String), + #[error("Value not found for key: {0}")] + NotFound(String), + #[error("Storage error: {0}")] + Storage(String), +} + +impl From for StoreError { + fn from(err: std::io::Error) -> Self { + StoreError::Io(err.to_string()) + } +} + +pub type StoreResult = Result; + +#[async_trait] +pub trait Store: Send + Sync { + /// Store a value and return its location reference + async fn put(&self, key: &str, value: &[u8]) -> StoreResult<()>; + + /// Retrieve a value by its key + async fn get(&self, key: &str) -> StoreResult>; + + /// Delete a value by its key + async fn delete(&self, key: &str) -> StoreResult<()>; + + /// Check if a key exists + async fn exists(&self, key: &str) -> StoreResult; +} + +/// Basic file-based implementation +pub mod file; +/// RocksDB-based implementation +pub mod rocks; diff --git a/crates/zkdb-store/src/rocks.rs b/crates/zkdb-store/src/rocks.rs new file mode 100644 index 0000000..4335419 --- /dev/null +++ b/crates/zkdb-store/src/rocks.rs @@ -0,0 +1,59 @@ +use crate::{Store, StoreError, StoreResult}; +use async_trait::async_trait; +use rocksdb::{Options, DB}; +use std::path::Path; + +pub struct RocksStore { + db: DB, +} + +impl RocksStore { + /// Creates a new RocksDB store at the specified path + pub fn new>(path: P) -> StoreResult { + let mut opts = Options::default(); + opts.create_if_missing(true); + + let db = DB::open(&opts, path).map_err(|e| StoreError::Storage(e.to_string()))?; + + Ok(Self { db }) + } +} + +#[async_trait] +impl Store for RocksStore { + async fn put(&self, key: &str, value: &[u8]) -> StoreResult<()> { + self.db + .put(key.as_bytes(), value) + .map_err(|e| StoreError::Storage(e.to_string()))?; + Ok(()) + } + + async fn get(&self, key: &str) -> StoreResult> { + self.db + .get(key.as_bytes()) + .map_err(|e| StoreError::Storage(e.to_string()))? + .ok_or_else(|| StoreError::NotFound(key.to_string())) + } + + async fn delete(&self, key: &str) -> StoreResult<()> { + self.db + .delete(key.as_bytes()) + .map_err(|e| StoreError::Storage(e.to_string()))?; + Ok(()) + } + + async fn exists(&self, key: &str) -> StoreResult { + let exists = self + .db + .get(key.as_bytes()) + .map_err(|e| StoreError::Storage(e.to_string()))? + .is_some(); + Ok(exists) + } +} + +impl Drop for RocksStore { + fn drop(&mut self) { + // RocksDB will flush and close automatically + } +} diff --git a/docs/design/structure.md b/docs/design/structure.md index df8b202..62c2422 100644 --- a/docs/design/structure.md +++ b/docs/design/structure.md @@ -56,6 +56,26 @@ Command-line interface built on top of zkdb-lib: - Helper methods - Common tools +### zkdb-store + +A new crate for managing value storage: + +- Trait-based storage interface +- Multiple backend implementations +- Configurable storage policies +- Example usage: + ```rust + let store = FileStore::new(config); + let location = store.put(key, value)?; + let value = store.get(key)?; + ``` + +### Storage Backends + +1. FileStore + - Local filesystem storage + - Directory-based organization + - Optional compression ## Architecture Flow 1. SP1 Program Development: @@ -104,3 +124,107 @@ The project uses different dependencies for SP1 programs vs client code: - SP1 programs focus on computation logic - zkdb-lib handles all proof generation and verification - Proof artifacts are managed consistently across engines + +## Storage Architecture + +### Two-Layer Storage Design + +1. Merkle State Tree (MST) + - Stores key-value pairs where: + - Key: Original key from user + - Value: Hash of the actual data + - Handled by zkdb-merkle SP1 program + - Provides cryptographic proofs and consistency guarantees + +2. Value Store + - Stores actual data values + - Multiple backend options: + - Local filesystem + - Not part of the zero-knowledge proofs + - Configurable based on application needs + +### Data Flow + +Actors: +- Database (Main client interface in zkdb-lib) +- FileStore (Value storage backend in zkdb-store) +- ProverClient (SP1 prover interface) +- MerkleEngine (SP1 program implementation) +- MerkleState (Merkle tree state in SP1 program) +- Command (Cross-boundary message type) +- QueryResult (Cross-boundary result type) +- ProvenQueryResult (Proof-carrying result type) + +1. Write Operation: + ```mermaid + sequenceDiagram + participant Client + participant DB as Database + participant Store as FileStore + participant SP1 as ProverClient + participant Program as MerkleEngine + participant MST as MerkleState + + %% Write Operation + Client->>DB: put(key, value) + + %% Store actual value first + DB->>Store: put(key, value) + Store-->>DB: ok + + %% Calculate hash and update Merkle tree + DB->>DB: hash = Sha256::digest(value) + DB->>SP1: execute(zkdb-merkle ELF, Command::Insert{key, hash}) + + SP1->>Program: main(state, Command::Insert) + Program->>Program: deserialize_state() + Program->>MST: insert(key, hash) + MST-->>Program: ok + Program->>Program: serialize_state() + Program-->>SP1: QueryResult{data: {"inserted": true}, new_state} + + SP1-->>DB: QueryResult + DB-->>Client: ok + ``` + +2. Get Operation: + ```mermaid + sequenceDiagram + participant Client + participant DB as Database + participant Store as FileStore + participant SP1 as ProverClient + participant Program as MerkleEngine + participant MST as MerkleState + + Client->>DB: get(key) + DB->>SP1: execute(zkdb-merkle ELF, Command::Query) + SP1->>Program: main(state, Command::Query) + Program->>MST: query(key) + MST-->>Program: value_hash + Program-->>SP1: QueryResult{data, new_state} + SP1-->>DB: value_hash + DB->>Store: get(key) + Store-->>DB: value + DB->>DB: verify_hash(value, value_hash) + DB-->>Client: value_hash + ``` + +3. Prove Operation: + ```mermaid + sequenceDiagram + participant Client + participant DB as Database + participant SP1 as ProverClient + participant Program as MerkleEngine + participant MST as MerkleState + + Client->>DB: prove(key) + DB->>SP1: execute(zkdb-merkle ELF, Command::Prove) + SP1->>Program: main(state, Command::Prove) + Program->>MST: generate_proof(key) + MST-->>Program: proof + Program-->>SP1: QueryResult{proof, root} + SP1-->>DB: ProvenQueryResult + DB-->>Client: proof + ```