From 4cff4c9a8afee39a79abcd5d552de9a0438c3b81 Mon Sep 17 00:00:00 2001 From: clearloop Date: Mon, 7 Dec 2020 16:22:39 +0800 Subject: [PATCH 01/33] feat(primitives/io): update the usage of megaclite --- Cargo.lock | 262 +++++++++++++++++++++++++-------------- primitives/io/Cargo.toml | 2 +- primitives/io/src/lib.rs | 75 +++++++---- 3 files changed, 221 insertions(+), 118 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fe183d12..9321476f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -139,6 +139,109 @@ version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d25d88fd6b8041580a654f9d0c581a047baee2b3efee13275f2fc392fc75034" +[[package]] +name = "ark-bls12-377" +version = "0.1.0" +source = "git+https://github.com/arkworks-rs/curves#23e87bf224c23be5c5bccc6084aae31fff8bb83f" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-std", +] + +[[package]] +name = "ark-bls12-381" +version = "0.1.0" +source = "git+https://github.com/arkworks-rs/curves#23e87bf224c23be5c5bccc6084aae31fff8bb83f" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-std", +] + +[[package]] +name = "ark-bn254" +version = "0.1.0" +source = "git+https://github.com/arkworks-rs/curves#23e87bf224c23be5c5bccc6084aae31fff8bb83f" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-std", +] + +[[package]] +name = "ark-bw6-761" +version = "0.1.0" +source = "git+https://github.com/arkworks-rs/curves#23e87bf224c23be5c5bccc6084aae31fff8bb83f" +dependencies = [ + "ark-bls12-377", + "ark-ec", + "ark-ff", + "ark-std", +] + +[[package]] +name = "ark-cp6-782" +version = "0.1.0" +source = "git+https://github.com/arkworks-rs/curves#23e87bf224c23be5c5bccc6084aae31fff8bb83f" +dependencies = [ + "ark-bls12-377", + "ark-ec", + "ark-ff", + "ark-std", +] + +[[package]] +name = "ark-ec" +version = "0.1.0" +source = "git+https://github.com/arkworks-rs/algebra#2bc9f89f819c783072f64dd649ffb95cb02b2fa4" +dependencies = [ + "ark-ff", + "ark-serialize", + "ark-std", + "derivative", + "num-traits", + "rand 0.7.3", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.1.0" +source = "git+https://github.com/arkworks-rs/algebra#2bc9f89f819c783072f64dd649ffb95cb02b2fa4" +dependencies = [ + "ark-ff-asm", + "ark-serialize", + "ark-std", + "derivative", + "num-traits", + "rand 0.7.3", + "rustc_version 0.3.0", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.1.0" +source = "git+https://github.com/arkworks-rs/algebra#2bc9f89f819c783072f64dd649ffb95cb02b2fa4" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "ark-serialize" +version = "0.1.0" +source = "git+https://github.com/arkworks-rs/algebra#2bc9f89f819c783072f64dd649ffb95cb02b2fa4" +dependencies = [ + "ark-std", +] + +[[package]] +name = "ark-std" +version = "0.1.0" +source = "git+https://github.com/arkworks-rs/utils#f6974ac72f59339b7ab798a728a84c5a7b8bac45" + [[package]] name = "arrayref" version = "0.3.6" @@ -373,22 +476,6 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" -[[package]] -name = "bellman_ce" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5ca1343d8690bb4d62e0665116bd4f109e33a642f86908ed107d226a402b0ef" -dependencies = [ - "bit-vec", - "byteorder", - "cfg-if 0.1.10", - "crossbeam", - "futures 0.3.8", - "num_cpus", - "pairing_ce", - "rand 0.4.6", -] - [[package]] name = "bincode" version = "1.3.1" @@ -423,12 +510,6 @@ dependencies = [ "which", ] -[[package]] -name = "bit-vec" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0dc55f2d8a1a85650ac47858bb001b4c0dd73d79e3c455a842925e68d29cd3" - [[package]] name = "bitflags" version = "1.2.1" @@ -874,30 +955,6 @@ dependencies = [ "cfg-if 1.0.0", ] -[[package]] -name = "crossbeam" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69323bff1fb41c635347b8ead484a5ca6c3f11914d784170b158d8449ab07f8e" -dependencies = [ - "cfg-if 0.1.10", - "crossbeam-channel 0.4.4", - "crossbeam-deque 0.7.3", - "crossbeam-epoch 0.8.2", - "crossbeam-queue", - "crossbeam-utils 0.7.2", -] - -[[package]] -name = "crossbeam-channel" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b153fe7cbef478c567df0f972e02e6d736db11affe43dfc9c56a9374d1adfb87" -dependencies = [ - "crossbeam-utils 0.7.2", - "maybe-uninit", -] - [[package]] name = "crossbeam-channel" version = "0.5.0" @@ -1071,6 +1128,17 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "993a608597367c6377b258c25d7120740f00ed23a2252b729b1932dd7866f908" +[[package]] +name = "derivative" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb582b60359da160a9477ee80f15c8d784c477e69c217ef2cdd4169c24ea380f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "derive_more" version = "0.99.11" @@ -1312,32 +1380,6 @@ dependencies = [ "libc", ] -[[package]] -name = "ff_ce" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4592897f75fd1bd178e5ec12d9d7df3d1943464feda2cbce1e708a484e82c8f6" -dependencies = [ - "byteorder", - "ff_derive_ce", - "hex", - "rand 0.4.6", -] - -[[package]] -name = "ff_derive_ce" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50c052fa6d4c2f12305ec364bfb8ef884836f3f61ea015b202372ff996d1ac4b" -dependencies = [ - "num-bigint", - "num-integer", - "num-traits", - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "file-per-thread-logger" version = "0.1.4" @@ -1799,7 +1841,7 @@ dependencies = [ "cc", "libc", "log", - "rustc_version", + "rustc_version 0.2.3", "winapi 0.3.9", ] @@ -2154,7 +2196,7 @@ dependencies = [ "itoa", "log", "net2", - "rustc_version", + "rustc_version 0.2.3", "time", "tokio 0.1.22", "tokio-buf", @@ -3444,9 +3486,28 @@ checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" [[package]] name = "megaclite" version = "0.1.0" -source = "git+https://github.com/patractlabs/megaclite.git#83484f7c6329fbfc74856c87d6fddf1ef033e43d" +source = "git+https://github.com/patractlabs/megaclite.git#6551bca2acc80ba292905e2323cd8d221a459542" dependencies = [ - "bellman_ce", + "megaclite-arkworks", + "num-bigint 0.3.1", +] + +[[package]] +name = "megaclite-arkworks" +version = "0.1.0" +source = "git+https://github.com/patractlabs/megaclite.git#6551bca2acc80ba292905e2323cd8d221a459542" +dependencies = [ + "ark-bls12-377", + "ark-bls12-381", + "ark-bn254", + "ark-bw6-761", + "ark-cp6-782", + "ark-ec", + "ark-ff", + "ark-serialize", + "ark-std", + "rand 0.7.3", + "rustc-hex", ] [[package]] @@ -3743,6 +3804,17 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-bigint" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e9a41747ae4633fce5adffb4d2e81ffc5e89593cb19917f8fb2cc5ff76507bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + [[package]] name = "num-complex" version = "0.2.4" @@ -3770,7 +3842,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c000134b5dbf44adc5cb772486d335293351644b801551abe8f75c84cfa4aef" dependencies = [ "autocfg", - "num-bigint", + "num-bigint 0.2.6", "num-integer", "num-traits", ] @@ -3854,17 +3926,6 @@ dependencies = [ "stable_deref_trait", ] -[[package]] -name = "pairing_ce" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfc00d65b1d29e0a067a967fcea83d8db261c149f76a557ba73f0304f01cdfde" -dependencies = [ - "byteorder", - "ff_ce", - "rand 0.4.6", -] - [[package]] name = "pallet-authority-discovery" version = "2.0.0" @@ -4403,7 +4464,7 @@ checksum = "f842b1982eb6c2fe34036a4fbfb06dd185a3f5c8edfaacdf7d1ea10b07de6252" dependencies = [ "lock_api 0.3.4", "parking_lot_core 0.6.2", - "rustc_version", + "rustc_version 0.2.3", ] [[package]] @@ -4437,7 +4498,7 @@ dependencies = [ "cloudabi 0.0.3", "libc", "redox_syscall", - "rustc_version", + "rustc_version 0.2.3", "smallvec 0.6.13", "winapi 0.3.9", ] @@ -4991,7 +5052,7 @@ checksum = "b4a349ca83373cfa5d6dbb66fd76e58b2cca08da71a5f6400de0a0a6a9bceeaf" dependencies = [ "bitflags", "cc", - "rustc_version", + "rustc_version 0.2.3", ] [[package]] @@ -5018,7 +5079,7 @@ version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ab346ac5921dc62ffa9f89b7a773907511cdfa5490c572ae9be1be33e8afa4a" dependencies = [ - "crossbeam-channel 0.5.0", + "crossbeam-channel", "crossbeam-deque 0.8.0", "crossbeam-utils 0.8.0", "lazy_static", @@ -5211,6 +5272,15 @@ dependencies = [ "semver 0.9.0", ] +[[package]] +name = "rustc_version" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65c94201b44764d6d1f7e37c15a8289ed55e546c1762c7f1d57f616966e0c181" +dependencies = [ + "semver 0.11.0", +] + [[package]] name = "rustls" version = "0.18.1" @@ -5259,7 +5329,7 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d3d055a2582e6b00ed7a31c1524040aa391092bf636328350813f3a0605215c" dependencies = [ - "rustc_version", + "rustc_version 0.2.3", ] [[package]] @@ -5522,7 +5592,7 @@ dependencies = [ "futures-timer 3.0.2", "log", "merlin", - "num-bigint", + "num-bigint 0.2.6", "num-rational", "num-traits", "parity-scale-codec", @@ -6581,7 +6651,7 @@ dependencies = [ "rand 0.7.3", "rand_core 0.5.1", "ring", - "rustc_version", + "rustc_version 0.2.3", "sha2 0.9.2", "subtle 2.3.0", "x25519-dalek", @@ -7968,7 +8038,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04f8ab788026715fa63b31960869617cba39117e520eb415b0139543e325ab59" dependencies = [ "cfg-if 0.1.10", - "rand 0.7.3", + "rand 0.3.23", "static_assertions", ] diff --git a/primitives/io/Cargo.toml b/primitives/io/Cargo.toml index dd9b8c95..5a357655 100644 --- a/primitives/io/Cargo.toml +++ b/primitives/io/Cargo.toml @@ -9,7 +9,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] sp-runtime-interface = { git = "https://github.com/paritytech/substrate.git", branch = "master", default-features = false } -megaclite = { git = "https://github.com/patractlabs/megaclite.git", default-features = false, optional = true } +megaclite = { git = "https://github.com/patractlabs/megaclite.git", default-features = false, optional = true, features = ["arkworks"] } [features] default = ["std"] diff --git a/primitives/io/src/lib.rs b/primitives/io/src/lib.rs index 9027fe7d..8e2dd7b9 100644 --- a/primitives/io/src/lib.rs +++ b/primitives/io/src/lib.rs @@ -6,33 +6,66 @@ use sp_runtime_interface::runtime_interface; /// ZK-SNARKs runtime interface #[runtime_interface] pub trait ZkSnarks { - /// altbn_128 add - fn altbn_128_add(input: &[u8]) -> Option<[u8; 64]> { - megaclite::altbn_128::add(input).ok() - } + /// Vector Addition + fn add(fn_id: i32, input: &[u8], output: &mut [u8]) -> Option<()> { + let res = match fn_id { + 0x2a => { + ::add(input).ok() + } + 0x2b => { + ::add(input).ok() + } + 0x2c => ::add(input).ok(), + 0x2d => { + ::add(input).ok() + } + _ => None, + }?; - /// altbn_128 mul - fn altbn_128_mul(input: &[u8]) -> Option<[u8; 64]> { - megaclite::altbn_128::mul(input).ok() + output.copy_from_slice(&res); + Some(()) } - /// altbn_128 pairing - fn altbn_128_pairing(input: &[u8]) -> Option { - megaclite::altbn_128::pairing(input).ok() - } + /// Scalar Multiplication + fn mul(fn_id: i32, input: &[u8], output: &mut [u8]) -> Option<()> { + let res = match fn_id { + 0x2a => { + ::mul(input).ok() + } + 0x2b => { + ::mul(input).ok() + } + 0x2c => ::mul(input).ok(), + 0x2d => { + ::mul(input).ok() + } + _ => None, + }?; - /// bls12_381 add - fn bls12_381_add(input: &[u8]) -> Option<[u8; 96]> { - megaclite::bls12_381::add(input).ok() + output.copy_from_slice(&res); + Some(()) } - /// bls12_381 mul - fn bls12_381_mul(input: &[u8]) -> Option<[u8; 96]> { - megaclite::bls12_381::mul(input).ok() - } + /// Scalar Multiplication + fn pairing(fn_id: i32, input: &[u8]) -> Option { + let res = match fn_id { + 0x2a => { + ::pairing(input) + .ok() + } + 0x2b => { + ::pairing(input) + .ok() + } + 0x2c => { + ::pairing(input).ok() + } + 0x2d => { + ::pairing(input).ok() + } + _ => None, + }?; - /// bls12_381 pairing - fn bls12_381_pairing(input: &[u8]) -> Option { - megaclite::bls12_381::pairing(input).ok() + Some(res) } } From 5cf9d7f03250991194f920a1c63a9819cb2e368b Mon Sep 17 00:00:00 2001 From: clearloop Date: Tue, 8 Dec 2020 10:29:35 +0800 Subject: [PATCH 02/33] feat(primitives/io): use vector instead of C style pointer in api --- primitives/io/src/lib.rs | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/primitives/io/src/lib.rs b/primitives/io/src/lib.rs index 8e2dd7b9..ed552c21 100644 --- a/primitives/io/src/lib.rs +++ b/primitives/io/src/lib.rs @@ -7,8 +7,8 @@ use sp_runtime_interface::runtime_interface; #[runtime_interface] pub trait ZkSnarks { /// Vector Addition - fn add(fn_id: i32, input: &[u8], output: &mut [u8]) -> Option<()> { - let res = match fn_id { + fn add(fn_id: i32, input: &[u8]) -> Option> { + Some(match fn_id { 0x2a => { ::add(input).ok() } @@ -20,15 +20,12 @@ pub trait ZkSnarks { ::add(input).ok() } _ => None, - }?; - - output.copy_from_slice(&res); - Some(()) + }?) } /// Scalar Multiplication - fn mul(fn_id: i32, input: &[u8], output: &mut [u8]) -> Option<()> { - let res = match fn_id { + fn mul(fn_id: i32, input: &[u8]) -> Option> { + Some(match fn_id { 0x2a => { ::mul(input).ok() } @@ -40,15 +37,12 @@ pub trait ZkSnarks { ::mul(input).ok() } _ => None, - }?; - - output.copy_from_slice(&res); - Some(()) + }?) } /// Scalar Multiplication fn pairing(fn_id: i32, input: &[u8]) -> Option { - let res = match fn_id { + Some(match fn_id { 0x2a => { ::pairing(input) .ok() @@ -64,8 +58,6 @@ pub trait ZkSnarks { ::pairing(input).ok() } _ => None, - }?; - - Some(res) + }?) } } From 5ef5a20b4016ef281e4583eb27787fa2b954a573 Mon Sep 17 00:00:00 2001 From: clearloop Date: Tue, 8 Dec 2020 11:39:14 +0800 Subject: [PATCH 03/33] feat(primitives/io): add groth16 verification --- Cargo.lock | 7 +- primitives/io/Cargo.toml | 4 +- primitives/io/src/groth16.rs | 148 +++++++++++++++++++++++++++++++++++ primitives/io/src/lib.rs | 29 ++++--- 4 files changed, 172 insertions(+), 16 deletions(-) create mode 100644 primitives/io/src/groth16.rs diff --git a/Cargo.lock b/Cargo.lock index 9321476f..c5d072af 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2696,6 +2696,8 @@ name = "jupiter-io" version = "0.2.0" dependencies = [ "megaclite", + "num-bigint 0.3.1", + "num-traits", "sp-runtime-interface", ] @@ -3486,16 +3488,17 @@ checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" [[package]] name = "megaclite" version = "0.1.0" -source = "git+https://github.com/patractlabs/megaclite.git#6551bca2acc80ba292905e2323cd8d221a459542" +source = "git+https://github.com/patractlabs/megaclite.git?rev=cd0a365#cd0a365a9a65aa2bbee56752b63dbae03a7c7116" dependencies = [ "megaclite-arkworks", "num-bigint 0.3.1", + "num-traits", ] [[package]] name = "megaclite-arkworks" version = "0.1.0" -source = "git+https://github.com/patractlabs/megaclite.git#6551bca2acc80ba292905e2323cd8d221a459542" +source = "git+https://github.com/patractlabs/megaclite.git?rev=cd0a365#cd0a365a9a65aa2bbee56752b63dbae03a7c7116" dependencies = [ "ark-bls12-377", "ark-bls12-381", diff --git a/primitives/io/Cargo.toml b/primitives/io/Cargo.toml index 5a357655..e2c72364 100644 --- a/primitives/io/Cargo.toml +++ b/primitives/io/Cargo.toml @@ -9,7 +9,9 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] sp-runtime-interface = { git = "https://github.com/paritytech/substrate.git", branch = "master", default-features = false } -megaclite = { git = "https://github.com/patractlabs/megaclite.git", default-features = false, optional = true, features = ["arkworks"] } +megaclite = { git = "https://github.com/patractlabs/megaclite.git", default-features = false, optional = true, features = ["arkworks"], rev = "cd0a365" } +num-bigint = "0.3.1" +num-traits = "0.2.14" [features] default = ["std"] diff --git a/primitives/io/src/groth16.rs b/primitives/io/src/groth16.rs new file mode 100644 index 00000000..b397e484 --- /dev/null +++ b/primitives/io/src/groth16.rs @@ -0,0 +1,148 @@ +//! Groth16 +use megaclite::{CurveBasicOperations, Error, ErrorKind, SerializationError}; +use num_bigint::BigUint; +use num_traits::Num; + +/// Groth16 verification +pub fn verify( + curve_id: i32, + vk_gamma_abc: &[&[u8]], + vk: &[u8], + proof: &[u8], + public_inputs: &[&[u8]], +) -> Result { + match curve_id { + 0x2a => { + inner_verify::(vk_gamma_abc, vk, proof, public_inputs) + } + 0x2b => { + inner_verify::(vk_gamma_abc, vk, proof, public_inputs) + } + 0x2c => inner_verify::(vk_gamma_abc, vk, proof, public_inputs), + 0x2d => inner_verify::(vk_gamma_abc, vk, proof, public_inputs), + _ => Err(SerializationError::IoError(Error::new( + ErrorKind::Other, + "Unsupported Curve", + ))), + } +} + +/// Groth16 verification inner +fn inner_verify( + vk_gamma_abc: &[&[u8]], + vk: &[u8], + proof: &[u8], + public_inputs: &[&[u8]], +) -> Result { + let g1_len = C::G1_LEN; + let g2_len = C::G2_LEN; + let g1_g2_len = C::G2_LEN + C::G1_LEN; + let scalar_len = C::SCALAR_LEN; + + if (public_inputs.len() + 1) != vk_gamma_abc.len() { + return Err(Error::new(ErrorKind::Other, "Verifying key was malformed"))?; + } + + // First two fields are used as the sum + let mut acc = vk_gamma_abc[0].to_vec(); + + // Compute the linear combination vk_x + // [(βui(x)+αvi(x)+wi(x))/γ] ∈ G1 + // acc = sigma(i:0~l)* [(βui(x)+αvi(x)+wi(x))/γ] ∈ G1 + for (i, b) in public_inputs.iter().zip(vk_gamma_abc.iter().skip(1)) { + public_input_require_on_curve::(i).map_err(|e| Error::new(ErrorKind::Other, e))?; + + let mut mul_input = vec![0u8; g1_len + scalar_len]; + mul_input[0..g1_len].copy_from_slice(b); + mul_input[g1_len..g1_len + scalar_len].copy_from_slice(i); + + let mul_ic = C::mul(&mul_input)?; + + let mut acc_mul_ic = vec![0u8; g1_len * 2]; + acc_mul_ic[0..g1_len].copy_from_slice(acc.as_ref()); + acc_mul_ic[g1_len..g1_len * 2].copy_from_slice(mul_ic.as_ref()); + + acc = C::add(&*acc_mul_ic)?; + } + + // The original verification equation is: + // A * B = alpha * beta + acc * gamma + C * delta + // ... however, we rearrange it so that it is: + // A * B - acc * gamma - C * delta = alpha * beta + // or equivalently: + // A * B + (-acc) * gamma + (-C) * delta + (-alpha) * beta = 0 + let pairings = [ + ( + &proof[0..g1_len / 2], // G1 x + &proof[g1_len / 2..g1_len - 1], // G1 y + &proof[g1_len - 1..g1_len], // G1 infinity + &proof[g1_len..g1_len + g2_len], // G2 + ), + ( + &acc[0..g1_len / 2], + &*negate_y::(&acc[g1_len / 2..g1_len - 1]) + .map_err(|e| Error::new(ErrorKind::Other, e))?, + &acc[g1_len - 1..g1_len], + &vk[0..g2_len], + ), + ( + &proof[g1_g2_len..g1_g2_len + g1_len / 2], + &*negate_y::(&proof[g1_g2_len + g1_len / 2..g1_g2_len + g1_len - 1]) + .map_err(|e| Error::new(ErrorKind::Other, e))?, + &proof[g1_g2_len + g1_len - 1..g1_g2_len + g1_len], + &vk[g2_len..g2_len * 2], + ), + ( + &vk[g2_len * 2..g2_len * 2 + g1_len / 2], + &*negate_y::(&vk[g2_len * 2 + g1_len / 2..g2_len * 2 + g1_len - 1]) + .map_err(|e| Error::new(ErrorKind::Other, e))?, + &vk[g2_len * 2 + g1_len - 1..g2_len * 2 + g1_len], + &vk[g2_len * 2 + g1_len..g2_len * 3 + g1_len], + ), + ]; + + let mut input = Vec::with_capacity((g1_len + g2_len) * 4); + pairings.iter().for_each(|(x, y, infinity, g2)| { + input.extend_from_slice(x); + input.extend_from_slice(y); + input.extend_from_slice(infinity); + input.extend_from_slice(g2); + }); + + // Return the result of computing the pairing check + // e(p1[0], p2[0]) * .... * e(p1[n], p2[n]) == 1. + // For example pairing([P1(), P1().negate()], [P2(), P2()]) should return true. + C::pairings(&input[..]) +} + +fn negate_y_based_curve(y: BigUint, prime_field: &'static str) -> Result { + let q = BigUint::from_str_radix(prime_field, 10) + .map_err(|_| "Wrong curve parameter:PRIME_FIELD")?; + let q_clone = q.clone(); + Ok(q - y % q_clone) +} + +fn negate_y(y: &[u8]) -> Result, &'static str> { + let neg_y = negate_y_based_curve(BigUint::from_bytes_be(y), C::PRIME_FIELD)?.to_bytes_be(); + + // Because of randomness, Negate_y vector might not satisfy 32 or 48 bytes. + let mut neg_y_fill_with_zero = vec![0u8; y.len()]; + if neg_y.len() != y.len() { + neg_y_fill_with_zero[y.len() - neg_y.len()..y.len()].copy_from_slice(&*neg_y); + } else { + neg_y_fill_with_zero[0..y.len()].copy_from_slice(&*neg_y); + } + Ok(neg_y_fill_with_zero) +} + +fn public_input_require_on_curve( + input: &[u8], +) -> Result<(), &'static str> { + if BigUint::from_bytes_be(input) + >= BigUint::from_str_radix(C::SCALAR_FIELD, 10) + .map_err(|_| "Parse wrong: public input to BigUint.")? + { + return Err("public input is invalid."); + } + Ok(()) +} diff --git a/primitives/io/src/lib.rs b/primitives/io/src/lib.rs index ed552c21..37aaf4e4 100644 --- a/primitives/io/src/lib.rs +++ b/primitives/io/src/lib.rs @@ -3,12 +3,14 @@ #![cfg_attr(not(feature = "std"), no_std)] use sp_runtime_interface::runtime_interface; -/// ZK-SNARKs runtime interface +pub mod groth16; + +/// Pairing runtime interface #[runtime_interface] -pub trait ZkSnarks { +pub trait Pairing { /// Vector Addition - fn add(fn_id: i32, input: &[u8]) -> Option> { - Some(match fn_id { + fn add(curve_id: i32, input: &[u8]) -> Option> { + Some(match curve_id { 0x2a => { ::add(input).ok() } @@ -24,8 +26,8 @@ pub trait ZkSnarks { } /// Scalar Multiplication - fn mul(fn_id: i32, input: &[u8]) -> Option> { - Some(match fn_id { + fn mul(curve_id: i32, input: &[u8]) -> Option> { + Some(match curve_id { 0x2a => { ::mul(input).ok() } @@ -40,22 +42,23 @@ pub trait ZkSnarks { }?) } - /// Scalar Multiplication - fn pairing(fn_id: i32, input: &[u8]) -> Option { - Some(match fn_id { + /// Pairing + fn pairing(curve_id: i32, input: &[u8]) -> Option { + Some(match curve_id { 0x2a => { - ::pairing(input) + ::pairings(input) .ok() } 0x2b => { - ::pairing(input) + ::pairings(input) .ok() } 0x2c => { - ::pairing(input).ok() + ::pairings(input).ok() } 0x2d => { - ::pairing(input).ok() + ::pairings(input) + .ok() } _ => None, }?) From 09f72ff09d8ee159c03d60784a9cbb091440a075 Mon Sep 17 00:00:00 2001 From: clearloop Date: Tue, 8 Dec 2020 11:50:47 +0800 Subject: [PATCH 04/33] feat(primitives/io): ops with runtime interface --- primitives/io/src/groth16.rs | 48 +++++++++++++++++++++++++++--------- 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/primitives/io/src/groth16.rs b/primitives/io/src/groth16.rs index b397e484..589872ce 100644 --- a/primitives/io/src/groth16.rs +++ b/primitives/io/src/groth16.rs @@ -12,23 +12,44 @@ pub fn verify( public_inputs: &[&[u8]], ) -> Result { match curve_id { - 0x2a => { - inner_verify::(vk_gamma_abc, vk, proof, public_inputs) - } - 0x2b => { - inner_verify::(vk_gamma_abc, vk, proof, public_inputs) - } - 0x2c => inner_verify::(vk_gamma_abc, vk, proof, public_inputs), - 0x2d => inner_verify::(vk_gamma_abc, vk, proof, public_inputs), + 0x2a => inner_verify::( + curve_id, + vk_gamma_abc, + vk, + proof, + public_inputs, + ), + 0x2b => inner_verify::( + curve_id, + vk_gamma_abc, + vk, + proof, + public_inputs, + ), + 0x2c => inner_verify::( + curve_id, + vk_gamma_abc, + vk, + proof, + public_inputs, + ), + 0x2d => inner_verify::( + curve_id, + vk_gamma_abc, + vk, + proof, + public_inputs, + ), _ => Err(SerializationError::IoError(Error::new( ErrorKind::Other, - "Unsupported Curve", + "Unsupported curve", ))), } } /// Groth16 verification inner fn inner_verify( + curve_id: i32, vk_gamma_abc: &[&[u8]], vk: &[u8], proof: &[u8], @@ -56,13 +77,15 @@ fn inner_verify( mul_input[0..g1_len].copy_from_slice(b); mul_input[g1_len..g1_len + scalar_len].copy_from_slice(i); - let mul_ic = C::mul(&mul_input)?; + let mul_ic = super::pairing::mul(curve_id, &mul_input) + .ok_or_else(|| Error::new(ErrorKind::Other, "Mul Failed"))?; let mut acc_mul_ic = vec![0u8; g1_len * 2]; acc_mul_ic[0..g1_len].copy_from_slice(acc.as_ref()); acc_mul_ic[g1_len..g1_len * 2].copy_from_slice(mul_ic.as_ref()); - acc = C::add(&*acc_mul_ic)?; + acc = super::pairing::add(curve_id, &*acc_mul_ic) + .ok_or_else(|| Error::new(ErrorKind::Other, "Add Failed"))?; } // The original verification equation is: @@ -112,7 +135,8 @@ fn inner_verify( // Return the result of computing the pairing check // e(p1[0], p2[0]) * .... * e(p1[n], p2[n]) == 1. // For example pairing([P1(), P1().negate()], [P2(), P2()]) should return true. - C::pairings(&input[..]) + Ok(super::pairing::pairing(curve_id, &input[..]) + .ok_or_else(|| Error::new(ErrorKind::Other, "Add Failed"))?) } fn negate_y_based_curve(y: BigUint, prime_field: &'static str) -> Result { From dfe79e43be6249244e9dd210fb140169998e4260 Mon Sep 17 00:00:00 2001 From: clearloop Date: Fri, 11 Dec 2020 09:36:54 +0800 Subject: [PATCH 05/33] feat(primitives/io): migrate the new api of groth16 --- Cargo.lock | 1412 ++++++++++++++++++++++------------ primitives/io/Cargo.toml | 21 +- primitives/io/src/groth16.rs | 26 +- primitives/io/src/lib.rs | 47 +- vendor/substrate | 2 +- 5 files changed, 939 insertions(+), 569 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c5d072af..1079a8e8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -194,7 +194,7 @@ dependencies = [ [[package]] name = "ark-ec" version = "0.1.0" -source = "git+https://github.com/arkworks-rs/algebra#2bc9f89f819c783072f64dd649ffb95cb02b2fa4" +source = "git+https://github.com/arkworks-rs/algebra#70ebfa6bed96c6738535a13372e3c30a5008c751" dependencies = [ "ark-ff", "ark-serialize", @@ -208,7 +208,7 @@ dependencies = [ [[package]] name = "ark-ff" version = "0.1.0" -source = "git+https://github.com/arkworks-rs/algebra#2bc9f89f819c783072f64dd649ffb95cb02b2fa4" +source = "git+https://github.com/arkworks-rs/algebra#70ebfa6bed96c6738535a13372e3c30a5008c751" dependencies = [ "ark-ff-asm", "ark-serialize", @@ -223,7 +223,7 @@ dependencies = [ [[package]] name = "ark-ff-asm" version = "0.1.0" -source = "git+https://github.com/arkworks-rs/algebra#2bc9f89f819c783072f64dd649ffb95cb02b2fa4" +source = "git+https://github.com/arkworks-rs/algebra#70ebfa6bed96c6738535a13372e3c30a5008c751" dependencies = [ "quote", "syn", @@ -232,7 +232,7 @@ dependencies = [ [[package]] name = "ark-serialize" version = "0.1.0" -source = "git+https://github.com/arkworks-rs/algebra#2bc9f89f819c783072f64dd649ffb95cb02b2fa4" +source = "git+https://github.com/arkworks-rs/algebra#70ebfa6bed96c6738535a13372e3c30a5008c751" dependencies = [ "ark-std", ] @@ -1460,22 +1460,38 @@ dependencies = [ "percent-encoding 2.1.0", ] +[[package]] +name = "frame-benchmarking" +version = "2.0.0" +dependencies = [ + "frame-support 2.0.0", + "frame-system 2.0.0", + "parity-scale-codec", + "paste", + "sp-api 2.0.0", + "sp-io 2.0.0", + "sp-runtime 2.0.0", + "sp-runtime-interface 2.0.0", + "sp-std 2.0.0", + "sp-storage 2.0.0", +] + [[package]] name = "frame-benchmarking" version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ - "frame-support", - "frame-system", + "frame-support 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-system 2.0.0 (git+https://github.com/paritytech/substrate)", "linregress", "parity-scale-codec", "paste", - "sp-api", - "sp-io", - "sp-runtime", - "sp-runtime-interface", - "sp-std", - "sp-storage", + "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-io 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime-interface 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-storage 2.0.0 (git+https://github.com/paritytech/substrate)", ] [[package]] @@ -1484,7 +1500,7 @@ version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ "chrono", - "frame-benchmarking", + "frame-benchmarking 2.0.0 (git+https://github.com/paritytech/substrate)", "handlebars", "parity-scale-codec", "sc-cli", @@ -1492,11 +1508,11 @@ dependencies = [ "sc-executor", "sc-service", "serde", - "sp-core", - "sp-externalities", - "sp-keystore", - "sp-runtime", - "sp-state-machine", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-externalities 0.8.0 (git+https://github.com/paritytech/substrate)", + "sp-keystore 0.8.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-state-machine 0.8.0 (git+https://github.com/paritytech/substrate)", "structopt", ] @@ -1505,15 +1521,25 @@ name = "frame-executive" version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ - "frame-support", - "frame-system", + "frame-support 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-system 2.0.0 (git+https://github.com/paritytech/substrate)", + "parity-scale-codec", + "serde", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-io 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-tracing 2.0.0 (git+https://github.com/paritytech/substrate)", +] + +[[package]] +name = "frame-metadata" +version = "12.0.0" +dependencies = [ "parity-scale-codec", "serde", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", - "sp-tracing", + "sp-core 2.0.0", + "sp-std 2.0.0", ] [[package]] @@ -1523,8 +1549,32 @@ source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e39 dependencies = [ "parity-scale-codec", "serde", - "sp-core", - "sp-std", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", +] + +[[package]] +name = "frame-support" +version = "2.0.0" +dependencies = [ + "bitflags", + "frame-metadata 12.0.0", + "frame-support-procedural 2.0.0", + "impl-trait-for-tuples", + "log", + "once_cell", + "parity-scale-codec", + "paste", + "serde", + "smallvec 1.5.0", + "sp-arithmetic 2.0.0", + "sp-core 2.0.0", + "sp-inherents 2.0.0", + "sp-io 2.0.0", + "sp-runtime 2.0.0", + "sp-state-machine 0.8.0", + "sp-std 2.0.0", + "sp-tracing 2.0.0", ] [[package]] @@ -1533,8 +1583,8 @@ version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ "bitflags", - "frame-metadata", - "frame-support-procedural", + "frame-metadata 12.0.0 (git+https://github.com/paritytech/substrate)", + "frame-support-procedural 2.0.0 (git+https://github.com/paritytech/substrate)", "impl-trait-for-tuples", "log", "once_cell", @@ -1542,14 +1592,24 @@ dependencies = [ "paste", "serde", "smallvec 1.5.0", - "sp-arithmetic", - "sp-core", - "sp-inherents", - "sp-io", - "sp-runtime", - "sp-state-machine", - "sp-std", - "sp-tracing", + "sp-arithmetic 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-inherents 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-io 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-state-machine 0.8.0 (git+https://github.com/paritytech/substrate)", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-tracing 2.0.0 (git+https://github.com/paritytech/substrate)", +] + +[[package]] +name = "frame-support-procedural" +version = "2.0.0" +dependencies = [ + "frame-support-procedural-tools 2.0.0", + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -1557,7 +1617,18 @@ name = "frame-support-procedural" version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ - "frame-support-procedural-tools", + "frame-support-procedural-tools 2.0.0 (git+https://github.com/paritytech/substrate)", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "frame-support-procedural-tools" +version = "2.0.0" +dependencies = [ + "frame-support-procedural-tools-derive 2.0.0", + "proc-macro-crate", "proc-macro2", "quote", "syn", @@ -1568,13 +1639,22 @@ name = "frame-support-procedural-tools" version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ - "frame-support-procedural-tools-derive", + "frame-support-procedural-tools-derive 2.0.0 (git+https://github.com/paritytech/substrate)", "proc-macro-crate", "proc-macro2", "quote", "syn", ] +[[package]] +name = "frame-support-procedural-tools-derive" +version = "2.0.0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0" @@ -1585,20 +1665,35 @@ dependencies = [ "syn", ] +[[package]] +name = "frame-system" +version = "2.0.0" +dependencies = [ + "frame-support 2.0.0", + "impl-trait-for-tuples", + "parity-scale-codec", + "serde", + "sp-core 2.0.0", + "sp-io 2.0.0", + "sp-runtime 2.0.0", + "sp-std 2.0.0", + "sp-version 2.0.0", +] + [[package]] name = "frame-system" version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ - "frame-support", + "frame-support 2.0.0 (git+https://github.com/paritytech/substrate)", "impl-trait-for-tuples", "parity-scale-codec", "serde", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", - "sp-version", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-io 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-version 2.0.0 (git+https://github.com/paritytech/substrate)", ] [[package]] @@ -1606,13 +1701,13 @@ name = "frame-system-benchmarking" version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", + "frame-benchmarking 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-support 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-system 2.0.0 (git+https://github.com/paritytech/substrate)", "parity-scale-codec", - "sp-core", - "sp-runtime", - "sp-std", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", ] [[package]] @@ -1621,7 +1716,7 @@ version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ "parity-scale-codec", - "sp-api", + "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", ] [[package]] @@ -2583,10 +2678,10 @@ dependencies = [ "sp-authority-discovery", "sp-consensus", "sp-consensus-babe", - "sp-core", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-finality-grandpa", - "sp-inherents", - "sp-runtime", + "sp-inherents 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-transaction-pool", "structopt", "substrate-build-script-utils", @@ -2603,7 +2698,7 @@ dependencies = [ name = "jupiter-dev-cli" version = "0.1.0" dependencies = [ - "frame-benchmarking", + "frame-benchmarking 2.0.0 (git+https://github.com/paritytech/substrate)", "frame-benchmarking-cli", "futures 0.3.8", "jupiter-dev-executor", @@ -2623,11 +2718,11 @@ dependencies = [ "sc-service", "sc-transaction-pool", "serde_json", - "sp-api", + "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-consensus", - "sp-core", - "sp-inherents", - "sp-runtime", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-inherents 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-timestamp", "structopt", "substrate-build-script-utils", @@ -2637,7 +2732,7 @@ dependencies = [ name = "jupiter-dev-executor" version = "0.1.0" dependencies = [ - "frame-benchmarking", + "frame-benchmarking 2.0.0 (git+https://github.com/paritytech/substrate)", "jupiter-dev-runtime", "sc-executor", ] @@ -2646,10 +2741,10 @@ dependencies = [ name = "jupiter-dev-runtime" version = "0.1.0" dependencies = [ - "frame-benchmarking", + "frame-benchmarking 2.0.0 (git+https://github.com/paritytech/substrate)", "frame-executive", - "frame-support", - "frame-system", + "frame-support 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-system 2.0.0 (git+https://github.com/paritytech/substrate)", "frame-system-benchmarking", "frame-system-rpc-runtime-api", "hex-literal 0.3.1", @@ -2658,7 +2753,7 @@ dependencies = [ "pallet-authorship", "pallet-balances", "pallet-contracts 2.0.0", - "pallet-contracts-primitives", + "pallet-contracts-primitives 2.0.0 (git+https://github.com/paritytech/substrate)", "pallet-contracts-rpc-runtime-api", "pallet-indices", "pallet-randomness-collective-flip", @@ -2668,16 +2763,16 @@ dependencies = [ "pallet-transaction-payment-rpc-runtime-api", "parity-scale-codec", "serde", - "sp-api", + "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-block-builder", - "sp-core", - "sp-inherents", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-inherents 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-offchain", - "sp-runtime", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-session", - "sp-std", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-transaction-pool", - "sp-version", + "sp-version 2.0.0 (git+https://github.com/paritytech/substrate)", "static_assertions", "substrate-wasm-builder", ] @@ -2686,7 +2781,7 @@ dependencies = [ name = "jupiter-executor" version = "0.1.0" dependencies = [ - "frame-benchmarking", + "frame-benchmarking 2.0.0 (git+https://github.com/paritytech/substrate)", "jupiter-runtime", "sc-executor", ] @@ -2695,23 +2790,23 @@ dependencies = [ name = "jupiter-io" version = "0.2.0" dependencies = [ - "megaclite", + "megaclite-arkworks", "num-bigint 0.3.1", "num-traits", - "sp-runtime-interface", + "sp-runtime-interface 2.0.0 (git+https://github.com/paritytech/substrate)", ] [[package]] name = "jupiter-primitives" version = "0.1.0" dependencies = [ - "frame-system", + "frame-system 2.0.0 (git+https://github.com/paritytech/substrate)", "parity-scale-codec", "serde", - "sp-application-crypto", - "sp-core", - "sp-runtime", - "sp-std", + "sp-application-crypto 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", ] [[package]] @@ -2730,13 +2825,13 @@ dependencies = [ "sc-finality-grandpa-rpc", "sc-rpc", "sc-rpc-api", - "sp-api", + "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-block-builder", "sp-blockchain", "sp-consensus", "sp-consensus-babe", - "sp-keystore", - "sp-runtime", + "sp-keystore 0.8.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-transaction-pool", "substrate-frame-rpc-system", ] @@ -2746,8 +2841,8 @@ name = "jupiter-runtime" version = "0.1.0" dependencies = [ "frame-executive", - "frame-support", - "frame-system", + "frame-support 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-system 2.0.0 (git+https://github.com/paritytech/substrate)", "frame-system-rpc-runtime-api", "jupiter-primitives", "jupiter-runtime-common", @@ -2756,7 +2851,7 @@ dependencies = [ "pallet-babe", "pallet-balances", "pallet-contracts 2.0.0 (git+https://github.com/paritytech/substrate)", - "pallet-contracts-primitives", + "pallet-contracts-primitives 2.0.0 (git+https://github.com/paritytech/substrate)", "pallet-contracts-rpc-runtime-api", "pallet-grandpa", "pallet-im-online", @@ -2772,19 +2867,19 @@ dependencies = [ "pallet-utility", "parity-scale-codec", "serde", - "sp-api", + "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-authority-discovery", "sp-block-builder", "sp-consensus-babe", - "sp-core", - "sp-inherents", - "sp-io", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-inherents 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-io 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-offchain", - "sp-runtime", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-session", - "sp-std", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-transaction-pool", - "sp-version", + "sp-version 2.0.0 (git+https://github.com/paritytech/substrate)", "static_assertions", "substrate-wasm-builder", ] @@ -2793,8 +2888,8 @@ dependencies = [ name = "jupiter-runtime-common" version = "0.1.0" dependencies = [ - "frame-support", - "frame-system", + "frame-support 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-system 2.0.0 (git+https://github.com/paritytech/substrate)", "jupiter-primitives", "pallet-authorship", "pallet-balances", @@ -2803,8 +2898,8 @@ dependencies = [ "pallet-timestamp", "pallet-transaction-payment", "smallvec 1.5.0", - "sp-runtime", - "sp-std", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", ] [[package]] @@ -3485,20 +3580,10 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" -[[package]] -name = "megaclite" -version = "0.1.0" -source = "git+https://github.com/patractlabs/megaclite.git?rev=cd0a365#cd0a365a9a65aa2bbee56752b63dbae03a7c7116" -dependencies = [ - "megaclite-arkworks", - "num-bigint 0.3.1", - "num-traits", -] - [[package]] name = "megaclite-arkworks" version = "0.1.0" -source = "git+https://github.com/patractlabs/megaclite.git?rev=cd0a365#cd0a365a9a65aa2bbee56752b63dbae03a7c7116" +source = "git+https://github.com/patractlabs/megaclite.git#aa83b083d2d3fbac358edb4a1d048d094f3dfe30" dependencies = [ "ark-bls12-377", "ark-bls12-381", @@ -3509,6 +3594,8 @@ dependencies = [ "ark-ff", "ark-serialize", "ark-std", + "num-bigint 0.3.1", + "num-traits", "rand 0.7.3", "rustc-hex", ] @@ -3934,15 +4021,15 @@ name = "pallet-authority-discovery" version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ - "frame-support", - "frame-system", + "frame-support 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-system 2.0.0 (git+https://github.com/paritytech/substrate)", "pallet-session", "parity-scale-codec", "serde", - "sp-application-crypto", + "sp-application-crypto 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-authority-discovery", - "sp-runtime", - "sp-std", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", ] [[package]] @@ -3950,14 +4037,14 @@ name = "pallet-authorship" version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ - "frame-support", - "frame-system", + "frame-support 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-system 2.0.0 (git+https://github.com/paritytech/substrate)", "impl-trait-for-tuples", "parity-scale-codec", "sp-authorship", - "sp-inherents", - "sp-runtime", - "sp-std", + "sp-inherents 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", ] [[package]] @@ -3965,23 +4052,23 @@ name = "pallet-babe" version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", + "frame-benchmarking 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-support 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-system 2.0.0 (git+https://github.com/paritytech/substrate)", "pallet-authorship", "pallet-session", "pallet-timestamp", "parity-scale-codec", "serde", - "sp-application-crypto", + "sp-application-crypto 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-consensus-babe", "sp-consensus-vrf", - "sp-inherents", - "sp-io", - "sp-runtime", + "sp-inherents 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-io 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-session", "sp-staking", - "sp-std", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-timestamp", ] @@ -3990,36 +4077,35 @@ name = "pallet-balances" version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", + "frame-benchmarking 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-support 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-system 2.0.0 (git+https://github.com/paritytech/substrate)", "parity-scale-codec", "serde", - "sp-runtime", - "sp-std", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", ] [[package]] name = "pallet-contracts" version = "2.0.0" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "jupiter-io", - "pallet-contracts-primitives", - "pallet-contracts-proc-macro", + "frame-benchmarking 2.0.0", + "frame-support 2.0.0", + "frame-system 2.0.0", + "pallet-contracts-primitives 2.0.0", + "pallet-contracts-proc-macro 0.1.0", "parity-scale-codec", "parity-wasm 0.41.0", "pwasm-utils 0.16.0", "rand 0.7.3", "rand_pcg", "serde", - "sp-core", - "sp-io", - "sp-runtime", - "sp-sandbox", - "sp-std", + "sp-core 2.0.0", + "sp-io 2.0.0", + "sp-runtime 2.0.0", + "sp-sandbox 0.8.0", + "sp-std 2.0.0", "wasmi-validation", ] @@ -4028,22 +4114,32 @@ name = "pallet-contracts" version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ - "frame-support", - "frame-system", - "pallet-contracts-primitives", - "pallet-contracts-proc-macro", + "frame-support 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-system 2.0.0 (git+https://github.com/paritytech/substrate)", + "pallet-contracts-primitives 2.0.0 (git+https://github.com/paritytech/substrate)", + "pallet-contracts-proc-macro 0.1.0 (git+https://github.com/paritytech/substrate)", "parity-scale-codec", "parity-wasm 0.41.0", "pwasm-utils 0.16.0", "serde", - "sp-core", - "sp-io", - "sp-runtime", - "sp-sandbox", - "sp-std", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-io 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-sandbox 0.8.0 (git+https://github.com/paritytech/substrate)", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", "wasmi-validation", ] +[[package]] +name = "pallet-contracts-primitives" +version = "2.0.0" +dependencies = [ + "bitflags", + "parity-scale-codec", + "sp-runtime 2.0.0", + "sp-std 2.0.0", +] + [[package]] name = "pallet-contracts-primitives" version = "2.0.0" @@ -4051,8 +4147,17 @@ source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e39 dependencies = [ "bitflags", "parity-scale-codec", - "sp-runtime", - "sp-std", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", +] + +[[package]] +name = "pallet-contracts-proc-macro" +version = "0.1.0" +dependencies = [ + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -4073,15 +4178,15 @@ dependencies = [ "jsonrpc-core", "jsonrpc-core-client", "jsonrpc-derive", - "pallet-contracts-primitives", + "pallet-contracts-primitives 2.0.0 (git+https://github.com/paritytech/substrate)", "pallet-contracts-rpc-runtime-api", "parity-scale-codec", "serde", - "sp-api", + "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-blockchain", - "sp-core", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-rpc", - "sp-runtime", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", ] [[package]] @@ -4089,11 +4194,11 @@ name = "pallet-contracts-rpc-runtime-api" version = "0.8.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ - "pallet-contracts-primitives", + "pallet-contracts-primitives 2.0.0 (git+https://github.com/paritytech/substrate)", "parity-scale-codec", - "sp-api", - "sp-runtime", - "sp-std", + "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", ] [[package]] @@ -4101,20 +4206,20 @@ name = "pallet-grandpa" version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", + "frame-benchmarking 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-support 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-system 2.0.0 (git+https://github.com/paritytech/substrate)", "pallet-authorship", "pallet-session", "parity-scale-codec", "serde", - "sp-application-crypto", - "sp-core", + "sp-application-crypto 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-finality-grandpa", - "sp-runtime", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-session", "sp-staking", - "sp-std", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", ] [[package]] @@ -4122,18 +4227,18 @@ name = "pallet-im-online" version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ - "frame-support", - "frame-system", + "frame-support 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-system 2.0.0 (git+https://github.com/paritytech/substrate)", "pallet-authorship", "pallet-session", "parity-scale-codec", "serde", - "sp-application-crypto", - "sp-core", - "sp-io", - "sp-runtime", + "sp-application-crypto 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-io 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-staking", - "sp-std", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", ] [[package]] @@ -4141,16 +4246,16 @@ name = "pallet-indices" version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", + "frame-benchmarking 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-support 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-system 2.0.0 (git+https://github.com/paritytech/substrate)", "parity-scale-codec", "serde", - "sp-core", - "sp-io", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-io 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-keyring", - "sp-runtime", - "sp-std", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", ] [[package]] @@ -4158,14 +4263,14 @@ name = "pallet-multisig" version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ - "frame-support", - "frame-system", + "frame-support 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-system 2.0.0 (git+https://github.com/paritytech/substrate)", "parity-scale-codec", "serde", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-io 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", ] [[package]] @@ -4173,14 +4278,14 @@ name = "pallet-offences" version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ - "frame-support", - "frame-system", + "frame-support 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-system 2.0.0 (git+https://github.com/paritytech/substrate)", "pallet-balances", "parity-scale-codec", "serde", - "sp-runtime", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-staking", - "sp-std", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", ] [[package]] @@ -4188,12 +4293,12 @@ name = "pallet-randomness-collective-flip" version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ - "frame-support", - "frame-system", + "frame-support 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-system 2.0.0 (git+https://github.com/paritytech/substrate)", "parity-scale-codec", "safe-mix", - "sp-runtime", - "sp-std", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", ] [[package]] @@ -4201,19 +4306,19 @@ name = "pallet-session" version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ - "frame-support", - "frame-system", + "frame-support 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-system 2.0.0 (git+https://github.com/paritytech/substrate)", "impl-trait-for-tuples", "pallet-timestamp", "parity-scale-codec", "serde", - "sp-core", - "sp-io", - "sp-runtime", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-io 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-session", "sp-staking", - "sp-std", - "sp-trie", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-trie 2.0.0 (git+https://github.com/paritytech/substrate)", ] [[package]] @@ -4221,13 +4326,13 @@ name = "pallet-sudo" version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ - "frame-support", - "frame-system", + "frame-support 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-system 2.0.0 (git+https://github.com/paritytech/substrate)", "parity-scale-codec", "serde", - "sp-io", - "sp-runtime", - "sp-std", + "sp-io 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", ] [[package]] @@ -4235,16 +4340,16 @@ name = "pallet-timestamp" version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", + "frame-benchmarking 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-support 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-system 2.0.0 (git+https://github.com/paritytech/substrate)", "impl-trait-for-tuples", "parity-scale-codec", "serde", - "sp-inherents", - "sp-io", - "sp-runtime", - "sp-std", + "sp-inherents 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-io 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-timestamp", ] @@ -4253,16 +4358,16 @@ name = "pallet-transaction-payment" version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ - "frame-support", - "frame-system", + "frame-support 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-system 2.0.0 (git+https://github.com/paritytech/substrate)", "pallet-transaction-payment-rpc-runtime-api", "parity-scale-codec", "serde", "smallvec 1.5.0", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-io 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", ] [[package]] @@ -4276,11 +4381,11 @@ dependencies = [ "pallet-transaction-payment-rpc-runtime-api", "parity-scale-codec", "serde", - "sp-api", + "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-blockchain", - "sp-core", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-rpc", - "sp-runtime", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", ] [[package]] @@ -4288,12 +4393,12 @@ name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ - "frame-support", + "frame-support 2.0.0 (git+https://github.com/paritytech/substrate)", "parity-scale-codec", "serde", - "sp-api", - "sp-runtime", - "sp-std", + "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", ] [[package]] @@ -4301,14 +4406,14 @@ name = "pallet-utility" version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ - "frame-support", - "frame-system", + "frame-support 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-system 2.0.0 (git+https://github.com/paritytech/substrate)", "parity-scale-codec", "serde", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-io 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", ] [[package]] @@ -5372,12 +5477,12 @@ dependencies = [ "sc-client-api", "sc-network", "serde_json", - "sp-api", + "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-authority-discovery", "sp-blockchain", - "sp-core", - "sp-keystore", - "sp-runtime", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-keystore 0.8.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", "substrate-prometheus-endpoint", ] @@ -5394,12 +5499,12 @@ dependencies = [ "sc-client-api", "sc-proposer-metrics", "sc-telemetry", - "sp-api", + "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-blockchain", "sp-consensus", - "sp-core", - "sp-inherents", - "sp-runtime", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-inherents 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-transaction-pool", "substrate-prometheus-endpoint", ] @@ -5411,14 +5516,14 @@ source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e39 dependencies = [ "parity-scale-codec", "sc-client-api", - "sp-api", + "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-block-builder", "sp-blockchain", "sp-consensus", - "sp-core", - "sp-inherents", - "sp-runtime", - "sp-state-machine", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-inherents 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-state-machine 0.8.0 (git+https://github.com/paritytech/substrate)", ] [[package]] @@ -5438,8 +5543,8 @@ dependencies = [ "serde_json", "sp-chain-spec", "sp-consensus-babe", - "sp-core", - "sp-runtime", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", ] [[package]] @@ -5482,13 +5587,13 @@ dependencies = [ "serde", "serde_json", "sp-blockchain", - "sp-core", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-keyring", - "sp-keystore", - "sp-panic-handler", - "sp-runtime", + "sp-keystore 0.8.0 (git+https://github.com/paritytech/substrate)", + "sp-panic-handler 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-utils", - "sp-version", + "sp-version 2.0.0 (git+https://github.com/paritytech/substrate)", "structopt", "thiserror", "tiny-bip39", @@ -5524,22 +5629,22 @@ dependencies = [ "parity-scale-codec", "parking_lot 0.10.2", "sc-executor", - "sp-api", + "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-blockchain", "sp-consensus", - "sp-core", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-database", - "sp-externalities", - "sp-inherents", - "sp-keystore", - "sp-runtime", - "sp-state-machine", - "sp-std", - "sp-storage", + "sp-externalities 0.8.0 (git+https://github.com/paritytech/substrate)", + "sp-inherents 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-keystore 0.8.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-state-machine 0.8.0 (git+https://github.com/paritytech/substrate)", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-storage 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-transaction-pool", - "sp-trie", + "sp-trie 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-utils", - "sp-version", + "sp-version 2.0.0 (git+https://github.com/paritytech/substrate)", "substrate-prometheus-endpoint", ] @@ -5562,14 +5667,14 @@ dependencies = [ "sc-client-api", "sc-executor", "sc-state-db", - "sp-arithmetic", + "sp-arithmetic 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-blockchain", "sp-consensus", - "sp-core", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-database", - "sp-runtime", - "sp-state-machine", - "sp-trie", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-state-machine 0.8.0 (git+https://github.com/paritytech/substrate)", + "sp-trie 2.0.0 (git+https://github.com/paritytech/substrate)", "substrate-prometheus-endpoint", ] @@ -5581,7 +5686,7 @@ dependencies = [ "sc-client-api", "sp-blockchain", "sp-consensus", - "sp-runtime", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", ] [[package]] @@ -5611,21 +5716,21 @@ dependencies = [ "sc-telemetry", "schnorrkel", "serde", - "sp-api", - "sp-application-crypto", + "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-application-crypto 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-block-builder", "sp-blockchain", "sp-consensus", "sp-consensus-babe", "sp-consensus-vrf", - "sp-core", - "sp-inherents", - "sp-io", - "sp-keystore", - "sp-runtime", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-inherents 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-io 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-keystore 0.8.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-timestamp", "sp-utils", - "sp-version", + "sp-version 2.0.0 (git+https://github.com/paritytech/substrate)", "substrate-prometheus-endpoint", ] @@ -5643,14 +5748,14 @@ dependencies = [ "sc-consensus-epochs", "sc-rpc-api", "serde", - "sp-api", - "sp-application-crypto", + "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-application-crypto 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-blockchain", "sp-consensus", "sp-consensus-babe", - "sp-core", - "sp-keystore", - "sp-runtime", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-keystore 0.8.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", ] [[package]] @@ -5663,7 +5768,7 @@ dependencies = [ "parking_lot 0.10.2", "sc-client-api", "sp-blockchain", - "sp-runtime", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", ] [[package]] @@ -5685,15 +5790,15 @@ dependencies = [ "sc-consensus-epochs", "sc-transaction-pool", "serde", - "sp-api", + "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-blockchain", "sp-consensus", "sp-consensus-babe", - "sp-core", - "sp-inherents", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-inherents 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-keyring", - "sp-keystore", - "sp-runtime", + "sp-keystore 0.8.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-timestamp", "sp-transaction-pool", "substrate-prometheus-endpoint", @@ -5711,17 +5816,17 @@ dependencies = [ "parking_lot 0.10.2", "sc-client-api", "sc-telemetry", - "sp-api", - "sp-application-crypto", - "sp-arithmetic", + "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-application-crypto 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-arithmetic 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-blockchain", "sp-consensus", "sp-consensus-slots", - "sp-core", - "sp-inherents", - "sp-runtime", - "sp-state-machine", - "sp-trie", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-inherents 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-state-machine 0.8.0 (git+https://github.com/paritytech/substrate)", + "sp-trie 2.0.0 (git+https://github.com/paritytech/substrate)", "thiserror", ] @@ -5734,9 +5839,9 @@ dependencies = [ "sc-client-api", "sp-authorship", "sp-consensus", - "sp-core", - "sp-inherents", - "sp-runtime", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-inherents 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", ] [[package]] @@ -5754,17 +5859,17 @@ dependencies = [ "sc-executor-common", "sc-executor-wasmi", "sc-executor-wasmtime", - "sp-api", - "sp-core", - "sp-externalities", - "sp-io", - "sp-panic-handler", - "sp-runtime-interface", + "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-externalities 0.8.0 (git+https://github.com/paritytech/substrate)", + "sp-io 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-panic-handler 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime-interface 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-serializer", "sp-tasks", - "sp-trie", - "sp-version", - "sp-wasm-interface", + "sp-trie 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-version 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-wasm-interface 2.0.0 (git+https://github.com/paritytech/substrate)", "wasmi", ] @@ -5777,9 +5882,9 @@ dependencies = [ "parity-scale-codec", "parity-wasm 0.41.0", "sp-allocator", - "sp-core", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-serializer", - "sp-wasm-interface", + "sp-wasm-interface 2.0.0 (git+https://github.com/paritytech/substrate)", "thiserror", "wasmi", ] @@ -5793,9 +5898,9 @@ dependencies = [ "parity-scale-codec", "sc-executor-common", "sp-allocator", - "sp-core", - "sp-runtime-interface", - "sp-wasm-interface", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime-interface 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-wasm-interface 2.0.0 (git+https://github.com/paritytech/substrate)", "wasmi", ] @@ -5811,9 +5916,9 @@ dependencies = [ "sc-executor-common", "scoped-tls", "sp-allocator", - "sp-core", - "sp-runtime-interface", - "sp-wasm-interface", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime-interface 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-wasm-interface 2.0.0 (git+https://github.com/paritytech/substrate)", "wasmtime", ] @@ -5840,16 +5945,16 @@ dependencies = [ "sc-network-gossip", "sc-telemetry", "serde_json", - "sp-api", - "sp-application-crypto", - "sp-arithmetic", + "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-application-crypto 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-arithmetic 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-blockchain", "sp-consensus", - "sp-core", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-finality-grandpa", - "sp-inherents", - "sp-keystore", - "sp-runtime", + "sp-inherents 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-keystore 0.8.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-utils", "substrate-prometheus-endpoint", ] @@ -5874,8 +5979,8 @@ dependencies = [ "serde", "serde_json", "sp-blockchain", - "sp-core", - "sp-runtime", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", ] [[package]] @@ -5890,7 +5995,7 @@ dependencies = [ "sc-client-api", "sc-network", "sp-blockchain", - "sp-runtime", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-transaction-pool", "sp-utils", "wasm-timer", @@ -5910,9 +6015,9 @@ dependencies = [ "parking_lot 0.10.2", "rand 0.7.3", "serde_json", - "sp-application-crypto", - "sp-core", - "sp-keystore", + "sp-application-crypto 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-keystore 0.8.0 (git+https://github.com/paritytech/substrate)", "subtle 2.3.0", ] @@ -5927,12 +6032,12 @@ dependencies = [ "parking_lot 0.10.2", "sc-client-api", "sc-executor", - "sp-api", + "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-blockchain", - "sp-core", - "sp-externalities", - "sp-runtime", - "sp-state-machine", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-externalities 0.8.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-state-machine 0.8.0 (git+https://github.com/paritytech/substrate)", ] [[package]] @@ -5975,11 +6080,11 @@ dependencies = [ "slog", "slog_derive", "smallvec 1.5.0", - "sp-arithmetic", + "sp-arithmetic 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-blockchain", "sp-consensus", - "sp-core", - "sp-runtime", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-utils", "substrate-prometheus-endpoint", "thiserror", @@ -6000,7 +6105,7 @@ dependencies = [ "log", "lru", "sc-network", - "sp-runtime", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", "wasm-timer", ] @@ -6023,10 +6128,10 @@ dependencies = [ "sc-client-api", "sc-keystore", "sc-network", - "sp-api", - "sp-core", + "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-offchain", - "sp-runtime", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-utils", "threadpool", ] @@ -6071,19 +6176,19 @@ dependencies = [ "sc-keystore", "sc-rpc-api", "serde_json", - "sp-api", + "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-blockchain", "sp-chain-spec", - "sp-core", - "sp-keystore", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-keystore 0.8.0 (git+https://github.com/paritytech/substrate)", "sp-offchain", "sp-rpc", - "sp-runtime", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-session", - "sp-state-machine", + "sp-state-machine 0.8.0 (git+https://github.com/paritytech/substrate)", "sp-transaction-pool", "sp-utils", - "sp-version", + "sp-version 2.0.0 (git+https://github.com/paritytech/substrate)", ] [[package]] @@ -6103,11 +6208,11 @@ dependencies = [ "serde", "serde_json", "sp-chain-spec", - "sp-core", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-rpc", - "sp-runtime", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-transaction-pool", - "sp-version", + "sp-version 2.0.0 (git+https://github.com/paritytech/substrate)", ] [[package]] @@ -6124,7 +6229,7 @@ dependencies = [ "log", "serde", "serde_json", - "sp-runtime", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", "substrate-prometheus-endpoint", ] @@ -6166,24 +6271,24 @@ dependencies = [ "serde", "serde_json", "slog", - "sp-api", - "sp-application-crypto", + "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-application-crypto 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-block-builder", "sp-blockchain", "sp-consensus", - "sp-core", - "sp-externalities", - "sp-inherents", - "sp-io", - "sp-keystore", - "sp-runtime", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-externalities 0.8.0 (git+https://github.com/paritytech/substrate)", + "sp-inherents 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-io 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-keystore 0.8.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-session", - "sp-state-machine", - "sp-tracing", + "sp-state-machine 0.8.0 (git+https://github.com/paritytech/substrate)", + "sp-tracing 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-transaction-pool", - "sp-trie", + "sp-trie 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-utils", - "sp-version", + "sp-version 2.0.0 (git+https://github.com/paritytech/substrate)", "substrate-prometheus-endpoint", "tempfile", "thiserror", @@ -6203,7 +6308,7 @@ dependencies = [ "parity-util-mem-derive", "parking_lot 0.10.2", "sc-client-api", - "sp-core", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", "thiserror", ] @@ -6241,7 +6346,7 @@ dependencies = [ "serde", "serde_json", "slog", - "sp-tracing", + "sp-tracing 2.0.0 (git+https://github.com/paritytech/substrate)", "tracing", "tracing-core", "tracing-subscriber", @@ -6261,8 +6366,8 @@ dependencies = [ "retain_mut", "serde", "sp-blockchain", - "sp-core", - "sp-runtime", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-transaction-pool", "sp-utils", "thiserror", @@ -6283,11 +6388,11 @@ dependencies = [ "parking_lot 0.10.2", "sc-client-api", "sc-transaction-graph", - "sp-api", + "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-blockchain", - "sp-core", - "sp-runtime", - "sp-tracing", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-tracing 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-transaction-pool", "sp-utils", "substrate-prometheus-endpoint", @@ -6318,6 +6423,7 @@ dependencies = [ "merlin", "rand 0.7.3", "rand_core 0.5.1", + "serde", "sha2 0.8.2", "subtle 2.3.0", "zeroize", @@ -6694,12 +6800,24 @@ version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ "log", - "sp-core", - "sp-std", - "sp-wasm-interface", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-wasm-interface 2.0.0 (git+https://github.com/paritytech/substrate)", "thiserror", ] +[[package]] +name = "sp-api" +version = "2.0.0" +dependencies = [ + "parity-scale-codec", + "sp-api-proc-macro 2.0.0", + "sp-core 2.0.0", + "sp-runtime 2.0.0", + "sp-std 2.0.0", + "sp-version 2.0.0", +] + [[package]] name = "sp-api" version = "2.0.0" @@ -6707,15 +6825,26 @@ source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e39 dependencies = [ "hash-db", "parity-scale-codec", - "sp-api-proc-macro", - "sp-core", - "sp-runtime", - "sp-state-machine", - "sp-std", - "sp-version", + "sp-api-proc-macro 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-state-machine 0.8.0 (git+https://github.com/paritytech/substrate)", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-version 2.0.0 (git+https://github.com/paritytech/substrate)", "thiserror", ] +[[package]] +name = "sp-api-proc-macro" +version = "2.0.0" +dependencies = [ + "blake2-rfc", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "sp-api-proc-macro" version = "2.0.0" @@ -6728,6 +6857,17 @@ dependencies = [ "syn", ] +[[package]] +name = "sp-application-crypto" +version = "2.0.0" +dependencies = [ + "parity-scale-codec", + "serde", + "sp-core 2.0.0", + "sp-io 2.0.0", + "sp-std 2.0.0", +] + [[package]] name = "sp-application-crypto" version = "2.0.0" @@ -6735,9 +6875,21 @@ source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e39 dependencies = [ "parity-scale-codec", "serde", - "sp-core", - "sp-io", - "sp-std", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-io 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", +] + +[[package]] +name = "sp-arithmetic" +version = "2.0.0" +dependencies = [ + "integer-sqrt", + "num-traits", + "parity-scale-codec", + "serde", + "sp-debug-derive 2.0.0", + "sp-std 2.0.0", ] [[package]] @@ -6749,8 +6901,8 @@ dependencies = [ "num-traits", "parity-scale-codec", "serde", - "sp-debug-derive", - "sp-std", + "sp-debug-derive 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", ] [[package]] @@ -6759,10 +6911,10 @@ version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ "parity-scale-codec", - "sp-api", - "sp-application-crypto", - "sp-runtime", - "sp-std", + "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-application-crypto 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", ] [[package]] @@ -6771,9 +6923,9 @@ version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ "parity-scale-codec", - "sp-inherents", - "sp-runtime", - "sp-std", + "sp-inherents 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", ] [[package]] @@ -6782,10 +6934,10 @@ version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ "parity-scale-codec", - "sp-api", - "sp-inherents", - "sp-runtime", - "sp-std", + "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-inherents 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", ] [[package]] @@ -6798,11 +6950,11 @@ dependencies = [ "lru", "parity-scale-codec", "parking_lot 0.10.2", - "sp-api", + "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-consensus", "sp-database", - "sp-runtime", - "sp-state-machine", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-state-machine 0.8.0 (git+https://github.com/paritytech/substrate)", "thiserror", ] @@ -6827,15 +6979,15 @@ dependencies = [ "parity-scale-codec", "parking_lot 0.10.2", "serde", - "sp-api", - "sp-core", - "sp-inherents", - "sp-runtime", - "sp-state-machine", - "sp-std", - "sp-trie", + "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-inherents 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-state-machine 0.8.0 (git+https://github.com/paritytech/substrate)", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-trie 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-utils", - "sp-version", + "sp-version 2.0.0 (git+https://github.com/paritytech/substrate)", "substrate-prometheus-endpoint", "thiserror", "wasm-timer", @@ -6848,16 +7000,16 @@ source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e39 dependencies = [ "merlin", "parity-scale-codec", - "sp-api", - "sp-application-crypto", + "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-application-crypto 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-consensus", "sp-consensus-slots", "sp-consensus-vrf", - "sp-core", - "sp-inherents", - "sp-keystore", - "sp-runtime", - "sp-std", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-inherents 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-keystore 0.8.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-timestamp", ] @@ -6867,7 +7019,7 @@ version = "0.8.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ "parity-scale-codec", - "sp-runtime", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", ] [[package]] @@ -6877,9 +7029,52 @@ source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e39 dependencies = [ "parity-scale-codec", "schnorrkel", - "sp-core", - "sp-runtime", - "sp-std", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", +] + +[[package]] +name = "sp-core" +version = "2.0.0" +dependencies = [ + "base58", + "blake2-rfc", + "byteorder", + "dyn-clonable", + "ed25519-dalek", + "futures 0.3.8", + "hash-db", + "hash256-std-hasher", + "hex", + "impl-serde", + "lazy_static", + "libsecp256k1", + "log", + "merlin", + "num-traits", + "parity-scale-codec", + "parity-util-mem", + "parking_lot 0.10.2", + "primitive-types", + "rand 0.7.3", + "regex", + "schnorrkel", + "secrecy", + "serde", + "sha2 0.8.2", + "sp-debug-derive 2.0.0", + "sp-externalities 0.8.0", + "sp-runtime-interface 2.0.0", + "sp-std 2.0.0", + "sp-storage 2.0.0", + "substrate-bip39", + "thiserror", + "tiny-bip39", + "tiny-keccak", + "twox-hash", + "wasmi", + "zeroize", ] [[package]] @@ -6912,11 +7107,11 @@ dependencies = [ "secrecy", "serde", "sha2 0.8.2", - "sp-debug-derive", - "sp-externalities", - "sp-runtime-interface", - "sp-std", - "sp-storage", + "sp-debug-derive 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-externalities 0.8.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime-interface 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-storage 2.0.0 (git+https://github.com/paritytech/substrate)", "substrate-bip39", "thiserror", "tiny-bip39", @@ -6935,6 +7130,15 @@ dependencies = [ "parking_lot 0.10.2", ] +[[package]] +name = "sp-debug-derive" +version = "2.0.0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "sp-debug-derive" version = "2.0.0" @@ -6945,6 +7149,16 @@ dependencies = [ "syn", ] +[[package]] +name = "sp-externalities" +version = "0.8.0" +dependencies = [ + "environmental", + "parity-scale-codec", + "sp-std 2.0.0", + "sp-storage 2.0.0", +] + [[package]] name = "sp-externalities" version = "0.8.0" @@ -6952,8 +7166,8 @@ source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e39 dependencies = [ "environmental", "parity-scale-codec", - "sp-std", - "sp-storage", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-storage 2.0.0 (git+https://github.com/paritytech/substrate)", ] [[package]] @@ -6965,12 +7179,23 @@ dependencies = [ "log", "parity-scale-codec", "serde", - "sp-api", - "sp-application-crypto", - "sp-core", - "sp-keystore", - "sp-runtime", - "sp-std", + "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-application-crypto 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-keystore 0.8.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", +] + +[[package]] +name = "sp-inherents" +version = "2.0.0" +dependencies = [ + "parity-scale-codec", + "parking_lot 0.10.2", + "sp-core 2.0.0", + "sp-std 2.0.0", + "thiserror", ] [[package]] @@ -6980,11 +7205,34 @@ source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e39 dependencies = [ "parity-scale-codec", "parking_lot 0.10.2", - "sp-core", - "sp-std", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", "thiserror", ] +[[package]] +name = "sp-io" +version = "2.0.0" +dependencies = [ + "futures 0.3.8", + "hash-db", + "libsecp256k1", + "log", + "parity-scale-codec", + "parking_lot 0.10.2", + "sp-core 2.0.0", + "sp-externalities 0.8.0", + "sp-keystore 0.8.0", + "sp-runtime-interface 2.0.0", + "sp-state-machine 0.8.0", + "sp-std 2.0.0", + "sp-tracing 2.0.0", + "sp-trie 2.0.0", + "sp-wasm-interface 2.0.0", + "tracing", + "tracing-core", +] + [[package]] name = "sp-io" version = "2.0.0" @@ -6996,15 +7244,15 @@ dependencies = [ "log", "parity-scale-codec", "parking_lot 0.10.2", - "sp-core", - "sp-externalities", - "sp-keystore", - "sp-runtime-interface", - "sp-state-machine", - "sp-std", - "sp-tracing", - "sp-trie", - "sp-wasm-interface", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-externalities 0.8.0 (git+https://github.com/paritytech/substrate)", + "sp-keystore 0.8.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime-interface 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-state-machine 0.8.0 (git+https://github.com/paritytech/substrate)", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-tracing 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-trie 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-wasm-interface 2.0.0 (git+https://github.com/paritytech/substrate)", "tracing", "tracing-core", ] @@ -7015,11 +7263,26 @@ version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ "lazy_static", - "sp-core", - "sp-runtime", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", "strum", ] +[[package]] +name = "sp-keystore" +version = "0.8.0" +dependencies = [ + "async-trait", + "derive_more", + "futures 0.3.8", + "merlin", + "parity-scale-codec", + "parking_lot 0.10.2", + "schnorrkel", + "sp-core 2.0.0", + "sp-externalities 0.8.0", +] + [[package]] name = "sp-keystore" version = "0.8.0" @@ -7032,8 +7295,8 @@ dependencies = [ "parity-scale-codec", "parking_lot 0.10.2", "schnorrkel", - "sp-core", - "sp-externalities", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-externalities 0.8.0 (git+https://github.com/paritytech/substrate)", ] [[package]] @@ -7041,9 +7304,16 @@ name = "sp-offchain" version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ - "sp-api", - "sp-core", - "sp-runtime", + "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", +] + +[[package]] +name = "sp-panic-handler" +version = "2.0.0" +dependencies = [ + "backtrace", ] [[package]] @@ -7060,7 +7330,27 @@ version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ "serde", - "sp-core", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", +] + +[[package]] +name = "sp-runtime" +version = "2.0.0" +dependencies = [ + "either", + "hash256-std-hasher", + "impl-trait-for-tuples", + "log", + "parity-scale-codec", + "parity-util-mem", + "paste", + "rand 0.7.3", + "serde", + "sp-application-crypto 2.0.0", + "sp-arithmetic 2.0.0", + "sp-core 2.0.0", + "sp-io 2.0.0", + "sp-std 2.0.0", ] [[package]] @@ -7077,11 +7367,27 @@ dependencies = [ "paste", "rand 0.7.3", "serde", - "sp-application-crypto", - "sp-arithmetic", - "sp-core", - "sp-io", - "sp-std", + "sp-application-crypto 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-arithmetic 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-io 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", +] + +[[package]] +name = "sp-runtime-interface" +version = "2.0.0" +dependencies = [ + "impl-trait-for-tuples", + "parity-scale-codec", + "primitive-types", + "sp-externalities 0.8.0", + "sp-runtime-interface-proc-macro 2.0.0", + "sp-std 2.0.0", + "sp-storage 2.0.0", + "sp-tracing 2.0.0", + "sp-wasm-interface 2.0.0", + "static_assertions", ] [[package]] @@ -7091,15 +7397,26 @@ source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e39 dependencies = [ "parity-scale-codec", "primitive-types", - "sp-externalities", - "sp-runtime-interface-proc-macro", - "sp-std", - "sp-storage", - "sp-tracing", - "sp-wasm-interface", + "sp-externalities 0.8.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime-interface-proc-macro 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-storage 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-tracing 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-wasm-interface 2.0.0 (git+https://github.com/paritytech/substrate)", "static_assertions", ] +[[package]] +name = "sp-runtime-interface-proc-macro" +version = "2.0.0" +dependencies = [ + "Inflector", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "sp-runtime-interface-proc-macro" version = "2.0.0" @@ -7112,16 +7429,28 @@ dependencies = [ "syn", ] +[[package]] +name = "sp-sandbox" +version = "0.8.0" +dependencies = [ + "parity-scale-codec", + "sp-core 2.0.0", + "sp-io 2.0.0", + "sp-std 2.0.0", + "sp-wasm-interface 2.0.0", + "wasmi", +] + [[package]] name = "sp-sandbox" version = "0.8.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ "parity-scale-codec", - "sp-core", - "sp-io", - "sp-std", - "sp-wasm-interface", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-io 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-wasm-interface 2.0.0 (git+https://github.com/paritytech/substrate)", "wasmi", ] @@ -7140,11 +7469,11 @@ version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ "parity-scale-codec", - "sp-api", - "sp-core", - "sp-runtime", + "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-staking", - "sp-std", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", ] [[package]] @@ -7153,8 +7482,29 @@ version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ "parity-scale-codec", - "sp-runtime", - "sp-std", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", +] + +[[package]] +name = "sp-state-machine" +version = "0.8.0" +dependencies = [ + "hash-db", + "log", + "num-traits", + "parity-scale-codec", + "parking_lot 0.10.2", + "rand 0.7.3", + "smallvec 1.5.0", + "sp-core 2.0.0", + "sp-externalities 0.8.0", + "sp-panic-handler 2.0.0", + "sp-std 2.0.0", + "sp-trie 2.0.0", + "thiserror", + "trie-db", + "trie-root", ] [[package]] @@ -7169,21 +7519,37 @@ dependencies = [ "parking_lot 0.10.2", "rand 0.7.3", "smallvec 1.5.0", - "sp-core", - "sp-externalities", - "sp-panic-handler", - "sp-std", - "sp-trie", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-externalities 0.8.0 (git+https://github.com/paritytech/substrate)", + "sp-panic-handler 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-trie 2.0.0 (git+https://github.com/paritytech/substrate)", "thiserror", "trie-db", "trie-root", ] +[[package]] +name = "sp-std" +version = "2.0.0" + [[package]] name = "sp-std" version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" +[[package]] +name = "sp-storage" +version = "2.0.0" +dependencies = [ + "impl-serde", + "parity-scale-codec", + "ref-cast", + "serde", + "sp-debug-derive 2.0.0", + "sp-std 2.0.0", +] + [[package]] name = "sp-storage" version = "2.0.0" @@ -7193,8 +7559,8 @@ dependencies = [ "parity-scale-codec", "ref-cast", "serde", - "sp-debug-derive", - "sp-std", + "sp-debug-derive 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", ] [[package]] @@ -7203,11 +7569,11 @@ version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ "log", - "sp-core", - "sp-externalities", - "sp-io", - "sp-runtime-interface", - "sp-std", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-externalities 0.8.0 (git+https://github.com/paritytech/substrate)", + "sp-io 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime-interface 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", ] [[package]] @@ -7217,13 +7583,25 @@ source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e39 dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", - "sp-api", - "sp-inherents", - "sp-runtime", - "sp-std", + "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-inherents 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", "wasm-timer", ] +[[package]] +name = "sp-tracing" +version = "2.0.0" +dependencies = [ + "log", + "parity-scale-codec", + "sp-std 2.0.0", + "tracing", + "tracing-core", + "tracing-subscriber", +] + [[package]] name = "sp-tracing" version = "2.0.0" @@ -7231,7 +7609,7 @@ source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e39 dependencies = [ "log", "parity-scale-codec", - "sp-std", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", "tracing", "tracing-core", "tracing-subscriber", @@ -7247,12 +7625,25 @@ dependencies = [ "log", "parity-scale-codec", "serde", - "sp-api", + "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-blockchain", - "sp-runtime", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", "thiserror", ] +[[package]] +name = "sp-trie" +version = "2.0.0" +dependencies = [ + "hash-db", + "memory-db", + "parity-scale-codec", + "sp-core 2.0.0", + "sp-std 2.0.0", + "trie-db", + "trie-root", +] + [[package]] name = "sp-trie" version = "2.0.0" @@ -7261,8 +7652,8 @@ dependencies = [ "hash-db", "memory-db", "parity-scale-codec", - "sp-core", - "sp-std", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", "trie-db", "trie-root", ] @@ -7279,6 +7670,17 @@ dependencies = [ "prometheus", ] +[[package]] +name = "sp-version" +version = "2.0.0" +dependencies = [ + "impl-serde", + "parity-scale-codec", + "serde", + "sp-runtime 2.0.0", + "sp-std 2.0.0", +] + [[package]] name = "sp-version" version = "2.0.0" @@ -7287,8 +7689,18 @@ dependencies = [ "impl-serde", "parity-scale-codec", "serde", - "sp-runtime", - "sp-std", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", +] + +[[package]] +name = "sp-wasm-interface" +version = "2.0.0" +dependencies = [ + "impl-trait-for-tuples", + "parity-scale-codec", + "sp-std 2.0.0", + "wasmi", ] [[package]] @@ -7298,7 +7710,7 @@ source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e39 dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", - "sp-std", + "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", "wasmi", ] @@ -7435,11 +7847,11 @@ dependencies = [ "sc-client-api", "sc-rpc-api", "serde", - "sp-api", + "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-block-builder", "sp-blockchain", - "sp-core", - "sp-runtime", + "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", "sp-transaction-pool", ] @@ -8041,7 +8453,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04f8ab788026715fa63b31960869617cba39117e520eb415b0139543e325ab59" dependencies = [ "cfg-if 0.1.10", - "rand 0.3.23", + "rand 0.7.3", "static_assertions", ] diff --git a/primitives/io/Cargo.toml b/primitives/io/Cargo.toml index e2c72364..bfe00892 100644 --- a/primitives/io/Cargo.toml +++ b/primitives/io/Cargo.toml @@ -9,13 +9,20 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] sp-runtime-interface = { git = "https://github.com/paritytech/substrate.git", branch = "master", default-features = false } -megaclite = { git = "https://github.com/patractlabs/megaclite.git", default-features = false, optional = true, features = ["arkworks"], rev = "cd0a365" } -num-bigint = "0.3.1" -num-traits = "0.2.14" + +[dependencies.curve] +git = "https://github.com/patractlabs/megaclite.git" +package = "megaclite-arkworks" +default-features = false + +[dependencies.num-bigint] +version = "0.3.1" +default-features = false + +[dependencies.num-traits] +version = "0.2.14" +default-features = false [features] default = ["std"] -std = [ - "megaclite", - "sp-runtime-interface/std", -] +std = [ "sp-runtime-interface/std" ] diff --git a/primitives/io/src/groth16.rs b/primitives/io/src/groth16.rs index 589872ce..960b4c24 100644 --- a/primitives/io/src/groth16.rs +++ b/primitives/io/src/groth16.rs @@ -1,5 +1,5 @@ //! Groth16 -use megaclite::{CurveBasicOperations, Error, ErrorKind, SerializationError}; +use curve::{CurveBasicOperations, Error, ErrorKind, SerializationError}; use num_bigint::BigUint; use num_traits::Num; @@ -12,34 +12,26 @@ pub fn verify( public_inputs: &[&[u8]], ) -> Result { match curve_id { - 0x2a => inner_verify::( + 0x2a => inner_verify::( curve_id, vk_gamma_abc, vk, proof, public_inputs, ), - 0x2b => inner_verify::( - curve_id, - vk_gamma_abc, - vk, - proof, - public_inputs, - ), - 0x2c => inner_verify::( - curve_id, - vk_gamma_abc, - vk, - proof, - public_inputs, - ), - 0x2d => inner_verify::( + 0x2b => inner_verify::( curve_id, vk_gamma_abc, vk, proof, public_inputs, ), + 0x2c => { + inner_verify::(curve_id, vk_gamma_abc, vk, proof, public_inputs) + } + 0x2d => { + inner_verify::(curve_id, vk_gamma_abc, vk, proof, public_inputs) + } _ => Err(SerializationError::IoError(Error::new( ErrorKind::Other, "Unsupported curve", diff --git a/primitives/io/src/lib.rs b/primitives/io/src/lib.rs index 37aaf4e4..b3eb2289 100644 --- a/primitives/io/src/lib.rs +++ b/primitives/io/src/lib.rs @@ -10,57 +10,16 @@ pub mod groth16; pub trait Pairing { /// Vector Addition fn add(curve_id: i32, input: &[u8]) -> Option> { - Some(match curve_id { - 0x2a => { - ::add(input).ok() - } - 0x2b => { - ::add(input).ok() - } - 0x2c => ::add(input).ok(), - 0x2d => { - ::add(input).ok() - } - _ => None, - }?) + curve::add(curve_id, input).ok() } /// Scalar Multiplication fn mul(curve_id: i32, input: &[u8]) -> Option> { - Some(match curve_id { - 0x2a => { - ::mul(input).ok() - } - 0x2b => { - ::mul(input).ok() - } - 0x2c => ::mul(input).ok(), - 0x2d => { - ::mul(input).ok() - } - _ => None, - }?) + curve::mul(curve_id, input).ok() } /// Pairing fn pairing(curve_id: i32, input: &[u8]) -> Option { - Some(match curve_id { - 0x2a => { - ::pairings(input) - .ok() - } - 0x2b => { - ::pairings(input) - .ok() - } - 0x2c => { - ::pairings(input).ok() - } - 0x2d => { - ::pairings(input) - .ok() - } - _ => None, - }?) + curve::pairing(curve_id, input).ok() } } diff --git a/vendor/substrate b/vendor/substrate index 62f8d94e..db0f348f 160000 --- a/vendor/substrate +++ b/vendor/substrate @@ -1 +1 @@ -Subproject commit 62f8d94ef21bd12c076c74623e93a85c7aa4006d +Subproject commit db0f348f4dd5d885209df492860da5ee42147952 From d652c986291686c94e2ab2ded6df3cb68463af6a Mon Sep 17 00:00:00 2001 From: clearloop Date: Fri, 11 Dec 2020 11:42:00 +0800 Subject: [PATCH 06/33] perf(primitives/io): remove the use of vec in package io --- primitives/io/Cargo.toml | 1 + primitives/io/src/groth16.rs | 7 ++++--- primitives/io/src/lib.rs | 1 + vendor/substrate | 2 +- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/primitives/io/Cargo.toml b/primitives/io/Cargo.toml index bfe00892..836d84b7 100644 --- a/primitives/io/Cargo.toml +++ b/primitives/io/Cargo.toml @@ -9,6 +9,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] sp-runtime-interface = { git = "https://github.com/paritytech/substrate.git", branch = "master", default-features = false } +sp-std = { git = "https://github.com/paritytech/substrate.git", branch = "master", default-features = false } [dependencies.curve] git = "https://github.com/patractlabs/megaclite.git" diff --git a/primitives/io/src/groth16.rs b/primitives/io/src/groth16.rs index 960b4c24..0835bd3c 100644 --- a/primitives/io/src/groth16.rs +++ b/primitives/io/src/groth16.rs @@ -2,6 +2,7 @@ use curve::{CurveBasicOperations, Error, ErrorKind, SerializationError}; use num_bigint::BigUint; use num_traits::Num; +use sp_std::vec::Vec; /// Groth16 verification pub fn verify( @@ -65,14 +66,14 @@ fn inner_verify( for (i, b) in public_inputs.iter().zip(vk_gamma_abc.iter().skip(1)) { public_input_require_on_curve::(i).map_err(|e| Error::new(ErrorKind::Other, e))?; - let mut mul_input = vec![0u8; g1_len + scalar_len]; + let mut mul_input = Vec::with_capacity(g1_len + scalar_len); mul_input[0..g1_len].copy_from_slice(b); mul_input[g1_len..g1_len + scalar_len].copy_from_slice(i); let mul_ic = super::pairing::mul(curve_id, &mul_input) .ok_or_else(|| Error::new(ErrorKind::Other, "Mul Failed"))?; - let mut acc_mul_ic = vec![0u8; g1_len * 2]; + let mut acc_mul_ic = Vec::with_capacity(g1_len * 2); acc_mul_ic[0..g1_len].copy_from_slice(acc.as_ref()); acc_mul_ic[g1_len..g1_len * 2].copy_from_slice(mul_ic.as_ref()); @@ -142,7 +143,7 @@ fn negate_y(y: &[u8]) -> Result, &'static str> let neg_y = negate_y_based_curve(BigUint::from_bytes_be(y), C::PRIME_FIELD)?.to_bytes_be(); // Because of randomness, Negate_y vector might not satisfy 32 or 48 bytes. - let mut neg_y_fill_with_zero = vec![0u8; y.len()]; + let mut neg_y_fill_with_zero = Vec::with_capacity(y.len()); if neg_y.len() != y.len() { neg_y_fill_with_zero[y.len() - neg_y.len()..y.len()].copy_from_slice(&*neg_y); } else { diff --git a/primitives/io/src/lib.rs b/primitives/io/src/lib.rs index b3eb2289..123606ec 100644 --- a/primitives/io/src/lib.rs +++ b/primitives/io/src/lib.rs @@ -2,6 +2,7 @@ #![deny(missing_docs)] #![cfg_attr(not(feature = "std"), no_std)] use sp_runtime_interface::runtime_interface; +use sp_std::vec::Vec; pub mod groth16; diff --git a/vendor/substrate b/vendor/substrate index db0f348f..e971d86e 160000 --- a/vendor/substrate +++ b/vendor/substrate @@ -1 +1 @@ -Subproject commit db0f348f4dd5d885209df492860da5ee42147952 +Subproject commit e971d86e050341bca9514b5d20de46f99f99cb50 From ca28dd687c78908693c31fb55a0cb9dd7291241f Mon Sep 17 00:00:00 2001 From: clearloop Date: Fri, 11 Dec 2020 14:32:49 +0800 Subject: [PATCH 07/33] chore(submodule): update the submodule? --- vendor/substrate | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/substrate b/vendor/substrate index e971d86e..d72e0623 160000 --- a/vendor/substrate +++ b/vendor/substrate @@ -1 +1 @@ -Subproject commit e971d86e050341bca9514b5d20de46f99f99cb50 +Subproject commit d72e06237aa5e1ca51af895cdc317383e7b4fc7e From d77424ff08ac6078ff8ad508b880aab98527497c Mon Sep 17 00:00:00 2001 From: clearloop Date: Sun, 13 Dec 2020 20:39:15 +0800 Subject: [PATCH 08/33] feat(primitives/chain-extension): add chain-extension --- .gitmodules | 2 +- Cargo.lock | 1396 +++++++++---------------- Cargo.toml | 1 + primitives/chain_extension/Cargo.toml | 24 + primitives/chain_extension/src/lib.rs | 70 ++ vendor/substrate | 2 +- 6 files changed, 590 insertions(+), 905 deletions(-) create mode 100644 primitives/chain_extension/Cargo.toml create mode 100644 primitives/chain_extension/src/lib.rs diff --git a/.gitmodules b/.gitmodules index fddb8ce7..68b8e6d3 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,4 @@ [submodule "vendor/substrate"] path = vendor/substrate url = https://github.com/patractlabs/substrate.git - branch = patract-contracts + branch = parity/at-chain-extension diff --git a/Cargo.lock b/Cargo.lock index 1079a8e8..7224ea72 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -754,6 +754,16 @@ dependencies = [ "zeroize", ] +[[package]] +name = "chain_extension" +version = "0.1.0" +dependencies = [ + "jupiter-io", + "megaclite-arkworks", + "pallet-contracts 2.0.0", + "sp-runtime", +] + [[package]] name = "chrono" version = "0.4.19" @@ -1460,38 +1470,22 @@ dependencies = [ "percent-encoding 2.1.0", ] -[[package]] -name = "frame-benchmarking" -version = "2.0.0" -dependencies = [ - "frame-support 2.0.0", - "frame-system 2.0.0", - "parity-scale-codec", - "paste", - "sp-api 2.0.0", - "sp-io 2.0.0", - "sp-runtime 2.0.0", - "sp-runtime-interface 2.0.0", - "sp-std 2.0.0", - "sp-storage 2.0.0", -] - [[package]] name = "frame-benchmarking" version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ - "frame-support 2.0.0 (git+https://github.com/paritytech/substrate)", - "frame-system 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-support", + "frame-system", "linregress", "parity-scale-codec", "paste", - "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-io 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime-interface 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-storage 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-api", + "sp-io", + "sp-runtime", + "sp-runtime-interface", + "sp-std", + "sp-storage", ] [[package]] @@ -1500,7 +1494,7 @@ version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ "chrono", - "frame-benchmarking 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-benchmarking", "handlebars", "parity-scale-codec", "sc-cli", @@ -1508,11 +1502,11 @@ dependencies = [ "sc-executor", "sc-service", "serde", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-externalities 0.8.0 (git+https://github.com/paritytech/substrate)", - "sp-keystore 0.8.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-state-machine 0.8.0 (git+https://github.com/paritytech/substrate)", + "sp-core", + "sp-externalities", + "sp-keystore", + "sp-runtime", + "sp-state-machine", "structopt", ] @@ -1521,25 +1515,15 @@ name = "frame-executive" version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ - "frame-support 2.0.0 (git+https://github.com/paritytech/substrate)", - "frame-system 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-support", + "frame-system", "parity-scale-codec", "serde", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-io 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-tracing 2.0.0 (git+https://github.com/paritytech/substrate)", -] - -[[package]] -name = "frame-metadata" -version = "12.0.0" -dependencies = [ - "parity-scale-codec", - "serde", - "sp-core 2.0.0", - "sp-std 2.0.0", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", + "sp-tracing", ] [[package]] @@ -1549,32 +1533,8 @@ source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e39 dependencies = [ "parity-scale-codec", "serde", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", -] - -[[package]] -name = "frame-support" -version = "2.0.0" -dependencies = [ - "bitflags", - "frame-metadata 12.0.0", - "frame-support-procedural 2.0.0", - "impl-trait-for-tuples", - "log", - "once_cell", - "parity-scale-codec", - "paste", - "serde", - "smallvec 1.5.0", - "sp-arithmetic 2.0.0", - "sp-core 2.0.0", - "sp-inherents 2.0.0", - "sp-io 2.0.0", - "sp-runtime 2.0.0", - "sp-state-machine 0.8.0", - "sp-std 2.0.0", - "sp-tracing 2.0.0", + "sp-core", + "sp-std", ] [[package]] @@ -1583,8 +1543,8 @@ version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ "bitflags", - "frame-metadata 12.0.0 (git+https://github.com/paritytech/substrate)", - "frame-support-procedural 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-metadata", + "frame-support-procedural", "impl-trait-for-tuples", "log", "once_cell", @@ -1592,24 +1552,14 @@ dependencies = [ "paste", "serde", "smallvec 1.5.0", - "sp-arithmetic 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-inherents 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-io 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-state-machine 0.8.0 (git+https://github.com/paritytech/substrate)", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-tracing 2.0.0 (git+https://github.com/paritytech/substrate)", -] - -[[package]] -name = "frame-support-procedural" -version = "2.0.0" -dependencies = [ - "frame-support-procedural-tools 2.0.0", - "proc-macro2", - "quote", - "syn", + "sp-arithmetic", + "sp-core", + "sp-inherents", + "sp-io", + "sp-runtime", + "sp-state-machine", + "sp-std", + "sp-tracing", ] [[package]] @@ -1617,18 +1567,7 @@ name = "frame-support-procedural" version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ - "frame-support-procedural-tools 2.0.0 (git+https://github.com/paritytech/substrate)", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "frame-support-procedural-tools" -version = "2.0.0" -dependencies = [ - "frame-support-procedural-tools-derive 2.0.0", - "proc-macro-crate", + "frame-support-procedural-tools", "proc-macro2", "quote", "syn", @@ -1639,22 +1578,13 @@ name = "frame-support-procedural-tools" version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ - "frame-support-procedural-tools-derive 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-support-procedural-tools-derive", "proc-macro-crate", "proc-macro2", "quote", "syn", ] -[[package]] -name = "frame-support-procedural-tools-derive" -version = "2.0.0" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0" @@ -1665,35 +1595,20 @@ dependencies = [ "syn", ] -[[package]] -name = "frame-system" -version = "2.0.0" -dependencies = [ - "frame-support 2.0.0", - "impl-trait-for-tuples", - "parity-scale-codec", - "serde", - "sp-core 2.0.0", - "sp-io 2.0.0", - "sp-runtime 2.0.0", - "sp-std 2.0.0", - "sp-version 2.0.0", -] - [[package]] name = "frame-system" version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ - "frame-support 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-support", "impl-trait-for-tuples", "parity-scale-codec", "serde", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-io 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-version 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", + "sp-version", ] [[package]] @@ -1701,13 +1616,13 @@ name = "frame-system-benchmarking" version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ - "frame-benchmarking 2.0.0 (git+https://github.com/paritytech/substrate)", - "frame-support 2.0.0 (git+https://github.com/paritytech/substrate)", - "frame-system 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-benchmarking", + "frame-support", + "frame-system", "parity-scale-codec", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core", + "sp-runtime", + "sp-std", ] [[package]] @@ -1716,7 +1631,7 @@ version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ "parity-scale-codec", - "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-api", ] [[package]] @@ -2678,10 +2593,10 @@ dependencies = [ "sp-authority-discovery", "sp-consensus", "sp-consensus-babe", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core", "sp-finality-grandpa", - "sp-inherents 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-inherents", + "sp-runtime", "sp-transaction-pool", "structopt", "substrate-build-script-utils", @@ -2698,7 +2613,7 @@ dependencies = [ name = "jupiter-dev-cli" version = "0.1.0" dependencies = [ - "frame-benchmarking 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-benchmarking", "frame-benchmarking-cli", "futures 0.3.8", "jupiter-dev-executor", @@ -2718,11 +2633,11 @@ dependencies = [ "sc-service", "sc-transaction-pool", "serde_json", - "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-api", "sp-consensus", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-inherents 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core", + "sp-inherents", + "sp-runtime", "sp-timestamp", "structopt", "substrate-build-script-utils", @@ -2732,7 +2647,7 @@ dependencies = [ name = "jupiter-dev-executor" version = "0.1.0" dependencies = [ - "frame-benchmarking 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-benchmarking", "jupiter-dev-runtime", "sc-executor", ] @@ -2741,10 +2656,10 @@ dependencies = [ name = "jupiter-dev-runtime" version = "0.1.0" dependencies = [ - "frame-benchmarking 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-benchmarking", "frame-executive", - "frame-support 2.0.0 (git+https://github.com/paritytech/substrate)", - "frame-system 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-support", + "frame-system", "frame-system-benchmarking", "frame-system-rpc-runtime-api", "hex-literal 0.3.1", @@ -2753,7 +2668,7 @@ dependencies = [ "pallet-authorship", "pallet-balances", "pallet-contracts 2.0.0", - "pallet-contracts-primitives 2.0.0 (git+https://github.com/paritytech/substrate)", + "pallet-contracts-primitives", "pallet-contracts-rpc-runtime-api", "pallet-indices", "pallet-randomness-collective-flip", @@ -2763,16 +2678,16 @@ dependencies = [ "pallet-transaction-payment-rpc-runtime-api", "parity-scale-codec", "serde", - "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-api", "sp-block-builder", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-inherents 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core", + "sp-inherents", "sp-offchain", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime", "sp-session", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std", "sp-transaction-pool", - "sp-version 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-version", "static_assertions", "substrate-wasm-builder", ] @@ -2781,7 +2696,7 @@ dependencies = [ name = "jupiter-executor" version = "0.1.0" dependencies = [ - "frame-benchmarking 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-benchmarking", "jupiter-runtime", "sc-executor", ] @@ -2793,20 +2708,21 @@ dependencies = [ "megaclite-arkworks", "num-bigint 0.3.1", "num-traits", - "sp-runtime-interface 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime-interface", + "sp-std", ] [[package]] name = "jupiter-primitives" version = "0.1.0" dependencies = [ - "frame-system 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-system", "parity-scale-codec", "serde", - "sp-application-crypto 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-application-crypto", + "sp-core", + "sp-runtime", + "sp-std", ] [[package]] @@ -2825,13 +2741,13 @@ dependencies = [ "sc-finality-grandpa-rpc", "sc-rpc", "sc-rpc-api", - "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-api", "sp-block-builder", "sp-blockchain", "sp-consensus", "sp-consensus-babe", - "sp-keystore 0.8.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-keystore", + "sp-runtime", "sp-transaction-pool", "substrate-frame-rpc-system", ] @@ -2841,8 +2757,8 @@ name = "jupiter-runtime" version = "0.1.0" dependencies = [ "frame-executive", - "frame-support 2.0.0 (git+https://github.com/paritytech/substrate)", - "frame-system 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-support", + "frame-system", "frame-system-rpc-runtime-api", "jupiter-primitives", "jupiter-runtime-common", @@ -2851,7 +2767,7 @@ dependencies = [ "pallet-babe", "pallet-balances", "pallet-contracts 2.0.0 (git+https://github.com/paritytech/substrate)", - "pallet-contracts-primitives 2.0.0 (git+https://github.com/paritytech/substrate)", + "pallet-contracts-primitives", "pallet-contracts-rpc-runtime-api", "pallet-grandpa", "pallet-im-online", @@ -2867,19 +2783,19 @@ dependencies = [ "pallet-utility", "parity-scale-codec", "serde", - "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-api", "sp-authority-discovery", "sp-block-builder", "sp-consensus-babe", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-inherents 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-io 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core", + "sp-inherents", + "sp-io", "sp-offchain", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime", "sp-session", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std", "sp-transaction-pool", - "sp-version 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-version", "static_assertions", "substrate-wasm-builder", ] @@ -2888,8 +2804,8 @@ dependencies = [ name = "jupiter-runtime-common" version = "0.1.0" dependencies = [ - "frame-support 2.0.0 (git+https://github.com/paritytech/substrate)", - "frame-system 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-support", + "frame-system", "jupiter-primitives", "pallet-authorship", "pallet-balances", @@ -2898,8 +2814,8 @@ dependencies = [ "pallet-timestamp", "pallet-transaction-payment", "smallvec 1.5.0", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime", + "sp-std", ] [[package]] @@ -4021,15 +3937,15 @@ name = "pallet-authority-discovery" version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ - "frame-support 2.0.0 (git+https://github.com/paritytech/substrate)", - "frame-system 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-support", + "frame-system", "pallet-session", "parity-scale-codec", "serde", - "sp-application-crypto 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-application-crypto", "sp-authority-discovery", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime", + "sp-std", ] [[package]] @@ -4037,14 +3953,14 @@ name = "pallet-authorship" version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ - "frame-support 2.0.0 (git+https://github.com/paritytech/substrate)", - "frame-system 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-support", + "frame-system", "impl-trait-for-tuples", "parity-scale-codec", "sp-authorship", - "sp-inherents 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-inherents", + "sp-runtime", + "sp-std", ] [[package]] @@ -4052,23 +3968,23 @@ name = "pallet-babe" version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ - "frame-benchmarking 2.0.0 (git+https://github.com/paritytech/substrate)", - "frame-support 2.0.0 (git+https://github.com/paritytech/substrate)", - "frame-system 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-benchmarking", + "frame-support", + "frame-system", "pallet-authorship", "pallet-session", "pallet-timestamp", "parity-scale-codec", "serde", - "sp-application-crypto 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-application-crypto", "sp-consensus-babe", "sp-consensus-vrf", - "sp-inherents 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-io 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-inherents", + "sp-io", + "sp-runtime", "sp-session", "sp-staking", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std", "sp-timestamp", ] @@ -4077,35 +3993,35 @@ name = "pallet-balances" version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ - "frame-benchmarking 2.0.0 (git+https://github.com/paritytech/substrate)", - "frame-support 2.0.0 (git+https://github.com/paritytech/substrate)", - "frame-system 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-benchmarking", + "frame-support", + "frame-system", "parity-scale-codec", "serde", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime", + "sp-std", ] [[package]] name = "pallet-contracts" version = "2.0.0" dependencies = [ - "frame-benchmarking 2.0.0", - "frame-support 2.0.0", - "frame-system 2.0.0", - "pallet-contracts-primitives 2.0.0", - "pallet-contracts-proc-macro 0.1.0", + "frame-benchmarking", + "frame-support", + "frame-system", + "pallet-contracts-primitives", + "pallet-contracts-proc-macro", "parity-scale-codec", "parity-wasm 0.41.0", "pwasm-utils 0.16.0", "rand 0.7.3", "rand_pcg", "serde", - "sp-core 2.0.0", - "sp-io 2.0.0", - "sp-runtime 2.0.0", - "sp-sandbox 0.8.0", - "sp-std 2.0.0", + "sp-core", + "sp-io", + "sp-runtime", + "sp-sandbox", + "sp-std", "wasmi-validation", ] @@ -4114,32 +4030,22 @@ name = "pallet-contracts" version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ - "frame-support 2.0.0 (git+https://github.com/paritytech/substrate)", - "frame-system 2.0.0 (git+https://github.com/paritytech/substrate)", - "pallet-contracts-primitives 2.0.0 (git+https://github.com/paritytech/substrate)", - "pallet-contracts-proc-macro 0.1.0 (git+https://github.com/paritytech/substrate)", + "frame-support", + "frame-system", + "pallet-contracts-primitives", + "pallet-contracts-proc-macro", "parity-scale-codec", "parity-wasm 0.41.0", "pwasm-utils 0.16.0", "serde", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-io 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-sandbox 0.8.0 (git+https://github.com/paritytech/substrate)", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core", + "sp-io", + "sp-runtime", + "sp-sandbox", + "sp-std", "wasmi-validation", ] -[[package]] -name = "pallet-contracts-primitives" -version = "2.0.0" -dependencies = [ - "bitflags", - "parity-scale-codec", - "sp-runtime 2.0.0", - "sp-std 2.0.0", -] - [[package]] name = "pallet-contracts-primitives" version = "2.0.0" @@ -4147,17 +4053,8 @@ source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e39 dependencies = [ "bitflags", "parity-scale-codec", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", -] - -[[package]] -name = "pallet-contracts-proc-macro" -version = "0.1.0" -dependencies = [ - "proc-macro2", - "quote", - "syn", + "sp-runtime", + "sp-std", ] [[package]] @@ -4178,15 +4075,15 @@ dependencies = [ "jsonrpc-core", "jsonrpc-core-client", "jsonrpc-derive", - "pallet-contracts-primitives 2.0.0 (git+https://github.com/paritytech/substrate)", + "pallet-contracts-primitives", "pallet-contracts-rpc-runtime-api", "parity-scale-codec", "serde", - "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-api", "sp-blockchain", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core", "sp-rpc", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime", ] [[package]] @@ -4194,11 +4091,11 @@ name = "pallet-contracts-rpc-runtime-api" version = "0.8.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ - "pallet-contracts-primitives 2.0.0 (git+https://github.com/paritytech/substrate)", + "pallet-contracts-primitives", "parity-scale-codec", - "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-api", + "sp-runtime", + "sp-std", ] [[package]] @@ -4206,20 +4103,20 @@ name = "pallet-grandpa" version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ - "frame-benchmarking 2.0.0 (git+https://github.com/paritytech/substrate)", - "frame-support 2.0.0 (git+https://github.com/paritytech/substrate)", - "frame-system 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-benchmarking", + "frame-support", + "frame-system", "pallet-authorship", "pallet-session", "parity-scale-codec", "serde", - "sp-application-crypto 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-application-crypto", + "sp-core", "sp-finality-grandpa", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime", "sp-session", "sp-staking", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std", ] [[package]] @@ -4227,18 +4124,18 @@ name = "pallet-im-online" version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ - "frame-support 2.0.0 (git+https://github.com/paritytech/substrate)", - "frame-system 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-support", + "frame-system", "pallet-authorship", "pallet-session", "parity-scale-codec", "serde", - "sp-application-crypto 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-io 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-application-crypto", + "sp-core", + "sp-io", + "sp-runtime", "sp-staking", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std", ] [[package]] @@ -4246,16 +4143,16 @@ name = "pallet-indices" version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ - "frame-benchmarking 2.0.0 (git+https://github.com/paritytech/substrate)", - "frame-support 2.0.0 (git+https://github.com/paritytech/substrate)", - "frame-system 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-benchmarking", + "frame-support", + "frame-system", "parity-scale-codec", "serde", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-io 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core", + "sp-io", "sp-keyring", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime", + "sp-std", ] [[package]] @@ -4263,14 +4160,14 @@ name = "pallet-multisig" version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ - "frame-support 2.0.0 (git+https://github.com/paritytech/substrate)", - "frame-system 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-support", + "frame-system", "parity-scale-codec", "serde", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-io 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", ] [[package]] @@ -4278,14 +4175,14 @@ name = "pallet-offences" version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ - "frame-support 2.0.0 (git+https://github.com/paritytech/substrate)", - "frame-system 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-support", + "frame-system", "pallet-balances", "parity-scale-codec", "serde", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime", "sp-staking", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std", ] [[package]] @@ -4293,12 +4190,12 @@ name = "pallet-randomness-collective-flip" version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ - "frame-support 2.0.0 (git+https://github.com/paritytech/substrate)", - "frame-system 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-support", + "frame-system", "parity-scale-codec", "safe-mix", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime", + "sp-std", ] [[package]] @@ -4306,19 +4203,19 @@ name = "pallet-session" version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ - "frame-support 2.0.0 (git+https://github.com/paritytech/substrate)", - "frame-system 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-support", + "frame-system", "impl-trait-for-tuples", "pallet-timestamp", "parity-scale-codec", "serde", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-io 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core", + "sp-io", + "sp-runtime", "sp-session", "sp-staking", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-trie 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std", + "sp-trie", ] [[package]] @@ -4326,13 +4223,13 @@ name = "pallet-sudo" version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ - "frame-support 2.0.0 (git+https://github.com/paritytech/substrate)", - "frame-system 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-support", + "frame-system", "parity-scale-codec", "serde", - "sp-io 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-io", + "sp-runtime", + "sp-std", ] [[package]] @@ -4340,16 +4237,16 @@ name = "pallet-timestamp" version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ - "frame-benchmarking 2.0.0 (git+https://github.com/paritytech/substrate)", - "frame-support 2.0.0 (git+https://github.com/paritytech/substrate)", - "frame-system 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-benchmarking", + "frame-support", + "frame-system", "impl-trait-for-tuples", "parity-scale-codec", "serde", - "sp-inherents 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-io 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-inherents", + "sp-io", + "sp-runtime", + "sp-std", "sp-timestamp", ] @@ -4358,16 +4255,16 @@ name = "pallet-transaction-payment" version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ - "frame-support 2.0.0 (git+https://github.com/paritytech/substrate)", - "frame-system 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-support", + "frame-system", "pallet-transaction-payment-rpc-runtime-api", "parity-scale-codec", "serde", "smallvec 1.5.0", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-io 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", ] [[package]] @@ -4381,11 +4278,11 @@ dependencies = [ "pallet-transaction-payment-rpc-runtime-api", "parity-scale-codec", "serde", - "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-api", "sp-blockchain", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core", "sp-rpc", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime", ] [[package]] @@ -4393,12 +4290,12 @@ name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ - "frame-support 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-support", "parity-scale-codec", "serde", - "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-api", + "sp-runtime", + "sp-std", ] [[package]] @@ -4406,14 +4303,14 @@ name = "pallet-utility" version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ - "frame-support 2.0.0 (git+https://github.com/paritytech/substrate)", - "frame-system 2.0.0 (git+https://github.com/paritytech/substrate)", + "frame-support", + "frame-system", "parity-scale-codec", "serde", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-io 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", ] [[package]] @@ -5477,12 +5374,12 @@ dependencies = [ "sc-client-api", "sc-network", "serde_json", - "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-api", "sp-authority-discovery", "sp-blockchain", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-keystore 0.8.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core", + "sp-keystore", + "sp-runtime", "substrate-prometheus-endpoint", ] @@ -5499,12 +5396,12 @@ dependencies = [ "sc-client-api", "sc-proposer-metrics", "sc-telemetry", - "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-api", "sp-blockchain", "sp-consensus", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-inherents 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core", + "sp-inherents", + "sp-runtime", "sp-transaction-pool", "substrate-prometheus-endpoint", ] @@ -5516,14 +5413,14 @@ source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e39 dependencies = [ "parity-scale-codec", "sc-client-api", - "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-api", "sp-block-builder", "sp-blockchain", "sp-consensus", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-inherents 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-state-machine 0.8.0 (git+https://github.com/paritytech/substrate)", + "sp-core", + "sp-inherents", + "sp-runtime", + "sp-state-machine", ] [[package]] @@ -5543,8 +5440,8 @@ dependencies = [ "serde_json", "sp-chain-spec", "sp-consensus-babe", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core", + "sp-runtime", ] [[package]] @@ -5587,13 +5484,13 @@ dependencies = [ "serde", "serde_json", "sp-blockchain", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core", "sp-keyring", - "sp-keystore 0.8.0 (git+https://github.com/paritytech/substrate)", - "sp-panic-handler 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-keystore", + "sp-panic-handler", + "sp-runtime", "sp-utils", - "sp-version 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-version", "structopt", "thiserror", "tiny-bip39", @@ -5629,22 +5526,22 @@ dependencies = [ "parity-scale-codec", "parking_lot 0.10.2", "sc-executor", - "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-api", "sp-blockchain", "sp-consensus", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core", "sp-database", - "sp-externalities 0.8.0 (git+https://github.com/paritytech/substrate)", - "sp-inherents 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-keystore 0.8.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-state-machine 0.8.0 (git+https://github.com/paritytech/substrate)", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-storage 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-externalities", + "sp-inherents", + "sp-keystore", + "sp-runtime", + "sp-state-machine", + "sp-std", + "sp-storage", "sp-transaction-pool", - "sp-trie 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-trie", "sp-utils", - "sp-version 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-version", "substrate-prometheus-endpoint", ] @@ -5667,14 +5564,14 @@ dependencies = [ "sc-client-api", "sc-executor", "sc-state-db", - "sp-arithmetic 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-arithmetic", "sp-blockchain", "sp-consensus", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core", "sp-database", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-state-machine 0.8.0 (git+https://github.com/paritytech/substrate)", - "sp-trie 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime", + "sp-state-machine", + "sp-trie", "substrate-prometheus-endpoint", ] @@ -5686,7 +5583,7 @@ dependencies = [ "sc-client-api", "sp-blockchain", "sp-consensus", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime", ] [[package]] @@ -5716,21 +5613,21 @@ dependencies = [ "sc-telemetry", "schnorrkel", "serde", - "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-application-crypto 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-api", + "sp-application-crypto", "sp-block-builder", "sp-blockchain", "sp-consensus", "sp-consensus-babe", "sp-consensus-vrf", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-inherents 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-io 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-keystore 0.8.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core", + "sp-inherents", + "sp-io", + "sp-keystore", + "sp-runtime", "sp-timestamp", "sp-utils", - "sp-version 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-version", "substrate-prometheus-endpoint", ] @@ -5748,14 +5645,14 @@ dependencies = [ "sc-consensus-epochs", "sc-rpc-api", "serde", - "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-application-crypto 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-api", + "sp-application-crypto", "sp-blockchain", "sp-consensus", "sp-consensus-babe", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-keystore 0.8.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core", + "sp-keystore", + "sp-runtime", ] [[package]] @@ -5768,7 +5665,7 @@ dependencies = [ "parking_lot 0.10.2", "sc-client-api", "sp-blockchain", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime", ] [[package]] @@ -5790,15 +5687,15 @@ dependencies = [ "sc-consensus-epochs", "sc-transaction-pool", "serde", - "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-api", "sp-blockchain", "sp-consensus", "sp-consensus-babe", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-inherents 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core", + "sp-inherents", "sp-keyring", - "sp-keystore 0.8.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-keystore", + "sp-runtime", "sp-timestamp", "sp-transaction-pool", "substrate-prometheus-endpoint", @@ -5816,17 +5713,17 @@ dependencies = [ "parking_lot 0.10.2", "sc-client-api", "sc-telemetry", - "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-application-crypto 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-arithmetic 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-api", + "sp-application-crypto", + "sp-arithmetic", "sp-blockchain", "sp-consensus", "sp-consensus-slots", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-inherents 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-state-machine 0.8.0 (git+https://github.com/paritytech/substrate)", - "sp-trie 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core", + "sp-inherents", + "sp-runtime", + "sp-state-machine", + "sp-trie", "thiserror", ] @@ -5839,9 +5736,9 @@ dependencies = [ "sc-client-api", "sp-authorship", "sp-consensus", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-inherents 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core", + "sp-inherents", + "sp-runtime", ] [[package]] @@ -5859,17 +5756,17 @@ dependencies = [ "sc-executor-common", "sc-executor-wasmi", "sc-executor-wasmtime", - "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-externalities 0.8.0 (git+https://github.com/paritytech/substrate)", - "sp-io 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-panic-handler 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime-interface 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-api", + "sp-core", + "sp-externalities", + "sp-io", + "sp-panic-handler", + "sp-runtime-interface", "sp-serializer", "sp-tasks", - "sp-trie 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-version 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-wasm-interface 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-trie", + "sp-version", + "sp-wasm-interface", "wasmi", ] @@ -5882,9 +5779,9 @@ dependencies = [ "parity-scale-codec", "parity-wasm 0.41.0", "sp-allocator", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core", "sp-serializer", - "sp-wasm-interface 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-wasm-interface", "thiserror", "wasmi", ] @@ -5898,9 +5795,9 @@ dependencies = [ "parity-scale-codec", "sc-executor-common", "sp-allocator", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime-interface 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-wasm-interface 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core", + "sp-runtime-interface", + "sp-wasm-interface", "wasmi", ] @@ -5916,9 +5813,9 @@ dependencies = [ "sc-executor-common", "scoped-tls", "sp-allocator", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime-interface 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-wasm-interface 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core", + "sp-runtime-interface", + "sp-wasm-interface", "wasmtime", ] @@ -5945,16 +5842,16 @@ dependencies = [ "sc-network-gossip", "sc-telemetry", "serde_json", - "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-application-crypto 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-arithmetic 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-api", + "sp-application-crypto", + "sp-arithmetic", "sp-blockchain", "sp-consensus", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core", "sp-finality-grandpa", - "sp-inherents 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-keystore 0.8.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-inherents", + "sp-keystore", + "sp-runtime", "sp-utils", "substrate-prometheus-endpoint", ] @@ -5979,8 +5876,8 @@ dependencies = [ "serde", "serde_json", "sp-blockchain", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core", + "sp-runtime", ] [[package]] @@ -5995,7 +5892,7 @@ dependencies = [ "sc-client-api", "sc-network", "sp-blockchain", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime", "sp-transaction-pool", "sp-utils", "wasm-timer", @@ -6015,9 +5912,9 @@ dependencies = [ "parking_lot 0.10.2", "rand 0.7.3", "serde_json", - "sp-application-crypto 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-keystore 0.8.0 (git+https://github.com/paritytech/substrate)", + "sp-application-crypto", + "sp-core", + "sp-keystore", "subtle 2.3.0", ] @@ -6032,12 +5929,12 @@ dependencies = [ "parking_lot 0.10.2", "sc-client-api", "sc-executor", - "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-api", "sp-blockchain", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-externalities 0.8.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-state-machine 0.8.0 (git+https://github.com/paritytech/substrate)", + "sp-core", + "sp-externalities", + "sp-runtime", + "sp-state-machine", ] [[package]] @@ -6080,11 +5977,11 @@ dependencies = [ "slog", "slog_derive", "smallvec 1.5.0", - "sp-arithmetic 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-arithmetic", "sp-blockchain", "sp-consensus", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core", + "sp-runtime", "sp-utils", "substrate-prometheus-endpoint", "thiserror", @@ -6105,7 +6002,7 @@ dependencies = [ "log", "lru", "sc-network", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime", "wasm-timer", ] @@ -6128,10 +6025,10 @@ dependencies = [ "sc-client-api", "sc-keystore", "sc-network", - "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-api", + "sp-core", "sp-offchain", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime", "sp-utils", "threadpool", ] @@ -6176,19 +6073,19 @@ dependencies = [ "sc-keystore", "sc-rpc-api", "serde_json", - "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-api", "sp-blockchain", "sp-chain-spec", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-keystore 0.8.0 (git+https://github.com/paritytech/substrate)", + "sp-core", + "sp-keystore", "sp-offchain", "sp-rpc", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime", "sp-session", - "sp-state-machine 0.8.0 (git+https://github.com/paritytech/substrate)", + "sp-state-machine", "sp-transaction-pool", "sp-utils", - "sp-version 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-version", ] [[package]] @@ -6208,11 +6105,11 @@ dependencies = [ "serde", "serde_json", "sp-chain-spec", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core", "sp-rpc", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime", "sp-transaction-pool", - "sp-version 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-version", ] [[package]] @@ -6229,7 +6126,7 @@ dependencies = [ "log", "serde", "serde_json", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime", "substrate-prometheus-endpoint", ] @@ -6271,24 +6168,24 @@ dependencies = [ "serde", "serde_json", "slog", - "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-application-crypto 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-api", + "sp-application-crypto", "sp-block-builder", "sp-blockchain", "sp-consensus", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-externalities 0.8.0 (git+https://github.com/paritytech/substrate)", - "sp-inherents 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-io 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-keystore 0.8.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core", + "sp-externalities", + "sp-inherents", + "sp-io", + "sp-keystore", + "sp-runtime", "sp-session", - "sp-state-machine 0.8.0 (git+https://github.com/paritytech/substrate)", - "sp-tracing 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-state-machine", + "sp-tracing", "sp-transaction-pool", - "sp-trie 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-trie", "sp-utils", - "sp-version 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-version", "substrate-prometheus-endpoint", "tempfile", "thiserror", @@ -6308,7 +6205,7 @@ dependencies = [ "parity-util-mem-derive", "parking_lot 0.10.2", "sc-client-api", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core", "thiserror", ] @@ -6346,7 +6243,7 @@ dependencies = [ "serde", "serde_json", "slog", - "sp-tracing 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-tracing", "tracing", "tracing-core", "tracing-subscriber", @@ -6366,8 +6263,8 @@ dependencies = [ "retain_mut", "serde", "sp-blockchain", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core", + "sp-runtime", "sp-transaction-pool", "sp-utils", "thiserror", @@ -6388,11 +6285,11 @@ dependencies = [ "parking_lot 0.10.2", "sc-client-api", "sc-transaction-graph", - "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-api", "sp-blockchain", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-tracing 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core", + "sp-runtime", + "sp-tracing", "sp-transaction-pool", "sp-utils", "substrate-prometheus-endpoint", @@ -6423,7 +6320,6 @@ dependencies = [ "merlin", "rand 0.7.3", "rand_core 0.5.1", - "serde", "sha2 0.8.2", "subtle 2.3.0", "zeroize", @@ -6800,24 +6696,12 @@ version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ "log", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-wasm-interface 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core", + "sp-std", + "sp-wasm-interface", "thiserror", ] -[[package]] -name = "sp-api" -version = "2.0.0" -dependencies = [ - "parity-scale-codec", - "sp-api-proc-macro 2.0.0", - "sp-core 2.0.0", - "sp-runtime 2.0.0", - "sp-std 2.0.0", - "sp-version 2.0.0", -] - [[package]] name = "sp-api" version = "2.0.0" @@ -6825,26 +6709,15 @@ source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e39 dependencies = [ "hash-db", "parity-scale-codec", - "sp-api-proc-macro 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-state-machine 0.8.0 (git+https://github.com/paritytech/substrate)", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-version 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-api-proc-macro", + "sp-core", + "sp-runtime", + "sp-state-machine", + "sp-std", + "sp-version", "thiserror", ] -[[package]] -name = "sp-api-proc-macro" -version = "2.0.0" -dependencies = [ - "blake2-rfc", - "proc-macro-crate", - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "sp-api-proc-macro" version = "2.0.0" @@ -6857,17 +6730,6 @@ dependencies = [ "syn", ] -[[package]] -name = "sp-application-crypto" -version = "2.0.0" -dependencies = [ - "parity-scale-codec", - "serde", - "sp-core 2.0.0", - "sp-io 2.0.0", - "sp-std 2.0.0", -] - [[package]] name = "sp-application-crypto" version = "2.0.0" @@ -6875,21 +6737,9 @@ source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e39 dependencies = [ "parity-scale-codec", "serde", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-io 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", -] - -[[package]] -name = "sp-arithmetic" -version = "2.0.0" -dependencies = [ - "integer-sqrt", - "num-traits", - "parity-scale-codec", - "serde", - "sp-debug-derive 2.0.0", - "sp-std 2.0.0", + "sp-core", + "sp-io", + "sp-std", ] [[package]] @@ -6901,8 +6751,8 @@ dependencies = [ "num-traits", "parity-scale-codec", "serde", - "sp-debug-derive 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-debug-derive", + "sp-std", ] [[package]] @@ -6911,10 +6761,10 @@ version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ "parity-scale-codec", - "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-application-crypto 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-api", + "sp-application-crypto", + "sp-runtime", + "sp-std", ] [[package]] @@ -6923,9 +6773,9 @@ version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ "parity-scale-codec", - "sp-inherents 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-inherents", + "sp-runtime", + "sp-std", ] [[package]] @@ -6934,10 +6784,10 @@ version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ "parity-scale-codec", - "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-inherents 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-api", + "sp-inherents", + "sp-runtime", + "sp-std", ] [[package]] @@ -6950,11 +6800,11 @@ dependencies = [ "lru", "parity-scale-codec", "parking_lot 0.10.2", - "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-api", "sp-consensus", "sp-database", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-state-machine 0.8.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime", + "sp-state-machine", "thiserror", ] @@ -6979,15 +6829,15 @@ dependencies = [ "parity-scale-codec", "parking_lot 0.10.2", "serde", - "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-inherents 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-state-machine 0.8.0 (git+https://github.com/paritytech/substrate)", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-trie 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-api", + "sp-core", + "sp-inherents", + "sp-runtime", + "sp-state-machine", + "sp-std", + "sp-trie", "sp-utils", - "sp-version 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-version", "substrate-prometheus-endpoint", "thiserror", "wasm-timer", @@ -7000,16 +6850,16 @@ source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e39 dependencies = [ "merlin", "parity-scale-codec", - "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-application-crypto 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-api", + "sp-application-crypto", "sp-consensus", "sp-consensus-slots", "sp-consensus-vrf", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-inherents 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-keystore 0.8.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core", + "sp-inherents", + "sp-keystore", + "sp-runtime", + "sp-std", "sp-timestamp", ] @@ -7019,7 +6869,7 @@ version = "0.8.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ "parity-scale-codec", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime", ] [[package]] @@ -7029,52 +6879,9 @@ source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e39 dependencies = [ "parity-scale-codec", "schnorrkel", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", -] - -[[package]] -name = "sp-core" -version = "2.0.0" -dependencies = [ - "base58", - "blake2-rfc", - "byteorder", - "dyn-clonable", - "ed25519-dalek", - "futures 0.3.8", - "hash-db", - "hash256-std-hasher", - "hex", - "impl-serde", - "lazy_static", - "libsecp256k1", - "log", - "merlin", - "num-traits", - "parity-scale-codec", - "parity-util-mem", - "parking_lot 0.10.2", - "primitive-types", - "rand 0.7.3", - "regex", - "schnorrkel", - "secrecy", - "serde", - "sha2 0.8.2", - "sp-debug-derive 2.0.0", - "sp-externalities 0.8.0", - "sp-runtime-interface 2.0.0", - "sp-std 2.0.0", - "sp-storage 2.0.0", - "substrate-bip39", - "thiserror", - "tiny-bip39", - "tiny-keccak", - "twox-hash", - "wasmi", - "zeroize", + "sp-core", + "sp-runtime", + "sp-std", ] [[package]] @@ -7107,11 +6914,11 @@ dependencies = [ "secrecy", "serde", "sha2 0.8.2", - "sp-debug-derive 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-externalities 0.8.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime-interface 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-storage 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-debug-derive", + "sp-externalities", + "sp-runtime-interface", + "sp-std", + "sp-storage", "substrate-bip39", "thiserror", "tiny-bip39", @@ -7130,15 +6937,6 @@ dependencies = [ "parking_lot 0.10.2", ] -[[package]] -name = "sp-debug-derive" -version = "2.0.0" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "sp-debug-derive" version = "2.0.0" @@ -7149,16 +6947,6 @@ dependencies = [ "syn", ] -[[package]] -name = "sp-externalities" -version = "0.8.0" -dependencies = [ - "environmental", - "parity-scale-codec", - "sp-std 2.0.0", - "sp-storage 2.0.0", -] - [[package]] name = "sp-externalities" version = "0.8.0" @@ -7166,8 +6954,8 @@ source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e39 dependencies = [ "environmental", "parity-scale-codec", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-storage 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std", + "sp-storage", ] [[package]] @@ -7179,23 +6967,12 @@ dependencies = [ "log", "parity-scale-codec", "serde", - "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-application-crypto 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-keystore 0.8.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", -] - -[[package]] -name = "sp-inherents" -version = "2.0.0" -dependencies = [ - "parity-scale-codec", - "parking_lot 0.10.2", - "sp-core 2.0.0", - "sp-std 2.0.0", - "thiserror", + "sp-api", + "sp-application-crypto", + "sp-core", + "sp-keystore", + "sp-runtime", + "sp-std", ] [[package]] @@ -7205,34 +6982,11 @@ source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e39 dependencies = [ "parity-scale-codec", "parking_lot 0.10.2", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core", + "sp-std", "thiserror", ] -[[package]] -name = "sp-io" -version = "2.0.0" -dependencies = [ - "futures 0.3.8", - "hash-db", - "libsecp256k1", - "log", - "parity-scale-codec", - "parking_lot 0.10.2", - "sp-core 2.0.0", - "sp-externalities 0.8.0", - "sp-keystore 0.8.0", - "sp-runtime-interface 2.0.0", - "sp-state-machine 0.8.0", - "sp-std 2.0.0", - "sp-tracing 2.0.0", - "sp-trie 2.0.0", - "sp-wasm-interface 2.0.0", - "tracing", - "tracing-core", -] - [[package]] name = "sp-io" version = "2.0.0" @@ -7244,15 +6998,15 @@ dependencies = [ "log", "parity-scale-codec", "parking_lot 0.10.2", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-externalities 0.8.0 (git+https://github.com/paritytech/substrate)", - "sp-keystore 0.8.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime-interface 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-state-machine 0.8.0 (git+https://github.com/paritytech/substrate)", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-tracing 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-trie 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-wasm-interface 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core", + "sp-externalities", + "sp-keystore", + "sp-runtime-interface", + "sp-state-machine", + "sp-std", + "sp-tracing", + "sp-trie", + "sp-wasm-interface", "tracing", "tracing-core", ] @@ -7263,26 +7017,11 @@ version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ "lazy_static", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core", + "sp-runtime", "strum", ] -[[package]] -name = "sp-keystore" -version = "0.8.0" -dependencies = [ - "async-trait", - "derive_more", - "futures 0.3.8", - "merlin", - "parity-scale-codec", - "parking_lot 0.10.2", - "schnorrkel", - "sp-core 2.0.0", - "sp-externalities 0.8.0", -] - [[package]] name = "sp-keystore" version = "0.8.0" @@ -7295,8 +7034,8 @@ dependencies = [ "parity-scale-codec", "parking_lot 0.10.2", "schnorrkel", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-externalities 0.8.0 (git+https://github.com/paritytech/substrate)", + "sp-core", + "sp-externalities", ] [[package]] @@ -7304,16 +7043,9 @@ name = "sp-offchain" version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ - "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", -] - -[[package]] -name = "sp-panic-handler" -version = "2.0.0" -dependencies = [ - "backtrace", + "sp-api", + "sp-core", + "sp-runtime", ] [[package]] @@ -7330,27 +7062,7 @@ version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ "serde", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", -] - -[[package]] -name = "sp-runtime" -version = "2.0.0" -dependencies = [ - "either", - "hash256-std-hasher", - "impl-trait-for-tuples", - "log", - "parity-scale-codec", - "parity-util-mem", - "paste", - "rand 0.7.3", - "serde", - "sp-application-crypto 2.0.0", - "sp-arithmetic 2.0.0", - "sp-core 2.0.0", - "sp-io 2.0.0", - "sp-std 2.0.0", + "sp-core", ] [[package]] @@ -7367,27 +7079,11 @@ dependencies = [ "paste", "rand 0.7.3", "serde", - "sp-application-crypto 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-arithmetic 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-io 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", -] - -[[package]] -name = "sp-runtime-interface" -version = "2.0.0" -dependencies = [ - "impl-trait-for-tuples", - "parity-scale-codec", - "primitive-types", - "sp-externalities 0.8.0", - "sp-runtime-interface-proc-macro 2.0.0", - "sp-std 2.0.0", - "sp-storage 2.0.0", - "sp-tracing 2.0.0", - "sp-wasm-interface 2.0.0", - "static_assertions", + "sp-application-crypto", + "sp-arithmetic", + "sp-core", + "sp-io", + "sp-std", ] [[package]] @@ -7397,26 +7093,15 @@ source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e39 dependencies = [ "parity-scale-codec", "primitive-types", - "sp-externalities 0.8.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime-interface-proc-macro 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-storage 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-tracing 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-wasm-interface 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-externalities", + "sp-runtime-interface-proc-macro", + "sp-std", + "sp-storage", + "sp-tracing", + "sp-wasm-interface", "static_assertions", ] -[[package]] -name = "sp-runtime-interface-proc-macro" -version = "2.0.0" -dependencies = [ - "Inflector", - "proc-macro-crate", - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "sp-runtime-interface-proc-macro" version = "2.0.0" @@ -7429,28 +7114,16 @@ dependencies = [ "syn", ] -[[package]] -name = "sp-sandbox" -version = "0.8.0" -dependencies = [ - "parity-scale-codec", - "sp-core 2.0.0", - "sp-io 2.0.0", - "sp-std 2.0.0", - "sp-wasm-interface 2.0.0", - "wasmi", -] - [[package]] name = "sp-sandbox" version = "0.8.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ "parity-scale-codec", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-io 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-wasm-interface 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core", + "sp-io", + "sp-std", + "sp-wasm-interface", "wasmi", ] @@ -7469,11 +7142,11 @@ version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ "parity-scale-codec", - "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-api", + "sp-core", + "sp-runtime", "sp-staking", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std", ] [[package]] @@ -7482,29 +7155,8 @@ version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ "parity-scale-codec", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", -] - -[[package]] -name = "sp-state-machine" -version = "0.8.0" -dependencies = [ - "hash-db", - "log", - "num-traits", - "parity-scale-codec", - "parking_lot 0.10.2", - "rand 0.7.3", - "smallvec 1.5.0", - "sp-core 2.0.0", - "sp-externalities 0.8.0", - "sp-panic-handler 2.0.0", - "sp-std 2.0.0", - "sp-trie 2.0.0", - "thiserror", - "trie-db", - "trie-root", + "sp-runtime", + "sp-std", ] [[package]] @@ -7519,37 +7171,21 @@ dependencies = [ "parking_lot 0.10.2", "rand 0.7.3", "smallvec 1.5.0", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-externalities 0.8.0 (git+https://github.com/paritytech/substrate)", - "sp-panic-handler 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-trie 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core", + "sp-externalities", + "sp-panic-handler", + "sp-std", + "sp-trie", "thiserror", "trie-db", "trie-root", ] -[[package]] -name = "sp-std" -version = "2.0.0" - [[package]] name = "sp-std" version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" -[[package]] -name = "sp-storage" -version = "2.0.0" -dependencies = [ - "impl-serde", - "parity-scale-codec", - "ref-cast", - "serde", - "sp-debug-derive 2.0.0", - "sp-std 2.0.0", -] - [[package]] name = "sp-storage" version = "2.0.0" @@ -7559,8 +7195,8 @@ dependencies = [ "parity-scale-codec", "ref-cast", "serde", - "sp-debug-derive 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-debug-derive", + "sp-std", ] [[package]] @@ -7569,11 +7205,11 @@ version = "2.0.0" source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e3971d756d28435efc468d95add52d3" dependencies = [ "log", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-externalities 0.8.0 (git+https://github.com/paritytech/substrate)", - "sp-io 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime-interface 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core", + "sp-externalities", + "sp-io", + "sp-runtime-interface", + "sp-std", ] [[package]] @@ -7583,25 +7219,13 @@ source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e39 dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", - "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-inherents 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-api", + "sp-inherents", + "sp-runtime", + "sp-std", "wasm-timer", ] -[[package]] -name = "sp-tracing" -version = "2.0.0" -dependencies = [ - "log", - "parity-scale-codec", - "sp-std 2.0.0", - "tracing", - "tracing-core", - "tracing-subscriber", -] - [[package]] name = "sp-tracing" version = "2.0.0" @@ -7609,7 +7233,7 @@ source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e39 dependencies = [ "log", "parity-scale-codec", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std", "tracing", "tracing-core", "tracing-subscriber", @@ -7625,25 +7249,12 @@ dependencies = [ "log", "parity-scale-codec", "serde", - "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-api", "sp-blockchain", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-runtime", "thiserror", ] -[[package]] -name = "sp-trie" -version = "2.0.0" -dependencies = [ - "hash-db", - "memory-db", - "parity-scale-codec", - "sp-core 2.0.0", - "sp-std 2.0.0", - "trie-db", - "trie-root", -] - [[package]] name = "sp-trie" version = "2.0.0" @@ -7652,8 +7263,8 @@ dependencies = [ "hash-db", "memory-db", "parity-scale-codec", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core", + "sp-std", "trie-db", "trie-root", ] @@ -7670,17 +7281,6 @@ dependencies = [ "prometheus", ] -[[package]] -name = "sp-version" -version = "2.0.0" -dependencies = [ - "impl-serde", - "parity-scale-codec", - "serde", - "sp-runtime 2.0.0", - "sp-std 2.0.0", -] - [[package]] name = "sp-version" version = "2.0.0" @@ -7689,18 +7289,8 @@ dependencies = [ "impl-serde", "parity-scale-codec", "serde", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", -] - -[[package]] -name = "sp-wasm-interface" -version = "2.0.0" -dependencies = [ - "impl-trait-for-tuples", - "parity-scale-codec", - "sp-std 2.0.0", - "wasmi", + "sp-runtime", + "sp-std", ] [[package]] @@ -7710,7 +7300,7 @@ source = "git+https://github.com/paritytech/substrate?branch=master#a364e27d6e39 dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", - "sp-std 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-std", "wasmi", ] @@ -7847,11 +7437,11 @@ dependencies = [ "sc-client-api", "sc-rpc-api", "serde", - "sp-api 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-api", "sp-block-builder", "sp-blockchain", - "sp-core 2.0.0 (git+https://github.com/paritytech/substrate)", - "sp-runtime 2.0.0 (git+https://github.com/paritytech/substrate)", + "sp-core", + "sp-runtime", "sp-transaction-pool", ] diff --git a/Cargo.toml b/Cargo.toml index b01b94b4..bffa5ce4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,6 +9,7 @@ members = [ # "runtime/jupiter-para", "primitives", "primitives/io", + "primitives/chain_extension", "rpc", ] exclude = ["vendor/substrate"] diff --git a/primitives/chain_extension/Cargo.toml b/primitives/chain_extension/Cargo.toml new file mode 100644 index 00000000..ee03eccd --- /dev/null +++ b/primitives/chain_extension/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "chain_extension" +version = "0.1.0" +authors = ["clearloop "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-contracts = { path = "../../vendor/substrate/frame/contracts", default-features = false } +jupiter-io = { path = "../io", default-features = false } + +[dependencies.curve] +git = "https://github.com/patractlabs/megaclite.git" +package = "megaclite-arkworks" + +[features] +default = ["std"] +std = [ + "jupiter-io/std", + "pallet-contracts/std", + "sp-runtime/std", +] \ No newline at end of file diff --git a/primitives/chain_extension/src/lib.rs b/primitives/chain_extension/src/lib.rs new file mode 100644 index 00000000..170bf48c --- /dev/null +++ b/primitives/chain_extension/src/lib.rs @@ -0,0 +1,70 @@ +//! Jupiter Chain Extension +use pallet_contracts::{ + chain_extension::{ + ChainExtension, Environment, Ext, InitState, RetVal, SysConfig, UncheckedFrom, + }, + Error, +}; +use sp_runtime::DispatchError; + +/// Convert bool to bytes, 0 for true, 1 for false +fn b2b(b: bool) -> Vec { + if b { + Vec::from([0]) + } else { + Vec::from([1]) + } +} + +/// The chain Extension of Jupiter +pub struct JupiterExt; + +impl ChainExtension for JupiterExt { + fn call(func_id: u32, env: Environment) -> Result + where + ::AccountId: UncheckedFrom<::Hash> + AsRef<[u8]>, + { + let mut dimmy: Vec = Vec::new(); + let mut input = dimmy.as_mut_slice(); + let mut env = env.buf_in_buf_out(); + env.read_into(&mut &mut input)?; + if let Some(output) = match func_id { + // Use runtime interfaces + 0x2a => jupiter_io::pairing::add(0x2a, input), + 0x2b => jupiter_io::pairing::add(0x2b, input), + 0x2c => jupiter_io::pairing::add(0x2c, input), + 0x2d => jupiter_io::pairing::add(0x2d, input), + 0x3a => jupiter_io::pairing::mul(0x2a, input), + 0x3b => jupiter_io::pairing::mul(0x2b, input), + 0x3c => jupiter_io::pairing::mul(0x2c, input), + 0x3d => jupiter_io::pairing::mul(0x2d, input), + 0x4a => jupiter_io::pairing::pairing(0x2a, input).map(|b| b2b(b)), + 0x4b => jupiter_io::pairing::pairing(0x2b, input).map(|b| b2b(b)), + 0x4c => jupiter_io::pairing::pairing(0x2c, input).map(|b| b2b(b)), + 0x4d => jupiter_io::pairing::pairing(0x2d, input).map(|b| b2b(b)), + // Use megaclite + 0x5a => curve::add(0x2a, input).ok(), + 0x5b => curve::add(0x2b, input).ok(), + 0x5c => curve::add(0x2c, input).ok(), + 0x5d => curve::add(0x2d, input).ok(), + 0x6a => curve::mul(0x2a, input).ok(), + 0x6b => curve::mul(0x2b, input).ok(), + 0x6c => curve::mul(0x2c, input).ok(), + 0x6d => curve::mul(0x2d, input).ok(), + 0x7a => curve::pairing(0x2a, input).map(|b| b2b(b)).ok(), + 0x7b => curve::pairing(0x2b, input).map(|b| b2b(b)).ok(), + 0x7c => curve::pairing(0x2c, input).map(|b| b2b(b)).ok(), + 0x7d => curve::pairing(0x2d, input).map(|b| b2b(b)).ok(), + _ => return Err(Error::::NoChainExtension.into()), + } { + env.write(&output, false, None)?; + Ok(RetVal::Converging(0)) + } else { + Err(Error::::InvalidFunctionId.into()) + } + } + + fn enabled() -> bool { + true + } +} diff --git a/vendor/substrate b/vendor/substrate index d72e0623..6e298f1f 160000 --- a/vendor/substrate +++ b/vendor/substrate @@ -1 +1 @@ -Subproject commit d72e06237aa5e1ca51af895cdc317383e7b4fc7e +Subproject commit 6e298f1fb3ab931d7b49e646d635c4305f8b50a5 From c401a121826d4ad84d5d3da6ce3dcf8bb8f8fbfb Mon Sep 17 00:00:00 2001 From: clearloop Date: Mon, 14 Dec 2020 01:56:20 +0800 Subject: [PATCH 09/33] feat(bin/node-dev): add chainextension to runtime --- Cargo.lock | 22 ++++++++++--------- Cargo.toml | 2 +- bin/node-dev/cli/src/service.rs | 2 +- .../Cargo.toml | 7 +++--- .../src/lib.rs | 2 ++ runtime/jupiter-dev/Cargo.toml | 2 ++ runtime/jupiter-dev/src/lib.rs | 1 + 7 files changed, 23 insertions(+), 15 deletions(-) rename primitives/{chain_extension => chain-extension}/Cargo.toml (83%) rename primitives/{chain_extension => chain-extension}/src/lib.rs (97%) diff --git a/Cargo.lock b/Cargo.lock index 7224ea72..ce236b99 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -754,16 +754,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "chain_extension" -version = "0.1.0" -dependencies = [ - "jupiter-io", - "megaclite-arkworks", - "pallet-contracts 2.0.0", - "sp-runtime", -] - [[package]] name = "chrono" version = "0.4.19" @@ -2564,6 +2554,17 @@ dependencies = [ "jupiter-cli", ] +[[package]] +name = "jupiter-chain-extension" +version = "0.1.0" +dependencies = [ + "jupiter-io", + "megaclite-arkworks", + "pallet-contracts 2.0.0", + "sp-runtime", + "sp-std", +] + [[package]] name = "jupiter-cli" version = "0.1.0" @@ -2663,6 +2664,7 @@ dependencies = [ "frame-system-benchmarking", "frame-system-rpc-runtime-api", "hex-literal 0.3.1", + "jupiter-chain-extension", "jupiter-primitives", "jupiter-runtime-common", "pallet-authorship", diff --git a/Cargo.toml b/Cargo.toml index bffa5ce4..d9eadf21 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,7 +9,7 @@ members = [ # "runtime/jupiter-para", "primitives", "primitives/io", - "primitives/chain_extension", + "primitives/chain-extension", "rpc", ] exclude = ["vendor/substrate"] diff --git a/bin/node-dev/cli/src/service.rs b/bin/node-dev/cli/src/service.rs index f0a875b6..e3948740 100644 --- a/bin/node-dev/cli/src/service.rs +++ b/bin/node-dev/cli/src/service.rs @@ -21,7 +21,7 @@ native_executor_instance!( pub Executor, jupiter_dev_runtime::api::dispatch, jupiter_dev_runtime::native_version, - (frame_benchmarking::benchmarking::HostFunctions, jupiter_io::zk_snarks::HostFunctions), + (frame_benchmarking::benchmarking::HostFunctions, jupiter_io::pairing::HostFunctions), ); /// Returns most parts of a service. Not enough to run a full chain, diff --git a/primitives/chain_extension/Cargo.toml b/primitives/chain-extension/Cargo.toml similarity index 83% rename from primitives/chain_extension/Cargo.toml rename to primitives/chain-extension/Cargo.toml index ee03eccd..19a9971c 100644 --- a/primitives/chain_extension/Cargo.toml +++ b/primitives/chain-extension/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "chain_extension" +name = "jupiter-chain-extension" version = "0.1.0" authors = ["clearloop "] edition = "2018" @@ -7,9 +7,10 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -pallet-contracts = { path = "../../vendor/substrate/frame/contracts", default-features = false } jupiter-io = { path = "../io", default-features = false } +pallet-contracts = { path = "../../vendor/substrate/frame/contracts", default-features = false } +sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } [dependencies.curve] git = "https://github.com/patractlabs/megaclite.git" diff --git a/primitives/chain_extension/src/lib.rs b/primitives/chain-extension/src/lib.rs similarity index 97% rename from primitives/chain_extension/src/lib.rs rename to primitives/chain-extension/src/lib.rs index 170bf48c..38821c17 100644 --- a/primitives/chain_extension/src/lib.rs +++ b/primitives/chain-extension/src/lib.rs @@ -1,4 +1,5 @@ //! Jupiter Chain Extension +#![cfg_attr(not(feature = "std"), no_std)] use pallet_contracts::{ chain_extension::{ ChainExtension, Environment, Ext, InitState, RetVal, SysConfig, UncheckedFrom, @@ -6,6 +7,7 @@ use pallet_contracts::{ Error, }; use sp_runtime::DispatchError; +use sp_std::vec::Vec; /// Convert bool to bytes, 0 for true, 1 for false fn b2b(b: bool) -> Vec { diff --git a/runtime/jupiter-dev/Cargo.toml b/runtime/jupiter-dev/Cargo.toml index c19ceb74..e0d1a5fa 100644 --- a/runtime/jupiter-dev/Cargo.toml +++ b/runtime/jupiter-dev/Cargo.toml @@ -49,6 +49,7 @@ pallet-contracts-rpc-runtime-api = { version = "0.8.0", git = "https://github.co pallet-contracts = { path = "../../vendor/substrate/frame/contracts", default-features = false } jupiter-primitives = { path = "../../primitives", default-features = false } +jupiter-chain-extension = { path = "../../primitives/chain-extension", default-features = false } jupiter-runtime-common = { path = "../common", default-features = false } [build-dependencies] @@ -89,6 +90,7 @@ std = [ "pallet-contracts/std", "jupiter-primitives/std", + "jupiter-chain-extension/std", "jupiter-runtime-common/std", ] runtime-benchmarks = [ diff --git a/runtime/jupiter-dev/src/lib.rs b/runtime/jupiter-dev/src/lib.rs index e8d62930..11dfdae8 100644 --- a/runtime/jupiter-dev/src/lib.rs +++ b/runtime/jupiter-dev/src/lib.rs @@ -245,6 +245,7 @@ impl pallet_contracts::Config for Runtime { type MaxValueSize = MaxValueSize; type WeightPrice = pallet_transaction_payment::Module; type WeightInfo = pallet_contracts::weights::SubstrateWeight; + type ChainExtension = jupiter_chain_extension::JupiterExt; } impl pallet_sudo::Config for Runtime { From 2936c1c16277f57776ddadfdad58d3b4e4dbf0ce Mon Sep 17 00:00:00 2001 From: clearloop Date: Mon, 14 Dec 2020 11:31:22 +0800 Subject: [PATCH 10/33] perf(clippy): the format of map fn in primitives/chain_extension --- bin/node-dev/cli/src/chain_spec.rs | 3 ++- bin/node-dev/cli/src/service.rs | 2 +- primitives/chain-extension/src/lib.rs | 16 ++++++++-------- primitives/io/src/groth16.rs | 2 +- runtime/jupiter-dev/src/lib.rs | 2 +- 5 files changed, 13 insertions(+), 12 deletions(-) diff --git a/bin/node-dev/cli/src/chain_spec.rs b/bin/node-dev/cli/src/chain_spec.rs index 5dcef5da..6a07d0ac 100644 --- a/bin/node-dev/cli/src/chain_spec.rs +++ b/bin/node-dev/cli/src/chain_spec.rs @@ -34,7 +34,8 @@ where } pub fn development_config() -> Result { - let wasm_binary = WASM_BINARY.ok_or("Development wasm binary not available".to_string())?; + let wasm_binary = + WASM_BINARY.ok_or_else(|| "Development wasm binary not available".to_string())?; Ok(ChainSpec::from_genesis( // Name diff --git a/bin/node-dev/cli/src/service.rs b/bin/node-dev/cli/src/service.rs index e3948740..da691390 100644 --- a/bin/node-dev/cli/src/service.rs +++ b/bin/node-dev/cli/src/service.rs @@ -158,7 +158,7 @@ pub fn new_full(config: Configuration) -> Result { task_manager: &mut task_manager, transaction_pool: transaction_pool.clone(), telemetry_connection_sinks: telemetry_connection_sinks.clone(), - rpc_extensions_builder: rpc_extensions_builder, + rpc_extensions_builder, on_demand: None, remote_blockchain: None, backend, diff --git a/primitives/chain-extension/src/lib.rs b/primitives/chain-extension/src/lib.rs index 38821c17..0ec3bcf0 100644 --- a/primitives/chain-extension/src/lib.rs +++ b/primitives/chain-extension/src/lib.rs @@ -40,10 +40,10 @@ impl ChainExtension for JupiterExt { 0x3b => jupiter_io::pairing::mul(0x2b, input), 0x3c => jupiter_io::pairing::mul(0x2c, input), 0x3d => jupiter_io::pairing::mul(0x2d, input), - 0x4a => jupiter_io::pairing::pairing(0x2a, input).map(|b| b2b(b)), - 0x4b => jupiter_io::pairing::pairing(0x2b, input).map(|b| b2b(b)), - 0x4c => jupiter_io::pairing::pairing(0x2c, input).map(|b| b2b(b)), - 0x4d => jupiter_io::pairing::pairing(0x2d, input).map(|b| b2b(b)), + 0x4a => jupiter_io::pairing::pairing(0x2a, input).map(b2b), + 0x4b => jupiter_io::pairing::pairing(0x2b, input).map(b2b), + 0x4c => jupiter_io::pairing::pairing(0x2c, input).map(b2b), + 0x4d => jupiter_io::pairing::pairing(0x2d, input).map(b2b), // Use megaclite 0x5a => curve::add(0x2a, input).ok(), 0x5b => curve::add(0x2b, input).ok(), @@ -53,10 +53,10 @@ impl ChainExtension for JupiterExt { 0x6b => curve::mul(0x2b, input).ok(), 0x6c => curve::mul(0x2c, input).ok(), 0x6d => curve::mul(0x2d, input).ok(), - 0x7a => curve::pairing(0x2a, input).map(|b| b2b(b)).ok(), - 0x7b => curve::pairing(0x2b, input).map(|b| b2b(b)).ok(), - 0x7c => curve::pairing(0x2c, input).map(|b| b2b(b)).ok(), - 0x7d => curve::pairing(0x2d, input).map(|b| b2b(b)).ok(), + 0x7a => curve::pairing(0x2a, input).map(b2b).ok(), + 0x7b => curve::pairing(0x2b, input).map(b2b).ok(), + 0x7c => curve::pairing(0x2c, input).map(b2b).ok(), + 0x7d => curve::pairing(0x2d, input).map(b2b).ok(), _ => return Err(Error::::NoChainExtension.into()), } { env.write(&output, false, None)?; diff --git a/primitives/io/src/groth16.rs b/primitives/io/src/groth16.rs index 0835bd3c..759520e1 100644 --- a/primitives/io/src/groth16.rs +++ b/primitives/io/src/groth16.rs @@ -54,7 +54,7 @@ fn inner_verify( let scalar_len = C::SCALAR_LEN; if (public_inputs.len() + 1) != vk_gamma_abc.len() { - return Err(Error::new(ErrorKind::Other, "Verifying key was malformed"))?; + return Err(Error::new(ErrorKind::Other, "Verifying key was malformed").into()); } // First two fields are used as the sum diff --git a/runtime/jupiter-dev/src/lib.rs b/runtime/jupiter-dev/src/lib.rs index 11dfdae8..10e201d9 100644 --- a/runtime/jupiter-dev/src/lib.rs +++ b/runtime/jupiter-dev/src/lib.rs @@ -398,7 +398,7 @@ impl_runtime_apis! { gas_limit: u64, input_data: Vec, ) -> pallet_contracts_primitives::ContractExecResult { - Contracts::bare_call(origin, dest.into(), value, gas_limit, input_data) + Contracts::bare_call(origin, dest, value, gas_limit, input_data) } fn get_storage( From 6439a111a5658c913562b2c6f58d26eed4e3dcbc Mon Sep 17 00:00:00 2001 From: clearloop Date: Mon, 14 Dec 2020 12:23:07 +0800 Subject: [PATCH 11/33] feat(pallets/template): add pallet template --- Cargo.lock | 114 +++++++++- Cargo.toml | 1 + pallets/template/Cargo.toml | 51 +++++ pallets/template/README.md | 1 + pallets/template/src/benchmarking.rs | 235 ++++++++++++++++++++ pallets/template/src/lib.rs | 320 +++++++++++++++++++++++++++ pallets/template/src/mock.rs | 54 +++++ pallets/template/src/tests.rs | 23 ++ primitives/io/Cargo.toml | 2 +- primitives/io/src/lib.rs | 82 ++++++- 10 files changed, 880 insertions(+), 3 deletions(-) create mode 100644 pallets/template/Cargo.toml create mode 100644 pallets/template/README.md create mode 100644 pallets/template/src/benchmarking.rs create mode 100644 pallets/template/src/lib.rs create mode 100644 pallets/template/src/mock.rs create mode 100644 pallets/template/src/tests.rs diff --git a/Cargo.lock b/Cargo.lock index ce236b99..be67e9e5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -191,6 +191,23 @@ dependencies = [ "ark-std", ] +[[package]] +name = "ark-crypto-primitives" +version = "0.1.0" +source = "git+https://github.com/arkworks-rs/crypto-primitives.git?branch=main#ce5cc89011b394eb006987a24088947d5099d641" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-relations", + "ark-snark", + "ark-std", + "bench-utils", + "blake2 0.8.1", + "derivative", + "digest 0.8.1", + "rand 0.7.3", +] + [[package]] name = "ark-ec" version = "0.1.0" @@ -229,14 +246,74 @@ dependencies = [ "syn", ] +[[package]] +name = "ark-groth16" +version = "0.1.0" +source = "git+https://github.com/arkworks-rs/groth16#412e5a58372b847d4599e0373776cd87dd92d579" +dependencies = [ + "ark-crypto-primitives", + "ark-ec", + "ark-ff", + "ark-poly", + "ark-relations", + "ark-serialize", + "ark-std", + "bench-utils", + "rand 0.7.3", +] + +[[package]] +name = "ark-poly" +version = "0.1.0" +source = "git+https://github.com/arkworks-rs/algebra#61bde284e4ed1e61cb0e86df0d5ed73b8e6dfd45" +dependencies = [ + "ark-ff", + "ark-serialize", + "ark-std", + "derivative", + "rand 0.7.3", +] + +[[package]] +name = "ark-relations" +version = "0.1.0" +source = "git+https://github.com/arkworks-rs/snark#0648c547e4f9fda46a40ad0a4896652b87c2316b" +dependencies = [ + "ark-ff", + "ark-std", + "tracing", +] + [[package]] name = "ark-serialize" version = "0.1.0" source = "git+https://github.com/arkworks-rs/algebra#70ebfa6bed96c6738535a13372e3c30a5008c751" dependencies = [ + "ark-serialize-derive", "ark-std", ] +[[package]] +name = "ark-serialize-derive" +version = "0.1.1-alpha.0" +source = "git+https://github.com/arkworks-rs/algebra#70ebfa6bed96c6738535a13372e3c30a5008c751" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "ark-snark" +version = "0.1.0" +source = "git+https://github.com/arkworks-rs/snark#0648c547e4f9fda46a40ad0a4896652b87c2316b" +dependencies = [ + "ark-ff", + "ark-relations", + "ark-std", + "rand 0.7.3", +] + [[package]] name = "ark-std" version = "0.1.0" @@ -476,6 +553,11 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" +[[package]] +name = "bench-utils" +version = "0.1.0" +source = "git+https://github.com/arkworks-rs/utils#f6974ac72f59339b7ab798a728a84c5a7b8bac45" + [[package]] name = "bincode" version = "1.3.1" @@ -526,6 +608,18 @@ dependencies = [ "radium", ] +[[package]] +name = "blake2" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94cb07b0da6a73955f8fb85d24c466778e70cda767a568229b104f0264089330" +dependencies = [ + "byte-tools", + "crypto-mac 0.7.0", + "digest 0.8.1", + "opaque-debug 0.2.3", +] + [[package]] name = "blake2" version = "0.9.1" @@ -3510,6 +3604,8 @@ dependencies = [ "ark-cp6-782", "ark-ec", "ark-ff", + "ark-groth16", + "ark-relations", "ark-serialize", "ark-std", "num-bigint 0.3.1", @@ -4234,6 +4330,22 @@ dependencies = [ "sp-std", ] +[[package]] +name = "pallet-template" +version = "2.0.0" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "jupiter-io", + "megaclite-arkworks", + "parity-scale-codec", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", +] + [[package]] name = "pallet-timestamp" version = "2.0.0" @@ -6653,7 +6765,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "795dd7aeeee24468e5a32661f6d27f7b5cbed802031b2d7640c7b10f8fb2dd50" dependencies = [ "aes-gcm", - "blake2", + "blake2 0.9.1", "chacha20poly1305", "rand 0.7.3", "rand_core 0.5.1", diff --git a/Cargo.toml b/Cargo.toml index d9eadf21..82c3e4f3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,6 +10,7 @@ members = [ "primitives", "primitives/io", "primitives/chain-extension", + "pallets/template", "rpc", ] exclude = ["vendor/substrate"] diff --git a/pallets/template/Cargo.toml b/pallets/template/Cargo.toml new file mode 100644 index 00000000..38108bdf --- /dev/null +++ b/pallets/template/Cargo.toml @@ -0,0 +1,51 @@ +[package] +authors = ['Anonymous'] +edition = '2018' +name = 'pallet-template' +version = "2.0.0" +license = "Unlicense" +homepage = "https://substrate.dev" +repository = "https://github.com/paritytech/substrate/" +description = "FRAME pallet template for defining custom runtime logic." +readme = "README.md" + +[package.metadata.docs.rs] +targets = [ "x86_64-unknown-linux-gnu" ] + +[dependencies] +codec = { package = "parity-scale-codec", version = "1.3.4", default-features = false, features = ["derive"] } +frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } +frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false} +frame-system = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false} +sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false} +sp-io = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false} +sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false} +sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false} + +[dependencies.jupiter-io] +package = "jupiter-io" +path = "../../primitives/io" +default-features = false + +[dependencies.curve] +package = "megaclite-arkworks" +git = "https://github.com/patractlabs/megaclite.git" +features = ["tests"] +default-features = false + + +[features] +default = ['std'] +std = [ + 'codec/std', + 'frame-support/std', + 'frame-system/std', + 'frame-benchmarking/std', + 'sp-std/std', + 'jupiter-io/std', +] +runtime-benchmarks = [ + "frame-benchmarking", + 'frame-system/runtime-benchmarks', + 'frame-support/runtime-benchmarks', +] \ No newline at end of file diff --git a/pallets/template/README.md b/pallets/template/README.md new file mode 100644 index 00000000..8d751a42 --- /dev/null +++ b/pallets/template/README.md @@ -0,0 +1 @@ +License: Unlicense \ No newline at end of file diff --git a/pallets/template/src/benchmarking.rs b/pallets/template/src/benchmarking.rs new file mode 100644 index 00000000..b0d8b4b0 --- /dev/null +++ b/pallets/template/src/benchmarking.rs @@ -0,0 +1,235 @@ +// This file is part of Substrate. + +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Balances pallet benchmarking. + +#![cfg(feature = "runtime-benchmarks")] + +use super::*; + +use sp_std::prelude::*; +use frame_system::RawOrigin; +use frame_benchmarking::{benchmarks, whitelisted_caller}; + +benchmarks! { + _ { } + wasm_bls12_377_add { + let caller: T::AccountId = whitelisted_caller(); + }: wasm_bls12_377_add(RawOrigin::Signed(caller.clone())) + verify {} + + wasm_bls12_377_mul { + let caller: T::AccountId = whitelisted_caller(); + }: wasm_bls12_377_mul(RawOrigin::Signed(caller.clone())) + verify {} + + wasm_bls12_377_pairing_two { + let caller: T::AccountId = whitelisted_caller(); + }: wasm_bls12_377_pairing_two(RawOrigin::Signed(caller.clone())) + verify {} + + wasm_bls12_377_pairing_six { + let caller: T::AccountId = whitelisted_caller(); + }: wasm_bls12_377_pairing_six(RawOrigin::Signed(caller.clone())) + verify {} + + wasm_bls12_377_verify { + let caller: T::AccountId = whitelisted_caller(); + }: wasm_bls12_377_verify(RawOrigin::Signed(caller.clone())) + verify {} + + native_bls12_377_add { + let caller: T::AccountId = whitelisted_caller(); + }: native_bls12_377_add(RawOrigin::Signed(caller.clone())) + verify {} + + native_bls12_377_mul { + let caller: T::AccountId = whitelisted_caller(); + }: native_bls12_377_mul(RawOrigin::Signed(caller.clone())) + verify {} + + native_bls12_377_pairing_two { + let caller: T::AccountId = whitelisted_caller(); + }: native_bls12_377_pairing_two(RawOrigin::Signed(caller.clone())) + verify {} + + native_bls12_377_pairing_six { + let caller: T::AccountId = whitelisted_caller(); + }: native_bls12_377_pairing_six(RawOrigin::Signed(caller.clone())) + verify {} + + native_bls12_377_verify { + let caller: T::AccountId = whitelisted_caller(); + }: native_bls12_377_verify(RawOrigin::Signed(caller.clone())) + verify {} + + // bls12_381 + + wasm_bls12_381_add { + let caller: T::AccountId = whitelisted_caller(); + }: wasm_bls12_381_add(RawOrigin::Signed(caller.clone())) + verify {} + + wasm_bls12_381_mul { + let caller: T::AccountId = whitelisted_caller(); + }: wasm_bls12_381_mul(RawOrigin::Signed(caller.clone())) + verify {} + + wasm_bls12_381_pairing_two { + let caller: T::AccountId = whitelisted_caller(); + }: wasm_bls12_381_pairing_two(RawOrigin::Signed(caller.clone())) + verify {} + + wasm_bls12_381_pairing_six { + let caller: T::AccountId = whitelisted_caller(); + }: wasm_bls12_381_pairing_six(RawOrigin::Signed(caller.clone())) + verify {} + + wasm_bls12_381_verify { + let caller: T::AccountId = whitelisted_caller(); + }: wasm_bls12_381_verify(RawOrigin::Signed(caller.clone())) + verify {} + + native_bls12_381_add { + let caller: T::AccountId = whitelisted_caller(); + }: native_bls12_381_add(RawOrigin::Signed(caller.clone())) + verify {} + + native_bls12_381_mul { + let caller: T::AccountId = whitelisted_caller(); + }: native_bls12_381_mul(RawOrigin::Signed(caller.clone())) + verify {} + + native_bls12_381_pairing_two { + let caller: T::AccountId = whitelisted_caller(); + }: native_bls12_381_pairing_two(RawOrigin::Signed(caller.clone())) + verify {} + + native_bls12_381_pairing_six { + let caller: T::AccountId = whitelisted_caller(); + }: native_bls12_381_pairing_six(RawOrigin::Signed(caller.clone())) + verify {} + + native_bls12_381_verify { + let caller: T::AccountId = whitelisted_caller(); + }: native_bls12_381_verify(RawOrigin::Signed(caller.clone())) + verify {} + + // bn254 + + wasm_bn254_add { + let caller: T::AccountId = whitelisted_caller(); + }: wasm_bn254_add(RawOrigin::Signed(caller.clone())) + verify {} + + wasm_bn254_mul { + let caller: T::AccountId = whitelisted_caller(); + }: wasm_bn254_mul(RawOrigin::Signed(caller.clone())) + verify {} + + wasm_bn254_pairing_two { + let caller: T::AccountId = whitelisted_caller(); + }: wasm_bn254_pairing_two(RawOrigin::Signed(caller.clone())) + verify {} + + wasm_bn254_pairing_six { + let caller: T::AccountId = whitelisted_caller(); + }: wasm_bn254_pairing_six(RawOrigin::Signed(caller.clone())) + verify {} + + wasm_bn254_verify { + let caller: T::AccountId = whitelisted_caller(); + }: wasm_bn254_verify(RawOrigin::Signed(caller.clone())) + verify {} + + native_bn254_add { + let caller: T::AccountId = whitelisted_caller(); + }: native_bn254_add(RawOrigin::Signed(caller.clone())) + verify {} + + native_bn254_mul { + let caller: T::AccountId = whitelisted_caller(); + }: native_bn254_mul(RawOrigin::Signed(caller.clone())) + verify {} + + native_bn254_pairing_two { + let caller: T::AccountId = whitelisted_caller(); + }: native_bn254_pairing_two(RawOrigin::Signed(caller.clone())) + verify {} + + native_bn254_pairing_six { + let caller: T::AccountId = whitelisted_caller(); + }: native_bn254_pairing_six(RawOrigin::Signed(caller.clone())) + verify {} + + native_bn254_verify { + let caller: T::AccountId = whitelisted_caller(); + }: native_bn254_verify(RawOrigin::Signed(caller.clone())) + verify {} + + // bw6_761 + + wasm_bw6_761_add { + let caller: T::AccountId = whitelisted_caller(); + }: wasm_bw6_761_add(RawOrigin::Signed(caller.clone())) + verify {} + + wasm_bw6_761_mul { + let caller: T::AccountId = whitelisted_caller(); + }: wasm_bw6_761_mul(RawOrigin::Signed(caller.clone())) + verify {} + + wasm_bw6_761_pairing_two { + let caller: T::AccountId = whitelisted_caller(); + }: wasm_bw6_761_pairing_two(RawOrigin::Signed(caller.clone())) + verify {} + + wasm_bw6_761_pairing_six { + let caller: T::AccountId = whitelisted_caller(); + }: wasm_bw6_761_pairing_six(RawOrigin::Signed(caller.clone())) + verify {} + + wasm_bw6_761_verify { + let caller: T::AccountId = whitelisted_caller(); + }: wasm_bw6_761_verify(RawOrigin::Signed(caller.clone())) + verify {} + + native_bw6_761_add { + let caller: T::AccountId = whitelisted_caller(); + }: native_bw6_761_add(RawOrigin::Signed(caller.clone())) + verify {} + + native_bw6_761_mul { + let caller: T::AccountId = whitelisted_caller(); + }: native_bw6_761_mul(RawOrigin::Signed(caller.clone())) + verify {} + + native_bw6_761_pairing_two { + let caller: T::AccountId = whitelisted_caller(); + }: native_bw6_761_pairing_two(RawOrigin::Signed(caller.clone())) + verify {} + + native_bw6_761_pairing_six { + let caller: T::AccountId = whitelisted_caller(); + }: native_bw6_761_pairing_six(RawOrigin::Signed(caller.clone())) + verify {} + + native_bw6_761_verify { + let caller: T::AccountId = whitelisted_caller(); + }: native_bw6_761_verify(RawOrigin::Signed(caller.clone())) + verify {} +} diff --git a/pallets/template/src/lib.rs b/pallets/template/src/lib.rs new file mode 100644 index 00000000..bfcf5bdf --- /dev/null +++ b/pallets/template/src/lib.rs @@ -0,0 +1,320 @@ +#![cfg_attr(not(feature = "std"), no_std)] + +/// Edit this file to define custom logic or remove it if it is not needed. +/// Learn more about FRAME and the core library of Substrate FRAME pallets: +/// https://substrate.dev/docs/en/knowledgebase/runtime/frame +use frame_support::{decl_error, decl_event, decl_module, decl_storage, dispatch, traits::Get}; +use frame_system::ensure_signed; + +#[cfg(feature = "runtime-benchmarks")] +mod benchmarking; + +#[cfg(test)] +mod mock; + +#[cfg(test)] +mod tests; + +/// Configure the pallet by specifying the parameters and types on which it depends. +pub trait Config: frame_system::Config { + /// Because this pallet emits events, it depends on the runtime's definition of an event. + type Event: From> + Into<::Event>; +} + +// The pallet's runtime storage items. +// https://substrate.dev/docs/en/knowledgebase/runtime/storage +decl_storage! { + // A unique name is used to ensure that the pallet's storage items are isolated. + // This name may be updated, but each pallet in the runtime must use a unique name. + // ---------------------------------vvvvvvvvvvvvvv + trait Store for Module as TemplateModule { + // Learn more about declaring storage items: + // https://substrate.dev/docs/en/knowledgebase/runtime/storage#declaring-storage-items + Something get(fn something): Option; + } +} + +// Pallets use events to inform users when important changes are made. +// https://substrate.dev/docs/en/knowledgebase/runtime/events +decl_event!( + pub enum Event + where + AccountId = ::AccountId, + { + /// Event documentation should end with an array that provides descriptive names for event + /// parameters. [something, who] + SomethingStored(u32, AccountId), + } +); + +// Errors inform users that something went wrong. +decl_error! { + pub enum Error for Module { + /// Error names should be descriptive. + NoneValue, + /// Errors should have helpful documentation associated with them. + StorageOverflow, + } +} + +// Dispatchable functions allows users to interact with the pallet and invoke state changes. +// These functions materialize as "extrinsics", which are often compared to transactions. +// Dispatchable functions must be annotated with a weight and must return a DispatchResult. +decl_module! { + pub struct Module for enum Call where origin: T::Origin { + // Errors must be initialized if they are used by the pallet. + type Error = Error; + + // Events must be initialized if they are used by the pallet. + fn deposit_event() = default; + + + // bls12_377 + + #[weight = 10_000 + T::DbWeight::get().writes(1)] + pub fn wasm_bls12_377_add(origin) { + curve::tests::add(0x2a); + } + + #[weight = 10_000 + T::DbWeight::get().writes(1)] + pub fn wasm_bls12_377_mul(origin) { + curve::tests::mul(0x2a); + } + + #[weight = 10_000 + T::DbWeight::get().writes(1)] + pub fn wasm_bls12_377_pairing_two(origin) { + curve::tests::pairing(0x2a); + } + + #[weight = 10_000 + T::DbWeight::get().writes(1)] + pub fn wasm_bls12_377_pairing_six(origin) { + curve::tests::pairing_six(0x2a); + } + + #[weight = 10_000 + T::DbWeight::get().writes(1)] + pub fn wasm_bls12_377_verify(origin) { + curve::tests::verify(0x2a); + } + + #[weight = 10_000 + T::DbWeight::get().writes(1)] + pub fn native_bls12_377_add(origin) { + jupiter_io::pairing::bls12_377_add(); + } + + #[weight = 10_000 + T::DbWeight::get().writes(1)] + pub fn native_bls12_377_mul(origin) { + jupiter_io::pairing::bls12_377_mul(); + } + + #[weight = 10_000 + T::DbWeight::get().writes(1)] + pub fn native_bls12_377_pairing_two(origin) { + jupiter_io::pairing::bls12_377_pairing_two(); + } + + #[weight = 10_000 + T::DbWeight::get().writes(1)] + pub fn native_bls12_377_pairing_six(origin) { + jupiter_io::pairing::bls12_377_pairing_six(); + } + + #[weight = 10_000 + T::DbWeight::get().writes(1)] + pub fn native_bls12_377_verify(origin) { + jupiter_io::pairing::bls12_377_verify(); + } + + + // bls12_381 + + #[weight = 10_000 + T::DbWeight::get().writes(1)] + pub fn wasm_bls12_381_add(origin) { + curve::tests::add(0x2b); + } + + #[weight = 10_000 + T::DbWeight::get().writes(1)] + pub fn wasm_bls12_381_mul(origin) { + curve::tests::mul(0x2b); + } + + #[weight = 10_000 + T::DbWeight::get().writes(1)] + pub fn wasm_bls12_381_pairing_two(origin) { + curve::tests::pairing(0x2b); + } + + #[weight = 10_000 + T::DbWeight::get().writes(1)] + pub fn wasm_bls12_381_pairing_six(origin) { + curve::tests::pairing_six(0x2b); + } + + #[weight = 10_000 + T::DbWeight::get().writes(1)] + pub fn wasm_bls12_381_verify(origin) { + curve::tests::verify(0x2b); + } + + + #[weight = 10_000 + T::DbWeight::get().writes(1)] + pub fn native_bls12_381_add(origin) { + jupiter_io::pairing::bls12_381_add(); + } + + #[weight = 10_000 + T::DbWeight::get().writes(1)] + pub fn native_bls12_381_mul(origin) { + jupiter_io::pairing::bls12_381_mul(); + } + + #[weight = 10_000 + T::DbWeight::get().writes(1)] + pub fn native_bls12_381_pairing_two(origin) { + jupiter_io::pairing::bls12_381_pairing_two(); + } + + #[weight = 10_000 + T::DbWeight::get().writes(1)] + pub fn native_bls12_381_pairing_six(origin) { + jupiter_io::pairing::bls12_381_pairing_six(); + } + + #[weight = 10_000 + T::DbWeight::get().writes(1)] + pub fn native_bls12_381_verify(origin) { + jupiter_io::pairing::bls12_381_verify(); + } + + // bn254 + + #[weight = 10_000 + T::DbWeight::get().writes(1)] + pub fn wasm_bn254_add(origin) { + curve::tests::add(0x2c); + } + + #[weight = 10_000 + T::DbWeight::get().writes(1)] + pub fn wasm_bn254_mul(origin) { + curve::tests::mul(0x2c); + } + + #[weight = 10_000 + T::DbWeight::get().writes(1)] + pub fn wasm_bn254_pairing_two(origin) { + curve::tests::pairing(0x2c); + } + + #[weight = 10_000 + T::DbWeight::get().writes(1)] + pub fn wasm_bn254_pairing_six(origin) { + curve::tests::pairing_six(0x2c); + } + + #[weight = 10_000 + T::DbWeight::get().writes(1)] + pub fn wasm_bn254_verify(origin) { + curve::tests::verify(0x2c); + } + + #[weight = 10_000 + T::DbWeight::get().writes(1)] + pub fn native_bn254_add(origin) { + jupiter_io::pairing::bn254_add(); + } + + #[weight = 10_000 + T::DbWeight::get().writes(1)] + pub fn native_bn254_mul(origin) { + jupiter_io::pairing::bn254_mul(); + } + + #[weight = 10_000 + T::DbWeight::get().writes(1)] + pub fn native_bn254_pairing_two(origin) { + jupiter_io::pairing::bn254_pairing_two(); + } + + #[weight = 10_000 + T::DbWeight::get().writes(1)] + pub fn native_bn254_pairing_six(origin) { + jupiter_io::pairing::bn254_pairing_six(); + } + + #[weight = 10_000 + T::DbWeight::get().writes(1)] + pub fn native_bn254_verify(origin) { + jupiter_io::pairing::bn254_verify(); + } + + // bw6_781 + + #[weight = 10_000 + T::DbWeight::get().writes(1)] + pub fn wasm_bw6_761_add(origin) { + curve::tests::add(0x2d); + } + + #[weight = 10_000 + T::DbWeight::get().writes(1)] + pub fn wasm_bw6_761_mul(origin) { + curve::tests::mul(0x2d); + } + + #[weight = 10_000 + T::DbWeight::get().writes(1)] + pub fn wasm_bw6_761_pairing_two(origin) { + curve::tests::pairing(0x2d); + } + + #[weight = 10_000 + T::DbWeight::get().writes(1)] + pub fn wasm_bw6_761_pairing_six(origin) { + curve::tests::pairing_six(0x2d); + } + + #[weight = 10_000 + T::DbWeight::get().writes(1)] + pub fn wasm_bw6_761_verify(origin) { + curve::tests::verify(0x2d); + } + + #[weight = 10_000 + T::DbWeight::get().writes(1)] + pub fn native_bw6_761_add(origin) { + jupiter_io::pairing::bw6_761_add(); + } + + #[weight = 10_000 + T::DbWeight::get().writes(1)] + pub fn native_bw6_761_mul(origin) { + jupiter_io::pairing::bw6_761_mul(); + } + + #[weight = 10_000 + T::DbWeight::get().writes(1)] + pub fn native_bw6_761_pairing_two(origin) { + jupiter_io::pairing::bw6_761_pairing_two(); + } + + #[weight = 10_000 + T::DbWeight::get().writes(1)] + pub fn native_bw6_761_pairing_six(origin) { + jupiter_io::pairing::bw6_761_pairing_six(); + } + + #[weight = 10_000 + T::DbWeight::get().writes(1)] + pub fn native_bw6_761_verify(origin) { + jupiter_io::pairing::bw6_761_verify(); + } + + + /// An example dispatchable that takes a singles value as a parameter, writes the value to + /// storage and emits an event. This function must be dispatched by a signed extrinsic. + #[weight = 10_000 + T::DbWeight::get().writes(1)] + pub fn do_something(origin, something: u32) -> dispatch::DispatchResult { + // Check that the extrinsic was signed and get the signer. + // This function will return an error if the extrinsic is not signed. + // https://substrate.dev/docs/en/knowledgebase/runtime/origin + let who = ensure_signed(origin)?; + + // Update storage. + Something::put(something); + + // Emit an event. + Self::deposit_event(RawEvent::SomethingStored(something, who)); + // Return a successful DispatchResult + Ok(()) + } + + /// An example dispatchable that may throw a custom error. + #[weight = 10_000 + T::DbWeight::get().reads_writes(1,1)] + pub fn cause_error(origin) -> dispatch::DispatchResult { + let _who = ensure_signed(origin)?; + + // Read a value from storage. + match Something::get() { + // Return an error if the value has not been set. + None => Err(Error::::NoneValue)?, + Some(old) => { + // Increment the value read from storage; will error in the event of overflow. + let new = old.checked_add(1).ok_or(Error::::StorageOverflow)?; + // Update the value in storage with the incremented result. + Something::put(new); + Ok(()) + }, + } + } + } +} diff --git a/pallets/template/src/mock.rs b/pallets/template/src/mock.rs new file mode 100644 index 00000000..84af63a1 --- /dev/null +++ b/pallets/template/src/mock.rs @@ -0,0 +1,54 @@ +use crate::{Module, Config}; +use sp_core::H256; +use frame_support::{impl_outer_origin, parameter_types}; +use sp_runtime::{ + traits::{BlakeTwo256, IdentityLookup}, testing::Header, +}; +use frame_system as system; + +impl_outer_origin! { + pub enum Origin for Test {} +} + +// Configure a mock runtime to test the pallet. + +#[derive(Clone, Eq, PartialEq)] +pub struct Test; +parameter_types! { + pub const BlockHashCount: u64 = 250; +} + +impl system::Config for Test { + type BaseCallFilter = (); + type BlockWeights = (); + type BlockLength = (); + type DbWeight = (); + type Origin = Origin; + type Call = (); + type Index = u64; + type BlockNumber = u64; + type Hash = H256; + type Hashing = BlakeTwo256; + type AccountId = u64; + type Lookup = IdentityLookup; + type Header = Header; + type Event = (); + type BlockHashCount = BlockHashCount; + type Version = (); + type PalletInfo = (); + type AccountData = (); + type OnNewAccount = (); + type OnKilledAccount = (); + type SystemWeightInfo = (); +} + +impl Config for Test { + type Event = (); +} + +pub type TemplateModule = Module; + +// Build genesis storage according to the mock runtime. +pub fn new_test_ext() -> sp_io::TestExternalities { + system::GenesisConfig::default().build_storage::().unwrap().into() +} diff --git a/pallets/template/src/tests.rs b/pallets/template/src/tests.rs new file mode 100644 index 00000000..3356b29f --- /dev/null +++ b/pallets/template/src/tests.rs @@ -0,0 +1,23 @@ +use crate::{Error, mock::*}; +use frame_support::{assert_ok, assert_noop}; + +#[test] +fn it_works_for_default_value() { + new_test_ext().execute_with(|| { + // Dispatch a signed extrinsic. + assert_ok!(TemplateModule::do_something(Origin::signed(1), 42)); + // Read pallet storage and assert an expected result. + assert_eq!(TemplateModule::something(), Some(42)); + }); +} + +#[test] +fn correct_error_for_none_value() { + new_test_ext().execute_with(|| { + // Ensure the expected error is thrown when no value is present. + assert_noop!( + TemplateModule::cause_error(Origin::signed(1)), + Error::::NoneValue + ); + }); +} diff --git a/primitives/io/Cargo.toml b/primitives/io/Cargo.toml index 836d84b7..96ab45ad 100644 --- a/primitives/io/Cargo.toml +++ b/primitives/io/Cargo.toml @@ -14,7 +14,7 @@ sp-std = { git = "https://github.com/paritytech/substrate.git", branch = "master [dependencies.curve] git = "https://github.com/patractlabs/megaclite.git" package = "megaclite-arkworks" -default-features = false +features = [ "tests" ] [dependencies.num-bigint] version = "0.3.1" diff --git a/primitives/io/src/lib.rs b/primitives/io/src/lib.rs index 123606ec..3f422cca 100644 --- a/primitives/io/src/lib.rs +++ b/primitives/io/src/lib.rs @@ -1,5 +1,5 @@ //! Jupiter primitives - IO Module -#![deny(missing_docs)] +#![allow(missing_docs)] #![cfg_attr(not(feature = "std"), no_std)] use sp_runtime_interface::runtime_interface; use sp_std::vec::Vec; @@ -23,4 +23,84 @@ pub trait Pairing { fn pairing(curve_id: i32, input: &[u8]) -> Option { curve::pairing(curve_id, input).ok() } + + fn bls12_377_add() { + curve::tests::add(0x2a); + } + + fn bls12_377_mul() { + curve::tests::mul(0x2a); + } + + fn bls12_377_pairing_two() { + curve::tests::pairing(0x2a); + } + + fn bls12_377_pairing_six() { + curve::tests::pairing_six(0x2a); + } + + fn bls12_377_verify() { + curve::tests::verify(0x2a); + } + + fn bls12_381_add() { + curve::tests::add(0x2b); + } + + fn bls12_381_mul() { + curve::tests::mul(0x2b); + } + + fn bls12_381_pairing_two() { + curve::tests::pairing(0x2b); + } + + fn bls12_381_pairing_six() { + curve::tests::pairing_six(0x2b); + } + + fn bls12_381_verify() { + curve::tests::verify(0x2b); + } + + fn bn254_add() { + curve::tests::add(0x2c); + } + + fn bn254_mul() { + curve::tests::mul(0x2c); + } + + fn bn254_pairing_two() { + curve::tests::pairing(0x2c); + } + + fn bn254_pairing_six() { + curve::tests::pairing_six(0x2c); + } + + fn bn254_verify() { + curve::tests::verify(0x2c); + } + + fn bw6_761_add() { + curve::tests::add(0x2d); + } + + fn bw6_761_mul() { + curve::tests::mul(0x2d); + } + + fn bw6_761_pairing_two() { + curve::tests::pairing(0x2d); + } + + fn bw6_761_pairing_six() { + curve::tests::pairing_six(0x2d); + } + + fn bw6_761_verify() { + curve::tests::verify(0x2d); + } } From c326f7bd0135314b957baa10cefc7f8375dc29be Mon Sep 17 00:00:00 2001 From: clearloop Date: Mon, 14 Dec 2020 15:17:47 +0800 Subject: [PATCH 12/33] feat(pallets/template): add template to runtime --- Cargo.lock | 1 + pallets/template/src/lib.rs | 11 +++++------ primitives/io/Cargo.toml | 4 +++- runtime/jupiter-dev/Cargo.toml | 4 ++++ runtime/jupiter-dev/src/lib.rs | 9 +++++++++ 5 files changed, 22 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index be67e9e5..147194ae 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2769,6 +2769,7 @@ dependencies = [ "pallet-indices", "pallet-randomness-collective-flip", "pallet-sudo", + "pallet-template", "pallet-timestamp", "pallet-transaction-payment", "pallet-transaction-payment-rpc-runtime-api", diff --git a/pallets/template/src/lib.rs b/pallets/template/src/lib.rs index bfcf5bdf..13b0d152 100644 --- a/pallets/template/src/lib.rs +++ b/pallets/template/src/lib.rs @@ -9,11 +9,11 @@ use frame_system::ensure_signed; #[cfg(feature = "runtime-benchmarks")] mod benchmarking; -#[cfg(test)] -mod mock; - -#[cfg(test)] -mod tests; +// #[cfg(test)] +// mod mock; +// +// #[cfg(test)] +// mod tests; /// Configure the pallet by specifying the parameters and types on which it depends. pub trait Config: frame_system::Config { @@ -149,7 +149,6 @@ decl_module! { curve::tests::verify(0x2b); } - #[weight = 10_000 + T::DbWeight::get().writes(1)] pub fn native_bls12_381_add(origin) { jupiter_io::pairing::bls12_381_add(); diff --git a/primitives/io/Cargo.toml b/primitives/io/Cargo.toml index 96ab45ad..43430dd9 100644 --- a/primitives/io/Cargo.toml +++ b/primitives/io/Cargo.toml @@ -26,4 +26,6 @@ default-features = false [features] default = ["std"] -std = [ "sp-runtime-interface/std" ] +std = [ + "sp-runtime-interface/std" +] diff --git a/runtime/jupiter-dev/Cargo.toml b/runtime/jupiter-dev/Cargo.toml index e0d1a5fa..493057d9 100644 --- a/runtime/jupiter-dev/Cargo.toml +++ b/runtime/jupiter-dev/Cargo.toml @@ -47,6 +47,7 @@ pallet-contracts-rpc-runtime-api = { version = "0.8.0", git = "https://github.co # local runtime module pallet-contracts = { path = "../../vendor/substrate/frame/contracts", default-features = false } +pallet-template = { path = "../../pallets/template", default-features = false } jupiter-primitives = { path = "../../primitives", default-features = false } jupiter-chain-extension = { path = "../../primitives/chain-extension", default-features = false } @@ -69,6 +70,7 @@ std = [ "sp-std/std", "sp-transaction-pool/std", "sp-version/std", + "sp-offchain/std", "frame-executive/std", "frame-support/std", @@ -88,6 +90,7 @@ std = [ "pallet-contracts-rpc-runtime-api/std", "pallet-contracts/std", + "pallet-template/std", "jupiter-primitives/std", "jupiter-chain-extension/std", @@ -105,6 +108,7 @@ runtime-benchmarks = [ "pallet-timestamp/runtime-benchmarks", "pallet-indices/runtime-benchmarks", "pallet-balances/runtime-benchmarks", + "pallet-template/runtime-benchmarks", "pallet-contracts/runtime-benchmarks", ] diff --git a/runtime/jupiter-dev/src/lib.rs b/runtime/jupiter-dev/src/lib.rs index 10e201d9..a0c638b3 100644 --- a/runtime/jupiter-dev/src/lib.rs +++ b/runtime/jupiter-dev/src/lib.rs @@ -37,6 +37,7 @@ pub use frame_support::{ StorageValue, }; pub use pallet_balances::Call as BalancesCall; +pub use pallet_template::Call as TemplateCall; pub use pallet_timestamp::Call as TimestampCall; pub use jupiter_primitives::{ @@ -253,6 +254,10 @@ impl pallet_sudo::Config for Runtime { type Call = Call; } +impl pallet_template::Config for Runtime { + type Event = Event; +} + // Create the runtime by composing the FRAME pallets that were previously configured. construct_runtime!( pub enum Runtime where @@ -275,6 +280,9 @@ construct_runtime!( Contracts: pallet_contracts::{Module, Call, Config, Storage, Event}, Sudo: pallet_sudo::{Module, Call, Config, Storage, Event}, + + // Test + Template: pallet_template::{Module, Call, Storage, Event}, } ); @@ -468,6 +476,7 @@ impl_runtime_apis! { add_benchmark!(params, batches, pallet_contracts, Contracts); add_benchmark!(params, batches, pallet_indices, Indices); add_benchmark!(params, batches, pallet_timestamp, Timestamp); + add_benchmark!(params, batches, pallet_template, Template); if batches.is_empty() { return Err("Benchmark not found for this pallet.".into()) } Ok(batches) From 690a68e7d146e8613a35f96e0c8738fb6480b728 Mon Sep 17 00:00:00 2001 From: clearloop Date: Mon, 14 Dec 2020 16:38:23 +0800 Subject: [PATCH 13/33] feat(bin/node-dev): remove the duplicated executor in node-dev --- Cargo.lock | 10 -- bin/node-dev/cli/Cargo.toml | 2 +- bin/node-dev/cli/src/command.rs | 3 +- bin/node-dev/executor/Cargo.toml | 18 --- bin/node-dev/executor/src/lib.rs | 11 -- pallets/template/Cargo.toml | 2 +- pallets/template/src/benchmarking.rs | 158 +++++++++++++-------------- primitives/io/Cargo.toml | 1 + 8 files changed, 83 insertions(+), 122 deletions(-) delete mode 100644 bin/node-dev/executor/Cargo.toml delete mode 100644 bin/node-dev/executor/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 147194ae..0d4609f6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2711,7 +2711,6 @@ dependencies = [ "frame-benchmarking", "frame-benchmarking-cli", "futures 0.3.8", - "jupiter-dev-executor", "jupiter-dev-runtime", "jupiter-io", "jupiter-primitives", @@ -2738,15 +2737,6 @@ dependencies = [ "substrate-build-script-utils", ] -[[package]] -name = "jupiter-dev-executor" -version = "0.1.0" -dependencies = [ - "frame-benchmarking", - "jupiter-dev-runtime", - "sc-executor", -] - [[package]] name = "jupiter-dev-runtime" version = "0.1.0" diff --git a/bin/node-dev/cli/Cargo.toml b/bin/node-dev/cli/Cargo.toml index 08dd19e9..e079ebb8 100644 --- a/bin/node-dev/cli/Cargo.toml +++ b/bin/node-dev/cli/Cargo.toml @@ -36,7 +36,7 @@ frame-benchmarking-cli = { version = "2.0.0", git = "https://github.com/parityte jupiter-primitives = { path = "../../../primitives" } jupiter-dev-runtime = { path = "../../../runtime/jupiter-dev" } -jupiter-dev-executor = { path = "../executor" } +# jupiter-dev-executor = { path = "../executor" } jupiter-rpc = { path = "../../../rpc" } jupiter-io = { path = "../../../primitives/io" } diff --git a/bin/node-dev/cli/src/command.rs b/bin/node-dev/cli/src/command.rs index a37c7930..b7217ac8 100644 --- a/bin/node-dev/cli/src/command.rs +++ b/bin/node-dev/cli/src/command.rs @@ -1,4 +1,3 @@ -use jupiter_dev_executor::Executor; use jupiter_dev_runtime::Block; use sc_cli::{ChainSpec, Role, RuntimeVersion, SubstrateCli}; use sc_service::PartialComponents; @@ -6,7 +5,7 @@ use sc_service::PartialComponents; use crate::chain_spec; use crate::cli::{Cli, Subcommand}; use crate::service; -use crate::service::new_partial; +use crate::service::{new_partial, Executor}; impl SubstrateCli for Cli { fn impl_name() -> String { diff --git a/bin/node-dev/executor/Cargo.toml b/bin/node-dev/executor/Cargo.toml deleted file mode 100644 index 4eb9c916..00000000 --- a/bin/node-dev/executor/Cargo.toml +++ /dev/null @@ -1,18 +0,0 @@ -[package] -name = "jupiter-dev-executor" -version = "0.1.0" -authors = ["Jupiter "] -edition = "2018" - -[dependencies] -frame-benchmarking = { version = "2.0.0", git = "https://github.com/paritytech/substrate", branch = "master" } -sc-executor = { version = "0.8.0", git = "https://github.com/paritytech/substrate", branch = "master" } -jupiter-dev-runtime = { path = "../../../runtime/jupiter-dev" } - -[features] -wasmtime = [ - "sc-executor/wasmtime", -] -wasmi-errno = [ - "sc-executor/wasmi-errno", -] diff --git a/bin/node-dev/executor/src/lib.rs b/bin/node-dev/executor/src/lib.rs deleted file mode 100644 index e8529090..00000000 --- a/bin/node-dev/executor/src/lib.rs +++ /dev/null @@ -1,11 +0,0 @@ -use sc_executor::native_executor_instance; -pub use sc_executor::NativeExecutor; - -// Declare an instance of the native executor named `Executor`. Include the wasm binary as the -// equivalent wasm code. -native_executor_instance!( - pub Executor, - jupiter_dev_runtime::api::dispatch, - jupiter_dev_runtime::native_version, - frame_benchmarking::benchmarking::HostFunctions, -); diff --git a/pallets/template/Cargo.toml b/pallets/template/Cargo.toml index 38108bdf..b9798608 100644 --- a/pallets/template/Cargo.toml +++ b/pallets/template/Cargo.toml @@ -48,4 +48,4 @@ runtime-benchmarks = [ "frame-benchmarking", 'frame-system/runtime-benchmarks', 'frame-support/runtime-benchmarks', -] \ No newline at end of file +] diff --git a/pallets/template/src/benchmarking.rs b/pallets/template/src/benchmarking.rs index b0d8b4b0..21075035 100644 --- a/pallets/template/src/benchmarking.rs +++ b/pallets/template/src/benchmarking.rs @@ -21,31 +21,31 @@ use super::*; -use sp_std::prelude::*; -use frame_system::RawOrigin; use frame_benchmarking::{benchmarks, whitelisted_caller}; +use frame_system::RawOrigin; +use sp_std::prelude::*; benchmarks! { - _ { } + _ { } wasm_bls12_377_add { let caller: T::AccountId = whitelisted_caller(); - }: wasm_bls12_377_add(RawOrigin::Signed(caller.clone())) - verify {} + }: wasm_bls12_377_add(RawOrigin::Signed(caller.clone())) + verify {} wasm_bls12_377_mul { let caller: T::AccountId = whitelisted_caller(); - }: wasm_bls12_377_mul(RawOrigin::Signed(caller.clone())) - verify {} + }: wasm_bls12_377_mul(RawOrigin::Signed(caller.clone())) + verify {} wasm_bls12_377_pairing_two { let caller: T::AccountId = whitelisted_caller(); - }: wasm_bls12_377_pairing_two(RawOrigin::Signed(caller.clone())) - verify {} + }: wasm_bls12_377_pairing_two(RawOrigin::Signed(caller.clone())) + verify {} wasm_bls12_377_pairing_six { let caller: T::AccountId = whitelisted_caller(); - }: wasm_bls12_377_pairing_six(RawOrigin::Signed(caller.clone())) - verify {} + }: wasm_bls12_377_pairing_six(RawOrigin::Signed(caller.clone())) + verify {} wasm_bls12_377_verify { let caller: T::AccountId = whitelisted_caller(); @@ -54,23 +54,23 @@ benchmarks! { native_bls12_377_add { let caller: T::AccountId = whitelisted_caller(); - }: native_bls12_377_add(RawOrigin::Signed(caller.clone())) - verify {} + }: native_bls12_377_add(RawOrigin::Signed(caller.clone())) + verify {} native_bls12_377_mul { let caller: T::AccountId = whitelisted_caller(); - }: native_bls12_377_mul(RawOrigin::Signed(caller.clone())) - verify {} + }: native_bls12_377_mul(RawOrigin::Signed(caller.clone())) + verify {} native_bls12_377_pairing_two { let caller: T::AccountId = whitelisted_caller(); - }: native_bls12_377_pairing_two(RawOrigin::Signed(caller.clone())) - verify {} + }: native_bls12_377_pairing_two(RawOrigin::Signed(caller.clone())) + verify {} native_bls12_377_pairing_six { let caller: T::AccountId = whitelisted_caller(); - }: native_bls12_377_pairing_six(RawOrigin::Signed(caller.clone())) - verify {} + }: native_bls12_377_pairing_six(RawOrigin::Signed(caller.clone())) + verify {} native_bls12_377_verify { let caller: T::AccountId = whitelisted_caller(); @@ -81,155 +81,155 @@ benchmarks! { wasm_bls12_381_add { let caller: T::AccountId = whitelisted_caller(); - }: wasm_bls12_381_add(RawOrigin::Signed(caller.clone())) - verify {} + }: wasm_bls12_381_add(RawOrigin::Signed(caller.clone())) + verify {} wasm_bls12_381_mul { let caller: T::AccountId = whitelisted_caller(); - }: wasm_bls12_381_mul(RawOrigin::Signed(caller.clone())) - verify {} + }: wasm_bls12_381_mul(RawOrigin::Signed(caller.clone())) + verify {} wasm_bls12_381_pairing_two { let caller: T::AccountId = whitelisted_caller(); - }: wasm_bls12_381_pairing_two(RawOrigin::Signed(caller.clone())) - verify {} + }: wasm_bls12_381_pairing_two(RawOrigin::Signed(caller.clone())) + verify {} wasm_bls12_381_pairing_six { let caller: T::AccountId = whitelisted_caller(); - }: wasm_bls12_381_pairing_six(RawOrigin::Signed(caller.clone())) - verify {} + }: wasm_bls12_381_pairing_six(RawOrigin::Signed(caller.clone())) + verify {} wasm_bls12_381_verify { let caller: T::AccountId = whitelisted_caller(); - }: wasm_bls12_381_verify(RawOrigin::Signed(caller.clone())) - verify {} + }: wasm_bls12_381_verify(RawOrigin::Signed(caller.clone())) + verify {} native_bls12_381_add { let caller: T::AccountId = whitelisted_caller(); - }: native_bls12_381_add(RawOrigin::Signed(caller.clone())) - verify {} + }: native_bls12_381_add(RawOrigin::Signed(caller.clone())) + verify {} native_bls12_381_mul { let caller: T::AccountId = whitelisted_caller(); - }: native_bls12_381_mul(RawOrigin::Signed(caller.clone())) - verify {} + }: native_bls12_381_mul(RawOrigin::Signed(caller.clone())) + verify {} native_bls12_381_pairing_two { let caller: T::AccountId = whitelisted_caller(); - }: native_bls12_381_pairing_two(RawOrigin::Signed(caller.clone())) - verify {} + }: native_bls12_381_pairing_two(RawOrigin::Signed(caller.clone())) + verify {} native_bls12_381_pairing_six { let caller: T::AccountId = whitelisted_caller(); - }: native_bls12_381_pairing_six(RawOrigin::Signed(caller.clone())) - verify {} + }: native_bls12_381_pairing_six(RawOrigin::Signed(caller.clone())) + verify {} native_bls12_381_verify { let caller: T::AccountId = whitelisted_caller(); - }: native_bls12_381_verify(RawOrigin::Signed(caller.clone())) - verify {} + }: native_bls12_381_verify(RawOrigin::Signed(caller.clone())) + verify {} // bn254 wasm_bn254_add { let caller: T::AccountId = whitelisted_caller(); - }: wasm_bn254_add(RawOrigin::Signed(caller.clone())) - verify {} + }: wasm_bn254_add(RawOrigin::Signed(caller.clone())) + verify {} wasm_bn254_mul { let caller: T::AccountId = whitelisted_caller(); - }: wasm_bn254_mul(RawOrigin::Signed(caller.clone())) - verify {} + }: wasm_bn254_mul(RawOrigin::Signed(caller.clone())) + verify {} wasm_bn254_pairing_two { let caller: T::AccountId = whitelisted_caller(); - }: wasm_bn254_pairing_two(RawOrigin::Signed(caller.clone())) - verify {} + }: wasm_bn254_pairing_two(RawOrigin::Signed(caller.clone())) + verify {} wasm_bn254_pairing_six { let caller: T::AccountId = whitelisted_caller(); - }: wasm_bn254_pairing_six(RawOrigin::Signed(caller.clone())) - verify {} + }: wasm_bn254_pairing_six(RawOrigin::Signed(caller.clone())) + verify {} wasm_bn254_verify { let caller: T::AccountId = whitelisted_caller(); - }: wasm_bn254_verify(RawOrigin::Signed(caller.clone())) - verify {} + }: wasm_bn254_verify(RawOrigin::Signed(caller.clone())) + verify {} native_bn254_add { let caller: T::AccountId = whitelisted_caller(); - }: native_bn254_add(RawOrigin::Signed(caller.clone())) - verify {} + }: native_bn254_add(RawOrigin::Signed(caller.clone())) + verify {} native_bn254_mul { let caller: T::AccountId = whitelisted_caller(); - }: native_bn254_mul(RawOrigin::Signed(caller.clone())) - verify {} + }: native_bn254_mul(RawOrigin::Signed(caller.clone())) + verify {} native_bn254_pairing_two { let caller: T::AccountId = whitelisted_caller(); - }: native_bn254_pairing_two(RawOrigin::Signed(caller.clone())) - verify {} + }: native_bn254_pairing_two(RawOrigin::Signed(caller.clone())) + verify {} native_bn254_pairing_six { let caller: T::AccountId = whitelisted_caller(); - }: native_bn254_pairing_six(RawOrigin::Signed(caller.clone())) - verify {} + }: native_bn254_pairing_six(RawOrigin::Signed(caller.clone())) + verify {} native_bn254_verify { let caller: T::AccountId = whitelisted_caller(); - }: native_bn254_verify(RawOrigin::Signed(caller.clone())) - verify {} + }: native_bn254_verify(RawOrigin::Signed(caller.clone())) + verify {} // bw6_761 wasm_bw6_761_add { let caller: T::AccountId = whitelisted_caller(); - }: wasm_bw6_761_add(RawOrigin::Signed(caller.clone())) - verify {} + }: wasm_bw6_761_add(RawOrigin::Signed(caller.clone())) + verify {} wasm_bw6_761_mul { let caller: T::AccountId = whitelisted_caller(); - }: wasm_bw6_761_mul(RawOrigin::Signed(caller.clone())) - verify {} + }: wasm_bw6_761_mul(RawOrigin::Signed(caller.clone())) + verify {} wasm_bw6_761_pairing_two { let caller: T::AccountId = whitelisted_caller(); - }: wasm_bw6_761_pairing_two(RawOrigin::Signed(caller.clone())) - verify {} + }: wasm_bw6_761_pairing_two(RawOrigin::Signed(caller.clone())) + verify {} wasm_bw6_761_pairing_six { let caller: T::AccountId = whitelisted_caller(); - }: wasm_bw6_761_pairing_six(RawOrigin::Signed(caller.clone())) - verify {} + }: wasm_bw6_761_pairing_six(RawOrigin::Signed(caller.clone())) + verify {} wasm_bw6_761_verify { let caller: T::AccountId = whitelisted_caller(); - }: wasm_bw6_761_verify(RawOrigin::Signed(caller.clone())) - verify {} + }: wasm_bw6_761_verify(RawOrigin::Signed(caller.clone())) + verify {} native_bw6_761_add { let caller: T::AccountId = whitelisted_caller(); - }: native_bw6_761_add(RawOrigin::Signed(caller.clone())) - verify {} + }: native_bw6_761_add(RawOrigin::Signed(caller.clone())) + verify {} native_bw6_761_mul { let caller: T::AccountId = whitelisted_caller(); - }: native_bw6_761_mul(RawOrigin::Signed(caller.clone())) - verify {} + }: native_bw6_761_mul(RawOrigin::Signed(caller.clone())) + verify {} native_bw6_761_pairing_two { let caller: T::AccountId = whitelisted_caller(); - }: native_bw6_761_pairing_two(RawOrigin::Signed(caller.clone())) - verify {} + }: native_bw6_761_pairing_two(RawOrigin::Signed(caller.clone())) + verify {} native_bw6_761_pairing_six { let caller: T::AccountId = whitelisted_caller(); - }: native_bw6_761_pairing_six(RawOrigin::Signed(caller.clone())) - verify {} + }: native_bw6_761_pairing_six(RawOrigin::Signed(caller.clone())) + verify {} native_bw6_761_verify { let caller: T::AccountId = whitelisted_caller(); - }: native_bw6_761_verify(RawOrigin::Signed(caller.clone())) - verify {} + }: native_bw6_761_verify(RawOrigin::Signed(caller.clone())) + verify {} } diff --git a/primitives/io/Cargo.toml b/primitives/io/Cargo.toml index 43430dd9..2b5dd6ae 100644 --- a/primitives/io/Cargo.toml +++ b/primitives/io/Cargo.toml @@ -14,6 +14,7 @@ sp-std = { git = "https://github.com/paritytech/substrate.git", branch = "master [dependencies.curve] git = "https://github.com/patractlabs/megaclite.git" package = "megaclite-arkworks" +default-features = false features = [ "tests" ] [dependencies.num-bigint] From e805e5813f5fa3a6c7861ae25fd06c6b6b5957b9 Mon Sep 17 00:00:00 2001 From: clearloop Date: Tue, 15 Dec 2020 13:12:15 +0800 Subject: [PATCH 14/33] feat(crates/template): extend pallet contracts --- Cargo.lock | 1 + pallets/template/Cargo.toml | 9 +++- pallets/template/src/benchmarking.rs | 51 ++++++++++++++++--- pallets/template/src/lib.rs | 75 ++++++++++------------------ pallets/template/src/mock.rs | 54 -------------------- pallets/template/src/tests.rs | 23 --------- 6 files changed, 79 insertions(+), 134 deletions(-) delete mode 100644 pallets/template/src/mock.rs delete mode 100644 pallets/template/src/tests.rs diff --git a/Cargo.lock b/Cargo.lock index aa810f9f..7e67ab21 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4478,6 +4478,7 @@ dependencies = [ "frame-system", "jupiter-io", "megaclite-arkworks", + "pallet-contracts 2.0.0", "parity-scale-codec", "sp-core", "sp-io", diff --git a/pallets/template/Cargo.toml b/pallets/template/Cargo.toml index b9798608..74135653 100644 --- a/pallets/template/Cargo.toml +++ b/pallets/template/Cargo.toml @@ -33,19 +33,26 @@ git = "https://github.com/patractlabs/megaclite.git" features = ["tests"] default-features = false +[dependencies.contract] +package = "pallet-contracts" +path = "../../vendor/substrate/frame/contracts" +default-features = false + [features] default = ['std'] std = [ 'codec/std', + 'contract/std', 'frame-support/std', 'frame-system/std', 'frame-benchmarking/std', - 'sp-std/std', 'jupiter-io/std', + 'sp-std/std', ] runtime-benchmarks = [ "frame-benchmarking", 'frame-system/runtime-benchmarks', 'frame-support/runtime-benchmarks', + 'contract/runtime-benchmarks', ] diff --git a/pallets/template/src/benchmarking.rs b/pallets/template/src/benchmarking.rs index 21075035..7084f303 100644 --- a/pallets/template/src/benchmarking.rs +++ b/pallets/template/src/benchmarking.rs @@ -23,38 +23,77 @@ use super::*; use frame_benchmarking::{benchmarks, whitelisted_caller}; use frame_system::RawOrigin; +use pallet_contracts::{Module as Contracts, *}; use sp_std::prelude::*; benchmarks! { _ { } + // ink_groth16_verify { + // // let caller: T::AccountId = whitelisted_caller(); + // let salt = vec![0xff]; + // Contracts::put_code_raw(&[]); + // Contracts::::instantiate( + // RawOrigin::Signed(caller.clone()).into(), + // endowment, + // Weight::max_value(), + // module.hash, + // data, + // salt, + // )?; + // } // : bare_call(caller, ) + // call { + // let data = vec![42u8; 1024]; + // let instance = Contract::::with_caller( + // whitelisted_caller(), WasmModule::dummy_with_mem(), vec![], Endow::CollectRent + // )?; + // let value = T::Currency::minimum_balance() * 100u32.into(); + // let origin = RawOrigin::Signed(instance.caller.clone()); + // let callee = instance.addr.clone(); + // + // // trigger rent collection for worst case performance of call + // System::::set_block_number(instance.eviction_at()? - 5u32.into()); + // let before = T::Currency::free_balance(&instance.account_id); + // }: _(origin, callee, value, Weight::max_value(), data) + // verify { + // // endowment and value transfered via call should be removed from the caller + // assert_eq!( + // T::Currency::free_balance(&instance.caller), + // caller_funding::() - instance.endowment - value, + // ); + // // rent should have lowered the amount of balance of the contract + // assert!(T::Currency::free_balance(&instance.account_id) < before + value); + // // but it should not have been evicted by the rent collection + // instance.alive_info()?; + // } + wasm_bls12_377_add { let caller: T::AccountId = whitelisted_caller(); - }: wasm_bls12_377_add(RawOrigin::Signed(caller.clone())) + }: _(RawOrigin::Signed(caller.clone())) verify {} wasm_bls12_377_mul { let caller: T::AccountId = whitelisted_caller(); - }: wasm_bls12_377_mul(RawOrigin::Signed(caller.clone())) + }: _(RawOrigin::Signed(caller.clone())) verify {} wasm_bls12_377_pairing_two { let caller: T::AccountId = whitelisted_caller(); - }: wasm_bls12_377_pairing_two(RawOrigin::Signed(caller.clone())) + }: _(RawOrigin::Signed(caller.clone())) verify {} wasm_bls12_377_pairing_six { let caller: T::AccountId = whitelisted_caller(); - }: wasm_bls12_377_pairing_six(RawOrigin::Signed(caller.clone())) + }: _(RawOrigin::Signed(caller.clone())) verify {} wasm_bls12_377_verify { let caller: T::AccountId = whitelisted_caller(); - }: wasm_bls12_377_verify(RawOrigin::Signed(caller.clone())) + }: _(RawOrigin::Signed(caller.clone())) verify {} native_bls12_377_add { let caller: T::AccountId = whitelisted_caller(); - }: native_bls12_377_add(RawOrigin::Signed(caller.clone())) + }: _(RawOrigin::Signed(caller.clone())) verify {} native_bls12_377_mul { diff --git a/pallets/template/src/lib.rs b/pallets/template/src/lib.rs index 13b0d152..da8a5840 100644 --- a/pallets/template/src/lib.rs +++ b/pallets/template/src/lib.rs @@ -1,24 +1,21 @@ #![cfg_attr(not(feature = "std"), no_std)] +use contract::Module as Contracts; /// Edit this file to define custom logic or remove it if it is not needed. /// Learn more about FRAME and the core library of Substrate FRAME pallets: /// https://substrate.dev/docs/en/knowledgebase/runtime/frame use frame_support::{decl_error, decl_event, decl_module, decl_storage, dispatch, traits::Get}; -use frame_system::ensure_signed; +use sp_core::crypto::UncheckedFrom; +use sp_std::vec::Vec; #[cfg(feature = "runtime-benchmarks")] mod benchmarking; -// #[cfg(test)] -// mod mock; -// -// #[cfg(test)] -// mod tests; - /// Configure the pallet by specifying the parameters and types on which it depends. -pub trait Config: frame_system::Config { +pub trait Config: frame_system::Config + contract::Config { /// Because this pallet emits events, it depends on the runtime's definition of an event. type Event: From> + Into<::Event>; + // type AccountId: contract::Config::AccountId; } // The pallet's runtime storage items. @@ -27,7 +24,11 @@ decl_storage! { // A unique name is used to ensure that the pallet's storage items are isolated. // This name may be updated, but each pallet in the runtime must use a unique name. // ---------------------------------vvvvvvvvvvvvvv - trait Store for Module as TemplateModule { + trait Store for Module as TemplateModule + where + T::AccountId: AsRef<[u8]>, + T::AccountId: UncheckedFrom, + { // Learn more about declaring storage items: // https://substrate.dev/docs/en/knowledgebase/runtime/storage#declaring-storage-items Something get(fn something): Option; @@ -49,7 +50,11 @@ decl_event!( // Errors inform users that something went wrong. decl_error! { - pub enum Error for Module { + pub enum Error for Module + where + T::AccountId: AsRef<[u8]>, + T::AccountId: UncheckedFrom, + { /// Error names should be descriptive. NoneValue, /// Errors should have helpful documentation associated with them. @@ -61,13 +66,22 @@ decl_error! { // These functions materialize as "extrinsics", which are often compared to transactions. // Dispatchable functions must be annotated with a weight and must return a DispatchResult. decl_module! { - pub struct Module for enum Call where origin: T::Origin { + pub struct Module for enum Call + where + origin: T::Origin, + T::AccountId: AsRef<[u8]>, + T::AccountId: UncheckedFrom, + { // Errors must be initialized if they are used by the pallet. type Error = Error; // Events must be initialized if they are used by the pallet. fn deposit_event() = default; + #[weight = 10_000 + T::DbWeight::get().writes(1)] + pub fn put_code(origin, code: Vec) -> dispatch::DispatchResult { + >::put_code(origin, code) + } // bls12_377 @@ -121,7 +135,6 @@ decl_module! { jupiter_io::pairing::bls12_377_verify(); } - // bls12_381 #[weight = 10_000 + T::DbWeight::get().writes(1)] @@ -277,43 +290,5 @@ decl_module! { pub fn native_bw6_761_verify(origin) { jupiter_io::pairing::bw6_761_verify(); } - - - /// An example dispatchable that takes a singles value as a parameter, writes the value to - /// storage and emits an event. This function must be dispatched by a signed extrinsic. - #[weight = 10_000 + T::DbWeight::get().writes(1)] - pub fn do_something(origin, something: u32) -> dispatch::DispatchResult { - // Check that the extrinsic was signed and get the signer. - // This function will return an error if the extrinsic is not signed. - // https://substrate.dev/docs/en/knowledgebase/runtime/origin - let who = ensure_signed(origin)?; - - // Update storage. - Something::put(something); - - // Emit an event. - Self::deposit_event(RawEvent::SomethingStored(something, who)); - // Return a successful DispatchResult - Ok(()) - } - - /// An example dispatchable that may throw a custom error. - #[weight = 10_000 + T::DbWeight::get().reads_writes(1,1)] - pub fn cause_error(origin) -> dispatch::DispatchResult { - let _who = ensure_signed(origin)?; - - // Read a value from storage. - match Something::get() { - // Return an error if the value has not been set. - None => Err(Error::::NoneValue)?, - Some(old) => { - // Increment the value read from storage; will error in the event of overflow. - let new = old.checked_add(1).ok_or(Error::::StorageOverflow)?; - // Update the value in storage with the incremented result. - Something::put(new); - Ok(()) - }, - } - } } } diff --git a/pallets/template/src/mock.rs b/pallets/template/src/mock.rs deleted file mode 100644 index 84af63a1..00000000 --- a/pallets/template/src/mock.rs +++ /dev/null @@ -1,54 +0,0 @@ -use crate::{Module, Config}; -use sp_core::H256; -use frame_support::{impl_outer_origin, parameter_types}; -use sp_runtime::{ - traits::{BlakeTwo256, IdentityLookup}, testing::Header, -}; -use frame_system as system; - -impl_outer_origin! { - pub enum Origin for Test {} -} - -// Configure a mock runtime to test the pallet. - -#[derive(Clone, Eq, PartialEq)] -pub struct Test; -parameter_types! { - pub const BlockHashCount: u64 = 250; -} - -impl system::Config for Test { - type BaseCallFilter = (); - type BlockWeights = (); - type BlockLength = (); - type DbWeight = (); - type Origin = Origin; - type Call = (); - type Index = u64; - type BlockNumber = u64; - type Hash = H256; - type Hashing = BlakeTwo256; - type AccountId = u64; - type Lookup = IdentityLookup; - type Header = Header; - type Event = (); - type BlockHashCount = BlockHashCount; - type Version = (); - type PalletInfo = (); - type AccountData = (); - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); -} - -impl Config for Test { - type Event = (); -} - -pub type TemplateModule = Module; - -// Build genesis storage according to the mock runtime. -pub fn new_test_ext() -> sp_io::TestExternalities { - system::GenesisConfig::default().build_storage::().unwrap().into() -} diff --git a/pallets/template/src/tests.rs b/pallets/template/src/tests.rs deleted file mode 100644 index 3356b29f..00000000 --- a/pallets/template/src/tests.rs +++ /dev/null @@ -1,23 +0,0 @@ -use crate::{Error, mock::*}; -use frame_support::{assert_ok, assert_noop}; - -#[test] -fn it_works_for_default_value() { - new_test_ext().execute_with(|| { - // Dispatch a signed extrinsic. - assert_ok!(TemplateModule::do_something(Origin::signed(1), 42)); - // Read pallet storage and assert an expected result. - assert_eq!(TemplateModule::something(), Some(42)); - }); -} - -#[test] -fn correct_error_for_none_value() { - new_test_ext().execute_with(|| { - // Ensure the expected error is thrown when no value is present. - assert_noop!( - TemplateModule::cause_error(Origin::signed(1)), - Error::::NoneValue - ); - }); -} From 23d14e29ffd6965be238d64c3d0fc51dea9c33c4 Mon Sep 17 00:00:00 2001 From: clearloop Date: Tue, 15 Dec 2020 14:45:44 +0800 Subject: [PATCH 15/33] feat(pallets/template): init test methods --- pallets/template/src/benchmarking.rs | 2 +- pallets/template/src/lib.rs | 64 ++++++++++++++++++++++++---- 2 files changed, 56 insertions(+), 10 deletions(-) diff --git a/pallets/template/src/benchmarking.rs b/pallets/template/src/benchmarking.rs index 7084f303..eda742b4 100644 --- a/pallets/template/src/benchmarking.rs +++ b/pallets/template/src/benchmarking.rs @@ -21,9 +21,9 @@ use super::*; +// use contract::{Module as Contracts, *}; use frame_benchmarking::{benchmarks, whitelisted_caller}; use frame_system::RawOrigin; -use pallet_contracts::{Module as Contracts, *}; use sp_std::prelude::*; benchmarks! { diff --git a/pallets/template/src/lib.rs b/pallets/template/src/lib.rs index da8a5840..1e991de7 100644 --- a/pallets/template/src/lib.rs +++ b/pallets/template/src/lib.rs @@ -1,11 +1,12 @@ #![cfg_attr(not(feature = "std"), no_std)] -use contract::Module as Contracts; +use contract::{CodeHash, Module as Contracts}; /// Edit this file to define custom logic or remove it if it is not needed. /// Learn more about FRAME and the core library of Substrate FRAME pallets: /// https://substrate.dev/docs/en/knowledgebase/runtime/frame use frame_support::{decl_error, decl_event, decl_module, decl_storage, dispatch, traits::Get}; use sp_core::crypto::UncheckedFrom; +use sp_runtime::traits::StaticLookup; use sp_std::vec::Vec; #[cfg(feature = "runtime-benchmarks")] @@ -29,9 +30,8 @@ decl_storage! { T::AccountId: AsRef<[u8]>, T::AccountId: UncheckedFrom, { - // Learn more about declaring storage items: - // https://substrate.dev/docs/en/knowledgebase/runtime/storage#declaring-storage-items - Something get(fn something): Option; + // The Contract + pub Contract: CodeHash; } } @@ -57,8 +57,10 @@ decl_error! { { /// Error names should be descriptive. NoneValue, - /// Errors should have helpful documentation associated with them. - StorageOverflow, + /// The contract we just put disappeared + ContractDisappeared, + /// Failed + InstantiateContractFailed } } @@ -78,9 +80,53 @@ decl_module! { // Events must be initialized if they are used by the pallet. fn deposit_event() = default; - #[weight = 10_000 + T::DbWeight::get().writes(1)] - pub fn put_code(origin, code: Vec) -> dispatch::DispatchResult { - >::put_code(origin, code) + /// Put and instantiate code + #[weight = 10_000 + T::DbWeight::get().writes(1)] + pub fn put_code(origin, code: Vec) -> Result<(), dispatch::DispatchError> { + >::put_code(origin.clone(), code)?; + if let Some((code_hash, _)) = >::iter().last() { + >::set(code_hash.clone()); + Ok(()) + } else { + Err(>::ContractDisappeared.into()) + } + } + + /// Instantiate the code + #[weight = 10_000 + T::DbWeight::get().writes(1)] + pub fn instantiate(origin) -> Result<(), dispatch::DispatchError> { + if >::instantiate( + origin, + 0.into(), + 0, + >::get(), + b"".to_vec(), + b"".to_vec(), + ).is_err() { + Err(>::InstantiateContractFailed.into()) + } else { + Ok(()) + } + } + + /// Call the contract + #[weight = 10_000 + T::DbWeight::get().writes(1)] + pub fn call( + origin, + caller: T::AccountId, + data: Vec, + ) -> dispatch::DispatchResultWithPostInfo { + >::call( + origin, + T::Lookup::unlookup(>::contract_address( + &caller, + &>::get(), + &b"".to_vec(), + )), + 0.into(), + 0, + data + ) } // bls12_377 From 0d0ff3df778b5b6784de43f722d66d2b0d68644b Mon Sep 17 00:00:00 2001 From: clearloop Date: Tue, 15 Dec 2020 20:30:24 +0800 Subject: [PATCH 16/33] fix(pallets/contracts): the preset of AccountId in benchmark --- pallets/template/src/benchmarking.rs | 43 ++++------------------------ pallets/template/src/lib.rs | 4 +-- 2 files changed, 7 insertions(+), 40 deletions(-) diff --git a/pallets/template/src/benchmarking.rs b/pallets/template/src/benchmarking.rs index eda742b4..12faa208 100644 --- a/pallets/template/src/benchmarking.rs +++ b/pallets/template/src/benchmarking.rs @@ -27,44 +27,11 @@ use frame_system::RawOrigin; use sp_std::prelude::*; benchmarks! { - _ { } - // ink_groth16_verify { - // // let caller: T::AccountId = whitelisted_caller(); - // let salt = vec![0xff]; - // Contracts::put_code_raw(&[]); - // Contracts::::instantiate( - // RawOrigin::Signed(caller.clone()).into(), - // endowment, - // Weight::max_value(), - // module.hash, - // data, - // salt, - // )?; - // } // : bare_call(caller, ) - // call { - // let data = vec![42u8; 1024]; - // let instance = Contract::::with_caller( - // whitelisted_caller(), WasmModule::dummy_with_mem(), vec![], Endow::CollectRent - // )?; - // let value = T::Currency::minimum_balance() * 100u32.into(); - // let origin = RawOrigin::Signed(instance.caller.clone()); - // let callee = instance.addr.clone(); - // - // // trigger rent collection for worst case performance of call - // System::::set_block_number(instance.eviction_at()? - 5u32.into()); - // let before = T::Currency::free_balance(&instance.account_id); - // }: _(origin, callee, value, Weight::max_value(), data) - // verify { - // // endowment and value transfered via call should be removed from the caller - // assert_eq!( - // T::Currency::free_balance(&instance.caller), - // caller_funding::() - instance.endowment - value, - // ); - // // rent should have lowered the amount of balance of the contract - // assert!(T::Currency::free_balance(&instance.account_id) < before + value); - // // but it should not have been evicted by the rent collection - // instance.alive_info()?; - // } + where_clause { where + T::AccountId: UncheckedFrom, + T::AccountId: AsRef<[u8]>, + } + _ {} wasm_bls12_377_add { let caller: T::AccountId = whitelisted_caller(); diff --git a/pallets/template/src/lib.rs b/pallets/template/src/lib.rs index 1e991de7..c8aec4da 100644 --- a/pallets/template/src/lib.rs +++ b/pallets/template/src/lib.rs @@ -97,7 +97,7 @@ decl_module! { pub fn instantiate(origin) -> Result<(), dispatch::DispatchError> { if >::instantiate( origin, - 0.into(), + 0u32.into(), 0, >::get(), b"".to_vec(), @@ -123,7 +123,7 @@ decl_module! { &>::get(), &b"".to_vec(), )), - 0.into(), + 0u32.into(), 0, data ) From 7298182c8ce3570ca43121d40dd92e9e0414dc03 Mon Sep 17 00:00:00 2001 From: clearloop Date: Wed, 16 Dec 2020 14:19:36 +0800 Subject: [PATCH 17/33] feat(scripts/benchmark): migrate benchmark.sh here --- scripts/benchmark.sh | 49 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 scripts/benchmark.sh diff --git a/scripts/benchmark.sh b/scripts/benchmark.sh new file mode 100644 index 00000000..26d2153d --- /dev/null +++ b/scripts/benchmark.sh @@ -0,0 +1,49 @@ +#!/bin/bash +declare -a curves=( + 'bls12_377' + 'bls12_381' + 'bn254' + 'bw6_761' + 'cp6_782' +) + +declare -a exs=( + 'add' + 'mul' + 'pairing_two' + 'pairing_six' + 'verify' +) + +function bm() { + ../target/release/node-template \ + benchmark \ + -p 'pallet_template' \ + -e "$1" "${@:2}" | grep 'Time ~=' -m 1 +} + + +function main() { + for p in "${curves[@]}" + do + echo "Curve: ${p}" + echo '=========================µs' + for q in "${exs[@]}" + do + echo "--->${q}" + echo -n "Wasm: " + d=wasm_"${p}"_"${q}" + bm "$d" '--execution=Wasm' '--wasm-execution=Interpreted' "-r=1000" # '|' 'grep' "'Time ~='" '-m' '1' + + # "RuIn" means the `runtime_interface` implementation in test + echo -n "RuIn: " + d=native_"${p}"_"${q}" + bm "$d" '--execution=Wasm' '--wasm-execution=Interpreted' "-r=1000" # '|' 'grep' "'Time ~='" '-m' '1' +# bm wasm_"${p}"_"${q}" --execution Native | grep 'Time ~=' -m 1 + done + echo "" + echo "" + done +} + +main $@ From ed4109e90d7d40700e994a835c923fb1327eff83 Mon Sep 17 00:00:00 2001 From: clearloop Date: Thu, 17 Dec 2020 03:13:31 +0800 Subject: [PATCH 18/33] feat(frame/contracts): benchmark call for flip.wasm as example --- Cargo.lock | 1 + pallets/template/Cargo.toml | 2 + pallets/template/build.rs | 10 + pallets/template/flip.wat | 958 +++++++++++++++++++++++++++ pallets/template/src/benchmarking.rs | 43 +- pallets/template/src/lib.rs | 47 +- 6 files changed, 1019 insertions(+), 42 deletions(-) create mode 100644 pallets/template/build.rs create mode 100644 pallets/template/flip.wat diff --git a/Cargo.lock b/Cargo.lock index 51fe023f..d7239c13 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4538,6 +4538,7 @@ dependencies = [ "sp-io", "sp-runtime", "sp-std", + "wat", ] [[package]] diff --git a/pallets/template/Cargo.toml b/pallets/template/Cargo.toml index 74135653..9b82c363 100644 --- a/pallets/template/Cargo.toml +++ b/pallets/template/Cargo.toml @@ -38,6 +38,8 @@ package = "pallet-contracts" path = "../../vendor/substrate/frame/contracts" default-features = false +[dev-dependencies] +wat = "1.0" [features] default = ['std'] diff --git a/pallets/template/build.rs b/pallets/template/build.rs new file mode 100644 index 00000000..cfd72c6b --- /dev/null +++ b/pallets/template/build.rs @@ -0,0 +1,10 @@ +//! Use *.wat file for human readable +use std::{env, fs, io::Result, path::Path}; + +fn main() -> Result<()> { + let out_dir = env::var_os("OUT_DIR").unwrap(); + let dest_path = Path::new(&out_dir).join("flip.wasm"); + fs::write(&dest_path, fs::read("flip.wat")?)?; + println!("cargo:rerun-if-changed=build.rs"); + Ok(()) +} diff --git a/pallets/template/flip.wat b/pallets/template/flip.wat new file mode 100644 index 00000000..52509949 --- /dev/null +++ b/pallets/template/flip.wat @@ -0,0 +1,958 @@ +(module + (type (;0;) (func (param i32 i32))) + (type (;1;) (func (param i32 i32 i32))) + (type (;2;) (func (param i32))) + (type (;3;) (func (param i32) (result i32))) + (type (;4;) (func (result i32))) + (type (;5;) (func (param i32 i32 i32) (result i32))) + (type (;6;) (func (param i32 i32 i32 i32))) + (type (;7;) (func (param i32) (result i64))) + (import "seal0" "seal_get_storage" (func (;0;) (type 5))) + (import "seal0" "seal_set_storage" (func (;1;) (type 1))) + (import "seal0" "seal_value_transferred" (func (;2;) (type 0))) + (import "seal0" "seal_input" (func (;3;) (type 0))) + (import "seal0" "seal_return" (func (;4;) (type 1))) + (import "env" "memory" (memory (;0;) 2 16)) + (func (;5;) (type 3) (param i32) (result i32) + (local i32) + global.get 0 + i32.const -64 + i32.add + local.tee 1 + global.set 0 + local.get 1 + i32.const 32 + i32.add + local.get 0 + i32.const 24 + i32.add + i64.load + i64.store + local.get 1 + i32.const 24 + i32.add + local.get 0 + i32.const 16 + i32.add + i64.load + i64.store + local.get 1 + i32.const 16 + i32.add + local.get 0 + i32.const 8 + i32.add + i64.load + i64.store + local.get 1 + i64.const 0 + i64.store offset=40 + local.get 1 + local.get 0 + i64.load + i64.store offset=8 + local.get 1 + i32.const 8 + i32.add + call 6 + local.get 1 + i32.const 16384 + i32.store offset=52 + local.get 1 + i32.const 65572 + i32.store offset=48 + local.get 1 + i32.const 16384 + i32.store offset=56 + i32.const 65572 + local.get 1 + i32.const 56 + i32.add + call 0 + local.set 0 + local.get 1 + i32.const 48 + i32.add + local.get 1 + i32.load offset=56 + call 7 + block ;; label = @1 + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + block ;; label = @5 + local.get 0 + br_table 1 (;@4;) 0 (;@5;) 0 (;@5;) 2 (;@3;) 0 (;@5;) + end + unreachable + end + local.get 1 + local.get 1 + i64.load offset=48 + i64.store offset=56 + local.get 1 + local.get 1 + i32.const 56 + i32.add + call 8 + block ;; label = @4 + local.get 1 + i32.load8_u + i32.const 1 + i32.and + br_if 0 (;@4;) + i32.const 0 + local.set 0 + local.get 1 + i32.load8_u offset=1 + br_table 3 (;@1;) 2 (;@2;) 0 (;@4;) + end + unreachable + end + unreachable + end + i32.const 1 + local.set 0 + end + local.get 1 + i32.const -64 + i32.sub + global.set 0 + local.get 0) + (func (;6;) (type 3) (param i32) (result i32) + (local i64 i64 i64) + local.get 0 + i64.load offset=32 + local.set 1 + local.get 0 + i64.const 1 + i64.store offset=32 + local.get 0 + local.get 1 + local.get 0 + i64.load + local.tee 2 + i64.add + local.tee 1 + i64.store + local.get 0 + local.get 0 + i64.load offset=8 + local.tee 3 + local.get 1 + local.get 2 + i64.lt_u + i64.extend_i32_u + i64.add + local.tee 1 + i64.store offset=8 + local.get 0 + local.get 0 + i64.load offset=16 + local.tee 2 + local.get 1 + local.get 3 + i64.lt_u + i64.extend_i32_u + i64.add + local.tee 1 + i64.store offset=16 + local.get 0 + local.get 0 + i64.load offset=24 + local.get 1 + local.get 2 + i64.lt_u + i64.extend_i32_u + i64.add + i64.store offset=24 + local.get 0) + (func (;7;) (type 0) (param i32 i32) + (local i32 i32 i32) + global.get 0 + i32.const 16 + i32.sub + local.tee 2 + global.set 0 + local.get 0 + i32.load offset=4 + local.set 3 + local.get 0 + i32.const 0 + i32.store offset=4 + local.get 0 + i32.load + local.set 4 + local.get 0 + i32.const 65572 + i32.store + local.get 2 + i32.const 8 + i32.add + local.get 1 + local.get 4 + local.get 3 + call 14 + local.get 0 + local.get 2 + i64.load offset=8 + i64.store align=4 + local.get 2 + i32.const 16 + i32.add + global.set 0) + (func (;8;) (type 0) (param i32 i32) + (local i32 i32) + global.get 0 + i32.const 16 + i32.sub + local.tee 2 + global.set 0 + local.get 2 + i32.const 0 + i32.store8 offset=15 + block ;; label = @1 + local.get 1 + local.get 2 + i32.const 15 + i32.add + i32.const 1 + call 18 + i32.eqz + if ;; label = @2 + local.get 2 + i32.load8_u offset=15 + local.set 1 + br 1 (;@1;) + end + i32.const 1 + local.set 3 + end + local.get 0 + local.get 1 + i32.store8 offset=1 + local.get 0 + local.get 3 + i32.store8 + local.get 2 + i32.const 16 + i32.add + global.set 0) + (func (;9;) (type 0) (param i32 i32) + (local i32) + global.get 0 + i32.const -64 + i32.add + local.tee 2 + global.set 0 + local.get 2 + i32.const 32 + i32.add + local.get 1 + i32.const 24 + i32.add + i64.load + i64.store + local.get 2 + i32.const 24 + i32.add + local.get 1 + i32.const 16 + i32.add + i64.load + i64.store + local.get 2 + i32.const 16 + i32.add + local.get 1 + i32.const 8 + i32.add + i64.load + i64.store + local.get 2 + i64.const 0 + i64.store offset=40 + local.get 2 + local.get 1 + i64.load + i64.store offset=8 + local.get 2 + i32.const 8 + i32.add + call 6 + local.get 2 + i32.const 56 + i32.add + i32.const 16384 + i32.store + local.get 2 + i32.const 65572 + i32.store offset=52 + local.get 2 + i32.const 0 + i32.store offset=48 + local.get 2 + local.get 2 + i32.const 48 + i32.add + local.get 0 + call 10 + local.get 2 + i32.load + local.get 2 + i32.load offset=4 + call 1 + local.get 2 + i32.const -64 + i32.sub + global.set 0) + (func (;10;) (type 1) (param i32 i32 i32) + (local i32 i32 i32) + global.get 0 + i32.const 16 + i32.sub + local.tee 3 + global.set 0 + local.get 1 + i32.const 8 + i32.add + local.tee 4 + i32.load + local.set 5 + local.get 4 + i32.const 0 + i32.store + local.get 1 + i32.load offset=4 + local.set 4 + local.get 1 + i32.const 65572 + i32.store offset=4 + local.get 3 + local.get 2 + i32.store8 offset=15 + local.get 3 + i32.const 1 + local.get 4 + local.get 5 + call 14 + block ;; label = @1 + local.get 3 + i32.load offset=4 + i32.const 1 + i32.eq + if ;; label = @2 + local.get 3 + i32.load + local.get 3 + i32.load8_u offset=15 + i32.store8 + local.get 1 + i32.const 0 + i32.store offset=8 + local.get 1 + i32.const 65572 + i32.store offset=4 + local.get 5 + i32.eqz + br_if 1 (;@1;) + local.get 1 + local.get 5 + i32.const -1 + i32.add + i32.store offset=8 + local.get 1 + local.get 4 + i32.const 1 + i32.add + i32.store offset=4 + local.get 0 + i32.const 1 + i32.store offset=4 + local.get 0 + local.get 4 + i32.store + local.get 3 + i32.const 16 + i32.add + global.set 0 + return + end + unreachable + end + unreachable) + (func (;11;) (type 7) (param i32) (result i64) + (local i32 i32) + global.get 0 + i32.const 16 + i32.sub + local.tee 1 + global.set 0 + local.get 1 + i64.const 0 + i64.store8 offset=12 + local.get 1 + i64.const 0 + i64.store32 offset=8 + block (result i32) ;; label = @1 + loop ;; label = @2 + local.get 2 + i32.const 4 + i32.eq + if ;; label = @3 + local.get 1 + i64.load8_u offset=12 + i32.wrap_i64 + i32.const 4 + i32.lt_u + local.set 2 + local.get 1 + i32.load offset=8 + br 2 (;@1;) + end + local.get 1 + local.get 0 + call 8 + local.get 1 + i32.load8_u + i32.const 1 + i32.and + i32.eqz + if ;; label = @3 + local.get 1 + i32.const 8 + i32.add + local.get 2 + i32.add + local.get 1 + i32.load8_u offset=1 + i32.store8 + local.get 1 + local.get 2 + i32.const 1 + i32.add + local.tee 2 + i32.store8 offset=12 + br 1 (;@2;) + end + end + local.get 2 + i32.const 255 + i32.and + if ;; label = @2 + local.get 1 + i32.const 0 + i32.store8 offset=12 + end + i32.const 1 + local.set 2 + i32.const 0 + end + local.set 0 + local.get 1 + i32.const 16 + i32.add + global.set 0 + local.get 2 + i64.extend_i32_u + local.get 0 + i64.extend_i32_u + i64.const 8 + i64.shl + i64.or) + (func (;12;) (type 2) (param i32) + (local i32) + global.get 0 + i32.const 16 + i32.sub + local.tee 1 + global.set 0 + local.get 1 + local.get 0 + i32.store offset=12 + local.get 1 + i32.const 12 + i32.add + i32.load + i32.load8_u + call 13 + unreachable) + (func (;13;) (type 2) (param i32) + (local i32) + global.get 0 + i32.const 32 + i32.sub + local.tee 1 + global.set 0 + local.get 1 + i32.const 24 + i32.add + i32.const 16384 + i32.store + local.get 1 + i32.const 65572 + i32.store offset=20 + local.get 1 + i32.const 0 + i32.store offset=16 + local.get 1 + i32.const 8 + i32.add + local.get 1 + i32.const 16 + i32.add + local.get 0 + call 10 + i32.const 0 + local.get 1 + i32.load offset=8 + local.get 1 + i32.load offset=12 + call 4 + unreachable) + (func (;14;) (type 6) (param i32 i32 i32 i32) + i32.const 0 + local.get 1 + i32.le_u + if ;; label = @1 + local.get 3 + local.get 1 + i32.ge_u + if ;; label = @2 + local.get 0 + local.get 1 + i32.store offset=4 + local.get 0 + local.get 2 + i32.store + return + end + unreachable + end + unreachable) + (func (;15;) (type 4) (result i32) + i32.const 0 + call 16 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 65536 + i32.add + i32.load) + (func (;16;) (type 3) (param i32) (result i32) + (local i32 i32 i32 i32 i32 i64) + global.get 0 + i32.const 48 + i32.sub + local.tee 1 + global.set 0 + block ;; label = @1 + block (result i32) ;; label = @2 + block ;; label = @3 + block ;; label = @4 + local.get 0 + if ;; label = @5 + local.get 1 + i32.const 16384 + i32.store offset=12 + local.get 1 + i32.const 65572 + i32.store offset=8 + local.get 1 + i32.const 8 + i32.add + call 19 + local.get 1 + local.get 1 + i64.load offset=8 + i64.store offset=16 + i32.const 1 + local.set 3 + local.get 1 + i32.const 16 + i32.add + call 11 + local.tee 6 + i32.wrap_i64 + local.tee 4 + i32.const 1 + i32.and + if ;; label = @6 + i32.const 1 + local.set 2 + br 3 (;@3;) + end + local.get 6 + i64.const 1099511627775 + i64.and + local.tee 6 + i64.const 32 + i64.shr_u + i32.wrap_i64 + local.set 0 + local.get 6 + i64.const 24 + i64.shr_u + i32.wrap_i64 + local.set 5 + local.get 6 + i64.const 16 + i64.shr_u + i32.wrap_i64 + local.set 2 + local.get 4 + i32.const 8 + i32.shr_u + i32.const 255 + i32.and + local.tee 4 + i32.const 30 + i32.ne + if ;; label = @6 + local.get 4 + i32.const 192 + i32.ne + local.get 0 + i32.const 243 + i32.ne + i32.or + local.get 2 + i32.const 255 + i32.and + i32.const 150 + i32.ne + i32.or + br_if 2 (;@4;) + i32.const 0 + local.set 2 + local.get 5 + i32.const 255 + i32.and + i32.const 165 + i32.eq + br_if 3 (;@3;) + br 2 (;@4;) + end + local.get 0 + i32.const 86 + i32.ne + local.get 2 + i32.const 255 + i32.and + i32.const 92 + i32.ne + i32.or + br_if 1 (;@4;) + i32.const 0 + local.set 2 + i32.const 0 + local.set 3 + local.get 5 + i32.const 255 + i32.and + i32.const 164 + i32.ne + br_if 1 (;@4;) + br 2 (;@3;) + end + local.get 1 + i32.const 16384 + i32.store offset=12 + local.get 1 + i32.const 65572 + i32.store offset=8 + local.get 1 + i32.const 8 + i32.add + call 19 + local.get 1 + local.get 1 + i64.load offset=8 + i64.store offset=16 + i32.const 6 + local.get 1 + i32.const 16 + i32.add + call 11 + i64.const 1099511627521 + i64.and + i64.const 970968230400 + i64.ne + br_if 2 (;@2;) + drop + local.get 1 + i32.const 40 + i32.add + i64.const 0 + i64.store + local.get 1 + i32.const 32 + i32.add + i64.const 0 + i64.store + local.get 1 + i32.const 24 + i32.add + i64.const 0 + i64.store + local.get 1 + i64.const 0 + i64.store offset=16 + i32.const 0 + local.get 1 + i32.const 16 + i32.add + call 9 + i32.const 8 + br 2 (;@2;) + end + i32.const 1 + local.set 2 + i32.const 1 + local.set 3 + end + i32.const 6 + local.get 2 + br_if 0 (;@2;) + drop + local.get 3 + i32.eqz + br_if 1 (;@1;) + local.get 1 + i32.const 40 + i32.add + i64.const 0 + i64.store + local.get 1 + i32.const 32 + i32.add + i64.const 0 + i64.store + local.get 1 + i32.const 24 + i32.add + i64.const 0 + i64.store + local.get 1 + i64.const 0 + i64.store offset=16 + local.get 1 + i32.const 16 + i32.add + call 5 + i32.const 1 + i32.xor + local.get 1 + i32.const 16 + i32.add + call 9 + i32.const 8 + end + local.get 1 + i32.const 48 + i32.add + global.set 0 + return + end + local.get 1 + i32.const 40 + i32.add + i64.const 0 + i64.store + local.get 1 + i32.const 32 + i32.add + i64.const 0 + i64.store + local.get 1 + i32.const 24 + i32.add + i64.const 0 + i64.store + local.get 1 + i64.const 0 + i64.store offset=16 + local.get 1 + local.get 1 + i32.const 16 + i32.add + call 5 + i32.store8 offset=8 + local.get 1 + i32.const 8 + i32.add + call 12 + unreachable) + (func (;17;) (type 4) (result i32) + (local i32 i32 i64 i64) + global.get 0 + i32.const 32 + i32.sub + local.tee 0 + global.set 0 + local.get 0 + i32.const 16384 + i32.store offset=4 + local.get 0 + i32.const 65572 + i32.store + local.get 0 + i32.const 16384 + i32.store offset=16 + i32.const 65572 + local.get 0 + i32.const 16 + i32.add + call 2 + local.get 0 + local.get 0 + i32.load offset=16 + call 7 + local.get 0 + local.get 0 + i64.load + i64.store offset=8 + local.get 0 + i32.const 24 + i32.add + local.tee 1 + i64.const 0 + i64.store + local.get 0 + i64.const 0 + i64.store offset=16 + block (result i32) ;; label = @1 + i32.const 1 + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 16 + i32.add + i32.const 16 + call 18 + br_if 0 (;@1;) + drop + local.get 1 + i64.load + local.set 2 + local.get 0 + i64.load offset=16 + local.set 3 + i32.const 0 + end + local.get 2 + local.get 3 + i64.or + i64.eqz + i32.eqz + i32.or + i32.eqz + if ;; label = @1 + i32.const 1 + call 16 + local.get 0 + i32.const 32 + i32.add + global.set 0 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 65536 + i32.add + i32.load + return + end + unreachable) + (func (;18;) (type 5) (param i32 i32 i32) (result i32) + block ;; label = @1 + local.get 0 + i32.load offset=4 + local.get 2 + i32.ge_u + if (result i32) ;; label = @2 + local.get 1 + local.get 0 + i32.load + local.get 2 + call 20 + local.get 0 + i32.load offset=4 + local.tee 1 + local.get 2 + i32.lt_u + br_if 1 (;@1;) + local.get 0 + local.get 1 + local.get 2 + i32.sub + i32.store offset=4 + local.get 0 + local.get 0 + i32.load + local.get 2 + i32.add + i32.store + i32.const 0 + else + i32.const 1 + end + return + end + unreachable) + (func (;19;) (type 2) (param i32) + (local i32) + global.get 0 + i32.const 16 + i32.sub + local.tee 1 + global.set 0 + local.get 1 + local.get 0 + i32.load offset=4 + i32.store offset=12 + local.get 0 + i32.load + local.get 1 + i32.const 12 + i32.add + call 3 + local.get 0 + local.get 1 + i32.load offset=12 + call 7 + local.get 1 + i32.const 16 + i32.add + global.set 0) + (func (;20;) (type 1) (param i32 i32 i32) + (local i32) + loop (result i32) ;; label = @1 + local.get 2 + local.get 3 + i32.eq + if (result i32) ;; label = @2 + local.get 0 + else + local.get 0 + local.get 3 + i32.add + local.get 1 + local.get 3 + i32.add + i32.load8_u + i32.store8 + local.get 3 + i32.const 1 + i32.add + local.set 3 + br 1 (;@1;) + end + end + drop) + (global (;0;) (mut i32) (i32.const 65536)) + (export "deploy" (func 15)) + (export "call" (func 17)) + (data (;0;) (i32.const 65536) "\01\00\00\00\02\00\00\00\03\00\00\00\04\00\00\00\05\00\00\00\06\00\00\00\07\00\00\00\08")) diff --git a/pallets/template/src/benchmarking.rs b/pallets/template/src/benchmarking.rs index 12faa208..8f82b8f1 100644 --- a/pallets/template/src/benchmarking.rs +++ b/pallets/template/src/benchmarking.rs @@ -21,17 +21,54 @@ use super::*; -// use contract::{Module as Contracts, *}; +use contract::{BalanceOf, ConfigCache, Module as Contracts}; use frame_benchmarking::{benchmarks, whitelisted_caller}; +use frame_support::{traits::Currency, weights::Weight}; use frame_system::RawOrigin; +use sp_runtime::traits::{Bounded, CheckedDiv, Hash, Saturating, Zero}; use sp_std::prelude::*; benchmarks! { where_clause { where T::AccountId: UncheckedFrom, - T::AccountId: AsRef<[u8]>, + T::AccountId: AsRef<[u8]>, } - _ {} + _ {} + + test_contract { + let caller: T::AccountId = whitelisted_caller(); + let origin = RawOrigin::Signed(caller.clone()); + T::Currency::make_free_balance_be(&caller, BalanceOf::::max_value()); + + // Put WASM module + let module = include_bytes!(concat!(env!("OUT_DIR"), "/flip.wasm")).to_vec(); + let hash = T::Hashing::hash(&module); + >::put_code(origin.clone().into(), module)?; + + // storage_size cannot be zero because otherwise a contract that is just above + // the subsistence threshold does not pay rent given a large enough subsistence + // threshold. But we need rent payments to occur in order to benchmark for worst cases. + let storage_size = ConfigCache::::subsistence_threshold_uncached() + .checked_div(&T::RentDepositOffset::get()) + .unwrap_or_else(Zero::zero); + + // Endowment should be large but not as large to inhibit rent payments. + let endowment = T::RentDepositOffset::get() + .saturating_mul(storage_size + T::StorageSizeOffset::get().into()) + .saturating_sub(1u32.into()); + + >::instantiate( + origin.clone().into(), + endowment, // endowment + Weight::max_value(), // gas_limit + hash.clone(), // code_hash + [106, 55, 18, 226].to_vec(), // flip + b"".to_vec(), // salt + ).map_err(|_|>::InstantiateContractFailed)?; + + // Calculate addr + let addr = Contracts::::contract_address(&caller, &hash, &b"".to_vec()); + }: call(origin, addr, vec![192, 150, 165, 243]) wasm_bls12_377_add { let caller: T::AccountId = whitelisted_caller(); diff --git a/pallets/template/src/lib.rs b/pallets/template/src/lib.rs index c8aec4da..acb7e7a7 100644 --- a/pallets/template/src/lib.rs +++ b/pallets/template/src/lib.rs @@ -4,7 +4,9 @@ use contract::{CodeHash, Module as Contracts}; /// Edit this file to define custom logic or remove it if it is not needed. /// Learn more about FRAME and the core library of Substrate FRAME pallets: /// https://substrate.dev/docs/en/knowledgebase/runtime/frame -use frame_support::{decl_error, decl_event, decl_module, decl_storage, dispatch, traits::Get}; +use frame_support::{ + decl_error, decl_event, decl_module, decl_storage, dispatch, traits::Get, weights::Weight, +}; use sp_core::crypto::UncheckedFrom; use sp_runtime::traits::StaticLookup; use sp_std::vec::Vec; @@ -80,52 +82,19 @@ decl_module! { // Events must be initialized if they are used by the pallet. fn deposit_event() = default; - /// Put and instantiate code - #[weight = 10_000 + T::DbWeight::get().writes(1)] - pub fn put_code(origin, code: Vec) -> Result<(), dispatch::DispatchError> { - >::put_code(origin.clone(), code)?; - if let Some((code_hash, _)) = >::iter().last() { - >::set(code_hash.clone()); - Ok(()) - } else { - Err(>::ContractDisappeared.into()) - } - } - - /// Instantiate the code - #[weight = 10_000 + T::DbWeight::get().writes(1)] - pub fn instantiate(origin) -> Result<(), dispatch::DispatchError> { - if >::instantiate( - origin, - 0u32.into(), - 0, - >::get(), - b"".to_vec(), - b"".to_vec(), - ).is_err() { - Err(>::InstantiateContractFailed.into()) - } else { - Ok(()) - } - } - /// Call the contract #[weight = 10_000 + T::DbWeight::get().writes(1)] pub fn call( origin, - caller: T::AccountId, + addr: T::AccountId, data: Vec, ) -> dispatch::DispatchResultWithPostInfo { >::call( origin, - T::Lookup::unlookup(>::contract_address( - &caller, - &>::get(), - &b"".to_vec(), - )), - 0u32.into(), - 0, - data + T::Lookup::unlookup(addr), // contract address + 0u32.into(), // T::Currency::minimum_balance() * 100u32.into(), // value + Weight::max_value(), // gas_limit + data // fn ) } From c5d8a5fa356eefc50a5fa99d2bc9190ec00a491f Mon Sep 17 00:00:00 2001 From: clearloop Date: Thu, 17 Dec 2020 03:48:04 +0800 Subject: [PATCH 19/33] feat(frame/template): patch the wat file --- pallets/template/Cargo.toml | 2 +- pallets/template/build.rs | 11 +++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/pallets/template/Cargo.toml b/pallets/template/Cargo.toml index 9b82c363..e91c9e57 100644 --- a/pallets/template/Cargo.toml +++ b/pallets/template/Cargo.toml @@ -38,7 +38,7 @@ package = "pallet-contracts" path = "../../vendor/substrate/frame/contracts" default-features = false -[dev-dependencies] +[build-dependencies] wat = "1.0" [features] diff --git a/pallets/template/build.rs b/pallets/template/build.rs index cfd72c6b..544df3f4 100644 --- a/pallets/template/build.rs +++ b/pallets/template/build.rs @@ -1,10 +1,17 @@ //! Use *.wat file for human readable -use std::{env, fs, io::Result, path::Path}; +use std::{ + env, fs, + io::{Error, Result}, + path::Path, +}; fn main() -> Result<()> { let out_dir = env::var_os("OUT_DIR").unwrap(); let dest_path = Path::new(&out_dir).join("flip.wasm"); - fs::write(&dest_path, fs::read("flip.wat")?)?; + fs::write( + &dest_path, + wat::parse_file("flip.wat").map_err(|_| Error::last_os_error())?, + )?; println!("cargo:rerun-if-changed=build.rs"); Ok(()) } From b6e2a1ad349057af3729bb7853bad2590254b871 Mon Sep 17 00:00:00 2001 From: clearloop Date: Thu, 17 Dec 2020 12:05:07 +0800 Subject: [PATCH 20/33] (primitives/io): update the usage of func id --- Cargo.lock | 2 +- primitives/chain-extension/src/lib.rs | 41 +++------------------------ primitives/io/src/groth16.rs | 13 +++++---- primitives/io/src/lib.rs | 35 ++++++++++++++--------- 4 files changed, 34 insertions(+), 57 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d7239c13..05645deb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3646,7 +3646,7 @@ checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" [[package]] name = "megaclite-arkworks" version = "0.1.0" -source = "git+https://github.com/patractlabs/megaclite.git#aa83b083d2d3fbac358edb4a1d048d094f3dfe30" +source = "git+https://github.com/patractlabs/megaclite.git#cb5277ac81b36951e79cb4e1c6e29f0ccdd695fa" dependencies = [ "ark-bls12-377", "ark-bls12-381", diff --git a/primitives/chain-extension/src/lib.rs b/primitives/chain-extension/src/lib.rs index 0ec3bcf0..d16627a6 100644 --- a/primitives/chain-extension/src/lib.rs +++ b/primitives/chain-extension/src/lib.rs @@ -9,15 +9,6 @@ use pallet_contracts::{ use sp_runtime::DispatchError; use sp_std::vec::Vec; -/// Convert bool to bytes, 0 for true, 1 for false -fn b2b(b: bool) -> Vec { - if b { - Vec::from([0]) - } else { - Vec::from([1]) - } -} - /// The chain Extension of Jupiter pub struct JupiterExt; @@ -30,34 +21,10 @@ impl ChainExtension for JupiterExt { let mut input = dimmy.as_mut_slice(); let mut env = env.buf_in_buf_out(); env.read_into(&mut &mut input)?; - if let Some(output) = match func_id { - // Use runtime interfaces - 0x2a => jupiter_io::pairing::add(0x2a, input), - 0x2b => jupiter_io::pairing::add(0x2b, input), - 0x2c => jupiter_io::pairing::add(0x2c, input), - 0x2d => jupiter_io::pairing::add(0x2d, input), - 0x3a => jupiter_io::pairing::mul(0x2a, input), - 0x3b => jupiter_io::pairing::mul(0x2b, input), - 0x3c => jupiter_io::pairing::mul(0x2c, input), - 0x3d => jupiter_io::pairing::mul(0x2d, input), - 0x4a => jupiter_io::pairing::pairing(0x2a, input).map(b2b), - 0x4b => jupiter_io::pairing::pairing(0x2b, input).map(b2b), - 0x4c => jupiter_io::pairing::pairing(0x2c, input).map(b2b), - 0x4d => jupiter_io::pairing::pairing(0x2d, input).map(b2b), - // Use megaclite - 0x5a => curve::add(0x2a, input).ok(), - 0x5b => curve::add(0x2b, input).ok(), - 0x5c => curve::add(0x2c, input).ok(), - 0x5d => curve::add(0x2d, input).ok(), - 0x6a => curve::mul(0x2a, input).ok(), - 0x6b => curve::mul(0x2b, input).ok(), - 0x6c => curve::mul(0x2c, input).ok(), - 0x6d => curve::mul(0x2d, input).ok(), - 0x7a => curve::pairing(0x2a, input).map(b2b).ok(), - 0x7b => curve::pairing(0x2b, input).map(b2b).ok(), - 0x7c => curve::pairing(0x2c, input).map(b2b).ok(), - 0x7d => curve::pairing(0x2d, input).map(b2b).ok(), - _ => return Err(Error::::NoChainExtension.into()), + if let Some(output) = if jupiter_io::pairing::wasm() { + curve::call(func_id, input).ok() + } else { + jupiter_io::pairing::call(func_id, input) } { env.write(&output, false, None)?; Ok(RetVal::Converging(0)) diff --git a/primitives/io/src/groth16.rs b/primitives/io/src/groth16.rs index 759520e1..7b116270 100644 --- a/primitives/io/src/groth16.rs +++ b/primitives/io/src/groth16.rs @@ -6,7 +6,7 @@ use sp_std::vec::Vec; /// Groth16 verification pub fn verify( - curve_id: i32, + curve_id: u32, vk_gamma_abc: &[&[u8]], vk: &[u8], proof: &[u8], @@ -42,7 +42,7 @@ pub fn verify( /// Groth16 verification inner fn inner_verify( - curve_id: i32, + curve_id: u32, vk_gamma_abc: &[&[u8]], vk: &[u8], proof: &[u8], @@ -70,14 +70,14 @@ fn inner_verify( mul_input[0..g1_len].copy_from_slice(b); mul_input[g1_len..g1_len + scalar_len].copy_from_slice(i); - let mul_ic = super::pairing::mul(curve_id, &mul_input) + let mul_ic = super::pairing::call(0x3a + curve_id, &mul_input) .ok_or_else(|| Error::new(ErrorKind::Other, "Mul Failed"))?; let mut acc_mul_ic = Vec::with_capacity(g1_len * 2); acc_mul_ic[0..g1_len].copy_from_slice(acc.as_ref()); acc_mul_ic[g1_len..g1_len * 2].copy_from_slice(mul_ic.as_ref()); - acc = super::pairing::add(curve_id, &*acc_mul_ic) + acc = super::pairing::call(0x2a + curve_id, &*acc_mul_ic) .ok_or_else(|| Error::new(ErrorKind::Other, "Add Failed"))?; } @@ -128,8 +128,9 @@ fn inner_verify( // Return the result of computing the pairing check // e(p1[0], p2[0]) * .... * e(p1[n], p2[n]) == 1. // For example pairing([P1(), P1().negate()], [P2(), P2()]) should return true. - Ok(super::pairing::pairing(curve_id, &input[..]) - .ok_or_else(|| Error::new(ErrorKind::Other, "Add Failed"))?) + Ok(super::pairing::call(0x4a + curve_id, &input[..]) + .ok_or_else(|| Error::new(ErrorKind::Other, "Add Failed"))?[0] + == 0) } fn negate_y_based_curve(y: BigUint, prime_field: &'static str) -> Result { diff --git a/primitives/io/src/lib.rs b/primitives/io/src/lib.rs index 3f422cca..8b4c4d86 100644 --- a/primitives/io/src/lib.rs +++ b/primitives/io/src/lib.rs @@ -9,19 +9,28 @@ pub mod groth16; /// Pairing runtime interface #[runtime_interface] pub trait Pairing { - /// Vector Addition - fn add(curve_id: i32, input: &[u8]) -> Option> { - curve::add(curve_id, input).ok() - } - - /// Scalar Multiplication - fn mul(curve_id: i32, input: &[u8]) -> Option> { - curve::mul(curve_id, input).ok() - } - - /// Pairing - fn pairing(curve_id: i32, input: &[u8]) -> Option { - curve::pairing(curve_id, input).ok() + fn wasm() -> bool { + if let Ok(mode) = ::std::env::var("JIO_MODE") { + if mode.to_uppercase() == "WASM" { + return true; + } + } + + false + } + + /// Curve calls + /// + /// add 0x2a + /// mul 0x3a + /// pairing 0x4a + /// + /// bls12_377 0 + /// bls12_181 1 + /// bn254 2 + /// bw6_761 3 + fn call(func_id: u32, input: &[u8]) -> Option> { + curve::call(func_id, input).ok() } fn bls12_377_add() { From 81e7d958650e3837d700aa432d7dc3bf1f444575 Mon Sep 17 00:00:00 2001 From: clearloop Date: Thu, 17 Dec 2020 12:14:01 +0800 Subject: [PATCH 21/33] fix(primitives/io): fix the curve id in groth16 --- primitives/io/src/groth16.rs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/primitives/io/src/groth16.rs b/primitives/io/src/groth16.rs index 7b116270..4764858c 100644 --- a/primitives/io/src/groth16.rs +++ b/primitives/io/src/groth16.rs @@ -13,24 +13,22 @@ pub fn verify( public_inputs: &[&[u8]], ) -> Result { match curve_id { - 0x2a => inner_verify::( + 0 => inner_verify::( curve_id, vk_gamma_abc, vk, proof, public_inputs, ), - 0x2b => inner_verify::( + 1 => inner_verify::( curve_id, vk_gamma_abc, vk, proof, public_inputs, ), - 0x2c => { - inner_verify::(curve_id, vk_gamma_abc, vk, proof, public_inputs) - } - 0x2d => { + 2 => inner_verify::(curve_id, vk_gamma_abc, vk, proof, public_inputs), + 3 => { inner_verify::(curve_id, vk_gamma_abc, vk, proof, public_inputs) } _ => Err(SerializationError::IoError(Error::new( From a93254f852bf57b59a191e991511bd4836b52a5f Mon Sep 17 00:00:00 2001 From: clearloop Date: Fri, 18 Dec 2020 20:48:22 +0800 Subject: [PATCH 22/33] feat(pallets/contract): add test data for the benchmark of bls12_377_verify --- Cargo.lock | 27 +- bin/node-dev/cli/Cargo.toml | 2 +- pallets/template/Cargo.toml | 5 +- pallets/template/build.rs | 1 + pallets/template/flip.wat | 958 --- pallets/template/groth16.wat | 8524 ++++++++++++++++++++++++++ pallets/template/metadata.json | 274 + pallets/template/src/benchmarking.rs | 2 +- primitives/io/Cargo.toml | 3 +- primitives/io/src/lib.rs | 2 +- 10 files changed, 8831 insertions(+), 967 deletions(-) delete mode 100644 pallets/template/flip.wat create mode 100644 pallets/template/groth16.wat create mode 100644 pallets/template/metadata.json diff --git a/Cargo.lock b/Cargo.lock index 05645deb..da072292 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2690,7 +2690,7 @@ name = "jupiter-chain-extension" version = "0.1.0" dependencies = [ "jupiter-io", - "megaclite-arkworks", + "megaclite-arkworks 0.1.0 (git+https://github.com/patractlabs/megaclite.git)", "pallet-contracts 2.0.0", "sp-runtime", "sp-std", @@ -2832,7 +2832,7 @@ dependencies = [ name = "jupiter-io" version = "0.2.0" dependencies = [ - "megaclite-arkworks", + "megaclite-arkworks 0.1.0", "num-bigint 0.3.1", "num-traits", "sp-runtime-interface", @@ -3646,7 +3646,6 @@ checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" [[package]] name = "megaclite-arkworks" version = "0.1.0" -source = "git+https://github.com/patractlabs/megaclite.git#cb5277ac81b36951e79cb4e1c6e29f0ccdd695fa" dependencies = [ "ark-bls12-377", "ark-bls12-381", @@ -3660,6 +3659,25 @@ dependencies = [ "ark-serialize", "ark-std", "num-bigint 0.3.1", + "rand 0.7.3", + "rustc-hex", +] + +[[package]] +name = "megaclite-arkworks" +version = "0.1.0" +source = "git+https://github.com/patractlabs/megaclite.git#cb5277ac81b36951e79cb4e1c6e29f0ccdd695fa" +dependencies = [ + "ark-bls12-377", + "ark-bls12-381", + "ark-bn254", + "ark-bw6-761", + "ark-cp6-782", + "ark-ec", + "ark-ff", + "ark-serialize", + "ark-std", + "num-bigint 0.3.1", "num-traits", "rand 0.7.3", "rustc-hex", @@ -4530,8 +4548,9 @@ dependencies = [ "frame-benchmarking", "frame-support", "frame-system", + "hex", "jupiter-io", - "megaclite-arkworks", + "megaclite-arkworks 0.1.0", "pallet-contracts 2.0.0", "parity-scale-codec", "sp-core", diff --git a/bin/node-dev/cli/Cargo.toml b/bin/node-dev/cli/Cargo.toml index e079ebb8..05b123a0 100644 --- a/bin/node-dev/cli/Cargo.toml +++ b/bin/node-dev/cli/Cargo.toml @@ -14,7 +14,7 @@ structopt = "0.3.8" parking_lot = "0.10.0" serde_json = "1.0" -sc-cli = { version = "0.8.0", git = "https://github.com/paritytech/substrate", branch = "master" } +sc-cli = { version = "0.8.0", git = "https://github.com/paritytech/substrate", branch = "master", features = ["wasmtime"] } sp-core = { version = "2.0.0", git = "https://github.com/paritytech/substrate", branch = "master" } sc-executor = { version = "0.8.0", git = "https://github.com/paritytech/substrate", branch = "master" } sc-service = { version = "0.8.0", git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/pallets/template/Cargo.toml b/pallets/template/Cargo.toml index e91c9e57..73378910 100644 --- a/pallets/template/Cargo.toml +++ b/pallets/template/Cargo.toml @@ -21,6 +21,7 @@ sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", sp-io = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false} sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false} sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false} +hex = { version = "0.4.2", optional = true, default-features = false } [dependencies.jupiter-io] package = "jupiter-io" @@ -29,7 +30,8 @@ default-features = false [dependencies.curve] package = "megaclite-arkworks" -git = "https://github.com/patractlabs/megaclite.git" +path = "/Users/mercury/code/megaclite/crates/curve/arkworks" +# git = "https://github.com/patractlabs/megaclite.git" features = ["tests"] default-features = false @@ -53,6 +55,7 @@ std = [ 'sp-std/std', ] runtime-benchmarks = [ + "hex", "frame-benchmarking", 'frame-system/runtime-benchmarks', 'frame-support/runtime-benchmarks', diff --git a/pallets/template/build.rs b/pallets/template/build.rs index 544df3f4..60301688 100644 --- a/pallets/template/build.rs +++ b/pallets/template/build.rs @@ -6,6 +6,7 @@ use std::{ }; fn main() -> Result<()> { + println!("cargo:rerun-if-changed=groth16.wat"); let out_dir = env::var_os("OUT_DIR").unwrap(); let dest_path = Path::new(&out_dir).join("flip.wasm"); fs::write( diff --git a/pallets/template/flip.wat b/pallets/template/flip.wat deleted file mode 100644 index 52509949..00000000 --- a/pallets/template/flip.wat +++ /dev/null @@ -1,958 +0,0 @@ -(module - (type (;0;) (func (param i32 i32))) - (type (;1;) (func (param i32 i32 i32))) - (type (;2;) (func (param i32))) - (type (;3;) (func (param i32) (result i32))) - (type (;4;) (func (result i32))) - (type (;5;) (func (param i32 i32 i32) (result i32))) - (type (;6;) (func (param i32 i32 i32 i32))) - (type (;7;) (func (param i32) (result i64))) - (import "seal0" "seal_get_storage" (func (;0;) (type 5))) - (import "seal0" "seal_set_storage" (func (;1;) (type 1))) - (import "seal0" "seal_value_transferred" (func (;2;) (type 0))) - (import "seal0" "seal_input" (func (;3;) (type 0))) - (import "seal0" "seal_return" (func (;4;) (type 1))) - (import "env" "memory" (memory (;0;) 2 16)) - (func (;5;) (type 3) (param i32) (result i32) - (local i32) - global.get 0 - i32.const -64 - i32.add - local.tee 1 - global.set 0 - local.get 1 - i32.const 32 - i32.add - local.get 0 - i32.const 24 - i32.add - i64.load - i64.store - local.get 1 - i32.const 24 - i32.add - local.get 0 - i32.const 16 - i32.add - i64.load - i64.store - local.get 1 - i32.const 16 - i32.add - local.get 0 - i32.const 8 - i32.add - i64.load - i64.store - local.get 1 - i64.const 0 - i64.store offset=40 - local.get 1 - local.get 0 - i64.load - i64.store offset=8 - local.get 1 - i32.const 8 - i32.add - call 6 - local.get 1 - i32.const 16384 - i32.store offset=52 - local.get 1 - i32.const 65572 - i32.store offset=48 - local.get 1 - i32.const 16384 - i32.store offset=56 - i32.const 65572 - local.get 1 - i32.const 56 - i32.add - call 0 - local.set 0 - local.get 1 - i32.const 48 - i32.add - local.get 1 - i32.load offset=56 - call 7 - block ;; label = @1 - block ;; label = @2 - block ;; label = @3 - block ;; label = @4 - block ;; label = @5 - local.get 0 - br_table 1 (;@4;) 0 (;@5;) 0 (;@5;) 2 (;@3;) 0 (;@5;) - end - unreachable - end - local.get 1 - local.get 1 - i64.load offset=48 - i64.store offset=56 - local.get 1 - local.get 1 - i32.const 56 - i32.add - call 8 - block ;; label = @4 - local.get 1 - i32.load8_u - i32.const 1 - i32.and - br_if 0 (;@4;) - i32.const 0 - local.set 0 - local.get 1 - i32.load8_u offset=1 - br_table 3 (;@1;) 2 (;@2;) 0 (;@4;) - end - unreachable - end - unreachable - end - i32.const 1 - local.set 0 - end - local.get 1 - i32.const -64 - i32.sub - global.set 0 - local.get 0) - (func (;6;) (type 3) (param i32) (result i32) - (local i64 i64 i64) - local.get 0 - i64.load offset=32 - local.set 1 - local.get 0 - i64.const 1 - i64.store offset=32 - local.get 0 - local.get 1 - local.get 0 - i64.load - local.tee 2 - i64.add - local.tee 1 - i64.store - local.get 0 - local.get 0 - i64.load offset=8 - local.tee 3 - local.get 1 - local.get 2 - i64.lt_u - i64.extend_i32_u - i64.add - local.tee 1 - i64.store offset=8 - local.get 0 - local.get 0 - i64.load offset=16 - local.tee 2 - local.get 1 - local.get 3 - i64.lt_u - i64.extend_i32_u - i64.add - local.tee 1 - i64.store offset=16 - local.get 0 - local.get 0 - i64.load offset=24 - local.get 1 - local.get 2 - i64.lt_u - i64.extend_i32_u - i64.add - i64.store offset=24 - local.get 0) - (func (;7;) (type 0) (param i32 i32) - (local i32 i32 i32) - global.get 0 - i32.const 16 - i32.sub - local.tee 2 - global.set 0 - local.get 0 - i32.load offset=4 - local.set 3 - local.get 0 - i32.const 0 - i32.store offset=4 - local.get 0 - i32.load - local.set 4 - local.get 0 - i32.const 65572 - i32.store - local.get 2 - i32.const 8 - i32.add - local.get 1 - local.get 4 - local.get 3 - call 14 - local.get 0 - local.get 2 - i64.load offset=8 - i64.store align=4 - local.get 2 - i32.const 16 - i32.add - global.set 0) - (func (;8;) (type 0) (param i32 i32) - (local i32 i32) - global.get 0 - i32.const 16 - i32.sub - local.tee 2 - global.set 0 - local.get 2 - i32.const 0 - i32.store8 offset=15 - block ;; label = @1 - local.get 1 - local.get 2 - i32.const 15 - i32.add - i32.const 1 - call 18 - i32.eqz - if ;; label = @2 - local.get 2 - i32.load8_u offset=15 - local.set 1 - br 1 (;@1;) - end - i32.const 1 - local.set 3 - end - local.get 0 - local.get 1 - i32.store8 offset=1 - local.get 0 - local.get 3 - i32.store8 - local.get 2 - i32.const 16 - i32.add - global.set 0) - (func (;9;) (type 0) (param i32 i32) - (local i32) - global.get 0 - i32.const -64 - i32.add - local.tee 2 - global.set 0 - local.get 2 - i32.const 32 - i32.add - local.get 1 - i32.const 24 - i32.add - i64.load - i64.store - local.get 2 - i32.const 24 - i32.add - local.get 1 - i32.const 16 - i32.add - i64.load - i64.store - local.get 2 - i32.const 16 - i32.add - local.get 1 - i32.const 8 - i32.add - i64.load - i64.store - local.get 2 - i64.const 0 - i64.store offset=40 - local.get 2 - local.get 1 - i64.load - i64.store offset=8 - local.get 2 - i32.const 8 - i32.add - call 6 - local.get 2 - i32.const 56 - i32.add - i32.const 16384 - i32.store - local.get 2 - i32.const 65572 - i32.store offset=52 - local.get 2 - i32.const 0 - i32.store offset=48 - local.get 2 - local.get 2 - i32.const 48 - i32.add - local.get 0 - call 10 - local.get 2 - i32.load - local.get 2 - i32.load offset=4 - call 1 - local.get 2 - i32.const -64 - i32.sub - global.set 0) - (func (;10;) (type 1) (param i32 i32 i32) - (local i32 i32 i32) - global.get 0 - i32.const 16 - i32.sub - local.tee 3 - global.set 0 - local.get 1 - i32.const 8 - i32.add - local.tee 4 - i32.load - local.set 5 - local.get 4 - i32.const 0 - i32.store - local.get 1 - i32.load offset=4 - local.set 4 - local.get 1 - i32.const 65572 - i32.store offset=4 - local.get 3 - local.get 2 - i32.store8 offset=15 - local.get 3 - i32.const 1 - local.get 4 - local.get 5 - call 14 - block ;; label = @1 - local.get 3 - i32.load offset=4 - i32.const 1 - i32.eq - if ;; label = @2 - local.get 3 - i32.load - local.get 3 - i32.load8_u offset=15 - i32.store8 - local.get 1 - i32.const 0 - i32.store offset=8 - local.get 1 - i32.const 65572 - i32.store offset=4 - local.get 5 - i32.eqz - br_if 1 (;@1;) - local.get 1 - local.get 5 - i32.const -1 - i32.add - i32.store offset=8 - local.get 1 - local.get 4 - i32.const 1 - i32.add - i32.store offset=4 - local.get 0 - i32.const 1 - i32.store offset=4 - local.get 0 - local.get 4 - i32.store - local.get 3 - i32.const 16 - i32.add - global.set 0 - return - end - unreachable - end - unreachable) - (func (;11;) (type 7) (param i32) (result i64) - (local i32 i32) - global.get 0 - i32.const 16 - i32.sub - local.tee 1 - global.set 0 - local.get 1 - i64.const 0 - i64.store8 offset=12 - local.get 1 - i64.const 0 - i64.store32 offset=8 - block (result i32) ;; label = @1 - loop ;; label = @2 - local.get 2 - i32.const 4 - i32.eq - if ;; label = @3 - local.get 1 - i64.load8_u offset=12 - i32.wrap_i64 - i32.const 4 - i32.lt_u - local.set 2 - local.get 1 - i32.load offset=8 - br 2 (;@1;) - end - local.get 1 - local.get 0 - call 8 - local.get 1 - i32.load8_u - i32.const 1 - i32.and - i32.eqz - if ;; label = @3 - local.get 1 - i32.const 8 - i32.add - local.get 2 - i32.add - local.get 1 - i32.load8_u offset=1 - i32.store8 - local.get 1 - local.get 2 - i32.const 1 - i32.add - local.tee 2 - i32.store8 offset=12 - br 1 (;@2;) - end - end - local.get 2 - i32.const 255 - i32.and - if ;; label = @2 - local.get 1 - i32.const 0 - i32.store8 offset=12 - end - i32.const 1 - local.set 2 - i32.const 0 - end - local.set 0 - local.get 1 - i32.const 16 - i32.add - global.set 0 - local.get 2 - i64.extend_i32_u - local.get 0 - i64.extend_i32_u - i64.const 8 - i64.shl - i64.or) - (func (;12;) (type 2) (param i32) - (local i32) - global.get 0 - i32.const 16 - i32.sub - local.tee 1 - global.set 0 - local.get 1 - local.get 0 - i32.store offset=12 - local.get 1 - i32.const 12 - i32.add - i32.load - i32.load8_u - call 13 - unreachable) - (func (;13;) (type 2) (param i32) - (local i32) - global.get 0 - i32.const 32 - i32.sub - local.tee 1 - global.set 0 - local.get 1 - i32.const 24 - i32.add - i32.const 16384 - i32.store - local.get 1 - i32.const 65572 - i32.store offset=20 - local.get 1 - i32.const 0 - i32.store offset=16 - local.get 1 - i32.const 8 - i32.add - local.get 1 - i32.const 16 - i32.add - local.get 0 - call 10 - i32.const 0 - local.get 1 - i32.load offset=8 - local.get 1 - i32.load offset=12 - call 4 - unreachable) - (func (;14;) (type 6) (param i32 i32 i32 i32) - i32.const 0 - local.get 1 - i32.le_u - if ;; label = @1 - local.get 3 - local.get 1 - i32.ge_u - if ;; label = @2 - local.get 0 - local.get 1 - i32.store offset=4 - local.get 0 - local.get 2 - i32.store - return - end - unreachable - end - unreachable) - (func (;15;) (type 4) (result i32) - i32.const 0 - call 16 - i32.const 255 - i32.and - i32.const 2 - i32.shl - i32.const 65536 - i32.add - i32.load) - (func (;16;) (type 3) (param i32) (result i32) - (local i32 i32 i32 i32 i32 i64) - global.get 0 - i32.const 48 - i32.sub - local.tee 1 - global.set 0 - block ;; label = @1 - block (result i32) ;; label = @2 - block ;; label = @3 - block ;; label = @4 - local.get 0 - if ;; label = @5 - local.get 1 - i32.const 16384 - i32.store offset=12 - local.get 1 - i32.const 65572 - i32.store offset=8 - local.get 1 - i32.const 8 - i32.add - call 19 - local.get 1 - local.get 1 - i64.load offset=8 - i64.store offset=16 - i32.const 1 - local.set 3 - local.get 1 - i32.const 16 - i32.add - call 11 - local.tee 6 - i32.wrap_i64 - local.tee 4 - i32.const 1 - i32.and - if ;; label = @6 - i32.const 1 - local.set 2 - br 3 (;@3;) - end - local.get 6 - i64.const 1099511627775 - i64.and - local.tee 6 - i64.const 32 - i64.shr_u - i32.wrap_i64 - local.set 0 - local.get 6 - i64.const 24 - i64.shr_u - i32.wrap_i64 - local.set 5 - local.get 6 - i64.const 16 - i64.shr_u - i32.wrap_i64 - local.set 2 - local.get 4 - i32.const 8 - i32.shr_u - i32.const 255 - i32.and - local.tee 4 - i32.const 30 - i32.ne - if ;; label = @6 - local.get 4 - i32.const 192 - i32.ne - local.get 0 - i32.const 243 - i32.ne - i32.or - local.get 2 - i32.const 255 - i32.and - i32.const 150 - i32.ne - i32.or - br_if 2 (;@4;) - i32.const 0 - local.set 2 - local.get 5 - i32.const 255 - i32.and - i32.const 165 - i32.eq - br_if 3 (;@3;) - br 2 (;@4;) - end - local.get 0 - i32.const 86 - i32.ne - local.get 2 - i32.const 255 - i32.and - i32.const 92 - i32.ne - i32.or - br_if 1 (;@4;) - i32.const 0 - local.set 2 - i32.const 0 - local.set 3 - local.get 5 - i32.const 255 - i32.and - i32.const 164 - i32.ne - br_if 1 (;@4;) - br 2 (;@3;) - end - local.get 1 - i32.const 16384 - i32.store offset=12 - local.get 1 - i32.const 65572 - i32.store offset=8 - local.get 1 - i32.const 8 - i32.add - call 19 - local.get 1 - local.get 1 - i64.load offset=8 - i64.store offset=16 - i32.const 6 - local.get 1 - i32.const 16 - i32.add - call 11 - i64.const 1099511627521 - i64.and - i64.const 970968230400 - i64.ne - br_if 2 (;@2;) - drop - local.get 1 - i32.const 40 - i32.add - i64.const 0 - i64.store - local.get 1 - i32.const 32 - i32.add - i64.const 0 - i64.store - local.get 1 - i32.const 24 - i32.add - i64.const 0 - i64.store - local.get 1 - i64.const 0 - i64.store offset=16 - i32.const 0 - local.get 1 - i32.const 16 - i32.add - call 9 - i32.const 8 - br 2 (;@2;) - end - i32.const 1 - local.set 2 - i32.const 1 - local.set 3 - end - i32.const 6 - local.get 2 - br_if 0 (;@2;) - drop - local.get 3 - i32.eqz - br_if 1 (;@1;) - local.get 1 - i32.const 40 - i32.add - i64.const 0 - i64.store - local.get 1 - i32.const 32 - i32.add - i64.const 0 - i64.store - local.get 1 - i32.const 24 - i32.add - i64.const 0 - i64.store - local.get 1 - i64.const 0 - i64.store offset=16 - local.get 1 - i32.const 16 - i32.add - call 5 - i32.const 1 - i32.xor - local.get 1 - i32.const 16 - i32.add - call 9 - i32.const 8 - end - local.get 1 - i32.const 48 - i32.add - global.set 0 - return - end - local.get 1 - i32.const 40 - i32.add - i64.const 0 - i64.store - local.get 1 - i32.const 32 - i32.add - i64.const 0 - i64.store - local.get 1 - i32.const 24 - i32.add - i64.const 0 - i64.store - local.get 1 - i64.const 0 - i64.store offset=16 - local.get 1 - local.get 1 - i32.const 16 - i32.add - call 5 - i32.store8 offset=8 - local.get 1 - i32.const 8 - i32.add - call 12 - unreachable) - (func (;17;) (type 4) (result i32) - (local i32 i32 i64 i64) - global.get 0 - i32.const 32 - i32.sub - local.tee 0 - global.set 0 - local.get 0 - i32.const 16384 - i32.store offset=4 - local.get 0 - i32.const 65572 - i32.store - local.get 0 - i32.const 16384 - i32.store offset=16 - i32.const 65572 - local.get 0 - i32.const 16 - i32.add - call 2 - local.get 0 - local.get 0 - i32.load offset=16 - call 7 - local.get 0 - local.get 0 - i64.load - i64.store offset=8 - local.get 0 - i32.const 24 - i32.add - local.tee 1 - i64.const 0 - i64.store - local.get 0 - i64.const 0 - i64.store offset=16 - block (result i32) ;; label = @1 - i32.const 1 - local.get 0 - i32.const 8 - i32.add - local.get 0 - i32.const 16 - i32.add - i32.const 16 - call 18 - br_if 0 (;@1;) - drop - local.get 1 - i64.load - local.set 2 - local.get 0 - i64.load offset=16 - local.set 3 - i32.const 0 - end - local.get 2 - local.get 3 - i64.or - i64.eqz - i32.eqz - i32.or - i32.eqz - if ;; label = @1 - i32.const 1 - call 16 - local.get 0 - i32.const 32 - i32.add - global.set 0 - i32.const 255 - i32.and - i32.const 2 - i32.shl - i32.const 65536 - i32.add - i32.load - return - end - unreachable) - (func (;18;) (type 5) (param i32 i32 i32) (result i32) - block ;; label = @1 - local.get 0 - i32.load offset=4 - local.get 2 - i32.ge_u - if (result i32) ;; label = @2 - local.get 1 - local.get 0 - i32.load - local.get 2 - call 20 - local.get 0 - i32.load offset=4 - local.tee 1 - local.get 2 - i32.lt_u - br_if 1 (;@1;) - local.get 0 - local.get 1 - local.get 2 - i32.sub - i32.store offset=4 - local.get 0 - local.get 0 - i32.load - local.get 2 - i32.add - i32.store - i32.const 0 - else - i32.const 1 - end - return - end - unreachable) - (func (;19;) (type 2) (param i32) - (local i32) - global.get 0 - i32.const 16 - i32.sub - local.tee 1 - global.set 0 - local.get 1 - local.get 0 - i32.load offset=4 - i32.store offset=12 - local.get 0 - i32.load - local.get 1 - i32.const 12 - i32.add - call 3 - local.get 0 - local.get 1 - i32.load offset=12 - call 7 - local.get 1 - i32.const 16 - i32.add - global.set 0) - (func (;20;) (type 1) (param i32 i32 i32) - (local i32) - loop (result i32) ;; label = @1 - local.get 2 - local.get 3 - i32.eq - if (result i32) ;; label = @2 - local.get 0 - else - local.get 0 - local.get 3 - i32.add - local.get 1 - local.get 3 - i32.add - i32.load8_u - i32.store8 - local.get 3 - i32.const 1 - i32.add - local.set 3 - br 1 (;@1;) - end - end - drop) - (global (;0;) (mut i32) (i32.const 65536)) - (export "deploy" (func 15)) - (export "call" (func 17)) - (data (;0;) (i32.const 65536) "\01\00\00\00\02\00\00\00\03\00\00\00\04\00\00\00\05\00\00\00\06\00\00\00\07\00\00\00\08")) diff --git a/pallets/template/groth16.wat b/pallets/template/groth16.wat new file mode 100644 index 00000000..41bb845c --- /dev/null +++ b/pallets/template/groth16.wat @@ -0,0 +1,8524 @@ +(module + (type (;0;) (func (param i32 i32))) + (type (;1;) (func (param i32 i32 i32))) + (type (;2;) (func (param i32))) + (type (;3;) (func (param i32 i32 i32 i32))) + (type (;4;) (func (param i32 i32 i32) (result i32))) + (type (;5;) (func (param i32 i32) (result i32))) + (type (;6;) (func (param i32 i32 i32 i32) (result i32))) + (type (;7;) (func (result i32))) + (type (;8;) (func (param i32) (result i32))) + (type (;9;) (func (param i32 i32 i32 i32 i32))) + (type (;10;) (func (param i32 i32 i32 i32 i32 i32))) + (type (;11;) (func (param i32 i32 i32 i32 i32) (result i32))) + (type (;12;) (func (param i32) (result i64))) + (import "seal0" "seal_value_transferred" (func (;0;) (type 0))) + (import "seal0" "seal_input" (func (;1;) (type 0))) + (import "seal0" "seal_return" (func (;2;) (type 1))) + (import "seal0" "seal_call_chain_extension" (func (;3;) (type 11))) + (import "env" "memory" (memory (;0;) 2 16)) + (func (;4;) (type 2) (param i32) + local.get 0 + call 5 + local.get 0 + call 6) + (func (;5;) (type 2) (param i32) + (local i32) + local.get 0 + i32.load offset=8 + i32.const 12 + i32.mul + local.set 1 + local.get 0 + i32.load + local.set 0 + loop ;; label = @1 + local.get 1 + if ;; label = @2 + local.get 1 + i32.const -12 + i32.add + local.set 1 + local.get 0 + call 26 + local.get 0 + i32.const 12 + i32.add + local.set 0 + br 1 (;@1;) + end + end) + (func (;6;) (type 2) (param i32) + (local i32 i32) + global.get 0 + i32.const 16 + i32.sub + local.tee 1 + global.set 0 + local.get 1 + local.get 0 + call 42 + block ;; label = @1 + local.get 1 + i32.load + local.tee 0 + i32.eqz + br_if 0 (;@1;) + local.get 1 + i32.load offset=4 + local.tee 2 + i32.eqz + br_if 0 (;@1;) + local.get 0 + local.get 2 + call 8 + end + local.get 1 + i32.const 16 + i32.add + global.set 0) + (func (;7;) (type 2) (param i32) + (local i32 i32) + block ;; label = @1 + local.get 0 + i32.load8_u + i32.eqz + br_if 0 (;@1;) + local.get 0 + i32.const 4 + i32.add + i32.load8_u + br_if 0 (;@1;) + local.get 0 + i32.const 8 + i32.add + i32.load8_u + local.tee 1 + i32.const 7 + i32.and + i32.const 4 + i32.le_u + i32.const 0 + local.get 1 + i32.const 1 + i32.ne + select + br_if 0 (;@1;) + local.get 0 + i32.const 12 + i32.add + i32.load + local.tee 1 + i32.load + local.get 1 + i32.load offset=4 + i32.load + call_indirect (type 2) + local.get 1 + i32.load offset=4 + i32.load offset=4 + local.tee 2 + if ;; label = @2 + local.get 1 + i32.load + local.get 2 + call 8 + end + local.get 0 + i32.load offset=12 + i32.const 12 + call 8 + end) + (func (;8;) (type 0) (param i32 i32) + local.get 0 + local.get 1 + call 37) + (func (;9;) (type 12) (param i32) (result i64) + (local i32 i32) + global.get 0 + i32.const 16 + i32.sub + local.tee 1 + global.set 0 + local.get 1 + i64.const 0 + i64.store8 offset=12 + local.get 1 + i64.const 0 + i64.store32 offset=8 + block (result i32) ;; label = @1 + loop ;; label = @2 + local.get 2 + i32.const 4 + i32.eq + if ;; label = @3 + local.get 1 + i64.load8_u offset=12 + i32.wrap_i64 + i32.const 4 + i32.lt_u + local.set 2 + local.get 1 + i32.load offset=8 + br 2 (;@1;) + end + local.get 1 + local.get 0 + call 10 + local.get 1 + i32.load8_u + i32.const 1 + i32.and + i32.eqz + if ;; label = @3 + local.get 1 + i32.const 8 + i32.add + local.get 2 + i32.add + local.get 1 + i32.load8_u offset=1 + i32.store8 + local.get 1 + local.get 2 + i32.const 1 + i32.add + local.tee 2 + i32.store8 offset=12 + br 1 (;@2;) + end + end + local.get 2 + i32.const 255 + i32.and + if ;; label = @2 + local.get 1 + i32.const 0 + i32.store8 offset=12 + end + i32.const 1 + local.set 2 + i32.const 0 + end + local.set 0 + local.get 1 + i32.const 16 + i32.add + global.set 0 + local.get 2 + i64.extend_i32_u + local.get 0 + i64.extend_i32_u + i64.const 8 + i64.shl + i64.or) + (func (;10;) (type 0) (param i32 i32) + (local i32 i32) + global.get 0 + i32.const 16 + i32.sub + local.tee 2 + global.set 0 + local.get 2 + i32.const 0 + i32.store8 offset=15 + block ;; label = @1 + local.get 1 + local.get 2 + i32.const 15 + i32.add + i32.const 1 + call 24 + i32.eqz + if ;; label = @2 + local.get 2 + i32.load8_u offset=15 + local.set 1 + br 1 (;@1;) + end + i32.const 1 + local.set 3 + end + local.get 0 + local.get 1 + i32.store8 offset=1 + local.get 0 + local.get 3 + i32.store8 + local.get 2 + i32.const 16 + i32.add + global.set 0) + (func (;11;) (type 0) (param i32 i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i64 i64) + global.get 0 + i32.const -64 + i32.add + local.tee 2 + global.set 0 + local.get 2 + i32.const 8 + i32.add + local.get 1 + call 12 + block ;; label = @1 + block ;; label = @2 + local.get 2 + i32.load offset=8 + if ;; label = @3 + local.get 0 + i32.const 0 + i32.store + br 1 (;@2;) + end + block ;; label = @3 + block ;; label = @4 + local.get 2 + i32.load offset=12 + local.tee 8 + local.get 1 + i32.load offset=4 + i32.const 12 + i32.div_u + local.tee 3 + local.get 3 + local.get 8 + i32.gt_u + select + i64.extend_i32_u + i64.const 12 + i64.mul + local.tee 11 + i64.const 32 + i64.shr_u + i32.wrap_i64 + br_if 0 (;@4;) + local.get 11 + i32.wrap_i64 + local.tee 3 + i32.const -1 + i32.le_s + br_if 0 (;@4;) + i32.const 4 + local.set 5 + local.get 3 + if ;; label = @5 + local.get 3 + local.tee 6 + i32.const 4 + call 13 + local.tee 5 + i32.eqz + br_if 4 (;@1;) + end + local.get 2 + i32.const 0 + i32.store offset=24 + local.get 2 + local.get 5 + i32.store offset=16 + local.get 2 + local.get 6 + i32.const 12 + i32.div_u + local.tee 3 + i32.store offset=20 + i32.const 4 + local.set 6 + block ;; label = @5 + block ;; label = @6 + loop ;; label = @7 + local.get 7 + local.get 8 + i32.eq + if ;; label = @8 + local.get 0 + i32.const 8 + i32.add + local.get 8 + i32.store + local.get 2 + local.get 3 + i32.store offset=20 + local.get 0 + local.get 2 + i64.load offset=16 + i64.store align=4 + br 6 (;@2;) + end + local.get 2 + i32.const 48 + i32.add + local.get 1 + call 14 + local.get 2 + i32.load offset=48 + local.tee 10 + i32.eqz + br_if 4 (;@3;) + local.get 2 + i64.load offset=52 align=4 + local.set 11 + block ;; label = @8 + local.get 3 + local.get 7 + i32.eq + if ;; label = @9 + local.get 3 + i32.const 1 + i32.add + local.tee 4 + local.get 3 + i32.lt_u + br_if 3 (;@6;) + local.get 3 + local.get 3 + i32.add + local.tee 9 + local.get 3 + i32.lt_u + br_if 5 (;@4;) + block (result i32) ;; label = @10 + local.get 3 + if ;; label = @11 + local.get 3 + i64.extend_i32_u + i64.const 12 + i64.mul + local.tee 12 + i64.const 32 + i64.shr_u + i32.wrap_i64 + br_if 7 (;@4;) + local.get 2 + i32.const 4 + i32.store offset=56 + local.get 2 + local.get 12 + i64.store32 offset=52 + local.get 2 + local.get 5 + i32.store offset=48 + local.get 3 + br 1 (;@10;) + end + local.get 2 + i32.const 0 + i32.store offset=48 + i32.const 0 + end + local.set 5 + local.get 2 + i32.const 32 + i32.add + local.get 9 + local.get 4 + local.get 9 + local.get 4 + i32.gt_u + select + local.tee 4 + i32.const 4 + local.get 4 + i32.const 4 + i32.gt_u + select + i64.extend_i32_u + i64.const 12 + i64.mul + local.tee 12 + i32.wrap_i64 + local.get 12 + i64.const 32 + i64.shr_u + i64.eqz + i32.const 2 + i32.shl + local.get 2 + i32.const 48 + i32.add + call 15 + local.get 2 + i32.load offset=40 + local.set 4 + local.get 2 + i32.load offset=32 + i32.const 1 + i32.eq + br_if 1 (;@8;) + local.get 2 + local.get 2 + i32.load offset=36 + local.tee 5 + i32.store offset=16 + local.get 4 + i32.const 12 + i32.div_u + local.set 3 + end + local.get 5 + local.get 6 + i32.add + local.tee 4 + local.get 11 + i64.store align=4 + local.get 4 + i32.const -4 + i32.add + local.get 10 + i32.store + local.get 7 + i32.const -1 + i32.eq + br_if 4 (;@4;) + local.get 7 + i32.const 1 + i32.add + local.set 7 + local.get 6 + i32.const 12 + i32.add + local.set 6 + br 1 (;@7;) + end + end + local.get 2 + local.get 5 + i32.store offset=20 + local.get 2 + local.get 3 + i32.store offset=24 + br 1 (;@5;) + end + local.get 2 + local.get 3 + i32.store offset=20 + local.get 2 + local.get 3 + i32.store offset=24 + i32.const 0 + local.set 4 + end + local.get 4 + br_if 3 (;@1;) + end + unreachable + end + local.get 0 + i32.const 0 + i32.store + local.get 2 + local.get 3 + i32.store offset=20 + local.get 2 + local.get 7 + i32.store offset=24 + local.get 2 + i32.const 16 + i32.add + call 4 + end + local.get 2 + i32.const -64 + i32.sub + global.set 0 + return + end + unreachable) + (func (;12;) (type 0) (param i32 i32) + (local i32 i32 i32 i32) + global.get 0 + i32.const 32 + i32.sub + local.tee 2 + global.set 0 + local.get 2 + i32.const 8 + i32.add + local.get 1 + call 10 + i32.const 1 + local.set 3 + block ;; label = @1 + local.get 2 + i32.load8_u offset=8 + i32.const 1 + i32.and + br_if 0 (;@1;) + local.get 2 + i32.load8_u offset=9 + local.tee 5 + i32.const 3 + i32.and + local.tee 4 + i32.const 3 + i32.ne + if ;; label = @2 + block ;; label = @3 + block ;; label = @4 + block ;; label = @5 + local.get 4 + i32.const 1 + i32.sub + br_table 1 (;@4;) 2 (;@3;) 0 (;@5;) + end + local.get 5 + i32.const 252 + i32.and + i32.const 2 + i32.shr_u + local.set 4 + i32.const 0 + local.set 3 + br 3 (;@1;) + end + local.get 2 + local.get 5 + i32.store8 offset=21 + local.get 2 + i32.const 1 + i32.store8 offset=20 + local.get 2 + local.get 1 + i32.store offset=16 + local.get 2 + i32.const 0 + i32.store16 offset=28 + local.get 2 + i32.const 16 + i32.add + local.get 2 + i32.const 28 + i32.add + i32.const 2 + call 74 + br_if 2 (;@1;) + local.get 2 + i32.load16_u offset=28 + local.tee 1 + i32.const 255 + i32.le_u + br_if 2 (;@1;) + local.get 1 + i32.const 2 + i32.shr_u + local.set 4 + i32.const 0 + local.set 3 + br 2 (;@1;) + end + local.get 2 + local.get 5 + i32.store8 offset=21 + local.get 2 + i32.const 1 + i32.store8 offset=20 + local.get 2 + local.get 1 + i32.store offset=16 + local.get 2 + i32.const 0 + i32.store offset=28 + local.get 2 + i32.const 16 + i32.add + local.get 2 + i32.const 28 + i32.add + i32.const 4 + call 74 + br_if 1 (;@1;) + local.get 2 + i32.load offset=28 + local.tee 1 + i32.const 65536 + i32.lt_u + local.set 3 + local.get 1 + i32.const 2 + i32.shr_u + local.set 4 + br 1 (;@1;) + end + local.get 5 + i32.const 3 + i32.gt_u + br_if 0 (;@1;) + i32.const 0 + local.set 3 + local.get 2 + i32.const 0 + i32.store offset=16 + block ;; label = @2 + local.get 1 + local.get 2 + i32.const 16 + i32.add + i32.const 4 + call 24 + i32.eqz + if ;; label = @3 + local.get 2 + i32.load offset=16 + local.set 4 + br 1 (;@2;) + end + i32.const 1 + local.set 3 + end + local.get 3 + local.get 4 + i32.const 1073741824 + i32.lt_u + i32.or + local.set 3 + end + local.get 0 + local.get 4 + i32.store offset=4 + local.get 0 + local.get 3 + i32.store + local.get 2 + i32.const 32 + i32.add + global.set 0) + (func (;13;) (type 5) (param i32 i32) (result i32) + local.get 0 + local.get 1 + call 36) + (func (;14;) (type 0) (param i32 i32) + (local i32 i32 i32) + global.get 0 + i32.const 32 + i32.sub + local.tee 2 + global.set 0 + local.get 2 + i32.const 8 + i32.add + local.get 1 + call 12 + block ;; label = @1 + local.get 2 + i32.load offset=8 + if ;; label = @2 + local.get 0 + i32.const 0 + i32.store + br 1 (;@1;) + end + block ;; label = @2 + local.get 1 + i32.load offset=4 + local.get 2 + i32.load offset=12 + local.tee 3 + i32.lt_u + br_if 0 (;@2;) + local.get 2 + local.get 3 + i32.const 1 + call 35 + local.get 2 + local.get 3 + i32.store offset=24 + local.get 2 + local.get 2 + i32.load offset=4 + i32.store offset=20 + local.get 2 + local.get 2 + i32.load + local.tee 4 + i32.store offset=16 + local.get 1 + local.get 4 + local.get 3 + call 24 + if ;; label = @3 + local.get 2 + i32.const 16 + i32.add + call 26 + br 1 (;@2;) + end + local.get 4 + i32.eqz + br_if 0 (;@2;) + local.get 0 + local.get 2 + i64.load offset=20 align=4 + i64.store offset=4 align=4 + local.get 0 + local.get 4 + i32.store + br 1 (;@1;) + end + local.get 0 + i32.const 0 + i32.store + end + local.get 2 + i32.const 32 + i32.add + global.set 0) + (func (;15;) (type 3) (param i32 i32 i32 i32) + (local i32 i32) + global.get 0 + i32.const 16 + i32.sub + local.tee 4 + global.set 0 + block ;; label = @1 + block ;; label = @2 + local.get 2 + if ;; label = @3 + local.get 1 + i32.const 0 + i32.lt_s + br_if 1 (;@2;) + block (result i32) ;; label = @4 + local.get 3 + i32.load + local.tee 5 + i32.eqz + if ;; label = @5 + local.get 4 + local.get 1 + local.get 2 + call 33 + local.get 4 + i32.load + local.set 3 + local.get 4 + i32.load offset=4 + br 1 (;@4;) + end + local.get 3 + i32.load offset=4 + local.tee 3 + i32.eqz + if ;; label = @5 + local.get 4 + i32.const 8 + i32.add + local.get 1 + local.get 2 + i32.const 0 + call 34 + local.get 4 + i32.load offset=8 + local.set 3 + local.get 4 + i32.load offset=12 + br 1 (;@4;) + end + local.get 5 + local.get 3 + local.get 2 + local.get 1 + call 28 + local.set 3 + local.get 1 + end + local.set 5 + local.get 0 + block (result i32) ;; label = @4 + local.get 3 + i32.eqz + if ;; label = @5 + local.get 0 + local.get 1 + i32.store offset=4 + i32.const 1 + br 1 (;@4;) + end + local.get 0 + local.get 3 + i32.store offset=4 + local.get 5 + local.set 2 + i32.const 0 + end + i32.store + local.get 0 + i32.const 8 + i32.add + local.get 2 + i32.store + br 2 (;@1;) + end + local.get 0 + local.get 1 + i32.store offset=4 + local.get 0 + i32.const 1 + i32.store + local.get 0 + i32.const 8 + i32.add + i32.const 0 + i32.store + br 1 (;@1;) + end + local.get 0 + i32.const 1 + i32.store + local.get 0 + i32.const 8 + i32.add + i32.const 0 + i32.store + end + local.get 4 + i32.const 16 + i32.add + global.set 0) + (func (;16;) (type 2) (param i32) + (local i32) + global.get 0 + i32.const 16 + i32.sub + local.tee 1 + global.set 0 + local.get 1 + local.get 0 + i32.store offset=12 + local.get 1 + i32.const 12 + i32.add + i32.load + i32.load8_u + call 17 + unreachable) + (func (;17;) (type 2) (param i32) + (local i32) + global.get 0 + i32.const 32 + i32.sub + local.tee 1 + global.set 0 + local.get 1 + i32.const 24 + i32.add + i32.const 16384 + i32.store + local.get 1 + i32.const 65672 + i32.store offset=20 + local.get 1 + i32.const 0 + i32.store offset=16 + local.get 1 + i32.const 8 + i32.add + local.get 1 + i32.const 16 + i32.add + local.get 0 + call 18 + i32.const 0 + local.get 1 + i32.load offset=8 + local.get 1 + i32.load offset=12 + call 2 + unreachable) + (func (;18;) (type 1) (param i32 i32 i32) + (local i32 i32 i32 i64) + global.get 0 + i32.const 16 + i32.sub + local.tee 3 + global.set 0 + local.get 1 + i64.load offset=4 align=4 + local.set 6 + local.get 1 + i32.const 8 + i32.add + local.tee 4 + i32.const 0 + i32.store + local.get 1 + i32.const 65572 + i32.store offset=4 + local.get 3 + i32.const 0 + i32.store offset=8 + local.get 3 + local.get 6 + i64.store + local.get 3 + local.get 2 + i32.store8 offset=15 + local.get 3 + local.get 3 + i32.const 15 + i32.add + i32.const 1 + call 19 + local.get 4 + i32.const 0 + i32.store + local.get 1 + i32.const 65572 + i32.store offset=4 + local.get 3 + i32.load offset=4 + local.tee 5 + local.get 3 + i32.load offset=8 + local.tee 2 + i32.lt_u + if ;; label = @1 + unreachable + end + local.get 3 + i32.load + local.set 4 + local.get 1 + local.get 5 + local.get 2 + i32.sub + i32.store offset=8 + local.get 1 + local.get 2 + local.get 4 + i32.add + i32.store offset=4 + local.get 0 + local.get 2 + i32.store offset=4 + local.get 0 + local.get 4 + i32.store + local.get 3 + i32.const 16 + i32.add + global.set 0) + (func (;19;) (type 1) (param i32 i32 i32) + (local i32 i32 i32) + global.get 0 + i32.const 16 + i32.sub + local.tee 3 + global.set 0 + block ;; label = @1 + block ;; label = @2 + local.get 0 + i32.load offset=8 + local.tee 4 + local.get 2 + i32.add + local.tee 5 + local.get 4 + i32.ge_u + if ;; label = @3 + local.get 3 + i32.const 8 + i32.add + local.get 4 + local.get 5 + local.get 0 + i32.load + local.get 0 + i32.load offset=4 + call 38 + local.get 3 + i32.load offset=12 + local.get 2 + i32.ne + br_if 1 (;@2;) + local.get 3 + i32.load offset=8 + local.get 1 + local.get 2 + call 81 + drop + local.get 0 + i32.load offset=8 + local.tee 1 + local.get 2 + i32.add + local.tee 2 + local.get 1 + i32.ge_u + br_if 2 (;@1;) + end + unreachable + end + unreachable + end + local.get 0 + local.get 2 + i32.store offset=8 + local.get 3 + i32.const 16 + i32.add + global.set 0) + (func (;20;) (type 7) (result i32) + i32.const 0 + call 21 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 65536 + i32.add + i32.load) + (func (;21;) (type 8) (param i32) (result i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i64) + global.get 0 + i32.const 288 + i32.sub + local.tee 1 + global.set 0 + block ;; label = @1 + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + block ;; label = @5 + block ;; label = @6 + block ;; label = @7 + block ;; label = @8 + block ;; label = @9 + block ;; label = @10 + local.get 0 + if ;; label = @11 + local.get 1 + i32.const 16384 + i32.store offset=20 + local.get 1 + i32.const 65672 + i32.store offset=16 + local.get 1 + i32.const 16 + i32.add + call 25 + local.get 1 + local.get 1 + i64.load offset=16 + i64.store offset=32 + i32.const 1 + local.set 0 + local.get 1 + i32.const 32 + i32.add + call 9 + local.tee 9 + i32.wrap_i64 + local.tee 2 + i32.const 1 + i32.and + br_if 10 (;@1;) + local.get 9 + i64.const 1099511627775 + i64.and + local.tee 9 + i64.const 32 + i64.shr_u + i32.wrap_i64 + local.set 3 + local.get 9 + i64.const 24 + i64.shr_u + i32.wrap_i64 + local.set 4 + local.get 9 + i64.const 16 + i64.shr_u + i32.wrap_i64 + local.set 5 + block ;; label = @12 + block ;; label = @13 + block ;; label = @14 + block (result i32) ;; label = @15 + local.get 2 + i32.const 8 + i32.shr_u + i32.const 255 + i32.and + local.tee 2 + i32.const 67 + i32.ne + if ;; label = @16 + local.get 2 + i32.const 224 + i32.ne + if ;; label = @17 + local.get 2 + i32.const 153 + i32.ne + if ;; label = @18 + local.get 2 + i32.const 78 + i32.ne + local.get 3 + i32.const 129 + i32.ne + i32.or + local.get 5 + i32.const 255 + i32.and + i32.const 31 + i32.ne + local.get 4 + i32.const 255 + i32.and + i32.const 45 + i32.ne + i32.or + i32.or + br_if 17 (;@1;) + local.get 1 + i32.const 168 + i32.add + local.get 1 + i32.const 32 + i32.add + call 11 + local.get 1 + i32.load offset=168 + local.tee 2 + i32.eqz + br_if 17 (;@1;) + local.get 1 + local.get 1 + i64.load offset=172 align=4 + i64.store offset=52 align=4 + local.get 1 + local.get 2 + i32.store offset=48 + local.get 1 + i32.const 168 + i32.add + local.get 1 + i32.const 32 + i32.add + call 14 + local.get 1 + i32.load offset=168 + local.tee 2 + i32.eqz + br_if 8 (;@10;) + local.get 1 + local.get 1 + i64.load offset=172 align=4 + i64.store offset=92 align=4 + local.get 1 + local.get 2 + i32.store offset=88 + local.get 1 + i32.const 168 + i32.add + local.get 1 + i32.const 32 + i32.add + call 14 + local.get 1 + i32.load offset=168 + local.tee 2 + i32.eqz + br_if 9 (;@9;) + local.get 1 + local.get 1 + i64.load offset=172 align=4 + i64.store offset=132 align=4 + local.get 1 + local.get 2 + i32.store offset=128 + local.get 1 + i32.const 168 + i32.add + local.get 1 + i32.const 32 + i32.add + call 11 + local.get 1 + i32.load offset=168 + local.tee 2 + i32.eqz + br_if 4 (;@14;) + local.get 1 + i64.load offset=172 align=4 + local.set 9 + local.get 1 + i32.const 176 + i32.add + local.get 1 + i32.const 56 + i32.add + i32.load + i32.store + local.get 1 + i32.const 216 + i32.add + local.get 1 + i32.const 96 + i32.add + i32.load + i32.store + local.get 1 + i32.const 280 + i32.add + local.get 1 + i32.const 136 + i32.add + i32.load + i32.store + local.get 1 + local.get 1 + i64.load offset=48 + i64.store offset=168 + local.get 1 + local.get 1 + i64.load offset=88 + i64.store offset=208 + local.get 1 + local.get 1 + i64.load offset=128 + i64.store offset=272 + i32.const 0 + br 3 (;@15;) + end + local.get 3 + i32.const 55 + i32.ne + local.get 5 + i32.const 255 + i32.and + i32.const 160 + i32.ne + i32.or + local.get 4 + i32.const 255 + i32.and + i32.const 102 + i32.ne + i32.or + br_if 16 (;@1;) + local.get 1 + i32.const 168 + i32.add + local.get 1 + i32.const 32 + i32.add + call 11 + local.get 1 + i32.load offset=168 + local.tee 2 + i32.eqz + br_if 16 (;@1;) + local.get 1 + local.get 1 + i64.load offset=172 align=4 + i64.store offset=52 align=4 + local.get 1 + local.get 2 + i32.store offset=48 + local.get 1 + i32.const 168 + i32.add + local.get 1 + i32.const 32 + i32.add + call 14 + local.get 1 + i32.load offset=168 + local.tee 2 + i32.eqz + br_if 9 (;@8;) + local.get 1 + local.get 1 + i64.load offset=172 align=4 + i64.store offset=92 align=4 + local.get 1 + local.get 2 + i32.store offset=88 + local.get 1 + i32.const 168 + i32.add + local.get 1 + i32.const 32 + i32.add + call 14 + local.get 1 + i32.load offset=168 + local.tee 2 + i32.eqz + br_if 10 (;@7;) + local.get 1 + local.get 1 + i64.load offset=172 align=4 + i64.store offset=132 align=4 + local.get 1 + local.get 2 + i32.store offset=128 + local.get 1 + i32.const 168 + i32.add + local.get 1 + i32.const 32 + i32.add + call 11 + local.get 1 + i32.load offset=168 + local.tee 2 + i32.eqz + br_if 4 (;@13;) + local.get 1 + i64.load offset=172 align=4 + local.set 9 + local.get 1 + i32.const 176 + i32.add + local.get 1 + i32.const 56 + i32.add + i32.load + i32.store + local.get 1 + i32.const 216 + i32.add + local.get 1 + i32.const 96 + i32.add + i32.load + i32.store + local.get 1 + i32.const 280 + i32.add + local.get 1 + i32.const 136 + i32.add + i32.load + i32.store + local.get 1 + local.get 1 + i64.load offset=48 + i64.store offset=168 + local.get 1 + local.get 1 + i64.load offset=88 + i64.store offset=208 + local.get 1 + local.get 1 + i64.load offset=128 + i64.store offset=272 + i32.const 1 + br 2 (;@15;) + end + local.get 3 + i32.const 151 + i32.ne + local.get 5 + i32.const 255 + i32.and + i32.const 40 + i32.ne + i32.or + local.get 4 + i32.const 255 + i32.and + i32.const 36 + i32.ne + i32.or + br_if 15 (;@1;) + local.get 1 + i32.const 168 + i32.add + local.get 1 + i32.const 32 + i32.add + call 11 + local.get 1 + i32.load offset=168 + local.tee 2 + i32.eqz + br_if 15 (;@1;) + local.get 1 + local.get 1 + i64.load offset=172 align=4 + i64.store offset=52 align=4 + local.get 1 + local.get 2 + i32.store offset=48 + local.get 1 + i32.const 168 + i32.add + local.get 1 + i32.const 32 + i32.add + call 14 + local.get 1 + i32.load offset=168 + local.tee 2 + i32.eqz + br_if 10 (;@6;) + local.get 1 + local.get 1 + i64.load offset=172 align=4 + i64.store offset=92 align=4 + local.get 1 + local.get 2 + i32.store offset=88 + local.get 1 + i32.const 168 + i32.add + local.get 1 + i32.const 32 + i32.add + call 14 + local.get 1 + i32.load offset=168 + local.tee 2 + i32.eqz + br_if 11 (;@5;) + local.get 1 + local.get 1 + i64.load offset=172 align=4 + i64.store offset=132 align=4 + local.get 1 + local.get 2 + i32.store offset=128 + local.get 1 + i32.const 168 + i32.add + local.get 1 + i32.const 32 + i32.add + call 11 + local.get 1 + i32.load offset=168 + local.tee 2 + i32.eqz + br_if 4 (;@12;) + local.get 1 + i64.load offset=172 align=4 + local.set 9 + local.get 1 + i32.const 176 + i32.add + local.get 1 + i32.const 56 + i32.add + i32.load + i32.store + local.get 1 + i32.const 216 + i32.add + local.get 1 + i32.const 96 + i32.add + i32.load + i32.store + local.get 1 + i32.const 280 + i32.add + local.get 1 + i32.const 136 + i32.add + i32.load + i32.store + local.get 1 + local.get 1 + i64.load offset=48 + i64.store offset=168 + local.get 1 + local.get 1 + i64.load offset=88 + i64.store offset=208 + local.get 1 + local.get 1 + i64.load offset=128 + i64.store offset=272 + i32.const 2 + br 1 (;@15;) + end + local.get 3 + i32.const 6 + i32.ne + local.get 5 + i32.const 255 + i32.and + i32.const 153 + i32.ne + i32.or + local.get 4 + i32.const 255 + i32.and + i32.const 254 + i32.ne + i32.or + br_if 14 (;@1;) + local.get 1 + i32.const 168 + i32.add + local.get 1 + i32.const 32 + i32.add + call 11 + local.get 1 + i32.load offset=168 + local.tee 2 + i32.eqz + br_if 14 (;@1;) + local.get 1 + local.get 1 + i64.load offset=172 align=4 + i64.store offset=52 align=4 + local.get 1 + local.get 2 + i32.store offset=48 + local.get 1 + i32.const 168 + i32.add + local.get 1 + i32.const 32 + i32.add + call 14 + local.get 1 + i32.load offset=168 + local.tee 2 + i32.eqz + br_if 11 (;@4;) + local.get 1 + local.get 1 + i64.load offset=172 align=4 + i64.store offset=92 align=4 + local.get 1 + local.get 2 + i32.store offset=88 + local.get 1 + i32.const 168 + i32.add + local.get 1 + i32.const 32 + i32.add + call 14 + local.get 1 + i32.load offset=168 + local.tee 2 + i32.eqz + br_if 12 (;@3;) + local.get 1 + local.get 1 + i64.load offset=172 align=4 + i64.store offset=132 align=4 + local.get 1 + local.get 2 + i32.store offset=128 + local.get 1 + i32.const 168 + i32.add + local.get 1 + i32.const 32 + i32.add + call 11 + local.get 1 + i32.load offset=168 + local.tee 2 + i32.eqz + br_if 13 (;@2;) + local.get 1 + i64.load offset=172 align=4 + local.set 9 + local.get 1 + i32.const 176 + i32.add + local.get 1 + i32.const 56 + i32.add + i32.load + i32.store + local.get 1 + i32.const 216 + i32.add + local.get 1 + i32.const 96 + i32.add + i32.load + i32.store + local.get 1 + i32.const 280 + i32.add + local.get 1 + i32.const 136 + i32.add + i32.load + i32.store + local.get 1 + local.get 1 + i64.load offset=48 + i64.store offset=168 + local.get 1 + local.get 1 + i64.load offset=88 + i64.store offset=208 + local.get 1 + local.get 1 + i64.load offset=128 + i64.store offset=272 + i32.const 3 + end + local.set 3 + local.get 1 + i32.const 264 + i32.add + local.get 1 + i32.const 176 + i32.add + i32.load + i32.store + local.get 1 + i32.const 248 + i32.add + local.get 1 + i32.const 216 + i32.add + i32.load + i32.store + local.get 1 + i32.const 232 + i32.add + local.get 1 + i32.const 280 + i32.add + i32.load + i32.store + local.get 1 + local.get 1 + i64.load offset=168 + i64.store offset=256 + local.get 1 + local.get 1 + i64.load offset=208 + i64.store offset=240 + local.get 1 + local.get 1 + i64.load offset=272 + i64.store offset=224 + i32.const 0 + local.set 0 + br 13 (;@1;) + end + local.get 1 + i32.const 128 + i32.add + call 26 + local.get 1 + i32.const 88 + i32.add + call 26 + local.get 1 + i32.const 48 + i32.add + call 4 + br 12 (;@1;) + end + local.get 1 + i32.const 128 + i32.add + call 26 + local.get 1 + i32.const 88 + i32.add + call 26 + local.get 1 + i32.const 48 + i32.add + call 4 + br 11 (;@1;) + end + local.get 1 + i32.const 128 + i32.add + call 26 + local.get 1 + i32.const 88 + i32.add + call 26 + local.get 1 + i32.const 48 + i32.add + call 4 + br 10 (;@1;) + end + local.get 1 + i32.const 16384 + i32.store offset=132 + local.get 1 + i32.const 65672 + i32.store offset=128 + local.get 1 + i32.const 128 + i32.add + call 25 + local.get 1 + local.get 1 + i64.load offset=128 + i64.store offset=168 + local.get 1 + i32.const 168 + i32.add + call 9 + local.set 9 + local.get 1 + i32.const 288 + i32.add + global.set 0 + i32.const 8 + i32.const 6 + local.get 9 + i64.const 1099511627521 + i64.and + i64.const 970968230400 + i64.eq + select + return + end + local.get 1 + i32.const 48 + i32.add + call 4 + br 8 (;@1;) + end + local.get 1 + i32.const 88 + i32.add + call 26 + local.get 1 + i32.const 48 + i32.add + call 4 + br 7 (;@1;) + end + local.get 1 + i32.const 48 + i32.add + call 4 + br 6 (;@1;) + end + local.get 1 + i32.const 88 + i32.add + call 26 + local.get 1 + i32.const 48 + i32.add + call 4 + br 5 (;@1;) + end + local.get 1 + i32.const 48 + i32.add + call 4 + br 4 (;@1;) + end + local.get 1 + i32.const 88 + i32.add + call 26 + local.get 1 + i32.const 48 + i32.add + call 4 + br 3 (;@1;) + end + local.get 1 + i32.const 48 + i32.add + call 4 + br 2 (;@1;) + end + local.get 1 + i32.const 88 + i32.add + call 26 + local.get 1 + i32.const 48 + i32.add + call 4 + br 1 (;@1;) + end + local.get 1 + i32.const 128 + i32.add + call 26 + local.get 1 + i32.const 88 + i32.add + call 26 + local.get 1 + i32.const 48 + i32.add + call 4 + end + block ;; label = @1 + block ;; label = @2 + local.get 0 + i32.eqz + if ;; label = @3 + local.get 1 + i32.const 40 + i32.add + local.tee 0 + local.get 1 + i32.const 264 + i32.add + local.tee 4 + i32.load + i32.store + local.get 1 + i32.const 24 + i32.add + local.tee 5 + local.get 1 + i32.const 248 + i32.add + local.tee 6 + i32.load + i32.store + local.get 1 + i32.const 8 + i32.add + local.tee 7 + local.get 1 + i32.const 232 + i32.add + local.tee 8 + i32.load + i32.store + local.get 1 + local.get 1 + i64.load offset=256 + i64.store offset=32 + local.get 1 + local.get 1 + i64.load offset=240 + i64.store offset=16 + local.get 1 + local.get 1 + i64.load offset=224 + i64.store + block ;; label = @4 + block ;; label = @5 + local.get 3 + i32.const 1 + i32.sub + br_table 3 (;@2;) 1 (;@4;) 3 (;@2;) 0 (;@5;) + end + local.get 1 + i32.const 56 + i32.add + local.tee 3 + local.get 0 + i32.load + i32.store + local.get 1 + i32.const 68 + i32.add + local.get 5 + i32.load + i32.store + local.get 1 + i32.const 80 + i32.add + local.get 7 + i32.load + i32.store + local.get 1 + local.get 1 + i64.load offset=32 + i64.store offset=48 + local.get 1 + local.get 1 + i64.load offset=16 + i64.store offset=60 align=4 + local.get 1 + local.get 1 + i64.load + i64.store offset=72 + local.get 1 + i32.const 88 + i32.add + local.get 1 + i32.const 48 + i32.add + i32.const 36 + call 81 + drop + local.get 1 + i32.const 136 + i32.add + local.get 0 + i32.load + i32.store + local.get 1 + i32.const 148 + i32.add + local.get 1 + i32.const 108 + i32.add + i32.load + i32.store + local.get 1 + i32.const 160 + i32.add + local.get 1 + i32.const 120 + i32.add + i32.load + i32.store + local.get 1 + local.get 1 + i64.load offset=32 + i64.store offset=128 + local.get 1 + local.get 1 + i64.load offset=100 align=4 + i64.store offset=140 align=4 + local.get 1 + local.get 1 + i64.load offset=112 + i64.store offset=152 + local.get 1 + i32.const 168 + i32.add + local.get 1 + i32.const 128 + i32.add + i32.const 36 + call 81 + drop + local.get 8 + local.get 3 + i32.load + i32.store + local.get 1 + local.get 1 + i64.load offset=48 + i64.store offset=224 + local.get 6 + local.get 1 + i32.const 188 + i32.add + i32.load + i32.store + local.get 1 + local.get 1 + i64.load offset=180 align=4 + i64.store offset=240 + local.get 4 + local.get 1 + i32.const 200 + i32.add + i32.load + i32.store + local.get 1 + local.get 1 + i64.load offset=192 + i64.store offset=256 + local.get 1 + local.get 9 + i64.store offset=276 align=4 + local.get 1 + local.get 2 + i32.store offset=272 + local.get 1 + i32.const 208 + i32.add + i32.const 0 + local.get 1 + i32.const 224 + i32.add + local.get 1 + i32.const 240 + i32.add + local.get 1 + i32.const 256 + i32.add + local.get 1 + i32.const 272 + i32.add + call 27 + br 3 (;@1;) + end + br 1 (;@2;) + end + local.get 1 + i32.const 288 + i32.add + global.set 0 + i32.const 6 + return + end + local.get 1 + i32.const 56 + i32.add + local.tee 3 + local.get 0 + i32.load + i32.store + local.get 1 + i32.const 68 + i32.add + local.get 5 + i32.load + i32.store + local.get 1 + i32.const 80 + i32.add + local.get 7 + i32.load + i32.store + local.get 1 + local.get 1 + i64.load offset=32 + i64.store offset=48 + local.get 1 + local.get 1 + i64.load offset=16 + i64.store offset=60 align=4 + local.get 1 + local.get 1 + i64.load + i64.store offset=72 + local.get 1 + i32.const 88 + i32.add + local.get 1 + i32.const 48 + i32.add + i32.const 36 + call 81 + drop + local.get 1 + i32.const 136 + i32.add + local.get 0 + i32.load + i32.store + local.get 1 + i32.const 148 + i32.add + local.get 1 + i32.const 108 + i32.add + i32.load + i32.store + local.get 1 + i32.const 160 + i32.add + local.get 1 + i32.const 120 + i32.add + i32.load + i32.store + local.get 1 + local.get 1 + i64.load offset=32 + i64.store offset=128 + local.get 1 + local.get 1 + i64.load offset=100 align=4 + i64.store offset=140 align=4 + local.get 1 + local.get 1 + i64.load offset=112 + i64.store offset=152 + local.get 1 + i32.const 168 + i32.add + local.get 1 + i32.const 128 + i32.add + i32.const 36 + call 81 + drop + local.get 8 + local.get 3 + i32.load + i32.store + local.get 1 + local.get 1 + i64.load offset=48 + i64.store offset=224 + local.get 6 + local.get 1 + i32.const 188 + i32.add + i32.load + i32.store + local.get 1 + local.get 1 + i64.load offset=180 align=4 + i64.store offset=240 + local.get 4 + local.get 1 + i32.const 200 + i32.add + i32.load + i32.store + local.get 1 + local.get 1 + i64.load offset=192 + i64.store offset=256 + local.get 1 + local.get 9 + i64.store offset=276 align=4 + local.get 1 + local.get 2 + i32.store offset=272 + local.get 1 + i32.const 208 + i32.add + i32.const 1 + local.get 1 + i32.const 224 + i32.add + local.get 1 + i32.const 240 + i32.add + local.get 1 + i32.const 256 + i32.add + local.get 1 + i32.const 272 + i32.add + call 27 + end + local.get 1 + i32.load8_u offset=209 + local.set 0 + local.get 1 + i32.load8_u offset=208 + local.set 2 + local.get 1 + i32.const 208 + i32.add + call 7 + local.get 1 + local.get 2 + i32.eqz + local.get 0 + i32.const 0 + i32.ne + i32.and + i32.store8 offset=272 + local.get 1 + i32.const 272 + i32.add + call 16 + unreachable) + (func (;22;) (type 7) (result i32) + (local i32 i32 i64 i64) + global.get 0 + i32.const 32 + i32.sub + local.tee 0 + global.set 0 + local.get 0 + i32.const 16384 + i32.store offset=4 + local.get 0 + i32.const 65672 + i32.store + local.get 0 + i32.const 16384 + i32.store offset=16 + i32.const 65672 + local.get 0 + i32.const 16 + i32.add + call 0 + local.get 0 + local.get 0 + i32.load offset=16 + call 23 + local.get 0 + local.get 0 + i64.load + i64.store offset=8 + local.get 0 + i32.const 24 + i32.add + local.tee 1 + i64.const 0 + i64.store + local.get 0 + i64.const 0 + i64.store offset=16 + block (result i32) ;; label = @1 + i32.const 1 + local.get 0 + i32.const 8 + i32.add + local.get 0 + i32.const 16 + i32.add + i32.const 16 + call 24 + br_if 0 (;@1;) + drop + local.get 1 + i64.load + local.set 2 + local.get 0 + i64.load offset=16 + local.set 3 + i32.const 0 + end + local.get 2 + local.get 3 + i64.or + i64.eqz + i32.eqz + i32.or + i32.eqz + if ;; label = @1 + i32.const 1 + call 21 + local.get 0 + i32.const 32 + i32.add + global.set 0 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 65536 + i32.add + i32.load + return + end + unreachable) + (func (;23;) (type 0) (param i32 i32) + (local i32 i32 i32) + global.get 0 + i32.const 16 + i32.sub + local.tee 2 + global.set 0 + local.get 0 + i32.load offset=4 + local.set 3 + local.get 0 + i32.const 0 + i32.store offset=4 + local.get 0 + i32.load + local.set 4 + local.get 0 + i32.const 65572 + i32.store + local.get 2 + i32.const 8 + i32.add + i32.const 0 + local.get 1 + local.get 4 + local.get 3 + call 38 + local.get 0 + local.get 2 + i64.load offset=8 + i64.store align=4 + local.get 2 + i32.const 16 + i32.add + global.set 0) + (func (;24;) (type 4) (param i32 i32 i32) (result i32) + block ;; label = @1 + local.get 0 + i32.load offset=4 + local.get 2 + i32.ge_u + if (result i32) ;; label = @2 + local.get 1 + local.get 0 + i32.load + local.get 2 + call 81 + drop + local.get 0 + i32.load offset=4 + local.tee 1 + local.get 2 + i32.lt_u + br_if 1 (;@1;) + local.get 0 + local.get 1 + local.get 2 + i32.sub + i32.store offset=4 + local.get 0 + local.get 0 + i32.load + local.get 2 + i32.add + i32.store + i32.const 0 + else + i32.const 1 + end + return + end + unreachable) + (func (;25;) (type 2) (param i32) + (local i32) + global.get 0 + i32.const 16 + i32.sub + local.tee 1 + global.set 0 + local.get 1 + local.get 0 + i32.load offset=4 + i32.store offset=12 + local.get 0 + i32.load + local.get 1 + i32.const 12 + i32.add + call 1 + local.get 0 + local.get 1 + i32.load offset=12 + call 23 + local.get 1 + i32.const 16 + i32.add + global.set 0) + (func (;26;) (type 2) (param i32) + (local i32) + local.get 0 + i32.load offset=4 + local.tee 1 + if ;; label = @1 + local.get 0 + i32.load + local.get 1 + call 8 + end) + (func (;27;) (type 10) (param i32 i32 i32 i32 i32 i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i64 i64 i64 i64) + global.get 0 + i32.const 464 + i32.sub + local.tee 6 + global.set 0 + block ;; label = @1 + local.get 1 + i32.const 15 + i32.and + if ;; label = @2 + local.get 0 + i32.const 1 + i32.store8 + local.get 0 + i32.const 12 + i32.add + i32.const 16 + i32.store + local.get 0 + i32.const 8 + i32.add + i32.const 65647 + i32.store + local.get 0 + i32.const 4 + i32.add + i32.const 1 + i32.store8 + local.get 5 + call 4 + local.get 4 + call 26 + local.get 3 + call 26 + local.get 2 + call 4 + br 1 (;@1;) + end + local.get 6 + i32.const 152 + i32.add + local.get 2 + i32.const 8 + i32.add + i32.load + i32.store + local.get 6 + local.get 2 + i64.load align=4 + i64.store offset=144 + local.get 6 + i32.const 168 + i32.add + local.get 3 + i32.const 8 + i32.add + i32.load + i32.store + local.get 6 + local.get 3 + i64.load align=4 + i64.store offset=160 + local.get 6 + i32.const 184 + i32.add + local.get 4 + i32.const 8 + i32.add + i32.load + i32.store + local.get 6 + local.get 4 + i64.load align=4 + i64.store offset=176 + local.get 6 + i32.const 200 + i32.add + local.get 5 + i32.const 8 + i32.add + i32.load + local.tee 1 + i32.store + local.get 6 + local.get 5 + i64.load align=4 + i64.store offset=192 + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + local.get 1 + i32.const 1 + i32.add + local.tee 3 + local.get 1 + i32.lt_u + local.tee 2 + br_if 0 (;@4;) + local.get 3 + local.get 6 + i32.load offset=152 + i32.ne + br_if 1 (;@3;) + local.get 2 + br_if 0 (;@4;) + local.get 6 + i32.load offset=144 + local.tee 2 + i32.load + local.set 7 + local.get 6 + i32.const 208 + i32.add + local.tee 4 + local.get 2 + i32.load offset=8 + local.tee 5 + call 41 + local.get 4 + i32.load + local.get 7 + local.get 5 + call 81 + drop + local.get 4 + local.get 5 + i32.store offset=8 + local.get 6 + i32.load offset=192 + local.set 4 + local.get 6 + i32.const 240 + i32.add + i64.const 1 + i64.store + local.get 6 + i32.const 236 + i32.add + local.get 2 + local.get 3 + i32.const 12 + i32.mul + i32.add + i32.store + local.get 6 + i32.const 0 + i32.store offset=248 + local.get 6 + local.get 2 + i32.store offset=232 + local.get 6 + local.get 4 + local.get 1 + i32.const 12 + i32.mul + i32.add + i32.store offset=228 + local.get 6 + local.get 4 + i32.store offset=224 + local.get 6 + i32.const 448 + i32.add + i32.const 4 + i32.or + local.set 1 + block ;; label = @5 + block ;; label = @6 + block ;; label = @7 + block ;; label = @8 + block ;; label = @9 + block ;; label = @10 + block ;; label = @11 + block ;; label = @12 + loop ;; label = @13 + local.get 6 + i32.const 136 + i32.add + local.get 6 + i32.const 224 + i32.add + call 43 + local.get 6 + i32.load offset=136 + local.tee 2 + i32.eqz + if ;; label = @14 + local.get 6 + i32.const 128 + i32.add + local.get 6 + i32.const 176 + i32.add + i32.const 0 + i32.const 48 + call 44 + local.get 6 + i32.load offset=132 + local.set 2 + local.get 6 + i32.load offset=128 + local.set 3 + local.get 6 + i32.const 120 + i32.add + local.get 6 + i32.const 176 + i32.add + i32.const 48 + i32.const 96 + call 44 + local.get 6 + i32.load offset=124 + local.set 4 + local.get 6 + i32.load offset=120 + local.set 5 + local.get 6 + i32.const 112 + i32.add + local.get 6 + i32.const 176 + i32.add + i32.const 96 + i32.const 97 + call 44 + local.get 6 + i32.load offset=116 + local.set 7 + local.get 6 + i32.load offset=112 + local.set 9 + local.get 6 + i32.const 104 + i32.add + local.get 6 + i32.const 176 + i32.add + i32.const 97 + i32.const 290 + call 44 + local.get 6 + i32.load offset=108 + local.set 10 + local.get 6 + i32.load offset=104 + local.set 11 + local.get 6 + i32.const 96 + i32.add + local.get 6 + i32.const 208 + i32.add + i32.const 0 + i32.const 48 + call 44 + local.get 6 + i32.load offset=100 + local.set 12 + local.get 6 + i32.load offset=96 + local.set 13 + local.get 6 + i32.const 88 + i32.add + local.get 6 + i32.const 208 + i32.add + i32.const 48 + i32.const 96 + call 44 + local.get 6 + i32.const 448 + i32.add + local.get 6 + i32.load offset=88 + local.get 6 + i32.load offset=92 + call 45 + local.get 6 + i32.const 408 + i32.add + local.tee 1 + local.get 6 + i32.const 460 + i32.add + local.tee 8 + i32.load + i32.store + local.get 6 + local.get 6 + i64.load offset=452 align=4 + i64.store offset=400 + local.get 6 + i32.load offset=448 + i32.const 1 + i32.eq + br_if 2 (;@12;) + local.get 6 + i32.const 360 + i32.add + local.get 1 + i32.load + local.tee 14 + i32.store + local.get 6 + local.get 6 + i64.load offset=400 + local.tee 27 + i64.store offset=352 + local.get 6 + i32.const 80 + i32.add + local.get 6 + i32.const 208 + i32.add + i32.const 96 + i32.const 97 + call 44 + local.get 6 + i32.load offset=84 + local.set 15 + local.get 6 + i32.load offset=80 + local.set 16 + local.get 6 + i32.const 72 + i32.add + local.get 6 + i32.const 160 + i32.add + i32.const 0 + i32.const 193 + call 44 + local.get 6 + i32.load offset=76 + local.set 17 + local.get 6 + i32.load offset=72 + local.set 18 + local.get 6 + i32.const -64 + i32.sub + local.get 6 + i32.const 176 + i32.add + i32.const 290 + i32.const 338 + call 44 + local.get 6 + i32.load offset=68 + local.set 19 + local.get 6 + i32.load offset=64 + local.set 20 + local.get 6 + i32.const 56 + i32.add + local.get 6 + i32.const 176 + i32.add + i32.const 338 + i32.const 386 + call 44 + local.get 6 + i32.const 448 + i32.add + local.get 6 + i32.load offset=56 + local.get 6 + i32.load offset=60 + call 45 + local.get 6 + i32.const 424 + i32.add + local.get 8 + i32.load + i32.store + local.get 6 + local.get 6 + i64.load offset=452 align=4 + i64.store offset=416 + local.get 6 + i32.load offset=448 + i32.const 1 + i32.eq + br_if 5 (;@9;) + local.get 6 + i32.const 376 + i32.add + local.get 6 + i32.const 424 + i32.add + i32.load + local.tee 8 + i32.store + local.get 6 + local.get 6 + i64.load offset=416 + local.tee 28 + i64.store offset=368 + local.get 6 + i32.const 48 + i32.add + local.get 6 + i32.const 176 + i32.add + i32.const 386 + i32.const 387 + call 44 + local.get 6 + i32.load offset=52 + local.set 21 + local.get 6 + i32.load offset=48 + local.set 22 + local.get 6 + i32.const 40 + i32.add + local.get 6 + i32.const 160 + i32.add + i32.const 193 + i32.const 386 + call 44 + local.get 6 + i32.load offset=44 + local.set 23 + local.get 6 + i32.load offset=40 + local.set 24 + local.get 6 + i32.const 32 + i32.add + local.get 6 + i32.const 160 + i32.add + i32.const 386 + i32.const 434 + call 44 + local.get 6 + i32.load offset=36 + local.set 25 + local.get 6 + i32.load offset=32 + local.set 26 + local.get 6 + i32.const 24 + i32.add + local.get 6 + i32.const 160 + i32.add + i32.const 434 + i32.const 482 + call 44 + local.get 6 + i32.const 448 + i32.add + local.get 6 + i32.load offset=24 + local.get 6 + i32.load offset=28 + call 45 + local.get 6 + i32.const 440 + i32.add + local.tee 1 + local.get 6 + i32.const 460 + i32.add + i32.load + i32.store + local.get 6 + local.get 6 + i64.load offset=452 align=4 + i64.store offset=432 + local.get 6 + i32.load offset=448 + i32.const 1 + i32.eq + br_if 3 (;@11;) + local.get 6 + i32.const 392 + i32.add + local.get 1 + i32.load + local.tee 1 + i32.store + local.get 6 + local.get 6 + i64.load offset=432 + local.tee 29 + i64.store offset=384 + local.get 6 + i32.const 16 + i32.add + local.get 6 + i32.const 160 + i32.add + i32.const 482 + i32.const 483 + call 44 + local.get 6 + i64.load offset=16 + local.set 30 + local.get 6 + i32.const 8 + i32.add + local.get 6 + i32.const 160 + i32.add + i32.const 483 + i32.const 676 + call 44 + local.get 6 + i32.const 336 + i32.add + local.get 30 + i64.store + local.get 6 + i32.const 332 + i32.add + local.get 1 + i32.store + local.get 6 + i32.const 328 + i32.add + local.get 29 + i64.store32 + local.get 6 + i32.const 324 + i32.add + local.get 25 + i32.store + local.get 6 + i32.const 316 + i32.add + local.get 23 + i32.store + local.get 6 + i32.const 312 + i32.add + local.get 24 + i32.store + local.get 6 + i32.const 308 + i32.add + local.get 21 + i32.store + local.get 6 + i32.const 304 + i32.add + local.get 22 + i32.store + local.get 6 + i32.const 300 + i32.add + local.get 8 + i32.store + local.get 6 + i32.const 296 + i32.add + local.get 28 + i64.store32 + local.get 6 + i32.const 292 + i32.add + local.get 19 + i32.store + local.get 6 + i32.const 284 + i32.add + local.get 17 + i32.store + local.get 6 + i32.const 280 + i32.add + local.get 18 + i32.store + local.get 6 + i32.const 276 + i32.add + local.get 15 + i32.store + local.get 6 + i32.const 272 + i32.add + local.get 16 + i32.store + local.get 6 + i32.const 268 + i32.add + local.get 14 + i32.store + local.get 6 + i32.const 264 + i32.add + local.get 27 + i64.store32 + local.get 6 + i32.const 260 + i32.add + local.get 12 + i32.store + local.get 6 + i32.const 252 + i32.add + local.get 10 + i32.store + local.get 6 + i32.const 244 + i32.add + local.get 7 + i32.store + local.get 6 + i32.const 236 + i32.add + local.get 4 + i32.store + local.get 6 + i32.const 344 + i32.add + local.get 6 + i64.load offset=8 + i64.store + local.get 6 + local.get 26 + i32.store offset=320 + local.get 6 + local.get 20 + i32.store offset=288 + local.get 6 + local.get 13 + i32.store offset=256 + local.get 6 + local.get 11 + i32.store offset=248 + local.get 6 + local.get 9 + i32.store offset=240 + local.get 6 + local.get 5 + i32.store offset=232 + local.get 6 + local.get 2 + i32.store offset=228 + local.get 6 + local.get 3 + i32.store offset=224 + local.get 6 + i32.const 400 + i32.add + i32.const 1160 + call 41 + i32.const 128 + local.set 3 + local.get 6 + i32.const 224 + i32.add + local.set 2 + loop ;; label = @15 + local.get 3 + i32.eqz + br_if 5 (;@10;) + local.get 6 + i32.const 400 + i32.add + local.get 2 + i32.load + local.get 2 + i32.load offset=4 + call 31 + local.get 6 + i32.const 400 + i32.add + local.get 2 + i32.load offset=8 + local.get 2 + i32.load offset=12 + call 31 + local.get 6 + i32.const 400 + i32.add + local.get 2 + i32.load offset=16 + local.get 2 + i32.load offset=20 + call 31 + local.get 6 + i32.const 400 + i32.add + local.get 2 + i32.load offset=24 + local.get 2 + i32.load offset=28 + call 31 + local.get 3 + i32.const -32 + i32.add + local.set 3 + local.get 2 + i32.const 32 + i32.add + local.set 2 + br 0 (;@15;) + end + unreachable + end + local.get 6 + i32.load offset=140 + local.set 3 + local.get 6 + i32.const 384 + i32.add + i32.const 129 + call 41 + local.get 6 + i32.const 384 + i32.add + local.get 3 + i32.load + local.get 3 + i32.load offset=8 + call 31 + local.get 6 + i32.const 384 + i32.add + local.get 2 + i32.load + local.get 2 + i32.load offset=8 + call 31 + local.get 6 + i32.const 448 + i32.add + i32.const 16777217 + local.get 6 + i32.load offset=384 + local.get 6 + i32.load offset=392 + call 50 + local.get 6 + i32.const 440 + i32.add + local.tee 2 + local.get 1 + i32.const 8 + i32.add + local.tee 3 + i32.load + i32.store + local.get 6 + local.get 1 + i64.load align=4 + i64.store offset=432 + local.get 6 + i32.load offset=448 + i32.const 1 + i32.eq + br_if 6 (;@7;) + local.get 6 + i32.const 408 + i32.add + local.tee 4 + local.get 2 + i32.load + i32.store + local.get 6 + local.get 6 + i64.load offset=432 + i64.store offset=400 + local.get 6 + i32.const 416 + i32.add + i32.const 194 + call 41 + local.get 6 + i32.const 416 + i32.add + local.get 6 + i32.load offset=208 + local.get 6 + i32.load offset=216 + call 31 + local.get 6 + i32.const 416 + i32.add + local.get 6 + i32.load offset=400 + local.get 4 + i32.load + call 31 + local.get 6 + i32.const 448 + i32.add + i32.const 16777216 + local.get 6 + i32.load offset=416 + local.get 6 + i32.load offset=424 + call 50 + local.get 2 + local.get 3 + i32.load + i32.store + local.get 6 + local.get 1 + i64.load align=4 + i64.store offset=432 + local.get 6 + i32.load offset=448 + i32.const 1 + i32.ne + if ;; label = @14 + local.get 6 + i32.const 208 + i32.add + call 26 + local.get 6 + i32.const 216 + i32.add + local.get 2 + i32.load + i32.store + local.get 6 + local.get 6 + i64.load offset=432 + i64.store offset=208 + local.get 6 + i32.const 416 + i32.add + call 26 + local.get 6 + i32.const 400 + i32.add + call 26 + local.get 6 + i32.const 384 + i32.add + call 26 + br 1 (;@13;) + end + end + local.get 0 + i32.const 1 + i32.store8 + local.get 0 + i32.const 4 + i32.add + local.get 6 + i64.load offset=432 + i64.store align=4 + local.get 0 + i32.const 12 + i32.add + local.get 6 + i32.const 440 + i32.add + i32.load + i32.store + local.get 6 + i32.const 416 + i32.add + call 26 + local.get 6 + i32.const 400 + i32.add + call 26 + br 6 (;@6;) + end + local.get 0 + i32.const 1 + i32.store8 + local.get 0 + i32.const 4 + i32.add + local.get 6 + i64.load offset=400 + i64.store align=4 + local.get 0 + i32.const 12 + i32.add + local.get 1 + i32.load + i32.store + br 6 (;@5;) + end + local.get 0 + i32.const 1 + i32.store8 + local.get 0 + i32.const 4 + i32.add + local.get 6 + i64.load offset=432 + i64.store align=4 + local.get 0 + i32.const 12 + i32.add + local.get 1 + i32.load + i32.store + local.get 6 + i32.const 368 + i32.add + call 26 + br 2 (;@8;) + end + local.get 6 + i32.const 448 + i32.add + i32.const 16777218 + local.get 6 + i32.load offset=400 + local.get 6 + i32.load offset=408 + call 50 + local.get 6 + i32.const 440 + i32.add + local.tee 1 + local.get 6 + i32.const 460 + i32.add + i32.load + i32.store + local.get 6 + local.get 6 + i64.load offset=452 align=4 + i64.store offset=432 + local.get 6 + i32.load offset=448 + i32.const 1 + i32.ne + if ;; label = @10 + local.get 6 + i32.const 424 + i32.add + local.get 1 + i32.load + local.tee 1 + i32.store + local.get 6 + local.get 6 + i64.load offset=432 + i64.store offset=416 + local.get 1 + i32.eqz + br_if 6 (;@4;) + local.get 0 + i32.const 0 + i32.store8 + local.get 0 + local.get 6 + i32.load offset=416 + i32.load8_u + i32.eqz + i32.store8 offset=1 + local.get 6 + i32.const 400 + i32.add + call 26 + local.get 6 + i32.const 384 + i32.add + call 26 + local.get 6 + i32.const 368 + i32.add + call 26 + local.get 6 + i32.const 352 + i32.add + call 26 + local.get 6 + i32.const 208 + i32.add + call 26 + local.get 6 + i32.const 416 + i32.add + call 26 + local.get 6 + i32.const 192 + i32.add + call 4 + local.get 6 + i32.const 176 + i32.add + call 26 + local.get 6 + i32.const 160 + i32.add + call 26 + local.get 6 + i32.const 144 + i32.add + call 4 + br 9 (;@1;) + end + local.get 0 + i32.const 1 + i32.store8 + local.get 0 + i32.const 4 + i32.add + local.get 6 + i64.load offset=432 + i64.store align=4 + local.get 0 + i32.const 12 + i32.add + local.get 1 + i32.load + i32.store + local.get 6 + i32.const 400 + i32.add + call 26 + local.get 6 + i32.const 384 + i32.add + call 26 + local.get 6 + i32.const 368 + i32.add + call 26 + local.get 6 + i32.const 352 + i32.add + call 26 + local.get 6 + i32.const 208 + i32.add + call 26 + br 7 (;@2;) + end + local.get 0 + i32.const 1 + i32.store8 + local.get 0 + i32.const 4 + i32.add + local.get 6 + i64.load offset=416 + i64.store align=4 + local.get 0 + i32.const 12 + i32.add + local.get 6 + i32.const 424 + i32.add + i32.load + i32.store + end + local.get 6 + i32.const 352 + i32.add + call 26 + br 2 (;@5;) + end + local.get 0 + i32.const 1 + i32.store8 + local.get 0 + i32.const 4 + i32.add + local.get 6 + i64.load offset=432 + i64.store align=4 + local.get 0 + i32.const 12 + i32.add + local.get 6 + i32.const 440 + i32.add + i32.load + i32.store + end + local.get 6 + i32.const 384 + i32.add + call 26 + end + local.get 6 + i32.const 208 + i32.add + call 26 + br 2 (;@2;) + end + unreachable + end + local.get 0 + i32.const 1 + i32.store8 + local.get 0 + i32.const 12 + i32.add + i32.const 27 + i32.store + local.get 0 + i32.const 8 + i32.add + i32.const 65572 + i32.store + local.get 0 + i32.const 4 + i32.add + i32.const 1 + i32.store8 + end + local.get 6 + i32.const 192 + i32.add + call 4 + local.get 6 + i32.const 176 + i32.add + call 26 + local.get 6 + i32.const 160 + i32.add + call 26 + local.get 6 + i32.const 144 + i32.add + call 4 + end + local.get 6 + i32.const 464 + i32.add + global.set 0) + (func (;28;) (type 6) (param i32 i32 i32 i32) (result i32) + local.get 0 + local.get 1 + local.get 2 + local.get 3 + call 29) + (func (;29;) (type 6) (param i32 i32 i32 i32) (result i32) + local.get 3 + local.get 2 + call 36 + local.tee 2 + if ;; label = @1 + local.get 2 + local.get 0 + local.get 3 + local.get 1 + local.get 1 + local.get 3 + i32.gt_u + select + call 81 + drop + local.get 0 + local.get 1 + call 37 + end + local.get 2) + (func (;30;) (type 5) (param i32 i32) (result i32) + local.get 0 + local.get 1 + call 36 + local.tee 1 + if ;; label = @1 + local.get 1 + local.get 0 + call 80 + end + local.get 1) + (func (;31;) (type 1) (param i32 i32 i32) + local.get 0 + local.get 2 + call 32 + local.get 0 + i32.load + local.get 0 + i32.load offset=8 + i32.add + local.get 1 + local.get 2 + call 81 + drop + local.get 0 + i32.load offset=8 + local.tee 1 + local.get 2 + i32.add + local.tee 2 + local.get 1 + i32.lt_u + if ;; label = @1 + unreachable + end + local.get 0 + local.get 2 + i32.store offset=8) + (func (;32;) (type 0) (param i32 i32) + (local i32 i32 i32) + global.get 0 + i32.const 32 + i32.sub + local.tee 2 + global.set 0 + block ;; label = @1 + block ;; label = @2 + local.get 0 + i32.load offset=4 + local.tee 3 + local.get 0 + i32.load offset=8 + local.tee 4 + i32.sub + local.get 1 + i32.lt_u + if ;; label = @3 + local.get 1 + local.get 4 + i32.add + local.tee 1 + local.get 4 + i32.lt_u + br_if 2 (;@1;) + local.get 3 + local.get 3 + i32.add + local.tee 4 + local.get 3 + i32.lt_u + br_if 2 (;@1;) + local.get 4 + local.get 1 + local.get 4 + local.get 1 + i32.gt_u + select + local.tee 1 + i32.const 8 + local.get 1 + i32.const 8 + i32.gt_u + select + local.set 1 + block ;; label = @4 + local.get 3 + if ;; label = @5 + local.get 2 + i32.const 24 + i32.add + i32.const 1 + i32.store + local.get 2 + local.get 3 + i32.store offset=20 + local.get 2 + local.get 0 + i32.load + i32.store offset=16 + br 1 (;@4;) + end + local.get 2 + i32.const 0 + i32.store offset=16 + end + local.get 2 + local.get 1 + i32.const 1 + local.get 2 + i32.const 16 + i32.add + call 15 + local.get 2 + i32.const 8 + i32.add + i32.load + local.set 1 + local.get 2 + i32.load + i32.const 1 + i32.eq + br_if 1 (;@2;) + local.get 2 + i32.load offset=4 + local.set 3 + local.get 0 + local.get 1 + i32.store offset=4 + local.get 0 + local.get 3 + i32.store + end + local.get 2 + i32.const 32 + i32.add + global.set 0 + return + end + local.get 1 + i32.eqz + br_if 0 (;@1;) + unreachable + end + unreachable) + (func (;33;) (type 1) (param i32 i32 i32) + (local i32) + global.get 0 + i32.const 16 + i32.sub + local.tee 3 + global.set 0 + local.get 3 + i32.const 8 + i32.add + local.get 1 + local.get 2 + i32.const 0 + call 34 + local.get 0 + local.get 3 + i32.load offset=8 + i32.store + local.get 0 + local.get 3 + i32.load offset=12 + i32.store offset=4 + local.get 3 + i32.const 16 + i32.add + global.set 0) + (func (;34;) (type 3) (param i32 i32 i32 i32) + block ;; label = @1 + local.get 1 + i32.eqz + br_if 0 (;@1;) + local.get 3 + i32.eqz + if ;; label = @2 + local.get 1 + local.get 2 + call 13 + local.set 2 + br 1 (;@1;) + end + local.get 1 + local.get 2 + call 30 + local.set 2 + end + local.get 0 + local.get 1 + i32.store offset=4 + local.get 0 + local.get 2 + i32.store) + (func (;35;) (type 1) (param i32 i32 i32) + (local i32) + global.get 0 + i32.const 16 + i32.sub + local.tee 3 + global.set 0 + block ;; label = @1 + local.get 1 + i32.const -1 + i32.gt_s + if ;; label = @2 + block (result i32) ;; label = @3 + local.get 2 + if ;; label = @4 + local.get 3 + local.get 1 + i32.const 1 + i32.const 1 + call 34 + local.get 3 + i32.load offset=4 + local.set 2 + local.get 3 + i32.load + br 1 (;@3;) + end + local.get 3 + i32.const 8 + i32.add + local.get 1 + i32.const 1 + call 33 + local.get 3 + i32.load offset=12 + local.set 2 + local.get 3 + i32.load offset=8 + end + local.tee 1 + i32.eqz + br_if 1 (;@1;) + local.get 0 + local.get 2 + i32.store offset=4 + local.get 0 + local.get 1 + i32.store + local.get 3 + i32.const 16 + i32.add + global.set 0 + return + end + unreachable + end + unreachable) + (func (;36;) (type 5) (param i32 i32) (result i32) + (local i32 i32) + global.get 0 + i32.const 16 + i32.sub + local.tee 2 + global.set 0 + local.get 0 + call 76 + local.set 0 + local.get 2 + i32.const 65668 + i32.load + i32.store offset=12 + block ;; label = @1 + local.get 0 + local.get 1 + local.get 2 + i32.const 12 + i32.add + call 78 + local.tee 3 + br_if 0 (;@1;) + local.get 2 + local.get 0 + local.get 1 + call 77 + i32.const 0 + local.set 3 + local.get 2 + i32.load + br_if 0 (;@1;) + local.get 2 + i32.load offset=4 + local.tee 3 + local.get 2 + i32.load offset=12 + i32.store offset=8 + local.get 2 + local.get 3 + i32.store offset=12 + local.get 0 + local.get 1 + local.get 2 + i32.const 12 + i32.add + call 78 + local.set 3 + end + i32.const 65668 + local.get 2 + i32.load offset=12 + i32.store + local.get 2 + i32.const 16 + i32.add + global.set 0 + local.get 3) + (func (;37;) (type 0) (param i32 i32) + (local i32 i32 i32) + local.get 0 + if ;; label = @1 + local.get 1 + call 76 + drop + i32.const 65668 + i32.load + local.set 3 + local.get 0 + i32.const -8 + i32.add + local.tee 1 + local.get 1 + i32.load + local.tee 4 + i32.const -2 + i32.and + i32.store + block ;; label = @2 + block ;; label = @3 + local.get 4 + i32.const -4 + i32.and + local.tee 2 + local.get 0 + i32.sub + local.get 2 + i32.le_u + if ;; label = @4 + local.get 0 + i32.const 0 + i32.store + block ;; label = @5 + local.get 0 + i32.const -4 + i32.add + i32.load + i32.const -4 + i32.and + local.tee 2 + if ;; label = @6 + local.get 2 + i32.load8_u + i32.const 1 + i32.and + i32.eqz + br_if 1 (;@5;) + end + local.get 4 + i32.const -4 + i32.and + local.tee 2 + i32.eqz + br_if 2 (;@3;) + i32.const 0 + local.get 2 + local.get 4 + i32.const 2 + i32.and + select + local.tee 2 + i32.eqz + br_if 2 (;@3;) + local.get 2 + i32.load8_u + i32.const 1 + i32.and + br_if 2 (;@3;) + local.get 0 + local.get 2 + i32.load offset=8 + i32.const -4 + i32.and + i32.store + local.get 2 + local.get 1 + i32.const 1 + i32.or + i32.store offset=8 + br 3 (;@2;) + end + local.get 1 + call 79 + local.get 2 + i32.load + local.set 0 + local.get 1 + i32.load8_u + i32.const 2 + i32.and + if ;; label = @5 + local.get 2 + local.get 0 + i32.const 2 + i32.or + local.tee 0 + i32.store + end + local.get 0 + i32.const -4 + i32.and + local.tee 0 + local.get 2 + i32.sub + i32.const -8 + i32.add + local.get 0 + i32.le_u + br_if 2 (;@2;) + end + unreachable + end + local.get 0 + local.get 3 + i32.store + local.get 1 + local.set 3 + end + i32.const 65668 + local.get 3 + i32.store + end) + (func (;38;) (type 9) (param i32 i32 i32 i32 i32) + block ;; label = @1 + local.get 1 + local.get 2 + i32.le_u + if ;; label = @2 + local.get 4 + local.get 2 + i32.ge_u + if ;; label = @3 + local.get 2 + local.get 1 + i32.sub + local.tee 4 + local.get 2 + i32.gt_u + br_if 2 (;@1;) + local.get 0 + local.get 4 + i32.store offset=4 + local.get 0 + local.get 1 + local.get 3 + i32.add + i32.store + return + end + unreachable + end + unreachable + end + unreachable) + (func (;39;) (type 0) (param i32 i32) + (local i32) + block ;; label = @1 + local.get 0 + i32.load offset=8 + local.tee 2 + local.get 0 + i32.load offset=4 + i32.ge_u + br_if 0 (;@1;) + local.get 0 + i32.load + local.get 2 + i32.add + local.get 1 + i32.store8 + local.get 0 + i32.load offset=8 + local.tee 1 + i32.const 1 + i32.add + local.tee 2 + local.get 1 + i32.lt_u + br_if 0 (;@1;) + local.get 0 + local.get 2 + i32.store offset=8 + return + end + unreachable) + (func (;40;) (type 0) (param i32 i32) + (local i32) + global.get 0 + i32.const 16 + i32.sub + local.tee 2 + global.set 0 + local.get 2 + local.get 0 + i32.store offset=12 + local.get 1 + local.get 2 + i32.const 12 + i32.add + i32.const 4 + call 19 + local.get 2 + i32.const 16 + i32.add + global.set 0) + (func (;41;) (type 0) (param i32 i32) + (local i32 i64) + global.get 0 + i32.const 16 + i32.sub + local.tee 2 + global.set 0 + local.get 2 + i32.const 8 + i32.add + local.get 1 + i32.const 0 + call 35 + local.get 2 + i64.load offset=8 + local.set 3 + local.get 0 + i32.const 0 + i32.store offset=8 + local.get 0 + local.get 3 + i64.store align=4 + local.get 2 + i32.const 16 + i32.add + global.set 0) + (func (;42;) (type 0) (param i32 i32) + (local i32 i64) + local.get 1 + i32.load offset=4 + local.tee 2 + if ;; label = @1 + local.get 2 + i64.extend_i32_u + i64.const 12 + i64.mul + local.tee 3 + i64.const 32 + i64.shr_u + i64.eqz + if ;; label = @2 + local.get 0 + local.get 3 + i64.store32 offset=4 + local.get 0 + i32.const 8 + i32.add + i32.const 4 + i32.store + local.get 0 + local.get 1 + i32.load + i32.store + return + end + unreachable + end + local.get 0 + i32.const 0 + i32.store) + (func (;43;) (type 0) (param i32 i32) + (local i32 i32 i32 i32 i32) + block ;; label = @1 + local.get 1 + i32.load + local.tee 4 + local.get 1 + i32.load offset=4 + i32.eq + br_if 0 (;@1;) + local.get 1 + local.get 4 + i32.const 12 + i32.add + i32.store + block ;; label = @2 + local.get 1 + i32.const 16 + i32.add + i32.load + local.tee 5 + if ;; label = @3 + local.get 1 + i32.const 0 + i32.store offset=16 + local.get 1 + local.get 1 + i32.load offset=8 + local.tee 6 + local.get 5 + i32.const 12 + i32.mul + i32.add + local.tee 3 + i32.const 12 + i32.add + local.get 1 + i32.const 12 + i32.add + i32.load + local.tee 1 + local.get 1 + local.get 6 + i32.sub + i32.const 12 + i32.div_u + local.get 5 + i32.gt_u + local.tee 1 + select + i32.store offset=8 + local.get 1 + br_if 1 (;@2;) + br 2 (;@1;) + end + local.get 1 + i32.load offset=8 + local.tee 3 + local.get 1 + i32.const 12 + i32.add + i32.load + i32.eq + br_if 1 (;@1;) + local.get 1 + local.get 3 + i32.const 12 + i32.add + i32.store offset=8 + end + local.get 4 + local.set 2 + end + local.get 0 + local.get 3 + i32.store offset=4 + local.get 0 + local.get 2 + i32.store) + (func (;44;) (type 3) (param i32 i32 i32 i32) + (local i32) + local.get 2 + local.get 3 + i32.le_u + if ;; label = @1 + block ;; label = @2 + local.get 1 + i32.load offset=8 + local.get 3 + i32.ge_u + if ;; label = @3 + local.get 3 + local.get 2 + i32.sub + local.tee 4 + local.get 3 + i32.le_u + br_if 1 (;@2;) + unreachable + end + unreachable + end + local.get 1 + i32.load + local.set 1 + local.get 0 + local.get 4 + i32.store offset=4 + local.get 0 + local.get 1 + local.get 2 + i32.add + i32.store + return + end + unreachable) + (func (;45;) (type 1) (param i32 i32 i32) + (local i32 i32 i32) + global.get 0 + i32.const -64 + i32.add + local.tee 3 + global.set 0 + local.get 3 + i32.const 48 + i32.add + local.get 1 + local.get 2 + call 46 + local.get 3 + i32.const 32 + i32.add + local.get 3 + i32.const 48 + i32.add + call 47 + local.get 3 + i32.const 16 + i32.add + local.get 3 + i32.const 32 + i32.add + call 48 + local.get 3 + i32.const 32 + i32.add + call 49 + local.get 3 + i32.const 48 + i32.add + local.get 2 + call 41 + local.get 3 + i32.const 8 + i32.add + local.set 1 + local.get 3 + i32.const 48 + i32.add + local.tee 4 + i32.load offset=8 + local.get 3 + i32.load offset=24 + local.tee 2 + local.tee 5 + i32.lt_u + if ;; label = @1 + unreachable + end + local.get 1 + local.get 5 + i32.store offset=4 + local.get 1 + local.get 4 + i32.load + i32.store + local.get 3 + i32.load offset=12 + local.get 2 + i32.ne + if ;; label = @1 + unreachable + end + local.get 3 + i32.load offset=8 + local.get 3 + i32.load offset=16 + local.get 2 + call 81 + drop + local.get 0 + i32.const 0 + i32.store + local.get 0 + i32.const 12 + i32.add + local.get 3 + i32.const 56 + i32.add + i32.load + i32.store + local.get 0 + local.get 3 + i64.load offset=48 + i64.store offset=4 align=4 + local.get 3 + i32.const 16 + i32.add + call 26 + local.get 3 + i32.const -64 + i32.sub + global.set 0) + (func (;46;) (type 1) (param i32 i32 i32) + (local i32 i32 i32 i32) + global.get 0 + i32.const 80 + i32.sub + local.tee 3 + global.set 0 + block ;; label = @1 + block ;; label = @2 + local.get 2 + if ;; label = @3 + local.get 3 + i32.const 8 + i32.store8 offset=31 + local.get 3 + i32.const 0 + i32.store offset=40 + local.get 3 + i64.const 4 + i64.store offset=32 + local.get 3 + i32.const 48 + i32.add + local.get 2 + i32.const 4 + call 51 + block ;; label = @4 + local.get 3 + i32.load offset=52 + i32.const 1 + i32.ne + if ;; label = @5 + local.get 3 + i32.const 4 + i32.store offset=56 + local.get 3 + local.get 2 + i32.store offset=52 + local.get 3 + local.get 1 + i32.store offset=48 + local.get 3 + local.get 3 + i32.const 31 + i32.add + i32.store offset=60 + i32.const 4 + local.set 1 + loop ;; label = @6 + local.get 3 + i32.const 16 + i32.add + local.get 3 + i32.const 48 + i32.add + call 52 + local.get 3 + i32.load offset=16 + local.tee 2 + i32.eqz + br_if 2 (;@4;) + local.get 3 + i32.load offset=60 + i32.load8_u + local.get 2 + local.get 3 + i32.load offset=20 + call 53 + local.set 2 + local.get 3 + i32.load offset=36 + local.get 4 + i32.eq + if ;; label = @7 + local.get 3 + i32.const -64 + i32.sub + local.get 3 + i32.load offset=52 + local.get 3 + i32.load offset=56 + call 51 + local.get 3 + i32.const 32 + i32.add + i32.const -1 + local.get 3 + i32.load offset=64 + local.tee 1 + i32.const 1 + i32.add + local.tee 6 + local.get 6 + local.get 1 + i32.lt_u + select + call 54 + local.get 3 + i32.load offset=32 + local.set 1 + end + local.get 1 + local.get 5 + i32.add + local.get 2 + i32.store + local.get 4 + i32.const 1 + i32.add + local.tee 2 + local.get 4 + i32.lt_u + br_if 5 (;@1;) + local.get 3 + local.get 2 + i32.store offset=40 + local.get 5 + i32.const 4 + i32.add + local.set 5 + local.get 2 + local.set 4 + br 0 (;@6;) + end + unreachable + end + local.get 3 + i32.const 32 + i32.add + local.get 3 + i32.const 56 + i32.add + i32.load + call 54 + local.get 3 + i32.load offset=32 + local.get 3 + i32.load offset=40 + local.set 4 + local.get 3 + i32.const 4 + i32.store offset=56 + local.get 3 + local.get 2 + i32.store offset=52 + local.get 3 + local.get 1 + i32.store offset=48 + local.get 4 + i32.const 2 + i32.shl + i32.add + local.set 5 + loop ;; label = @5 + block ;; label = @6 + local.get 3 + i32.const 8 + i32.add + local.get 3 + i32.const 48 + i32.add + call 52 + local.get 3 + i32.load offset=8 + local.tee 1 + i32.eqz + br_if 0 (;@6;) + local.get 5 + local.get 3 + i32.load8_u offset=31 + local.get 1 + local.get 3 + i32.load offset=12 + call 53 + i32.store + local.get 4 + i32.const 1 + i32.add + local.tee 1 + local.get 4 + i32.lt_u + br_if 5 (;@1;) + local.get 5 + i32.const 4 + i32.add + local.set 5 + local.get 1 + local.set 4 + br 1 (;@5;) + end + end + local.get 3 + local.get 4 + i32.store offset=40 + end + local.get 3 + i32.const 56 + i32.add + local.get 3 + i32.const 40 + i32.add + i32.load + i32.store + local.get 3 + local.get 3 + i64.load offset=32 + i64.store offset=48 + local.get 0 + local.get 3 + i32.const 48 + i32.add + call 55 + br 1 (;@2;) + end + local.get 0 + i32.const 0 + i32.store offset=8 + local.get 0 + i64.const 4 + i64.store align=4 + end + local.get 3 + i32.const 80 + i32.add + global.set 0 + return + end + unreachable) + (func (;47;) (type 0) (param i32 i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i64 i64 i64) + global.get 0 + i32.const 176 + i32.sub + local.tee 2 + global.set 0 + local.get 2 + i32.const 8 + i32.add + i32.const 65599 + i32.const 48 + call 46 + local.get 2 + i32.const 24 + i32.add + local.get 2 + i32.const 8 + i32.add + call 56 + local.get 2 + i32.const 40 + i32.add + local.get 1 + call 56 + local.get 2 + i32.const -64 + i32.sub + local.get 2 + i32.const 16 + i32.add + i32.load + local.tee 3 + i32.store + local.get 2 + local.get 2 + i64.load offset=8 + local.tee 12 + i64.store offset=56 + local.get 3 + i32.const 2 + i32.shl + local.set 4 + local.get 12 + i32.wrap_i64 + local.set 3 + i64.const 0 + local.set 12 + block ;; label = @1 + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + block ;; label = @5 + block ;; label = @6 + block ;; label = @7 + block ;; label = @8 + block ;; label = @9 + loop ;; label = @10 + local.get 4 + if ;; label = @11 + local.get 13 + i64.const 63 + i64.gt_u + br_if 2 (;@9;) + local.get 4 + i32.const -4 + i32.add + local.set 4 + local.get 12 + local.get 3 + i64.load32_u + local.get 13 + i64.shl + i64.add + local.tee 14 + local.get 12 + i64.ge_u + local.get 13 + i64.const 32 + i64.add + local.set 13 + local.get 3 + i32.const 4 + i32.add + local.set 3 + local.get 14 + local.set 12 + br_if 1 (;@10;) + br 10 (;@1;) + end + end + local.get 12 + i64.const 4294967296 + i64.lt_u + br_if 1 (;@8;) + end + local.get 2 + i32.const 80 + i32.add + local.get 2 + i32.const 48 + i32.add + i32.load + i32.store + local.get 2 + local.get 2 + i64.load offset=40 + i64.store offset=72 + local.get 2 + i32.const 96 + i32.add + local.get 2 + i32.const -64 + i32.sub + i32.load + local.tee 5 + i32.store + local.get 2 + local.get 2 + i64.load offset=56 + i64.store offset=88 + local.get 5 + i32.eqz + br_if 7 (;@1;) + local.get 2 + i32.load offset=80 + local.tee 8 + i32.eqz + br_if 1 (;@7;) + local.get 5 + i32.const 1 + i32.ne + if ;; label = @9 + local.get 2 + i32.load offset=88 + local.set 6 + i32.const -1 + local.get 5 + local.get 8 + i32.ne + local.get 8 + local.get 5 + i32.lt_u + select + local.tee 7 + br_if 4 (;@5;) + local.get 6 + i32.const -4 + i32.add + local.set 10 + local.get 5 + i32.const 2 + i32.shl + local.set 4 + local.get 8 + i32.const 2 + i32.shl + local.set 3 + local.get 2 + i32.load offset=72 + i32.const -4 + i32.add + local.set 8 + loop ;; label = @10 + local.get 3 + i32.eqz + br_if 4 (;@6;) + local.get 4 + i32.eqz + br_if 6 (;@4;) + local.get 3 + local.get 8 + i32.add + local.set 7 + local.get 4 + local.get 10 + i32.add + local.set 9 + local.get 4 + i32.const -4 + i32.add + local.set 4 + local.get 3 + i32.const -4 + i32.add + local.set 3 + i32.const -1 + local.get 7 + i32.load + local.tee 7 + local.get 9 + i32.load + local.tee 9 + i32.ne + local.get 7 + local.get 9 + i32.lt_u + select + local.tee 7 + i32.eqz + br_if 0 (;@10;) + end + br 4 (;@5;) + end + block ;; label = @9 + local.get 2 + i32.load offset=88 + local.tee 3 + i32.const 65664 + i32.ne + if ;; label = @10 + local.get 3 + i32.load + i32.const 1 + i32.ne + br_if 1 (;@9;) + end + local.get 2 + i32.const 140 + i32.add + i32.const 0 + i32.store + local.get 2 + i32.const 128 + i32.add + local.get 2 + i32.const 80 + i32.add + i32.load + i32.store + local.get 2 + local.get 2 + i64.load offset=72 + i64.store offset=120 + local.get 2 + i64.const 4 + i64.store offset=132 align=4 + local.get 2 + i32.const 88 + i32.add + call 49 + br 6 (;@3;) + end + local.get 2 + i32.load offset=76 + local.set 7 + local.get 2 + i32.load offset=72 + local.set 4 + block ;; label = @9 + local.get 3 + i32.load + local.tee 5 + i32.const 65536 + i32.ge_u + if ;; label = @10 + local.get 8 + i32.const 2 + i32.shl + local.set 6 + local.get 4 + i32.const -4 + i32.add + local.set 10 + i32.const 0 + local.set 3 + loop ;; label = @11 + local.get 6 + i32.eqz + br_if 2 (;@9;) + local.get 2 + local.get 3 + local.get 6 + local.get 10 + i32.add + local.tee 9 + i32.load + local.get 5 + call 57 + local.get 2 + i32.load offset=4 + local.set 3 + local.get 9 + local.get 2 + i32.load + i32.store + local.get 6 + i32.const -4 + i32.add + local.set 6 + br 0 (;@11;) + end + unreachable + end + local.get 8 + i32.const 2 + i32.shl + local.set 6 + local.get 4 + i32.const -4 + i32.add + local.set 10 + i32.const 0 + local.set 3 + loop ;; label = @10 + local.get 6 + i32.eqz + br_if 1 (;@9;) + local.get 5 + i32.eqz + br_if 9 (;@1;) + local.get 6 + local.get 10 + i32.add + local.tee 9 + local.get 3 + i32.const 16 + i32.shl + local.get 9 + i32.load + local.tee 3 + i32.const 16 + i32.shr_u + i32.or + local.tee 9 + local.get 5 + i32.rem_u + i32.const 16 + i32.shl + local.get 3 + i32.const 65535 + i32.and + i32.or + local.tee 3 + local.get 5 + i32.div_u + local.get 9 + local.get 5 + i32.div_u + i32.const 16 + i32.shl + i32.or + i32.store + local.get 3 + local.get 5 + i32.rem_u + local.set 3 + local.get 6 + i32.const -4 + i32.add + local.set 6 + br 0 (;@10;) + end + unreachable + end + local.get 2 + local.get 8 + i32.store offset=128 + local.get 2 + local.get 7 + i32.store offset=124 + local.get 2 + local.get 4 + i32.store offset=120 + local.get 2 + i32.const 120 + i32.add + call 58 + local.get 2 + i32.const 168 + i32.add + local.get 2 + i32.load offset=128 + local.tee 5 + i32.store + local.get 2 + local.get 2 + i64.load offset=120 + local.tee 12 + i64.store offset=160 + local.get 2 + i32.const 152 + i32.add + local.tee 4 + local.get 5 + i32.store + local.get 2 + local.get 12 + i64.store offset=144 + local.get 2 + i32.const 0 + i32.store offset=96 + block ;; label = @9 + local.get 3 + i32.eqz + br_if 0 (;@9;) + local.get 2 + i32.const 88 + i32.add + i32.const 0 + call 59 + local.get 2 + i32.load offset=88 + local.get 2 + i32.load offset=96 + local.get 2 + local.get 3 + i32.store offset=120 + local.get 2 + i32.const 120 + i32.add + i32.const 1 + call 60 + local.tee 3 + i32.eqz + br_if 0 (;@9;) + local.get 2 + i32.const 88 + i32.add + local.get 3 + call 59 + end + local.get 2 + i32.const 128 + i32.add + local.get 4 + i32.load + i32.store + local.get 2 + i32.const 140 + i32.add + local.get 2 + i32.const 96 + i32.add + i32.load + i32.store + local.get 2 + local.get 2 + i64.load offset=144 + i64.store offset=120 + local.get 2 + local.get 2 + i64.load offset=88 + i64.store offset=132 align=4 + br 5 (;@3;) + end + local.get 2 + i32.load offset=48 + local.set 3 + local.get 2 + i32.load offset=40 + local.set 4 + block ;; label = @8 + local.get 12 + i32.wrap_i64 + local.tee 5 + i32.const 65536 + i32.ge_u + if ;; label = @9 + local.get 3 + i32.const 2 + i32.shl + local.set 3 + local.get 4 + i32.const -4 + i32.add + local.set 5 + i32.const 0 + local.set 4 + loop ;; label = @10 + local.get 3 + i32.eqz + br_if 2 (;@8;) + local.get 3 + local.get 5 + i32.add + i64.load32_u + local.get 4 + i64.extend_i32_u + i64.const 32 + i64.shl + i64.or + local.get 12 + i64.rem_u + i32.wrap_i64 + local.set 4 + local.get 3 + i32.const -4 + i32.add + local.set 3 + br 0 (;@10;) + end + unreachable + end + local.get 3 + i32.const 2 + i32.shl + local.set 3 + local.get 4 + i32.const -4 + i32.add + local.set 6 + i32.const 0 + local.set 4 + loop ;; label = @9 + local.get 3 + i32.eqz + br_if 1 (;@8;) + local.get 5 + i32.eqz + br_if 8 (;@1;) + local.get 4 + i32.const 16 + i32.shl + local.get 3 + local.get 6 + i32.add + i32.load + local.tee 4 + i32.const 16 + i32.shr_u + i32.or + local.get 5 + i32.rem_u + i32.const 16 + i32.shl + local.get 4 + i32.const 65535 + i32.and + i32.or + local.get 5 + i32.rem_u + local.set 4 + local.get 3 + i32.const -4 + i32.add + local.set 3 + br 0 (;@9;) + end + unreachable + end + local.get 2 + i32.const 0 + i32.store offset=168 + local.get 2 + i64.const 4 + i64.store offset=160 + local.get 4 + i64.extend_i32_u + local.set 13 + loop ;; label = @8 + local.get 13 + i64.eqz + i32.eqz + if ;; label = @9 + local.get 2 + i32.const 160 + i32.add + local.get 13 + i32.wrap_i64 + call 59 + i64.const 0 + local.set 13 + br 1 (;@8;) + end + end + local.get 2 + i32.const 56 + i32.add + call 49 + local.get 2 + i32.const 40 + i32.add + call 49 + br 5 (;@2;) + end + local.get 2 + i32.const 136 + i32.add + i64.const 0 + i64.store + local.get 2 + i64.const 17179869184 + i64.store offset=128 + local.get 2 + i64.const 4 + i64.store offset=120 + local.get 2 + i32.const 88 + i32.add + call 49 + local.get 2 + i32.const 72 + i32.add + call 49 + br 3 (;@3;) + end + i32.const -1 + i32.const 0 + local.get 4 + select + local.set 7 + end + block ;; label = @5 + block ;; label = @6 + local.get 7 + br_table 1 (;@5;) 2 (;@4;) 0 (;@6;) + end + local.get 2 + i32.const 140 + i32.add + local.get 2 + i32.const 80 + i32.add + i32.load + i32.store + local.get 2 + i32.const 0 + i32.store offset=128 + local.get 2 + i64.const 4 + i64.store offset=120 + local.get 2 + local.get 2 + i64.load offset=72 + i64.store offset=132 align=4 + local.get 2 + i32.const 88 + i32.add + call 49 + br 2 (;@3;) + end + local.get 2 + i32.const 0 + i32.store offset=80 + local.get 2 + i32.const 72 + i32.add + i32.const 1 + call 59 + local.get 2 + i32.const 140 + i32.add + i32.const 0 + i32.store + local.get 2 + i32.const 128 + i32.add + local.get 2 + i32.load offset=80 + i32.store + local.get 2 + i64.const 4 + i64.store offset=132 align=4 + local.get 2 + local.get 2 + i64.load offset=72 + i64.store offset=120 + local.get 2 + i32.const 88 + i32.add + call 49 + br 1 (;@3;) + end + block (result i32) ;; label = @4 + local.get 5 + i32.const 2 + i32.shl + local.get 6 + i32.add + i32.const -4 + i32.add + i32.load + local.tee 9 + i32.clz + local.tee 6 + if ;; label = @5 + local.get 2 + i32.const 128 + i32.add + local.tee 3 + local.get 2 + i32.const 80 + i32.add + i32.load + i32.store + local.get 2 + local.get 2 + i64.load offset=72 + i64.store offset=120 + local.get 2 + i32.const 144 + i32.add + local.get 2 + i32.const 120 + i32.add + local.get 6 + call 61 + local.get 3 + local.get 2 + i32.const 96 + i32.add + i32.load + i32.store + local.get 2 + local.get 2 + i64.load offset=88 + i64.store offset=120 + local.get 2 + i32.const 160 + i32.add + local.get 2 + i32.const 120 + i32.add + local.get 6 + call 61 + local.get 2 + i32.const 120 + i32.add + local.get 2 + i32.const 144 + i32.add + local.get 2 + i32.const 160 + i32.add + call 62 + local.get 2 + i32.const 160 + i32.add + call 49 + i32.const 0 + br 1 (;@4;) + end + local.get 2 + i32.const 168 + i32.add + local.get 2 + i32.const 80 + i32.add + i32.load + i32.store + local.get 2 + local.get 2 + i64.load offset=72 + i64.store offset=160 + local.get 2 + i32.const 120 + i32.add + local.get 2 + i32.const 160 + i32.add + local.get 2 + i32.const 88 + i32.add + call 62 + i32.const 1 + end + local.get 2 + i32.const 112 + i32.add + local.get 2 + i32.const 128 + i32.add + local.tee 3 + i32.load + i32.store + local.get 2 + local.get 2 + i64.load offset=120 + i64.store offset=104 + local.get 2 + i32.const 136 + i32.add + i32.load + local.set 10 + local.get 2 + i32.load offset=132 + local.set 5 + block ;; label = @4 + block ;; label = @5 + local.get 2 + i32.const 140 + i32.add + i32.load + local.tee 7 + if ;; label = @6 + local.get 7 + local.get 9 + i32.eqz + local.tee 8 + i32.le_u + br_if 1 (;@5;) + local.get 8 + i32.const 2 + i32.shl + local.set 4 + local.get 5 + local.set 3 + loop ;; label = @7 + local.get 4 + if ;; label = @8 + local.get 4 + i32.const -4 + i32.add + local.set 4 + local.get 3 + i32.const 4 + i32.add + local.set 3 + br 1 (;@7;) + end + end + local.get 7 + local.get 8 + i32.sub + local.tee 3 + i32.eqz + local.get 9 + i32.or + i32.eqz + if ;; label = @7 + local.get 5 + local.get 5 + local.get 8 + i32.const 2 + i32.shl + i32.add + local.get 3 + i32.const 2 + i32.shl + call 82 + end + local.get 2 + local.get 3 + i32.store offset=168 + local.get 2 + local.get 10 + i32.store offset=164 + local.get 2 + local.get 5 + i32.store offset=160 + block ;; label = @7 + local.get 6 + i32.const 31 + i32.and + local.tee 10 + i32.eqz + br_if 0 (;@7;) + local.get 7 + i32.const 2 + i32.shl + local.get 8 + i32.const 2 + i32.shl + i32.sub + local.set 4 + local.get 5 + i32.const -4 + i32.add + local.set 5 + i32.const 0 + local.set 3 + i32.const 0 + local.get 6 + i32.sub + i32.const 31 + i32.and + local.set 6 + loop ;; label = @8 + local.get 4 + i32.eqz + br_if 1 (;@7;) + local.get 4 + local.get 5 + i32.add + local.tee 7 + local.get 3 + local.get 7 + i32.load + local.tee 7 + local.get 10 + i32.shr_u + i32.or + i32.store + local.get 4 + i32.const -4 + i32.add + local.set 4 + local.get 7 + local.get 6 + i32.shl + local.set 3 + br 0 (;@8;) + end + unreachable + end + local.get 2 + i32.const 128 + i32.add + local.get 2 + i32.const 168 + i32.add + i32.load + i32.store + local.get 2 + local.get 2 + i64.load offset=160 + i64.store offset=120 + local.get 2 + i32.const 144 + i32.add + local.get 2 + i32.const 120 + i32.add + call 55 + br 2 (;@4;) + end + local.get 2 + i32.const 132 + i32.add + i32.const 0 + i32.store + local.get 3 + local.get 10 + i32.store + local.get 2 + local.get 5 + i32.store offset=124 + local.get 2 + i32.const 1 + i32.store offset=120 + local.get 2 + i32.const 144 + i32.add + local.get 2 + i32.const 120 + i32.add + call 63 + br 1 (;@4;) + end + local.get 2 + i32.const 132 + i32.add + local.get 7 + i32.store + local.get 2 + i32.const 128 + i32.add + local.get 10 + i32.store + local.get 2 + local.get 5 + i32.store offset=124 + local.get 2 + i32.const 1 + i32.store offset=120 + local.get 2 + i32.const 160 + i32.add + local.get 2 + i32.const 120 + i32.add + call 63 + local.get 2 + i32.const 152 + i32.add + i32.const 0 + i32.store + local.get 2 + local.get 2 + i64.load offset=160 + i64.store offset=144 + end + local.get 2 + i32.const 128 + i32.add + local.get 2 + i32.const 112 + i32.add + i32.load + i32.store + local.get 2 + i32.const 140 + i32.add + local.get 2 + i32.const 152 + i32.add + i32.load + i32.store + local.get 2 + local.get 2 + i64.load offset=104 + i64.store offset=120 + local.get 2 + local.get 2 + i64.load offset=144 + i64.store offset=132 align=4 + i32.eqz + br_if 0 (;@3;) + local.get 2 + i32.const 88 + i32.add + call 49 + end + local.get 2 + i32.const 168 + i32.add + local.get 2 + i32.const 140 + i32.add + i32.load + i32.store + local.get 2 + local.get 2 + i64.load offset=132 align=4 + i64.store offset=160 + local.get 2 + i32.const 120 + i32.add + call 49 + end + local.get 2 + i32.const 128 + i32.add + local.get 2 + i32.const 32 + i32.add + i32.load + local.tee 10 + i32.store + local.get 2 + local.get 2 + i64.load offset=24 + local.tee 12 + i64.store offset=120 + local.get 2 + i32.load offset=168 + local.tee 8 + local.get 8 + local.get 10 + local.get 10 + local.get 8 + i32.gt_u + select + local.tee 5 + i32.sub + local.get 8 + i32.gt_u + br_if 0 (;@1;) + local.get 12 + i32.wrap_i64 + local.tee 4 + local.get 5 + i32.const 2 + i32.shl + i32.add + local.set 7 + i32.const 0 + local.set 9 + local.get 5 + local.set 3 + local.get 2 + i32.load offset=160 + local.tee 11 + local.set 6 + loop ;; label = @2 + local.get 3 + if ;; label = @3 + local.get 4 + local.get 4 + i64.load32_u + local.get 6 + i64.load32_u + i64.sub + local.get 9 + i64.extend_i32_u + i64.const 255 + i64.and + i64.sub + local.tee 12 + i64.store32 + local.get 12 + i64.const 63 + i64.shr_u + i32.wrap_i64 + local.set 9 + local.get 3 + i32.const -1 + i32.add + local.set 3 + local.get 4 + i32.const 4 + i32.add + local.set 4 + local.get 6 + i32.const 4 + i32.add + local.set 6 + br 1 (;@2;) + else + local.get 5 + i32.const 2 + i32.shl + local.set 5 + local.get 9 + if ;; label = @4 + local.get 10 + i32.const 2 + i32.shl + local.get 5 + i32.sub + local.set 4 + loop ;; label = @5 + local.get 4 + i32.eqz + br_if 4 (;@1;) + local.get 7 + local.get 7 + i32.load + local.tee 3 + i32.const -1 + i32.add + i32.store + local.get 4 + i32.const -4 + i32.add + local.set 4 + local.get 7 + i32.const 4 + i32.add + local.set 7 + local.get 3 + i32.eqz + br_if 0 (;@5;) + end + end + local.get 5 + local.get 11 + i32.add + local.set 3 + local.get 8 + i32.const 2 + i32.shl + local.get 5 + i32.sub + local.set 4 + loop ;; label = @4 + local.get 4 + if ;; label = @5 + local.get 4 + i32.const -4 + i32.add + local.set 4 + local.get 3 + i32.load + local.get 3 + i32.const 4 + i32.add + local.set 3 + i32.eqz + br_if 1 (;@4;) + br 4 (;@1;) + end + end + local.get 2 + i32.const 120 + i32.add + call 58 + local.get 0 + local.get 2 + i64.load offset=120 + i64.store align=4 + local.get 0 + i32.const 8 + i32.add + local.get 2 + i32.const 128 + i32.add + i32.load + i32.store + local.get 2 + i32.const 160 + i32.add + call 49 + local.get 1 + call 49 + local.get 2 + i32.const 176 + i32.add + global.set 0 + return + end + unreachable + end + unreachable + end + unreachable) + (func (;48;) (type 0) (param i32 i32) + (local i32 i32 i32 i32 i32 i32 i64 i64) + global.get 0 + i32.const 16 + i32.sub + local.tee 3 + global.set 0 + block ;; label = @1 + block ;; label = @2 + local.get 1 + i32.load offset=8 + local.tee 2 + if ;; label = @3 + block ;; label = @4 + local.get 2 + i64.extend_i32_u + i64.const 5 + i64.shl + local.tee 8 + local.get 1 + i32.load + local.tee 5 + local.get 2 + i32.const -1 + i32.add + local.tee 6 + i32.const 2 + i32.shl + i32.add + local.tee 7 + i32.load + i32.clz + i64.extend_i32_u + i64.sub + local.tee 9 + local.get 8 + i64.le_u + if ;; label = @5 + local.get 3 + i32.const 8 + i32.add + local.get 9 + i64.const 7 + i64.and + i64.const 0 + i64.ne + i64.extend_i32_u + local.get 9 + i64.const 3 + i64.shr_u + i64.add + local.tee 8 + i64.const 4294967295 + local.get 8 + i64.const 4294967295 + i64.lt_u + select + i32.wrap_i64 + i32.const 0 + call 35 + local.get 3 + i64.load offset=8 + local.set 8 + local.get 0 + i32.const 0 + i32.store offset=8 + local.get 0 + local.get 8 + i64.store align=4 + local.get 5 + local.set 2 + br 1 (;@4;) + end + unreachable + end + loop ;; label = @4 + local.get 2 + local.get 7 + i32.eq + if ;; label = @5 + local.get 5 + local.get 6 + i32.const 2 + i32.shl + i32.add + i32.load + local.set 1 + loop ;; label = @6 + local.get 1 + i32.eqz + br_if 4 (;@2;) + local.get 0 + local.get 1 + call 64 + local.get 1 + i32.const 8 + i32.shr_u + local.set 1 + br 0 (;@6;) + end + unreachable + else + local.get 2 + i32.load + local.set 4 + i32.const 0 + local.set 1 + loop ;; label = @6 + local.get 1 + i32.const 255 + i32.and + i32.const 3 + i32.le_u + if ;; label = @7 + local.get 0 + local.get 4 + call 64 + local.get 4 + i32.const 8 + i32.shr_u + local.set 4 + local.get 1 + i32.const 1 + i32.add + local.set 1 + br 1 (;@6;) + end + end + local.get 2 + i32.const 4 + i32.add + local.set 2 + br 1 (;@4;) + end + unreachable + end + unreachable + end + i32.const 1 + i32.const 1 + call 13 + local.tee 1 + i32.eqz + br_if 1 (;@1;) + local.get 0 + i64.const 4294967297 + i64.store offset=4 align=4 + local.get 0 + local.get 1 + i32.store + local.get 1 + i32.const 0 + i32.store8 + end + local.get 3 + i32.const 16 + i32.add + global.set 0 + return + end + unreachable) + (func (;49;) (type 2) (param i32) + (local i32) + global.get 0 + i32.const 16 + i32.sub + local.tee 1 + global.set 0 + local.get 1 + local.get 0 + call 66 + local.get 1 + i32.load + local.tee 0 + if ;; label = @1 + local.get 0 + local.get 1 + i32.load offset=4 + call 71 + end + local.get 1 + i32.const 16 + i32.add + global.set 0) + (func (;50;) (type 3) (param i32 i32 i32 i32) + (local i32 i32 i32) + global.get 0 + i32.const 96 + i32.sub + local.tee 4 + global.set 0 + local.get 4 + i32.const 8 + i32.add + local.get 3 + i32.const 0 + call 35 + local.get 4 + local.get 4 + i32.load offset=12 + i32.store offset=52 + local.get 4 + local.get 4 + i32.load offset=8 + local.tee 5 + i32.store offset=48 + local.get 5 + local.get 2 + local.get 3 + call 81 + local.set 2 + local.get 4 + local.get 3 + i32.store offset=56 + local.get 4 + i64.const 16384 + i64.store offset=36 align=4 + local.get 4 + i32.const 65672 + i32.store offset=32 + block ;; label = @1 + block ;; label = @2 + block ;; label = @3 + local.get 3 + i32.const 64 + i32.ge_u + if ;; label = @4 + local.get 3 + i32.const 16384 + i32.lt_u + br_if 1 (;@3;) + local.get 3 + i32.const 1073741824 + i32.lt_u + br_if 2 (;@2;) + local.get 4 + i32.const 32 + i32.add + i32.const 3 + call 39 + local.get 3 + local.get 4 + i32.const 32 + i32.add + call 40 + br 3 (;@1;) + end + local.get 4 + i32.const 32 + i32.add + local.get 3 + i32.const 2 + i32.shl + call 39 + br 2 (;@1;) + end + local.get 4 + local.get 3 + i32.const 2 + i32.shl + i32.const 1 + i32.or + i32.store16 offset=72 + local.get 4 + i32.const 32 + i32.add + local.get 4 + i32.const 72 + i32.add + i32.const 2 + call 19 + br 1 (;@1;) + end + local.get 3 + i32.const 2 + i32.shl + i32.const 2 + i32.or + local.get 4 + i32.const 32 + i32.add + call 40 + end + local.get 4 + i32.const 32 + i32.add + local.get 2 + local.get 3 + call 19 + local.get 4 + i32.load offset=36 + local.tee 5 + local.get 4 + i32.load offset=40 + local.tee 2 + i32.ge_u + if ;; label = @1 + local.get 4 + i32.load offset=32 + local.set 3 + local.get 4 + local.get 5 + local.get 2 + i32.sub + local.tee 5 + i32.store offset=68 + local.get 4 + local.get 2 + local.get 3 + i32.add + local.tee 6 + i32.store offset=64 + local.get 4 + local.get 5 + i32.store offset=32 + local.get 1 + local.get 3 + local.get 2 + local.get 6 + local.get 4 + i32.const 32 + i32.add + call 3 + local.set 1 + local.get 4 + i32.const -64 + i32.sub + local.get 4 + i32.load offset=32 + call 23 + block (result i32) ;; label = @2 + block (result i32) ;; label = @3 + block ;; label = @4 + block ;; label = @5 + block ;; label = @6 + block ;; label = @7 + block ;; label = @8 + block ;; label = @9 + block ;; label = @10 + block ;; label = @11 + block ;; label = @12 + block ;; label = @13 + local.get 1 + br_table 1 (;@12;) 3 (;@10;) 4 (;@9;) 5 (;@8;) 6 (;@7;) 7 (;@6;) 8 (;@5;) 9 (;@4;) 0 (;@13;) 2 (;@11;) + end + i32.const 8 + br 9 (;@3;) + end + local.get 4 + local.get 4 + i64.load offset=64 + i64.store offset=88 + local.get 4 + i32.const 72 + i32.add + local.get 4 + i32.const 88 + i32.add + call 14 + i32.const 0 + local.set 2 + block (result i32) ;; label = @12 + i32.const 1 + local.get 4 + i32.load offset=72 + i32.eqz + br_if 0 (;@12;) + drop + local.get 4 + i32.const 42 + i32.add + local.get 4 + i32.const 80 + i32.add + i32.load + i32.store align=2 + local.get 4 + local.get 4 + i64.load offset=72 + i64.store offset=34 align=2 + i32.const 0 + end + br 9 (;@2;) + end + i32.const 9 + br 7 (;@3;) + end + i32.const 1 + br 6 (;@3;) + end + i32.const 2 + br 5 (;@3;) + end + i32.const 3 + br 4 (;@3;) + end + i32.const 4 + br 3 (;@3;) + end + i32.const 5 + br 2 (;@3;) + end + i32.const 6 + br 1 (;@3;) + end + i32.const 7 + end + local.set 2 + i32.const 1 + end + local.set 3 + local.get 4 + local.get 4 + i64.load offset=32 align=2 + i64.store offset=16 + local.get 4 + local.get 4 + i32.const 38 + i32.add + i64.load align=2 + i64.store offset=22 align=2 + local.get 0 + block (result i32) ;; label = @2 + local.get 3 + i32.eqz + if ;; label = @3 + local.get 0 + local.get 4 + i64.load offset=18 align=2 + i64.store offset=4 align=2 + local.get 0 + i32.const 12 + i32.add + local.get 4 + i32.const 26 + i32.add + i32.load align=2 + i32.store align=2 + local.get 4 + i32.const 48 + i32.add + call 26 + i32.const 0 + br 1 (;@2;) + end + local.get 0 + local.get 2 + i32.store8 offset=5 + local.get 0 + i32.const 2 + i32.store8 offset=4 + local.get 4 + i32.const 48 + i32.add + call 26 + i32.const 1 + end + i32.store + local.get 4 + i32.const 96 + i32.add + global.set 0 + return + end + unreachable) + (func (;51;) (type 1) (param i32 i32 i32) + (local i32) + local.get 1 + if ;; label = @1 + block ;; label = @2 + local.get 2 + i32.eqz + br_if 0 (;@2;) + local.get 1 + local.get 2 + i32.div_u + local.set 3 + block ;; label = @3 + local.get 1 + local.get 2 + i32.rem_u + i32.eqz + if ;; label = @4 + local.get 3 + local.set 1 + br 1 (;@3;) + end + local.get 3 + i32.const 1 + i32.add + local.tee 1 + local.get 3 + i32.lt_u + br_if 1 (;@2;) + end + local.get 0 + i32.const 1 + i32.store offset=4 + local.get 0 + local.get 1 + i32.store + local.get 0 + i32.const 8 + i32.add + local.get 1 + i32.store + return + end + unreachable + end + local.get 0 + i64.const 4294967296 + i64.store align=4 + local.get 0 + i32.const 8 + i32.add + i32.const 0 + i32.store) + (func (;52;) (type 0) (param i32 i32) + (local i32 i32 i32) + block ;; label = @1 + block ;; label = @2 + local.get 1 + i32.load offset=4 + local.tee 2 + i32.eqz + if ;; label = @3 + i32.const 0 + local.set 2 + br 1 (;@2;) + end + local.get 2 + local.get 1 + i32.load offset=8 + local.tee 3 + local.get 2 + local.get 2 + local.get 3 + i32.gt_u + select + local.tee 3 + i32.sub + local.tee 4 + local.get 2 + i32.gt_u + br_if 1 (;@1;) + local.get 1 + i32.load + local.set 2 + local.get 1 + local.get 4 + i32.store offset=4 + local.get 1 + local.get 2 + local.get 3 + i32.add + i32.store + end + local.get 0 + local.get 3 + i32.store offset=4 + local.get 0 + local.get 2 + i32.store + return + end + unreachable) + (func (;53;) (type 4) (param i32 i32 i32) (result i32) + (local i32 i32) + local.get 1 + i32.const -1 + i32.add + local.set 3 + local.get 0 + i32.const 255 + i32.and + local.set 1 + i32.const 0 + local.set 0 + block ;; label = @1 + loop ;; label = @2 + local.get 2 + if ;; label = @3 + local.get 1 + i32.const 32 + i32.ge_u + br_if 2 (;@1;) + local.get 2 + local.get 3 + i32.add + local.get 2 + i32.const -1 + i32.add + local.set 2 + i32.load8_u + local.get 0 + local.get 1 + i32.shl + i32.or + local.set 0 + br 1 (;@2;) + end + end + local.get 0 + return + end + unreachable) + (func (;54;) (type 0) (param i32 i32) + (local i32 i32 i32) + global.get 0 + i32.const 48 + i32.sub + local.tee 2 + global.set 0 + block (result i32) ;; label = @1 + block ;; label = @2 + local.get 0 + i32.load offset=4 + local.tee 3 + local.get 0 + i32.load offset=8 + local.tee 4 + i32.sub + local.get 1 + i32.ge_u + br_if 0 (;@2;) + local.get 1 + local.get 4 + i32.add + local.tee 1 + local.get 4 + i32.lt_u + if ;; label = @3 + i32.const 0 + local.set 1 + i32.const 1 + br 2 (;@1;) + end + local.get 3 + local.get 3 + i32.add + local.tee 4 + local.get 3 + i32.ge_u + if ;; label = @3 + local.get 2 + i32.const 8 + i32.add + local.get 4 + local.get 1 + local.get 4 + local.get 1 + i32.gt_u + select + local.tee 1 + i32.const 4 + local.get 1 + i32.const 4 + i32.gt_u + select + call 65 + local.get 2 + i32.load offset=12 + local.set 1 + local.get 2 + i32.load offset=8 + local.set 3 + local.get 2 + i32.const 32 + i32.add + local.get 0 + call 66 + local.get 2 + i32.const 16 + i32.add + local.get 3 + local.get 1 + local.get 2 + i32.const 32 + i32.add + call 15 + local.get 2 + i32.const 24 + i32.add + i32.load + local.set 1 + i32.const 1 + local.get 2 + i32.load offset=16 + i32.const 1 + i32.eq + br_if 2 (;@1;) + drop + local.get 0 + local.get 2 + i32.load offset=20 + i32.store + local.get 0 + local.get 1 + i32.const 2 + i32.shr_u + i32.store offset=4 + br 1 (;@2;) + end + unreachable + end + i32.const 0 + end + local.get 1 + call 67 + local.get 2 + i32.const 48 + i32.add + global.set 0) + (func (;55;) (type 0) (param i32 i32) + (local i32 i32) + global.get 0 + i32.const 16 + i32.sub + local.tee 2 + global.set 0 + local.get 2 + i32.const 8 + i32.add + local.tee 3 + local.get 1 + i32.const 8 + i32.add + i32.load + i32.store + local.get 2 + local.get 1 + i64.load align=4 + i64.store + local.get 2 + call 58 + local.get 0 + i32.const 8 + i32.add + local.get 3 + i32.load + i32.store + local.get 0 + local.get 2 + i64.load + i64.store align=4 + local.get 2 + i32.const 16 + i32.add + global.set 0) + (func (;56;) (type 0) (param i32 i32) + (local i32) + local.get 1 + i32.load + local.set 2 + local.get 0 + local.get 1 + i32.load offset=8 + local.tee 1 + call 68 + local.get 0 + i32.load + local.get 2 + local.get 1 + i32.const 2 + i32.shl + call 81 + drop + local.get 0 + local.get 1 + i32.store offset=8) + (func (;57;) (type 3) (param i32 i32 i32 i32) + (local i64 i64) + local.get 3 + if ;; label = @1 + local.get 0 + local.get 2 + i64.extend_i32_u + local.get 1 + i64.extend_i32_u + i64.const 32 + i64.shl + i64.or + local.tee 4 + local.get 3 + i64.extend_i32_u + local.tee 5 + i64.rem_u + i64.store32 offset=4 + local.get 0 + local.get 4 + local.get 5 + i64.div_u + i64.store32 + return + end + unreachable) + (func (;58;) (type 2) (param i32) + (local i32 i32 i32 i32 i32 i32) + global.get 0 + i32.const 32 + i32.sub + local.tee 3 + global.set 0 + loop ;; label = @1 + block ;; label = @2 + local.get 0 + i32.load offset=8 + local.tee 1 + i32.eqz + if ;; label = @3 + br 1 (;@2;) + end + local.get 0 + i32.load + local.get 1 + i32.const 2 + i32.shl + i32.add + i32.const -4 + i32.add + i32.load + if ;; label = @3 + local.get 1 + local.set 2 + else + local.get 3 + i32.const 8 + i32.add + local.get 0 + call 72 + br 2 (;@1;) + end + end + end + local.get 2 + local.get 0 + i32.load offset=4 + local.tee 4 + i32.const 2 + i32.shr_u + i32.ge_u + local.get 4 + local.get 1 + i32.le_u + i32.or + i32.eqz + if ;; label = @1 + local.get 3 + i32.const 16 + i32.add + local.get 0 + call 66 + block (result i32) ;; label = @2 + local.get 3 + i32.load offset=16 + local.tee 4 + if ;; label = @3 + block ;; label = @4 + local.get 1 + local.get 1 + i32.const 1073741823 + i32.and + i32.eq + if ;; label = @5 + local.get 3 + i32.const 24 + i32.add + i32.load + local.set 2 + local.get 3 + i32.load offset=20 + local.set 5 + block ;; label = @6 + local.get 1 + i32.const 2 + i32.shl + local.tee 6 + if ;; label = @7 + local.get 4 + local.get 5 + local.get 2 + local.get 6 + call 28 + local.tee 1 + i32.eqz + br_if 1 (;@6;) + br 3 (;@4;) + end + local.get 4 + local.get 5 + call 71 + local.get 2 + local.tee 1 + br_if 2 (;@4;) + i32.const 0 + local.set 2 + end + i32.const 1 + br 3 (;@2;) + end + unreachable + end + local.get 0 + local.get 1 + i32.store + local.get 0 + local.get 6 + i32.const 2 + i32.shr_u + i32.store offset=4 + end + i32.const 0 + end + local.get 2 + call 67 + end + local.get 3 + i32.const 32 + i32.add + global.set 0) + (func (;59;) (type 0) (param i32 i32) + (local i32) + local.get 0 + i32.load offset=8 + local.tee 2 + local.get 0 + i32.load offset=4 + i32.eq + if ;; label = @1 + local.get 0 + i32.const 1 + call 54 + local.get 0 + i32.load offset=8 + local.set 2 + end + local.get 0 + i32.load + local.get 2 + i32.const 2 + i32.shl + i32.add + local.get 1 + i32.store + local.get 0 + i32.load offset=8 + local.tee 1 + i32.const 1 + i32.add + local.tee 2 + local.get 1 + i32.ge_u + if ;; label = @1 + local.get 0 + local.get 2 + i32.store offset=8 + return + end + unreachable) + (func (;60;) (type 6) (param i32 i32 i32 i32) (result i32) + (local i32 i32 i32 i64) + local.get 1 + local.get 3 + i32.ge_u + if ;; label = @1 + local.get 0 + local.get 3 + i32.const 2 + i32.shl + i32.add + local.set 6 + local.get 3 + local.set 5 + loop ;; label = @2 + local.get 5 + if ;; label = @3 + local.get 0 + local.get 2 + i64.load32_u + local.get 0 + i64.load32_u + local.get 4 + i64.extend_i32_u + i64.const 255 + i64.and + i64.add + i64.add + local.tee 7 + i64.store32 + local.get 5 + i32.const -1 + i32.add + local.set 5 + local.get 0 + i32.const 4 + i32.add + local.set 0 + local.get 2 + i32.const 4 + i32.add + local.set 2 + local.get 7 + i64.const 32 + i64.shr_u + i32.wrap_i64 + local.set 4 + br 1 (;@2;) + else + i32.const 0 + local.set 5 + block ;; label = @4 + local.get 4 + i32.const 255 + i32.and + i32.eqz + br_if 0 (;@4;) + local.get 1 + i32.const 2 + i32.shl + local.get 3 + i32.const 2 + i32.shl + i32.sub + local.set 0 + loop ;; label = @5 + local.get 0 + i32.eqz + if ;; label = @6 + local.get 4 + local.set 5 + br 2 (;@4;) + end + local.get 6 + local.get 6 + i64.load32_u + local.get 4 + i64.extend_i32_u + i64.const 255 + i64.and + i64.add + local.tee 7 + i64.store32 + local.get 0 + i32.const -4 + i32.add + local.set 0 + local.get 6 + i32.const 4 + i32.add + local.set 6 + i32.const 1 + local.set 4 + local.get 7 + i64.const 4294967296 + i64.and + i64.const 0 + i64.ne + br_if 0 (;@5;) + end + end + local.get 5 + i32.const 255 + i32.and + return + end + unreachable + end + unreachable + end + unreachable) + (func (;61;) (type 1) (param i32 i32 i32) + (local i32 i32 i32 i32 i32 i32 i32 i64) + global.get 0 + i32.const -64 + i32.add + local.tee 3 + global.set 0 + local.get 1 + i64.load align=4 + local.set 10 + block ;; label = @1 + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + local.get 1 + i32.load offset=8 + local.tee 1 + if ;; label = @5 + local.get 3 + i32.const 28 + i32.add + local.get 1 + i32.store + local.get 3 + i32.const 1 + i32.store offset=16 + local.get 3 + local.get 10 + i64.store offset=20 align=4 + local.get 2 + i32.const 5 + i32.shr_u + local.tee 7 + i32.eqz + br_if 1 (;@4;) + local.get 1 + i32.const 1 + i32.add + local.tee 5 + local.get 1 + i32.lt_u + br_if 2 (;@3;) + local.get 10 + i32.wrap_i64 + local.set 8 + local.get 3 + i32.const 48 + i32.add + i32.const -1 + local.get 5 + local.get 7 + i32.add + local.tee 1 + local.get 1 + local.get 7 + i32.lt_u + select + call 68 + local.get 3 + i32.const 48 + i32.add + local.get 7 + call 54 + local.get 7 + i32.const -1 + i32.add + local.set 6 + local.get 3 + i32.load offset=56 + local.tee 1 + local.get 7 + i32.add + local.set 9 + local.get 3 + i32.load offset=48 + local.get 1 + i32.const 2 + i32.shl + i32.add + local.set 4 + loop ;; label = @6 + local.get 4 + i32.const 0 + i32.store + local.get 1 + i32.const 1 + i32.add + local.tee 5 + local.get 1 + i32.lt_u + br_if 3 (;@3;) + local.get 6 + if ;; label = @7 + local.get 4 + i32.const 4 + i32.add + local.set 4 + local.get 6 + i32.const -1 + i32.add + local.set 6 + local.get 5 + local.set 1 + br 1 (;@6;) + end + end + local.get 3 + local.get 9 + i32.store offset=56 + local.get 3 + i32.const 48 + i32.add + local.get 3 + i32.load offset=28 + local.tee 1 + call 54 + local.get 3 + i32.load offset=48 + local.get 3 + i32.load offset=56 + local.tee 5 + i32.const 2 + i32.shl + i32.add + local.get 8 + local.get 1 + i32.const 2 + i32.shl + call 81 + drop + local.get 1 + local.get 5 + i32.add + local.tee 1 + local.get 5 + i32.lt_u + br_if 2 (;@3;) + local.get 3 + i32.const 40 + i32.add + local.get 1 + i32.store + local.get 3 + local.get 3 + i64.load offset=48 + i64.store offset=32 + i32.const 1 + local.set 5 + br 3 (;@2;) + end + local.get 3 + i32.const 60 + i32.add + i32.const 0 + i32.store + local.get 3 + local.get 10 + i64.store offset=52 align=4 + local.get 3 + i32.const 1 + i32.store offset=48 + local.get 0 + local.get 3 + i32.const 48 + i32.add + call 63 + br 3 (;@1;) + end + local.get 3 + i32.const 56 + i32.add + local.get 3 + i32.const 24 + i32.add + i64.load + i64.store + local.get 3 + local.get 3 + i64.load offset=16 + i64.store offset=48 + local.get 3 + i32.const 32 + i32.add + local.get 3 + i32.const 48 + i32.add + call 63 + br 1 (;@2;) + end + unreachable + end + block ;; label = @2 + local.get 2 + i32.const 31 + i32.and + local.tee 8 + i32.eqz + br_if 0 (;@2;) + local.get 3 + i32.const 8 + i32.add + local.get 3 + i32.const 32 + i32.add + local.get 7 + call 73 + i32.const 0 + local.set 4 + i32.const 0 + local.get 2 + i32.sub + i32.const 31 + i32.and + local.set 2 + local.get 3 + i32.load offset=12 + i32.const 2 + i32.shl + local.set 6 + local.get 3 + i32.load offset=8 + local.set 1 + loop ;; label = @3 + local.get 6 + if ;; label = @4 + local.get 1 + local.get 4 + local.get 1 + i32.load + local.tee 4 + local.get 8 + i32.shl + i32.or + i32.store + local.get 6 + i32.const -4 + i32.add + local.set 6 + local.get 1 + i32.const 4 + i32.add + local.set 1 + local.get 4 + local.get 2 + i32.shr_u + local.set 4 + br 1 (;@3;) + else + local.get 4 + i32.eqz + br_if 2 (;@2;) + local.get 3 + i32.const 32 + i32.add + local.get 4 + call 59 + end + end + end + local.get 3 + i32.const 56 + i32.add + local.get 3 + i32.const 40 + i32.add + i32.load + i32.store + local.get 3 + local.get 3 + i64.load offset=32 + i64.store offset=48 + local.get 0 + local.get 3 + i32.const 48 + i32.add + call 55 + local.get 5 + i32.eqz + br_if 0 (;@1;) + local.get 3 + i32.const 16 + i32.add + i32.const 4 + i32.or + call 49 + end + local.get 3 + i32.const -64 + i32.sub + global.set 0) + (func (;62;) (type 1) (param i32 i32 i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i64 i64 i64 i64 i64 i64 i64 i64) + global.get 0 + i32.const 80 + i32.sub + local.tee 3 + global.set 0 + block ;; label = @1 + local.get 2 + i32.load offset=8 + local.tee 4 + i32.eqz + br_if 0 (;@1;) + local.get 4 + i32.const -2 + i32.add + local.tee 7 + local.get 4 + i32.gt_u + local.get 4 + local.get 7 + i32.le_u + i32.or + br_if 0 (;@1;) + local.get 1 + i32.load offset=8 + local.tee 8 + local.get 4 + i32.sub + local.tee 5 + local.get 8 + i32.gt_u + br_if 0 (;@1;) + local.get 5 + i32.const 1 + i32.add + local.tee 8 + local.get 5 + i32.lt_u + br_if 0 (;@1;) + local.get 2 + i32.load + local.tee 5 + local.get 4 + i32.const 2 + i32.shl + i32.add + i32.const -4 + i32.add + i32.load + local.set 11 + local.get 5 + local.get 7 + i32.const 2 + i32.shl + i32.add + i64.load32_u + local.set 20 + local.get 3 + i32.const 40 + i32.add + local.get 8 + i32.const 1 + call 69 + i64.const 0 + local.get 11 + i64.extend_i32_u + local.tee 17 + i64.sub + local.set 21 + local.get 17 + i64.const 32 + i64.shl + local.set 22 + local.get 3 + i32.load offset=44 + local.set 14 + local.get 3 + i32.load offset=40 + local.set 13 + local.get 8 + local.set 7 + loop ;; label = @2 + block ;; label = @3 + local.get 7 + if ;; label = @4 + local.get 1 + i32.load offset=8 + local.tee 4 + i32.eqz + br_if 3 (;@1;) + local.get 4 + i32.const -2 + i32.add + local.tee 6 + local.get 4 + i32.gt_u + local.get 4 + local.get 6 + i32.le_u + i32.or + br_if 3 (;@1;) + local.get 1 + i32.load + local.tee 5 + local.get 4 + i32.const 2 + i32.shl + i32.add + i32.const -4 + i32.add + i32.load + local.set 4 + local.get 5 + local.get 6 + i32.const 2 + i32.shl + i32.add + i64.load32_u + local.set 16 + block (result i32) ;; label = @5 + local.get 9 + local.get 11 + i32.lt_u + if ;; label = @6 + local.get 3 + i32.const 32 + i32.add + local.get 9 + local.get 4 + local.get 11 + call 57 + local.get 3 + i64.load32_u offset=36 + local.set 15 + local.get 3 + i32.load offset=32 + br 1 (;@5;) + end + local.get 4 + i64.extend_i32_u + local.get 9 + i64.extend_i32_u + i64.add + local.set 15 + i32.const -1 + end + local.set 4 + local.get 7 + i32.const -1 + i32.add + local.set 7 + local.get 15 + local.get 21 + i64.add + local.set 18 + local.get 15 + i64.const 32 + i64.shl + local.set 15 + loop ;; label = @5 + local.get 17 + local.get 18 + i64.add + local.tee 18 + i64.const 4294967296 + i64.ge_u + if ;; label = @6 + local.get 4 + i64.extend_i32_u + local.set 19 + br 3 (;@3;) + end + local.get 15 + local.get 16 + i64.or + local.get 4 + i64.extend_i32_u + local.tee 19 + local.get 20 + i64.mul + i64.ge_u + br_if 2 (;@3;) + local.get 15 + local.get 22 + i64.add + local.set 15 + local.get 4 + i32.const -1 + i32.add + local.get 4 + i32.gt_u + local.get 4 + i32.const -1 + i32.add + local.set 4 + i32.eqz + br_if 0 (;@5;) + end + br 3 (;@1;) + end + local.get 1 + local.get 9 + call 59 + local.get 1 + call 58 + local.get 3 + local.get 8 + i32.store offset=72 + local.get 3 + local.get 14 + i32.store offset=68 + local.get 3 + local.get 13 + i32.store offset=64 + local.get 3 + i32.const -64 + i32.sub + call 58 + local.get 3 + i32.const 56 + i32.add + local.get 3 + i32.load offset=72 + local.tee 2 + i32.store + local.get 3 + local.get 3 + i64.load offset=64 + local.tee 16 + i64.store offset=48 + local.get 0 + i32.const 8 + i32.add + local.get 2 + i32.store + local.get 0 + local.get 16 + i64.store align=4 + local.get 0 + local.get 1 + i64.load align=4 + i64.store offset=12 align=4 + local.get 0 + i32.const 20 + i32.add + local.get 1 + i32.const 8 + i32.add + i32.load + i32.store + local.get 3 + i32.const 80 + i32.add + global.set 0 + return + end + local.get 3 + i32.const 24 + i32.add + local.get 1 + local.get 7 + call 73 + local.get 2 + i32.load offset=8 + local.tee 6 + local.get 3 + i32.load offset=28 + local.tee 5 + local.get 5 + local.get 6 + i32.gt_u + select + local.set 5 + local.get 2 + i32.load + local.set 12 + i32.const -1 + local.set 6 + local.get 3 + i32.load offset=24 + local.set 10 + loop ;; label = @3 + local.get 5 + if ;; label = @4 + local.get 10 + local.get 6 + i64.extend_i32_u + local.get 10 + i64.load32_u + i64.const -4294967296 + i64.or + i64.add + local.get 19 + local.get 12 + i64.load32_u + i64.mul + i64.sub + i64.const -4294967295 + i64.add + local.tee 16 + i64.store32 + local.get 16 + i64.const 32 + i64.shr_u + i32.wrap_i64 + local.set 6 + local.get 12 + i32.const 4 + i32.add + local.set 12 + local.get 5 + i32.const -1 + i32.add + local.set 5 + local.get 10 + i32.const 4 + i32.add + local.set 10 + br 1 (;@3;) + end + end + block ;; label = @3 + local.get 9 + local.get 6 + i32.const -1 + i32.xor + local.tee 6 + i32.ge_u + if ;; label = @4 + local.get 4 + local.set 5 + br 1 (;@3;) + end + local.get 4 + i32.const -1 + i32.add + local.tee 5 + local.get 4 + i32.gt_u + br_if 2 (;@1;) + local.get 3 + i32.const 16 + i32.add + local.get 1 + local.get 7 + call 73 + local.get 6 + local.get 3 + i32.load offset=16 + local.get 3 + i32.load offset=20 + local.get 2 + i32.load + local.get 2 + i32.load offset=8 + call 60 + i32.sub + local.get 6 + i32.gt_u + br_if 2 (;@1;) + end + local.get 8 + local.get 7 + i32.le_u + br_if 1 (;@1;) + local.get 13 + local.get 7 + i32.const 2 + i32.shl + i32.add + local.get 5 + i32.store + local.get 3 + i32.const 8 + i32.add + local.get 1 + call 72 + local.get 3 + i32.load offset=12 + local.set 9 + local.get 3 + i32.load offset=8 + br_if 0 (;@2;) + end + end + unreachable) + (func (;63;) (type 0) (param i32 i32) + (local i32) + local.get 1 + i32.const 4 + i32.add + local.set 2 + local.get 1 + i32.load + i32.const 1 + i32.eq + if ;; label = @1 + local.get 0 + local.get 2 + i64.load align=4 + i64.store align=4 + local.get 0 + i32.const 8 + i32.add + local.get 2 + i32.const 8 + i32.add + i32.load + i32.store + return + end + local.get 0 + local.get 2 + i32.load + call 56) + (func (;64;) (type 0) (param i32 i32) + (local i32) + local.get 0 + i32.load offset=8 + local.tee 2 + local.get 0 + i32.load offset=4 + i32.eq + if (result i32) ;; label = @1 + local.get 0 + i32.const 1 + call 32 + local.get 0 + i32.load offset=8 + else + local.get 2 + end + local.get 0 + i32.load + i32.add + local.get 1 + i32.store8 + local.get 0 + i32.load offset=8 + local.tee 1 + i32.const 1 + i32.add + local.tee 2 + local.get 1 + i32.ge_u + if ;; label = @1 + local.get 0 + local.get 2 + i32.store offset=8 + return + end + unreachable) + (func (;65;) (type 0) (param i32 i32) + (local i32 i32 i32) + block ;; label = @1 + local.get 1 + local.get 1 + i32.const 1073741823 + i32.and + local.tee 2 + i32.ne + if ;; label = @2 + i32.const 0 + local.set 2 + br 1 (;@1;) + end + local.get 1 + local.get 2 + i32.eq + i32.const 2 + i32.shl + local.tee 2 + local.get 1 + i32.const 2 + i32.shl + local.tee 3 + i32.add + i32.const -1 + i32.add + i32.const 0 + local.get 2 + i32.sub + local.tee 4 + i32.and + local.tee 1 + local.get 3 + i32.ge_u + if ;; label = @2 + local.get 2 + i32.popcnt + i32.const 1 + i32.eq + i32.const 0 + local.get 1 + local.get 4 + i32.le_u + select + br_if 1 (;@1;) + unreachable + end + unreachable + end + local.get 0 + local.get 2 + i32.store offset=4 + local.get 0 + local.get 1 + i32.store) + (func (;66;) (type 0) (param i32 i32) + (local i32) + local.get 1 + i32.load offset=4 + local.tee 2 + if ;; label = @1 + local.get 2 + local.get 2 + i32.const 1073741823 + i32.and + i32.eq + if ;; label = @2 + local.get 0 + local.get 2 + i32.const 2 + i32.shl + i32.store offset=4 + local.get 0 + i32.const 8 + i32.add + i32.const 4 + i32.store + local.get 0 + local.get 1 + i32.load + i32.store + return + end + unreachable + end + local.get 0 + i32.const 0 + i32.store) + (func (;67;) (type 0) (param i32 i32) + block ;; label = @1 + local.get 0 + i32.const 1 + i32.eq + if ;; label = @2 + local.get 1 + i32.eqz + br_if 1 (;@1;) + unreachable + end + return + end + unreachable) + (func (;68;) (type 0) (param i32 i32) + (local i32 i64) + global.get 0 + i32.const 16 + i32.sub + local.tee 2 + global.set 0 + local.get 2 + i32.const 8 + i32.add + local.get 1 + i32.const 0 + call 69 + local.get 2 + i64.load offset=8 + local.set 3 + local.get 0 + i32.const 0 + i32.store offset=8 + local.get 0 + local.get 3 + i64.store align=4 + local.get 2 + i32.const 16 + i32.add + global.set 0) + (func (;69;) (type 1) (param i32 i32 i32) + (local i32 i32) + global.get 0 + i32.const 32 + i32.sub + local.tee 3 + global.set 0 + local.get 3 + i32.const 24 + i32.add + local.get 1 + call 65 + block ;; label = @1 + block ;; label = @2 + local.get 3 + i32.load offset=28 + local.tee 1 + i32.eqz + br_if 0 (;@2;) + local.get 3 + i32.load offset=24 + local.tee 4 + i32.const -1 + i32.le_s + br_if 0 (;@2;) + block (result i32) ;; label = @3 + local.get 2 + if ;; label = @4 + local.get 3 + i32.const 8 + i32.add + local.get 4 + local.get 1 + i32.const 1 + call 70 + local.get 3 + i32.load offset=8 + local.set 2 + local.get 3 + i32.load offset=12 + br 1 (;@3;) + end + local.get 3 + i32.const 16 + i32.add + local.get 4 + local.get 1 + i32.const 0 + call 70 + local.get 3 + i32.load offset=16 + local.set 2 + local.get 3 + i32.load offset=20 + end + local.set 1 + local.get 2 + i32.eqz + br_if 1 (;@1;) + local.get 0 + local.get 2 + i32.store + local.get 0 + local.get 1 + i32.const 2 + i32.shr_u + i32.store offset=4 + local.get 3 + i32.const 32 + i32.add + global.set 0 + return + end + unreachable + end + unreachable) + (func (;70;) (type 3) (param i32 i32 i32 i32) + block ;; label = @1 + local.get 1 + if ;; label = @2 + local.get 3 + i32.eqz + if ;; label = @3 + local.get 1 + local.get 2 + call 13 + local.set 2 + br 2 (;@1;) + end + local.get 1 + local.get 2 + call 30 + local.set 2 + br 1 (;@1;) + end + i32.const 0 + local.set 1 + end + local.get 0 + local.get 1 + i32.store offset=4 + local.get 0 + local.get 2 + i32.store) + (func (;71;) (type 0) (param i32 i32) + local.get 1 + if ;; label = @1 + local.get 0 + local.get 1 + call 8 + end) + (func (;72;) (type 0) (param i32 i32) + (local i32) + block (result i32) ;; label = @1 + i32.const 0 + local.get 1 + i32.load offset=8 + local.tee 2 + i32.eqz + br_if 0 (;@1;) + drop + local.get 1 + local.get 2 + i32.const -1 + i32.add + local.tee 2 + i32.store offset=8 + local.get 1 + i32.load + local.get 2 + i32.const 2 + i32.shl + i32.add + i32.load + local.set 2 + i32.const 1 + end + local.set 1 + local.get 0 + local.get 2 + i32.store offset=4 + local.get 0 + local.get 1 + i32.store) + (func (;73;) (type 1) (param i32 i32 i32) + (local i32) + local.get 1 + i32.load offset=8 + local.tee 3 + local.get 2 + i32.lt_u + if ;; label = @1 + unreachable + end + local.get 0 + local.get 3 + local.get 2 + i32.sub + i32.store offset=4 + local.get 0 + local.get 1 + i32.load + local.get 2 + i32.const 2 + i32.shl + i32.add + i32.store) + (func (;74;) (type 4) (param i32 i32 i32) (result i32) + (local i32) + local.get 0 + i32.load16_u offset=4 + local.set 3 + local.get 0 + i32.const 0 + i32.store16 offset=4 + local.get 3 + i32.const 1 + i32.and + i32.eqz + if ;; label = @1 + local.get 0 + i32.load + local.get 1 + local.get 2 + call 24 + return + end + local.get 1 + local.get 3 + i32.const 8 + i32.shr_u + i32.store8 + local.get 0 + i32.load + local.get 1 + i32.const 1 + i32.add + local.get 2 + i32.const -1 + i32.add + call 24) + (func (;75;) (type 5) (param i32 i32) (result i32) + (local i32) + block ;; label = @1 + local.get 0 + local.get 1 + i32.add + local.tee 2 + local.get 0 + i32.lt_u + br_if 0 (;@1;) + local.get 2 + i32.const -1 + i32.add + local.tee 0 + local.get 2 + i32.gt_u + br_if 0 (;@1;) + local.get 0 + local.get 1 + i32.div_u + return + end + unreachable) + (func (;76;) (type 8) (param i32) (result i32) + local.get 0 + i32.const 4 + call 75) + (func (;77;) (type 1) (param i32 i32 i32) + (local i32) + block ;; label = @1 + local.get 1 + i32.const 1073741823 + i32.and + local.get 1 + i32.ne + br_if 0 (;@1;) + local.get 2 + i32.const -64 + i32.sub + local.tee 3 + local.get 2 + i32.lt_u + local.get 3 + i32.const 536870911 + i32.and + local.get 3 + i32.ne + i32.or + br_if 0 (;@1;) + local.get 1 + i32.const 2 + i32.shl + local.tee 1 + local.get 3 + i32.const 3 + i32.shl + local.tee 2 + local.get 1 + local.get 2 + i32.gt_u + select + local.tee 1 + i32.const 8 + i32.add + local.tee 2 + local.get 1 + i32.lt_u + br_if 0 (;@1;) + block (result i32) ;; label = @2 + i32.const 1 + local.get 2 + i32.const 65536 + call 75 + local.tee 1 + memory.grow + local.tee 2 + i32.const -1 + i32.eq + br_if 0 (;@2;) + drop + local.get 2 + i32.const 65535 + i32.and + local.get 2 + i32.ne + local.get 1 + i32.const 65535 + i32.and + local.get 1 + i32.ne + i32.or + br_if 1 (;@1;) + local.get 1 + i32.const 16 + i32.shl + local.tee 3 + i32.const -8 + i32.add + local.get 3 + i32.gt_u + br_if 1 (;@1;) + local.get 2 + i32.const 16 + i32.shl + local.tee 1 + i64.const 0 + i64.store + local.get 1 + i32.const 0 + i32.store offset=8 + local.get 1 + local.get 1 + local.get 3 + i32.add + i32.const 2 + i32.or + i32.store + i32.const 0 + end + local.set 2 + local.get 0 + local.get 1 + i32.store offset=4 + local.get 0 + local.get 2 + i32.store + return + end + unreachable) + (func (;78;) (type 4) (param i32 i32 i32) (result i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) + local.get 0 + i32.const 2 + i32.shl + local.set 6 + i32.const 0 + local.get 1 + i32.sub + local.set 8 + local.get 0 + i32.const 1073741823 + i32.and + local.get 0 + i32.ne + local.set 9 + local.get 1 + i32.const -1 + i32.add + local.tee 10 + local.get 1 + i32.gt_u + local.set 11 + local.get 2 + i32.load + local.set 0 + loop ;; label = @1 + block ;; label = @2 + local.get 0 + i32.eqz + br_if 0 (;@2;) + local.get 0 + local.set 1 + block ;; label = @3 + loop ;; label = @4 + block ;; label = @5 + local.get 1 + i32.load offset=8 + local.tee 0 + i32.const 1 + i32.and + i32.eqz + if ;; label = @6 + local.get 9 + br_if 1 (;@5;) + local.get 1 + i32.load + i32.const -4 + i32.and + local.tee 3 + local.get 1 + i32.sub + i32.const -8 + i32.add + local.tee 5 + local.get 3 + i32.gt_u + br_if 1 (;@5;) + local.get 5 + local.get 6 + i32.lt_u + br_if 3 (;@3;) + local.get 1 + i32.load + i32.const -4 + i32.and + local.tee 3 + local.get 6 + i32.sub + local.tee 12 + local.get 3 + i32.gt_u + local.get 11 + i32.or + br_if 1 (;@5;) + local.get 1 + i32.const 8 + i32.add + local.tee 5 + i32.const 8 + i32.add + local.tee 4 + local.get 5 + i32.lt_u + br_if 1 (;@5;) + local.get 4 + i32.const -64 + i32.sub + local.tee 13 + local.get 4 + i32.lt_u + br_if 1 (;@5;) + block ;; label = @7 + local.get 13 + local.get 8 + local.get 12 + i32.and + local.tee 4 + i32.gt_u + if ;; label = @8 + local.get 5 + local.get 10 + i32.and + br_if 5 (;@3;) + local.get 2 + local.get 0 + i32.const -4 + i32.and + i32.store + local.get 1 + local.get 1 + i32.load + i32.const 1 + i32.or + i32.store + local.get 1 + local.set 0 + br 1 (;@7;) + end + local.get 4 + i32.const -8 + i32.add + local.tee 0 + local.get 4 + i32.gt_u + br_if 2 (;@5;) + local.get 3 + local.get 0 + i32.sub + local.tee 2 + local.get 3 + i32.gt_u + local.get 2 + i32.const -8 + i32.add + local.get 2 + i32.gt_u + i32.or + br_if 2 (;@5;) + local.get 0 + i32.const 0 + i32.store offset=8 + local.get 0 + i64.const 0 + i64.store align=4 + local.get 0 + local.get 1 + i32.load + i32.const -4 + i32.and + i32.store + block ;; label = @8 + local.get 1 + i32.load + local.tee 2 + i32.const -4 + i32.and + local.tee 3 + i32.eqz + br_if 0 (;@8;) + i32.const 0 + local.get 3 + local.get 2 + i32.const 2 + i32.and + select + local.tee 2 + i32.eqz + br_if 0 (;@8;) + local.get 2 + local.get 2 + i32.load offset=4 + i32.const 3 + i32.and + local.get 0 + i32.or + i32.store offset=4 + end + local.get 0 + local.get 0 + i32.load offset=4 + i32.const 3 + i32.and + local.get 1 + i32.or + i32.store offset=4 + local.get 1 + local.get 1 + i32.load offset=8 + i32.const -2 + i32.and + i32.store offset=8 + local.get 1 + local.get 1 + i32.load + local.tee 2 + i32.const 3 + i32.and + local.get 0 + i32.or + local.tee 3 + i32.store + local.get 2 + i32.const 2 + i32.and + if ;; label = @8 + local.get 1 + local.get 3 + i32.const -3 + i32.and + i32.store + local.get 0 + local.get 0 + i32.load + i32.const 2 + i32.or + i32.store + end + local.get 0 + local.get 0 + i32.load + i32.const 1 + i32.or + i32.store + end + local.get 0 + i32.const 8 + i32.add + local.set 7 + br 4 (;@2;) + end + local.get 1 + local.get 0 + i32.const -2 + i32.and + i32.store offset=8 + block (result i32) ;; label = @6 + i32.const 0 + local.get 1 + i32.load offset=4 + i32.const -4 + i32.and + local.tee 0 + i32.eqz + br_if 0 (;@6;) + drop + i32.const 0 + local.get 0 + local.get 0 + i32.load8_u + i32.const 1 + i32.and + select + end + local.set 0 + local.get 1 + call 79 + local.get 1 + i32.load8_u + i32.const 2 + i32.and + if ;; label = @6 + local.get 0 + local.get 0 + i32.load + i32.const 2 + i32.or + i32.store + end + local.get 2 + local.get 0 + i32.store + local.get 0 + local.tee 1 + i32.load + i32.const -4 + i32.and + local.tee 0 + local.get 1 + i32.sub + i32.const -8 + i32.add + local.get 0 + i32.le_u + br_if 1 (;@4;) + end + end + unreachable + end + local.get 2 + local.get 0 + i32.store + br 1 (;@1;) + end + end + local.get 7) + (func (;79;) (type 2) (param i32) + (local i32 i32) + block ;; label = @1 + local.get 0 + i32.load + local.tee 1 + i32.const -4 + i32.and + local.tee 2 + i32.eqz + br_if 0 (;@1;) + i32.const 0 + local.get 2 + local.get 1 + i32.const 2 + i32.and + select + local.tee 1 + i32.eqz + br_if 0 (;@1;) + local.get 1 + local.get 1 + i32.load offset=4 + i32.const 3 + i32.and + local.get 0 + i32.load offset=4 + i32.const -4 + i32.and + i32.or + i32.store offset=4 + end + local.get 0 + local.get 0 + i32.load offset=4 + local.tee 1 + i32.const -4 + i32.and + local.tee 2 + if (result i32) ;; label = @1 + local.get 2 + local.get 2 + i32.load + i32.const 3 + i32.and + local.get 0 + i32.load + i32.const -4 + i32.and + i32.or + i32.store + local.get 0 + i32.load offset=4 + else + local.get 1 + end + i32.const 3 + i32.and + i32.store offset=4 + local.get 0 + local.get 0 + i32.load + i32.const 3 + i32.and + i32.store) + (func (;80;) (type 0) (param i32 i32) + (local i32) + loop (result i32) ;; label = @1 + local.get 1 + local.get 2 + i32.eq + if (result i32) ;; label = @2 + local.get 0 + else + local.get 0 + local.get 2 + i32.add + i32.const 0 + i32.store8 + local.get 2 + i32.const 1 + i32.add + local.set 2 + br 1 (;@1;) + end + end + drop) + (func (;81;) (type 4) (param i32 i32 i32) (result i32) + (local i32) + loop (result i32) ;; label = @1 + local.get 2 + local.get 3 + i32.eq + if (result i32) ;; label = @2 + local.get 0 + else + local.get 0 + local.get 3 + i32.add + local.get 1 + local.get 3 + i32.add + i32.load8_u + i32.store8 + local.get 3 + i32.const 1 + i32.add + local.set 3 + br 1 (;@1;) + end + end) + (func (;82;) (type 1) (param i32 i32 i32) + block ;; label = @1 + local.get 1 + local.get 0 + i32.ge_u + if ;; label = @2 + loop ;; label = @3 + local.get 2 + i32.eqz + br_if 2 (;@1;) + local.get 0 + local.get 1 + i32.load8_u + i32.store8 + local.get 0 + i32.const 1 + i32.add + local.set 0 + local.get 1 + i32.const 1 + i32.add + local.set 1 + local.get 2 + i32.const -1 + i32.add + local.set 2 + br 0 (;@3;) + end + unreachable + end + local.get 1 + i32.const -1 + i32.add + local.set 1 + local.get 0 + i32.const -1 + i32.add + local.set 0 + loop ;; label = @2 + local.get 2 + i32.eqz + br_if 1 (;@1;) + local.get 0 + local.get 2 + i32.add + local.get 1 + local.get 2 + i32.add + i32.load8_u + i32.store8 + local.get 2 + i32.const -1 + i32.add + local.set 2 + br 0 (;@2;) + end + unreachable + end) + (table (;0;) 1 1 funcref) + (global (;0;) (mut i32) (i32.const 65536)) + (export "deploy" (func 20)) + (export "call" (func 22)) + (data (;0;) (i32.const 65536) "\01\00\00\00\02\00\00\00\03\00\00\00\04\00\00\00\05\00\00\00\06\00\00\00\07\00\00\00\08\00\00\00\00\00\00\00Verifying key was malformed\01\00\00\00\00\c0\08\85\00\00\000D]\0b\17\00H\09\ba/b\f3\1e\8f\13\f5\00\f3\d9\22\1a;I\a1l\c0\05;\c6\ea\10\c5\17F:\ae\01Invalid curve id\00\01")) diff --git a/pallets/template/metadata.json b/pallets/template/metadata.json new file mode 100644 index 00000000..1883254a --- /dev/null +++ b/pallets/template/metadata.json @@ -0,0 +1,274 @@ +{ + "metadataVersion": "0.1.0", + "source": { + "hash": "0xf4cd725fc486c0d1e5c9d196641450e301fb0deb5d3f368f9676a9d479aee4a4", + "language": "ink! 3.0.0-rc2", + "compiler": "rustc 1.50.0-nightly" + }, + "contract": { + "name": "groth16", + "version": "0.1.0", + "authors": [ + "[your_name] <[your_email]>" + ] + }, + "spec": { + "constructors": [ + { + "args": [], + "docs": [], + "name": [ + "default" + ], + "selector": "0x6a3712e2" + } + ], + "docs": [], + "events": [], + "messages": [ + { + "args": [ + { + "name": "vk_gamma_abc", + "type": { + "displayName": [ + "Vec" + ], + "type": 1 + } + }, + { + "name": "vk", + "type": { + "displayName": [ + "Vec" + ], + "type": 2 + } + }, + { + "name": "proof", + "type": { + "displayName": [ + "Vec" + ], + "type": 2 + } + }, + { + "name": "public_inputs", + "type": { + "displayName": [ + "Vec" + ], + "type": 1 + } + } + ], + "docs": [], + "mutates": false, + "name": [ + "bls12_377_verify" + ], + "payable": false, + "returnType": { + "displayName": [ + "bool" + ], + "type": 4 + }, + "selector": "0x4e1f2d81" + }, + { + "args": [ + { + "name": "vk_gamma_abc", + "type": { + "displayName": [ + "Vec" + ], + "type": 1 + } + }, + { + "name": "vk", + "type": { + "displayName": [ + "Vec" + ], + "type": 2 + } + }, + { + "name": "proof", + "type": { + "displayName": [ + "Vec" + ], + "type": 2 + } + }, + { + "name": "public_inputs", + "type": { + "displayName": [ + "Vec" + ], + "type": 1 + } + } + ], + "docs": [], + "mutates": false, + "name": [ + "bls12_381_verify" + ], + "payable": false, + "returnType": { + "displayName": [ + "bool" + ], + "type": 4 + }, + "selector": "0x99a06637" + }, + { + "args": [ + { + "name": "vk_gamma_abc", + "type": { + "displayName": [ + "Vec" + ], + "type": 1 + } + }, + { + "name": "vk", + "type": { + "displayName": [ + "Vec" + ], + "type": 2 + } + }, + { + "name": "proof", + "type": { + "displayName": [ + "Vec" + ], + "type": 2 + } + }, + { + "name": "public_inputs", + "type": { + "displayName": [ + "Vec" + ], + "type": 1 + } + } + ], + "docs": [], + "mutates": false, + "name": [ + "bn254_verify" + ], + "payable": false, + "returnType": { + "displayName": [ + "bool" + ], + "type": 4 + }, + "selector": "0xe0282497" + }, + { + "args": [ + { + "name": "vk_gamma_abc", + "type": { + "displayName": [ + "Vec" + ], + "type": 1 + } + }, + { + "name": "vk", + "type": { + "displayName": [ + "Vec" + ], + "type": 2 + } + }, + { + "name": "proof", + "type": { + "displayName": [ + "Vec" + ], + "type": 2 + } + }, + { + "name": "public_inputs", + "type": { + "displayName": [ + "Vec" + ], + "type": 1 + } + } + ], + "docs": [], + "mutates": false, + "name": [ + "bw6_761" + ], + "payable": false, + "returnType": { + "displayName": [ + "bool" + ], + "type": 4 + }, + "selector": "0x4399fe06" + } + ] + }, + "storage": { + "struct": { + "fields": [] + } + }, + "types": [ + { + "def": { + "sequence": { + "type": 2 + } + } + }, + { + "def": { + "sequence": { + "type": 3 + } + } + }, + { + "def": { + "primitive": "u8" + } + }, + { + "def": { + "primitive": "bool" + } + } + ] +} \ No newline at end of file diff --git a/pallets/template/src/benchmarking.rs b/pallets/template/src/benchmarking.rs index 8f82b8f1..2838b7b8 100644 --- a/pallets/template/src/benchmarking.rs +++ b/pallets/template/src/benchmarking.rs @@ -68,7 +68,7 @@ benchmarks! { // Calculate addr let addr = Contracts::::contract_address(&caller, &hash, &b"".to_vec()); - }: call(origin, addr, vec![192, 150, 165, 243]) + }: call(origin, addr, hex::decode("4e1f2d81088501e60f6032ed7f170ba3481c5d99c0890554c808ad380a7c9aefc9e62eeecf0363ecef5e59ba8eaf6dd0af40e08d7cfd024314f90080a1461a207aa3098308149837bc6322a8f4b499671c507203e798f90a9aa8fafaebb806c8708c3207a93316008501ea7f398187aecf2721441218e54645b17acd35bdf65886255e772a58353ef2e25c92cf7f872bea5afca6081d03e6b115e74befd85720c241ee5ef038621a1cc72e329db9aebec0faf480e83cbd9e4b735650ab0cce2e321d64311bd34bca9e0200910a9094c864d37f890720969430f2682ccc76dc83f9234694590bd334b40dbfa7f28de40e914571d8ae2a88712844f86f0d6dd2f4875120f66304bfcedd55c9a805310155a5345ddc626cbb6fe5ce7026be174a08c798e4d1f1010f97138c30b10a0e23d3cde62852c7b2aabcd7603f87fc54cb0c2fcfa48a1a6e07ea917eec248284a1409dd21ae7bd64b862e7df91fd0af1f36857260a843ea18cd393172b91196ca17bc5f37efb126d585abfcf23b8438d72f90365c382b661256d7caa361d07000c06c5cc02155140b97283cc024daf57023a781a9115bb6e17350264f8b52784a6008921402af8c05dd39f4b789bd50435d2c5aefeb6dc9817af41f45779e3a2d80ab98ef923723b938566747c10a4a169ca5097c5d5073449c3d2e65e16291850a5721416e102df69729ffab67cf948ca51c4ac4c2b54c521552fd4a5a5462d6d3b77ba9932aba0fda8ea8da76e5b0b9166ba600f9c5cc5e442b64ed560c126f8b88e2761c0c6a17a4dcbc1a132a975683ed0b6018ac45d7f4942ad7831790e00408697568bc15871da494a2fe12199531130a8a5b96f07c69020dc01bf9f3ed043a6e1bd08f8d7826c7d5c0fc5c771195ab91bf6eeaa33cbd89cd7dce7930b383c2453d0cca5c227e1b97b1ae253e40cadf4468d6d86f0bf69a0b0bb55774219005b6d86316ea7c1dc4df3e3396a9f78aadf416d5af1619883f5dbbf0a39c6743b194e5adedda54d7cb3ae33e556602e19dd43a31bca7bdb15ad5245dc1ad0affb97edc8f35bb00d1c5b417a132d5be9b72a39870193b6a142198a888c0fe3760fdf1467c7208394270f2aff044c5c002d6cf189a28e34851dc434933e73e07482dad6c7ab931bfbdf29f5d51a6a866d028b91cd89abc9728cf2f8e139f612b5a248ca0758365d1d83c6bc299152b15a89b136e804ae71174d4f35970be570fd14000d06fcafa9753aee681f006d7bf6fc885dcc1a70c33bbfe92bb581ac51e1325b782b1128b1586767cb2ea27555e243abd213634b87418421a65002e06fd9347b23205761d7e35a2a83ffcd35b16b6bf23982700597f2ed9706ae5e039542e8eabd1800443cc8d6ffec17c44207dd41e8ab2f2f2c663f5ed9ab724321de43cbe2ea81908c13643c42a41be1adbc5076e4927b13046d3cdaf5ef775ee48d842599508178276cd41d30e289cbd1d2bb9f92f59b520138fef3e9529139f3961f40f6ea92113ed1701b0eb62a8b21b0852f5ae0d23b4d8cf7a02a69b04abbf0b9213cc1cd16b0afed74a09f1d965f72e0faaad60215c2788b9672a8f53fb90d44b47fb16e4f97f910226d8ad46ddc1dfa6eb4f709a3c95ccfa7f4cd1b9ea5f3cf3d10c5dd0200de094abc5e25fac259efcfd79a97401359069cde3b48eaa9d3a4d848959eb269d788a415d9c22fb418459474f1f0fc16f4572ace2876cf1170d400d1d12d588f816023602a077b8fa66293ac19c951b6c572fad4481fa576e362d9f3a0ffa0120004801d6c7850edbac8a5281ab93d2ed245d47b64f20c21950926d595624b488c291c").unwrap()) wasm_bls12_377_add { let caller: T::AccountId = whitelisted_caller(); diff --git a/primitives/io/Cargo.toml b/primitives/io/Cargo.toml index 2b5dd6ae..59f342a4 100644 --- a/primitives/io/Cargo.toml +++ b/primitives/io/Cargo.toml @@ -12,7 +12,8 @@ sp-runtime-interface = { git = "https://github.com/paritytech/substrate.git", br sp-std = { git = "https://github.com/paritytech/substrate.git", branch = "master", default-features = false } [dependencies.curve] -git = "https://github.com/patractlabs/megaclite.git" +# git = "https://github.com/patractlabs/megaclite.git" +path = "/Users/mercury/code/megaclite/crates/curve/arkworks" package = "megaclite-arkworks" default-features = false features = [ "tests" ] diff --git a/primitives/io/src/lib.rs b/primitives/io/src/lib.rs index 8b4c4d86..5804403b 100644 --- a/primitives/io/src/lib.rs +++ b/primitives/io/src/lib.rs @@ -4,7 +4,7 @@ use sp_runtime_interface::runtime_interface; use sp_std::vec::Vec; -pub mod groth16; +// pub mod groth16; /// Pairing runtime interface #[runtime_interface] From 0eaf185ddcf9e4e917d5d3a6206ea1951cd054a1 Mon Sep 17 00:00:00 2001 From: clearloop Date: Fri, 18 Dec 2020 21:49:12 +0800 Subject: [PATCH 23/33] chore(primitives/megaclite): update the version of megaclite --- pallets/template/Cargo.toml | 5 +- pallets/template/build.rs | 6 +- pallets/template/src/benchmarking.rs | 7 +- pallets/template/src/lib.rs | 1 + pallets/template/src/mock.rs | 154 ++++++++++++++++++++++++++ pallets/template/src/tests.rs | 26 +++++ primitives/chain-extension/src/lib.rs | 17 ++- 7 files changed, 206 insertions(+), 10 deletions(-) create mode 100644 pallets/template/src/mock.rs create mode 100644 pallets/template/src/tests.rs diff --git a/pallets/template/Cargo.toml b/pallets/template/Cargo.toml index 73378910..8601b755 100644 --- a/pallets/template/Cargo.toml +++ b/pallets/template/Cargo.toml @@ -40,6 +40,9 @@ package = "pallet-contracts" path = "../../vendor/substrate/frame/contracts" default-features = false +[dev-dependencies] +hex = "0.4.2" + [build-dependencies] wat = "1.0" @@ -55,7 +58,7 @@ std = [ 'sp-std/std', ] runtime-benchmarks = [ - "hex", + "hex", "frame-benchmarking", 'frame-system/runtime-benchmarks', 'frame-support/runtime-benchmarks', diff --git a/pallets/template/build.rs b/pallets/template/build.rs index 60301688..9cc5f221 100644 --- a/pallets/template/build.rs +++ b/pallets/template/build.rs @@ -6,12 +6,12 @@ use std::{ }; fn main() -> Result<()> { - println!("cargo:rerun-if-changed=groth16.wat"); + println!("cargo:rerun-if-changed=./groth16.wat"); let out_dir = env::var_os("OUT_DIR").unwrap(); - let dest_path = Path::new(&out_dir).join("flip.wasm"); + let dest_path = Path::new(&out_dir).join("groth16.wasm"); fs::write( &dest_path, - wat::parse_file("flip.wat").map_err(|_| Error::last_os_error())?, + wat::parse_file("groth16.wat").map_err(|_| Error::last_os_error())?, )?; println!("cargo:rerun-if-changed=build.rs"); Ok(()) diff --git a/pallets/template/src/benchmarking.rs b/pallets/template/src/benchmarking.rs index 2838b7b8..bc2e3fb7 100644 --- a/pallets/template/src/benchmarking.rs +++ b/pallets/template/src/benchmarking.rs @@ -68,7 +68,12 @@ benchmarks! { // Calculate addr let addr = Contracts::::contract_address(&caller, &hash, &b"".to_vec()); - }: call(origin, addr, hex::decode("4e1f2d81088501e60f6032ed7f170ba3481c5d99c0890554c808ad380a7c9aefc9e62eeecf0363ecef5e59ba8eaf6dd0af40e08d7cfd024314f90080a1461a207aa3098308149837bc6322a8f4b499671c507203e798f90a9aa8fafaebb806c8708c3207a93316008501ea7f398187aecf2721441218e54645b17acd35bdf65886255e772a58353ef2e25c92cf7f872bea5afca6081d03e6b115e74befd85720c241ee5ef038621a1cc72e329db9aebec0faf480e83cbd9e4b735650ab0cce2e321d64311bd34bca9e0200910a9094c864d37f890720969430f2682ccc76dc83f9234694590bd334b40dbfa7f28de40e914571d8ae2a88712844f86f0d6dd2f4875120f66304bfcedd55c9a805310155a5345ddc626cbb6fe5ce7026be174a08c798e4d1f1010f97138c30b10a0e23d3cde62852c7b2aabcd7603f87fc54cb0c2fcfa48a1a6e07ea917eec248284a1409dd21ae7bd64b862e7df91fd0af1f36857260a843ea18cd393172b91196ca17bc5f37efb126d585abfcf23b8438d72f90365c382b661256d7caa361d07000c06c5cc02155140b97283cc024daf57023a781a9115bb6e17350264f8b52784a6008921402af8c05dd39f4b789bd50435d2c5aefeb6dc9817af41f45779e3a2d80ab98ef923723b938566747c10a4a169ca5097c5d5073449c3d2e65e16291850a5721416e102df69729ffab67cf948ca51c4ac4c2b54c521552fd4a5a5462d6d3b77ba9932aba0fda8ea8da76e5b0b9166ba600f9c5cc5e442b64ed560c126f8b88e2761c0c6a17a4dcbc1a132a975683ed0b6018ac45d7f4942ad7831790e00408697568bc15871da494a2fe12199531130a8a5b96f07c69020dc01bf9f3ed043a6e1bd08f8d7826c7d5c0fc5c771195ab91bf6eeaa33cbd89cd7dce7930b383c2453d0cca5c227e1b97b1ae253e40cadf4468d6d86f0bf69a0b0bb55774219005b6d86316ea7c1dc4df3e3396a9f78aadf416d5af1619883f5dbbf0a39c6743b194e5adedda54d7cb3ae33e556602e19dd43a31bca7bdb15ad5245dc1ad0affb97edc8f35bb00d1c5b417a132d5be9b72a39870193b6a142198a888c0fe3760fdf1467c7208394270f2aff044c5c002d6cf189a28e34851dc434933e73e07482dad6c7ab931bfbdf29f5d51a6a866d028b91cd89abc9728cf2f8e139f612b5a248ca0758365d1d83c6bc299152b15a89b136e804ae71174d4f35970be570fd14000d06fcafa9753aee681f006d7bf6fc885dcc1a70c33bbfe92bb581ac51e1325b782b1128b1586767cb2ea27555e243abd213634b87418421a65002e06fd9347b23205761d7e35a2a83ffcd35b16b6bf23982700597f2ed9706ae5e039542e8eabd1800443cc8d6ffec17c44207dd41e8ab2f2f2c663f5ed9ab724321de43cbe2ea81908c13643c42a41be1adbc5076e4927b13046d3cdaf5ef775ee48d842599508178276cd41d30e289cbd1d2bb9f92f59b520138fef3e9529139f3961f40f6ea92113ed1701b0eb62a8b21b0852f5ae0d23b4d8cf7a02a69b04abbf0b9213cc1cd16b0afed74a09f1d965f72e0faaad60215c2788b9672a8f53fb90d44b47fb16e4f97f910226d8ad46ddc1dfa6eb4f709a3c95ccfa7f4cd1b9ea5f3cf3d10c5dd0200de094abc5e25fac259efcfd79a97401359069cde3b48eaa9d3a4d848959eb269d788a415d9c22fb418459474f1f0fc16f4572ace2876cf1170d400d1d12d588f816023602a077b8fa66293ac19c951b6c572fad4481fa576e362d9f3a0ffa0120004801d6c7850edbac8a5281ab93d2ed245d47b64f20c21950926d595624b488c291c").unwrap()) + let result = >::call(origin.clone(), addr.clone(), hex::decode("4e1f2d81088501e60f6032ed7f170ba3481c5d99c0890554c808ad380a7c9aefc9e62eeecf0363ecef5e59ba8eaf6dd0af40e08d7cfd024314f90080a1461a207aa3098308149837bc6322a8f4b499671c507203e798f90a9aa8fafaebb806c8708c3207a93316008501ea7f398187aecf2721441218e54645b17acd35bdf65886255e772a58353ef2e25c92cf7f872bea5afca6081d03e6b115e74befd85720c241ee5ef038621a1cc72e329db9aebec0faf480e83cbd9e4b735650ab0cce2e321d64311bd34bca9e0200910a9094c864d37f890720969430f2682ccc76dc83f9234694590bd334b40dbfa7f28de40e914571d8ae2a88712844f86f0d6dd2f4875120f66304bfcedd55c9a805310155a5345ddc626cbb6fe5ce7026be174a08c798e4d1f1010f97138c30b10a0e23d3cde62852c7b2aabcd7603f87fc54cb0c2fcfa48a1a6e07ea917eec248284a1409dd21ae7bd64b862e7df91fd0af1f36857260a843ea18cd393172b91196ca17bc5f37efb126d585abfcf23b8438d72f90365c382b661256d7caa361d07000c06c5cc02155140b97283cc024daf57023a781a9115bb6e17350264f8b52784a6008921402af8c05dd39f4b789bd50435d2c5aefeb6dc9817af41f45779e3a2d80ab98ef923723b938566747c10a4a169ca5097c5d5073449c3d2e65e16291850a5721416e102df69729ffab67cf948ca51c4ac4c2b54c521552fd4a5a5462d6d3b77ba9932aba0fda8ea8da76e5b0b9166ba600f9c5cc5e442b64ed560c126f8b88e2761c0c6a17a4dcbc1a132a975683ed0b6018ac45d7f4942ad7831790e00408697568bc15871da494a2fe12199531130a8a5b96f07c69020dc01bf9f3ed043a6e1bd08f8d7826c7d5c0fc5c771195ab91bf6eeaa33cbd89cd7dce7930b383c2453d0cca5c227e1b97b1ae253e40cadf4468d6d86f0bf69a0b0bb55774219005b6d86316ea7c1dc4df3e3396a9f78aadf416d5af1619883f5dbbf0a39c6743b194e5adedda54d7cb3ae33e556602e19dd43a31bca7bdb15ad5245dc1ad0affb97edc8f35bb00d1c5b417a132d5be9b72a39870193b6a142198a888c0fe3760fdf1467c7208394270f2aff044c5c002d6cf189a28e34851dc434933e73e07482dad6c7ab931bfbdf29f5d51a6a866d028b91cd89abc9728cf2f8e139f612b5a248ca0758365d1d83c6bc299152b15a89b136e804ae71174d4f35970be570fd14000d06fcafa9753aee681f006d7bf6fc885dcc1a70c33bbfe92bb581ac51e1325b782b1128b1586767cb2ea27555e243abd213634b87418421a65002e06fd9347b23205761d7e35a2a83ffcd35b16b6bf23982700597f2ed9706ae5e039542e8eabd1800443cc8d6ffec17c44207dd41e8ab2f2f2c663f5ed9ab724321de43cbe2ea81908c13643c42a41be1adbc5076e4927b13046d3cdaf5ef775ee48d842599508178276cd41d30e289cbd1d2bb9f92f59b520138fef3e9529139f3961f40f6ea92113ed1701b0eb62a8b21b0852f5ae0d23b4d8cf7a02a69b04abbf0b9213cc1cd16b0afed74a09f1d965f72e0faaad60215c2788b9672a8f53fb90d44b47fb16e4f97f910226d8ad46ddc1dfa6eb4f709a3c95ccfa7f4cd1b9ea5f3cf3d10c5dd0200de094abc5e25fac259efcfd79a97401359069cde3b48eaa9d3a4d848959eb269d788a415d9c22fb418459474f1f0fc16f4572ace2876cf1170d400d1d12d588f816023602a077b8fa66293ac19c951b6c572fad4481fa576e362d9f3a0ffa0120004801d6c7850edbac8a5281ab93d2ed245d47b64f20c21950926d595624b488c291c")); + sp_std::if_std! { + println!("{:?}", result); + } + + }: call(origin, addr, &b"".to_vec()) wasm_bls12_377_add { let caller: T::AccountId = whitelisted_caller(); diff --git a/pallets/template/src/lib.rs b/pallets/template/src/lib.rs index acb7e7a7..a453c329 100644 --- a/pallets/template/src/lib.rs +++ b/pallets/template/src/lib.rs @@ -13,6 +13,7 @@ use sp_std::vec::Vec; #[cfg(feature = "runtime-benchmarks")] mod benchmarking; +mod tests; /// Configure the pallet by specifying the parameters and types on which it depends. pub trait Config: frame_system::Config + contract::Config { diff --git a/pallets/template/src/mock.rs b/pallets/template/src/mock.rs new file mode 100644 index 00000000..13380928 --- /dev/null +++ b/pallets/template/src/mock.rs @@ -0,0 +1,154 @@ +// This file is part of Substrate. + +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Test utilities + +#![cfg(test)] + +use crate::{decl_tests, tests::CallWithDispatchInfo, Config, GenesisConfig, Module}; +use frame_support::weights::{DispatchInfo, IdentityFee, Weight}; +use frame_support::{impl_outer_event, impl_outer_origin, parameter_types}; +use pallet_transaction_payment::CurrencyAdapter; +use sp_core::H256; +use sp_io; +use sp_runtime::{testing::Header, traits::IdentityLookup, Perbill}; + +use frame_system as system; +impl_outer_origin! { + pub enum Origin for Test {} +} + +mod balances { + pub use crate::Event; +} + +impl_outer_event! { + pub enum Event for Test { + system, + balances, + } +} + +// Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted. +#[derive(Clone, PartialEq, Eq, Debug)] +pub struct Test; +parameter_types! { + pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: Weight = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::one(); + pub static ExistentialDeposit: u64 = 0; +} +impl frame_system::Config for Test { + type BaseCallFilter = (); + type Origin = Origin; + type Index = u64; + type BlockNumber = u64; + type Call = CallWithDispatchInfo; + type Hash = H256; + type Hashing = ::sp_runtime::traits::BlakeTwo256; + type AccountId = u64; + type Lookup = IdentityLookup; + type Header = Header; + type Event = Event; + type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type DbWeight = (); + type BlockExecutionWeight = (); + type ExtrinsicBaseWeight = (); + type MaximumExtrinsicWeight = MaximumBlockWeight; + type MaximumBlockLength = MaximumBlockLength; + type AvailableBlockRatio = AvailableBlockRatio; + type Version = (); + type PalletInfo = (); + // type AccountData = super::AccountData; + type OnNewAccount = (); + type OnKilledAccount = (); + type SystemWeightInfo = (); +} +parameter_types! { + pub const TransactionByteFee: u64 = 1; +} +impl pallet_transaction_payment::Config for Test { + type OnChargeTransaction = CurrencyAdapter, ()>; + type TransactionByteFee = TransactionByteFee; + type WeightToFee = IdentityFee; + type FeeMultiplierUpdate = (); +} + +impl Config for Test { + type Balance = u64; + type DustRemoval = (); + type Event = Event; + type ExistentialDeposit = ExistentialDeposit; + type AccountStore = system::Module; + type MaxLocks = (); + type WeightInfo = (); +} + +pub struct ExtBuilder { + existential_deposit: u64, + monied: bool, +} +impl Default for ExtBuilder { + fn default() -> Self { + Self { + existential_deposit: 1, + monied: false, + } + } +} +impl ExtBuilder { + pub fn existential_deposit(mut self, existential_deposit: u64) -> Self { + self.existential_deposit = existential_deposit; + self + } + pub fn monied(mut self, monied: bool) -> Self { + self.monied = monied; + self + } + pub fn set_associated_consts(&self) { + EXISTENTIAL_DEPOSIT.with(|v| *v.borrow_mut() = self.existential_deposit); + } + pub fn build(self) -> sp_io::TestExternalities { + self.set_associated_consts(); + let mut t = frame_system::GenesisConfig::default() + .build_storage::() + .unwrap(); + GenesisConfig:: { + balances: if self.monied { + vec![ + (1, 10 * self.existential_deposit), + (2, 20 * self.existential_deposit), + (3, 30 * self.existential_deposit), + (4, 40 * self.existential_deposit), + (12, 10 * self.existential_deposit), + ] + } else { + vec![] + }, + } + .assimilate_storage(&mut t) + .unwrap(); + + let mut ext = sp_io::TestExternalities::new(t); + ext.execute_with(|| System::set_block_number(1)); + ext + } +} + +decl_tests! { Test, ExtBuilder, EXISTENTIAL_DEPOSIT } diff --git a/pallets/template/src/tests.rs b/pallets/template/src/tests.rs new file mode 100644 index 00000000..b35e9a15 --- /dev/null +++ b/pallets/template/src/tests.rs @@ -0,0 +1,26 @@ +#![cfg(test)] +use super::*; + +pub struct ExtBuilder; + +#[test] +fn test_bls12_377_verify() { + let vk_ic = "e60f6032ed7f170ba3481c5d99c0890554c808ad380a7c9aefc9e62eeecf0363ecef5e59ba8eaf6dd0af40e08d7cfd024314f90080a1461a207aa3098308149837bc6322a8f4b499671c507203e798f90a9aa8fafaebb806c8708c3207a9331600"; + let vk_ic2 = "ea7f398187aecf2721441218e54645b17acd35bdf65886255e772a58353ef2e25c92cf7f872bea5afca6081d03e6b115e74befd85720c241ee5ef038621a1cc72e329db9aebec0faf480e83cbd9e4b735650ab0cce2e321d64311bd34bca9e0200"; + + let vk_ic = "e60f6032ed7f170ba3481c5d99c0890554c808ad380a7c9aefc9e62eeecf0363ecef5e59ba8eaf6dd0af40e08d7cfd024314f90080a1461a207aa3098308149837bc6322a8f4b499671c507203e798f90a9aa8fafaebb806c8708c3207a9331600"; + let vk_ic2 = "ea7f398187aecf2721441218e54645b17acd35bdf65886255e772a58353ef2e25c92cf7f872bea5afca6081d03e6b115e74befd85720c241ee5ef038621a1cc72e329db9aebec0faf480e83cbd9e4b735650ab0cce2e321d64311bd34bca9e0200"; + let vk_encode = "9094c864d37f890720969430f2682ccc76dc83f9234694590bd334b40dbfa7f28de40e914571d8ae2a88712844f86f0d6dd2f4875120f66304bfcedd55c9a805310155a5345ddc626cbb6fe5ce7026be174a08c798e4d1f1010f97138c30b10a0e23d3cde62852c7b2aabcd7603f87fc54cb0c2fcfa48a1a6e07ea917eec248284a1409dd21ae7bd64b862e7df91fd0af1f36857260a843ea18cd393172b91196ca17bc5f37efb126d585abfcf23b8438d72f90365c382b661256d7caa361d07000c06c5cc02155140b97283cc024daf57023a781a9115bb6e17350264f8b52784a6008921402af8c05dd39f4b789bd50435d2c5aefeb6dc9817af41f45779e3a2d80ab98ef923723b938566747c10a4a169ca5097c5d5073449c3d2e65e16291850a5721416e102df69729ffab67cf948ca51c4ac4c2b54c521552fd4a5a5462d6d3b77ba9932aba0fda8ea8da76e5b0b9166ba600f9c5cc5e442b64ed560c126f8b88e2761c0c6a17a4dcbc1a132a975683ed0b6018ac45d7f4942ad7831790e00408697568bc15871da494a2fe12199531130a8a5b96f07c69020dc01bf9f3ed043a6e1bd08f8d7826c7d5c0fc5c771195ab91bf6eeaa33cbd89cd7dce7930b383c2453d0cca5c227e1b97b1ae253e40cadf4468d6d86f0bf69a0b0bb55774219005b6d86316ea7c1dc4df3e3396a9f78aadf416d5af1619883f5dbbf0a39c6743b194e5adedda54d7cb3ae33e556602e19dd43a31bca7bdb15ad5245dc1ad0affb97edc8f35bb00d1c5b417a132d5be9b72a39870193b6a142198a888c0fe3760fdf1467c7208394270f2aff044c5c002d6cf189a28e34851dc434933e73e07482dad6c7ab931bfbdf29f5d51a6a866d028b91cd89abc9728cf2f8e139f612b5a248ca0758365d1d83c6bc299152b15a89b136e804ae71174d4f35970be570fd1400"; + let proof_encode = "fcafa9753aee681f006d7bf6fc885dcc1a70c33bbfe92bb581ac51e1325b782b1128b1586767cb2ea27555e243abd213634b87418421a65002e06fd9347b23205761d7e35a2a83ffcd35b16b6bf23982700597f2ed9706ae5e039542e8eabd1800443cc8d6ffec17c44207dd41e8ab2f2f2c663f5ed9ab724321de43cbe2ea81908c13643c42a41be1adbc5076e4927b13046d3cdaf5ef775ee48d842599508178276cd41d30e289cbd1d2bb9f92f59b520138fef3e9529139f3961f40f6ea92113ed1701b0eb62a8b21b0852f5ae0d23b4d8cf7a02a69b04abbf0b9213cc1cd16b0afed74a09f1d965f72e0faaad60215c2788b9672a8f53fb90d44b47fb16e4f97f910226d8ad46ddc1dfa6eb4f709a3c95ccfa7f4cd1b9ea5f3cf3d10c5dd0200de094abc5e25fac259efcfd79a97401359069cde3b48eaa9d3a4d848959eb269d788a415d9c22fb418459474f1f0fc16f4572ace2876cf1170d400d1d12d588f816023602a077b8fa66293ac19c951b6c572fad4481fa576e362d9f3a0ffa01200"; + let public_input = "1d6c7850edbac8a5281ab93d2ed245d47b64f20c21950926d595624b488c291c"; + + let result = curve::verify( + 0x00, + vec![hex::decode(vk_ic).unwrap(), hex::decode(vk_ic2).unwrap()], + hex::decode(vk_encode).unwrap(), + hex::decode(proof_encode).unwrap(), + vec![hex::decode(public_input).unwrap()], + ); + println!("{:?}", result); + assert!(result.unwrap()); +} diff --git a/primitives/chain-extension/src/lib.rs b/primitives/chain-extension/src/lib.rs index d16627a6..1737cb77 100644 --- a/primitives/chain-extension/src/lib.rs +++ b/primitives/chain-extension/src/lib.rs @@ -21,11 +21,18 @@ impl ChainExtension for JupiterExt { let mut input = dimmy.as_mut_slice(); let mut env = env.buf_in_buf_out(); env.read_into(&mut &mut input)?; - if let Some(output) = if jupiter_io::pairing::wasm() { - curve::call(func_id, input).ok() - } else { - jupiter_io::pairing::call(func_id, input) - } { + // if let Some(output) = if jupiter_io::pairing::wasm() { + // curve::call(func_id, input) + // } else { + // jupiter_io::pairing::call(func_id, input) + // } { + // env.write(&output, false, None)?; + // Ok(RetVal::Converging(0)) + // } else { + // Err(Error::::InvalidFunctionId.into()) + // } + + if let Some(output) = curve::call(func_id, input) { env.write(&output, false, None)?; Ok(RetVal::Converging(0)) } else { From 8901a2552d4c1719cd37a994a9b2864ef86a1b3c Mon Sep 17 00:00:00 2001 From: clearloop Date: Sat, 19 Dec 2020 03:59:08 +0800 Subject: [PATCH 24/33] feat(primitives/chain_extension): tests for curves --- pallets/template/src/tests.rs | 84 +++++++++++++++++++++------ primitives/chain-extension/src/lib.rs | 38 ++++-------- 2 files changed, 78 insertions(+), 44 deletions(-) diff --git a/pallets/template/src/tests.rs b/pallets/template/src/tests.rs index b35e9a15..bcf9737d 100644 --- a/pallets/template/src/tests.rs +++ b/pallets/template/src/tests.rs @@ -1,26 +1,74 @@ #![cfg(test)] use super::*; - -pub struct ExtBuilder; +use frame_support::assert_ok; #[test] fn test_bls12_377_verify() { - let vk_ic = "e60f6032ed7f170ba3481c5d99c0890554c808ad380a7c9aefc9e62eeecf0363ecef5e59ba8eaf6dd0af40e08d7cfd024314f90080a1461a207aa3098308149837bc6322a8f4b499671c507203e798f90a9aa8fafaebb806c8708c3207a9331600"; - let vk_ic2 = "ea7f398187aecf2721441218e54645b17acd35bdf65886255e772a58353ef2e25c92cf7f872bea5afca6081d03e6b115e74befd85720c241ee5ef038621a1cc72e329db9aebec0faf480e83cbd9e4b735650ab0cce2e321d64311bd34bca9e0200"; - - let vk_ic = "e60f6032ed7f170ba3481c5d99c0890554c808ad380a7c9aefc9e62eeecf0363ecef5e59ba8eaf6dd0af40e08d7cfd024314f90080a1461a207aa3098308149837bc6322a8f4b499671c507203e798f90a9aa8fafaebb806c8708c3207a9331600"; - let vk_ic2 = "ea7f398187aecf2721441218e54645b17acd35bdf65886255e772a58353ef2e25c92cf7f872bea5afca6081d03e6b115e74befd85720c241ee5ef038621a1cc72e329db9aebec0faf480e83cbd9e4b735650ab0cce2e321d64311bd34bca9e0200"; - let vk_encode = "9094c864d37f890720969430f2682ccc76dc83f9234694590bd334b40dbfa7f28de40e914571d8ae2a88712844f86f0d6dd2f4875120f66304bfcedd55c9a805310155a5345ddc626cbb6fe5ce7026be174a08c798e4d1f1010f97138c30b10a0e23d3cde62852c7b2aabcd7603f87fc54cb0c2fcfa48a1a6e07ea917eec248284a1409dd21ae7bd64b862e7df91fd0af1f36857260a843ea18cd393172b91196ca17bc5f37efb126d585abfcf23b8438d72f90365c382b661256d7caa361d07000c06c5cc02155140b97283cc024daf57023a781a9115bb6e17350264f8b52784a6008921402af8c05dd39f4b789bd50435d2c5aefeb6dc9817af41f45779e3a2d80ab98ef923723b938566747c10a4a169ca5097c5d5073449c3d2e65e16291850a5721416e102df69729ffab67cf948ca51c4ac4c2b54c521552fd4a5a5462d6d3b77ba9932aba0fda8ea8da76e5b0b9166ba600f9c5cc5e442b64ed560c126f8b88e2761c0c6a17a4dcbc1a132a975683ed0b6018ac45d7f4942ad7831790e00408697568bc15871da494a2fe12199531130a8a5b96f07c69020dc01bf9f3ed043a6e1bd08f8d7826c7d5c0fc5c771195ab91bf6eeaa33cbd89cd7dce7930b383c2453d0cca5c227e1b97b1ae253e40cadf4468d6d86f0bf69a0b0bb55774219005b6d86316ea7c1dc4df3e3396a9f78aadf416d5af1619883f5dbbf0a39c6743b194e5adedda54d7cb3ae33e556602e19dd43a31bca7bdb15ad5245dc1ad0affb97edc8f35bb00d1c5b417a132d5be9b72a39870193b6a142198a888c0fe3760fdf1467c7208394270f2aff044c5c002d6cf189a28e34851dc434933e73e07482dad6c7ab931bfbdf29f5d51a6a866d028b91cd89abc9728cf2f8e139f612b5a248ca0758365d1d83c6bc299152b15a89b136e804ae71174d4f35970be570fd1400"; - let proof_encode = "fcafa9753aee681f006d7bf6fc885dcc1a70c33bbfe92bb581ac51e1325b782b1128b1586767cb2ea27555e243abd213634b87418421a65002e06fd9347b23205761d7e35a2a83ffcd35b16b6bf23982700597f2ed9706ae5e039542e8eabd1800443cc8d6ffec17c44207dd41e8ab2f2f2c663f5ed9ab724321de43cbe2ea81908c13643c42a41be1adbc5076e4927b13046d3cdaf5ef775ee48d842599508178276cd41d30e289cbd1d2bb9f92f59b520138fef3e9529139f3961f40f6ea92113ed1701b0eb62a8b21b0852f5ae0d23b4d8cf7a02a69b04abbf0b9213cc1cd16b0afed74a09f1d965f72e0faaad60215c2788b9672a8f53fb90d44b47fb16e4f97f910226d8ad46ddc1dfa6eb4f709a3c95ccfa7f4cd1b9ea5f3cf3d10c5dd0200de094abc5e25fac259efcfd79a97401359069cde3b48eaa9d3a4d848959eb269d788a415d9c22fb418459474f1f0fc16f4572ace2876cf1170d400d1d12d588f816023602a077b8fa66293ac19c951b6c572fad4481fa576e362d9f3a0ffa01200"; - let public_input = "1d6c7850edbac8a5281ab93d2ed245d47b64f20c21950926d595624b488c291c"; + let vk_ic:Vec = hex::decode("71c5a779bb19e0aeb6030768f5001017bbd4edb645306ff1591424c501e7aa8b480fc18d8ed404c893d473afa9b82c01fb3e19bdf85f4fb8acf97d1507b75eb48972c8a10e13f4637f7bee71f89eafc141453e4646c82e188d9ef8cf71fa2f0000").unwrap(); + let vk_ic2:Vec = hex::decode("4d0869345487bb4070110fa318b0f408dcffce12304589878797615d8a72cc00b6a1e3f50cc0e59770638640090726013db560d3a19288ecedc60ed9ee0afd50ad3ac96db89d99fc249b85a453ef837e9213f8977ac572d818dc43387678a50100").unwrap(); + let vk_encode:Vec = hex::decode("54f796d78550d14c4ee03cd5915fd8037569696f878312b0093f0149919fc717c0b3f8a2d419fad0edde7e1d55cd2f002c312b660250225a00baf5df511dcce61eb23b28f3980be7fcde0091284670e9064015f452f244e65cad047a20fdd000ca76892d04e1283e575e098c8e4281ba9113443515f22247921b9c3189dc03dd83cf22b9da3eda70cdd2644a795376002e0b1d0d1d5945dab12a28a31497b48d07739028ac3153be3cf367e3d7e788ac43f6d3ccd3c5c20a4f2d6b0db05ce40000f70cb4191a256ed9a4d90305f5864993032a0e40433040c259b14c8069d117f3491d75d993271a0a3f13efdd5b18ce006d90eff3b45f8fa10b43a2d4fb80a554304ba5d94ddc19c92b2e1e2f756bd3042c4c0d6e10b6c22c2ea5eb136fb42900aca080ed5cfa9ccf92da7e4f631f1f9fd52a4dd227898e21585a7a55656f6315fa3f1e541011b941084fb663515ede0024ff6c7745872af24c5de2acfbf4b7a238f3f80face2310d83d9e953de2051a70abc3be988220291e03c92840e1c1c01005720823639fe8f3818ade6c24c6d6ed8f78b87369a9fac8a548e01ca001e424ba931033958641fe06677c3f4a1b39f01f6d3e9a2052ad1185af9a80086665df50b41674f7f6f181773cee6e78d09ea34ce970ccb5907d5cb2f69c9e0ed8d1f01009d629094c47bdf026bbd3424f6e7748b0c3529b495cf24677f309d9f1ed7d3435513224cba204902fd733522b3b855015f395e5b2a7f0fe9e50665d705c48f9b8b20a3f9619f50c1dcddbea7c4a561cdffed750045f875b2d2c569e8d5d0320015e739c8881a211865f82e39bb6ad21a66ceb1808a5ecc3f11833d61dc938a3b160b1b1829527b52e9d3d98800f29701078dfc5fda2f3dcebaca0f43ac23f6da5044f51cf12ac8b3439df503ab1732f5047601b2cd9d93e6d161dc4719beda0000").unwrap(); + let proof_encode:Vec = hex::decode("e2342d048b06618cfc80a5fb5301373032d5780ca45e5287e824fd1d3dccfc36d1befe73edaea7378968a003f94e1801de729f41f406c7d94db4995cc2956cdd6b250937dd52b3c8ac812dff25985eb802c727dbfb7c6b055db545d687b1bd000090f4ad7dc16060ebfbe2bff08077e404e878850682e15f64a5b0f243f53a6d61dc358d41fa6aed615c6296904d71c200c04fe75b3adbecdc3d00df22556a1c949e4b87c81483225f6eaa7560e3035a1c919c4a0d446125dca2e2ef541d58a200ec9b0644bea1bd34e84ff04b65c0cc8733d425b43225f81a7580e1027a41b4ce85eb513213f54a76e2b69320dc6d51003b06cb148aa149b0b0e1ffb8f5901adbda3e431c19404cae29f26aac97085c6d1d8eeef33024aafdc649da6475ab99000026b3bb740a34b4db3a1c689d471b5a7834bb27fd57108bca8cd88d12bb81eae5f8ad807e5de758978ab51d0146017100c31d5c7971576e79eec56286dc2602025cb1d0a01e1acdc23a8aece6e9f3c3ecf97d0a9667634e31e79f653a93c13b0100").unwrap(); + let public_input: Vec = + hex::decode("a4961fec1c734055a80af91b3fd7405a2cdb741e1867aa7f783ca0959a077110").unwrap(); - let result = curve::verify( + assert_ok!(curve::verify( 0x00, - vec![hex::decode(vk_ic).unwrap(), hex::decode(vk_ic2).unwrap()], - hex::decode(vk_encode).unwrap(), - hex::decode(proof_encode).unwrap(), - vec![hex::decode(public_input).unwrap()], - ); - println!("{:?}", result); - assert!(result.unwrap()); + vec![vk_ic, vk_ic2], + vk_encode, + proof_encode, + vec![public_input] + )); +} + +#[test] +fn test_based_bls12_381_mimc_groth16() { + let vk_ic:Vec = hex::decode("e60f6032ed7f170ba3481c5d99c0890554c808ad380a7c9aefc9e62eeecf0363ecef5e59ba8eaf6dd0af40e08d7cfd024314f90080a1461a207aa3098308149837bc6322a8f4b499671c507203e798f90a9aa8fafaebb806c8708c3207a9331600").unwrap(); + let vk_ic2:Vec = hex::decode("ea7f398187aecf2721441218e54645b17acd35bdf65886255e772a58353ef2e25c92cf7f872bea5afca6081d03e6b115e74befd85720c241ee5ef038621a1cc72e329db9aebec0faf480e83cbd9e4b735650ab0cce2e321d64311bd34bca9e0200").unwrap(); + let vk_encode:Vec = hex::decode("9094c864d37f890720969430f2682ccc76dc83f9234694590bd334b40dbfa7f28de40e914571d8ae2a88712844f86f0d6dd2f4875120f66304bfcedd55c9a805310155a5345ddc626cbb6fe5ce7026be174a08c798e4d1f1010f97138c30b10a0e23d3cde62852c7b2aabcd7603f87fc54cb0c2fcfa48a1a6e07ea917eec248284a1409dd21ae7bd64b862e7df91fd0af1f36857260a843ea18cd393172b91196ca17bc5f37efb126d585abfcf23b8438d72f90365c382b661256d7caa361d07000c06c5cc02155140b97283cc024daf57023a781a9115bb6e17350264f8b52784a6008921402af8c05dd39f4b789bd50435d2c5aefeb6dc9817af41f45779e3a2d80ab98ef923723b938566747c10a4a169ca5097c5d5073449c3d2e65e16291850a5721416e102df69729ffab67cf948ca51c4ac4c2b54c521552fd4a5a5462d6d3b77ba9932aba0fda8ea8da76e5b0b9166ba600f9c5cc5e442b64ed560c126f8b88e2761c0c6a17a4dcbc1a132a975683ed0b6018ac45d7f4942ad7831790e00408697568bc15871da494a2fe12199531130a8a5b96f07c69020dc01bf9f3ed043a6e1bd08f8d7826c7d5c0fc5c771195ab91bf6eeaa33cbd89cd7dce7930b383c2453d0cca5c227e1b97b1ae253e40cadf4468d6d86f0bf69a0b0bb55774219005b6d86316ea7c1dc4df3e3396a9f78aadf416d5af1619883f5dbbf0a39c6743b194e5adedda54d7cb3ae33e556602e19dd43a31bca7bdb15ad5245dc1ad0affb97edc8f35bb00d1c5b417a132d5be9b72a39870193b6a142198a888c0fe3760fdf1467c7208394270f2aff044c5c002d6cf189a28e34851dc434933e73e07482dad6c7ab931bfbdf29f5d51a6a866d028b91cd89abc9728cf2f8e139f612b5a248ca0758365d1d83c6bc299152b15a89b136e804ae71174d4f35970be570fd1400").unwrap(); + let proof_encode:Vec = hex::decode("fcafa9753aee681f006d7bf6fc885dcc1a70c33bbfe92bb581ac51e1325b782b1128b1586767cb2ea27555e243abd213634b87418421a65002e06fd9347b23205761d7e35a2a83ffcd35b16b6bf23982700597f2ed9706ae5e039542e8eabd1800443cc8d6ffec17c44207dd41e8ab2f2f2c663f5ed9ab724321de43cbe2ea81908c13643c42a41be1adbc5076e4927b13046d3cdaf5ef775ee48d842599508178276cd41d30e289cbd1d2bb9f92f59b520138fef3e9529139f3961f40f6ea92113ed1701b0eb62a8b21b0852f5ae0d23b4d8cf7a02a69b04abbf0b9213cc1cd16b0afed74a09f1d965f72e0faaad60215c2788b9672a8f53fb90d44b47fb16e4f97f910226d8ad46ddc1dfa6eb4f709a3c95ccfa7f4cd1b9ea5f3cf3d10c5dd0200de094abc5e25fac259efcfd79a97401359069cde3b48eaa9d3a4d848959eb269d788a415d9c22fb418459474f1f0fc16f4572ace2876cf1170d400d1d12d588f816023602a077b8fa66293ac19c951b6c572fad4481fa576e362d9f3a0ffa01200").unwrap(); + let public_input: Vec = + hex::decode("1d6c7850edbac8a5281ab93d2ed245d47b64f20c21950926d595624b488c291c").unwrap(); + + assert_ok!(curve::verify( + 0x10, + vec![vk_ic, vk_ic2], + vk_encode, + proof_encode, + vec![public_input] + )); +} + +#[test] +fn test_based_bn254_mimc_groth16() { + let vk_ic:Vec = hex::decode("03c2e806d904d8789f0caf1276fc4897bbf2bbb2e7243df2e4bf941ce616790479b410872e3c6f73f481d3e37b861fc1521d4a70457ac41efbe874fe0bf6572f00").unwrap(); + let vk_ic2:Vec = hex::decode("4d609323ed564943ba7dfd3b362cc85abf7691dd9957c613fc0d282f258f4d17cd4ddfa713c0a6d4d0dcbfc245847bd6a96fa8603a0c0d55389279cdf2967f0600").unwrap(); + let vk_encode:Vec = hex::decode("f00c5d68983d7c029a66ae498a1cc6a2423bf67760bbf922ea7a937a87705e158db79bbff4eb9516d5342ce8cd8d09f68fa094434edceebbb43383fc415d9b235c64a2bc82ea6fa740441af956bc764eefb6be4067948d2d7afc08d7dc114a2e1c0c46208e6590bed192c336b7d89f55c2eca918e6f4eb88e1c729a10612690900f70bfb6ec84456af219bcd1d682133db3db80b0ae54cf31879e74a0ae547ec0ef92f56757f4a7976c50dc3d538cb1b4ed1736d4e8e8734d5cbf85b2ac8a93d0b654ff74df7e792b9cf0fd9d1b07b6ce4d0675f57bc7e9740e64b56c9f866b309eb428ffdf69b419fc53b9d76f1de62559aedc6db7e8b6ac2f3dd0cc963ca041300cc165291944a7b617bad2e6f1560f89f4e7eb42f154333b730e2f2da7828911d7cd0a28314d647bae049c72d4e0b4f31c1f09177fcab13014e3060a70024cb210094b31d9ebcca3957fff3d94960b0eba2197fabaaa68776e767e8785f63b4541d456d755240d72dae2ee0452c0cd705d7312b9a1d17cff916e87c763d459a550438b765cd8877bf753869e1852a7c0d9ac4520abb2b935e2f3ec12423d9edc5289eba05bed12e9fe16017c86791d682d4ae86d94eeab1d7888845c0fb0af8580500").unwrap(); + let proof_encode:Vec = hex::decode("cf3bb657065cd0878eabc53790c5fa3680cad24db586bab799e3ae790217c61ba5050a0024f8761028a11dd22dfc030227b0a6c353ef5e7e1afad863c13a3304000227ad22191396e6ffe7aff14de91d7801e943f836de399b5fd5c8312086440c036648b695ffa27790f2f2a63fcf4c0b130e6b88ac786e3351fc6f13452d18034bee420c244cf7c63db4761f2feb7c14e409c8c550a68940cc0387e3812ccb10c4eb591ff3a67a87e794e2e76e25126b823ea9f38f95730951f13784e6e10f26007a922013b86567d6d48ff65baf8cdd0558c52db98f27b6c216df96f8aa1d4d2df7b1ead51d93e93ef5abdff83acaabd54736546f6995083127be1ae281ca520000").unwrap(); + let public_input: Vec = + hex::decode("829d3d572251103bac02b39e397c657c0b1f372bfc4d1b74f6c23de4993b4824").unwrap(); + + assert_ok!(curve::verify( + 0x20, + vec![vk_ic, vk_ic2], + vk_encode, + proof_encode, + vec![public_input] + )); +} + +#[test] +fn test_based_bw6_761_mimc_groth16() { + let vk_ic:Vec = hex::decode("29f6308fb1faee384c2deae7744b65d79eafa98a3947df7e35330c73ad0165a2f92844dab884fec1e15e52ac08f9306a1d8e7b4b66f718cece36a90f9aafe59588aafcd6588a55b9c05c3177904e5cbd1e3b59e4077d1caff6329268b5882200e349c8213aacabd50f11abe7f59b68fdd37f17b7fe6cee7ec3d04dca42812df1854c6c14234dd6fb7f64220949439c660ede18a5e79c8a115b942bbb7812b89be516469237a138752f6f798bcaf6afdf261e471f6c808aacd4274293cb8aff0000").unwrap(); + let vk_ic2:Vec = hex::decode("639a14c4e08b97d97166d09eff9b57abf973b487fd5f5007c6ccc8adc31dbac74372477c035964e06f06d93e1483fe81ef1b51e525ffad28a053af20271dd363353e7ccd34cd599ac7c8c97fc175e4d9db8b9399db1647f52564757781209b001cc3d1e9665bc2a8b7e82d2d074e595f297df3dff536046353057a150f6a453521182a7219ef5d38ae85efd3b505f16549ed4bd63b7166e3a4f82142f584b3ad3e27c371db05cc0ba8a8f870fefccd9eb6e5635d6684193aa4b60082a0b2ac0000").unwrap(); + let vk_encode:Vec = hex::decode("73174e4bb9c9b03c5ee9ddf21056832e01546744fffc64a5221e7e5cee09d37e534b27ae3725db7d3706c85b3932b269078f55cf1dd54c6e3247ad9a7619ef71315f5fee37909c44a216246c2ba2889b7b00b7f1298f5fb2776562527f4014008864e0733bfdd0d8f599c8bccd50d2204e3dab1863fc52e8a30476c836c16e3e6f7d098f0b34fd9edde526f9039323dcb0228a5e7c6841dcda703efe88d7331ba7d096b5753f442647e643d8ac9dfdd9d85b44824bbcc29ee8b4596e1cee520000d1e9ebd9d4d430b34703ac55be08c6d63e791dd2da3f7543b5d6db64e6ce9e0cfb031c168e2bede9cbd39070ecb4e1678d41cd0d48b087fa8a324964fded508df2ef48a7a6c21f1fe95e89aa98b00fb59bee1713e4ffaba216f00e5f15d12201f23da7e61729bc8866bcdd39bcd7d74e6cc9f9192b94c45c6753b60cef11c3b0474eaa53b3beaf3ee9f3885a547ae21385b5a5d5f15be620b9f2669573461b56e74dd326b48662cd271d1a21bb0c120f45d6bbdc632261908bc6e3ab4356480000be5dddc202ba74caa75135e9f81338910969729484a89a438090564689177b491e67f8cfa06ecfcee4acfd7cd364e094c1a4d028f7c7e0677d066cdf1355123e976fa498af59e308954054051fb3fabdda4b0d7a165cd454a71c53ff26546d000b193a142d557066f0a66964c249e4ee2d0247969ecfe861014dd4f36956da4c870ff3fbd6e16999cd43dc27c2fb2a5d72c7317dbc22d2f32541c1489a7bf716e698f898299c0ddfd09e3a892d2aa2940eec0b9f0cf63e52d83cd5dba7be50000021a8ba5d55fabd1999a5a9d717008e812486fd4309d9b4fb75ce4d22199360d6f8855d2e55259220392a9a67b9104adfa1424633f0c527b5516535d43c2632e594a118c05394ea735234b998018ac2906d7f24f89226bb07d1229c6000b13900b565ae54006fc9ef616aa866efa0e85b4c8d5a13ee55d60a478a0ea0b0cc29bc1fcab4045b6f980297a1815dcfbf5ad3031a0bb4429ad863f8695719b68208d1cd4e515a2b3129142a4bbdca3c3cde033c6256daa1fb79f133f28147a40c520000").unwrap(); + let proof_encode:Vec = hex::decode("cf5ea12a32dc313ec0791efdfca4ffa5dca127faeb57027754f0fcdd0e868623082e4543cae1bb11078c359dabbd4abbb38640c75081dca4aa2ef35bdb5ee4c856465c7b75956b88ab36d940a8df7e13adaa709ee349ed9454c7d6705211020087f361ca8cb2e83018809872a71853f0eb99a989362a3a753edbe4f58feec45c19be03b06567b357ec6779f3756b1494b74d98503d5c67ef3548ca9464d7525a3f92cdf335702a76eaaff83330f9da2c4a84b02a99ce06e0b04a1a0f1fd2f80000335b53718581ba3e14b48e381078551ff535a3d7a1671dc42898e742857f158a27d249a4d3bbe060016acdf3e9bde0095b23e073e40d56027474673321542ab30641f50f61452762d66984e33745d9456c5eba2cdafc07a52525ef1d3e221e00c92be8c3030de0338c27d281e887a63ab927478464faa7e7b0bbc68de44734c20cfd24763b8384fc6a15b2f82bf0349b86392aaa2e6fc2c95c1d0891f83a92d3b2c1deb230316eb43d9ddcbd069e600aff23ef13dd1f7b9cfade33db4872300000d1367d1907cd90da19e25e3241fb83393731c0d6183300675275017cc6287f2154abf2320cdc2cefc9df0383f98688e2e22914bef4fc32136222fb9dde45840de012e91cce1d02fbb6250a342b72c8c4155e0ff2ffa7ee71211f2641e816f200f8e725a65be98dafc395c538b2c1a009af190aedb99ecae9410257b5b295fb757dc7af138db54d06c582021442342f8924e092ae2fbf375fe94d6480910f7154b14aec033bd5cf27a2cdd225282b7a2fcaab6ac338a89d994c45976d9b7fa10000").unwrap(); + let public_input:Vec = hex::decode("28933fc1b649ded455bd7739026be2bf6f7e1c0acde6dee164724218bbf1391e318017e5a6ab8248bda0bdd1f40b8301").unwrap(); + + assert_ok!(curve::verify( + 0x30, + vec![vk_ic, vk_ic2], + vk_encode, + proof_encode, + vec![public_input] + )); } diff --git a/primitives/chain-extension/src/lib.rs b/primitives/chain-extension/src/lib.rs index 1737cb77..682f3c04 100644 --- a/primitives/chain-extension/src/lib.rs +++ b/primitives/chain-extension/src/lib.rs @@ -1,10 +1,7 @@ //! Jupiter Chain Extension #![cfg_attr(not(feature = "std"), no_std)] -use pallet_contracts::{ - chain_extension::{ - ChainExtension, Environment, Ext, InitState, RetVal, SysConfig, UncheckedFrom, - }, - Error, +use pallet_contracts::chain_extension::{ + ChainExtension, Environment, Ext, InitState, RetVal, SysConfig, UncheckedFrom, }; use sp_runtime::DispatchError; use sp_std::vec::Vec; @@ -13,31 +10,20 @@ use sp_std::vec::Vec; pub struct JupiterExt; impl ChainExtension for JupiterExt { - fn call(func_id: u32, env: Environment) -> Result + fn call( + func_id: u32, + mut env: Environment, + ) -> Result where ::AccountId: UncheckedFrom<::Hash> + AsRef<[u8]>, { - let mut dimmy: Vec = Vec::new(); - let mut input = dimmy.as_mut_slice(); + env.charge_weight(1_000_000_000_u64)?; let mut env = env.buf_in_buf_out(); - env.read_into(&mut &mut input)?; - // if let Some(output) = if jupiter_io::pairing::wasm() { - // curve::call(func_id, input) - // } else { - // jupiter_io::pairing::call(func_id, input) - // } { - // env.write(&output, false, None)?; - // Ok(RetVal::Converging(0)) - // } else { - // Err(Error::::InvalidFunctionId.into()) - // } - - if let Some(output) = curve::call(func_id, input) { - env.write(&output, false, None)?; - Ok(RetVal::Converging(0)) - } else { - Err(Error::::InvalidFunctionId.into()) - } + let input: Vec = env.read_as()?; + let output = curve::call(func_id, &input) + .map_err(|_| DispatchError::Other("Call chain extension failed"))?; + env.write(&output, false, None)?; + Ok(RetVal::Converging(0)) } fn enabled() -> bool { From b0a6fc71cffb836293627a4f59e02bc490fc9586 Mon Sep 17 00:00:00 2001 From: clearloop Date: Sat, 19 Dec 2020 06:31:58 +0800 Subject: [PATCH 25/33] test(pallets/template): mock data for pallet template --- Cargo.lock | 6 + pallets/template/Cargo.toml | 6 + pallets/template/src/benchmarking.rs | 2 +- pallets/template/src/lib.rs | 3 + pallets/template/src/mock.rs | 184 +++++++++++++++------------ pallets/template/src/tests.rs | 37 +++++- 6 files changed, 152 insertions(+), 86 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index da072292..5194fd2f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4549,9 +4549,15 @@ dependencies = [ "frame-support", "frame-system", "hex", + "jupiter-chain-extension", "jupiter-io", + "jupiter-runtime-common", "megaclite-arkworks 0.1.0", + "pallet-balances", "pallet-contracts 2.0.0", + "pallet-randomness-collective-flip", + "pallet-timestamp", + "pallet-transaction-payment", "parity-scale-codec", "sp-core", "sp-io", diff --git a/pallets/template/Cargo.toml b/pallets/template/Cargo.toml index 8601b755..039685c1 100644 --- a/pallets/template/Cargo.toml +++ b/pallets/template/Cargo.toml @@ -42,6 +42,12 @@ default-features = false [dev-dependencies] hex = "0.4.2" +pallet-timestamp = { git = "https://github.com/paritytech/substrate", branch = "master" } +pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "master" } +pallet-randomness-collective-flip = { git = "https://github.com/paritytech/substrate", branch = "master" } +pallet-transaction-payment = { git = "https://github.com/paritytech/substrate", branch = "master" } +jupiter-runtime-common = { path = "../../runtime/common" } +jupiter-chain-extension = { path = "../../primitives/chain-extension" } [build-dependencies] wat = "1.0" diff --git a/pallets/template/src/benchmarking.rs b/pallets/template/src/benchmarking.rs index bc2e3fb7..0648d447 100644 --- a/pallets/template/src/benchmarking.rs +++ b/pallets/template/src/benchmarking.rs @@ -41,7 +41,7 @@ benchmarks! { T::Currency::make_free_balance_be(&caller, BalanceOf::::max_value()); // Put WASM module - let module = include_bytes!(concat!(env!("OUT_DIR"), "/flip.wasm")).to_vec(); + let module = include_bytes!(concat!(env!("OUT_DIR"), "/groth16o.wasm")).to_vec(); let hash = T::Hashing::hash(&module); >::put_code(origin.clone().into(), module)?; diff --git a/pallets/template/src/lib.rs b/pallets/template/src/lib.rs index a453c329..fd1507dc 100644 --- a/pallets/template/src/lib.rs +++ b/pallets/template/src/lib.rs @@ -13,6 +13,9 @@ use sp_std::vec::Vec; #[cfg(feature = "runtime-benchmarks")] mod benchmarking; +#[cfg(test)] +mod mock; +#[cfg(test)] mod tests; /// Configure the pallet by specifying the parameters and types on which it depends. diff --git a/pallets/template/src/mock.rs b/pallets/template/src/mock.rs index 13380928..e4a0d617 100644 --- a/pallets/template/src/mock.rs +++ b/pallets/template/src/mock.rs @@ -1,126 +1,154 @@ -// This file is part of Substrate. - -// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//! Test utilities - -#![cfg(test)] - -use crate::{decl_tests, tests::CallWithDispatchInfo, Config, GenesisConfig, Module}; -use frame_support::weights::{DispatchInfo, IdentityFee, Weight}; -use frame_support::{impl_outer_event, impl_outer_origin, parameter_types}; -use pallet_transaction_payment::CurrencyAdapter; -use sp_core::H256; -use sp_io; -use sp_runtime::{testing::Header, traits::IdentityLookup, Perbill}; - +use crate::{Config, Module}; +use frame_support::{impl_outer_event, impl_outer_origin, parameter_types, weights::Weight}; use frame_system as system; +use sp_runtime::{ + testing::{Header, H256}, + traits::{BlakeTwo256, Convert, IdentityLookup}, + AccountId32, Perbill, +}; + impl_outer_origin! { pub enum Origin for Test {} } -mod balances { - pub use crate::Event; -} +// Configure a mock runtime to test the pallet. -impl_outer_event! { - pub enum Event for Test { - system, - balances, +#[derive(Clone, Eq, PartialEq, Debug)] +pub struct Test; + +impl Convert> for Test { + fn convert(w: Weight) -> contract::BalanceOf { + w } } -// Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted. -#[derive(Clone, PartialEq, Eq, Debug)] -pub struct Test; parameter_types! { pub const BlockHashCount: u64 = 250; pub const MaximumBlockWeight: Weight = 1024; pub const MaximumBlockLength: u32 = 2 * 1024; - pub const AvailableBlockRatio: Perbill = Perbill::one(); - pub static ExistentialDeposit: u64 = 0; + pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75); } -impl frame_system::Config for Test { + +impl system::Config for Test { type BaseCallFilter = (); type Origin = Origin; + type Call = (); type Index = u64; type BlockNumber = u64; - type Call = CallWithDispatchInfo; type Hash = H256; - type Hashing = ::sp_runtime::traits::BlakeTwo256; - type AccountId = u64; + type Hashing = BlakeTwo256; + type AccountId = AccountId32; type Lookup = IdentityLookup; type Header = Header; - type Event = Event; + type Event = (); type BlockHashCount = BlockHashCount; - type MaximumBlockWeight = MaximumBlockWeight; type DbWeight = (); - type BlockExecutionWeight = (); - type ExtrinsicBaseWeight = (); - type MaximumExtrinsicWeight = MaximumBlockWeight; - type MaximumBlockLength = MaximumBlockLength; - type AvailableBlockRatio = AvailableBlockRatio; type Version = (); type PalletInfo = (); - // type AccountData = super::AccountData; + type AccountData = pallet_balances::AccountData; type OnNewAccount = (); type OnKilledAccount = (); type SystemWeightInfo = (); + type BlockWeights = (); + type BlockLength = (); } + parameter_types! { - pub const TransactionByteFee: u64 = 1; + pub const MinimumPeriod: u64 = 1; + pub static ExistentialDeposit: u64 = 0; } -impl pallet_transaction_payment::Config for Test { - type OnChargeTransaction = CurrencyAdapter, ()>; - type TransactionByteFee = TransactionByteFee; - type WeightToFee = IdentityFee; - type FeeMultiplierUpdate = (); + +impl pallet_timestamp::Config for Test { + type Moment = u64; + type OnTimestampSet = (); + type MinimumPeriod = MinimumPeriod; + type WeightInfo = (); +} + +impl_outer_event! { + pub enum MetaEvent for Test { + frame_system, + pallet_balances, + contract, + } } impl Config for Test { + type Event = (); +} + +type System = system::Module; + +impl pallet_balances::Config for Test { + type MaxLocks = (); type Balance = u64; + type Event = (); type DustRemoval = (); - type Event = Event; type ExistentialDeposit = ExistentialDeposit; - type AccountStore = system::Module; - type MaxLocks = (); + type AccountStore = System; + type WeightInfo = (); +} + +pub type Balances = pallet_balances::Module; +type Timestamp = pallet_timestamp::Module; +type Randomness = pallet_randomness_collective_flip::Module; + +parameter_types! { + pub const SignedClaimHandicap: u64 = 2; + pub const TombstoneDeposit: u64 = 16; + pub const StorageSizeOffset: u32 = 8; + pub const RentByteFee: u64 = 4; + pub const RentDepositOffset: u64 = 10_000; + pub const SurchargeReward: u64 = 150; + pub const MaxDepth: u32 = 100; + pub const MaxValueSize: u32 = 16_384; +} + +impl contract::Config for Test { + type Time = Timestamp; + type Randomness = Randomness; + type Currency = Balances; + type Event = (); + type RentPayment = (); + type SignedClaimHandicap = SignedClaimHandicap; + type TombstoneDeposit = TombstoneDeposit; + type StorageSizeOffset = StorageSizeOffset; + type RentByteFee = RentByteFee; + type RentDepositOffset = RentDepositOffset; + type SurchargeReward = SurchargeReward; + type MaxDepth = MaxDepth; + type MaxValueSize = MaxValueSize; + type WeightPrice = Self; type WeightInfo = (); + type ChainExtension = jupiter_chain_extension::JupiterExt; } +pub type Template = Module; +pub type Contracts = contract::Module; + +pub const ALICE: AccountId32 = AccountId32::new([1u8; 32]); +pub const BOB: AccountId32 = AccountId32::new([2u8; 32]); +pub const CHARLIE: AccountId32 = AccountId32::new([3u8; 32]); +pub const DJANGO: AccountId32 = AccountId32::new([4u8; 32]); + +pub const GAS_LIMIT: contract::Gas = 10_000_000_000; + pub struct ExtBuilder { existential_deposit: u64, - monied: bool, } impl Default for ExtBuilder { fn default() -> Self { Self { existential_deposit: 1, - monied: false, } } } + impl ExtBuilder { pub fn existential_deposit(mut self, existential_deposit: u64) -> Self { self.existential_deposit = existential_deposit; self } - pub fn monied(mut self, monied: bool) -> Self { - self.monied = monied; - self - } pub fn set_associated_consts(&self) { EXISTENTIAL_DEPOSIT.with(|v| *v.borrow_mut() = self.existential_deposit); } @@ -129,26 +157,16 @@ impl ExtBuilder { let mut t = frame_system::GenesisConfig::default() .build_storage::() .unwrap(); - GenesisConfig:: { - balances: if self.monied { - vec![ - (1, 10 * self.existential_deposit), - (2, 20 * self.existential_deposit), - (3, 30 * self.existential_deposit), - (4, 40 * self.existential_deposit), - (12, 10 * self.existential_deposit), - ] - } else { - vec![] - }, + pallet_balances::GenesisConfig:: { balances: vec![] } + .assimilate_storage(&mut t) + .unwrap(); + contract::GenesisConfig:: { + current_schedule: contract::Schedule::::default(), } .assimilate_storage(&mut t) .unwrap(); - let mut ext = sp_io::TestExternalities::new(t); ext.execute_with(|| System::set_block_number(1)); ext } } - -decl_tests! { Test, ExtBuilder, EXISTENTIAL_DEPOSIT } diff --git a/pallets/template/src/tests.rs b/pallets/template/src/tests.rs index bcf9737d..acd74230 100644 --- a/pallets/template/src/tests.rs +++ b/pallets/template/src/tests.rs @@ -1,6 +1,39 @@ #![cfg(test)] -use super::*; -use frame_support::assert_ok; +use crate::{mock::*, Module, Weight}; +use contract::ConfigCache; +use frame_support::{assert_ok, traits::Currency}; +use sp_runtime::traits::{Hash, Zero}; + +#[test] +fn test_build() { + ExtBuilder::default().build().execute_with(|| { + let _ = crate::mock::Balances::deposit_creating(&ALICE, 100_000_000); + let module = include_bytes!(concat!(env!("OUT_DIR"), "/groth16.wasm")).to_vec(); + let hash = ::Hashing::hash(&module); + Contracts::put_code(Origin::signed(ALICE.clone()), module).unwrap(); + + let storage_size = ConfigCache::::subsistence_threshold_uncached() + .checked_div(::RentDepositOffset::get()) + .unwrap_or_else(Zero::zero); + + // Endowment should be large but not as large to inhibit rent payments. + let endowment = ::RentDepositOffset::get() + .saturating_mul(storage_size + ::StorageSizeOffset::get() as u64) + .saturating_sub(1u32.into()); + + Contracts::instantiate( + Origin::signed(ALICE.clone()), + endowment, // endowment + Weight::max_value(), // gas_limit + hash.clone(), // code_hash + [106, 55, 18, 226].to_vec(), // flip + b"".to_vec(), // salt + ) + .unwrap(); + let addr = Contracts::contract_address(&ALICE, &hash, &b"".to_vec()); + let result = >::call(Origin::signed(ALICE), addr.clone(), hex::decode("4e1f2d81088501e60f6032ed7f170ba3481c5d99c0890554c808ad380a7c9aefc9e62eeecf0363ecef5e59ba8eaf6dd0af40e08d7cfd024314f90080a1461a207aa3098308149837bc6322a8f4b499671c507203e798f90a9aa8fafaebb806c8708c3207a93316008501ea7f398187aecf2721441218e54645b17acd35bdf65886255e772a58353ef2e25c92cf7f872bea5afca6081d03e6b115e74befd85720c241ee5ef038621a1cc72e329db9aebec0faf480e83cbd9e4b735650ab0cce2e321d64311bd34bca9e0200910a9094c864d37f890720969430f2682ccc76dc83f9234694590bd334b40dbfa7f28de40e914571d8ae2a88712844f86f0d6dd2f4875120f66304bfcedd55c9a805310155a5345ddc626cbb6fe5ce7026be174a08c798e4d1f1010f97138c30b10a0e23d3cde62852c7b2aabcd7603f87fc54cb0c2fcfa48a1a6e07ea917eec248284a1409dd21ae7bd64b862e7df91fd0af1f36857260a843ea18cd393172b91196ca17bc5f37efb126d585abfcf23b8438d72f90365c382b661256d7caa361d07000c06c5cc02155140b97283cc024daf57023a781a9115bb6e17350264f8b52784a6008921402af8c05dd39f4b789bd50435d2c5aefeb6dc9817af41f45779e3a2d80ab98ef923723b938566747c10a4a169ca5097c5d5073449c3d2e65e16291850a5721416e102df69729ffab67cf948ca51c4ac4c2b54c521552fd4a5a5462d6d3b77ba9932aba0fda8ea8da76e5b0b9166ba600f9c5cc5e442b64ed560c126f8b88e2761c0c6a17a4dcbc1a132a975683ed0b6018ac45d7f4942ad7831790e00408697568bc15871da494a2fe12199531130a8a5b96f07c69020dc01bf9f3ed043a6e1bd08f8d7826c7d5c0fc5c771195ab91bf6eeaa33cbd89cd7dce7930b383c2453d0cca5c227e1b97b1ae253e40cadf4468d6d86f0bf69a0b0bb55774219005b6d86316ea7c1dc4df3e3396a9f78aadf416d5af1619883f5dbbf0a39c6743b194e5adedda54d7cb3ae33e556602e19dd43a31bca7bdb15ad5245dc1ad0affb97edc8f35bb00d1c5b417a132d5be9b72a39870193b6a142198a888c0fe3760fdf1467c7208394270f2aff044c5c002d6cf189a28e34851dc434933e73e07482dad6c7ab931bfbdf29f5d51a6a866d028b91cd89abc9728cf2f8e139f612b5a248ca0758365d1d83c6bc299152b15a89b136e804ae71174d4f35970be570fd14000d06fcafa9753aee681f006d7bf6fc885dcc1a70c33bbfe92bb581ac51e1325b782b1128b1586767cb2ea27555e243abd213634b87418421a65002e06fd9347b23205761d7e35a2a83ffcd35b16b6bf23982700597f2ed9706ae5e039542e8eabd1800443cc8d6ffec17c44207dd41e8ab2f2f2c663f5ed9ab724321de43cbe2ea81908c13643c42a41be1adbc5076e4927b13046d3cdaf5ef775ee48d842599508178276cd41d30e289cbd1d2bb9f92f59b520138fef3e9529139f3961f40f6ea92113ed1701b0eb62a8b21b0852f5ae0d23b4d8cf7a02a69b04abbf0b9213cc1cd16b0afed74a09f1d965f72e0faaad60215c2788b9672a8f53fb90d44b47fb16e4f97f910226d8ad46ddc1dfa6eb4f709a3c95ccfa7f4cd1b9ea5f3cf3d10c5dd0200de094abc5e25fac259efcfd79a97401359069cde3b48eaa9d3a4d848959eb269d788a415d9c22fb418459474f1f0fc16f4572ace2876cf1170d400d1d12d588f816023602a077b8fa66293ac19c951b6c572fad4481fa576e362d9f3a0ffa0120004801d6c7850edbac8a5281ab93d2ed245d47b64f20c21950926d595624b488c291c").expect("Decode failed")); + }); +} #[test] fn test_bls12_377_verify() { From d6f23fc6d0e177855a843157335002b4b68f6796 Mon Sep 17 00:00:00 2001 From: clearloop Date: Sat, 19 Dec 2020 20:37:31 +0800 Subject: [PATCH 26/33] feat(primitives/chain-extension): return function id in chain-extension --- Cargo.lock | 61 +- bin/node/cli/Cargo.toml | 3 +- bin/node/cli/src/chain_spec.rs | 121 +- pallets/template/Cargo.toml | 4 +- pallets/template/groth16.wat | 9176 +++---------------------- pallets/template/src/benchmarking.rs | 11 +- pallets/template/src/lib.rs | 16 +- pallets/template/src/mock.rs | 16 +- pallets/template/src/tests.rs | 67 +- primitives/chain-extension/Cargo.toml | 1 + primitives/chain-extension/src/lib.rs | 16 +- primitives/io/Cargo.toml | 5 +- runtime/jupiter/Cargo.toml | 5 +- runtime/jupiter/src/lib.rs | 1 + 14 files changed, 1077 insertions(+), 8426 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5194fd2f..9047fb4c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2690,8 +2690,8 @@ name = "jupiter-chain-extension" version = "0.1.0" dependencies = [ "jupiter-io", - "megaclite-arkworks 0.1.0 (git+https://github.com/patractlabs/megaclite.git)", - "pallet-contracts 2.0.0", + "megaclite-arkworks", + "pallet-contracts", "sp-runtime", "sp-std", ] @@ -2709,7 +2709,7 @@ dependencies = [ "jupiter-runtime-common", "log", "pallet-authority-discovery", - "pallet-contracts 2.0.0 (git+https://github.com/paritytech/substrate)", + "pallet-contracts", "pallet-im-online", "pallet-staking", "parking_lot 0.10.2", @@ -2756,7 +2756,7 @@ dependencies = [ "jupiter-primitives", "jupiter-rpc", "log", - "pallet-contracts 2.0.0", + "pallet-contracts", "parking_lot 0.10.2", "sc-basic-authorship", "sc-cli", @@ -2793,7 +2793,7 @@ dependencies = [ "jupiter-runtime-common", "pallet-authorship", "pallet-balances", - "pallet-contracts 2.0.0", + "pallet-contracts", "pallet-contracts-primitives", "pallet-contracts-rpc-runtime-api", "pallet-indices", @@ -2832,7 +2832,7 @@ dependencies = [ name = "jupiter-io" version = "0.2.0" dependencies = [ - "megaclite-arkworks 0.1.0", + "megaclite-arkworks", "num-bigint 0.3.1", "num-traits", "sp-runtime-interface", @@ -2887,6 +2887,7 @@ dependencies = [ "frame-support", "frame-system", "frame-system-rpc-runtime-api", + "jupiter-chain-extension", "jupiter-primitives", "jupiter-runtime-common", "pallet-authority-discovery", @@ -2894,7 +2895,7 @@ dependencies = [ "pallet-babe", "pallet-balances", "pallet-collective", - "pallet-contracts 2.0.0 (git+https://github.com/paritytech/substrate)", + "pallet-contracts", "pallet-contracts-primitives", "pallet-contracts-rpc-runtime-api", "pallet-democracy", @@ -3663,26 +3664,6 @@ dependencies = [ "rustc-hex", ] -[[package]] -name = "megaclite-arkworks" -version = "0.1.0" -source = "git+https://github.com/patractlabs/megaclite.git#cb5277ac81b36951e79cb4e1c6e29f0ccdd695fa" -dependencies = [ - "ark-bls12-377", - "ark-bls12-381", - "ark-bn254", - "ark-bw6-761", - "ark-cp6-782", - "ark-ec", - "ark-ff", - "ark-serialize", - "ark-std", - "num-bigint 0.3.1", - "num-traits", - "rand 0.7.3", - "rustc-hex", -] - [[package]] name = "memchr" version = "2.3.4" @@ -4208,27 +4189,6 @@ dependencies = [ "wasmi-validation", ] -[[package]] -name = "pallet-contracts" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#c88b104028b4fdda35311adb12eabf7aa5aa4316" -dependencies = [ - "frame-support", - "frame-system", - "pallet-contracts-primitives", - "pallet-contracts-proc-macro", - "parity-scale-codec", - "parity-wasm 0.41.0", - "pwasm-utils 0.16.0", - "serde", - "sp-core", - "sp-io", - "sp-runtime", - "sp-sandbox", - "sp-std", - "wasmi-validation", -] - [[package]] name = "pallet-contracts-primitives" version = "2.0.0" @@ -4545,6 +4505,7 @@ dependencies = [ name = "pallet-template" version = "2.0.0" dependencies = [ + "assert_matches", "frame-benchmarking", "frame-support", "frame-system", @@ -4552,9 +4513,9 @@ dependencies = [ "jupiter-chain-extension", "jupiter-io", "jupiter-runtime-common", - "megaclite-arkworks 0.1.0", + "megaclite-arkworks", "pallet-balances", - "pallet-contracts 2.0.0", + "pallet-contracts", "pallet-randomness-collective-flip", "pallet-timestamp", "pallet-transaction-payment", diff --git a/bin/node/cli/Cargo.toml b/bin/node/cli/Cargo.toml index 312d4e1f..8ebfc730 100644 --- a/bin/node/cli/Cargo.toml +++ b/bin/node/cli/Cargo.toml @@ -37,7 +37,8 @@ sp-authority-discovery = { version = "2.0.0", git = "https://github.com/parityte sc-cli = { version = "0.8.0", git = "https://github.com/paritytech/substrate", branch = "master", optional = true } sc-service = { version = "0.8.0", git = "https://github.com/paritytech/substrate", branch = "master", optional = true } -pallet-contracts = { version = "2.0.0", git = "https://github.com/paritytech/substrate", branch = "master" } +# pallet-contracts = { version = "2.0.0", git = "https://github.com/paritytech/substrate", branch = "master" } +pallet-contracts = { package = "pallet-contracts", path = "../../../vendor/substrate/frame/contracts" } pallet-authority-discovery = { version = "2.0.0", git = "https://github.com/paritytech/substrate", branch = "master" } pallet-im-online = { version = "2.0.0", git = "https://github.com/paritytech/substrate", branch = "master" } pallet-staking = { version = "2.0.0", git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/bin/node/cli/src/chain_spec.rs b/bin/node/cli/src/chain_spec.rs index 10359a77..7a6d7a89 100644 --- a/bin/node/cli/src/chain_spec.rs +++ b/bin/node/cli/src/chain_spec.rs @@ -3,7 +3,7 @@ use std::convert::TryInto; use hex_literal::hex; -use sc_service::ChainType; +use sc_service::{config::TelemetryEndpoints, ChainType}; use sp_authority_discovery::AuthorityId as AuthorityDiscoveryId; use sp_consensus_babe::AuthorityId as BabeId; use sp_core::{crypto::UncheckedInto, sr25519, Pair, Public}; @@ -24,7 +24,7 @@ use pallet_im_online::sr25519::AuthorityId as ImOnlineId; use pallet_staking::{Forcing, StakerStatus}; // The URL for the telemetry server. -// const STAGING_TELEMETRY_URL: &str = "wss://telemetry.polkadot.io/submit/"; +const PATRACT_TELEMETRY_URL: &str = "wss://telemetry.patract.io/submit"; /// Specialized `ChainSpec`. This is a specialization of the general Substrate ChainSpec type. pub type ChainSpec = sc_service::GenericChainSpec; @@ -196,10 +196,10 @@ pub fn staging_testnet_config() -> Result { let root_key: AccountId = hex!["8a5b214c82362a8aba60af2a5fee63989f1ae4ce3ec802251c0b3ff9f4ad1826"].into(); // bash: - // for i in 1 2; do for j in stash controller; do subkey inspect "$SECRET//$i//$j"; done; done - // for i in 1 2; do for j in babe; do subkey inspect --scheme Sr25519 "$SECRET//$i//$j"; done; done - // for i in 1 2; do for j in grandpa; do subkey inspect --scheme Ed25519 "$SECRET//$i//$j"; done; done - // for i in 1 2; do for j in im_online; do subkey inspect --scheme Sr25519 "$SECRET//$i//$j"; done; done + // for i in 1 2 3 4; do for j in stash controller; do subkey inspect "$SECRET//$i//$j"; done; done + // for i in 1 2 3 4; do for j in babe; do subkey inspect --scheme Sr25519 "$SECRET//$i//$j"; done; done + // for i in 1 2 3 4; do for j in grandpa; do subkey inspect --scheme Ed25519 "$SECRET//$i//$j"; done; done + // for i in 1 2 3 4; do for j in im_online; do subkey inspect --scheme Sr25519 "$SECRET//$i//$j"; done; done // stash & controller let (stash1, controller1): (AccountId, AccountId) = ( @@ -214,13 +214,31 @@ pub fn staging_testnet_config() -> Result { // 5DMRmiSn4DTdo7HZM2frH88UZFapYGMCgEQukpD6yd5fc1Pm hex!["38fd41ccf5b2020e4f79ab9007e0496096ff5edd692c57cba1dbfce5eaa77c69"].into(), ); + let (stash3, controller3): (AccountId, AccountId) = ( + // 5EEbdKijxzqspBP1SKAbE7gREHx4m5AXfAAB9vaga9rWkEFB + hex!["6003f2d767ffb437bad9a5cdf0ea3782cbb36207edd3e284a84eba2419ae3c4d"].into(), + // 5G9ALoW7Ccpm8zDwz21RdGHRFhfGYQKFgMDf7JkYXFCnLKHo + hex!["b4571275b5dfdcafca6f42e77dd627da0ecde9bd9e60426b38d90dbca511a654"].into(), + ); + let (stash4, controller4): (AccountId, AccountId) = ( + // 5GvFNec4YCaH2Wu5ysmG938AjtHcrka2h6u8GD9aEiJHut7n + hex!["d6ba0dd1b58e3fe1a380f51f289e5745d2bdf3dfef712e5febaea4f867c57429"].into(), + // 5Cafs4eRGLi9yyat5YwduLNL2xZA36PoLKjvApk1Cm1ScMwA + hex!["16daa7070bf20d6170f39b468b5abadd5d0ad810f7c1e8303fa48a79081d6d44"].into(), + ); // babe - // 5EtZp8WCs4yRDvfLapwU8GrSoS9e7qpXVtYZVCNDFBXuVsiW + // 5DhZaXAow1FwaJPSn2JNHxMqsmjp6reNLWQmPNuqq5PNZ4CW let babe1: BabeId = - hex!["7cf92b27e280cef89900a7d351e37cdc6a578104a71f918165f52fee77aef647"].unchecked_into(); - // 5GRaVtCnSKjeXXXu6S5cVEcqn5yGbnCTGYYeKodxiRbnnZBd + hex!["485872201949c11fed2706383b0bdece75f891e579bf44458b7e40d90ab7b84d"].unchecked_into(); + // 5H3wddAi5xfRvGApjJ4ZQj3bwHf2UNxRGdy6397SxZ48ryyK let babe2: BabeId = - hex!["c0dc511c88d7ef3bc5b465de48aac4efc643283f179b93d413f97e4a7aac714b"].unchecked_into(); + hex!["dc984b002d46efcadf477db5fa64fccc14282999663ec909bb6e90b16de24e23"].unchecked_into(); + // 5Do1StjFe2SPe6fUCKWyVwTg9CKGAd2ZRir2e7XSdQVo6K83 + let babe3: BabeId = + hex!["4c7fc0fe786089da8571fb20b2546d31b6be583b4c640cdf2878461c6ab6ee15"].unchecked_into(); + // 5Gs4SpDKNQDZxPtB3asd6B3M7mwo8VMasW7YLwLiNu1or4cG + let babe4: BabeId = + hex!["d44b87bdd403d8b7380ae2380cae6fea08a965c8910791c89b8b595eac90e474"].unchecked_into(); // grandpa // 5CwDbbQZY7dWGhgPvGqbi2WnhcFw7WkpW2ZrmvSvhtM7qVKn let grandpa1: GrandpaId = @@ -228,20 +246,38 @@ pub fn staging_testnet_config() -> Result { // 5G6VvSAqrqNLoqoRM4GUxrKQkfHuZ3ggnW8bbsQZbi187kfu let grandpa2: GrandpaId = hex!["b24f3f629e5cc692b50f08b9714c67be656b057293bb077beb44781a9a0e2992"].unchecked_into(); + // 5DTqERGezEdBkhNKaAczspP9MTzv73GAQr91Rf1t82csFUbJ + let grandpa3: GrandpaId = + hex!["3ddfb449782bb812d1a85a1a05870667549847c254ab981a4586c43d89f09203"].unchecked_into(); + // 5FVKQ3FXyUSGWt8eBK6Q2NJuzoZaSBtoukGPfqbMfb4RtqV4 + let grandpa4: GrandpaId = + hex!["977a3b37d4be87bcdc027461c30d6c5f7a0e2c4fc11c91b618444a1be9a2b18c"].unchecked_into(); // im_online - // 5EtZp8WCs4yRDvfLapwU8GrSoS9e7qpXVtYZVCNDFBXuVsiW + // 5DCVpVpaogBmFaovbpLkvjdzwsNoASYZoFDhyLvGBCi4YdLa let imonline1: ImOnlineId = - hex!["7cf92b27e280cef89900a7d351e37cdc6a578104a71f918165f52fee77aef647"].unchecked_into(); - // 5GRaVtCnSKjeXXXu6S5cVEcqn5yGbnCTGYYeKodxiRbnnZBd + hex!["322dacd21c5f1db0a530fb8e3d87c5347d9c2e01aab574fea5797ef76a239147"].unchecked_into(); + // 5EcYTkD6yYBUvtfBi7Y5VtZzCDMfqhGbe2LWTm7yrjudC8VC let imonline2: ImOnlineId = - hex!["c0dc511c88d7ef3bc5b465de48aac4efc643283f179b93d413f97e4a7aac714b"].unchecked_into(); - // authority_discovery - // 5EtZp8WCs4yRDvfLapwU8GrSoS9e7qpXVtYZVCNDFBXuVsiW + hex!["70c0b15510e3d2d1fda9dbc7568c211932ef6aa49eb4bf48a7068dbeb9acf26e"].unchecked_into(); + // 5EWsJmZebbHLAnghieEMKrpBpTmu7bSGaT6VRfcV7tpmFnvX + let imonline3: ImOnlineId = + hex!["6c6ca8b2c42dd0f37981a89998ef37ccb05b6808518e96e01a3d920e02cb6452"].unchecked_into(); + // 5ESAnfDPdLXAozgazozAPsyoJXy6xD9c1WBbyKQ4pxRZGn5D + let imonline4: ImOnlineId = + hex!["68d7471ed1508b29497258a46a0cd0bd2eb5b3cce8eefb03b09044827b3bdf0c"].unchecked_into(); + // authority_discovery (same as im_online) + // 5DCVpVpaogBmFaovbpLkvjdzwsNoASYZoFDhyLvGBCi4YdLa let audi1: AuthorityDiscoveryId = - hex!["7cf92b27e280cef89900a7d351e37cdc6a578104a71f918165f52fee77aef647"].unchecked_into(); - // 5GRaVtCnSKjeXXXu6S5cVEcqn5yGbnCTGYYeKodxiRbnnZBd + hex!["322dacd21c5f1db0a530fb8e3d87c5347d9c2e01aab574fea5797ef76a239147"].unchecked_into(); + // 5EcYTkD6yYBUvtfBi7Y5VtZzCDMfqhGbe2LWTm7yrjudC8VC let audi2: AuthorityDiscoveryId = - hex!["c0dc511c88d7ef3bc5b465de48aac4efc643283f179b93d413f97e4a7aac714b"].unchecked_into(); + hex!["70c0b15510e3d2d1fda9dbc7568c211932ef6aa49eb4bf48a7068dbeb9acf26e"].unchecked_into(); + // 5EWsJmZebbHLAnghieEMKrpBpTmu7bSGaT6VRfcV7tpmFnvX + let audi3: AuthorityDiscoveryId = + hex!["6c6ca8b2c42dd0f37981a89998ef37ccb05b6808518e96e01a3d920e02cb6452"].unchecked_into(); + // 5ESAnfDPdLXAozgazozAPsyoJXy6xD9c1WBbyKQ4pxRZGn5D + let audi4: AuthorityDiscoveryId = + hex!["68d7471ed1508b29497258a46a0cd0bd2eb5b3cce8eefb03b09044827b3bdf0c"].unchecked_into(); let initial_authorities: Vec = vec![ ( @@ -260,6 +296,22 @@ pub fn staging_testnet_config() -> Result { imonline2, audi2, ), + ( + controller3.clone(), + stash3.clone(), + babe3, + grandpa3, + imonline3, + audi3, + ), + ( + controller4.clone(), + stash4.clone(), + babe4, + grandpa4, + imonline4, + audi4, + ), ]; Ok(ChainSpec::from_genesis( @@ -282,17 +334,28 @@ pub fn staging_testnet_config() -> Result { stash1.clone(), controller2.clone(), stash2.clone(), + controller3.clone(), + stash3.clone(), + controller4.clone(), + stash4.clone(), ], true, ) }, // Bootnodes vec![ - "/dns/p2p.staging-1.patract.io/tcp/30333/p2p/12D3KooWERffViUKxaPU1XEpQ11wPyjBM775XZU6jkApz25wxzEZ".to_string().try_into().expect("must be valid bootnode"), - "/dns/p2p.staging-2.patract.io/tcp/30334/p2p/12D3KooWK4YK8jbwirhMsmfMX4QgyihZJGQz72G1Jd4iV8zLjjpq".to_string().try_into().expect("must be valid bootnode"), + "/dns/staging-1.jupiter.p2p.patract.io/tcp/30333/p2p/12D3KooWA8LCSwvSvrsVL5ANMzY5z23NDKrnSqLtyNq3geRmUsRT".to_string().try_into().expect("must be valid bootnode"), + "/dns/staging-2.jupiter.p2p.patract.io/tcp/30334/p2p/12D3KooWSZAzpj81ouT2bZJFbfL6JTKiMiGZZq82AJZMUDB23JJ5".to_string().try_into().expect("must be valid bootnode"), + "/dns/staging-3.jupiter.p2p.patract.io/tcp/30335/p2p/12D3KooWEm8wPo1AAZeiNifEGPz6doJeQeyk3z5343scxpiU46ef".to_string().try_into().expect("must be valid bootnode"), + "/dns/staging-4.jupiter.p2p.patract.io/tcp/30336/p2p/12D3KooWMx9TH6AtZf8y7DnVxDfYJmLPrL43uVbrhsnH8JtsvH2r".to_string().try_into().expect("must be valid bootnode"), ], // Telemetry - None, + Some(TelemetryEndpoints::new( + vec![ + (PATRACT_TELEMETRY_URL.to_string(), 0) + ]) + .expect("Polkadot Staging telemetry url is valid; qed"), + ), // Protocol ID Some("jupiter_staging_testnet"), // Properties @@ -322,6 +385,13 @@ fn testnet_genesis( const ENDOWMENT: u128 = 1_000_000 * DOTS; const STASH: u128 = 100 * DOTS; + let mut endowed_accounts: Vec = endowed_accounts; + initial_authorities.iter().for_each(|x| { + if !endowed_accounts.contains(&x.0) { + endowed_accounts.push(x.0.clone()) + } + }); + GenesisConfig { frame_system: Some(SystemConfig { // Add Wasm runtime to storage. @@ -332,7 +402,6 @@ fn testnet_genesis( balances: endowed_accounts .iter() .map(|k: &AccountId| (k.clone(), ENDOWMENT)) - .chain(initial_authorities.iter().map(|x| (x.0.clone(), STASH))) .collect(), }), pallet_indices: Some(IndicesConfig { indices: vec![] }), @@ -359,7 +428,11 @@ fn testnet_genesis( }, }), pallet_staking: Some(StakingConfig { - validator_count: initial_authorities.len() as u32 * 2, + validator_count: if initial_authorities.len() < 4 { + initial_authorities.len() as u32 * 2 + } else { + 50 + }, minimum_validator_count: initial_authorities.len() as u32, stakers: initial_authorities .iter() diff --git a/pallets/template/Cargo.toml b/pallets/template/Cargo.toml index 039685c1..0c5b27ec 100644 --- a/pallets/template/Cargo.toml +++ b/pallets/template/Cargo.toml @@ -30,8 +30,7 @@ default-features = false [dependencies.curve] package = "megaclite-arkworks" -path = "/Users/mercury/code/megaclite/crates/curve/arkworks" -# git = "https://github.com/patractlabs/megaclite.git" +git = "https://github.com/patractlabs/megaclite.git" features = ["tests"] default-features = false @@ -42,6 +41,7 @@ default-features = false [dev-dependencies] hex = "0.4.2" +assert_matches = "1.3.0" pallet-timestamp = { git = "https://github.com/paritytech/substrate", branch = "master" } pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "master" } pallet-randomness-collective-flip = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/pallets/template/groth16.wat b/pallets/template/groth16.wat index 41bb845c..414612ce 100644 --- a/pallets/template/groth16.wat +++ b/pallets/template/groth16.wat @@ -1,8441 +1,1097 @@ (module (type (;0;) (func (param i32 i32))) (type (;1;) (func (param i32 i32 i32))) - (type (;2;) (func (param i32))) - (type (;3;) (func (param i32 i32 i32 i32))) - (type (;4;) (func (param i32 i32 i32) (result i32))) - (type (;5;) (func (param i32 i32) (result i32))) - (type (;6;) (func (param i32 i32 i32 i32) (result i32))) - (type (;7;) (func (result i32))) - (type (;8;) (func (param i32) (result i32))) - (type (;9;) (func (param i32 i32 i32 i32 i32))) - (type (;10;) (func (param i32 i32 i32 i32 i32 i32))) - (type (;11;) (func (param i32 i32 i32 i32 i32) (result i32))) - (type (;12;) (func (param i32) (result i64))) - (import "seal0" "seal_value_transferred" (func (;0;) (type 0))) - (import "seal0" "seal_input" (func (;1;) (type 0))) - (import "seal0" "seal_return" (func (;2;) (type 1))) - (import "seal0" "seal_call_chain_extension" (func (;3;) (type 11))) + (type (;2;) (func (param i32) (result i32))) + (type (;3;) (func (param i32))) + (type (;4;) (func (result i32))) + (type (;5;) (func (param i32 i32 i32) (result i32))) + (type (;6;) (func (param i32 i32 i32 i32))) + (type (;7;) (func (param i32) (result i64))) + (import "seal0" "seal_get_storage" (func (;0;) (type 5))) + (import "seal0" "seal_set_storage" (func (;1;) (type 1))) + (import "seal0" "seal_value_transferred" (func (;2;) (type 0))) + (import "seal0" "seal_input" (func (;3;) (type 0))) + (import "seal0" "seal_return" (func (;4;) (type 1))) (import "env" "memory" (memory (;0;) 2 16)) - (func (;4;) (type 2) (param i32) - local.get 0 - call 5 - local.get 0 - call 6) - (func (;5;) (type 2) (param i32) + (func (;5;) (type 2) (param i32) (result i32) (local i32) - local.get 0 - i32.load offset=8 - i32.const 12 - i32.mul - local.set 1 - local.get 0 - i32.load - local.set 0 - loop ;; label = @1 - local.get 1 - if ;; label = @2 - local.get 1 - i32.const -12 - i32.add - local.set 1 - local.get 0 - call 26 - local.get 0 - i32.const 12 - i32.add - local.set 0 - br 1 (;@1;) - end - end) - (func (;6;) (type 2) (param i32) - (local i32 i32) global.get 0 - i32.const 16 - i32.sub + i32.const -64 + i32.add local.tee 1 global.set 0 local.get 1 + i32.const 32 + i32.add local.get 0 - call 42 - block ;; label = @1 - local.get 1 - i32.load - local.tee 0 - i32.eqz - br_if 0 (;@1;) - local.get 1 - i32.load offset=4 - local.tee 2 - i32.eqz - br_if 0 (;@1;) - local.get 0 - local.get 2 - call 8 - end + i32.const 24 + i32.add + i64.load + i64.store local.get 1 - i32.const 16 + i32.const 24 i32.add - global.set 0) - (func (;7;) (type 2) (param i32) - (local i32 i32) - block ;; label = @1 - local.get 0 - i32.load8_u - i32.eqz - br_if 0 (;@1;) - local.get 0 - i32.const 4 - i32.add - i32.load8_u - br_if 0 (;@1;) - local.get 0 - i32.const 8 - i32.add - i32.load8_u - local.tee 1 - i32.const 7 - i32.and - i32.const 4 - i32.le_u - i32.const 0 - local.get 1 - i32.const 1 - i32.ne - select - br_if 0 (;@1;) - local.get 0 - i32.const 12 - i32.add - i32.load - local.tee 1 - i32.load - local.get 1 - i32.load offset=4 - i32.load - call_indirect (type 2) - local.get 1 - i32.load offset=4 - i32.load offset=4 - local.tee 2 - if ;; label = @2 - local.get 1 - i32.load - local.get 2 - call 8 - end - local.get 0 - i32.load offset=12 - i32.const 12 - call 8 - end) - (func (;8;) (type 0) (param i32 i32) local.get 0 + i32.const 16 + i32.add + i64.load + i64.store local.get 1 - call 37) - (func (;9;) (type 12) (param i32) (result i64) - (local i32 i32) - global.get 0 i32.const 16 - i32.sub - local.tee 1 - global.set 0 + i32.add + local.get 0 + i32.const 8 + i32.add + i64.load + i64.store local.get 1 i64.const 0 - i64.store8 offset=12 + i64.store offset=40 local.get 1 - i64.const 0 - i64.store32 offset=8 - block (result i32) ;; label = @1 - loop ;; label = @2 - local.get 2 - i32.const 4 - i32.eq - if ;; label = @3 - local.get 1 - i64.load8_u offset=12 - i32.wrap_i64 - i32.const 4 - i32.lt_u - local.set 2 - local.get 1 - i32.load offset=8 - br 2 (;@1;) + local.get 0 + i64.load + i64.store offset=8 + local.get 1 + i32.const 8 + i32.add + call 6 + local.get 1 + i32.const 16384 + i32.store offset=52 + local.get 1 + i32.const 65572 + i32.store offset=48 + local.get 1 + i32.const 16384 + i32.store offset=56 + i32.const 65572 + local.get 1 + i32.const 56 + i32.add + call 0 + local.set 0 + local.get 1 + i32.const 48 + i32.add + local.get 1 + i32.load offset=56 + call 7 + block ;; label = @1 + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + local.get 0 + br_table 1 (;@3;) 0 (;@4;) 0 (;@4;) 2 (;@2;) 0 (;@4;) + end + unreachable end local.get 1 - local.get 0 - call 10 local.get 1 - i32.load8_u - i32.const 1 - i32.and - i32.eqz - if ;; label = @3 - local.get 1 - i32.const 8 - i32.add - local.get 2 - i32.add - local.get 1 - i32.load8_u offset=1 - i32.store8 - local.get 1 - local.get 2 - i32.const 1 - i32.add - local.tee 2 - i32.store8 offset=12 - br 1 (;@2;) - end - end - local.get 2 - i32.const 255 - i32.and - if ;; label = @2 + i64.load offset=48 + i64.store offset=56 local.get 1 - i32.const 0 - i32.store8 offset=12 + i32.const 56 + i32.add + call 8 + i32.const 255 + i32.and + local.tee 0 + i32.const 2 + i32.ne + br_if 1 (;@1;) + unreachable end - i32.const 1 - local.set 2 - i32.const 0 + unreachable end - local.set 0 local.get 1 - i32.const 16 - i32.add + i32.const -64 + i32.sub global.set 0 + local.get 0 + i32.const 0 + i32.ne) + (func (;6;) (type 2) (param i32) (result i32) + (local i64 i64 i64) + local.get 0 + i64.load offset=32 + local.set 1 + local.get 0 + i64.const 1 + i64.store offset=32 + local.get 0 + local.get 1 + local.get 0 + i64.load + local.tee 2 + i64.add + local.tee 1 + i64.store + local.get 0 + local.get 0 + i64.load offset=8 + local.tee 3 + local.get 1 local.get 2 + i64.lt_u + i64.extend_i32_u + i64.add + local.tee 1 + i64.store offset=8 + local.get 0 + local.get 0 + i64.load offset=16 + local.tee 2 + local.get 1 + local.get 3 + i64.lt_u i64.extend_i32_u + i64.add + local.tee 1 + i64.store offset=16 + local.get 0 local.get 0 + i64.load offset=24 + local.get 1 + local.get 2 + i64.lt_u i64.extend_i32_u - i64.const 8 - i64.shl - i64.or) - (func (;10;) (type 0) (param i32 i32) - (local i32 i32) + i64.add + i64.store offset=24 + local.get 0) + (func (;7;) (type 0) (param i32 i32) + (local i32 i32 i32) global.get 0 i32.const 16 i32.sub local.tee 2 global.set 0 - local.get 2 + local.get 0 + i32.load offset=4 + local.set 3 + local.get 0 i32.const 0 - i32.store8 offset=15 - block ;; label = @1 - local.get 1 - local.get 2 - i32.const 15 - i32.add - i32.const 1 - call 24 - i32.eqz - if ;; label = @2 - local.get 2 - i32.load8_u offset=15 - local.set 1 - br 1 (;@1;) - end - i32.const 1 - local.set 3 - end + i32.store offset=4 local.get 0 - local.get 1 - i32.store8 offset=1 + i32.load + local.set 4 local.get 0 - local.get 3 - i32.store8 + i32.const 65572 + i32.store + local.get 2 + i32.const 8 + i32.add + local.get 1 + local.get 4 + local.get 3 + call 15 + local.get 0 + local.get 2 + i64.load offset=8 + i64.store align=4 local.get 2 i32.const 16 i32.add global.set 0) - (func (;11;) (type 0) (param i32 i32) - (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i64 i64) + (func (;8;) (type 2) (param i32) (result i32) + (local i32 i32) global.get 0 - i32.const -64 - i32.add - local.tee 2 + i32.const 16 + i32.sub + local.tee 1 global.set 0 - local.get 2 + local.get 1 i32.const 8 i32.add + local.get 0 + call 11 local.get 1 - call 12 - block ;; label = @1 - block ;; label = @2 - local.get 2 - i32.load offset=8 - if ;; label = @3 - local.get 0 - i32.const 0 - i32.store - br 1 (;@2;) - end - block ;; label = @3 - block ;; label = @4 - local.get 2 - i32.load offset=12 - local.tee 8 - local.get 1 - i32.load offset=4 - i32.const 12 - i32.div_u - local.tee 3 - local.get 3 - local.get 8 - i32.gt_u - select - i64.extend_i32_u - i64.const 12 - i64.mul - local.tee 11 - i64.const 32 - i64.shr_u - i32.wrap_i64 - br_if 0 (;@4;) - local.get 11 - i32.wrap_i64 - local.tee 3 - i32.const -1 - i32.le_s - br_if 0 (;@4;) - i32.const 4 - local.set 5 - local.get 3 - if ;; label = @5 - local.get 3 - local.tee 6 - i32.const 4 - call 13 - local.tee 5 - i32.eqz - br_if 4 (;@1;) - end - local.get 2 - i32.const 0 - i32.store offset=24 - local.get 2 - local.get 5 - i32.store offset=16 - local.get 2 - local.get 6 - i32.const 12 - i32.div_u - local.tee 3 - i32.store offset=20 - i32.const 4 - local.set 6 - block ;; label = @5 - block ;; label = @6 - loop ;; label = @7 - local.get 7 - local.get 8 - i32.eq - if ;; label = @8 - local.get 0 - i32.const 8 - i32.add - local.get 8 - i32.store - local.get 2 - local.get 3 - i32.store offset=20 - local.get 0 - local.get 2 - i64.load offset=16 - i64.store align=4 - br 6 (;@2;) - end - local.get 2 - i32.const 48 - i32.add - local.get 1 - call 14 - local.get 2 - i32.load offset=48 - local.tee 10 - i32.eqz - br_if 4 (;@3;) - local.get 2 - i64.load offset=52 align=4 - local.set 11 - block ;; label = @8 - local.get 3 - local.get 7 - i32.eq - if ;; label = @9 - local.get 3 - i32.const 1 - i32.add - local.tee 4 - local.get 3 - i32.lt_u - br_if 3 (;@6;) - local.get 3 - local.get 3 - i32.add - local.tee 9 - local.get 3 - i32.lt_u - br_if 5 (;@4;) - block (result i32) ;; label = @10 - local.get 3 - if ;; label = @11 - local.get 3 - i64.extend_i32_u - i64.const 12 - i64.mul - local.tee 12 - i64.const 32 - i64.shr_u - i32.wrap_i64 - br_if 7 (;@4;) - local.get 2 - i32.const 4 - i32.store offset=56 - local.get 2 - local.get 12 - i64.store32 offset=52 - local.get 2 - local.get 5 - i32.store offset=48 - local.get 3 - br 1 (;@10;) - end - local.get 2 - i32.const 0 - i32.store offset=48 - i32.const 0 - end - local.set 5 - local.get 2 - i32.const 32 - i32.add - local.get 9 - local.get 4 - local.get 9 - local.get 4 - i32.gt_u - select - local.tee 4 - i32.const 4 - local.get 4 - i32.const 4 - i32.gt_u - select - i64.extend_i32_u - i64.const 12 - i64.mul - local.tee 12 - i32.wrap_i64 - local.get 12 - i64.const 32 - i64.shr_u - i64.eqz - i32.const 2 - i32.shl - local.get 2 - i32.const 48 - i32.add - call 15 - local.get 2 - i32.load offset=40 - local.set 4 - local.get 2 - i32.load offset=32 - i32.const 1 - i32.eq - br_if 1 (;@8;) - local.get 2 - local.get 2 - i32.load offset=36 - local.tee 5 - i32.store offset=16 - local.get 4 - i32.const 12 - i32.div_u - local.set 3 - end - local.get 5 - local.get 6 - i32.add - local.tee 4 - local.get 11 - i64.store align=4 - local.get 4 - i32.const -4 - i32.add - local.get 10 - i32.store - local.get 7 - i32.const -1 - i32.eq - br_if 4 (;@4;) - local.get 7 - i32.const 1 - i32.add - local.set 7 - local.get 6 - i32.const 12 - i32.add - local.set 6 - br 1 (;@7;) - end - end - local.get 2 - local.get 5 - i32.store offset=20 - local.get 2 - local.get 3 - i32.store offset=24 - br 1 (;@5;) - end - local.get 2 - local.get 3 - i32.store offset=20 - local.get 2 - local.get 3 - i32.store offset=24 - i32.const 0 - local.set 4 - end - local.get 4 - br_if 3 (;@1;) - end - unreachable - end - local.get 0 - i32.const 0 - i32.store - local.get 2 - local.get 3 - i32.store offset=20 - local.get 2 - local.get 7 - i32.store offset=24 - local.get 2 - i32.const 16 - i32.add - call 4 - end - local.get 2 - i32.const -64 - i32.sub - global.set 0 - return - end - unreachable) - (func (;12;) (type 0) (param i32 i32) - (local i32 i32 i32 i32) + i32.load8_u offset=9 + local.set 0 + local.get 1 + i32.load8_u offset=8 + local.set 2 + local.get 1 + i32.const 16 + i32.add + global.set 0 + i32.const 2 + i32.const 1 + i32.const 2 + local.get 0 + i32.const 1 + i32.eq + select + i32.const 0 + local.get 0 + select + local.get 2 + i32.const 1 + i32.and + select) + (func (;9;) (type 0) (param i32 i32) + (local i32) global.get 0 - i32.const 32 - i32.sub + i32.const -64 + i32.add local.tee 2 global.set 0 local.get 2 - i32.const 8 + i32.const 32 i32.add local.get 1 - call 10 - i32.const 1 - local.set 3 - block ;; label = @1 - local.get 2 - i32.load8_u offset=8 - i32.const 1 - i32.and - br_if 0 (;@1;) - local.get 2 - i32.load8_u offset=9 - local.tee 5 - i32.const 3 - i32.and - local.tee 4 - i32.const 3 - i32.ne - if ;; label = @2 - block ;; label = @3 - block ;; label = @4 - block ;; label = @5 - local.get 4 - i32.const 1 - i32.sub - br_table 1 (;@4;) 2 (;@3;) 0 (;@5;) - end - local.get 5 - i32.const 252 - i32.and - i32.const 2 - i32.shr_u - local.set 4 - i32.const 0 - local.set 3 - br 3 (;@1;) - end - local.get 2 - local.get 5 - i32.store8 offset=21 - local.get 2 - i32.const 1 - i32.store8 offset=20 - local.get 2 - local.get 1 - i32.store offset=16 - local.get 2 - i32.const 0 - i32.store16 offset=28 - local.get 2 - i32.const 16 - i32.add - local.get 2 - i32.const 28 - i32.add - i32.const 2 - call 74 - br_if 2 (;@1;) - local.get 2 - i32.load16_u offset=28 - local.tee 1 - i32.const 255 - i32.le_u - br_if 2 (;@1;) - local.get 1 - i32.const 2 - i32.shr_u - local.set 4 - i32.const 0 - local.set 3 - br 2 (;@1;) - end - local.get 2 - local.get 5 - i32.store8 offset=21 - local.get 2 - i32.const 1 - i32.store8 offset=20 - local.get 2 - local.get 1 - i32.store offset=16 - local.get 2 - i32.const 0 - i32.store offset=28 - local.get 2 - i32.const 16 - i32.add - local.get 2 - i32.const 28 - i32.add - i32.const 4 - call 74 - br_if 1 (;@1;) - local.get 2 - i32.load offset=28 - local.tee 1 - i32.const 65536 - i32.lt_u - local.set 3 - local.get 1 - i32.const 2 - i32.shr_u - local.set 4 - br 1 (;@1;) - end - local.get 5 - i32.const 3 - i32.gt_u - br_if 0 (;@1;) - i32.const 0 - local.set 3 - local.get 2 - i32.const 0 - i32.store offset=16 - block ;; label = @2 - local.get 1 - local.get 2 - i32.const 16 - i32.add - i32.const 4 - call 24 - i32.eqz - if ;; label = @3 - local.get 2 - i32.load offset=16 - local.set 4 - br 1 (;@2;) - end - i32.const 1 - local.set 3 - end - local.get 3 - local.get 4 - i32.const 1073741824 - i32.lt_u - i32.or - local.set 3 - end - local.get 0 - local.get 4 - i32.store offset=4 - local.get 0 - local.get 3 - i32.store + i32.const 24 + i32.add + i64.load + i64.store local.get 2 - i32.const 32 + i32.const 24 i32.add - global.set 0) - (func (;13;) (type 5) (param i32 i32) (result i32) - local.get 0 local.get 1 - call 36) - (func (;14;) (type 0) (param i32 i32) - (local i32 i32 i32) - global.get 0 - i32.const 32 - i32.sub - local.tee 2 - global.set 0 + i32.const 16 + i32.add + i64.load + i64.store local.get 2 + i32.const 16 + i32.add + local.get 1 i32.const 8 i32.add + i64.load + i64.store + local.get 2 + i64.const 0 + i64.store offset=40 + local.get 2 local.get 1 - call 12 - block ;; label = @1 - local.get 2 - i32.load offset=8 - if ;; label = @2 - local.get 0 - i32.const 0 - i32.store - br 1 (;@1;) - end - block ;; label = @2 - local.get 1 - i32.load offset=4 - local.get 2 - i32.load offset=12 - local.tee 3 - i32.lt_u - br_if 0 (;@2;) - local.get 2 - local.get 3 - i32.const 1 - call 35 - local.get 2 - local.get 3 - i32.store offset=24 - local.get 2 - local.get 2 - i32.load offset=4 - i32.store offset=20 - local.get 2 - local.get 2 - i32.load - local.tee 4 - i32.store offset=16 - local.get 1 - local.get 4 - local.get 3 - call 24 - if ;; label = @3 - local.get 2 - i32.const 16 - i32.add - call 26 - br 1 (;@2;) - end - local.get 4 - i32.eqz - br_if 0 (;@2;) - local.get 0 - local.get 2 - i64.load offset=20 align=4 - i64.store offset=4 align=4 - local.get 0 - local.get 4 - i32.store - br 1 (;@1;) - end - local.get 0 - i32.const 0 - i32.store - end + i64.load + i64.store offset=8 local.get 2 - i32.const 32 - i32.add - global.set 0) - (func (;15;) (type 3) (param i32 i32 i32 i32) - (local i32 i32) - global.get 0 - i32.const 16 - i32.sub - local.tee 4 - global.set 0 - block ;; label = @1 - block ;; label = @2 - local.get 2 - if ;; label = @3 - local.get 1 - i32.const 0 - i32.lt_s - br_if 1 (;@2;) - block (result i32) ;; label = @4 - local.get 3 - i32.load - local.tee 5 - i32.eqz - if ;; label = @5 - local.get 4 - local.get 1 - local.get 2 - call 33 - local.get 4 - i32.load - local.set 3 - local.get 4 - i32.load offset=4 - br 1 (;@4;) - end - local.get 3 - i32.load offset=4 - local.tee 3 - i32.eqz - if ;; label = @5 - local.get 4 - i32.const 8 - i32.add - local.get 1 - local.get 2 - i32.const 0 - call 34 - local.get 4 - i32.load offset=8 - local.set 3 - local.get 4 - i32.load offset=12 - br 1 (;@4;) - end - local.get 5 - local.get 3 - local.get 2 - local.get 1 - call 28 - local.set 3 - local.get 1 - end - local.set 5 - local.get 0 - block (result i32) ;; label = @4 - local.get 3 - i32.eqz - if ;; label = @5 - local.get 0 - local.get 1 - i32.store offset=4 - i32.const 1 - br 1 (;@4;) - end - local.get 0 - local.get 3 - i32.store offset=4 - local.get 5 - local.set 2 - i32.const 0 - end - i32.store - local.get 0 - i32.const 8 - i32.add - local.get 2 - i32.store - br 2 (;@1;) - end - local.get 0 - local.get 1 - i32.store offset=4 - local.get 0 - i32.const 1 - i32.store - local.get 0 - i32.const 8 - i32.add - i32.const 0 - i32.store - br 1 (;@1;) - end - local.get 0 - i32.const 1 - i32.store - local.get 0 - i32.const 8 - i32.add - i32.const 0 - i32.store - end - local.get 4 - i32.const 16 - i32.add - global.set 0) - (func (;16;) (type 2) (param i32) - (local i32) - global.get 0 - i32.const 16 - i32.sub - local.tee 1 - global.set 0 - local.get 1 - local.get 0 - i32.store offset=12 - local.get 1 - i32.const 12 - i32.add - i32.load - i32.load8_u - call 17 - unreachable) - (func (;17;) (type 2) (param i32) - (local i32) - global.get 0 - i32.const 32 - i32.sub - local.tee 1 - global.set 0 - local.get 1 - i32.const 24 - i32.add - i32.const 16384 - i32.store - local.get 1 - i32.const 65672 - i32.store offset=20 - local.get 1 - i32.const 0 - i32.store offset=16 - local.get 1 i32.const 8 i32.add - local.get 1 - i32.const 16 - i32.add - local.get 0 - call 18 - i32.const 0 - local.get 1 - i32.load offset=8 - local.get 1 - i32.load offset=12 - call 2 - unreachable) - (func (;18;) (type 1) (param i32 i32 i32) - (local i32 i32 i32 i64) - global.get 0 - i32.const 16 - i32.sub - local.tee 3 - global.set 0 - local.get 1 - i64.load offset=4 align=4 - local.set 6 - local.get 1 - i32.const 8 + call 6 + local.get 2 + i32.const 56 i32.add - local.tee 4 - i32.const 0 + i32.const 16384 i32.store - local.get 1 + local.get 2 i32.const 65572 - i32.store offset=4 - local.get 3 - i32.const 0 - i32.store offset=8 - local.get 3 - local.get 6 - i64.store - local.get 3 + i32.store offset=52 local.get 2 - i32.store8 offset=15 - local.get 3 - local.get 3 - i32.const 15 - i32.add - i32.const 1 - call 19 - local.get 4 i32.const 0 - i32.store - local.get 1 - i32.const 65572 - i32.store offset=4 - local.get 3 - i32.load offset=4 - local.tee 5 - local.get 3 - i32.load offset=8 - local.tee 2 - i32.lt_u - if ;; label = @1 - unreachable - end - local.get 3 - i32.load - local.set 4 - local.get 1 - local.get 5 + i32.store offset=48 local.get 2 - i32.sub - i32.store offset=8 - local.get 1 local.get 2 - local.get 4 + i32.const 48 i32.add - i32.store offset=4 local.get 0 + call 10 local.get 2 - i32.store offset=4 - local.get 0 - local.get 4 - i32.store - local.get 3 - i32.const 16 - i32.add - global.set 0) - (func (;19;) (type 1) (param i32 i32 i32) - (local i32 i32 i32) - global.get 0 - i32.const 16 - i32.sub - local.tee 3 - global.set 0 - block ;; label = @1 - block ;; label = @2 - local.get 0 - i32.load offset=8 - local.tee 4 - local.get 2 - i32.add - local.tee 5 - local.get 4 - i32.ge_u - if ;; label = @3 - local.get 3 - i32.const 8 - i32.add - local.get 4 - local.get 5 - local.get 0 - i32.load - local.get 0 - i32.load offset=4 - call 38 - local.get 3 - i32.load offset=12 - local.get 2 - i32.ne - br_if 1 (;@2;) - local.get 3 - i32.load offset=8 - local.get 1 - local.get 2 - call 81 - drop - local.get 0 - i32.load offset=8 - local.tee 1 - local.get 2 - i32.add - local.tee 2 - local.get 1 - i32.ge_u - br_if 2 (;@1;) - end - unreachable - end - unreachable - end - local.get 0 + i32.load local.get 2 - i32.store offset=8 - local.get 3 - i32.const 16 - i32.add + i32.load offset=4 + call 1 + local.get 2 + i32.const -64 + i32.sub global.set 0) - (func (;20;) (type 7) (result i32) - i32.const 0 - call 21 - i32.const 255 - i32.and - i32.const 2 - i32.shl - i32.const 65536 - i32.add - i32.load) - (func (;21;) (type 8) (param i32) (result i32) - (local i32 i32 i32 i32 i32 i32 i32 i32 i64) + (func (;10;) (type 1) (param i32 i32 i32) + (local i32 i32 i32) global.get 0 - i32.const 288 - i32.sub - local.tee 1 - global.set 0 - block ;; label = @1 - block ;; label = @2 - block ;; label = @3 - block ;; label = @4 - block ;; label = @5 - block ;; label = @6 - block ;; label = @7 - block ;; label = @8 - block ;; label = @9 - block ;; label = @10 - local.get 0 - if ;; label = @11 - local.get 1 - i32.const 16384 - i32.store offset=20 - local.get 1 - i32.const 65672 - i32.store offset=16 - local.get 1 - i32.const 16 - i32.add - call 25 - local.get 1 - local.get 1 - i64.load offset=16 - i64.store offset=32 - i32.const 1 - local.set 0 - local.get 1 - i32.const 32 - i32.add - call 9 - local.tee 9 - i32.wrap_i64 - local.tee 2 - i32.const 1 - i32.and - br_if 10 (;@1;) - local.get 9 - i64.const 1099511627775 - i64.and - local.tee 9 - i64.const 32 - i64.shr_u - i32.wrap_i64 - local.set 3 - local.get 9 - i64.const 24 - i64.shr_u - i32.wrap_i64 - local.set 4 - local.get 9 - i64.const 16 - i64.shr_u - i32.wrap_i64 - local.set 5 - block ;; label = @12 - block ;; label = @13 - block ;; label = @14 - block (result i32) ;; label = @15 - local.get 2 - i32.const 8 - i32.shr_u - i32.const 255 - i32.and - local.tee 2 - i32.const 67 - i32.ne - if ;; label = @16 - local.get 2 - i32.const 224 - i32.ne - if ;; label = @17 - local.get 2 - i32.const 153 - i32.ne - if ;; label = @18 - local.get 2 - i32.const 78 - i32.ne - local.get 3 - i32.const 129 - i32.ne - i32.or - local.get 5 - i32.const 255 - i32.and - i32.const 31 - i32.ne - local.get 4 - i32.const 255 - i32.and - i32.const 45 - i32.ne - i32.or - i32.or - br_if 17 (;@1;) - local.get 1 - i32.const 168 - i32.add - local.get 1 - i32.const 32 - i32.add - call 11 - local.get 1 - i32.load offset=168 - local.tee 2 - i32.eqz - br_if 17 (;@1;) - local.get 1 - local.get 1 - i64.load offset=172 align=4 - i64.store offset=52 align=4 - local.get 1 - local.get 2 - i32.store offset=48 - local.get 1 - i32.const 168 - i32.add - local.get 1 - i32.const 32 - i32.add - call 14 - local.get 1 - i32.load offset=168 - local.tee 2 - i32.eqz - br_if 8 (;@10;) - local.get 1 - local.get 1 - i64.load offset=172 align=4 - i64.store offset=92 align=4 - local.get 1 - local.get 2 - i32.store offset=88 - local.get 1 - i32.const 168 - i32.add - local.get 1 - i32.const 32 - i32.add - call 14 - local.get 1 - i32.load offset=168 - local.tee 2 - i32.eqz - br_if 9 (;@9;) - local.get 1 - local.get 1 - i64.load offset=172 align=4 - i64.store offset=132 align=4 - local.get 1 - local.get 2 - i32.store offset=128 - local.get 1 - i32.const 168 - i32.add - local.get 1 - i32.const 32 - i32.add - call 11 - local.get 1 - i32.load offset=168 - local.tee 2 - i32.eqz - br_if 4 (;@14;) - local.get 1 - i64.load offset=172 align=4 - local.set 9 - local.get 1 - i32.const 176 - i32.add - local.get 1 - i32.const 56 - i32.add - i32.load - i32.store - local.get 1 - i32.const 216 - i32.add - local.get 1 - i32.const 96 - i32.add - i32.load - i32.store - local.get 1 - i32.const 280 - i32.add - local.get 1 - i32.const 136 - i32.add - i32.load - i32.store - local.get 1 - local.get 1 - i64.load offset=48 - i64.store offset=168 - local.get 1 - local.get 1 - i64.load offset=88 - i64.store offset=208 - local.get 1 - local.get 1 - i64.load offset=128 - i64.store offset=272 - i32.const 0 - br 3 (;@15;) - end - local.get 3 - i32.const 55 - i32.ne - local.get 5 - i32.const 255 - i32.and - i32.const 160 - i32.ne - i32.or - local.get 4 - i32.const 255 - i32.and - i32.const 102 - i32.ne - i32.or - br_if 16 (;@1;) - local.get 1 - i32.const 168 - i32.add - local.get 1 - i32.const 32 - i32.add - call 11 - local.get 1 - i32.load offset=168 - local.tee 2 - i32.eqz - br_if 16 (;@1;) - local.get 1 - local.get 1 - i64.load offset=172 align=4 - i64.store offset=52 align=4 - local.get 1 - local.get 2 - i32.store offset=48 - local.get 1 - i32.const 168 - i32.add - local.get 1 - i32.const 32 - i32.add - call 14 - local.get 1 - i32.load offset=168 - local.tee 2 - i32.eqz - br_if 9 (;@8;) - local.get 1 - local.get 1 - i64.load offset=172 align=4 - i64.store offset=92 align=4 - local.get 1 - local.get 2 - i32.store offset=88 - local.get 1 - i32.const 168 - i32.add - local.get 1 - i32.const 32 - i32.add - call 14 - local.get 1 - i32.load offset=168 - local.tee 2 - i32.eqz - br_if 10 (;@7;) - local.get 1 - local.get 1 - i64.load offset=172 align=4 - i64.store offset=132 align=4 - local.get 1 - local.get 2 - i32.store offset=128 - local.get 1 - i32.const 168 - i32.add - local.get 1 - i32.const 32 - i32.add - call 11 - local.get 1 - i32.load offset=168 - local.tee 2 - i32.eqz - br_if 4 (;@13;) - local.get 1 - i64.load offset=172 align=4 - local.set 9 - local.get 1 - i32.const 176 - i32.add - local.get 1 - i32.const 56 - i32.add - i32.load - i32.store - local.get 1 - i32.const 216 - i32.add - local.get 1 - i32.const 96 - i32.add - i32.load - i32.store - local.get 1 - i32.const 280 - i32.add - local.get 1 - i32.const 136 - i32.add - i32.load - i32.store - local.get 1 - local.get 1 - i64.load offset=48 - i64.store offset=168 - local.get 1 - local.get 1 - i64.load offset=88 - i64.store offset=208 - local.get 1 - local.get 1 - i64.load offset=128 - i64.store offset=272 - i32.const 1 - br 2 (;@15;) - end - local.get 3 - i32.const 151 - i32.ne - local.get 5 - i32.const 255 - i32.and - i32.const 40 - i32.ne - i32.or - local.get 4 - i32.const 255 - i32.and - i32.const 36 - i32.ne - i32.or - br_if 15 (;@1;) - local.get 1 - i32.const 168 - i32.add - local.get 1 - i32.const 32 - i32.add - call 11 - local.get 1 - i32.load offset=168 - local.tee 2 - i32.eqz - br_if 15 (;@1;) - local.get 1 - local.get 1 - i64.load offset=172 align=4 - i64.store offset=52 align=4 - local.get 1 - local.get 2 - i32.store offset=48 - local.get 1 - i32.const 168 - i32.add - local.get 1 - i32.const 32 - i32.add - call 14 - local.get 1 - i32.load offset=168 - local.tee 2 - i32.eqz - br_if 10 (;@6;) - local.get 1 - local.get 1 - i64.load offset=172 align=4 - i64.store offset=92 align=4 - local.get 1 - local.get 2 - i32.store offset=88 - local.get 1 - i32.const 168 - i32.add - local.get 1 - i32.const 32 - i32.add - call 14 - local.get 1 - i32.load offset=168 - local.tee 2 - i32.eqz - br_if 11 (;@5;) - local.get 1 - local.get 1 - i64.load offset=172 align=4 - i64.store offset=132 align=4 - local.get 1 - local.get 2 - i32.store offset=128 - local.get 1 - i32.const 168 - i32.add - local.get 1 - i32.const 32 - i32.add - call 11 - local.get 1 - i32.load offset=168 - local.tee 2 - i32.eqz - br_if 4 (;@12;) - local.get 1 - i64.load offset=172 align=4 - local.set 9 - local.get 1 - i32.const 176 - i32.add - local.get 1 - i32.const 56 - i32.add - i32.load - i32.store - local.get 1 - i32.const 216 - i32.add - local.get 1 - i32.const 96 - i32.add - i32.load - i32.store - local.get 1 - i32.const 280 - i32.add - local.get 1 - i32.const 136 - i32.add - i32.load - i32.store - local.get 1 - local.get 1 - i64.load offset=48 - i64.store offset=168 - local.get 1 - local.get 1 - i64.load offset=88 - i64.store offset=208 - local.get 1 - local.get 1 - i64.load offset=128 - i64.store offset=272 - i32.const 2 - br 1 (;@15;) - end - local.get 3 - i32.const 6 - i32.ne - local.get 5 - i32.const 255 - i32.and - i32.const 153 - i32.ne - i32.or - local.get 4 - i32.const 255 - i32.and - i32.const 254 - i32.ne - i32.or - br_if 14 (;@1;) - local.get 1 - i32.const 168 - i32.add - local.get 1 - i32.const 32 - i32.add - call 11 - local.get 1 - i32.load offset=168 - local.tee 2 - i32.eqz - br_if 14 (;@1;) - local.get 1 - local.get 1 - i64.load offset=172 align=4 - i64.store offset=52 align=4 - local.get 1 - local.get 2 - i32.store offset=48 - local.get 1 - i32.const 168 - i32.add - local.get 1 - i32.const 32 - i32.add - call 14 - local.get 1 - i32.load offset=168 - local.tee 2 - i32.eqz - br_if 11 (;@4;) - local.get 1 - local.get 1 - i64.load offset=172 align=4 - i64.store offset=92 align=4 - local.get 1 - local.get 2 - i32.store offset=88 - local.get 1 - i32.const 168 - i32.add - local.get 1 - i32.const 32 - i32.add - call 14 - local.get 1 - i32.load offset=168 - local.tee 2 - i32.eqz - br_if 12 (;@3;) - local.get 1 - local.get 1 - i64.load offset=172 align=4 - i64.store offset=132 align=4 - local.get 1 - local.get 2 - i32.store offset=128 - local.get 1 - i32.const 168 - i32.add - local.get 1 - i32.const 32 - i32.add - call 11 - local.get 1 - i32.load offset=168 - local.tee 2 - i32.eqz - br_if 13 (;@2;) - local.get 1 - i64.load offset=172 align=4 - local.set 9 - local.get 1 - i32.const 176 - i32.add - local.get 1 - i32.const 56 - i32.add - i32.load - i32.store - local.get 1 - i32.const 216 - i32.add - local.get 1 - i32.const 96 - i32.add - i32.load - i32.store - local.get 1 - i32.const 280 - i32.add - local.get 1 - i32.const 136 - i32.add - i32.load - i32.store - local.get 1 - local.get 1 - i64.load offset=48 - i64.store offset=168 - local.get 1 - local.get 1 - i64.load offset=88 - i64.store offset=208 - local.get 1 - local.get 1 - i64.load offset=128 - i64.store offset=272 - i32.const 3 - end - local.set 3 - local.get 1 - i32.const 264 - i32.add - local.get 1 - i32.const 176 - i32.add - i32.load - i32.store - local.get 1 - i32.const 248 - i32.add - local.get 1 - i32.const 216 - i32.add - i32.load - i32.store - local.get 1 - i32.const 232 - i32.add - local.get 1 - i32.const 280 - i32.add - i32.load - i32.store - local.get 1 - local.get 1 - i64.load offset=168 - i64.store offset=256 - local.get 1 - local.get 1 - i64.load offset=208 - i64.store offset=240 - local.get 1 - local.get 1 - i64.load offset=272 - i64.store offset=224 - i32.const 0 - local.set 0 - br 13 (;@1;) - end - local.get 1 - i32.const 128 - i32.add - call 26 - local.get 1 - i32.const 88 - i32.add - call 26 - local.get 1 - i32.const 48 - i32.add - call 4 - br 12 (;@1;) - end - local.get 1 - i32.const 128 - i32.add - call 26 - local.get 1 - i32.const 88 - i32.add - call 26 - local.get 1 - i32.const 48 - i32.add - call 4 - br 11 (;@1;) - end - local.get 1 - i32.const 128 - i32.add - call 26 - local.get 1 - i32.const 88 - i32.add - call 26 - local.get 1 - i32.const 48 - i32.add - call 4 - br 10 (;@1;) - end - local.get 1 - i32.const 16384 - i32.store offset=132 - local.get 1 - i32.const 65672 - i32.store offset=128 - local.get 1 - i32.const 128 - i32.add - call 25 - local.get 1 - local.get 1 - i64.load offset=128 - i64.store offset=168 - local.get 1 - i32.const 168 - i32.add - call 9 - local.set 9 - local.get 1 - i32.const 288 - i32.add - global.set 0 - i32.const 8 - i32.const 6 - local.get 9 - i64.const 1099511627521 - i64.and - i64.const 970968230400 - i64.eq - select - return - end - local.get 1 - i32.const 48 - i32.add - call 4 - br 8 (;@1;) - end - local.get 1 - i32.const 88 - i32.add - call 26 - local.get 1 - i32.const 48 - i32.add - call 4 - br 7 (;@1;) - end - local.get 1 - i32.const 48 - i32.add - call 4 - br 6 (;@1;) - end - local.get 1 - i32.const 88 - i32.add - call 26 - local.get 1 - i32.const 48 - i32.add - call 4 - br 5 (;@1;) - end - local.get 1 - i32.const 48 - i32.add - call 4 - br 4 (;@1;) - end - local.get 1 - i32.const 88 - i32.add - call 26 - local.get 1 - i32.const 48 - i32.add - call 4 - br 3 (;@1;) - end - local.get 1 - i32.const 48 - i32.add - call 4 - br 2 (;@1;) - end - local.get 1 - i32.const 88 - i32.add - call 26 - local.get 1 - i32.const 48 - i32.add - call 4 - br 1 (;@1;) - end - local.get 1 - i32.const 128 - i32.add - call 26 - local.get 1 - i32.const 88 - i32.add - call 26 - local.get 1 - i32.const 48 - i32.add - call 4 - end - block ;; label = @1 - block ;; label = @2 - local.get 0 - i32.eqz - if ;; label = @3 - local.get 1 - i32.const 40 - i32.add - local.tee 0 - local.get 1 - i32.const 264 - i32.add - local.tee 4 - i32.load - i32.store - local.get 1 - i32.const 24 - i32.add - local.tee 5 - local.get 1 - i32.const 248 - i32.add - local.tee 6 - i32.load - i32.store - local.get 1 - i32.const 8 - i32.add - local.tee 7 - local.get 1 - i32.const 232 - i32.add - local.tee 8 - i32.load - i32.store - local.get 1 - local.get 1 - i64.load offset=256 - i64.store offset=32 - local.get 1 - local.get 1 - i64.load offset=240 - i64.store offset=16 - local.get 1 - local.get 1 - i64.load offset=224 - i64.store - block ;; label = @4 - block ;; label = @5 - local.get 3 - i32.const 1 - i32.sub - br_table 3 (;@2;) 1 (;@4;) 3 (;@2;) 0 (;@5;) - end - local.get 1 - i32.const 56 - i32.add - local.tee 3 - local.get 0 - i32.load - i32.store - local.get 1 - i32.const 68 - i32.add - local.get 5 - i32.load - i32.store - local.get 1 - i32.const 80 - i32.add - local.get 7 - i32.load - i32.store - local.get 1 - local.get 1 - i64.load offset=32 - i64.store offset=48 - local.get 1 - local.get 1 - i64.load offset=16 - i64.store offset=60 align=4 - local.get 1 - local.get 1 - i64.load - i64.store offset=72 - local.get 1 - i32.const 88 - i32.add - local.get 1 - i32.const 48 - i32.add - i32.const 36 - call 81 - drop - local.get 1 - i32.const 136 - i32.add - local.get 0 - i32.load - i32.store - local.get 1 - i32.const 148 - i32.add - local.get 1 - i32.const 108 - i32.add - i32.load - i32.store - local.get 1 - i32.const 160 - i32.add - local.get 1 - i32.const 120 - i32.add - i32.load - i32.store - local.get 1 - local.get 1 - i64.load offset=32 - i64.store offset=128 - local.get 1 - local.get 1 - i64.load offset=100 align=4 - i64.store offset=140 align=4 - local.get 1 - local.get 1 - i64.load offset=112 - i64.store offset=152 - local.get 1 - i32.const 168 - i32.add - local.get 1 - i32.const 128 - i32.add - i32.const 36 - call 81 - drop - local.get 8 - local.get 3 - i32.load - i32.store - local.get 1 - local.get 1 - i64.load offset=48 - i64.store offset=224 - local.get 6 - local.get 1 - i32.const 188 - i32.add - i32.load - i32.store - local.get 1 - local.get 1 - i64.load offset=180 align=4 - i64.store offset=240 - local.get 4 - local.get 1 - i32.const 200 - i32.add - i32.load - i32.store - local.get 1 - local.get 1 - i64.load offset=192 - i64.store offset=256 - local.get 1 - local.get 9 - i64.store offset=276 align=4 - local.get 1 - local.get 2 - i32.store offset=272 - local.get 1 - i32.const 208 - i32.add - i32.const 0 - local.get 1 - i32.const 224 - i32.add - local.get 1 - i32.const 240 - i32.add - local.get 1 - i32.const 256 - i32.add - local.get 1 - i32.const 272 - i32.add - call 27 - br 3 (;@1;) - end - br 1 (;@2;) - end - local.get 1 - i32.const 288 - i32.add - global.set 0 - i32.const 6 - return - end - local.get 1 - i32.const 56 - i32.add - local.tee 3 - local.get 0 - i32.load - i32.store - local.get 1 - i32.const 68 - i32.add - local.get 5 - i32.load - i32.store - local.get 1 - i32.const 80 - i32.add - local.get 7 - i32.load - i32.store - local.get 1 - local.get 1 - i64.load offset=32 - i64.store offset=48 - local.get 1 - local.get 1 - i64.load offset=16 - i64.store offset=60 align=4 - local.get 1 - local.get 1 - i64.load - i64.store offset=72 - local.get 1 - i32.const 88 - i32.add - local.get 1 - i32.const 48 - i32.add - i32.const 36 - call 81 - drop - local.get 1 - i32.const 136 - i32.add - local.get 0 - i32.load - i32.store - local.get 1 - i32.const 148 - i32.add - local.get 1 - i32.const 108 - i32.add - i32.load - i32.store - local.get 1 - i32.const 160 - i32.add - local.get 1 - i32.const 120 - i32.add - i32.load - i32.store - local.get 1 - local.get 1 - i64.load offset=32 - i64.store offset=128 - local.get 1 - local.get 1 - i64.load offset=100 align=4 - i64.store offset=140 align=4 - local.get 1 - local.get 1 - i64.load offset=112 - i64.store offset=152 - local.get 1 - i32.const 168 - i32.add - local.get 1 - i32.const 128 - i32.add - i32.const 36 - call 81 - drop - local.get 8 - local.get 3 - i32.load - i32.store - local.get 1 - local.get 1 - i64.load offset=48 - i64.store offset=224 - local.get 6 - local.get 1 - i32.const 188 - i32.add - i32.load - i32.store - local.get 1 - local.get 1 - i64.load offset=180 align=4 - i64.store offset=240 - local.get 4 - local.get 1 - i32.const 200 - i32.add - i32.load - i32.store - local.get 1 - local.get 1 - i64.load offset=192 - i64.store offset=256 - local.get 1 - local.get 9 - i64.store offset=276 align=4 - local.get 1 - local.get 2 - i32.store offset=272 - local.get 1 - i32.const 208 - i32.add - i32.const 1 - local.get 1 - i32.const 224 - i32.add - local.get 1 - i32.const 240 - i32.add - local.get 1 - i32.const 256 - i32.add - local.get 1 - i32.const 272 - i32.add - call 27 - end - local.get 1 - i32.load8_u offset=209 - local.set 0 - local.get 1 - i32.load8_u offset=208 - local.set 2 - local.get 1 - i32.const 208 - i32.add - call 7 - local.get 1 - local.get 2 - i32.eqz - local.get 0 - i32.const 0 - i32.ne - i32.and - i32.store8 offset=272 - local.get 1 - i32.const 272 - i32.add - call 16 - unreachable) - (func (;22;) (type 7) (result i32) - (local i32 i32 i64 i64) - global.get 0 - i32.const 32 - i32.sub - local.tee 0 - global.set 0 - local.get 0 - i32.const 16384 - i32.store offset=4 - local.get 0 - i32.const 65672 - i32.store - local.get 0 - i32.const 16384 - i32.store offset=16 - i32.const 65672 - local.get 0 - i32.const 16 - i32.add - call 0 - local.get 0 - local.get 0 - i32.load offset=16 - call 23 - local.get 0 - local.get 0 - i64.load - i64.store offset=8 - local.get 0 - i32.const 24 - i32.add - local.tee 1 - i64.const 0 - i64.store - local.get 0 - i64.const 0 - i64.store offset=16 - block (result i32) ;; label = @1 - i32.const 1 - local.get 0 - i32.const 8 - i32.add - local.get 0 - i32.const 16 - i32.add - i32.const 16 - call 24 - br_if 0 (;@1;) - drop - local.get 1 - i64.load - local.set 2 - local.get 0 - i64.load offset=16 - local.set 3 - i32.const 0 - end - local.get 2 - local.get 3 - i64.or - i64.eqz - i32.eqz - i32.or - i32.eqz - if ;; label = @1 - i32.const 1 - call 21 - local.get 0 - i32.const 32 - i32.add - global.set 0 - i32.const 255 - i32.and - i32.const 2 - i32.shl - i32.const 65536 - i32.add - i32.load - return - end - unreachable) - (func (;23;) (type 0) (param i32 i32) - (local i32 i32 i32) - global.get 0 - i32.const 16 - i32.sub - local.tee 2 - global.set 0 - local.get 0 - i32.load offset=4 - local.set 3 - local.get 0 - i32.const 0 - i32.store offset=4 - local.get 0 - i32.load - local.set 4 - local.get 0 - i32.const 65572 - i32.store - local.get 2 - i32.const 8 - i32.add - i32.const 0 - local.get 1 - local.get 4 - local.get 3 - call 38 - local.get 0 - local.get 2 - i64.load offset=8 - i64.store align=4 - local.get 2 - i32.const 16 - i32.add - global.set 0) - (func (;24;) (type 4) (param i32 i32 i32) (result i32) - block ;; label = @1 - local.get 0 - i32.load offset=4 - local.get 2 - i32.ge_u - if (result i32) ;; label = @2 - local.get 1 - local.get 0 - i32.load - local.get 2 - call 81 - drop - local.get 0 - i32.load offset=4 - local.tee 1 - local.get 2 - i32.lt_u - br_if 1 (;@1;) - local.get 0 - local.get 1 - local.get 2 - i32.sub - i32.store offset=4 - local.get 0 - local.get 0 - i32.load - local.get 2 - i32.add - i32.store - i32.const 0 - else - i32.const 1 - end - return - end - unreachable) - (func (;25;) (type 2) (param i32) - (local i32) - global.get 0 - i32.const 16 - i32.sub - local.tee 1 - global.set 0 - local.get 1 - local.get 0 - i32.load offset=4 - i32.store offset=12 - local.get 0 - i32.load - local.get 1 - i32.const 12 - i32.add - call 1 - local.get 0 - local.get 1 - i32.load offset=12 - call 23 - local.get 1 - i32.const 16 - i32.add - global.set 0) - (func (;26;) (type 2) (param i32) - (local i32) - local.get 0 - i32.load offset=4 - local.tee 1 - if ;; label = @1 - local.get 0 - i32.load - local.get 1 - call 8 - end) - (func (;27;) (type 10) (param i32 i32 i32 i32 i32 i32) - (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i64 i64 i64 i64) - global.get 0 - i32.const 464 - i32.sub - local.tee 6 - global.set 0 - block ;; label = @1 - local.get 1 - i32.const 15 - i32.and - if ;; label = @2 - local.get 0 - i32.const 1 - i32.store8 - local.get 0 - i32.const 12 - i32.add - i32.const 16 - i32.store - local.get 0 - i32.const 8 - i32.add - i32.const 65647 - i32.store - local.get 0 - i32.const 4 - i32.add - i32.const 1 - i32.store8 - local.get 5 - call 4 - local.get 4 - call 26 - local.get 3 - call 26 - local.get 2 - call 4 - br 1 (;@1;) - end - local.get 6 - i32.const 152 - i32.add - local.get 2 - i32.const 8 - i32.add - i32.load - i32.store - local.get 6 - local.get 2 - i64.load align=4 - i64.store offset=144 - local.get 6 - i32.const 168 - i32.add - local.get 3 - i32.const 8 - i32.add - i32.load - i32.store - local.get 6 - local.get 3 - i64.load align=4 - i64.store offset=160 - local.get 6 - i32.const 184 - i32.add - local.get 4 - i32.const 8 - i32.add - i32.load - i32.store - local.get 6 - local.get 4 - i64.load align=4 - i64.store offset=176 - local.get 6 - i32.const 200 - i32.add - local.get 5 - i32.const 8 - i32.add - i32.load - local.tee 1 - i32.store - local.get 6 - local.get 5 - i64.load align=4 - i64.store offset=192 - block ;; label = @2 - block ;; label = @3 - block ;; label = @4 - local.get 1 - i32.const 1 - i32.add - local.tee 3 - local.get 1 - i32.lt_u - local.tee 2 - br_if 0 (;@4;) - local.get 3 - local.get 6 - i32.load offset=152 - i32.ne - br_if 1 (;@3;) - local.get 2 - br_if 0 (;@4;) - local.get 6 - i32.load offset=144 - local.tee 2 - i32.load - local.set 7 - local.get 6 - i32.const 208 - i32.add - local.tee 4 - local.get 2 - i32.load offset=8 - local.tee 5 - call 41 - local.get 4 - i32.load - local.get 7 - local.get 5 - call 81 - drop - local.get 4 - local.get 5 - i32.store offset=8 - local.get 6 - i32.load offset=192 - local.set 4 - local.get 6 - i32.const 240 - i32.add - i64.const 1 - i64.store - local.get 6 - i32.const 236 - i32.add - local.get 2 - local.get 3 - i32.const 12 - i32.mul - i32.add - i32.store - local.get 6 - i32.const 0 - i32.store offset=248 - local.get 6 - local.get 2 - i32.store offset=232 - local.get 6 - local.get 4 - local.get 1 - i32.const 12 - i32.mul - i32.add - i32.store offset=228 - local.get 6 - local.get 4 - i32.store offset=224 - local.get 6 - i32.const 448 - i32.add - i32.const 4 - i32.or - local.set 1 - block ;; label = @5 - block ;; label = @6 - block ;; label = @7 - block ;; label = @8 - block ;; label = @9 - block ;; label = @10 - block ;; label = @11 - block ;; label = @12 - loop ;; label = @13 - local.get 6 - i32.const 136 - i32.add - local.get 6 - i32.const 224 - i32.add - call 43 - local.get 6 - i32.load offset=136 - local.tee 2 - i32.eqz - if ;; label = @14 - local.get 6 - i32.const 128 - i32.add - local.get 6 - i32.const 176 - i32.add - i32.const 0 - i32.const 48 - call 44 - local.get 6 - i32.load offset=132 - local.set 2 - local.get 6 - i32.load offset=128 - local.set 3 - local.get 6 - i32.const 120 - i32.add - local.get 6 - i32.const 176 - i32.add - i32.const 48 - i32.const 96 - call 44 - local.get 6 - i32.load offset=124 - local.set 4 - local.get 6 - i32.load offset=120 - local.set 5 - local.get 6 - i32.const 112 - i32.add - local.get 6 - i32.const 176 - i32.add - i32.const 96 - i32.const 97 - call 44 - local.get 6 - i32.load offset=116 - local.set 7 - local.get 6 - i32.load offset=112 - local.set 9 - local.get 6 - i32.const 104 - i32.add - local.get 6 - i32.const 176 - i32.add - i32.const 97 - i32.const 290 - call 44 - local.get 6 - i32.load offset=108 - local.set 10 - local.get 6 - i32.load offset=104 - local.set 11 - local.get 6 - i32.const 96 - i32.add - local.get 6 - i32.const 208 - i32.add - i32.const 0 - i32.const 48 - call 44 - local.get 6 - i32.load offset=100 - local.set 12 - local.get 6 - i32.load offset=96 - local.set 13 - local.get 6 - i32.const 88 - i32.add - local.get 6 - i32.const 208 - i32.add - i32.const 48 - i32.const 96 - call 44 - local.get 6 - i32.const 448 - i32.add - local.get 6 - i32.load offset=88 - local.get 6 - i32.load offset=92 - call 45 - local.get 6 - i32.const 408 - i32.add - local.tee 1 - local.get 6 - i32.const 460 - i32.add - local.tee 8 - i32.load - i32.store - local.get 6 - local.get 6 - i64.load offset=452 align=4 - i64.store offset=400 - local.get 6 - i32.load offset=448 - i32.const 1 - i32.eq - br_if 2 (;@12;) - local.get 6 - i32.const 360 - i32.add - local.get 1 - i32.load - local.tee 14 - i32.store - local.get 6 - local.get 6 - i64.load offset=400 - local.tee 27 - i64.store offset=352 - local.get 6 - i32.const 80 - i32.add - local.get 6 - i32.const 208 - i32.add - i32.const 96 - i32.const 97 - call 44 - local.get 6 - i32.load offset=84 - local.set 15 - local.get 6 - i32.load offset=80 - local.set 16 - local.get 6 - i32.const 72 - i32.add - local.get 6 - i32.const 160 - i32.add - i32.const 0 - i32.const 193 - call 44 - local.get 6 - i32.load offset=76 - local.set 17 - local.get 6 - i32.load offset=72 - local.set 18 - local.get 6 - i32.const -64 - i32.sub - local.get 6 - i32.const 176 - i32.add - i32.const 290 - i32.const 338 - call 44 - local.get 6 - i32.load offset=68 - local.set 19 - local.get 6 - i32.load offset=64 - local.set 20 - local.get 6 - i32.const 56 - i32.add - local.get 6 - i32.const 176 - i32.add - i32.const 338 - i32.const 386 - call 44 - local.get 6 - i32.const 448 - i32.add - local.get 6 - i32.load offset=56 - local.get 6 - i32.load offset=60 - call 45 - local.get 6 - i32.const 424 - i32.add - local.get 8 - i32.load - i32.store - local.get 6 - local.get 6 - i64.load offset=452 align=4 - i64.store offset=416 - local.get 6 - i32.load offset=448 - i32.const 1 - i32.eq - br_if 5 (;@9;) - local.get 6 - i32.const 376 - i32.add - local.get 6 - i32.const 424 - i32.add - i32.load - local.tee 8 - i32.store - local.get 6 - local.get 6 - i64.load offset=416 - local.tee 28 - i64.store offset=368 - local.get 6 - i32.const 48 - i32.add - local.get 6 - i32.const 176 - i32.add - i32.const 386 - i32.const 387 - call 44 - local.get 6 - i32.load offset=52 - local.set 21 - local.get 6 - i32.load offset=48 - local.set 22 - local.get 6 - i32.const 40 - i32.add - local.get 6 - i32.const 160 - i32.add - i32.const 193 - i32.const 386 - call 44 - local.get 6 - i32.load offset=44 - local.set 23 - local.get 6 - i32.load offset=40 - local.set 24 - local.get 6 - i32.const 32 - i32.add - local.get 6 - i32.const 160 - i32.add - i32.const 386 - i32.const 434 - call 44 - local.get 6 - i32.load offset=36 - local.set 25 - local.get 6 - i32.load offset=32 - local.set 26 - local.get 6 - i32.const 24 - i32.add - local.get 6 - i32.const 160 - i32.add - i32.const 434 - i32.const 482 - call 44 - local.get 6 - i32.const 448 - i32.add - local.get 6 - i32.load offset=24 - local.get 6 - i32.load offset=28 - call 45 - local.get 6 - i32.const 440 - i32.add - local.tee 1 - local.get 6 - i32.const 460 - i32.add - i32.load - i32.store - local.get 6 - local.get 6 - i64.load offset=452 align=4 - i64.store offset=432 - local.get 6 - i32.load offset=448 - i32.const 1 - i32.eq - br_if 3 (;@11;) - local.get 6 - i32.const 392 - i32.add - local.get 1 - i32.load - local.tee 1 - i32.store - local.get 6 - local.get 6 - i64.load offset=432 - local.tee 29 - i64.store offset=384 - local.get 6 - i32.const 16 - i32.add - local.get 6 - i32.const 160 - i32.add - i32.const 482 - i32.const 483 - call 44 - local.get 6 - i64.load offset=16 - local.set 30 - local.get 6 - i32.const 8 - i32.add - local.get 6 - i32.const 160 - i32.add - i32.const 483 - i32.const 676 - call 44 - local.get 6 - i32.const 336 - i32.add - local.get 30 - i64.store - local.get 6 - i32.const 332 - i32.add - local.get 1 - i32.store - local.get 6 - i32.const 328 - i32.add - local.get 29 - i64.store32 - local.get 6 - i32.const 324 - i32.add - local.get 25 - i32.store - local.get 6 - i32.const 316 - i32.add - local.get 23 - i32.store - local.get 6 - i32.const 312 - i32.add - local.get 24 - i32.store - local.get 6 - i32.const 308 - i32.add - local.get 21 - i32.store - local.get 6 - i32.const 304 - i32.add - local.get 22 - i32.store - local.get 6 - i32.const 300 - i32.add - local.get 8 - i32.store - local.get 6 - i32.const 296 - i32.add - local.get 28 - i64.store32 - local.get 6 - i32.const 292 - i32.add - local.get 19 - i32.store - local.get 6 - i32.const 284 - i32.add - local.get 17 - i32.store - local.get 6 - i32.const 280 - i32.add - local.get 18 - i32.store - local.get 6 - i32.const 276 - i32.add - local.get 15 - i32.store - local.get 6 - i32.const 272 - i32.add - local.get 16 - i32.store - local.get 6 - i32.const 268 - i32.add - local.get 14 - i32.store - local.get 6 - i32.const 264 - i32.add - local.get 27 - i64.store32 - local.get 6 - i32.const 260 - i32.add - local.get 12 - i32.store - local.get 6 - i32.const 252 - i32.add - local.get 10 - i32.store - local.get 6 - i32.const 244 - i32.add - local.get 7 - i32.store - local.get 6 - i32.const 236 - i32.add - local.get 4 - i32.store - local.get 6 - i32.const 344 - i32.add - local.get 6 - i64.load offset=8 - i64.store - local.get 6 - local.get 26 - i32.store offset=320 - local.get 6 - local.get 20 - i32.store offset=288 - local.get 6 - local.get 13 - i32.store offset=256 - local.get 6 - local.get 11 - i32.store offset=248 - local.get 6 - local.get 9 - i32.store offset=240 - local.get 6 - local.get 5 - i32.store offset=232 - local.get 6 - local.get 2 - i32.store offset=228 - local.get 6 - local.get 3 - i32.store offset=224 - local.get 6 - i32.const 400 - i32.add - i32.const 1160 - call 41 - i32.const 128 - local.set 3 - local.get 6 - i32.const 224 - i32.add - local.set 2 - loop ;; label = @15 - local.get 3 - i32.eqz - br_if 5 (;@10;) - local.get 6 - i32.const 400 - i32.add - local.get 2 - i32.load - local.get 2 - i32.load offset=4 - call 31 - local.get 6 - i32.const 400 - i32.add - local.get 2 - i32.load offset=8 - local.get 2 - i32.load offset=12 - call 31 - local.get 6 - i32.const 400 - i32.add - local.get 2 - i32.load offset=16 - local.get 2 - i32.load offset=20 - call 31 - local.get 6 - i32.const 400 - i32.add - local.get 2 - i32.load offset=24 - local.get 2 - i32.load offset=28 - call 31 - local.get 3 - i32.const -32 - i32.add - local.set 3 - local.get 2 - i32.const 32 - i32.add - local.set 2 - br 0 (;@15;) - end - unreachable - end - local.get 6 - i32.load offset=140 - local.set 3 - local.get 6 - i32.const 384 - i32.add - i32.const 129 - call 41 - local.get 6 - i32.const 384 - i32.add - local.get 3 - i32.load - local.get 3 - i32.load offset=8 - call 31 - local.get 6 - i32.const 384 - i32.add - local.get 2 - i32.load - local.get 2 - i32.load offset=8 - call 31 - local.get 6 - i32.const 448 - i32.add - i32.const 16777217 - local.get 6 - i32.load offset=384 - local.get 6 - i32.load offset=392 - call 50 - local.get 6 - i32.const 440 - i32.add - local.tee 2 - local.get 1 - i32.const 8 - i32.add - local.tee 3 - i32.load - i32.store - local.get 6 - local.get 1 - i64.load align=4 - i64.store offset=432 - local.get 6 - i32.load offset=448 - i32.const 1 - i32.eq - br_if 6 (;@7;) - local.get 6 - i32.const 408 - i32.add - local.tee 4 - local.get 2 - i32.load - i32.store - local.get 6 - local.get 6 - i64.load offset=432 - i64.store offset=400 - local.get 6 - i32.const 416 - i32.add - i32.const 194 - call 41 - local.get 6 - i32.const 416 - i32.add - local.get 6 - i32.load offset=208 - local.get 6 - i32.load offset=216 - call 31 - local.get 6 - i32.const 416 - i32.add - local.get 6 - i32.load offset=400 - local.get 4 - i32.load - call 31 - local.get 6 - i32.const 448 - i32.add - i32.const 16777216 - local.get 6 - i32.load offset=416 - local.get 6 - i32.load offset=424 - call 50 - local.get 2 - local.get 3 - i32.load - i32.store - local.get 6 - local.get 1 - i64.load align=4 - i64.store offset=432 - local.get 6 - i32.load offset=448 - i32.const 1 - i32.ne - if ;; label = @14 - local.get 6 - i32.const 208 - i32.add - call 26 - local.get 6 - i32.const 216 - i32.add - local.get 2 - i32.load - i32.store - local.get 6 - local.get 6 - i64.load offset=432 - i64.store offset=208 - local.get 6 - i32.const 416 - i32.add - call 26 - local.get 6 - i32.const 400 - i32.add - call 26 - local.get 6 - i32.const 384 - i32.add - call 26 - br 1 (;@13;) - end - end - local.get 0 - i32.const 1 - i32.store8 - local.get 0 - i32.const 4 - i32.add - local.get 6 - i64.load offset=432 - i64.store align=4 - local.get 0 - i32.const 12 - i32.add - local.get 6 - i32.const 440 - i32.add - i32.load - i32.store - local.get 6 - i32.const 416 - i32.add - call 26 - local.get 6 - i32.const 400 - i32.add - call 26 - br 6 (;@6;) - end - local.get 0 - i32.const 1 - i32.store8 - local.get 0 - i32.const 4 - i32.add - local.get 6 - i64.load offset=400 - i64.store align=4 - local.get 0 - i32.const 12 - i32.add - local.get 1 - i32.load - i32.store - br 6 (;@5;) - end - local.get 0 - i32.const 1 - i32.store8 - local.get 0 - i32.const 4 - i32.add - local.get 6 - i64.load offset=432 - i64.store align=4 - local.get 0 - i32.const 12 - i32.add - local.get 1 - i32.load - i32.store - local.get 6 - i32.const 368 - i32.add - call 26 - br 2 (;@8;) - end - local.get 6 - i32.const 448 - i32.add - i32.const 16777218 - local.get 6 - i32.load offset=400 - local.get 6 - i32.load offset=408 - call 50 - local.get 6 - i32.const 440 - i32.add - local.tee 1 - local.get 6 - i32.const 460 - i32.add - i32.load - i32.store - local.get 6 - local.get 6 - i64.load offset=452 align=4 - i64.store offset=432 - local.get 6 - i32.load offset=448 - i32.const 1 - i32.ne - if ;; label = @10 - local.get 6 - i32.const 424 - i32.add - local.get 1 - i32.load - local.tee 1 - i32.store - local.get 6 - local.get 6 - i64.load offset=432 - i64.store offset=416 - local.get 1 - i32.eqz - br_if 6 (;@4;) - local.get 0 - i32.const 0 - i32.store8 - local.get 0 - local.get 6 - i32.load offset=416 - i32.load8_u - i32.eqz - i32.store8 offset=1 - local.get 6 - i32.const 400 - i32.add - call 26 - local.get 6 - i32.const 384 - i32.add - call 26 - local.get 6 - i32.const 368 - i32.add - call 26 - local.get 6 - i32.const 352 - i32.add - call 26 - local.get 6 - i32.const 208 - i32.add - call 26 - local.get 6 - i32.const 416 - i32.add - call 26 - local.get 6 - i32.const 192 - i32.add - call 4 - local.get 6 - i32.const 176 - i32.add - call 26 - local.get 6 - i32.const 160 - i32.add - call 26 - local.get 6 - i32.const 144 - i32.add - call 4 - br 9 (;@1;) - end - local.get 0 - i32.const 1 - i32.store8 - local.get 0 - i32.const 4 - i32.add - local.get 6 - i64.load offset=432 - i64.store align=4 - local.get 0 - i32.const 12 - i32.add - local.get 1 - i32.load - i32.store - local.get 6 - i32.const 400 - i32.add - call 26 - local.get 6 - i32.const 384 - i32.add - call 26 - local.get 6 - i32.const 368 - i32.add - call 26 - local.get 6 - i32.const 352 - i32.add - call 26 - local.get 6 - i32.const 208 - i32.add - call 26 - br 7 (;@2;) - end - local.get 0 - i32.const 1 - i32.store8 - local.get 0 - i32.const 4 - i32.add - local.get 6 - i64.load offset=416 - i64.store align=4 - local.get 0 - i32.const 12 - i32.add - local.get 6 - i32.const 424 - i32.add - i32.load - i32.store - end - local.get 6 - i32.const 352 - i32.add - call 26 - br 2 (;@5;) - end - local.get 0 - i32.const 1 - i32.store8 - local.get 0 - i32.const 4 - i32.add - local.get 6 - i64.load offset=432 - i64.store align=4 - local.get 0 - i32.const 12 - i32.add - local.get 6 - i32.const 440 - i32.add - i32.load - i32.store - end - local.get 6 - i32.const 384 - i32.add - call 26 - end - local.get 6 - i32.const 208 - i32.add - call 26 - br 2 (;@2;) - end - unreachable - end - local.get 0 - i32.const 1 - i32.store8 - local.get 0 - i32.const 12 - i32.add - i32.const 27 - i32.store - local.get 0 - i32.const 8 - i32.add - i32.const 65572 - i32.store - local.get 0 - i32.const 4 - i32.add - i32.const 1 - i32.store8 - end - local.get 6 - i32.const 192 - i32.add - call 4 - local.get 6 - i32.const 176 - i32.add - call 26 - local.get 6 - i32.const 160 - i32.add - call 26 - local.get 6 - i32.const 144 - i32.add - call 4 - end - local.get 6 - i32.const 464 - i32.add - global.set 0) - (func (;28;) (type 6) (param i32 i32 i32 i32) (result i32) - local.get 0 - local.get 1 - local.get 2 - local.get 3 - call 29) - (func (;29;) (type 6) (param i32 i32 i32 i32) (result i32) - local.get 3 - local.get 2 - call 36 - local.tee 2 - if ;; label = @1 - local.get 2 - local.get 0 - local.get 3 - local.get 1 - local.get 1 - local.get 3 - i32.gt_u - select - call 81 - drop - local.get 0 - local.get 1 - call 37 - end - local.get 2) - (func (;30;) (type 5) (param i32 i32) (result i32) - local.get 0 - local.get 1 - call 36 - local.tee 1 - if ;; label = @1 - local.get 1 - local.get 0 - call 80 - end - local.get 1) - (func (;31;) (type 1) (param i32 i32 i32) - local.get 0 - local.get 2 - call 32 - local.get 0 - i32.load - local.get 0 - i32.load offset=8 - i32.add - local.get 1 - local.get 2 - call 81 - drop - local.get 0 - i32.load offset=8 - local.tee 1 - local.get 2 - i32.add - local.tee 2 - local.get 1 - i32.lt_u - if ;; label = @1 - unreachable - end - local.get 0 - local.get 2 - i32.store offset=8) - (func (;32;) (type 0) (param i32 i32) - (local i32 i32 i32) - global.get 0 - i32.const 32 - i32.sub - local.tee 2 - global.set 0 - block ;; label = @1 - block ;; label = @2 - local.get 0 - i32.load offset=4 - local.tee 3 - local.get 0 - i32.load offset=8 - local.tee 4 - i32.sub - local.get 1 - i32.lt_u - if ;; label = @3 - local.get 1 - local.get 4 - i32.add - local.tee 1 - local.get 4 - i32.lt_u - br_if 2 (;@1;) - local.get 3 - local.get 3 - i32.add - local.tee 4 - local.get 3 - i32.lt_u - br_if 2 (;@1;) - local.get 4 - local.get 1 - local.get 4 - local.get 1 - i32.gt_u - select - local.tee 1 - i32.const 8 - local.get 1 - i32.const 8 - i32.gt_u - select - local.set 1 - block ;; label = @4 - local.get 3 - if ;; label = @5 - local.get 2 - i32.const 24 - i32.add - i32.const 1 - i32.store - local.get 2 - local.get 3 - i32.store offset=20 - local.get 2 - local.get 0 - i32.load - i32.store offset=16 - br 1 (;@4;) - end - local.get 2 - i32.const 0 - i32.store offset=16 - end - local.get 2 - local.get 1 - i32.const 1 - local.get 2 - i32.const 16 - i32.add - call 15 - local.get 2 - i32.const 8 - i32.add - i32.load - local.set 1 - local.get 2 - i32.load - i32.const 1 - i32.eq - br_if 1 (;@2;) - local.get 2 - i32.load offset=4 - local.set 3 - local.get 0 - local.get 1 - i32.store offset=4 - local.get 0 - local.get 3 - i32.store - end - local.get 2 - i32.const 32 - i32.add - global.set 0 - return - end - local.get 1 - i32.eqz - br_if 0 (;@1;) - unreachable - end - unreachable) - (func (;33;) (type 1) (param i32 i32 i32) - (local i32) - global.get 0 - i32.const 16 - i32.sub - local.tee 3 - global.set 0 - local.get 3 - i32.const 8 - i32.add - local.get 1 - local.get 2 - i32.const 0 - call 34 - local.get 0 - local.get 3 - i32.load offset=8 - i32.store - local.get 0 - local.get 3 - i32.load offset=12 - i32.store offset=4 - local.get 3 - i32.const 16 - i32.add - global.set 0) - (func (;34;) (type 3) (param i32 i32 i32 i32) - block ;; label = @1 - local.get 1 - i32.eqz - br_if 0 (;@1;) - local.get 3 - i32.eqz - if ;; label = @2 - local.get 1 - local.get 2 - call 13 - local.set 2 - br 1 (;@1;) - end - local.get 1 - local.get 2 - call 30 - local.set 2 - end - local.get 0 - local.get 1 - i32.store offset=4 - local.get 0 - local.get 2 - i32.store) - (func (;35;) (type 1) (param i32 i32 i32) - (local i32) - global.get 0 - i32.const 16 - i32.sub - local.tee 3 - global.set 0 - block ;; label = @1 - local.get 1 - i32.const -1 - i32.gt_s - if ;; label = @2 - block (result i32) ;; label = @3 - local.get 2 - if ;; label = @4 - local.get 3 - local.get 1 - i32.const 1 - i32.const 1 - call 34 - local.get 3 - i32.load offset=4 - local.set 2 - local.get 3 - i32.load - br 1 (;@3;) - end - local.get 3 - i32.const 8 - i32.add - local.get 1 - i32.const 1 - call 33 - local.get 3 - i32.load offset=12 - local.set 2 - local.get 3 - i32.load offset=8 - end - local.tee 1 - i32.eqz - br_if 1 (;@1;) - local.get 0 - local.get 2 - i32.store offset=4 - local.get 0 - local.get 1 - i32.store - local.get 3 - i32.const 16 - i32.add - global.set 0 - return - end - unreachable - end - unreachable) - (func (;36;) (type 5) (param i32 i32) (result i32) - (local i32 i32) - global.get 0 - i32.const 16 - i32.sub - local.tee 2 - global.set 0 - local.get 0 - call 76 - local.set 0 - local.get 2 - i32.const 65668 - i32.load - i32.store offset=12 - block ;; label = @1 - local.get 0 - local.get 1 - local.get 2 - i32.const 12 - i32.add - call 78 - local.tee 3 - br_if 0 (;@1;) - local.get 2 - local.get 0 - local.get 1 - call 77 - i32.const 0 - local.set 3 - local.get 2 - i32.load - br_if 0 (;@1;) - local.get 2 - i32.load offset=4 - local.tee 3 - local.get 2 - i32.load offset=12 - i32.store offset=8 - local.get 2 - local.get 3 - i32.store offset=12 - local.get 0 - local.get 1 - local.get 2 - i32.const 12 - i32.add - call 78 - local.set 3 - end - i32.const 65668 - local.get 2 - i32.load offset=12 - i32.store - local.get 2 - i32.const 16 - i32.add - global.set 0 - local.get 3) - (func (;37;) (type 0) (param i32 i32) - (local i32 i32 i32) - local.get 0 - if ;; label = @1 - local.get 1 - call 76 - drop - i32.const 65668 - i32.load - local.set 3 - local.get 0 - i32.const -8 - i32.add - local.tee 1 - local.get 1 - i32.load - local.tee 4 - i32.const -2 - i32.and - i32.store - block ;; label = @2 - block ;; label = @3 - local.get 4 - i32.const -4 - i32.and - local.tee 2 - local.get 0 - i32.sub - local.get 2 - i32.le_u - if ;; label = @4 - local.get 0 - i32.const 0 - i32.store - block ;; label = @5 - local.get 0 - i32.const -4 - i32.add - i32.load - i32.const -4 - i32.and - local.tee 2 - if ;; label = @6 - local.get 2 - i32.load8_u - i32.const 1 - i32.and - i32.eqz - br_if 1 (;@5;) - end - local.get 4 - i32.const -4 - i32.and - local.tee 2 - i32.eqz - br_if 2 (;@3;) - i32.const 0 - local.get 2 - local.get 4 - i32.const 2 - i32.and - select - local.tee 2 - i32.eqz - br_if 2 (;@3;) - local.get 2 - i32.load8_u - i32.const 1 - i32.and - br_if 2 (;@3;) - local.get 0 - local.get 2 - i32.load offset=8 - i32.const -4 - i32.and - i32.store - local.get 2 - local.get 1 - i32.const 1 - i32.or - i32.store offset=8 - br 3 (;@2;) - end - local.get 1 - call 79 - local.get 2 - i32.load - local.set 0 - local.get 1 - i32.load8_u - i32.const 2 - i32.and - if ;; label = @5 - local.get 2 - local.get 0 - i32.const 2 - i32.or - local.tee 0 - i32.store - end - local.get 0 - i32.const -4 - i32.and - local.tee 0 - local.get 2 - i32.sub - i32.const -8 - i32.add - local.get 0 - i32.le_u - br_if 2 (;@2;) - end - unreachable - end - local.get 0 - local.get 3 - i32.store - local.get 1 - local.set 3 - end - i32.const 65668 - local.get 3 - i32.store - end) - (func (;38;) (type 9) (param i32 i32 i32 i32 i32) - block ;; label = @1 - local.get 1 - local.get 2 - i32.le_u - if ;; label = @2 - local.get 4 - local.get 2 - i32.ge_u - if ;; label = @3 - local.get 2 - local.get 1 - i32.sub - local.tee 4 - local.get 2 - i32.gt_u - br_if 2 (;@1;) - local.get 0 - local.get 4 - i32.store offset=4 - local.get 0 - local.get 1 - local.get 3 - i32.add - i32.store - return - end - unreachable - end - unreachable - end - unreachable) - (func (;39;) (type 0) (param i32 i32) - (local i32) - block ;; label = @1 - local.get 0 - i32.load offset=8 - local.tee 2 - local.get 0 - i32.load offset=4 - i32.ge_u - br_if 0 (;@1;) - local.get 0 - i32.load - local.get 2 - i32.add - local.get 1 - i32.store8 - local.get 0 - i32.load offset=8 - local.tee 1 - i32.const 1 - i32.add - local.tee 2 - local.get 1 - i32.lt_u - br_if 0 (;@1;) - local.get 0 - local.get 2 - i32.store offset=8 - return - end - unreachable) - (func (;40;) (type 0) (param i32 i32) - (local i32) - global.get 0 - i32.const 16 - i32.sub - local.tee 2 - global.set 0 - local.get 2 - local.get 0 - i32.store offset=12 - local.get 1 - local.get 2 - i32.const 12 - i32.add - i32.const 4 - call 19 - local.get 2 - i32.const 16 - i32.add - global.set 0) - (func (;41;) (type 0) (param i32 i32) - (local i32 i64) - global.get 0 - i32.const 16 - i32.sub - local.tee 2 - global.set 0 - local.get 2 - i32.const 8 - i32.add - local.get 1 - i32.const 0 - call 35 - local.get 2 - i64.load offset=8 - local.set 3 - local.get 0 - i32.const 0 - i32.store offset=8 - local.get 0 - local.get 3 - i64.store align=4 - local.get 2 - i32.const 16 - i32.add - global.set 0) - (func (;42;) (type 0) (param i32 i32) - (local i32 i64) - local.get 1 - i32.load offset=4 - local.tee 2 - if ;; label = @1 - local.get 2 - i64.extend_i32_u - i64.const 12 - i64.mul - local.tee 3 - i64.const 32 - i64.shr_u - i64.eqz - if ;; label = @2 - local.get 0 - local.get 3 - i64.store32 offset=4 - local.get 0 - i32.const 8 - i32.add - i32.const 4 - i32.store - local.get 0 - local.get 1 - i32.load - i32.store - return - end - unreachable - end - local.get 0 - i32.const 0 - i32.store) - (func (;43;) (type 0) (param i32 i32) - (local i32 i32 i32 i32 i32) - block ;; label = @1 - local.get 1 - i32.load - local.tee 4 - local.get 1 - i32.load offset=4 - i32.eq - br_if 0 (;@1;) - local.get 1 - local.get 4 - i32.const 12 - i32.add - i32.store - block ;; label = @2 - local.get 1 - i32.const 16 - i32.add - i32.load - local.tee 5 - if ;; label = @3 - local.get 1 - i32.const 0 - i32.store offset=16 - local.get 1 - local.get 1 - i32.load offset=8 - local.tee 6 - local.get 5 - i32.const 12 - i32.mul - i32.add - local.tee 3 - i32.const 12 - i32.add - local.get 1 - i32.const 12 - i32.add - i32.load - local.tee 1 - local.get 1 - local.get 6 - i32.sub - i32.const 12 - i32.div_u - local.get 5 - i32.gt_u - local.tee 1 - select - i32.store offset=8 - local.get 1 - br_if 1 (;@2;) - br 2 (;@1;) - end - local.get 1 - i32.load offset=8 - local.tee 3 - local.get 1 - i32.const 12 - i32.add - i32.load - i32.eq - br_if 1 (;@1;) - local.get 1 - local.get 3 - i32.const 12 - i32.add - i32.store offset=8 - end - local.get 4 - local.set 2 - end - local.get 0 - local.get 3 - i32.store offset=4 - local.get 0 - local.get 2 - i32.store) - (func (;44;) (type 3) (param i32 i32 i32 i32) - (local i32) - local.get 2 - local.get 3 - i32.le_u - if ;; label = @1 - block ;; label = @2 - local.get 1 - i32.load offset=8 - local.get 3 - i32.ge_u - if ;; label = @3 - local.get 3 - local.get 2 - i32.sub - local.tee 4 - local.get 3 - i32.le_u - br_if 1 (;@2;) - unreachable - end - unreachable - end - local.get 1 - i32.load - local.set 1 - local.get 0 - local.get 4 - i32.store offset=4 - local.get 0 - local.get 1 - local.get 2 - i32.add - i32.store - return - end - unreachable) - (func (;45;) (type 1) (param i32 i32 i32) - (local i32 i32 i32) - global.get 0 - i32.const -64 - i32.add - local.tee 3 - global.set 0 - local.get 3 - i32.const 48 - i32.add - local.get 1 - local.get 2 - call 46 - local.get 3 - i32.const 32 - i32.add - local.get 3 - i32.const 48 - i32.add - call 47 - local.get 3 - i32.const 16 - i32.add - local.get 3 - i32.const 32 - i32.add - call 48 - local.get 3 - i32.const 32 - i32.add - call 49 - local.get 3 - i32.const 48 - i32.add - local.get 2 - call 41 - local.get 3 - i32.const 8 - i32.add - local.set 1 - local.get 3 - i32.const 48 - i32.add - local.tee 4 - i32.load offset=8 - local.get 3 - i32.load offset=24 - local.tee 2 - local.tee 5 - i32.lt_u - if ;; label = @1 - unreachable - end - local.get 1 - local.get 5 - i32.store offset=4 - local.get 1 - local.get 4 - i32.load - i32.store - local.get 3 - i32.load offset=12 - local.get 2 - i32.ne - if ;; label = @1 - unreachable - end - local.get 3 - i32.load offset=8 - local.get 3 - i32.load offset=16 - local.get 2 - call 81 - drop - local.get 0 - i32.const 0 - i32.store - local.get 0 - i32.const 12 - i32.add - local.get 3 - i32.const 56 - i32.add - i32.load - i32.store - local.get 0 - local.get 3 - i64.load offset=48 - i64.store offset=4 align=4 - local.get 3 - i32.const 16 - i32.add - call 26 - local.get 3 - i32.const -64 - i32.sub - global.set 0) - (func (;46;) (type 1) (param i32 i32 i32) - (local i32 i32 i32 i32) - global.get 0 - i32.const 80 - i32.sub - local.tee 3 - global.set 0 - block ;; label = @1 - block ;; label = @2 - local.get 2 - if ;; label = @3 - local.get 3 - i32.const 8 - i32.store8 offset=31 - local.get 3 - i32.const 0 - i32.store offset=40 - local.get 3 - i64.const 4 - i64.store offset=32 - local.get 3 - i32.const 48 - i32.add - local.get 2 - i32.const 4 - call 51 - block ;; label = @4 - local.get 3 - i32.load offset=52 - i32.const 1 - i32.ne - if ;; label = @5 - local.get 3 - i32.const 4 - i32.store offset=56 - local.get 3 - local.get 2 - i32.store offset=52 - local.get 3 - local.get 1 - i32.store offset=48 - local.get 3 - local.get 3 - i32.const 31 - i32.add - i32.store offset=60 - i32.const 4 - local.set 1 - loop ;; label = @6 - local.get 3 - i32.const 16 - i32.add - local.get 3 - i32.const 48 - i32.add - call 52 - local.get 3 - i32.load offset=16 - local.tee 2 - i32.eqz - br_if 2 (;@4;) - local.get 3 - i32.load offset=60 - i32.load8_u - local.get 2 - local.get 3 - i32.load offset=20 - call 53 - local.set 2 - local.get 3 - i32.load offset=36 - local.get 4 - i32.eq - if ;; label = @7 - local.get 3 - i32.const -64 - i32.sub - local.get 3 - i32.load offset=52 - local.get 3 - i32.load offset=56 - call 51 - local.get 3 - i32.const 32 - i32.add - i32.const -1 - local.get 3 - i32.load offset=64 - local.tee 1 - i32.const 1 - i32.add - local.tee 6 - local.get 6 - local.get 1 - i32.lt_u - select - call 54 - local.get 3 - i32.load offset=32 - local.set 1 - end - local.get 1 - local.get 5 - i32.add - local.get 2 - i32.store - local.get 4 - i32.const 1 - i32.add - local.tee 2 - local.get 4 - i32.lt_u - br_if 5 (;@1;) - local.get 3 - local.get 2 - i32.store offset=40 - local.get 5 - i32.const 4 - i32.add - local.set 5 - local.get 2 - local.set 4 - br 0 (;@6;) - end - unreachable - end - local.get 3 - i32.const 32 - i32.add - local.get 3 - i32.const 56 - i32.add - i32.load - call 54 - local.get 3 - i32.load offset=32 - local.get 3 - i32.load offset=40 - local.set 4 - local.get 3 - i32.const 4 - i32.store offset=56 - local.get 3 - local.get 2 - i32.store offset=52 - local.get 3 - local.get 1 - i32.store offset=48 - local.get 4 - i32.const 2 - i32.shl - i32.add - local.set 5 - loop ;; label = @5 - block ;; label = @6 - local.get 3 - i32.const 8 - i32.add - local.get 3 - i32.const 48 - i32.add - call 52 - local.get 3 - i32.load offset=8 - local.tee 1 - i32.eqz - br_if 0 (;@6;) - local.get 5 - local.get 3 - i32.load8_u offset=31 - local.get 1 - local.get 3 - i32.load offset=12 - call 53 - i32.store - local.get 4 - i32.const 1 - i32.add - local.tee 1 - local.get 4 - i32.lt_u - br_if 5 (;@1;) - local.get 5 - i32.const 4 - i32.add - local.set 5 - local.get 1 - local.set 4 - br 1 (;@5;) - end - end - local.get 3 - local.get 4 - i32.store offset=40 - end - local.get 3 - i32.const 56 - i32.add - local.get 3 - i32.const 40 - i32.add - i32.load - i32.store - local.get 3 - local.get 3 - i64.load offset=32 - i64.store offset=48 - local.get 0 - local.get 3 - i32.const 48 - i32.add - call 55 - br 1 (;@2;) - end - local.get 0 - i32.const 0 - i32.store offset=8 - local.get 0 - i64.const 4 - i64.store align=4 - end - local.get 3 - i32.const 80 - i32.add - global.set 0 - return - end - unreachable) - (func (;47;) (type 0) (param i32 i32) - (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i64 i64 i64) - global.get 0 - i32.const 176 - i32.sub - local.tee 2 - global.set 0 - local.get 2 - i32.const 8 - i32.add - i32.const 65599 - i32.const 48 - call 46 - local.get 2 - i32.const 24 - i32.add - local.get 2 - i32.const 8 - i32.add - call 56 - local.get 2 - i32.const 40 - i32.add - local.get 1 - call 56 - local.get 2 - i32.const -64 - i32.sub - local.get 2 - i32.const 16 - i32.add - i32.load - local.tee 3 - i32.store - local.get 2 - local.get 2 - i64.load offset=8 - local.tee 12 - i64.store offset=56 - local.get 3 - i32.const 2 - i32.shl - local.set 4 - local.get 12 - i32.wrap_i64 - local.set 3 - i64.const 0 - local.set 12 - block ;; label = @1 - block ;; label = @2 - block ;; label = @3 - block ;; label = @4 - block ;; label = @5 - block ;; label = @6 - block ;; label = @7 - block ;; label = @8 - block ;; label = @9 - loop ;; label = @10 - local.get 4 - if ;; label = @11 - local.get 13 - i64.const 63 - i64.gt_u - br_if 2 (;@9;) - local.get 4 - i32.const -4 - i32.add - local.set 4 - local.get 12 - local.get 3 - i64.load32_u - local.get 13 - i64.shl - i64.add - local.tee 14 - local.get 12 - i64.ge_u - local.get 13 - i64.const 32 - i64.add - local.set 13 - local.get 3 - i32.const 4 - i32.add - local.set 3 - local.get 14 - local.set 12 - br_if 1 (;@10;) - br 10 (;@1;) - end - end - local.get 12 - i64.const 4294967296 - i64.lt_u - br_if 1 (;@8;) - end - local.get 2 - i32.const 80 - i32.add - local.get 2 - i32.const 48 - i32.add - i32.load - i32.store - local.get 2 - local.get 2 - i64.load offset=40 - i64.store offset=72 - local.get 2 - i32.const 96 - i32.add - local.get 2 - i32.const -64 - i32.sub - i32.load - local.tee 5 - i32.store - local.get 2 - local.get 2 - i64.load offset=56 - i64.store offset=88 - local.get 5 - i32.eqz - br_if 7 (;@1;) - local.get 2 - i32.load offset=80 - local.tee 8 - i32.eqz - br_if 1 (;@7;) - local.get 5 - i32.const 1 - i32.ne - if ;; label = @9 - local.get 2 - i32.load offset=88 - local.set 6 - i32.const -1 - local.get 5 - local.get 8 - i32.ne - local.get 8 - local.get 5 - i32.lt_u - select - local.tee 7 - br_if 4 (;@5;) - local.get 6 - i32.const -4 - i32.add - local.set 10 - local.get 5 - i32.const 2 - i32.shl - local.set 4 - local.get 8 - i32.const 2 - i32.shl - local.set 3 - local.get 2 - i32.load offset=72 - i32.const -4 - i32.add - local.set 8 - loop ;; label = @10 - local.get 3 - i32.eqz - br_if 4 (;@6;) - local.get 4 - i32.eqz - br_if 6 (;@4;) - local.get 3 - local.get 8 - i32.add - local.set 7 - local.get 4 - local.get 10 - i32.add - local.set 9 - local.get 4 - i32.const -4 - i32.add - local.set 4 - local.get 3 - i32.const -4 - i32.add - local.set 3 - i32.const -1 - local.get 7 - i32.load - local.tee 7 - local.get 9 - i32.load - local.tee 9 - i32.ne - local.get 7 - local.get 9 - i32.lt_u - select - local.tee 7 - i32.eqz - br_if 0 (;@10;) - end - br 4 (;@5;) - end - block ;; label = @9 - local.get 2 - i32.load offset=88 - local.tee 3 - i32.const 65664 - i32.ne - if ;; label = @10 - local.get 3 - i32.load - i32.const 1 - i32.ne - br_if 1 (;@9;) - end - local.get 2 - i32.const 140 - i32.add - i32.const 0 - i32.store - local.get 2 - i32.const 128 - i32.add - local.get 2 - i32.const 80 - i32.add - i32.load - i32.store - local.get 2 - local.get 2 - i64.load offset=72 - i64.store offset=120 - local.get 2 - i64.const 4 - i64.store offset=132 align=4 - local.get 2 - i32.const 88 - i32.add - call 49 - br 6 (;@3;) - end - local.get 2 - i32.load offset=76 - local.set 7 - local.get 2 - i32.load offset=72 - local.set 4 - block ;; label = @9 - local.get 3 - i32.load - local.tee 5 - i32.const 65536 - i32.ge_u - if ;; label = @10 - local.get 8 - i32.const 2 - i32.shl - local.set 6 - local.get 4 - i32.const -4 - i32.add - local.set 10 - i32.const 0 - local.set 3 - loop ;; label = @11 - local.get 6 - i32.eqz - br_if 2 (;@9;) - local.get 2 - local.get 3 - local.get 6 - local.get 10 - i32.add - local.tee 9 - i32.load - local.get 5 - call 57 - local.get 2 - i32.load offset=4 - local.set 3 - local.get 9 - local.get 2 - i32.load - i32.store - local.get 6 - i32.const -4 - i32.add - local.set 6 - br 0 (;@11;) - end - unreachable - end - local.get 8 - i32.const 2 - i32.shl - local.set 6 - local.get 4 - i32.const -4 - i32.add - local.set 10 - i32.const 0 - local.set 3 - loop ;; label = @10 - local.get 6 - i32.eqz - br_if 1 (;@9;) - local.get 5 - i32.eqz - br_if 9 (;@1;) - local.get 6 - local.get 10 - i32.add - local.tee 9 - local.get 3 - i32.const 16 - i32.shl - local.get 9 - i32.load - local.tee 3 - i32.const 16 - i32.shr_u - i32.or - local.tee 9 - local.get 5 - i32.rem_u - i32.const 16 - i32.shl - local.get 3 - i32.const 65535 - i32.and - i32.or - local.tee 3 - local.get 5 - i32.div_u - local.get 9 - local.get 5 - i32.div_u - i32.const 16 - i32.shl - i32.or - i32.store - local.get 3 - local.get 5 - i32.rem_u - local.set 3 - local.get 6 - i32.const -4 - i32.add - local.set 6 - br 0 (;@10;) - end - unreachable - end - local.get 2 - local.get 8 - i32.store offset=128 - local.get 2 - local.get 7 - i32.store offset=124 - local.get 2 - local.get 4 - i32.store offset=120 - local.get 2 - i32.const 120 - i32.add - call 58 - local.get 2 - i32.const 168 - i32.add - local.get 2 - i32.load offset=128 - local.tee 5 - i32.store - local.get 2 - local.get 2 - i64.load offset=120 - local.tee 12 - i64.store offset=160 - local.get 2 - i32.const 152 - i32.add - local.tee 4 - local.get 5 - i32.store - local.get 2 - local.get 12 - i64.store offset=144 - local.get 2 - i32.const 0 - i32.store offset=96 - block ;; label = @9 - local.get 3 - i32.eqz - br_if 0 (;@9;) - local.get 2 - i32.const 88 - i32.add - i32.const 0 - call 59 - local.get 2 - i32.load offset=88 - local.get 2 - i32.load offset=96 - local.get 2 - local.get 3 - i32.store offset=120 - local.get 2 - i32.const 120 - i32.add - i32.const 1 - call 60 - local.tee 3 - i32.eqz - br_if 0 (;@9;) - local.get 2 - i32.const 88 - i32.add - local.get 3 - call 59 - end - local.get 2 - i32.const 128 - i32.add - local.get 4 - i32.load - i32.store - local.get 2 - i32.const 140 - i32.add - local.get 2 - i32.const 96 - i32.add - i32.load - i32.store - local.get 2 - local.get 2 - i64.load offset=144 - i64.store offset=120 - local.get 2 - local.get 2 - i64.load offset=88 - i64.store offset=132 align=4 - br 5 (;@3;) - end - local.get 2 - i32.load offset=48 - local.set 3 - local.get 2 - i32.load offset=40 - local.set 4 - block ;; label = @8 - local.get 12 - i32.wrap_i64 - local.tee 5 - i32.const 65536 - i32.ge_u - if ;; label = @9 - local.get 3 - i32.const 2 - i32.shl - local.set 3 - local.get 4 - i32.const -4 - i32.add - local.set 5 - i32.const 0 - local.set 4 - loop ;; label = @10 - local.get 3 - i32.eqz - br_if 2 (;@8;) - local.get 3 - local.get 5 - i32.add - i64.load32_u - local.get 4 - i64.extend_i32_u - i64.const 32 - i64.shl - i64.or - local.get 12 - i64.rem_u - i32.wrap_i64 - local.set 4 - local.get 3 - i32.const -4 - i32.add - local.set 3 - br 0 (;@10;) - end - unreachable - end - local.get 3 - i32.const 2 - i32.shl - local.set 3 - local.get 4 - i32.const -4 - i32.add - local.set 6 - i32.const 0 - local.set 4 - loop ;; label = @9 - local.get 3 - i32.eqz - br_if 1 (;@8;) - local.get 5 - i32.eqz - br_if 8 (;@1;) - local.get 4 - i32.const 16 - i32.shl - local.get 3 - local.get 6 - i32.add - i32.load - local.tee 4 - i32.const 16 - i32.shr_u - i32.or - local.get 5 - i32.rem_u - i32.const 16 - i32.shl - local.get 4 - i32.const 65535 - i32.and - i32.or - local.get 5 - i32.rem_u - local.set 4 - local.get 3 - i32.const -4 - i32.add - local.set 3 - br 0 (;@9;) - end - unreachable - end - local.get 2 - i32.const 0 - i32.store offset=168 - local.get 2 - i64.const 4 - i64.store offset=160 - local.get 4 - i64.extend_i32_u - local.set 13 - loop ;; label = @8 - local.get 13 - i64.eqz - i32.eqz - if ;; label = @9 - local.get 2 - i32.const 160 - i32.add - local.get 13 - i32.wrap_i64 - call 59 - i64.const 0 - local.set 13 - br 1 (;@8;) - end - end - local.get 2 - i32.const 56 - i32.add - call 49 - local.get 2 - i32.const 40 - i32.add - call 49 - br 5 (;@2;) - end - local.get 2 - i32.const 136 - i32.add - i64.const 0 - i64.store - local.get 2 - i64.const 17179869184 - i64.store offset=128 - local.get 2 - i64.const 4 - i64.store offset=120 - local.get 2 - i32.const 88 - i32.add - call 49 - local.get 2 - i32.const 72 - i32.add - call 49 - br 3 (;@3;) - end - i32.const -1 - i32.const 0 - local.get 4 - select - local.set 7 - end - block ;; label = @5 - block ;; label = @6 - local.get 7 - br_table 1 (;@5;) 2 (;@4;) 0 (;@6;) - end - local.get 2 - i32.const 140 - i32.add - local.get 2 - i32.const 80 - i32.add - i32.load - i32.store - local.get 2 - i32.const 0 - i32.store offset=128 - local.get 2 - i64.const 4 - i64.store offset=120 - local.get 2 - local.get 2 - i64.load offset=72 - i64.store offset=132 align=4 - local.get 2 - i32.const 88 - i32.add - call 49 - br 2 (;@3;) - end - local.get 2 - i32.const 0 - i32.store offset=80 - local.get 2 - i32.const 72 - i32.add - i32.const 1 - call 59 - local.get 2 - i32.const 140 - i32.add - i32.const 0 - i32.store - local.get 2 - i32.const 128 - i32.add - local.get 2 - i32.load offset=80 - i32.store - local.get 2 - i64.const 4 - i64.store offset=132 align=4 - local.get 2 - local.get 2 - i64.load offset=72 - i64.store offset=120 - local.get 2 - i32.const 88 - i32.add - call 49 - br 1 (;@3;) - end - block (result i32) ;; label = @4 - local.get 5 - i32.const 2 - i32.shl - local.get 6 - i32.add - i32.const -4 - i32.add - i32.load - local.tee 9 - i32.clz - local.tee 6 - if ;; label = @5 - local.get 2 - i32.const 128 - i32.add - local.tee 3 - local.get 2 - i32.const 80 - i32.add - i32.load - i32.store - local.get 2 - local.get 2 - i64.load offset=72 - i64.store offset=120 - local.get 2 - i32.const 144 - i32.add - local.get 2 - i32.const 120 - i32.add - local.get 6 - call 61 - local.get 3 - local.get 2 - i32.const 96 - i32.add - i32.load - i32.store - local.get 2 - local.get 2 - i64.load offset=88 - i64.store offset=120 - local.get 2 - i32.const 160 - i32.add - local.get 2 - i32.const 120 - i32.add - local.get 6 - call 61 - local.get 2 - i32.const 120 - i32.add - local.get 2 - i32.const 144 - i32.add - local.get 2 - i32.const 160 - i32.add - call 62 - local.get 2 - i32.const 160 - i32.add - call 49 - i32.const 0 - br 1 (;@4;) - end - local.get 2 - i32.const 168 - i32.add - local.get 2 - i32.const 80 - i32.add - i32.load - i32.store - local.get 2 - local.get 2 - i64.load offset=72 - i64.store offset=160 - local.get 2 - i32.const 120 - i32.add - local.get 2 - i32.const 160 - i32.add - local.get 2 - i32.const 88 - i32.add - call 62 - i32.const 1 - end - local.get 2 - i32.const 112 - i32.add - local.get 2 - i32.const 128 - i32.add - local.tee 3 - i32.load - i32.store - local.get 2 - local.get 2 - i64.load offset=120 - i64.store offset=104 - local.get 2 - i32.const 136 - i32.add - i32.load - local.set 10 - local.get 2 - i32.load offset=132 - local.set 5 - block ;; label = @4 - block ;; label = @5 - local.get 2 - i32.const 140 - i32.add - i32.load - local.tee 7 - if ;; label = @6 - local.get 7 - local.get 9 - i32.eqz - local.tee 8 - i32.le_u - br_if 1 (;@5;) - local.get 8 - i32.const 2 - i32.shl - local.set 4 - local.get 5 - local.set 3 - loop ;; label = @7 - local.get 4 - if ;; label = @8 - local.get 4 - i32.const -4 - i32.add - local.set 4 - local.get 3 - i32.const 4 - i32.add - local.set 3 - br 1 (;@7;) - end - end - local.get 7 - local.get 8 - i32.sub - local.tee 3 - i32.eqz - local.get 9 - i32.or - i32.eqz - if ;; label = @7 - local.get 5 - local.get 5 - local.get 8 - i32.const 2 - i32.shl - i32.add - local.get 3 - i32.const 2 - i32.shl - call 82 - end - local.get 2 - local.get 3 - i32.store offset=168 - local.get 2 - local.get 10 - i32.store offset=164 - local.get 2 - local.get 5 - i32.store offset=160 - block ;; label = @7 - local.get 6 - i32.const 31 - i32.and - local.tee 10 - i32.eqz - br_if 0 (;@7;) - local.get 7 - i32.const 2 - i32.shl - local.get 8 - i32.const 2 - i32.shl - i32.sub - local.set 4 - local.get 5 - i32.const -4 - i32.add - local.set 5 - i32.const 0 - local.set 3 - i32.const 0 - local.get 6 - i32.sub - i32.const 31 - i32.and - local.set 6 - loop ;; label = @8 - local.get 4 - i32.eqz - br_if 1 (;@7;) - local.get 4 - local.get 5 - i32.add - local.tee 7 - local.get 3 - local.get 7 - i32.load - local.tee 7 - local.get 10 - i32.shr_u - i32.or - i32.store - local.get 4 - i32.const -4 - i32.add - local.set 4 - local.get 7 - local.get 6 - i32.shl - local.set 3 - br 0 (;@8;) - end - unreachable - end - local.get 2 - i32.const 128 - i32.add - local.get 2 - i32.const 168 - i32.add - i32.load - i32.store - local.get 2 - local.get 2 - i64.load offset=160 - i64.store offset=120 - local.get 2 - i32.const 144 - i32.add - local.get 2 - i32.const 120 - i32.add - call 55 - br 2 (;@4;) - end - local.get 2 - i32.const 132 - i32.add - i32.const 0 - i32.store - local.get 3 - local.get 10 - i32.store - local.get 2 - local.get 5 - i32.store offset=124 - local.get 2 - i32.const 1 - i32.store offset=120 - local.get 2 - i32.const 144 - i32.add - local.get 2 - i32.const 120 - i32.add - call 63 - br 1 (;@4;) - end - local.get 2 - i32.const 132 - i32.add - local.get 7 - i32.store - local.get 2 - i32.const 128 - i32.add - local.get 10 - i32.store - local.get 2 - local.get 5 - i32.store offset=124 - local.get 2 - i32.const 1 - i32.store offset=120 - local.get 2 - i32.const 160 - i32.add - local.get 2 - i32.const 120 - i32.add - call 63 - local.get 2 - i32.const 152 - i32.add - i32.const 0 - i32.store - local.get 2 - local.get 2 - i64.load offset=160 - i64.store offset=144 - end - local.get 2 - i32.const 128 - i32.add - local.get 2 - i32.const 112 - i32.add - i32.load - i32.store - local.get 2 - i32.const 140 - i32.add - local.get 2 - i32.const 152 - i32.add - i32.load - i32.store - local.get 2 - local.get 2 - i64.load offset=104 - i64.store offset=120 - local.get 2 - local.get 2 - i64.load offset=144 - i64.store offset=132 align=4 - i32.eqz - br_if 0 (;@3;) - local.get 2 - i32.const 88 - i32.add - call 49 - end - local.get 2 - i32.const 168 - i32.add - local.get 2 - i32.const 140 - i32.add - i32.load - i32.store - local.get 2 - local.get 2 - i64.load offset=132 align=4 - i64.store offset=160 - local.get 2 - i32.const 120 - i32.add - call 49 - end - local.get 2 - i32.const 128 - i32.add - local.get 2 - i32.const 32 - i32.add - i32.load - local.tee 10 - i32.store - local.get 2 - local.get 2 - i64.load offset=24 - local.tee 12 - i64.store offset=120 - local.get 2 - i32.load offset=168 - local.tee 8 - local.get 8 - local.get 10 - local.get 10 - local.get 8 - i32.gt_u - select - local.tee 5 - i32.sub - local.get 8 - i32.gt_u - br_if 0 (;@1;) - local.get 12 - i32.wrap_i64 - local.tee 4 - local.get 5 - i32.const 2 - i32.shl - i32.add - local.set 7 - i32.const 0 - local.set 9 - local.get 5 - local.set 3 - local.get 2 - i32.load offset=160 - local.tee 11 - local.set 6 - loop ;; label = @2 - local.get 3 - if ;; label = @3 - local.get 4 - local.get 4 - i64.load32_u - local.get 6 - i64.load32_u - i64.sub - local.get 9 - i64.extend_i32_u - i64.const 255 - i64.and - i64.sub - local.tee 12 - i64.store32 - local.get 12 - i64.const 63 - i64.shr_u - i32.wrap_i64 - local.set 9 - local.get 3 - i32.const -1 - i32.add - local.set 3 - local.get 4 - i32.const 4 - i32.add - local.set 4 - local.get 6 - i32.const 4 - i32.add - local.set 6 - br 1 (;@2;) - else - local.get 5 - i32.const 2 - i32.shl - local.set 5 - local.get 9 - if ;; label = @4 - local.get 10 - i32.const 2 - i32.shl - local.get 5 - i32.sub - local.set 4 - loop ;; label = @5 - local.get 4 - i32.eqz - br_if 4 (;@1;) - local.get 7 - local.get 7 - i32.load - local.tee 3 - i32.const -1 - i32.add - i32.store - local.get 4 - i32.const -4 - i32.add - local.set 4 - local.get 7 - i32.const 4 - i32.add - local.set 7 - local.get 3 - i32.eqz - br_if 0 (;@5;) - end - end - local.get 5 - local.get 11 - i32.add - local.set 3 - local.get 8 - i32.const 2 - i32.shl - local.get 5 - i32.sub - local.set 4 - loop ;; label = @4 - local.get 4 - if ;; label = @5 - local.get 4 - i32.const -4 - i32.add - local.set 4 - local.get 3 - i32.load - local.get 3 - i32.const 4 - i32.add - local.set 3 - i32.eqz - br_if 1 (;@4;) - br 4 (;@1;) - end - end - local.get 2 - i32.const 120 - i32.add - call 58 - local.get 0 - local.get 2 - i64.load offset=120 - i64.store align=4 - local.get 0 - i32.const 8 - i32.add - local.get 2 - i32.const 128 - i32.add - i32.load - i32.store - local.get 2 - i32.const 160 - i32.add - call 49 - local.get 1 - call 49 - local.get 2 - i32.const 176 - i32.add - global.set 0 - return - end - unreachable - end - unreachable - end - unreachable) - (func (;48;) (type 0) (param i32 i32) - (local i32 i32 i32 i32 i32 i32 i64 i64) - global.get 0 - i32.const 16 - i32.sub - local.tee 3 - global.set 0 - block ;; label = @1 - block ;; label = @2 - local.get 1 - i32.load offset=8 - local.tee 2 - if ;; label = @3 - block ;; label = @4 - local.get 2 - i64.extend_i32_u - i64.const 5 - i64.shl - local.tee 8 - local.get 1 - i32.load - local.tee 5 - local.get 2 - i32.const -1 - i32.add - local.tee 6 - i32.const 2 - i32.shl - i32.add - local.tee 7 - i32.load - i32.clz - i64.extend_i32_u - i64.sub - local.tee 9 - local.get 8 - i64.le_u - if ;; label = @5 - local.get 3 - i32.const 8 - i32.add - local.get 9 - i64.const 7 - i64.and - i64.const 0 - i64.ne - i64.extend_i32_u - local.get 9 - i64.const 3 - i64.shr_u - i64.add - local.tee 8 - i64.const 4294967295 - local.get 8 - i64.const 4294967295 - i64.lt_u - select - i32.wrap_i64 - i32.const 0 - call 35 - local.get 3 - i64.load offset=8 - local.set 8 - local.get 0 - i32.const 0 - i32.store offset=8 - local.get 0 - local.get 8 - i64.store align=4 - local.get 5 - local.set 2 - br 1 (;@4;) - end - unreachable - end - loop ;; label = @4 - local.get 2 - local.get 7 - i32.eq - if ;; label = @5 - local.get 5 - local.get 6 - i32.const 2 - i32.shl - i32.add - i32.load - local.set 1 - loop ;; label = @6 - local.get 1 - i32.eqz - br_if 4 (;@2;) - local.get 0 - local.get 1 - call 64 - local.get 1 - i32.const 8 - i32.shr_u - local.set 1 - br 0 (;@6;) - end - unreachable - else - local.get 2 - i32.load - local.set 4 - i32.const 0 - local.set 1 - loop ;; label = @6 - local.get 1 - i32.const 255 - i32.and - i32.const 3 - i32.le_u - if ;; label = @7 - local.get 0 - local.get 4 - call 64 - local.get 4 - i32.const 8 - i32.shr_u - local.set 4 - local.get 1 - i32.const 1 - i32.add - local.set 1 - br 1 (;@6;) - end - end - local.get 2 - i32.const 4 - i32.add - local.set 2 - br 1 (;@4;) - end - unreachable - end - unreachable - end - i32.const 1 - i32.const 1 - call 13 - local.tee 1 - i32.eqz - br_if 1 (;@1;) - local.get 0 - i64.const 4294967297 - i64.store offset=4 align=4 - local.get 0 - local.get 1 - i32.store - local.get 1 - i32.const 0 - i32.store8 - end - local.get 3 - i32.const 16 - i32.add - global.set 0 - return - end - unreachable) - (func (;49;) (type 2) (param i32) - (local i32) - global.get 0 - i32.const 16 - i32.sub - local.tee 1 - global.set 0 - local.get 1 - local.get 0 - call 66 - local.get 1 - i32.load - local.tee 0 - if ;; label = @1 - local.get 0 - local.get 1 - i32.load offset=4 - call 71 - end - local.get 1 - i32.const 16 - i32.add - global.set 0) - (func (;50;) (type 3) (param i32 i32 i32 i32) - (local i32 i32 i32) - global.get 0 - i32.const 96 - i32.sub - local.tee 4 - global.set 0 - local.get 4 - i32.const 8 - i32.add - local.get 3 - i32.const 0 - call 35 - local.get 4 - local.get 4 - i32.load offset=12 - i32.store offset=52 - local.get 4 - local.get 4 - i32.load offset=8 - local.tee 5 - i32.store offset=48 - local.get 5 - local.get 2 - local.get 3 - call 81 - local.set 2 - local.get 4 - local.get 3 - i32.store offset=56 - local.get 4 - i64.const 16384 - i64.store offset=36 align=4 - local.get 4 - i32.const 65672 - i32.store offset=32 - block ;; label = @1 - block ;; label = @2 - block ;; label = @3 - local.get 3 - i32.const 64 - i32.ge_u - if ;; label = @4 - local.get 3 - i32.const 16384 - i32.lt_u - br_if 1 (;@3;) - local.get 3 - i32.const 1073741824 - i32.lt_u - br_if 2 (;@2;) - local.get 4 - i32.const 32 - i32.add - i32.const 3 - call 39 - local.get 3 - local.get 4 - i32.const 32 - i32.add - call 40 - br 3 (;@1;) - end - local.get 4 - i32.const 32 - i32.add - local.get 3 - i32.const 2 - i32.shl - call 39 - br 2 (;@1;) - end - local.get 4 - local.get 3 - i32.const 2 - i32.shl - i32.const 1 - i32.or - i32.store16 offset=72 - local.get 4 - i32.const 32 - i32.add - local.get 4 - i32.const 72 - i32.add - i32.const 2 - call 19 - br 1 (;@1;) - end - local.get 3 - i32.const 2 - i32.shl - i32.const 2 - i32.or - local.get 4 - i32.const 32 - i32.add - call 40 - end - local.get 4 - i32.const 32 - i32.add - local.get 2 - local.get 3 - call 19 - local.get 4 - i32.load offset=36 - local.tee 5 - local.get 4 - i32.load offset=40 - local.tee 2 - i32.ge_u - if ;; label = @1 - local.get 4 - i32.load offset=32 - local.set 3 - local.get 4 - local.get 5 - local.get 2 - i32.sub - local.tee 5 - i32.store offset=68 - local.get 4 - local.get 2 - local.get 3 - i32.add - local.tee 6 - i32.store offset=64 - local.get 4 - local.get 5 - i32.store offset=32 - local.get 1 - local.get 3 - local.get 2 - local.get 6 - local.get 4 - i32.const 32 - i32.add - call 3 - local.set 1 - local.get 4 - i32.const -64 - i32.sub - local.get 4 - i32.load offset=32 - call 23 - block (result i32) ;; label = @2 - block (result i32) ;; label = @3 - block ;; label = @4 - block ;; label = @5 - block ;; label = @6 - block ;; label = @7 - block ;; label = @8 - block ;; label = @9 - block ;; label = @10 - block ;; label = @11 - block ;; label = @12 - block ;; label = @13 - local.get 1 - br_table 1 (;@12;) 3 (;@10;) 4 (;@9;) 5 (;@8;) 6 (;@7;) 7 (;@6;) 8 (;@5;) 9 (;@4;) 0 (;@13;) 2 (;@11;) - end - i32.const 8 - br 9 (;@3;) - end - local.get 4 - local.get 4 - i64.load offset=64 - i64.store offset=88 - local.get 4 - i32.const 72 - i32.add - local.get 4 - i32.const 88 - i32.add - call 14 - i32.const 0 - local.set 2 - block (result i32) ;; label = @12 - i32.const 1 - local.get 4 - i32.load offset=72 - i32.eqz - br_if 0 (;@12;) - drop - local.get 4 - i32.const 42 - i32.add - local.get 4 - i32.const 80 - i32.add - i32.load - i32.store align=2 - local.get 4 - local.get 4 - i64.load offset=72 - i64.store offset=34 align=2 - i32.const 0 - end - br 9 (;@2;) - end - i32.const 9 - br 7 (;@3;) - end - i32.const 1 - br 6 (;@3;) - end - i32.const 2 - br 5 (;@3;) - end - i32.const 3 - br 4 (;@3;) - end - i32.const 4 - br 3 (;@3;) - end - i32.const 5 - br 2 (;@3;) - end - i32.const 6 - br 1 (;@3;) - end - i32.const 7 - end - local.set 2 - i32.const 1 - end - local.set 3 - local.get 4 - local.get 4 - i64.load offset=32 align=2 - i64.store offset=16 - local.get 4 - local.get 4 - i32.const 38 - i32.add - i64.load align=2 - i64.store offset=22 align=2 - local.get 0 - block (result i32) ;; label = @2 - local.get 3 - i32.eqz - if ;; label = @3 - local.get 0 - local.get 4 - i64.load offset=18 align=2 - i64.store offset=4 align=2 - local.get 0 - i32.const 12 - i32.add - local.get 4 - i32.const 26 - i32.add - i32.load align=2 - i32.store align=2 - local.get 4 - i32.const 48 - i32.add - call 26 - i32.const 0 - br 1 (;@2;) - end - local.get 0 - local.get 2 - i32.store8 offset=5 - local.get 0 - i32.const 2 - i32.store8 offset=4 - local.get 4 - i32.const 48 - i32.add - call 26 - i32.const 1 - end - i32.store - local.get 4 - i32.const 96 - i32.add - global.set 0 - return - end - unreachable) - (func (;51;) (type 1) (param i32 i32 i32) - (local i32) - local.get 1 - if ;; label = @1 - block ;; label = @2 - local.get 2 - i32.eqz - br_if 0 (;@2;) - local.get 1 - local.get 2 - i32.div_u - local.set 3 - block ;; label = @3 - local.get 1 - local.get 2 - i32.rem_u - i32.eqz - if ;; label = @4 - local.get 3 - local.set 1 - br 1 (;@3;) - end - local.get 3 - i32.const 1 - i32.add - local.tee 1 - local.get 3 - i32.lt_u - br_if 1 (;@2;) - end - local.get 0 - i32.const 1 - i32.store offset=4 - local.get 0 - local.get 1 - i32.store - local.get 0 - i32.const 8 - i32.add - local.get 1 - i32.store - return - end - unreachable - end - local.get 0 - i64.const 4294967296 - i64.store align=4 - local.get 0 - i32.const 8 - i32.add - i32.const 0 - i32.store) - (func (;52;) (type 0) (param i32 i32) - (local i32 i32 i32) - block ;; label = @1 - block ;; label = @2 - local.get 1 - i32.load offset=4 - local.tee 2 - i32.eqz - if ;; label = @3 - i32.const 0 - local.set 2 - br 1 (;@2;) - end - local.get 2 - local.get 1 - i32.load offset=8 - local.tee 3 - local.get 2 - local.get 2 - local.get 3 - i32.gt_u - select - local.tee 3 - i32.sub - local.tee 4 - local.get 2 - i32.gt_u - br_if 1 (;@1;) - local.get 1 - i32.load - local.set 2 - local.get 1 - local.get 4 - i32.store offset=4 - local.get 1 - local.get 2 - local.get 3 - i32.add - i32.store - end - local.get 0 - local.get 3 - i32.store offset=4 - local.get 0 - local.get 2 - i32.store - return - end - unreachable) - (func (;53;) (type 4) (param i32 i32 i32) (result i32) - (local i32 i32) - local.get 1 - i32.const -1 - i32.add - local.set 3 - local.get 0 - i32.const 255 - i32.and - local.set 1 - i32.const 0 - local.set 0 - block ;; label = @1 - loop ;; label = @2 - local.get 2 - if ;; label = @3 - local.get 1 - i32.const 32 - i32.ge_u - br_if 2 (;@1;) - local.get 2 - local.get 3 - i32.add - local.get 2 - i32.const -1 - i32.add - local.set 2 - i32.load8_u - local.get 0 - local.get 1 - i32.shl - i32.or - local.set 0 - br 1 (;@2;) - end - end - local.get 0 - return - end - unreachable) - (func (;54;) (type 0) (param i32 i32) - (local i32 i32 i32) - global.get 0 - i32.const 48 - i32.sub - local.tee 2 - global.set 0 - block (result i32) ;; label = @1 - block ;; label = @2 - local.get 0 - i32.load offset=4 - local.tee 3 - local.get 0 - i32.load offset=8 - local.tee 4 - i32.sub - local.get 1 - i32.ge_u - br_if 0 (;@2;) - local.get 1 - local.get 4 - i32.add - local.tee 1 - local.get 4 - i32.lt_u - if ;; label = @3 - i32.const 0 - local.set 1 - i32.const 1 - br 2 (;@1;) - end - local.get 3 - local.get 3 - i32.add - local.tee 4 - local.get 3 - i32.ge_u - if ;; label = @3 - local.get 2 - i32.const 8 - i32.add - local.get 4 - local.get 1 - local.get 4 - local.get 1 - i32.gt_u - select - local.tee 1 - i32.const 4 - local.get 1 - i32.const 4 - i32.gt_u - select - call 65 - local.get 2 - i32.load offset=12 - local.set 1 - local.get 2 - i32.load offset=8 - local.set 3 - local.get 2 - i32.const 32 - i32.add - local.get 0 - call 66 - local.get 2 - i32.const 16 - i32.add - local.get 3 - local.get 1 - local.get 2 - i32.const 32 - i32.add - call 15 - local.get 2 - i32.const 24 - i32.add - i32.load - local.set 1 - i32.const 1 - local.get 2 - i32.load offset=16 - i32.const 1 - i32.eq - br_if 2 (;@1;) - drop - local.get 0 - local.get 2 - i32.load offset=20 - i32.store - local.get 0 - local.get 1 - i32.const 2 - i32.shr_u - i32.store offset=4 - br 1 (;@2;) - end - unreachable - end - i32.const 0 - end - local.get 1 - call 67 - local.get 2 - i32.const 48 - i32.add - global.set 0) - (func (;55;) (type 0) (param i32 i32) - (local i32 i32) - global.get 0 - i32.const 16 - i32.sub - local.tee 2 - global.set 0 - local.get 2 - i32.const 8 - i32.add - local.tee 3 - local.get 1 - i32.const 8 - i32.add - i32.load - i32.store - local.get 2 - local.get 1 - i64.load align=4 - i64.store - local.get 2 - call 58 - local.get 0 - i32.const 8 - i32.add - local.get 3 - i32.load - i32.store - local.get 0 - local.get 2 - i64.load - i64.store align=4 - local.get 2 - i32.const 16 - i32.add - global.set 0) - (func (;56;) (type 0) (param i32 i32) - (local i32) - local.get 1 - i32.load - local.set 2 - local.get 0 - local.get 1 - i32.load offset=8 - local.tee 1 - call 68 - local.get 0 - i32.load - local.get 2 - local.get 1 - i32.const 2 - i32.shl - call 81 - drop - local.get 0 - local.get 1 - i32.store offset=8) - (func (;57;) (type 3) (param i32 i32 i32 i32) - (local i64 i64) - local.get 3 - if ;; label = @1 - local.get 0 - local.get 2 - i64.extend_i32_u - local.get 1 - i64.extend_i32_u - i64.const 32 - i64.shl - i64.or - local.tee 4 - local.get 3 - i64.extend_i32_u - local.tee 5 - i64.rem_u - i64.store32 offset=4 - local.get 0 - local.get 4 - local.get 5 - i64.div_u - i64.store32 - return - end - unreachable) - (func (;58;) (type 2) (param i32) - (local i32 i32 i32 i32 i32 i32) - global.get 0 - i32.const 32 - i32.sub - local.tee 3 - global.set 0 - loop ;; label = @1 - block ;; label = @2 - local.get 0 - i32.load offset=8 - local.tee 1 - i32.eqz - if ;; label = @3 - br 1 (;@2;) - end - local.get 0 - i32.load - local.get 1 - i32.const 2 - i32.shl - i32.add - i32.const -4 - i32.add - i32.load - if ;; label = @3 - local.get 1 - local.set 2 - else - local.get 3 - i32.const 8 - i32.add - local.get 0 - call 72 - br 2 (;@1;) - end - end - end - local.get 2 - local.get 0 - i32.load offset=4 - local.tee 4 - i32.const 2 - i32.shr_u - i32.ge_u - local.get 4 - local.get 1 - i32.le_u - i32.or - i32.eqz - if ;; label = @1 - local.get 3 - i32.const 16 - i32.add - local.get 0 - call 66 - block (result i32) ;; label = @2 - local.get 3 - i32.load offset=16 - local.tee 4 - if ;; label = @3 - block ;; label = @4 - local.get 1 - local.get 1 - i32.const 1073741823 - i32.and - i32.eq - if ;; label = @5 - local.get 3 - i32.const 24 - i32.add - i32.load - local.set 2 - local.get 3 - i32.load offset=20 - local.set 5 - block ;; label = @6 - local.get 1 - i32.const 2 - i32.shl - local.tee 6 - if ;; label = @7 - local.get 4 - local.get 5 - local.get 2 - local.get 6 - call 28 - local.tee 1 - i32.eqz - br_if 1 (;@6;) - br 3 (;@4;) - end - local.get 4 - local.get 5 - call 71 - local.get 2 - local.tee 1 - br_if 2 (;@4;) - i32.const 0 - local.set 2 - end - i32.const 1 - br 3 (;@2;) - end - unreachable - end - local.get 0 - local.get 1 - i32.store - local.get 0 - local.get 6 - i32.const 2 - i32.shr_u - i32.store offset=4 - end - i32.const 0 - end - local.get 2 - call 67 - end - local.get 3 - i32.const 32 - i32.add - global.set 0) - (func (;59;) (type 0) (param i32 i32) - (local i32) - local.get 0 - i32.load offset=8 - local.tee 2 - local.get 0 - i32.load offset=4 - i32.eq - if ;; label = @1 - local.get 0 - i32.const 1 - call 54 - local.get 0 - i32.load offset=8 - local.set 2 - end - local.get 0 - i32.load - local.get 2 - i32.const 2 - i32.shl - i32.add - local.get 1 - i32.store - local.get 0 - i32.load offset=8 - local.tee 1 - i32.const 1 - i32.add - local.tee 2 - local.get 1 - i32.ge_u - if ;; label = @1 - local.get 0 - local.get 2 - i32.store offset=8 - return - end - unreachable) - (func (;60;) (type 6) (param i32 i32 i32 i32) (result i32) - (local i32 i32 i32 i64) - local.get 1 - local.get 3 - i32.ge_u - if ;; label = @1 - local.get 0 - local.get 3 - i32.const 2 - i32.shl - i32.add - local.set 6 - local.get 3 - local.set 5 - loop ;; label = @2 - local.get 5 - if ;; label = @3 - local.get 0 - local.get 2 - i64.load32_u - local.get 0 - i64.load32_u - local.get 4 - i64.extend_i32_u - i64.const 255 - i64.and - i64.add - i64.add - local.tee 7 - i64.store32 - local.get 5 - i32.const -1 - i32.add - local.set 5 - local.get 0 - i32.const 4 - i32.add - local.set 0 - local.get 2 - i32.const 4 - i32.add - local.set 2 - local.get 7 - i64.const 32 - i64.shr_u - i32.wrap_i64 - local.set 4 - br 1 (;@2;) - else - i32.const 0 - local.set 5 - block ;; label = @4 - local.get 4 - i32.const 255 - i32.and - i32.eqz - br_if 0 (;@4;) - local.get 1 - i32.const 2 - i32.shl - local.get 3 - i32.const 2 - i32.shl - i32.sub - local.set 0 - loop ;; label = @5 - local.get 0 - i32.eqz - if ;; label = @6 - local.get 4 - local.set 5 - br 2 (;@4;) - end - local.get 6 - local.get 6 - i64.load32_u - local.get 4 - i64.extend_i32_u - i64.const 255 - i64.and - i64.add - local.tee 7 - i64.store32 - local.get 0 - i32.const -4 - i32.add - local.set 0 - local.get 6 - i32.const 4 - i32.add - local.set 6 - i32.const 1 - local.set 4 - local.get 7 - i64.const 4294967296 - i64.and - i64.const 0 - i64.ne - br_if 0 (;@5;) - end - end - local.get 5 - i32.const 255 - i32.and - return - end - unreachable - end - unreachable - end - unreachable) - (func (;61;) (type 1) (param i32 i32 i32) - (local i32 i32 i32 i32 i32 i32 i32 i64) - global.get 0 - i32.const -64 - i32.add - local.tee 3 - global.set 0 - local.get 1 - i64.load align=4 - local.set 10 - block ;; label = @1 - block ;; label = @2 - block ;; label = @3 - block ;; label = @4 - local.get 1 - i32.load offset=8 - local.tee 1 - if ;; label = @5 - local.get 3 - i32.const 28 - i32.add - local.get 1 - i32.store - local.get 3 - i32.const 1 - i32.store offset=16 - local.get 3 - local.get 10 - i64.store offset=20 align=4 - local.get 2 - i32.const 5 - i32.shr_u - local.tee 7 - i32.eqz - br_if 1 (;@4;) - local.get 1 - i32.const 1 - i32.add - local.tee 5 - local.get 1 - i32.lt_u - br_if 2 (;@3;) - local.get 10 - i32.wrap_i64 - local.set 8 - local.get 3 - i32.const 48 - i32.add - i32.const -1 - local.get 5 - local.get 7 - i32.add - local.tee 1 - local.get 1 - local.get 7 - i32.lt_u - select - call 68 - local.get 3 - i32.const 48 - i32.add - local.get 7 - call 54 - local.get 7 - i32.const -1 - i32.add - local.set 6 - local.get 3 - i32.load offset=56 - local.tee 1 - local.get 7 - i32.add - local.set 9 - local.get 3 - i32.load offset=48 - local.get 1 - i32.const 2 - i32.shl - i32.add - local.set 4 - loop ;; label = @6 - local.get 4 - i32.const 0 - i32.store - local.get 1 - i32.const 1 - i32.add - local.tee 5 - local.get 1 - i32.lt_u - br_if 3 (;@3;) - local.get 6 - if ;; label = @7 - local.get 4 - i32.const 4 - i32.add - local.set 4 - local.get 6 - i32.const -1 - i32.add - local.set 6 - local.get 5 - local.set 1 - br 1 (;@6;) - end - end - local.get 3 - local.get 9 - i32.store offset=56 - local.get 3 - i32.const 48 - i32.add - local.get 3 - i32.load offset=28 - local.tee 1 - call 54 - local.get 3 - i32.load offset=48 - local.get 3 - i32.load offset=56 - local.tee 5 - i32.const 2 - i32.shl - i32.add - local.get 8 - local.get 1 - i32.const 2 - i32.shl - call 81 - drop - local.get 1 - local.get 5 - i32.add - local.tee 1 - local.get 5 - i32.lt_u - br_if 2 (;@3;) - local.get 3 - i32.const 40 - i32.add - local.get 1 - i32.store - local.get 3 - local.get 3 - i64.load offset=48 - i64.store offset=32 - i32.const 1 - local.set 5 - br 3 (;@2;) - end - local.get 3 - i32.const 60 - i32.add - i32.const 0 - i32.store - local.get 3 - local.get 10 - i64.store offset=52 align=4 - local.get 3 - i32.const 1 - i32.store offset=48 - local.get 0 - local.get 3 - i32.const 48 - i32.add - call 63 - br 3 (;@1;) - end - local.get 3 - i32.const 56 - i32.add - local.get 3 - i32.const 24 - i32.add - i64.load - i64.store - local.get 3 - local.get 3 - i64.load offset=16 - i64.store offset=48 - local.get 3 - i32.const 32 - i32.add - local.get 3 - i32.const 48 - i32.add - call 63 - br 1 (;@2;) - end - unreachable - end - block ;; label = @2 - local.get 2 - i32.const 31 - i32.and - local.tee 8 - i32.eqz - br_if 0 (;@2;) - local.get 3 - i32.const 8 - i32.add - local.get 3 - i32.const 32 - i32.add - local.get 7 - call 73 - i32.const 0 - local.set 4 - i32.const 0 - local.get 2 - i32.sub - i32.const 31 - i32.and - local.set 2 - local.get 3 - i32.load offset=12 - i32.const 2 - i32.shl - local.set 6 - local.get 3 - i32.load offset=8 - local.set 1 - loop ;; label = @3 - local.get 6 - if ;; label = @4 - local.get 1 - local.get 4 - local.get 1 - i32.load - local.tee 4 - local.get 8 - i32.shl - i32.or - i32.store - local.get 6 - i32.const -4 - i32.add - local.set 6 - local.get 1 - i32.const 4 - i32.add - local.set 1 - local.get 4 - local.get 2 - i32.shr_u - local.set 4 - br 1 (;@3;) - else - local.get 4 - i32.eqz - br_if 2 (;@2;) - local.get 3 - i32.const 32 - i32.add - local.get 4 - call 59 - end - end - end - local.get 3 - i32.const 56 - i32.add - local.get 3 - i32.const 40 - i32.add - i32.load - i32.store - local.get 3 - local.get 3 - i64.load offset=32 - i64.store offset=48 - local.get 0 - local.get 3 - i32.const 48 - i32.add - call 55 - local.get 5 - i32.eqz - br_if 0 (;@1;) - local.get 3 - i32.const 16 - i32.add - i32.const 4 - i32.or - call 49 - end - local.get 3 - i32.const -64 - i32.sub - global.set 0) - (func (;62;) (type 1) (param i32 i32 i32) - (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i64 i64 i64 i64 i64 i64 i64 i64) - global.get 0 - i32.const 80 - i32.sub - local.tee 3 - global.set 0 - block ;; label = @1 - local.get 2 - i32.load offset=8 - local.tee 4 - i32.eqz - br_if 0 (;@1;) - local.get 4 - i32.const -2 - i32.add - local.tee 7 - local.get 4 - i32.gt_u - local.get 4 - local.get 7 - i32.le_u - i32.or - br_if 0 (;@1;) - local.get 1 - i32.load offset=8 - local.tee 8 - local.get 4 - i32.sub - local.tee 5 - local.get 8 - i32.gt_u - br_if 0 (;@1;) - local.get 5 - i32.const 1 - i32.add - local.tee 8 - local.get 5 - i32.lt_u - br_if 0 (;@1;) - local.get 2 - i32.load - local.tee 5 - local.get 4 - i32.const 2 - i32.shl - i32.add - i32.const -4 - i32.add - i32.load - local.set 11 - local.get 5 - local.get 7 - i32.const 2 - i32.shl - i32.add - i64.load32_u - local.set 20 - local.get 3 - i32.const 40 - i32.add - local.get 8 - i32.const 1 - call 69 - i64.const 0 - local.get 11 - i64.extend_i32_u - local.tee 17 - i64.sub - local.set 21 - local.get 17 - i64.const 32 - i64.shl - local.set 22 - local.get 3 - i32.load offset=44 - local.set 14 - local.get 3 - i32.load offset=40 - local.set 13 - local.get 8 - local.set 7 - loop ;; label = @2 - block ;; label = @3 - local.get 7 - if ;; label = @4 - local.get 1 - i32.load offset=8 - local.tee 4 - i32.eqz - br_if 3 (;@1;) - local.get 4 - i32.const -2 - i32.add - local.tee 6 - local.get 4 - i32.gt_u - local.get 4 - local.get 6 - i32.le_u - i32.or - br_if 3 (;@1;) - local.get 1 - i32.load - local.tee 5 - local.get 4 - i32.const 2 - i32.shl - i32.add - i32.const -4 - i32.add - i32.load - local.set 4 - local.get 5 - local.get 6 - i32.const 2 - i32.shl - i32.add - i64.load32_u - local.set 16 - block (result i32) ;; label = @5 - local.get 9 - local.get 11 - i32.lt_u - if ;; label = @6 - local.get 3 - i32.const 32 - i32.add - local.get 9 - local.get 4 - local.get 11 - call 57 - local.get 3 - i64.load32_u offset=36 - local.set 15 - local.get 3 - i32.load offset=32 - br 1 (;@5;) - end - local.get 4 - i64.extend_i32_u - local.get 9 - i64.extend_i32_u - i64.add - local.set 15 - i32.const -1 - end - local.set 4 - local.get 7 - i32.const -1 - i32.add - local.set 7 - local.get 15 - local.get 21 - i64.add - local.set 18 - local.get 15 - i64.const 32 - i64.shl - local.set 15 - loop ;; label = @5 - local.get 17 - local.get 18 - i64.add - local.tee 18 - i64.const 4294967296 - i64.ge_u - if ;; label = @6 - local.get 4 - i64.extend_i32_u - local.set 19 - br 3 (;@3;) - end - local.get 15 - local.get 16 - i64.or - local.get 4 - i64.extend_i32_u - local.tee 19 - local.get 20 - i64.mul - i64.ge_u - br_if 2 (;@3;) - local.get 15 - local.get 22 - i64.add - local.set 15 - local.get 4 - i32.const -1 - i32.add - local.get 4 - i32.gt_u - local.get 4 - i32.const -1 - i32.add - local.set 4 - i32.eqz - br_if 0 (;@5;) - end - br 3 (;@1;) - end - local.get 1 - local.get 9 - call 59 - local.get 1 - call 58 - local.get 3 - local.get 8 - i32.store offset=72 - local.get 3 - local.get 14 - i32.store offset=68 - local.get 3 - local.get 13 - i32.store offset=64 - local.get 3 - i32.const -64 - i32.sub - call 58 - local.get 3 - i32.const 56 - i32.add - local.get 3 - i32.load offset=72 - local.tee 2 - i32.store - local.get 3 - local.get 3 - i64.load offset=64 - local.tee 16 - i64.store offset=48 - local.get 0 - i32.const 8 - i32.add - local.get 2 - i32.store - local.get 0 - local.get 16 - i64.store align=4 - local.get 0 - local.get 1 - i64.load align=4 - i64.store offset=12 align=4 - local.get 0 - i32.const 20 - i32.add - local.get 1 - i32.const 8 - i32.add - i32.load - i32.store - local.get 3 - i32.const 80 - i32.add - global.set 0 - return - end - local.get 3 - i32.const 24 - i32.add - local.get 1 - local.get 7 - call 73 - local.get 2 - i32.load offset=8 - local.tee 6 - local.get 3 - i32.load offset=28 - local.tee 5 - local.get 5 - local.get 6 - i32.gt_u - select - local.set 5 - local.get 2 - i32.load - local.set 12 - i32.const -1 - local.set 6 - local.get 3 - i32.load offset=24 - local.set 10 - loop ;; label = @3 - local.get 5 - if ;; label = @4 - local.get 10 - local.get 6 - i64.extend_i32_u - local.get 10 - i64.load32_u - i64.const -4294967296 - i64.or - i64.add - local.get 19 - local.get 12 - i64.load32_u - i64.mul - i64.sub - i64.const -4294967295 - i64.add - local.tee 16 - i64.store32 - local.get 16 - i64.const 32 - i64.shr_u - i32.wrap_i64 - local.set 6 - local.get 12 - i32.const 4 - i32.add - local.set 12 - local.get 5 - i32.const -1 - i32.add - local.set 5 - local.get 10 - i32.const 4 - i32.add - local.set 10 - br 1 (;@3;) - end - end - block ;; label = @3 - local.get 9 - local.get 6 - i32.const -1 - i32.xor - local.tee 6 - i32.ge_u - if ;; label = @4 - local.get 4 - local.set 5 - br 1 (;@3;) - end - local.get 4 - i32.const -1 - i32.add - local.tee 5 - local.get 4 - i32.gt_u - br_if 2 (;@1;) - local.get 3 - i32.const 16 - i32.add - local.get 1 - local.get 7 - call 73 - local.get 6 - local.get 3 - i32.load offset=16 - local.get 3 - i32.load offset=20 - local.get 2 - i32.load - local.get 2 - i32.load offset=8 - call 60 - i32.sub - local.get 6 - i32.gt_u - br_if 2 (;@1;) - end - local.get 8 - local.get 7 - i32.le_u - br_if 1 (;@1;) - local.get 13 - local.get 7 - i32.const 2 - i32.shl - i32.add - local.get 5 - i32.store - local.get 3 - i32.const 8 - i32.add - local.get 1 - call 72 - local.get 3 - i32.load offset=12 - local.set 9 - local.get 3 - i32.load offset=8 - br_if 0 (;@2;) - end - end - unreachable) - (func (;63;) (type 0) (param i32 i32) - (local i32) - local.get 1 - i32.const 4 - i32.add - local.set 2 - local.get 1 - i32.load - i32.const 1 - i32.eq - if ;; label = @1 - local.get 0 - local.get 2 - i64.load align=4 - i64.store align=4 - local.get 0 - i32.const 8 - i32.add - local.get 2 - i32.const 8 - i32.add - i32.load - i32.store - return - end - local.get 0 - local.get 2 - i32.load - call 56) - (func (;64;) (type 0) (param i32 i32) - (local i32) - local.get 0 - i32.load offset=8 - local.tee 2 - local.get 0 - i32.load offset=4 - i32.eq - if (result i32) ;; label = @1 - local.get 0 - i32.const 1 - call 32 - local.get 0 - i32.load offset=8 - else - local.get 2 - end - local.get 0 - i32.load - i32.add + i32.const 16 + i32.sub + local.tee 3 + global.set 0 local.get 1 - i32.store8 - local.get 0 - i32.load offset=8 - local.tee 1 - i32.const 1 + i32.const 8 i32.add - local.tee 2 + local.tee 4 + i32.load + local.set 5 + local.get 4 + i32.const 0 + i32.store local.get 1 - i32.ge_u - if ;; label = @1 - local.get 0 - local.get 2 - i32.store offset=8 - return - end - unreachable) - (func (;65;) (type 0) (param i32 i32) - (local i32 i32 i32) + i32.load offset=4 + local.set 4 + local.get 1 + i32.const 65572 + i32.store offset=4 + local.get 3 + local.get 2 + i32.store8 offset=15 + local.get 3 + i32.const 1 + local.get 4 + local.get 5 + call 15 block ;; label = @1 - local.get 1 - local.get 1 - i32.const 1073741823 - i32.and - local.tee 2 - i32.ne - if ;; label = @2 - i32.const 0 - local.set 2 - br 1 (;@1;) - end - local.get 1 - local.get 2 - i32.eq - i32.const 2 - i32.shl - local.tee 2 - local.get 1 - i32.const 2 - i32.shl - local.tee 3 - i32.add - i32.const -1 - i32.add - i32.const 0 - local.get 2 - i32.sub - local.tee 4 - i32.and - local.tee 1 local.get 3 - i32.ge_u + i32.load offset=4 + i32.const 1 + i32.eq if ;; label = @2 - local.get 2 - i32.popcnt - i32.const 1 - i32.eq + local.get 3 + i32.load + local.get 3 + i32.load8_u offset=15 + i32.store8 + local.get 1 i32.const 0 + i32.store offset=8 local.get 1 - local.get 4 - i32.le_u - select + i32.const 65572 + i32.store offset=4 + local.get 5 + i32.eqz br_if 1 (;@1;) - unreachable - end - unreachable - end - local.get 0 - local.get 2 - i32.store offset=4 - local.get 0 - local.get 1 - i32.store) - (func (;66;) (type 0) (param i32 i32) - (local i32) - local.get 1 - i32.load offset=4 - local.tee 2 - if ;; label = @1 - local.get 2 - local.get 2 - i32.const 1073741823 - i32.and - i32.eq - if ;; label = @2 - local.get 0 - local.get 2 - i32.const 2 - i32.shl + local.get 1 + local.get 5 + i32.const -1 + i32.add + i32.store offset=8 + local.get 1 + local.get 4 + i32.const 1 + i32.add i32.store offset=4 local.get 0 - i32.const 8 - i32.add - i32.const 4 - i32.store + i32.const 1 + i32.store offset=4 local.get 0 - local.get 1 - i32.load + local.get 4 i32.store + local.get 3 + i32.const 16 + i32.add + global.set 0 return end unreachable end - local.get 0 - i32.const 0 - i32.store) - (func (;67;) (type 0) (param i32 i32) - block ;; label = @1 - local.get 0 - i32.const 1 - i32.eq - if ;; label = @2 - local.get 1 - i32.eqz - br_if 1 (;@1;) - unreachable - end - return - end unreachable) - (func (;68;) (type 0) (param i32 i32) - (local i32 i64) + (func (;11;) (type 0) (param i32 i32) + (local i32 i32) global.get 0 i32.const 16 i32.sub local.tee 2 global.set 0 local.get 2 - i32.const 8 - i32.add - local.get 1 i32.const 0 - call 69 - local.get 2 - i64.load offset=8 - local.set 3 + i32.store8 offset=15 + block ;; label = @1 + local.get 1 + local.get 2 + i32.const 15 + i32.add + i32.const 1 + call 19 + i32.eqz + if ;; label = @2 + local.get 2 + i32.load8_u offset=15 + local.set 1 + br 1 (;@1;) + end + i32.const 1 + local.set 3 + end local.get 0 - i32.const 0 - i32.store offset=8 + local.get 1 + i32.store8 offset=1 local.get 0 local.get 3 - i64.store align=4 + i32.store8 local.get 2 i32.const 16 i32.add global.set 0) - (func (;69;) (type 1) (param i32 i32 i32) + (func (;12;) (type 7) (param i32) (result i64) (local i32 i32) global.get 0 - i32.const 32 + i32.const 16 i32.sub - local.tee 3 + local.tee 1 global.set 0 - local.get 3 - i32.const 24 - i32.add local.get 1 - call 65 - block ;; label = @1 - block ;; label = @2 - local.get 3 - i32.load offset=28 - local.tee 1 - i32.eqz - br_if 0 (;@2;) - local.get 3 - i32.load offset=24 - local.tee 4 - i32.const -1 - i32.le_s - br_if 0 (;@2;) - block (result i32) ;; label = @3 - local.get 2 - if ;; label = @4 - local.get 3 - i32.const 8 - i32.add - local.get 4 - local.get 1 - i32.const 1 - call 70 - local.get 3 - i32.load offset=8 - local.set 2 - local.get 3 - i32.load offset=12 - br 1 (;@3;) - end - local.get 3 - i32.const 16 - i32.add - local.get 4 + i64.const 0 + i64.store8 offset=12 + local.get 1 + i64.const 0 + i64.store32 offset=8 + block (result i32) ;; label = @1 + loop ;; label = @2 + local.get 2 + i32.const 4 + i32.eq + if ;; label = @3 local.get 1 - i32.const 0 - call 70 - local.get 3 - i32.load offset=16 + i64.load8_u offset=12 + i32.wrap_i64 + i32.const 4 + i32.lt_u local.set 2 - local.get 3 - i32.load offset=20 + local.get 1 + i32.load offset=8 + br 2 (;@1;) end - local.set 1 - local.get 2 - i32.eqz - br_if 1 (;@1;) - local.get 0 - local.get 2 - i32.store + local.get 1 local.get 0 + call 11 local.get 1 - i32.const 2 - i32.shr_u - i32.store offset=4 - local.get 3 - i32.const 32 - i32.add - global.set 0 - return - end - unreachable - end - unreachable) - (func (;70;) (type 3) (param i32 i32 i32 i32) - block ;; label = @1 - local.get 1 - if ;; label = @2 - local.get 3 + i32.load8_u + i32.const 1 + i32.and i32.eqz if ;; label = @3 local.get 1 + i32.const 8 + i32.add local.get 2 - call 13 - local.set 2 - br 2 (;@1;) + i32.add + local.get 1 + i32.load8_u offset=1 + i32.store8 + local.get 1 + local.get 2 + i32.const 1 + i32.add + local.tee 2 + i32.store8 offset=12 + br 1 (;@2;) end + end + local.get 2 + i32.const 255 + i32.and + if ;; label = @2 local.get 1 - local.get 2 - call 30 - local.set 2 - br 1 (;@1;) + i32.const 0 + i32.store8 offset=12 end + i32.const 1 + local.set 2 i32.const 0 - local.set 1 end - local.get 0 - local.get 1 - i32.store offset=4 - local.get 0 - local.get 2 - i32.store) - (func (;71;) (type 0) (param i32 i32) + local.set 0 local.get 1 - if ;; label = @1 - local.get 0 - local.get 1 - call 8 - end) - (func (;72;) (type 0) (param i32 i32) - (local i32) - block (result i32) ;; label = @1 - i32.const 0 - local.get 1 - i32.load offset=8 - local.tee 2 - i32.eqz - br_if 0 (;@1;) - drop - local.get 1 - local.get 2 - i32.const -1 - i32.add - local.tee 2 - i32.store offset=8 - local.get 1 - i32.load - local.get 2 - i32.const 2 - i32.shl - i32.add - i32.load - local.set 2 - i32.const 1 - end - local.set 1 - local.get 0 + i32.const 16 + i32.add + global.set 0 local.get 2 - i32.store offset=4 + i64.extend_i32_u local.get 0 - local.get 1 - i32.store) - (func (;73;) (type 1) (param i32 i32 i32) + i64.extend_i32_u + i64.const 8 + i64.shl + i64.or) + (func (;13;) (type 3) (param i32) (local i32) - local.get 1 - i32.load offset=8 - local.tee 3 - local.get 2 - i32.lt_u - if ;; label = @1 - unreachable - end - local.get 0 - local.get 3 - local.get 2 + global.get 0 + i32.const 16 i32.sub - i32.store offset=4 + local.tee 1 + global.set 0 + local.get 1 local.get 0 + i32.store offset=12 local.get 1 - i32.load - local.get 2 - i32.const 2 - i32.shl + i32.const 12 i32.add - i32.store) - (func (;74;) (type 4) (param i32 i32 i32) (result i32) + i32.load + i32.load8_u + call 14 + unreachable) + (func (;14;) (type 3) (param i32) (local i32) - local.get 0 - i32.load16_u offset=4 - local.set 3 - local.get 0 + global.get 0 + i32.const 32 + i32.sub + local.tee 1 + global.set 0 + local.get 1 + i32.const 24 + i32.add + i32.const 16384 + i32.store + local.get 1 + i32.const 65572 + i32.store offset=20 + local.get 1 i32.const 0 - i32.store16 offset=4 - local.get 3 - i32.const 1 - i32.and - i32.eqz - if ;; label = @1 - local.get 0 - i32.load - local.get 1 - local.get 2 - call 24 - return - end + i32.store offset=16 local.get 1 - local.get 3 i32.const 8 - i32.shr_u - i32.store8 - local.get 0 - i32.load - local.get 1 - i32.const 1 i32.add - local.get 2 - i32.const -1 + local.get 1 + i32.const 16 i32.add - call 24) - (func (;75;) (type 5) (param i32 i32) (result i32) - (local i32) - block ;; label = @1 - local.get 0 - local.get 1 - i32.add - local.tee 2 - local.get 0 - i32.lt_u - br_if 0 (;@1;) - local.get 2 - i32.const -1 - i32.add - local.tee 0 - local.get 2 - i32.gt_u - br_if 0 (;@1;) - local.get 0 - local.get 1 - i32.div_u - return - end - unreachable) - (func (;76;) (type 8) (param i32) (result i32) local.get 0 - i32.const 4 - call 75) - (func (;77;) (type 1) (param i32 i32 i32) - (local i32) - block ;; label = @1 - local.get 1 - i32.const 1073741823 - i32.and - local.get 1 - i32.ne - br_if 0 (;@1;) - local.get 2 - i32.const -64 - i32.sub - local.tee 3 - local.get 2 - i32.lt_u - local.get 3 - i32.const 536870911 - i32.and - local.get 3 - i32.ne - i32.or - br_if 0 (;@1;) - local.get 1 - i32.const 2 - i32.shl - local.tee 1 + call 10 + i32.const 0 + local.get 1 + i32.load offset=8 + local.get 1 + i32.load offset=12 + call 4 + unreachable) + (func (;15;) (type 6) (param i32 i32 i32 i32) + i32.const 0 + local.get 1 + i32.le_u + if ;; label = @1 local.get 3 - i32.const 3 - i32.shl - local.tee 2 - local.get 1 - local.get 2 - i32.gt_u - select - local.tee 1 - i32.const 8 - i32.add - local.tee 2 local.get 1 - i32.lt_u - br_if 0 (;@1;) - block (result i32) ;; label = @2 - i32.const 1 - local.get 2 - i32.const 65536 - call 75 - local.tee 1 - memory.grow - local.tee 2 - i32.const -1 - i32.eq - br_if 0 (;@2;) - drop - local.get 2 - i32.const 65535 - i32.and - local.get 2 - i32.ne - local.get 1 - i32.const 65535 - i32.and - local.get 1 - i32.ne - i32.or - br_if 1 (;@1;) + i32.ge_u + if ;; label = @2 + local.get 0 local.get 1 - i32.const 16 - i32.shl - local.tee 3 - i32.const -8 - i32.add - local.get 3 - i32.gt_u - br_if 1 (;@1;) + i32.store offset=4 + local.get 0 local.get 2 - i32.const 16 - i32.shl - local.tee 1 - i64.const 0 - i64.store - local.get 1 - i32.const 0 - i32.store offset=8 - local.get 1 - local.get 1 - local.get 3 - i32.add - i32.const 2 - i32.or i32.store - i32.const 0 + return end - local.set 2 - local.get 0 - local.get 1 - i32.store offset=4 - local.get 0 - local.get 2 - i32.store - return + unreachable end unreachable) - (func (;78;) (type 4) (param i32 i32 i32) (result i32) - (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) - local.get 0 - i32.const 2 - i32.shl - local.set 6 + (func (;16;) (type 4) (result i32) i32.const 0 - local.get 1 - i32.sub - local.set 8 - local.get 0 - i32.const 1073741823 + call 17 + i32.const 255 i32.and - local.get 0 - i32.ne - local.set 9 - local.get 1 - i32.const -1 + i32.const 2 + i32.shl + i32.const 65536 i32.add - local.tee 10 - local.get 1 - i32.gt_u - local.set 11 - local.get 2 - i32.load - local.set 0 - loop ;; label = @1 - block ;; label = @2 - local.get 0 - i32.eqz - br_if 0 (;@2;) - local.get 0 - local.set 1 + i32.load) + (func (;17;) (type 2) (param i32) (result i32) + (local i32 i32 i32 i32 i32 i64) + global.get 0 + i32.const 48 + i32.sub + local.tee 1 + global.set 0 + block ;; label = @1 + block (result i32) ;; label = @2 block ;; label = @3 - loop ;; label = @4 - block ;; label = @5 + block ;; label = @4 + local.get 0 + if ;; label = @5 + local.get 1 + i32.const 16384 + i32.store offset=12 + local.get 1 + i32.const 65572 + i32.store offset=8 local.get 1 - i32.load offset=8 - local.tee 0 + i32.const 8 + i32.add + call 20 + local.get 1 + local.get 1 + i64.load offset=8 + i64.store offset=16 + i32.const 1 + local.set 3 + local.get 1 + i32.const 16 + i32.add + call 12 + local.tee 6 + i32.wrap_i64 + local.tee 5 i32.const 1 i32.and - i32.eqz if ;; label = @6 - local.get 9 - br_if 1 (;@5;) - local.get 1 - i32.load - i32.const -4 - i32.and - local.tee 3 - local.get 1 - i32.sub - i32.const -8 - i32.add - local.tee 5 - local.get 3 - i32.gt_u - br_if 1 (;@5;) + i32.const 1 + local.set 2 + br 3 (;@3;) + end + local.get 6 + i64.const 1099511627775 + i64.and + local.tee 6 + i64.const 32 + i64.shr_u + i32.wrap_i64 + local.set 0 + local.get 6 + i64.const 24 + i64.shr_u + i32.wrap_i64 + local.set 4 + local.get 6 + i64.const 16 + i64.shr_u + i32.wrap_i64 + local.set 2 + local.get 5 + i32.const 8 + i32.shr_u + i32.const 255 + i32.and + local.tee 5 + i32.const 30 + i32.ne + if ;; label = @6 local.get 5 - local.get 6 - i32.lt_u - br_if 3 (;@3;) - local.get 1 - i32.load - i32.const -4 + i32.const 192 + i32.ne + local.get 0 + i32.const 243 + i32.ne + i32.or + local.get 2 + i32.const 255 i32.and - local.tee 3 - local.get 6 - i32.sub - local.tee 12 - local.get 3 - i32.gt_u - local.get 11 + i32.const 150 + i32.ne i32.or - br_if 1 (;@5;) - local.get 1 - i32.const 8 - i32.add - local.tee 5 - i32.const 8 - i32.add - local.tee 4 - local.get 5 - i32.lt_u - br_if 1 (;@5;) - local.get 4 - i32.const -64 - i32.sub - local.tee 13 + br_if 2 (;@4;) + i32.const 0 + local.set 2 local.get 4 - i32.lt_u - br_if 1 (;@5;) + i32.const 255 + i32.and + i32.const 165 + i32.eq + br_if 3 (;@3;) + br 2 (;@4;) + end + local.get 0 + i32.const 86 + i32.ne + local.get 2 + i32.const 255 + i32.and + i32.const 92 + i32.ne + i32.or + br_if 1 (;@4;) + i32.const 0 + local.set 2 + i32.const 0 + local.set 3 + local.get 4 + i32.const 255 + i32.and + i32.const 164 + i32.ne + br_if 1 (;@4;) + br 2 (;@3;) + end + local.get 1 + i32.const 16384 + i32.store offset=12 + local.get 1 + i32.const 65572 + i32.store offset=8 + local.get 1 + i32.const 8 + i32.add + call 20 + local.get 1 + local.get 1 + i64.load offset=8 + i64.store offset=16 + i32.const 3 + local.set 2 + block ;; label = @5 + local.get 1 + i32.const 16 + i32.add + call 12 + local.tee 6 + i32.wrap_i64 + local.tee 4 + i32.const 1 + i32.and + br_if 0 (;@5;) + local.get 6 + i64.const 1099511627775 + i64.and + local.tee 6 + i64.const 32 + i64.shr_u + i32.wrap_i64 + local.set 0 + local.get 6 + i64.const 24 + i64.shr_u + i32.wrap_i64 + local.set 3 + local.get 6 + i64.const 16 + i64.shr_u + i32.wrap_i64 + local.set 2 + block ;; label = @6 block ;; label = @7 - local.get 13 - local.get 8 - local.get 12 + local.get 4 + i32.const 8 + i32.shr_u + i32.const 255 i32.and local.tee 4 - i32.gt_u + i32.const 106 + i32.ne if ;; label = @8 - local.get 5 - local.get 10 - i32.and - br_if 5 (;@3;) - local.get 2 + local.get 4 + i32.const 209 + i32.ne local.get 0 - i32.const -4 - i32.and - i32.store - local.get 1 - local.get 1 - i32.load - i32.const 1 + i32.const 43 + i32.ne i32.or - i32.store - local.get 1 - local.set 0 - br 1 (;@7;) - end - local.get 4 - i32.const -8 - i32.add - local.tee 0 - local.get 4 - i32.gt_u - br_if 2 (;@5;) - local.get 3 - local.get 0 - i32.sub - local.tee 2 - local.get 3 - i32.gt_u - local.get 2 - i32.const -8 - i32.add - local.get 2 - i32.gt_u - i32.or - br_if 2 (;@5;) - local.get 0 - i32.const 0 - i32.store offset=8 - local.get 0 - i64.const 0 - i64.store align=4 - local.get 0 - local.get 1 - i32.load - i32.const -4 - i32.and - i32.store - block ;; label = @8 - local.get 1 - i32.load - local.tee 2 - i32.const -4 - i32.and - local.tee 3 - i32.eqz - br_if 0 (;@8;) - i32.const 0 - local.get 3 - local.get 2 - i32.const 2 - i32.and - select - local.tee 2 - i32.eqz - br_if 0 (;@8;) - local.get 2 local.get 2 - i32.load offset=4 - i32.const 3 + i32.const 255 i32.and - local.get 0 + i32.const 131 + i32.ne i32.or - i32.store offset=4 + br_if 2 (;@6;) + local.get 3 + i32.const 255 + i32.and + i32.const 81 + i32.eq + br_if 1 (;@7;) + br 2 (;@6;) end local.get 0 - local.get 0 - i32.load offset=4 - i32.const 3 - i32.and - local.get 1 - i32.or - i32.store offset=4 - local.get 1 - local.get 1 - i32.load offset=8 - i32.const -2 - i32.and - i32.store offset=8 - local.get 1 - local.get 1 - i32.load - local.tee 2 - i32.const 3 + i32.const 226 + i32.ne + local.get 2 + i32.const 255 i32.and - local.get 0 + i32.const 55 + i32.ne i32.or - local.tee 3 - i32.store - local.get 2 + br_if 1 (;@6;) i32.const 2 + local.set 2 + local.get 3 + i32.const 255 i32.and - if ;; label = @8 - local.get 1 - local.get 3 - i32.const -3 - i32.and - i32.store - local.get 0 - local.get 0 - i32.load - i32.const 2 - i32.or - i32.store - end - local.get 0 - local.get 0 - i32.load - i32.const 1 - i32.or - i32.store + i32.const 18 + i32.ne + br_if 1 (;@6;) + br 2 (;@5;) end - local.get 0 - i32.const 8 - i32.add - local.set 7 - br 4 (;@2;) - end - local.get 1 - local.get 0 - i32.const -2 - i32.and - i32.store offset=8 - block (result i32) ;; label = @6 - i32.const 0 + i32.const 3 + local.set 2 local.get 1 - i32.load offset=4 - i32.const -4 + i32.const 16 + i32.add + call 8 + i32.const 255 i32.and local.tee 0 - i32.eqz - br_if 0 (;@6;) - drop - i32.const 0 - local.get 0 + i32.const 2 + i32.eq + br_if 1 (;@5;) local.get 0 - i32.load8_u - i32.const 1 - i32.and - select + i32.const 0 + i32.ne + local.set 2 + br 1 (;@5;) end - local.set 0 + i32.const 3 + local.set 2 + end + i32.const 6 + local.get 2 + i32.const 3 + i32.eq + local.tee 3 + br_if 2 (;@2;) + drop + i32.const 6 + local.get 2 + local.get 3 + select + local.tee 2 + i32.const 2 + i32.eq + if ;; label = @5 local.get 1 - call 79 + i32.const 40 + i32.add + i64.const 0 + i64.store local.get 1 - i32.load8_u - i32.const 2 - i32.and - if ;; label = @6 - local.get 0 - local.get 0 - i32.load - i32.const 2 - i32.or - i32.store - end - local.get 2 - local.get 0 - i32.store - local.get 0 - local.tee 1 - i32.load - i32.const -4 - i32.and - local.tee 0 + i32.const 32 + i32.add + i64.const 0 + i64.store local.get 1 - i32.sub - i32.const -8 + i32.const 24 i32.add - local.get 0 - i32.le_u - br_if 1 (;@4;) + i64.const 0 + i64.store + local.get 1 + i64.const 0 + i64.store offset=16 + i32.const 0 + local.get 1 + i32.const 16 + i32.add + call 9 + i32.const 8 + br 3 (;@2;) end + local.get 1 + i32.const 40 + i32.add + i64.const 0 + i64.store + local.get 1 + i32.const 32 + i32.add + i64.const 0 + i64.store + local.get 1 + i32.const 24 + i32.add + i64.const 0 + i64.store + local.get 1 + i64.const 0 + i64.store offset=16 + local.get 2 + i32.const 1 + i32.and + local.get 1 + i32.const 16 + i32.add + call 9 + i32.const 8 + br 2 (;@2;) end - unreachable + i32.const 1 + local.set 2 + i32.const 1 + local.set 3 end + i32.const 6 local.get 2 - local.get 0 - i32.store - br 1 (;@1;) + br_if 0 (;@2;) + drop + local.get 3 + i32.eqz + br_if 1 (;@1;) + local.get 1 + i32.const 40 + i32.add + i64.const 0 + i64.store + local.get 1 + i32.const 32 + i32.add + i64.const 0 + i64.store + local.get 1 + i32.const 24 + i32.add + i64.const 0 + i64.store + local.get 1 + i64.const 0 + i64.store offset=16 + local.get 1 + i32.const 16 + i32.add + call 5 + i32.const 1 + i32.xor + local.get 1 + i32.const 16 + i32.add + call 9 + i32.const 8 end + local.get 1 + i32.const 48 + i32.add + global.set 0 + return end - local.get 7) - (func (;79;) (type 2) (param i32) - (local i32 i32) - block ;; label = @1 + local.get 1 + i32.const 40 + i32.add + i64.const 0 + i64.store + local.get 1 + i32.const 32 + i32.add + i64.const 0 + i64.store + local.get 1 + i32.const 24 + i32.add + i64.const 0 + i64.store + local.get 1 + i64.const 0 + i64.store offset=16 + local.get 1 + local.get 1 + i32.const 16 + i32.add + call 5 + i32.store8 offset=8 + local.get 1 + i32.const 8 + i32.add + call 13 + unreachable) + (func (;18;) (type 4) (result i32) + (local i32 i32 i64 i64) + global.get 0 + i32.const 32 + i32.sub + local.tee 0 + global.set 0 + local.get 0 + i32.const 16384 + i32.store offset=4 + local.get 0 + i32.const 65572 + i32.store + local.get 0 + i32.const 16384 + i32.store offset=16 + i32.const 65572 + local.get 0 + i32.const 16 + i32.add + call 2 + local.get 0 + local.get 0 + i32.load offset=16 + call 7 + local.get 0 + local.get 0 + i64.load + i64.store offset=8 + local.get 0 + i32.const 24 + i32.add + local.tee 1 + i64.const 0 + i64.store + local.get 0 + i64.const 0 + i64.store offset=16 + block (result i32) ;; label = @1 + i32.const 1 local.get 0 - i32.load - local.tee 1 - i32.const -4 - i32.and - local.tee 2 - i32.eqz - br_if 0 (;@1;) - i32.const 0 - local.get 2 - local.get 1 - i32.const 2 - i32.and - select - local.tee 1 - i32.eqz + i32.const 8 + i32.add + local.get 0 + i32.const 16 + i32.add + i32.const 16 + call 19 br_if 0 (;@1;) + drop local.get 1 - local.get 1 - i32.load offset=4 - i32.const 3 - i32.and + i64.load + local.set 2 local.get 0 - i32.load offset=4 - i32.const -4 - i32.and - i32.or - i32.store offset=4 + i64.load offset=16 + local.set 3 + i32.const 0 end - local.get 0 - local.get 0 - i32.load offset=4 - local.tee 1 - i32.const -4 - i32.and - local.tee 2 - if (result i32) ;; label = @1 - local.get 2 - local.get 2 - i32.load - i32.const 3 - i32.and + local.get 2 + local.get 3 + i64.or + i64.eqz + i32.eqz + i32.or + i32.eqz + if ;; label = @1 + i32.const 1 + call 17 local.get 0 - i32.load - i32.const -4 + i32.const 32 + i32.add + global.set 0 + i32.const 255 i32.and - i32.or - i32.store + i32.const 2 + i32.shl + i32.const 65536 + i32.add + i32.load + return + end + unreachable) + (func (;19;) (type 5) (param i32 i32 i32) (result i32) + block ;; label = @1 local.get 0 i32.load offset=4 - else - local.get 1 - end - i32.const 3 - i32.and - i32.store offset=4 - local.get 0 - local.get 0 - i32.load - i32.const 3 - i32.and - i32.store) - (func (;80;) (type 0) (param i32 i32) - (local i32) - loop (result i32) ;; label = @1 - local.get 1 local.get 2 - i32.eq + i32.ge_u if (result i32) ;; label = @2 + local.get 1 local.get 0 - else + i32.load + local.get 2 + call 21 + local.get 0 + i32.load offset=4 + local.tee 1 + local.get 2 + i32.lt_u + br_if 1 (;@1;) + local.get 0 + local.get 1 + local.get 2 + i32.sub + i32.store offset=4 local.get 0 + local.get 0 + i32.load local.get 2 i32.add + i32.store i32.const 0 - i32.store8 - local.get 2 + else i32.const 1 - i32.add - local.set 2 - br 1 (;@1;) end + return end - drop) - (func (;81;) (type 4) (param i32 i32 i32) (result i32) + unreachable) + (func (;20;) (type 3) (param i32) + (local i32) + global.get 0 + i32.const 16 + i32.sub + local.tee 1 + global.set 0 + local.get 1 + local.get 0 + i32.load offset=4 + i32.store offset=12 + local.get 0 + i32.load + local.get 1 + i32.const 12 + i32.add + call 3 + local.get 0 + local.get 1 + i32.load offset=12 + call 7 + local.get 1 + i32.const 16 + i32.add + global.set 0) + (func (;21;) (type 1) (param i32 i32 i32) (local i32) loop (result i32) ;; label = @1 local.get 2 @@ -8458,67 +1114,9 @@ local.set 3 br 1 (;@1;) end - end) - (func (;82;) (type 1) (param i32 i32 i32) - block ;; label = @1 - local.get 1 - local.get 0 - i32.ge_u - if ;; label = @2 - loop ;; label = @3 - local.get 2 - i32.eqz - br_if 2 (;@1;) - local.get 0 - local.get 1 - i32.load8_u - i32.store8 - local.get 0 - i32.const 1 - i32.add - local.set 0 - local.get 1 - i32.const 1 - i32.add - local.set 1 - local.get 2 - i32.const -1 - i32.add - local.set 2 - br 0 (;@3;) - end - unreachable - end - local.get 1 - i32.const -1 - i32.add - local.set 1 - local.get 0 - i32.const -1 - i32.add - local.set 0 - loop ;; label = @2 - local.get 2 - i32.eqz - br_if 1 (;@1;) - local.get 0 - local.get 2 - i32.add - local.get 1 - local.get 2 - i32.add - i32.load8_u - i32.store8 - local.get 2 - i32.const -1 - i32.add - local.set 2 - br 0 (;@2;) - end - unreachable - end) - (table (;0;) 1 1 funcref) + end + drop) (global (;0;) (mut i32) (i32.const 65536)) - (export "deploy" (func 20)) - (export "call" (func 22)) - (data (;0;) (i32.const 65536) "\01\00\00\00\02\00\00\00\03\00\00\00\04\00\00\00\05\00\00\00\06\00\00\00\07\00\00\00\08\00\00\00\00\00\00\00Verifying key was malformed\01\00\00\00\00\c0\08\85\00\00\000D]\0b\17\00H\09\ba/b\f3\1e\8f\13\f5\00\f3\d9\22\1a;I\a1l\c0\05;\c6\ea\10\c5\17F:\ae\01Invalid curve id\00\01")) + (export "deploy" (func 16)) + (export "call" (func 18)) + (data (;0;) (i32.const 65536) "\01\00\00\00\02\00\00\00\03\00\00\00\04\00\00\00\05\00\00\00\06\00\00\00\07\00\00\00\08")) diff --git a/pallets/template/src/benchmarking.rs b/pallets/template/src/benchmarking.rs index 0648d447..faa4df7e 100644 --- a/pallets/template/src/benchmarking.rs +++ b/pallets/template/src/benchmarking.rs @@ -41,7 +41,7 @@ benchmarks! { T::Currency::make_free_balance_be(&caller, BalanceOf::::max_value()); // Put WASM module - let module = include_bytes!(concat!(env!("OUT_DIR"), "/groth16o.wasm")).to_vec(); + let module = include_bytes!(concat!(env!("OUT_DIR"), "/groth16.wasm")).to_vec(); let hash = T::Hashing::hash(&module); >::put_code(origin.clone().into(), module)?; @@ -59,7 +59,7 @@ benchmarks! { >::instantiate( origin.clone().into(), - endowment, // endowment + endowment.clone(), // endowment Weight::max_value(), // gas_limit hash.clone(), // code_hash [106, 55, 18, 226].to_vec(), // flip @@ -68,12 +68,7 @@ benchmarks! { // Calculate addr let addr = Contracts::::contract_address(&caller, &hash, &b"".to_vec()); - let result = >::call(origin.clone(), addr.clone(), hex::decode("4e1f2d81088501e60f6032ed7f170ba3481c5d99c0890554c808ad380a7c9aefc9e62eeecf0363ecef5e59ba8eaf6dd0af40e08d7cfd024314f90080a1461a207aa3098308149837bc6322a8f4b499671c507203e798f90a9aa8fafaebb806c8708c3207a93316008501ea7f398187aecf2721441218e54645b17acd35bdf65886255e772a58353ef2e25c92cf7f872bea5afca6081d03e6b115e74befd85720c241ee5ef038621a1cc72e329db9aebec0faf480e83cbd9e4b735650ab0cce2e321d64311bd34bca9e0200910a9094c864d37f890720969430f2682ccc76dc83f9234694590bd334b40dbfa7f28de40e914571d8ae2a88712844f86f0d6dd2f4875120f66304bfcedd55c9a805310155a5345ddc626cbb6fe5ce7026be174a08c798e4d1f1010f97138c30b10a0e23d3cde62852c7b2aabcd7603f87fc54cb0c2fcfa48a1a6e07ea917eec248284a1409dd21ae7bd64b862e7df91fd0af1f36857260a843ea18cd393172b91196ca17bc5f37efb126d585abfcf23b8438d72f90365c382b661256d7caa361d07000c06c5cc02155140b97283cc024daf57023a781a9115bb6e17350264f8b52784a6008921402af8c05dd39f4b789bd50435d2c5aefeb6dc9817af41f45779e3a2d80ab98ef923723b938566747c10a4a169ca5097c5d5073449c3d2e65e16291850a5721416e102df69729ffab67cf948ca51c4ac4c2b54c521552fd4a5a5462d6d3b77ba9932aba0fda8ea8da76e5b0b9166ba600f9c5cc5e442b64ed560c126f8b88e2761c0c6a17a4dcbc1a132a975683ed0b6018ac45d7f4942ad7831790e00408697568bc15871da494a2fe12199531130a8a5b96f07c69020dc01bf9f3ed043a6e1bd08f8d7826c7d5c0fc5c771195ab91bf6eeaa33cbd89cd7dce7930b383c2453d0cca5c227e1b97b1ae253e40cadf4468d6d86f0bf69a0b0bb55774219005b6d86316ea7c1dc4df3e3396a9f78aadf416d5af1619883f5dbbf0a39c6743b194e5adedda54d7cb3ae33e556602e19dd43a31bca7bdb15ad5245dc1ad0affb97edc8f35bb00d1c5b417a132d5be9b72a39870193b6a142198a888c0fe3760fdf1467c7208394270f2aff044c5c002d6cf189a28e34851dc434933e73e07482dad6c7ab931bfbdf29f5d51a6a866d028b91cd89abc9728cf2f8e139f612b5a248ca0758365d1d83c6bc299152b15a89b136e804ae71174d4f35970be570fd14000d06fcafa9753aee681f006d7bf6fc885dcc1a70c33bbfe92bb581ac51e1325b782b1128b1586767cb2ea27555e243abd213634b87418421a65002e06fd9347b23205761d7e35a2a83ffcd35b16b6bf23982700597f2ed9706ae5e039542e8eabd1800443cc8d6ffec17c44207dd41e8ab2f2f2c663f5ed9ab724321de43cbe2ea81908c13643c42a41be1adbc5076e4927b13046d3cdaf5ef775ee48d842599508178276cd41d30e289cbd1d2bb9f92f59b520138fef3e9529139f3961f40f6ea92113ed1701b0eb62a8b21b0852f5ae0d23b4d8cf7a02a69b04abbf0b9213cc1cd16b0afed74a09f1d965f72e0faaad60215c2788b9672a8f53fb90d44b47fb16e4f97f910226d8ad46ddc1dfa6eb4f709a3c95ccfa7f4cd1b9ea5f3cf3d10c5dd0200de094abc5e25fac259efcfd79a97401359069cde3b48eaa9d3a4d848959eb269d788a415d9c22fb418459474f1f0fc16f4572ace2876cf1170d400d1d12d588f816023602a077b8fa66293ac19c951b6c572fad4481fa576e362d9f3a0ffa0120004801d6c7850edbac8a5281ab93d2ed245d47b64f20c21950926d595624b488c291c")); - sp_std::if_std! { - println!("{:?}", result); - } - - }: call(origin, addr, &b"".to_vec()) + }: call(origin, addr, endowment, Weight::max_value(), vec![192, 150, 165, 243]) wasm_bls12_377_add { let caller: T::AccountId = whitelisted_caller(); diff --git a/pallets/template/src/lib.rs b/pallets/template/src/lib.rs index fd1507dc..e2d7119f 100644 --- a/pallets/template/src/lib.rs +++ b/pallets/template/src/lib.rs @@ -1,12 +1,10 @@ #![cfg_attr(not(feature = "std"), no_std)] -use contract::{CodeHash, Module as Contracts}; +use contract::{BalanceOf, CodeHash, Gas, Module as Contracts}; /// Edit this file to define custom logic or remove it if it is not needed. /// Learn more about FRAME and the core library of Substrate FRAME pallets: /// https://substrate.dev/docs/en/knowledgebase/runtime/frame -use frame_support::{ - decl_error, decl_event, decl_module, decl_storage, dispatch, traits::Get, weights::Weight, -}; +use frame_support::{decl_error, decl_event, decl_module, decl_storage, dispatch, traits::Get}; use sp_core::crypto::UncheckedFrom; use sp_runtime::traits::StaticLookup; use sp_std::vec::Vec; @@ -90,14 +88,16 @@ decl_module! { #[weight = 10_000 + T::DbWeight::get().writes(1)] pub fn call( origin, - addr: T::AccountId, + dest: ::Source, + value: BalanceOf, + gas: Gas, data: Vec, ) -> dispatch::DispatchResultWithPostInfo { >::call( origin, - T::Lookup::unlookup(addr), // contract address - 0u32.into(), // T::Currency::minimum_balance() * 100u32.into(), // value - Weight::max_value(), // gas_limit + dest, // contract address + value, // T::Currency::minimum_balance() * 100u32.into(), // value + gas, // gas_limit data // fn ) } diff --git a/pallets/template/src/mock.rs b/pallets/template/src/mock.rs index e4a0d617..5904e685 100644 --- a/pallets/template/src/mock.rs +++ b/pallets/template/src/mock.rs @@ -1,4 +1,4 @@ -use crate::{Config, Module}; +use crate::Config; use frame_support::{impl_outer_event, impl_outer_origin, parameter_types, weights::Weight}; use frame_system as system; use sp_runtime::{ @@ -123,15 +123,9 @@ impl contract::Config for Test { type ChainExtension = jupiter_chain_extension::JupiterExt; } -pub type Template = Module; pub type Contracts = contract::Module; pub const ALICE: AccountId32 = AccountId32::new([1u8; 32]); -pub const BOB: AccountId32 = AccountId32::new([2u8; 32]); -pub const CHARLIE: AccountId32 = AccountId32::new([3u8; 32]); -pub const DJANGO: AccountId32 = AccountId32::new([4u8; 32]); - -pub const GAS_LIMIT: contract::Gas = 10_000_000_000; pub struct ExtBuilder { existential_deposit: u64, @@ -145,13 +139,15 @@ impl Default for ExtBuilder { } impl ExtBuilder { + pub fn set_associated_consts(&self) { + EXISTENTIAL_DEPOSIT.with(|v| *v.borrow_mut() = self.existential_deposit); + } + pub fn existential_deposit(mut self, existential_deposit: u64) -> Self { self.existential_deposit = existential_deposit; self } - pub fn set_associated_consts(&self) { - EXISTENTIAL_DEPOSIT.with(|v| *v.borrow_mut() = self.existential_deposit); - } + pub fn build(self) -> sp_io::TestExternalities { self.set_associated_consts(); let mut t = frame_system::GenesisConfig::default() diff --git a/pallets/template/src/tests.rs b/pallets/template/src/tests.rs index acd74230..7b749aeb 100644 --- a/pallets/template/src/tests.rs +++ b/pallets/template/src/tests.rs @@ -1,38 +1,53 @@ #![cfg(test)] -use crate::{mock::*, Module, Weight}; -use contract::ConfigCache; -use frame_support::{assert_ok, traits::Currency}; +use crate::{mock::*, Module}; +use contract::{ConfigCache, Gas}; +use frame_support::{assert_ok, traits::Currency, weights::Weight}; use sp_runtime::traits::{Hash, Zero}; +const GAS_LIMIT: Gas = 10_000_000_000; + #[test] fn test_build() { - ExtBuilder::default().build().execute_with(|| { - let _ = crate::mock::Balances::deposit_creating(&ALICE, 100_000_000); - let module = include_bytes!(concat!(env!("OUT_DIR"), "/groth16.wasm")).to_vec(); - let hash = ::Hashing::hash(&module); - Contracts::put_code(Origin::signed(ALICE.clone()), module).unwrap(); + ExtBuilder::default() + .existential_deposit(50) + .build() + .execute_with(|| { + let _ = crate::mock::Balances::deposit_creating(&ALICE, 100_000_000); + let module = include_bytes!(concat!(env!("OUT_DIR"), "/groth16.wasm")).to_vec(); + let hash = ::Hashing::hash(&module); + Contracts::put_code(Origin::signed(ALICE.clone()), module).unwrap(); - let storage_size = ConfigCache::::subsistence_threshold_uncached() - .checked_div(::RentDepositOffset::get()) - .unwrap_or_else(Zero::zero); + let storage_size = ConfigCache::::subsistence_threshold_uncached() + .checked_div(::RentDepositOffset::get()) + .unwrap_or_else(Zero::zero); - // Endowment should be large but not as large to inhibit rent payments. - let endowment = ::RentDepositOffset::get() - .saturating_mul(storage_size + ::StorageSizeOffset::get() as u64) - .saturating_sub(1u32.into()); + // Endowment should be large but not as large to inhibit rent payments. + let endowment = ::RentDepositOffset::get() + .saturating_mul( + storage_size + ::StorageSizeOffset::get() as u64, + ) + .saturating_sub(1u32.into()); - Contracts::instantiate( - Origin::signed(ALICE.clone()), - endowment, // endowment - Weight::max_value(), // gas_limit - hash.clone(), // code_hash - [106, 55, 18, 226].to_vec(), // flip - b"".to_vec(), // salt - ) + Contracts::instantiate( + Origin::signed(ALICE.clone()), + endowment, // endowment + Weight::max_value(), // gas_limit + hash.clone(), // code_hash + [106, 55, 18, 226].to_vec(), // flip + b"".to_vec(), // salt + ) .unwrap(); - let addr = Contracts::contract_address(&ALICE, &hash, &b"".to_vec()); - let result = >::call(Origin::signed(ALICE), addr.clone(), hex::decode("4e1f2d81088501e60f6032ed7f170ba3481c5d99c0890554c808ad380a7c9aefc9e62eeecf0363ecef5e59ba8eaf6dd0af40e08d7cfd024314f90080a1461a207aa3098308149837bc6322a8f4b499671c507203e798f90a9aa8fafaebb806c8708c3207a93316008501ea7f398187aecf2721441218e54645b17acd35bdf65886255e772a58353ef2e25c92cf7f872bea5afca6081d03e6b115e74befd85720c241ee5ef038621a1cc72e329db9aebec0faf480e83cbd9e4b735650ab0cce2e321d64311bd34bca9e0200910a9094c864d37f890720969430f2682ccc76dc83f9234694590bd334b40dbfa7f28de40e914571d8ae2a88712844f86f0d6dd2f4875120f66304bfcedd55c9a805310155a5345ddc626cbb6fe5ce7026be174a08c798e4d1f1010f97138c30b10a0e23d3cde62852c7b2aabcd7603f87fc54cb0c2fcfa48a1a6e07ea917eec248284a1409dd21ae7bd64b862e7df91fd0af1f36857260a843ea18cd393172b91196ca17bc5f37efb126d585abfcf23b8438d72f90365c382b661256d7caa361d07000c06c5cc02155140b97283cc024daf57023a781a9115bb6e17350264f8b52784a6008921402af8c05dd39f4b789bd50435d2c5aefeb6dc9817af41f45779e3a2d80ab98ef923723b938566747c10a4a169ca5097c5d5073449c3d2e65e16291850a5721416e102df69729ffab67cf948ca51c4ac4c2b54c521552fd4a5a5462d6d3b77ba9932aba0fda8ea8da76e5b0b9166ba600f9c5cc5e442b64ed560c126f8b88e2761c0c6a17a4dcbc1a132a975683ed0b6018ac45d7f4942ad7831790e00408697568bc15871da494a2fe12199531130a8a5b96f07c69020dc01bf9f3ed043a6e1bd08f8d7826c7d5c0fc5c771195ab91bf6eeaa33cbd89cd7dce7930b383c2453d0cca5c227e1b97b1ae253e40cadf4468d6d86f0bf69a0b0bb55774219005b6d86316ea7c1dc4df3e3396a9f78aadf416d5af1619883f5dbbf0a39c6743b194e5adedda54d7cb3ae33e556602e19dd43a31bca7bdb15ad5245dc1ad0affb97edc8f35bb00d1c5b417a132d5be9b72a39870193b6a142198a888c0fe3760fdf1467c7208394270f2aff044c5c002d6cf189a28e34851dc434933e73e07482dad6c7ab931bfbdf29f5d51a6a866d028b91cd89abc9728cf2f8e139f612b5a248ca0758365d1d83c6bc299152b15a89b136e804ae71174d4f35970be570fd14000d06fcafa9753aee681f006d7bf6fc885dcc1a70c33bbfe92bb581ac51e1325b782b1128b1586767cb2ea27555e243abd213634b87418421a65002e06fd9347b23205761d7e35a2a83ffcd35b16b6bf23982700597f2ed9706ae5e039542e8eabd1800443cc8d6ffec17c44207dd41e8ab2f2f2c663f5ed9ab724321de43cbe2ea81908c13643c42a41be1adbc5076e4927b13046d3cdaf5ef775ee48d842599508178276cd41d30e289cbd1d2bb9f92f59b520138fef3e9529139f3961f40f6ea92113ed1701b0eb62a8b21b0852f5ae0d23b4d8cf7a02a69b04abbf0b9213cc1cd16b0afed74a09f1d965f72e0faaad60215c2788b9672a8f53fb90d44b47fb16e4f97f910226d8ad46ddc1dfa6eb4f709a3c95ccfa7f4cd1b9ea5f3cf3d10c5dd0200de094abc5e25fac259efcfd79a97401359069cde3b48eaa9d3a4d848959eb269d788a415d9c22fb418459474f1f0fc16f4572ace2876cf1170d400d1d12d588f816023602a077b8fa66293ac19c951b6c572fad4481fa576e362d9f3a0ffa0120004801d6c7850edbac8a5281ab93d2ed245d47b64f20c21950926d595624b488c291c").expect("Decode failed")); - }); + let addr = Contracts::contract_address(&ALICE, &hash, &b"".to_vec()); + // let result = >::call(Origin::signed(ALICE), addr.clone(), hex::decode("4e1f2d81088501e60f6032ed7f170ba3481c5d99c0890554c808ad380a7c9aefc9e62eeecf0363ecef5e59ba8eaf6dd0af40e08d7cfd024314f90080a1461a207aa3098308149837bc6322a8f4b499671c507203e798f90a9aa8fafaebb806c8708c3207a93316008501ea7f398187aecf2721441218e54645b17acd35bdf65886255e772a58353ef2e25c92cf7f872bea5afca6081d03e6b115e74befd85720c241ee5ef038621a1cc72e329db9aebec0faf480e83cbd9e4b735650ab0cce2e321d64311bd34bca9e0200910a9094c864d37f890720969430f2682ccc76dc83f9234694590bd334b40dbfa7f28de40e914571d8ae2a88712844f86f0d6dd2f4875120f66304bfcedd55c9a805310155a5345ddc626cbb6fe5ce7026be174a08c798e4d1f1010f97138c30b10a0e23d3cde62852c7b2aabcd7603f87fc54cb0c2fcfa48a1a6e07ea917eec248284a1409dd21ae7bd64b862e7df91fd0af1f36857260a843ea18cd393172b91196ca17bc5f37efb126d585abfcf23b8438d72f90365c382b661256d7caa361d07000c06c5cc02155140b97283cc024daf57023a781a9115bb6e17350264f8b52784a6008921402af8c05dd39f4b789bd50435d2c5aefeb6dc9817af41f45779e3a2d80ab98ef923723b938566747c10a4a169ca5097c5d5073449c3d2e65e16291850a5721416e102df69729ffab67cf948ca51c4ac4c2b54c521552fd4a5a5462d6d3b77ba9932aba0fda8ea8da76e5b0b9166ba600f9c5cc5e442b64ed560c126f8b88e2761c0c6a17a4dcbc1a132a975683ed0b6018ac45d7f4942ad7831790e00408697568bc15871da494a2fe12199531130a8a5b96f07c69020dc01bf9f3ed043a6e1bd08f8d7826c7d5c0fc5c771195ab91bf6eeaa33cbd89cd7dce7930b383c2453d0cca5c227e1b97b1ae253e40cadf4468d6d86f0bf69a0b0bb55774219005b6d86316ea7c1dc4df3e3396a9f78aadf416d5af1619883f5dbbf0a39c6743b194e5adedda54d7cb3ae33e556602e19dd43a31bca7bdb15ad5245dc1ad0affb97edc8f35bb00d1c5b417a132d5be9b72a39870193b6a142198a888c0fe3760fdf1467c7208394270f2aff044c5c002d6cf189a28e34851dc434933e73e07482dad6c7ab931bfbdf29f5d51a6a866d028b91cd89abc9728cf2f8e139f612b5a248ca0758365d1d83c6bc299152b15a89b136e804ae71174d4f35970be570fd14000d06fcafa9753aee681f006d7bf6fc885dcc1a70c33bbfe92bb581ac51e1325b782b1128b1586767cb2ea27555e243abd213634b87418421a65002e06fd9347b23205761d7e35a2a83ffcd35b16b6bf23982700597f2ed9706ae5e039542e8eabd1800443cc8d6ffec17c44207dd41e8ab2f2f2c663f5ed9ab724321de43cbe2ea81908c13643c42a41be1adbc5076e4927b13046d3cdaf5ef775ee48d842599508178276cd41d30e289cbd1d2bb9f92f59b520138fef3e9529139f3961f40f6ea92113ed1701b0eb62a8b21b0852f5ae0d23b4d8cf7a02a69b04abbf0b9213cc1cd16b0afed74a09f1d965f72e0faaad60215c2788b9672a8f53fb90d44b47fb16e4f97f910226d8ad46ddc1dfa6eb4f709a3c95ccfa7f4cd1b9ea5f3cf3d10c5dd0200de094abc5e25fac259efcfd79a97401359069cde3b48eaa9d3a4d848959eb269d788a415d9c22fb418459474f1f0fc16f4572ace2876cf1170d400d1d12d588f816023602a077b8fa66293ac19c951b6c572fad4481fa576e362d9f3a0ffa0120004801d6c7850edbac8a5281ab93d2ed245d47b64f20c21950926d595624b488c291c").expect("Decode failed")); + let result = >::call( + Origin::signed(ALICE), + addr, + 0, + GAS_LIMIT, + vec![192, 150, 165, 243], + ) + .expect("call contract failed"); + }); } #[test] diff --git a/primitives/chain-extension/Cargo.toml b/primitives/chain-extension/Cargo.toml index 19a9971c..42c28084 100644 --- a/primitives/chain-extension/Cargo.toml +++ b/primitives/chain-extension/Cargo.toml @@ -15,6 +15,7 @@ sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", d [dependencies.curve] git = "https://github.com/patractlabs/megaclite.git" package = "megaclite-arkworks" +default-features = false [features] default = ["std"] diff --git a/primitives/chain-extension/src/lib.rs b/primitives/chain-extension/src/lib.rs index 682f3c04..e129060d 100644 --- a/primitives/chain-extension/src/lib.rs +++ b/primitives/chain-extension/src/lib.rs @@ -17,13 +17,21 @@ impl ChainExtension for JupiterExt { where ::AccountId: UncheckedFrom<::Hash> + AsRef<[u8]>, { - env.charge_weight(1_000_000_000_u64)?; + sp_std::if_std! {} + // env.charge_weight(1_000_000_000_u64)?; let mut env = env.buf_in_buf_out(); let input: Vec = env.read_as()?; - let output = curve::call(func_id, &input) - .map_err(|_| DispatchError::Other("Call chain extension failed"))?; + sp_std::if_std! { + println!("fn_id: {}, input_len: {:?}", func_id, input.len()); + } + let output = curve::call(func_id, &input).map_err(|e| { + sp_std::if_std! { + println!("{:?}", e); + } + DispatchError::Other("Call chain extension failed") + })?; env.write(&output, false, None)?; - Ok(RetVal::Converging(0)) + Ok(RetVal::Converging(func_id)) } fn enabled() -> bool { diff --git a/primitives/io/Cargo.toml b/primitives/io/Cargo.toml index 59f342a4..bf85e657 100644 --- a/primitives/io/Cargo.toml +++ b/primitives/io/Cargo.toml @@ -12,11 +12,10 @@ sp-runtime-interface = { git = "https://github.com/paritytech/substrate.git", br sp-std = { git = "https://github.com/paritytech/substrate.git", branch = "master", default-features = false } [dependencies.curve] -# git = "https://github.com/patractlabs/megaclite.git" -path = "/Users/mercury/code/megaclite/crates/curve/arkworks" +git = "https://github.com/patractlabs/megaclite.git" package = "megaclite-arkworks" -default-features = false features = [ "tests" ] +default-features = false [dependencies.num-bigint] version = "0.3.1" diff --git a/runtime/jupiter/Cargo.toml b/runtime/jupiter/Cargo.toml index 52251735..5d944a79 100644 --- a/runtime/jupiter/Cargo.toml +++ b/runtime/jupiter/Cargo.toml @@ -60,13 +60,15 @@ pallet-timestamp = { version = "2.0.0", git = "https://github.com/paritytech/sub pallet-utility = { version = "2.0.0", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } # vendor modules -pallet-contracts = { version = "2.0.0", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +# pallet-contracts = { version = "2.0.0", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-contracts = { path = "../../vendor/substrate/frame/contracts", default-features = false } pallet-contracts-primitives = { version = "2.0.0", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-contracts-rpc-runtime-api = { version = "0.8.0", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } # local runtime module jupiter-primitives = { path = "../../primitives", default-features = false } jupiter-runtime-common = { path = "../common", default-features = false } +jupiter-chain-extension = { path = "../../primitives/chain-extension", default-features = false } [build-dependencies] substrate-wasm-builder = { version = "3.0.0", git = "https://github.com/paritytech/substrate", branch = "master" } @@ -127,4 +129,5 @@ std = [ "jupiter-primitives/std", "jupiter-runtime-common/std", + "jupiter-chain-extension/std", ] diff --git a/runtime/jupiter/src/lib.rs b/runtime/jupiter/src/lib.rs index 729b405f..6c217288 100644 --- a/runtime/jupiter/src/lib.rs +++ b/runtime/jupiter/src/lib.rs @@ -733,6 +733,7 @@ impl pallet_contracts::Config for Runtime { type MaxValueSize = MaxValueSize; type WeightPrice = pallet_transaction_payment::Module; type WeightInfo = pallet_contracts::weights::SubstrateWeight; + type ChainExtension = jupiter_chain_extension::JupiterExt; } impl pallet_utility::Config for Runtime { From 940721ef9f46d25bfa060df3821d38552bda4cb0 Mon Sep 17 00:00:00 2001 From: clearloop Date: Sun, 20 Dec 2020 12:34:12 +0800 Subject: [PATCH 27/33] feat(dep): update megaclite --- Cargo.lock | 4 ++++ pallets/template/src/lib.rs | 6 +++--- primitives/chain-extension/Cargo.toml | 1 + primitives/chain-extension/src/lib.rs | 27 +++++++++++---------------- primitives/io/src/lib.rs | 10 ---------- 5 files changed, 19 insertions(+), 29 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9047fb4c..8f51a126 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2692,6 +2692,7 @@ dependencies = [ "jupiter-io", "megaclite-arkworks", "pallet-contracts", + "parity-scale-codec", "sp-runtime", "sp-std", ] @@ -3647,6 +3648,7 @@ checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" [[package]] name = "megaclite-arkworks" version = "0.1.0" +source = "git+https://github.com/patractlabs/megaclite.git#40b05c1dee61e1dc77b785e8d12914a9eb7db272" dependencies = [ "ark-bls12-377", "ark-bls12-381", @@ -3659,7 +3661,9 @@ dependencies = [ "ark-relations", "ark-serialize", "ark-std", + "cfg-if 1.0.0", "num-bigint 0.3.1", + "parity-scale-codec", "rand 0.7.3", "rustc-hex", ] diff --git a/pallets/template/src/lib.rs b/pallets/template/src/lib.rs index e2d7119f..98fcfe96 100644 --- a/pallets/template/src/lib.rs +++ b/pallets/template/src/lib.rs @@ -95,10 +95,10 @@ decl_module! { ) -> dispatch::DispatchResultWithPostInfo { >::call( origin, - dest, // contract address + dest, // contract address value, // T::Currency::minimum_balance() * 100u32.into(), // value - gas, // gas_limit - data // fn + gas, // gas_limit + data // fn ) } diff --git a/primitives/chain-extension/Cargo.toml b/primitives/chain-extension/Cargo.toml index 42c28084..d229270a 100644 --- a/primitives/chain-extension/Cargo.toml +++ b/primitives/chain-extension/Cargo.toml @@ -11,6 +11,7 @@ jupiter-io = { path = "../io", default-features = false } pallet-contracts = { path = "../../vendor/substrate/frame/contracts", default-features = false } sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +parity-scale-codec = { version = "1.3.5", features = ["derive"], default-features = false } [dependencies.curve] git = "https://github.com/patractlabs/megaclite.git" diff --git a/primitives/chain-extension/src/lib.rs b/primitives/chain-extension/src/lib.rs index e129060d..feeef9e9 100644 --- a/primitives/chain-extension/src/lib.rs +++ b/primitives/chain-extension/src/lib.rs @@ -3,6 +3,7 @@ use pallet_contracts::chain_extension::{ ChainExtension, Environment, Ext, InitState, RetVal, SysConfig, UncheckedFrom, }; +use parity_scale_codec::Encode; use sp_runtime::DispatchError; use sp_std::vec::Vec; @@ -10,28 +11,22 @@ use sp_std::vec::Vec; pub struct JupiterExt; impl ChainExtension for JupiterExt { - fn call( - func_id: u32, - mut env: Environment, - ) -> Result + fn call(func_id: u32, env: Environment) -> Result where ::AccountId: UncheckedFrom<::Hash> + AsRef<[u8]>, { - sp_std::if_std! {} - // env.charge_weight(1_000_000_000_u64)?; let mut env = env.buf_in_buf_out(); + env.charge_weight(1_000_000_000_u64)?; + + // The memory of the vm stores buf in scale-codec let input: Vec = env.read_as()?; - sp_std::if_std! { - println!("fn_id: {}, input_len: {:?}", func_id, input.len()); - } - let output = curve::call(func_id, &input).map_err(|e| { - sp_std::if_std! { - println!("{:?}", e); - } - DispatchError::Other("Call chain extension failed") - })?; + let raw_output: Vec = curve::call(func_id, &input) + .map_err(|_| DispatchError::Other("Call chain extension failed"))?; + + // Encode back to the memory + let output: Vec = raw_output.encode(); env.write(&output, false, None)?; - Ok(RetVal::Converging(func_id)) + Ok(RetVal::Converging(0)) } fn enabled() -> bool { diff --git a/primitives/io/src/lib.rs b/primitives/io/src/lib.rs index 5804403b..3b037f9a 100644 --- a/primitives/io/src/lib.rs +++ b/primitives/io/src/lib.rs @@ -19,16 +19,6 @@ pub trait Pairing { false } - /// Curve calls - /// - /// add 0x2a - /// mul 0x3a - /// pairing 0x4a - /// - /// bls12_377 0 - /// bls12_181 1 - /// bn254 2 - /// bw6_761 3 fn call(func_id: u32, input: &[u8]) -> Option> { curve::call(func_id, input).ok() } From 41ea20131d7722b42afdd48c6c6bf905fe993577 Mon Sep 17 00:00:00 2001 From: Aten Date: Sun, 20 Dec 2020 15:50:14 +0800 Subject: [PATCH 28/33] change balance from u128 to u64 in template test and provide wasm file --- .gitignore | 5 +- Cargo.lock | 1 - pallets/template/Cargo.toml | 3 - pallets/template/build.rs | 18 - pallets/template/groth16.wat | 1122 ----------------------------- pallets/template/res/groth16.wasm | Bin 0 -> 60685 bytes pallets/template/src/mock.rs | 25 +- pallets/template/src/tests.rs | 18 +- 8 files changed, 28 insertions(+), 1164 deletions(-) delete mode 100644 pallets/template/build.rs delete mode 100644 pallets/template/groth16.wat create mode 100644 pallets/template/res/groth16.wasm diff --git a/.gitignore b/.gitignore index d1d65c2e..47d386fd 100644 --- a/.gitignore +++ b/.gitignore @@ -15,4 +15,7 @@ .vs/ .idea/ .sub/ -log/ \ No newline at end of file +log/ + +# need to inclue wasm src file +!/pallets/template/res/* diff --git a/Cargo.lock b/Cargo.lock index 8f51a126..4ea55d20 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4528,7 +4528,6 @@ dependencies = [ "sp-io", "sp-runtime", "sp-std", - "wat", ] [[package]] diff --git a/pallets/template/Cargo.toml b/pallets/template/Cargo.toml index 0c5b27ec..bf885413 100644 --- a/pallets/template/Cargo.toml +++ b/pallets/template/Cargo.toml @@ -49,9 +49,6 @@ pallet-transaction-payment = { git = "https://github.com/paritytech/substrate", jupiter-runtime-common = { path = "../../runtime/common" } jupiter-chain-extension = { path = "../../primitives/chain-extension" } -[build-dependencies] -wat = "1.0" - [features] default = ['std'] std = [ diff --git a/pallets/template/build.rs b/pallets/template/build.rs deleted file mode 100644 index 9cc5f221..00000000 --- a/pallets/template/build.rs +++ /dev/null @@ -1,18 +0,0 @@ -//! Use *.wat file for human readable -use std::{ - env, fs, - io::{Error, Result}, - path::Path, -}; - -fn main() -> Result<()> { - println!("cargo:rerun-if-changed=./groth16.wat"); - let out_dir = env::var_os("OUT_DIR").unwrap(); - let dest_path = Path::new(&out_dir).join("groth16.wasm"); - fs::write( - &dest_path, - wat::parse_file("groth16.wat").map_err(|_| Error::last_os_error())?, - )?; - println!("cargo:rerun-if-changed=build.rs"); - Ok(()) -} diff --git a/pallets/template/groth16.wat b/pallets/template/groth16.wat deleted file mode 100644 index 414612ce..00000000 --- a/pallets/template/groth16.wat +++ /dev/null @@ -1,1122 +0,0 @@ -(module - (type (;0;) (func (param i32 i32))) - (type (;1;) (func (param i32 i32 i32))) - (type (;2;) (func (param i32) (result i32))) - (type (;3;) (func (param i32))) - (type (;4;) (func (result i32))) - (type (;5;) (func (param i32 i32 i32) (result i32))) - (type (;6;) (func (param i32 i32 i32 i32))) - (type (;7;) (func (param i32) (result i64))) - (import "seal0" "seal_get_storage" (func (;0;) (type 5))) - (import "seal0" "seal_set_storage" (func (;1;) (type 1))) - (import "seal0" "seal_value_transferred" (func (;2;) (type 0))) - (import "seal0" "seal_input" (func (;3;) (type 0))) - (import "seal0" "seal_return" (func (;4;) (type 1))) - (import "env" "memory" (memory (;0;) 2 16)) - (func (;5;) (type 2) (param i32) (result i32) - (local i32) - global.get 0 - i32.const -64 - i32.add - local.tee 1 - global.set 0 - local.get 1 - i32.const 32 - i32.add - local.get 0 - i32.const 24 - i32.add - i64.load - i64.store - local.get 1 - i32.const 24 - i32.add - local.get 0 - i32.const 16 - i32.add - i64.load - i64.store - local.get 1 - i32.const 16 - i32.add - local.get 0 - i32.const 8 - i32.add - i64.load - i64.store - local.get 1 - i64.const 0 - i64.store offset=40 - local.get 1 - local.get 0 - i64.load - i64.store offset=8 - local.get 1 - i32.const 8 - i32.add - call 6 - local.get 1 - i32.const 16384 - i32.store offset=52 - local.get 1 - i32.const 65572 - i32.store offset=48 - local.get 1 - i32.const 16384 - i32.store offset=56 - i32.const 65572 - local.get 1 - i32.const 56 - i32.add - call 0 - local.set 0 - local.get 1 - i32.const 48 - i32.add - local.get 1 - i32.load offset=56 - call 7 - block ;; label = @1 - block ;; label = @2 - block ;; label = @3 - block ;; label = @4 - local.get 0 - br_table 1 (;@3;) 0 (;@4;) 0 (;@4;) 2 (;@2;) 0 (;@4;) - end - unreachable - end - local.get 1 - local.get 1 - i64.load offset=48 - i64.store offset=56 - local.get 1 - i32.const 56 - i32.add - call 8 - i32.const 255 - i32.and - local.tee 0 - i32.const 2 - i32.ne - br_if 1 (;@1;) - unreachable - end - unreachable - end - local.get 1 - i32.const -64 - i32.sub - global.set 0 - local.get 0 - i32.const 0 - i32.ne) - (func (;6;) (type 2) (param i32) (result i32) - (local i64 i64 i64) - local.get 0 - i64.load offset=32 - local.set 1 - local.get 0 - i64.const 1 - i64.store offset=32 - local.get 0 - local.get 1 - local.get 0 - i64.load - local.tee 2 - i64.add - local.tee 1 - i64.store - local.get 0 - local.get 0 - i64.load offset=8 - local.tee 3 - local.get 1 - local.get 2 - i64.lt_u - i64.extend_i32_u - i64.add - local.tee 1 - i64.store offset=8 - local.get 0 - local.get 0 - i64.load offset=16 - local.tee 2 - local.get 1 - local.get 3 - i64.lt_u - i64.extend_i32_u - i64.add - local.tee 1 - i64.store offset=16 - local.get 0 - local.get 0 - i64.load offset=24 - local.get 1 - local.get 2 - i64.lt_u - i64.extend_i32_u - i64.add - i64.store offset=24 - local.get 0) - (func (;7;) (type 0) (param i32 i32) - (local i32 i32 i32) - global.get 0 - i32.const 16 - i32.sub - local.tee 2 - global.set 0 - local.get 0 - i32.load offset=4 - local.set 3 - local.get 0 - i32.const 0 - i32.store offset=4 - local.get 0 - i32.load - local.set 4 - local.get 0 - i32.const 65572 - i32.store - local.get 2 - i32.const 8 - i32.add - local.get 1 - local.get 4 - local.get 3 - call 15 - local.get 0 - local.get 2 - i64.load offset=8 - i64.store align=4 - local.get 2 - i32.const 16 - i32.add - global.set 0) - (func (;8;) (type 2) (param i32) (result i32) - (local i32 i32) - global.get 0 - i32.const 16 - i32.sub - local.tee 1 - global.set 0 - local.get 1 - i32.const 8 - i32.add - local.get 0 - call 11 - local.get 1 - i32.load8_u offset=9 - local.set 0 - local.get 1 - i32.load8_u offset=8 - local.set 2 - local.get 1 - i32.const 16 - i32.add - global.set 0 - i32.const 2 - i32.const 1 - i32.const 2 - local.get 0 - i32.const 1 - i32.eq - select - i32.const 0 - local.get 0 - select - local.get 2 - i32.const 1 - i32.and - select) - (func (;9;) (type 0) (param i32 i32) - (local i32) - global.get 0 - i32.const -64 - i32.add - local.tee 2 - global.set 0 - local.get 2 - i32.const 32 - i32.add - local.get 1 - i32.const 24 - i32.add - i64.load - i64.store - local.get 2 - i32.const 24 - i32.add - local.get 1 - i32.const 16 - i32.add - i64.load - i64.store - local.get 2 - i32.const 16 - i32.add - local.get 1 - i32.const 8 - i32.add - i64.load - i64.store - local.get 2 - i64.const 0 - i64.store offset=40 - local.get 2 - local.get 1 - i64.load - i64.store offset=8 - local.get 2 - i32.const 8 - i32.add - call 6 - local.get 2 - i32.const 56 - i32.add - i32.const 16384 - i32.store - local.get 2 - i32.const 65572 - i32.store offset=52 - local.get 2 - i32.const 0 - i32.store offset=48 - local.get 2 - local.get 2 - i32.const 48 - i32.add - local.get 0 - call 10 - local.get 2 - i32.load - local.get 2 - i32.load offset=4 - call 1 - local.get 2 - i32.const -64 - i32.sub - global.set 0) - (func (;10;) (type 1) (param i32 i32 i32) - (local i32 i32 i32) - global.get 0 - i32.const 16 - i32.sub - local.tee 3 - global.set 0 - local.get 1 - i32.const 8 - i32.add - local.tee 4 - i32.load - local.set 5 - local.get 4 - i32.const 0 - i32.store - local.get 1 - i32.load offset=4 - local.set 4 - local.get 1 - i32.const 65572 - i32.store offset=4 - local.get 3 - local.get 2 - i32.store8 offset=15 - local.get 3 - i32.const 1 - local.get 4 - local.get 5 - call 15 - block ;; label = @1 - local.get 3 - i32.load offset=4 - i32.const 1 - i32.eq - if ;; label = @2 - local.get 3 - i32.load - local.get 3 - i32.load8_u offset=15 - i32.store8 - local.get 1 - i32.const 0 - i32.store offset=8 - local.get 1 - i32.const 65572 - i32.store offset=4 - local.get 5 - i32.eqz - br_if 1 (;@1;) - local.get 1 - local.get 5 - i32.const -1 - i32.add - i32.store offset=8 - local.get 1 - local.get 4 - i32.const 1 - i32.add - i32.store offset=4 - local.get 0 - i32.const 1 - i32.store offset=4 - local.get 0 - local.get 4 - i32.store - local.get 3 - i32.const 16 - i32.add - global.set 0 - return - end - unreachable - end - unreachable) - (func (;11;) (type 0) (param i32 i32) - (local i32 i32) - global.get 0 - i32.const 16 - i32.sub - local.tee 2 - global.set 0 - local.get 2 - i32.const 0 - i32.store8 offset=15 - block ;; label = @1 - local.get 1 - local.get 2 - i32.const 15 - i32.add - i32.const 1 - call 19 - i32.eqz - if ;; label = @2 - local.get 2 - i32.load8_u offset=15 - local.set 1 - br 1 (;@1;) - end - i32.const 1 - local.set 3 - end - local.get 0 - local.get 1 - i32.store8 offset=1 - local.get 0 - local.get 3 - i32.store8 - local.get 2 - i32.const 16 - i32.add - global.set 0) - (func (;12;) (type 7) (param i32) (result i64) - (local i32 i32) - global.get 0 - i32.const 16 - i32.sub - local.tee 1 - global.set 0 - local.get 1 - i64.const 0 - i64.store8 offset=12 - local.get 1 - i64.const 0 - i64.store32 offset=8 - block (result i32) ;; label = @1 - loop ;; label = @2 - local.get 2 - i32.const 4 - i32.eq - if ;; label = @3 - local.get 1 - i64.load8_u offset=12 - i32.wrap_i64 - i32.const 4 - i32.lt_u - local.set 2 - local.get 1 - i32.load offset=8 - br 2 (;@1;) - end - local.get 1 - local.get 0 - call 11 - local.get 1 - i32.load8_u - i32.const 1 - i32.and - i32.eqz - if ;; label = @3 - local.get 1 - i32.const 8 - i32.add - local.get 2 - i32.add - local.get 1 - i32.load8_u offset=1 - i32.store8 - local.get 1 - local.get 2 - i32.const 1 - i32.add - local.tee 2 - i32.store8 offset=12 - br 1 (;@2;) - end - end - local.get 2 - i32.const 255 - i32.and - if ;; label = @2 - local.get 1 - i32.const 0 - i32.store8 offset=12 - end - i32.const 1 - local.set 2 - i32.const 0 - end - local.set 0 - local.get 1 - i32.const 16 - i32.add - global.set 0 - local.get 2 - i64.extend_i32_u - local.get 0 - i64.extend_i32_u - i64.const 8 - i64.shl - i64.or) - (func (;13;) (type 3) (param i32) - (local i32) - global.get 0 - i32.const 16 - i32.sub - local.tee 1 - global.set 0 - local.get 1 - local.get 0 - i32.store offset=12 - local.get 1 - i32.const 12 - i32.add - i32.load - i32.load8_u - call 14 - unreachable) - (func (;14;) (type 3) (param i32) - (local i32) - global.get 0 - i32.const 32 - i32.sub - local.tee 1 - global.set 0 - local.get 1 - i32.const 24 - i32.add - i32.const 16384 - i32.store - local.get 1 - i32.const 65572 - i32.store offset=20 - local.get 1 - i32.const 0 - i32.store offset=16 - local.get 1 - i32.const 8 - i32.add - local.get 1 - i32.const 16 - i32.add - local.get 0 - call 10 - i32.const 0 - local.get 1 - i32.load offset=8 - local.get 1 - i32.load offset=12 - call 4 - unreachable) - (func (;15;) (type 6) (param i32 i32 i32 i32) - i32.const 0 - local.get 1 - i32.le_u - if ;; label = @1 - local.get 3 - local.get 1 - i32.ge_u - if ;; label = @2 - local.get 0 - local.get 1 - i32.store offset=4 - local.get 0 - local.get 2 - i32.store - return - end - unreachable - end - unreachable) - (func (;16;) (type 4) (result i32) - i32.const 0 - call 17 - i32.const 255 - i32.and - i32.const 2 - i32.shl - i32.const 65536 - i32.add - i32.load) - (func (;17;) (type 2) (param i32) (result i32) - (local i32 i32 i32 i32 i32 i64) - global.get 0 - i32.const 48 - i32.sub - local.tee 1 - global.set 0 - block ;; label = @1 - block (result i32) ;; label = @2 - block ;; label = @3 - block ;; label = @4 - local.get 0 - if ;; label = @5 - local.get 1 - i32.const 16384 - i32.store offset=12 - local.get 1 - i32.const 65572 - i32.store offset=8 - local.get 1 - i32.const 8 - i32.add - call 20 - local.get 1 - local.get 1 - i64.load offset=8 - i64.store offset=16 - i32.const 1 - local.set 3 - local.get 1 - i32.const 16 - i32.add - call 12 - local.tee 6 - i32.wrap_i64 - local.tee 5 - i32.const 1 - i32.and - if ;; label = @6 - i32.const 1 - local.set 2 - br 3 (;@3;) - end - local.get 6 - i64.const 1099511627775 - i64.and - local.tee 6 - i64.const 32 - i64.shr_u - i32.wrap_i64 - local.set 0 - local.get 6 - i64.const 24 - i64.shr_u - i32.wrap_i64 - local.set 4 - local.get 6 - i64.const 16 - i64.shr_u - i32.wrap_i64 - local.set 2 - local.get 5 - i32.const 8 - i32.shr_u - i32.const 255 - i32.and - local.tee 5 - i32.const 30 - i32.ne - if ;; label = @6 - local.get 5 - i32.const 192 - i32.ne - local.get 0 - i32.const 243 - i32.ne - i32.or - local.get 2 - i32.const 255 - i32.and - i32.const 150 - i32.ne - i32.or - br_if 2 (;@4;) - i32.const 0 - local.set 2 - local.get 4 - i32.const 255 - i32.and - i32.const 165 - i32.eq - br_if 3 (;@3;) - br 2 (;@4;) - end - local.get 0 - i32.const 86 - i32.ne - local.get 2 - i32.const 255 - i32.and - i32.const 92 - i32.ne - i32.or - br_if 1 (;@4;) - i32.const 0 - local.set 2 - i32.const 0 - local.set 3 - local.get 4 - i32.const 255 - i32.and - i32.const 164 - i32.ne - br_if 1 (;@4;) - br 2 (;@3;) - end - local.get 1 - i32.const 16384 - i32.store offset=12 - local.get 1 - i32.const 65572 - i32.store offset=8 - local.get 1 - i32.const 8 - i32.add - call 20 - local.get 1 - local.get 1 - i64.load offset=8 - i64.store offset=16 - i32.const 3 - local.set 2 - block ;; label = @5 - local.get 1 - i32.const 16 - i32.add - call 12 - local.tee 6 - i32.wrap_i64 - local.tee 4 - i32.const 1 - i32.and - br_if 0 (;@5;) - local.get 6 - i64.const 1099511627775 - i64.and - local.tee 6 - i64.const 32 - i64.shr_u - i32.wrap_i64 - local.set 0 - local.get 6 - i64.const 24 - i64.shr_u - i32.wrap_i64 - local.set 3 - local.get 6 - i64.const 16 - i64.shr_u - i32.wrap_i64 - local.set 2 - block ;; label = @6 - block ;; label = @7 - local.get 4 - i32.const 8 - i32.shr_u - i32.const 255 - i32.and - local.tee 4 - i32.const 106 - i32.ne - if ;; label = @8 - local.get 4 - i32.const 209 - i32.ne - local.get 0 - i32.const 43 - i32.ne - i32.or - local.get 2 - i32.const 255 - i32.and - i32.const 131 - i32.ne - i32.or - br_if 2 (;@6;) - local.get 3 - i32.const 255 - i32.and - i32.const 81 - i32.eq - br_if 1 (;@7;) - br 2 (;@6;) - end - local.get 0 - i32.const 226 - i32.ne - local.get 2 - i32.const 255 - i32.and - i32.const 55 - i32.ne - i32.or - br_if 1 (;@6;) - i32.const 2 - local.set 2 - local.get 3 - i32.const 255 - i32.and - i32.const 18 - i32.ne - br_if 1 (;@6;) - br 2 (;@5;) - end - i32.const 3 - local.set 2 - local.get 1 - i32.const 16 - i32.add - call 8 - i32.const 255 - i32.and - local.tee 0 - i32.const 2 - i32.eq - br_if 1 (;@5;) - local.get 0 - i32.const 0 - i32.ne - local.set 2 - br 1 (;@5;) - end - i32.const 3 - local.set 2 - end - i32.const 6 - local.get 2 - i32.const 3 - i32.eq - local.tee 3 - br_if 2 (;@2;) - drop - i32.const 6 - local.get 2 - local.get 3 - select - local.tee 2 - i32.const 2 - i32.eq - if ;; label = @5 - local.get 1 - i32.const 40 - i32.add - i64.const 0 - i64.store - local.get 1 - i32.const 32 - i32.add - i64.const 0 - i64.store - local.get 1 - i32.const 24 - i32.add - i64.const 0 - i64.store - local.get 1 - i64.const 0 - i64.store offset=16 - i32.const 0 - local.get 1 - i32.const 16 - i32.add - call 9 - i32.const 8 - br 3 (;@2;) - end - local.get 1 - i32.const 40 - i32.add - i64.const 0 - i64.store - local.get 1 - i32.const 32 - i32.add - i64.const 0 - i64.store - local.get 1 - i32.const 24 - i32.add - i64.const 0 - i64.store - local.get 1 - i64.const 0 - i64.store offset=16 - local.get 2 - i32.const 1 - i32.and - local.get 1 - i32.const 16 - i32.add - call 9 - i32.const 8 - br 2 (;@2;) - end - i32.const 1 - local.set 2 - i32.const 1 - local.set 3 - end - i32.const 6 - local.get 2 - br_if 0 (;@2;) - drop - local.get 3 - i32.eqz - br_if 1 (;@1;) - local.get 1 - i32.const 40 - i32.add - i64.const 0 - i64.store - local.get 1 - i32.const 32 - i32.add - i64.const 0 - i64.store - local.get 1 - i32.const 24 - i32.add - i64.const 0 - i64.store - local.get 1 - i64.const 0 - i64.store offset=16 - local.get 1 - i32.const 16 - i32.add - call 5 - i32.const 1 - i32.xor - local.get 1 - i32.const 16 - i32.add - call 9 - i32.const 8 - end - local.get 1 - i32.const 48 - i32.add - global.set 0 - return - end - local.get 1 - i32.const 40 - i32.add - i64.const 0 - i64.store - local.get 1 - i32.const 32 - i32.add - i64.const 0 - i64.store - local.get 1 - i32.const 24 - i32.add - i64.const 0 - i64.store - local.get 1 - i64.const 0 - i64.store offset=16 - local.get 1 - local.get 1 - i32.const 16 - i32.add - call 5 - i32.store8 offset=8 - local.get 1 - i32.const 8 - i32.add - call 13 - unreachable) - (func (;18;) (type 4) (result i32) - (local i32 i32 i64 i64) - global.get 0 - i32.const 32 - i32.sub - local.tee 0 - global.set 0 - local.get 0 - i32.const 16384 - i32.store offset=4 - local.get 0 - i32.const 65572 - i32.store - local.get 0 - i32.const 16384 - i32.store offset=16 - i32.const 65572 - local.get 0 - i32.const 16 - i32.add - call 2 - local.get 0 - local.get 0 - i32.load offset=16 - call 7 - local.get 0 - local.get 0 - i64.load - i64.store offset=8 - local.get 0 - i32.const 24 - i32.add - local.tee 1 - i64.const 0 - i64.store - local.get 0 - i64.const 0 - i64.store offset=16 - block (result i32) ;; label = @1 - i32.const 1 - local.get 0 - i32.const 8 - i32.add - local.get 0 - i32.const 16 - i32.add - i32.const 16 - call 19 - br_if 0 (;@1;) - drop - local.get 1 - i64.load - local.set 2 - local.get 0 - i64.load offset=16 - local.set 3 - i32.const 0 - end - local.get 2 - local.get 3 - i64.or - i64.eqz - i32.eqz - i32.or - i32.eqz - if ;; label = @1 - i32.const 1 - call 17 - local.get 0 - i32.const 32 - i32.add - global.set 0 - i32.const 255 - i32.and - i32.const 2 - i32.shl - i32.const 65536 - i32.add - i32.load - return - end - unreachable) - (func (;19;) (type 5) (param i32 i32 i32) (result i32) - block ;; label = @1 - local.get 0 - i32.load offset=4 - local.get 2 - i32.ge_u - if (result i32) ;; label = @2 - local.get 1 - local.get 0 - i32.load - local.get 2 - call 21 - local.get 0 - i32.load offset=4 - local.tee 1 - local.get 2 - i32.lt_u - br_if 1 (;@1;) - local.get 0 - local.get 1 - local.get 2 - i32.sub - i32.store offset=4 - local.get 0 - local.get 0 - i32.load - local.get 2 - i32.add - i32.store - i32.const 0 - else - i32.const 1 - end - return - end - unreachable) - (func (;20;) (type 3) (param i32) - (local i32) - global.get 0 - i32.const 16 - i32.sub - local.tee 1 - global.set 0 - local.get 1 - local.get 0 - i32.load offset=4 - i32.store offset=12 - local.get 0 - i32.load - local.get 1 - i32.const 12 - i32.add - call 3 - local.get 0 - local.get 1 - i32.load offset=12 - call 7 - local.get 1 - i32.const 16 - i32.add - global.set 0) - (func (;21;) (type 1) (param i32 i32 i32) - (local i32) - loop (result i32) ;; label = @1 - local.get 2 - local.get 3 - i32.eq - if (result i32) ;; label = @2 - local.get 0 - else - local.get 0 - local.get 3 - i32.add - local.get 1 - local.get 3 - i32.add - i32.load8_u - i32.store8 - local.get 3 - i32.const 1 - i32.add - local.set 3 - br 1 (;@1;) - end - end - drop) - (global (;0;) (mut i32) (i32.const 65536)) - (export "deploy" (func 16)) - (export "call" (func 18)) - (data (;0;) (i32.const 65536) "\01\00\00\00\02\00\00\00\03\00\00\00\04\00\00\00\05\00\00\00\06\00\00\00\07\00\00\00\08")) diff --git a/pallets/template/res/groth16.wasm b/pallets/template/res/groth16.wasm new file mode 100644 index 0000000000000000000000000000000000000000..9ef003de337adb37fc34ada069ea3f417945f255 GIT binary patch literal 60685 zcmeIb34mQymG6C~JKw508OTgH_Zp!B2~?)4N>IoNBqRm_5d=qwq<~aHhDs%13#1Z) zMnMU-L!5(6OB|xnMx||9qoQKB57EY!R$d!u?T^>br|D1IN4G=1-+%3MZ`}%@p&N(y zy&~K?`|h)cHSM+6UVH6*y;Ym9@jcJ;H;lR5-{xH&Zrira-*$OmfAz&v+PgeQ((-)0 z_B;yvH(u_M&f6P`L`q~2@~x#Cvx>BGqbe3$VUocuem?A5zcqhN-!&TsUK991oZH;D zYF$^Xzn5LrH+b3R!3_heuIlsr))$*wUWD#N*=np=zj4c;7rCs8WexNVZW&nbWyL02 z-W99Xt-I`st5>aAe_7vkgMI5aui3EP%Y~oz@AkcXl#dF9D1;tf#Q$MYDg75l{43>4 zUKEw1N)SZVY7i6(f$#ZY5CxS&SP7%38u~p>eb8J~3ByX{g<<6L&Z~G)m2?#9kD#dV*AMa`UGra*^EdkSdcFuh z(xIWKQWz8DSNCmPx8XJ3b0Z<^om4u-_fo%7+q~`S>n>Wj=y_+n@SF=?bpClSzOaAo zx@*>N*tqF6TW|7j*zWJ}hx{AM|NhzFZvQY%Z+niH9`x4M{TW{3r^WtsQh(y{XJ+X2 zgjrUstawCLQCY=i))ESLCVt{swW75Y=WD7zG~{;&^GW>ZT~T+?)yV0kJ~@2t?TE?fmzI~cd6W&8wIRV3`tWClT|Hs1QmR{`q(9pO_e~Te<)=sd zO=+;AEvUq0uM$^O3mp4rc$Lfj@J0cd)cnL-;`f9}LLCFU9$a51gTC~&SP#h$F4}LI zMVA@Z12V%bGj^GivT{A)q{OSN^g~fJURw_!sMi@pwGimN?jX`Puf`)iC`x!qAabkw zC<)_hX)U1N9(xfB*bCuKTB`Yu93%fGUV8~43!_}VP%Kr_az`cg`2>7IJ`tZBpFE!e zpJL623YGKxU>LmA1GXUb7I_^;Z}3e!`cprCgAXNx*k|&(uIgCV>Vm(TN{(3HnR?u?@U7$(M2&O*~ z)CoI-Y7(5&2K_0orsGfhQ(7tqNpwCe2bTENa2y!BDHl3G%kU!Z;1gHo1F2O@tLtjM z^-%+qaB<={oU?4n|e`YhKl3T=zEVX5)m{H^UZ*t5^4yO74KN9w6KL_}EQ|wo>YTKISImQFR>`T^-y|$i2 zzqA^U?NHsQKOR@96a|JKcU7iJOamxAP)Q+xycXZbPix zi(o*tR7U`}HTZR>Ka$`}yytn<#9!i_0j^#x5WfH_NTYKE(;TmQR~oIT(KBekGkW$x z??^)ysT;jxc3vp$#7;E_gLG)SQ=nb zJR_lm6ecP=OcN>0iibJ{lsNP%@A)r5%+Nemh!G|SY4sUEdPZ|x7MW8tJkM_oP6?=_ zQv(w9AOTH$jXcjZT8A{;#f%Q4eH~J0PBEf`ISrxH8@vb>qecT-rV3;uy;eFAco_yZ zBdJMdq$GremE#~^e4?8@2W4i63zhv-b7Fn8ExOU>j)T5Qra1d_{}QJXo!n|f*wjzQ zNK4#F|4iZVZBpvjBsi1$*>xA#1xqIJ%<+tQ=3Bc3 z^Ws*4OzlIyOocH0l83FJLZlxct-N>gPJ9}BPTRO7O5cY#j!W`}>!Y61IZJ=l^37Us zfXx(57uUn36hY?CmWq)rp;70j4_jhpkeN!#w;`!~jH4`H6))`x7o$b;)u=-E+v#R( z*8K@ey546iX|1}>Pgdubs&lf{$}8$YPjDwmF>EhSLEy?7pqJL8rEOxc%Ju|1RgytD z^fV<)&60O#B@c`!ne|VbjC5M873iypqXB1(JCX&aLfVJ`$3lTqQH;m4R()P~7G_A!%T7`fj@hVmbT3;|?dnu^kQfP0+L zp;JjG3^SB$Vel{&$UbH&4CD6Os2~mD#OC)Y3?Wot0*KQ5Ic*&o5#9+wIx;H!+R{%+ z2HBU#IwppZ`)y=ET^%DC+N|8OGbW;19uU*cOs_Zv(_Dg)ZED30y+$_Ohl^Qu$vCNE z{P`(^53>~uEqm_e*mve%qj4*Ntgm>6l?T1G&p@~6sNIMFG{w;79Tt7Wz&+`j8gZKtdg5aSQ)vp%$0~jy^@s92-I28zS8A5!@GeZ1#C@hlq|6dBr?~rD) zAVz8S%#>2{e-zC$18Z(N=$mgsi#Y$ui@145dn#Bc%2^?&1C{Yum;*-M1KIfIy4scb zU|8|Xml>GmjbHCpRxH$u=1;QKKkC!zYFob3iso)rVU-lduSK&^KE|cWV-oH~Iok9R z{}T#H3kWG-D$ESVYn{)EO$$=W*t&i%&Ty8XIp=|pxB5u{VIn*=NaO;IjEE?$uCGU| zg2R4SE&gJ-Fc3#e3mt=@+DOa>p|TY*!r$;yjxf%&+A{J{l<`k=CnG zt&|jMk&%_I@Bx(M-82BzrZqju){;roUoXpV8d?La)u?XhRSZ2=%_(s7Qm1m49Px%i zm*{OcbvY_0<)oy~%Bl5I8YO%(B3156tf8g2@eKU>68kS>4|mUGE)1Oi7YhgMQ*3+3d3noudU}BK4wSVr}~SqPrJ4~GOI{1vsdwWj&;Z{ zBOFx%IL|IY@S}(<^KU(_6fb^BAyQA|@S{9I9_hy|t;)Od{rZkCb}7$)vTwWdW_EbA znB-@MyYfBW_wt~qe$3sI=BPB&dzcrJBFvS1`u%+WOwV%}Rw@_o!hpia5BUUqk#(O> z_t6Ssry-izHhIYv7Q;Tldyji9zk2g^Xs_?l>-*j7sP%PZukY9Ehu!O(dtJw4Bph;9 z;9-pn#FKHdq8>3^!X)1r9Kb6J$N8F1_XzvWU|&>^q-*$7jNj-h>){BO4kV2FwGl&` zqL}cOI}6FNel+ZcL~CUDu;?s#wwK~bl7n3aW8Q2j8w0Iu#`6F>Fnb(3Zb5me>s@|5 zV4UP-;P6)j@Y1gMR)cG&&v>WMkniBbui=VxrH8z%%=I-ZdL1&HPcaI!5{JC>(MFNM zT2ZZRWT4P_v&f@f`hg&8WnHbTB3IYM!$VdCai+z%WG{Ez#iwX3N!&pA9mEe zRHa@Ke*mB)hHwg}AvGvlg*nD5&_%w2NAf+PBpmu9$Qp}?59K62FsQ*^MD+1oy&VCP zXg}EOx)sBVYOL5hg9~c%Ufgd*Bxzpy1wTXZ+!_uZmU1;YyBMx2M~M#v>9-m*IJ<@) zjul>QJTH42CB7A;J3?!ufnu*pJ$Vf6JW*YC)h6+>QzeAl7yJfbox!ZyWR>WwP2pwIC_x*aY_u_> zHdQ5(+B8bAvFh6RWSBlS5;?l)45m5cP#)r+#*X9P(cIew$PMnP)cp=id4lVjHjU3H znELTO;r&97N!WG#SeX8k>zEm-Hl19k=wAI(nBJMo2#z9}?gr#TBwdr~gCvjFqBEa< zo#a$EI`1Pn*(DE>oZ^!AlAP$0_mG_Al6RAIyloJ-zGa*RvvB{|k5 z-$Sy)CHIhwUGl9YohnLqlWfmgyOng+mDowL?2>46H~lnqjMMGuA<7^Nw%E=m)4GHE zrEA7_2mADF>kfA5S;=%zDbw{#M5c?-Nh7q7hTg7Hd_8J~1)lX)3s6Bga3zkswlStZ zQGEJvPEk44)*MWX&R~3N4l|!bEBcOxLAXVVo{2sG@;@QTM_F3BFrW@@C#P2o^4o2i-J z@#tvt{-_qJxSEct_&5epRuR)sm7byy2126{yIfhzC^TTfYwVb{BO^nTJ|md*^!npy zx`-(mJzDfX5TGOzHnmG&fG-4?#f>L&vpsLAf&q-z!$jh{0myUTFs1E1J=halLKci^ zTgyPF+H;@1sM>nq>8P9$>sY(3j(HO0pBSb*bAN+nW9vBMat;*{(#bb!tAK&h-hq#d@KtxZ#kal;PV9b|UcE_*f74!bpQcG#}K?69F` zk*4|68SD(4AvP44CH6$qoIBKFiT%=drq~m{*UlVjg~nlKFYw8ah*LcW9>Cu4a)0uTNIy*3g-1yFxS7hMHv#;xK9y+8H`i zZ74KT?TMz%_XRKgV#BNS%fOjxPXuPF9kxQwRBHhAv%r~ZhXXU!9&Z+D0@N_o9>)RJ z8T=@S@BCevYKNMgw_^H(z?o`?0yEVfwnENS+ulI*k-(X14+mzdJ!oY_`7iqEV~s)& z1Z?Hj+$yR)jsfhGSv#$Pro0p+LIk&EpDx6YN`=4c$D4u zJ2cgZ;``$<)rd-HHPteYvahKJBSN;jxyN2PQ?0pm`5uKc0P`NV z{kpqZ<`4(d8b-xiBWJAbj?7rw)hu+-AKu-&HFCzTzfn;bM257 zI?A*5gV334he9*g9=0-~{*LB`UuW=0=*+c;Lo?SNY!-SfOurb7*z$bPaD6Dl_1QMp z?r-+|#VGxf>$x-ddg#ox`$IF=4mR;@<>`H)GuIA=X0F}SEYynVy`eML?g`CYJJ2lj zWJC`bqIYMAKKtg{zGmOUsLl-cg=VhpZNB_clZ_gjGAjQ*FO1sGS?KW_4_f`;wM>H{{?gH$@|v7 zLvt-}aeK}h;h>Gz*f6(Xw!=|li(FA}+ChIj(%yH$9oT+`wFstshBa*4{Bib~j}O7PS~CYLPh6^d23` zC7L89R%RAK5&@x1-9cihDydHP^ev=vDUU9-{1;K6U|WSy5@;I{`Aa;WS|`*`r$?j4 z*`26yDoDG{k;1#;2}BkUWOBBPJXv1n5(W$TTTH-;4)h0W>qP9WQ;P}b{fQU7TKU~n zlOGhXP1cZ3u|^g(M{|qg0%w0X^ZnHSh=nYs+xpwf*=-1A--F=9AI=P~)=3rvjlVk2 zGE?9!))~o&uqXvR*jp0K*f*=VxL)A&G6Ia`T9gryt3>E_e6)t56szo~)j`XHF zJD%s-1s*wWUf>aN`2vrS`xkfwT*1JDn-r)n$T)Eh-YF+0#TF=J$9}5)sl{4FOE?g4 zHko_&z&i-4_}y0sArg)a8~Uwy--8nuMS^HZ0}Yz%CJ%BaurSa#8xXMC1kC z9>bJltu|Qc1Vp{Fkcw!gx46g4IT}RiSG_D073Jhe5-IRe0l38K78M)f$EP(CgN?+N zO4VM$+c2J6IoSgt7#$C~%M$38ufDjya;m$~fo8T45!`5Cer1~KsP#d2g#o8k5>E%p z2z#&Oytq5Ng5t8~!Fh`gPly~rM_ zjC*T7If_B2s~wS_Z`_s=k`wAM)->7?3&WIqF?y4b!NGqVeb)(iAn1bUif1L+=^n|j z6kF((yFY>;tcX#Q9euC+P$ai}5feB#sBxgPWWMh1f zuv@wXDnfJ&9=@P<18+(427^hopvkzdjiT}W@s*Uf)AeBjcu+<890$nq35@Gh7QLk5 zV1K=6-6@ojR5T_~hn^zQ1WZvEXIQj))TS#K;9>)-@g{=stpzJqmV%^KghU=6hoXg~ z8jAQw2sTrPjDVx@3w-;lyZaPG~!h{cnT;aBR)O#D!sxgh@bCrc_q;zgWE~yQs3bw%8rBM z*-3mGKgG&l1B1JrN(Ye4?ks{W|NKbZ74S%t=7N`LPI!r>cMvu zDB4{yCMA$zE(jXskM=zxT#sZi$;IGaMWAWY)Jc?Sd+niLsr5Es;l)>N0K zK;0PtYPwSw;t|s+fKfmxp45fE6xYEBP;sY z!1U4)3e3raHK{>+tO`t^bIU>xUAjKdT>mRO$-|W{%;y=g?6Mkk>GH;12|!%WX}(UV z8mF2m;l5~-gVN9?o&zBWqNk?nQq8bOLl|%Q z23a+yqU$sWMwz_j5k1hhzLlBD;r`qIg$$3pU#Y#=ymFrsjF-(0sOk_zTGDJxE2c<+m zrdl2#ElQcn)w@)gRrjuFcQxsZly%V%nhZpnZzVC^jVoCimo6Dk;K*5={Rm+NRD)LN z$s|-PsT(_$|M2~Srm^f;mkvhNLsVf+oZ!5##2{ZQ2>f7ixH#cN5&TICltcd~IU79b zb^T0hm}NS}Q>^6_hn(SVsvgSa>}-$Z8zFNpM++atM0poo#mm$Or~Er~`B9-wDwl3@ z8laejE2h@4@Da55Yyf{|b9iG20C$iLGe(#00-Fu51PmQxaiF+JP@04;&r%Ypy~kgw zzN5-F{U&Qs(1xA{W!;{qfEyz4h(zXKEUxh{aSEBrUi?ao_4n|5cfb8)w+iE5nVv>FrU9see>O zb;&IVRxH%QaUudgzdwCwC+06A%z`oCm^oK^kv|bqaOz|xmpyR;XQr$Om6+`%&gwC{ zg%f!_Vd83H+{q%-c(Y6BNMST&P=Yz5uPgl#*xBgJtf@={;h-Z4XP9JBV28Q;cv!zk zab(7U4a|3IUNUlOHZg)aOV@6ttAUv1qgr?yxO43gzl6qdL=Rhtj*N=vZ-ibXN74&v z6^|IMlhRwPzzC@m*F8TG*c#Y zLGnb7GeG~=~UQC}QJ_BA9!R;(K~dOs|X zBpU+RI84B@EXgnO7>Et&t8B{z4`ajeDkqt8VuzqvZa|I`nYvO*19po6an~*hbwx?{}uNh9eZKruHw$__OUvwY1bZ>E7i94j(ChG6=!Iqd(nSw$EJXFJ|L^LpIR~kTZY2ZsqLz> z`6TC`qLvQWA4@G}m#nWZQ%iSJ97`<@cV@Nzo?2XZb4;~#hnAzp51&C_9AL<5{hV4_ zZyXDRTI9LDb};pE=h89NA_6a~bqlqQm4+ND&T74zTIFNx3k8_f`g3X>t88#rOjhfY z&!8`cXIAT8Y8@*Lxp^k5bw9NhF1jJ>SZ-%;yWr5Ar?R_lAzI#zyRh-bBa@C+av z9+f|#7N+H~;6+a|hK5ZR^hTz&ri9yMXGR{@oc%e|lg3CWj15TwqsSJ_30KsSUdb|# zi9wUJ><6EjU&qBS#umKP7F^cI20wCl>B;^uEO9=%b}`1{m(?Sd+xOWua@YnqFeUET zc&s4SYE_?G*@o4lxfr|4GVFFtw>TK?A19}CmA#$ogR?t1nZBit*{+ubs$R?pWoG33 zC*?uOpXGT#V7C)Qnom2j)s(YZWw8ft(d9v3`d2-73+|blSbDK0I$@LPeyg2+-

9 zUgQS{j&6%po4bw+a+#r{w#*=*EhI;i6xD35aLpZ-PeZg#tIg){SqUAS8Cu~eO2Q~F z>&(OT;2bLXLF$avErW->O#_KHP+81;;K;6dizYF!X#@i+@m~muVNE~8NEfqUMM#`& z#;Q=vm4#TjNE09gU0VyNXDnp-LWbS^XLAPu4sw?)YkC2&O64em<93qL7>uzk8aZz5 zlRal(a0*G_8Hj*1+eyof#>6Qrl>fgs~cqAsUu|4++thxCiS=4;zIof zT3-b+1GgbJbSc4Nwq>-D!XnD#Y#LrNCQ-;zF(Glb9RelPwJtWxa~5f}>RX$vLCy7* zN~AOluq2y}_?1gCV$-`_3+u@J)THK}hEoU=Jb5lu3TN)+=94d$Z~c`lG6eTK|CMokZ9qpmhrp+pLmsskpq{;5>sLz?f`=x0K>zY zwWT(1-MTDmHfU)!WbK}T;CvrR@U&&kzag^u@nxtL%ox0Qx_&~=5gBP14b7g7Hhl0Hit5t)3L$ zxpOj0XO^U}kG-M{z_e(fOL1a=b8mxTKif-c1{66gdy)~2Vy<&(X;NZF5Zp)<%z(Z) zUS26nTNkZ5CC{2xOn~)Ii2#^^p?gV*Y4NK}dMmEOGLWDEge14A&}C6wYN11y^aq_> zf7}U|^#`woN2vu|=<(Ej(*VudOV@V|D(^MF0x} zWJx+!la5MgWRGN*xj|lv9D`LT+0Z}pZMKKL7lJ0#0DkkNTO!9D)>c5XsndeOj}0-7 z#A`NaOve(`f5ebytI_VDcRQKsNsWFqQn{J#wgd)dLE6ZLsk$5#a%uxPI8Ox1 z;AHrIfG zn8Bg7EL&3OMYMIirs)fExi37Vpq!CK0qrOL20jnfXHjZ9R!3$;m5^ zW<(S5KqUOuQQ*tK37X6Dw*?pwxLbEKiDq6z>Qj-+I?`B;NTr8 zU4`sHI(r+YM<@bA0!@wV+JqM8|f!=p}6QLRg&F(o0WEC!snKWn3qob>eyu(MI-QgpSmMAmJQq zVTe0R8#|;s>oYa!dr7s?j`>*&=k(oJG=0cOkc?*feKK%4D9VC}8cu zzL70hq@hdPChURsq$co?vIVQ084^f~g3yS;b?Dbht~>o@w##c)vWX6`kPXx|qq3Y7 zSGMI*!TJ80dSk!6EQrOwa--(jdNnODKIyawDXU3QckEP>qKYN_m<1PMK_f2oD(ZUE z5)-VK`OXO;=ufZTlvLK%OV&V1vPe7h#a6RNV^m10x}%F0tMMfQZW=MOaue3t>8?%P z`APeey6bS=b-3=5Dh~X58%?zpl5)Cz$Ijw9;#)yHDfO?d;qIiZQqrcS4OfB5<;g^? zPVE+}q+@eEpKjZX`FrG7zqqy^kf{e-p7dfM9is8;B-kaSu+dIY`v=_MQ7f5x1+Nuc zRG>zf!@U|mM?wGGj^@LSN=7#t7u~8!$BMRc!Wb13#1|T>);b`SCfyDhD5dk;LgF(- zmRXu3@jk+P#u7s0Vz^+s2G=kruy47^M|A}xtkJpy|8A%874b1CkXVqK;RJ+K!pzMu z7IPF*62TJ0LsNf6Tj`XD^=Eu+YY^QPgo}U-z_NzKTWiI@H~7$do}mXY6|QwNusvA_ zQrnU{Ml&Ldp|y(6sBUdkbs?)82|(`NU#7PsHk>N58a0z>TaKoj>pEBYsgLD=mTGP# zX*)rv8~PYWwiC@$ThQna+ki%|l5A|?Hg}7E(*`uyP=^f@0I-ElYYY5J2<@?HJz@)Z zL?{2L9cw6v=BeU)jn~$oo3ohw%Ci?Ra(E}pJoqv)U<3;%Q&+~VwUuH2=elQgv-cXq zDhpHjp8N}rl?Ak_@b&pg6PesYzYaHXU4E^^7z@PNFypVZ1~f9if%F_pHs)pwCFG6S z)-y*wqf}B{p|dguGGAY)xt*YjezU`64b|w(CMvw)idDfl=&vD2iSCTS$euKqPTEqZ z|MTdtsxoqq(+{mN#{u1-iuwau#12yY505VMRUR0!pJQhAqR_GAN3*$x{ zT!5Zqdaexl%>|wrSMeu6ou(M4k1Og-<@Hm%HC1udTDWcZ>vM7W5ycHaJ9Iw5>U{MX|QRkewYAgT_IAY8;jJY zJ@~-7XCMpo@MCU%W~PRw0N|@e;MSk?84T0~0i#qM)B0LKPdo`16sJ{-k%Q4j1tUSF za{fqtaKkK*V({MT%`_HuLkqGj9SHg>0;4dt(oJ*js)#Z9d6c z{&a0NKpJ+Ne}U@l#|l!T`mq1}8&uaQ9l^@q*88v{{kv43{7kD4d(?mWp8?*@ZCVj* zXQNWrXFnt0QA)5|)!#<-XDkd1(X9F%RDY(VlWCsKAB@Bkj~ZMu1`^+iO2m&eIR*4| z0VsY;0E*=I=m3=eWZcT|vXThYd_ zuB6jf%EYHez1--XMZ|Gi9Whlvy9S@YPsZ|xCrcBIVxWC%2I_HJu}t(bDYFdI1PyA` zV`YZ%E6l3t3FoswtG0s0Pf~cBYHTg%Q>8LIhvs<*RR$yM~=|70&k&4 zzl?;o2L0%)tXYw3p@qDc-ugQG4L7ajFw}K{a#b4@UX2adHk&uaaDU*cG}xLJHt%1; zvUKP{Z)dGt4y>{ohgy2jn=BBztPwArEe9nl3N)c#C0Uce;PfXq^=e2^8S5%dH*E$mg$rE(wmQ@-At}!$Di>Ic;LgJp#Y+v^Zg$DmGbMHoQ6?all+?Hf!h~lz8LF zP(dSkgW8SFCoF4vYR)%uK5MB>d)flQ;M*It&OS}bI}MNJi03(Iv7A1}Y{zPMu+3?LlQ;Ex&&iehH= z@z zDdS+}1s1p)ELPL({iDc82X<$FnEfOHs*MYcS){3X%oHzifRM6vC@*ZyG}9E8+r#xi z(S<5AtihBTZeP&Cl)n)W=YU%vGnmY_@#9j;wv3YN1<@k!I5mc3KsL;(=F;VKf11fIf2MKZDgL<6BpICMPs1N@ zgspw86q{|C5&iUSY1dUWc5Ov!3vjWFYy&S^LI18XWJ`0Ei&D@Yu^^?EOgo{I0D^cG zWj}VSgD9HagaV6QoD$Nb(F%ecM9FNk-GVCuvy>}kc#{33?1gBo1|emBvP9Qp?JEs< z?p%|24FvL^Y2s>Z+PWf{@u{wfP{BtxO&ky6>s=E7n;njVm&MA5eOx>s#9S#%B%t6; z2bv6h7U$ZY_S{R5)O-Cdgla$@k$_T^FS4h_QiC69$Ww(^_Pd+xK56RYXB==4)FZ|M zuFW=``*3x%(6oZ`2I&?C^(Jqtg~^Lr78eWn0KpF;+b_`KCx8hJc=1@8D-|l>iO3=g z6qsYkz^LJULbs<4Q3%=jxbLQhgIIxX$Dj+Sq0O6xH17D2jk5IHd)OF>Z&Mb6qWpNb zdmrDfCv^f&hnpYOzTqUDR1e~}_z)8~@xwqz`w`)WbCo5yqrZp;XGE=#+v=gLeb*7H zF8#`dy5v6NFg>UPLzVv#xMiT;v(+^SfWa_(wT%yI5w8>O#mX8e+oR5 z28Q`=f1P>Q_BTY>`G^q1TU#7qdIAi19!=$RJ}0D#L%gd$=7+ne&+k^7r-lpknG_t3 zY$LV7B|9k7Yz898IZm~w!ck$a0Y1zqSZvs_EEAP7?Dz#$ z+oqH!>V%AeAa^uCM?<19&7Oc7(mKyDHK0@xs?H1(Z6S#)boCB9uHlJOtb^c`^kAqT zM#xS;{&HOCZwqfMO2-~hzzj1=7DW)ES1nuullc&h{p5d;#t4yHa^_1g?*p89)MD#G4$Iu@u4i25UsmG;$CBiFM`>;1 z6CW%uX}m;)@hu73mipL>R&9AQNGTN8#7%dcx)8a~jnZFchR^>`aXn>D9?w zc5sL-;TIz6#J3~OS|3P7k##BN_BK{b#dGv$#ngHQ_ikArvqW?Fmh`~#?+lhJzfG*y zFOh;ISM#%AudxS)dSGiL!&RXGwUBo8+jJ~FOL~;fNl2*&h8-rd8S@50JxCvUm+4Hc zycLUYc=Ic1ZkR{u6AcUk$Bc6#>je zoA}*AeXsj@Enpq;-SzP%0oO@*_o@JUzQ{=(BhXQgd=xU{EoY5#7Uv?sI?-S z9*v5=7_L~J(B|ff_=7bvIFJ-uxx=@S%^At|K_Sf)kT%$##cAX&U@A6Fpe3M()Pw;L zF-d9G(;()l6=Ia~dpJu7n}F!qlFfdg(Ha$FohXw)=q1xE6EQZDU}`NJJKB34HU;&g zf{_$qgT~_PPzGd1=j9_u33k7s!bx`1GQP203~LO$AvKEPFitiGnK#e(#6^)SnQ|250dgllGvOHGC7gNNYY!&x@soh z?q&S`j0=zrZriWi508&bp&kVTY;3gSniu)sub46X0Coj})3FU)TB~2z6JAXj_(`tQ zIXnGYQ8a-noYb-xQoeYWlJ=$b4*93>l5JvObvP}H$JAz3n>w0$lu6qnVrhmwbs|^P zL_41%|5Q^ZN-!9IMyK#m$^2jnct}IssVDQmUg>+OTvK>fhrnE?STqzuM5?-0pi~)6 z);oG!T0$e3M+Kc_Dk%esU4Ev6OsX9Nf1#O-Xz7tT(niGUN0 zrgNlX?{JO1HrsO@6bwiENj+sfK4rzGT*Ssrr|&XRmZ%A&-K|Qh!Pf@dnXYmb8=0zk zbyHQLwKUVTImwogywh6Lwe}58JEZs>l$~_g5G;nh1gS|eB1xQ`k)c8_lccJl02kT$ zxJcQT<)6Y#+SV#W1nc2022q>XZt)pJhPa7&uU~Ihmi#N+~#H`>3%_*@s?XNG@ENCzzk9J3hm2{YjvM2pOA>SILZYqVE*r0YxNPkaQqJsmPxjl9EMX-B8cz7mqNg_}O^{df=*MvQ)Q{ zWF9sZq-Y?_VU=a^v=vfl zNzkYwa=37wz)m~A&Uc27{n#Vw(4y0pY-d%?k0Dy82tdOh<9@~OOg}pUz@j*6T=tRq zNM)VbV%Xi6!74wy4n)w8t(aHjIZ)Wvs7b)F1Y1u+M&|?(xz%C6_0c%uZF&tr*E=sr zLUJQi3PFld6KXvJvWjf+;-=U>GW=wGD1@M zyP0O3P>|5dn5}dzggJKr8$^5FyGU68a$8ecS7Ql@a5AF|-}CTa!2^>@bMe(Q?LdU# z5#y)H`78#IT3d#xEKbYBA55azp2x2b8^2w1-}YUoq6@_}xQ!7k$K@-C*4m8uN~k1#O2hJkWm9&v0w`_X5*~@WWr3%DRWkl_aI&}zJ&IZ!vdF}j@H z#0xvB$ve{?f}7Q-S&`&59es8`z!>Y2x5mJDpI@1aK)G-mb0QidkV0&9qH0B>_@l5r za{zYv!HuGpG$e1$hz$1cL;}M7_1um#jLR%~htNL8=$qMw$eed{BJNV%m=ZY8mLtEW zWMyN&m?@<8bvlUIPxu1bejDFZHlFG{bFft>cp$TGMiG1&0+a!T*c?ZJx(gb+6@l~! zp*+SFC7I#vKvoCHnm9uS=qHU&&qg^CFeF^F&b^rZL}q)v0pRV^Vf<46@*MH;3i6*4c;ip*@3LP9M}rbeG~5!AyYCYE3K+*Z>!UXc$1vFv$yllx~ zXya595t>dP%s_c$g|Bo1gM+8^0c$7o5V;^@sV^16`a`aDUG@s12Wuh&F2c+q8lSVrsA4jOjF#Z84zbX8DWuR z3~^H;nk+bPv{nu$S&s!tP!>&%!WmR`Jkptxg47jLmPMg)UoV}u9Vh?z=1+&l~!X+fqeIyc4K>>U5paOY#K zop!|!iy{!d9ib}86N3|N1{e3zX~GakB^CB3?fb8fx>&(W7Qh&P1?qJ=_g|l-i-I6#5A@K*gzm!f}k1d5E`?sHbHMDWv*INAW<@5 zzv)Ax!p5D~C&wiPczxpyW({thyI)Yi?X0Qivi$FX;FY$SdgA*ab72f*vH zqb5x;2Idr>~S!W4@3K_w=U@)NEtU;7t`;ORd0Cx}{nL4%p>y`vbK}H*k1dmCq0Go#_3-Z?+*-E6@GCkl|zV2s`Hlz{9fhsXM3UJ$Ywpae9 zL^puBp&%GSMudQIR|481(FTOU&E^fQ*Zsv_JxsSz4DFeG?#BI|dE~ZBM;b2*kqgh#loG;tNb}-D#4hDd- zy4BeLkYNRg5SP?D#vY-1cnB@VlkP&xce#j=xwfDn)u`w|rwxY}`+UMg15_G~nmVA6 zdA@OHDVl{_CbYDqHUelF0z&Qv5hm3c3F8P&)0&mH{VaM=b5aNzH8S$5`vWMSFB=iqNGIe1za71!I8mU}0Tyc$RG%W!$;^=w( zCgE@N%#;zYoIWyw=!;i5g&~RbhIUv5D^0@=`3CjSSvyh;xK;)6oZncM3Q$J6Vz|Zz z8}NV%Ni@9G(PC*@xxGZl;o``y9F{OqelR0Yb`Z!;`DXRd0Sro-3mToZl=mu&p{ETe z)25)|-da~ucJzq-4o9^{&pN~yWhRzqD&!d0FW%)tJ5);Lhf{pd^8!90pNLP6Po7VK zPmz!Q(|5hor;%SGy<)@Cfq@MJUb*ExbG3KghQX!lH*C4;>KAWZbw%IB>-(&AHET9+UbA8S z*?sHR^sPQ?!}|5~!1oLLuH3SDWX9&c!QuDmt2Yb)2@Pd=eXG;es|QxBzj$+>61+&a zu3EEh)vMR_Eg9Ibwr~9fYc}?!>jwH(t$xkY>(*=@+J{rZZW+wdXRjJubl@gxV*McKZP`f2=MP@pH?R^C#NZ~{ z>obN=*L7W8U30qTcFpUW-?gBtyQ`?&6&%B=bJqvoedwP0$dlvR~_0H*?+dHp!e(!?b?%tl>-rj`^0dXPSFQn;( zR9i^aE6ZcSr@`NGq{s6)j?b*}tYiYuhAd4aJ&Dg`J_-N5Jh|Zp3F1wN@9nwEy;qLg z>y4ebcX~BBH2o*Dl2cCZ+Iz}|4_-bi*mr2w^j{pB?frW1g7+OcwBT3%s&2o0NB4}j zRXrbRf3)|sNwtMt(^f6}>GV5ZaJYZfdFOAqZZ)<`*z;`?)QG}fp4^pnYnbu zC9C`1bo+-W{N=BG{|7%j+%{(Eiq(BXJ3o2v=RW`K?;QTun{K}4&JTX>^I!hz1K;@W z_m=PZ>;LwZ2fnf5yz?)4>8mb#!<%pW#HT;=`7eCstKS(jVdBeQ@$>)v>mx&L*KGR7 z@3(iHuztg|<1f46#*cmcukQVi2@|KEuhra#D;eY+Nfz7uK zZh8A@mz{X(X?K16GoSzJH@@@zcP)O$p03+YIQWGJj+}S?%U)h6cEl&0_T!(d-_Y~? zGnXvgefzJEy!fgu_kZodZ$A7F|Ie?Fc*$k;9p8_3oL!t6<;QIQX#3Dd7IapI4uzA8 zeso$iKPqtjQNA#yd_l+9!o`I!npQ4_#jp^f1&CG7g_XSDeq3%*IHr)##f3`>LE*Tz z3!<~a*$js<`Ht$M==kSemRu9{KX>T<+>Qg`l>Clgg)c1}SD9EEUmaiV&zJL4@-Ho% zl3P}u6;;tZb1JiWFAF|+a0)jEc5 zjdr|aa^<*PZ_S;Cxy zEX+wmzIWZnl!CEp>%FE^v3*0?yOFX=G+l&|L%!}YA!eQ=VP{C z6JOVPa-O$uiiSQHP7OQSJjMX%1&C=-=0fiFC`O>i=EjW~?;jUT3?{ct%N<{w;rEAY z`7zdS1`k!gUHbdrJHdDTL%BzT$AcdyhodKge-98;zk1T?XPkHbZSQ;E`}2iT_w&zq z$xk2rW;A|Mch5^M+4kX&ef+N%92)!jH@x|MP4ScTop=7~zE^zuGgGG(isj1qiQNkq z?fcNf|4{1Lefz#b`SdfcTyxu7HeB}OpS5D#i*Vq5s-ooT5_2-^(=9j+`CC_>8iJkL$7cGCmxfi_n;+IIqF2ADh%C(!X zyJ6cK@BHw`4;*~(V;_Ib*Vk|O(^u7Bn+svdm7#yysY5%C59f4Di)NIj=T6C;9kri4 z^x^!BXhzgooL}*Wc5m+~O(++K_ACsqD3-b=^LmzxqeQBkfZyUF;Q0|@;#X|?5xBA7^<)!knrBjy|Uwr(+ z?S*CKt} zeqwo9xidFz$AOpkt&A2H#w-@A-|<9o=ii@P`oRC*e!`q^OjO){>l>oAxwf!Wi2wBR zp`VvG7uQc*HuSFX)k{i~hhD$^obcu)9mm~#!6`%Eo*hn!g6$g@<@}qyq3_H*H$r{i zH0JDcpFi})=jHwA;@s5v!S?o9(dz0;%0nOPJ-%&LR6?ZlL+`rj;bL3Z77kWlT42aT zy};jDte?02qUv#Bm@AYf7Ye1YtuS-wZ=YM1F1mW4Z}Zg~)~%-E`psAN4J^aX#1!qj7E^R^VAU0as)=d=@<76tic%l6Tv&Z<=qLS&)TwiaKkm&SS|TA(l4RTm9JT| z{;Fhc-)oXDr_p0f3?0EXm>t5>aApY&Y^KAYFb+)l1E z9A+ihw~LZl$r_o$i;|CgSRTM%|K*V*FaE@@k9=hMjGrI)`QC4JUG@2~H~)0!%4=7D z=c6mn`t)5>SHA0?w=MjaF}^KAyo1G?>8I=LS5_u^%S)de%rWz^M3jd^(m*X zxMSVH-05HWm-x#Qmo563e+vaY@4Y|U;dvXcKI8U(?z!{uzkKY8>VzluUGhIPxFS;;+5_o8<>?`o)aL>;5^vy8ht_w_-9+&kydf%8^((fQ&wS?->GzQFAF%>GZV*fOxSFIlrX;hjo2cBR~#P}w=;s*pSS z-zWt}DKJWbQ3{MwV3Y!*6d0wzC> for Test { fn convert(w: Weight) -> contract::BalanceOf { - w + w as u128 } } @@ -45,7 +45,7 @@ impl system::Config for Test { type DbWeight = (); type Version = (); type PalletInfo = (); - type AccountData = pallet_balances::AccountData; + type AccountData = pallet_balances::AccountData; type OnNewAccount = (); type OnKilledAccount = (); type SystemWeightInfo = (); @@ -55,7 +55,7 @@ impl system::Config for Test { parameter_types! { pub const MinimumPeriod: u64 = 1; - pub static ExistentialDeposit: u64 = 0; + pub static ExistentialDeposit: u128 = 0; } impl pallet_timestamp::Config for Test { @@ -81,7 +81,7 @@ type System = system::Module; impl pallet_balances::Config for Test { type MaxLocks = (); - type Balance = u64; + type Balance = u128; type Event = (); type DustRemoval = (); type ExistentialDeposit = ExistentialDeposit; @@ -95,11 +95,11 @@ type Randomness = pallet_randomness_collective_flip::Module; parameter_types! { pub const SignedClaimHandicap: u64 = 2; - pub const TombstoneDeposit: u64 = 16; + pub const TombstoneDeposit: u128 = 16; pub const StorageSizeOffset: u32 = 8; - pub const RentByteFee: u64 = 4; - pub const RentDepositOffset: u64 = 10_000; - pub const SurchargeReward: u64 = 150; + pub const RentByteFee: u128 = 4; + pub const RentDepositOffset: u128 = 10_000; + pub const SurchargeReward: u128 = 150; pub const MaxDepth: u32 = 100; pub const MaxValueSize: u32 = 16_384; } @@ -128,7 +128,7 @@ pub type Contracts = contract::Module; pub const ALICE: AccountId32 = AccountId32::new([1u8; 32]); pub struct ExtBuilder { - existential_deposit: u64, + existential_deposit: u128, } impl Default for ExtBuilder { fn default() -> Self { @@ -143,7 +143,7 @@ impl ExtBuilder { EXISTENTIAL_DEPOSIT.with(|v| *v.borrow_mut() = self.existential_deposit); } - pub fn existential_deposit(mut self, existential_deposit: u64) -> Self { + pub fn existential_deposit(mut self, existential_deposit: u128) -> Self { self.existential_deposit = existential_deposit; self } @@ -156,8 +156,11 @@ impl ExtBuilder { pallet_balances::GenesisConfig:: { balances: vec![] } .assimilate_storage(&mut t) .unwrap(); + + let mut current_schedule = contract::Schedule::::default(); + current_schedule.enable_println = true; contract::GenesisConfig:: { - current_schedule: contract::Schedule::::default(), + current_schedule, } .assimilate_storage(&mut t) .unwrap(); diff --git a/pallets/template/src/tests.rs b/pallets/template/src/tests.rs index 7b749aeb..c7a024f2 100644 --- a/pallets/template/src/tests.rs +++ b/pallets/template/src/tests.rs @@ -3,6 +3,7 @@ use crate::{mock::*, Module}; use contract::{ConfigCache, Gas}; use frame_support::{assert_ok, traits::Currency, weights::Weight}; use sp_runtime::traits::{Hash, Zero}; +use codec::Encode; const GAS_LIMIT: Gas = 10_000_000_000; @@ -12,10 +13,10 @@ fn test_build() { .existential_deposit(50) .build() .execute_with(|| { - let _ = crate::mock::Balances::deposit_creating(&ALICE, 100_000_000); - let module = include_bytes!(concat!(env!("OUT_DIR"), "/groth16.wasm")).to_vec(); - let hash = ::Hashing::hash(&module); - Contracts::put_code(Origin::signed(ALICE.clone()), module).unwrap(); + let _ = crate::mock::Balances::deposit_creating(&ALICE, 100_000_000_000_000_000); + let code = include_bytes!("../res/groth16.wasm").to_vec(); + let hash = ::Hashing::hash(&code); + Contracts::put_code(Origin::signed(ALICE.clone()), code).unwrap(); let storage_size = ConfigCache::::subsistence_threshold_uncached() .checked_div(::RentDepositOffset::get()) @@ -24,27 +25,28 @@ fn test_build() { // Endowment should be large but not as large to inhibit rent payments. let endowment = ::RentDepositOffset::get() .saturating_mul( - storage_size + ::StorageSizeOffset::get() as u64, + storage_size + ::StorageSizeOffset::get() as u128, ) - .saturating_sub(1u32.into()); + .saturating_sub(1u128.into()); Contracts::instantiate( Origin::signed(ALICE.clone()), endowment, // endowment Weight::max_value(), // gas_limit hash.clone(), // code_hash - [106, 55, 18, 226].to_vec(), // flip + [106, 55, 18, 226].to_vec(), // default b"".to_vec(), // salt ) .unwrap(); let addr = Contracts::contract_address(&ALICE, &hash, &b"".to_vec()); // let result = >::call(Origin::signed(ALICE), addr.clone(), hex::decode("4e1f2d81088501e60f6032ed7f170ba3481c5d99c0890554c808ad380a7c9aefc9e62eeecf0363ecef5e59ba8eaf6dd0af40e08d7cfd024314f90080a1461a207aa3098308149837bc6322a8f4b499671c507203e798f90a9aa8fafaebb806c8708c3207a93316008501ea7f398187aecf2721441218e54645b17acd35bdf65886255e772a58353ef2e25c92cf7f872bea5afca6081d03e6b115e74befd85720c241ee5ef038621a1cc72e329db9aebec0faf480e83cbd9e4b735650ab0cce2e321d64311bd34bca9e0200910a9094c864d37f890720969430f2682ccc76dc83f9234694590bd334b40dbfa7f28de40e914571d8ae2a88712844f86f0d6dd2f4875120f66304bfcedd55c9a805310155a5345ddc626cbb6fe5ce7026be174a08c798e4d1f1010f97138c30b10a0e23d3cde62852c7b2aabcd7603f87fc54cb0c2fcfa48a1a6e07ea917eec248284a1409dd21ae7bd64b862e7df91fd0af1f36857260a843ea18cd393172b91196ca17bc5f37efb126d585abfcf23b8438d72f90365c382b661256d7caa361d07000c06c5cc02155140b97283cc024daf57023a781a9115bb6e17350264f8b52784a6008921402af8c05dd39f4b789bd50435d2c5aefeb6dc9817af41f45779e3a2d80ab98ef923723b938566747c10a4a169ca5097c5d5073449c3d2e65e16291850a5721416e102df69729ffab67cf948ca51c4ac4c2b54c521552fd4a5a5462d6d3b77ba9932aba0fda8ea8da76e5b0b9166ba600f9c5cc5e442b64ed560c126f8b88e2761c0c6a17a4dcbc1a132a975683ed0b6018ac45d7f4942ad7831790e00408697568bc15871da494a2fe12199531130a8a5b96f07c69020dc01bf9f3ed043a6e1bd08f8d7826c7d5c0fc5c771195ab91bf6eeaa33cbd89cd7dce7930b383c2453d0cca5c227e1b97b1ae253e40cadf4468d6d86f0bf69a0b0bb55774219005b6d86316ea7c1dc4df3e3396a9f78aadf416d5af1619883f5dbbf0a39c6743b194e5adedda54d7cb3ae33e556602e19dd43a31bca7bdb15ad5245dc1ad0affb97edc8f35bb00d1c5b417a132d5be9b72a39870193b6a142198a888c0fe3760fdf1467c7208394270f2aff044c5c002d6cf189a28e34851dc434933e73e07482dad6c7ab931bfbdf29f5d51a6a866d028b91cd89abc9728cf2f8e139f612b5a248ca0758365d1d83c6bc299152b15a89b136e804ae71174d4f35970be570fd14000d06fcafa9753aee681f006d7bf6fc885dcc1a70c33bbfe92bb581ac51e1325b782b1128b1586767cb2ea27555e243abd213634b87418421a65002e06fd9347b23205761d7e35a2a83ffcd35b16b6bf23982700597f2ed9706ae5e039542e8eabd1800443cc8d6ffec17c44207dd41e8ab2f2f2c663f5ed9ab724321de43cbe2ea81908c13643c42a41be1adbc5076e4927b13046d3cdaf5ef775ee48d842599508178276cd41d30e289cbd1d2bb9f92f59b520138fef3e9529139f3961f40f6ea92113ed1701b0eb62a8b21b0852f5ae0d23b4d8cf7a02a69b04abbf0b9213cc1cd16b0afed74a09f1d965f72e0faaad60215c2788b9672a8f53fb90d44b47fb16e4f97f910226d8ad46ddc1dfa6eb4f709a3c95ccfa7f4cd1b9ea5f3cf3d10c5dd0200de094abc5e25fac259efcfd79a97401359069cde3b48eaa9d3a4d848959eb269d788a415d9c22fb418459474f1f0fc16f4572ace2876cf1170d400d1d12d588f816023602a077b8fa66293ac19c951b6c572fad4481fa576e362d9f3a0ffa0120004801d6c7850edbac8a5281ab93d2ed245d47b64f20c21950926d595624b488c291c").expect("Decode failed")); + let result = >::call( Origin::signed(ALICE), addr, 0, GAS_LIMIT, - vec![192, 150, 165, 243], + vec![30, 92, 164, 86], ) .expect("call contract failed"); }); From 536c6abf0fd229758b6474102f0edf881591e2a3 Mon Sep 17 00:00:00 2001 From: clearloop Date: Sun, 20 Dec 2020 15:52:09 +0800 Subject: [PATCH 29/33] feat(template/tests): add contract tests --- pallets/template/groth16.wat | 18238 ++++++++++++++++++++++++- pallets/template/src/benchmarking.rs | 1 + pallets/template/src/mock.rs | 25 +- pallets/template/src/tests.rs | 88 +- 4 files changed, 17605 insertions(+), 747 deletions(-) diff --git a/pallets/template/groth16.wat b/pallets/template/groth16.wat index 414612ce..d5a438df 100644 --- a/pallets/template/groth16.wat +++ b/pallets/template/groth16.wat @@ -1,19 +1,26 @@ (module - (type (;0;) (func (param i32 i32))) - (type (;1;) (func (param i32 i32 i32))) - (type (;2;) (func (param i32) (result i32))) - (type (;3;) (func (param i32))) - (type (;4;) (func (result i32))) - (type (;5;) (func (param i32 i32 i32) (result i32))) - (type (;6;) (func (param i32 i32 i32 i32))) - (type (;7;) (func (param i32) (result i64))) - (import "seal0" "seal_get_storage" (func (;0;) (type 5))) - (import "seal0" "seal_set_storage" (func (;1;) (type 1))) - (import "seal0" "seal_value_transferred" (func (;2;) (type 0))) - (import "seal0" "seal_input" (func (;3;) (type 0))) - (import "seal0" "seal_return" (func (;4;) (type 1))) + (type (;0;) (func (param i32 i32 i32) (result i32))) + (type (;1;) (func (param i32 i32) (result i32))) + (type (;2;) (func (param i32 i32))) + (type (;3;) (func (param i32 i32 i32))) + (type (;4;) (func (param i32))) + (type (;5;) (func (param i32 i32 i32 i32))) + (type (;6;) (func (param i32) (result i32))) + (type (;7;) (func (param i32 i32 i32 i32) (result i32))) + (type (;8;) (func (param i32 i32 i32 i32 i32) (result i32))) + (type (;9;) (func (result i32))) + (type (;10;) (func (param i32) (result i64))) + (type (;11;) (func (param i32 i32 i32 i32 i32))) + (type (;12;) (func (param i32 i32 i32 i32 i32 i32))) + (type (;13;) (func (param i32 i32 i32 i32 i32 i32 i32) (result i32))) + (type (;14;) (func (param i64 i32) (result i32))) + (import "seal0" "seal_get_storage" (func (;0;) (type 0))) + (import "seal0" "seal_set_storage" (func (;1;) (type 3))) + (import "seal0" "seal_input" (func (;2;) (type 2))) + (import "seal0" "seal_return" (func (;3;) (type 3))) + (import "seal0" "seal_call_chain_extension" (func (;4;) (type 8))) (import "env" "memory" (memory (;0;) 2 16)) - (func (;5;) (type 2) (param i32) (result i32) + (func (;5;) (type 4) (param i32) (local i32) global.get 0 i32.const -64 @@ -59,12 +66,12 @@ i32.const 16384 i32.store offset=52 local.get 1 - i32.const 65572 + i32.const 68972 i32.store offset=48 local.get 1 i32.const 16384 i32.store offset=56 - i32.const 65572 + i32.const 68972 local.get 1 i32.const 56 i32.add @@ -78,11 +85,16 @@ call 7 block ;; label = @1 block ;; label = @2 - block ;; label = @3 - block ;; label = @4 - local.get 0 - br_table 1 (;@3;) 0 (;@4;) 0 (;@4;) 2 (;@2;) 0 (;@4;) - end + local.get 0 + call 8 + local.tee 0 + i32.const 10 + i32.ne + if ;; label = @3 + local.get 0 + i32.const 3 + i32.eq + br_if 1 (;@2;) unreachable end local.get 1 @@ -90,15 +102,22 @@ i64.load offset=48 i64.store offset=56 local.get 1 + local.get 1 i32.const 56 i32.add - call 8 - i32.const 255 + call 9 + local.get 1 + i32.load8_u + i32.const 1 i32.and - local.tee 0 - i32.const 2 - i32.ne - br_if 1 (;@1;) + i32.eqz + if ;; label = @3 + local.get 1 + i32.load8_u offset=1 + i32.const 2 + i32.lt_u + br_if 2 (;@1;) + end unreachable end unreachable @@ -106,11 +125,8 @@ local.get 1 i32.const -64 i32.sub - global.set 0 - local.get 0 - i32.const 0 - i32.ne) - (func (;6;) (type 2) (param i32) (result i32) + global.set 0) + (func (;6;) (type 6) (param i32) (result i32) (local i64 i64 i64) local.get 0 i64.load offset=32 @@ -158,7 +174,7 @@ i64.add i64.store offset=24 local.get 0) - (func (;7;) (type 0) (param i32 i32) + (func (;7;) (type 2) (param i32 i32) (local i32 i32 i32) global.get 0 i32.const 16 @@ -175,15 +191,16 @@ i32.load local.set 4 local.get 0 - i32.const 65572 + i32.const 68928 i32.store local.get 2 i32.const 8 i32.add + i32.const 0 local.get 1 local.get 4 local.get 3 - call 15 + call 66 local.get 0 local.get 2 i64.load offset=8 @@ -192,186 +209,52 @@ i32.const 16 i32.add global.set 0) - (func (;8;) (type 2) (param i32) (result i32) - (local i32 i32) - global.get 0 - i32.const 16 - i32.sub - local.tee 1 - global.set 0 - local.get 1 - i32.const 8 - i32.add - local.get 0 - call 11 - local.get 1 - i32.load8_u offset=9 - local.set 0 - local.get 1 - i32.load8_u offset=8 - local.set 2 - local.get 1 - i32.const 16 - i32.add - global.set 0 - i32.const 2 - i32.const 1 - i32.const 2 - local.get 0 - i32.const 1 - i32.eq - select - i32.const 0 - local.get 0 - select - local.get 2 - i32.const 1 - i32.and - select) - (func (;9;) (type 0) (param i32 i32) + (func (;8;) (type 6) (param i32) (result i32) (local i32) - global.get 0 - i32.const -64 - i32.add - local.tee 2 - global.set 0 - local.get 2 - i32.const 32 - i32.add - local.get 1 - i32.const 24 - i32.add - i64.load - i64.store - local.get 2 - i32.const 24 - i32.add - local.get 1 - i32.const 16 - i32.add - i64.load - i64.store - local.get 2 - i32.const 16 - i32.add - local.get 1 - i32.const 8 - i32.add - i64.load - i64.store - local.get 2 - i64.const 0 - i64.store offset=40 - local.get 2 - local.get 1 - i64.load - i64.store offset=8 - local.get 2 - i32.const 8 - i32.add - call 6 - local.get 2 - i32.const 56 - i32.add - i32.const 16384 - i32.store - local.get 2 - i32.const 65572 - i32.store offset=52 - local.get 2 - i32.const 0 - i32.store offset=48 - local.get 2 - local.get 2 - i32.const 48 - i32.add - local.get 0 - call 10 - local.get 2 - i32.load - local.get 2 - i32.load offset=4 - call 1 - local.get 2 - i32.const -64 - i32.sub - global.set 0) - (func (;10;) (type 1) (param i32 i32 i32) - (local i32 i32 i32) - global.get 0 - i32.const 16 - i32.sub - local.tee 3 - global.set 0 - local.get 1 - i32.const 8 - i32.add - local.tee 4 - i32.load - local.set 5 - local.get 4 - i32.const 0 - i32.store - local.get 1 - i32.load offset=4 - local.set 4 - local.get 1 - i32.const 65572 - i32.store offset=4 - local.get 3 - local.get 2 - i32.store8 offset=15 - local.get 3 - i32.const 1 - local.get 4 - local.get 5 - call 15 + i32.const 9 + local.set 1 block ;; label = @1 - local.get 3 - i32.load offset=4 - i32.const 1 - i32.eq - if ;; label = @2 - local.get 3 - i32.load - local.get 3 - i32.load8_u offset=15 - i32.store8 - local.get 1 - i32.const 0 - i32.store offset=8 - local.get 1 - i32.const 65572 - i32.store offset=4 - local.get 5 - i32.eqz - br_if 1 (;@1;) - local.get 1 - local.get 5 - i32.const -1 - i32.add - i32.store offset=8 - local.get 1 - local.get 4 - i32.const 1 - i32.add - i32.store offset=4 - local.get 0 - i32.const 1 - i32.store offset=4 - local.get 0 - local.get 4 - i32.store - local.get 3 - i32.const 16 - i32.add - global.set 0 + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + block ;; label = @5 + block ;; label = @6 + block ;; label = @7 + block ;; label = @8 + block ;; label = @9 + block ;; label = @10 + local.get 0 + br_table 0 (;@10;) 1 (;@9;) 2 (;@8;) 3 (;@7;) 4 (;@6;) 5 (;@5;) 6 (;@4;) 7 (;@3;) 8 (;@2;) 9 (;@1;) + end + i32.const 10 + return + end + i32.const 1 + return + end + i32.const 2 + return + end + i32.const 3 + return + end + i32.const 4 + return + end + i32.const 5 + return + end + i32.const 6 + return + end + i32.const 7 return end - unreachable + i32.const 8 + local.set 1 end - unreachable) - (func (;11;) (type 0) (param i32 i32) + local.get 1) + (func (;9;) (type 2) (param i32 i32) (local i32 i32) global.get 0 i32.const 16 @@ -387,7 +270,7 @@ i32.const 15 i32.add i32.const 1 - call 19 + call 105 i32.eqz if ;; label = @2 local.get 2 @@ -408,27 +291,311 @@ i32.const 16 i32.add global.set 0) - (func (;12;) (type 7) (param i32) (result i64) - (local i32 i32) + (func (;10;) (type 2) (param i32 i32) + (local i32) global.get 0 i32.const 16 i32.sub - local.tee 1 + local.tee 2 global.set 0 + local.get 2 + local.get 0 + i32.store8 offset=15 local.get 1 - i64.const 0 - i64.store8 offset=12 - local.get 1 - i64.const 0 - i64.store32 offset=8 - block (result i32) ;; label = @1 - loop ;; label = @2 + local.get 2 + i32.const 15 + i32.add + i32.const 1 + call 11 + local.get 2 + i32.const 16 + i32.add + global.set 0) + (func (;11;) (type 3) (param i32 i32 i32) + (local i32 i32 i32) + global.get 0 + i32.const 16 + i32.sub + local.tee 3 + global.set 0 + block ;; label = @1 + block ;; label = @2 + local.get 0 + i32.load offset=8 + local.tee 4 local.get 2 - i32.const 4 - i32.eq + i32.add + local.tee 5 + local.get 4 + i32.ge_u if ;; label = @3 + local.get 3 + i32.const 8 + i32.add + local.get 4 + local.get 5 + local.get 0 + i32.load + local.get 0 + i32.load offset=4 + call 66 + local.get 3 + i32.load offset=12 + local.get 2 + i32.ne + br_if 1 (;@2;) + local.get 3 + i32.load offset=8 local.get 1 - i64.load8_u offset=12 + local.get 2 + call 148 + local.get 0 + i32.load offset=8 + local.tee 1 + local.get 2 + i32.add + local.tee 2 + local.get 1 + i32.ge_u + br_if 2 (;@1;) + end + unreachable + end + unreachable + end + local.get 0 + local.get 2 + i32.store offset=8 + local.get 3 + i32.const 16 + i32.add + global.set 0) + (func (;12;) (type 4) (param i32) + local.get 0 + call 13 + local.get 0 + call 14) + (func (;13;) (type 4) (param i32) + (local i32) + local.get 0 + i32.load offset=8 + i32.const 12 + i32.mul + local.set 1 + local.get 0 + i32.load + local.set 0 + loop ;; label = @1 + local.get 1 + if ;; label = @2 + local.get 1 + i32.const -12 + i32.add + local.set 1 + local.get 0 + call 17 + local.get 0 + i32.const 12 + i32.add + local.set 0 + br 1 (;@1;) + end + end) + (func (;14;) (type 4) (param i32) + (local i32 i32) + global.get 0 + i32.const 16 + i32.sub + local.tee 1 + global.set 0 + local.get 1 + local.get 0 + call 102 + block ;; label = @1 + local.get 1 + i32.load + local.tee 0 + i32.eqz + br_if 0 (;@1;) + local.get 1 + i32.load offset=4 + local.tee 2 + i32.eqz + br_if 0 (;@1;) + local.get 0 + local.get 2 + call 16 + end + local.get 1 + i32.const 16 + i32.add + global.set 0) + (func (;15;) (type 4) (param i32) + (local i32 i32) + block ;; label = @1 + block ;; label = @2 + block ;; label = @3 + local.get 0 + i32.load8_u + br_table 0 (;@3;) 1 (;@2;) 2 (;@1;) + end + local.get 0 + i32.const 4 + i32.add + i32.load8_u + local.tee 1 + i32.const 7 + i32.and + i32.const 4 + i32.le_u + i32.const 0 + local.get 1 + i32.const 1 + i32.ne + select + br_if 1 (;@1;) + local.get 0 + i32.const 8 + i32.add + i32.load + local.tee 1 + i32.load + local.get 1 + i32.load offset=4 + i32.load + call_indirect (type 4) + local.get 1 + i32.load offset=4 + i32.load offset=4 + local.tee 2 + if ;; label = @3 + local.get 1 + i32.load + local.get 2 + call 16 + end + local.get 0 + i32.load offset=8 + i32.const 12 + call 16 + return + end + local.get 0 + i32.const 4 + i32.add + call 17 + end) + (func (;16;) (type 2) (param i32 i32) + local.get 0 + local.get 1 + call 92) + (func (;17;) (type 4) (param i32) + (local i32) + local.get 0 + i32.load offset=4 + local.tee 1 + if ;; label = @1 + local.get 0 + i32.load + local.get 1 + call 16 + end) + (func (;18;) (type 2) (param i32 i32) + local.get 0 + i32.load + local.get 0 + i32.load offset=8 + local.get 1 + call 19) + (func (;19;) (type 3) (param i32 i32 i32) + (local i32) + global.get 0 + i32.const 16 + i32.sub + local.tee 3 + global.set 0 + block ;; label = @1 + block ;; label = @2 + block ;; label = @3 + local.get 1 + i32.const 64 + i32.ge_u + if ;; label = @4 + local.get 1 + i32.const 16384 + i32.lt_u + br_if 1 (;@3;) + local.get 1 + i32.const 1073741824 + i32.lt_u + br_if 2 (;@2;) + local.get 2 + i32.const 3 + call 26 + local.get 1 + local.get 2 + call 95 + br 3 (;@1;) + end + local.get 2 + local.get 1 + i32.const 2 + i32.shl + call 26 + br 2 (;@1;) + end + local.get 3 + local.get 1 + i32.const 2 + i32.shl + i32.const 1 + i32.or + i32.store16 offset=14 + local.get 2 + local.get 3 + i32.const 14 + i32.add + i32.const 2 + call 11 + br 1 (;@1;) + end + local.get 1 + i32.const 2 + i32.shl + i32.const 2 + i32.or + local.get 2 + call 95 + end + local.get 2 + local.get 0 + local.get 1 + call 11 + local.get 3 + i32.const 16 + i32.add + global.set 0) + (func (;20;) (type 10) (param i32) (result i64) + (local i32 i32) + global.get 0 + i32.const 16 + i32.sub + local.tee 1 + global.set 0 + local.get 1 + i64.const 0 + i64.store8 offset=12 + local.get 1 + i64.const 0 + i64.store32 offset=8 + block (result i32) ;; label = @1 + loop ;; label = @2 + local.get 2 + i32.const 4 + i32.eq + if ;; label = @3 + local.get 1 + i64.load8_u offset=12 i32.wrap_i64 i32.const 4 i32.lt_u @@ -439,7 +606,7 @@ end local.get 1 local.get 0 - call 11 + call 9 local.get 1 i32.load8_u i32.const 1 @@ -487,24 +654,39 @@ i64.const 8 i64.shl i64.or) - (func (;13;) (type 3) (param i32) + (func (;21;) (type 4) (param i32) (local i32) global.get 0 - i32.const 16 + i32.const 32 i32.sub local.tee 1 global.set 0 local.get 1 - local.get 0 - i32.store offset=12 + i32.const 24 + i32.add + i32.const 16384 + i32.store local.get 1 - i32.const 12 + i32.const 68972 + i32.store offset=20 + local.get 1 + i32.const 0 + i32.store offset=16 + local.get 1 + i32.const 8 i32.add - i32.load - i32.load8_u - call 14 + local.get 1 + i32.const 16 + i32.add + local.get 0 + call 25 + local.get 1 + i32.load offset=8 + local.get 1 + i32.load offset=12 + call 24 unreachable) - (func (;14;) (type 3) (param i32) + (func (;22;) (type 4) (param i32) (local i32) global.get 0 i32.const 32 @@ -517,7 +699,7 @@ i32.const 16384 i32.store local.get 1 - i32.const 65572 + i32.const 68972 i32.store offset=20 local.get 1 i32.const 0 @@ -529,37 +711,246 @@ i32.const 16 i32.add local.get 0 - call 10 - i32.const 0 + call 23 local.get 1 i32.load offset=8 local.get 1 i32.load offset=12 - call 4 + call 24 unreachable) - (func (;15;) (type 6) (param i32 i32 i32 i32) + (func (;23;) (type 3) (param i32 i32 i32) + (local i32 i64) + global.get 0 + i32.const 32 + i32.sub + local.tee 3 + global.set 0 + local.get 1 + i64.load offset=4 align=4 + local.set 4 + local.get 1 + i32.const 8 + i32.add i32.const 0 + i32.store local.get 1 - i32.le_u - if ;; label = @1 - local.get 3 - local.get 1 - i32.ge_u + i32.const 68928 + i32.store offset=4 + local.get 3 + i32.const 0 + i32.store offset=24 + local.get 3 + local.get 4 + i64.store offset=16 + block ;; label = @1 + local.get 2 + i32.load + i32.const 1 + i32.eq if ;; label = @2 - local.get 0 - local.get 1 - i32.store offset=4 - local.get 0 + local.get 3 + i32.const 16 + i32.add + i32.const 1 + call 26 local.get 2 - i32.store - return + i32.const 4 + i32.add + local.get 3 + i32.const 16 + i32.add + call 18 + br 1 (;@1;) end - unreachable + local.get 3 + i32.const 16 + i32.add + i32.const 0 + call 26 + local.get 2 + i32.load offset=4 + local.get 2 + i32.const 12 + i32.add + i32.load + local.get 3 + i32.const 16 + i32.add + call 19 end + local.get 1 + local.get 3 + i64.load offset=16 + i64.store offset=4 align=4 + local.get 3 + i32.const 8 + i32.add + local.get 1 + local.get 3 + i32.load offset=24 + call 27 + local.get 0 + local.get 3 + i64.load offset=8 + i64.store + local.get 3 + i32.const 32 + i32.add + global.set 0) + (func (;24;) (type 2) (param i32 i32) + i32.const 0 + local.get 0 + local.get 1 + call 3 unreachable) - (func (;16;) (type 4) (result i32) + (func (;25;) (type 3) (param i32 i32 i32) + (local i32 i64) + global.get 0 + i32.const 32 + i32.sub + local.tee 3 + global.set 0 + local.get 1 + i64.load offset=4 align=4 + local.set 4 + local.get 1 + i32.const 8 + i32.add i32.const 0 - call 17 + i32.store + local.get 1 + i32.const 68928 + i32.store offset=4 + local.get 3 + i32.const 0 + i32.store offset=24 + local.get 3 + local.get 4 + i64.store offset=16 + block ;; label = @1 + local.get 2 + i32.load8_u + i32.const 1 + i32.eq + if ;; label = @2 + local.get 3 + i32.const 16 + i32.add + i32.const 1 + call 26 + local.get 2 + i32.const 4 + i32.add + local.get 3 + i32.const 16 + i32.add + call 18 + br 1 (;@1;) + end + local.get 3 + i32.const 16 + i32.add + i32.const 0 + call 26 + local.get 2 + i32.load8_u offset=1 + local.get 3 + i32.const 16 + i32.add + call 10 + end + local.get 1 + local.get 3 + i64.load offset=16 + i64.store offset=4 align=4 + local.get 3 + i32.const 8 + i32.add + local.get 1 + local.get 3 + i32.load offset=24 + call 27 + local.get 0 + local.get 3 + i64.load offset=8 + i64.store + local.get 3 + i32.const 32 + i32.add + global.set 0) + (func (;26;) (type 2) (param i32 i32) + (local i32) + block ;; label = @1 + local.get 0 + i32.load offset=8 + local.tee 2 + local.get 0 + i32.load offset=4 + i32.ge_u + br_if 0 (;@1;) + local.get 0 + i32.load + local.get 2 + i32.add + local.get 1 + i32.store8 + local.get 0 + i32.load offset=8 + local.tee 1 + i32.const 1 + i32.add + local.tee 2 + local.get 1 + i32.lt_u + br_if 0 (;@1;) + local.get 0 + local.get 2 + i32.store offset=8 + return + end + unreachable) + (func (;27;) (type 3) (param i32 i32 i32) + (local i32 i32) + local.get 1 + i32.const 8 + i32.add + local.tee 3 + i32.load + local.set 4 + local.get 3 + i32.const 0 + i32.store + local.get 1 + i32.load offset=4 + local.set 3 + local.get 1 + i32.const 68928 + i32.store offset=4 + local.get 4 + local.get 2 + i32.lt_u + if ;; label = @1 + unreachable + end + local.get 1 + local.get 4 + local.get 2 + i32.sub + i32.store offset=8 + local.get 1 + local.get 2 + local.get 3 + i32.add + i32.store offset=4 + local.get 0 + local.get 2 + i32.store offset=4 + local.get 0 + local.get 3 + i32.store) + (func (;28;) (type 9) (result i32) + i32.const 0 + call 29 i32.const 255 i32.and i32.const 2 @@ -567,10 +958,10 @@ i32.const 65536 i32.add i32.load) - (func (;17;) (type 2) (param i32) (result i32) - (local i32 i32 i32 i32 i32 i64) + (func (;29;) (type 6) (param i32) (result i32) + (local i32 i32 i32 i32 i32 i32 i32 i64 i64 i64 i64 i64) global.get 0 - i32.const 48 + i32.const 192 i32.sub local.tee 1 global.set 0 @@ -578,520 +969,16854 @@ block (result i32) ;; label = @2 block ;; label = @3 block ;; label = @4 - local.get 0 - if ;; label = @5 - local.get 1 - i32.const 16384 - i32.store offset=12 - local.get 1 - i32.const 65572 - i32.store offset=8 + block ;; label = @5 + block ;; label = @6 + block ;; label = @7 + block ;; label = @8 + block ;; label = @9 + block ;; label = @10 + block ;; label = @11 + block ;; label = @12 + block ;; label = @13 + local.get 0 + if ;; label = @14 + local.get 1 + i32.const 16384 + i32.store offset=12 + local.get 1 + i32.const 68972 + i32.store offset=8 + local.get 1 + i32.const 8 + i32.add + call 31 + local.get 1 + local.get 1 + i64.load offset=8 + i64.store offset=24 + i32.const 1 + local.set 0 + local.get 1 + i32.const 24 + i32.add + call 20 + local.tee 8 + i32.wrap_i64 + local.tee 3 + i32.const 1 + i32.and + br_if 11 (;@3;) + local.get 8 + i64.const 1099511627775 + i64.and + local.tee 8 + i64.const 32 + i64.shr_u + i32.wrap_i64 + local.set 2 + local.get 8 + i64.const 24 + i64.shr_u + i32.wrap_i64 + local.set 4 + local.get 8 + i64.const 16 + i64.shr_u + i32.wrap_i64 + local.set 5 + block ;; label = @15 + block ;; label = @16 + block ;; label = @17 + block (result i32) ;; label = @18 + block ;; label = @19 + local.get 3 + i32.const 8 + i32.shr_u + i32.const 255 + i32.and + local.tee 3 + i32.const 224 + i32.ne + if ;; label = @20 + local.get 3 + i32.const 67 + i32.eq + br_if 1 (;@19;) + block ;; label = @21 + local.get 3 + i32.const 78 + i32.ne + if ;; label = @22 + local.get 3 + i32.const 153 + i32.eq + br_if 1 (;@21;) + local.get 3 + i32.const 18 + i32.ne + local.get 2 + i32.const 158 + i32.ne + i32.or + local.get 5 + i32.const 255 + i32.and + i32.const 97 + i32.ne + local.get 4 + i32.const 255 + i32.and + i32.const 199 + i32.ne + i32.or + i32.or + br_if 19 (;@3;) + local.get 1 + i32.const -64 + i32.sub + local.get 1 + i32.const 24 + i32.add + call 32 + local.get 1 + i32.load offset=64 + local.tee 3 + i32.eqz + br_if 19 (;@3;) + local.get 1 + i64.load offset=68 align=4 + local.set 8 + local.get 1 + i32.const 80 + i32.add + local.get 1 + i32.const 104 + i32.add + i64.load align=4 + i64.store + local.get 1 + i32.const 72 + i32.add + local.get 1 + i32.const 96 + i32.add + i64.load align=4 + i64.store + local.get 1 + local.get 1 + i64.load offset=88 align=4 + i64.store offset=64 + i32.const 0 + br 4 (;@18;) + end + local.get 2 + i32.const 129 + i32.ne + local.get 5 + i32.const 255 + i32.and + i32.const 31 + i32.ne + i32.or + local.get 4 + i32.const 255 + i32.and + i32.const 45 + i32.ne + i32.or + br_if 18 (;@3;) + local.get 1 + i32.const 88 + i32.add + local.get 1 + i32.const 24 + i32.add + call 33 + local.get 1 + i32.load offset=88 + local.tee 3 + i32.eqz + br_if 18 (;@3;) + local.get 1 + local.get 1 + i64.load offset=92 align=4 + local.tee 8 + i64.store offset=164 align=4 + local.get 1 + local.get 3 + i32.store offset=160 + local.get 1 + i32.const 88 + i32.add + local.get 1 + i32.const 24 + i32.add + call 32 + local.get 1 + i32.load offset=88 + local.tee 2 + i32.eqz + br_if 8 (;@13;) + local.get 1 + local.get 1 + i64.load offset=92 align=4 + i64.store offset=132 align=4 + local.get 1 + local.get 2 + i32.store offset=128 + local.get 1 + i32.const 88 + i32.add + local.get 1 + i32.const 24 + i32.add + call 32 + local.get 1 + i32.load offset=88 + local.tee 2 + i32.eqz + br_if 9 (;@12;) + local.get 1 + local.get 1 + i64.load offset=92 align=4 + i64.store offset=180 align=4 + local.get 1 + local.get 2 + i32.store offset=176 + local.get 1 + i32.const 88 + i32.add + local.get 1 + i32.const 24 + i32.add + call 33 + local.get 1 + i32.load offset=88 + local.tee 2 + i32.eqz + br_if 4 (;@17;) + local.get 1 + i64.load offset=92 align=4 + local.set 9 + local.get 1 + i32.const 72 + i32.add + local.get 1 + i32.const 136 + i32.add + i32.load + i32.store + local.get 1 + i32.const 84 + i32.add + local.get 1 + i32.const 184 + i32.add + i32.load + i32.store + local.get 1 + local.get 1 + i64.load offset=128 + i64.store offset=64 + local.get 1 + local.get 1 + i64.load offset=176 + i64.store offset=76 align=4 + i32.const 1 + br 3 (;@18;) + end + local.get 2 + i32.const 55 + i32.ne + local.get 5 + i32.const 255 + i32.and + i32.const 160 + i32.ne + i32.or + local.get 4 + i32.const 255 + i32.and + i32.const 102 + i32.ne + i32.or + br_if 17 (;@3;) + local.get 1 + i32.const 88 + i32.add + local.get 1 + i32.const 24 + i32.add + call 33 + local.get 1 + i32.load offset=88 + local.tee 3 + i32.eqz + br_if 17 (;@3;) + local.get 1 + local.get 1 + i64.load offset=92 align=4 + local.tee 8 + i64.store offset=164 align=4 + local.get 1 + local.get 3 + i32.store offset=160 + local.get 1 + i32.const 88 + i32.add + local.get 1 + i32.const 24 + i32.add + call 32 + local.get 1 + i32.load offset=88 + local.tee 2 + i32.eqz + br_if 9 (;@11;) + local.get 1 + local.get 1 + i64.load offset=92 align=4 + i64.store offset=132 align=4 + local.get 1 + local.get 2 + i32.store offset=128 + local.get 1 + i32.const 88 + i32.add + local.get 1 + i32.const 24 + i32.add + call 32 + local.get 1 + i32.load offset=88 + local.tee 2 + i32.eqz + br_if 10 (;@10;) + local.get 1 + local.get 1 + i64.load offset=92 align=4 + i64.store offset=180 align=4 + local.get 1 + local.get 2 + i32.store offset=176 + local.get 1 + i32.const 88 + i32.add + local.get 1 + i32.const 24 + i32.add + call 33 + local.get 1 + i32.load offset=88 + local.tee 2 + i32.eqz + br_if 4 (;@16;) + local.get 1 + i64.load offset=92 align=4 + local.set 9 + local.get 1 + i32.const 72 + i32.add + local.get 1 + i32.const 136 + i32.add + i32.load + i32.store + local.get 1 + i32.const 84 + i32.add + local.get 1 + i32.const 184 + i32.add + i32.load + i32.store + local.get 1 + local.get 1 + i64.load offset=128 + i64.store offset=64 + local.get 1 + local.get 1 + i64.load offset=176 + i64.store offset=76 align=4 + i32.const 2 + br 2 (;@18;) + end + local.get 2 + i32.const 151 + i32.ne + local.get 5 + i32.const 255 + i32.and + i32.const 40 + i32.ne + i32.or + local.get 4 + i32.const 255 + i32.and + i32.const 36 + i32.ne + i32.or + br_if 16 (;@3;) + local.get 1 + i32.const 88 + i32.add + local.get 1 + i32.const 24 + i32.add + call 33 + local.get 1 + i32.load offset=88 + local.tee 3 + i32.eqz + br_if 16 (;@3;) + local.get 1 + local.get 1 + i64.load offset=92 align=4 + local.tee 8 + i64.store offset=164 align=4 + local.get 1 + local.get 3 + i32.store offset=160 + local.get 1 + i32.const 88 + i32.add + local.get 1 + i32.const 24 + i32.add + call 32 + local.get 1 + i32.load offset=88 + local.tee 2 + i32.eqz + br_if 10 (;@9;) + local.get 1 + local.get 1 + i64.load offset=92 align=4 + i64.store offset=132 align=4 + local.get 1 + local.get 2 + i32.store offset=128 + local.get 1 + i32.const 88 + i32.add + local.get 1 + i32.const 24 + i32.add + call 32 + local.get 1 + i32.load offset=88 + local.tee 2 + i32.eqz + br_if 11 (;@8;) + local.get 1 + local.get 1 + i64.load offset=92 align=4 + i64.store offset=180 align=4 + local.get 1 + local.get 2 + i32.store offset=176 + local.get 1 + i32.const 88 + i32.add + local.get 1 + i32.const 24 + i32.add + call 33 + local.get 1 + i32.load offset=88 + local.tee 2 + i32.eqz + br_if 4 (;@15;) + local.get 1 + i64.load offset=92 align=4 + local.set 9 + local.get 1 + i32.const 72 + i32.add + local.get 1 + i32.const 136 + i32.add + i32.load + i32.store + local.get 1 + i32.const 84 + i32.add + local.get 1 + i32.const 184 + i32.add + i32.load + i32.store + local.get 1 + local.get 1 + i64.load offset=128 + i64.store offset=64 + local.get 1 + local.get 1 + i64.load offset=176 + i64.store offset=76 align=4 + i32.const 3 + br 1 (;@18;) + end + local.get 2 + i32.const 6 + i32.ne + local.get 5 + i32.const 255 + i32.and + i32.const 153 + i32.ne + i32.or + local.get 4 + i32.const 255 + i32.and + i32.const 254 + i32.ne + i32.or + br_if 15 (;@3;) + local.get 1 + i32.const 88 + i32.add + local.get 1 + i32.const 24 + i32.add + call 33 + local.get 1 + i32.load offset=88 + local.tee 3 + i32.eqz + br_if 15 (;@3;) + local.get 1 + local.get 1 + i64.load offset=92 align=4 + local.tee 8 + i64.store offset=164 align=4 + local.get 1 + local.get 3 + i32.store offset=160 + local.get 1 + i32.const 88 + i32.add + local.get 1 + i32.const 24 + i32.add + call 32 + local.get 1 + i32.load offset=88 + local.tee 2 + i32.eqz + br_if 11 (;@7;) + local.get 1 + local.get 1 + i64.load offset=92 align=4 + i64.store offset=132 align=4 + local.get 1 + local.get 2 + i32.store offset=128 + local.get 1 + i32.const 88 + i32.add + local.get 1 + i32.const 24 + i32.add + call 32 + local.get 1 + i32.load offset=88 + local.tee 2 + i32.eqz + br_if 12 (;@6;) + local.get 1 + local.get 1 + i64.load offset=92 align=4 + i64.store offset=180 align=4 + local.get 1 + local.get 2 + i32.store offset=176 + local.get 1 + i32.const 88 + i32.add + local.get 1 + i32.const 24 + i32.add + call 33 + local.get 1 + i32.load offset=88 + local.tee 2 + i32.eqz + br_if 13 (;@5;) + local.get 1 + i64.load offset=92 align=4 + local.set 9 + local.get 1 + i32.const 72 + i32.add + local.get 1 + i32.const 136 + i32.add + i32.load + i32.store + local.get 1 + i32.const 84 + i32.add + local.get 1 + i32.const 184 + i32.add + i32.load + i32.store + local.get 1 + local.get 1 + i64.load offset=128 + i64.store offset=64 + local.get 1 + local.get 1 + i64.load offset=176 + i64.store offset=76 align=4 + i32.const 4 + end + local.set 5 + local.get 1 + i32.const 56 + i32.add + local.get 1 + i32.const 80 + i32.add + i64.load + i64.store + local.get 1 + i32.const 48 + i32.add + local.get 1 + i32.const 72 + i32.add + i64.load + i64.store + local.get 1 + local.get 1 + i64.load offset=64 + i64.store offset=40 + i32.const 0 + local.set 0 + br 14 (;@3;) + end + local.get 1 + i32.const 176 + i32.add + call 17 + local.get 1 + i32.const 128 + i32.add + call 17 + local.get 1 + i32.const 160 + i32.add + call 12 + br 13 (;@3;) + end + local.get 1 + i32.const 176 + i32.add + call 17 + local.get 1 + i32.const 128 + i32.add + call 17 + local.get 1 + i32.const 160 + i32.add + call 12 + br 12 (;@3;) + end + local.get 1 + i32.const 176 + i32.add + call 17 + local.get 1 + i32.const 128 + i32.add + call 17 + local.get 1 + i32.const 160 + i32.add + call 12 + br 11 (;@3;) + end + local.get 1 + i32.const 16384 + i32.store offset=68 + local.get 1 + i32.const 68972 + i32.store offset=64 + local.get 1 + i32.const -64 + i32.sub + call 31 + local.get 1 + local.get 1 + i64.load offset=64 + i64.store offset=88 + i32.const 6 + local.get 1 + i32.const 88 + i32.add + call 20 + i64.const 1099511627521 + i64.and + i64.const 970968230400 + i64.ne + br_if 11 (;@2;) + drop + local.get 1 + i32.const 88 + i32.add + i32.const 40 + call 147 + local.get 1 + i32.const 88 + i32.add + call 6 + local.get 1 + i64.const 16384 + i64.store offset=68 align=4 + local.get 1 + i32.const 68972 + i32.store offset=64 + i32.const 0 + local.get 1 + i32.const -64 + i32.sub + call 10 + local.get 1 + i32.load offset=68 + local.get 1 + i32.load offset=72 + local.tee 2 + i32.lt_u + br_if 9 (;@4;) + local.get 1 + i32.load offset=64 + local.get 2 + call 1 + i32.const 8 + br 11 (;@2;) + end + local.get 1 + i32.const 160 + i32.add + call 12 + br 9 (;@3;) + end + local.get 1 + i32.const 128 + i32.add + call 17 + local.get 1 + i32.const 160 + i32.add + call 12 + br 8 (;@3;) + end + local.get 1 + i32.const 160 + i32.add + call 12 + br 7 (;@3;) + end + local.get 1 + i32.const 128 + i32.add + call 17 + local.get 1 + i32.const 160 + i32.add + call 12 + br 6 (;@3;) + end + local.get 1 + i32.const 160 + i32.add + call 12 + br 5 (;@3;) + end + local.get 1 + i32.const 128 + i32.add + call 17 + local.get 1 + i32.const 160 + i32.add + call 12 + br 4 (;@3;) + end + local.get 1 + i32.const 160 + i32.add + call 12 + br 3 (;@3;) + end local.get 1 - i32.const 8 + i32.const 128 i32.add - call 20 + call 17 local.get 1 - local.get 1 - i64.load offset=8 - i64.store offset=16 - i32.const 1 - local.set 3 - local.get 1 - i32.const 16 + i32.const 160 i32.add call 12 - local.tee 6 - i32.wrap_i64 - local.tee 5 - i32.const 1 - i32.and - if ;; label = @6 - i32.const 1 - local.set 2 - br 3 (;@3;) - end - local.get 6 - i64.const 1099511627775 - i64.and - local.tee 6 - i64.const 32 - i64.shr_u - i32.wrap_i64 - local.set 0 - local.get 6 - i64.const 24 - i64.shr_u - i32.wrap_i64 - local.set 4 - local.get 6 - i64.const 16 - i64.shr_u - i32.wrap_i64 - local.set 2 - local.get 5 - i32.const 8 - i32.shr_u - i32.const 255 - i32.and - local.tee 5 - i32.const 30 - i32.ne - if ;; label = @6 - local.get 5 - i32.const 192 - i32.ne - local.get 0 - i32.const 243 - i32.ne - i32.or - local.get 2 - i32.const 255 - i32.and - i32.const 150 - i32.ne - i32.or - br_if 2 (;@4;) - i32.const 0 - local.set 2 - local.get 4 - i32.const 255 - i32.and - i32.const 165 - i32.eq - br_if 3 (;@3;) - br 2 (;@4;) - end - local.get 0 - i32.const 86 - i32.ne - local.get 2 - i32.const 255 - i32.and - i32.const 92 - i32.ne - i32.or - br_if 1 (;@4;) - i32.const 0 - local.set 2 - i32.const 0 - local.set 3 - local.get 4 - i32.const 255 - i32.and - i32.const 164 - i32.ne - br_if 1 (;@4;) br 2 (;@3;) end local.get 1 - i32.const 16384 - i32.store offset=12 - local.get 1 - i32.const 65572 - i32.store offset=8 - local.get 1 - i32.const 8 + i32.const 176 i32.add - call 20 + call 17 local.get 1 + i32.const 128 + i32.add + call 17 local.get 1 - i64.load offset=8 - i64.store offset=16 - i32.const 3 - local.set 2 + i32.const 160 + i32.add + call 12 + br 1 (;@3;) + end + unreachable + end + local.get 0 + i32.eqz + if ;; label = @3 + local.get 1 + i32.const 80 + i32.add + local.get 1 + i32.const 56 + i32.add + i64.load + local.tee 11 + i64.store + local.get 1 + i32.const 72 + i32.add + local.get 1 + i32.const 48 + i32.add + i64.load + local.tee 10 + i64.store + local.get 1 + local.get 1 + i64.load offset=40 + local.tee 12 + i64.store offset=64 + local.get 1 + i32.const 104 + i32.add + local.tee 0 + local.get 11 + i64.store + local.get 1 + i32.const 96 + i32.add + local.tee 4 + local.get 10 + i64.store + local.get 1 + i32.const 32 + i32.add + local.tee 6 + local.get 10 + i64.store32 + local.get 1 + i32.const 16 + i32.add + local.tee 7 + local.get 1 + i32.const 108 + i32.add + i32.load + i32.store + local.get 1 + local.get 12 + i64.store offset=24 + local.get 1 + local.get 1 + i64.load offset=100 align=4 + i64.store offset=8 + block ;; label = @4 + block ;; label = @5 + block ;; label = @6 + block ;; label = @7 + block ;; label = @8 + local.get 5 + i32.const 1 + i32.sub + br_table 2 (;@6;) 3 (;@5;) 4 (;@4;) 0 (;@8;) 1 (;@7;) + end + local.get 1 + i32.const 112 + i32.add + i64.const 0 + i64.store + local.get 0 + i64.const 0 + i64.store + local.get 4 + i64.const 0 + i64.store + local.get 1 + i64.const 0 + i64.store offset=88 + local.get 1 + i32.const 88 + i32.add + call 5 + local.get 1 + local.get 8 + i64.store offset=148 align=4 + local.get 1 + local.get 3 + i32.store offset=144 + local.get 1 + i32.const 168 + i32.add + local.get 6 + i32.load + i32.store + local.get 1 + local.get 1 + i64.load offset=24 + i64.store offset=160 + local.get 1 + i32.const 136 + i32.add + local.get 7 + i32.load + i32.store + local.get 1 + local.get 1 + i64.load offset=8 + i64.store offset=128 + local.get 1 + local.get 9 + i64.store offset=180 align=4 + local.get 1 + local.get 2 + i32.store offset=176 + local.get 1 + i32.const 40 + i32.add + i32.const 48 + local.get 1 + i32.const 144 + i32.add + local.get 1 + i32.const 160 + i32.add + local.get 1 + i32.const 128 + i32.add + local.get 1 + i32.const 176 + i32.add + call 34 + br 6 (;@1;) + end + local.get 1 + i32.const 112 + i32.add + i64.const 0 + i64.store + local.get 0 + i64.const 0 + i64.store + local.get 4 + i64.const 0 + i64.store + local.get 1 + i64.const 0 + i64.store offset=88 + local.get 1 + i32.const 88 + i32.add + call 5 + local.get 1 + local.get 3 + i32.store offset=144 + local.get 1 + local.get 8 + i64.store offset=148 align=4 + local.get 1 + i32.const 40 + i32.add + i32.const 42 + local.get 3 + local.get 8 + i64.const 32 + i64.shr_u + i32.wrap_i64 + call 36 + i32.const 1 + local.set 3 + local.get 1 + i32.const 40 + i32.add + i32.const 4 + i32.or + local.set 0 + block ;; label = @7 + local.get 1 + i32.load offset=40 + i32.const 1 + i32.eq + if ;; label = @8 + local.get 1 + i32.const 184 + i32.add + local.get 0 + i32.const 8 + i32.add + i64.load align=4 + i64.store + local.get 1 + local.get 0 + i64.load align=4 + i64.store offset=176 + local.get 1 + i32.const 160 + i32.add + local.get 1 + i32.const 176 + i32.add + call 35 + local.get 1 + i32.const 176 + i32.add + call 15 + local.get 1 + i32.const 140 + i32.add + local.get 1 + i32.const 168 + i32.add + i32.load + i32.store + local.get 1 + local.get 1 + i64.load offset=160 + i64.store offset=132 align=4 + br 1 (;@7;) + end + local.get 1 + i32.const 140 + i32.add + local.get 0 + i32.const 8 + i32.add + i32.load + i32.store + local.get 1 + local.get 0 + i64.load align=4 + i64.store offset=132 align=4 + i32.const 0 + local.set 3 + end + local.get 1 + local.get 3 + i32.store offset=128 + local.get 1 + i32.const 144 + i32.add + call 17 + global.get 0 + i32.const 16 + i32.sub + local.tee 0 + global.set 0 + local.get 0 + local.get 1 + i32.const 128 + i32.add + i32.store offset=12 + local.get 0 + i32.const 12 + i32.add + i32.load + call 22 + unreachable + end + local.get 1 + i32.const 112 + i32.add + i64.const 0 + i64.store + local.get 0 + i64.const 0 + i64.store + local.get 4 + i64.const 0 + i64.store + local.get 1 + i64.const 0 + i64.store offset=88 + local.get 1 + i32.const 88 + i32.add + call 5 + local.get 1 + local.get 8 + i64.store offset=148 align=4 + local.get 1 + local.get 3 + i32.store offset=144 + local.get 1 + i32.const 168 + i32.add + local.get 6 + i32.load + i32.store + local.get 1 + local.get 1 + i64.load offset=24 + i64.store offset=160 + local.get 1 + i32.const 136 + i32.add + local.get 7 + i32.load + i32.store + local.get 1 + local.get 1 + i64.load offset=8 + i64.store offset=128 + local.get 1 + local.get 9 + i64.store offset=180 align=4 + local.get 1 + local.get 2 + i32.store offset=176 + local.get 1 + i32.const 40 + i32.add + i32.const 0 + local.get 1 + i32.const 144 + i32.add + local.get 1 + i32.const 160 + i32.add + local.get 1 + i32.const 128 + i32.add + local.get 1 + i32.const 176 + i32.add + call 34 + br 4 (;@1;) + end + local.get 1 + i32.const 112 + i32.add + i64.const 0 + i64.store + local.get 0 + i64.const 0 + i64.store + local.get 4 + i64.const 0 + i64.store + local.get 1 + i64.const 0 + i64.store offset=88 + local.get 1 + i32.const 88 + i32.add + call 5 + local.get 1 + local.get 8 + i64.store offset=148 align=4 + local.get 1 + local.get 3 + i32.store offset=144 + local.get 1 + i32.const 168 + i32.add + local.get 6 + i32.load + i32.store + local.get 1 + local.get 1 + i64.load offset=24 + i64.store offset=160 + local.get 1 + i32.const 136 + i32.add + local.get 7 + i32.load + i32.store + local.get 1 + local.get 1 + i64.load offset=8 + i64.store offset=128 + local.get 1 + local.get 9 + i64.store offset=180 align=4 + local.get 1 + local.get 2 + i32.store offset=176 + local.get 1 + i32.const 40 + i32.add + i32.const 16 + local.get 1 + i32.const 144 + i32.add + local.get 1 + i32.const 160 + i32.add + local.get 1 + i32.const 128 + i32.add + local.get 1 + i32.const 176 + i32.add + call 34 + br 3 (;@1;) + end + local.get 1 + i32.const 112 + i32.add + i64.const 0 + i64.store + local.get 0 + i64.const 0 + i64.store + local.get 4 + i64.const 0 + i64.store + local.get 1 + i64.const 0 + i64.store offset=88 + local.get 1 + i32.const 88 + i32.add + call 5 + local.get 1 + local.get 8 + i64.store offset=148 align=4 + local.get 1 + local.get 3 + i32.store offset=144 + local.get 1 + i32.const 168 + i32.add + local.get 6 + i32.load + i32.store + local.get 1 + local.get 1 + i64.load offset=24 + i64.store offset=160 + local.get 1 + i32.const 136 + i32.add + local.get 7 + i32.load + i32.store + local.get 1 + local.get 1 + i64.load offset=8 + i64.store offset=128 + local.get 1 + local.get 9 + i64.store offset=180 align=4 + local.get 1 + local.get 2 + i32.store offset=176 + local.get 1 + i32.const 40 + i32.add + i32.const 32 + local.get 1 + i32.const 144 + i32.add + local.get 1 + i32.const 160 + i32.add + local.get 1 + i32.const 128 + i32.add + local.get 1 + i32.const 176 + i32.add + call 34 + br 2 (;@1;) + end + i32.const 6 + end + local.get 1 + i32.const 192 + i32.add + global.set 0 + return + end + i32.const 1 + local.set 0 + block ;; label = @1 + local.get 1 + i32.load8_u offset=40 + i32.const 1 + i32.eq + if ;; label = @2 + local.get 1 + i32.const 184 + i32.add + local.get 1 + i32.const 52 + i32.add + i64.load align=4 + i64.store + local.get 1 + local.get 1 + i64.load offset=44 align=4 + i64.store offset=176 + local.get 1 + i32.const 160 + i32.add + local.get 1 + i32.const 176 + i32.add + call 35 + local.get 1 + i32.const 176 + i32.add + call 15 + local.get 1 + i32.const 140 + i32.add + local.get 1 + i32.const 168 + i32.add + i32.load + i32.store + local.get 1 + local.get 1 + i64.load offset=160 + i64.store offset=132 align=4 + br 1 (;@1;) + end + local.get 1 + local.get 1 + i32.load8_u offset=41 + i32.store8 offset=129 + i32.const 0 + local.set 0 + end + local.get 1 + local.get 0 + i32.store8 offset=128 + global.get 0 + i32.const 16 + i32.sub + local.tee 0 + global.set 0 + local.get 0 + local.get 1 + i32.const 128 + i32.add + i32.store offset=12 + local.get 0 + i32.const 12 + i32.add + i32.load + call 21 + unreachable) + (func (;30;) (type 9) (result i32) + i32.const 1 + call 29 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.const 65536 + i32.add + i32.load) + (func (;31;) (type 4) (param i32) + (local i32) + global.get 0 + i32.const 16 + i32.sub + local.tee 1 + global.set 0 + local.get 1 + local.get 0 + i32.load offset=4 + i32.store offset=12 + local.get 0 + i32.load + local.get 1 + i32.const 12 + i32.add + call 2 + local.get 0 + local.get 1 + i32.load offset=12 + call 7 + local.get 1 + i32.const 16 + i32.add + global.set 0) + (func (;32;) (type 2) (param i32 i32) + (local i32 i32) + global.get 0 + i32.const 32 + i32.sub + local.tee 2 + global.set 0 + local.get 2 + i32.const 8 + i32.add + local.get 1 + call 104 + block ;; label = @1 + local.get 2 + i32.load offset=8 + if ;; label = @2 + local.get 0 + i32.const 0 + i32.store + br 1 (;@1;) + end + block ;; label = @2 + local.get 1 + i32.load offset=4 + local.get 2 + i32.load offset=12 + local.tee 3 + i32.ge_u + if ;; label = @3 + local.get 2 + i32.const 16 + i32.add + local.get 3 + call 96 + local.get 1 + local.get 2 + i32.load offset=16 + local.tee 1 + local.get 2 + i32.load offset=24 + call 105 + i32.eqz + br_if 1 (;@2;) + local.get 2 + i32.const 16 + i32.add + call 17 + end + local.get 0 + i32.const 0 + i32.store + br 1 (;@1;) + end + local.get 0 + local.get 2 + i64.load offset=20 align=4 + i64.store offset=4 align=4 + local.get 0 + local.get 1 + i32.store + end + local.get 2 + i32.const 32 + i32.add + global.set 0) + (func (;33;) (type 2) (param i32 i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i64 i64) + global.get 0 + i32.const -64 + i32.add + local.tee 2 + global.set 0 + local.get 2 + i32.const 8 + i32.add + local.get 1 + call 104 + block ;; label = @1 + block ;; label = @2 + local.get 2 + i32.load offset=8 + if ;; label = @3 + local.get 0 + i32.const 0 + i32.store + br 1 (;@2;) + end + block ;; label = @3 + block ;; label = @4 + local.get 2 + i32.load offset=12 + local.tee 7 + local.get 1 + i32.load offset=4 + i32.const 12 + i32.div_u + local.tee 3 + local.get 3 + local.get 7 + i32.gt_u + select + i64.extend_i32_u + i64.const 12 + i64.mul + local.tee 10 + i64.const 32 + i64.shr_u + i32.wrap_i64 + br_if 0 (;@4;) + local.get 10 + i32.wrap_i64 + local.tee 3 + i32.const -1 + i32.le_s + br_if 0 (;@4;) + local.get 2 + local.get 3 + i32.const 4 + call 103 + local.get 2 + i32.load + local.tee 6 + i32.eqz + br_if 3 (;@1;) + local.get 2 + i32.load offset=4 + local.set 3 + local.get 2 + i32.const 0 + i32.store offset=24 + local.get 2 + local.get 6 + i32.store offset=16 + local.get 2 + local.get 3 + i32.const 12 + i32.div_u + local.tee 3 + i32.store offset=20 + loop ;; label = @5 + local.get 5 + local.get 7 + i32.eq + if ;; label = @6 + local.get 0 + i32.const 8 + i32.add + local.get 7 + i32.store + local.get 2 + local.get 3 + i32.store offset=20 + local.get 0 + local.get 2 + i64.load offset=16 + i64.store align=4 + br 4 (;@2;) + end + local.get 2 + i32.const 48 + i32.add + local.get 1 + call 32 + local.get 2 + i32.load offset=48 + local.tee 9 + i32.eqz + br_if 2 (;@3;) + local.get 2 + i64.load offset=52 align=4 + local.set 10 + block ;; label = @6 + block ;; label = @7 + local.get 3 + local.get 5 + i32.ne + if ;; label = @8 + local.get 3 + local.set 4 + local.get 5 + local.set 3 + br 1 (;@7;) + end + local.get 3 + i32.const 1 + i32.add + local.tee 4 + local.get 3 + i32.lt_u + if ;; label = @8 + local.get 2 + local.get 3 + i32.store offset=20 + local.get 2 + local.get 3 + i32.store offset=24 + br 4 (;@4;) + end + local.get 3 + local.get 3 + i32.add + local.tee 8 + local.get 3 + i32.lt_u + br_if 3 (;@4;) + block ;; label = @8 + local.get 3 + if ;; label = @9 + local.get 3 + i64.extend_i32_u + i64.const 12 + i64.mul + local.tee 11 + i64.const 32 + i64.shr_u + i32.wrap_i64 + br_if 5 (;@4;) + local.get 2 + i32.const 4 + i32.store offset=56 + local.get 2 + local.get 11 + i64.store32 offset=52 + local.get 2 + local.get 6 + i32.store offset=48 + br 1 (;@8;) + end + local.get 2 + i32.const 0 + i32.store offset=48 + end + local.get 2 + i32.const 32 + i32.add + local.get 8 + local.get 4 + local.get 8 + local.get 4 + i32.gt_u + select + local.tee 4 + i32.const 4 + local.get 4 + i32.const 4 + i32.gt_u + select + i64.extend_i32_u + i64.const 12 + i64.mul + local.tee 11 + i32.wrap_i64 + local.get 11 + i64.const 32 + i64.shr_u + i64.eqz + i32.const 2 + i32.shl + local.get 2 + i32.const 48 + i32.add + call 49 + local.get 2 + i32.load offset=40 + local.set 4 + local.get 2 + i32.load offset=32 + i32.const 1 + i32.eq + br_if 1 (;@6;) + local.get 2 + local.get 2 + i32.load offset=36 + local.tee 6 + i32.store offset=16 + local.get 4 + i32.const 12 + i32.div_u + local.set 4 + end + local.get 6 + local.get 3 + i32.const 12 + i32.mul + i32.add + local.tee 3 + local.get 10 + i64.store offset=4 align=4 + local.get 3 + local.get 9 + i32.store + local.get 5 + i32.const -1 + i32.eq + br_if 2 (;@4;) + local.get 5 + i32.const 1 + i32.add + local.set 5 + local.get 4 + local.set 3 + br 1 (;@5;) + end + end + local.get 2 + local.get 3 + i32.store offset=20 + local.get 2 + local.get 3 + i32.store offset=24 + local.get 4 + br_if 3 (;@1;) + end + unreachable + end + local.get 0 + i32.const 0 + i32.store + local.get 2 + local.get 3 + i32.store offset=20 + local.get 2 + local.get 5 + i32.store offset=24 + local.get 2 + i32.const 16 + i32.add + call 12 + end + local.get 2 + i32.const -64 + i32.sub + global.set 0 + return + end + unreachable) + (func (;34;) (type 12) (param i32 i32 i32 i32 i32 i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i64 i64 i64 i64) + global.get 0 + i32.const 880 + i32.sub + local.tee 6 + global.set 0 + block ;; label = @1 + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + block ;; label = @5 + block ;; label = @6 + block ;; label = @7 + block ;; label = @8 + block ;; label = @9 + block ;; label = @10 + block ;; label = @11 + block ;; label = @12 + block ;; label = @13 + block ;; label = @14 + block ;; label = @15 + block ;; label = @16 + local.get 1 + i32.const 28 + i32.rotl + br_table 1 (;@15;) 2 (;@14;) 3 (;@13;) 4 (;@12;) 0 (;@16;) + end + local.get 6 + local.get 1 + i32.store offset=744 + local.get 6 + i32.const 636 + i32.add + i32.const 1 + i32.store + local.get 6 + i64.const 1 + i64.store offset=620 align=4 + local.get 6 + i32.const 68928 + i32.store offset=616 + local.get 6 + i32.const 1 + i32.store offset=764 + local.get 6 + local.get 6 + i32.const 760 + i32.add + i32.store offset=632 + local.get 6 + local.get 6 + i32.const 744 + i32.add + i32.store offset=760 + local.get 6 + i32.const 776 + i32.add + local.get 6 + i32.const 616 + i32.add + call 54 + local.get 6 + i32.const 867 + i32.add + local.get 6 + i32.const 784 + i32.add + i32.load + i32.store align=1 + local.get 6 + local.get 6 + i64.load offset=776 + i64.store offset=859 align=1 + local.get 0 + i32.const 4 + i32.add + i32.const 1 + i32.store8 + local.get 0 + i32.const 5 + i32.add + local.get 6 + i64.load offset=856 align=1 + i64.store align=1 + local.get 0 + i32.const 12 + i32.add + local.get 6 + i32.const 863 + i32.add + i64.load align=1 + i64.store align=1 + local.get 0 + i32.const 1 + i32.store8 + local.get 5 + call 12 + local.get 4 + call 17 + local.get 3 + call 17 + local.get 2 + call 12 + br 14 (;@1;) + end + local.get 6 + i32.const 560 + i32.add + local.get 2 + i32.const 8 + i32.add + i32.load + i32.store + local.get 6 + local.get 2 + i64.load align=4 + i64.store offset=552 + local.get 6 + i32.const 576 + i32.add + local.get 3 + i32.const 8 + i32.add + i32.load + i32.store + local.get 6 + local.get 3 + i64.load align=4 + i64.store offset=568 + local.get 6 + i32.const 592 + i32.add + local.get 4 + i32.const 8 + i32.add + i32.load + i32.store + local.get 6 + local.get 4 + i64.load align=4 + i64.store offset=584 + local.get 6 + i32.const 608 + i32.add + local.get 5 + i32.const 8 + i32.add + i32.load + local.tee 1 + i32.store + local.get 6 + local.get 5 + i64.load align=4 + i64.store offset=600 + local.get 1 + i32.const 1 + i32.add + local.tee 3 + local.get 1 + i32.lt_u + local.tee 2 + br_if 3 (;@11;) + local.get 3 + local.get 6 + i32.load offset=560 + i32.ne + br_if 4 (;@10;) + local.get 2 + br_if 3 (;@11;) + local.get 6 + i32.const 792 + i32.add + local.get 6 + i32.load offset=552 + local.tee 2 + i32.load + local.get 2 + i32.load offset=8 + call 106 + local.get 6 + i32.load offset=600 + local.set 4 + local.get 6 + i32.const 632 + i32.add + i64.const 1 + i64.store + local.get 6 + i32.const 628 + i32.add + local.get 2 + local.get 3 + i32.const 12 + i32.mul + i32.add + i32.store + local.get 6 + i32.const 0 + i32.store offset=640 + local.get 6 + local.get 2 + i32.store offset=624 + local.get 6 + local.get 4 + local.get 1 + i32.const 12 + i32.mul + i32.add + i32.store offset=620 + local.get 6 + local.get 4 + i32.store offset=616 + local.get 6 + i32.const 856 + i32.add + i32.const 4 + i32.or + local.set 1 + block ;; label = @15 + block ;; label = @16 + block ;; label = @17 + block ;; label = @18 + block ;; label = @19 + block ;; label = @20 + block ;; label = @21 + block ;; label = @22 + loop ;; label = @23 + local.get 6 + i32.const 136 + i32.add + local.get 6 + i32.const 616 + i32.add + call 107 + local.get 6 + i32.load offset=136 + local.tee 2 + i32.eqz + if ;; label = @24 + local.get 6 + i32.const 128 + i32.add + local.get 6 + i32.const 584 + i32.add + i32.const 0 + i32.const 48 + call 108 + local.get 6 + i32.load offset=132 + local.set 2 + local.get 6 + i32.load offset=128 + local.set 3 + local.get 6 + i32.const 120 + i32.add + local.get 6 + i32.const 584 + i32.add + i32.const 48 + i32.const 96 + call 108 + local.get 6 + i32.load offset=124 + local.set 4 + local.get 6 + i32.load offset=120 + local.set 5 + local.get 6 + i32.const 112 + i32.add + local.get 6 + i32.const 584 + i32.add + i32.const 96 + i32.const 97 + call 108 + local.get 6 + i32.load offset=116 + local.set 8 + local.get 6 + i32.load offset=112 + local.set 9 + local.get 6 + i32.const 104 + i32.add + local.get 6 + i32.const 584 + i32.add + i32.const 97 + i32.const 290 + call 108 + local.get 6 + i32.load offset=108 + local.set 10 + local.get 6 + i32.load offset=104 + local.set 11 + local.get 6 + i32.const 96 + i32.add + local.get 6 + i32.const 792 + i32.add + i32.const 0 + i32.const 48 + call 108 + local.get 6 + i32.load offset=100 + local.set 12 + local.get 6 + i32.load offset=96 + local.set 13 + local.get 6 + i32.const 88 + i32.add + local.get 6 + i32.const 792 + i32.add + i32.const 48 + i32.const 96 + call 108 + local.get 6 + i32.const 856 + i32.add + local.get 6 + i32.load offset=88 + local.get 6 + i32.load offset=92 + call 130 + local.get 6 + i32.const 752 + i32.add + local.tee 1 + local.get 6 + i32.const 868 + i32.add + local.tee 7 + i64.load align=4 + i64.store + local.get 6 + local.get 6 + i64.load offset=860 align=4 + i64.store offset=744 + local.get 6 + i32.load offset=856 + i32.const 1 + i32.eq + br_if 2 (;@22;) + local.get 6 + i32.const 816 + i32.add + local.get 1 + i32.load + local.tee 14 + i32.store + local.get 6 + local.get 6 + i64.load offset=744 + local.tee 27 + i64.store offset=808 + local.get 6 + i32.const 80 + i32.add + local.get 6 + i32.const 792 + i32.add + i32.const 96 + i32.const 97 + call 108 + local.get 6 + i32.load offset=84 + local.set 15 + local.get 6 + i32.load offset=80 + local.set 16 + local.get 6 + i32.const 72 + i32.add + local.get 6 + i32.const 568 + i32.add + i32.const 0 + i32.const 193 + call 108 + local.get 6 + i32.load offset=76 + local.set 17 + local.get 6 + i32.load offset=72 + local.set 18 + local.get 6 + i32.const -64 + i32.sub + local.get 6 + i32.const 584 + i32.add + i32.const 290 + i32.const 338 + call 108 + local.get 6 + i32.load offset=68 + local.set 19 + local.get 6 + i32.load offset=64 + local.set 20 + local.get 6 + i32.const 56 + i32.add + local.get 6 + i32.const 584 + i32.add + i32.const 338 + i32.const 386 + call 108 + local.get 6 + i32.const 856 + i32.add + local.get 6 + i32.load offset=56 + local.get 6 + i32.load offset=60 + call 130 + local.get 6 + i32.const 768 + i32.add + local.get 7 + i64.load align=4 + i64.store + local.get 6 + local.get 6 + i64.load offset=860 align=4 + i64.store offset=760 + local.get 6 + i32.load offset=856 + i32.const 1 + i32.eq + br_if 5 (;@19;) + local.get 6 + i32.const 832 + i32.add + local.get 6 + i32.const 768 + i32.add + i32.load + local.tee 7 + i32.store + local.get 6 + local.get 6 + i64.load offset=760 + local.tee 28 + i64.store offset=824 + local.get 6 + i32.const 48 + i32.add + local.get 6 + i32.const 584 + i32.add + i32.const 386 + i32.const 387 + call 108 + local.get 6 + i32.load offset=52 + local.set 21 + local.get 6 + i32.load offset=48 + local.set 22 + local.get 6 + i32.const 40 + i32.add + local.get 6 + i32.const 568 + i32.add + i32.const 193 + i32.const 386 + call 108 + local.get 6 + i32.load offset=44 + local.set 23 + local.get 6 + i32.load offset=40 + local.set 24 + local.get 6 + i32.const 32 + i32.add + local.get 6 + i32.const 568 + i32.add + i32.const 386 + i32.const 434 + call 108 + local.get 6 + i32.load offset=36 + local.set 25 + local.get 6 + i32.load offset=32 + local.set 26 + local.get 6 + i32.const 24 + i32.add + local.get 6 + i32.const 568 + i32.add + i32.const 434 + i32.const 482 + call 108 + local.get 6 + i32.const 856 + i32.add + local.get 6 + i32.load offset=24 + local.get 6 + i32.load offset=28 + call 130 + local.get 6 + i32.const 784 + i32.add + local.tee 1 + local.get 6 + i32.const 868 + i32.add + i64.load align=4 + i64.store + local.get 6 + local.get 6 + i64.load offset=860 align=4 + i64.store offset=776 + local.get 6 + i32.load offset=856 + i32.const 1 + i32.eq + br_if 3 (;@21;) + local.get 6 + i32.const 848 + i32.add + local.get 1 + i32.load + local.tee 1 + i32.store + local.get 6 + local.get 6 + i64.load offset=776 + local.tee 29 + i64.store offset=840 + local.get 6 + i32.const 16 + i32.add + local.get 6 + i32.const 568 + i32.add + i32.const 482 + i32.const 483 + call 108 + local.get 6 + i64.load offset=16 + local.set 30 + local.get 6 + i32.const 8 + i32.add + local.get 6 + i32.const 568 + i32.add + i32.const 483 + i32.const 676 + call 108 + local.get 6 + i32.const 728 + i32.add + local.get 30 + i64.store + local.get 6 + i32.const 724 + i32.add + local.get 1 + i32.store + local.get 6 + i32.const 720 + i32.add + local.get 29 + i64.store32 + local.get 6 + i32.const 716 + i32.add + local.get 25 + i32.store + local.get 6 + i32.const 708 + i32.add + local.get 23 + i32.store + local.get 6 + i32.const 704 + i32.add + local.get 24 + i32.store + local.get 6 + i32.const 700 + i32.add + local.get 21 + i32.store + local.get 6 + i32.const 696 + i32.add + local.get 22 + i32.store + local.get 6 + i32.const 692 + i32.add + local.get 7 + i32.store + local.get 6 + i32.const 688 + i32.add + local.get 28 + i64.store32 + local.get 6 + i32.const 684 + i32.add + local.get 19 + i32.store + local.get 6 + i32.const 676 + i32.add + local.get 17 + i32.store + local.get 6 + i32.const 672 + i32.add + local.get 18 + i32.store + local.get 6 + i32.const 668 + i32.add + local.get 15 + i32.store + local.get 6 + i32.const 664 + i32.add + local.get 16 + i32.store + local.get 6 + i32.const 660 + i32.add + local.get 14 + i32.store + local.get 6 + i32.const 656 + i32.add + local.get 27 + i64.store32 + local.get 6 + i32.const 652 + i32.add + local.get 12 + i32.store + local.get 6 + i32.const 644 + i32.add + local.get 10 + i32.store + local.get 6 + i32.const 636 + i32.add + local.get 8 + i32.store + local.get 6 + i32.const 628 + i32.add + local.get 4 + i32.store + local.get 6 + i32.const 736 + i32.add + local.get 6 + i64.load offset=8 + i64.store + local.get 6 + local.get 26 + i32.store offset=712 + local.get 6 + local.get 20 + i32.store offset=680 + local.get 6 + local.get 13 + i32.store offset=648 + local.get 6 + local.get 11 + i32.store offset=640 + local.get 6 + local.get 9 + i32.store offset=632 + local.get 6 + local.get 5 + i32.store offset=624 + local.get 6 + local.get 2 + i32.store offset=620 + local.get 6 + local.get 3 + i32.store offset=616 + local.get 6 + i32.const 744 + i32.add + i32.const 1160 + call 53 + i32.const 128 + local.set 3 + local.get 6 + i32.const 616 + i32.add + local.set 2 + loop ;; label = @25 + local.get 3 + i32.eqz + br_if 5 (;@20;) + local.get 6 + i32.const 744 + i32.add + local.get 2 + i32.load + local.get 2 + i32.load offset=4 + call 45 + local.get 6 + i32.const 744 + i32.add + local.get 2 + i32.load offset=8 + local.get 2 + i32.load offset=12 + call 45 + local.get 6 + i32.const 744 + i32.add + local.get 2 + i32.load offset=16 + local.get 2 + i32.load offset=20 + call 45 + local.get 6 + i32.const 744 + i32.add + local.get 2 + i32.load offset=24 + local.get 2 + i32.load offset=28 + call 45 + local.get 3 + i32.const -32 + i32.add + local.set 3 + local.get 2 + i32.const 32 + i32.add + local.set 2 + br 0 (;@25;) + end + unreachable + end + local.get 6 + i32.load offset=140 + local.set 3 + local.get 6 + i32.const 840 + i32.add + i32.const 97 + call 96 + local.get 6 + i32.load offset=848 + local.tee 4 + local.get 3 + i32.load offset=8 + i32.ne + br_if 14 (;@9;) + local.get 6 + i32.load offset=840 + local.get 3 + i32.load + local.get 4 + call 148 + local.get 6 + i32.const 840 + i32.add + local.get 2 + i32.load + local.get 2 + i32.load offset=8 + call 45 + local.get 6 + i32.const 856 + i32.add + i32.const 16777217 + local.get 6 + i32.load offset=840 + local.get 6 + i32.load offset=848 + call 36 + local.get 6 + i32.const 784 + i32.add + local.tee 2 + local.get 1 + i32.const 8 + i32.add + local.tee 3 + i64.load align=4 + i64.store + local.get 6 + local.get 1 + i64.load align=4 + i64.store offset=776 + local.get 6 + i32.load offset=856 + i32.const 1 + i32.eq + br_if 6 (;@17;) + local.get 6 + i32.const 752 + i32.add + local.get 2 + i32.load + i32.store + local.get 6 + local.get 6 + i64.load offset=776 + i64.store offset=744 + local.get 6 + i32.const 760 + i32.add + i32.const 97 + call 96 + local.get 6 + i32.load offset=768 + local.tee 4 + local.get 6 + i32.load offset=800 + i32.ne + br_if 14 (;@9;) + local.get 6 + i32.load offset=760 + local.get 6 + i32.load offset=792 + local.get 4 + call 148 + local.get 6 + i32.const 760 + i32.add + local.get 6 + i32.load offset=744 + local.get 6 + i32.load offset=752 + call 45 + local.get 6 + i32.const 856 + i32.add + i32.const 16777216 + local.get 6 + i32.load offset=760 + local.get 6 + i32.load offset=768 + call 36 + local.get 2 + local.get 3 + i64.load align=4 + i64.store + local.get 6 + local.get 1 + i64.load align=4 + i64.store offset=776 + local.get 6 + i32.load offset=856 + i32.const 1 + i32.ne + if ;; label = @24 + local.get 6 + i32.const 792 + i32.add + call 17 + local.get 6 + i32.const 800 + i32.add + local.get 2 + i32.load + i32.store + local.get 6 + local.get 6 + i64.load offset=776 + i64.store offset=792 + local.get 6 + i32.const 760 + i32.add + call 17 + local.get 6 + i32.const 744 + i32.add + call 17 + local.get 6 + i32.const 840 + i32.add + call 17 + br 1 (;@23;) + end + end + local.get 0 + i32.const 1 + i32.store8 + local.get 0 + i32.const 4 + i32.add + local.get 6 + i64.load offset=776 + i64.store align=4 + local.get 0 + i32.const 12 + i32.add + local.get 6 + i32.const 784 + i32.add + i64.load + i64.store align=4 + local.get 6 + i32.const 760 + i32.add + call 17 + local.get 6 + i32.const 744 + i32.add + call 17 + br 6 (;@16;) + end + local.get 0 + i32.const 1 + i32.store8 + local.get 0 + i32.const 4 + i32.add + local.get 6 + i64.load offset=744 + i64.store align=4 + local.get 0 + i32.const 12 + i32.add + local.get 1 + i64.load + i64.store align=4 + br 6 (;@15;) + end + local.get 0 + i32.const 1 + i32.store8 + local.get 0 + i32.const 4 + i32.add + local.get 6 + i64.load offset=776 + i64.store align=4 + local.get 0 + i32.const 12 + i32.add + local.get 1 + i64.load + i64.store align=4 + local.get 6 + i32.const 824 + i32.add + call 17 + br 2 (;@18;) + end + local.get 6 + i32.const 856 + i32.add + i32.const 16777218 + local.get 6 + i32.load offset=744 + local.get 6 + i32.load offset=752 + call 36 + local.get 6 + i32.const 784 + i32.add + local.tee 1 + local.get 6 + i32.const 868 + i32.add + i64.load align=4 + i64.store + local.get 6 + local.get 6 + i64.load offset=860 align=4 + i64.store offset=776 + local.get 6 + i32.load offset=856 + i32.const 1 + i32.ne + if ;; label = @20 + local.get 6 + i32.const 768 + i32.add + local.get 1 + i32.load + local.tee 1 + i32.store + local.get 6 + local.get 6 + i64.load offset=776 + i64.store offset=760 + local.get 1 + i32.eqz + br_if 9 (;@11;) + local.get 0 + i32.const 0 + i32.store8 + local.get 0 + local.get 6 + i32.load offset=760 + i32.load8_u + i32.eqz + i32.store8 offset=1 + local.get 6 + i32.const 744 + i32.add + call 17 + local.get 6 + i32.const 840 + i32.add + call 17 + local.get 6 + i32.const 824 + i32.add + call 17 + local.get 6 + i32.const 808 + i32.add + call 17 + local.get 6 + i32.const 792 + i32.add + call 17 + local.get 6 + i32.const 760 + i32.add + call 17 + local.get 6 + i32.const 600 + i32.add + call 12 + local.get 6 + i32.const 584 + i32.add + call 17 + local.get 6 + i32.const 568 + i32.add + call 17 + local.get 6 + i32.const 552 + i32.add + call 12 + br 19 (;@1;) + end + local.get 0 + i32.const 1 + i32.store8 + local.get 0 + i32.const 4 + i32.add + local.get 6 + i64.load offset=776 + i64.store align=4 + local.get 0 + i32.const 12 + i32.add + local.get 1 + i64.load + i64.store align=4 + local.get 6 + i32.const 744 + i32.add + call 17 + local.get 6 + i32.const 840 + i32.add + call 17 + local.get 6 + i32.const 824 + i32.add + call 17 + local.get 6 + i32.const 808 + i32.add + call 17 + local.get 6 + i32.const 792 + i32.add + call 17 + br 17 (;@2;) + end + local.get 0 + i32.const 1 + i32.store8 + local.get 0 + i32.const 4 + i32.add + local.get 6 + i64.load offset=760 + i64.store align=4 + local.get 0 + i32.const 12 + i32.add + local.get 6 + i32.const 768 + i32.add + i64.load + i64.store align=4 + end + local.get 6 + i32.const 808 + i32.add + call 17 + br 2 (;@15;) + end + local.get 0 + i32.const 1 + i32.store8 + local.get 0 + i32.const 4 + i32.add + local.get 6 + i64.load offset=776 + i64.store align=4 + local.get 0 + i32.const 12 + i32.add + local.get 6 + i32.const 784 + i32.add + i64.load + i64.store align=4 + end + local.get 6 + i32.const 840 + i32.add + call 17 + end + local.get 6 + i32.const 792 + i32.add + call 17 + br 12 (;@2;) + end + local.get 6 + i32.const 560 + i32.add + local.get 2 + i32.const 8 + i32.add + i32.load + i32.store + local.get 6 + local.get 2 + i64.load align=4 + i64.store offset=552 + local.get 6 + i32.const 576 + i32.add + local.get 3 + i32.const 8 + i32.add + i32.load + i32.store + local.get 6 + local.get 3 + i64.load align=4 + i64.store offset=568 + local.get 6 + i32.const 592 + i32.add + local.get 4 + i32.const 8 + i32.add + i32.load + i32.store + local.get 6 + local.get 4 + i64.load align=4 + i64.store offset=584 + local.get 6 + i32.const 608 + i32.add + local.get 5 + i32.const 8 + i32.add + i32.load + local.tee 1 + i32.store + local.get 6 + local.get 5 + i64.load align=4 + i64.store offset=600 + local.get 1 + i32.const 1 + i32.add + local.tee 3 + local.get 1 + i32.lt_u + local.tee 2 + br_if 2 (;@11;) + local.get 3 + local.get 6 + i32.load offset=560 + i32.ne + br_if 5 (;@8;) + local.get 2 + br_if 2 (;@11;) + local.get 6 + i32.const 792 + i32.add + local.get 6 + i32.load offset=552 + local.tee 2 + i32.load + local.get 2 + i32.load offset=8 + call 106 + local.get 6 + i32.load offset=600 + local.set 4 + local.get 6 + i32.const 632 + i32.add + i64.const 1 + i64.store + local.get 6 + i32.const 628 + i32.add + local.get 2 + local.get 3 + i32.const 12 + i32.mul + i32.add + i32.store + local.get 6 + i32.const 0 + i32.store offset=640 + local.get 6 + local.get 2 + i32.store offset=624 + local.get 6 + local.get 4 + local.get 1 + i32.const 12 + i32.mul + i32.add + i32.store offset=620 + local.get 6 + local.get 4 + i32.store offset=616 + local.get 6 + i32.const 856 + i32.add + i32.const 4 + i32.or + local.set 1 + block ;; label = @14 + block ;; label = @15 + block ;; label = @16 + block ;; label = @17 + block ;; label = @18 + block ;; label = @19 + block ;; label = @20 + block ;; label = @21 + loop ;; label = @22 + local.get 6 + i32.const 272 + i32.add + local.get 6 + i32.const 616 + i32.add + call 107 + local.get 6 + i32.load offset=272 + local.tee 2 + i32.eqz + if ;; label = @23 + local.get 6 + i32.const 264 + i32.add + local.get 6 + i32.const 584 + i32.add + i32.const 0 + i32.const 48 + call 108 + local.get 6 + i32.load offset=268 + local.set 2 + local.get 6 + i32.load offset=264 + local.set 3 + local.get 6 + i32.const 256 + i32.add + local.get 6 + i32.const 584 + i32.add + i32.const 48 + i32.const 96 + call 108 + local.get 6 + i32.load offset=260 + local.set 4 + local.get 6 + i32.load offset=256 + local.set 5 + local.get 6 + i32.const 248 + i32.add + local.get 6 + i32.const 584 + i32.add + i32.const 96 + i32.const 97 + call 108 + local.get 6 + i32.load offset=252 + local.set 8 + local.get 6 + i32.load offset=248 + local.set 9 + local.get 6 + i32.const 240 + i32.add + local.get 6 + i32.const 584 + i32.add + i32.const 97 + i32.const 290 + call 108 + local.get 6 + i32.load offset=244 + local.set 10 + local.get 6 + i32.load offset=240 + local.set 11 + local.get 6 + i32.const 232 + i32.add + local.get 6 + i32.const 792 + i32.add + i32.const 0 + i32.const 48 + call 108 + local.get 6 + i32.load offset=236 + local.set 12 + local.get 6 + i32.load offset=232 + local.set 13 + local.get 6 + i32.const 224 + i32.add + local.get 6 + i32.const 792 + i32.add + i32.const 48 + i32.const 96 + call 108 + local.get 6 + i32.const 856 + i32.add + local.get 6 + i32.load offset=224 + local.get 6 + i32.load offset=228 + call 129 + local.get 6 + i32.const 752 + i32.add + local.tee 1 + local.get 6 + i32.const 868 + i32.add + local.tee 7 + i64.load align=4 + i64.store + local.get 6 + local.get 6 + i64.load offset=860 align=4 + i64.store offset=744 + local.get 6 + i32.load offset=856 + i32.const 1 + i32.eq + br_if 2 (;@21;) + local.get 6 + i32.const 816 + i32.add + local.get 1 + i32.load + local.tee 14 + i32.store + local.get 6 + local.get 6 + i64.load offset=744 + local.tee 27 + i64.store offset=808 + local.get 6 + i32.const 216 + i32.add + local.get 6 + i32.const 792 + i32.add + i32.const 96 + i32.const 97 + call 108 + local.get 6 + i32.load offset=220 + local.set 15 + local.get 6 + i32.load offset=216 + local.set 16 + local.get 6 + i32.const 208 + i32.add + local.get 6 + i32.const 568 + i32.add + i32.const 0 + i32.const 193 + call 108 + local.get 6 + i32.load offset=212 + local.set 17 + local.get 6 + i32.load offset=208 + local.set 18 + local.get 6 + i32.const 200 + i32.add + local.get 6 + i32.const 584 + i32.add + i32.const 290 + i32.const 338 + call 108 + local.get 6 + i32.load offset=204 + local.set 19 + local.get 6 + i32.load offset=200 + local.set 20 + local.get 6 + i32.const 192 + i32.add + local.get 6 + i32.const 584 + i32.add + i32.const 338 + i32.const 386 + call 108 + local.get 6 + i32.const 856 + i32.add + local.get 6 + i32.load offset=192 + local.get 6 + i32.load offset=196 + call 129 + local.get 6 + i32.const 768 + i32.add + local.get 7 + i64.load align=4 + i64.store + local.get 6 + local.get 6 + i64.load offset=860 align=4 + i64.store offset=760 + local.get 6 + i32.load offset=856 + i32.const 1 + i32.eq + br_if 5 (;@18;) + local.get 6 + i32.const 832 + i32.add + local.get 6 + i32.const 768 + i32.add + i32.load + local.tee 7 + i32.store + local.get 6 + local.get 6 + i64.load offset=760 + local.tee 28 + i64.store offset=824 + local.get 6 + i32.const 184 + i32.add + local.get 6 + i32.const 584 + i32.add + i32.const 386 + i32.const 387 + call 108 + local.get 6 + i32.load offset=188 + local.set 21 + local.get 6 + i32.load offset=184 + local.set 22 + local.get 6 + i32.const 176 + i32.add + local.get 6 + i32.const 568 + i32.add + i32.const 193 + i32.const 386 + call 108 + local.get 6 + i32.load offset=180 + local.set 23 + local.get 6 + i32.load offset=176 + local.set 24 + local.get 6 + i32.const 168 + i32.add + local.get 6 + i32.const 568 + i32.add + i32.const 386 + i32.const 434 + call 108 + local.get 6 + i32.load offset=172 + local.set 25 + local.get 6 + i32.load offset=168 + local.set 26 + local.get 6 + i32.const 160 + i32.add + local.get 6 + i32.const 568 + i32.add + i32.const 434 + i32.const 482 + call 108 + local.get 6 + i32.const 856 + i32.add + local.get 6 + i32.load offset=160 + local.get 6 + i32.load offset=164 + call 129 + local.get 6 + i32.const 784 + i32.add + local.tee 1 + local.get 6 + i32.const 868 + i32.add + i64.load align=4 + i64.store + local.get 6 + local.get 6 + i64.load offset=860 align=4 + i64.store offset=776 + local.get 6 + i32.load offset=856 + i32.const 1 + i32.eq + br_if 3 (;@20;) + local.get 6 + i32.const 848 + i32.add + local.get 1 + i32.load + local.tee 1 + i32.store + local.get 6 + local.get 6 + i64.load offset=776 + local.tee 29 + i64.store offset=840 + local.get 6 + i32.const 152 + i32.add + local.get 6 + i32.const 568 + i32.add + i32.const 482 + i32.const 483 + call 108 + local.get 6 + i64.load offset=152 + local.set 30 + local.get 6 + i32.const 144 + i32.add + local.get 6 + i32.const 568 + i32.add + i32.const 483 + i32.const 676 + call 108 + local.get 6 + i32.const 728 + i32.add + local.get 30 + i64.store + local.get 6 + i32.const 724 + i32.add + local.get 1 + i32.store + local.get 6 + i32.const 720 + i32.add + local.get 29 + i64.store32 + local.get 6 + i32.const 716 + i32.add + local.get 25 + i32.store + local.get 6 + i32.const 708 + i32.add + local.get 23 + i32.store + local.get 6 + i32.const 704 + i32.add + local.get 24 + i32.store + local.get 6 + i32.const 700 + i32.add + local.get 21 + i32.store + local.get 6 + i32.const 696 + i32.add + local.get 22 + i32.store + local.get 6 + i32.const 692 + i32.add + local.get 7 + i32.store + local.get 6 + i32.const 688 + i32.add + local.get 28 + i64.store32 + local.get 6 + i32.const 684 + i32.add + local.get 19 + i32.store + local.get 6 + i32.const 676 + i32.add + local.get 17 + i32.store + local.get 6 + i32.const 672 + i32.add + local.get 18 + i32.store + local.get 6 + i32.const 668 + i32.add + local.get 15 + i32.store + local.get 6 + i32.const 664 + i32.add + local.get 16 + i32.store + local.get 6 + i32.const 660 + i32.add + local.get 14 + i32.store + local.get 6 + i32.const 656 + i32.add + local.get 27 + i64.store32 + local.get 6 + i32.const 652 + i32.add + local.get 12 + i32.store + local.get 6 + i32.const 644 + i32.add + local.get 10 + i32.store + local.get 6 + i32.const 636 + i32.add + local.get 8 + i32.store + local.get 6 + i32.const 628 + i32.add + local.get 4 + i32.store + local.get 6 + i32.const 736 + i32.add + local.get 6 + i64.load offset=144 + i64.store + local.get 6 + local.get 26 + i32.store offset=712 + local.get 6 + local.get 20 + i32.store offset=680 + local.get 6 + local.get 13 + i32.store offset=648 + local.get 6 + local.get 11 + i32.store offset=640 + local.get 6 + local.get 9 + i32.store offset=632 + local.get 6 + local.get 5 + i32.store offset=624 + local.get 6 + local.get 2 + i32.store offset=620 + local.get 6 + local.get 3 + i32.store offset=616 + local.get 6 + i32.const 744 + i32.add + i32.const 1160 + call 53 + i32.const 128 + local.set 3 + local.get 6 + i32.const 616 + i32.add + local.set 2 + loop ;; label = @24 + local.get 3 + i32.eqz + br_if 5 (;@19;) + local.get 6 + i32.const 744 + i32.add + local.get 2 + i32.load + local.get 2 + i32.load offset=4 + call 45 + local.get 6 + i32.const 744 + i32.add + local.get 2 + i32.load offset=8 + local.get 2 + i32.load offset=12 + call 45 + local.get 6 + i32.const 744 + i32.add + local.get 2 + i32.load offset=16 + local.get 2 + i32.load offset=20 + call 45 + local.get 6 + i32.const 744 + i32.add + local.get 2 + i32.load offset=24 + local.get 2 + i32.load offset=28 + call 45 + local.get 3 + i32.const -32 + i32.add + local.set 3 + local.get 2 + i32.const 32 + i32.add + local.set 2 + br 0 (;@24;) + end + unreachable + end + local.get 6 + i32.load offset=276 + local.set 3 + local.get 6 + i32.const 840 + i32.add + i32.const 97 + call 96 + local.get 6 + i32.load offset=848 + local.tee 4 + local.get 3 + i32.load offset=8 + i32.ne + br_if 13 (;@9;) + local.get 6 + i32.load offset=840 + local.get 3 + i32.load + local.get 4 + call 148 + local.get 6 + i32.const 840 + i32.add + local.get 2 + i32.load + local.get 2 + i32.load offset=8 + call 45 + local.get 6 + i32.const 856 + i32.add + i32.const 16777233 + local.get 6 + i32.load offset=840 + local.get 6 + i32.load offset=848 + call 36 + local.get 6 + i32.const 784 + i32.add + local.tee 2 + local.get 1 + i32.const 8 + i32.add + local.tee 3 + i64.load align=4 + i64.store + local.get 6 + local.get 1 + i64.load align=4 + i64.store offset=776 + local.get 6 + i32.load offset=856 + i32.const 1 + i32.eq + br_if 6 (;@16;) + local.get 6 + i32.const 752 + i32.add + local.get 2 + i32.load + i32.store + local.get 6 + local.get 6 + i64.load offset=776 + i64.store offset=744 + local.get 6 + i32.const 760 + i32.add + i32.const 97 + call 96 + local.get 6 + i32.load offset=768 + local.tee 4 + local.get 6 + i32.load offset=800 + i32.ne + br_if 13 (;@9;) + local.get 6 + i32.load offset=760 + local.get 6 + i32.load offset=792 + local.get 4 + call 148 + local.get 6 + i32.const 760 + i32.add + local.get 6 + i32.load offset=744 + local.get 6 + i32.load offset=752 + call 45 + local.get 6 + i32.const 856 + i32.add + i32.const 16777232 + local.get 6 + i32.load offset=760 + local.get 6 + i32.load offset=768 + call 36 + local.get 2 + local.get 3 + i64.load align=4 + i64.store + local.get 6 + local.get 1 + i64.load align=4 + i64.store offset=776 + local.get 6 + i32.load offset=856 + i32.const 1 + i32.ne + if ;; label = @23 + local.get 6 + i32.const 792 + i32.add + call 17 + local.get 6 + i32.const 800 + i32.add + local.get 2 + i32.load + i32.store + local.get 6 + local.get 6 + i64.load offset=776 + i64.store offset=792 + local.get 6 + i32.const 760 + i32.add + call 17 + local.get 6 + i32.const 744 + i32.add + call 17 + local.get 6 + i32.const 840 + i32.add + call 17 + br 1 (;@22;) + end + end + local.get 0 + i32.const 1 + i32.store8 + local.get 0 + i32.const 4 + i32.add + local.get 6 + i64.load offset=776 + i64.store align=4 + local.get 0 + i32.const 12 + i32.add + local.get 6 + i32.const 784 + i32.add + i64.load + i64.store align=4 + local.get 6 + i32.const 760 + i32.add + call 17 + local.get 6 + i32.const 744 + i32.add + call 17 + br 6 (;@15;) + end + local.get 0 + i32.const 1 + i32.store8 + local.get 0 + i32.const 4 + i32.add + local.get 6 + i64.load offset=744 + i64.store align=4 + local.get 0 + i32.const 12 + i32.add + local.get 1 + i64.load + i64.store align=4 + br 6 (;@14;) + end + local.get 0 + i32.const 1 + i32.store8 + local.get 0 + i32.const 4 + i32.add + local.get 6 + i64.load offset=776 + i64.store align=4 + local.get 0 + i32.const 12 + i32.add + local.get 1 + i64.load + i64.store align=4 + local.get 6 + i32.const 824 + i32.add + call 17 + br 2 (;@17;) + end + local.get 6 + i32.const 856 + i32.add + i32.const 16777234 + local.get 6 + i32.load offset=744 + local.get 6 + i32.load offset=752 + call 36 + local.get 6 + i32.const 784 + i32.add + local.tee 1 + local.get 6 + i32.const 868 + i32.add + i64.load align=4 + i64.store + local.get 6 + local.get 6 + i64.load offset=860 align=4 + i64.store offset=776 + local.get 6 + i32.load offset=856 + i32.const 1 + i32.ne + if ;; label = @19 + local.get 6 + i32.const 768 + i32.add + local.get 1 + i32.load + local.tee 1 + i32.store + local.get 6 + local.get 6 + i64.load offset=776 + i64.store offset=760 + local.get 1 + i32.eqz + br_if 8 (;@11;) + local.get 0 + i32.const 0 + i32.store8 + local.get 0 + local.get 6 + i32.load offset=760 + i32.load8_u + i32.eqz + i32.store8 offset=1 + local.get 6 + i32.const 744 + i32.add + call 17 + local.get 6 + i32.const 840 + i32.add + call 17 + local.get 6 + i32.const 824 + i32.add + call 17 + local.get 6 + i32.const 808 + i32.add + call 17 + local.get 6 + i32.const 792 + i32.add + call 17 + local.get 6 + i32.const 760 + i32.add + call 17 + local.get 6 + i32.const 600 + i32.add + call 12 + local.get 6 + i32.const 584 + i32.add + call 17 + local.get 6 + i32.const 568 + i32.add + call 17 + local.get 6 + i32.const 552 + i32.add + call 12 + br 18 (;@1;) + end + local.get 0 + i32.const 1 + i32.store8 + local.get 0 + i32.const 4 + i32.add + local.get 6 + i64.load offset=776 + i64.store align=4 + local.get 0 + i32.const 12 + i32.add + local.get 1 + i64.load + i64.store align=4 + local.get 6 + i32.const 744 + i32.add + call 17 + local.get 6 + i32.const 840 + i32.add + call 17 + local.get 6 + i32.const 824 + i32.add + call 17 + local.get 6 + i32.const 808 + i32.add + call 17 + local.get 6 + i32.const 792 + i32.add + call 17 + br 15 (;@3;) + end + local.get 0 + i32.const 1 + i32.store8 + local.get 0 + i32.const 4 + i32.add + local.get 6 + i64.load offset=760 + i64.store align=4 + local.get 0 + i32.const 12 + i32.add + local.get 6 + i32.const 768 + i32.add + i64.load + i64.store align=4 + end + local.get 6 + i32.const 808 + i32.add + call 17 + br 2 (;@14;) + end + local.get 0 + i32.const 1 + i32.store8 + local.get 0 + i32.const 4 + i32.add + local.get 6 + i64.load offset=776 + i64.store align=4 + local.get 0 + i32.const 12 + i32.add + local.get 6 + i32.const 784 + i32.add + i64.load + i64.store align=4 + end + local.get 6 + i32.const 840 + i32.add + call 17 + end + local.get 6 + i32.const 792 + i32.add + call 17 + br 10 (;@3;) + end + local.get 6 + i32.const 560 + i32.add + local.get 2 + i32.const 8 + i32.add + i32.load + i32.store + local.get 6 + local.get 2 + i64.load align=4 + i64.store offset=552 + local.get 6 + i32.const 576 + i32.add + local.get 3 + i32.const 8 + i32.add + i32.load + i32.store + local.get 6 + local.get 3 + i64.load align=4 + i64.store offset=568 + local.get 6 + i32.const 592 + i32.add + local.get 4 + i32.const 8 + i32.add + i32.load + i32.store + local.get 6 + local.get 4 + i64.load align=4 + i64.store offset=584 + local.get 6 + i32.const 608 + i32.add + local.get 5 + i32.const 8 + i32.add + i32.load + local.tee 1 + i32.store + local.get 6 + local.get 5 + i64.load align=4 + i64.store offset=600 + local.get 1 + i32.const 1 + i32.add + local.tee 3 + local.get 1 + i32.lt_u + local.tee 2 + br_if 1 (;@11;) + local.get 3 + local.get 6 + i32.load offset=560 + i32.ne + br_if 5 (;@7;) + local.get 2 + br_if 1 (;@11;) + local.get 6 + i32.const 792 + i32.add + local.get 6 + i32.load offset=552 + local.tee 2 + i32.load + local.get 2 + i32.load offset=8 + call 106 + local.get 6 + i32.load offset=600 + local.set 4 + local.get 6 + i32.const 632 + i32.add + i64.const 1 + i64.store + local.get 6 + i32.const 628 + i32.add + local.get 2 + local.get 3 + i32.const 12 + i32.mul + i32.add + i32.store + local.get 6 + i32.const 0 + i32.store offset=640 + local.get 6 + local.get 2 + i32.store offset=624 + local.get 6 + local.get 4 + local.get 1 + i32.const 12 + i32.mul + i32.add + i32.store offset=620 + local.get 6 + local.get 4 + i32.store offset=616 + local.get 6 + i32.const 856 + i32.add + i32.const 4 + i32.or + local.set 1 + block ;; label = @13 + block ;; label = @14 + block ;; label = @15 + block ;; label = @16 + block ;; label = @17 + block ;; label = @18 + block ;; label = @19 + block ;; label = @20 + loop ;; label = @21 + local.get 6 + i32.const 408 + i32.add + local.get 6 + i32.const 616 + i32.add + call 107 + local.get 6 + i32.load offset=408 + local.tee 2 + i32.eqz + if ;; label = @22 + local.get 6 + i32.const 400 + i32.add + local.get 6 + i32.const 584 + i32.add + i32.const 0 + i32.const 32 + call 108 + local.get 6 + i32.load offset=404 + local.set 2 + local.get 6 + i32.load offset=400 + local.set 3 + local.get 6 + i32.const 392 + i32.add + local.get 6 + i32.const 584 + i32.add + i32.const 32 + i32.const 64 + call 108 + local.get 6 + i32.load offset=396 + local.set 4 + local.get 6 + i32.load offset=392 + local.set 5 + local.get 6 + i32.const 384 + i32.add + local.get 6 + i32.const 584 + i32.add + i32.const 64 + i32.const 65 + call 108 + local.get 6 + i32.load offset=388 + local.set 8 + local.get 6 + i32.load offset=384 + local.set 9 + local.get 6 + i32.const 376 + i32.add + local.get 6 + i32.const 584 + i32.add + i32.const 65 + i32.const 194 + call 108 + local.get 6 + i32.load offset=380 + local.set 10 + local.get 6 + i32.load offset=376 + local.set 11 + local.get 6 + i32.const 368 + i32.add + local.get 6 + i32.const 792 + i32.add + i32.const 0 + i32.const 32 + call 108 + local.get 6 + i32.load offset=372 + local.set 12 + local.get 6 + i32.load offset=368 + local.set 13 + local.get 6 + i32.const 360 + i32.add + local.get 6 + i32.const 792 + i32.add + i32.const 32 + i32.const 64 + call 108 + local.get 6 + i32.const 856 + i32.add + local.get 6 + i32.load offset=360 + local.get 6 + i32.load offset=364 + call 131 + local.get 6 + i32.const 752 + i32.add + local.tee 1 + local.get 6 + i32.const 868 + i32.add + local.tee 7 + i64.load align=4 + i64.store + local.get 6 + local.get 6 + i64.load offset=860 align=4 + i64.store offset=744 + local.get 6 + i32.load offset=856 + i32.const 1 + i32.eq + br_if 2 (;@20;) + local.get 6 + i32.const 816 + i32.add + local.get 1 + i32.load + local.tee 14 + i32.store + local.get 6 + local.get 6 + i64.load offset=744 + local.tee 27 + i64.store offset=808 + local.get 6 + i32.const 352 + i32.add + local.get 6 + i32.const 792 + i32.add + i32.const 64 + i32.const 65 + call 108 + local.get 6 + i32.load offset=356 + local.set 15 + local.get 6 + i32.load offset=352 + local.set 16 + local.get 6 + i32.const 344 + i32.add + local.get 6 + i32.const 568 + i32.add + i32.const 0 + i32.const 129 + call 108 + local.get 6 + i32.load offset=348 + local.set 17 + local.get 6 + i32.load offset=344 + local.set 18 + local.get 6 + i32.const 336 + i32.add + local.get 6 + i32.const 584 + i32.add + i32.const 194 + i32.const 226 + call 108 + local.get 6 + i32.load offset=340 + local.set 19 + local.get 6 + i32.load offset=336 + local.set 20 + local.get 6 + i32.const 328 + i32.add + local.get 6 + i32.const 584 + i32.add + i32.const 226 + i32.const 258 + call 108 + local.get 6 + i32.const 856 + i32.add + local.get 6 + i32.load offset=328 + local.get 6 + i32.load offset=332 + call 131 + local.get 6 + i32.const 768 + i32.add + local.get 7 + i64.load align=4 + i64.store + local.get 6 + local.get 6 + i64.load offset=860 align=4 + i64.store offset=760 + local.get 6 + i32.load offset=856 + i32.const 1 + i32.eq + br_if 5 (;@17;) + local.get 6 + i32.const 832 + i32.add + local.get 6 + i32.const 768 + i32.add + i32.load + local.tee 7 + i32.store + local.get 6 + local.get 6 + i64.load offset=760 + local.tee 28 + i64.store offset=824 + local.get 6 + i32.const 320 + i32.add + local.get 6 + i32.const 584 + i32.add + i32.const 258 + i32.const 259 + call 108 + local.get 6 + i32.load offset=324 + local.set 21 + local.get 6 + i32.load offset=320 + local.set 22 + local.get 6 + i32.const 312 + i32.add + local.get 6 + i32.const 568 + i32.add + i32.const 129 + i32.const 258 + call 108 + local.get 6 + i32.load offset=316 + local.set 23 + local.get 6 + i32.load offset=312 + local.set 24 + local.get 6 + i32.const 304 + i32.add + local.get 6 + i32.const 568 + i32.add + i32.const 258 + i32.const 290 + call 108 + local.get 6 + i32.load offset=308 + local.set 25 + local.get 6 + i32.load offset=304 + local.set 26 + local.get 6 + i32.const 296 + i32.add + local.get 6 + i32.const 568 + i32.add + i32.const 290 + i32.const 322 + call 108 + local.get 6 + i32.const 856 + i32.add + local.get 6 + i32.load offset=296 + local.get 6 + i32.load offset=300 + call 131 + local.get 6 + i32.const 784 + i32.add + local.tee 1 + local.get 6 + i32.const 868 + i32.add + i64.load align=4 + i64.store + local.get 6 + local.get 6 + i64.load offset=860 align=4 + i64.store offset=776 + local.get 6 + i32.load offset=856 + i32.const 1 + i32.eq + br_if 3 (;@19;) + local.get 6 + i32.const 848 + i32.add + local.get 1 + i32.load + local.tee 1 + i32.store + local.get 6 + local.get 6 + i64.load offset=776 + local.tee 29 + i64.store offset=840 + local.get 6 + i32.const 288 + i32.add + local.get 6 + i32.const 568 + i32.add + i32.const 322 + i32.const 323 + call 108 + local.get 6 + i64.load offset=288 + local.set 30 + local.get 6 + i32.const 280 + i32.add + local.get 6 + i32.const 568 + i32.add + i32.const 323 + i32.const 452 + call 108 + local.get 6 + i32.const 728 + i32.add + local.get 30 + i64.store + local.get 6 + i32.const 724 + i32.add + local.get 1 + i32.store + local.get 6 + i32.const 720 + i32.add + local.get 29 + i64.store32 + local.get 6 + i32.const 716 + i32.add + local.get 25 + i32.store + local.get 6 + i32.const 708 + i32.add + local.get 23 + i32.store + local.get 6 + i32.const 704 + i32.add + local.get 24 + i32.store + local.get 6 + i32.const 700 + i32.add + local.get 21 + i32.store + local.get 6 + i32.const 696 + i32.add + local.get 22 + i32.store + local.get 6 + i32.const 692 + i32.add + local.get 7 + i32.store + local.get 6 + i32.const 688 + i32.add + local.get 28 + i64.store32 + local.get 6 + i32.const 684 + i32.add + local.get 19 + i32.store + local.get 6 + i32.const 676 + i32.add + local.get 17 + i32.store + local.get 6 + i32.const 672 + i32.add + local.get 18 + i32.store + local.get 6 + i32.const 668 + i32.add + local.get 15 + i32.store + local.get 6 + i32.const 664 + i32.add + local.get 16 + i32.store + local.get 6 + i32.const 660 + i32.add + local.get 14 + i32.store + local.get 6 + i32.const 656 + i32.add + local.get 27 + i64.store32 + local.get 6 + i32.const 652 + i32.add + local.get 12 + i32.store + local.get 6 + i32.const 644 + i32.add + local.get 10 + i32.store + local.get 6 + i32.const 636 + i32.add + local.get 8 + i32.store + local.get 6 + i32.const 628 + i32.add + local.get 4 + i32.store + local.get 6 + i32.const 736 + i32.add + local.get 6 + i64.load offset=280 + i64.store + local.get 6 + local.get 26 + i32.store offset=712 + local.get 6 + local.get 20 + i32.store offset=680 + local.get 6 + local.get 13 + i32.store offset=648 + local.get 6 + local.get 11 + i32.store offset=640 + local.get 6 + local.get 9 + i32.store offset=632 + local.get 6 + local.get 5 + i32.store offset=624 + local.get 6 + local.get 2 + i32.store offset=620 + local.get 6 + local.get 3 + i32.store offset=616 + local.get 6 + i32.const 744 + i32.add + i32.const 776 + call 53 + i32.const 128 + local.set 3 + local.get 6 + i32.const 616 + i32.add + local.set 2 + loop ;; label = @23 + local.get 3 + i32.eqz + br_if 5 (;@18;) + local.get 6 + i32.const 744 + i32.add + local.get 2 + i32.load + local.get 2 + i32.load offset=4 + call 45 + local.get 6 + i32.const 744 + i32.add + local.get 2 + i32.load offset=8 + local.get 2 + i32.load offset=12 + call 45 + local.get 6 + i32.const 744 + i32.add + local.get 2 + i32.load offset=16 + local.get 2 + i32.load offset=20 + call 45 + local.get 6 + i32.const 744 + i32.add + local.get 2 + i32.load offset=24 + local.get 2 + i32.load offset=28 + call 45 + local.get 3 + i32.const -32 + i32.add + local.set 3 + local.get 2 + i32.const 32 + i32.add + local.set 2 + br 0 (;@23;) + end + unreachable + end + local.get 6 + i32.load offset=412 + local.set 3 + local.get 6 + i32.const 840 + i32.add + i32.const 65 + call 96 + local.get 6 + i32.load offset=848 + local.tee 4 + local.get 3 + i32.load offset=8 + i32.ne + br_if 12 (;@9;) + local.get 6 + i32.load offset=840 + local.get 3 + i32.load + local.get 4 + call 148 + local.get 6 + i32.const 840 + i32.add + local.get 2 + i32.load + local.get 2 + i32.load offset=8 + call 45 + local.get 6 + i32.const 856 + i32.add + i32.const 16777249 + local.get 6 + i32.load offset=840 + local.get 6 + i32.load offset=848 + call 36 + local.get 6 + i32.const 784 + i32.add + local.tee 2 + local.get 1 + i32.const 8 + i32.add + local.tee 3 + i64.load align=4 + i64.store + local.get 6 + local.get 1 + i64.load align=4 + i64.store offset=776 + local.get 6 + i32.load offset=856 + i32.const 1 + i32.eq + br_if 6 (;@15;) + local.get 6 + i32.const 752 + i32.add + local.get 2 + i32.load + i32.store + local.get 6 + local.get 6 + i64.load offset=776 + i64.store offset=744 + local.get 6 + i32.const 760 + i32.add + i32.const 65 + call 96 + local.get 6 + i32.load offset=768 + local.tee 4 + local.get 6 + i32.load offset=800 + i32.ne + br_if 12 (;@9;) + local.get 6 + i32.load offset=760 + local.get 6 + i32.load offset=792 + local.get 4 + call 148 + local.get 6 + i32.const 760 + i32.add + local.get 6 + i32.load offset=744 + local.get 6 + i32.load offset=752 + call 45 + local.get 6 + i32.const 856 + i32.add + i32.const 16777248 + local.get 6 + i32.load offset=760 + local.get 6 + i32.load offset=768 + call 36 + local.get 2 + local.get 3 + i64.load align=4 + i64.store + local.get 6 + local.get 1 + i64.load align=4 + i64.store offset=776 + local.get 6 + i32.load offset=856 + i32.const 1 + i32.ne + if ;; label = @22 + local.get 6 + i32.const 792 + i32.add + call 17 + local.get 6 + i32.const 800 + i32.add + local.get 2 + i32.load + i32.store + local.get 6 + local.get 6 + i64.load offset=776 + i64.store offset=792 + local.get 6 + i32.const 760 + i32.add + call 17 + local.get 6 + i32.const 744 + i32.add + call 17 + local.get 6 + i32.const 840 + i32.add + call 17 + br 1 (;@21;) + end + end + local.get 0 + i32.const 1 + i32.store8 + local.get 0 + i32.const 4 + i32.add + local.get 6 + i64.load offset=776 + i64.store align=4 + local.get 0 + i32.const 12 + i32.add + local.get 6 + i32.const 784 + i32.add + i64.load + i64.store align=4 + local.get 6 + i32.const 760 + i32.add + call 17 + local.get 6 + i32.const 744 + i32.add + call 17 + br 6 (;@14;) + end + local.get 0 + i32.const 1 + i32.store8 + local.get 0 + i32.const 4 + i32.add + local.get 6 + i64.load offset=744 + i64.store align=4 + local.get 0 + i32.const 12 + i32.add + local.get 1 + i64.load + i64.store align=4 + br 6 (;@13;) + end + local.get 0 + i32.const 1 + i32.store8 + local.get 0 + i32.const 4 + i32.add + local.get 6 + i64.load offset=776 + i64.store align=4 + local.get 0 + i32.const 12 + i32.add + local.get 1 + i64.load + i64.store align=4 + local.get 6 + i32.const 824 + i32.add + call 17 + br 2 (;@16;) + end + local.get 6 + i32.const 856 + i32.add + i32.const 16777250 + local.get 6 + i32.load offset=744 + local.get 6 + i32.load offset=752 + call 36 + local.get 6 + i32.const 784 + i32.add + local.tee 1 + local.get 6 + i32.const 868 + i32.add + i64.load align=4 + i64.store + local.get 6 + local.get 6 + i64.load offset=860 align=4 + i64.store offset=776 + local.get 6 + i32.load offset=856 + i32.const 1 + i32.ne + if ;; label = @18 + local.get 6 + i32.const 768 + i32.add + local.get 1 + i32.load + local.tee 1 + i32.store + local.get 6 + local.get 6 + i64.load offset=776 + i64.store offset=760 + local.get 1 + i32.eqz + br_if 7 (;@11;) + local.get 0 + i32.const 0 + i32.store8 + local.get 0 + local.get 6 + i32.load offset=760 + i32.load8_u + i32.eqz + i32.store8 offset=1 + local.get 6 + i32.const 744 + i32.add + call 17 + local.get 6 + i32.const 840 + i32.add + call 17 + local.get 6 + i32.const 824 + i32.add + call 17 + local.get 6 + i32.const 808 + i32.add + call 17 + local.get 6 + i32.const 792 + i32.add + call 17 + local.get 6 + i32.const 760 + i32.add + call 17 + local.get 6 + i32.const 600 + i32.add + call 12 + local.get 6 + i32.const 584 + i32.add + call 17 + local.get 6 + i32.const 568 + i32.add + call 17 + local.get 6 + i32.const 552 + i32.add + call 12 + br 17 (;@1;) + end + local.get 0 + i32.const 1 + i32.store8 + local.get 0 + i32.const 4 + i32.add + local.get 6 + i64.load offset=776 + i64.store align=4 + local.get 0 + i32.const 12 + i32.add + local.get 1 + i64.load + i64.store align=4 + local.get 6 + i32.const 744 + i32.add + call 17 + local.get 6 + i32.const 840 + i32.add + call 17 + local.get 6 + i32.const 824 + i32.add + call 17 + local.get 6 + i32.const 808 + i32.add + call 17 + local.get 6 + i32.const 792 + i32.add + call 17 + br 13 (;@4;) + end + local.get 0 + i32.const 1 + i32.store8 + local.get 0 + i32.const 4 + i32.add + local.get 6 + i64.load offset=760 + i64.store align=4 + local.get 0 + i32.const 12 + i32.add + local.get 6 + i32.const 768 + i32.add + i64.load + i64.store align=4 + end + local.get 6 + i32.const 808 + i32.add + call 17 + br 2 (;@13;) + end + local.get 0 + i32.const 1 + i32.store8 + local.get 0 + i32.const 4 + i32.add + local.get 6 + i64.load offset=776 + i64.store align=4 + local.get 0 + i32.const 12 + i32.add + local.get 6 + i32.const 784 + i32.add + i64.load + i64.store align=4 + end + local.get 6 + i32.const 840 + i32.add + call 17 + end + local.get 6 + i32.const 792 + i32.add + call 17 + br 8 (;@4;) + end + local.get 6 + i32.const 560 + i32.add + local.get 2 + i32.const 8 + i32.add + i32.load + i32.store + local.get 6 + local.get 2 + i64.load align=4 + i64.store offset=552 + local.get 6 + i32.const 576 + i32.add + local.get 3 + i32.const 8 + i32.add + i32.load + i32.store + local.get 6 + local.get 3 + i64.load align=4 + i64.store offset=568 + local.get 6 + i32.const 592 + i32.add + local.get 4 + i32.const 8 + i32.add + i32.load + i32.store + local.get 6 + local.get 4 + i64.load align=4 + i64.store offset=584 + local.get 6 + i32.const 608 + i32.add + local.get 5 + i32.const 8 + i32.add + i32.load + local.tee 1 + i32.store + local.get 6 + local.get 5 + i64.load align=4 + i64.store offset=600 + local.get 1 + i32.const 1 + i32.add + local.tee 3 + local.get 1 + i32.lt_u + local.tee 2 + br_if 0 (;@11;) + local.get 3 + local.get 6 + i32.load offset=560 + i32.ne + br_if 5 (;@6;) + local.get 2 + br_if 0 (;@11;) + local.get 6 + i32.const 792 + i32.add + local.get 6 + i32.load offset=552 + local.tee 2 + i32.load + local.get 2 + i32.load offset=8 + call 106 + local.get 6 + i32.load offset=600 + local.set 4 + local.get 6 + i32.const 632 + i32.add + i64.const 1 + i64.store + local.get 6 + i32.const 628 + i32.add + local.get 2 + local.get 3 + i32.const 12 + i32.mul + i32.add + i32.store + local.get 6 + i32.const 0 + i32.store offset=640 + local.get 6 + local.get 2 + i32.store offset=624 + local.get 6 + local.get 4 + local.get 1 + i32.const 12 + i32.mul + i32.add + i32.store offset=620 + local.get 6 + local.get 4 + i32.store offset=616 + local.get 6 + i32.const 856 + i32.add + i32.const 4 + i32.or + local.set 1 + block ;; label = @12 + block ;; label = @13 + block ;; label = @14 + block ;; label = @15 + block ;; label = @16 + block ;; label = @17 + block ;; label = @18 + block ;; label = @19 + loop ;; label = @20 + local.get 6 + i32.const 544 + i32.add + local.get 6 + i32.const 616 + i32.add + call 107 + local.get 6 + i32.load offset=544 + local.tee 2 + i32.eqz + if ;; label = @21 + local.get 6 + i32.const 536 + i32.add + local.get 6 + i32.const 584 + i32.add + i32.const 0 + i32.const 96 + call 108 + local.get 6 + i32.load offset=540 + local.set 2 + local.get 6 + i32.load offset=536 + local.set 3 + local.get 6 + i32.const 528 + i32.add + local.get 6 + i32.const 584 + i32.add + i32.const 96 + i32.const 192 + call 108 + local.get 6 + i32.load offset=532 + local.set 4 + local.get 6 + i32.load offset=528 + local.set 5 + local.get 6 + i32.const 520 + i32.add + local.get 6 + i32.const 584 + i32.add + i32.const 192 + i32.const 193 + call 108 + local.get 6 + i32.load offset=524 + local.set 8 + local.get 6 + i32.load offset=520 + local.set 9 + local.get 6 + i32.const 512 + i32.add + local.get 6 + i32.const 584 + i32.add + i32.const 193 + i32.const 386 + call 108 + local.get 6 + i32.load offset=516 + local.set 10 + local.get 6 + i32.load offset=512 + local.set 11 + local.get 6 + i32.const 504 + i32.add + local.get 6 + i32.const 792 + i32.add + i32.const 0 + i32.const 96 + call 108 + local.get 6 + i32.load offset=508 + local.set 12 + local.get 6 + i32.load offset=504 + local.set 13 + local.get 6 + i32.const 496 + i32.add + local.get 6 + i32.const 792 + i32.add + i32.const 96 + i32.const 192 + call 108 + local.get 6 + i32.const 856 + i32.add + local.get 6 + i32.load offset=496 + local.get 6 + i32.load offset=500 + call 109 + local.get 6 + i32.const 752 + i32.add + local.tee 1 + local.get 6 + i32.const 868 + i32.add + local.tee 7 + i64.load align=4 + i64.store + local.get 6 + local.get 6 + i64.load offset=860 align=4 + i64.store offset=744 + local.get 6 + i32.load offset=856 + i32.const 1 + i32.eq + br_if 2 (;@19;) + local.get 6 + i32.const 816 + i32.add + local.get 1 + i32.load + local.tee 14 + i32.store + local.get 6 + local.get 6 + i64.load offset=744 + local.tee 27 + i64.store offset=808 + local.get 6 + i32.const 488 + i32.add + local.get 6 + i32.const 792 + i32.add + i32.const 192 + i32.const 193 + call 108 + local.get 6 + i32.load offset=492 + local.set 15 + local.get 6 + i32.load offset=488 + local.set 16 + local.get 6 + i32.const 480 + i32.add + local.get 6 + i32.const 568 + i32.add + i32.const 0 + i32.const 193 + call 108 + local.get 6 + i32.load offset=484 + local.set 17 + local.get 6 + i32.load offset=480 + local.set 18 + local.get 6 + i32.const 472 + i32.add + local.get 6 + i32.const 584 + i32.add + i32.const 386 + i32.const 482 + call 108 + local.get 6 + i32.load offset=476 + local.set 19 + local.get 6 + i32.load offset=472 + local.set 20 + local.get 6 + i32.const 464 + i32.add + local.get 6 + i32.const 584 + i32.add + i32.const 482 + i32.const 578 + call 108 + local.get 6 + i32.const 856 + i32.add + local.get 6 + i32.load offset=464 + local.get 6 + i32.load offset=468 + call 109 + local.get 6 + i32.const 768 + i32.add + local.get 7 + i64.load align=4 + i64.store + local.get 6 + local.get 6 + i64.load offset=860 align=4 + i64.store offset=760 + local.get 6 + i32.load offset=856 + i32.const 1 + i32.eq + br_if 5 (;@16;) + local.get 6 + i32.const 832 + i32.add + local.get 6 + i32.const 768 + i32.add + i32.load + local.tee 7 + i32.store + local.get 6 + local.get 6 + i64.load offset=760 + local.tee 28 + i64.store offset=824 + local.get 6 + i32.const 456 + i32.add + local.get 6 + i32.const 584 + i32.add + i32.const 578 + i32.const 579 + call 108 + local.get 6 + i32.load offset=460 + local.set 21 + local.get 6 + i32.load offset=456 + local.set 22 + local.get 6 + i32.const 448 + i32.add + local.get 6 + i32.const 568 + i32.add + i32.const 193 + i32.const 386 + call 108 + local.get 6 + i32.load offset=452 + local.set 23 + local.get 6 + i32.load offset=448 + local.set 24 + local.get 6 + i32.const 440 + i32.add + local.get 6 + i32.const 568 + i32.add + i32.const 386 + i32.const 482 + call 108 + local.get 6 + i32.load offset=444 + local.set 25 + local.get 6 + i32.load offset=440 + local.set 26 + local.get 6 + i32.const 432 + i32.add + local.get 6 + i32.const 568 + i32.add + i32.const 482 + i32.const 578 + call 108 + local.get 6 + i32.const 856 + i32.add + local.get 6 + i32.load offset=432 + local.get 6 + i32.load offset=436 + call 109 + local.get 6 + i32.const 784 + i32.add + local.tee 1 + local.get 6 + i32.const 868 + i32.add + i64.load align=4 + i64.store + local.get 6 + local.get 6 + i64.load offset=860 align=4 + i64.store offset=776 + local.get 6 + i32.load offset=856 + i32.const 1 + i32.eq + br_if 3 (;@18;) + local.get 6 + i32.const 848 + i32.add + local.get 1 + i32.load + local.tee 1 + i32.store + local.get 6 + local.get 6 + i64.load offset=776 + local.tee 29 + i64.store offset=840 + local.get 6 + i32.const 424 + i32.add + local.get 6 + i32.const 568 + i32.add + i32.const 578 + i32.const 579 + call 108 + local.get 6 + i64.load offset=424 + local.set 30 + local.get 6 + i32.const 416 + i32.add + local.get 6 + i32.const 568 + i32.add + i32.const 579 + i32.const 772 + call 108 + local.get 6 + i32.const 728 + i32.add + local.get 30 + i64.store + local.get 6 + i32.const 724 + i32.add + local.get 1 + i32.store + local.get 6 + i32.const 720 + i32.add + local.get 29 + i64.store32 + local.get 6 + i32.const 716 + i32.add + local.get 25 + i32.store + local.get 6 + i32.const 708 + i32.add + local.get 23 + i32.store + local.get 6 + i32.const 704 + i32.add + local.get 24 + i32.store + local.get 6 + i32.const 700 + i32.add + local.get 21 + i32.store + local.get 6 + i32.const 696 + i32.add + local.get 22 + i32.store + local.get 6 + i32.const 692 + i32.add + local.get 7 + i32.store + local.get 6 + i32.const 688 + i32.add + local.get 28 + i64.store32 + local.get 6 + i32.const 684 + i32.add + local.get 19 + i32.store + local.get 6 + i32.const 676 + i32.add + local.get 17 + i32.store + local.get 6 + i32.const 672 + i32.add + local.get 18 + i32.store + local.get 6 + i32.const 668 + i32.add + local.get 15 + i32.store + local.get 6 + i32.const 664 + i32.add + local.get 16 + i32.store + local.get 6 + i32.const 660 + i32.add + local.get 14 + i32.store + local.get 6 + i32.const 656 + i32.add + local.get 27 + i64.store32 + local.get 6 + i32.const 652 + i32.add + local.get 12 + i32.store + local.get 6 + i32.const 644 + i32.add + local.get 10 + i32.store + local.get 6 + i32.const 636 + i32.add + local.get 8 + i32.store + local.get 6 + i32.const 628 + i32.add + local.get 4 + i32.store + local.get 6 + i32.const 736 + i32.add + local.get 6 + i64.load offset=416 + i64.store + local.get 6 + local.get 26 + i32.store offset=712 + local.get 6 + local.get 20 + i32.store offset=680 + local.get 6 + local.get 13 + i32.store offset=648 + local.get 6 + local.get 11 + i32.store offset=640 + local.get 6 + local.get 9 + i32.store offset=632 + local.get 6 + local.get 5 + i32.store offset=624 + local.get 6 + local.get 2 + i32.store offset=620 + local.get 6 + local.get 3 + i32.store offset=616 + local.get 6 + i32.const 744 + i32.add + i32.const 1544 + call 53 + i32.const 128 + local.set 3 + local.get 6 + i32.const 616 + i32.add + local.set 2 + loop ;; label = @22 + local.get 3 + i32.eqz + br_if 5 (;@17;) + local.get 6 + i32.const 744 + i32.add + local.get 2 + i32.load + local.get 2 + i32.load offset=4 + call 45 + local.get 6 + i32.const 744 + i32.add + local.get 2 + i32.load offset=8 + local.get 2 + i32.load offset=12 + call 45 + local.get 6 + i32.const 744 + i32.add + local.get 2 + i32.load offset=16 + local.get 2 + i32.load offset=20 + call 45 + local.get 6 + i32.const 744 + i32.add + local.get 2 + i32.load offset=24 + local.get 2 + i32.load offset=28 + call 45 + local.get 3 + i32.const -32 + i32.add + local.set 3 + local.get 2 + i32.const 32 + i32.add + local.set 2 + br 0 (;@22;) + end + unreachable + end + local.get 6 + i32.load offset=548 + local.set 3 + local.get 6 + i32.const 840 + i32.add + i32.const 193 + call 96 + local.get 6 + i32.load offset=848 + local.tee 4 + local.get 3 + i32.load offset=8 + i32.ne + br_if 11 (;@9;) + local.get 6 + i32.load offset=840 + local.get 3 + i32.load + local.get 4 + call 148 + local.get 6 + i32.const 840 + i32.add + local.get 2 + i32.load + local.get 2 + i32.load offset=8 + call 45 + local.get 6 + i32.const 856 + i32.add + i32.const 16777265 + local.get 6 + i32.load offset=840 + local.get 6 + i32.load offset=848 + call 36 + local.get 6 + i32.const 784 + i32.add + local.tee 2 + local.get 1 + i32.const 8 + i32.add + local.tee 3 + i64.load align=4 + i64.store + local.get 6 + local.get 1 + i64.load align=4 + i64.store offset=776 + local.get 6 + i32.load offset=856 + i32.const 1 + i32.eq + br_if 6 (;@14;) + local.get 6 + i32.const 752 + i32.add + local.get 2 + i32.load + i32.store + local.get 6 + local.get 6 + i64.load offset=776 + i64.store offset=744 + local.get 6 + i32.const 760 + i32.add + i32.const 193 + call 96 + local.get 6 + i32.load offset=768 + local.tee 4 + local.get 6 + i32.load offset=800 + i32.ne + br_if 11 (;@9;) + local.get 6 + i32.load offset=760 + local.get 6 + i32.load offset=792 + local.get 4 + call 148 + local.get 6 + i32.const 760 + i32.add + local.get 6 + i32.load offset=744 + local.get 6 + i32.load offset=752 + call 45 + local.get 6 + i32.const 856 + i32.add + i32.const 16777264 + local.get 6 + i32.load offset=760 + local.get 6 + i32.load offset=768 + call 36 + local.get 2 + local.get 3 + i64.load align=4 + i64.store + local.get 6 + local.get 1 + i64.load align=4 + i64.store offset=776 + local.get 6 + i32.load offset=856 + i32.const 1 + i32.ne + if ;; label = @21 + local.get 6 + i32.const 792 + i32.add + call 17 + local.get 6 + i32.const 800 + i32.add + local.get 2 + i32.load + i32.store + local.get 6 + local.get 6 + i64.load offset=776 + i64.store offset=792 + local.get 6 + i32.const 760 + i32.add + call 17 + local.get 6 + i32.const 744 + i32.add + call 17 + local.get 6 + i32.const 840 + i32.add + call 17 + br 1 (;@20;) + end + end + local.get 0 + i32.const 1 + i32.store8 + local.get 0 + i32.const 4 + i32.add + local.get 6 + i64.load offset=776 + i64.store align=4 + local.get 0 + i32.const 12 + i32.add + local.get 6 + i32.const 784 + i32.add + i64.load + i64.store align=4 + local.get 6 + i32.const 760 + i32.add + call 17 + local.get 6 + i32.const 744 + i32.add + call 17 + br 6 (;@13;) + end + local.get 0 + i32.const 1 + i32.store8 + local.get 0 + i32.const 4 + i32.add + local.get 6 + i64.load offset=744 + i64.store align=4 + local.get 0 + i32.const 12 + i32.add + local.get 1 + i64.load + i64.store align=4 + br 6 (;@12;) + end + local.get 0 + i32.const 1 + i32.store8 + local.get 0 + i32.const 4 + i32.add + local.get 6 + i64.load offset=776 + i64.store align=4 + local.get 0 + i32.const 12 + i32.add + local.get 1 + i64.load + i64.store align=4 + local.get 6 + i32.const 824 + i32.add + call 17 + br 2 (;@15;) + end + local.get 6 + i32.const 856 + i32.add + i32.const 16777266 + local.get 6 + i32.load offset=744 + local.get 6 + i32.load offset=752 + call 36 + local.get 6 + i32.const 784 + i32.add + local.tee 1 + local.get 6 + i32.const 868 + i32.add + i64.load align=4 + i64.store + local.get 6 + local.get 6 + i64.load offset=860 align=4 + i64.store offset=776 + local.get 6 + i32.load offset=856 + i32.const 1 + i32.ne + if ;; label = @17 + local.get 6 + i32.const 768 + i32.add + local.get 1 + i32.load + local.tee 1 + i32.store + local.get 6 + local.get 6 + i64.load offset=776 + i64.store offset=760 + local.get 1 + i32.eqz + br_if 6 (;@11;) + local.get 0 + i32.const 0 + i32.store8 + local.get 0 + local.get 6 + i32.load offset=760 + i32.load8_u + i32.eqz + i32.store8 offset=1 + local.get 6 + i32.const 744 + i32.add + call 17 + local.get 6 + i32.const 840 + i32.add + call 17 + local.get 6 + i32.const 824 + i32.add + call 17 + local.get 6 + i32.const 808 + i32.add + call 17 + local.get 6 + i32.const 792 + i32.add + call 17 + local.get 6 + i32.const 760 + i32.add + call 17 + local.get 6 + i32.const 600 + i32.add + call 12 + local.get 6 + i32.const 584 + i32.add + call 17 + local.get 6 + i32.const 568 + i32.add + call 17 + local.get 6 + i32.const 552 + i32.add + call 12 + br 16 (;@1;) + end + local.get 0 + i32.const 1 + i32.store8 + local.get 0 + i32.const 4 + i32.add + local.get 6 + i64.load offset=776 + i64.store align=4 + local.get 0 + i32.const 12 + i32.add + local.get 1 + i64.load + i64.store align=4 + local.get 6 + i32.const 744 + i32.add + call 17 + local.get 6 + i32.const 840 + i32.add + call 17 + local.get 6 + i32.const 824 + i32.add + call 17 + local.get 6 + i32.const 808 + i32.add + call 17 + local.get 6 + i32.const 792 + i32.add + call 17 + br 11 (;@5;) + end + local.get 0 + i32.const 1 + i32.store8 + local.get 0 + i32.const 4 + i32.add + local.get 6 + i64.load offset=760 + i64.store align=4 + local.get 0 + i32.const 12 + i32.add + local.get 6 + i32.const 768 + i32.add + i64.load + i64.store align=4 + end + local.get 6 + i32.const 808 + i32.add + call 17 + br 2 (;@12;) + end + local.get 0 + i32.const 1 + i32.store8 + local.get 0 + i32.const 4 + i32.add + local.get 6 + i64.load offset=776 + i64.store align=4 + local.get 0 + i32.const 12 + i32.add + local.get 6 + i32.const 784 + i32.add + i64.load + i64.store align=4 + end + local.get 6 + i32.const 840 + i32.add + call 17 + end + local.get 6 + i32.const 792 + i32.add + call 17 + br 6 (;@5;) + end + unreachable + end + local.get 6 + i32.const 616 + i32.add + call 101 + local.get 0 + i32.const 1 + i32.store8 + local.get 0 + i32.const 12 + i32.add + local.get 6 + i32.const 624 + i32.add + i64.load + i64.store align=4 + local.get 0 + i32.const 4 + i32.add + local.get 6 + i64.load offset=616 + i64.store align=4 + br 7 (;@2;) + end + unreachable + end + local.get 6 + i32.const 616 + i32.add + call 101 + local.get 0 + i32.const 1 + i32.store8 + local.get 0 + i32.const 12 + i32.add + local.get 6 + i32.const 624 + i32.add + i64.load + i64.store align=4 + local.get 0 + i32.const 4 + i32.add + local.get 6 + i64.load offset=616 + i64.store align=4 + br 4 (;@3;) + end + local.get 6 + i32.const 616 + i32.add + call 101 + local.get 0 + i32.const 1 + i32.store8 + local.get 0 + i32.const 12 + i32.add + local.get 6 + i32.const 624 + i32.add + i64.load + i64.store align=4 + local.get 0 + i32.const 4 + i32.add + local.get 6 + i64.load offset=616 + i64.store align=4 + br 2 (;@4;) + end + local.get 6 + i32.const 616 + i32.add + call 101 + local.get 0 + i32.const 1 + i32.store8 + local.get 0 + i32.const 12 + i32.add + local.get 6 + i32.const 624 + i32.add + i64.load + i64.store align=4 + local.get 0 + i32.const 4 + i32.add + local.get 6 + i64.load offset=616 + i64.store align=4 + end + local.get 6 + i32.const 600 + i32.add + call 12 + local.get 6 + i32.const 584 + i32.add + call 17 + local.get 6 + i32.const 568 + i32.add + call 17 + local.get 6 + i32.const 552 + i32.add + call 12 + br 3 (;@1;) + end + local.get 6 + i32.const 600 + i32.add + call 12 + local.get 6 + i32.const 584 + i32.add + call 17 + local.get 6 + i32.const 568 + i32.add + call 17 + local.get 6 + i32.const 552 + i32.add + call 12 + br 2 (;@1;) + end + local.get 6 + i32.const 600 + i32.add + call 12 + local.get 6 + i32.const 584 + i32.add + call 17 + local.get 6 + i32.const 568 + i32.add + call 17 + local.get 6 + i32.const 552 + i32.add + call 12 + br 1 (;@1;) + end + local.get 6 + i32.const 600 + i32.add + call 12 + local.get 6 + i32.const 584 + i32.add + call 17 + local.get 6 + i32.const 568 + i32.add + call 17 + local.get 6 + i32.const 552 + i32.add + call 12 + end + local.get 6 + i32.const 880 + i32.add + global.set 0) + (func (;35;) (type 2) (param i32 i32) + (local i32) + global.get 0 + i32.const 48 + i32.sub + local.tee 2 + global.set 0 + local.get 2 + local.get 1 + i32.store offset=12 + local.get 2 + i32.const 36 + i32.add + i32.const 1 + i32.store + local.get 2 + i64.const 1 + i64.store offset=20 align=4 + local.get 2 + i32.const 68920 + i32.store offset=16 + local.get 2 + i32.const 2 + i32.store offset=44 + local.get 2 + local.get 2 + i32.const 40 + i32.add + i32.store offset=32 + local.get 2 + local.get 2 + i32.const 12 + i32.add + i32.store offset=40 + local.get 0 + local.get 2 + i32.const 16 + i32.add + call 54 + local.get 2 + i32.const 48 + i32.add + global.set 0) + (func (;36;) (type 5) (param i32 i32 i32 i32) + (local i32 i32 i32 i64) + global.get 0 + i32.const 112 + i32.sub + local.tee 4 + global.set 0 + local.get 4 + local.get 3 + i32.store offset=12 + local.get 4 + local.get 2 + i32.store offset=8 + local.get 4 + i64.const 16384 + i64.store offset=68 align=4 + local.get 4 + i32.const 68972 + i32.store offset=64 + local.get 2 + local.get 3 + local.get 4 + i32.const -64 + i32.sub + call 19 + local.get 4 + i32.load offset=68 + local.tee 5 + local.get 4 + i32.load offset=72 + local.tee 2 + i32.ge_u + if ;; label = @1 + local.get 4 + i32.load offset=64 + local.set 3 + local.get 4 + local.get 5 + local.get 2 + i32.sub + local.tee 5 + i32.store offset=108 + local.get 4 + local.get 2 + local.get 3 + i32.add + local.tee 6 + i32.store offset=104 + local.get 4 + local.get 5 + i32.store offset=64 + local.get 1 + local.get 3 + local.get 2 + local.get 6 + local.get 4 + i32.const -64 + i32.sub + call 4 + local.set 1 + local.get 4 + i32.const 104 + i32.add + local.get 4 + i32.load offset=64 + call 7 + i32.const 8 + local.set 2 + local.get 0 + block (result i32) ;; label = @2 + block ;; label = @3 + block ;; label = @4 + block ;; label = @5 + block ;; label = @6 + block ;; label = @7 + block ;; label = @8 + block ;; label = @9 + block ;; label = @10 + block ;; label = @11 + block ;; label = @12 + block ;; label = @13 + local.get 1 + call 8 + i32.const -2 + i32.add + br_table 3 (;@10;) 4 (;@9;) 5 (;@8;) 6 (;@7;) 7 (;@6;) 8 (;@5;) 10 (;@3;) 1 (;@12;) 0 (;@13;) 2 (;@11;) + end + local.get 4 + local.get 4 + i64.load offset=104 + i64.store offset=88 + local.get 4 + i32.const -64 + i32.sub + local.get 4 + i32.const 88 + i32.add + call 32 + local.get 4 + i32.load offset=64 + i32.eqz + br_if 8 (;@4;) + local.get 4 + i32.const 24 + i32.add + local.get 4 + i32.const 72 + i32.add + i32.load + local.tee 1 + i32.store + local.get 4 + local.get 4 + i64.load offset=64 + local.tee 7 + i64.store offset=16 + local.get 0 + i32.const 12 + i32.add + local.get 1 + i32.store + local.get 0 + local.get 7 + i64.store offset=4 align=4 + i32.const 0 + br 10 (;@2;) + end + i32.const 9 + local.set 2 + br 8 (;@3;) + end + i32.const 1 + local.set 2 + br 7 (;@3;) + end + i32.const 2 + local.set 2 + br 6 (;@3;) + end + i32.const 3 + local.set 2 + br 5 (;@3;) + end + i32.const 4 + local.set 2 + br 4 (;@3;) + end + i32.const 5 + local.set 2 + br 3 (;@3;) + end + i32.const 6 + local.set 2 + br 2 (;@3;) + end + i32.const 7 + local.set 2 + br 1 (;@3;) + end + i32.const 0 + local.set 2 + end + local.get 4 + local.get 2 + i32.store8 offset=104 + local.get 4 + i32.const 84 + i32.add + i32.const 2 + i32.store + local.get 4 + i32.const 100 + i32.add + i32.const 3 + i32.store + local.get 4 + i64.const 2 + i64.store offset=68 align=4 + local.get 4 + i32.const 68632 + i32.store offset=64 + local.get 4 + i32.const 4 + i32.store offset=92 + local.get 4 + local.get 4 + i32.const 88 + i32.add + i32.store offset=80 + local.get 4 + local.get 4 + i32.const 8 + i32.add + i32.store offset=96 + local.get 4 + local.get 4 + i32.const 104 + i32.add + i32.store offset=88 + local.get 4 + i32.const 32 + i32.add + local.get 4 + i32.const -64 + i32.sub + call 54 + local.get 4 + i32.const 24 + i32.add + local.get 4 + i32.const 40 + i32.add + i32.load + local.tee 1 + i32.store + local.get 4 + local.get 4 + i64.load offset=32 + local.tee 7 + i64.store offset=16 + local.get 4 + i32.const 75 + i32.add + local.get 1 + i32.store align=1 + local.get 0 + i32.const 1 + i32.store8 offset=4 + local.get 4 + local.get 7 + i64.store offset=67 align=1 + local.get 0 + local.get 4 + i64.load offset=64 align=1 + i64.store offset=5 align=1 + local.get 0 + i32.const 12 + i32.add + local.get 4 + i32.const 71 + i32.add + i64.load align=1 + i64.store align=1 + i32.const 1 + end + i32.store + local.get 4 + i32.const 112 + i32.add + global.set 0 + return + end + unreachable) + (func (;37;) (type 1) (param i32 i32) (result i32) + local.get 0 + local.get 1 + call 91) + (func (;38;) (type 7) (param i32 i32 i32 i32) (result i32) + local.get 0 + local.get 1 + local.get 2 + local.get 3 + call 39) + (func (;39;) (type 7) (param i32 i32 i32 i32) (result i32) + local.get 3 + local.get 2 + call 91 + local.tee 2 + if ;; label = @1 + local.get 2 + local.get 0 + local.get 3 + local.get 1 + local.get 1 + local.get 3 + i32.gt_u + select + call 148 + local.get 0 + local.get 1 + call 92 + end + local.get 2) + (func (;40;) (type 1) (param i32 i32) (result i32) + local.get 0 + local.get 1 + call 91 + local.tee 1 + if ;; label = @1 + local.get 1 + local.get 0 + call 147 + end + local.get 1) + (func (;41;) (type 1) (param i32 i32) (result i32) + (local i32) + global.get 0 + i32.const 32 + i32.sub + local.tee 2 + global.set 0 + local.get 2 + local.get 0 + i32.store offset=4 + local.get 2 + i32.const 24 + i32.add + local.get 1 + i32.const 16 + i32.add + i64.load align=4 + i64.store + local.get 2 + i32.const 16 + i32.add + local.get 1 + i32.const 8 + i32.add + i64.load align=4 + i64.store + local.get 2 + local.get 1 + i64.load align=4 + i64.store offset=8 + local.get 2 + i32.const 4 + i32.add + i32.const 65572 + local.get 2 + i32.const 8 + i32.add + call 42 + local.get 2 + i32.const 32 + i32.add + global.set 0) + (func (;42;) (type 0) (param i32 i32 i32) (result i32) + (local i32 i32 i32 i32 i32 i32) + global.get 0 + i32.const -64 + i32.add + local.tee 3 + global.set 0 + local.get 3 + i32.const 52 + i32.add + local.get 1 + i32.store + local.get 3 + i32.const 3 + i32.store8 offset=56 + local.get 3 + i64.const 137438953472 + i64.store offset=24 + local.get 3 + local.get 0 + i32.store offset=48 + local.get 3 + i32.const 0 + i32.store offset=40 + local.get 3 + i32.const 0 + i32.store offset=32 + block (result i32) ;; label = @1 + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + local.get 2 + i32.load offset=8 + local.tee 0 + if ;; label = @5 + local.get 2 + i32.load offset=4 + local.tee 6 + local.get 2 + i32.const 12 + i32.add + i32.load + local.tee 1 + local.get 1 + local.get 6 + i32.gt_u + select + local.set 5 + local.get 2 + i32.load + local.tee 8 + local.set 1 + loop ;; label = @6 + local.get 4 + local.get 5 + i32.eq + br_if 3 (;@3;) + local.get 3 + i32.load offset=48 + local.get 1 + i32.load + local.get 1 + i32.const 4 + i32.add + i32.load + local.get 3 + i32.load offset=52 + i32.load offset=12 + call_indirect (type 0) + br_if 4 (;@2;) + local.get 3 + local.get 0 + i32.const 28 + i32.add + i32.load8_u + i32.store8 offset=56 + local.get 3 + local.get 0 + i32.const 4 + i32.add + i64.load align=4 + i64.const 32 + i64.rotl + i64.store offset=24 + local.get 3 + i32.const 16 + i32.add + local.get 2 + i32.load offset=16 + local.tee 7 + local.get 0 + i32.const 20 + i32.add + call 79 + local.get 3 + local.get 3 + i64.load offset=16 + i64.store offset=32 + local.get 3 + i32.const 8 + i32.add + local.get 7 + local.get 0 + i32.const 12 + i32.add + call 79 + local.get 3 + local.get 3 + i64.load offset=8 + i64.store offset=40 + local.get 7 + local.get 0 + i32.load + i32.const 3 + i32.shl + i32.add + local.tee 7 + i32.load + local.get 3 + i32.const 24 + i32.add + local.get 7 + i32.load offset=4 + call_indirect (type 1) + br_if 4 (;@2;) + local.get 0 + i32.const 32 + i32.add + local.set 0 + local.get 1 + i32.const 8 + i32.add + local.set 1 + local.get 4 + i32.const 1 + i32.add + local.tee 4 + br_if 0 (;@6;) + end + br 1 (;@4;) + end + local.get 2 + i32.load offset=4 + local.tee 6 + local.get 2 + i32.const 20 + i32.add + i32.load + local.tee 0 + local.get 0 + local.get 6 + i32.gt_u + select + local.set 5 + local.get 2 + i32.load + local.set 8 + local.get 2 + i32.load offset=16 + local.set 2 + i32.const 0 + local.set 0 + i32.const 0 + local.set 1 + loop ;; label = @5 + local.get 1 + local.get 5 + i32.eq + br_if 2 (;@3;) + local.get 3 + i32.load offset=48 + local.get 0 + local.get 8 + i32.add + local.tee 4 + i32.load + local.get 4 + i32.const 4 + i32.add + i32.load + local.get 3 + i32.load offset=52 + i32.load offset=12 + call_indirect (type 0) + br_if 3 (;@2;) + local.get 0 + local.get 2 + i32.add + local.tee 4 + i32.load + local.get 3 + i32.const 24 + i32.add + local.get 4 + i32.const 4 + i32.add + i32.load + call_indirect (type 1) + br_if 3 (;@2;) + local.get 0 + i32.const 8 + i32.add + local.set 0 + local.get 1 + i32.const 1 + i32.add + local.tee 1 + br_if 0 (;@5;) + end + end + unreachable + end + local.get 6 + local.get 5 + i32.gt_u + if ;; label = @3 + local.get 3 + i32.load offset=48 + local.get 8 + local.get 5 + i32.const 3 + i32.shl + i32.add + local.tee 0 + i32.load + local.get 0 + i32.load offset=4 + local.get 3 + i32.load offset=52 + i32.load offset=12 + call_indirect (type 0) + br_if 1 (;@2;) + end + i32.const 0 + br 1 (;@1;) + end + i32.const 1 + end + local.get 3 + i32.const -64 + i32.sub + global.set 0) + (func (;43;) (type 4) (param i32) + nop) + (func (;44;) (type 0) (param i32 i32 i32) (result i32) + local.get 0 + i32.load + local.get 1 + local.get 2 + call 45 + i32.const 0) + (func (;45;) (type 3) (param i32 i32 i32) + local.get 0 + local.get 2 + call 47 + local.get 0 + i32.load + local.get 0 + i32.load offset=8 + i32.add + local.get 1 + local.get 2 + call 148 + local.get 0 + i32.load offset=8 + local.tee 1 + local.get 2 + i32.add + local.tee 2 + local.get 1 + i32.lt_u + if ;; label = @1 + unreachable + end + local.get 0 + local.get 2 + i32.store offset=8) + (func (;46;) (type 1) (param i32 i32) (result i32) + (local i32 i32) + global.get 0 + i32.const 16 + i32.sub + local.tee 2 + global.set 0 + local.get 0 + i32.load + local.set 0 + block ;; label = @1 + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + local.get 1 + i32.const 128 + i32.ge_u + if ;; label = @5 + local.get 2 + i32.const 0 + i32.store offset=12 + local.get 1 + i32.const 2048 + i32.lt_u + br_if 1 (;@4;) + local.get 1 + i32.const 65536 + i32.lt_u + if ;; label = @6 + local.get 2 + local.get 1 + i32.const 63 + i32.and + i32.const 128 + i32.or + i32.store8 offset=14 + local.get 2 + local.get 1 + i32.const 12 + i32.shr_u + i32.const 224 + i32.or + i32.store8 offset=12 + local.get 2 + local.get 1 + i32.const 6 + i32.shr_u + i32.const 63 + i32.and + i32.const 128 + i32.or + i32.store8 offset=13 + i32.const 3 + local.set 1 + br 4 (;@2;) + end + local.get 2 + local.get 1 + i32.const 63 + i32.and + i32.const 128 + i32.or + i32.store8 offset=15 + local.get 2 + local.get 1 + i32.const 18 + i32.shr_u + i32.const 240 + i32.or + i32.store8 offset=12 + local.get 2 + local.get 1 + i32.const 6 + i32.shr_u + i32.const 63 + i32.and + i32.const 128 + i32.or + i32.store8 offset=14 + local.get 2 + local.get 1 + i32.const 12 + i32.shr_u + i32.const 63 + i32.and + i32.const 128 + i32.or + i32.store8 offset=13 + i32.const 4 + local.set 1 + br 3 (;@2;) + end + local.get 0 + i32.load offset=8 + local.tee 3 + local.get 0 + i32.load offset=4 + i32.eq + if (result i32) ;; label = @5 + local.get 0 + i32.const 1 + call 47 + local.get 0 + i32.load offset=8 + else + local.get 3 + end + local.get 0 + i32.load + i32.add + local.get 1 + i32.store8 + local.get 0 + i32.load offset=8 + local.tee 1 + i32.const 1 + i32.add + local.tee 3 + local.get 1 + i32.lt_u + br_if 1 (;@3;) + local.get 0 + local.get 3 + i32.store offset=8 + br 3 (;@1;) + end + local.get 2 + local.get 1 + i32.const 63 + i32.and + i32.const 128 + i32.or + i32.store8 offset=13 + local.get 2 + local.get 1 + i32.const 6 + i32.shr_u + i32.const 192 + i32.or + i32.store8 offset=12 + i32.const 2 + local.set 1 + br 1 (;@2;) + end + unreachable + end + local.get 0 + local.get 2 + i32.const 12 + i32.add + local.get 1 + call 45 + end + local.get 2 + i32.const 16 + i32.add + global.set 0 + i32.const 0) + (func (;47;) (type 2) (param i32 i32) + (local i32 i32 i32) + global.get 0 + i32.const 32 + i32.sub + local.tee 2 + global.set 0 + block ;; label = @1 + block ;; label = @2 + local.get 0 + i32.load offset=4 + local.tee 3 + local.get 0 + i32.load offset=8 + local.tee 4 + i32.sub + local.get 1 + i32.lt_u + if ;; label = @3 + local.get 1 + local.get 4 + i32.add + local.tee 1 + local.get 4 + i32.lt_u + br_if 2 (;@1;) + local.get 3 + local.get 3 + i32.add + local.tee 4 + local.get 3 + i32.lt_u + br_if 2 (;@1;) + local.get 4 + local.get 1 + local.get 4 + local.get 1 + i32.gt_u + select + local.tee 1 + i32.const 8 + local.get 1 + i32.const 8 + i32.gt_u + select + local.set 1 + block ;; label = @4 + local.get 3 + if ;; label = @5 + local.get 2 + i32.const 24 + i32.add + i32.const 1 + i32.store + local.get 2 + local.get 3 + i32.store offset=20 + local.get 2 + local.get 0 + i32.load + i32.store offset=16 + br 1 (;@4;) + end + local.get 2 + i32.const 0 + i32.store offset=16 + end + local.get 2 + local.get 1 + i32.const 1 + local.get 2 + i32.const 16 + i32.add + call 49 + local.get 2 + i32.const 8 + i32.add + i32.load + local.set 1 + local.get 2 + i32.load + i32.const 1 + i32.eq + br_if 1 (;@2;) + local.get 2 + i32.load offset=4 + local.set 3 + local.get 0 + local.get 1 + i32.store offset=4 + local.get 0 + local.get 3 + i32.store + end + local.get 2 + i32.const 32 + i32.add + global.set 0 + return + end + local.get 1 + i32.eqz + br_if 0 (;@1;) + unreachable + end + unreachable) + (func (;48;) (type 1) (param i32 i32) (result i32) + (local i32) + global.get 0 + i32.const 32 + i32.sub + local.tee 2 + global.set 0 + local.get 0 + i32.load + local.get 2 + i32.const 24 + i32.add + local.get 1 + i32.const 16 + i32.add + i64.load align=4 + i64.store + local.get 2 + i32.const 16 + i32.add + local.get 1 + i32.const 8 + i32.add + i64.load align=4 + i64.store + local.get 2 + local.get 1 + i64.load align=4 + i64.store offset=8 + local.get 2 + i32.const 8 + i32.add + call 41 + local.get 2 + i32.const 32 + i32.add + global.set 0) + (func (;49;) (type 5) (param i32 i32 i32 i32) + (local i32 i32) + global.get 0 + i32.const 16 + i32.sub + local.tee 4 + global.set 0 + block ;; label = @1 + block ;; label = @2 + local.get 2 + if ;; label = @3 + local.get 1 + i32.const 0 + i32.lt_s + br_if 1 (;@2;) + block (result i32) ;; label = @4 + local.get 3 + i32.load + local.tee 5 + i32.eqz + if ;; label = @5 + local.get 4 + local.get 1 + local.get 2 + call 50 + local.get 4 + i32.load + local.set 3 + local.get 4 + i32.load offset=4 + br 1 (;@4;) + end + local.get 3 + i32.load offset=4 + local.tee 3 + i32.eqz + if ;; label = @5 + local.get 4 + i32.const 8 + i32.add + local.get 1 + local.get 2 + i32.const 0 + call 51 + local.get 4 + i32.load offset=8 + local.set 3 + local.get 4 + i32.load offset=12 + br 1 (;@4;) + end + local.get 5 + local.get 3 + local.get 2 + local.get 1 + call 38 + local.set 3 + local.get 1 + end + local.set 5 + local.get 0 + block (result i32) ;; label = @4 + local.get 3 + i32.eqz + if ;; label = @5 + local.get 0 + local.get 1 + i32.store offset=4 + i32.const 1 + br 1 (;@4;) + end + local.get 0 + local.get 3 + i32.store offset=4 + local.get 5 + local.set 2 + i32.const 0 + end + i32.store + local.get 0 + i32.const 8 + i32.add + local.get 2 + i32.store + br 2 (;@1;) + end + local.get 0 + local.get 1 + i32.store offset=4 + local.get 0 + i32.const 1 + i32.store + local.get 0 + i32.const 8 + i32.add + i32.const 0 + i32.store + br 1 (;@1;) + end + local.get 0 + i32.const 1 + i32.store + local.get 0 + i32.const 8 + i32.add + i32.const 0 + i32.store + end + local.get 4 + i32.const 16 + i32.add + global.set 0) + (func (;50;) (type 3) (param i32 i32 i32) + (local i32) + global.get 0 + i32.const 16 + i32.sub + local.tee 3 + global.set 0 + local.get 3 + i32.const 8 + i32.add + local.get 1 + local.get 2 + i32.const 0 + call 51 + local.get 0 + local.get 3 + i32.load offset=8 + i32.store + local.get 0 + local.get 3 + i32.load offset=12 + i32.store offset=4 + local.get 3 + i32.const 16 + i32.add + global.set 0) + (func (;51;) (type 5) (param i32 i32 i32 i32) + block ;; label = @1 + local.get 1 + i32.eqz + br_if 0 (;@1;) + local.get 3 + i32.eqz + if ;; label = @2 + local.get 1 + local.get 2 + call 37 + local.set 2 + br 1 (;@1;) + end + local.get 1 + local.get 2 + call 40 + local.set 2 + end + local.get 0 + local.get 1 + i32.store offset=4 + local.get 0 + local.get 2 + i32.store) + (func (;52;) (type 3) (param i32 i32 i32) + (local i32) + global.get 0 + i32.const 16 + i32.sub + local.tee 3 + global.set 0 + block ;; label = @1 + local.get 1 + i32.const -1 + i32.gt_s + if ;; label = @2 + block (result i32) ;; label = @3 + local.get 2 + if ;; label = @4 + local.get 3 + local.get 1 + i32.const 1 + i32.const 1 + call 51 + local.get 3 + i32.load offset=4 + local.set 2 + local.get 3 + i32.load + br 1 (;@3;) + end + local.get 3 + i32.const 8 + i32.add + local.get 1 + i32.const 1 + call 50 + local.get 3 + i32.load offset=12 + local.set 2 + local.get 3 + i32.load offset=8 + end + local.tee 1 + i32.eqz + br_if 1 (;@1;) + local.get 0 + local.get 2 + i32.store offset=4 + local.get 0 + local.get 1 + i32.store + local.get 3 + i32.const 16 + i32.add + global.set 0 + return + end + unreachable + end + unreachable) + (func (;53;) (type 2) (param i32 i32) + (local i32 i64) + global.get 0 + i32.const 16 + i32.sub + local.tee 2 + global.set 0 + local.get 2 + i32.const 8 + i32.add + local.get 1 + i32.const 0 + call 52 + local.get 2 + i64.load offset=8 + local.set 3 + local.get 0 + i32.const 0 + i32.store offset=8 + local.get 0 + local.get 3 + i64.store align=4 + local.get 2 + i32.const 16 + i32.add + global.set 0) + (func (;54;) (type 2) (param i32 i32) + (local i32 i32 i32 i32 i32 i32 i32) + global.get 0 + i32.const 32 + i32.sub + local.tee 3 + global.set 0 + local.get 1 + i32.load offset=4 + local.tee 8 + i32.const 3 + i32.shl + local.set 4 + local.get 1 + i32.load + local.tee 7 + local.set 5 + block ;; label = @1 + block ;; label = @2 + loop ;; label = @3 + local.get 4 + if ;; label = @4 + local.get 2 + local.get 5 + i32.load offset=4 + i32.add + local.tee 6 + local.get 2 + i32.lt_u + br_if 2 (;@2;) + local.get 4 + i32.const -8 + i32.add + local.set 4 + local.get 5 + i32.const 8 + i32.add + local.set 5 + local.get 6 + local.set 2 + br 1 (;@3;) + end + end + local.get 0 + block (result i32) ;; label = @3 + local.get 2 + local.get 1 + i32.const 20 + i32.add + i32.load + i32.eqz + br_if 0 (;@3;) + drop + local.get 8 + i32.eqz + br_if 1 (;@2;) + i32.const 0 + local.get 2 + i32.const 15 + i32.le_u + i32.const 0 + local.get 7 + i32.load + local.get 7 + i32.load offset=4 + i32.const 68928 + i32.const 0 + call 55 + select + br_if 0 (;@3;) + drop + i32.const 0 + local.get 2 + local.get 2 + i32.add + local.tee 6 + local.get 6 + local.get 2 + i32.lt_u + select + end + call 53 + local.get 3 + i32.const 24 + i32.add + local.get 1 + i32.const 16 + i32.add + i64.load align=4 + i64.store + local.get 3 + i32.const 16 + i32.add + local.get 1 + i32.const 8 + i32.add + i64.load align=4 + i64.store + local.get 3 + local.get 1 + i64.load align=4 + i64.store offset=8 + local.get 0 + local.get 3 + i32.const 8 + i32.add + call 41 + br_if 1 (;@1;) + local.get 3 + i32.const 32 + i32.add + global.set 0 + return + end + unreachable + end + unreachable) + (func (;55;) (type 7) (param i32 i32 i32 i32) (result i32) + (local i32) + local.get 1 + local.get 3 + i32.eq + if (result i32) ;; label = @1 + local.get 0 + local.get 2 + i32.eq + if ;; label = @2 + i32.const 1 + return + end + local.get 0 + local.get 2 + local.get 1 + call 150 + i32.eqz + else + i32.const 0 + end) + (func (;56;) (type 1) (param i32 i32) (result i32) + (local i32) + global.get 0 + i32.const 16 + i32.sub + local.tee 2 + global.set 0 + block (result i32) ;; label = @1 + local.get 0 + i32.load + local.tee 0 + i32.load8_u + i32.const 1 + i32.ne + if ;; label = @2 + local.get 2 + local.get 0 + i32.load8_u offset=1 + i32.store8 offset=12 + local.get 2 + local.get 1 + i32.load offset=24 + i32.const 65908 + i32.const 4 + local.get 1 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + i32.store8 offset=8 + local.get 2 + local.get 1 + i32.store + local.get 2 + i32.const 0 + i32.store8 offset=9 + local.get 2 + i32.const 0 + i32.store offset=4 + local.get 2 + local.get 2 + i32.const 12 + i32.add + i32.const 65912 + call 57 + call 58 + br 1 (;@1;) + end + local.get 0 + i32.const 4 + i32.add + i32.load + local.set 0 + local.get 2 + local.get 1 + call 59 + i64.store + local.get 2 + local.get 0 + i32.const 8 + i32.add + i32.store offset=12 + local.get 2 + i32.const 65649 + i32.const 4 + local.get 2 + i32.const 12 + i32.add + i32.const 65656 + call 60 + local.get 2 + local.get 0 + i32.store offset=12 + i32.const 65672 + i32.const 5 + local.get 2 + i32.const 12 + i32.add + i32.const 65680 + call 60 + call 61 + end + local.get 2 + i32.const 16 + i32.add + global.set 0) + (func (;57;) (type 0) (param i32 i32 i32) (result i32) + (local i32 i32 i32 i64 i64) + global.get 0 + i32.const -64 + i32.add + local.tee 3 + global.set 0 + local.get 0 + block (result i32) ;; label = @1 + i32.const 1 + local.get 0 + i32.load8_u offset=8 + br_if 0 (;@1;) + drop + local.get 0 + i32.load offset=4 + local.set 5 + local.get 0 + i32.load + local.tee 4 + i32.load8_u + i32.const 4 + i32.and + i32.eqz + if ;; label = @2 + i32.const 1 + local.get 4 + i32.load offset=24 + i32.const 66158 + i32.const 68364 + local.get 5 + select + i32.const 2 + i32.const 1 + local.get 5 + select + local.get 4 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + br_if 1 (;@1;) + drop + local.get 1 + local.get 0 + i32.load + local.get 2 + i32.load offset=12 + call_indirect (type 1) + br 1 (;@1;) + end + local.get 5 + i32.eqz + if ;; label = @2 + i32.const 1 + local.get 4 + i32.load offset=24 + i32.const 68365 + i32.const 2 + local.get 4 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + br_if 1 (;@1;) + drop + local.get 0 + i32.load + local.set 4 + end + local.get 3 + i32.const 1 + i32.store8 offset=23 + local.get 3 + i32.const 52 + i32.add + i32.const 66132 + i32.store + local.get 3 + local.get 4 + i64.load offset=24 align=4 + i64.store offset=8 + local.get 3 + local.get 3 + i32.const 23 + i32.add + i32.store offset=16 + local.get 4 + i64.load offset=8 align=4 + local.set 6 + local.get 4 + i64.load offset=16 align=4 + local.set 7 + local.get 3 + local.get 4 + i32.load8_u offset=32 + i32.store8 offset=56 + local.get 3 + local.get 7 + i64.store offset=40 + local.get 3 + local.get 6 + i64.store offset=32 + local.get 3 + local.get 4 + i64.load align=4 + i64.store offset=24 + local.get 3 + local.get 3 + i32.const 8 + i32.add + i32.store offset=48 + i32.const 1 + local.get 1 + local.get 3 + i32.const 24 + i32.add + local.get 2 + i32.load offset=12 + call_indirect (type 1) + br_if 0 (;@1;) + drop + local.get 3 + i32.load offset=48 + i32.const 66156 + i32.const 2 + local.get 3 + i32.load offset=52 + i32.load offset=12 + call_indirect (type 0) + end + i32.store8 offset=8 + local.get 0 + i32.load offset=4 + local.tee 1 + i32.const 1 + i32.add + local.tee 2 + local.get 1 + i32.ge_u + if ;; label = @1 + local.get 0 + local.get 2 + i32.store offset=4 + local.get 3 + i32.const -64 + i32.sub + global.set 0 + local.get 0 + return + end + unreachable) + (func (;58;) (type 6) (param i32) (result i32) + (local i32 i32) + local.get 0 + i32.load8_u offset=8 + local.set 1 + local.get 0 + i32.load offset=4 + local.tee 2 + if ;; label = @1 + local.get 1 + i32.const 255 + i32.and + local.set 1 + local.get 0 + block (result i32) ;; label = @2 + i32.const 1 + local.get 1 + br_if 0 (;@2;) + drop + block ;; label = @3 + local.get 2 + i32.const 1 + i32.ne + br_if 0 (;@3;) + local.get 0 + i32.load8_u offset=9 + i32.eqz + br_if 0 (;@3;) + local.get 0 + i32.load + local.tee 2 + i32.load8_u + i32.const 4 + i32.and + br_if 0 (;@3;) + i32.const 1 + local.get 2 + i32.load offset=24 + i32.const 68362 + i32.const 1 + local.get 2 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + br_if 1 (;@2;) + drop + end + local.get 0 + i32.load + local.tee 1 + i32.load offset=24 + i32.const 68363 + i32.const 1 + local.get 1 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + end + local.tee 1 + i32.store8 offset=8 + end + local.get 1 + i32.const 255 + i32.and + i32.const 0 + i32.ne) + (func (;59;) (type 10) (param i32) (result i64) + local.get 0 + i64.extend_i32_u + i64.const 4294967296 + i64.const 0 + local.get 0 + i32.load offset=24 + i32.const 68580 + i32.const 6 + local.get 0 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + select + i64.or) + (func (;60;) (type 8) (param i32 i32 i32 i32 i32) (result i32) + (local i32 i32 i32 i32 i64 i64) + global.get 0 + i32.const -64 + i32.add + local.tee 5 + global.set 0 + i32.const 1 + local.set 7 + block ;; label = @1 + local.get 0 + i32.load8_u offset=4 + br_if 0 (;@1;) + local.get 0 + i32.load8_u offset=5 + local.set 8 + local.get 0 + i32.load + local.tee 6 + i32.load8_u + i32.const 4 + i32.and + i32.eqz + if ;; label = @2 + local.get 6 + i32.load offset=24 + i32.const 66158 + i32.const 68356 + local.get 8 + select + i32.const 2 + i32.const 3 + local.get 8 + select + local.get 6 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + br_if 1 (;@1;) + local.get 0 + i32.load + local.tee 6 + i32.load offset=24 + local.get 1 + local.get 2 + local.get 6 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + br_if 1 (;@1;) + local.get 0 + i32.load + local.tee 1 + i32.load offset=24 + i32.const 68524 + i32.const 2 + local.get 1 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + br_if 1 (;@1;) + local.get 3 + local.get 0 + i32.load + local.get 4 + i32.load offset=12 + call_indirect (type 1) + local.set 7 + br 1 (;@1;) + end + local.get 8 + i32.eqz + if ;; label = @2 + local.get 6 + i32.load offset=24 + i32.const 68359 + i32.const 3 + local.get 6 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + br_if 1 (;@1;) + local.get 0 + i32.load + local.set 6 + end + local.get 5 + i32.const 1 + i32.store8 offset=23 + local.get 5 + i32.const 52 + i32.add + i32.const 66132 + i32.store + local.get 5 + local.get 6 + i64.load offset=24 align=4 + i64.store offset=8 + local.get 5 + local.get 5 + i32.const 23 + i32.add + i32.store offset=16 + local.get 6 + i64.load offset=8 align=4 + local.set 9 + local.get 6 + i64.load offset=16 align=4 + local.set 10 + local.get 5 + local.get 6 + i32.load8_u offset=32 + i32.store8 offset=56 + local.get 5 + local.get 10 + i64.store offset=40 + local.get 5 + local.get 9 + i64.store offset=32 + local.get 5 + local.get 6 + i64.load align=4 + i64.store offset=24 + local.get 5 + local.get 5 + i32.const 8 + i32.add + i32.store offset=48 + local.get 5 + i32.const 8 + i32.add + local.get 1 + local.get 2 + call 83 + br_if 0 (;@1;) + local.get 5 + i32.const 8 + i32.add + i32.const 68524 + i32.const 2 + call 83 + br_if 0 (;@1;) + local.get 3 + local.get 5 + i32.const 24 + i32.add + local.get 4 + i32.load offset=12 + call_indirect (type 1) + br_if 0 (;@1;) + local.get 5 + i32.load offset=48 + i32.const 66156 + i32.const 2 + local.get 5 + i32.load offset=52 + i32.load offset=12 + call_indirect (type 0) + local.set 7 + end + local.get 0 + i32.const 1 + i32.store8 offset=5 + local.get 0 + local.get 7 + i32.store8 offset=4 + local.get 5 + i32.const -64 + i32.sub + global.set 0 + local.get 0) + (func (;61;) (type 6) (param i32) (result i32) + (local i32 i32) + local.get 0 + i32.load8_u offset=4 + local.set 1 + local.get 0 + i32.load8_u offset=5 + if ;; label = @1 + local.get 1 + i32.const 255 + i32.and + local.set 2 + local.get 0 + block (result i32) ;; label = @2 + i32.const 1 + local.get 2 + br_if 0 (;@2;) + drop + local.get 0 + i32.load + local.tee 1 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + local.set 2 + local.get 1 + i32.load offset=24 + local.set 0 + local.get 1 + i32.load8_u + i32.const 4 + i32.and + i32.eqz + if ;; label = @3 + local.get 0 + i32.const 66189 + i32.const 2 + local.get 2 + call_indirect (type 0) + br 1 (;@2;) + end + local.get 0 + i32.const 66191 + i32.const 1 + local.get 2 + call_indirect (type 0) + end + local.tee 1 + i32.store8 offset=4 + end + local.get 1 + i32.const 255 + i32.and + i32.const 0 + i32.ne) + (func (;62;) (type 1) (param i32 i32) (result i32) + local.get 0 + i32.load + local.tee 0 + i32.load + local.get 1 + local.get 0 + i32.load offset=4 + i32.load offset=20 + call_indirect (type 1)) + (func (;63;) (type 1) (param i32 i32) (result i32) + local.get 0 + i32.load + local.get 1 + call 64) + (func (;64;) (type 1) (param i32 i32) (result i32) + (local i32) + global.get 0 + i32.const 16 + i32.sub + local.tee 2 + global.set 0 + block ;; label = @1 + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + block ;; label = @5 + block ;; label = @6 + block ;; label = @7 + block ;; label = @8 + block ;; label = @9 + block ;; label = @10 + block ;; label = @11 + block ;; label = @12 + block ;; label = @13 + block ;; label = @14 + block ;; label = @15 + block ;; label = @16 + block ;; label = @17 + block ;; label = @18 + block ;; label = @19 + local.get 0 + i32.load8_u + i32.const 1 + i32.sub + br_table 2 (;@17;) 3 (;@16;) 4 (;@15;) 5 (;@14;) 6 (;@13;) 7 (;@12;) 8 (;@11;) 9 (;@10;) 10 (;@9;) 11 (;@8;) 12 (;@7;) 13 (;@6;) 14 (;@5;) 15 (;@4;) 16 (;@3;) 17 (;@2;) 0 (;@19;) 1 (;@18;) + end + local.get 2 + local.get 1 + i32.load offset=24 + i32.const 65696 + i32.const 13 + local.get 1 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + i32.store8 offset=8 + br 17 (;@1;) + end + local.get 2 + local.get 1 + i32.load offset=24 + i32.const 65709 + i32.const 8 + local.get 1 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + i32.store8 offset=8 + br 16 (;@1;) + end + local.get 2 + local.get 1 + i32.load offset=24 + i32.const 65717 + i32.const 16 + local.get 1 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + i32.store8 offset=8 + br 15 (;@1;) + end + local.get 2 + local.get 1 + i32.load offset=24 + i32.const 65733 + i32.const 17 + local.get 1 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + i32.store8 offset=8 + br 14 (;@1;) + end + local.get 2 + local.get 1 + i32.load offset=24 + i32.const 65750 + i32.const 15 + local.get 1 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + i32.store8 offset=8 + br 13 (;@1;) + end + local.get 2 + local.get 1 + i32.load offset=24 + i32.const 65765 + i32.const 17 + local.get 1 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + i32.store8 offset=8 + br 12 (;@1;) + end + local.get 2 + local.get 1 + i32.load offset=24 + i32.const 65782 + i32.const 12 + local.get 1 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + i32.store8 offset=8 + br 11 (;@1;) + end + local.get 2 + local.get 1 + i32.load offset=24 + i32.const 65794 + i32.const 9 + local.get 1 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + i32.store8 offset=8 + br 10 (;@1;) + end + local.get 2 + local.get 1 + i32.load offset=24 + i32.const 65803 + i32.const 16 + local.get 1 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + i32.store8 offset=8 + br 9 (;@1;) + end + local.get 2 + local.get 1 + i32.load offset=24 + i32.const 65819 + i32.const 10 + local.get 1 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + i32.store8 offset=8 + br 8 (;@1;) + end + local.get 2 + local.get 1 + i32.load offset=24 + i32.const 65829 + i32.const 13 + local.get 1 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + i32.store8 offset=8 + br 7 (;@1;) + end + local.get 2 + local.get 1 + i32.load offset=24 + i32.const 65842 + i32.const 10 + local.get 1 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + i32.store8 offset=8 + br 6 (;@1;) + end + local.get 2 + local.get 1 + i32.load offset=24 + i32.const 65852 + i32.const 12 + local.get 1 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + i32.store8 offset=8 + br 5 (;@1;) + end + local.get 2 + local.get 1 + i32.load offset=24 + i32.const 65864 + i32.const 11 + local.get 1 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + i32.store8 offset=8 + br 4 (;@1;) + end + local.get 2 + local.get 1 + i32.load offset=24 + i32.const 65875 + i32.const 8 + local.get 1 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + i32.store8 offset=8 + br 3 (;@1;) + end + local.get 2 + local.get 1 + i32.load offset=24 + i32.const 65883 + i32.const 9 + local.get 1 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + i32.store8 offset=8 + br 2 (;@1;) + end + local.get 2 + local.get 1 + i32.load offset=24 + i32.const 65892 + i32.const 11 + local.get 1 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + i32.store8 offset=8 + br 1 (;@1;) + end + local.get 2 + local.get 1 + i32.load offset=24 + i32.const 65903 + i32.const 5 + local.get 1 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + i32.store8 offset=8 + end + local.get 2 + local.get 1 + i32.store + local.get 2 + i32.const 0 + i32.store8 offset=9 + local.get 2 + i32.const 0 + i32.store offset=4 + local.get 2 + call 58 + local.get 2 + i32.const 16 + i32.add + global.set 0) + (func (;65;) (type 1) (param i32 i32) (result i32) + local.get 0 + i32.load + drop + loop ;; label = @1 + br 0 (;@1;) + end + unreachable) + (func (;66;) (type 11) (param i32 i32 i32 i32 i32) + block ;; label = @1 + local.get 1 + local.get 2 + i32.le_u + if ;; label = @2 + local.get 4 + local.get 2 + i32.ge_u + if ;; label = @3 + local.get 2 + local.get 1 + i32.sub + local.tee 4 + local.get 2 + i32.gt_u + br_if 2 (;@1;) + local.get 0 + local.get 4 + i32.store offset=4 + local.get 0 + local.get 1 + local.get 3 + i32.add + i32.store + return + end + unreachable + end + unreachable + end + unreachable) + (func (;67;) (type 2) (param i32 i32) + (local i32 i32 i32 i32) + local.get 1 + i32.const 8 + i32.add + i32.load + local.set 2 + local.get 1 + i32.load offset=4 + local.set 4 + block ;; label = @1 + local.get 1 + i32.const 4 + i32.add + call 68 + local.tee 5 + i32.const 1114112 + i32.ne + if ;; label = @2 + local.get 2 + local.get 4 + i32.sub + local.tee 3 + local.get 1 + i32.load offset=4 + local.get 1 + i32.load offset=8 + i32.sub + i32.add + local.tee 2 + local.get 3 + i32.gt_u + br_if 1 (;@1;) + local.get 1 + i32.load + local.tee 3 + local.get 2 + i32.add + local.tee 2 + local.get 3 + i32.lt_u + br_if 1 (;@1;) + local.get 1 + local.get 2 + i32.store + end + local.get 0 + local.get 5 + i32.store offset=4 + local.get 0 + local.get 3 + i32.store + return + end + unreachable) + (func (;68;) (type 6) (param i32) (result i32) + (local i32 i32 i32 i32 i32) + local.get 0 + i32.load + local.tee 1 + local.get 0 + i32.load offset=4 + local.tee 3 + i32.eq + if ;; label = @1 + i32.const 1114112 + return + end + local.get 0 + local.get 1 + i32.const 1 + i32.add + local.tee 2 + i32.store + local.get 1 + i32.load8_s + local.tee 4 + i32.const -1 + i32.gt_s + if ;; label = @1 + local.get 4 + i32.const 255 + i32.and + return + end + block (result i32) ;; label = @1 + local.get 2 + local.get 3 + i32.eq + if ;; label = @2 + local.get 3 + local.set 2 + i32.const 0 + br 1 (;@1;) + end + local.get 0 + local.get 1 + i32.const 2 + i32.add + local.tee 2 + i32.store + local.get 1 + i32.load8_u offset=1 + i32.const 63 + i32.and + end + local.set 1 + local.get 4 + i32.const 31 + i32.and + local.set 5 + local.get 4 + i32.const 255 + i32.and + i32.const 223 + i32.le_u + if ;; label = @1 + local.get 1 + local.get 5 + i32.const 6 + i32.shl + i32.or + return + end + local.get 1 + i32.const 6 + i32.shl + block (result i32) ;; label = @1 + local.get 2 + local.get 3 + i32.eq + if ;; label = @2 + local.get 3 + local.set 1 + i32.const 0 + br 1 (;@1;) + end + local.get 0 + local.get 2 + i32.const 1 + i32.add + local.tee 1 + i32.store + local.get 2 + i32.load8_u + i32.const 63 + i32.and + end + i32.or + local.set 2 + local.get 4 + i32.const 255 + i32.and + i32.const 240 + i32.lt_u + if ;; label = @1 + local.get 2 + local.get 5 + i32.const 12 + i32.shl + i32.or + return + end + local.get 1 + local.get 3 + i32.eq + if (result i32) ;; label = @1 + i32.const 0 + else + local.get 0 + local.get 1 + i32.const 1 + i32.add + i32.store + local.get 1 + i32.load8_u + i32.const 63 + i32.and + end + local.get 5 + i32.const 18 + i32.shl + i32.const 1835008 + i32.and + local.get 2 + i32.const 6 + i32.shl + i32.or + i32.or) + (func (;69;) (type 5) (param i32 i32 i32 i32) + (local i32) + block ;; label = @1 + local.get 1 + i32.eqz + local.get 1 + local.get 3 + i32.eq + i32.or + i32.eqz + if ;; label = @2 + local.get 3 + local.get 1 + i32.le_u + br_if 1 (;@1;) + local.get 1 + local.get 2 + i32.add + i32.load8_s + i32.const -64 + i32.lt_s + br_if 1 (;@1;) + end + local.get 2 + local.set 4 + end + local.get 0 + local.get 1 + i32.store offset=4 + local.get 0 + local.get 4 + i32.store) + (func (;70;) (type 1) (param i32 i32) (result i32) + (local i32 i32 i32) + local.get 1 + local.get 0 + i32.sub + local.set 3 + block ;; label = @1 + loop ;; label = @2 + local.get 0 + local.get 1 + i32.ne + if ;; label = @3 + local.get 2 + local.get 0 + i32.load8_u + i32.const 192 + i32.and + i32.const 128 + i32.eq + i32.add + local.tee 4 + local.get 2 + i32.lt_u + br_if 2 (;@1;) + local.get 0 + i32.const 1 + i32.add + local.set 0 + local.get 4 + local.set 2 + br 1 (;@2;) + end + end + local.get 3 + local.get 2 + i32.sub + local.tee 0 + local.get 3 + i32.gt_u + br_if 0 (;@1;) + local.get 0 + return + end + unreachable) + (func (;71;) (type 3) (param i32 i32 i32) + (local i32 i32 i32) + local.get 2 + local.set 3 + block ;; label = @1 + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + i32.const 1 + local.get 1 + i32.load8_u offset=32 + local.tee 5 + local.get 5 + i32.const 3 + i32.eq + select + i32.const 255 + i32.and + i32.const 1 + i32.sub + br_table 0 (;@4;) 1 (;@3;) 0 (;@4;) 2 (;@2;) + end + i32.const 0 + local.set 3 + local.get 2 + local.set 4 + br 1 (;@2;) + end + local.get 2 + i32.const 1 + i32.add + local.tee 3 + local.get 2 + i32.lt_u + br_if 1 (;@1;) + local.get 3 + i32.const 1 + i32.shr_u + local.set 3 + local.get 2 + i32.const 1 + i32.shr_u + local.set 4 + end + local.get 4 + i32.const 1 + i32.add + local.set 2 + block (result i32) ;; label = @2 + loop ;; label = @3 + local.get 2 + i32.const -1 + i32.add + local.tee 2 + i32.eqz + if ;; label = @4 + local.get 1 + i32.load offset=4 + br 2 (;@2;) + end + local.get 1 + i32.load offset=24 + local.get 1 + i32.load offset=4 + local.get 1 + i32.load offset=28 + i32.load offset=16 + call_indirect (type 1) + i32.eqz + br_if 0 (;@3;) + end + i32.const 1114112 + end + local.set 1 + local.get 0 + local.get 3 + i32.store offset=4 + local.get 0 + local.get 1 + i32.store + return + end + unreachable) + (func (;72;) (type 7) (param i32 i32 i32 i32) (result i32) + local.get 1 + i32.const 1 + i32.add + local.set 1 + loop ;; label = @1 + local.get 1 + i32.const -1 + i32.add + local.tee 1 + i32.eqz + if ;; label = @2 + i32.const 0 + return + end + local.get 2 + local.get 0 + local.get 3 + i32.load offset=16 + call_indirect (type 1) + i32.eqz + br_if 0 (;@1;) + end + i32.const 1) + (func (;73;) (type 5) (param i32 i32 i32 i32) + (local i32) + block ;; label = @1 + block ;; label = @2 + local.get 1 + i32.eqz + local.get 1 + local.get 3 + i32.eq + i32.or + i32.eqz + if ;; label = @3 + local.get 3 + local.get 1 + i32.le_u + br_if 1 (;@2;) + local.get 1 + local.get 2 + i32.add + i32.load8_s + i32.const -64 + i32.lt_s + br_if 1 (;@2;) + end + local.get 3 + local.get 1 + i32.sub + local.tee 4 + local.get 3 + i32.le_u + br_if 1 (;@1;) + unreachable + end + local.get 2 + local.get 3 + local.get 1 + local.get 3 + call 74 + unreachable + end + local.get 0 + local.get 4 + i32.store offset=4 + local.get 0 + local.get 1 + local.get 2 + i32.add + i32.store) + (func (;74;) (type 5) (param i32 i32 i32 i32) + (local i32 i32) + global.get 0 + i32.const 32 + i32.sub + local.tee 4 + global.set 0 + block ;; label = @1 + local.get 1 + i32.const 257 + i32.lt_u + br_if 0 (;@1;) + i32.const 256 + local.set 5 + loop ;; label = @2 + block ;; label = @3 + local.get 5 + i32.eqz + local.get 1 + local.get 5 + i32.eq + i32.or + i32.eqz + if ;; label = @4 + local.get 5 + local.get 1 + i32.ge_u + br_if 1 (;@3;) + local.get 0 + local.get 5 + i32.add + i32.load8_s + i32.const -64 + i32.lt_s + br_if 1 (;@3;) + end + local.get 4 + i32.const 16 + i32.add + local.get 5 + local.get 0 + local.get 1 + call 75 + br 2 (;@1;) + end + local.get 5 + i32.const -1 + i32.add + local.set 5 + br 0 (;@2;) + end + unreachable + end + block ;; label = @1 + local.get 2 + local.get 1 + i32.gt_u + local.get 3 + local.get 1 + i32.gt_u + i32.or + local.get 2 + local.get 3 + i32.gt_u + i32.or + br_if 0 (;@1;) + block ;; label = @2 + local.get 2 + i32.eqz + local.get 1 + local.get 2 + i32.eq + i32.or + i32.eqz + if ;; label = @3 + local.get 2 + local.get 1 + i32.ge_u + br_if 1 (;@2;) + local.get 0 + local.get 2 + i32.add + i32.load8_s + i32.const -64 + i32.lt_s + br_if 1 (;@2;) + end + local.get 3 + local.set 2 + end + loop ;; label = @2 + block ;; label = @3 + local.get 2 + i32.eqz + local.get 1 + local.get 2 + i32.eq + i32.or + i32.eqz + if ;; label = @4 + local.get 2 + local.get 1 + i32.ge_u + br_if 1 (;@3;) + local.get 0 + local.get 2 + i32.add + i32.load8_s + i32.const -64 + i32.lt_s + br_if 1 (;@3;) + end + local.get 4 + i32.const 8 + i32.add + local.get 2 + local.get 0 + local.get 1 + call 73 + local.get 4 + local.get 4 + i32.load offset=8 + local.tee 0 + i32.store offset=24 + local.get 4 + local.get 0 + local.get 4 + i32.load offset=12 + i32.add + i32.store offset=28 + local.get 4 + i32.const 24 + i32.add + call 68 + drop + br 2 (;@1;) + end + local.get 2 + i32.const -1 + i32.add + local.set 2 + br 0 (;@2;) + end + unreachable + end + unreachable) + (func (;75;) (type 5) (param i32 i32 i32 i32) + (local i32 i32) + global.get 0 + i32.const 16 + i32.sub + local.tee 4 + global.set 0 + local.get 4 + i32.const 8 + i32.add + local.get 1 + local.get 2 + local.get 3 + call 69 + local.get 4 + i32.load offset=8 + local.tee 5 + i32.eqz + if ;; label = @1 + local.get 2 + local.get 3 + i32.const 0 + local.get 1 + call 74 + unreachable + end + local.get 4 + i32.load offset=12 + local.set 1 + local.get 0 + local.get 5 + i32.store + local.get 0 + local.get 1 + i32.store offset=4 + local.get 4 + i32.const 16 + i32.add + global.set 0) + (func (;76;) (type 3) (param i32 i32 i32) + local.get 2 + i32.const 129 + i32.ge_u + if ;; label = @1 + unreachable + end + local.get 0 + i32.const 128 + local.get 2 + i32.sub + i32.store offset=4 + local.get 0 + local.get 1 + local.get 2 + i32.add + i32.store) + (func (;77;) (type 8) (param i32 i32 i32 i32 i32) (result i32) + (local i32 i32 i32 i32 i32 i32 i32) + global.get 0 + i32.const 16 + i32.sub + local.tee 7 + global.set 0 + i32.const 1114112 + local.set 8 + local.get 4 + local.set 5 + block ;; label = @1 + local.get 0 + i32.load + local.tee 6 + i32.const 1 + i32.and + if ;; label = @2 + local.get 4 + i32.const 1 + i32.add + local.tee 5 + local.get 4 + i32.lt_u + br_if 1 (;@1;) + i32.const 43 + local.set 8 + end + block ;; label = @2 + local.get 6 + i32.const 4 + i32.and + i32.eqz + if ;; label = @3 + i32.const 0 + local.set 1 + local.get 5 + local.set 6 + br 1 (;@2;) + end + local.get 1 + local.get 1 + local.get 2 + i32.add + call 70 + local.get 5 + i32.add + local.tee 6 + local.get 5 + i32.lt_u + br_if 1 (;@1;) + end + i32.const 1 + local.set 5 + block ;; label = @2 + local.get 0 + i32.load offset=8 + i32.const 1 + i32.ne + if ;; label = @3 + local.get 0 + local.get 8 + local.get 1 + local.get 2 + call 78 + br_if 1 (;@2;) + local.get 0 + i32.load offset=24 + local.get 3 + local.get 4 + local.get 0 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + local.set 5 + br 1 (;@2;) + end + local.get 6 + local.get 0 + i32.const 12 + i32.add + i32.load + local.tee 9 + i32.ge_u + if ;; label = @3 + local.get 0 + local.get 8 + local.get 1 + local.get 2 + call 78 + br_if 1 (;@2;) + local.get 0 + i32.load offset=24 + local.get 3 + local.get 4 + local.get 0 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + local.set 5 + br 1 (;@2;) + end + local.get 0 + i32.load8_u + i32.const 8 + i32.and + if ;; label = @3 + local.get 0 + i32.load offset=4 + local.set 10 + local.get 0 + i32.const 48 + i32.store offset=4 + local.get 0 + i32.load8_u offset=32 + local.set 11 + local.get 0 + i32.const 1 + i32.store8 offset=32 + local.get 0 + local.get 8 + local.get 1 + local.get 2 + call 78 + br_if 1 (;@2;) + local.get 9 + local.get 6 + i32.sub + local.tee 1 + local.get 9 + i32.gt_u + br_if 2 (;@1;) + local.get 7 + i32.const 8 + i32.add + local.get 0 + local.get 1 + call 71 + local.get 7 + i32.load offset=8 + local.tee 1 + i32.const 1114112 + i32.eq + br_if 1 (;@2;) + local.get 7 + i32.load offset=12 + local.set 2 + local.get 0 + i32.load offset=24 + local.get 3 + local.get 4 + local.get 0 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + br_if 1 (;@2;) + local.get 1 + local.get 2 + local.get 0 + i32.load offset=24 + local.get 0 + i32.load offset=28 + call 72 + br_if 1 (;@2;) + local.get 0 + local.get 11 + i32.store8 offset=32 + local.get 0 + local.get 10 + i32.store offset=4 + i32.const 0 + local.set 5 + br 1 (;@2;) + end + local.get 9 + local.get 6 + i32.sub + local.tee 6 + local.get 9 + i32.gt_u + br_if 1 (;@1;) + local.get 7 + local.get 0 + local.get 6 + call 71 + local.get 7 + i32.load + local.tee 6 + i32.const 1114112 + i32.eq + br_if 0 (;@2;) + local.get 7 + i32.load offset=4 + local.set 9 + local.get 0 + local.get 8 + local.get 1 + local.get 2 + call 78 + br_if 0 (;@2;) + local.get 0 + i32.load offset=24 + local.get 3 + local.get 4 + local.get 0 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + br_if 0 (;@2;) + local.get 6 + local.get 9 + local.get 0 + i32.load offset=24 + local.get 0 + i32.load offset=28 + call 72 + local.set 5 + end + local.get 7 + i32.const 16 + i32.add + global.set 0 + local.get 5 + return + end + unreachable) + (func (;78;) (type 7) (param i32 i32 i32 i32) (result i32) + block (result i32) ;; label = @1 + local.get 1 + i32.const 1114112 + i32.ne + if ;; label = @2 + i32.const 1 + local.get 0 + i32.load offset=24 + local.get 1 + local.get 0 + i32.const 28 + i32.add + i32.load + i32.load offset=16 + call_indirect (type 1) + br_if 1 (;@1;) + drop + end + local.get 2 + i32.eqz + if ;; label = @2 + i32.const 0 + return + end + local.get 0 + i32.load offset=24 + local.get 2 + local.get 3 + local.get 0 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + end) + (func (;79;) (type 3) (param i32 i32 i32) + (local i32 i32) + block ;; label = @1 + block (result i32) ;; label = @2 + block ;; label = @3 + block ;; label = @4 + local.get 2 + i32.load + i32.const 1 + i32.sub + br_table 0 (;@4;) 3 (;@1;) 1 (;@3;) + end + local.get 1 + local.get 2 + i32.load offset=4 + i32.const 3 + i32.shl + i32.add + local.tee 1 + i32.load offset=4 + i32.const 5 + i32.ne + br_if 2 (;@1;) + local.get 1 + i32.load + i32.load + br 1 (;@2;) + end + local.get 2 + i32.load offset=4 + end + local.set 4 + i32.const 1 + local.set 3 + end + local.get 0 + local.get 4 + i32.store offset=4 + local.get 0 + local.get 3 + i32.store) + (func (;80;) (type 14) (param i64 i32) (result i32) + (local i32 i32 i32 i32 i64) + global.get 0 + i32.const 48 + i32.sub + local.tee 4 + global.set 0 + i32.const 39 + local.set 2 + block ;; label = @1 + block ;; label = @2 + loop ;; label = @3 + block ;; label = @4 + local.get 0 + i64.const 9999 + i64.le_u + if ;; label = @5 + local.get 0 + i32.wrap_i64 + local.tee 5 + i32.const 99 + i32.gt_s + br_if 1 (;@4;) + local.get 2 + local.set 3 + br 3 (;@2;) + end + local.get 0 + i64.const 10000 + i64.div_u + local.get 2 + i32.const -4 + i32.add + local.tee 3 + local.get 2 + i32.ge_s + br_if 3 (;@1;) + local.get 4 + i32.const 9 + i32.add + local.get 3 + i32.add + local.get 0 + i64.const 10000 + i64.rem_u + i32.wrap_i64 + local.tee 2 + i32.const 100 + i32.div_u + i32.const 1 + i32.shl + i32.const 65930 + i32.add + i32.load16_u align=1 + i32.store16 align=1 + local.get 3 + i32.const 2 + i32.add + local.tee 5 + local.get 3 + i32.lt_s + br_if 3 (;@1;) + local.get 4 + i32.const 9 + i32.add + local.get 5 + i32.add + local.get 2 + i32.const 100 + i32.rem_u + i32.const 1 + i32.shl + i32.const 65930 + i32.add + i32.load16_u align=1 + i32.store16 align=1 + local.get 3 + local.set 2 + local.set 0 + br 1 (;@3;) + end + end + local.get 2 + i32.const -2 + i32.add + local.tee 3 + local.get 2 + i32.ge_s + br_if 1 (;@1;) + local.get 4 + i32.const 9 + i32.add + local.get 3 + i32.add + local.get 0 + i32.wrap_i64 + i32.const 65535 + i32.and + local.tee 2 + i32.const 100 + i32.rem_u + i32.const 1 + i32.shl + i32.const 65930 + i32.add + i32.load16_u align=1 + i32.store16 align=1 + local.get 2 + i32.const 100 + i32.div_u + local.set 5 + end + block ;; label = @2 + local.get 5 + i32.const 10 + i32.ge_s + if ;; label = @3 + local.get 3 + i32.const -2 + i32.add + local.tee 2 + local.get 3 + i32.ge_s + br_if 2 (;@1;) + local.get 4 + i32.const 9 + i32.add + local.get 2 + i32.add + local.get 5 + i32.const 1 + i32.shl + i32.const 65930 + i32.add + i32.load16_u align=1 + i32.store16 align=1 + br 1 (;@2;) + end + local.get 3 + i32.const -1 + i32.add + local.tee 2 + local.get 3 + i32.ge_s + br_if 1 (;@1;) + local.get 4 + i32.const 9 + i32.add + local.get 2 + i32.add + local.get 5 + i32.const 48 + i32.add + i32.store8 + end + i32.const 39 + local.get 2 + i32.sub + local.tee 3 + i32.const 39 + i32.gt_u + br_if 0 (;@1;) + local.get 1 + i32.const 68928 + i32.const 0 + local.get 4 + i32.const 9 + i32.add + local.get 2 + i32.add + local.get 3 + call 77 + local.get 4 + i32.const 48 + i32.add + global.set 0 + return + end + unreachable) + (func (;81;) (type 1) (param i32 i32) (result i32) + (local i32 i32 i32 i32) + global.get 0 + i32.const -64 + i32.add + local.tee 2 + global.set 0 + local.get 0 + i32.load + local.set 4 + local.get 0 + i32.load offset=4 + local.set 0 + local.get 1 + i32.load offset=24 + i32.const 66188 + i32.const 1 + local.get 1 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + local.set 3 + i32.const 1 + local.set 5 + loop ;; label = @1 + local.get 0 + if ;; label = @2 + local.get 3 + i32.const 1 + i32.and + local.set 3 + block (result i32) ;; label = @3 + i32.const 1 + local.get 3 + br_if 0 (;@3;) + drop + local.get 1 + i32.load8_u + i32.const 4 + i32.and + i32.eqz + if ;; label = @4 + local.get 5 + i32.eqz + if ;; label = @5 + i32.const 1 + local.get 1 + i32.load offset=24 + i32.const 66158 + i32.const 2 + local.get 1 + i32.load offset=28 + i32.load offset=12 + call_indirect (type 0) + br_if 2 (;@3;) + drop + end + local.get 4 + local.get 1 + call 82 + br 1 (;@3;) + end + local.get 5 + if ;; label = @4 + i32.const 1 + local.get 1 + i32.load offset=24 + i32.const 66131 + i32.const 1 + local.get 1 + i32.load offset=28 + i32.load offset=12 + call_indirect (type 0) + br_if 1 (;@3;) + drop + end + local.get 2 + i32.const 1 + i32.store8 offset=23 + local.get 2 + i32.const 66132 + i32.store offset=52 + local.get 2 + local.get 1 + i64.load offset=24 align=4 + i64.store offset=8 + local.get 2 + local.get 1 + i32.load8_u offset=32 + i32.store8 offset=56 + local.get 2 + local.get 1 + i64.load align=4 + i64.store offset=24 + local.get 2 + local.get 1 + i64.load offset=16 align=4 + i64.store offset=40 + local.get 2 + local.get 1 + i64.load offset=8 align=4 + i64.store offset=32 + local.get 2 + local.get 2 + i32.const 23 + i32.add + i32.store offset=16 + local.get 2 + local.get 2 + i32.const 8 + i32.add + i32.store offset=48 + local.get 4 + local.get 2 + i32.const 24 + i32.add + call 82 + i32.eqz + if ;; label = @4 + local.get 2 + i32.load offset=48 + i32.const 66156 + i32.const 2 + local.get 2 + i32.load offset=52 + i32.load offset=12 + call_indirect (type 0) + br 1 (;@3;) + end + i32.const 1 + end + local.set 3 + local.get 4 + i32.const 1 + i32.add + local.set 4 + local.get 0 + i32.const -1 + i32.add + local.set 0 + i32.const 0 + local.set 5 + br 1 (;@1;) + end + end + i32.const 1 + local.set 0 + local.get 3 + i32.const 1 + i32.and + i32.eqz + if ;; label = @1 + local.get 1 + i32.load offset=24 + i32.const 66130 + i32.const 1 + local.get 1 + i32.load offset=28 + i32.load offset=12 + call_indirect (type 0) + local.set 0 + end + local.get 2 + i32.const -64 + i32.sub + global.set 0 + local.get 0) + (func (;82;) (type 1) (param i32 i32) (result i32) + (local i32 i32 i32) + global.get 0 + i32.const 144 + i32.sub + local.tee 2 + global.set 0 + block (result i32) ;; label = @1 + block ;; label = @2 + local.get 1 + i32.load + local.tee 3 + i32.const 16 + i32.and + i32.eqz + if ;; label = @3 + local.get 0 + i32.load8_u + local.set 0 + local.get 3 + i32.const 32 + i32.and + br_if 1 (;@2;) + local.get 0 + i64.extend_i32_u + i64.const 255 + i64.and + local.get 1 + call 80 + br 2 (;@1;) + end + local.get 0 + i32.load8_u + local.set 3 + i32.const 127 + local.set 0 + loop ;; label = @3 + local.get 2 + i32.const 16 + i32.add + local.get 0 + i32.add + local.get 3 + i32.const 15 + i32.and + local.tee 4 + i32.const 48 + i32.or + local.get 4 + i32.const 87 + i32.add + local.get 4 + i32.const 10 + i32.lt_u + select + i32.store8 + local.get 0 + i32.const -1 + i32.add + local.set 0 + local.get 3 + i32.const 4 + i32.shr_u + i32.const 15 + i32.and + local.tee 3 + br_if 0 (;@3;) + end + local.get 2 + i32.const 8 + i32.add + local.get 2 + i32.const 16 + i32.add + local.get 0 + i32.const 1 + i32.add + call 76 + local.get 1 + i32.const 65928 + i32.const 2 + local.get 2 + i32.load offset=8 + local.get 2 + i32.load offset=12 + call 77 + br 1 (;@1;) + end + i32.const 127 + local.set 3 + loop ;; label = @2 + local.get 2 + i32.const 16 + i32.add + local.get 3 + i32.add + local.get 0 + i32.const 15 + i32.and + local.tee 4 + i32.const 48 + i32.or + local.get 4 + i32.const 55 + i32.add + local.get 4 + i32.const 10 + i32.lt_u + select + i32.store8 + local.get 3 + i32.const -1 + i32.add + local.set 3 + local.get 0 + i32.const 4 + i32.shr_u + i32.const 15 + i32.and + local.tee 0 + br_if 0 (;@2;) + end + local.get 2 + local.get 2 + i32.const 16 + i32.add + local.get 3 + i32.const 1 + i32.add + call 76 + local.get 1 + i32.const 65928 + i32.const 2 + local.get 2 + i32.load + local.get 2 + i32.load offset=4 + call 77 + end + local.get 2 + i32.const 144 + i32.add + global.set 0) + (func (;83;) (type 0) (param i32 i32 i32) (result i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) + global.get 0 + i32.const -64 + i32.add + local.tee 4 + global.set 0 + local.get 4 + i32.const 56 + i32.add + local.set 13 + block ;; label = @1 + block ;; label = @2 + block ;; label = @3 + loop ;; label = @4 + local.get 2 + i32.eqz + br_if 3 (;@1;) + local.get 0 + i32.load offset=8 + i32.load8_u + if ;; label = @5 + local.get 0 + i32.load + i32.const 66184 + i32.const 4 + local.get 0 + i32.load offset=4 + i32.load offset=12 + call_indirect (type 0) + br_if 3 (;@2;) + end + local.get 4 + i32.const 10 + i32.store offset=56 + local.get 4 + i64.const 4294967306 + i64.store offset=48 + local.get 4 + local.get 2 + i32.store offset=44 + i32.const 0 + local.set 7 + local.get 4 + i32.const 0 + i32.store offset=40 + local.get 4 + local.get 2 + i32.store offset=36 + local.get 4 + local.get 1 + i32.store offset=32 + local.get 2 + local.tee 6 + local.set 3 + local.get 1 + local.set 5 + block ;; label = @5 + block ;; label = @6 + loop ;; label = @7 + block ;; label = @8 + local.get 6 + local.get 7 + i32.lt_u + local.get 3 + local.get 6 + i32.lt_u + i32.or + i32.eqz + if ;; label = @9 + local.get 4 + i32.load offset=52 + local.tee 3 + i32.const -1 + i32.add + local.tee 8 + local.get 3 + i32.gt_u + br_if 6 (;@3;) + local.get 5 + local.get 7 + i32.add + local.set 9 + local.get 4 + local.get 8 + i32.add + i32.const 56 + i32.add + i32.load8_u + local.set 11 + block ;; label = @10 + local.get 6 + local.get 7 + i32.sub + local.tee 10 + i32.const 7 + i32.le_u + if ;; label = @11 + i32.const 0 + local.set 3 + loop ;; label = @12 + local.get 3 + local.get 10 + i32.eq + br_if 2 (;@10;) + local.get 3 + local.get 9 + i32.add + i32.load8_u + local.get 11 + i32.eq + br_if 4 (;@8;) + local.get 3 + i32.const 1 + i32.add + local.tee 5 + local.get 3 + i32.lt_u + br_if 9 (;@3;) + local.get 5 + local.set 3 + br 0 (;@12;) + end + unreachable + end + block ;; label = @11 + local.get 9 + i32.const 3 + i32.add + i32.const -4 + i32.and + local.get 9 + i32.sub + local.tee 5 + i32.eqz + if ;; label = @12 + i32.const 0 + local.set 5 + br 1 (;@11;) + end + i32.const 0 + local.set 3 + local.get 4 + i32.const 24 + i32.add + i32.const 0 + local.get 10 + local.get 5 + local.get 5 + local.get 10 + i32.gt_u + select + local.tee 5 + local.get 9 + local.get 10 + call 66 + local.get 4 + i32.load offset=28 + local.set 12 + local.get 4 + i32.load offset=24 + local.set 14 + loop ;; label = @12 + local.get 3 + local.get 12 + i32.eq + br_if 1 (;@11;) + local.get 3 + local.get 14 + i32.add + i32.load8_u + local.get 11 + i32.eq + br_if 4 (;@8;) + local.get 3 + i32.const 1 + i32.add + local.tee 8 + local.get 3 + i32.lt_u + br_if 9 (;@3;) + local.get 8 + local.set 3 + br 0 (;@12;) + end + unreachable + end + local.get 10 + i32.const -8 + i32.add + local.tee 12 + local.get 10 + i32.gt_u + br_if 7 (;@3;) + local.get 11 + i32.const 16843009 + i32.mul + local.set 8 + local.get 6 + local.get 5 + local.get 7 + i32.add + i32.sub + local.set 3 + loop ;; label = @11 + block ;; label = @12 + local.get 5 + local.get 12 + i32.gt_u + br_if 0 (;@12;) + local.get 5 + i32.const 4 + i32.add + local.tee 6 + local.get 5 + i32.lt_u + br_if 9 (;@3;) + local.get 6 + local.get 9 + i32.add + i32.load + local.get 8 + i32.xor + local.tee 6 + i32.const -1 + i32.xor + local.get 6 + i32.const -16843009 + i32.add + i32.and + local.get 5 + local.get 9 + i32.add + i32.load + local.get 8 + i32.xor + local.tee 6 + i32.const -1 + i32.xor + local.get 6 + i32.const -16843009 + i32.add + i32.and + i32.or + i32.const -2139062144 + i32.and + br_if 0 (;@12;) + local.get 5 + i32.const 8 + i32.add + local.tee 6 + local.get 5 + i32.lt_u + br_if 9 (;@3;) + local.get 3 + i32.const -8 + i32.add + local.set 3 + local.get 6 + local.set 5 + br 1 (;@11;) + end + end + local.get 10 + local.get 5 + i32.lt_u + br_if 5 (;@5;) + local.get 5 + local.get 9 + i32.add + local.set 7 + i32.const 0 + local.set 6 + block ;; label = @11 + loop ;; label = @12 + local.get 3 + i32.eqz + br_if 1 (;@11;) + local.get 11 + local.get 7 + i32.load8_u + i32.ne + if ;; label = @13 + local.get 6 + i32.const 1 + i32.add + local.tee 8 + local.get 6 + i32.lt_u + br_if 10 (;@3;) + local.get 7 + i32.const 1 + i32.add + local.set 7 + local.get 3 + i32.const -1 + i32.add + local.set 3 + local.get 8 + local.set 6 + br 1 (;@12;) + end + end + local.get 5 + local.get 6 + i32.add + local.tee 3 + local.get 5 + i32.ge_u + br_if 3 (;@8;) + br 8 (;@3;) + end + local.get 4 + i32.load offset=44 + local.set 6 + end + local.get 4 + local.get 6 + i32.store offset=40 + end + local.get 0 + i32.load offset=8 + i32.const 0 + i32.store8 + local.get 2 + local.set 3 + br 2 (;@6;) + end + local.get 3 + i32.const 1 + i32.add + local.tee 5 + local.get 3 + i32.lt_u + br_if 4 (;@3;) + local.get 4 + i32.load offset=40 + local.tee 3 + local.get 5 + i32.add + local.tee 7 + local.get 3 + i32.lt_u + br_if 4 (;@3;) + local.get 4 + local.get 7 + i32.store offset=40 + block ;; label = @8 + block ;; label = @9 + local.get 7 + local.get 4 + i32.load offset=52 + local.tee 3 + i32.lt_u + br_if 0 (;@9;) + local.get 4 + i32.load offset=36 + local.get 7 + i32.lt_u + br_if 0 (;@9;) + local.get 4 + i32.load offset=32 + local.get 4 + i32.const 16 + i32.add + i32.const 0 + local.get 3 + local.get 13 + i32.const 4 + call 66 + local.get 7 + local.get 3 + i32.sub + local.tee 5 + i32.add + local.get 3 + local.get 4 + i32.load offset=16 + local.get 4 + i32.load offset=20 + call 55 + br_if 1 (;@8;) + local.get 4 + i32.load offset=40 + local.set 7 + end + local.get 4 + i32.load offset=44 + local.set 6 + local.get 4 + i32.load offset=36 + local.set 3 + local.get 4 + i32.load offset=32 + local.set 5 + br 1 (;@7;) + end + end + local.get 0 + i32.load offset=8 + i32.const 1 + i32.store8 + local.get 5 + i32.const 1 + i32.add + local.tee 3 + local.get 5 + i32.lt_u + br_if 3 (;@3;) + end + local.get 0 + i32.load + local.get 0 + i32.load offset=4 + local.set 6 + local.get 4 + i32.const 8 + i32.add + local.get 3 + local.get 1 + local.get 2 + call 75 + local.get 4 + i32.load offset=8 + local.get 4 + i32.load offset=12 + local.get 6 + i32.load offset=12 + call_indirect (type 0) + br_if 3 (;@2;) + local.get 4 + local.get 3 + local.get 1 + local.get 2 + call 73 + local.get 4 + i32.load offset=4 + local.set 2 + local.get 4 + i32.load + local.set 1 + br 1 (;@4;) + end + end + unreachable + end + unreachable + end + i32.const 1 + local.set 15 + end + local.get 4 + i32.const -64 + i32.sub + global.set 0 + local.get 15) + (func (;84;) (type 1) (param i32 i32) (result i32) + (local i32) + global.get 0 + i32.const 16 + i32.sub + local.tee 2 + global.set 0 + local.get 2 + i32.const 0 + i32.store offset=12 + local.get 0 + local.get 2 + i32.const 12 + i32.add + block (result i32) ;; label = @1 + block ;; label = @2 + block ;; label = @3 + local.get 1 + i32.const 128 + i32.ge_u + if ;; label = @4 + local.get 1 + i32.const 2048 + i32.lt_u + br_if 1 (;@3;) + local.get 1 + i32.const 65536 + i32.ge_u + br_if 2 (;@2;) + local.get 2 + local.get 1 + i32.const 63 + i32.and + i32.const 128 + i32.or + i32.store8 offset=14 + local.get 2 + local.get 1 + i32.const 12 + i32.shr_u + i32.const 224 + i32.or + i32.store8 offset=12 + local.get 2 + local.get 1 + i32.const 6 + i32.shr_u + i32.const 63 + i32.and + i32.const 128 + i32.or + i32.store8 offset=13 + i32.const 3 + br 3 (;@1;) + end + local.get 2 + local.get 1 + i32.store8 offset=12 + i32.const 1 + br 2 (;@1;) + end + local.get 2 + local.get 1 + i32.const 63 + i32.and + i32.const 128 + i32.or + i32.store8 offset=13 + local.get 2 + local.get 1 + i32.const 6 + i32.shr_u + i32.const 192 + i32.or + i32.store8 offset=12 + i32.const 2 + br 1 (;@1;) + end + local.get 2 + local.get 1 + i32.const 63 + i32.and + i32.const 128 + i32.or + i32.store8 offset=15 + local.get 2 + local.get 1 + i32.const 18 + i32.shr_u + i32.const 240 + i32.or + i32.store8 offset=12 + local.get 2 + local.get 1 + i32.const 6 + i32.shr_u + i32.const 63 + i32.and + i32.const 128 + i32.or + i32.store8 offset=14 + local.get 2 + local.get 1 + i32.const 12 + i32.shr_u + i32.const 63 + i32.and + i32.const 128 + i32.or + i32.store8 offset=13 + i32.const 4 + end + call 83 + local.get 2 + i32.const 16 + i32.add + global.set 0) + (func (;85;) (type 1) (param i32 i32) (result i32) + (local i32) + global.get 0 + i32.const 32 + i32.sub + local.tee 2 + global.set 0 + local.get 2 + local.get 0 + i32.store offset=4 + local.get 2 + i32.const 24 + i32.add + local.get 1 + i32.const 16 + i32.add + i64.load align=4 + i64.store + local.get 2 + i32.const 16 + i32.add + local.get 1 + i32.const 8 + i32.add + i64.load align=4 + i64.store + local.get 2 + local.get 1 + i64.load align=4 + i64.store offset=8 + local.get 2 + i32.const 4 + i32.add + i32.const 66160 + local.get 2 + i32.const 8 + i32.add + call 42 + local.get 2 + i32.const 32 + i32.add + global.set 0) + (func (;86;) (type 0) (param i32 i32 i32) (result i32) + local.get 0 + i32.load + local.get 1 + local.get 2 + call 83) + (func (;87;) (type 1) (param i32 i32) (result i32) + local.get 0 + i32.load + local.get 1 + call 84) + (func (;88;) (type 1) (param i32 i32) (result i32) + (local i32) + global.get 0 + i32.const 32 + i32.sub + local.tee 2 + global.set 0 + local.get 0 + i32.load + local.get 2 + i32.const 24 + i32.add + local.get 1 + i32.const 16 + i32.add + i64.load align=4 + i64.store + local.get 2 + i32.const 16 + i32.add + local.get 1 + i32.const 8 + i32.add + i64.load align=4 + i64.store + local.get 2 + local.get 1 + i64.load align=4 + i64.store offset=8 + local.get 2 + i32.const 8 + i32.add + call 85 + local.get 2 + i32.const 32 + i32.add + global.set 0) + (func (;89;) (type 13) (param i32 i32 i32 i32 i32 i32 i32) (result i32) + (local i32 i32 i32 i32 i32 i32) + global.get 0 + i32.const 16 + i32.sub + local.tee 7 + global.set 0 + local.get 1 + local.get 2 + i32.const 1 + i32.shl + i32.add + local.set 12 + local.get 0 + i32.const 65280 + i32.and + i32.const 8 + i32.shr_u + local.set 10 + i32.const 0 + local.set 2 + block ;; label = @1 + block ;; label = @2 + loop ;; label = @3 + block ;; label = @4 + local.get 1 + local.get 12 + i32.ne + if ;; label = @5 + local.get 2 + local.get 1 + i32.load8_u offset=1 + i32.add + local.tee 8 + local.get 2 + i32.lt_u + br_if 4 (;@1;) + local.get 1 + i32.const 2 + i32.add + local.set 11 + local.get 1 + i32.load8_u + local.tee 9 + local.get 10 + i32.eq + br_if 1 (;@4;) + local.get 11 + local.set 1 + local.get 8 + local.set 2 + local.get 9 + local.get 10 + i32.le_u + br_if 2 (;@3;) + end + local.get 5 + local.get 6 + i32.add + local.set 6 + local.get 0 + i32.const 65535 + i32.and + local.set 2 + i32.const 1 + local.set 0 + loop ;; label = @5 + local.get 5 + local.get 6 + i32.eq + br_if 3 (;@2;) + local.get 5 + i32.const 1 + i32.add + local.set 3 + local.get 5 + i32.load8_u + local.tee 1 + i32.const 24 + i32.shl + i32.const 24 + i32.shr_s + local.tee 4 + i32.const 0 + i32.lt_s + if ;; label = @6 + local.get 3 + local.get 6 + i32.eq + br_if 5 (;@1;) + local.get 5 + i32.const 2 + i32.add + local.set 3 + local.get 5 + i32.load8_u offset=1 + local.get 4 + i32.const 127 + i32.and + i32.const 8 + i32.shl + i32.or + local.set 1 + end + local.get 2 + local.get 1 + i32.sub + local.tee 4 + local.get 2 + i32.lt_s + local.get 1 + i32.const 0 + i32.gt_s + i32.xor + br_if 4 (;@1;) + local.get 4 + i32.const 0 + i32.lt_s + br_if 3 (;@2;) + local.get 0 + i32.const 1 + i32.xor + local.set 0 + local.get 3 + local.set 5 + local.get 4 + local.set 2 + br 0 (;@5;) + end + unreachable + end + local.get 7 + i32.const 8 + i32.add + local.get 2 + local.get 8 + local.get 3 + local.get 4 + call 66 + local.get 7 + i32.load offset=8 + local.set 2 + local.get 7 + i32.load offset=12 + local.set 1 + loop ;; label = @4 + local.get 1 + i32.eqz + if ;; label = @5 + local.get 11 + local.set 1 + local.get 8 + local.set 2 + br 2 (;@3;) + end + local.get 1 + i32.const -1 + i32.add + local.set 1 + local.get 2 + i32.load8_u + local.get 2 + i32.const 1 + i32.add + local.set 2 + local.get 0 + i32.const 255 + i32.and + i32.ne + br_if 0 (;@4;) + end + end + i32.const 0 + local.set 0 + end + local.get 7 + i32.const 16 + i32.add + global.set 0 + local.get 0 + i32.const 1 + i32.and + return + end + unreachable) + (func (;90;) (type 1) (param i32 i32) (result i32) + local.get 0 + i64.load32_u + local.get 1 + call 80) + (func (;91;) (type 1) (param i32 i32) (result i32) + (local i32 i32) + global.get 0 + i32.const 16 + i32.sub + local.tee 2 + global.set 0 + local.get 0 + call 143 + local.set 0 + local.get 2 + i32.const 68968 + i32.load + i32.store offset=12 + block ;; label = @1 + local.get 0 + local.get 1 + local.get 2 + i32.const 12 + i32.add + call 145 + local.tee 3 + br_if 0 (;@1;) + local.get 2 + local.get 0 + local.get 1 + call 144 + i32.const 0 + local.set 3 + local.get 2 + i32.load + br_if 0 (;@1;) + local.get 2 + i32.load offset=4 + local.tee 3 + local.get 2 + i32.load offset=12 + i32.store offset=8 + local.get 2 + local.get 3 + i32.store offset=12 + local.get 0 + local.get 1 + local.get 2 + i32.const 12 + i32.add + call 145 + local.set 3 + end + i32.const 68968 + local.get 2 + i32.load offset=12 + i32.store + local.get 2 + i32.const 16 + i32.add + global.set 0 + local.get 3) + (func (;92;) (type 2) (param i32 i32) + (local i32 i32 i32) + local.get 0 + if ;; label = @1 + local.get 1 + call 143 + drop + i32.const 68968 + i32.load + local.set 3 + local.get 0 + i32.const -8 + i32.add + local.tee 1 + local.get 1 + i32.load + local.tee 4 + i32.const -2 + i32.and + i32.store + block ;; label = @2 + block ;; label = @3 + local.get 4 + i32.const -4 + i32.and + local.tee 2 + local.get 0 + i32.sub + local.get 2 + i32.le_u + if ;; label = @4 + local.get 0 + i32.const 0 + i32.store + block ;; label = @5 + local.get 0 + i32.const -4 + i32.add + i32.load + i32.const -4 + i32.and + local.tee 2 + if ;; label = @6 + local.get 2 + i32.load8_u + i32.const 1 + i32.and + i32.eqz + br_if 1 (;@5;) + end + local.get 4 + i32.const -4 + i32.and + local.tee 2 + i32.eqz + br_if 2 (;@3;) + i32.const 0 + local.get 2 + local.get 4 + i32.const 2 + i32.and + select + local.tee 2 + i32.eqz + br_if 2 (;@3;) + local.get 2 + i32.load8_u + i32.const 1 + i32.and + br_if 2 (;@3;) + local.get 0 + local.get 2 + i32.load offset=8 + i32.const -4 + i32.and + i32.store + local.get 2 + local.get 1 + i32.const 1 + i32.or + i32.store offset=8 + br 3 (;@2;) + end + local.get 1 + call 146 + local.get 2 + i32.load + local.set 0 + local.get 1 + i32.load8_u + i32.const 2 + i32.and + if ;; label = @5 + local.get 2 + local.get 0 + i32.const 2 + i32.or + local.tee 0 + i32.store + end + local.get 0 + i32.const -4 + i32.and + local.tee 0 + local.get 2 + i32.sub + i32.const -8 + i32.add + local.get 0 + i32.le_u + br_if 2 (;@2;) + end + unreachable + end + local.get 0 + local.get 3 + i32.store + local.get 1 + local.set 3 + end + i32.const 68968 + local.get 3 + i32.store + end) + (func (;93;) (type 1) (param i32 i32) (result i32) + global.get 0 + i32.const 16 + i32.sub + local.tee 0 + global.set 0 + local.get 0 + local.get 1 + i32.load offset=24 + i32.const 68960 + i32.const 5 + local.get 1 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + i32.store8 offset=8 + local.get 0 + local.get 1 + i32.store + local.get 0 + i32.const 0 + i32.store8 offset=9 + local.get 0 + i32.const 0 + i32.store offset=4 + local.get 0 + call 58 + local.get 0 + i32.const 16 + i32.add + global.set 0) + (func (;94;) (type 1) (param i32 i32) (result i32) + (local i32) + global.get 0 + i32.const 32 + i32.sub + local.tee 2 + global.set 0 + block (result i32) ;; label = @1 + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + block ;; label = @5 + block ;; label = @6 + block ;; label = @7 + block ;; label = @8 + block ;; label = @9 + block ;; label = @10 + block ;; label = @11 + local.get 0 + i32.load8_u + i32.const 1 + i32.sub + br_table 2 (;@9;) 3 (;@8;) 4 (;@7;) 5 (;@6;) 6 (;@5;) 7 (;@4;) 8 (;@3;) 9 (;@2;) 0 (;@11;) 1 (;@10;) + end + local.get 2 + local.get 1 + i32.load offset=24 + i32.const 68367 + i32.const 12 + local.get 1 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + i32.store8 offset=24 + local.get 2 + local.get 1 + i32.store offset=16 + local.get 2 + i32.const 0 + i32.store8 offset=25 + local.get 2 + i32.const 0 + i32.store offset=20 + local.get 2 + i32.const 16 + i32.add + call 58 + br 9 (;@1;) + end + local.get 2 + local.get 1 + i32.load offset=24 + i32.const 68379 + i32.const 6 + local.get 1 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + i32.store8 offset=24 + local.get 2 + local.get 1 + i32.store offset=16 + local.get 2 + i32.const 0 + i32.store8 offset=25 + local.get 2 + i32.const 0 + i32.store offset=20 + local.get 2 + local.get 0 + i32.const 1 + i32.add + i32.store offset=12 + local.get 2 + i32.const 16 + i32.add + local.get 2 + i32.const 12 + i32.add + i32.const 68388 + call 57 + call 58 + br 8 (;@1;) + end + local.get 2 + local.get 1 + i32.load offset=24 + i32.const 68404 + i32.const 13 + local.get 1 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + i32.store8 offset=24 + local.get 2 + local.get 1 + i32.store offset=16 + local.get 2 + i32.const 0 + i32.store8 offset=25 + local.get 2 + i32.const 0 + i32.store offset=20 + local.get 2 + i32.const 16 + i32.add + call 58 + br 7 (;@1;) + end + local.get 2 + local.get 1 + i32.load offset=24 + i32.const 68417 + i32.const 14 + local.get 1 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + i32.store8 offset=24 + local.get 2 + local.get 1 + i32.store offset=16 + local.get 2 + i32.const 0 + i32.store8 offset=25 + local.get 2 + i32.const 0 + i32.store offset=20 + local.get 2 + i32.const 16 + i32.add + call 58 + br 6 (;@1;) + end + local.get 2 + local.get 1 + i32.load offset=24 + i32.const 68431 + i32.const 11 + local.get 1 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + i32.store8 offset=24 + local.get 2 + local.get 1 + i32.store offset=16 + local.get 2 + i32.const 0 + i32.store8 offset=25 + local.get 2 + i32.const 0 + i32.store offset=20 + local.get 2 + i32.const 16 + i32.add + call 58 + br 5 (;@1;) + end + local.get 2 + local.get 1 + i32.load offset=24 + i32.const 68442 + i32.const 25 + local.get 1 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + i32.store8 offset=24 + local.get 2 + local.get 1 + i32.store offset=16 + local.get 2 + i32.const 0 + i32.store8 offset=25 + local.get 2 + i32.const 0 + i32.store offset=20 + local.get 2 + i32.const 16 + i32.add + call 58 + br 4 (;@1;) + end + local.get 2 + local.get 1 + i32.load offset=24 + i32.const 68467 + i32.const 14 + local.get 1 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + i32.store8 offset=24 + local.get 2 + local.get 1 + i32.store offset=16 + local.get 2 + i32.const 0 + i32.store8 offset=25 + local.get 2 + i32.const 0 + i32.store offset=20 + local.get 2 + i32.const 16 + i32.add + call 58 + br 3 (;@1;) + end + local.get 2 + local.get 1 + i32.load offset=24 + i32.const 68481 + i32.const 20 + local.get 1 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + i32.store8 offset=24 + local.get 2 + local.get 1 + i32.store offset=16 + local.get 2 + i32.const 0 + i32.store8 offset=25 + local.get 2 + i32.const 0 + i32.store offset=20 + local.get 2 + i32.const 16 + i32.add + call 58 + br 2 (;@1;) + end + local.get 2 + local.get 1 + i32.load offset=24 + i32.const 68501 + i32.const 12 + local.get 1 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + i32.store8 offset=24 + local.get 2 + local.get 1 + i32.store offset=16 + local.get 2 + i32.const 0 + i32.store8 offset=25 + local.get 2 + i32.const 0 + i32.store offset=20 + local.get 2 + i32.const 16 + i32.add + call 58 + br 1 (;@1;) + end + local.get 2 + local.get 1 + i32.load offset=24 + i32.const 68513 + i32.const 11 + local.get 1 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + i32.store8 offset=24 + local.get 2 + local.get 1 + i32.store offset=16 + local.get 2 + i32.const 0 + i32.store8 offset=25 + local.get 2 + i32.const 0 + i32.store offset=20 + local.get 2 + i32.const 16 + i32.add + call 58 + end + local.get 2 + i32.const 32 + i32.add + global.set 0) + (func (;95;) (type 2) (param i32 i32) + (local i32) + global.get 0 + i32.const 16 + i32.sub + local.tee 2 + global.set 0 + local.get 2 + local.get 0 + i32.store offset=12 + local.get 1 + local.get 2 + i32.const 12 + i32.add + i32.const 4 + call 11 + local.get 2 + i32.const 16 + i32.add + global.set 0) + (func (;96;) (type 2) (param i32 i32) + (local i32 i64) + global.get 0 + i32.const 16 + i32.sub + local.tee 2 + global.set 0 + local.get 2 + i32.const 8 + i32.add + local.get 1 + i32.const 1 + call 52 + local.get 2 + i64.load offset=8 + local.set 3 + local.get 0 + local.get 1 + i32.store offset=8 + local.get 0 + local.get 3 + i64.store align=4 + local.get 2 + i32.const 16 + i32.add + global.set 0) + (func (;97;) (type 1) (param i32 i32) (result i32) + local.get 0 + i32.load + local.get 1 + call 94) + (func (;98;) (type 1) (param i32 i32) (result i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i64) + global.get 0 + i32.const 32 + i32.sub + local.tee 7 + global.set 0 + local.get 0 + i32.load + local.tee 0 + i32.load offset=8 + local.set 10 + local.get 0 + i32.load + local.set 11 + block ;; label = @1 + block ;; label = @2 + block (result i32) ;; label = @3 + i32.const 1 + local.get 1 + i32.load offset=24 + i32.const 34 + local.get 1 + i32.const 28 + i32.add + i32.load + i32.load offset=16 + call_indirect (type 1) + br_if 0 (;@3;) + drop + local.get 7 + local.get 11 + i32.store offset=20 + local.get 7 + i32.const 24 + i32.add + local.get 10 + local.get 11 + i32.add + i32.store + local.get 7 + i32.const 0 + i32.store offset=16 + loop ;; label = @4 + local.get 7 + i32.const 8 + i32.add + local.get 7 + i32.const 16 + i32.add + call 67 + i32.const 116 + local.set 4 + local.get 7 + i32.load offset=8 + local.set 9 + i32.const 2 + local.set 0 + block ;; label = @5 + block ;; label = @6 + block ;; label = @7 + block ;; label = @8 + block ;; label = @9 + block ;; label = @10 + block ;; label = @11 + local.get 7 + i32.load offset=12 + local.tee 2 + i32.const -9 + i32.add + br_table 6 (;@5;) 2 (;@9;) 4 (;@7;) 4 (;@7;) 1 (;@10;) 0 (;@11;) + end + local.get 2 + i32.const 34 + i32.eq + local.get 2 + i32.const 39 + i32.eq + i32.or + local.get 2 + i32.const 92 + i32.eq + i32.or + br_if 2 (;@8;) + local.get 2 + i32.const 1114112 + i32.ne + br_if 3 (;@7;) + local.get 7 + local.get 8 + local.get 11 + local.get 10 + call 73 + i32.const 1 + local.get 1 + i32.load offset=24 + local.get 7 + i32.load + local.get 7 + i32.load offset=4 + local.get 1 + i32.load offset=28 + i32.load offset=12 + call_indirect (type 0) + br_if 7 (;@3;) + drop + local.get 1 + i32.load offset=24 + i32.const 34 + local.get 1 + i32.load offset=28 + i32.load offset=16 + call_indirect (type 1) + br 7 (;@3;) + end + i32.const 114 + local.set 4 + br 3 (;@6;) + end + i32.const 110 + local.set 4 + br 2 (;@6;) + end + local.get 2 + local.set 4 + br 2 (;@5;) + end + local.get 2 + i32.const 11 + i32.shl + local.set 6 + i32.const 31 + local.set 0 + i32.const 0 + local.set 3 + block ;; label = @7 + loop ;; label = @8 + block ;; label = @9 + local.get 0 + i32.const 1 + i32.le_u + if ;; label = @10 + local.get 3 + i32.const 2 + i32.shl + i32.const 66192 + i32.add + i32.load + i32.const 11 + i32.shl + local.tee 0 + local.get 6 + i32.eq + br_if 1 (;@9;) + local.get 3 + local.get 0 + local.get 6 + i32.lt_u + i32.add + local.tee 6 + local.get 3 + i32.ge_u + br_if 3 (;@7;) + br 9 (;@1;) + end + local.get 3 + local.get 0 + i32.const 1 + i32.shr_u + local.tee 4 + i32.add + local.tee 5 + local.get 3 + i32.lt_u + br_if 8 (;@1;) + local.get 0 + local.get 4 + i32.sub + local.tee 4 + local.get 0 + i32.gt_u + br_if 8 (;@1;) + local.get 3 + local.get 5 + local.get 5 + i32.const 2 + i32.shl + i32.const 66192 + i32.add + i32.load + i32.const 11 + i32.shl + local.get 6 + i32.gt_u + select + local.set 3 + local.get 4 + local.set 0 + br 1 (;@8;) + end + end + local.get 3 + i32.const 1 + i32.add + local.tee 6 + local.get 3 + i32.lt_u + br_if 6 (;@1;) + end + local.get 6 + i32.const 30 + i32.gt_u + br_if 5 (;@1;) + local.get 6 + i32.const 2 + i32.shl + local.tee 4 + i32.const 66192 + i32.add + i32.load + local.tee 5 + i32.const 21 + i32.shr_u + local.set 0 + block ;; label = @7 + local.get 6 + i32.const 30 + i32.eq + if ;; label = @8 + i32.const 689 + local.get 0 + i32.sub + local.tee 12 + i32.const 689 + i32.gt_u + br_if 7 (;@1;) + br 1 (;@7;) + end + local.get 4 + i32.const 66196 + i32.add + i32.load + i32.const 21 + i32.shr_u + local.tee 4 + local.get 0 + i32.sub + local.tee 12 + local.get 4 + i32.gt_u + br_if 6 (;@1;) + end + i32.const 0 + local.set 3 + local.get 2 + local.get 6 + i32.const -1 + i32.add + local.tee 4 + local.get 6 + i32.le_u + if (result i32) ;; label = @7 + local.get 4 + i32.const 31 + i32.ge_u + br_if 6 (;@1;) + local.get 4 + i32.const 2 + i32.shl + i32.const 66192 + i32.add + i32.load + i32.const 2097151 + i32.and + else + i32.const 0 + end + i32.sub + local.tee 13 + local.get 2 + i32.gt_u + br_if 5 (;@1;) + local.get 12 + i32.const -1 + i32.add + local.tee 3 + local.get 12 + i32.gt_u + br_if 5 (;@1;) + i32.const 0 + local.set 6 + i32.const 0 + i32.const 689 + local.get 0 + i32.sub + local.get 5 + i32.const 1447034879 + i32.gt_u + select + local.set 4 + local.get 0 + local.get 12 + i32.add + i32.const -1 + i32.add + local.set 12 + block (result i64) ;; label = @7 + loop ;; label = @8 + block ;; label = @9 + block ;; label = @10 + local.get 3 + if (result i32) ;; label = @11 + local.get 4 + i32.eqz + br_if 10 (;@1;) + local.get 6 + local.get 0 + i32.const 66316 + i32.add + i32.load8_u + i32.add + local.tee 5 + local.get 6 + i32.lt_u + br_if 10 (;@1;) + local.get 5 + local.get 13 + i32.le_u + br_if 1 (;@10;) + local.get 0 + else + local.get 12 + end + i32.const 1 + i32.and + i32.eqz + br_if 1 (;@9;) + local.get 2 + i32.const 1 + i32.or + i32.clz + i32.const 2 + i32.shr_u + i32.const 7 + i32.xor + i64.extend_i32_u + i64.const 21474836480 + i64.or + br 3 (;@7;) + end + local.get 3 + i32.const -1 + i32.add + local.set 3 + local.get 4 + i32.const -1 + i32.add + local.set 4 + local.get 0 + i32.const 1 + i32.add + local.set 0 + local.get 5 + local.set 6 + br 1 (;@8;) + end + end + block ;; label = @8 + local.get 2 + i32.const 65536 + i32.ge_u + if ;; label = @9 + local.get 2 + i32.const 131072 + i32.ge_u + if ;; label = @10 + local.get 2 + i32.const -201547 + i32.add + i32.const 716213 + i32.lt_u + local.get 2 + i32.const 917999 + i32.gt_u + i32.or + local.get 2 + i32.const -195102 + i32.add + i32.const 1506 + i32.lt_u + local.get 2 + i32.const -191457 + i32.add + i32.const 3103 + i32.lt_u + i32.or + i32.or + local.get 2 + i32.const 2097150 + i32.and + i32.const 178206 + i32.eq + local.get 2 + i32.const -183970 + i32.add + i32.const 14 + i32.lt_u + i32.or + local.get 2 + i32.const -173790 + i32.add + i32.const 34 + i32.lt_u + i32.or + i32.or + br_if 2 (;@8;) + local.get 2 + i32.const -177973 + i32.add + i32.const 10 + i32.gt_u + br_if 6 (;@4;) + br 2 (;@8;) + end + local.get 2 + i32.const 67686 + i32.const 38 + i32.const 67762 + i32.const 175 + i32.const 67937 + i32.const 419 + call 89 + br_if 5 (;@4;) + br 1 (;@8;) + end + local.get 2 + i32.const 67005 + i32.const 41 + i32.const 67087 + i32.const 290 + i32.const 67377 + i32.const 309 + call 89 + br_if 4 (;@4;) + end + local.get 2 + i32.const 1 + i32.or + i32.clz + i32.const 2 + i32.shr_u + i32.const 7 + i32.xor + i64.extend_i32_u + i64.const 21474836480 + i64.or + end + local.tee 14 + i32.wrap_i64 + local.tee 0 + i32.const 5 + i32.add + local.tee 5 + local.get 0 + i32.lt_u + br_if 5 (;@1;) + i32.const 3 + local.set 0 + local.get 2 + local.set 4 + local.get 5 + i32.const 1 + i32.eq + br_if 2 (;@4;) + br 1 (;@5;) + end + end + local.get 8 + local.get 9 + i32.gt_u + br_if 2 (;@2;) + local.get 8 + i32.eqz + local.get 8 + local.get 10 + i32.eq + i32.or + i32.eqz + if ;; label = @5 + local.get 10 + local.get 8 + i32.le_u + br_if 3 (;@2;) + local.get 8 + local.get 11 + i32.add + i32.load8_s + i32.const -65 + i32.le_s + br_if 3 (;@2;) + end + local.get 9 + i32.eqz + local.get 9 + local.get 10 + i32.eq + i32.or + i32.eqz + if ;; label = @5 + local.get 10 + local.get 9 + i32.le_u + br_if 3 (;@2;) + local.get 9 + local.get 11 + i32.add + i32.load8_s + i32.const -65 + i32.le_s + br_if 3 (;@2;) + end + local.get 9 + local.get 8 + i32.sub + local.tee 5 + local.get 9 + i32.gt_u + br_if 3 (;@1;) + local.get 1 + i32.load offset=24 + local.get 8 + local.get 11 + i32.add + local.get 5 + local.get 1 + i32.load offset=28 + i32.load offset=12 + call_indirect (type 0) + i32.eqz + if ;; label = @5 + loop ;; label = @6 + local.get 0 + local.set 5 + i32.const 92 + local.set 3 + i32.const 1 + local.set 0 + block ;; label = @7 + block (result i64) ;; label = @8 + block ;; label = @9 + block ;; label = @10 + block ;; label = @11 + block ;; label = @12 + local.get 5 + i32.const 1 + i32.sub + br_table 1 (;@11;) 5 (;@7;) 0 (;@12;) 2 (;@10;) + end + block ;; label = @12 + block ;; label = @13 + block ;; label = @14 + block ;; label = @15 + local.get 14 + i64.const 32 + i64.shr_u + i32.wrap_i64 + i32.const 255 + i32.and + i32.const 1 + i32.sub + br_table 3 (;@12;) 2 (;@13;) 1 (;@14;) 0 (;@15;) 6 (;@9;) 5 (;@10;) + end + i32.const 117 + local.set 3 + local.get 14 + i64.const -1095216660481 + i64.and + i64.const 12884901888 + i64.or + br 6 (;@8;) + end + i32.const 123 + local.set 3 + local.get 14 + i64.const -1095216660481 + i64.and + i64.const 8589934592 + i64.or + br 5 (;@8;) + end + local.get 14 + i32.wrap_i64 + local.tee 5 + i32.const 1073741823 + i32.and + local.get 5 + i32.ne + br_if 11 (;@1;) + local.get 5 + i32.const 2 + i32.shl + local.tee 0 + i32.const 31 + i32.gt_u + br_if 11 (;@1;) + local.get 4 + local.get 0 + i32.const 28 + i32.and + i32.shr_u + i32.const 15 + i32.and + local.tee 0 + i32.const 48 + i32.or + local.get 0 + i32.const 87 + i32.add + local.get 0 + i32.const 10 + i32.lt_u + select + local.set 3 + local.get 14 + i64.const -1095216660481 + i64.and + i64.const 4294967296 + i64.or + local.get 5 + i32.eqz + br_if 4 (;@8;) + drop + local.get 14 + i64.const -4294967296 + i64.and + local.get 14 + i64.const -1 + i64.add + i64.const 4294967295 + i64.and + i64.or + br 4 (;@8;) + end + i32.const 125 + local.set 3 + local.get 14 + i64.const -1095216660481 + i64.and + br 3 (;@8;) + end + i32.const 0 + local.set 0 + local.get 4 + local.set 3 + br 3 (;@7;) + end + block (result i32) ;; label = @10 + i32.const 1 + local.get 2 + i32.const 128 + i32.lt_u + br_if 0 (;@10;) + drop + i32.const 2 + local.get 2 + i32.const 2048 + i32.lt_u + br_if 0 (;@10;) + drop + i32.const 3 + i32.const 4 + local.get 2 + i32.const 65536 + i32.lt_u + select + end + local.get 9 + i32.add + local.tee 8 + local.get 9 + i32.ge_u + br_if 5 (;@4;) + br 8 (;@1;) + end + local.get 14 + i64.const -1095216660481 + i64.and + i64.const 17179869184 + i64.or + end + local.set 14 + i32.const 3 + local.set 0 + end + local.get 1 + i32.load offset=24 + local.get 3 + local.get 1 + i32.load offset=28 + i32.load offset=16 + call_indirect (type 1) + i32.eqz + br_if 0 (;@6;) + end + end + end + i32.const 1 + end + local.get 7 + i32.const 32 + i32.add + global.set 0 + return + end + local.get 11 + local.get 10 + local.get 8 + local.get 9 + call 74 + unreachable + end + unreachable) + (func (;99;) (type 1) (param i32 i32) (result i32) + (local i32) + global.get 0 + i32.const 16 + i32.sub + local.tee 2 + global.set 0 + block (result i32) ;; label = @1 + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + local.get 0 + i32.load + local.tee 0 + i32.load8_u + i32.const 1 + i32.sub + br_table 2 (;@2;) 0 (;@4;) 1 (;@3;) + end + local.get 2 + local.get 1 + i32.load offset=24 + i32.const 68526 + i32.const 8 + local.get 1 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + i32.store8 offset=8 + local.get 2 + local.get 1 + i32.store + local.get 2 + i32.const 0 + i32.store8 offset=9 + local.get 2 + i32.const 0 + i32.store offset=4 + local.get 2 + local.get 0 + i32.const 1 + i32.add + i32.store offset=12 + local.get 2 + local.get 2 + i32.const 12 + i32.add + i32.const 68536 + call 57 + call 58 + br 2 (;@1;) + end + local.get 2 + local.get 1 + i32.load offset=24 + i32.const 68552 + i32.const 9 + local.get 1 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + i32.store8 offset=8 + local.get 2 + local.get 1 + i32.store + local.get 2 + i32.const 0 + i32.store8 offset=9 + local.get 2 + i32.const 0 + i32.store offset=4 + local.get 2 + local.get 0 + i32.const 4 + i32.add + i32.store offset=12 + local.get 2 + local.get 2 + i32.const 12 + i32.add + i32.const 68564 + call 57 + call 58 + br 1 (;@1;) + end + local.get 2 + local.get 1 + i32.load offset=24 + i32.const 68580 + i32.const 6 + local.get 1 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + i32.store8 offset=8 + local.get 2 + local.get 1 + i32.store + local.get 2 + i32.const 0 + i32.store8 offset=9 + local.get 2 + i32.const 0 + i32.store offset=4 + local.get 2 + local.get 0 + i32.const 4 + i32.add + i32.store offset=12 + local.get 2 + local.get 2 + i32.const 12 + i32.add + i32.const 68588 + call 57 + call 58 + end + local.get 2 + i32.const 16 + i32.add + global.set 0) + (func (;100;) (type 1) (param i32 i32) (result i32) + (local i32 i32) + global.get 0 + i32.const 16 + i32.sub + local.tee 2 + global.set 0 + block (result i32) ;; label = @1 + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + block ;; label = @5 + block ;; label = @6 + local.get 0 + i32.load + local.tee 0 + i32.load8_u + i32.const -2 + i32.add + local.tee 3 + i32.const 3 + local.get 3 + i32.const 255 + i32.and + i32.const 3 + i32.lt_u + select + i32.const 255 + i32.and + i32.const 1 + i32.sub + br_table 2 (;@4;) 3 (;@3;) 0 (;@6;) 1 (;@5;) + end + local.get 2 + local.get 1 + i32.load offset=24 + i32.const 65596 + i32.const 7 + local.get 1 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + i32.store8 offset=8 + local.get 2 + local.get 1 + i32.store + local.get 2 + i32.const 0 + i32.store8 offset=9 + local.get 2 + i32.const 0 + i32.store offset=4 + local.get 2 + local.get 0 + i32.store offset=12 + local.get 2 + local.get 2 + i32.const 12 + i32.add + i32.const 65604 + call 57 + call 58 + br 4 (;@1;) + end + local.get 2 + local.get 1 + i32.load offset=24 + i32.const 65620 + i32.const 14 + local.get 1 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + i32.store8 offset=8 + br 2 (;@2;) + end + local.get 2 + local.get 1 + i32.load offset=24 + i32.const 65864 + i32.const 11 + local.get 1 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + i32.store8 offset=8 + br 1 (;@2;) + end + local.get 2 + local.get 1 + i32.load offset=24 + i32.const 65634 + i32.const 15 + local.get 1 + i32.const 28 + i32.add + i32.load + i32.load offset=12 + call_indirect (type 0) + i32.store8 offset=8 + end + local.get 2 + local.get 1 + i32.store + local.get 2 + i32.const 0 + i32.store8 offset=9 + local.get 2 + i32.const 0 + i32.store offset=4 + local.get 2 + call 58 + end + local.get 2 + i32.const 16 + i32.add + global.set 0) + (func (;101;) (type 4) (param i32) + (local i32 i32) + global.get 0 + i32.const 16 + i32.sub + local.tee 1 + global.set 0 + local.get 1 + i32.const 27 + call 53 + local.get 0 + i32.const 12 + i32.add + i32.const 27 + i32.store + local.get 0 + i32.const 1 + i32.store8 + local.get 1 + i32.load + local.tee 2 + i32.const 68604 + i64.load align=1 + i64.store align=1 + local.get 0 + i32.const 4 + i32.add + local.get 1 + i64.load + i64.store align=4 + local.get 2 + i32.const 8 + i32.add + i32.const 68612 + i64.load align=1 + i64.store align=1 + local.get 2 + i32.const 16 + i32.add + i32.const 68620 + i64.load align=1 + i64.store align=1 + local.get 2 + i32.const 23 + i32.add + i32.const 68627 + i32.load align=1 + i32.store align=1 + local.get 1 + i32.const 16 + i32.add + global.set 0) + (func (;102;) (type 2) (param i32 i32) + (local i32 i64) + local.get 1 + i32.load offset=4 + local.tee 2 + if ;; label = @1 + local.get 2 + i64.extend_i32_u + i64.const 12 + i64.mul + local.tee 3 + i64.const 32 + i64.shr_u + i64.eqz + if ;; label = @2 + local.get 0 + local.get 3 + i64.store32 offset=4 + local.get 0 + i32.const 8 + i32.add + i32.const 4 + i32.store + local.get 0 + local.get 1 + i32.load + i32.store + return + end + unreachable + end + local.get 0 + i32.const 0 + i32.store) + (func (;103;) (type 3) (param i32 i32 i32) + block ;; label = @1 + local.get 1 + if ;; label = @2 + local.get 1 + local.get 2 + call 37 + local.set 2 + br 1 (;@1;) + end + i32.const 0 + local.set 1 + end + local.get 0 + local.get 1 + i32.store offset=4 + local.get 0 + local.get 2 + i32.store) + (func (;104;) (type 2) (param i32 i32) + (local i32 i32 i32 i32) + global.get 0 + i32.const 32 + i32.sub + local.tee 2 + global.set 0 + local.get 2 + i32.const 8 + i32.add + local.get 1 + call 9 + i32.const 1 + local.set 3 + block ;; label = @1 + local.get 2 + i32.load8_u offset=8 + i32.const 1 + i32.and + br_if 0 (;@1;) + local.get 2 + i32.load8_u offset=9 + local.tee 5 + i32.const 3 + i32.and + local.tee 4 + i32.const 3 + i32.ne + if ;; label = @2 + block ;; label = @3 + block ;; label = @4 + block ;; label = @5 + local.get 4 + i32.const 1 + i32.sub + br_table 1 (;@4;) 2 (;@3;) 0 (;@5;) + end + local.get 5 + i32.const 252 + i32.and + i32.const 2 + i32.shr_u + local.set 4 + i32.const 0 + local.set 3 + br 3 (;@1;) + end + local.get 2 + local.get 5 + i32.store8 offset=21 + local.get 2 + i32.const 1 + i32.store8 offset=20 + local.get 2 + local.get 1 + i32.store offset=16 + local.get 2 + i32.const 0 + i32.store16 offset=28 + local.get 2 + i32.const 16 + i32.add + local.get 2 + i32.const 28 + i32.add + i32.const 2 + call 141 + br_if 2 (;@1;) + local.get 2 + i32.load16_u offset=28 + local.tee 1 + i32.const 255 + i32.le_u + br_if 2 (;@1;) + local.get 1 + i32.const 2 + i32.shr_u + local.set 4 + i32.const 0 + local.set 3 + br 2 (;@1;) + end + local.get 2 + local.get 5 + i32.store8 offset=21 + local.get 2 + i32.const 1 + i32.store8 offset=20 + local.get 2 + local.get 1 + i32.store offset=16 + local.get 2 + i32.const 0 + i32.store offset=28 + local.get 2 + i32.const 16 + i32.add + local.get 2 + i32.const 28 + i32.add + i32.const 4 + call 141 + br_if 1 (;@1;) + local.get 2 + i32.load offset=28 + local.tee 1 + i32.const 65536 + i32.lt_u + local.set 3 + local.get 1 + i32.const 2 + i32.shr_u + local.set 4 + br 1 (;@1;) + end + local.get 5 + i32.const 3 + i32.gt_u + br_if 0 (;@1;) + i32.const 0 + local.set 3 + local.get 2 + i32.const 0 + i32.store offset=16 + block ;; label = @2 + local.get 1 + local.get 2 + i32.const 16 + i32.add + i32.const 4 + call 105 + i32.eqz + if ;; label = @3 + local.get 2 + i32.load offset=16 + local.set 4 + br 1 (;@2;) + end + i32.const 1 + local.set 3 + end + local.get 3 + local.get 4 + i32.const 1073741824 + i32.lt_u + i32.or + local.set 3 + end + local.get 0 + local.get 4 + i32.store offset=4 + local.get 0 + local.get 3 + i32.store + local.get 2 + i32.const 32 + i32.add + global.set 0) + (func (;105;) (type 0) (param i32 i32 i32) (result i32) + block ;; label = @1 + local.get 0 + i32.load offset=4 + local.get 2 + i32.ge_u + if (result i32) ;; label = @2 + local.get 1 + local.get 0 + i32.load + local.get 2 + call 148 + local.get 0 + i32.load offset=4 + local.tee 1 + local.get 2 + i32.lt_u + br_if 1 (;@1;) + local.get 0 + local.get 1 + local.get 2 + i32.sub + i32.store offset=4 + local.get 0 + local.get 0 + i32.load + local.get 2 + i32.add + i32.store + i32.const 0 + else + i32.const 1 + end + return + end + unreachable) + (func (;106;) (type 3) (param i32 i32 i32) + local.get 0 + local.get 2 + call 53 + local.get 0 + i32.load + local.get 1 + local.get 2 + call 148 + local.get 0 + local.get 2 + i32.store offset=8) + (func (;107;) (type 2) (param i32 i32) + (local i32 i32 i32 i32 i32) + block ;; label = @1 + local.get 1 + i32.load + local.tee 4 + local.get 1 + i32.load offset=4 + i32.eq + br_if 0 (;@1;) + local.get 1 + local.get 4 + i32.const 12 + i32.add + i32.store + block ;; label = @2 + local.get 1 + i32.const 16 + i32.add + i32.load + local.tee 5 + if ;; label = @3 + local.get 1 + i32.const 0 + i32.store offset=16 + local.get 1 + local.get 1 + i32.load offset=8 + local.tee 6 + local.get 5 + i32.const 12 + i32.mul + i32.add + local.tee 3 + i32.const 12 + i32.add + local.get 1 + i32.const 12 + i32.add + i32.load + local.tee 1 + local.get 1 + local.get 6 + i32.sub + i32.const 12 + i32.div_u + local.get 5 + i32.gt_u + local.tee 1 + select + i32.store offset=8 + local.get 1 + br_if 1 (;@2;) + br 2 (;@1;) + end + local.get 1 + i32.load offset=8 + local.tee 3 + local.get 1 + i32.const 12 + i32.add + i32.load + i32.eq + br_if 1 (;@1;) + local.get 1 + local.get 3 + i32.const 12 + i32.add + i32.store offset=8 + end + local.get 4 + local.set 2 + end + local.get 0 + local.get 3 + i32.store offset=4 + local.get 0 + local.get 2 + i32.store) + (func (;108;) (type 5) (param i32 i32 i32 i32) + (local i32) + local.get 2 + local.get 3 + i32.le_u + if ;; label = @1 + block ;; label = @2 + local.get 1 + i32.load offset=8 + local.get 3 + i32.ge_u + if ;; label = @3 + local.get 3 + local.get 2 + i32.sub + local.tee 4 + local.get 3 + i32.le_u + br_if 1 (;@2;) + unreachable + end + unreachable + end + local.get 1 + i32.load + local.set 1 + local.get 0 + local.get 4 + i32.store offset=4 + local.get 0 + local.get 1 + local.get 2 + i32.add + i32.store + return + end + unreachable) + (func (;109;) (type 3) (param i32 i32 i32) + (local i32) + global.get 0 + i32.const -64 + i32.add + local.tee 3 + global.set 0 + local.get 3 + i32.const 48 + i32.add + local.get 1 + local.get 2 + call 110 + local.get 3 + i32.const 32 + i32.add + local.get 3 + i32.const 48 + i32.add + i32.const 68693 + i32.const 96 + call 111 + local.get 3 + i32.const 16 + i32.add + local.get 3 + i32.const 32 + i32.add + call 112 + local.get 3 + i32.const 32 + i32.add + call 113 + local.get 3 + i32.const 48 + i32.add + local.get 2 + call 96 + local.get 3 + i32.const 8 + i32.add + local.get 3 + i32.const 48 + i32.add + local.get 3 + i32.load offset=24 + local.tee 1 + call 114 + local.get 3 + i32.load offset=12 + local.get 1 + i32.ne + if ;; label = @1 + unreachable + end + local.get 3 + i32.load offset=8 + local.get 3 + i32.load offset=16 + local.get 1 + call 148 + local.get 0 + i32.const 0 + i32.store + local.get 0 + i32.const 12 + i32.add + local.get 3 + i32.const 56 + i32.add + i32.load + i32.store + local.get 0 + local.get 3 + i64.load offset=48 + i64.store offset=4 align=4 + local.get 3 + i32.const 16 + i32.add + call 17 + local.get 3 + i32.const -64 + i32.sub + global.set 0) + (func (;110;) (type 3) (param i32 i32 i32) + (local i32 i32 i32 i32) + global.get 0 + i32.const 80 + i32.sub + local.tee 3 + global.set 0 + block ;; label = @1 + block ;; label = @2 + local.get 2 + if ;; label = @3 + local.get 3 + i32.const 8 + i32.store8 offset=31 + local.get 3 + i32.const 0 + i32.store offset=40 + local.get 3 + i64.const 4 + i64.store offset=32 + local.get 3 + i32.const 48 + i32.add + local.get 2 + i32.const 4 + call 115 + block ;; label = @4 + local.get 3 + i32.load offset=52 + i32.const 1 + i32.ne + if ;; label = @5 + local.get 3 + i32.const 4 + i32.store offset=56 + local.get 3 + local.get 2 + i32.store offset=52 + local.get 3 + local.get 1 + i32.store offset=48 + local.get 3 + local.get 3 + i32.const 31 + i32.add + i32.store offset=60 + i32.const 4 + local.set 1 + loop ;; label = @6 + local.get 3 + i32.const 16 + i32.add + local.get 3 + i32.const 48 + i32.add + call 116 + local.get 3 + i32.load offset=16 + local.tee 2 + i32.eqz + br_if 2 (;@4;) + local.get 3 + i32.load offset=60 + i32.load8_u + local.get 2 + local.get 3 + i32.load offset=20 + call 117 + local.set 2 + local.get 3 + i32.load offset=36 + local.get 4 + i32.eq + if ;; label = @7 + local.get 3 + i32.const -64 + i32.sub + local.get 3 + i32.load offset=52 + local.get 3 + i32.load offset=56 + call 115 + local.get 3 + i32.const 32 + i32.add + i32.const -1 + local.get 3 + i32.load offset=64 + local.tee 1 + i32.const 1 + i32.add + local.tee 6 + local.get 6 + local.get 1 + i32.lt_u + select + call 118 + local.get 3 + i32.load offset=32 + local.set 1 + end + local.get 1 + local.get 5 + i32.add + local.get 2 + i32.store + local.get 4 + i32.const 1 + i32.add + local.tee 2 + local.get 4 + i32.lt_u + br_if 5 (;@1;) + local.get 3 + local.get 2 + i32.store offset=40 + local.get 5 + i32.const 4 + i32.add + local.set 5 + local.get 2 + local.set 4 + br 0 (;@6;) + end + unreachable + end + local.get 3 + i32.const 32 + i32.add + local.get 3 + i32.const 56 + i32.add + i32.load + call 118 + local.get 3 + i32.load offset=32 + local.get 3 + i32.load offset=40 + local.set 4 + local.get 3 + i32.const 4 + i32.store offset=56 + local.get 3 + local.get 2 + i32.store offset=52 + local.get 3 + local.get 1 + i32.store offset=48 + local.get 4 + i32.const 2 + i32.shl + i32.add + local.set 5 + loop ;; label = @5 + block ;; label = @6 + local.get 3 + i32.const 8 + i32.add + local.get 3 + i32.const 48 + i32.add + call 116 + local.get 3 + i32.load offset=8 + local.tee 1 + i32.eqz + br_if 0 (;@6;) + local.get 5 + local.get 3 + i32.load8_u offset=31 + local.get 1 + local.get 3 + i32.load offset=12 + call 117 + i32.store + local.get 4 + i32.const 1 + i32.add + local.tee 1 + local.get 4 + i32.lt_u + br_if 5 (;@1;) + local.get 5 + i32.const 4 + i32.add + local.set 5 + local.get 1 + local.set 4 + br 1 (;@5;) + end + end + local.get 3 + local.get 4 + i32.store offset=40 + end + local.get 3 + i32.const 56 + i32.add + local.get 3 + i32.const 40 + i32.add + i32.load + i32.store + local.get 3 + local.get 3 + i64.load offset=32 + i64.store offset=48 + local.get 0 + local.get 3 + i32.const 48 + i32.add + call 119 + br 1 (;@2;) + end + local.get 0 + i32.const 0 + i32.store offset=8 + local.get 0 + i64.const 4 + i64.store align=4 + end + local.get 3 + i32.const 80 + i32.add + global.set 0 + return + end + unreachable) + (func (;111;) (type 5) (param i32 i32 i32 i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i64 i64 i64) + global.get 0 + i32.const 176 + i32.sub + local.tee 4 + global.set 0 + local.get 4 + i32.const 8 + i32.add + local.get 2 + local.get 3 + call 110 + local.get 4 + i32.const 24 + i32.add + local.get 4 + i32.const 8 + i32.add + call 120 + local.get 4 + i32.const 40 + i32.add + local.get 1 + call 120 + local.get 4 + i32.const -64 + i32.sub + local.get 4 + i32.const 16 + i32.add + i32.load + local.tee 2 + i32.store + local.get 4 + local.get 4 + i64.load offset=8 + local.tee 12 + i64.store offset=56 + local.get 2 + i32.const 2 + i32.shl + local.set 2 + local.get 12 + i32.wrap_i64 + local.set 3 + i64.const 0 + local.set 12 + block ;; label = @1 + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + block ;; label = @5 + block ;; label = @6 + block ;; label = @7 + block ;; label = @8 + block ;; label = @9 + loop ;; label = @10 + local.get 2 + if ;; label = @11 + local.get 13 + i64.const 63 + i64.gt_u + br_if 2 (;@9;) + local.get 2 + i32.const -4 + i32.add + local.set 2 + local.get 12 + local.get 3 + i64.load32_u + local.get 13 + i64.shl + i64.add + local.tee 14 + local.get 12 + i64.ge_u + local.get 13 + i64.const 32 + i64.add + local.set 13 + local.get 3 + i32.const 4 + i32.add + local.set 3 + local.get 14 + local.set 12 + br_if 1 (;@10;) + br 10 (;@1;) + end + end + local.get 12 + i64.const 4294967296 + i64.lt_u + br_if 1 (;@8;) + end + local.get 4 + i32.const 80 + i32.add + local.get 4 + i32.const 48 + i32.add + i32.load + i32.store + local.get 4 + local.get 4 + i64.load offset=40 + i64.store offset=72 + local.get 4 + i32.const 96 + i32.add + local.get 4 + i32.const -64 + i32.sub + i32.load + local.tee 5 + i32.store + local.get 4 + local.get 4 + i64.load offset=56 + i64.store offset=88 + local.get 5 + i32.eqz + br_if 7 (;@1;) + local.get 4 + i32.load offset=80 + local.tee 8 + i32.eqz + br_if 1 (;@7;) + local.get 5 + i32.const 1 + i32.ne + if ;; label = @9 + local.get 4 + i32.load offset=88 + local.set 6 + i32.const -1 + local.get 5 + local.get 8 + i32.ne + local.get 8 + local.get 5 + i32.lt_u + select + local.tee 7 + br_if 4 (;@5;) + local.get 6 + i32.const -4 + i32.add + local.set 10 + local.get 5 + i32.const 2 + i32.shl + local.set 2 + local.get 8 + i32.const 2 + i32.shl + local.set 3 + local.get 4 + i32.load offset=72 + i32.const -4 + i32.add + local.set 8 + loop ;; label = @10 + local.get 3 + i32.eqz + br_if 4 (;@6;) + local.get 2 + i32.eqz + br_if 6 (;@4;) + local.get 3 + local.get 8 + i32.add + local.set 7 + local.get 2 + local.get 10 + i32.add + local.set 9 + local.get 2 + i32.const -4 + i32.add + local.set 2 + local.get 3 + i32.const -4 + i32.add + local.set 3 + i32.const -1 + local.get 7 + i32.load + local.tee 7 + local.get 9 + i32.load + local.tee 9 + i32.ne + local.get 7 + local.get 9 + i32.lt_u + select + local.tee 7 + i32.eqz + br_if 0 (;@10;) + end + br 4 (;@5;) + end + block ;; label = @9 + local.get 4 + i32.load offset=88 + local.tee 2 + i32.const 68956 + i32.ne + if ;; label = @10 + local.get 2 + i32.load + i32.const 1 + i32.ne + br_if 1 (;@9;) + end + local.get 4 + i32.const 140 + i32.add + i32.const 0 + i32.store + local.get 4 + i32.const 128 + i32.add + local.get 4 + i32.const 80 + i32.add + i32.load + i32.store + local.get 4 + local.get 4 + i64.load offset=72 + i64.store offset=120 + local.get 4 + i64.const 4 + i64.store offset=132 align=4 + local.get 4 + i32.const 88 + i32.add + call 113 + br 6 (;@3;) + end + local.get 4 + i32.load offset=76 + local.set 7 + local.get 4 + i32.load offset=72 + local.set 5 + block ;; label = @9 + local.get 2 + i32.load + local.tee 2 + i32.const 65536 + i32.ge_u + if ;; label = @10 + local.get 8 + i32.const 2 + i32.shl + local.set 6 + local.get 5 + i32.const -4 + i32.add + local.set 10 + i32.const 0 + local.set 3 + loop ;; label = @11 + local.get 6 + i32.eqz + br_if 2 (;@9;) + local.get 4 + local.get 3 + local.get 6 + local.get 10 + i32.add + local.tee 9 + i32.load + local.get 2 + call 121 + local.get 4 + i32.load offset=4 + local.set 3 + local.get 9 + local.get 4 + i32.load + i32.store + local.get 6 + i32.const -4 + i32.add + local.set 6 + br 0 (;@11;) + end + unreachable + end + local.get 8 + i32.const 2 + i32.shl + local.set 6 + local.get 5 + i32.const -4 + i32.add + local.set 10 + i32.const 0 + local.set 3 + loop ;; label = @10 + local.get 6 + i32.eqz + br_if 1 (;@9;) + local.get 2 + i32.eqz + br_if 9 (;@1;) + local.get 6 + local.get 10 + i32.add + local.tee 9 + local.get 3 + i32.const 16 + i32.shl + local.get 9 + i32.load + local.tee 3 + i32.const 16 + i32.shr_u + i32.or + local.tee 9 + local.get 2 + i32.rem_u + i32.const 16 + i32.shl + local.get 3 + i32.const 65535 + i32.and + i32.or + local.tee 3 + local.get 2 + i32.div_u + local.get 9 + local.get 2 + i32.div_u + i32.const 16 + i32.shl + i32.or + i32.store + local.get 3 + local.get 2 + i32.rem_u + local.set 3 + local.get 6 + i32.const -4 + i32.add + local.set 6 + br 0 (;@10;) + end + unreachable + end + local.get 4 + local.get 8 + i32.store offset=128 + local.get 4 + local.get 7 + i32.store offset=124 + local.get 4 + local.get 5 + i32.store offset=120 + local.get 4 + i32.const 120 + i32.add + call 122 + local.get 4 + i32.const 168 + i32.add + local.get 4 + i32.load offset=128 + local.tee 2 + i32.store + local.get 4 + local.get 4 + i64.load offset=120 + local.tee 12 + i64.store offset=160 + local.get 4 + i32.const 152 + i32.add + local.tee 5 + local.get 2 + i32.store + local.get 4 + local.get 12 + i64.store offset=144 + local.get 4 + i32.const 0 + i32.store offset=96 + block ;; label = @9 + local.get 3 + i32.eqz + br_if 0 (;@9;) + local.get 4 + i32.const 88 + i32.add + i32.const 0 + call 123 + local.get 4 + i32.load offset=88 + local.get 4 + i32.load offset=96 + local.get 4 + local.get 3 + i32.store offset=120 + local.get 4 + i32.const 120 + i32.add + i32.const 1 + call 124 + local.tee 2 + i32.eqz + br_if 0 (;@9;) + local.get 4 + i32.const 88 + i32.add + local.get 2 + call 123 + end + local.get 4 + i32.const 128 + i32.add + local.get 5 + i32.load + i32.store + local.get 4 + i32.const 140 + i32.add + local.get 4 + i32.const 96 + i32.add + i32.load + i32.store + local.get 4 + local.get 4 + i64.load offset=144 + i64.store offset=120 + local.get 4 + local.get 4 + i64.load offset=88 + i64.store offset=132 align=4 + br 5 (;@3;) + end + local.get 4 + i32.load offset=48 + local.set 2 + local.get 4 + i32.load offset=40 + local.set 6 + block ;; label = @8 + local.get 12 + i32.wrap_i64 + local.tee 5 + i32.const 65536 + i32.ge_u + if ;; label = @9 + local.get 2 + i32.const 2 + i32.shl + local.set 3 + local.get 6 + i32.const -4 + i32.add + local.set 5 + i32.const 0 + local.set 2 + loop ;; label = @10 + local.get 3 + i32.eqz + br_if 2 (;@8;) + local.get 3 + local.get 5 + i32.add + i64.load32_u + local.get 2 + i64.extend_i32_u + i64.const 32 + i64.shl + i64.or + local.get 12 + i64.rem_u + i32.wrap_i64 + local.set 2 + local.get 3 + i32.const -4 + i32.add + local.set 3 + br 0 (;@10;) + end + unreachable + end + local.get 2 + i32.const 2 + i32.shl + local.set 3 + local.get 6 + i32.const -4 + i32.add + local.set 6 + i32.const 0 + local.set 2 + loop ;; label = @9 + local.get 3 + i32.eqz + br_if 1 (;@8;) + local.get 5 + i32.eqz + br_if 8 (;@1;) + local.get 2 + i32.const 16 + i32.shl + local.get 3 + local.get 6 + i32.add + i32.load + local.tee 2 + i32.const 16 + i32.shr_u + i32.or + local.get 5 + i32.rem_u + i32.const 16 + i32.shl + local.get 2 + i32.const 65535 + i32.and + i32.or + local.get 5 + i32.rem_u + local.set 2 + local.get 3 + i32.const -4 + i32.add + local.set 3 + br 0 (;@9;) + end + unreachable + end + local.get 4 + i32.const 0 + i32.store offset=168 + local.get 4 + i64.const 4 + i64.store offset=160 + local.get 2 + i64.extend_i32_u + local.set 13 + loop ;; label = @8 + local.get 13 + i64.eqz + i32.eqz + if ;; label = @9 + local.get 4 + i32.const 160 + i32.add + local.get 13 + i32.wrap_i64 + call 123 + i64.const 0 + local.set 13 + br 1 (;@8;) + end + end + local.get 4 + i32.const 56 + i32.add + call 113 + local.get 4 + i32.const 40 + i32.add + call 113 + br 5 (;@2;) + end + local.get 4 + i32.const 136 + i32.add + i64.const 0 + i64.store + local.get 4 + i64.const 17179869184 + i64.store offset=128 + local.get 4 + i64.const 4 + i64.store offset=120 + local.get 4 + i32.const 88 + i32.add + call 113 + local.get 4 + i32.const 72 + i32.add + call 113 + br 3 (;@3;) + end + i32.const -1 + i32.const 0 + local.get 2 + select + local.set 7 + end + block ;; label = @5 + block ;; label = @6 + local.get 7 + br_table 1 (;@5;) 2 (;@4;) 0 (;@6;) + end + local.get 4 + i32.const 140 + i32.add + local.get 4 + i32.const 80 + i32.add + i32.load + i32.store + local.get 4 + i32.const 0 + i32.store offset=128 + local.get 4 + i64.const 4 + i64.store offset=120 + local.get 4 + local.get 4 + i64.load offset=72 + i64.store offset=132 align=4 + local.get 4 + i32.const 88 + i32.add + call 113 + br 2 (;@3;) + end + local.get 4 + i32.const 0 + i32.store offset=80 + local.get 4 + i32.const 72 + i32.add + i32.const 1 + call 123 + local.get 4 + i32.const 140 + i32.add + i32.const 0 + i32.store + local.get 4 + i32.const 128 + i32.add + local.get 4 + i32.load offset=80 + i32.store + local.get 4 + i64.const 4 + i64.store offset=132 align=4 + local.get 4 + local.get 4 + i64.load offset=72 + i64.store offset=120 + local.get 4 + i32.const 88 + i32.add + call 113 + br 1 (;@3;) + end + block (result i32) ;; label = @4 + local.get 5 + i32.const 2 + i32.shl + local.get 6 + i32.add + i32.const -4 + i32.add + i32.load + local.tee 9 + i32.clz + local.tee 6 + if ;; label = @5 + local.get 4 + i32.const 128 + i32.add + local.tee 2 + local.get 4 + i32.const 80 + i32.add + i32.load + i32.store + local.get 4 + local.get 4 + i64.load offset=72 + i64.store offset=120 + local.get 4 + i32.const 144 + i32.add + local.get 4 + i32.const 120 + i32.add + local.get 6 + call 125 + local.get 2 + local.get 4 + i32.const 96 + i32.add + i32.load + i32.store + local.get 4 + local.get 4 + i64.load offset=88 + i64.store offset=120 + local.get 4 + i32.const 160 + i32.add + local.get 4 + i32.const 120 + i32.add + local.get 6 + call 125 + local.get 4 + i32.const 120 + i32.add + local.get 4 + i32.const 144 + i32.add + local.get 4 + i32.const 160 + i32.add + call 126 + local.get 4 + i32.const 160 + i32.add + call 113 + i32.const 0 + br 1 (;@4;) + end + local.get 4 + i32.const 168 + i32.add + local.get 4 + i32.const 80 + i32.add + i32.load + i32.store + local.get 4 + local.get 4 + i64.load offset=72 + i64.store offset=160 + local.get 4 + i32.const 120 + i32.add + local.get 4 + i32.const 160 + i32.add + local.get 4 + i32.const 88 + i32.add + call 126 + i32.const 1 + end + local.get 4 + i32.const 112 + i32.add + local.get 4 + i32.const 128 + i32.add + local.tee 2 + i32.load + i32.store + local.get 4 + local.get 4 + i64.load offset=120 + i64.store offset=104 + local.get 4 + i32.const 136 + i32.add + i32.load + local.set 10 + local.get 4 + i32.load offset=132 + local.set 5 + block ;; label = @4 + block ;; label = @5 + local.get 4 + i32.const 140 + i32.add + i32.load + local.tee 7 + if ;; label = @6 + local.get 7 + local.get 9 + i32.eqz + local.tee 8 + i32.le_u + br_if 1 (;@5;) + local.get 8 + i32.const 2 + i32.shl + local.set 2 + local.get 5 + local.set 3 + loop ;; label = @7 + local.get 2 + if ;; label = @8 + local.get 2 + i32.const -4 + i32.add + local.set 2 + local.get 3 + i32.const 4 + i32.add + local.set 3 + br 1 (;@7;) + end + end + local.get 7 + local.get 8 + i32.sub + local.tee 2 + i32.eqz + local.get 9 + i32.or + i32.eqz + if ;; label = @7 + local.get 5 + local.get 5 + local.get 8 + i32.const 2 + i32.shl + i32.add + local.get 2 + i32.const 2 + i32.shl + call 149 + end + local.get 4 + local.get 2 + i32.store offset=168 + local.get 4 + local.get 10 + i32.store offset=164 + local.get 4 + local.get 5 + i32.store offset=160 + block ;; label = @7 + local.get 6 + i32.const 31 + i32.and + local.tee 10 + i32.eqz + br_if 0 (;@7;) + local.get 7 + i32.const 2 + i32.shl + local.get 8 + i32.const 2 + i32.shl + i32.sub + local.set 2 + local.get 5 + i32.const -4 + i32.add + local.set 5 + i32.const 0 + local.set 3 + i32.const 0 + local.get 6 + i32.sub + i32.const 31 + i32.and + local.set 6 + loop ;; label = @8 + local.get 2 + i32.eqz + br_if 1 (;@7;) + local.get 2 + local.get 5 + i32.add + local.tee 7 + local.get 3 + local.get 7 + i32.load + local.tee 3 + local.get 10 + i32.shr_u + i32.or + i32.store + local.get 2 + i32.const -4 + i32.add + local.set 2 + local.get 3 + local.get 6 + i32.shl + local.set 3 + br 0 (;@8;) + end + unreachable + end + local.get 4 + i32.const 128 + i32.add + local.get 4 + i32.const 168 + i32.add + i32.load + i32.store + local.get 4 + local.get 4 + i64.load offset=160 + i64.store offset=120 + local.get 4 + i32.const 144 + i32.add + local.get 4 + i32.const 120 + i32.add + call 119 + br 2 (;@4;) + end + local.get 4 + i32.const 132 + i32.add + i32.const 0 + i32.store + local.get 2 + local.get 10 + i32.store + local.get 4 + local.get 5 + i32.store offset=124 + local.get 4 + i32.const 1 + i32.store offset=120 + local.get 4 + i32.const 144 + i32.add + local.get 4 + i32.const 120 + i32.add + call 127 + br 1 (;@4;) + end + local.get 4 + i32.const 132 + i32.add + local.get 7 + i32.store + local.get 4 + i32.const 128 + i32.add + local.get 10 + i32.store + local.get 4 + local.get 5 + i32.store offset=124 + local.get 4 + i32.const 1 + i32.store offset=120 + local.get 4 + i32.const 160 + i32.add + local.get 4 + i32.const 120 + i32.add + call 127 + local.get 4 + i32.const 152 + i32.add + i32.const 0 + i32.store + local.get 4 + local.get 4 + i64.load offset=160 + i64.store offset=144 + end + local.get 4 + i32.const 128 + i32.add + local.get 4 + i32.const 112 + i32.add + i32.load + i32.store + local.get 4 + i32.const 140 + i32.add + local.get 4 + i32.const 152 + i32.add + i32.load + i32.store + local.get 4 + local.get 4 + i64.load offset=104 + i64.store offset=120 + local.get 4 + local.get 4 + i64.load offset=144 + i64.store offset=132 align=4 + i32.eqz + br_if 0 (;@3;) + local.get 4 + i32.const 88 + i32.add + call 113 + end + local.get 4 + i32.const 168 + i32.add + local.get 4 + i32.const 140 + i32.add + i32.load + i32.store + local.get 4 + local.get 4 + i64.load offset=132 align=4 + i64.store offset=160 + local.get 4 + i32.const 120 + i32.add + call 113 + end + local.get 4 + i32.const 128 + i32.add + local.get 4 + i32.const 32 + i32.add + i32.load + local.tee 10 + i32.store + local.get 4 + local.get 4 + i64.load offset=24 + local.tee 12 + i64.store offset=120 + local.get 4 + i32.load offset=168 + local.tee 8 + local.get 8 + local.get 10 + local.get 10 + local.get 8 + i32.gt_u + select + local.tee 5 + i32.sub + local.get 8 + i32.gt_u + br_if 0 (;@1;) + local.get 12 + i32.wrap_i64 + local.tee 2 + local.get 5 + i32.const 2 + i32.shl + i32.add + local.set 7 + i32.const 0 + local.set 9 + local.get 5 + local.set 3 + local.get 4 + i32.load offset=160 + local.tee 11 + local.set 6 + loop ;; label = @2 + local.get 3 + if ;; label = @3 + local.get 2 + local.get 2 + i64.load32_u + local.get 6 + i64.load32_u + i64.sub + local.get 9 + i64.extend_i32_u + i64.const 255 + i64.and + i64.sub + local.tee 12 + i64.store32 + local.get 12 + i64.const 63 + i64.shr_u + i32.wrap_i64 + local.set 9 + local.get 3 + i32.const -1 + i32.add + local.set 3 + local.get 2 + i32.const 4 + i32.add + local.set 2 + local.get 6 + i32.const 4 + i32.add + local.set 6 + br 1 (;@2;) + else + local.get 5 + i32.const 2 + i32.shl + local.set 5 + local.get 9 + if ;; label = @4 + local.get 10 + i32.const 2 + i32.shl + local.get 5 + i32.sub + local.set 2 + loop ;; label = @5 + local.get 2 + i32.eqz + br_if 4 (;@1;) + local.get 7 + local.get 7 + i32.load + local.tee 3 + i32.const -1 + i32.add + i32.store + local.get 2 + i32.const -4 + i32.add + local.set 2 + local.get 7 + i32.const 4 + i32.add + local.set 7 + local.get 3 + i32.eqz + br_if 0 (;@5;) + end + end + local.get 5 + local.get 11 + i32.add + local.set 3 + local.get 8 + i32.const 2 + i32.shl + local.get 5 + i32.sub + local.set 2 + loop ;; label = @4 + local.get 2 + if ;; label = @5 + local.get 2 + i32.const -4 + i32.add + local.set 2 + local.get 3 + i32.load + local.get 3 + i32.const 4 + i32.add + local.set 3 + i32.eqz + br_if 1 (;@4;) + br 4 (;@1;) + end + end + local.get 4 + i32.const 120 + i32.add + call 122 + local.get 0 + local.get 4 + i64.load offset=120 + i64.store align=4 + local.get 0 + i32.const 8 + i32.add + local.get 4 + i32.const 128 + i32.add + i32.load + i32.store + local.get 4 + i32.const 160 + i32.add + call 113 + local.get 1 + call 113 + local.get 4 + i32.const 176 + i32.add + global.set 0 + return + end + unreachable + end + unreachable + end + unreachable) + (func (;112;) (type 2) (param i32 i32) + (local i32 i32 i32 i32 i32 i32 i64 i64) + global.get 0 + i32.const 16 + i32.sub + local.tee 3 + global.set 0 + block ;; label = @1 + block ;; label = @2 + local.get 1 + i32.load offset=8 + local.tee 2 + if ;; label = @3 + block ;; label = @4 + local.get 2 + i64.extend_i32_u + i64.const 5 + i64.shl + local.tee 9 + local.get 1 + i32.load + local.tee 5 + local.get 2 + i32.const -1 + i32.add + local.tee 6 + i32.const 2 + i32.shl + i32.add + local.tee 7 + i32.load + i32.clz + i64.extend_i32_u + i64.sub + local.tee 8 + local.get 9 + i64.le_u + if ;; label = @5 + local.get 3 + i32.const 8 + i32.add + local.get 8 + i64.const 7 + i64.and + i64.const 0 + i64.ne + i64.extend_i32_u + local.get 8 + i64.const 3 + i64.shr_u + i64.add + local.tee 8 + i64.const 4294967295 + local.get 8 + i64.const 4294967295 + i64.lt_u + select + i32.wrap_i64 + i32.const 0 + call 52 + local.get 3 + i64.load offset=8 + local.set 8 + local.get 0 + i32.const 0 + i32.store offset=8 + local.get 0 + local.get 8 + i64.store align=4 + local.get 5 + local.set 2 + br 1 (;@4;) + end + unreachable + end + loop ;; label = @4 + local.get 2 + local.get 7 + i32.eq + if ;; label = @5 + local.get 5 + local.get 6 + i32.const 2 + i32.shl + i32.add + i32.load + local.set 1 + loop ;; label = @6 + local.get 1 + i32.eqz + br_if 4 (;@2;) + local.get 0 + local.get 1 + call 128 + local.get 1 + i32.const 8 + i32.shr_u + local.set 1 + br 0 (;@6;) + end + unreachable + else + local.get 2 + i32.load + local.set 4 + i32.const 0 + local.set 1 + loop ;; label = @6 + local.get 1 + i32.const 255 + i32.and + i32.const 3 + i32.le_u + if ;; label = @7 + local.get 0 + local.get 4 + call 128 + local.get 4 + i32.const 8 + i32.shr_u + local.set 4 + local.get 1 + i32.const 1 + i32.add + local.set 1 + br 1 (;@6;) + end + end + local.get 2 + i32.const 4 + i32.add + local.set 2 + br 1 (;@4;) + end + unreachable + end + unreachable + end + local.get 3 + i32.const 1 + i32.const 1 + call 103 + local.get 3 + i32.load + local.tee 1 + i32.eqz + br_if 1 (;@1;) + local.get 1 + i32.const 0 + i32.store8 + local.get 0 + i64.const 4294967297 + i64.store offset=4 align=4 + local.get 0 + local.get 1 + i32.store + end + local.get 3 + i32.const 16 + i32.add + global.set 0 + return + end + unreachable) + (func (;113;) (type 4) (param i32) + (local i32) + global.get 0 + i32.const 16 + i32.sub + local.tee 1 + global.set 0 + local.get 1 + local.get 0 + call 133 + local.get 1 + i32.load + local.tee 0 + if ;; label = @1 + local.get 0 + local.get 1 + i32.load offset=4 + call 138 + end + local.get 1 + i32.const 16 + i32.add + global.set 0) + (func (;114;) (type 3) (param i32 i32 i32) + local.get 1 + i32.load offset=8 + local.get 2 + i32.lt_u + if ;; label = @1 + unreachable + end + local.get 0 + local.get 2 + i32.store offset=4 + local.get 0 + local.get 1 + i32.load + i32.store) + (func (;115;) (type 3) (param i32 i32 i32) + (local i32) + local.get 1 + if ;; label = @1 + block ;; label = @2 + local.get 2 + i32.eqz + br_if 0 (;@2;) + local.get 1 + local.get 2 + i32.div_u + local.set 3 + block ;; label = @3 + local.get 1 + local.get 2 + i32.rem_u + i32.eqz + if ;; label = @4 + local.get 3 + local.set 1 + br 1 (;@3;) + end + local.get 3 + i32.const 1 + i32.add + local.tee 1 + local.get 3 + i32.lt_u + br_if 1 (;@2;) + end + local.get 0 + i32.const 1 + i32.store offset=4 + local.get 0 + local.get 1 + i32.store + local.get 0 + i32.const 8 + i32.add + local.get 1 + i32.store + return + end + unreachable + end + local.get 0 + i64.const 4294967296 + i64.store align=4 + local.get 0 + i32.const 8 + i32.add + i32.const 0 + i32.store) + (func (;116;) (type 2) (param i32 i32) + (local i32 i32 i32) + block ;; label = @1 + block ;; label = @2 + local.get 1 + i32.load offset=4 + local.tee 2 + i32.eqz + if ;; label = @3 + i32.const 0 + local.set 2 + br 1 (;@2;) + end + local.get 2 + local.get 1 + i32.load offset=8 + local.tee 3 + local.get 2 + local.get 2 + local.get 3 + i32.gt_u + select + local.tee 3 + i32.sub + local.tee 4 + local.get 2 + i32.gt_u + br_if 1 (;@1;) + local.get 1 + i32.load + local.set 2 + local.get 1 + local.get 4 + i32.store offset=4 + local.get 1 + local.get 2 + local.get 3 + i32.add + i32.store + end + local.get 0 + local.get 3 + i32.store offset=4 + local.get 0 + local.get 2 + i32.store + return + end + unreachable) + (func (;117;) (type 0) (param i32 i32 i32) (result i32) + (local i32 i32) + local.get 1 + i32.const -1 + i32.add + local.set 3 + local.get 0 + i32.const 255 + i32.and + local.set 1 + i32.const 0 + local.set 0 + block ;; label = @1 + loop ;; label = @2 + local.get 2 + if ;; label = @3 + local.get 1 + i32.const 32 + i32.ge_u + br_if 2 (;@1;) + local.get 2 + local.get 3 + i32.add + local.get 2 + i32.const -1 + i32.add + local.set 2 + i32.load8_u + local.get 0 + local.get 1 + i32.shl + i32.or + local.set 0 + br 1 (;@2;) + end + end + local.get 0 + return + end + unreachable) + (func (;118;) (type 2) (param i32 i32) + (local i32 i32 i32) + global.get 0 + i32.const 48 + i32.sub + local.tee 2 + global.set 0 + block (result i32) ;; label = @1 + block ;; label = @2 + local.get 0 + i32.load offset=4 + local.tee 3 + local.get 0 + i32.load offset=8 + local.tee 4 + i32.sub + local.get 1 + i32.ge_u + br_if 0 (;@2;) + local.get 1 + local.get 4 + i32.add + local.tee 1 + local.get 4 + i32.lt_u + if ;; label = @3 + i32.const 0 + local.set 1 + i32.const 1 + br 2 (;@1;) + end + local.get 3 + local.get 3 + i32.add + local.tee 4 + local.get 3 + i32.ge_u + if ;; label = @3 + local.get 2 + i32.const 8 + i32.add + local.get 4 + local.get 1 + local.get 4 + local.get 1 + i32.gt_u + select + local.tee 1 + i32.const 4 + local.get 1 + i32.const 4 + i32.gt_u + select + call 132 + local.get 2 + i32.load offset=12 + local.set 1 + local.get 2 + i32.load offset=8 + local.set 3 + local.get 2 + i32.const 32 + i32.add + local.get 0 + call 133 + local.get 2 + i32.const 16 + i32.add + local.get 3 + local.get 1 + local.get 2 + i32.const 32 + i32.add + call 49 + local.get 2 + i32.const 24 + i32.add + i32.load + local.set 1 + i32.const 1 + local.get 2 + i32.load offset=16 + i32.const 1 + i32.eq + br_if 2 (;@1;) + drop + local.get 0 + local.get 2 + i32.load offset=20 + i32.store + local.get 0 + local.get 1 + i32.const 2 + i32.shr_u + i32.store offset=4 + br 1 (;@2;) + end + unreachable + end + i32.const 0 + end + local.get 1 + call 134 + local.get 2 + i32.const 48 + i32.add + global.set 0) + (func (;119;) (type 2) (param i32 i32) + (local i32 i32) + global.get 0 + i32.const 16 + i32.sub + local.tee 2 + global.set 0 + local.get 2 + i32.const 8 + i32.add + local.tee 3 + local.get 1 + i32.const 8 + i32.add + i32.load + i32.store + local.get 2 + local.get 1 + i64.load align=4 + i64.store + local.get 2 + call 122 + local.get 0 + i32.const 8 + i32.add + local.get 3 + i32.load + i32.store + local.get 0 + local.get 2 + i64.load + i64.store align=4 + local.get 2 + i32.const 16 + i32.add + global.set 0) + (func (;120;) (type 2) (param i32 i32) + (local i32) + local.get 1 + i32.load + local.set 2 + local.get 0 + local.get 1 + i32.load offset=8 + local.tee 1 + call 135 + local.get 0 + i32.load + local.get 2 + local.get 1 + i32.const 2 + i32.shl + call 148 + local.get 0 + local.get 1 + i32.store offset=8) + (func (;121;) (type 5) (param i32 i32 i32 i32) + (local i64 i64) + local.get 3 + if ;; label = @1 + local.get 0 + local.get 2 + i64.extend_i32_u + local.get 1 + i64.extend_i32_u + i64.const 32 + i64.shl + i64.or + local.tee 4 + local.get 3 + i64.extend_i32_u + local.tee 5 + i64.rem_u + i64.store32 offset=4 + local.get 0 + local.get 4 + local.get 5 + i64.div_u + i64.store32 + return + end + unreachable) + (func (;122;) (type 4) (param i32) + (local i32 i32 i32 i32 i32 i32) + global.get 0 + i32.const 32 + i32.sub + local.tee 3 + global.set 0 + loop ;; label = @1 + block ;; label = @2 + local.get 0 + i32.load offset=8 + local.tee 1 + i32.eqz + if ;; label = @3 + br 1 (;@2;) + end + local.get 0 + i32.load + local.get 1 + i32.const 2 + i32.shl + i32.add + i32.const -4 + i32.add + i32.load + if ;; label = @3 + local.get 1 + local.set 2 + else + local.get 3 + i32.const 8 + i32.add + local.get 0 + call 139 + br 2 (;@1;) + end + end + end + local.get 2 + local.get 0 + i32.load offset=4 + local.tee 4 + i32.const 2 + i32.shr_u + i32.ge_u + local.get 4 + local.get 1 + i32.le_u + i32.or + i32.eqz + if ;; label = @1 + local.get 3 + i32.const 16 + i32.add + local.get 0 + call 133 + block (result i32) ;; label = @2 + local.get 3 + i32.load offset=16 + local.tee 4 + if ;; label = @3 + block ;; label = @4 + local.get 1 + local.get 1 + i32.const 1073741823 + i32.and + i32.eq + if ;; label = @5 + local.get 3 + i32.const 24 + i32.add + i32.load + local.set 2 + local.get 3 + i32.load offset=20 + local.set 5 + block ;; label = @6 + local.get 1 + i32.const 2 + i32.shl + local.tee 6 + if ;; label = @7 + local.get 4 + local.get 5 + local.get 2 + local.get 6 + call 38 + local.tee 1 + i32.eqz + br_if 1 (;@6;) + br 3 (;@4;) + end + local.get 4 + local.get 5 + call 138 + local.get 2 + local.tee 1 + br_if 2 (;@4;) + i32.const 0 + local.set 2 + end + i32.const 1 + br 3 (;@2;) + end + unreachable + end + local.get 0 + local.get 1 + i32.store + local.get 0 + local.get 6 + i32.const 2 + i32.shr_u + i32.store offset=4 + end + i32.const 0 + end + local.get 2 + call 134 + end + local.get 3 + i32.const 32 + i32.add + global.set 0) + (func (;123;) (type 2) (param i32 i32) + (local i32) + local.get 0 + i32.load offset=8 + local.tee 2 + local.get 0 + i32.load offset=4 + i32.eq + if ;; label = @1 + local.get 0 + i32.const 1 + call 118 + local.get 0 + i32.load offset=8 + local.set 2 + end + local.get 0 + i32.load + local.get 2 + i32.const 2 + i32.shl + i32.add + local.get 1 + i32.store + local.get 0 + i32.load offset=8 + local.tee 1 + i32.const 1 + i32.add + local.tee 2 + local.get 1 + i32.ge_u + if ;; label = @1 + local.get 0 + local.get 2 + i32.store offset=8 + return + end + unreachable) + (func (;124;) (type 7) (param i32 i32 i32 i32) (result i32) + (local i32 i32 i32 i64) + local.get 1 + local.get 3 + i32.ge_u + if ;; label = @1 + local.get 0 + local.get 3 + i32.const 2 + i32.shl + i32.add + local.set 6 + local.get 3 + local.set 5 + loop ;; label = @2 + local.get 5 + if ;; label = @3 + local.get 0 + local.get 2 + i64.load32_u + local.get 0 + i64.load32_u + local.get 4 + i64.extend_i32_u + i64.const 255 + i64.and + i64.add + i64.add + local.tee 7 + i64.store32 + local.get 5 + i32.const -1 + i32.add + local.set 5 + local.get 0 + i32.const 4 + i32.add + local.set 0 + local.get 2 + i32.const 4 + i32.add + local.set 2 + local.get 7 + i64.const 32 + i64.shr_u + i32.wrap_i64 + local.set 4 + br 1 (;@2;) + else + i32.const 0 + local.set 5 + block ;; label = @4 + local.get 4 + i32.const 255 + i32.and + i32.eqz + br_if 0 (;@4;) + local.get 1 + i32.const 2 + i32.shl + local.get 3 + i32.const 2 + i32.shl + i32.sub + local.set 0 + loop ;; label = @5 + local.get 0 + i32.eqz + if ;; label = @6 + local.get 4 + local.set 5 + br 2 (;@4;) + end + local.get 6 + local.get 6 + i64.load32_u + local.get 4 + i64.extend_i32_u + i64.const 255 + i64.and + i64.add + local.tee 7 + i64.store32 + local.get 0 + i32.const -4 + i32.add + local.set 0 + local.get 6 + i32.const 4 + i32.add + local.set 6 + i32.const 1 + local.set 4 + local.get 7 + i64.const 4294967296 + i64.and + i64.const 0 + i64.ne + br_if 0 (;@5;) + end + end + local.get 5 + i32.const 255 + i32.and + return + end + unreachable + end + unreachable + end + unreachable) + (func (;125;) (type 3) (param i32 i32 i32) + (local i32 i32 i32 i32 i32 i32 i32 i64) + global.get 0 + i32.const -64 + i32.add + local.tee 3 + global.set 0 + local.get 1 + i64.load align=4 + local.set 10 + block ;; label = @1 + block ;; label = @2 + block ;; label = @3 + block ;; label = @4 + local.get 1 + i32.load offset=8 + local.tee 1 + if ;; label = @5 + local.get 3 + i32.const 28 + i32.add + local.get 1 + i32.store + local.get 3 + i32.const 1 + i32.store offset=16 + local.get 3 + local.get 10 + i64.store offset=20 align=4 + local.get 2 + i32.const 5 + i32.shr_u + local.tee 7 + i32.eqz + br_if 1 (;@4;) + local.get 1 + i32.const 1 + i32.add + local.tee 5 + local.get 1 + i32.lt_u + br_if 2 (;@3;) + local.get 10 + i32.wrap_i64 + local.set 8 + local.get 3 + i32.const 48 + i32.add + i32.const -1 + local.get 5 + local.get 7 + i32.add + local.tee 1 + local.get 1 + local.get 7 + i32.lt_u + select + call 135 + local.get 3 + i32.const 48 + i32.add + local.get 7 + call 118 + local.get 7 + i32.const -1 + i32.add + local.set 6 + local.get 3 + i32.load offset=56 + local.tee 1 + local.get 7 + i32.add + local.set 9 + local.get 3 + i32.load offset=48 + local.get 1 + i32.const 2 + i32.shl + i32.add + local.set 4 + loop ;; label = @6 + local.get 4 + i32.const 0 + i32.store + local.get 1 + i32.const 1 + i32.add + local.tee 5 + local.get 1 + i32.lt_u + br_if 3 (;@3;) + local.get 6 + if ;; label = @7 + local.get 4 + i32.const 4 + i32.add + local.set 4 + local.get 6 + i32.const -1 + i32.add + local.set 6 + local.get 5 + local.set 1 + br 1 (;@6;) + end + end + local.get 3 + local.get 9 + i32.store offset=56 + local.get 3 + i32.const 48 + i32.add + local.get 3 + i32.load offset=28 + local.tee 1 + call 118 + local.get 3 + i32.load offset=48 + local.get 3 + i32.load offset=56 + local.tee 5 + i32.const 2 + i32.shl + i32.add + local.get 8 + local.get 1 + i32.const 2 + i32.shl + call 148 + local.get 1 + local.get 5 + i32.add + local.tee 1 + local.get 5 + i32.lt_u + br_if 2 (;@3;) + local.get 3 + i32.const 40 + i32.add + local.get 1 + i32.store + local.get 3 + local.get 3 + i64.load offset=48 + i64.store offset=32 + i32.const 1 + local.set 5 + br 3 (;@2;) + end + local.get 3 + i32.const 60 + i32.add + i32.const 0 + i32.store + local.get 3 + local.get 10 + i64.store offset=52 align=4 + local.get 3 + i32.const 1 + i32.store offset=48 + local.get 0 + local.get 3 + i32.const 48 + i32.add + call 127 + br 3 (;@1;) + end + local.get 3 + i32.const 56 + i32.add + local.get 3 + i32.const 24 + i32.add + i64.load + i64.store + local.get 3 + local.get 3 + i64.load offset=16 + i64.store offset=48 + local.get 3 + i32.const 32 + i32.add + local.get 3 + i32.const 48 + i32.add + call 127 + br 1 (;@2;) + end + unreachable + end + block ;; label = @2 + local.get 2 + i32.const 31 + i32.and + local.tee 8 + i32.eqz + br_if 0 (;@2;) + local.get 3 + i32.const 8 + i32.add + local.get 3 + i32.const 32 + i32.add + local.get 7 + call 140 + i32.const 0 + local.set 4 + i32.const 0 + local.get 2 + i32.sub + i32.const 31 + i32.and + local.set 2 + local.get 3 + i32.load offset=12 + i32.const 2 + i32.shl + local.set 6 + local.get 3 + i32.load offset=8 + local.set 1 + loop ;; label = @3 + local.get 6 + if ;; label = @4 + local.get 1 + local.get 4 + local.get 1 + i32.load + local.tee 4 + local.get 8 + i32.shl + i32.or + i32.store + local.get 6 + i32.const -4 + i32.add + local.set 6 + local.get 1 + i32.const 4 + i32.add + local.set 1 + local.get 4 + local.get 2 + i32.shr_u + local.set 4 + br 1 (;@3;) + else + local.get 4 + i32.eqz + br_if 2 (;@2;) + local.get 3 + i32.const 32 + i32.add + local.get 4 + call 123 + end + end + end + local.get 3 + i32.const 56 + i32.add + local.get 3 + i32.const 40 + i32.add + i32.load + i32.store + local.get 3 + local.get 3 + i64.load offset=32 + i64.store offset=48 + local.get 0 + local.get 3 + i32.const 48 + i32.add + call 119 + local.get 5 + i32.eqz + br_if 0 (;@1;) + local.get 3 + i32.const 16 + i32.add + i32.const 4 + i32.or + call 113 + end + local.get 3 + i32.const -64 + i32.sub + global.set 0) + (func (;126;) (type 3) (param i32 i32 i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i64 i64 i64 i64 i64 i64 i64 i64) + global.get 0 + i32.const 80 + i32.sub + local.tee 3 + global.set 0 + block ;; label = @1 + local.get 2 + i32.load offset=8 + local.tee 4 + i32.eqz + br_if 0 (;@1;) + local.get 4 + i32.const -2 + i32.add + local.tee 7 + local.get 4 + i32.gt_u + local.get 4 + local.get 7 + i32.le_u + i32.or + br_if 0 (;@1;) + local.get 1 + i32.load offset=8 + local.tee 8 + local.get 4 + i32.sub + local.tee 5 + local.get 8 + i32.gt_u + br_if 0 (;@1;) + local.get 5 + i32.const 1 + i32.add + local.tee 8 + local.get 5 + i32.lt_u + br_if 0 (;@1;) + local.get 2 + i32.load + local.tee 5 + local.get 4 + i32.const 2 + i32.shl + i32.add + i32.const -4 + i32.add + i32.load + local.set 11 + local.get 5 + local.get 7 + i32.const 2 + i32.shl + i32.add + i64.load32_u + local.set 20 + local.get 3 + i32.const 40 + i32.add + local.get 8 + i32.const 1 + call 136 + i64.const 0 + local.get 11 + i64.extend_i32_u + local.tee 17 + i64.sub + local.set 21 + local.get 17 + i64.const 32 + i64.shl + local.set 22 + local.get 3 + i32.load offset=44 + local.set 14 + local.get 3 + i32.load offset=40 + local.set 13 + local.get 8 + local.set 7 + loop ;; label = @2 + block ;; label = @3 + local.get 7 + if ;; label = @4 + local.get 1 + i32.load offset=8 + local.tee 4 + i32.eqz + br_if 3 (;@1;) + local.get 4 + i32.const -2 + i32.add + local.tee 6 + local.get 4 + i32.gt_u + local.get 4 + local.get 6 + i32.le_u + i32.or + br_if 3 (;@1;) + local.get 1 + i32.load + local.tee 5 + local.get 4 + i32.const 2 + i32.shl + i32.add + i32.const -4 + i32.add + i32.load + local.set 4 + local.get 5 + local.get 6 + i32.const 2 + i32.shl + i32.add + i64.load32_u + local.set 16 + block (result i32) ;; label = @5 + local.get 9 + local.get 11 + i32.lt_u + if ;; label = @6 + local.get 3 + i32.const 32 + i32.add + local.get 9 + local.get 4 + local.get 11 + call 121 + local.get 3 + i64.load32_u offset=36 + local.set 15 + local.get 3 + i32.load offset=32 + br 1 (;@5;) + end + local.get 4 + i64.extend_i32_u + local.get 9 + i64.extend_i32_u + i64.add + local.set 15 + i32.const -1 + end + local.set 4 + local.get 7 + i32.const -1 + i32.add + local.set 7 + local.get 15 + local.get 21 + i64.add + local.set 18 + local.get 15 + i64.const 32 + i64.shl + local.set 15 + loop ;; label = @5 + local.get 17 + local.get 18 + i64.add + local.tee 18 + i64.const 4294967296 + i64.ge_u + if ;; label = @6 + local.get 4 + i64.extend_i32_u + local.set 19 + br 3 (;@3;) + end + local.get 15 + local.get 16 + i64.or + local.get 4 + i64.extend_i32_u + local.tee 19 + local.get 20 + i64.mul + i64.ge_u + br_if 2 (;@3;) + local.get 15 + local.get 22 + i64.add + local.set 15 + local.get 4 + i32.const -1 + i32.add + local.get 4 + i32.gt_u + local.get 4 + i32.const -1 + i32.add + local.set 4 + i32.eqz + br_if 0 (;@5;) + end + br 3 (;@1;) + end + local.get 1 + local.get 9 + call 123 + local.get 1 + call 122 + local.get 3 + local.get 8 + i32.store offset=72 + local.get 3 + local.get 14 + i32.store offset=68 + local.get 3 + local.get 13 + i32.store offset=64 + local.get 3 + i32.const -64 + i32.sub + call 122 + local.get 3 + i32.const 56 + i32.add + local.get 3 + i32.load offset=72 + local.tee 2 + i32.store + local.get 3 + local.get 3 + i64.load offset=64 + local.tee 16 + i64.store offset=48 + local.get 0 + i32.const 8 + i32.add + local.get 2 + i32.store + local.get 0 + local.get 16 + i64.store align=4 + local.get 0 + local.get 1 + i64.load align=4 + i64.store offset=12 align=4 + local.get 0 + i32.const 20 + i32.add + local.get 1 + i32.const 8 + i32.add + i32.load + i32.store + local.get 3 + i32.const 80 + i32.add + global.set 0 + return + end + local.get 3 + i32.const 24 + i32.add + local.get 1 + local.get 7 + call 140 + local.get 2 + i32.load offset=8 + local.tee 6 + local.get 3 + i32.load offset=28 + local.tee 5 + local.get 5 + local.get 6 + i32.gt_u + select + local.set 5 + local.get 2 + i32.load + local.set 12 + i32.const -1 + local.set 6 + local.get 3 + i32.load offset=24 + local.set 10 + loop ;; label = @3 + local.get 5 + if ;; label = @4 + local.get 10 + local.get 6 + i64.extend_i32_u + local.get 10 + i64.load32_u + i64.const -4294967296 + i64.or + i64.add + local.get 19 + local.get 12 + i64.load32_u + i64.mul + i64.sub + i64.const -4294967295 + i64.add + local.tee 16 + i64.store32 + local.get 16 + i64.const 32 + i64.shr_u + i32.wrap_i64 + local.set 6 + local.get 12 + i32.const 4 + i32.add + local.set 12 + local.get 5 + i32.const -1 + i32.add + local.set 5 + local.get 10 + i32.const 4 + i32.add + local.set 10 + br 1 (;@3;) + end + end + block ;; label = @3 + local.get 9 + local.get 6 + i32.const -1 + i32.xor + local.tee 6 + i32.ge_u + if ;; label = @4 + local.get 4 + local.set 5 + br 1 (;@3;) + end + local.get 4 + i32.const -1 + i32.add + local.tee 5 + local.get 4 + i32.gt_u + br_if 2 (;@1;) + local.get 3 + i32.const 16 + i32.add + local.get 1 + local.get 7 + call 140 + local.get 6 + local.get 3 + i32.load offset=16 + local.get 3 + i32.load offset=20 + local.get 2 + i32.load + local.get 2 + i32.load offset=8 + call 124 + i32.sub + local.get 6 + i32.gt_u + br_if 2 (;@1;) + end + local.get 8 + local.get 7 + i32.le_u + br_if 1 (;@1;) + local.get 13 + local.get 7 + i32.const 2 + i32.shl + i32.add + local.get 5 + i32.store + local.get 3 + i32.const 8 + i32.add + local.get 1 + call 139 + local.get 3 + i32.load offset=12 + local.set 9 + local.get 3 + i32.load offset=8 + br_if 0 (;@2;) + end + end + unreachable) + (func (;127;) (type 2) (param i32 i32) + (local i32) + local.get 1 + i32.const 4 + i32.add + local.set 2 + local.get 1 + i32.load + i32.const 1 + i32.eq + if ;; label = @1 + local.get 0 + local.get 2 + i64.load align=4 + i64.store align=4 + local.get 0 + i32.const 8 + i32.add + local.get 2 + i32.const 8 + i32.add + i32.load + i32.store + return + end + local.get 0 + local.get 2 + i32.load + call 120) + (func (;128;) (type 2) (param i32 i32) + (local i32) + local.get 0 + i32.load offset=8 + local.tee 2 + local.get 0 + i32.load offset=4 + i32.eq + if (result i32) ;; label = @1 + local.get 0 + i32.const 1 + call 47 + local.get 0 + i32.load offset=8 + else + local.get 2 + end + local.get 0 + i32.load + i32.add + local.get 1 + i32.store8 + local.get 0 + i32.load offset=8 + local.tee 1 + i32.const 1 + i32.add + local.tee 2 + local.get 1 + i32.ge_u + if ;; label = @1 + local.get 0 + local.get 2 + i32.store offset=8 + return + end + unreachable) + (func (;129;) (type 3) (param i32 i32 i32) + (local i32) + global.get 0 + i32.const -64 + i32.add + local.tee 3 + global.set 0 + local.get 3 + i32.const 48 + i32.add + local.get 1 + local.get 2 + call 110 + local.get 3 + i32.const 32 + i32.add + local.get 3 + i32.const 48 + i32.add + i32.const 68789 + i32.const 48 + call 111 + local.get 3 + i32.const 16 + i32.add + local.get 3 + i32.const 32 + i32.add + call 112 + local.get 3 + i32.const 32 + i32.add + call 113 + local.get 3 + i32.const 48 + i32.add + local.get 2 + call 96 + local.get 3 + i32.const 8 + i32.add + local.get 3 + i32.const 48 + i32.add + local.get 3 + i32.load offset=24 + local.tee 1 + call 114 + local.get 3 + i32.load offset=12 + local.get 1 + i32.ne + if ;; label = @1 + unreachable + end + local.get 3 + i32.load offset=8 + local.get 3 + i32.load offset=16 + local.get 1 + call 148 + local.get 0 + i32.const 0 + i32.store + local.get 0 + i32.const 12 + i32.add + local.get 3 + i32.const 56 + i32.add + i32.load + i32.store + local.get 0 + local.get 3 + i64.load offset=48 + i64.store offset=4 align=4 + local.get 3 + i32.const 16 + i32.add + call 17 + local.get 3 + i32.const -64 + i32.sub + global.set 0) + (func (;130;) (type 3) (param i32 i32 i32) + (local i32) + global.get 0 + i32.const -64 + i32.add + local.tee 3 + global.set 0 + local.get 3 + i32.const 48 + i32.add + local.get 1 + local.get 2 + call 110 + local.get 3 + i32.const 32 + i32.add + local.get 3 + i32.const 48 + i32.add + i32.const 68837 + i32.const 48 + call 111 + local.get 3 + i32.const 16 + i32.add + local.get 3 + i32.const 32 + i32.add + call 112 + local.get 3 + i32.const 32 + i32.add + call 113 + local.get 3 + i32.const 48 + i32.add + local.get 2 + call 96 + local.get 3 + i32.const 8 + i32.add + local.get 3 + i32.const 48 + i32.add + local.get 3 + i32.load offset=24 + local.tee 1 + call 114 + local.get 3 + i32.load offset=12 + local.get 1 + i32.ne + if ;; label = @1 + unreachable + end + local.get 3 + i32.load offset=8 + local.get 3 + i32.load offset=16 + local.get 1 + call 148 + local.get 0 + i32.const 0 + i32.store + local.get 0 + i32.const 12 + i32.add + local.get 3 + i32.const 56 + i32.add + i32.load + i32.store + local.get 0 + local.get 3 + i64.load offset=48 + i64.store offset=4 align=4 + local.get 3 + i32.const 16 + i32.add + call 17 + local.get 3 + i32.const -64 + i32.sub + global.set 0) + (func (;131;) (type 3) (param i32 i32 i32) + (local i32) + global.get 0 + i32.const -64 + i32.add + local.tee 3 + global.set 0 + local.get 3 + i32.const 48 + i32.add + local.get 1 + local.get 2 + call 110 + local.get 3 + i32.const 32 + i32.add + local.get 3 + i32.const 48 + i32.add + i32.const 68885 + i32.const 32 + call 111 + local.get 3 + i32.const 16 + i32.add + local.get 3 + i32.const 32 + i32.add + call 112 + local.get 3 + i32.const 32 + i32.add + call 113 + local.get 3 + i32.const 48 + i32.add + local.get 2 + call 96 + local.get 3 + i32.const 8 + i32.add + local.get 3 + i32.const 48 + i32.add + local.get 3 + i32.load offset=24 + local.tee 1 + call 114 + local.get 3 + i32.load offset=12 + local.get 1 + i32.ne + if ;; label = @1 + unreachable + end + local.get 3 + i32.load offset=8 + local.get 3 + i32.load offset=16 + local.get 1 + call 148 + local.get 0 + i32.const 0 + i32.store + local.get 0 + i32.const 12 + i32.add + local.get 3 + i32.const 56 + i32.add + i32.load + i32.store + local.get 0 + local.get 3 + i64.load offset=48 + i64.store offset=4 align=4 + local.get 3 + i32.const 16 + i32.add + call 17 + local.get 3 + i32.const -64 + i32.sub + global.set 0) + (func (;132;) (type 2) (param i32 i32) + (local i32 i32 i32) + block ;; label = @1 + local.get 1 + local.get 1 + i32.const 1073741823 + i32.and + local.tee 2 + i32.ne + if ;; label = @2 + i32.const 0 + local.set 2 + br 1 (;@1;) + end + local.get 1 + local.get 2 + i32.eq + i32.const 2 + i32.shl + local.tee 2 + local.get 1 + i32.const 2 + i32.shl + local.tee 3 + i32.add + i32.const -1 + i32.add + i32.const 0 + local.get 2 + i32.sub + local.tee 4 + i32.and + local.tee 1 + local.get 3 + i32.ge_u + if ;; label = @2 + local.get 2 + i32.popcnt + i32.const 1 + i32.eq + i32.const 0 + local.get 1 + local.get 4 + i32.le_u + select + br_if 1 (;@1;) + unreachable + end + unreachable + end + local.get 0 + local.get 2 + i32.store offset=4 + local.get 0 + local.get 1 + i32.store) + (func (;133;) (type 2) (param i32 i32) + (local i32) + local.get 1 + i32.load offset=4 + local.tee 2 + if ;; label = @1 + local.get 2 + local.get 2 + i32.const 1073741823 + i32.and + i32.eq + if ;; label = @2 + local.get 0 + local.get 2 + i32.const 2 + i32.shl + i32.store offset=4 + local.get 0 + i32.const 8 + i32.add + i32.const 4 + i32.store + local.get 0 + local.get 1 + i32.load + i32.store + return + end + unreachable + end + local.get 0 + i32.const 0 + i32.store) + (func (;134;) (type 2) (param i32 i32) + block ;; label = @1 + local.get 0 + i32.const 1 + i32.eq + if ;; label = @2 + local.get 1 + i32.eqz + br_if 1 (;@1;) + unreachable + end + return + end + unreachable) + (func (;135;) (type 2) (param i32 i32) + (local i32 i64) + global.get 0 + i32.const 16 + i32.sub + local.tee 2 + global.set 0 + local.get 2 + i32.const 8 + i32.add + local.get 1 + i32.const 0 + call 136 + local.get 2 + i64.load offset=8 + local.set 3 + local.get 0 + i32.const 0 + i32.store offset=8 + local.get 0 + local.get 3 + i64.store align=4 + local.get 2 + i32.const 16 + i32.add + global.set 0) + (func (;136;) (type 3) (param i32 i32 i32) + (local i32 i32) + global.get 0 + i32.const 32 + i32.sub + local.tee 3 + global.set 0 + local.get 3 + i32.const 24 + i32.add + local.get 1 + call 132 + block ;; label = @1 + block ;; label = @2 + local.get 3 + i32.load offset=28 + local.tee 1 + i32.eqz + br_if 0 (;@2;) + local.get 3 + i32.load offset=24 + local.tee 4 + i32.const -1 + i32.le_s + br_if 0 (;@2;) + block (result i32) ;; label = @3 + local.get 2 + if ;; label = @4 + local.get 3 + i32.const 8 + i32.add + local.get 4 + local.get 1 + i32.const 1 + call 137 + local.get 3 + i32.load offset=8 + local.set 2 + local.get 3 + i32.load offset=12 + br 1 (;@3;) + end + local.get 3 + i32.const 16 + i32.add + local.get 4 + local.get 1 + i32.const 0 + call 137 + local.get 3 + i32.load offset=16 + local.set 2 + local.get 3 + i32.load offset=20 + end + local.set 1 + local.get 2 + i32.eqz + br_if 1 (;@1;) + local.get 0 + local.get 2 + i32.store + local.get 0 + local.get 1 + i32.const 2 + i32.shr_u + i32.store offset=4 + local.get 3 + i32.const 32 + i32.add + global.set 0 + return + end + unreachable + end + unreachable) + (func (;137;) (type 5) (param i32 i32 i32 i32) + block ;; label = @1 + local.get 1 + if ;; label = @2 + local.get 3 + i32.eqz + if ;; label = @3 + local.get 1 + local.get 2 + call 37 + local.set 2 + br 2 (;@1;) + end + local.get 1 + local.get 2 + call 40 + local.set 2 + br 1 (;@1;) + end + i32.const 0 + local.set 1 + end + local.get 0 + local.get 1 + i32.store offset=4 + local.get 0 + local.get 2 + i32.store) + (func (;138;) (type 2) (param i32 i32) + local.get 1 + if ;; label = @1 + local.get 0 + local.get 1 + call 16 + end) + (func (;139;) (type 2) (param i32 i32) + (local i32) + block (result i32) ;; label = @1 + i32.const 0 + local.get 1 + i32.load offset=8 + local.tee 2 + i32.eqz + br_if 0 (;@1;) + drop + local.get 1 + local.get 2 + i32.const -1 + i32.add + local.tee 2 + i32.store offset=8 + local.get 1 + i32.load + local.get 2 + i32.const 2 + i32.shl + i32.add + i32.load + local.set 2 + i32.const 1 + end + local.set 1 + local.get 0 + local.get 2 + i32.store offset=4 + local.get 0 + local.get 1 + i32.store) + (func (;140;) (type 3) (param i32 i32 i32) + (local i32) + local.get 1 + i32.load offset=8 + local.tee 3 + local.get 2 + i32.lt_u + if ;; label = @1 + unreachable + end + local.get 0 + local.get 3 + local.get 2 + i32.sub + i32.store offset=4 + local.get 0 + local.get 1 + i32.load + local.get 2 + i32.const 2 + i32.shl + i32.add + i32.store) + (func (;141;) (type 0) (param i32 i32 i32) (result i32) + (local i32) + local.get 0 + i32.load16_u offset=4 + local.set 3 + local.get 0 + i32.const 0 + i32.store16 offset=4 + local.get 3 + i32.const 1 + i32.and + i32.eqz + if ;; label = @1 + local.get 0 + i32.load + local.get 1 + local.get 2 + call 105 + return + end + local.get 1 + local.get 3 + i32.const 8 + i32.shr_u + i32.store8 + local.get 0 + i32.load + local.get 1 + i32.const 1 + i32.add + local.get 2 + i32.const -1 + i32.add + call 105) + (func (;142;) (type 1) (param i32 i32) (result i32) + (local i32) + block ;; label = @1 + local.get 0 + local.get 1 + i32.add + local.tee 2 + local.get 0 + i32.lt_u + br_if 0 (;@1;) + local.get 2 + i32.const -1 + i32.add + local.tee 0 + local.get 2 + i32.gt_u + br_if 0 (;@1;) + local.get 0 + local.get 1 + i32.div_u + return + end + unreachable) + (func (;143;) (type 6) (param i32) (result i32) + local.get 0 + i32.const 4 + call 142) + (func (;144;) (type 3) (param i32 i32 i32) + (local i32) + block ;; label = @1 + local.get 1 + i32.const 1073741823 + i32.and + local.get 1 + i32.ne + br_if 0 (;@1;) + local.get 2 + i32.const -64 + i32.sub + local.tee 3 + local.get 2 + i32.lt_u + local.get 3 + i32.const 536870911 + i32.and + local.get 3 + i32.ne + i32.or + br_if 0 (;@1;) + local.get 1 + i32.const 2 + i32.shl + local.tee 1 + local.get 3 + i32.const 3 + i32.shl + local.tee 2 + local.get 1 + local.get 2 + i32.gt_u + select + local.tee 1 + i32.const 8 + i32.add + local.tee 2 + local.get 1 + i32.lt_u + br_if 0 (;@1;) + block (result i32) ;; label = @2 + i32.const 1 + local.get 2 + i32.const 65536 + call 142 + local.tee 1 + memory.grow + local.tee 2 + i32.const -1 + i32.eq + br_if 0 (;@2;) + drop + local.get 2 + i32.const 65535 + i32.and + local.get 2 + i32.ne + local.get 1 + i32.const 65535 + i32.and + local.get 1 + i32.ne + i32.or + br_if 1 (;@1;) + local.get 1 + i32.const 16 + i32.shl + local.tee 3 + i32.const -8 + i32.add + local.get 3 + i32.gt_u + br_if 1 (;@1;) + local.get 2 + i32.const 16 + i32.shl + local.tee 1 + i64.const 0 + i64.store + local.get 1 + i32.const 0 + i32.store offset=8 + local.get 1 + local.get 1 + local.get 3 + i32.add + i32.const 2 + i32.or + i32.store + i32.const 0 + end + local.set 2 + local.get 0 + local.get 1 + i32.store offset=4 + local.get 0 + local.get 2 + i32.store + return + end + unreachable) + (func (;145;) (type 0) (param i32 i32 i32) (result i32) + (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) + local.get 0 + i32.const 2 + i32.shl + local.set 6 + i32.const 0 + local.get 1 + i32.sub + local.set 8 + local.get 0 + i32.const 1073741823 + i32.and + local.get 0 + i32.ne + local.set 9 + local.get 1 + i32.const -1 + i32.add + local.tee 10 + local.get 1 + i32.gt_u + local.set 11 + local.get 2 + i32.load + local.set 0 + loop ;; label = @1 + block ;; label = @2 + local.get 0 + i32.eqz + br_if 0 (;@2;) + local.get 0 + local.set 1 + block ;; label = @3 + loop ;; label = @4 block ;; label = @5 local.get 1 - i32.const 16 - i32.add - call 12 - local.tee 6 - i32.wrap_i64 - local.tee 4 + i32.load offset=8 + local.tee 0 i32.const 1 i32.and - br_if 0 (;@5;) - local.get 6 - i64.const 1099511627775 - i64.and - local.tee 6 - i64.const 32 - i64.shr_u - i32.wrap_i64 - local.set 0 - local.get 6 - i64.const 24 - i64.shr_u - i32.wrap_i64 - local.set 3 - local.get 6 - i64.const 16 - i64.shr_u - i32.wrap_i64 - local.set 2 - block ;; label = @6 + i32.eqz + if ;; label = @6 + local.get 9 + br_if 1 (;@5;) + local.get 1 + i32.load + i32.const -4 + i32.and + local.tee 3 + local.get 1 + i32.sub + i32.const -8 + i32.add + local.tee 5 + local.get 3 + i32.gt_u + br_if 1 (;@5;) + local.get 5 + local.get 6 + i32.lt_u + br_if 3 (;@3;) + local.get 1 + i32.load + i32.const -4 + i32.and + local.tee 3 + local.get 6 + i32.sub + local.tee 12 + local.get 3 + i32.gt_u + local.get 11 + i32.or + br_if 1 (;@5;) + local.get 1 + i32.const 8 + i32.add + local.tee 5 + i32.const 8 + i32.add + local.tee 4 + local.get 5 + i32.lt_u + br_if 1 (;@5;) + local.get 4 + i32.const -64 + i32.sub + local.tee 13 + local.get 4 + i32.lt_u + br_if 1 (;@5;) block ;; label = @7 - local.get 4 - i32.const 8 - i32.shr_u - i32.const 255 + local.get 13 + local.get 8 + local.get 12 i32.and local.tee 4 - i32.const 106 - i32.ne + i32.gt_u if ;; label = @8 - local.get 4 - i32.const 209 - i32.ne - local.get 0 - i32.const 43 - i32.ne - i32.or + local.get 5 + local.get 10 + i32.and + br_if 5 (;@3;) local.get 2 - i32.const 255 + local.get 0 + i32.const -4 i32.and - i32.const 131 - i32.ne + i32.store + local.get 1 + local.get 1 + i32.load + i32.const 1 i32.or - br_if 2 (;@6;) + i32.store + local.get 1 + local.set 0 + br 1 (;@7;) + end + local.get 4 + i32.const -8 + i32.add + local.tee 0 + local.get 4 + i32.gt_u + br_if 2 (;@5;) + local.get 3 + local.get 0 + i32.sub + local.tee 2 + local.get 3 + i32.gt_u + local.get 2 + i32.const -8 + i32.add + local.get 2 + i32.gt_u + i32.or + br_if 2 (;@5;) + local.get 0 + i32.const 0 + i32.store offset=8 + local.get 0 + i64.const 0 + i64.store align=4 + local.get 0 + local.get 1 + i32.load + i32.const -4 + i32.and + i32.store + block ;; label = @8 + local.get 1 + i32.load + local.tee 2 + i32.const -4 + i32.and + local.tee 3 + i32.eqz + br_if 0 (;@8;) + i32.const 0 local.get 3 - i32.const 255 + local.get 2 + i32.const 2 i32.and - i32.const 81 - i32.eq - br_if 1 (;@7;) - br 2 (;@6;) + select + local.tee 2 + i32.eqz + br_if 0 (;@8;) + local.get 2 + local.get 2 + i32.load offset=4 + i32.const 3 + i32.and + local.get 0 + i32.or + i32.store offset=4 end local.get 0 - i32.const 226 - i32.ne - local.get 2 - i32.const 255 + local.get 0 + i32.load offset=4 + i32.const 3 i32.and - i32.const 55 - i32.ne + local.get 1 i32.or - br_if 1 (;@6;) + i32.store offset=4 + local.get 1 + local.get 1 + i32.load offset=8 + i32.const -2 + i32.and + i32.store offset=8 + local.get 1 + local.get 1 + i32.load + local.tee 2 + i32.const 3 + i32.and + local.get 0 + i32.or + local.tee 3 + i32.store + local.get 2 i32.const 2 - local.set 2 - local.get 3 - i32.const 255 i32.and - i32.const 18 - i32.ne - br_if 1 (;@6;) - br 2 (;@5;) + if ;; label = @8 + local.get 1 + local.get 3 + i32.const -3 + i32.and + i32.store + local.get 0 + local.get 0 + i32.load + i32.const 2 + i32.or + i32.store + end + local.get 0 + local.get 0 + i32.load + i32.const 1 + i32.or + i32.store end - i32.const 3 - local.set 2 - local.get 1 - i32.const 16 + local.get 0 + i32.const 8 i32.add - call 8 - i32.const 255 + local.set 7 + br 4 (;@2;) + end + local.get 1 + local.get 0 + i32.const -2 + i32.and + i32.store offset=8 + block (result i32) ;; label = @6 + i32.const 0 + local.get 1 + i32.load offset=4 + i32.const -4 i32.and local.tee 0 - i32.const 2 - i32.eq - br_if 1 (;@5;) - local.get 0 + i32.eqz + br_if 0 (;@6;) + drop i32.const 0 - i32.ne - local.set 2 - br 1 (;@5;) + local.get 0 + local.get 0 + i32.load8_u + i32.const 1 + i32.and + select end - i32.const 3 - local.set 2 - end - i32.const 6 - local.get 2 - i32.const 3 - i32.eq - local.tee 3 - br_if 2 (;@2;) - drop - i32.const 6 - local.get 2 - local.get 3 - select - local.tee 2 - i32.const 2 - i32.eq - if ;; label = @5 - local.get 1 - i32.const 40 - i32.add - i64.const 0 - i64.store - local.get 1 - i32.const 32 - i32.add - i64.const 0 - i64.store + local.set 0 local.get 1 - i32.const 24 - i32.add - i64.const 0 - i64.store + call 146 local.get 1 - i64.const 0 - i64.store offset=16 - i32.const 0 + i32.load8_u + i32.const 2 + i32.and + if ;; label = @6 + local.get 0 + local.get 0 + i32.load + i32.const 2 + i32.or + i32.store + end + local.get 2 + local.get 0 + i32.store + local.get 0 + local.tee 1 + i32.load + i32.const -4 + i32.and + local.tee 0 local.get 1 - i32.const 16 + i32.sub + i32.const -8 i32.add - call 9 - i32.const 8 - br 3 (;@2;) + local.get 0 + i32.le_u + br_if 1 (;@4;) end - local.get 1 - i32.const 40 - i32.add - i64.const 0 - i64.store - local.get 1 - i32.const 32 - i32.add - i64.const 0 - i64.store - local.get 1 - i32.const 24 - i32.add - i64.const 0 - i64.store - local.get 1 - i64.const 0 - i64.store offset=16 - local.get 2 - i32.const 1 - i32.and - local.get 1 - i32.const 16 - i32.add - call 9 - i32.const 8 - br 2 (;@2;) end - i32.const 1 - local.set 2 - i32.const 1 - local.set 3 + unreachable end - i32.const 6 local.get 2 - br_if 0 (;@2;) - drop - local.get 3 - i32.eqz - br_if 1 (;@1;) - local.get 1 - i32.const 40 - i32.add - i64.const 0 - i64.store - local.get 1 - i32.const 32 - i32.add - i64.const 0 - i64.store - local.get 1 - i32.const 24 - i32.add - i64.const 0 - i64.store - local.get 1 - i64.const 0 - i64.store offset=16 - local.get 1 - i32.const 16 - i32.add - call 5 - i32.const 1 - i32.xor - local.get 1 - i32.const 16 - i32.add - call 9 - i32.const 8 - end - local.get 1 - i32.const 48 - i32.add - global.set 0 - return + local.get 0 + i32.store + br 1 (;@1;) + end end - local.get 1 - i32.const 40 - i32.add - i64.const 0 - i64.store - local.get 1 - i32.const 32 - i32.add - i64.const 0 - i64.store - local.get 1 - i32.const 24 - i32.add - i64.const 0 - i64.store - local.get 1 - i64.const 0 - i64.store offset=16 - local.get 1 - local.get 1 - i32.const 16 - i32.add - call 5 - i32.store8 offset=8 - local.get 1 - i32.const 8 - i32.add - call 13 - unreachable) - (func (;18;) (type 4) (result i32) - (local i32 i32 i64 i64) - global.get 0 - i32.const 32 - i32.sub - local.tee 0 - global.set 0 - local.get 0 - i32.const 16384 - i32.store offset=4 - local.get 0 - i32.const 65572 - i32.store - local.get 0 - i32.const 16384 - i32.store offset=16 - i32.const 65572 - local.get 0 - i32.const 16 - i32.add - call 2 - local.get 0 - local.get 0 - i32.load offset=16 - call 7 - local.get 0 - local.get 0 - i64.load - i64.store offset=8 - local.get 0 - i32.const 24 - i32.add - local.tee 1 - i64.const 0 - i64.store - local.get 0 - i64.const 0 - i64.store offset=16 - block (result i32) ;; label = @1 - i32.const 1 - local.get 0 - i32.const 8 - i32.add + local.get 7) + (func (;146;) (type 4) (param i32) + (local i32 i32) + block ;; label = @1 local.get 0 - i32.const 16 - i32.add - i32.const 16 - call 19 + i32.load + local.tee 1 + i32.const -4 + i32.and + local.tee 2 + i32.eqz br_if 0 (;@1;) - drop + i32.const 0 + local.get 2 local.get 1 - i64.load - local.set 2 + i32.const 2 + i32.and + select + local.tee 1 + i32.eqz + br_if 0 (;@1;) + local.get 1 + local.get 1 + i32.load offset=4 + i32.const 3 + i32.and local.get 0 - i64.load offset=16 - local.set 3 - i32.const 0 + i32.load offset=4 + i32.const -4 + i32.and + i32.or + i32.store offset=4 end - local.get 2 - local.get 3 - i64.or - i64.eqz - i32.eqz - i32.or - i32.eqz - if ;; label = @1 - i32.const 1 - call 17 - local.get 0 - i32.const 32 - i32.add - global.set 0 - i32.const 255 + local.get 0 + local.get 0 + i32.load offset=4 + local.tee 1 + i32.const -4 + i32.and + local.tee 2 + if (result i32) ;; label = @1 + local.get 2 + local.get 2 + i32.load + i32.const 3 i32.and - i32.const 2 - i32.shl - i32.const 65536 - i32.add + local.get 0 i32.load - return - end - unreachable) - (func (;19;) (type 5) (param i32 i32 i32) (result i32) - block ;; label = @1 + i32.const -4 + i32.and + i32.or + i32.store local.get 0 i32.load offset=4 + else + local.get 1 + end + i32.const 3 + i32.and + i32.store offset=4 + local.get 0 + local.get 0 + i32.load + i32.const 3 + i32.and + i32.store) + (func (;147;) (type 2) (param i32 i32) + (local i32) + loop (result i32) ;; label = @1 + local.get 1 local.get 2 - i32.ge_u + i32.eq if (result i32) ;; label = @2 - local.get 1 - local.get 0 - i32.load - local.get 2 - call 21 - local.get 0 - i32.load offset=4 - local.tee 1 - local.get 2 - i32.lt_u - br_if 1 (;@1;) - local.get 0 - local.get 1 - local.get 2 - i32.sub - i32.store offset=4 local.get 0 + else local.get 0 - i32.load local.get 2 i32.add - i32.store i32.const 0 - else + i32.store8 + local.get 2 i32.const 1 + i32.add + local.set 2 + br 1 (;@1;) end - return end - unreachable) - (func (;20;) (type 3) (param i32) - (local i32) - global.get 0 - i32.const 16 - i32.sub - local.tee 1 - global.set 0 - local.get 1 - local.get 0 - i32.load offset=4 - i32.store offset=12 - local.get 0 - i32.load - local.get 1 - i32.const 12 - i32.add - call 3 - local.get 0 - local.get 1 - i32.load offset=12 - call 7 - local.get 1 - i32.const 16 - i32.add - global.set 0) - (func (;21;) (type 1) (param i32 i32 i32) + drop) + (func (;148;) (type 3) (param i32 i32 i32) (local i32) loop (result i32) ;; label = @1 local.get 2 @@ -1116,7 +17841,102 @@ end end drop) + (func (;149;) (type 3) (param i32 i32 i32) + block ;; label = @1 + local.get 1 + local.get 0 + i32.ge_u + if ;; label = @2 + loop ;; label = @3 + local.get 2 + i32.eqz + br_if 2 (;@1;) + local.get 0 + local.get 1 + i32.load8_u + i32.store8 + local.get 0 + i32.const 1 + i32.add + local.set 0 + local.get 1 + i32.const 1 + i32.add + local.set 1 + local.get 2 + i32.const -1 + i32.add + local.set 2 + br 0 (;@3;) + end + unreachable + end + local.get 1 + i32.const -1 + i32.add + local.set 1 + local.get 0 + i32.const -1 + i32.add + local.set 0 + loop ;; label = @2 + local.get 2 + i32.eqz + br_if 1 (;@1;) + local.get 0 + local.get 2 + i32.add + local.get 1 + local.get 2 + i32.add + i32.load8_u + i32.store8 + local.get 2 + i32.const -1 + i32.add + local.set 2 + br 0 (;@2;) + end + unreachable + end) + (func (;150;) (type 0) (param i32 i32 i32) (result i32) + (local i32 i32) + loop ;; label = @1 + local.get 2 + i32.eqz + if ;; label = @2 + i32.const 0 + return + end + local.get 2 + i32.const -1 + i32.add + local.set 2 + local.get 1 + i32.load8_u + local.set 3 + local.get 0 + i32.load8_u + local.set 4 + local.get 0 + i32.const 1 + i32.add + local.set 0 + local.get 1 + i32.const 1 + i32.add + local.set 1 + local.get 3 + local.get 4 + i32.eq + br_if 0 (;@1;) + end + local.get 4 + local.get 3 + i32.sub) + (table (;0;) 34 34 funcref) (global (;0;) (mut i32) (i32.const 65536)) - (export "deploy" (func 16)) - (export "call" (func 18)) - (data (;0;) (i32.const 65536) "\01\00\00\00\02\00\00\00\03\00\00\00\04\00\00\00\05\00\00\00\06\00\00\00\07\00\00\00\08")) + (export "deploy" (func 28)) + (export "call" (func 30)) + (elem (;0;) (i32.const 1) func 90 99 81 94 65 43 44 46 48 43 56 43 63 43 62 43 64 43 83 84 85 43 86 87 88 43 93 43 97 43 100 43 98) + (data (;0;) (i32.const 65536) "\01\00\00\00\02\00\00\00\03\00\00\00\04\00\00\00\05\00\00\00\06\00\00\00\07\00\00\00\08\00\00\00\00\00\00\00\06\00\00\00\04\00\00\00\04\00\00\00\07\00\00\00\08\00\00\00\09\00\00\00IoError\00\0a\00\00\00\04\00\00\00\04\00\00\00\0b\00\00\00NotEnoughSpaceUnexpectedFlagskind\00\00\00\0c\00\00\00\04\00\00\00\04\00\00\00\0d\00\00\00error\00\00\00\0e\00\00\00\04\00\00\00\04\00\00\00\0f\00\00\00UnexpectedEofNotFoundPermissionDeniedConnectionRefusedConnectionResetConnectionAbortedNotConnectedAddrInUseAddrNotAvailableBrokenPipeAlreadyExistsWouldBlockInvalidInputInvalidDataTimedOutWriteZeroInterruptedOtherKind\10\00\00\00\01\00\00\00\01\00\00\00\11\00\00\000x00010203040506070809101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899]\0a\12\00\00\00\0c\00\00\00\04\00\00\00\13\00\00\00\14\00\00\00\15\00\00\00,\0a, \16\00\00\00\04\00\00\00\04\00\00\00\17\00\00\00\18\00\00\00\19\00\00\00 [ }}\00\03\00\00\83\04 \00\91\05`\00]\13\a0\00\12\17\a0\1e\0c \e0\1e\ef, +*0\a0+o\a6`,\02\a8\e0,\1e\fb\e0-\00\fe\a05\9e\ff\e05\fd\01a6\01\0a\a16$\0da7\ab\0e\e18/\18!90\1caF\f3\1e\a1J\f0jaNOo\a1N\9d\bc!Oe\d1\e1O\00\da!P\00\e0\e1Q0\e1aS\ec\e2\a1T\d0\e8\e1T \00.U\f0\01\bfU\00p\00\07\00-\01\01\01\02\01\02\01\01H\0b0\15\10\01e\07\02\06\02\02\01\04#\01\1e\1b[\0b:\09\09\01\18\04\01\09\01\03\01\05+\03w\0f\01 7\01\01\01\04\08\04\01\03\07\0a\02\1d\01:\01\01\01\02\04\08\01\09\01\0a\02\1a\01\02\029\01\04\02\04\02\02\03\03\01\1e\02\03\01\0b\029\01\04\05\01\02\04\01\14\02\16\06\01\01:\01\01\02\01\04\08\01\07\03\0a\02\1e\01;\01\01\01\0c\01\09\01(\01\03\019\03\05\03\01\04\07\02\0b\02\1d\01:\01\02\01\02\01\03\01\05\02\07\02\0b\02\1c\029\02\01\01\02\04\08\01\09\01\0a\02\1d\01H\01\04\01\02\03\01\01\08\01Q\01\02\07\0c\08b\01\02\09\0b\06J\02\1b\01\01\01\01\017\0e\01\05\01\02\05\0b\01$\09\01f\04\01\06\01\02\02\02\19\02\04\03\10\04\0d\01\02\02\06\01\0f\01\00\03\00\03\1d\03\1d\02\1e\02@\02\01\07\08\01\02\0b\09\01-\03w\02\22\01v\03\04\02\09\01\06\03\db\02\02\01:\01\01\07\01\01\01\01\02\08\06\0a\02\010\11?\040\07\01\01\05\01(\09\0c\02 \04\02\02\01\038\01\01\02\03\01\01\03:\08\02\02\98\03\01\0d\01\07\04\01\06\01\03\02\c6:\01\05\00\01\c3!\00\03\8d\01` \00\06i\02\00\04\01\0a \02P\02\00\01\03\01\04\01\19\02\05\01\97\02\1a\12\0d\01&\08\19\0b.\030\01\02\04\02\02'\01C\06\02\02\02\02\0c\01\08\01/\013\01\01\03\02\02\05\02\01\01*\02\08\01\ee\01\02\01\04\01\00\01\00\10\10\10\00\02\00\01\e2\01\95\05\00\03\01\02\05\04(\03\04\01\a5\02\00\04\00\02\99\0b\b0\016\0f8\031\04\02\02E\03$\05\01\08>\01\0c\024\09\0a\04\02\01_\03\02\01\01\02\06\01\a0\01\03\08\15\029\02\01\01\01\01\16\01\0e\07\03\05\c3\08\02\03\01\01\17\01Q\01\02\06\01\01\02\01\01\02\01\02\eb\01\02\04\06\02\01\02\1b\02U\08\02\01\01\02j\01\01\01\02\06\01\01e\03\02\04\01\05\00\09\01\02\f5\01\0a\02\01\01\04\01\90\04\02\02\04\01 \0a(\06\02\04\08\01\09\06\02\03.\0d\01\02\00\07\01\06\01\01R\16\02\07\01\02\01\02z\06\03\01\01\02\01\07\01\01H\02\03\01\01\01\00\02\00\05;\07\00\01?\04Q\01\00\02\00\01\01\03\04\05\08\08\02\07\1e\04\94\03\007\042\08\01\0e\01\16\05\01\0f\00\07\01\11\02\07\01\02\01\05\00\07\00\04\00\07m\07\00`\80\f0\00\00\01\03\05\05\06\06\03\07\06\08\08\09\11\0a\1c\0b\19\0c\14\0d\10\0e\0d\0f\04\10\03\12\12\13\09\16\01\17\05\18\02\19\03\1a\07\1c\02\1d\01\1f\16 \03+\03,\02-\0b.\010\031\022\01\a7\02\a9\02\aa\04\ab\08\fa\02\fb\05\fd\04\fe\03\ff\09\adxy\8b\8d\a20WX\8b\8c\90\1c\1d\dd\0e\0fKL\fb\fc./?\5c]_\b5\e2\84\8d\8e\91\92\a9\b1\ba\bb\c5\c6\c9\ca\de\e4\e5\ff\00\04\11\12)147:;=IJ]\84\8e\92\a9\b1\b4\ba\bb\c6\ca\ce\cf\e4\e5\00\04\0d\0e\11\12)14:;EFIJ^de\84\91\9b\9d\c9\ce\cf\0d\11)EIWde\8d\91\a9\b4\ba\bb\c5\c9\df\e4\e5\f0\0d\11EIde\80\84\b2\bc\be\bf\d5\d7\f0\f1\83\85\8b\a4\a6\be\bf\c5\c7\ce\cf\da\dbH\98\bd\cd\c6\ce\cfINOWY^_\89\8e\8f\b1\b6\b7\bf\c1\c6\c7\d7\11\16\17[\5c\f6\f7\fe\ff\80\0dmq\de\df\0e\0f\1fno\1c\1d_}~\ae\af\bb\bc\fa\16\17\1e\1fFGNOXZ\5c^~\7f\b5\c5\d4\d5\dc\f0\f1\f5rs\8ftu\96/_&./\a7\af\b7\bf\c7\cf\d7\df\9a@\97\980\8f\1f\c0\c1\ce\ffNOZ[\07\08\0f\10'/\ee\efno7=?BE\90\91\fe\ffSgu\c8\c9\d0\d1\d8\d9\e7\fe\ff\00 _\22\82\df\04\82D\08\1b\04\06\11\81\ac\0e\80\ab5(\0b\80\e0\03\19\08\01\04/\044\04\07\03\01\07\06\07\11\0aP\0f\12\07U\07\03\04\1c\0a\09\03\08\03\07\03\02\03\03\03\0c\04\05\03\0b\06\01\0e\15\05:\03\11\07\06\05\10\07W\07\02\07\15\0dP\04C\03-\03\01\04\11\06\0f\0c:\04\1d%_ m\04j%\80\c8\05\82\b0\03\1a\06\82\fd\03Y\07\15\0b\17\09\14\0c\14\0cj\06\0a\06\1a\06Y\07+\05F\0a,\04\0c\04\01\031\0b,\04\1a\06\0b\03\80\ac\06\0a\06!?L\04-\03t\08<\03\0f\03<\078\08+\05\82\ff\11\18\08/\11-\03 \10!\0f\80\8c\04\82\97\19\0b\15\88\94\05/\05;\07\02\0e\18\09\80\b3-t\0c\80\d6\1a\0c\05\80\ff\05\80\df\0c\ee\0d\03\84\8d\037\09\81\5c\14\80\b8\08\80\cb*8\03\0a\068\08F\08\0c\06t\0b\1e\03Z\04Y\09\80\83\18\1c\0a\16\09L\04\80\8a\06\ab\a4\0c\17\041\a1\04\81\da&\07\0c\05\05\80\a5\11\81m\10x(*\06L\04\80\8d\04\80\be\03\1b\03\0f\0d\00\06\01\01\03\01\04\02\08\08\09\02\0a\05\0b\02\0e\04\10\01\11\02\12\05\13\11\14\01\15\02\17\02\19\0d\1c\05\1d\08$\01j\03k\02\bc\02\d1\02\d4\0c\d5\09\d6\02\d7\02\da\01\e0\05\e1\02\e8\02\ee \f0\04\f8\02\f9\02\fa\02\fb\01\0c';>NO\8f\9e\9e\9f\06\07\096=>V\f3\d0\d1\04\14\1867VW\7f\aa\ae\af\bd5\e0\12\87\89\8e\9e\04\0d\0e\11\12)14:EFIJNOde\5c\b6\b7\1b\1c\07\08\0a\0b\14\1769:\a8\a9\d8\d9\097\90\91\a8\07\0a;>fi\8f\92o_\ee\efZb\9a\9b'(U\9d\a0\a1\a3\a4\a7\a8\ad\ba\bc\c4\06\0b\0c\15\1d:?EQ\a6\a7\cc\cd\a0\07\19\1a\22%>?\c5\c6\04 #%&(38:HJLPSUVXZ\5c^`cefksx}\7f\8a\a4\aa\af\b0\c0\d0\ae\afy\ccno\93^\22{\05\03\04-\03f\03\01/.\80\82\1d\031\0f\1c\04$\09\1e\05+\05D\04\0e*\80\aa\06$\04$\04(\084\0b\01\80\90\817\09\16\0a\08\80\989\03c\08\090\16\05!\03\1b\05\01@8\04K\05/\04\0a\07\09\07@ '\04\0c\096\03:\05\1a\07\04\0c\07PI73\0d3\07.\08\0a\81&RN(\08*V\1c\14\17\09N\04\1e\0fC\0e\19\07\0a\06H\08'\09u\0b?A*\06;\05\0a\06Q\06\01\05\10\03\05\80\8bb\1eH\08\0a\80\a6^\22E\0b\0a\06\0d\139\07\0a6,\04\10\80\c0\91\e67\a4\f0\ea\ae\f8\0c\16\f8\a8gV\c2\16\a1\98.\ff\ebs\dc\d3\dcq\90\fd\f9\12\ed\c8\89\86\04#\b4%\ff\ba\ce\03\19\e9\84\e58\a6{pA\be\87\80\efu\82R\88F\d1\81j\18&\b9>\ff\fa\04@\c9\87\d1\0a\ce\83\fb$\e8\22\01\ab\aa\ff\ff\ff\ff\fe\b9\ff\ffS\b1\fe\ff\ab\1e$\f6\b0\f6\a0\d20g\bf\12\85\f3\84Kwd\d7\acKC\b6\a7\1bK\9a\e6\7f9\ea\11\01\1a\01\00\00\00\00\c0\08\85\00\00\000D]\0b\17\00H\09\ba/b\f3\1e\8f\13\f5\00\f3\d9\22\1a;I\a1l\c0\05;\c6\ea\10\c5\17F:\ae\01G\fd|\d8\16\8c <\8d\caqh\91j\81\97]X\81\81\b6EP\b8)\a01\e1rNd0\00\00\00@\0d\01\00\00\00\00\00H\0d\01\00\11\00\00\00Invalid curve id \00\00\00\01\00\00\00Error")) diff --git a/pallets/template/src/benchmarking.rs b/pallets/template/src/benchmarking.rs index faa4df7e..1727f0c7 100644 --- a/pallets/template/src/benchmarking.rs +++ b/pallets/template/src/benchmarking.rs @@ -68,6 +68,7 @@ benchmarks! { // Calculate addr let addr = Contracts::::contract_address(&caller, &hash, &b"".to_vec()); + let data = hex::decode().expect("Decode failed"); }: call(origin, addr, endowment, Weight::max_value(), vec![192, 150, 165, 243]) wasm_bls12_377_add { diff --git a/pallets/template/src/mock.rs b/pallets/template/src/mock.rs index 5904e685..233ecb2c 100644 --- a/pallets/template/src/mock.rs +++ b/pallets/template/src/mock.rs @@ -1,9 +1,11 @@ use crate::Config; -use frame_support::{impl_outer_event, impl_outer_origin, parameter_types, weights::Weight}; +use frame_support::{ + impl_outer_event, impl_outer_origin, parameter_types, traits::Currency, weights::Weight, +}; use frame_system as system; use sp_runtime::{ testing::{Header, H256}, - traits::{BlakeTwo256, Convert, IdentityLookup}, + traits::{BlakeTwo256, Convert, Hash, IdentityLookup}, AccountId32, Perbill, }; @@ -166,3 +168,22 @@ impl ExtBuilder { ext } } + +/// Compile groth16 with test data +pub fn groth16_addr(caller: AccountId32) -> AccountId32 { + let module = include_bytes!(concat!(env!("OUT_DIR"), "/groth16.wasm")).to_vec(); + let hash = ::Hashing::hash(&module); + let _ = crate::mock::Balances::deposit_creating(&caller, 100_000_000_000_000); + Contracts::put_code(Origin::signed(caller.clone()), module).unwrap(); + Contracts::instantiate( + Origin::signed(ALICE.clone()), + 1_000_000, // endowment + Weight::max_value(), // gas_limit + hash.clone(), // code_hash + [106, 55, 18, 226].to_vec(), // flip + b"".to_vec(), // salt + ) + .unwrap(); + let addr = Contracts::contract_address(&ALICE, &hash, &b"".to_vec()); + addr +} diff --git a/pallets/template/src/tests.rs b/pallets/template/src/tests.rs index 7b749aeb..10be8271 100644 --- a/pallets/template/src/tests.rs +++ b/pallets/template/src/tests.rs @@ -1,52 +1,68 @@ #![cfg(test)] use crate::{mock::*, Module}; -use contract::{ConfigCache, Gas}; -use frame_support::{assert_ok, traits::Currency, weights::Weight}; -use sp_runtime::traits::{Hash, Zero}; - -const GAS_LIMIT: Gas = 10_000_000_000; +use frame_support::{assert_ok, weights::Weight}; #[test] -fn test_build() { +fn test_verify_bls12_377() { ExtBuilder::default() .existential_deposit(50) .build() .execute_with(|| { - let _ = crate::mock::Balances::deposit_creating(&ALICE, 100_000_000); - let module = include_bytes!(concat!(env!("OUT_DIR"), "/groth16.wasm")).to_vec(); - let hash = ::Hashing::hash(&module); - Contracts::put_code(Origin::signed(ALICE.clone()), module).unwrap(); + let addr = groth16_addr(ALICE); + assert_ok!(>::call( + Origin::signed(ALICE), + addr.clone(), + 0, + Weight::max_value(), + hex::decode("4e1f2d8108850171c5a779bb19e0aeb6030768f5001017bbd4edb645306ff1591424c501e7aa8b480fc18d8ed404c893d473afa9b82c01fb3e19bdf85f4fb8acf97d1507b75eb48972c8a10e13f4637f7bee71f89eafc141453e4646c82e188d9ef8cf71fa2f000085014d0869345487bb4070110fa318b0f408dcffce12304589878797615d8a72cc00b6a1e3f50cc0e59770638640090726013db560d3a19288ecedc60ed9ee0afd50ad3ac96db89d99fc249b85a453ef837e9213f8977ac572d818dc43387678a50100910a54f796d78550d14c4ee03cd5915fd8037569696f878312b0093f0149919fc717c0b3f8a2d419fad0edde7e1d55cd2f002c312b660250225a00baf5df511dcce61eb23b28f3980be7fcde0091284670e9064015f452f244e65cad047a20fdd000ca76892d04e1283e575e098c8e4281ba9113443515f22247921b9c3189dc03dd83cf22b9da3eda70cdd2644a795376002e0b1d0d1d5945dab12a28a31497b48d07739028ac3153be3cf367e3d7e788ac43f6d3ccd3c5c20a4f2d6b0db05ce40000f70cb4191a256ed9a4d90305f5864993032a0e40433040c259b14c8069d117f3491d75d993271a0a3f13efdd5b18ce006d90eff3b45f8fa10b43a2d4fb80a554304ba5d94ddc19c92b2e1e2f756bd3042c4c0d6e10b6c22c2ea5eb136fb42900aca080ed5cfa9ccf92da7e4f631f1f9fd52a4dd227898e21585a7a55656f6315fa3f1e541011b941084fb663515ede0024ff6c7745872af24c5de2acfbf4b7a238f3f80face2310d83d9e953de2051a70abc3be988220291e03c92840e1c1c01005720823639fe8f3818ade6c24c6d6ed8f78b87369a9fac8a548e01ca001e424ba931033958641fe06677c3f4a1b39f01f6d3e9a2052ad1185af9a80086665df50b41674f7f6f181773cee6e78d09ea34ce970ccb5907d5cb2f69c9e0ed8d1f01009d629094c47bdf026bbd3424f6e7748b0c3529b495cf24677f309d9f1ed7d3435513224cba204902fd733522b3b855015f395e5b2a7f0fe9e50665d705c48f9b8b20a3f9619f50c1dcddbea7c4a561cdffed750045f875b2d2c569e8d5d0320015e739c8881a211865f82e39bb6ad21a66ceb1808a5ecc3f11833d61dc938a3b160b1b1829527b52e9d3d98800f29701078dfc5fda2f3dcebaca0f43ac23f6da5044f51cf12ac8b3439df503ab1732f5047601b2cd9d93e6d161dc4719beda00000d06e2342d048b06618cfc80a5fb5301373032d5780ca45e5287e824fd1d3dccfc36d1befe73edaea7378968a003f94e1801de729f41f406c7d94db4995cc2956cdd6b250937dd52b3c8ac812dff25985eb802c727dbfb7c6b055db545d687b1bd000090f4ad7dc16060ebfbe2bff08077e404e878850682e15f64a5b0f243f53a6d61dc358d41fa6aed615c6296904d71c200c04fe75b3adbecdc3d00df22556a1c949e4b87c81483225f6eaa7560e3035a1c919c4a0d446125dca2e2ef541d58a200ec9b0644bea1bd34e84ff04b65c0cc8733d425b43225f81a7580e1027a41b4ce85eb513213f54a76e2b69320dc6d51003b06cb148aa149b0b0e1ffb8f5901adbda3e431c19404cae29f26aac97085c6d1d8eeef33024aafdc649da6475ab99000026b3bb740a34b4db3a1c689d471b5a7834bb27fd57108bca8cd88d12bb81eae5f8ad807e5de758978ab51d0146017100c31d5c7971576e79eec56286dc2602025cb1d0a01e1acdc23a8aece6e9f3c3ecf97d0a9667634e31e79f653a93c13b01000480a4961fec1c734055a80af91b3fd7405a2cdb741e1867aa7f783ca0959a077110").expect("Decode failed"))); + }); +} - let storage_size = ConfigCache::::subsistence_threshold_uncached() - .checked_div(::RentDepositOffset::get()) - .unwrap_or_else(Zero::zero); +#[test] +fn test_verify_bls12_381() { + ExtBuilder::default() + .existential_deposit(50) + .build() + .execute_with(|| { + let addr = groth16_addr(ALICE); + assert_ok!(>::call( + Origin::signed(ALICE), + addr.clone(), + 0, + Weight::max_value(), + hex::decode("99a06637088501e60f6032ed7f170ba3481c5d99c0890554c808ad380a7c9aefc9e62eeecf0363ecef5e59ba8eaf6dd0af40e08d7cfd024314f90080a1461a207aa3098308149837bc6322a8f4b499671c507203e798f90a9aa8fafaebb806c8708c3207a93316008501ea7f398187aecf2721441218e54645b17acd35bdf65886255e772a58353ef2e25c92cf7f872bea5afca6081d03e6b115e74befd85720c241ee5ef038621a1cc72e329db9aebec0faf480e83cbd9e4b735650ab0cce2e321d64311bd34bca9e0200910a9094c864d37f890720969430f2682ccc76dc83f9234694590bd334b40dbfa7f28de40e914571d8ae2a88712844f86f0d6dd2f4875120f66304bfcedd55c9a805310155a5345ddc626cbb6fe5ce7026be174a08c798e4d1f1010f97138c30b10a0e23d3cde62852c7b2aabcd7603f87fc54cb0c2fcfa48a1a6e07ea917eec248284a1409dd21ae7bd64b862e7df91fd0af1f36857260a843ea18cd393172b91196ca17bc5f37efb126d585abfcf23b8438d72f90365c382b661256d7caa361d07000c06c5cc02155140b97283cc024daf57023a781a9115bb6e17350264f8b52784a6008921402af8c05dd39f4b789bd50435d2c5aefeb6dc9817af41f45779e3a2d80ab98ef923723b938566747c10a4a169ca5097c5d5073449c3d2e65e16291850a5721416e102df69729ffab67cf948ca51c4ac4c2b54c521552fd4a5a5462d6d3b77ba9932aba0fda8ea8da76e5b0b9166ba600f9c5cc5e442b64ed560c126f8b88e2761c0c6a17a4dcbc1a132a975683ed0b6018ac45d7f4942ad7831790e00408697568bc15871da494a2fe12199531130a8a5b96f07c69020dc01bf9f3ed043a6e1bd08f8d7826c7d5c0fc5c771195ab91bf6eeaa33cbd89cd7dce7930b383c2453d0cca5c227e1b97b1ae253e40cadf4468d6d86f0bf69a0b0bb55774219005b6d86316ea7c1dc4df3e3396a9f78aadf416d5af1619883f5dbbf0a39c6743b194e5adedda54d7cb3ae33e556602e19dd43a31bca7bdb15ad5245dc1ad0affb97edc8f35bb00d1c5b417a132d5be9b72a39870193b6a142198a888c0fe3760fdf1467c7208394270f2aff044c5c002d6cf189a28e34851dc434933e73e07482dad6c7ab931bfbdf29f5d51a6a866d028b91cd89abc9728cf2f8e139f612b5a248ca0758365d1d83c6bc299152b15a89b136e804ae71174d4f35970be570fd14000d06fcafa9753aee681f006d7bf6fc885dcc1a70c33bbfe92bb581ac51e1325b782b1128b1586767cb2ea27555e243abd213634b87418421a65002e06fd9347b23205761d7e35a2a83ffcd35b16b6bf23982700597f2ed9706ae5e039542e8eabd1800443cc8d6ffec17c44207dd41e8ab2f2f2c663f5ed9ab724321de43cbe2ea81908c13643c42a41be1adbc5076e4927b13046d3cdaf5ef775ee48d842599508178276cd41d30e289cbd1d2bb9f92f59b520138fef3e9529139f3961f40f6ea92113ed1701b0eb62a8b21b0852f5ae0d23b4d8cf7a02a69b04abbf0b9213cc1cd16b0afed74a09f1d965f72e0faaad60215c2788b9672a8f53fb90d44b47fb16e4f97f910226d8ad46ddc1dfa6eb4f709a3c95ccfa7f4cd1b9ea5f3cf3d10c5dd0200de094abc5e25fac259efcfd79a97401359069cde3b48eaa9d3a4d848959eb269d788a415d9c22fb418459474f1f0fc16f4572ace2876cf1170d400d1d12d588f816023602a077b8fa66293ac19c951b6c572fad4481fa576e362d9f3a0ffa0120004801d6c7850edbac8a5281ab93d2ed245d47b64f20c21950926d595624b488c291c").expect("Decode failed"))); + }); +} - // Endowment should be large but not as large to inhibit rent payments. - let endowment = ::RentDepositOffset::get() - .saturating_mul( - storage_size + ::StorageSizeOffset::get() as u64, - ) - .saturating_sub(1u32.into()); +#[test] +fn test_verify_bn254() { + ExtBuilder::default() + .existential_deposit(50) + .build() + .execute_with(|| { + let addr = groth16_addr(ALICE); + assert_ok!(>::call( + Origin::signed(ALICE), + addr.clone(), + 0, + Weight::max_value(), + hex::decode("e028249708050103c2e806d904d8789f0caf1276fc4897bbf2bbb2e7243df2e4bf941ce616790479b410872e3c6f73f481d3e37b861fc1521d4a70457ac41efbe874fe0bf6572f0005014d609323ed564943ba7dfd3b362cc85abf7691dd9957c613fc0d282f258f4d17cd4ddfa713c0a6d4d0dcbfc245847bd6a96fa8603a0c0d55389279cdf2967f06001107f00c5d68983d7c029a66ae498a1cc6a2423bf67760bbf922ea7a937a87705e158db79bbff4eb9516d5342ce8cd8d09f68fa094434edceebbb43383fc415d9b235c64a2bc82ea6fa740441af956bc764eefb6be4067948d2d7afc08d7dc114a2e1c0c46208e6590bed192c336b7d89f55c2eca918e6f4eb88e1c729a10612690900f70bfb6ec84456af219bcd1d682133db3db80b0ae54cf31879e74a0ae547ec0ef92f56757f4a7976c50dc3d538cb1b4ed1736d4e8e8734d5cbf85b2ac8a93d0b654ff74df7e792b9cf0fd9d1b07b6ce4d0675f57bc7e9740e64b56c9f866b309eb428ffdf69b419fc53b9d76f1de62559aedc6db7e8b6ac2f3dd0cc963ca041300cc165291944a7b617bad2e6f1560f89f4e7eb42f154333b730e2f2da7828911d7cd0a28314d647bae049c72d4e0b4f31c1f09177fcab13014e3060a70024cb210094b31d9ebcca3957fff3d94960b0eba2197fabaaa68776e767e8785f63b4541d456d755240d72dae2ee0452c0cd705d7312b9a1d17cff916e87c763d459a550438b765cd8877bf753869e1852a7c0d9ac4520abb2b935e2f3ec12423d9edc5289eba05bed12e9fe16017c86791d682d4ae86d94eeab1d7888845c0fb0af85805000d04cf3bb657065cd0878eabc53790c5fa3680cad24db586bab799e3ae790217c61ba5050a0024f8761028a11dd22dfc030227b0a6c353ef5e7e1afad863c13a3304000227ad22191396e6ffe7aff14de91d7801e943f836de399b5fd5c8312086440c036648b695ffa27790f2f2a63fcf4c0b130e6b88ac786e3351fc6f13452d18034bee420c244cf7c63db4761f2feb7c14e409c8c550a68940cc0387e3812ccb10c4eb591ff3a67a87e794e2e76e25126b823ea9f38f95730951f13784e6e10f26007a922013b86567d6d48ff65baf8cdd0558c52db98f27b6c216df96f8aa1d4d2df7b1ead51d93e93ef5abdff83acaabd54736546f6995083127be1ae281ca5200000480829d3d572251103bac02b39e397c657c0b1f372bfc4d1b74f6c23de4993b4824").expect("Decode failed"))); + }); +} - Contracts::instantiate( - Origin::signed(ALICE.clone()), - endowment, // endowment - Weight::max_value(), // gas_limit - hash.clone(), // code_hash - [106, 55, 18, 226].to_vec(), // flip - b"".to_vec(), // salt - ) - .unwrap(); - let addr = Contracts::contract_address(&ALICE, &hash, &b"".to_vec()); - // let result = >::call(Origin::signed(ALICE), addr.clone(), hex::decode("4e1f2d81088501e60f6032ed7f170ba3481c5d99c0890554c808ad380a7c9aefc9e62eeecf0363ecef5e59ba8eaf6dd0af40e08d7cfd024314f90080a1461a207aa3098308149837bc6322a8f4b499671c507203e798f90a9aa8fafaebb806c8708c3207a93316008501ea7f398187aecf2721441218e54645b17acd35bdf65886255e772a58353ef2e25c92cf7f872bea5afca6081d03e6b115e74befd85720c241ee5ef038621a1cc72e329db9aebec0faf480e83cbd9e4b735650ab0cce2e321d64311bd34bca9e0200910a9094c864d37f890720969430f2682ccc76dc83f9234694590bd334b40dbfa7f28de40e914571d8ae2a88712844f86f0d6dd2f4875120f66304bfcedd55c9a805310155a5345ddc626cbb6fe5ce7026be174a08c798e4d1f1010f97138c30b10a0e23d3cde62852c7b2aabcd7603f87fc54cb0c2fcfa48a1a6e07ea917eec248284a1409dd21ae7bd64b862e7df91fd0af1f36857260a843ea18cd393172b91196ca17bc5f37efb126d585abfcf23b8438d72f90365c382b661256d7caa361d07000c06c5cc02155140b97283cc024daf57023a781a9115bb6e17350264f8b52784a6008921402af8c05dd39f4b789bd50435d2c5aefeb6dc9817af41f45779e3a2d80ab98ef923723b938566747c10a4a169ca5097c5d5073449c3d2e65e16291850a5721416e102df69729ffab67cf948ca51c4ac4c2b54c521552fd4a5a5462d6d3b77ba9932aba0fda8ea8da76e5b0b9166ba600f9c5cc5e442b64ed560c126f8b88e2761c0c6a17a4dcbc1a132a975683ed0b6018ac45d7f4942ad7831790e00408697568bc15871da494a2fe12199531130a8a5b96f07c69020dc01bf9f3ed043a6e1bd08f8d7826c7d5c0fc5c771195ab91bf6eeaa33cbd89cd7dce7930b383c2453d0cca5c227e1b97b1ae253e40cadf4468d6d86f0bf69a0b0bb55774219005b6d86316ea7c1dc4df3e3396a9f78aadf416d5af1619883f5dbbf0a39c6743b194e5adedda54d7cb3ae33e556602e19dd43a31bca7bdb15ad5245dc1ad0affb97edc8f35bb00d1c5b417a132d5be9b72a39870193b6a142198a888c0fe3760fdf1467c7208394270f2aff044c5c002d6cf189a28e34851dc434933e73e07482dad6c7ab931bfbdf29f5d51a6a866d028b91cd89abc9728cf2f8e139f612b5a248ca0758365d1d83c6bc299152b15a89b136e804ae71174d4f35970be570fd14000d06fcafa9753aee681f006d7bf6fc885dcc1a70c33bbfe92bb581ac51e1325b782b1128b1586767cb2ea27555e243abd213634b87418421a65002e06fd9347b23205761d7e35a2a83ffcd35b16b6bf23982700597f2ed9706ae5e039542e8eabd1800443cc8d6ffec17c44207dd41e8ab2f2f2c663f5ed9ab724321de43cbe2ea81908c13643c42a41be1adbc5076e4927b13046d3cdaf5ef775ee48d842599508178276cd41d30e289cbd1d2bb9f92f59b520138fef3e9529139f3961f40f6ea92113ed1701b0eb62a8b21b0852f5ae0d23b4d8cf7a02a69b04abbf0b9213cc1cd16b0afed74a09f1d965f72e0faaad60215c2788b9672a8f53fb90d44b47fb16e4f97f910226d8ad46ddc1dfa6eb4f709a3c95ccfa7f4cd1b9ea5f3cf3d10c5dd0200de094abc5e25fac259efcfd79a97401359069cde3b48eaa9d3a4d848959eb269d788a415d9c22fb418459474f1f0fc16f4572ace2876cf1170d400d1d12d588f816023602a077b8fa66293ac19c951b6c572fad4481fa576e362d9f3a0ffa0120004801d6c7850edbac8a5281ab93d2ed245d47b64f20c21950926d595624b488c291c").expect("Decode failed")); - let result = >::call( +#[test] +fn test_verify_bw6_761() { + ExtBuilder::default() + .existential_deposit(50) + .build() + .execute_with(|| { + let addr = groth16_addr(ALICE); + assert_ok!(>::call( Origin::signed(ALICE), - addr, + addr.clone(), 0, - GAS_LIMIT, - vec![192, 150, 165, 243], - ) - .expect("call contract failed"); + Weight::max_value(), + hex::decode("4399fe0608050329f6308fb1faee384c2deae7744b65d79eafa98a3947df7e35330c73ad0165a2f92844dab884fec1e15e52ac08f9306a1d8e7b4b66f718cece36a90f9aafe59588aafcd6588a55b9c05c3177904e5cbd1e3b59e4077d1caff6329268b5882200e349c8213aacabd50f11abe7f59b68fdd37f17b7fe6cee7ec3d04dca42812df1854c6c14234dd6fb7f64220949439c660ede18a5e79c8a115b942bbb7812b89be516469237a138752f6f798bcaf6afdf261e471f6c808aacd4274293cb8aff00000503639a14c4e08b97d97166d09eff9b57abf973b487fd5f5007c6ccc8adc31dbac74372477c035964e06f06d93e1483fe81ef1b51e525ffad28a053af20271dd363353e7ccd34cd599ac7c8c97fc175e4d9db8b9399db1647f52564757781209b001cc3d1e9665bc2a8b7e82d2d074e595f297df3dff536046353057a150f6a453521182a7219ef5d38ae85efd3b505f16549ed4bd63b7166e3a4f82142f584b3ad3e27c371db05cc0ba8a8f870fefccd9eb6e5635d6684193aa4b60082a0b2ac0000110c73174e4bb9c9b03c5ee9ddf21056832e01546744fffc64a5221e7e5cee09d37e534b27ae3725db7d3706c85b3932b269078f55cf1dd54c6e3247ad9a7619ef71315f5fee37909c44a216246c2ba2889b7b00b7f1298f5fb2776562527f4014008864e0733bfdd0d8f599c8bccd50d2204e3dab1863fc52e8a30476c836c16e3e6f7d098f0b34fd9edde526f9039323dcb0228a5e7c6841dcda703efe88d7331ba7d096b5753f442647e643d8ac9dfdd9d85b44824bbcc29ee8b4596e1cee520000d1e9ebd9d4d430b34703ac55be08c6d63e791dd2da3f7543b5d6db64e6ce9e0cfb031c168e2bede9cbd39070ecb4e1678d41cd0d48b087fa8a324964fded508df2ef48a7a6c21f1fe95e89aa98b00fb59bee1713e4ffaba216f00e5f15d12201f23da7e61729bc8866bcdd39bcd7d74e6cc9f9192b94c45c6753b60cef11c3b0474eaa53b3beaf3ee9f3885a547ae21385b5a5d5f15be620b9f2669573461b56e74dd326b48662cd271d1a21bb0c120f45d6bbdc632261908bc6e3ab4356480000be5dddc202ba74caa75135e9f81338910969729484a89a438090564689177b491e67f8cfa06ecfcee4acfd7cd364e094c1a4d028f7c7e0677d066cdf1355123e976fa498af59e308954054051fb3fabdda4b0d7a165cd454a71c53ff26546d000b193a142d557066f0a66964c249e4ee2d0247969ecfe861014dd4f36956da4c870ff3fbd6e16999cd43dc27c2fb2a5d72c7317dbc22d2f32541c1489a7bf716e698f898299c0ddfd09e3a892d2aa2940eec0b9f0cf63e52d83cd5dba7be50000021a8ba5d55fabd1999a5a9d717008e812486fd4309d9b4fb75ce4d22199360d6f8855d2e55259220392a9a67b9104adfa1424633f0c527b5516535d43c2632e594a118c05394ea735234b998018ac2906d7f24f89226bb07d1229c6000b13900b565ae54006fc9ef616aa866efa0e85b4c8d5a13ee55d60a478a0ea0b0cc29bc1fcab4045b6f980297a1815dcfbf5ad3031a0bb4429ad863f8695719b68208d1cd4e515a2b3129142a4bbdca3c3cde033c6256daa1fb79f133f28147a40c5200000d09cf5ea12a32dc313ec0791efdfca4ffa5dca127faeb57027754f0fcdd0e868623082e4543cae1bb11078c359dabbd4abbb38640c75081dca4aa2ef35bdb5ee4c856465c7b75956b88ab36d940a8df7e13adaa709ee349ed9454c7d6705211020087f361ca8cb2e83018809872a71853f0eb99a989362a3a753edbe4f58feec45c19be03b06567b357ec6779f3756b1494b74d98503d5c67ef3548ca9464d7525a3f92cdf335702a76eaaff83330f9da2c4a84b02a99ce06e0b04a1a0f1fd2f80000335b53718581ba3e14b48e381078551ff535a3d7a1671dc42898e742857f158a27d249a4d3bbe060016acdf3e9bde0095b23e073e40d56027474673321542ab30641f50f61452762d66984e33745d9456c5eba2cdafc07a52525ef1d3e221e00c92be8c3030de0338c27d281e887a63ab927478464faa7e7b0bbc68de44734c20cfd24763b8384fc6a15b2f82bf0349b86392aaa2e6fc2c95c1d0891f83a92d3b2c1deb230316eb43d9ddcbd069e600aff23ef13dd1f7b9cfade33db4872300000d1367d1907cd90da19e25e3241fb83393731c0d6183300675275017cc6287f2154abf2320cdc2cefc9df0383f98688e2e22914bef4fc32136222fb9dde45840de012e91cce1d02fbb6250a342b72c8c4155e0ff2ffa7ee71211f2641e816f200f8e725a65be98dafc395c538b2c1a009af190aedb99ecae9410257b5b295fb757dc7af138db54d06c582021442342f8924e092ae2fbf375fe94d6480910f7154b14aec033bd5cf27a2cdd225282b7a2fcaab6ac338a89d994c45976d9b7fa1000004c028933fc1b649ded455bd7739026be2bf6f7e1c0acde6dee164724218bbf1391e318017e5a6ab8248bda0bdd1f40b8301").expect("Decode failed"))); }); } From 572395e2f8924792425e8275543b29d7ca8d89d0 Mon Sep 17 00:00:00 2001 From: clearloop Date: Sun, 20 Dec 2020 19:04:37 +0800 Subject: [PATCH 30/33] feat(template/benchmark): add bls12_377_groth16_verify --- pallets/template/src/benchmarking.rs | 139 ++++++++++++++------------- pallets/template/src/lib.rs | 1 + pallets/template/src/mock.rs | 2 +- 3 files changed, 74 insertions(+), 68 deletions(-) diff --git a/pallets/template/src/benchmarking.rs b/pallets/template/src/benchmarking.rs index 1727f0c7..b8d5c40e 100644 --- a/pallets/template/src/benchmarking.rs +++ b/pallets/template/src/benchmarking.rs @@ -18,58 +18,63 @@ //! Balances pallet benchmarking. #![cfg(feature = "runtime-benchmarks")] +// #![recursion_limit = "256"] use super::*; -use contract::{BalanceOf, ConfigCache, Module as Contracts}; +use contract::{BalanceOf, Module as Contracts}; use frame_benchmarking::{benchmarks, whitelisted_caller}; use frame_support::{traits::Currency, weights::Weight}; use frame_system::RawOrigin; -use sp_runtime::traits::{Bounded, CheckedDiv, Hash, Saturating, Zero}; +use sp_runtime::traits::{Bounded, Hash}; use sp_std::prelude::*; -benchmarks! { - where_clause { where - T::AccountId: UncheckedFrom, - T::AccountId: AsRef<[u8]>, - } - _ {} - - test_contract { +macro_rules! addr { + () => {{ let caller: T::AccountId = whitelisted_caller(); let origin = RawOrigin::Signed(caller.clone()); T::Currency::make_free_balance_be(&caller, BalanceOf::::max_value()); // Put WASM module - let module = include_bytes!(concat!(env!("OUT_DIR"), "/groth16.wasm")).to_vec(); + let module = include_bytes!("../res/groth16.wasm").to_vec(); let hash = T::Hashing::hash(&module); >::put_code(origin.clone().into(), module)?; - - // storage_size cannot be zero because otherwise a contract that is just above - // the subsistence threshold does not pay rent given a large enough subsistence - // threshold. But we need rent payments to occur in order to benchmark for worst cases. - let storage_size = ConfigCache::::subsistence_threshold_uncached() - .checked_div(&T::RentDepositOffset::get()) - .unwrap_or_else(Zero::zero); - - // Endowment should be large but not as large to inhibit rent payments. - let endowment = T::RentDepositOffset::get() - .saturating_mul(storage_size + T::StorageSizeOffset::get().into()) - .saturating_sub(1u32.into()); - - >::instantiate( + if let Err(e) = >::instantiate( origin.clone().into(), - endowment.clone(), // endowment - Weight::max_value(), // gas_limit - hash.clone(), // code_hash - [106, 55, 18, 226].to_vec(), // flip - b"".to_vec(), // salt - ).map_err(|_|>::InstantiateContractFailed)?; + BalanceOf::::max_value() / 2_u32.into(), // endowment + Weight::max_value(), // gas_limit + hash.clone(), // code_hash + [106, 55, 18, 226].to_vec(), // deafult + b"".to_vec(), // salt + ) { + panic!("{:?}", e); + } // Calculate addr - let addr = Contracts::::contract_address(&caller, &hash, &b"".to_vec()); - let data = hex::decode().expect("Decode failed"); - }: call(origin, addr, endowment, Weight::max_value(), vec![192, 150, 165, 243]) + ( + Contracts::::contract_address(&caller, &hash, &b"".to_vec()), + caller, + ) + }}; +} + +benchmarks! { + where_clause { where + T::AccountId: UncheckedFrom, + T::AccountId: AsRef<[u8]>, + } + _ {} + + bls12_377_groth16_verify { + let (addr, caller) = addr!(); + let data = hex::decode("4e1f2d8108850171c5a779bb19e0aeb6030768f5001017bbd4edb645306ff1591424c501e7aa8b480fc18d8ed404c893d473afa9b82c01fb3e19bdf85f4fb8acf97d1507b75eb48972c8a10e13f4637f7bee71f89eafc141453e4646c82e188d9ef8cf71fa2f000085014d0869345487bb4070110fa318b0f408dcffce12304589878797615d8a72cc00b6a1e3f50cc0e59770638640090726013db560d3a19288ecedc60ed9ee0afd50ad3ac96db89d99fc249b85a453ef837e9213f8977ac572d818dc43387678a50100910a54f796d78550d14c4ee03cd5915fd8037569696f878312b0093f0149919fc717c0b3f8a2d419fad0edde7e1d55cd2f002c312b660250225a00baf5df511dcce61eb23b28f3980be7fcde0091284670e9064015f452f244e65cad047a20fdd000ca76892d04e1283e575e098c8e4281ba9113443515f22247921b9c3189dc03dd83cf22b9da3eda70cdd2644a795376002e0b1d0d1d5945dab12a28a31497b48d07739028ac3153be3cf367e3d7e788ac43f6d3ccd3c5c20a4f2d6b0db05ce40000f70cb4191a256ed9a4d90305f5864993032a0e40433040c259b14c8069d117f3491d75d993271a0a3f13efdd5b18ce006d90eff3b45f8fa10b43a2d4fb80a554304ba5d94ddc19c92b2e1e2f756bd3042c4c0d6e10b6c22c2ea5eb136fb42900aca080ed5cfa9ccf92da7e4f631f1f9fd52a4dd227898e21585a7a55656f6315fa3f1e541011b941084fb663515ede0024ff6c7745872af24c5de2acfbf4b7a238f3f80face2310d83d9e953de2051a70abc3be988220291e03c92840e1c1c01005720823639fe8f3818ade6c24c6d6ed8f78b87369a9fac8a548e01ca001e424ba931033958641fe06677c3f4a1b39f01f6d3e9a2052ad1185af9a80086665df50b41674f7f6f181773cee6e78d09ea34ce970ccb5907d5cb2f69c9e0ed8d1f01009d629094c47bdf026bbd3424f6e7748b0c3529b495cf24677f309d9f1ed7d3435513224cba204902fd733522b3b855015f395e5b2a7f0fe9e50665d705c48f9b8b20a3f9619f50c1dcddbea7c4a561cdffed750045f875b2d2c569e8d5d0320015e739c8881a211865f82e39bb6ad21a66ceb1808a5ecc3f11833d61dc938a3b160b1b1829527b52e9d3d98800f29701078dfc5fda2f3dcebaca0f43ac23f6da5044f51cf12ac8b3439df503ab1732f5047601b2cd9d93e6d161dc4719beda00000d06e2342d048b06618cfc80a5fb5301373032d5780ca45e5287e824fd1d3dccfc36d1befe73edaea7378968a003f94e1801de729f41f406c7d94db4995cc2956cdd6b250937dd52b3c8ac812dff25985eb802c727dbfb7c6b055db545d687b1bd000090f4ad7dc16060ebfbe2bff08077e404e878850682e15f64a5b0f243f53a6d61dc358d41fa6aed615c6296904d71c200c04fe75b3adbecdc3d00df22556a1c949e4b87c81483225f6eaa7560e3035a1c919c4a0d446125dca2e2ef541d58a200ec9b0644bea1bd34e84ff04b65c0cc8733d425b43225f81a7580e1027a41b4ce85eb513213f54a76e2b69320dc6d51003b06cb148aa149b0b0e1ffb8f5901adbda3e431c19404cae29f26aac97085c6d1d8eeef33024aafdc649da6475ab99000026b3bb740a34b4db3a1c689d471b5a7834bb27fd57108bca8cd88d12bb81eae5f8ad807e5de758978ab51d0146017100c31d5c7971576e79eec56286dc2602025cb1d0a01e1acdc23a8aece6e9f3c3ecf97d0a9667634e31e79f653a93c13b01000480a4961fec1c734055a80af91b3fd7405a2cdb741e1867aa7f783ca0959a077110").expect("Decode failed"); + }: call( + RawOrigin::Signed(caller), + T::Lookup::unlookup(addr), + 0_u32.into(), + Weight::max_value(), + data + ) wasm_bls12_377_add { let caller: T::AccountId = whitelisted_caller(); @@ -103,81 +108,81 @@ benchmarks! { native_bls12_377_mul { let caller: T::AccountId = whitelisted_caller(); - }: native_bls12_377_mul(RawOrigin::Signed(caller.clone())) + }: _(RawOrigin::Signed(caller.clone())) verify {} native_bls12_377_pairing_two { let caller: T::AccountId = whitelisted_caller(); - }: native_bls12_377_pairing_two(RawOrigin::Signed(caller.clone())) + }: _(RawOrigin::Signed(caller.clone())) verify {} native_bls12_377_pairing_six { let caller: T::AccountId = whitelisted_caller(); - }: native_bls12_377_pairing_six(RawOrigin::Signed(caller.clone())) + }: _(RawOrigin::Signed(caller.clone())) verify {} native_bls12_377_verify { let caller: T::AccountId = whitelisted_caller(); - }: native_bls12_377_verify(RawOrigin::Signed(caller.clone())) + }: _(RawOrigin::Signed(caller.clone())) verify {} // bls12_381 wasm_bls12_381_add { let caller: T::AccountId = whitelisted_caller(); - }: wasm_bls12_381_add(RawOrigin::Signed(caller.clone())) + }: _(RawOrigin::Signed(caller.clone())) verify {} wasm_bls12_381_mul { let caller: T::AccountId = whitelisted_caller(); - }: wasm_bls12_381_mul(RawOrigin::Signed(caller.clone())) + }: _(RawOrigin::Signed(caller.clone())) verify {} wasm_bls12_381_pairing_two { let caller: T::AccountId = whitelisted_caller(); - }: wasm_bls12_381_pairing_two(RawOrigin::Signed(caller.clone())) + }: _(RawOrigin::Signed(caller.clone())) verify {} wasm_bls12_381_pairing_six { let caller: T::AccountId = whitelisted_caller(); - }: wasm_bls12_381_pairing_six(RawOrigin::Signed(caller.clone())) + }: _(RawOrigin::Signed(caller.clone())) verify {} wasm_bls12_381_verify { let caller: T::AccountId = whitelisted_caller(); - }: wasm_bls12_381_verify(RawOrigin::Signed(caller.clone())) + }: _(RawOrigin::Signed(caller.clone())) verify {} native_bls12_381_add { let caller: T::AccountId = whitelisted_caller(); - }: native_bls12_381_add(RawOrigin::Signed(caller.clone())) + }: _(RawOrigin::Signed(caller.clone())) verify {} native_bls12_381_mul { let caller: T::AccountId = whitelisted_caller(); - }: native_bls12_381_mul(RawOrigin::Signed(caller.clone())) + }: _(RawOrigin::Signed(caller.clone())) verify {} native_bls12_381_pairing_two { let caller: T::AccountId = whitelisted_caller(); - }: native_bls12_381_pairing_two(RawOrigin::Signed(caller.clone())) + }: _(RawOrigin::Signed(caller.clone())) verify {} native_bls12_381_pairing_six { let caller: T::AccountId = whitelisted_caller(); - }: native_bls12_381_pairing_six(RawOrigin::Signed(caller.clone())) + }: _(RawOrigin::Signed(caller.clone())) verify {} native_bls12_381_verify { let caller: T::AccountId = whitelisted_caller(); - }: native_bls12_381_verify(RawOrigin::Signed(caller.clone())) + }: _(RawOrigin::Signed(caller.clone())) verify {} // bn254 wasm_bn254_add { let caller: T::AccountId = whitelisted_caller(); - }: wasm_bn254_add(RawOrigin::Signed(caller.clone())) + }: _(RawOrigin::Signed(caller.clone())) verify {} wasm_bn254_mul { @@ -187,93 +192,93 @@ benchmarks! { wasm_bn254_pairing_two { let caller: T::AccountId = whitelisted_caller(); - }: wasm_bn254_pairing_two(RawOrigin::Signed(caller.clone())) + }: _(RawOrigin::Signed(caller.clone())) verify {} wasm_bn254_pairing_six { let caller: T::AccountId = whitelisted_caller(); - }: wasm_bn254_pairing_six(RawOrigin::Signed(caller.clone())) + }: _(RawOrigin::Signed(caller.clone())) verify {} wasm_bn254_verify { let caller: T::AccountId = whitelisted_caller(); - }: wasm_bn254_verify(RawOrigin::Signed(caller.clone())) + }: _(RawOrigin::Signed(caller.clone())) verify {} native_bn254_add { let caller: T::AccountId = whitelisted_caller(); - }: native_bn254_add(RawOrigin::Signed(caller.clone())) + }: _(RawOrigin::Signed(caller.clone())) verify {} native_bn254_mul { let caller: T::AccountId = whitelisted_caller(); - }: native_bn254_mul(RawOrigin::Signed(caller.clone())) + }: _(RawOrigin::Signed(caller.clone())) verify {} native_bn254_pairing_two { let caller: T::AccountId = whitelisted_caller(); - }: native_bn254_pairing_two(RawOrigin::Signed(caller.clone())) + }: _(RawOrigin::Signed(caller.clone())) verify {} native_bn254_pairing_six { let caller: T::AccountId = whitelisted_caller(); - }: native_bn254_pairing_six(RawOrigin::Signed(caller.clone())) + }: _(RawOrigin::Signed(caller.clone())) verify {} native_bn254_verify { let caller: T::AccountId = whitelisted_caller(); - }: native_bn254_verify(RawOrigin::Signed(caller.clone())) + }: _(RawOrigin::Signed(caller.clone())) verify {} // bw6_761 wasm_bw6_761_add { let caller: T::AccountId = whitelisted_caller(); - }: wasm_bw6_761_add(RawOrigin::Signed(caller.clone())) + }: _(RawOrigin::Signed(caller.clone())) verify {} wasm_bw6_761_mul { let caller: T::AccountId = whitelisted_caller(); - }: wasm_bw6_761_mul(RawOrigin::Signed(caller.clone())) + }: _(RawOrigin::Signed(caller.clone())) verify {} wasm_bw6_761_pairing_two { let caller: T::AccountId = whitelisted_caller(); - }: wasm_bw6_761_pairing_two(RawOrigin::Signed(caller.clone())) + }: _(RawOrigin::Signed(caller.clone())) verify {} wasm_bw6_761_pairing_six { let caller: T::AccountId = whitelisted_caller(); - }: wasm_bw6_761_pairing_six(RawOrigin::Signed(caller.clone())) + }: _(RawOrigin::Signed(caller.clone())) verify {} wasm_bw6_761_verify { let caller: T::AccountId = whitelisted_caller(); - }: wasm_bw6_761_verify(RawOrigin::Signed(caller.clone())) + }: _(RawOrigin::Signed(caller.clone())) verify {} native_bw6_761_add { let caller: T::AccountId = whitelisted_caller(); - }: native_bw6_761_add(RawOrigin::Signed(caller.clone())) + }: _(RawOrigin::Signed(caller.clone())) verify {} native_bw6_761_mul { let caller: T::AccountId = whitelisted_caller(); - }: native_bw6_761_mul(RawOrigin::Signed(caller.clone())) + }: _(RawOrigin::Signed(caller.clone())) verify {} native_bw6_761_pairing_two { let caller: T::AccountId = whitelisted_caller(); - }: native_bw6_761_pairing_two(RawOrigin::Signed(caller.clone())) + }: _(RawOrigin::Signed(caller.clone())) verify {} native_bw6_761_pairing_six { let caller: T::AccountId = whitelisted_caller(); - }: native_bw6_761_pairing_six(RawOrigin::Signed(caller.clone())) + }: _(RawOrigin::Signed(caller.clone())) verify {} native_bw6_761_verify { let caller: T::AccountId = whitelisted_caller(); - }: native_bw6_761_verify(RawOrigin::Signed(caller.clone())) + }: _(RawOrigin::Signed(caller.clone())) verify {} } diff --git a/pallets/template/src/lib.rs b/pallets/template/src/lib.rs index 98fcfe96..986c2a4e 100644 --- a/pallets/template/src/lib.rs +++ b/pallets/template/src/lib.rs @@ -1,4 +1,5 @@ #![cfg_attr(not(feature = "std"), no_std)] +#![recursion_limit = "256"] use contract::{BalanceOf, CodeHash, Gas, Module as Contracts}; /// Edit this file to define custom logic or remove it if it is not needed. diff --git a/pallets/template/src/mock.rs b/pallets/template/src/mock.rs index e93ca703..621093d2 100644 --- a/pallets/template/src/mock.rs +++ b/pallets/template/src/mock.rs @@ -185,6 +185,6 @@ pub fn groth16_addr(caller: AccountId32) -> AccountId32 { b"".to_vec(), // salt ) .unwrap(); - let addr = Contracts::contract_address(&ALICE, &hash, &b"".to_vec()); + let addr = Contracts::contract_address(&caller, &hash, &b"".to_vec()); addr } From cba83ee78dcb6feae9b339272d027eeef51c0443 Mon Sep 17 00:00:00 2001 From: clearloop Date: Mon, 21 Dec 2020 02:54:12 +0800 Subject: [PATCH 31/33] feat(pallets/template): complete benchmarks --- pallets/template/src/benchmarking.rs | 35 +++++++++++++++++++++++++++- rpc/Cargo.toml | 1 - 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/pallets/template/src/benchmarking.rs b/pallets/template/src/benchmarking.rs index b8d5c40e..d4ab6e6e 100644 --- a/pallets/template/src/benchmarking.rs +++ b/pallets/template/src/benchmarking.rs @@ -65,7 +65,7 @@ benchmarks! { } _ {} - bls12_377_groth16_verify { + bls12_377_verify { let (addr, caller) = addr!(); let data = hex::decode("4e1f2d8108850171c5a779bb19e0aeb6030768f5001017bbd4edb645306ff1591424c501e7aa8b480fc18d8ed404c893d473afa9b82c01fb3e19bdf85f4fb8acf97d1507b75eb48972c8a10e13f4637f7bee71f89eafc141453e4646c82e188d9ef8cf71fa2f000085014d0869345487bb4070110fa318b0f408dcffce12304589878797615d8a72cc00b6a1e3f50cc0e59770638640090726013db560d3a19288ecedc60ed9ee0afd50ad3ac96db89d99fc249b85a453ef837e9213f8977ac572d818dc43387678a50100910a54f796d78550d14c4ee03cd5915fd8037569696f878312b0093f0149919fc717c0b3f8a2d419fad0edde7e1d55cd2f002c312b660250225a00baf5df511dcce61eb23b28f3980be7fcde0091284670e9064015f452f244e65cad047a20fdd000ca76892d04e1283e575e098c8e4281ba9113443515f22247921b9c3189dc03dd83cf22b9da3eda70cdd2644a795376002e0b1d0d1d5945dab12a28a31497b48d07739028ac3153be3cf367e3d7e788ac43f6d3ccd3c5c20a4f2d6b0db05ce40000f70cb4191a256ed9a4d90305f5864993032a0e40433040c259b14c8069d117f3491d75d993271a0a3f13efdd5b18ce006d90eff3b45f8fa10b43a2d4fb80a554304ba5d94ddc19c92b2e1e2f756bd3042c4c0d6e10b6c22c2ea5eb136fb42900aca080ed5cfa9ccf92da7e4f631f1f9fd52a4dd227898e21585a7a55656f6315fa3f1e541011b941084fb663515ede0024ff6c7745872af24c5de2acfbf4b7a238f3f80face2310d83d9e953de2051a70abc3be988220291e03c92840e1c1c01005720823639fe8f3818ade6c24c6d6ed8f78b87369a9fac8a548e01ca001e424ba931033958641fe06677c3f4a1b39f01f6d3e9a2052ad1185af9a80086665df50b41674f7f6f181773cee6e78d09ea34ce970ccb5907d5cb2f69c9e0ed8d1f01009d629094c47bdf026bbd3424f6e7748b0c3529b495cf24677f309d9f1ed7d3435513224cba204902fd733522b3b855015f395e5b2a7f0fe9e50665d705c48f9b8b20a3f9619f50c1dcddbea7c4a561cdffed750045f875b2d2c569e8d5d0320015e739c8881a211865f82e39bb6ad21a66ceb1808a5ecc3f11833d61dc938a3b160b1b1829527b52e9d3d98800f29701078dfc5fda2f3dcebaca0f43ac23f6da5044f51cf12ac8b3439df503ab1732f5047601b2cd9d93e6d161dc4719beda00000d06e2342d048b06618cfc80a5fb5301373032d5780ca45e5287e824fd1d3dccfc36d1befe73edaea7378968a003f94e1801de729f41f406c7d94db4995cc2956cdd6b250937dd52b3c8ac812dff25985eb802c727dbfb7c6b055db545d687b1bd000090f4ad7dc16060ebfbe2bff08077e404e878850682e15f64a5b0f243f53a6d61dc358d41fa6aed615c6296904d71c200c04fe75b3adbecdc3d00df22556a1c949e4b87c81483225f6eaa7560e3035a1c919c4a0d446125dca2e2ef541d58a200ec9b0644bea1bd34e84ff04b65c0cc8733d425b43225f81a7580e1027a41b4ce85eb513213f54a76e2b69320dc6d51003b06cb148aa149b0b0e1ffb8f5901adbda3e431c19404cae29f26aac97085c6d1d8eeef33024aafdc649da6475ab99000026b3bb740a34b4db3a1c689d471b5a7834bb27fd57108bca8cd88d12bb81eae5f8ad807e5de758978ab51d0146017100c31d5c7971576e79eec56286dc2602025cb1d0a01e1acdc23a8aece6e9f3c3ecf97d0a9667634e31e79f653a93c13b01000480a4961fec1c734055a80af91b3fd7405a2cdb741e1867aa7f783ca0959a077110").expect("Decode failed"); }: call( @@ -76,6 +76,39 @@ benchmarks! { data ) + bls12_381_verify { + let (addr, caller) = addr!(); + let data = hex::decode("99a06637088501e60f6032ed7f170ba3481c5d99c0890554c808ad380a7c9aefc9e62eeecf0363ecef5e59ba8eaf6dd0af40e08d7cfd024314f90080a1461a207aa3098308149837bc6322a8f4b499671c507203e798f90a9aa8fafaebb806c8708c3207a93316008501ea7f398187aecf2721441218e54645b17acd35bdf65886255e772a58353ef2e25c92cf7f872bea5afca6081d03e6b115e74befd85720c241ee5ef038621a1cc72e329db9aebec0faf480e83cbd9e4b735650ab0cce2e321d64311bd34bca9e0200910a9094c864d37f890720969430f2682ccc76dc83f9234694590bd334b40dbfa7f28de40e914571d8ae2a88712844f86f0d6dd2f4875120f66304bfcedd55c9a805310155a5345ddc626cbb6fe5ce7026be174a08c798e4d1f1010f97138c30b10a0e23d3cde62852c7b2aabcd7603f87fc54cb0c2fcfa48a1a6e07ea917eec248284a1409dd21ae7bd64b862e7df91fd0af1f36857260a843ea18cd393172b91196ca17bc5f37efb126d585abfcf23b8438d72f90365c382b661256d7caa361d07000c06c5cc02155140b97283cc024daf57023a781a9115bb6e17350264f8b52784a6008921402af8c05dd39f4b789bd50435d2c5aefeb6dc9817af41f45779e3a2d80ab98ef923723b938566747c10a4a169ca5097c5d5073449c3d2e65e16291850a5721416e102df69729ffab67cf948ca51c4ac4c2b54c521552fd4a5a5462d6d3b77ba9932aba0fda8ea8da76e5b0b9166ba600f9c5cc5e442b64ed560c126f8b88e2761c0c6a17a4dcbc1a132a975683ed0b6018ac45d7f4942ad7831790e00408697568bc15871da494a2fe12199531130a8a5b96f07c69020dc01bf9f3ed043a6e1bd08f8d7826c7d5c0fc5c771195ab91bf6eeaa33cbd89cd7dce7930b383c2453d0cca5c227e1b97b1ae253e40cadf4468d6d86f0bf69a0b0bb55774219005b6d86316ea7c1dc4df3e3396a9f78aadf416d5af1619883f5dbbf0a39c6743b194e5adedda54d7cb3ae33e556602e19dd43a31bca7bdb15ad5245dc1ad0affb97edc8f35bb00d1c5b417a132d5be9b72a39870193b6a142198a888c0fe3760fdf1467c7208394270f2aff044c5c002d6cf189a28e34851dc434933e73e07482dad6c7ab931bfbdf29f5d51a6a866d028b91cd89abc9728cf2f8e139f612b5a248ca0758365d1d83c6bc299152b15a89b136e804ae71174d4f35970be570fd14000d06fcafa9753aee681f006d7bf6fc885dcc1a70c33bbfe92bb581ac51e1325b782b1128b1586767cb2ea27555e243abd213634b87418421a65002e06fd9347b23205761d7e35a2a83ffcd35b16b6bf23982700597f2ed9706ae5e039542e8eabd1800443cc8d6ffec17c44207dd41e8ab2f2f2c663f5ed9ab724321de43cbe2ea81908c13643c42a41be1adbc5076e4927b13046d3cdaf5ef775ee48d842599508178276cd41d30e289cbd1d2bb9f92f59b520138fef3e9529139f3961f40f6ea92113ed1701b0eb62a8b21b0852f5ae0d23b4d8cf7a02a69b04abbf0b9213cc1cd16b0afed74a09f1d965f72e0faaad60215c2788b9672a8f53fb90d44b47fb16e4f97f910226d8ad46ddc1dfa6eb4f709a3c95ccfa7f4cd1b9ea5f3cf3d10c5dd0200de094abc5e25fac259efcfd79a97401359069cde3b48eaa9d3a4d848959eb269d788a415d9c22fb418459474f1f0fc16f4572ace2876cf1170d400d1d12d588f816023602a077b8fa66293ac19c951b6c572fad4481fa576e362d9f3a0ffa0120004801d6c7850edbac8a5281ab93d2ed245d47b64f20c21950926d595624b488c291c").expect("Decode failed"); + }: call( + RawOrigin::Signed(caller), + T::Lookup::unlookup(addr), + 0_u32.into(), + Weight::max_value(), + data + ) + + bn254_verify { + let (addr, caller) = addr!(); + let data = hex::decode("e028249708050103c2e806d904d8789f0caf1276fc4897bbf2bbb2e7243df2e4bf941ce616790479b410872e3c6f73f481d3e37b861fc1521d4a70457ac41efbe874fe0bf6572f0005014d609323ed564943ba7dfd3b362cc85abf7691dd9957c613fc0d282f258f4d17cd4ddfa713c0a6d4d0dcbfc245847bd6a96fa8603a0c0d55389279cdf2967f06001107f00c5d68983d7c029a66ae498a1cc6a2423bf67760bbf922ea7a937a87705e158db79bbff4eb9516d5342ce8cd8d09f68fa094434edceebbb43383fc415d9b235c64a2bc82ea6fa740441af956bc764eefb6be4067948d2d7afc08d7dc114a2e1c0c46208e6590bed192c336b7d89f55c2eca918e6f4eb88e1c729a10612690900f70bfb6ec84456af219bcd1d682133db3db80b0ae54cf31879e74a0ae547ec0ef92f56757f4a7976c50dc3d538cb1b4ed1736d4e8e8734d5cbf85b2ac8a93d0b654ff74df7e792b9cf0fd9d1b07b6ce4d0675f57bc7e9740e64b56c9f866b309eb428ffdf69b419fc53b9d76f1de62559aedc6db7e8b6ac2f3dd0cc963ca041300cc165291944a7b617bad2e6f1560f89f4e7eb42f154333b730e2f2da7828911d7cd0a28314d647bae049c72d4e0b4f31c1f09177fcab13014e3060a70024cb210094b31d9ebcca3957fff3d94960b0eba2197fabaaa68776e767e8785f63b4541d456d755240d72dae2ee0452c0cd705d7312b9a1d17cff916e87c763d459a550438b765cd8877bf753869e1852a7c0d9ac4520abb2b935e2f3ec12423d9edc5289eba05bed12e9fe16017c86791d682d4ae86d94eeab1d7888845c0fb0af85805000d04cf3bb657065cd0878eabc53790c5fa3680cad24db586bab799e3ae790217c61ba5050a0024f8761028a11dd22dfc030227b0a6c353ef5e7e1afad863c13a3304000227ad22191396e6ffe7aff14de91d7801e943f836de399b5fd5c8312086440c036648b695ffa27790f2f2a63fcf4c0b130e6b88ac786e3351fc6f13452d18034bee420c244cf7c63db4761f2feb7c14e409c8c550a68940cc0387e3812ccb10c4eb591ff3a67a87e794e2e76e25126b823ea9f38f95730951f13784e6e10f26007a922013b86567d6d48ff65baf8cdd0558c52db98f27b6c216df96f8aa1d4d2df7b1ead51d93e93ef5abdff83acaabd54736546f6995083127be1ae281ca5200000480829d3d572251103bac02b39e397c657c0b1f372bfc4d1b74f6c23de4993b4824").expect("Decode failed"); + }: call( + RawOrigin::Signed(caller), + T::Lookup::unlookup(addr), + 0_u32.into(), + Weight::max_value(), + data + ) + + bw6_761_verify { + let (addr, caller) = addr!(); + let data = hex::decode("4399fe0608050329f6308fb1faee384c2deae7744b65d79eafa98a3947df7e35330c73ad0165a2f92844dab884fec1e15e52ac08f9306a1d8e7b4b66f718cece36a90f9aafe59588aafcd6588a55b9c05c3177904e5cbd1e3b59e4077d1caff6329268b5882200e349c8213aacabd50f11abe7f59b68fdd37f17b7fe6cee7ec3d04dca42812df1854c6c14234dd6fb7f64220949439c660ede18a5e79c8a115b942bbb7812b89be516469237a138752f6f798bcaf6afdf261e471f6c808aacd4274293cb8aff00000503639a14c4e08b97d97166d09eff9b57abf973b487fd5f5007c6ccc8adc31dbac74372477c035964e06f06d93e1483fe81ef1b51e525ffad28a053af20271dd363353e7ccd34cd599ac7c8c97fc175e4d9db8b9399db1647f52564757781209b001cc3d1e9665bc2a8b7e82d2d074e595f297df3dff536046353057a150f6a453521182a7219ef5d38ae85efd3b505f16549ed4bd63b7166e3a4f82142f584b3ad3e27c371db05cc0ba8a8f870fefccd9eb6e5635d6684193aa4b60082a0b2ac0000110c73174e4bb9c9b03c5ee9ddf21056832e01546744fffc64a5221e7e5cee09d37e534b27ae3725db7d3706c85b3932b269078f55cf1dd54c6e3247ad9a7619ef71315f5fee37909c44a216246c2ba2889b7b00b7f1298f5fb2776562527f4014008864e0733bfdd0d8f599c8bccd50d2204e3dab1863fc52e8a30476c836c16e3e6f7d098f0b34fd9edde526f9039323dcb0228a5e7c6841dcda703efe88d7331ba7d096b5753f442647e643d8ac9dfdd9d85b44824bbcc29ee8b4596e1cee520000d1e9ebd9d4d430b34703ac55be08c6d63e791dd2da3f7543b5d6db64e6ce9e0cfb031c168e2bede9cbd39070ecb4e1678d41cd0d48b087fa8a324964fded508df2ef48a7a6c21f1fe95e89aa98b00fb59bee1713e4ffaba216f00e5f15d12201f23da7e61729bc8866bcdd39bcd7d74e6cc9f9192b94c45c6753b60cef11c3b0474eaa53b3beaf3ee9f3885a547ae21385b5a5d5f15be620b9f2669573461b56e74dd326b48662cd271d1a21bb0c120f45d6bbdc632261908bc6e3ab4356480000be5dddc202ba74caa75135e9f81338910969729484a89a438090564689177b491e67f8cfa06ecfcee4acfd7cd364e094c1a4d028f7c7e0677d066cdf1355123e976fa498af59e308954054051fb3fabdda4b0d7a165cd454a71c53ff26546d000b193a142d557066f0a66964c249e4ee2d0247969ecfe861014dd4f36956da4c870ff3fbd6e16999cd43dc27c2fb2a5d72c7317dbc22d2f32541c1489a7bf716e698f898299c0ddfd09e3a892d2aa2940eec0b9f0cf63e52d83cd5dba7be50000021a8ba5d55fabd1999a5a9d717008e812486fd4309d9b4fb75ce4d22199360d6f8855d2e55259220392a9a67b9104adfa1424633f0c527b5516535d43c2632e594a118c05394ea735234b998018ac2906d7f24f89226bb07d1229c6000b13900b565ae54006fc9ef616aa866efa0e85b4c8d5a13ee55d60a478a0ea0b0cc29bc1fcab4045b6f980297a1815dcfbf5ad3031a0bb4429ad863f8695719b68208d1cd4e515a2b3129142a4bbdca3c3cde033c6256daa1fb79f133f28147a40c5200000d09cf5ea12a32dc313ec0791efdfca4ffa5dca127faeb57027754f0fcdd0e868623082e4543cae1bb11078c359dabbd4abbb38640c75081dca4aa2ef35bdb5ee4c856465c7b75956b88ab36d940a8df7e13adaa709ee349ed9454c7d6705211020087f361ca8cb2e83018809872a71853f0eb99a989362a3a753edbe4f58feec45c19be03b06567b357ec6779f3756b1494b74d98503d5c67ef3548ca9464d7525a3f92cdf335702a76eaaff83330f9da2c4a84b02a99ce06e0b04a1a0f1fd2f80000335b53718581ba3e14b48e381078551ff535a3d7a1671dc42898e742857f158a27d249a4d3bbe060016acdf3e9bde0095b23e073e40d56027474673321542ab30641f50f61452762d66984e33745d9456c5eba2cdafc07a52525ef1d3e221e00c92be8c3030de0338c27d281e887a63ab927478464faa7e7b0bbc68de44734c20cfd24763b8384fc6a15b2f82bf0349b86392aaa2e6fc2c95c1d0891f83a92d3b2c1deb230316eb43d9ddcbd069e600aff23ef13dd1f7b9cfade33db4872300000d1367d1907cd90da19e25e3241fb83393731c0d6183300675275017cc6287f2154abf2320cdc2cefc9df0383f98688e2e22914bef4fc32136222fb9dde45840de012e91cce1d02fbb6250a342b72c8c4155e0ff2ffa7ee71211f2641e816f200f8e725a65be98dafc395c538b2c1a009af190aedb99ecae9410257b5b295fb757dc7af138db54d06c582021442342f8924e092ae2fbf375fe94d6480910f7154b14aec033bd5cf27a2cdd225282b7a2fcaab6ac338a89d994c45976d9b7fa1000004c028933fc1b649ded455bd7739026be2bf6f7e1c0acde6dee164724218bbf1391e318017e5a6ab8248bda0bdd1f40b8301").expect("Decode failed"); + }: call( + RawOrigin::Signed(caller), + T::Lookup::unlookup(addr), + 0_u32.into(), + Weight::max_value(), + data + ) + wasm_bls12_377_add { let caller: T::AccountId = whitelisted_caller(); }: _(RawOrigin::Signed(caller.clone())) diff --git a/rpc/Cargo.toml b/rpc/Cargo.toml index 444c3c18..f357e4c1 100644 --- a/rpc/Cargo.toml +++ b/rpc/Cargo.toml @@ -33,4 +33,3 @@ pallet-transaction-payment-rpc = { version = "2.0.0", git = "https://github.com/ pallet-contracts-rpc = { version = "0.8.0", git = "https://github.com/paritytech/substrate", branch = "master" } jupiter-primitives = { path = "../primitives" } - From c7acb1ab2307d5d228c3d1df1d98d39e9924aabf Mon Sep 17 00:00:00 2001 From: clearloop Date: Mon, 21 Dec 2020 12:05:56 +0800 Subject: [PATCH 32/33] feat(benchmark/groth16): add benchmark script for groth16 --- primitives/chain-extension/src/lib.rs | 9 ++++- scripts/benchmark.sh | 54 +++++++++++++++++++++------ 2 files changed, 49 insertions(+), 14 deletions(-) mode change 100644 => 100755 scripts/benchmark.sh diff --git a/primitives/chain-extension/src/lib.rs b/primitives/chain-extension/src/lib.rs index feeef9e9..8438b9cc 100644 --- a/primitives/chain-extension/src/lib.rs +++ b/primitives/chain-extension/src/lib.rs @@ -20,8 +20,13 @@ impl ChainExtension for JupiterExt { // The memory of the vm stores buf in scale-codec let input: Vec = env.read_as()?; - let raw_output: Vec = curve::call(func_id, &input) - .map_err(|_| DispatchError::Other("Call chain extension failed"))?; + let raw_output: Vec = if jupiter_io::pairing::wasm() { + curve::call(func_id, &input) + .map_err(|_| DispatchError::Other("Call chain extension failed"))? + } else { + jupiter_io::pairing::call(func_id, &input) + .ok_or(DispatchError::Other("Call chain extension failed"))? + }; // Encode back to the memory let output: Vec = raw_output.encode(); diff --git a/scripts/benchmark.sh b/scripts/benchmark.sh old mode 100644 new mode 100755 index 26d2153d..e5142511 --- a/scripts/benchmark.sh +++ b/scripts/benchmark.sh @@ -4,26 +4,25 @@ declare -a curves=( 'bls12_381' 'bn254' 'bw6_761' - 'cp6_782' ) + declare -a exs=( 'add' 'mul' 'pairing_two' - 'pairing_six' - 'verify' ) + function bm() { - ../target/release/node-template \ + target/release/jupiter-dev \ benchmark \ -p 'pallet_template' \ -e "$1" "${@:2}" | grep 'Time ~=' -m 1 } -function main() { +function ops() { for p in "${curves[@]}" do echo "Curve: ${p}" @@ -31,19 +30,50 @@ function main() { for q in "${exs[@]}" do echo "--->${q}" - echo -n "Wasm: " + printf "Wasm: " d=wasm_"${p}"_"${q}" - bm "$d" '--execution=Wasm' '--wasm-execution=Interpreted' "-r=1000" # '|' 'grep' "'Time ~='" '-m' '1' - - # "RuIn" means the `runtime_interface` implementation in test - echo -n "RuIn: " + bm "$d" '--execution=Wasm' '--wasm-execution=Compiled' '-r=3' + printf "RuIn: " d=native_"${p}"_"${q}" - bm "$d" '--execution=Wasm' '--wasm-execution=Interpreted' "-r=1000" # '|' 'grep' "'Time ~='" '-m' '1' -# bm wasm_"${p}"_"${q}" --execution Native | grep 'Time ~=' -m 1 + bm "$d" '--execution=Wasm' '--wasm-execution=Compiled' '-r=3' done echo "" echo "" done } + +function groth16() { + echo '=========================µs' + for p in "${curves[@]}" + do + echo "---> ${p}" + bm "${p}"_verify '--execution=Wasm' '--wasm-execution=Compiled' '-r=3' + done +} + +function verify() { + echo "Wasm groth16 verification:" + # JIO_MODE=WASM + groth16 + + printf "\n\n" + + echo "NATIVE groth16 verification:" + # JIO_MODE=NATIVE + groth16 +} + +function main() { + case $1 in + groth16) + verify + ;; + *) + ops + ;; + esac + +} + main $@ From 19a1fb3a21e04a5e14b33a0f25c6f10e059cc6ea Mon Sep 17 00:00:00 2001 From: clearloop Date: Mon, 21 Dec 2020 12:19:55 +0800 Subject: [PATCH 33/33] perf(script): remove groth16 in primitives/io, enable JIO_MODE in benchmark.sh --- primitives/io/src/groth16.rs | 164 ----------------------------------- primitives/io/src/lib.rs | 2 - scripts/benchmark.sh | 6 +- 3 files changed, 2 insertions(+), 170 deletions(-) delete mode 100644 primitives/io/src/groth16.rs diff --git a/primitives/io/src/groth16.rs b/primitives/io/src/groth16.rs deleted file mode 100644 index 4764858c..00000000 --- a/primitives/io/src/groth16.rs +++ /dev/null @@ -1,164 +0,0 @@ -//! Groth16 -use curve::{CurveBasicOperations, Error, ErrorKind, SerializationError}; -use num_bigint::BigUint; -use num_traits::Num; -use sp_std::vec::Vec; - -/// Groth16 verification -pub fn verify( - curve_id: u32, - vk_gamma_abc: &[&[u8]], - vk: &[u8], - proof: &[u8], - public_inputs: &[&[u8]], -) -> Result { - match curve_id { - 0 => inner_verify::( - curve_id, - vk_gamma_abc, - vk, - proof, - public_inputs, - ), - 1 => inner_verify::( - curve_id, - vk_gamma_abc, - vk, - proof, - public_inputs, - ), - 2 => inner_verify::(curve_id, vk_gamma_abc, vk, proof, public_inputs), - 3 => { - inner_verify::(curve_id, vk_gamma_abc, vk, proof, public_inputs) - } - _ => Err(SerializationError::IoError(Error::new( - ErrorKind::Other, - "Unsupported curve", - ))), - } -} - -/// Groth16 verification inner -fn inner_verify( - curve_id: u32, - vk_gamma_abc: &[&[u8]], - vk: &[u8], - proof: &[u8], - public_inputs: &[&[u8]], -) -> Result { - let g1_len = C::G1_LEN; - let g2_len = C::G2_LEN; - let g1_g2_len = C::G2_LEN + C::G1_LEN; - let scalar_len = C::SCALAR_LEN; - - if (public_inputs.len() + 1) != vk_gamma_abc.len() { - return Err(Error::new(ErrorKind::Other, "Verifying key was malformed").into()); - } - - // First two fields are used as the sum - let mut acc = vk_gamma_abc[0].to_vec(); - - // Compute the linear combination vk_x - // [(βui(x)+αvi(x)+wi(x))/γ] ∈ G1 - // acc = sigma(i:0~l)* [(βui(x)+αvi(x)+wi(x))/γ] ∈ G1 - for (i, b) in public_inputs.iter().zip(vk_gamma_abc.iter().skip(1)) { - public_input_require_on_curve::(i).map_err(|e| Error::new(ErrorKind::Other, e))?; - - let mut mul_input = Vec::with_capacity(g1_len + scalar_len); - mul_input[0..g1_len].copy_from_slice(b); - mul_input[g1_len..g1_len + scalar_len].copy_from_slice(i); - - let mul_ic = super::pairing::call(0x3a + curve_id, &mul_input) - .ok_or_else(|| Error::new(ErrorKind::Other, "Mul Failed"))?; - - let mut acc_mul_ic = Vec::with_capacity(g1_len * 2); - acc_mul_ic[0..g1_len].copy_from_slice(acc.as_ref()); - acc_mul_ic[g1_len..g1_len * 2].copy_from_slice(mul_ic.as_ref()); - - acc = super::pairing::call(0x2a + curve_id, &*acc_mul_ic) - .ok_or_else(|| Error::new(ErrorKind::Other, "Add Failed"))?; - } - - // The original verification equation is: - // A * B = alpha * beta + acc * gamma + C * delta - // ... however, we rearrange it so that it is: - // A * B - acc * gamma - C * delta = alpha * beta - // or equivalently: - // A * B + (-acc) * gamma + (-C) * delta + (-alpha) * beta = 0 - let pairings = [ - ( - &proof[0..g1_len / 2], // G1 x - &proof[g1_len / 2..g1_len - 1], // G1 y - &proof[g1_len - 1..g1_len], // G1 infinity - &proof[g1_len..g1_len + g2_len], // G2 - ), - ( - &acc[0..g1_len / 2], - &*negate_y::(&acc[g1_len / 2..g1_len - 1]) - .map_err(|e| Error::new(ErrorKind::Other, e))?, - &acc[g1_len - 1..g1_len], - &vk[0..g2_len], - ), - ( - &proof[g1_g2_len..g1_g2_len + g1_len / 2], - &*negate_y::(&proof[g1_g2_len + g1_len / 2..g1_g2_len + g1_len - 1]) - .map_err(|e| Error::new(ErrorKind::Other, e))?, - &proof[g1_g2_len + g1_len - 1..g1_g2_len + g1_len], - &vk[g2_len..g2_len * 2], - ), - ( - &vk[g2_len * 2..g2_len * 2 + g1_len / 2], - &*negate_y::(&vk[g2_len * 2 + g1_len / 2..g2_len * 2 + g1_len - 1]) - .map_err(|e| Error::new(ErrorKind::Other, e))?, - &vk[g2_len * 2 + g1_len - 1..g2_len * 2 + g1_len], - &vk[g2_len * 2 + g1_len..g2_len * 3 + g1_len], - ), - ]; - - let mut input = Vec::with_capacity((g1_len + g2_len) * 4); - pairings.iter().for_each(|(x, y, infinity, g2)| { - input.extend_from_slice(x); - input.extend_from_slice(y); - input.extend_from_slice(infinity); - input.extend_from_slice(g2); - }); - - // Return the result of computing the pairing check - // e(p1[0], p2[0]) * .... * e(p1[n], p2[n]) == 1. - // For example pairing([P1(), P1().negate()], [P2(), P2()]) should return true. - Ok(super::pairing::call(0x4a + curve_id, &input[..]) - .ok_or_else(|| Error::new(ErrorKind::Other, "Add Failed"))?[0] - == 0) -} - -fn negate_y_based_curve(y: BigUint, prime_field: &'static str) -> Result { - let q = BigUint::from_str_radix(prime_field, 10) - .map_err(|_| "Wrong curve parameter:PRIME_FIELD")?; - let q_clone = q.clone(); - Ok(q - y % q_clone) -} - -fn negate_y(y: &[u8]) -> Result, &'static str> { - let neg_y = negate_y_based_curve(BigUint::from_bytes_be(y), C::PRIME_FIELD)?.to_bytes_be(); - - // Because of randomness, Negate_y vector might not satisfy 32 or 48 bytes. - let mut neg_y_fill_with_zero = Vec::with_capacity(y.len()); - if neg_y.len() != y.len() { - neg_y_fill_with_zero[y.len() - neg_y.len()..y.len()].copy_from_slice(&*neg_y); - } else { - neg_y_fill_with_zero[0..y.len()].copy_from_slice(&*neg_y); - } - Ok(neg_y_fill_with_zero) -} - -fn public_input_require_on_curve( - input: &[u8], -) -> Result<(), &'static str> { - if BigUint::from_bytes_be(input) - >= BigUint::from_str_radix(C::SCALAR_FIELD, 10) - .map_err(|_| "Parse wrong: public input to BigUint.")? - { - return Err("public input is invalid."); - } - Ok(()) -} diff --git a/primitives/io/src/lib.rs b/primitives/io/src/lib.rs index 3b037f9a..d637e782 100644 --- a/primitives/io/src/lib.rs +++ b/primitives/io/src/lib.rs @@ -4,8 +4,6 @@ use sp_runtime_interface::runtime_interface; use sp_std::vec::Vec; -// pub mod groth16; - /// Pairing runtime interface #[runtime_interface] pub trait Pairing { diff --git a/scripts/benchmark.sh b/scripts/benchmark.sh index e5142511..e46eae30 100755 --- a/scripts/benchmark.sh +++ b/scripts/benchmark.sh @@ -54,14 +54,12 @@ function groth16() { function verify() { echo "Wasm groth16 verification:" - # JIO_MODE=WASM - groth16 + JIO_MODE=WASM groth16 printf "\n\n" echo "NATIVE groth16 verification:" - # JIO_MODE=NATIVE - groth16 + JIO_MODE=NATIVE groth16 } function main() {