diff --git a/Cargo.lock b/Cargo.lock index 6c5d374..e3fd300 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -34,6 +34,18 @@ dependencies = [ "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" @@ -43,6 +55,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "allocator-api2" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" + [[package]] name = "android-tzdata" version = "0.1.1" @@ -127,7 +145,7 @@ dependencies = [ "digest", "itertools 0.10.5", "num-bigint", - "num-traits", + "num-traits 0.2.19", "paste", "rustc_version", "zeroize", @@ -150,7 +168,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" dependencies = [ "num-bigint", - "num-traits", + "num-traits 0.2.19", "proc-macro2", "quote", "syn 1.0.109", @@ -173,7 +191,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" dependencies = [ - "num-traits", + "num-traits 0.2.19", "rand", ] @@ -183,6 +201,21 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +[[package]] +name = "ascii-canvas" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8824ecca2e851cec16968d54a01dd372ef8f95b244fb84b84e70128be347c3c6" +dependencies = [ + "term", +] + +[[package]] +name = "assert_matches" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" + [[package]] name = "async-stream" version = "0.3.5" @@ -381,10 +414,34 @@ checksum = "a6773ddc0eafc0e509fb60e48dff7f450f8e674a0686ae8605e8d9901bd5eefa" dependencies = [ "num-bigint", "num-integer", - "num-traits", + "num-traits 0.2.19", + "serde", +] + +[[package]] +name = "bincode" +version = "2.0.0-rc.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f11ea1a0346b94ef188834a65c068a03aec181c94896d481d7a0a40d85b0ce95" +dependencies = [ "serde", ] +[[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" @@ -418,6 +475,16 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bstr" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40723b8fb387abc38f4f4a37c09073622e41dd12327033091ef8950659e6dc0c" +dependencies = [ + "memchr", + "serde", +] + [[package]] name = "bumpalo" version = "3.16.0" @@ -442,6 +509,486 @@ version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" +[[package]] +name = "bzip2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" +dependencies = [ + "bzip2-sys", + "libc", +] + +[[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 = "cairo-lang-casm" +version = "2.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd4d6659539ace9649c8e8a7434e51b0c50a7a700111d0a2b967dde220ddff49" +dependencies = [ + "cairo-lang-utils", + "indoc", + "num-bigint", + "num-traits 0.2.19", + "parity-scale-codec", + "serde", +] + +[[package]] +name = "cairo-lang-compiler" +version = "2.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2016966ed29f3a44487fd1bbdb05320fb6ea8ec46201c04c6b222ccb5264e0a" +dependencies = [ + "anyhow", + "cairo-lang-defs", + "cairo-lang-diagnostics", + "cairo-lang-filesystem", + "cairo-lang-lowering", + "cairo-lang-parser", + "cairo-lang-project", + "cairo-lang-semantic", + "cairo-lang-sierra", + "cairo-lang-sierra-generator", + "cairo-lang-syntax", + "cairo-lang-utils", + "indoc", + "rayon", + "rust-analyzer-salsa", + "semver", + "smol_str", + "thiserror", +] + +[[package]] +name = "cairo-lang-debug" +version = "2.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50c804649297ca417206435ee3e8041d2100cc31ebf4a95bc4b92ed02dc63469" +dependencies = [ + "cairo-lang-utils", +] + +[[package]] +name = "cairo-lang-defs" +version = "2.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8fbda467ac36f73bb1879e1f741898fc719d6f9239a01cc422e6a023281319b" +dependencies = [ + "cairo-lang-debug", + "cairo-lang-diagnostics", + "cairo-lang-filesystem", + "cairo-lang-parser", + "cairo-lang-syntax", + "cairo-lang-utils", + "itertools 0.12.1", + "rust-analyzer-salsa", + "smol_str", +] + +[[package]] +name = "cairo-lang-diagnostics" +version = "2.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c843ef4715e3d21de5388d02206db2506e2d2ec0e80e2629e0ae9900a08b8674" +dependencies = [ + "cairo-lang-debug", + "cairo-lang-filesystem", + "cairo-lang-utils", + "itertools 0.12.1", +] + +[[package]] +name = "cairo-lang-eq-solver" +version = "2.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33a416c5871960fb4823160ebef2abc51e0c1b86fef1e97a1ebb2e5f3c3795d3" +dependencies = [ + "cairo-lang-utils", + "good_lp", +] + +[[package]] +name = "cairo-lang-filesystem" +version = "2.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47189e0cb84b21defd201af4cf24a94c6b0d09f48706cf659c9ffa0def8a7a43" +dependencies = [ + "cairo-lang-debug", + "cairo-lang-utils", + "path-clean", + "rust-analyzer-salsa", + "semver", + "serde", + "smol_str", +] + +[[package]] +name = "cairo-lang-formatter" +version = "2.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6409ff1f4a93ce7c0968d9d857d2a8c03657617a827159d33f978110b718b31d" +dependencies = [ + "anyhow", + "cairo-lang-diagnostics", + "cairo-lang-filesystem", + "cairo-lang-parser", + "cairo-lang-syntax", + "cairo-lang-utils", + "diffy", + "ignore", + "itertools 0.12.1", + "rust-analyzer-salsa", + "serde", + "smol_str", + "thiserror", +] + +[[package]] +name = "cairo-lang-lowering" +version = "2.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e224e006c82ef21bd9e243390992de2be25ae6fbbdaa8544067b3f0c31977f1" +dependencies = [ + "cairo-lang-debug", + "cairo-lang-defs", + "cairo-lang-diagnostics", + "cairo-lang-filesystem", + "cairo-lang-parser", + "cairo-lang-proc-macros", + "cairo-lang-semantic", + "cairo-lang-syntax", + "cairo-lang-utils", + "id-arena", + "itertools 0.12.1", + "log", + "num-bigint", + "num-traits 0.2.19", + "rust-analyzer-salsa", + "smol_str", +] + +[[package]] +name = "cairo-lang-parser" +version = "2.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afb260ba349c2b699639e56f9b64deb969ff01179a0253087e2c8ceec7e32157" +dependencies = [ + "cairo-lang-diagnostics", + "cairo-lang-filesystem", + "cairo-lang-syntax", + "cairo-lang-syntax-codegen", + "cairo-lang-utils", + "colored", + "itertools 0.12.1", + "num-bigint", + "num-traits 0.2.19", + "rust-analyzer-salsa", + "smol_str", + "unescaper", +] + +[[package]] +name = "cairo-lang-plugins" +version = "2.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05a2e500dc8ddea4d25a866d8a839158b0e4c41a6c023f21911e2da252bd91b3" +dependencies = [ + "cairo-lang-defs", + "cairo-lang-diagnostics", + "cairo-lang-filesystem", + "cairo-lang-parser", + "cairo-lang-syntax", + "cairo-lang-utils", + "indent", + "indoc", + "itertools 0.12.1", + "rust-analyzer-salsa", + "smol_str", +] + +[[package]] +name = "cairo-lang-proc-macros" +version = "2.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d72f17373740f242d6995e896b9195c2cedff7e8b14e496afdd16b405039d1fb" +dependencies = [ + "cairo-lang-debug", + "quote", + "syn 2.0.75", +] + +[[package]] +name = "cairo-lang-project" +version = "2.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13294f08d2013fcd6e815e7235935680963dec3390e5baf454f33da866fc44b6" +dependencies = [ + "cairo-lang-filesystem", + "cairo-lang-utils", + "serde", + "smol_str", + "thiserror", + "toml", +] + +[[package]] +name = "cairo-lang-semantic" +version = "2.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6936215bca75c23e71873998420a3d46c322507a09917ce676c8d39f8c1bd6fe" +dependencies = [ + "cairo-lang-debug", + "cairo-lang-defs", + "cairo-lang-diagnostics", + "cairo-lang-filesystem", + "cairo-lang-parser", + "cairo-lang-plugins", + "cairo-lang-proc-macros", + "cairo-lang-syntax", + "cairo-lang-test-utils", + "cairo-lang-utils", + "id-arena", + "indoc", + "itertools 0.12.1", + "num-bigint", + "num-traits 0.2.19", + "rust-analyzer-salsa", + "smol_str", + "toml", +] + +[[package]] +name = "cairo-lang-sierra" +version = "2.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "424f55450494e959c1ae26c52a71075767a90f76e3ecca6e81056dd7517e8ba0" +dependencies = [ + "anyhow", + "cairo-lang-utils", + "const-fnv1a-hash", + "convert_case", + "derivative", + "itertools 0.12.1", + "lalrpop", + "lalrpop-util", + "num-bigint", + "num-integer", + "num-traits 0.2.19", + "regex", + "rust-analyzer-salsa", + "serde", + "serde_json", + "sha3", + "smol_str", + "starknet-types-core", + "thiserror", +] + +[[package]] +name = "cairo-lang-sierra-ap-change" +version = "2.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053dd520e0b9d1c1078d93ea69045f6f334c3d41b4b75db183ab33e32cfd8570" +dependencies = [ + "cairo-lang-eq-solver", + "cairo-lang-sierra", + "cairo-lang-sierra-type-size", + "cairo-lang-utils", + "itertools 0.12.1", + "num-bigint", + "num-traits 0.2.19", + "thiserror", +] + +[[package]] +name = "cairo-lang-sierra-gas" +version = "2.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a73227867377efc62ebb893cddaa88df3940bf2be5dbdc2f0b00f9edf69288e" +dependencies = [ + "cairo-lang-eq-solver", + "cairo-lang-sierra", + "cairo-lang-sierra-type-size", + "cairo-lang-utils", + "itertools 0.12.1", + "num-bigint", + "num-traits 0.2.19", + "thiserror", +] + +[[package]] +name = "cairo-lang-sierra-generator" +version = "2.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3752cacd475ea089d9a536357804150e693a124e703fcc33a55566d568094b3" +dependencies = [ + "cairo-lang-debug", + "cairo-lang-defs", + "cairo-lang-diagnostics", + "cairo-lang-filesystem", + "cairo-lang-lowering", + "cairo-lang-parser", + "cairo-lang-semantic", + "cairo-lang-sierra", + "cairo-lang-syntax", + "cairo-lang-utils", + "itertools 0.12.1", + "num-traits 0.2.19", + "rust-analyzer-salsa", + "serde", + "serde_json", + "smol_str", +] + +[[package]] +name = "cairo-lang-sierra-to-casm" +version = "2.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7162fb3c93960dfc6d8005b65064e518e3f1ed6102e8981b42ea41879c331184" +dependencies = [ + "assert_matches", + "cairo-lang-casm", + "cairo-lang-sierra", + "cairo-lang-sierra-ap-change", + "cairo-lang-sierra-gas", + "cairo-lang-sierra-type-size", + "cairo-lang-utils", + "indoc", + "itertools 0.12.1", + "num-bigint", + "num-traits 0.2.19", + "starknet-types-core", + "thiserror", +] + +[[package]] +name = "cairo-lang-sierra-type-size" +version = "2.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a51b80c117e2b05a6d300f2e2247892cc99e42e950e79f6085e6ed6cbcb44d12" +dependencies = [ + "cairo-lang-sierra", + "cairo-lang-utils", +] + +[[package]] +name = "cairo-lang-starknet" +version = "2.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aafaabc43f78dfa2f45d935993ba21c05c164bbb3bf277d348847a51e5939a9f" +dependencies = [ + "anyhow", + "cairo-lang-compiler", + "cairo-lang-defs", + "cairo-lang-diagnostics", + "cairo-lang-filesystem", + "cairo-lang-lowering", + "cairo-lang-plugins", + "cairo-lang-semantic", + "cairo-lang-sierra", + "cairo-lang-sierra-generator", + "cairo-lang-starknet-classes", + "cairo-lang-syntax", + "cairo-lang-utils", + "const_format", + "indent", + "indoc", + "itertools 0.12.1", + "serde", + "serde_json", + "smol_str", + "starknet-types-core", + "thiserror", +] + +[[package]] +name = "cairo-lang-starknet-classes" +version = "2.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "832fd9072ddf4204ca6d227c0238929349f10146bd066a98025d51ac15d27fad" +dependencies = [ + "cairo-lang-casm", + "cairo-lang-sierra", + "cairo-lang-sierra-to-casm", + "cairo-lang-utils", + "convert_case", + "itertools 0.12.1", + "num-bigint", + "num-integer", + "num-traits 0.2.19", + "serde", + "serde_json", + "sha3", + "smol_str", + "starknet-types-core", + "thiserror", +] + +[[package]] +name = "cairo-lang-syntax" +version = "2.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cebe67c0d68f9acf8709d170c1308ca57a778d22f70da38a57f74ae250eee28a" +dependencies = [ + "cairo-lang-debug", + "cairo-lang-filesystem", + "cairo-lang-utils", + "num-bigint", + "num-traits 0.2.19", + "rust-analyzer-salsa", + "smol_str", + "unescaper", +] + +[[package]] +name = "cairo-lang-syntax-codegen" +version = "2.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31cef5b4347626e61bad8f070495cd35d637a5cb6744c34d20dd382c7431aff8" +dependencies = [ + "genco", + "xshell", +] + +[[package]] +name = "cairo-lang-test-utils" +version = "2.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "060c61ac4a3ae0428771244ff8db903105f127392b7d725d919fe3fb1ec4132f" +dependencies = [ + "cairo-lang-formatter", + "cairo-lang-utils", + "colored", + "log", + "pretty_assertions", +] + +[[package]] +name = "cairo-lang-utils" +version = "2.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bfc6372538143afad658c853a35bdc9f5210c5cb54e0c8f04ab78e268139466" +dependencies = [ + "hashbrown 0.14.5", + "indexmap 2.4.0", + "itertools 0.12.1", + "num-bigint", + "num-traits 0.2.19", + "schemars", + "serde", +] + [[package]] name = "cairo-proof-parser" version = "0.1.0" @@ -457,7 +1004,7 @@ dependencies = [ "serde-felt", "serde_json", "starknet", - "starknet-crypto", + "starknet-crypto 0.7.1", "tokio", "url", ] @@ -481,12 +1028,49 @@ dependencies = [ "url", ] +[[package]] +name = "cairo-vm" +version = "1.0.1" +source = "git+https://github.com/lambdaclass/cairo-vm.git?rev=93f1f54#93f1f54f38059af89850b1c06d4c901300f9b94d" +dependencies = [ + "anyhow", + "ark-ff", + "ark-std", + "bincode", + "bitvec", + "cairo-lang-casm", + "cairo-lang-starknet", + "cairo-lang-starknet-classes", + "generic-array", + "hashbrown 0.14.5", + "hex", + "keccak", + "lazy_static", + "nom", + "num-bigint", + "num-integer", + "num-prime", + "num-traits 0.2.19", + "rand", + "rust_decimal", + "serde", + "serde_json", + "sha2", + "sha3", + "starknet-crypto 0.6.2", + "starknet-types-core", + "thiserror-no-std", + "zip", +] + [[package]] name = "cc" version = "1.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "50d2eb3cd3d1bf4529e31c215ee6f93ec5a3d536d9f578f93d9d33ee19562932" dependencies = [ + "jobserver", + "libc", "shlex", ] @@ -505,7 +1089,7 @@ dependencies = [ "android-tzdata", "iana-time-zone", "js-sys", - "num-traits", + "num-traits 0.2.19", "serde", "wasm-bindgen", "windows-targets 0.52.6", @@ -567,6 +1151,16 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" +[[package]] +name = "colored" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbf2150cce219b664a8a70df7a1f933836724b503f8a413af9365b4dcc4d90b8" +dependencies = [ + "lazy_static", + "windows-sys 0.48.0", +] + [[package]] name = "common" version = "0.1.0" @@ -578,12 +1172,53 @@ dependencies = [ "starknet-types-core", ] +[[package]] +name = "const-fnv1a-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32b13ea120a812beba79e34316b3942a857c86ec1593cb34f27bb28272ce2cca" + [[package]] name = "const-oid" version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" +[[package]] +name = "const_format" +version = "0.2.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50c655d81ff1114fb0dcdea9225ea9f0cc712a6f8d189378e82bdf62a473a64b" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eff1a44b93f47b1bac19a27932f5c591e43d1ba357ee4f61526c8a25603f0eb1" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "constant_time_eq" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" + +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "cookie" version = "0.17.0" @@ -674,6 +1309,31 @@ dependencies = [ "cfg-if", ] +[[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" @@ -810,15 +1470,57 @@ dependencies = [ ] [[package]] -name = "digest" -version = "0.10.7" +name = "diff" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" + +[[package]] +name = "diffy" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e616e59155c92257e84970156f506287853355f58cd4a6eb167385722c32b790" +dependencies = [ + "nu-ansi-term", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", + "subtle", +] + +[[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-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "dyn-clone" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "crypto-common", - "subtle", -] +checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" [[package]] name = "ed25519" @@ -852,6 +1554,15 @@ version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +[[package]] +name = "ena" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d248bdd43ce613d87415282f69b9bb99d947d290b10962dd6c56233312c2ad5" +dependencies = [ + "log", +] + [[package]] name = "encoding_rs" version = "0.8.34" @@ -950,6 +1661,12 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + [[package]] name = "flate2" version = "1.0.33" @@ -966,6 +1683,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 = "form_urlencoded" version = "1.2.1" @@ -1070,6 +1793,28 @@ dependencies = [ "slab", ] +[[package]] +name = "genco" +version = "0.17.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afac3cbb14db69ac9fef9cdb60d8a87e39a7a527f85a81a923436efa40ad42c6" +dependencies = [ + "genco-macros", + "relative-path", + "smallvec", +] + +[[package]] +name = "genco-macros" +version = "0.17.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "553630feadf7b76442b0849fd25fdf89b860d933623aec9693fed19af0400c78" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.75", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -1099,6 +1844,29 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" +[[package]] +name = "globset" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15f1ce686646e7f1e19bf7d5533fe443a45dbfb990e00629110797578b42fb19" +dependencies = [ + "aho-corasick", + "bstr", + "log", + "regex-automata 0.4.7", + "regex-syntax 0.8.4", +] + +[[package]] +name = "good_lp" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3198bd13dea84c76a64621d6ee8ee26a4960a9a0d538eca95ca8f1320a469ac9" +dependencies = [ + "fnv", + "minilp", +] + [[package]] name = "h2" version = "0.3.26" @@ -1148,6 +1916,22 @@ 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 = "hashbrown" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] [[package]] name = "headers" @@ -1394,6 +2178,12 @@ dependencies = [ "cc", ] +[[package]] +name = "id-arena" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25a2bc672d1148e28034f176e01fffebb08b35768468cc954630da77a1449005" + [[package]] name = "ident_case" version = "1.0.1" @@ -1420,6 +2210,22 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "ignore" +version = "0.4.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d89fd380afde86567dfba715db065673989d6253f42b88179abd3eae47bda4b" +dependencies = [ + "crossbeam-deque", + "globset", + "log", + "memchr", + "regex-automata 0.4.7", + "same-file", + "walkdir", + "winapi-util", +] + [[package]] name = "impl-codec" version = "0.6.0" @@ -1458,6 +2264,12 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "indent" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9f1a0777d972970f204fdf8ef319f1f4f8459131636d7e3c96c5d59570d0fa6" + [[package]] name = "indexmap" version = "1.9.3" @@ -1480,6 +2292,12 @@ dependencies = [ "serde", ] +[[package]] +name = "indoc" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5" + [[package]] name = "inout" version = "0.1.3" @@ -1510,6 +2328,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.12.1" @@ -1525,6 +2352,15 @@ 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.70" @@ -1565,6 +2401,37 @@ dependencies = [ "prover-sdk", ] +[[package]] +name = "lalrpop" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55cb077ad656299f160924eb2912aa147d7339ea7d69e1b5517326fdcec3c1ca" +dependencies = [ + "ascii-canvas", + "bit-set", + "ena", + "itertools 0.11.0", + "lalrpop-util", + "petgraph", + "pico-args", + "regex", + "regex-syntax 0.8.4", + "string_cache", + "term", + "tiny-keccak", + "unicode-xid", + "walkdir", +] + +[[package]] +name = "lalrpop-util" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "507460a910eb7b32ee961886ff48539633b788a36b65692b95f225b844c82553" +dependencies = [ + "regex-automata 0.4.7", +] + [[package]] name = "lambdaworks-crypto" version = "0.7.0" @@ -1592,6 +2459,9 @@ name = "lazy_static" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin", +] [[package]] name = "libc" @@ -1599,6 +2469,16 @@ version = "0.2.158" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" +[[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 = "linux-raw-sys" version = "0.4.14" @@ -1621,6 +2501,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" @@ -1636,6 +2525,15 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" +[[package]] +name = "matrixmultiply" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "916806ba0031cd542105d916a97c8572e1fa6dd79c9c51e7eb43a09ec2dd84c1" +dependencies = [ + "rawpointer", +] + [[package]] name = "memchr" version = "2.7.4" @@ -1648,6 +2546,22 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "minilp" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82a7750a9e5076c660b7bec5e6457b4dbff402b9863c8d112891434e18fd5385" +dependencies = [ + "log", + "sprs", +] + +[[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" @@ -1695,6 +2609,35 @@ dependencies = [ "version_check", ] +[[package]] +name = "ndarray" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac06db03ec2f46ee0ecdca1a1c34a99c0d188a0d83439b84bf0cb4b386e4ab09" +dependencies = [ + "matrixmultiply", + "num-complex", + "num-integer", + "num-traits 0.2.19", + "rawpointer", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[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 = "nu-ansi-term" version = "0.46.0" @@ -1712,10 +2655,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ "num-integer", - "num-traits", + "num-traits 0.2.19", + "rand", "serde", ] +[[package]] +name = "num-complex" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6b19411a9719e753aff12e5187b74d60d3dc449ec3f4dc21e3989c3f554bc95" +dependencies = [ + "autocfg", + "num-traits 0.2.19", +] + [[package]] name = "num-conv" version = "0.1.0" @@ -1728,7 +2682,43 @@ version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "num-traits", + "num-traits 0.2.19", +] + +[[package]] +name = "num-modular" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64a5fe11d4135c3bcdf3a95b18b194afa9608a5f6ff034f5d857bc9a27fb0119" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits 0.2.19", +] + +[[package]] +name = "num-prime" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e238432a7881ec7164503ccc516c014bf009be7984cde1ba56837862543bdec3" +dependencies = [ + "bitvec", + "either", + "lru", + "num-bigint", + "num-integer", + "num-modular", + "num-traits 0.2.19", + "rand", +] + +[[package]] +name = "num-traits" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31" +dependencies = [ + "num-traits 0.2.19", ] [[package]] @@ -1755,6 +2745,12 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +[[package]] +name = "oorandom" +version = "11.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b410bbe7e14ab526a0e86877eb47c6996a2bd7746f027ba551028c925390e4e9" + [[package]] name = "overload" version = "0.1.1" @@ -1810,12 +2806,29 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "password-hash" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" +dependencies = [ + "base64ct", + "rand_core", + "subtle", +] + [[package]] name = "paste" version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +[[package]] +name = "path-clean" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17359afc20d7ab31fdb42bb844c8b3bb1dabd7dcf7e68428492da7f16966fcef" + [[package]] name = "pbkdf2" version = "0.11.0" @@ -1823,6 +2836,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" dependencies = [ "digest", + "hmac", + "password-hash", + "sha2", ] [[package]] @@ -1841,6 +2857,31 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +[[package]] +name = "petgraph" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +dependencies = [ + "fixedbitset", + "indexmap 2.4.0", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pico-args" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" + [[package]] name = "pin-project" version = "1.1.5" @@ -1883,6 +2924,12 @@ dependencies = [ "spki", ] +[[package]] +name = "pkg-config" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" + [[package]] name = "powerfmt" version = "0.2.0" @@ -1898,6 +2945,12 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + [[package]] name = "prefix-hex" version = "0.7.1" @@ -1907,6 +2960,16 @@ dependencies = [ "hex", ] +[[package]] +name = "pretty_assertions" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d" +dependencies = [ + "diff", + "yansi", +] + [[package]] name = "primitive-types" version = "0.12.2" @@ -1947,21 +3010,33 @@ dependencies = [ "axum", "axum-extra", "base64 0.22.1", + "bincode", "bytes", + "cairo-lang-casm", + "cairo-lang-sierra", + "cairo-lang-sierra-ap-change", + "cairo-lang-sierra-to-casm", + "cairo-lang-sierra-type-size", + "cairo-lang-starknet-classes", + "cairo-lang-utils", "cairo-proof-parser", + "cairo-vm", "chrono", "clap", "common", "ed25519-dalek", "futures", + "itertools 0.12.1", "jsonwebtoken", + "num-bigint", + "num-traits 0.2.19", "once_cell", "prefix-hex", "rand", "serde", "serde_json", "serde_with 3.9.0", - "starknet-crypto", + "starknet-crypto 0.7.1", "starknet-types-core", "tempfile", "thiserror", @@ -2017,7 +3092,7 @@ dependencies = [ "pin-project-lite", "quinn-proto", "quinn-udp", - "rustc-hash", + "rustc-hash 2.0.0", "rustls 0.23.12", "socket2", "thiserror", @@ -2034,7 +3109,7 @@ dependencies = [ "bytes", "rand", "ring", - "rustc-hash", + "rustc-hash 2.0.0", "rustls 0.23.12", "slab", "thiserror", @@ -2092,12 +3167,38 @@ dependencies = [ ] [[package]] -name = "rand_core" -version = "0.6.4" +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rawpointer" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" + +[[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 = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" dependencies = [ - "getrandom", + "crossbeam-deque", + "crossbeam-utils", ] [[package]] @@ -2109,6 +3210,17 @@ dependencies = [ "bitflags 2.6.0", ] +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom", + "libredox", + "thiserror", +] + [[package]] name = "regex" version = "1.10.6" @@ -2165,6 +3277,12 @@ dependencies = [ "url", ] +[[package]] +name = "relative-path" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" + [[package]] name = "reqwest" version = "0.11.27" @@ -2300,12 +3418,57 @@ dependencies = [ "rustc-hex", ] +[[package]] +name = "rust-analyzer-salsa" +version = "0.17.0-pre.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719825638c59fd26a55412a24561c7c5bcf54364c88b9a7a04ba08a6eafaba8d" +dependencies = [ + "indexmap 2.4.0", + "lock_api", + "oorandom", + "parking_lot", + "rust-analyzer-salsa-macros", + "rustc-hash 1.1.0", + "smallvec", + "tracing", + "triomphe", +] + +[[package]] +name = "rust-analyzer-salsa-macros" +version = "0.17.0-pre.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d96498e9684848c6676c399032ebc37c52da95ecbefa83d71ccc53b9f8a4a8e" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "quote", + "syn 2.0.75", +] + +[[package]] +name = "rust_decimal" +version = "1.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b082d80e3e3cc52b2ed634388d436fe1f4de6af5786cc2de9ba9737527bdf555" +dependencies = [ + "arrayvec", + "num-traits 0.2.19", +] + [[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-hash" version = "2.0.0" @@ -2433,6 +3596,40 @@ 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 = "schemars" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09c024468a378b7e36765cd36702b7a90cc3cba11654f6685c8f233408e89e92" +dependencies = [ + "dyn-clone", + "indexmap 1.9.3", + "schemars_derive", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1eee588578aff73f856ab961cd2f79e36bc45d7ded33a7562adba4667aecc0e" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.75", +] + [[package]] name = "scopeguard" version = "1.2.0" @@ -2466,6 +3663,9 @@ name = "semver" version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +dependencies = [ + "serde", +] [[package]] name = "serde" @@ -2482,7 +3682,7 @@ version = "0.1.0" source = "git+https://github.com/cartridge-gg/cairo-proof-parser.git?rev=f175d58#f175d58b487cc32c073d1a92d6d367eff234993b" dependencies = [ "serde", - "starknet-crypto", + "starknet-crypto 0.7.1", "starknet-ff", ] @@ -2497,6 +3697,17 @@ dependencies = [ "syn 2.0.75", ] +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.75", +] + [[package]] name = "serde_json" version = "1.0.127" @@ -2530,6 +3741,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -2672,11 +3892,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" dependencies = [ "num-bigint", - "num-traits", + "num-traits 0.2.19", "thiserror", "time", ] +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + [[package]] name = "slab" version = "0.4.9" @@ -2692,6 +3918,15 @@ version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +[[package]] +name = "smol_str" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" +dependencies = [ + "serde", +] + [[package]] name = "socket2" version = "0.5.7" @@ -2718,6 +3953,23 @@ dependencies = [ "der", ] +[[package]] +name = "sprs" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec63571489873d4506683915840eeb1bb16b3198ee4894cc6f2fe3013d505e56" +dependencies = [ + "ndarray", + "num-complex", + "num-traits 0.1.43", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "starknet" version = "0.11.0" @@ -2727,7 +3979,7 @@ dependencies = [ "starknet-accounts", "starknet-contract", "starknet-core", - "starknet-crypto", + "starknet-crypto 0.7.1", "starknet-macros", "starknet-providers", "starknet-signers", @@ -2742,7 +3994,7 @@ dependencies = [ "async-trait", "auto_impl", "starknet-core", - "starknet-crypto", + "starknet-crypto 0.7.1", "starknet-providers", "starknet-signers", "thiserror", @@ -2778,10 +4030,30 @@ dependencies = [ "serde_json_pythonic", "serde_with 2.3.3", "sha3", - "starknet-crypto", + "starknet-crypto 0.7.1", "starknet-types-core", ] +[[package]] +name = "starknet-crypto" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e2c30c01e8eb0fc913c4ee3cf676389fffc1d1182bfe5bb9670e4e72e968064" +dependencies = [ + "crypto-bigint", + "hex", + "hmac", + "num-bigint", + "num-integer", + "num-traits 0.2.19", + "rfc6979", + "sha2", + "starknet-crypto-codegen 0.3.3", + "starknet-curve 0.4.2", + "starknet-ff", + "zeroize", +] + [[package]] name = "starknet-crypto" version = "0.7.1" @@ -2793,26 +4065,46 @@ dependencies = [ "hmac", "num-bigint", "num-integer", - "num-traits", + "num-traits 0.2.19", "rfc6979", "sha2", - "starknet-crypto-codegen", - "starknet-curve", + "starknet-crypto-codegen 0.4.0", + "starknet-curve 0.5.0", "starknet-types-core", "zeroize", ] +[[package]] +name = "starknet-crypto-codegen" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbc159a1934c7be9761c237333a57febe060ace2bc9e3b337a59a37af206d19f" +dependencies = [ + "starknet-curve 0.4.2", + "starknet-ff", + "syn 2.0.75", +] + [[package]] name = "starknet-crypto-codegen" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2e179dedc3fa6da064e56811d3e05d446aa2f7459e4eb0e3e49378a337235437" dependencies = [ - "starknet-curve", + "starknet-curve 0.5.0", "starknet-types-core", "syn 2.0.75", ] +[[package]] +name = "starknet-curve" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1c383518bb312751e4be80f53e8644034aa99a0afb29d7ac41b89a997db875b" +dependencies = [ + "starknet-ff", +] + [[package]] name = "starknet-curve" version = "0.5.0" @@ -2880,7 +4172,7 @@ dependencies = [ "getrandom", "rand", "starknet-core", - "starknet-crypto", + "starknet-crypto 0.7.1", "thiserror", ] @@ -2892,9 +4184,10 @@ checksum = "ce6bacf0ba19bc721e518bc4bf389ff13daa8a7c5db5fd320600473b8aa9fcbd" dependencies = [ "lambdaworks-crypto", "lambdaworks-math", + "lazy_static", "num-bigint", "num-integer", - "num-traits", + "num-traits 0.2.19", "serde", ] @@ -2904,6 +4197,19 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "string_cache" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" +dependencies = [ + "new_debug_unreachable", + "once_cell", + "parking_lot", + "phf_shared", + "precomputed-hash", +] + [[package]] name = "strsim" version = "0.11.1" @@ -2993,6 +4299,17 @@ 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 = "thiserror" version = "1.0.63" @@ -3013,6 +4330,26 @@ dependencies = [ "syn 2.0.75", ] +[[package]] +name = "thiserror-impl-no-std" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58e6318948b519ba6dc2b442a6d0b904ebfb8d411a3ad3e07843615a72249758" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "thiserror-no-std" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3ad459d94dd517257cc96add8a43190ee620011bb6e6cdc82dafd97dfafafea" +dependencies = [ + "thiserror-impl-no-std", +] + [[package]] name = "thread_local" version = "1.1.8" @@ -3153,11 +4490,26 @@ dependencies = [ "tokio", ] +[[package]] +name = "toml" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + [[package]] name = "toml_datetime" version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +dependencies = [ + "serde", +] [[package]] name = "toml_edit" @@ -3166,6 +4518,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b072cee73c449a636ffd6f32bd8de3a9f7119139aff882f44943ce2986dc5cf" dependencies = [ "indexmap 2.4.0", + "serde", + "serde_spanned", "toml_datetime", "winnow", ] @@ -3260,6 +4614,16 @@ dependencies = [ "tracing-log", ] +[[package]] +name = "triomphe" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef8f7726da4807b58ea5c96fdc122f80702030edc33b35aff9190a51148ccc85" +dependencies = [ + "serde", + "stable_deref_trait", +] + [[package]] name = "try-lock" version = "0.2.5" @@ -3303,6 +4667,15 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "unescaper" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c878a167baa8afd137494101a688ef8c67125089ff2249284bd2b5f9bfedb815" +dependencies = [ + "thiserror", +] + [[package]] name = "unicode-bidi" version = "0.3.15" @@ -3324,6 +4697,18 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + [[package]] name = "untrusted" version = "0.9.0" @@ -3375,6 +4760,16 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[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" @@ -3511,6 +4906,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys 0.48.0", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" @@ -3732,6 +5136,27 @@ dependencies = [ "tap", ] +[[package]] +name = "xshell" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db0ab86eae739efd1b054a8d3d16041914030ac4e01cd1dca0cf252fd8b6437" +dependencies = [ + "xshell-macros", +] + +[[package]] +name = "xshell-macros" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d422e8e38ec76e2f06ee439ccc765e9c6a9638b9e7c9f2e8255e4d41e8bd852" + +[[package]] +name = "yansi" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" + [[package]] name = "zerocopy" version = "0.7.35" @@ -3772,3 +5197,52 @@ dependencies = [ "quote", "syn 2.0.75", ] + +[[package]] +name = "zip" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" +dependencies = [ + "aes", + "byteorder", + "bzip2", + "constant_time_eq", + "crc32fast", + "crossbeam-utils", + "flate2", + "hmac", + "pbkdf2", + "sha1", + "time", + "zstd", +] + +[[package]] +name = "zstd" +version = "0.11.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "5.0.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" +dependencies = [ + "libc", + "zstd-sys", +] + +[[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 8b977fe..ce8f93b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,20 +8,38 @@ members = [ "bin/keygen", "bin/register", ] + [workspace.package] version = "0.1.0" edition = "2021" + [workspace.dependencies] -axum = { version = "0.7.5", features = ["http2", "macros", "multipart", "ws"] } -clap = { version = "4.5.16", features = ["derive", "env"] } -tracing = "0.1.40" -tracing-subscriber = { version = "0.3.18", features = ["env-filter"] } -tokio = { version = "1.39.3", features = ["full"] } -thiserror = "1.0.63" +anyhow = "1.0.89" +async-stream = "0.3.5" +base64 = "0.22.1" +bytes = "1.7.1" +chrono = "0.4.38" +futures = "0.3.30" +jsonwebtoken = "9.3.0" +once_cell = "1.19.0" +prefix-hex = "0.7.1" +rand = "0.8.5" +reqwest_cookie_store = "0.7.0" serde_json = "1.0.127" +serde_with = "3.9.0" +starknet-crypto = "0.7.0" +starknet-types-core = "~0.1.4" tempfile = "3.12.0" -serde = { version = "1.0.209", features = ["derive"] } +thiserror = "1.0.63" +tracing = "0.1.40" +url = "2.5.2" + +axum = { version = "0.7.5", features = ["http2", "macros", "multipart", "ws"] } +axum-extra = { version = "0.9.3", features = ["typed-header"] } +cairo-proof-parser = { git = "https://github.com/cartridge-gg/cairo-proof-parser.git", rev = "f175d58" } +clap = { version = "4.5.16", features = ["derive", "env"] } common = { path = "common" } +ed25519-dalek = { version = "2.1.1", features = ["rand_core", "serde"] } prover-sdk = { path = "prover-sdk" } reqwest = { version = "0.12.7", features = [ "blocking", @@ -29,21 +47,23 @@ reqwest = { version = "0.12.7", features = [ "rustls-tls", "stream", ], default-features = false } -reqwest_cookie_store = "0.7.0" -url = "2.5.2" -jsonwebtoken = "9.3.0" -axum-extra = { version = "0.9.3", features = ["typed-header"] } -once_cell = "1.19.0" -serde_with = "3.9.0" -bytes = "1.7.1" -prefix-hex = "0.7.1" -rand = "0.8.5" -ed25519-dalek = { version = "2.1.1", features = ["rand_core", "serde"] } -chrono = "0.4.38" -base64 = "0.22.1" -starknet-types-core = "~0.1.4" -futures = "0.3.30" -async-stream = "0.3.5" -cairo-proof-parser = {git = "https://github.com/cartridge-gg/cairo-proof-parser.git",rev = "f175d58"} -starknet-crypto = "0.7.0" -anyhow = "1.0.89" \ No newline at end of file + +serde = { version = "1.0.209", features = ["derive"] } +tokio = { version = "1.39.3", features = ["full"] } +tracing-subscriber = { version = "0.3.18", features = ["env-filter"] } +cairo-lang-sierra-type-size = { version = "2.7.0", default-features = false } +cairo-lang-sierra-ap-change = { version = "2.7.0", default-features = false } +cairo-vm = { git = "https://github.com/lambdaclass/cairo-vm.git", features = [ + "cairo-1-hints", +],rev = "93f1f54" } +num-bigint = { version = "0.4", default-features = false, features = [ + "serde", + "rand", +] } +num-traits = { version = "0.2", default-features = false } +cairo-lang-casm = { version = "2.7.0", default-features = false } +cairo-lang-starknet-classes = { version = "2.7.0", default-features = false } +cairo-lang-sierra-to-casm = { version = "2.7.0", default-features = false } +cairo-lang-sierra = { version = "2.7.0", default-features = false } +cairo-lang-utils = { version = "2.7.0", default-features = false } +itertools = "0.12.1" \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index ca1e5b2..b767b04 100644 --- a/Dockerfile +++ b/Dockerfile @@ -18,7 +18,6 @@ WORKDIR /app COPY --from=planner /app/recipe.json recipe.json # Build dependencies - this is the caching Docker layer! RUN cargo chef cook --release --recipe-path recipe.json -RUN cargo install --git https://github.com/lambdaclass/cairo-vm --rev ed3117098dd33c96056880af6fa67f9b2caebfb4 cairo1-run RUN cargo build --release -p prover # Build application @@ -44,7 +43,6 @@ RUN pip install cairo-lang==0.13.1 RUN pip install sympy==1.12.1 COPY --from=builder /app/target/release/prover /usr/local/bin/prover -COPY --from=builder /usr/local/cargo/bin/cairo1-run /usr/local/bin/cairo1-run COPY --from=prover /usr/bin/cpu_air_prover /usr/local/bin/cpu_air_prover COPY --from=prover /usr/bin/cpu_air_verifier /usr/local/bin/cpu_air_verifier diff --git a/examples/batcher.json b/examples/batcher.json new file mode 100644 index 0000000..2d84fc6 --- /dev/null +++ b/examples/batcher.json @@ -0,0 +1 @@ +{"version":1,"type_declarations":[{"id":{"id":0,"debug_name":"RangeCheck"},"long_id":{"generic_id":"RangeCheck","generic_args":[]},"declared_type_info":{"storable":true,"droppable":false,"duplicatable":false,"zero_sized":false}},{"id":{"id":25,"debug_name":"Uninitialized"},"long_id":{"generic_id":"Uninitialized","generic_args":[{"Type":{"id":0,"debug_name":"RangeCheck"}}]},"declared_type_info":{"storable":false,"droppable":true,"duplicatable":false,"zero_sized":false}},{"id":{"id":48,"debug_name":"Const"},"long_id":{"generic_id":"Const","generic_args":[{"Type":{"id":1,"debug_name":"felt252"}},{"Value":[1,[1718382455,1333159282,1937072672,1966289503]]}]},"declared_type_info":{"storable":false,"droppable":false,"duplicatable":false,"zero_sized":false}},{"id":{"id":47,"debug_name":"Const"},"long_id":{"generic_id":"Const","generic_args":[{"Type":{"id":1,"debug_name":"felt252"}},{"Value":[1,[1970168947,1713398383,1970544751,1702371439,4812388]]}]},"declared_type_info":{"storable":false,"droppable":false,"duplicatable":false,"zero_sized":false}},{"id":{"id":46,"debug_name":"Const"},"long_id":{"generic_id":"Const","generic_args":[{"Type":{"id":38,"debug_name":"u32"}},{"Value":[0,[]]}]},"declared_type_info":{"storable":false,"droppable":false,"duplicatable":false,"zero_sized":false}},{"id":{"id":2,"debug_name":"Array"},"long_id":{"generic_id":"Array","generic_args":[{"Type":{"id":1,"debug_name":"felt252"}}]},"declared_type_info":{"storable":true,"droppable":true,"duplicatable":false,"zero_sized":false}},{"id":{"id":3,"debug_name":"Snapshot>"},"long_id":{"generic_id":"Snapshot","generic_args":[{"Type":{"id":2,"debug_name":"Array"}}]},"declared_type_info":{"storable":true,"droppable":true,"duplicatable":true,"zero_sized":false}},{"id":{"id":4,"debug_name":"core::array::Span::"},"long_id":{"generic_id":"Struct","generic_args":[{"UserType":{"id":[3300335458,1649952866,1586379173,11667290,4275777335,629657412,779741659,29027239],"debug_name":"core::array::Span::"}},{"Type":{"id":3,"debug_name":"Snapshot>"}}]},"declared_type_info":{"storable":true,"droppable":true,"duplicatable":true,"zero_sized":false}},{"id":{"id":10,"debug_name":"Unit"},"long_id":{"generic_id":"Struct","generic_args":[{"UserType":{"id":[1380714691,777545161,640624565,3564344830,2506258596,2515665124,462026948,49159723],"debug_name":"Tuple"}}]},"declared_type_info":{"storable":true,"droppable":true,"duplicatable":true,"zero_sized":true}},{"id":{"id":43,"debug_name":"core::option::Option::>"},"long_id":{"generic_id":"Enum","generic_args":[{"UserType":{"id":[3150627704,1153032397,3087448214,1763882495,3465342813,3042584164,1260878839,30711674],"debug_name":"core::option::Option::>"}},{"Type":{"id":4,"debug_name":"core::array::Span::"}},{"Type":{"id":10,"debug_name":"Unit"}}]},"declared_type_info":{"storable":true,"droppable":true,"duplicatable":true,"zero_sized":false}},{"id":{"id":44,"debug_name":"Tuple, core::option::Option::>>"},"long_id":{"generic_id":"Struct","generic_args":[{"UserType":{"id":[1380714691,777545161,640624565,3564344830,2506258596,2515665124,462026948,49159723],"debug_name":"Tuple"}},{"Type":{"id":4,"debug_name":"core::array::Span::"}},{"Type":{"id":43,"debug_name":"core::option::Option::>"}}]},"declared_type_info":{"storable":true,"droppable":true,"duplicatable":true,"zero_sized":false}},{"id":{"id":13,"debug_name":"core::panics::Panic"},"long_id":{"generic_id":"Struct","generic_args":[{"UserType":{"id":[2208749170,1797821712,129214108,2539384922,764199911,1378060934,2080739472,23743629],"debug_name":"core::panics::Panic"}}]},"declared_type_info":{"storable":true,"droppable":true,"duplicatable":true,"zero_sized":true}},{"id":{"id":14,"debug_name":"Tuple>"},"long_id":{"generic_id":"Struct","generic_args":[{"UserType":{"id":[1380714691,777545161,640624565,3564344830,2506258596,2515665124,462026948,49159723],"debug_name":"Tuple"}},{"Type":{"id":13,"debug_name":"core::panics::Panic"}},{"Type":{"id":2,"debug_name":"Array"}}]},"declared_type_info":{"storable":true,"droppable":true,"duplicatable":false,"zero_sized":false}},{"id":{"id":45,"debug_name":"core::panics::PanicResult::<(core::array::Span::, core::option::Option::>)>"},"long_id":{"generic_id":"Enum","generic_args":[{"UserType":{"id":[2151393902,1110179061,4206242838,2858574093,474661183,2845135022,84170644,20962673],"debug_name":"core::panics::PanicResult::<(core::array::Span::, core::option::Option::>)>"}},{"Type":{"id":44,"debug_name":"Tuple, core::option::Option::>>"}},{"Type":{"id":14,"debug_name":"Tuple>"}}]},"declared_type_info":{"storable":true,"droppable":true,"duplicatable":false,"zero_sized":false}},{"id":{"id":1,"debug_name":"felt252"},"long_id":{"generic_id":"felt252","generic_args":[]},"declared_type_info":{"storable":true,"droppable":true,"duplicatable":true,"zero_sized":false}},{"id":{"id":5,"debug_name":"batcher::Call"},"long_id":{"generic_id":"Struct","generic_args":[{"UserType":{"id":[2625791853,2064936836,3330289355,1565718335,1125572079,2770585342,2879026428,55099976],"debug_name":"batcher::Call"}},{"Type":{"id":1,"debug_name":"felt252"}},{"Type":{"id":1,"debug_name":"felt252"}},{"Type":{"id":4,"debug_name":"core::array::Span::"}},{"Type":{"id":4,"debug_name":"core::array::Span::"}},{"Type":{"id":4,"debug_name":"core::array::Span::"}}]},"declared_type_info":{"storable":true,"droppable":true,"duplicatable":true,"zero_sized":false}},{"id":{"id":40,"debug_name":"core::option::Option::"},"long_id":{"generic_id":"Enum","generic_args":[{"UserType":{"id":[2895621376,913253303,71035836,3176508258,2281737629,3114732634,2838176454,60149786],"debug_name":"core::option::Option::"}},{"Type":{"id":5,"debug_name":"batcher::Call"}},{"Type":{"id":10,"debug_name":"Unit"}}]},"declared_type_info":{"storable":true,"droppable":true,"duplicatable":true,"zero_sized":false}},{"id":{"id":41,"debug_name":"Tuple, core::option::Option::>"},"long_id":{"generic_id":"Struct","generic_args":[{"UserType":{"id":[1380714691,777545161,640624565,3564344830,2506258596,2515665124,462026948,49159723],"debug_name":"Tuple"}},{"Type":{"id":4,"debug_name":"core::array::Span::"}},{"Type":{"id":40,"debug_name":"core::option::Option::"}}]},"declared_type_info":{"storable":true,"droppable":true,"duplicatable":true,"zero_sized":false}},{"id":{"id":42,"debug_name":"core::panics::PanicResult::<(core::array::Span::, core::option::Option::)>"},"long_id":{"generic_id":"Enum","generic_args":[{"UserType":{"id":[2825095520,3354913265,1578589298,1992988084,1332289123,1717914821,3578878408,58783465],"debug_name":"core::panics::PanicResult::<(core::array::Span::, core::option::Option::)>"}},{"Type":{"id":41,"debug_name":"Tuple, core::option::Option::>"}},{"Type":{"id":14,"debug_name":"Tuple>"}}]},"declared_type_info":{"storable":true,"droppable":true,"duplicatable":false,"zero_sized":false}},{"id":{"id":39,"debug_name":"NonZero"},"long_id":{"generic_id":"NonZero","generic_args":[{"Type":{"id":1,"debug_name":"felt252"}}]},"declared_type_info":{"storable":true,"droppable":true,"duplicatable":true,"zero_sized":false}},{"id":{"id":38,"debug_name":"u32"},"long_id":{"generic_id":"u32","generic_args":[]},"declared_type_info":{"storable":true,"droppable":true,"duplicatable":true,"zero_sized":false}},{"id":{"id":33,"debug_name":"Box"},"long_id":{"generic_id":"Box","generic_args":[{"Type":{"id":5,"debug_name":"batcher::Call"}}]},"declared_type_info":{"storable":true,"droppable":true,"duplicatable":true,"zero_sized":false}},{"id":{"id":34,"debug_name":"core::option::Option::>"},"long_id":{"generic_id":"Enum","generic_args":[{"UserType":{"id":[732892949,1496296606,43141077,937854453,77543249,486497238,111833425,62342774],"debug_name":"core::option::Option::>"}},{"Type":{"id":33,"debug_name":"Box"}},{"Type":{"id":10,"debug_name":"Unit"}}]},"declared_type_info":{"storable":true,"droppable":true,"duplicatable":true,"zero_sized":false}},{"id":{"id":36,"debug_name":"Uninitialized"},"long_id":{"generic_id":"Uninitialized","generic_args":[{"Type":{"id":5,"debug_name":"batcher::Call"}}]},"declared_type_info":{"storable":false,"droppable":true,"duplicatable":false,"zero_sized":false}},{"id":{"id":6,"debug_name":"Array"},"long_id":{"generic_id":"Array","generic_args":[{"Type":{"id":5,"debug_name":"batcher::Call"}}]},"declared_type_info":{"storable":true,"droppable":true,"duplicatable":false,"zero_sized":false}},{"id":{"id":7,"debug_name":"Snapshot>"},"long_id":{"generic_id":"Snapshot","generic_args":[{"Type":{"id":6,"debug_name":"Array"}}]},"declared_type_info":{"storable":true,"droppable":true,"duplicatable":true,"zero_sized":false}},{"id":{"id":37,"debug_name":"Uninitialized>>"},"long_id":{"generic_id":"Uninitialized","generic_args":[{"Type":{"id":7,"debug_name":"Snapshot>"}}]},"declared_type_info":{"storable":false,"droppable":true,"duplicatable":false,"zero_sized":false}},{"id":{"id":35,"debug_name":"Uninitialized>"},"long_id":{"generic_id":"Uninitialized","generic_args":[{"Type":{"id":2,"debug_name":"Array"}}]},"declared_type_info":{"storable":false,"droppable":true,"duplicatable":false,"zero_sized":false}},{"id":{"id":32,"debug_name":"core::option::Option::"},"long_id":{"generic_id":"Enum","generic_args":[{"UserType":{"id":[272176401,869952872,2746667304,3595774673,2182797035,1218417362,2279605826,18640256],"debug_name":"core::option::Option::"}},{"Type":{"id":1,"debug_name":"felt252"}},{"Type":{"id":10,"debug_name":"Unit"}}]},"declared_type_info":{"storable":true,"droppable":true,"duplicatable":true,"zero_sized":false}},{"id":{"id":8,"debug_name":"core::array::Span::"},"long_id":{"generic_id":"Struct","generic_args":[{"UserType":{"id":[3535146776,1633711915,3573680563,2432849790,2489149545,975863298,604432966,48173762],"debug_name":"core::array::Span::"}},{"Type":{"id":7,"debug_name":"Snapshot>"}}]},"declared_type_info":{"storable":true,"droppable":true,"duplicatable":true,"zero_sized":false}},{"id":{"id":31,"debug_name":"core::option::Option::>"},"long_id":{"generic_id":"Enum","generic_args":[{"UserType":{"id":[2540319368,1257567776,2211510899,234620219,4144046013,3380065828,3846016807,31541559],"debug_name":"core::option::Option::>"}},{"Type":{"id":8,"debug_name":"core::array::Span::"}},{"Type":{"id":10,"debug_name":"Unit"}}]},"declared_type_info":{"storable":true,"droppable":true,"duplicatable":true,"zero_sized":false}},{"id":{"id":28,"debug_name":"core::option::Option::>"},"long_id":{"generic_id":"Enum","generic_args":[{"UserType":{"id":[2651521491,2702264438,3349297123,2641520905,395184660,3265031354,40356875,29156503],"debug_name":"core::option::Option::>"}},{"Type":{"id":6,"debug_name":"Array"}},{"Type":{"id":10,"debug_name":"Unit"}}]},"declared_type_info":{"storable":true,"droppable":true,"duplicatable":false,"zero_sized":false}},{"id":{"id":29,"debug_name":"Tuple, core::option::Option::>>"},"long_id":{"generic_id":"Struct","generic_args":[{"UserType":{"id":[1380714691,777545161,640624565,3564344830,2506258596,2515665124,462026948,49159723],"debug_name":"Tuple"}},{"Type":{"id":4,"debug_name":"core::array::Span::"}},{"Type":{"id":28,"debug_name":"core::option::Option::>"}}]},"declared_type_info":{"storable":true,"droppable":true,"duplicatable":false,"zero_sized":false}},{"id":{"id":30,"debug_name":"core::panics::PanicResult::<(core::array::Span::, core::option::Option::>)>"},"long_id":{"generic_id":"Enum","generic_args":[{"UserType":{"id":[3744693764,707396276,1091080131,2903631532,2192196751,3200291328,2218249911,20459305],"debug_name":"core::panics::PanicResult::<(core::array::Span::, core::option::Option::>)>"}},{"Type":{"id":29,"debug_name":"Tuple, core::option::Option::>>"}},{"Type":{"id":14,"debug_name":"Tuple>"}}]},"declared_type_info":{"storable":true,"droppable":true,"duplicatable":false,"zero_sized":false}},{"id":{"id":26,"debug_name":"Box"},"long_id":{"generic_id":"Box","generic_args":[{"Type":{"id":1,"debug_name":"felt252"}}]},"declared_type_info":{"storable":true,"droppable":true,"duplicatable":true,"zero_sized":false}},{"id":{"id":27,"debug_name":"core::option::Option::>"},"long_id":{"generic_id":"Enum","generic_args":[{"UserType":{"id":[1148899559,2378266466,1485259957,133414423,2674006245,2028450664,3226109961,43875671],"debug_name":"core::option::Option::>"}},{"Type":{"id":26,"debug_name":"Box"}},{"Type":{"id":10,"debug_name":"Unit"}}]},"declared_type_info":{"storable":true,"droppable":true,"duplicatable":true,"zero_sized":false}},{"id":{"id":23,"debug_name":"Const"},"long_id":{"generic_id":"Const","generic_args":[{"Type":{"id":1,"debug_name":"felt252"}},{"Value":[1,[1818584110,543580521,2003984752,976909678,1953066862,20336]]}]},"declared_type_info":{"storable":false,"droppable":false,"duplicatable":false,"zero_sized":false}},{"id":{"id":17,"debug_name":"Tuple>"},"long_id":{"generic_id":"Struct","generic_args":[{"UserType":{"id":[1380714691,777545161,640624565,3564344830,2506258596,2515665124,462026948,49159723],"debug_name":"Tuple"}},{"Type":{"id":2,"debug_name":"Array"}}]},"declared_type_info":{"storable":true,"droppable":true,"duplicatable":false,"zero_sized":false}},{"id":{"id":18,"debug_name":"core::panics::PanicResult::<(core::array::Array::,)>"},"long_id":{"generic_id":"Enum","generic_args":[{"UserType":{"id":[704622403,483171566,1759595788,2942942373,3836427357,911959852,2124004651,45932020],"debug_name":"core::panics::PanicResult::<(core::array::Array::,)>"}},{"Type":{"id":17,"debug_name":"Tuple>"}},{"Type":{"id":14,"debug_name":"Tuple>"}}]},"declared_type_info":{"storable":true,"droppable":true,"duplicatable":false,"zero_sized":false}},{"id":{"id":16,"debug_name":"batcher::ProgramOutput"},"long_id":{"generic_id":"Struct","generic_args":[{"UserType":{"id":[130101611,3970475116,2464124615,2479543974,1604804411,1756796302,1622338952,11389379],"debug_name":"batcher::ProgramOutput"}},{"Type":{"id":1,"debug_name":"felt252"}},{"Type":{"id":1,"debug_name":"felt252"}},{"Type":{"id":1,"debug_name":"felt252"}},{"Type":{"id":1,"debug_name":"felt252"}},{"Type":{"id":1,"debug_name":"felt252"}},{"Type":{"id":4,"debug_name":"core::array::Span::"}},{"Type":{"id":4,"debug_name":"core::array::Span::"}}]},"declared_type_info":{"storable":true,"droppable":true,"duplicatable":true,"zero_sized":false}},{"id":{"id":21,"debug_name":"Const"},"long_id":{"generic_id":"Const","generic_args":[{"Type":{"id":1,"debug_name":"felt252"}},{"Value":[1,[42]]}]},"declared_type_info":{"storable":false,"droppable":false,"duplicatable":false,"zero_sized":false}},{"id":{"id":20,"debug_name":"Const"},"long_id":{"generic_id":"Const","generic_args":[{"Type":{"id":1,"debug_name":"felt252"}},{"Value":[1,[52]]}]},"declared_type_info":{"storable":false,"droppable":false,"duplicatable":false,"zero_sized":false}},{"id":{"id":19,"debug_name":"Const"},"long_id":{"generic_id":"Const","generic_args":[{"Type":{"id":1,"debug_name":"felt252"}},{"Value":[1,[1]]}]},"declared_type_info":{"storable":false,"droppable":false,"duplicatable":false,"zero_sized":false}},{"id":{"id":9,"debug_name":"batcher::ProgramInput"},"long_id":{"generic_id":"Struct","generic_args":[{"UserType":{"id":[3159547457,537249463,1465738781,1252568823,1531272048,732913786,1913439605,56287581],"debug_name":"batcher::ProgramInput"}},{"Type":{"id":8,"debug_name":"core::array::Span::"}},{"Type":{"id":1,"debug_name":"felt252"}},{"Type":{"id":1,"debug_name":"felt252"}},{"Type":{"id":1,"debug_name":"felt252"}}]},"declared_type_info":{"storable":true,"droppable":true,"duplicatable":true,"zero_sized":false}},{"id":{"id":11,"debug_name":"core::option::Option::"},"long_id":{"generic_id":"Enum","generic_args":[{"UserType":{"id":[2971819458,2257569485,133080994,2189010706,89601730,3431785258,1581189460,20944972],"debug_name":"core::option::Option::"}},{"Type":{"id":9,"debug_name":"batcher::ProgramInput"}},{"Type":{"id":10,"debug_name":"Unit"}}]},"declared_type_info":{"storable":true,"droppable":true,"duplicatable":true,"zero_sized":false}},{"id":{"id":12,"debug_name":"Tuple, core::option::Option::>"},"long_id":{"generic_id":"Struct","generic_args":[{"UserType":{"id":[1380714691,777545161,640624565,3564344830,2506258596,2515665124,462026948,49159723],"debug_name":"Tuple"}},{"Type":{"id":4,"debug_name":"core::array::Span::"}},{"Type":{"id":11,"debug_name":"core::option::Option::"}}]},"declared_type_info":{"storable":true,"droppable":true,"duplicatable":true,"zero_sized":false}},{"id":{"id":15,"debug_name":"core::panics::PanicResult::<(core::array::Span::, core::option::Option::)>"},"long_id":{"generic_id":"Enum","generic_args":[{"UserType":{"id":[2124623091,183429199,4291964600,2171957582,304455107,1961777831,2435207868,11891435],"debug_name":"core::panics::PanicResult::<(core::array::Span::, core::option::Option::)>"}},{"Type":{"id":12,"debug_name":"Tuple, core::option::Option::>"}},{"Type":{"id":14,"debug_name":"Tuple>"}}]},"declared_type_info":{"storable":true,"droppable":true,"duplicatable":false,"zero_sized":false}},{"id":{"id":22,"debug_name":"Uninitialized"},"long_id":{"generic_id":"Uninitialized","generic_args":[{"Type":{"id":1,"debug_name":"felt252"}}]},"declared_type_info":{"storable":false,"droppable":true,"duplicatable":false,"zero_sized":false}}],"libfunc_declarations":[{"id":{"id":17,"debug_name":"alloc_local"},"long_id":{"generic_id":"alloc_local","generic_args":[{"Type":{"id":0,"debug_name":"RangeCheck"}}]}},{"id":{"id":18,"debug_name":"alloc_local"},"long_id":{"generic_id":"alloc_local","generic_args":[{"Type":{"id":1,"debug_name":"felt252"}}]}},{"id":{"id":19,"debug_name":"finalize_locals"},"long_id":{"generic_id":"finalize_locals","generic_args":[]}},{"id":{"id":20,"debug_name":"disable_ap_tracking"},"long_id":{"generic_id":"disable_ap_tracking","generic_args":[]}},{"id":{"id":21,"debug_name":"snapshot_take>"},"long_id":{"generic_id":"snapshot_take","generic_args":[{"Type":{"id":2,"debug_name":"Array"}}]}},{"id":{"id":22,"debug_name":"drop>"},"long_id":{"generic_id":"drop","generic_args":[{"Type":{"id":2,"debug_name":"Array"}}]}},{"id":{"id":9,"debug_name":"struct_construct>"},"long_id":{"generic_id":"struct_construct","generic_args":[{"Type":{"id":4,"debug_name":"core::array::Span::"}}]}},{"id":{"id":36,"debug_name":"store_temp"},"long_id":{"generic_id":"store_temp","generic_args":[{"Type":{"id":0,"debug_name":"RangeCheck"}}]}},{"id":{"id":37,"debug_name":"store_temp>"},"long_id":{"generic_id":"store_temp","generic_args":[{"Type":{"id":4,"debug_name":"core::array::Span::"}}]}},{"id":{"id":16,"debug_name":"function_call"},"long_id":{"generic_id":"function_call","generic_args":[{"UserFunc":{"id":2,"debug_name":"batcher::ProgramInputSerde::deserialize"}}]}},{"id":{"id":38,"debug_name":"store_local"},"long_id":{"generic_id":"store_local","generic_args":[{"Type":{"id":0,"debug_name":"RangeCheck"}}]}},{"id":{"id":15,"debug_name":"enum_match, core::option::Option::)>>"},"long_id":{"generic_id":"enum_match","generic_args":[{"Type":{"id":15,"debug_name":"core::panics::PanicResult::<(core::array::Span::, core::option::Option::)>"}}]}},{"id":{"id":23,"debug_name":"branch_align"},"long_id":{"generic_id":"branch_align","generic_args":[]}},{"id":{"id":14,"debug_name":"struct_deconstruct, core::option::Option::>>"},"long_id":{"generic_id":"struct_deconstruct","generic_args":[{"Type":{"id":12,"debug_name":"Tuple, core::option::Option::>"}}]}},{"id":{"id":24,"debug_name":"drop>"},"long_id":{"generic_id":"drop","generic_args":[{"Type":{"id":4,"debug_name":"core::array::Span::"}}]}},{"id":{"id":13,"debug_name":"enum_match>"},"long_id":{"generic_id":"enum_match","generic_args":[{"Type":{"id":11,"debug_name":"core::option::Option::"}}]}},{"id":{"id":4,"debug_name":"array_new"},"long_id":{"generic_id":"array_new","generic_args":[{"Type":{"id":1,"debug_name":"felt252"}}]}},{"id":{"id":12,"debug_name":"struct_deconstruct"},"long_id":{"generic_id":"struct_deconstruct","generic_args":[{"Type":{"id":9,"debug_name":"batcher::ProgramInput"}}]}},{"id":{"id":25,"debug_name":"drop"},"long_id":{"generic_id":"drop","generic_args":[{"Type":{"id":1,"debug_name":"felt252"}}]}},{"id":{"id":39,"debug_name":"store_temp>"},"long_id":{"generic_id":"store_temp","generic_args":[{"Type":{"id":8,"debug_name":"core::array::Span::"}}]}},{"id":{"id":40,"debug_name":"store_temp>"},"long_id":{"generic_id":"store_temp","generic_args":[{"Type":{"id":2,"debug_name":"Array"}}]}},{"id":{"id":41,"debug_name":"store_local"},"long_id":{"generic_id":"store_local","generic_args":[{"Type":{"id":1,"debug_name":"felt252"}}]}},{"id":{"id":11,"debug_name":"function_call"},"long_id":{"generic_id":"function_call","generic_args":[{"UserFunc":{"id":1,"debug_name":"batcher::main[expr31]"}}]}},{"id":{"id":26,"debug_name":"drop>"},"long_id":{"generic_id":"drop","generic_args":[{"Type":{"id":8,"debug_name":"core::array::Span::"}}]}},{"id":{"id":27,"debug_name":"const_as_immediate>"},"long_id":{"generic_id":"const_as_immediate","generic_args":[{"Type":{"id":19,"debug_name":"Const"}}]}},{"id":{"id":28,"debug_name":"dup"},"long_id":{"generic_id":"dup","generic_args":[{"Type":{"id":1,"debug_name":"felt252"}}]}},{"id":{"id":10,"debug_name":"felt252_add"},"long_id":{"generic_id":"felt252_add","generic_args":[]}},{"id":{"id":29,"debug_name":"const_as_immediate>"},"long_id":{"generic_id":"const_as_immediate","generic_args":[{"Type":{"id":20,"debug_name":"Const"}}]}},{"id":{"id":30,"debug_name":"const_as_immediate>"},"long_id":{"generic_id":"const_as_immediate","generic_args":[{"Type":{"id":21,"debug_name":"Const"}}]}},{"id":{"id":8,"debug_name":"struct_construct"},"long_id":{"generic_id":"struct_construct","generic_args":[{"Type":{"id":16,"debug_name":"batcher::ProgramOutput"}}]}},{"id":{"id":31,"debug_name":"snapshot_take"},"long_id":{"generic_id":"snapshot_take","generic_args":[{"Type":{"id":16,"debug_name":"batcher::ProgramOutput"}}]}},{"id":{"id":32,"debug_name":"drop"},"long_id":{"generic_id":"drop","generic_args":[{"Type":{"id":16,"debug_name":"batcher::ProgramOutput"}}]}},{"id":{"id":42,"debug_name":"store_temp"},"long_id":{"generic_id":"store_temp","generic_args":[{"Type":{"id":16,"debug_name":"batcher::ProgramOutput"}}]}},{"id":{"id":7,"debug_name":"function_call"},"long_id":{"generic_id":"function_call","generic_args":[{"UserFunc":{"id":0,"debug_name":"batcher::ProgramOutputSerde::serialize"}}]}},{"id":{"id":6,"debug_name":"struct_construct>>"},"long_id":{"generic_id":"struct_construct","generic_args":[{"Type":{"id":17,"debug_name":"Tuple>"}}]}},{"id":{"id":5,"debug_name":"enum_init,)>, 0>"},"long_id":{"generic_id":"enum_init","generic_args":[{"Type":{"id":18,"debug_name":"core::panics::PanicResult::<(core::array::Array::,)>"}},{"Value":[0,[]]}]}},{"id":{"id":43,"debug_name":"store_temp,)>>"},"long_id":{"generic_id":"store_temp","generic_args":[{"Type":{"id":18,"debug_name":"core::panics::PanicResult::<(core::array::Array::,)>"}}]}},{"id":{"id":33,"debug_name":"drop"},"long_id":{"generic_id":"drop","generic_args":[{"Type":{"id":10,"debug_name":"Unit"}}]}},{"id":{"id":34,"debug_name":"drop>"},"long_id":{"generic_id":"drop","generic_args":[{"Type":{"id":22,"debug_name":"Uninitialized"}}]}},{"id":{"id":35,"debug_name":"const_as_immediate>"},"long_id":{"generic_id":"const_as_immediate","generic_args":[{"Type":{"id":23,"debug_name":"Const"}}]}},{"id":{"id":44,"debug_name":"store_temp"},"long_id":{"generic_id":"store_temp","generic_args":[{"Type":{"id":1,"debug_name":"felt252"}}]}},{"id":{"id":3,"debug_name":"array_append"},"long_id":{"generic_id":"array_append","generic_args":[{"Type":{"id":1,"debug_name":"felt252"}}]}},{"id":{"id":2,"debug_name":"struct_construct"},"long_id":{"generic_id":"struct_construct","generic_args":[{"Type":{"id":13,"debug_name":"core::panics::Panic"}}]}},{"id":{"id":1,"debug_name":"struct_construct>>"},"long_id":{"generic_id":"struct_construct","generic_args":[{"Type":{"id":14,"debug_name":"Tuple>"}}]}},{"id":{"id":0,"debug_name":"enum_init,)>, 1>"},"long_id":{"generic_id":"enum_init","generic_args":[{"Type":{"id":18,"debug_name":"core::panics::PanicResult::<(core::array::Array::,)>"}},{"Value":[1,[1]]}]}},{"id":{"id":59,"debug_name":"struct_deconstruct>"},"long_id":{"generic_id":"struct_deconstruct","generic_args":[{"Type":{"id":4,"debug_name":"core::array::Span::"}}]}},{"id":{"id":55,"debug_name":"array_snapshot_pop_front"},"long_id":{"generic_id":"array_snapshot_pop_front","generic_args":[{"Type":{"id":1,"debug_name":"felt252"}}]}},{"id":{"id":69,"debug_name":"enum_init>, 0>"},"long_id":{"generic_id":"enum_init","generic_args":[{"Type":{"id":27,"debug_name":"core::option::Option::>"}},{"Value":[0,[]]}]}},{"id":{"id":75,"debug_name":"store_temp>>"},"long_id":{"generic_id":"store_temp","generic_args":[{"Type":{"id":3,"debug_name":"Snapshot>"}}]}},{"id":{"id":76,"debug_name":"store_temp>>"},"long_id":{"generic_id":"store_temp","generic_args":[{"Type":{"id":27,"debug_name":"core::option::Option::>"}}]}},{"id":{"id":70,"debug_name":"jump"},"long_id":{"generic_id":"jump","generic_args":[]}},{"id":{"id":52,"debug_name":"struct_construct"},"long_id":{"generic_id":"struct_construct","generic_args":[{"Type":{"id":10,"debug_name":"Unit"}}]}},{"id":{"id":68,"debug_name":"enum_init>, 1>"},"long_id":{"generic_id":"enum_init","generic_args":[{"Type":{"id":27,"debug_name":"core::option::Option::>"}},{"Value":[1,[1]]}]}},{"id":{"id":67,"debug_name":"enum_match>>"},"long_id":{"generic_id":"enum_match","generic_args":[{"Type":{"id":27,"debug_name":"core::option::Option::>"}}]}},{"id":{"id":54,"debug_name":"unbox"},"long_id":{"generic_id":"unbox","generic_args":[{"Type":{"id":1,"debug_name":"felt252"}}]}},{"id":{"id":66,"debug_name":"array_new"},"long_id":{"generic_id":"array_new","generic_args":[{"Type":{"id":5,"debug_name":"batcher::Call"}}]}},{"id":{"id":71,"debug_name":"rename"},"long_id":{"generic_id":"rename","generic_args":[{"Type":{"id":1,"debug_name":"felt252"}}]}},{"id":{"id":77,"debug_name":"store_temp>"},"long_id":{"generic_id":"store_temp","generic_args":[{"Type":{"id":6,"debug_name":"Array"}}]}},{"id":{"id":65,"debug_name":"function_call>"},"long_id":{"generic_id":"function_call","generic_args":[{"UserFunc":{"id":4,"debug_name":"core::array::deserialize_array_helper::"}}]}},{"id":{"id":64,"debug_name":"enum_match, core::option::Option::>)>>"},"long_id":{"generic_id":"enum_match","generic_args":[{"Type":{"id":30,"debug_name":"core::panics::PanicResult::<(core::array::Span::, core::option::Option::>)>"}}]}},{"id":{"id":63,"debug_name":"struct_deconstruct, core::option::Option::>>>"},"long_id":{"generic_id":"struct_deconstruct","generic_args":[{"Type":{"id":29,"debug_name":"Tuple, core::option::Option::>>"}}]}},{"id":{"id":62,"debug_name":"enum_match>>"},"long_id":{"generic_id":"enum_match","generic_args":[{"Type":{"id":28,"debug_name":"core::option::Option::>"}}]}},{"id":{"id":72,"debug_name":"snapshot_take>"},"long_id":{"generic_id":"snapshot_take","generic_args":[{"Type":{"id":6,"debug_name":"Array"}}]}},{"id":{"id":73,"debug_name":"drop>"},"long_id":{"generic_id":"drop","generic_args":[{"Type":{"id":6,"debug_name":"Array"}}]}},{"id":{"id":61,"debug_name":"struct_construct>"},"long_id":{"generic_id":"struct_construct","generic_args":[{"Type":{"id":8,"debug_name":"core::array::Span::"}}]}},{"id":{"id":60,"debug_name":"enum_init>, 0>"},"long_id":{"generic_id":"enum_init","generic_args":[{"Type":{"id":31,"debug_name":"core::option::Option::>"}},{"Value":[0,[]]}]}},{"id":{"id":78,"debug_name":"store_temp>>"},"long_id":{"generic_id":"store_temp","generic_args":[{"Type":{"id":31,"debug_name":"core::option::Option::>"}}]}},{"id":{"id":57,"debug_name":"enum_init>, 1>"},"long_id":{"generic_id":"enum_init","generic_args":[{"Type":{"id":31,"debug_name":"core::option::Option::>"}},{"Value":[1,[1]]}]}},{"id":{"id":58,"debug_name":"enum_init, core::option::Option::)>, 1>"},"long_id":{"generic_id":"enum_init","generic_args":[{"Type":{"id":15,"debug_name":"core::panics::PanicResult::<(core::array::Span::, core::option::Option::)>"}},{"Value":[1,[1]]}]}},{"id":{"id":79,"debug_name":"store_temp, core::option::Option::)>>"},"long_id":{"generic_id":"store_temp","generic_args":[{"Type":{"id":15,"debug_name":"core::panics::PanicResult::<(core::array::Span::, core::option::Option::)>"}}]}},{"id":{"id":56,"debug_name":"enum_match>>"},"long_id":{"generic_id":"enum_match","generic_args":[{"Type":{"id":31,"debug_name":"core::option::Option::>"}}]}},{"id":{"id":74,"debug_name":"enable_ap_tracking"},"long_id":{"generic_id":"enable_ap_tracking","generic_args":[]}},{"id":{"id":53,"debug_name":"enum_init, 0>"},"long_id":{"generic_id":"enum_init","generic_args":[{"Type":{"id":32,"debug_name":"core::option::Option::"}},{"Value":[0,[]]}]}},{"id":{"id":80,"debug_name":"store_temp>"},"long_id":{"generic_id":"store_temp","generic_args":[{"Type":{"id":32,"debug_name":"core::option::Option::"}}]}},{"id":{"id":51,"debug_name":"enum_init, 1>"},"long_id":{"generic_id":"enum_init","generic_args":[{"Type":{"id":32,"debug_name":"core::option::Option::"}},{"Value":[1,[1]]}]}},{"id":{"id":50,"debug_name":"enum_match>"},"long_id":{"generic_id":"enum_match","generic_args":[{"Type":{"id":32,"debug_name":"core::option::Option::"}}]}},{"id":{"id":49,"debug_name":"struct_construct"},"long_id":{"generic_id":"struct_construct","generic_args":[{"Type":{"id":9,"debug_name":"batcher::ProgramInput"}}]}},{"id":{"id":48,"debug_name":"enum_init, 0>"},"long_id":{"generic_id":"enum_init","generic_args":[{"Type":{"id":11,"debug_name":"core::option::Option::"}},{"Value":[0,[]]}]}},{"id":{"id":46,"debug_name":"struct_construct, core::option::Option::>>"},"long_id":{"generic_id":"struct_construct","generic_args":[{"Type":{"id":12,"debug_name":"Tuple, core::option::Option::>"}}]}},{"id":{"id":45,"debug_name":"enum_init, core::option::Option::)>, 0>"},"long_id":{"generic_id":"enum_init","generic_args":[{"Type":{"id":15,"debug_name":"core::panics::PanicResult::<(core::array::Span::, core::option::Option::)>"}},{"Value":[0,[]]}]}},{"id":{"id":47,"debug_name":"enum_init, 1>"},"long_id":{"generic_id":"enum_init","generic_args":[{"Type":{"id":11,"debug_name":"core::option::Option::"}},{"Value":[1,[1]]}]}},{"id":{"id":89,"debug_name":"alloc_local>"},"long_id":{"generic_id":"alloc_local","generic_args":[{"Type":{"id":2,"debug_name":"Array"}}]}},{"id":{"id":90,"debug_name":"alloc_local>>"},"long_id":{"generic_id":"alloc_local","generic_args":[{"Type":{"id":7,"debug_name":"Snapshot>"}}]}},{"id":{"id":91,"debug_name":"alloc_local"},"long_id":{"generic_id":"alloc_local","generic_args":[{"Type":{"id":5,"debug_name":"batcher::Call"}}]}},{"id":{"id":88,"debug_name":"struct_deconstruct>"},"long_id":{"generic_id":"struct_deconstruct","generic_args":[{"Type":{"id":8,"debug_name":"core::array::Span::"}}]}},{"id":{"id":87,"debug_name":"array_snapshot_pop_front"},"long_id":{"generic_id":"array_snapshot_pop_front","generic_args":[{"Type":{"id":5,"debug_name":"batcher::Call"}}]}},{"id":{"id":86,"debug_name":"enum_init>, 0>"},"long_id":{"generic_id":"enum_init","generic_args":[{"Type":{"id":34,"debug_name":"core::option::Option::>"}},{"Value":[0,[]]}]}},{"id":{"id":96,"debug_name":"store_temp>>"},"long_id":{"generic_id":"store_temp","generic_args":[{"Type":{"id":7,"debug_name":"Snapshot>"}}]}},{"id":{"id":97,"debug_name":"store_temp>>"},"long_id":{"generic_id":"store_temp","generic_args":[{"Type":{"id":34,"debug_name":"core::option::Option::>"}}]}},{"id":{"id":85,"debug_name":"enum_init>, 1>"},"long_id":{"generic_id":"enum_init","generic_args":[{"Type":{"id":34,"debug_name":"core::option::Option::>"}},{"Value":[1,[1]]}]}},{"id":{"id":98,"debug_name":"store_local>>"},"long_id":{"generic_id":"store_local","generic_args":[{"Type":{"id":7,"debug_name":"Snapshot>"}}]}},{"id":{"id":84,"debug_name":"enum_match>>"},"long_id":{"generic_id":"enum_match","generic_args":[{"Type":{"id":34,"debug_name":"core::option::Option::>"}}]}},{"id":{"id":83,"debug_name":"unbox"},"long_id":{"generic_id":"unbox","generic_args":[{"Type":{"id":5,"debug_name":"batcher::Call"}}]}},{"id":{"id":99,"debug_name":"store_local"},"long_id":{"generic_id":"store_local","generic_args":[{"Type":{"id":5,"debug_name":"batcher::Call"}}]}},{"id":{"id":92,"debug_name":"dup"},"long_id":{"generic_id":"dup","generic_args":[{"Type":{"id":5,"debug_name":"batcher::Call"}}]}},{"id":{"id":82,"debug_name":"struct_deconstruct"},"long_id":{"generic_id":"struct_deconstruct","generic_args":[{"Type":{"id":5,"debug_name":"batcher::Call"}}]}},{"id":{"id":93,"debug_name":"rename>"},"long_id":{"generic_id":"rename","generic_args":[{"Type":{"id":4,"debug_name":"core::array::Span::"}}]}},{"id":{"id":81,"debug_name":"function_call::append_span::, core::felt252Drop>>"},"long_id":{"generic_id":"function_call","generic_args":[{"UserFunc":{"id":5,"debug_name":"core::array::ArrayImpl::::append_span::, core::felt252Drop>"}}]}},{"id":{"id":100,"debug_name":"store_local>"},"long_id":{"generic_id":"store_local","generic_args":[{"Type":{"id":2,"debug_name":"Array"}}]}},{"id":{"id":94,"debug_name":"drop>>"},"long_id":{"generic_id":"drop","generic_args":[{"Type":{"id":35,"debug_name":"Uninitialized>"}}]}},{"id":{"id":95,"debug_name":"drop>"},"long_id":{"generic_id":"drop","generic_args":[{"Type":{"id":36,"debug_name":"Uninitialized"}}]}},{"id":{"id":105,"debug_name":"dup"},"long_id":{"generic_id":"dup","generic_args":[{"Type":{"id":16,"debug_name":"batcher::ProgramOutput"}}]}},{"id":{"id":104,"debug_name":"struct_deconstruct"},"long_id":{"generic_id":"struct_deconstruct","generic_args":[{"Type":{"id":16,"debug_name":"batcher::ProgramOutput"}}]}},{"id":{"id":106,"debug_name":"dup>"},"long_id":{"generic_id":"dup","generic_args":[{"Type":{"id":4,"debug_name":"core::array::Span::"}}]}},{"id":{"id":103,"debug_name":"array_len"},"long_id":{"generic_id":"array_len","generic_args":[{"Type":{"id":1,"debug_name":"felt252"}}]}},{"id":{"id":102,"debug_name":"u32_to_felt252"},"long_id":{"generic_id":"u32_to_felt252","generic_args":[]}},{"id":{"id":101,"debug_name":"function_call>"},"long_id":{"generic_id":"function_call","generic_args":[{"UserFunc":{"id":6,"debug_name":"core::array::serialize_array_helper::"}}]}},{"id":{"id":146,"debug_name":"felt252_is_zero"},"long_id":{"generic_id":"felt252_is_zero","generic_args":[]}},{"id":{"id":145,"debug_name":"enum_init>, 0>"},"long_id":{"generic_id":"enum_init","generic_args":[{"Type":{"id":28,"debug_name":"core::option::Option::>"}},{"Value":[0,[]]}]}},{"id":{"id":109,"debug_name":"struct_construct, core::option::Option::>>>"},"long_id":{"generic_id":"struct_construct","generic_args":[{"Type":{"id":29,"debug_name":"Tuple, core::option::Option::>>"}}]}},{"id":{"id":108,"debug_name":"enum_init, core::option::Option::>)>, 0>"},"long_id":{"generic_id":"enum_init","generic_args":[{"Type":{"id":30,"debug_name":"core::panics::PanicResult::<(core::array::Span::, core::option::Option::>)>"}},{"Value":[0,[]]}]}},{"id":{"id":148,"debug_name":"store_temp, core::option::Option::>)>>"},"long_id":{"generic_id":"store_temp","generic_args":[{"Type":{"id":30,"debug_name":"core::panics::PanicResult::<(core::array::Span::, core::option::Option::>)>"}}]}},{"id":{"id":147,"debug_name":"drop>"},"long_id":{"generic_id":"drop","generic_args":[{"Type":{"id":39,"debug_name":"NonZero"}}]}},{"id":{"id":116,"debug_name":"function_call"},"long_id":{"generic_id":"function_call","generic_args":[{"UserFunc":{"id":7,"debug_name":"batcher::CallSerde::deserialize"}}]}},{"id":{"id":115,"debug_name":"enum_match, core::option::Option::)>>"},"long_id":{"generic_id":"enum_match","generic_args":[{"Type":{"id":42,"debug_name":"core::panics::PanicResult::<(core::array::Span::, core::option::Option::)>"}}]}},{"id":{"id":114,"debug_name":"struct_deconstruct, core::option::Option::>>"},"long_id":{"generic_id":"struct_deconstruct","generic_args":[{"Type":{"id":41,"debug_name":"Tuple, core::option::Option::>"}}]}},{"id":{"id":113,"debug_name":"enum_match>"},"long_id":{"generic_id":"enum_match","generic_args":[{"Type":{"id":40,"debug_name":"core::option::Option::"}}]}},{"id":{"id":112,"debug_name":"array_append"},"long_id":{"generic_id":"array_append","generic_args":[{"Type":{"id":5,"debug_name":"batcher::Call"}}]}},{"id":{"id":111,"debug_name":"felt252_sub"},"long_id":{"generic_id":"felt252_sub","generic_args":[]}},{"id":{"id":110,"debug_name":"enum_init>, 1>"},"long_id":{"generic_id":"enum_init","generic_args":[{"Type":{"id":28,"debug_name":"core::option::Option::>"}},{"Value":[1,[1]]}]}},{"id":{"id":107,"debug_name":"enum_init, core::option::Option::>)>, 1>"},"long_id":{"generic_id":"enum_init","generic_args":[{"Type":{"id":30,"debug_name":"core::panics::PanicResult::<(core::array::Span::, core::option::Option::>)>"}},{"Value":[1,[1]]}]}},{"id":{"id":138,"debug_name":"drop>>"},"long_id":{"generic_id":"drop","generic_args":[{"Type":{"id":3,"debug_name":"Snapshot>"}}]}},{"id":{"id":126,"debug_name":"function_call"},"long_id":{"generic_id":"function_call","generic_args":[{"UserFunc":{"id":8,"debug_name":"core::array::SpanFelt252Serde::deserialize"}}]}},{"id":{"id":125,"debug_name":"enum_match, core::option::Option::>)>>"},"long_id":{"generic_id":"enum_match","generic_args":[{"Type":{"id":45,"debug_name":"core::panics::PanicResult::<(core::array::Span::, core::option::Option::>)>"}}]}},{"id":{"id":124,"debug_name":"struct_deconstruct, core::option::Option::>>>"},"long_id":{"generic_id":"struct_deconstruct","generic_args":[{"Type":{"id":44,"debug_name":"Tuple, core::option::Option::>>"}}]}},{"id":{"id":123,"debug_name":"enum_match>>"},"long_id":{"generic_id":"enum_match","generic_args":[{"Type":{"id":43,"debug_name":"core::option::Option::>"}}]}},{"id":{"id":122,"debug_name":"struct_construct"},"long_id":{"generic_id":"struct_construct","generic_args":[{"Type":{"id":5,"debug_name":"batcher::Call"}}]}},{"id":{"id":121,"debug_name":"enum_init, 0>"},"long_id":{"generic_id":"enum_init","generic_args":[{"Type":{"id":40,"debug_name":"core::option::Option::"}},{"Value":[0,[]]}]}},{"id":{"id":118,"debug_name":"struct_construct, core::option::Option::>>"},"long_id":{"generic_id":"struct_construct","generic_args":[{"Type":{"id":41,"debug_name":"Tuple, core::option::Option::>"}}]}},{"id":{"id":117,"debug_name":"enum_init, core::option::Option::)>, 0>"},"long_id":{"generic_id":"enum_init","generic_args":[{"Type":{"id":42,"debug_name":"core::panics::PanicResult::<(core::array::Span::, core::option::Option::)>"}},{"Value":[0,[]]}]}},{"id":{"id":144,"debug_name":"store_temp, core::option::Option::)>>"},"long_id":{"generic_id":"store_temp","generic_args":[{"Type":{"id":42,"debug_name":"core::panics::PanicResult::<(core::array::Span::, core::option::Option::)>"}}]}},{"id":{"id":119,"debug_name":"enum_init, 1>"},"long_id":{"generic_id":"enum_init","generic_args":[{"Type":{"id":40,"debug_name":"core::option::Option::"}},{"Value":[1,[1]]}]}},{"id":{"id":120,"debug_name":"enum_init, core::option::Option::)>, 1>"},"long_id":{"generic_id":"enum_init","generic_args":[{"Type":{"id":42,"debug_name":"core::panics::PanicResult::<(core::array::Span::, core::option::Option::)>"}},{"Value":[1,[1]]}]}},{"id":{"id":135,"debug_name":"dup>>"},"long_id":{"generic_id":"dup","generic_args":[{"Type":{"id":3,"debug_name":"Snapshot>"}}]}},{"id":{"id":134,"debug_name":"u32_try_from_felt252"},"long_id":{"generic_id":"u32_try_from_felt252","generic_args":[]}},{"id":{"id":136,"debug_name":"const_as_immediate>"},"long_id":{"generic_id":"const_as_immediate","generic_args":[{"Type":{"id":46,"debug_name":"Const"}}]}},{"id":{"id":137,"debug_name":"dup"},"long_id":{"generic_id":"dup","generic_args":[{"Type":{"id":38,"debug_name":"u32"}}]}},{"id":{"id":142,"debug_name":"store_temp"},"long_id":{"generic_id":"store_temp","generic_args":[{"Type":{"id":38,"debug_name":"u32"}}]}},{"id":{"id":132,"debug_name":"array_slice"},"long_id":{"generic_id":"array_slice","generic_args":[{"Type":{"id":1,"debug_name":"felt252"}}]}},{"id":{"id":133,"debug_name":"u32_overflowing_sub"},"long_id":{"generic_id":"u32_overflowing_sub","generic_args":[]}},{"id":{"id":131,"debug_name":"enum_init>, 0>"},"long_id":{"generic_id":"enum_init","generic_args":[{"Type":{"id":43,"debug_name":"core::option::Option::>"}},{"Value":[0,[]]}]}},{"id":{"id":128,"debug_name":"struct_construct, core::option::Option::>>>"},"long_id":{"generic_id":"struct_construct","generic_args":[{"Type":{"id":44,"debug_name":"Tuple, core::option::Option::>>"}}]}},{"id":{"id":127,"debug_name":"enum_init, core::option::Option::>)>, 0>"},"long_id":{"generic_id":"enum_init","generic_args":[{"Type":{"id":45,"debug_name":"core::panics::PanicResult::<(core::array::Span::, core::option::Option::>)>"}},{"Value":[0,[]]}]}},{"id":{"id":143,"debug_name":"store_temp, core::option::Option::>)>>"},"long_id":{"generic_id":"store_temp","generic_args":[{"Type":{"id":45,"debug_name":"core::panics::PanicResult::<(core::array::Span::, core::option::Option::>)>"}}]}},{"id":{"id":139,"debug_name":"const_as_immediate>"},"long_id":{"generic_id":"const_as_immediate","generic_args":[{"Type":{"id":47,"debug_name":"Const"}}]}},{"id":{"id":130,"debug_name":"enum_init, core::option::Option::>)>, 1>"},"long_id":{"generic_id":"enum_init","generic_args":[{"Type":{"id":45,"debug_name":"core::panics::PanicResult::<(core::array::Span::, core::option::Option::>)>"}},{"Value":[1,[1]]}]}},{"id":{"id":140,"debug_name":"drop"},"long_id":{"generic_id":"drop","generic_args":[{"Type":{"id":38,"debug_name":"u32"}}]}},{"id":{"id":141,"debug_name":"const_as_immediate>"},"long_id":{"generic_id":"const_as_immediate","generic_args":[{"Type":{"id":48,"debug_name":"Const"}}]}},{"id":{"id":129,"debug_name":"enum_init>, 1>"},"long_id":{"generic_id":"enum_init","generic_args":[{"Type":{"id":43,"debug_name":"core::option::Option::>"}},{"Value":[1,[1]]}]}}],"statements":[{"Invocation":{"libfunc_id":{"id":17,"debug_name":"alloc_local"},"args":[],"branches":[{"target":"Fallthrough","results":[{"id":3,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":18,"debug_name":"alloc_local"},"args":[],"branches":[{"target":"Fallthrough","results":[{"id":5,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":18,"debug_name":"alloc_local"},"args":[],"branches":[{"target":"Fallthrough","results":[{"id":7,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":19,"debug_name":"finalize_locals"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":20,"debug_name":"disable_ap_tracking"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":21,"debug_name":"snapshot_take>"},"args":[{"id":1,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":8,"debug_name":null},{"id":9,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":22,"debug_name":"drop>"},"args":[{"id":8,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":9,"debug_name":"struct_construct>"},"args":[{"id":9,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":10,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":36,"debug_name":"store_temp"},"args":[{"id":0,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":0,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":37,"debug_name":"store_temp>"},"args":[{"id":10,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":10,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":16,"debug_name":"function_call"},"args":[{"id":0,"debug_name":null},{"id":10,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":2,"debug_name":null},{"id":11,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":38,"debug_name":"store_local"},"args":[{"id":3,"debug_name":null},{"id":2,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":2,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":15,"debug_name":"enum_match, core::option::Option::)>>"},"args":[{"id":11,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":12,"debug_name":null}]},{"target":{"Statement":68},"results":[{"id":13,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":14,"debug_name":"struct_deconstruct, core::option::Option::>>"},"args":[{"id":12,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":14,"debug_name":null},{"id":15,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":24,"debug_name":"drop>"},"args":[{"id":14,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":13,"debug_name":"enum_match>"},"args":[{"id":15,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":16,"debug_name":null}]},{"target":{"Statement":54},"results":[{"id":17,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":4,"debug_name":"array_new"},"args":[],"branches":[{"target":"Fallthrough","results":[{"id":18,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":4,"debug_name":"array_new"},"args":[],"branches":[{"target":"Fallthrough","results":[{"id":19,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":12,"debug_name":"struct_deconstruct"},"args":[{"id":16,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":20,"debug_name":null},{"id":4,"debug_name":null},{"id":6,"debug_name":null},{"id":21,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":21,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":39,"debug_name":"store_temp>"},"args":[{"id":20,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":20,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":40,"debug_name":"store_temp>"},"args":[{"id":19,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":19,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":40,"debug_name":"store_temp>"},"args":[{"id":18,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":18,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":41,"debug_name":"store_local"},"args":[{"id":5,"debug_name":null},{"id":4,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":4,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":41,"debug_name":"store_local"},"args":[{"id":7,"debug_name":null},{"id":6,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":6,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":11,"debug_name":"function_call"},"args":[{"id":20,"debug_name":null},{"id":19,"debug_name":null},{"id":18,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":22,"debug_name":null},{"id":23,"debug_name":null},{"id":24,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":26,"debug_name":"drop>"},"args":[{"id":22,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":4,"debug_name":"array_new"},"args":[],"branches":[{"target":"Fallthrough","results":[{"id":25,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":27,"debug_name":"const_as_immediate>"},"args":[],"branches":[{"target":"Fallthrough","results":[{"id":26,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":28,"debug_name":"dup"},"args":[{"id":6,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":6,"debug_name":null},{"id":27,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":10,"debug_name":"felt252_add"},"args":[{"id":27,"debug_name":null},{"id":26,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":28,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":27,"debug_name":"const_as_immediate>"},"args":[],"branches":[{"target":"Fallthrough","results":[{"id":29,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":10,"debug_name":"felt252_add"},"args":[{"id":4,"debug_name":null},{"id":29,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":30,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":29,"debug_name":"const_as_immediate>"},"args":[],"branches":[{"target":"Fallthrough","results":[{"id":31,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":30,"debug_name":"const_as_immediate>"},"args":[],"branches":[{"target":"Fallthrough","results":[{"id":32,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":21,"debug_name":"snapshot_take>"},"args":[{"id":23,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":33,"debug_name":null},{"id":34,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":22,"debug_name":"drop>"},"args":[{"id":33,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":21,"debug_name":"snapshot_take>"},"args":[{"id":24,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":35,"debug_name":null},{"id":36,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":22,"debug_name":"drop>"},"args":[{"id":35,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":9,"debug_name":"struct_construct>"},"args":[{"id":34,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":37,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":9,"debug_name":"struct_construct>"},"args":[{"id":36,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":38,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":8,"debug_name":"struct_construct"},"args":[{"id":6,"debug_name":null},{"id":28,"debug_name":null},{"id":30,"debug_name":null},{"id":31,"debug_name":null},{"id":32,"debug_name":null},{"id":37,"debug_name":null},{"id":38,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":39,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":31,"debug_name":"snapshot_take"},"args":[{"id":39,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":40,"debug_name":null},{"id":41,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":32,"debug_name":"drop"},"args":[{"id":40,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":42,"debug_name":"store_temp"},"args":[{"id":41,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":41,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":40,"debug_name":"store_temp>"},"args":[{"id":25,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":25,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":7,"debug_name":"function_call"},"args":[{"id":41,"debug_name":null},{"id":25,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":42,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":6,"debug_name":"struct_construct>>"},"args":[{"id":42,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":43,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":5,"debug_name":"enum_init,)>, 0>"},"args":[{"id":43,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":44,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":36,"debug_name":"store_temp"},"args":[{"id":2,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":2,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":43,"debug_name":"store_temp,)>>"},"args":[{"id":44,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":44,"debug_name":null}]}]}},{"Return":[{"id":2,"debug_name":null},{"id":44,"debug_name":null}]},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":33,"debug_name":"drop"},"args":[{"id":17,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":34,"debug_name":"drop>"},"args":[{"id":5,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":34,"debug_name":"drop>"},"args":[{"id":7,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":4,"debug_name":"array_new"},"args":[],"branches":[{"target":"Fallthrough","results":[{"id":45,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":35,"debug_name":"const_as_immediate>"},"args":[],"branches":[{"target":"Fallthrough","results":[{"id":46,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":44,"debug_name":"store_temp"},"args":[{"id":46,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":46,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":3,"debug_name":"array_append"},"args":[{"id":45,"debug_name":null},{"id":46,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":47,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":2,"debug_name":"struct_construct"},"args":[],"branches":[{"target":"Fallthrough","results":[{"id":48,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":1,"debug_name":"struct_construct>>"},"args":[{"id":48,"debug_name":null},{"id":47,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":49,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":0,"debug_name":"enum_init,)>, 1>"},"args":[{"id":49,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":50,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":36,"debug_name":"store_temp"},"args":[{"id":2,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":2,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":43,"debug_name":"store_temp,)>>"},"args":[{"id":50,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":50,"debug_name":null}]}]}},{"Return":[{"id":2,"debug_name":null},{"id":50,"debug_name":null}]},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":34,"debug_name":"drop>"},"args":[{"id":5,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":34,"debug_name":"drop>"},"args":[{"id":7,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":0,"debug_name":"enum_init,)>, 1>"},"args":[{"id":13,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":51,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":36,"debug_name":"store_temp"},"args":[{"id":2,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":2,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":43,"debug_name":"store_temp,)>>"},"args":[{"id":51,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":51,"debug_name":null}]}]}},{"Return":[{"id":2,"debug_name":null},{"id":51,"debug_name":null}]},{"Invocation":{"libfunc_id":{"id":20,"debug_name":"disable_ap_tracking"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":59,"debug_name":"struct_deconstruct>"},"args":[{"id":1,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":2,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":55,"debug_name":"array_snapshot_pop_front"},"args":[{"id":2,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":3,"debug_name":null},{"id":4,"debug_name":null}]},{"target":{"Statement":83},"results":[{"id":5,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":69,"debug_name":"enum_init>, 0>"},"args":[{"id":4,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":6,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":75,"debug_name":"store_temp>>"},"args":[{"id":3,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":7,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":76,"debug_name":"store_temp>>"},"args":[{"id":6,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":8,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":70,"debug_name":"jump"},"args":[],"branches":[{"target":{"Statement":88},"results":[]}]}},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":52,"debug_name":"struct_construct"},"args":[],"branches":[{"target":"Fallthrough","results":[{"id":9,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":68,"debug_name":"enum_init>, 1>"},"args":[{"id":9,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":10,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":75,"debug_name":"store_temp>>"},"args":[{"id":5,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":7,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":76,"debug_name":"store_temp>>"},"args":[{"id":10,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":8,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":67,"debug_name":"enum_match>>"},"args":[{"id":8,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":11,"debug_name":null}]},{"target":{"Statement":125},"results":[{"id":12,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":54,"debug_name":"unbox"},"args":[{"id":11,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":13,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":66,"debug_name":"array_new"},"args":[],"branches":[{"target":"Fallthrough","results":[{"id":14,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":9,"debug_name":"struct_construct>"},"args":[{"id":7,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":15,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":71,"debug_name":"rename"},"args":[{"id":13,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":16,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":36,"debug_name":"store_temp"},"args":[{"id":0,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":0,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":37,"debug_name":"store_temp>"},"args":[{"id":15,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":15,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":77,"debug_name":"store_temp>"},"args":[{"id":14,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":14,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":44,"debug_name":"store_temp"},"args":[{"id":16,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":16,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":65,"debug_name":"function_call>"},"args":[{"id":0,"debug_name":null},{"id":15,"debug_name":null},{"id":14,"debug_name":null},{"id":16,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":17,"debug_name":null},{"id":18,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":64,"debug_name":"enum_match, core::option::Option::>)>>"},"args":[{"id":18,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":19,"debug_name":null}]},{"target":{"Statement":120},"results":[{"id":20,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":63,"debug_name":"struct_deconstruct, core::option::Option::>>>"},"args":[{"id":19,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":21,"debug_name":null},{"id":22,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":62,"debug_name":"enum_match>>"},"args":[{"id":22,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":23,"debug_name":null}]},{"target":{"Statement":113},"results":[{"id":24,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":72,"debug_name":"snapshot_take>"},"args":[{"id":23,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":25,"debug_name":null},{"id":26,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":73,"debug_name":"drop>"},"args":[{"id":25,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":61,"debug_name":"struct_construct>"},"args":[{"id":26,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":27,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":60,"debug_name":"enum_init>, 0>"},"args":[{"id":27,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":28,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":59,"debug_name":"struct_deconstruct>"},"args":[{"id":21,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":29,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":36,"debug_name":"store_temp"},"args":[{"id":17,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":30,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":75,"debug_name":"store_temp>>"},"args":[{"id":29,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":31,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":78,"debug_name":"store_temp>>"},"args":[{"id":28,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":32,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":70,"debug_name":"jump"},"args":[],"branches":[{"target":{"Statement":132},"results":[]}]}},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":57,"debug_name":"enum_init>, 1>"},"args":[{"id":24,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":33,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":59,"debug_name":"struct_deconstruct>"},"args":[{"id":21,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":34,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":36,"debug_name":"store_temp"},"args":[{"id":17,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":30,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":75,"debug_name":"store_temp>>"},"args":[{"id":34,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":31,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":78,"debug_name":"store_temp>>"},"args":[{"id":33,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":32,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":70,"debug_name":"jump"},"args":[],"branches":[{"target":{"Statement":132},"results":[]}]}},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":58,"debug_name":"enum_init, core::option::Option::)>, 1>"},"args":[{"id":20,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":35,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":36,"debug_name":"store_temp"},"args":[{"id":17,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":17,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":79,"debug_name":"store_temp, core::option::Option::)>>"},"args":[{"id":35,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":35,"debug_name":null}]}]}},{"Return":[{"id":17,"debug_name":null},{"id":35,"debug_name":null}]},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":33,"debug_name":"drop"},"args":[{"id":12,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":52,"debug_name":"struct_construct"},"args":[],"branches":[{"target":"Fallthrough","results":[{"id":36,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":57,"debug_name":"enum_init>, 1>"},"args":[{"id":36,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":37,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":36,"debug_name":"store_temp"},"args":[{"id":0,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":30,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":75,"debug_name":"store_temp>>"},"args":[{"id":7,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":31,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":78,"debug_name":"store_temp>>"},"args":[{"id":37,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":32,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":56,"debug_name":"enum_match>>"},"args":[{"id":32,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":38,"debug_name":null}]},{"target":{"Statement":221},"results":[{"id":39,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":74,"debug_name":"enable_ap_tracking"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":55,"debug_name":"array_snapshot_pop_front"},"args":[{"id":31,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":40,"debug_name":null},{"id":41,"debug_name":null}]},{"target":{"Statement":143},"results":[{"id":42,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":54,"debug_name":"unbox"},"args":[{"id":41,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":43,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":71,"debug_name":"rename"},"args":[{"id":43,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":44,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":53,"debug_name":"enum_init, 0>"},"args":[{"id":44,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":45,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":75,"debug_name":"store_temp>>"},"args":[{"id":40,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":46,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":80,"debug_name":"store_temp>"},"args":[{"id":45,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":47,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":70,"debug_name":"jump"},"args":[],"branches":[{"target":{"Statement":148},"results":[]}]}},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":52,"debug_name":"struct_construct"},"args":[],"branches":[{"target":"Fallthrough","results":[{"id":48,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":51,"debug_name":"enum_init, 1>"},"args":[{"id":48,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":49,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":75,"debug_name":"store_temp>>"},"args":[{"id":42,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":46,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":80,"debug_name":"store_temp>"},"args":[{"id":49,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":47,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":50,"debug_name":"enum_match>"},"args":[{"id":47,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":50,"debug_name":null}]},{"target":{"Statement":211},"results":[{"id":51,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":55,"debug_name":"array_snapshot_pop_front"},"args":[{"id":46,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":52,"debug_name":null},{"id":53,"debug_name":null}]},{"target":{"Statement":158},"results":[{"id":54,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":54,"debug_name":"unbox"},"args":[{"id":53,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":55,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":71,"debug_name":"rename"},"args":[{"id":55,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":56,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":53,"debug_name":"enum_init, 0>"},"args":[{"id":56,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":57,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":75,"debug_name":"store_temp>>"},"args":[{"id":52,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":58,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":80,"debug_name":"store_temp>"},"args":[{"id":57,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":59,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":70,"debug_name":"jump"},"args":[],"branches":[{"target":{"Statement":163},"results":[]}]}},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":52,"debug_name":"struct_construct"},"args":[],"branches":[{"target":"Fallthrough","results":[{"id":60,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":51,"debug_name":"enum_init, 1>"},"args":[{"id":60,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":61,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":75,"debug_name":"store_temp>>"},"args":[{"id":54,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":58,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":80,"debug_name":"store_temp>"},"args":[{"id":61,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":59,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":50,"debug_name":"enum_match>"},"args":[{"id":59,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":62,"debug_name":null}]},{"target":{"Statement":200},"results":[{"id":63,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":55,"debug_name":"array_snapshot_pop_front"},"args":[{"id":58,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":64,"debug_name":null},{"id":65,"debug_name":null}]},{"target":{"Statement":173},"results":[{"id":66,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":54,"debug_name":"unbox"},"args":[{"id":65,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":67,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":71,"debug_name":"rename"},"args":[{"id":67,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":68,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":53,"debug_name":"enum_init, 0>"},"args":[{"id":68,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":69,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":75,"debug_name":"store_temp>>"},"args":[{"id":64,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":70,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":80,"debug_name":"store_temp>"},"args":[{"id":69,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":71,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":70,"debug_name":"jump"},"args":[],"branches":[{"target":{"Statement":178},"results":[]}]}},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":52,"debug_name":"struct_construct"},"args":[],"branches":[{"target":"Fallthrough","results":[{"id":72,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":51,"debug_name":"enum_init, 1>"},"args":[{"id":72,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":73,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":75,"debug_name":"store_temp>>"},"args":[{"id":66,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":70,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":80,"debug_name":"store_temp>"},"args":[{"id":73,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":71,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":9,"debug_name":"struct_construct>"},"args":[{"id":70,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":74,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":50,"debug_name":"enum_match>"},"args":[{"id":71,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":75,"debug_name":null}]},{"target":{"Statement":189},"results":[{"id":76,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":20,"debug_name":"disable_ap_tracking"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":49,"debug_name":"struct_construct"},"args":[{"id":38,"debug_name":null},{"id":50,"debug_name":null},{"id":62,"debug_name":null},{"id":75,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":77,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":48,"debug_name":"enum_init, 0>"},"args":[{"id":77,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":78,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":46,"debug_name":"struct_construct, core::option::Option::>>"},"args":[{"id":74,"debug_name":null},{"id":78,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":79,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":45,"debug_name":"enum_init, core::option::Option::)>, 0>"},"args":[{"id":79,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":80,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":36,"debug_name":"store_temp"},"args":[{"id":30,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":30,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":79,"debug_name":"store_temp, core::option::Option::)>>"},"args":[{"id":80,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":80,"debug_name":null}]}]}},{"Return":[{"id":30,"debug_name":null},{"id":80,"debug_name":null}]},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":20,"debug_name":"disable_ap_tracking"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":26,"debug_name":"drop>"},"args":[{"id":38,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":62,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":50,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":47,"debug_name":"enum_init, 1>"},"args":[{"id":76,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":81,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":46,"debug_name":"struct_construct, core::option::Option::>>"},"args":[{"id":74,"debug_name":null},{"id":81,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":82,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":45,"debug_name":"enum_init, core::option::Option::)>, 0>"},"args":[{"id":82,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":83,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":36,"debug_name":"store_temp"},"args":[{"id":30,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":30,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":79,"debug_name":"store_temp, core::option::Option::)>>"},"args":[{"id":83,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":83,"debug_name":null}]}]}},{"Return":[{"id":30,"debug_name":null},{"id":83,"debug_name":null}]},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":20,"debug_name":"disable_ap_tracking"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":50,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":26,"debug_name":"drop>"},"args":[{"id":38,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":9,"debug_name":"struct_construct>"},"args":[{"id":58,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":84,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":47,"debug_name":"enum_init, 1>"},"args":[{"id":63,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":85,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":46,"debug_name":"struct_construct, core::option::Option::>>"},"args":[{"id":84,"debug_name":null},{"id":85,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":86,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":45,"debug_name":"enum_init, core::option::Option::)>, 0>"},"args":[{"id":86,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":87,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":36,"debug_name":"store_temp"},"args":[{"id":30,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":30,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":79,"debug_name":"store_temp, core::option::Option::)>>"},"args":[{"id":87,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":87,"debug_name":null}]}]}},{"Return":[{"id":30,"debug_name":null},{"id":87,"debug_name":null}]},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":20,"debug_name":"disable_ap_tracking"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":26,"debug_name":"drop>"},"args":[{"id":38,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":9,"debug_name":"struct_construct>"},"args":[{"id":46,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":88,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":47,"debug_name":"enum_init, 1>"},"args":[{"id":51,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":89,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":46,"debug_name":"struct_construct, core::option::Option::>>"},"args":[{"id":88,"debug_name":null},{"id":89,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":90,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":45,"debug_name":"enum_init, core::option::Option::)>, 0>"},"args":[{"id":90,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":91,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":36,"debug_name":"store_temp"},"args":[{"id":30,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":30,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":79,"debug_name":"store_temp, core::option::Option::)>>"},"args":[{"id":91,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":91,"debug_name":null}]}]}},{"Return":[{"id":30,"debug_name":null},{"id":91,"debug_name":null}]},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":9,"debug_name":"struct_construct>"},"args":[{"id":31,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":92,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":47,"debug_name":"enum_init, 1>"},"args":[{"id":39,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":93,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":46,"debug_name":"struct_construct, core::option::Option::>>"},"args":[{"id":92,"debug_name":null},{"id":93,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":94,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":45,"debug_name":"enum_init, core::option::Option::)>, 0>"},"args":[{"id":94,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":95,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":36,"debug_name":"store_temp"},"args":[{"id":30,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":30,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":79,"debug_name":"store_temp, core::option::Option::)>>"},"args":[{"id":95,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":95,"debug_name":null}]}]}},{"Return":[{"id":30,"debug_name":null},{"id":95,"debug_name":null}]},{"Invocation":{"libfunc_id":{"id":89,"debug_name":"alloc_local>"},"args":[],"branches":[{"target":"Fallthrough","results":[{"id":4,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":90,"debug_name":"alloc_local>>"},"args":[],"branches":[{"target":"Fallthrough","results":[{"id":6,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":91,"debug_name":"alloc_local"},"args":[],"branches":[{"target":"Fallthrough","results":[{"id":8,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":19,"debug_name":"finalize_locals"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":20,"debug_name":"disable_ap_tracking"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":88,"debug_name":"struct_deconstruct>"},"args":[{"id":0,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":9,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":87,"debug_name":"array_snapshot_pop_front"},"args":[{"id":9,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":10,"debug_name":null},{"id":11,"debug_name":null}]},{"target":{"Statement":241},"results":[{"id":12,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":86,"debug_name":"enum_init>, 0>"},"args":[{"id":11,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":13,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":96,"debug_name":"store_temp>>"},"args":[{"id":10,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":5,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":97,"debug_name":"store_temp>>"},"args":[{"id":13,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":14,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":70,"debug_name":"jump"},"args":[],"branches":[{"target":{"Statement":246},"results":[]}]}},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":52,"debug_name":"struct_construct"},"args":[],"branches":[{"target":"Fallthrough","results":[{"id":15,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":85,"debug_name":"enum_init>, 1>"},"args":[{"id":15,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":16,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":96,"debug_name":"store_temp>>"},"args":[{"id":12,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":5,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":97,"debug_name":"store_temp>>"},"args":[{"id":16,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":14,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":98,"debug_name":"store_local>>"},"args":[{"id":6,"debug_name":null},{"id":5,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":5,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":61,"debug_name":"struct_construct>"},"args":[{"id":5,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":17,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":84,"debug_name":"enum_match>>"},"args":[{"id":14,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":18,"debug_name":null}]},{"target":{"Statement":277},"results":[{"id":19,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":83,"debug_name":"unbox"},"args":[{"id":18,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":7,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":99,"debug_name":"store_local"},"args":[{"id":8,"debug_name":null},{"id":7,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":7,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":92,"debug_name":"dup"},"args":[{"id":7,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":7,"debug_name":null},{"id":20,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":82,"debug_name":"struct_deconstruct"},"args":[{"id":20,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":21,"debug_name":null},{"id":22,"debug_name":null},{"id":23,"debug_name":null},{"id":24,"debug_name":null},{"id":25,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":21,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":22,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":24,"debug_name":"drop>"},"args":[{"id":23,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":24,"debug_name":"drop>"},"args":[{"id":25,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":93,"debug_name":"rename>"},"args":[{"id":24,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":26,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":40,"debug_name":"store_temp>"},"args":[{"id":2,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":2,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":37,"debug_name":"store_temp>"},"args":[{"id":26,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":26,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":81,"debug_name":"function_call::append_span::, core::felt252Drop>>"},"args":[{"id":2,"debug_name":null},{"id":26,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":3,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":82,"debug_name":"struct_deconstruct"},"args":[{"id":7,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":27,"debug_name":null},{"id":28,"debug_name":null},{"id":29,"debug_name":null},{"id":30,"debug_name":null},{"id":31,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":27,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":28,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":24,"debug_name":"drop>"},"args":[{"id":29,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":24,"debug_name":"drop>"},"args":[{"id":30,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":93,"debug_name":"rename>"},"args":[{"id":31,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":32,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":40,"debug_name":"store_temp>"},"args":[{"id":1,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":1,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":37,"debug_name":"store_temp>"},"args":[{"id":32,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":32,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":100,"debug_name":"store_local>"},"args":[{"id":4,"debug_name":null},{"id":3,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":3,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":81,"debug_name":"function_call::append_span::, core::felt252Drop>>"},"args":[{"id":1,"debug_name":null},{"id":32,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":33,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":39,"debug_name":"store_temp>"},"args":[{"id":17,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":17,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":40,"debug_name":"store_temp>"},"args":[{"id":33,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":33,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":40,"debug_name":"store_temp>"},"args":[{"id":3,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":3,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":11,"debug_name":"function_call"},"args":[{"id":17,"debug_name":null},{"id":33,"debug_name":null},{"id":3,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":34,"debug_name":null},{"id":35,"debug_name":null},{"id":36,"debug_name":null}]}]}},{"Return":[{"id":34,"debug_name":null},{"id":35,"debug_name":null},{"id":36,"debug_name":null}]},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":33,"debug_name":"drop"},"args":[{"id":19,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":94,"debug_name":"drop>>"},"args":[{"id":4,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":95,"debug_name":"drop>"},"args":[{"id":8,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":39,"debug_name":"store_temp>"},"args":[{"id":17,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":17,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":40,"debug_name":"store_temp>"},"args":[{"id":2,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":2,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":40,"debug_name":"store_temp>"},"args":[{"id":1,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":1,"debug_name":null}]}]}},{"Return":[{"id":17,"debug_name":null},{"id":2,"debug_name":null},{"id":1,"debug_name":null}]},{"Invocation":{"libfunc_id":{"id":20,"debug_name":"disable_ap_tracking"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":105,"debug_name":"dup"},"args":[{"id":0,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":0,"debug_name":null},{"id":2,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":104,"debug_name":"struct_deconstruct"},"args":[{"id":2,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":3,"debug_name":null},{"id":4,"debug_name":null},{"id":5,"debug_name":null},{"id":6,"debug_name":null},{"id":7,"debug_name":null},{"id":8,"debug_name":null},{"id":9,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":4,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":5,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":6,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":7,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":24,"debug_name":"drop>"},"args":[{"id":8,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":24,"debug_name":"drop>"},"args":[{"id":9,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":71,"debug_name":"rename"},"args":[{"id":3,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":10,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":3,"debug_name":"array_append"},"args":[{"id":1,"debug_name":null},{"id":10,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":11,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":105,"debug_name":"dup"},"args":[{"id":0,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":0,"debug_name":null},{"id":12,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":104,"debug_name":"struct_deconstruct"},"args":[{"id":12,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":13,"debug_name":null},{"id":14,"debug_name":null},{"id":15,"debug_name":null},{"id":16,"debug_name":null},{"id":17,"debug_name":null},{"id":18,"debug_name":null},{"id":19,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":13,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":15,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":16,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":17,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":24,"debug_name":"drop>"},"args":[{"id":18,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":24,"debug_name":"drop>"},"args":[{"id":19,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":71,"debug_name":"rename"},"args":[{"id":14,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":20,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":3,"debug_name":"array_append"},"args":[{"id":11,"debug_name":null},{"id":20,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":21,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":105,"debug_name":"dup"},"args":[{"id":0,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":0,"debug_name":null},{"id":22,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":104,"debug_name":"struct_deconstruct"},"args":[{"id":22,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":23,"debug_name":null},{"id":24,"debug_name":null},{"id":25,"debug_name":null},{"id":26,"debug_name":null},{"id":27,"debug_name":null},{"id":28,"debug_name":null},{"id":29,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":23,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":24,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":26,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":27,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":24,"debug_name":"drop>"},"args":[{"id":28,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":24,"debug_name":"drop>"},"args":[{"id":29,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":71,"debug_name":"rename"},"args":[{"id":25,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":30,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":3,"debug_name":"array_append"},"args":[{"id":21,"debug_name":null},{"id":30,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":31,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":105,"debug_name":"dup"},"args":[{"id":0,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":0,"debug_name":null},{"id":32,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":104,"debug_name":"struct_deconstruct"},"args":[{"id":32,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":33,"debug_name":null},{"id":34,"debug_name":null},{"id":35,"debug_name":null},{"id":36,"debug_name":null},{"id":37,"debug_name":null},{"id":38,"debug_name":null},{"id":39,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":33,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":34,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":35,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":37,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":24,"debug_name":"drop>"},"args":[{"id":38,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":24,"debug_name":"drop>"},"args":[{"id":39,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":71,"debug_name":"rename"},"args":[{"id":36,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":40,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":3,"debug_name":"array_append"},"args":[{"id":31,"debug_name":null},{"id":40,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":41,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":105,"debug_name":"dup"},"args":[{"id":0,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":0,"debug_name":null},{"id":42,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":104,"debug_name":"struct_deconstruct"},"args":[{"id":42,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":43,"debug_name":null},{"id":44,"debug_name":null},{"id":45,"debug_name":null},{"id":46,"debug_name":null},{"id":47,"debug_name":null},{"id":48,"debug_name":null},{"id":49,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":43,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":44,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":45,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":46,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":24,"debug_name":"drop>"},"args":[{"id":48,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":24,"debug_name":"drop>"},"args":[{"id":49,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":71,"debug_name":"rename"},"args":[{"id":47,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":50,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":3,"debug_name":"array_append"},"args":[{"id":41,"debug_name":null},{"id":50,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":51,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":105,"debug_name":"dup"},"args":[{"id":0,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":0,"debug_name":null},{"id":52,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":104,"debug_name":"struct_deconstruct"},"args":[{"id":52,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":53,"debug_name":null},{"id":54,"debug_name":null},{"id":55,"debug_name":null},{"id":56,"debug_name":null},{"id":57,"debug_name":null},{"id":58,"debug_name":null},{"id":59,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":53,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":54,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":55,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":56,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":57,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":24,"debug_name":"drop>"},"args":[{"id":59,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":106,"debug_name":"dup>"},"args":[{"id":58,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":58,"debug_name":null},{"id":60,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":93,"debug_name":"rename>"},"args":[{"id":60,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":61,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":59,"debug_name":"struct_deconstruct>"},"args":[{"id":61,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":62,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":103,"debug_name":"array_len"},"args":[{"id":62,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":63,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":102,"debug_name":"u32_to_felt252"},"args":[{"id":63,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":64,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":44,"debug_name":"store_temp"},"args":[{"id":64,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":64,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":3,"debug_name":"array_append"},"args":[{"id":51,"debug_name":null},{"id":64,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":65,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":93,"debug_name":"rename>"},"args":[{"id":58,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":66,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":37,"debug_name":"store_temp>"},"args":[{"id":66,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":66,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":40,"debug_name":"store_temp>"},"args":[{"id":65,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":65,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":101,"debug_name":"function_call>"},"args":[{"id":66,"debug_name":null},{"id":65,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":67,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":104,"debug_name":"struct_deconstruct"},"args":[{"id":0,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":68,"debug_name":null},{"id":69,"debug_name":null},{"id":70,"debug_name":null},{"id":71,"debug_name":null},{"id":72,"debug_name":null},{"id":73,"debug_name":null},{"id":74,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":68,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":69,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":70,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":71,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":72,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":24,"debug_name":"drop>"},"args":[{"id":73,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":106,"debug_name":"dup>"},"args":[{"id":74,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":74,"debug_name":null},{"id":75,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":93,"debug_name":"rename>"},"args":[{"id":75,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":76,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":59,"debug_name":"struct_deconstruct>"},"args":[{"id":76,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":77,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":103,"debug_name":"array_len"},"args":[{"id":77,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":78,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":102,"debug_name":"u32_to_felt252"},"args":[{"id":78,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":79,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":44,"debug_name":"store_temp"},"args":[{"id":79,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":79,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":3,"debug_name":"array_append"},"args":[{"id":67,"debug_name":null},{"id":79,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":80,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":93,"debug_name":"rename>"},"args":[{"id":74,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":81,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":37,"debug_name":"store_temp>"},"args":[{"id":81,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":81,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":40,"debug_name":"store_temp>"},"args":[{"id":80,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":80,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":101,"debug_name":"function_call>"},"args":[{"id":81,"debug_name":null},{"id":80,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":82,"debug_name":null}]}]}},{"Return":[{"id":82,"debug_name":null}]},{"Invocation":{"libfunc_id":{"id":20,"debug_name":"disable_ap_tracking"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":28,"debug_name":"dup"},"args":[{"id":3,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":3,"debug_name":null},{"id":4,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":146,"debug_name":"felt252_is_zero"},"args":[{"id":4,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]},{"target":{"Statement":385},"results":[{"id":5,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":3,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":145,"debug_name":"enum_init>, 0>"},"args":[{"id":2,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":6,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":109,"debug_name":"struct_construct, core::option::Option::>>>"},"args":[{"id":1,"debug_name":null},{"id":6,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":7,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":108,"debug_name":"enum_init, core::option::Option::>)>, 0>"},"args":[{"id":7,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":8,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":36,"debug_name":"store_temp"},"args":[{"id":0,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":0,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":148,"debug_name":"store_temp, core::option::Option::>)>>"},"args":[{"id":8,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":8,"debug_name":null}]}]}},{"Return":[{"id":0,"debug_name":null},{"id":8,"debug_name":null}]},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":147,"debug_name":"drop>"},"args":[{"id":5,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":36,"debug_name":"store_temp"},"args":[{"id":0,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":0,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":37,"debug_name":"store_temp>"},"args":[{"id":1,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":1,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":116,"debug_name":"function_call"},"args":[{"id":0,"debug_name":null},{"id":1,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":9,"debug_name":null},{"id":10,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":115,"debug_name":"enum_match, core::option::Option::)>>"},"args":[{"id":10,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":11,"debug_name":null}]},{"target":{"Statement":413},"results":[{"id":12,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":114,"debug_name":"struct_deconstruct, core::option::Option::>>"},"args":[{"id":11,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":13,"debug_name":null},{"id":14,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":113,"debug_name":"enum_match>"},"args":[{"id":14,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":15,"debug_name":null}]},{"target":{"Statement":404},"results":[{"id":16,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":112,"debug_name":"array_append"},"args":[{"id":2,"debug_name":null},{"id":15,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":17,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":27,"debug_name":"const_as_immediate>"},"args":[],"branches":[{"target":"Fallthrough","results":[{"id":18,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":111,"debug_name":"felt252_sub"},"args":[{"id":3,"debug_name":null},{"id":18,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":19,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":36,"debug_name":"store_temp"},"args":[{"id":9,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":9,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":37,"debug_name":"store_temp>"},"args":[{"id":13,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":13,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":77,"debug_name":"store_temp>"},"args":[{"id":17,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":17,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":44,"debug_name":"store_temp"},"args":[{"id":19,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":19,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":65,"debug_name":"function_call>"},"args":[{"id":9,"debug_name":null},{"id":13,"debug_name":null},{"id":17,"debug_name":null},{"id":19,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":20,"debug_name":null},{"id":21,"debug_name":null}]}]}},{"Return":[{"id":20,"debug_name":null},{"id":21,"debug_name":null}]},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":3,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":73,"debug_name":"drop>"},"args":[{"id":2,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":110,"debug_name":"enum_init>, 1>"},"args":[{"id":16,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":22,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":109,"debug_name":"struct_construct, core::option::Option::>>>"},"args":[{"id":13,"debug_name":null},{"id":22,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":23,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":108,"debug_name":"enum_init, core::option::Option::>)>, 0>"},"args":[{"id":23,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":24,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":36,"debug_name":"store_temp"},"args":[{"id":9,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":9,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":148,"debug_name":"store_temp, core::option::Option::>)>>"},"args":[{"id":24,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":24,"debug_name":null}]}]}},{"Return":[{"id":9,"debug_name":null},{"id":24,"debug_name":null}]},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":3,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":73,"debug_name":"drop>"},"args":[{"id":2,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":107,"debug_name":"enum_init, core::option::Option::>)>, 1>"},"args":[{"id":12,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":25,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":36,"debug_name":"store_temp"},"args":[{"id":9,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":9,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":148,"debug_name":"store_temp, core::option::Option::>)>>"},"args":[{"id":25,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":25,"debug_name":null}]}]}},{"Return":[{"id":9,"debug_name":null},{"id":25,"debug_name":null}]},{"Invocation":{"libfunc_id":{"id":20,"debug_name":"disable_ap_tracking"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":59,"debug_name":"struct_deconstruct>"},"args":[{"id":1,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":2,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":55,"debug_name":"array_snapshot_pop_front"},"args":[{"id":2,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":3,"debug_name":null},{"id":4,"debug_name":null}]},{"target":{"Statement":428},"results":[{"id":5,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":69,"debug_name":"enum_init>, 0>"},"args":[{"id":4,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":6,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":75,"debug_name":"store_temp>>"},"args":[{"id":3,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":7,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":76,"debug_name":"store_temp>>"},"args":[{"id":6,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":8,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":70,"debug_name":"jump"},"args":[],"branches":[{"target":{"Statement":433},"results":[]}]}},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":52,"debug_name":"struct_construct"},"args":[],"branches":[{"target":"Fallthrough","results":[{"id":9,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":68,"debug_name":"enum_init>, 1>"},"args":[{"id":9,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":10,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":75,"debug_name":"store_temp>>"},"args":[{"id":5,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":7,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":76,"debug_name":"store_temp>>"},"args":[{"id":10,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":8,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":67,"debug_name":"enum_match>>"},"args":[{"id":8,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":11,"debug_name":null}]},{"target":{"Statement":444},"results":[{"id":12,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":54,"debug_name":"unbox"},"args":[{"id":11,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":13,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":71,"debug_name":"rename"},"args":[{"id":13,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":14,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":44,"debug_name":"store_temp"},"args":[{"id":14,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":14,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":3,"debug_name":"array_append"},"args":[{"id":0,"debug_name":null},{"id":14,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":15,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":9,"debug_name":"struct_construct>"},"args":[{"id":7,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":16,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":40,"debug_name":"store_temp>"},"args":[{"id":15,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":15,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":37,"debug_name":"store_temp>"},"args":[{"id":16,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":16,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":81,"debug_name":"function_call::append_span::, core::felt252Drop>>"},"args":[{"id":15,"debug_name":null},{"id":16,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":17,"debug_name":null}]}]}},{"Return":[{"id":17,"debug_name":null}]},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":33,"debug_name":"drop"},"args":[{"id":12,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":138,"debug_name":"drop>>"},"args":[{"id":7,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":40,"debug_name":"store_temp>"},"args":[{"id":0,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":0,"debug_name":null}]}]}},{"Return":[{"id":0,"debug_name":null}]},{"Invocation":{"libfunc_id":{"id":20,"debug_name":"disable_ap_tracking"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":59,"debug_name":"struct_deconstruct>"},"args":[{"id":0,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":2,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":55,"debug_name":"array_snapshot_pop_front"},"args":[{"id":2,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":3,"debug_name":null},{"id":4,"debug_name":null}]},{"target":{"Statement":457},"results":[{"id":5,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":69,"debug_name":"enum_init>, 0>"},"args":[{"id":4,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":6,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":75,"debug_name":"store_temp>>"},"args":[{"id":3,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":7,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":76,"debug_name":"store_temp>>"},"args":[{"id":6,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":8,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":70,"debug_name":"jump"},"args":[],"branches":[{"target":{"Statement":462},"results":[]}]}},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":52,"debug_name":"struct_construct"},"args":[],"branches":[{"target":"Fallthrough","results":[{"id":9,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":68,"debug_name":"enum_init>, 1>"},"args":[{"id":9,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":10,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":75,"debug_name":"store_temp>>"},"args":[{"id":5,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":7,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":76,"debug_name":"store_temp>>"},"args":[{"id":10,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":8,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":67,"debug_name":"enum_match>>"},"args":[{"id":8,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":11,"debug_name":null}]},{"target":{"Statement":473},"results":[{"id":12,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":54,"debug_name":"unbox"},"args":[{"id":11,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":13,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":71,"debug_name":"rename"},"args":[{"id":13,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":14,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":44,"debug_name":"store_temp"},"args":[{"id":14,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":14,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":3,"debug_name":"array_append"},"args":[{"id":1,"debug_name":null},{"id":14,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":15,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":9,"debug_name":"struct_construct>"},"args":[{"id":7,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":16,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":37,"debug_name":"store_temp>"},"args":[{"id":16,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":16,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":40,"debug_name":"store_temp>"},"args":[{"id":15,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":15,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":101,"debug_name":"function_call>"},"args":[{"id":16,"debug_name":null},{"id":15,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":17,"debug_name":null}]}]}},{"Return":[{"id":17,"debug_name":null}]},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":33,"debug_name":"drop"},"args":[{"id":12,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":138,"debug_name":"drop>>"},"args":[{"id":7,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":40,"debug_name":"store_temp>"},"args":[{"id":1,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":1,"debug_name":null}]}]}},{"Return":[{"id":1,"debug_name":null}]},{"Invocation":{"libfunc_id":{"id":59,"debug_name":"struct_deconstruct>"},"args":[{"id":1,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":2,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":55,"debug_name":"array_snapshot_pop_front"},"args":[{"id":2,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":3,"debug_name":null},{"id":4,"debug_name":null}]},{"target":{"Statement":487},"results":[{"id":5,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":54,"debug_name":"unbox"},"args":[{"id":4,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":6,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":71,"debug_name":"rename"},"args":[{"id":6,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":7,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":53,"debug_name":"enum_init, 0>"},"args":[{"id":7,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":8,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":75,"debug_name":"store_temp>>"},"args":[{"id":3,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":9,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":80,"debug_name":"store_temp>"},"args":[{"id":8,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":10,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":70,"debug_name":"jump"},"args":[],"branches":[{"target":{"Statement":492},"results":[]}]}},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":52,"debug_name":"struct_construct"},"args":[],"branches":[{"target":"Fallthrough","results":[{"id":11,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":51,"debug_name":"enum_init, 1>"},"args":[{"id":11,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":12,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":75,"debug_name":"store_temp>>"},"args":[{"id":5,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":9,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":80,"debug_name":"store_temp>"},"args":[{"id":12,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":10,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":50,"debug_name":"enum_match>"},"args":[{"id":10,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":13,"debug_name":null}]},{"target":{"Statement":603},"results":[{"id":14,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":55,"debug_name":"array_snapshot_pop_front"},"args":[{"id":9,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":15,"debug_name":null},{"id":16,"debug_name":null}]},{"target":{"Statement":502},"results":[{"id":17,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":54,"debug_name":"unbox"},"args":[{"id":16,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":18,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":71,"debug_name":"rename"},"args":[{"id":18,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":19,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":53,"debug_name":"enum_init, 0>"},"args":[{"id":19,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":20,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":75,"debug_name":"store_temp>>"},"args":[{"id":15,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":21,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":80,"debug_name":"store_temp>"},"args":[{"id":20,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":22,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":70,"debug_name":"jump"},"args":[],"branches":[{"target":{"Statement":507},"results":[]}]}},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":52,"debug_name":"struct_construct"},"args":[],"branches":[{"target":"Fallthrough","results":[{"id":23,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":51,"debug_name":"enum_init, 1>"},"args":[{"id":23,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":24,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":75,"debug_name":"store_temp>>"},"args":[{"id":17,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":21,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":80,"debug_name":"store_temp>"},"args":[{"id":24,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":22,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":9,"debug_name":"struct_construct>"},"args":[{"id":21,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":25,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":50,"debug_name":"enum_match>"},"args":[{"id":22,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":26,"debug_name":null}]},{"target":{"Statement":595},"results":[{"id":27,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":36,"debug_name":"store_temp"},"args":[{"id":0,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":0,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":37,"debug_name":"store_temp>"},"args":[{"id":25,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":25,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":126,"debug_name":"function_call"},"args":[{"id":0,"debug_name":null},{"id":25,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":28,"debug_name":null},{"id":29,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":125,"debug_name":"enum_match, core::option::Option::>)>>"},"args":[{"id":29,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":30,"debug_name":null}]},{"target":{"Statement":588},"results":[{"id":31,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":124,"debug_name":"struct_deconstruct, core::option::Option::>>>"},"args":[{"id":30,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":32,"debug_name":null},{"id":33,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":123,"debug_name":"enum_match>>"},"args":[{"id":33,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":34,"debug_name":null}]},{"target":{"Statement":579},"results":[{"id":35,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":36,"debug_name":"store_temp"},"args":[{"id":28,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":28,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":37,"debug_name":"store_temp>"},"args":[{"id":32,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":32,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":126,"debug_name":"function_call"},"args":[{"id":28,"debug_name":null},{"id":32,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":36,"debug_name":null},{"id":37,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":125,"debug_name":"enum_match, core::option::Option::>)>>"},"args":[{"id":37,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":38,"debug_name":null}]},{"target":{"Statement":571},"results":[{"id":39,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":124,"debug_name":"struct_deconstruct, core::option::Option::>>>"},"args":[{"id":38,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":40,"debug_name":null},{"id":41,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":123,"debug_name":"enum_match>>"},"args":[{"id":41,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":42,"debug_name":null}]},{"target":{"Statement":561},"results":[{"id":43,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":36,"debug_name":"store_temp"},"args":[{"id":36,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":36,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":37,"debug_name":"store_temp>"},"args":[{"id":40,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":40,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":126,"debug_name":"function_call"},"args":[{"id":36,"debug_name":null},{"id":40,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":44,"debug_name":null},{"id":45,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":125,"debug_name":"enum_match, core::option::Option::>)>>"},"args":[{"id":45,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":46,"debug_name":null}]},{"target":{"Statement":552},"results":[{"id":47,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":124,"debug_name":"struct_deconstruct, core::option::Option::>>>"},"args":[{"id":46,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":48,"debug_name":null},{"id":49,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":123,"debug_name":"enum_match>>"},"args":[{"id":49,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":50,"debug_name":null}]},{"target":{"Statement":541},"results":[{"id":51,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":122,"debug_name":"struct_construct"},"args":[{"id":13,"debug_name":null},{"id":26,"debug_name":null},{"id":34,"debug_name":null},{"id":42,"debug_name":null},{"id":50,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":52,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":121,"debug_name":"enum_init, 0>"},"args":[{"id":52,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":53,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":118,"debug_name":"struct_construct, core::option::Option::>>"},"args":[{"id":48,"debug_name":null},{"id":53,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":54,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":117,"debug_name":"enum_init, core::option::Option::)>, 0>"},"args":[{"id":54,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":55,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":36,"debug_name":"store_temp"},"args":[{"id":44,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":44,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":144,"debug_name":"store_temp, core::option::Option::)>>"},"args":[{"id":55,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":55,"debug_name":null}]}]}},{"Return":[{"id":44,"debug_name":null},{"id":55,"debug_name":null}]},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":13,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":24,"debug_name":"drop>"},"args":[{"id":42,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":24,"debug_name":"drop>"},"args":[{"id":34,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":26,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":119,"debug_name":"enum_init, 1>"},"args":[{"id":51,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":56,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":118,"debug_name":"struct_construct, core::option::Option::>>"},"args":[{"id":48,"debug_name":null},{"id":56,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":57,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":117,"debug_name":"enum_init, core::option::Option::)>, 0>"},"args":[{"id":57,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":58,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":36,"debug_name":"store_temp"},"args":[{"id":44,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":44,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":144,"debug_name":"store_temp, core::option::Option::)>>"},"args":[{"id":58,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":58,"debug_name":null}]}]}},{"Return":[{"id":44,"debug_name":null},{"id":58,"debug_name":null}]},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":26,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":13,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":24,"debug_name":"drop>"},"args":[{"id":42,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":24,"debug_name":"drop>"},"args":[{"id":34,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":120,"debug_name":"enum_init, core::option::Option::)>, 1>"},"args":[{"id":47,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":59,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":36,"debug_name":"store_temp"},"args":[{"id":44,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":44,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":144,"debug_name":"store_temp, core::option::Option::)>>"},"args":[{"id":59,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":59,"debug_name":null}]}]}},{"Return":[{"id":44,"debug_name":null},{"id":59,"debug_name":null}]},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":24,"debug_name":"drop>"},"args":[{"id":34,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":26,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":13,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":119,"debug_name":"enum_init, 1>"},"args":[{"id":43,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":60,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":118,"debug_name":"struct_construct, core::option::Option::>>"},"args":[{"id":40,"debug_name":null},{"id":60,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":61,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":117,"debug_name":"enum_init, core::option::Option::)>, 0>"},"args":[{"id":61,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":62,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":36,"debug_name":"store_temp"},"args":[{"id":36,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":36,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":144,"debug_name":"store_temp, core::option::Option::)>>"},"args":[{"id":62,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":62,"debug_name":null}]}]}},{"Return":[{"id":36,"debug_name":null},{"id":62,"debug_name":null}]},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":24,"debug_name":"drop>"},"args":[{"id":34,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":26,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":13,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":120,"debug_name":"enum_init, core::option::Option::)>, 1>"},"args":[{"id":39,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":63,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":36,"debug_name":"store_temp"},"args":[{"id":36,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":36,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":144,"debug_name":"store_temp, core::option::Option::)>>"},"args":[{"id":63,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":63,"debug_name":null}]}]}},{"Return":[{"id":36,"debug_name":null},{"id":63,"debug_name":null}]},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":26,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":13,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":119,"debug_name":"enum_init, 1>"},"args":[{"id":35,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":64,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":118,"debug_name":"struct_construct, core::option::Option::>>"},"args":[{"id":32,"debug_name":null},{"id":64,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":65,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":117,"debug_name":"enum_init, core::option::Option::)>, 0>"},"args":[{"id":65,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":66,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":36,"debug_name":"store_temp"},"args":[{"id":28,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":28,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":144,"debug_name":"store_temp, core::option::Option::)>>"},"args":[{"id":66,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":66,"debug_name":null}]}]}},{"Return":[{"id":28,"debug_name":null},{"id":66,"debug_name":null}]},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":26,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":13,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":120,"debug_name":"enum_init, core::option::Option::)>, 1>"},"args":[{"id":31,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":67,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":36,"debug_name":"store_temp"},"args":[{"id":28,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":28,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":144,"debug_name":"store_temp, core::option::Option::)>>"},"args":[{"id":67,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":67,"debug_name":null}]}]}},{"Return":[{"id":28,"debug_name":null},{"id":67,"debug_name":null}]},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":25,"debug_name":"drop"},"args":[{"id":13,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":119,"debug_name":"enum_init, 1>"},"args":[{"id":27,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":68,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":118,"debug_name":"struct_construct, core::option::Option::>>"},"args":[{"id":25,"debug_name":null},{"id":68,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":69,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":117,"debug_name":"enum_init, core::option::Option::)>, 0>"},"args":[{"id":69,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":70,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":36,"debug_name":"store_temp"},"args":[{"id":0,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":0,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":144,"debug_name":"store_temp, core::option::Option::)>>"},"args":[{"id":70,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":70,"debug_name":null}]}]}},{"Return":[{"id":0,"debug_name":null},{"id":70,"debug_name":null}]},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":9,"debug_name":"struct_construct>"},"args":[{"id":9,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":71,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":119,"debug_name":"enum_init, 1>"},"args":[{"id":14,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":72,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":118,"debug_name":"struct_construct, core::option::Option::>>"},"args":[{"id":71,"debug_name":null},{"id":72,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":73,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":117,"debug_name":"enum_init, core::option::Option::)>, 0>"},"args":[{"id":73,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":74,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":36,"debug_name":"store_temp"},"args":[{"id":0,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":0,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":144,"debug_name":"store_temp, core::option::Option::)>>"},"args":[{"id":74,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":74,"debug_name":null}]}]}},{"Return":[{"id":0,"debug_name":null},{"id":74,"debug_name":null}]},{"Invocation":{"libfunc_id":{"id":59,"debug_name":"struct_deconstruct>"},"args":[{"id":1,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":2,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":55,"debug_name":"array_snapshot_pop_front"},"args":[{"id":2,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":3,"debug_name":null},{"id":4,"debug_name":null}]},{"target":{"Statement":618},"results":[{"id":5,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":69,"debug_name":"enum_init>, 0>"},"args":[{"id":4,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":6,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":75,"debug_name":"store_temp>>"},"args":[{"id":3,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":7,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":76,"debug_name":"store_temp>>"},"args":[{"id":6,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":8,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":70,"debug_name":"jump"},"args":[],"branches":[{"target":{"Statement":623},"results":[]}]}},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":52,"debug_name":"struct_construct"},"args":[],"branches":[{"target":"Fallthrough","results":[{"id":9,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":68,"debug_name":"enum_init>, 1>"},"args":[{"id":9,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":10,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":75,"debug_name":"store_temp>>"},"args":[{"id":5,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":7,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":76,"debug_name":"store_temp>>"},"args":[{"id":10,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":8,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":135,"debug_name":"dup>>"},"args":[{"id":7,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":7,"debug_name":null},{"id":11,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":9,"debug_name":"struct_construct>"},"args":[{"id":11,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":12,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":67,"debug_name":"enum_match>>"},"args":[{"id":8,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":13,"debug_name":null}]},{"target":{"Statement":705},"results":[{"id":14,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":54,"debug_name":"unbox"},"args":[{"id":13,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":15,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":71,"debug_name":"rename"},"args":[{"id":15,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":16,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":44,"debug_name":"store_temp"},"args":[{"id":16,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":16,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":134,"debug_name":"u32_try_from_felt252"},"args":[{"id":0,"debug_name":null},{"id":16,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":17,"debug_name":null},{"id":18,"debug_name":null}]},{"target":{"Statement":696},"results":[{"id":19,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":24,"debug_name":"drop>"},"args":[{"id":12,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":136,"debug_name":"const_as_immediate>"},"args":[],"branches":[{"target":"Fallthrough","results":[{"id":20,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":135,"debug_name":"dup>>"},"args":[{"id":7,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":7,"debug_name":null},{"id":21,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":137,"debug_name":"dup"},"args":[{"id":18,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":18,"debug_name":null},{"id":22,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":142,"debug_name":"store_temp"},"args":[{"id":20,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":20,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":132,"debug_name":"array_slice"},"args":[{"id":17,"debug_name":null},{"id":21,"debug_name":null},{"id":20,"debug_name":null},{"id":22,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":23,"debug_name":null},{"id":24,"debug_name":null}]},{"target":{"Statement":683},"results":[{"id":25,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":135,"debug_name":"dup>>"},"args":[{"id":7,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":7,"debug_name":null},{"id":26,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":103,"debug_name":"array_len"},"args":[{"id":26,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":27,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":137,"debug_name":"dup"},"args":[{"id":18,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":18,"debug_name":null},{"id":28,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":142,"debug_name":"store_temp"},"args":[{"id":27,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":27,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":75,"debug_name":"store_temp>>"},"args":[{"id":24,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":24,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":133,"debug_name":"u32_overflowing_sub"},"args":[{"id":23,"debug_name":null},{"id":27,"debug_name":null},{"id":28,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":29,"debug_name":null},{"id":30,"debug_name":null}]},{"target":{"Statement":668},"results":[{"id":31,"debug_name":null},{"id":32,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":132,"debug_name":"array_slice"},"args":[{"id":29,"debug_name":null},{"id":7,"debug_name":null},{"id":18,"debug_name":null},{"id":30,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":33,"debug_name":null},{"id":34,"debug_name":null}]},{"target":{"Statement":656},"results":[{"id":35,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":9,"debug_name":"struct_construct>"},"args":[{"id":24,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":36,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":131,"debug_name":"enum_init>, 0>"},"args":[{"id":36,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":37,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":9,"debug_name":"struct_construct>"},"args":[{"id":34,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":38,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":128,"debug_name":"struct_construct, core::option::Option::>>>"},"args":[{"id":38,"debug_name":null},{"id":37,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":39,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":127,"debug_name":"enum_init, core::option::Option::>)>, 0>"},"args":[{"id":39,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":40,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":36,"debug_name":"store_temp"},"args":[{"id":33,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":33,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":143,"debug_name":"store_temp, core::option::Option::>)>>"},"args":[{"id":40,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":40,"debug_name":null}]}]}},{"Return":[{"id":33,"debug_name":null},{"id":40,"debug_name":null}]},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":138,"debug_name":"drop>>"},"args":[{"id":24,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":4,"debug_name":"array_new"},"args":[],"branches":[{"target":"Fallthrough","results":[{"id":41,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":139,"debug_name":"const_as_immediate>"},"args":[],"branches":[{"target":"Fallthrough","results":[{"id":42,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":44,"debug_name":"store_temp"},"args":[{"id":42,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":42,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":3,"debug_name":"array_append"},"args":[{"id":41,"debug_name":null},{"id":42,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":43,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":2,"debug_name":"struct_construct"},"args":[],"branches":[{"target":"Fallthrough","results":[{"id":44,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":1,"debug_name":"struct_construct>>"},"args":[{"id":44,"debug_name":null},{"id":43,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":45,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":130,"debug_name":"enum_init, core::option::Option::>)>, 1>"},"args":[{"id":45,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":46,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":36,"debug_name":"store_temp"},"args":[{"id":35,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":35,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":143,"debug_name":"store_temp, core::option::Option::>)>>"},"args":[{"id":46,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":46,"debug_name":null}]}]}},{"Return":[{"id":35,"debug_name":null},{"id":46,"debug_name":null}]},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":140,"debug_name":"drop"},"args":[{"id":32,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":138,"debug_name":"drop>>"},"args":[{"id":24,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":138,"debug_name":"drop>>"},"args":[{"id":7,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":140,"debug_name":"drop"},"args":[{"id":18,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":4,"debug_name":"array_new"},"args":[],"branches":[{"target":"Fallthrough","results":[{"id":47,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":141,"debug_name":"const_as_immediate>"},"args":[],"branches":[{"target":"Fallthrough","results":[{"id":48,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":44,"debug_name":"store_temp"},"args":[{"id":48,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":48,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":3,"debug_name":"array_append"},"args":[{"id":47,"debug_name":null},{"id":48,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":49,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":2,"debug_name":"struct_construct"},"args":[],"branches":[{"target":"Fallthrough","results":[{"id":50,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":1,"debug_name":"struct_construct>>"},"args":[{"id":50,"debug_name":null},{"id":49,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":51,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":130,"debug_name":"enum_init, core::option::Option::>)>, 1>"},"args":[{"id":51,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":52,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":36,"debug_name":"store_temp"},"args":[{"id":31,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":31,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":143,"debug_name":"store_temp, core::option::Option::>)>>"},"args":[{"id":52,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":52,"debug_name":null}]}]}},{"Return":[{"id":31,"debug_name":null},{"id":52,"debug_name":null}]},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":140,"debug_name":"drop"},"args":[{"id":18,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":138,"debug_name":"drop>>"},"args":[{"id":7,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":4,"debug_name":"array_new"},"args":[],"branches":[{"target":"Fallthrough","results":[{"id":53,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":139,"debug_name":"const_as_immediate>"},"args":[],"branches":[{"target":"Fallthrough","results":[{"id":54,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":44,"debug_name":"store_temp"},"args":[{"id":54,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":54,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":3,"debug_name":"array_append"},"args":[{"id":53,"debug_name":null},{"id":54,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":55,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":2,"debug_name":"struct_construct"},"args":[],"branches":[{"target":"Fallthrough","results":[{"id":56,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":1,"debug_name":"struct_construct>>"},"args":[{"id":56,"debug_name":null},{"id":55,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":57,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":130,"debug_name":"enum_init, core::option::Option::>)>, 1>"},"args":[{"id":57,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":58,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":36,"debug_name":"store_temp"},"args":[{"id":25,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":25,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":143,"debug_name":"store_temp, core::option::Option::>)>>"},"args":[{"id":58,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":58,"debug_name":null}]}]}},{"Return":[{"id":25,"debug_name":null},{"id":58,"debug_name":null}]},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":138,"debug_name":"drop>>"},"args":[{"id":7,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":52,"debug_name":"struct_construct"},"args":[],"branches":[{"target":"Fallthrough","results":[{"id":59,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":129,"debug_name":"enum_init>, 1>"},"args":[{"id":59,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":60,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":128,"debug_name":"struct_construct, core::option::Option::>>>"},"args":[{"id":12,"debug_name":null},{"id":60,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":61,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":127,"debug_name":"enum_init, core::option::Option::>)>, 0>"},"args":[{"id":61,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":62,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":36,"debug_name":"store_temp"},"args":[{"id":19,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":19,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":143,"debug_name":"store_temp, core::option::Option::>)>>"},"args":[{"id":62,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":62,"debug_name":null}]}]}},{"Return":[{"id":19,"debug_name":null},{"id":62,"debug_name":null}]},{"Invocation":{"libfunc_id":{"id":23,"debug_name":"branch_align"},"args":[],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":33,"debug_name":"drop"},"args":[{"id":14,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":138,"debug_name":"drop>>"},"args":[{"id":7,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[]}]}},{"Invocation":{"libfunc_id":{"id":52,"debug_name":"struct_construct"},"args":[],"branches":[{"target":"Fallthrough","results":[{"id":63,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":129,"debug_name":"enum_init>, 1>"},"args":[{"id":63,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":64,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":128,"debug_name":"struct_construct, core::option::Option::>>>"},"args":[{"id":12,"debug_name":null},{"id":64,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":65,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":127,"debug_name":"enum_init, core::option::Option::>)>, 0>"},"args":[{"id":65,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":66,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":36,"debug_name":"store_temp"},"args":[{"id":0,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":0,"debug_name":null}]}]}},{"Invocation":{"libfunc_id":{"id":143,"debug_name":"store_temp, core::option::Option::>)>>"},"args":[{"id":66,"debug_name":null}],"branches":[{"target":"Fallthrough","results":[{"id":66,"debug_name":null}]}]}},{"Return":[{"id":0,"debug_name":null},{"id":66,"debug_name":null}]}],"funcs":[{"id":{"id":3,"debug_name":"batcher::main"},"signature":{"param_types":[{"id":0,"debug_name":"RangeCheck"},{"id":2,"debug_name":"Array"}],"ret_types":[{"id":0,"debug_name":"RangeCheck"},{"id":18,"debug_name":"core::panics::PanicResult::<(core::array::Array::,)>"}]},"params":[{"id":{"id":0,"debug_name":null},"ty":{"id":0,"debug_name":"RangeCheck"}},{"id":{"id":1,"debug_name":null},"ty":{"id":2,"debug_name":"Array"}}],"entry_point":0},{"id":{"id":2,"debug_name":"batcher::ProgramInputSerde::deserialize"},"signature":{"param_types":[{"id":0,"debug_name":"RangeCheck"},{"id":4,"debug_name":"core::array::Span::"}],"ret_types":[{"id":0,"debug_name":"RangeCheck"},{"id":15,"debug_name":"core::panics::PanicResult::<(core::array::Span::, core::option::Option::)>"}]},"params":[{"id":{"id":0,"debug_name":null},"ty":{"id":0,"debug_name":"RangeCheck"}},{"id":{"id":1,"debug_name":null},"ty":{"id":4,"debug_name":"core::array::Span::"}}],"entry_point":75},{"id":{"id":1,"debug_name":"batcher::main[expr31]"},"signature":{"param_types":[{"id":8,"debug_name":"core::array::Span::"},{"id":2,"debug_name":"Array"},{"id":2,"debug_name":"Array"}],"ret_types":[{"id":8,"debug_name":"core::array::Span::"},{"id":2,"debug_name":"Array"},{"id":2,"debug_name":"Array"}]},"params":[{"id":{"id":0,"debug_name":null},"ty":{"id":8,"debug_name":"core::array::Span::"}},{"id":{"id":1,"debug_name":null},"ty":{"id":2,"debug_name":"Array"}},{"id":{"id":2,"debug_name":null},"ty":{"id":2,"debug_name":"Array"}}],"entry_point":229},{"id":{"id":0,"debug_name":"batcher::ProgramOutputSerde::serialize"},"signature":{"param_types":[{"id":16,"debug_name":"batcher::ProgramOutput"},{"id":2,"debug_name":"Array"}],"ret_types":[{"id":2,"debug_name":"Array"}]},"params":[{"id":{"id":0,"debug_name":null},"ty":{"id":16,"debug_name":"batcher::ProgramOutput"}},{"id":{"id":1,"debug_name":null},"ty":{"id":2,"debug_name":"Array"}}],"entry_point":285},{"id":{"id":4,"debug_name":"core::array::deserialize_array_helper::"},"signature":{"param_types":[{"id":0,"debug_name":"RangeCheck"},{"id":4,"debug_name":"core::array::Span::"},{"id":6,"debug_name":"Array"},{"id":1,"debug_name":"felt252"}],"ret_types":[{"id":0,"debug_name":"RangeCheck"},{"id":30,"debug_name":"core::panics::PanicResult::<(core::array::Span::, core::option::Option::>)>"}]},"params":[{"id":{"id":0,"debug_name":null},"ty":{"id":0,"debug_name":"RangeCheck"}},{"id":{"id":1,"debug_name":null},"ty":{"id":4,"debug_name":"core::array::Span::"}},{"id":{"id":2,"debug_name":null},"ty":{"id":6,"debug_name":"Array"}},{"id":{"id":3,"debug_name":null},"ty":{"id":1,"debug_name":"felt252"}}],"entry_point":374},{"id":{"id":5,"debug_name":"core::array::ArrayImpl::::append_span::, core::felt252Drop>"},"signature":{"param_types":[{"id":2,"debug_name":"Array"},{"id":4,"debug_name":"core::array::Span::"}],"ret_types":[{"id":2,"debug_name":"Array"}]},"params":[{"id":{"id":0,"debug_name":null},"ty":{"id":2,"debug_name":"Array"}},{"id":{"id":1,"debug_name":null},"ty":{"id":4,"debug_name":"core::array::Span::"}}],"entry_point":420},{"id":{"id":6,"debug_name":"core::array::serialize_array_helper::"},"signature":{"param_types":[{"id":4,"debug_name":"core::array::Span::"},{"id":2,"debug_name":"Array"}],"ret_types":[{"id":2,"debug_name":"Array"}]},"params":[{"id":{"id":0,"debug_name":null},"ty":{"id":4,"debug_name":"core::array::Span::"}},{"id":{"id":1,"debug_name":null},"ty":{"id":2,"debug_name":"Array"}}],"entry_point":449},{"id":{"id":7,"debug_name":"batcher::CallSerde::deserialize"},"signature":{"param_types":[{"id":0,"debug_name":"RangeCheck"},{"id":4,"debug_name":"core::array::Span::"}],"ret_types":[{"id":0,"debug_name":"RangeCheck"},{"id":42,"debug_name":"core::panics::PanicResult::<(core::array::Span::, core::option::Option::)>"}]},"params":[{"id":{"id":0,"debug_name":null},"ty":{"id":0,"debug_name":"RangeCheck"}},{"id":{"id":1,"debug_name":null},"ty":{"id":4,"debug_name":"core::array::Span::"}}],"entry_point":478},{"id":{"id":8,"debug_name":"core::array::SpanFelt252Serde::deserialize"},"signature":{"param_types":[{"id":0,"debug_name":"RangeCheck"},{"id":4,"debug_name":"core::array::Span::"}],"ret_types":[{"id":0,"debug_name":"RangeCheck"},{"id":45,"debug_name":"core::panics::PanicResult::<(core::array::Span::, core::option::Option::>)>"}]},"params":[{"id":{"id":0,"debug_name":null},"ty":{"id":0,"debug_name":"RangeCheck"}},{"id":{"id":1,"debug_name":null},"ty":{"id":4,"debug_name":"core::array::Span::"}}],"entry_point":611}],"debug_info":{"type_names":[],"libfunc_names":[],"user_func_names":[]}} \ No newline at end of file diff --git a/prover/Cargo.toml b/prover/Cargo.toml index f8f47c2..00efcc4 100644 --- a/prover/Cargo.toml +++ b/prover/Cargo.toml @@ -29,4 +29,19 @@ futures.workspace = true async-stream.workspace = true cairo-proof-parser.workspace = true starknet-crypto.workspace = true -anyhow.workspace = true \ No newline at end of file +anyhow.workspace = true +cairo-vm.workspace = true +cairo-lang-sierra.workspace = true + +cairo-lang-sierra-type-size.workspace = true +cairo-lang-sierra-ap-change.workspace =true +num-bigint.workspace =true +num-traits.workspace =true +cairo-lang-casm.workspace =true +cairo-lang-starknet-classes.workspace =true +cairo-lang-sierra-to-casm.workspace =true +cairo-lang-utils.workspace =true +itertools.workspace =true +bincode = { version = "2.0.0-rc.3", default-features = false, features = [ + "serde", +] } \ No newline at end of file diff --git a/prover/src/cairo1_run/mod.rs b/prover/src/cairo1_run/mod.rs new file mode 100644 index 0000000..f22b87e --- /dev/null +++ b/prover/src/cairo1_run/mod.rs @@ -0,0 +1,284 @@ +pub mod run; +pub mod runner_error; +use std::io::{self, Write}; +use std::path::PathBuf; + +use bincode::enc::write::Writer; +use cairo_lang_sierra::program::Program; +use cairo_vm::air_public_input::PublicInputError; +pub use cairo_vm::types::layout_name::LayoutName; +use cairo_vm::vm::errors::trace_errors::TraceError; +pub use cairo_vm::{ + types::relocatable::{MaybeRelocatable, Relocatable}, + vm::{runners::cairo_runner::CairoRunner, vm_core::VirtualMachine}, + Felt252, +}; +use run::FuncArg; +use run::{cairo_run_program, Cairo1RunConfig}; +use runner_error::CairoRunError; +use starknet_types_core::felt::Felt; + +use crate::threadpool::run::RunPaths; + +pub fn get_cairo_pie( + program_file: Program, + output_file: PathBuf, + layout: LayoutName, + input: Vec, +) -> Result, CairoRunError> { + let args = FuncArg::Array(input); + + let cairo_run_config = Cairo1RunConfig { + proof_mode: false, + serialize_output: true, + relocate_mem: false, + layout, + trace_enabled: false, + args: &[args], + finalize_builtins: true, + append_return_values: false, + }; + // Try to parse the file as a sierra program + let (runner, _, serialized_output) = cairo_run_program(&program_file, cairo_run_config)?; + runner.get_cairo_pie()?.write_zip_file(&output_file)?; + + Ok(serialized_output) +} +pub fn run_cairo_program( + program_file: Program, + layout: LayoutName, + input: Vec, + run_paths: &RunPaths, +) -> Result<(), CairoRunError> { + let args = FuncArg::Array(input); + println!("Running program: {}", program_file); + let cairo_run_config = Cairo1RunConfig { + proof_mode: true, + serialize_output: false, + relocate_mem: true, + layout, + trace_enabled: true, + args: &[args], + finalize_builtins: true, + append_return_values: false, + }; + // Try to parse the file as a sierra program + println!("Running program: {}", program_file); + let (runner, _, _serialized_output) = cairo_run_program(&program_file, cairo_run_config)?; + println!("Program read"); + let json = runner.get_air_public_input()?.serialize_json()?; + println!("saving public input"); + std::fs::write(run_paths.public_input_file, json.clone())?; + // Get absolute paths of trace_file & memory_file + let trace_path = run_paths + .trace_file + .as_path() + .canonicalize() + .unwrap_or(run_paths.trace_file.clone()) + .to_string_lossy() + .to_string(); + let memory_path = run_paths + .memory_file + .as_path() + .canonicalize() + .unwrap_or(run_paths.memory_file.clone()) + .to_string_lossy() + .to_string(); + + let json = runner + .get_air_private_input() + .to_serializable(trace_path, memory_path) + .serialize_json() + .map_err(PublicInputError::Serde)?; + std::fs::write(run_paths.private_input_file, json)?; + + let relocated_trace = runner + .relocated_trace + .ok_or(CairoRunError::Trace(TraceError::TraceNotRelocated))?; + + let trace_file = std::fs::File::create(run_paths.trace_file)?; + let mut trace_writer = + FileWriter::new(io::BufWriter::with_capacity(3 * 1024 * 1024, trace_file)); + cairo_vm::cairo_run::write_encoded_trace(&relocated_trace, &mut trace_writer)?; + trace_writer.flush()?; + + let memory_file = std::fs::File::create(run_paths.memory_file)?; + let mut memory_writer = + FileWriter::new(io::BufWriter::with_capacity(5 * 1024 * 1024, memory_file)); + + cairo_vm::cairo_run::write_encoded_memory(&runner.relocated_memory, &mut memory_writer)?; + memory_writer.flush()?; + Ok(()) +} + +pub struct FileWriter { + buf_writer: io::BufWriter, + bytes_written: usize, +} + +impl Writer for FileWriter { + fn write(&mut self, bytes: &[u8]) -> Result<(), bincode::error::EncodeError> { + self.buf_writer + .write_all(bytes) + .map_err(|e| bincode::error::EncodeError::Io { + inner: e, + index: self.bytes_written, + })?; + + self.bytes_written += bytes.len(); + + Ok(()) + } +} + +impl FileWriter { + fn new(buf_writer: io::BufWriter) -> Self { + Self { + buf_writer, + bytes_written: 0, + } + } + + fn flush(&mut self) -> io::Result<()> { + self.buf_writer.flush() + } +} + +#[cfg(test)] +mod tests { + use crate::threadpool::prove::ProvePaths; + + use super::*; + use cairo_vm::types::layout_name::LayoutName; + use itertools::Itertools; + use starknet_types_core::felt::Felt; + use std::fs; + use std::path::PathBuf; + use tempfile::TempDir; + #[test] + fn test_get_cairo_pie() -> Result<(), CairoRunError> { + let input = vec![ + Felt::from(1), + Felt::from_dec_str( + "1084568281184221360887085980818130019116060769753707796384172133640093947392", + ) + .unwrap(), + Felt::from_dec_str( + "617075754465154585683856897856256838130216341506379215893724690153393808813", + ) + .unwrap(), + Felt::from(4), + Felt::from(1), + Felt::from_dec_str( + "1962399278914746334808042087624794244340195160841430388580769389462301739649", + ) + .unwrap(), + Felt::from_dec_str( + "946638316592298107720053446348402985413061731752482859793467974131030053837", + ) + .unwrap(), + Felt::from(0), + Felt::from(0), + Felt::from(0), + Felt::from(193823), + Felt::from(0), + Felt::from(0), + ]; + let filename = PathBuf::from("../examples/batcher.json"); + let binding = TempDir::new()?; + let cairo_pie_output = binding.path().join("cairo_pie_output.zip"); + let layout = LayoutName::recursive; + println!("Running program: {}", filename.display()); + let program = fs::read(filename)?; + println!("Program read"); + let program_json = serde_json::from_slice(&program).unwrap(); + match get_cairo_pie(program_json, cairo_pie_output.to_path_buf(), layout, input) { + Err(CairoRunError::Cli(err)) => err.exit(), + Ok(output) => { + if let Some(output_string) = output { + println!("Program Output : {}", output_string); + } + Ok(()) + } + Err(CairoRunError::RunPanic(panic_data)) => { + if !panic_data.is_empty() { + let panic_data_string_list = panic_data + .iter() + .map(|m| { + // Try to parse to utf8 string + let msg = String::from_utf8(m.to_bytes_be().to_vec()); + if let Ok(msg) = msg { + format!("{} ('{}')", m, msg) + } else { + m.to_string() + } + }) + .join(", "); + println!("Run panicked with: [{}]", panic_data_string_list); + } + Ok(()) + } + Err(err) => Err(err), + } + } + #[test] + fn test_run_cairo_program() -> Result<(), CairoRunError> { + let input = vec![ + Felt::from(1), + Felt::from_dec_str( + "1084568281184221360887085980818130019116060769753707796384172133640093947392", + ) + .unwrap(), + Felt::from_dec_str( + "617075754465154585683856897856256838130216341506379215893724690153393808813", + ) + .unwrap(), + Felt::from(4), + Felt::from(1), + Felt::from_dec_str( + "1962399278914746334808042087624794244340195160841430388580769389462301739649", + ) + .unwrap(), + Felt::from_dec_str( + "946638316592298107720053446348402985413061731752482859793467974131030053837", + ) + .unwrap(), + Felt::from(0), + Felt::from(0), + Felt::from(0), + Felt::from(193823), + Felt::from(0), + Felt::from(0), + ]; + let filename = PathBuf::from("../examples/batcher.json"); + let layout = LayoutName::recursive; + let program = fs::read(filename)?; + let program_json = serde_json::from_slice(&program).unwrap(); + let dir = TempDir::new()?; + let prove_path = ProvePaths::new(dir); + let run_path = RunPaths::from(&prove_path); + match run_cairo_program(program_json, layout, input, &run_path) { + Err(CairoRunError::Cli(err)) => err.exit(), + Ok(_output) => Ok(()), + Err(CairoRunError::RunPanic(panic_data)) => { + if !panic_data.is_empty() { + let panic_data_string_list = panic_data + .iter() + .map(|m| { + // Try to parse to utf8 string + let msg = String::from_utf8(m.to_bytes_be().to_vec()); + if let Ok(msg) = msg { + format!("{} ('{}')", m, msg) + } else { + m.to_string() + } + }) + .join(", "); + println!("Run panicked with: [{}]", panic_data_string_list); + } + Ok(()) + } + Err(err) => Err(err), + } + } +} diff --git a/prover/src/cairo1_run/run.rs b/prover/src/cairo1_run/run.rs new file mode 100644 index 0000000..3c07536 --- /dev/null +++ b/prover/src/cairo1_run/run.rs @@ -0,0 +1,1532 @@ +use super::runner_error::CairoRunError; +use cairo_lang_casm::{ + builder::{CasmBuilder, Var}, + casm, casm_build_extend, + cell_expression::CellExpression, + deref, deref_or_immediate, + hints::{Hint, StarknetHint}, + inline::CasmContext, + instructions::{Instruction, InstructionBody}, +}; +use cairo_lang_sierra::{ + extensions::{ + bitwise::BitwiseType, + core::{CoreLibfunc, CoreType}, + ec::EcOpType, + gas::GasBuiltinType, + pedersen::PedersenType, + poseidon::PoseidonType, + range_check::RangeCheckType, + segment_arena::SegmentArenaType, + starknet::syscalls::SystemType, + ConcreteType, NamedType, + }, + ids::{ConcreteTypeId, GenericTypeId}, + program::{Function, GenericArg, Program as SierraProgram}, + program_registry::ProgramRegistry, +}; +use cairo_lang_sierra_to_casm::{ + compiler::{CairoProgram, SierraToCasmConfig}, + metadata::calc_metadata_ap_change_only, +}; +use cairo_lang_sierra_type_size::get_type_size_map; +use cairo_lang_utils::{ + bigint::BigIntAsHex, casts::IntoOrPanic, unordered_hash_map::UnorderedHashMap, +}; +use cairo_vm::{ + hint_processor::cairo_1_hint_processor::hint_processor::Cairo1HintProcessor, + math_utils::signed_felt, + serde::deserialize_program::{ApTracking, FlowTrackingData, HintParams, ReferenceManager}, + types::{ + builtin_name::BuiltinName, layout_name::LayoutName, program::Program, + relocatable::MaybeRelocatable, + }, + vm::{ + errors::{runner_errors::RunnerError, vm_errors::VirtualMachineError}, + runners::cairo_runner::{CairoRunner, RunResources, RunnerMode}, + vm_core::VirtualMachine, + }, + Felt252, +}; +use itertools::{chain, Itertools}; +use num_bigint::{BigInt, Sign}; +use num_traits::{cast::ToPrimitive, Zero}; +use std::{collections::HashMap, iter::Peekable}; + +/// Representation of a cairo argument +/// Can consist of a single Felt or an array of Felts +#[derive(Debug, Clone)] +pub enum FuncArg { + Array(Vec), + Single(Felt252), +} + +impl From for FuncArg { + fn from(value: Felt252) -> Self { + Self::Single(value) + } +} + +impl From> for FuncArg { + fn from(value: Vec) -> Self { + Self::Array(value) + } +} + +/// Configuration parameters for a cairo run +#[derive(Debug)] +pub struct Cairo1RunConfig<'a> { + /// Input arguments for the `main` function in the cairo progran + pub args: &'a [FuncArg], + /// Serialize program output into a user-friendly format + pub serialize_output: bool, + /// Compute cairo trace during execution + pub trace_enabled: bool, + /// Relocate cairo memory at the end of the run + pub relocate_mem: bool, + /// Cairo layout chosen for the run + pub layout: LayoutName, + /// Run in proof_mode + pub proof_mode: bool, + /// Should be true if either air_public_input or cairo_pie_output are needed + /// Sets builtins stop_ptr by calling `final_stack` on each builtin + pub finalize_builtins: bool, + /// Appends the return and input values to the output segment. This is performed by default when running in proof_mode + pub append_return_values: bool, +} + +impl Default for Cairo1RunConfig<'_> { + fn default() -> Self { + Self { + args: Default::default(), + serialize_output: false, + trace_enabled: false, + relocate_mem: false, + layout: LayoutName::plain, + proof_mode: false, + finalize_builtins: false, + append_return_values: false, + } + } +} + +impl Cairo1RunConfig<'_> { + // Returns true if the flags in the config enable adding the output builtin and + // copying input and output values into it's segment + fn copy_to_output(&self) -> bool { + self.append_return_values || self.proof_mode + } +} + +/// Runs a Cairo 1 program +/// Returns the runner after execution + the return values + the serialized return values (if serialize_output is enabled) +/// The return values will contain the memory values just as they appear in the VM, after removing the PanicResult enum (if present). +/// Except if either the flag append_return_values or proof_mode are enabled, in which case the return values will consist of its serialized form: [array_len, array[0], array[1], ..., array[array_len -1]] +pub fn cairo_run_program( + sierra_program: &SierraProgram, + cairo_run_config: Cairo1RunConfig, +) -> Result<(CairoRunner, Vec, Option), CairoRunError> { + let metadata = calc_metadata_ap_change_only(sierra_program) + .map_err(|_| VirtualMachineError::Unexpected)?; + let sierra_program_registry = ProgramRegistry::::new(sierra_program)?; + let type_sizes = + get_type_size_map(sierra_program, &sierra_program_registry).unwrap_or_default(); + let config = SierraToCasmConfig { + gas_usage_check: false, + max_bytecode_size: usize::MAX, + }; + let casm_program = + cairo_lang_sierra_to_casm::compiler::compile(sierra_program, &metadata, config)?; + + let main_func = find_function(sierra_program, "::main")?; + + let initial_gas = 9999999999999_usize; + + // Fetch return type data + let return_type_id = match main_func.signature.ret_types.last() { + // We need to check if the last return type is indeed the function's return value and not an implicit return value + return_type @ Some(concrete_ty) + if get_info(&sierra_program_registry, concrete_ty) + .is_some_and(|info| !is_implicit_generic_id(&info.long_id.generic_id)) => + { + return_type + } + _ => None, + }; + + if cairo_run_config.copy_to_output() + && !check_only_array_felt_input_type( + &main_func.signature.param_types, + &sierra_program_registry, + ) + { + return Err(CairoRunError::IlegalInputValue); + }; + if cairo_run_config.copy_to_output() + && !check_only_array_felt_return_type(return_type_id, &sierra_program_registry) + { + return Err(CairoRunError::IlegalReturnValue); + }; + + // Modified entry code to be compatible with custom cairo1 Proof Mode. + // This adds code that's needed for dictionaries, adjusts ap for builtin pointers, adds initial gas for the gas builtin if needed, and sets up other necessary code for cairo1 + let (entry_code, builtins) = create_entry_code( + &sierra_program_registry, + &casm_program, + &type_sizes, + main_func, + &cairo_run_config, + )?; + + let return_type_size = return_type_id + .and_then(|id| type_sizes.get(id).cloned()) + .unwrap_or_default(); + + // This footer is used by lib funcs + let libfunc_footer = create_code_footer(); + let builtin_count: i16 = builtins.len().into_or_panic(); + + // This is the program we are actually running/proving + // With (embedded proof mode), cairo1 header and the libfunc footer + let instructions = chain!( + entry_code.instructions.iter(), + casm_program.instructions.iter(), + libfunc_footer.iter(), + ); + + let (processor_hints, program_hints) = build_hints_vec(instructions.clone()); + + let mut hint_processor = Cairo1HintProcessor::new( + &processor_hints, + RunResources::default(), + cairo_run_config.copy_to_output(), + ); + + let data: Vec = instructions + .flat_map(|inst| inst.assemble().encode()) + .map(|x| Felt252::from(&x)) + .map(MaybeRelocatable::from) + .collect(); + + let program = if cairo_run_config.proof_mode { + Program::new_for_proof( + builtins.clone(), + data, + 0, + // Proof mode is on top + // `jmp rel 0` is the last line of the entry code. + entry_code.current_code_offset - 2, + program_hints, + ReferenceManager { + references: Vec::new(), + }, + HashMap::new(), + vec![], + None, + )? + } else { + Program::new( + builtins.clone(), + data, + Some(0), + program_hints, + ReferenceManager { + references: Vec::new(), + }, + HashMap::new(), + vec![], + None, + )? + }; + + let runner_mode = if cairo_run_config.proof_mode { + RunnerMode::ProofModeCairo1 + } else { + RunnerMode::ExecutionMode + }; + + let mut runner = CairoRunner::new_v2( + &program, + cairo_run_config.layout, + runner_mode, + cairo_run_config.trace_enabled, + )?; + let end = runner.initialize(cairo_run_config.proof_mode)?; + load_arguments(&mut runner, &cairo_run_config, main_func, initial_gas)?; + + // Run it until the end / infinite loop in proof_mode + runner.run_until_pc(end, &mut hint_processor)?; + if cairo_run_config.proof_mode { + runner.run_for_steps(1, &mut hint_processor)?; + } + + runner.end_run(false, false, &mut hint_processor)?; + + let result_inner_type_size = + result_inner_type_size(return_type_id, &sierra_program_registry, &type_sizes); + // Fetch return values + let return_values = fetch_return_values( + return_type_size, + result_inner_type_size, + &runner.vm, + builtin_count, + cairo_run_config.copy_to_output(), + )?; + + let serialized_output = if cairo_run_config.serialize_output { + if cairo_run_config.copy_to_output() { + // The return value is already serialized, so we can just print the array values + let mut output_string = String::from("["); + // Skip array_len + for elem in return_values[1..].iter() { + maybe_add_whitespace(&mut output_string); + output_string.push_str(&elem.to_string()); + } + output_string.push(']'); + Some(output_string) + } else { + Some(serialize_output( + &return_values, + &mut runner.vm, + return_type_id, + &sierra_program_registry, + &type_sizes, + )) + } + } else { + None + }; + + // Set stop pointers for builtins so we can obtain the air public input + if cairo_run_config.finalize_builtins { + if cairo_run_config.copy_to_output() { + // Set stop pointer for each builtin + runner.vm.builtins_final_stack_from_stack_pointer_dict( + &builtins + .iter() + .enumerate() + .map(|(i, builtin)| { + ( + *builtin, + (runner.vm.get_ap() - (builtins.len() - 1 - i)).unwrap(), + ) + }) + .collect(), + false, + )?; + } else { + finalize_builtins( + &main_func.signature.ret_types, + &type_sizes, + &mut runner.vm, + builtin_count, + )?; + } + + // Build execution public memory + if cairo_run_config.proof_mode { + runner.finalize_segments()?; + } + } + + runner.relocate(true)?; + + Ok((runner, return_values, serialized_output)) +} + +#[allow(clippy::type_complexity)] +fn build_hints_vec<'b>( + instructions: impl Iterator, +) -> (Vec<(usize, Vec)>, HashMap>) { + let mut hints: Vec<(usize, Vec)> = Vec::new(); + let mut program_hints: HashMap> = HashMap::new(); + + let mut hint_offset = 0; + + for instruction in instructions { + if !instruction.hints.is_empty() { + hints.push((hint_offset, instruction.hints.clone())); + program_hints.insert( + hint_offset, + vec![HintParams { + code: hint_offset.to_string(), + accessible_scopes: Vec::new(), + flow_tracking_data: FlowTrackingData { + ap_tracking: ApTracking::default(), + reference_ids: HashMap::new(), + }, + }], + ); + } + hint_offset += instruction.body.op_size(); + } + (hints, program_hints) +} + +/// Finds first function ending with `name_suffix`. +fn find_function<'a>( + sierra_program: &'a SierraProgram, + name_suffix: &'a str, +) -> Result<&'a Function, RunnerError> { + sierra_program + .funcs + .iter() + .find(|f| { + if let Some(name) = &f.id.debug_name { + name.ends_with(name_suffix) + } else { + false + } + }) + .ok_or_else(|| RunnerError::MissingMain) +} + +/// Creates a list of instructions that will be appended to the program's bytecode. +fn create_code_footer() -> Vec { + casm! { + // Add a `ret` instruction used in libfuncs that retrieve the current value of the `fp` + // and `pc` registers. + ret; + } + .instructions +} + +// Loads the input arguments into the execution segment, leaving the necessary gaps for the values that will be written by +// the instructions in the entry_code (produced by `create_entry_code`). Also loads the initial gas if the GasBuiltin is present + +/* Example of execution segment before running the main function: +Before calling this function (after runner.initialize): +[ + (*1) output_builtin_base + builtin_base_0 + builtin_base_1 + return_fp + return_pc +] +After calling this function (before running the VM): +[ + (*1) output_builtin_base + builtin_base_0 + builtin_base_1 + return_fp + return_pc + (*1+2+3) gap + (*1+2) gap + (*1+2) gap + (*2) gap + (*2) gap + (*2) gap + gap + gap + (*2) gap + (*3) arg_0 + (*3) arg_1 +] + +After the entry_code (up until calling main) has been ran by the VM: +[ + (*1) output_builtin_base + builtin_base_0 + builtin_base_1 + return_fp + return_pc + (*1) gap (for output_builtin final ptr) + (*1) gap (for builtin_0 final ptr) + (*1) gap (for builtin_1 final ptr) + (*2) segment_arena_ptr + (*2) infos_ptr + (*2) 0 + builtin_base_0 + builtin_base_1 + (*2) segment_arena_ptr + 3 (segment_arena base) + (*4) initial_gas + (*3) arg_0 + (*3) arg_1 +] +(*1) if output builtin is added (if either proof_mode or append_return_values is enabled) +(*2) if segment arena is present +(*3) if args are used +(*4) if gas builtin is present +*/ +fn load_arguments( + runner: &mut CairoRunner, + cairo_run_config: &Cairo1RunConfig, + main_func: &Function, + initial_gas: usize, +) -> Result<(), CairoRunError> { + let got_gas_builtin = main_func + .signature + .param_types + .iter() + .any(|ty| ty.debug_name.as_ref().is_some_and(|n| n == "GasBuiltin")); + if cairo_run_config.args.is_empty() && !got_gas_builtin { + // Nothing to be done + return Ok(()); + } + let got_segment_arena = main_func + .signature + .param_types + .iter() + .any(|ty| ty.debug_name.as_ref().is_some_and(|n| n == "SegmentArena")); + // This AP correction represents the memory slots taken up by the values created by `create_entry_code`: + // These include: + // * The builtin bases (not including output) + // * (Only if the output builtin is added) A gap for each builtin's final pointer + // * The segment arena values (if present), including: + // * segment_arena_ptr + // * info_segment_ptr + // * 0 + // * segment_arena_ptr + 3 + let mut ap_offset = runner.get_program().builtins_len(); + if cairo_run_config.copy_to_output() { + ap_offset += runner.get_program().builtins_len() - 1; + } + if got_segment_arena { + ap_offset += 4; + } + // Load initial gas if GasBuiltin is present + if got_gas_builtin { + runner.vm.insert_value( + (runner.vm.get_ap() + ap_offset).map_err(VirtualMachineError::Math)?, + Felt252::from(initial_gas), + )?; + ap_offset += 1; + } + for arg in cairo_run_config.args { + match arg { + FuncArg::Array(args) => { + let array_start = runner.vm.add_memory_segment(); + let array_end = runner.vm.load_data( + array_start, + &args.iter().map(|f| f.into()).collect::>(), + )?; + runner.vm.insert_value( + (runner.vm.get_ap() + ap_offset).map_err(VirtualMachineError::Math)?, + array_start, + )?; + ap_offset += 1; + runner.vm.insert_value( + (runner.vm.get_ap() + ap_offset).map_err(VirtualMachineError::Math)?, + array_end, + )?; + ap_offset += 1; + } + FuncArg::Single(arg) => { + runner.vm.insert_value( + (runner.vm.get_ap() + ap_offset).map_err(VirtualMachineError::Math)?, + arg, + )?; + ap_offset += 1; + } + } + } + + Ok(()) +} + +/// Returns the instructions to add to the beginning of the code to successfully call the main +/// function, as well as the builtins required to execute the program. +fn create_entry_code( + sierra_program_registry: &ProgramRegistry, + casm_program: &CairoProgram, + type_sizes: &UnorderedHashMap, + func: &Function, + config: &Cairo1RunConfig, +) -> Result<(CasmContext, Vec), CairoRunError> { + let copy_to_output_builtin = config.copy_to_output(); + let signature = &func.signature; + let got_segment_arena = signature.param_types.iter().any(|ty| { + get_info(sierra_program_registry, ty) + .map(|x| x.long_id.generic_id == SegmentArenaType::ID) + .unwrap_or_default() + }); + let got_gas_builtin = signature.param_types.iter().any(|ty| { + get_info(sierra_program_registry, ty) + .map(|x| x.long_id.generic_id == GasBuiltinType::ID) + .unwrap_or_default() + }); + // The builtins in the formatting expected by the runner. + let (builtins, builtin_offset) = + get_function_builtins(&signature.param_types, copy_to_output_builtin); + let mut ctx = CasmBuilder::default(); + // Getting a variable pointing to the location of each builtin. + let mut builtin_vars = + HashMap::::from_iter(builtin_offset.iter().map(|(id, offset)| { + ( + id.clone(), + ctx.add_var(CellExpression::Deref(deref!([fp - offset]))), + ) + })); + // Getting a variable for the location output builtin if required. + let output_ptr = copy_to_output_builtin.then(|| { + let offset: i16 = 2 + builtins.len().into_or_panic::(); + ctx.add_var(CellExpression::Deref(deref!([fp - offset]))) + }); + if copy_to_output_builtin { + // Leave a gap to write the builtin final pointers + // We write them on a fixed cells relative to the starting FP pointer so we don't lose them after serializing outputs + for _ in 0..builtins.len() { + casm_build_extend!(ctx, tempvar _local;); + } + casm_build_extend!(ctx, ap += builtins.len();); + } + let mut expected_arguments_size = 0; + if got_segment_arena { + // Allocating the segment arena and initializing it. + casm_build_extend! {ctx, + tempvar segment_arena; + tempvar infos; + hint AllocSegment {} into {dst: segment_arena}; + hint AllocSegment {} into {dst: infos}; + const czero = 0; + tempvar zero = czero; + // Write Infos segment, n_constructed (0), and n_destructed (0) to the segment. + assert infos = *(segment_arena++); + assert zero = *(segment_arena++); + assert zero = *(segment_arena++); + } + // Adding the segment arena to the builtins var map. + builtin_vars.insert(SegmentArenaType::ID, segment_arena); + }; + + for ty in &signature.param_types { + let info = get_info(sierra_program_registry, ty) + .ok_or_else(|| CairoRunError::NoInfoForType(ty.clone()))?; + let generic_ty = &info.long_id.generic_id; + if let Some(var) = builtin_vars.get(generic_ty).cloned() { + casm_build_extend!(ctx, tempvar _builtin = var;); + } else if generic_ty == &SystemType::ID { + casm_build_extend! {ctx, + tempvar system; + hint AllocSegment {} into {dst: system}; + ap += 1; + }; + } else if generic_ty == &GasBuiltinType::ID { + // We already loaded the inital gas so we just advance AP + casm_build_extend! {ctx, + ap += 1; + }; + } else { + let ty_size = type_sizes[ty]; + // We already loaded these arguments, so we just advance AP + casm_build_extend!(ctx, + ap+=ty_size as usize; + ); + expected_arguments_size += ty_size; + } + } + let actual_args_size = config + .args + .iter() + .map(|arg| match arg { + FuncArg::Single(_) => 1, + FuncArg::Array(_) => 2, + }) + .sum::(); + if expected_arguments_size != actual_args_size { + return Err(CairoRunError::ArgumentsSizeMismatch { + expected: expected_arguments_size, + actual: actual_args_size, + }); + } + + casm_build_extend!(ctx, let () = call FUNCTION;); + + let return_type_id = signature.ret_types.last(); + let return_type_size = return_type_id + .and_then(|id| type_sizes.get(id).cloned()) + .unwrap_or_default(); + let mut offset: i16 = 0; + for ty in signature.ret_types.iter().rev() { + let info = get_info(sierra_program_registry, ty) + .ok_or_else(|| CairoRunError::NoInfoForType(ty.clone()))?; + offset += type_sizes[ty]; + let generic_ty = &info.long_id.generic_id; + let Some(var) = builtin_vars.get_mut(generic_ty) else { + continue; + }; + *var = ctx.add_var(CellExpression::Deref(deref!([ap - offset]))); + } + + // Helper to get a variable for a given builtin. + // Fails for builtins that will never be present. + let get_var = |name: &BuiltinName| match name { + BuiltinName::range_check => builtin_vars[&RangeCheckType::ID], + BuiltinName::pedersen => builtin_vars[&PedersenType::ID], + BuiltinName::bitwise => builtin_vars[&BitwiseType::ID], + BuiltinName::ec_op => builtin_vars[&EcOpType::ID], + BuiltinName::poseidon => builtin_vars[&PoseidonType::ID], + BuiltinName::segment_arena => builtin_vars[&SegmentArenaType::ID], + _ => unreachable!(), + }; + if copy_to_output_builtin { + // Copying the final builtins into a local variables. + for (i, builtin) in builtins.iter().enumerate() { + // Skip output_ptr as we still haven't written into it and this will lead to the wrong size being written + if matches!(builtin, BuiltinName::output) { + continue; + } + let var = get_var(builtin); + let local = ctx.add_var(CellExpression::Deref(deref!([fp + i.to_i16().unwrap()]))); + casm_build_extend!(ctx, assert local = var;); + } + // Serialize return values into output segment + let output_ptr = output_ptr.unwrap(); + let outputs = (1..(return_type_size + 1)) + .rev() + .map(|i| ctx.add_var(CellExpression::Deref(deref!([ap - i])))) + .collect_vec(); + let (array_start_ptr, array_end_ptr) = if is_panic_result(signature.ret_types.last()) { + // Write panic flag value + let panic_flag = outputs[0]; + casm_build_extend! {ctx, + assert panic_flag = *(output_ptr++); + }; + // If the run did panic, these will point to the panic data + (outputs[1], outputs[2]) + } else { + (outputs[0], outputs[1]) + }; + casm_build_extend! {ctx, + // Calculate size of array and write it into the output segment + tempvar array_size = array_end_ptr - array_start_ptr; + assert array_size = *(output_ptr++); + // Create loop variables + tempvar remaining_elements = array_size; + tempvar array_ptr = array_start_ptr; + tempvar write_ptr = output_ptr; + // Enter copying loop + rescope{remaining_elements = remaining_elements, array_ptr = array_ptr, write_ptr = write_ptr}; + jump CopyOutputArray if remaining_elements != 0; + jump EndOutputCopy; + + // Main Loop + CopyOutputArray: + #{steps = 0;} + // Write array value into output segment + tempvar val = *(array_ptr++); + assert val = *(write_ptr++); + const one = 1; + // Create loop variables + tempvar new_remaining_elements = remaining_elements - one; + tempvar new_array_ptr = array_ptr; + tempvar new_write_ptr = write_ptr; + // Continue the loop + rescope{remaining_elements = new_remaining_elements, array_ptr = new_array_ptr, write_ptr = new_write_ptr}; + jump CopyOutputArray if remaining_elements != 0; + + EndOutputCopy: + }; + if !actual_args_size.is_zero() { + // Serialize the input values into the output segment + // We lost the output_ptr var after re-scoping, so we need to create it again + // The last instruction will write the last output ptr so we can find it in [ap - 1] + let output_ptr = ctx.add_var(CellExpression::Deref(deref!([ap - 1]))); + // len(builtins - output) + len(builtins) + if segment_arena: segment_arena_ptr + info_ptr + 0 + (segment_arena_ptr + 3) + (gas_builtin) + let offset = (2 * builtins.len() - 1 + + 4 * got_segment_arena as usize + + got_gas_builtin as usize) as i16; + let array_start_ptr = ctx.add_var(CellExpression::Deref(deref!([fp + offset]))); + let array_end_ptr = ctx.add_var(CellExpression::Deref(deref!([fp + offset + 1]))); + casm_build_extend! {ctx, + // Calculate size of array and write it into the output segment + tempvar array_size = array_end_ptr - array_start_ptr; + assert array_size = *(output_ptr++); + // Create loop variables + tempvar remaining_elements = array_size; + tempvar array_ptr = array_start_ptr; + tempvar write_ptr = output_ptr; + // Enter copying loop + rescope{remaining_elements = remaining_elements, array_ptr = array_ptr, write_ptr = write_ptr}; + jump CopyInputArray if remaining_elements != 0; + jump EndInputCopy; + + // Main Loop + CopyInputArray: + #{steps = 0;} + // Write array value into output segment + tempvar val = *(array_ptr++); + assert val = *(write_ptr++); + const one = 1; + // Create loop variables + tempvar new_remaining_elements = remaining_elements - one; + tempvar new_array_ptr = array_ptr; + tempvar new_write_ptr = write_ptr; + // Continue the loop + rescope{remaining_elements = new_remaining_elements, array_ptr = new_array_ptr, write_ptr = new_write_ptr}; + jump CopyInputArray if remaining_elements != 0; + + EndInputCopy: + }; + } + // After we are done writing into the output segment, we can write the final output_ptr into locals: + // The last instruction will write the final output ptr so we can find it in [ap - 1] + let output_ptr = ctx.add_var(CellExpression::Deref(deref!([ap - 1]))); + let local = ctx.add_var(CellExpression::Deref(deref!([fp]))); + casm_build_extend!(ctx, assert local = output_ptr;); + + if got_segment_arena { + // We re-scoped when serializing the output so we have to create a var for the segment arena + // len(builtins) + len(builtins - output) + segment_arena_ptr + info_segment + 0 + let off = 2 * builtins.len() + 2; + let segment_arena_ptr = ctx.add_var(CellExpression::Deref(deref!([fp + off as i16]))); + // Call the hint that will relocate all dictionaries + ctx.add_hint( + |[ignored_in], [ignored_out]| StarknetHint::Cheatcode { + selector: BigIntAsHex { + value: BigInt::from_bytes_be( + Sign::Plus, + "RelocateAllDictionaries".as_bytes(), + ), + }, + input_start: ignored_in.clone(), + input_end: ignored_in, + output_start: ignored_out, + output_end: ignored_out, + }, + [segment_arena_ptr], + [segment_arena_ptr], + ); + // Validating the segment arena's segments are one after the other. + casm_build_extend! {ctx, + tempvar n_segments = segment_arena_ptr[-2]; + tempvar n_finalized = segment_arena_ptr[-1]; + assert n_segments = n_finalized; + jump STILL_LEFT_PRE if n_segments != 0; + rescope{}; + jump DONE_VALIDATION; + STILL_LEFT_PRE: + const one = 1; + tempvar infos = segment_arena_ptr[-3]; + tempvar remaining_segments = n_segments - one; + rescope{infos = infos, remaining_segments = remaining_segments}; + LOOP_START: + jump STILL_LEFT_LOOP if remaining_segments != 0; + rescope{}; + jump DONE_VALIDATION; + STILL_LEFT_LOOP: + const one = 1; + const three = 3; + tempvar prev_end = infos[1]; + tempvar curr_start = infos[3]; + assert curr_start = prev_end + one; + tempvar next_infos = infos + three; + tempvar next_remaining_segments = remaining_segments - one; + rescope{infos = next_infos, remaining_segments = next_remaining_segments}; + #{ steps = 0; } + jump LOOP_START; + DONE_VALIDATION: + }; + } + // Copying the final builtins from locals into the top of the stack. + for i in 0..builtins.len().to_i16().unwrap() { + let local = ctx.add_var(CellExpression::Deref(deref!([fp + i]))); + casm_build_extend!(ctx, tempvar _r = local;); + } + } else { + // Writing the final builtins into the top of the stack. + for builtin in &builtins { + let var = get_var(builtin); + casm_build_extend!(ctx, tempvar _r = var;); + } + } + + if config.proof_mode { + casm_build_extend! {ctx, + INFINITE_LOOP: + // To enable the merge of the branches. + #{ steps = 0; } + jump INFINITE_LOOP; + }; + } else { + casm_build_extend!(ctx, ret;); + } + let result = ctx.build(["FUNCTION"]); + let [call_inst] = result.branches[0].1.as_slice() else { + panic!("Expected a single relocation"); + }; + let mut instructions = result.instructions; + let instruction_sizes = instructions.iter().map(|inst| inst.body.op_size()); + let prev_call_size: usize = instruction_sizes.clone().take(*call_inst).sum(); + let post_call_size: usize = instruction_sizes.skip(*call_inst).sum(); + let InstructionBody::Call(inst) = &mut instructions[*call_inst].body else { + panic!("Expected call instruction"); + }; + inst.target = deref_or_immediate!( + post_call_size + + casm_program.debug_info.sierra_statement_info[func.entry_point.0].start_offset + ); + Ok(( + CasmContext { + instructions, + current_code_offset: prev_call_size + post_call_size, + current_hints: vec![], + }, + builtins, + )) +} + +fn get_info<'a>( + sierra_program_registry: &'a ProgramRegistry, + ty: &'a cairo_lang_sierra::ids::ConcreteTypeId, +) -> Option<&'a cairo_lang_sierra::extensions::types::TypeInfo> { + sierra_program_registry + .get_type(ty) + .ok() + .map(|ctc| ctc.info()) +} + +fn get_function_builtins( + params: &[cairo_lang_sierra::ids::ConcreteTypeId], + append_output: bool, +) -> ( + Vec, + HashMap, +) { + let mut builtins = Vec::new(); + let mut builtin_offset: HashMap = HashMap::new(); + let mut current_offset = 3; + for (debug_name, builtin_name, sierra_id) in [ + ("Poseidon", BuiltinName::poseidon, PoseidonType::ID), + ("EcOp", BuiltinName::ec_op, EcOpType::ID), + ("Bitwise", BuiltinName::bitwise, BitwiseType::ID), + ("RangeCheck", BuiltinName::range_check, RangeCheckType::ID), + ("Pedersen", BuiltinName::pedersen, PedersenType::ID), + ] { + if params + .iter() + .any(|id| id.debug_name.as_deref() == Some(debug_name)) + { + builtins.push(builtin_name); + builtin_offset.insert(sierra_id, current_offset); + current_offset += 1; + } + } + // Force an output builtin so that we can write the program output into it's segment + if append_output { + builtins.push(BuiltinName::output); + } + builtins.reverse(); + (builtins, builtin_offset) +} + +// Checks that the program input (if present) is of type Array +fn check_only_array_felt_input_type( + params: &[ConcreteTypeId], + sierra_program_registry: &ProgramRegistry, +) -> bool { + // Filter implicit arguments (builtins, gas) + let arg_types = params + .iter() + .filter(|ty| { + let info = get_info(sierra_program_registry, ty).unwrap(); + let generic_ty = &info.long_id.generic_id; + !is_implicit_generic_id(generic_ty) + }) + .collect_vec(); + if arg_types.is_empty() { + // No inputs + true + } else if arg_types.len() == 1 { + arg_types[0] + .debug_name + .as_ref() + .is_some_and(|name| name == "Array") + } else { + false + } +} + +// Returns true if the generic id corresponds to an implicit argument (aka a builtin, gas, or system type) +fn is_implicit_generic_id(generic_ty: &GenericTypeId) -> bool { + [ + SegmentArenaType::ID, + GasBuiltinType::ID, + BitwiseType::ID, + EcOpType::ID, + PedersenType::ID, + PoseidonType::ID, + RangeCheckType::ID, + SegmentArenaType::ID, + SystemType::ID, + ] + .contains(generic_ty) +} +// Checks that the return type is either an Array or a PanicResult> type +fn check_only_array_felt_return_type( + return_type_id: Option<&ConcreteTypeId>, + sierra_program_registry: &ProgramRegistry, +) -> bool { + if return_type_id.is_none() { + return false; + }; + // Unwrap PanicResult (if appicable) + let return_type = + if let Some(return_type) = result_inner_type(return_type_id, sierra_program_registry) { + return_type + } else { + return_type_id.unwrap() + }; + let return_type = sierra_program_registry.get_type(return_type).unwrap(); + // Check that the resulting type is an Array + match return_type { + cairo_lang_sierra::extensions::core::CoreTypeConcrete::Array(info) => { + let inner_ty = sierra_program_registry.get_type(&info.ty).unwrap(); + matches!( + inner_ty, + cairo_lang_sierra::extensions::core::CoreTypeConcrete::Felt252(_) + ) + } + _ => false, + } +} + +fn is_panic_result(return_type_id: Option<&ConcreteTypeId>) -> bool { + return_type_id + .map(|id| { + id.debug_name + .as_ref() + .is_some_and(|name| name.starts_with("core::panics::PanicResult::")) + }) + .unwrap_or_default() +} + +// Returns the T type in PanicResult::Ok(T) if applicable +// Returns None if the return_type_id is not a PanicResult +fn result_inner_type<'a>( + return_type_id: Option<&'a ConcreteTypeId>, + sierra_program_registry: &'a ProgramRegistry, +) -> Option<&'a ConcreteTypeId> { + if is_panic_result(return_type_id) { + let return_type_info = + get_info(sierra_program_registry, return_type_id.as_ref().unwrap()).unwrap(); + // We already know info.long_id.generic_args[0] contains the Panic variant + let inner_args = &return_type_info.long_id.generic_args[1]; + let inner_type = { + let inner_type = match inner_args { + GenericArg::Type(type_id) => type_id, + _ => unreachable!(), + }; + // The inner type contains a single-element tuple so we need to get rid of it too + let inner_type_info = get_info(sierra_program_registry, inner_type).unwrap(); + match &inner_type_info.long_id.generic_args[1] { + GenericArg::Type(type_id) => type_id, + _ => unreachable!(), + } + }; + + Some(inner_type) + } else { + None + } +} + +// Returns the size of the T type in PanicResult::Ok(T) if applicable +// Returns None if the return_type_id is not a PanicResult +fn result_inner_type_size( + return_type_id: Option<&ConcreteTypeId>, + sierra_program_registry: &ProgramRegistry, + type_sizes: &UnorderedHashMap, +) -> Option { + result_inner_type(return_type_id, sierra_program_registry) + .and_then(|ty| type_sizes.get(ty).copied()) +} + +fn fetch_return_values( + return_type_size: i16, + result_inner_type_size: Option, + vm: &VirtualMachine, + builtin_count: i16, + fetch_from_output: bool, +) -> Result, CairoRunError> { + if fetch_from_output { + // In this case we will find the serialized return value in the format: + // [*panic_flag, array_len, array[0], array[1],..., array[array_len-1]] + // *: If the return value is a PanicResult + + // Output Builtin will always be on segment 2 + let return_values = + vm.get_continuous_range((2, 0).into(), vm.get_segment_size(2).unwrap())?; + // Remove panic wrapper + let (return_values, panic_flag) = if result_inner_type_size.is_none() { + // return value is not a PanicResult + (&return_values[..], false) + } else { + // return value is a PanicResult + ( + &return_values[1..], + return_values[0] != MaybeRelocatable::from(0), + ) + }; + // Take only the output (as the output segment will also contain the input) + let output_len = return_values[0].get_int().unwrap().to_usize().unwrap() + 1; + let return_values = &return_values[0..output_len]; + // Return Ok or Err based on panic_flag + if panic_flag { + return Err(CairoRunError::RunPanic( + return_values + .iter() + .map(|mr| mr.get_int().unwrap_or_default()) + .collect_vec(), + )); + } else { + return Ok(return_values.to_vec()); + } + } + + let mut return_values = vm.get_continuous_range( + (vm.get_ap() - (return_type_size + builtin_count) as usize).unwrap(), + return_type_size as usize, + )?; + // Handle PanicResult (we already checked if the type is a PanicResult when fetching the inner type size) + if let Some(inner_type_size) = result_inner_type_size { + // Check the failure flag (aka first return value) + if return_values.first() != Some(&MaybeRelocatable::from(0)) { + // In case of failure, extract the CairoRunError from the return values (aka last two values) + let panic_data_end = return_values + .last() + .ok_or(CairoRunError::FailedToExtractReturnValues)? + .get_relocatable() + .ok_or(CairoRunError::FailedToExtractReturnValues)?; + let panic_data_start = return_values + .get(return_values.len() - 2) + .ok_or(CairoRunError::FailedToExtractReturnValues)? + .get_relocatable() + .ok_or(CairoRunError::FailedToExtractReturnValues)?; + let panic_data = vm.get_integer_range( + panic_data_start, + (panic_data_end - panic_data_start).map_err(VirtualMachineError::Math)?, + )?; + return Err(CairoRunError::RunPanic( + panic_data.iter().map(|c| *c.as_ref()).collect(), + )); + } else { + if return_values.len() < inner_type_size as usize { + return Err(CairoRunError::FailedToExtractReturnValues); + } + return_values = + return_values[((return_type_size - inner_type_size).into_or_panic())..].to_vec() + } + } + Ok(return_values) +} + +// Calculates builtins' final_stack setting each stop_ptr +// Calling this function is a must if either air_public_input or cairo_pie are needed +fn finalize_builtins( + main_ret_types: &[ConcreteTypeId], + type_sizes: &UnorderedHashMap, + vm: &mut VirtualMachine, + builtin_count: i16, +) -> Result<(), CairoRunError> { + // Set stop pointers for builtins so we can obtain the air public input + // Cairo 1 programs have other return values aside from the used builtin's final pointers, so we need to hand-pick them + let ret_types_sizes = main_ret_types + .iter() + .map(|id| type_sizes.get(id).cloned().unwrap_or_default()); + let ret_types_and_sizes = main_ret_types.iter().zip(ret_types_sizes.clone()); + + let full_ret_types_size: i16 = ret_types_sizes.sum(); + let mut stack_pointer = (vm.get_ap() + - (full_ret_types_size as usize + builtin_count as usize).saturating_sub(1)) + .map_err(VirtualMachineError::Math)?; + + // Calculate the stack_ptr for each return builtin in the return values + let mut builtin_name_to_stack_pointer = HashMap::new(); + for (id, size) in ret_types_and_sizes { + if let Some(ref name) = id.debug_name { + let builtin_name = match name.as_str() { + "RangeCheck" => BuiltinName::range_check, + "Poseidon" => BuiltinName::poseidon, + "EcOp" => BuiltinName::ec_op, + "Bitwise" => BuiltinName::bitwise, + "Pedersen" => BuiltinName::pedersen, + "Output" => BuiltinName::output, + "Ecdsa" => BuiltinName::ecdsa, + _ => { + stack_pointer.offset += size as usize; + continue; + } + }; + builtin_name_to_stack_pointer.insert(builtin_name, stack_pointer); + } + stack_pointer.offset += size as usize; + } + + // Set stop pointer for each builtin + vm.builtins_final_stack_from_stack_pointer_dict(&builtin_name_to_stack_pointer, false)?; + Ok(()) +} + +fn serialize_output( + return_values: &[MaybeRelocatable], + vm: &mut VirtualMachine, + return_type_id: Option<&ConcreteTypeId>, + sierra_program_registry: &ProgramRegistry, + type_sizes: &UnorderedHashMap, +) -> String { + let mut output_string = String::new(); + let return_type_id = if let Some(id) = return_type_id { + id + } else { + return output_string; + }; + let mut return_values_iter = return_values.iter().peekable(); + serialize_output_inner( + &mut return_values_iter, + &mut output_string, + vm, + return_type_id, + sierra_program_registry, + type_sizes, + ); + output_string +} + +fn serialize_output_inner<'a>( + return_values_iter: &mut Peekable>, + output_string: &mut String, + vm: &mut VirtualMachine, + return_type_id: &ConcreteTypeId, + sierra_program_registry: &ProgramRegistry, + type_sizes: &UnorderedHashMap, +) { + match sierra_program_registry.get_type(return_type_id).unwrap() { + cairo_lang_sierra::extensions::core::CoreTypeConcrete::Array(info) => { + // Fetch array from memory + let array_start = return_values_iter + .next() + .expect("Missing return value") + .get_relocatable() + .expect("Array start_ptr not Relocatable"); + let array_end = return_values_iter + .next() + .expect("Missing return value") + .get_relocatable() + .expect("Array end_ptr not Relocatable"); + let array_size = (array_end - array_start).unwrap(); + + let array_data = vm.get_continuous_range(array_start, array_size).unwrap(); + let mut array_data_iter = array_data.iter().peekable(); + let array_elem_id = &info.ty; + // Serialize array data + maybe_add_whitespace(output_string); + output_string.push('['); + while array_data_iter.peek().is_some() { + serialize_output_inner( + &mut array_data_iter, + output_string, + vm, + array_elem_id, + sierra_program_registry, + type_sizes, + ) + } + output_string.push(']'); + } + cairo_lang_sierra::extensions::core::CoreTypeConcrete::Box(info) => { + // As this represents a pointer, we need to extract it's values + let ptr = return_values_iter + .next() + .expect("Missing return value") + .get_relocatable() + .expect("Box Pointer is not Relocatable"); + let type_size = type_sizes[&info.ty].try_into().expect("could not parse to usize"); + let data = vm + .get_continuous_range(ptr, type_size) + .expect("Failed to extract value from nullable ptr"); + let mut data_iter = data.iter().peekable(); + serialize_output_inner( + &mut data_iter, + output_string, + vm, + &info.ty, + sierra_program_registry, + type_sizes, + ) + } + cairo_lang_sierra::extensions::core::CoreTypeConcrete::Const(_) => { + unimplemented!("Not supported in the current version") + }, + cairo_lang_sierra::extensions::core::CoreTypeConcrete::Felt252(_) + | cairo_lang_sierra::extensions::core::CoreTypeConcrete::BoundedInt(_) + // Only unsigned integer values implement Into + | cairo_lang_sierra::extensions::core::CoreTypeConcrete::Bytes31(_) + | cairo_lang_sierra::extensions::core::CoreTypeConcrete::Uint8(_) + | cairo_lang_sierra::extensions::core::CoreTypeConcrete::Uint16(_) + | cairo_lang_sierra::extensions::core::CoreTypeConcrete::Uint32(_) + | cairo_lang_sierra::extensions::core::CoreTypeConcrete::Uint64(_) + | cairo_lang_sierra::extensions::core::CoreTypeConcrete::Uint128(_) => { + maybe_add_whitespace(output_string); + let val = return_values_iter + .next() + .expect("Missing return value") + .get_int() + .expect("Value is not an integer"); + output_string.push_str(&val.to_string()); + } + cairo_lang_sierra::extensions::core::CoreTypeConcrete::Sint8(_) + | cairo_lang_sierra::extensions::core::CoreTypeConcrete::Sint16(_) + | cairo_lang_sierra::extensions::core::CoreTypeConcrete::Sint32(_) + | cairo_lang_sierra::extensions::core::CoreTypeConcrete::Sint64(_) + | cairo_lang_sierra::extensions::core::CoreTypeConcrete::Sint128(_) => { + maybe_add_whitespace(output_string); + let val = return_values_iter + .next() + .expect("Missing return value") + .get_int() + .expect("Value is not an integer"); + output_string.push_str(&signed_felt(val).to_string()); + } + cairo_lang_sierra::extensions::core::CoreTypeConcrete::NonZero(info) => { + serialize_output_inner( + return_values_iter, + output_string, + vm, + &info.ty, + sierra_program_registry, + type_sizes, + ) + } + cairo_lang_sierra::extensions::core::CoreTypeConcrete::Nullable(info) => { + // As this represents a pointer, we need to extract it's values + let ptr = match return_values_iter.next().expect("Missing return value") { + MaybeRelocatable::RelocatableValue(ptr) => *ptr, + MaybeRelocatable::Int(felt) if felt.is_zero() => { + // Nullable is Null + maybe_add_whitespace(output_string); + output_string.push_str("null"); + return; + } + _ => panic!("Invalid Nullable"), + }; + let type_size = type_sizes[&info.ty].try_into().expect("could not parse to usize"); + let data = vm + .get_continuous_range(ptr, type_size) + .expect("Failed to extract value from nullable ptr"); + let mut data_iter = data.iter().peekable(); + serialize_output_inner( + &mut data_iter, + output_string, + vm, + &info.ty, + sierra_program_registry, + type_sizes, + ) + } + cairo_lang_sierra::extensions::core::CoreTypeConcrete::Enum(info) => { + // First we check if it is a Panic enum, as we already handled panics when fetching return values, + // we can ignore them and move on to the non-panic variant + if let GenericArg::UserType(user_type) = &info.info.long_id.generic_args[0] { + if user_type + .debug_name + .as_ref() + .is_some_and(|n| n.starts_with("core::panics::PanicResult")) + { + return serialize_output_inner( + return_values_iter, + output_string, + vm, + &info.variants[0], + sierra_program_registry, + type_sizes, + ); + } + } + let num_variants = &info.variants.len(); + let casm_variant_idx: usize = return_values_iter + .next() + .expect("Missing return value") + .get_int() + .expect("Enum tag is not integer") + .to_usize() + .expect("Invalid enum tag"); + // Convert casm variant idx to sierra variant idx + let variant_idx = if *num_variants > 2 { + num_variants - 1 - (casm_variant_idx >> 1) + } else { + casm_variant_idx + }; + let variant_type_id = &info.variants[variant_idx]; + + // Handle core::bool separately + if let GenericArg::UserType(user_type) = &info.info.long_id.generic_args[0] { + if user_type + .debug_name + .as_ref() + .is_some_and(|n| n == "core::bool") + { + // Sanity checks + assert!( + *num_variants == 2 + && variant_idx < 2 + && type_sizes + .get(&info.variants[0]) + .is_some_and(|size| size.is_zero()) + && type_sizes + .get(&info.variants[1]) + .is_some_and(|size| size.is_zero()), + "Malformed bool enum" + ); + + let boolean_string = match variant_idx { + 0 => "false", + _ => "true", + }; + maybe_add_whitespace(output_string); + output_string.push_str(boolean_string); + return; + } + } + // TODO: Something similar to the bool handling could be done for unit enum variants if we could get the type info with the variant names + + // Space is always allocated for the largest enum member, padding with zeros in front for the smaller variants + let mut max_variant_size = 0; + for variant in &info.variants { + let variant_size = type_sizes.get(variant).unwrap(); + max_variant_size = std::cmp::max(max_variant_size, *variant_size) + } + for _ in 0..max_variant_size - type_sizes.get(variant_type_id).unwrap() { + // Remove padding + assert_eq!( + return_values_iter.next(), + Some(&MaybeRelocatable::from(0)), + "Malformed enum" + ); + } + serialize_output_inner( + return_values_iter, + output_string, + vm, + variant_type_id, + sierra_program_registry, + type_sizes, + ) + } + cairo_lang_sierra::extensions::core::CoreTypeConcrete::Struct(info) => { + for member_type_id in &info.members { + serialize_output_inner( + return_values_iter, + output_string, + vm, + member_type_id, + sierra_program_registry, + type_sizes, + ) + } + } + cairo_lang_sierra::extensions::core::CoreTypeConcrete::Felt252Dict(info) => { + // Process Dictionary + let dict_ptr = return_values_iter + .next() + .expect("Missing return val") + .get_relocatable() + .expect("Dict Ptr not Relocatable"); + if !(dict_ptr.offset + == vm + .get_segment_size(dict_ptr.segment_index as usize) + .unwrap_or_default() + && dict_ptr.offset % 3 == 0) + { + panic!("Return value is not a valid Felt252Dict") + } + // Fetch dictionary values type id + let value_type_id = &info.ty; + // Fetch the dictionary's memory + let dict_mem = vm + .get_continuous_range((dict_ptr.segment_index, 0).into(), dict_ptr.offset) + .expect("Malformed dictionary memory"); + // Serialize the dictionary + output_string.push('{'); + // The dictionary's memory is made up of (key, prev_value, next_value) tuples + // The prev value is not relevant to the user so we can skip over it for calrity + for (key, _, value) in dict_mem.iter().tuples() { + maybe_add_whitespace(output_string); + // Serialize the key wich should always be a Felt value + output_string.push_str(&key.to_string()); + output_string.push(':'); + // Serialize the value + // We create a peekable array here in order to use the serialize_output_inner as the value could be a span + let value_vec = [value.clone()]; + let mut value_iter = value_vec.iter().peekable(); + serialize_output_inner( + &mut value_iter, + output_string, + vm, + value_type_id, + sierra_program_registry, + type_sizes, + ); + } + output_string.push('}'); + } + cairo_lang_sierra::extensions::core::CoreTypeConcrete::SquashedFelt252Dict(info) => { + // Process Dictionary + let dict_start = return_values_iter + .next() + .expect("Missing return val") + .get_relocatable() + .expect("Squashed dict_start ptr not Relocatable"); + let dict_end = return_values_iter + .next() + .expect("Missing return val") + .get_relocatable() + .expect("Squashed dict_end ptr not Relocatable"); + let dict_size = (dict_end - dict_start).unwrap(); + if dict_size % 3 != 0 { + panic!("Return value is not a valid SquashedFelt252Dict") + } + // Fetch dictionary values type id + let value_type_id = &info.ty; + // Fetch the dictionary's memory + let dict_mem = vm + .get_continuous_range(dict_start, dict_size) + .expect("Malformed squashed dictionary memory"); + // Serialize the dictionary + output_string.push('{'); + // The dictionary's memory is made up of (key, prev_value, next_value) tuples + // The prev value is not relevant to the user so we can skip over it for calrity + for (key, _, value) in dict_mem.iter().tuples() { + maybe_add_whitespace(output_string); + // Serialize the key wich should always be a Felt value + output_string.push_str(&key.to_string()); + output_string.push(':'); + // Serialize the value + // We create a peekable array here in order to use the serialize_output_inner as the value could be a span + let value_vec = [value.clone()]; + let mut value_iter = value_vec.iter().peekable(); + serialize_output_inner( + &mut value_iter, + output_string, + vm, + value_type_id, + sierra_program_registry, + type_sizes, + ); + } + output_string.push('}'); + } + cairo_lang_sierra::extensions::core::CoreTypeConcrete::Span(_) => unimplemented!("Span types get resolved to Array in the current version"), + cairo_lang_sierra::extensions::core::CoreTypeConcrete::Snapshot(info) => { + serialize_output_inner( + return_values_iter, + output_string, + vm, + &info.ty, + sierra_program_registry, + type_sizes, + ) + } + cairo_lang_sierra::extensions::core::CoreTypeConcrete::GasBuiltin(_info) => { + // Ignore it + let _ = return_values_iter.next(); + }, + _ => panic!("Unexpected return type") + } +} + +fn maybe_add_whitespace(string: &mut String) { + if !string.is_empty() && !string.ends_with('[') && !string.ends_with('{') { + string.push(' '); + } +} diff --git a/prover/src/cairo1_run/runner_error.rs b/prover/src/cairo1_run/runner_error.rs new file mode 100644 index 0000000..4233002 --- /dev/null +++ b/prover/src/cairo1_run/runner_error.rs @@ -0,0 +1,66 @@ +use cairo_lang_sierra::{ids::ConcreteTypeId, program_registry::ProgramRegistryError}; +use cairo_lang_sierra_to_casm::{compiler::CompilationError, metadata::MetadataError}; +use cairo_vm::{ + air_public_input::PublicInputError, + cairo_run::EncodeTraceError, + types::errors::program_errors::ProgramError, + vm::errors::{ + memory_errors::MemoryError, runner_errors::RunnerError, trace_errors::TraceError, + vm_errors::VirtualMachineError, + }, + Felt252, +}; +use thiserror::Error; + +#[derive(Debug, Error)] +pub enum CairoRunError { + #[error("Invalid arguments")] + Cli(#[from] clap::Error), + #[error("Failed to interact with the file system")] + IO(#[from] std::io::Error), + #[error(transparent)] + EncodeTrace(#[from] EncodeTraceError), + #[error(transparent)] + VirtualMachine(#[from] VirtualMachineError), + #[error(transparent)] + Trace(#[from] TraceError), + #[error(transparent)] + PublicInput(#[from] PublicInputError), + #[error(transparent)] + Runner(#[from] RunnerError), + #[error(transparent)] + ProgramRegistry(#[from] Box), + #[error(transparent)] + Compilation(#[from] Box), + #[error("Failed to compile to sierra:\n {0}")] + SierraCompilation(String), + #[error(transparent)] + Metadata(#[from] MetadataError), + #[error(transparent)] + Program(#[from] ProgramError), + #[error(transparent)] + Memory(#[from] MemoryError), + #[error("Program panicked with {0:?}")] + RunPanic(Vec), + #[error("Function signature has no return types")] + NoRetTypesInSignature, + #[error("No size for concrete type id: {0}")] + NoTypeSizeForId(ConcreteTypeId), + #[error("Concrete type id has no debug name: {0}")] + TypeIdNoDebugName(ConcreteTypeId), + #[error("No info in sierra program registry for concrete type id: {0}")] + NoInfoForType(ConcreteTypeId), + #[error("Failed to extract return values from VM")] + FailedToExtractReturnValues, + #[error("Function expects arguments of size {expected} and received {actual} instead.")] + ArgumentsSizeMismatch { expected: i16, actual: i16 }, + #[error("Function param {param_index} only partially contains argument {arg_index}.")] + ArgumentUnaligned { + param_index: usize, + arg_index: usize, + }, + #[error("Only programs returning `Array` can be currently proven. Try serializing the final values before returning them")] + IlegalReturnValue, + #[error("Only programs with `Array` as an input can be currently proven. Try inputing the serialized version of the input and deserializing it on main")] + IlegalInputValue, +} diff --git a/prover/src/lib.rs b/prover/src/lib.rs index f50471d..2694b10 100644 --- a/prover/src/lib.rs +++ b/prover/src/lib.rs @@ -1,4 +1,5 @@ pub mod auth; +pub mod cairo1_run; pub mod errors; pub mod extractors; pub mod prove; @@ -7,9 +8,8 @@ pub mod sse; pub mod threadpool; pub mod utils; pub mod verifier; -use std::path::PathBuf; - use clap::{arg, Parser}; +use std::path::PathBuf; #[derive(Parser, Debug)] #[clap(author, version, about, long_about = None)] diff --git a/prover/src/threadpool/prove.rs b/prover/src/threadpool/prove.rs index cec4914..c6fb42c 100644 --- a/prover/src/threadpool/prove.rs +++ b/prover/src/threadpool/prove.rs @@ -16,6 +16,7 @@ use tempfile::TempDir; use tokio::process::Command; use tokio::sync::broadcast::Sender; use tokio::sync::Mutex; +use tracing::trace; pub async fn prove( job_id: u64, @@ -102,16 +103,16 @@ fn prover_result(proof: String, cairo_version: CairoVersion) -> Result Command { + trace!("Prover command"); let mut command = Command::new("cpu_air_prover"); command .arg("--out_file") diff --git a/prover/src/threadpool/run.rs b/prover/src/threadpool/run.rs index 96f3a28..cb0acb1 100644 --- a/prover/src/threadpool/run.rs +++ b/prover/src/threadpool/run.rs @@ -1,11 +1,12 @@ use std::{fs, path::PathBuf}; +use cairo_vm::types::layout_name::LayoutName; use common::prover_input::{Cairo0ProverInput, CairoProverInput}; use starknet_types_core::felt::Felt; use tokio::process::Command; use tracing::trace; -use crate::errors::ProverError; +use crate::{cairo1_run::run_cairo_program, errors::ProverError}; use super::prove::ProvePaths; pub enum CairoVersionedInput { @@ -40,8 +41,27 @@ impl CairoVersionedInput { match self { CairoVersionedInput::Cairo(input) => { trace!("Running cairo1-run"); - let command = paths.cairo1_run_command(&input.layout); - command_run(command).await + for path in &[ + paths.trace_file, + paths.memory_file, + paths.public_input_file, + paths.private_input_file, + paths.program_input_path, + paths.program, + ] { + std::fs::File::create(path)?; + } + let program_json = + serde_json::from_value(serde_json::to_value(input.program.clone())?)?; + run_cairo_program( + program_json, + LayoutName::recursive, + input.program_input.clone(), + paths, + ) + .unwrap(); //change this line to use layout type instead of string + println!("Finished running cairo program"); + Ok(()) } CairoVersionedInput::Cairo0(input) => { trace!("Running cairo0-run"); @@ -53,34 +73,15 @@ impl CairoVersionedInput { } pub struct RunPaths<'a> { - trace_file: &'a PathBuf, - memory_file: &'a PathBuf, - public_input_file: &'a PathBuf, - private_input_file: &'a PathBuf, - program_input_path: &'a PathBuf, - program: &'a PathBuf, + pub trace_file: &'a PathBuf, + pub memory_file: &'a PathBuf, + pub public_input_file: &'a PathBuf, + pub private_input_file: &'a PathBuf, + pub program_input_path: &'a PathBuf, + pub program: &'a PathBuf, } impl RunPaths<'_> { - pub fn cairo1_run_command(&self, layout: &str) -> Command { - let mut command = Command::new("cairo1-run"); - command - .arg("--trace_file") - .arg(self.trace_file) - .arg("--memory_file") - .arg(self.memory_file) - .arg("--layout") - .arg(layout) - .arg("--proof_mode") - .arg("--air_public_input") - .arg(self.public_input_file) - .arg("--air_private_input") - .arg(self.private_input_file) - .arg("--args_file") - .arg(self.program_input_path) - .arg(self.program); - command - } pub fn cairo0_run_command(&self, layout: &str) -> Command { let mut command = Command::new("cairo-run"); command @@ -126,7 +127,7 @@ impl<'a> From<&'a ProvePaths> for RunPaths<'a> { } } -async fn command_run(mut command: Command) -> Result<(), ProverError> { +pub async fn command_run(mut command: Command) -> Result<(), ProverError> { command .stdout(std::process::Stdio::piped()) .stderr(std::process::Stdio::piped()); diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 7ae2b72..bbf217f 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,3 +1,3 @@ [toolchain] -channel = "1.79.0" +channel = "1.81.0" profile = "default"