diff --git a/.gitignore b/.gitignore index 46546d017..ec95ba99a 100644 --- a/.gitignore +++ b/.gitignore @@ -4,7 +4,6 @@ # These are backup files generated by rustfmt **/*.rs.bk -tests/node_modules store/ .cargo/ .DS_Store @@ -13,3 +12,4 @@ store/ .env.direnv .direnv .env +solidity-fixtures diff --git a/Cargo.lock b/Cargo.lock index cd410be3d..982fc1687 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -130,9 +130,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.75" +version = "1.0.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" +checksum = "5ad32ce52e4161730f7098c077cd2ed6229b5804ccf99e5366be1ab72a98b4e1" [[package]] name = "aquamarine" @@ -199,7 +199,7 @@ dependencies = [ "cfg-if", "color-eyre 0.5.11", "criterion", - "ethers-core 2.0.11 (git+https://github.com/gakonst/ethers-rs)", + "ethers-core 2.0.11", "fnv", "hex", "num", @@ -876,7 +876,7 @@ checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.50", ] [[package]] @@ -1004,7 +1004,7 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.50", ] [[package]] @@ -1464,6 +1464,33 @@ dependencies = [ "zeroize", ] +[[package]] +name = "circom-proving" +version = "0.1.0" +source = "git+https://github.com/webb-tools/webb-rs#33f65ddea4478923c8e27042265928b6f6715cd9" +dependencies = [ + "ark-bn254", + "ark-circom", + "ark-crypto-primitives", + "ark-ec 0.3.0", + "ark-ff 0.3.0", + "ark-groth16 0.3.0 (git+https://github.com/arkworks-rs/groth16?rev=765817f)", + "ark-relations", + "ark-serialize 0.3.0", + "ark-std 0.3.0", + "arkworks-native-gadgets", + "cfg-if", + "color-eyre 0.6.2", + "hex", + "num-bigint", + "num-traits", + "once_cell", + "serde_json", + "thiserror", + "wasmer", + "webb", +] + [[package]] name = "clap" version = "2.34.0" @@ -1930,9 +1957,9 @@ dependencies = [ [[package]] name = "crypto-mac" -version = "0.11.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714" +checksum = "25fab6889090c8133f3deb8f73ba3c65a7f456f66436fc012a1b1e272b1e103e" dependencies = [ "generic-array 0.14.7", "subtle", @@ -2019,7 +2046,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.50", ] [[package]] @@ -2080,7 +2107,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.10.0", - "syn 2.0.40", + "syn 2.0.50", ] [[package]] @@ -2102,7 +2129,7 @@ checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" dependencies = [ "darling_core 0.20.3", "quote", - "syn 2.0.40", + "syn 2.0.50", ] [[package]] @@ -2291,7 +2318,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.40", + "syn 2.0.50", "termcolor", "toml 0.8.2", "walkdir", @@ -2490,7 +2517,7 @@ dependencies = [ "darling 0.20.3", "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.50", ] [[package]] @@ -2587,13 +2614,13 @@ dependencies = [ [[package]] name = "ethers" -version = "2.0.10" +version = "2.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad13497f6e0a24292fc7b408e30d22fe9dc262da1f40d7b542c3a44e7fc0476" +checksum = "6c7cd562832e2ff584fa844cd2f6e5d4f35bbe11b28c7c9b8df957b2e1d0c701" dependencies = [ "ethers-addressbook", "ethers-contract", - "ethers-core 2.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "ethers-core 2.0.13", "ethers-etherscan", "ethers-middleware", "ethers-providers", @@ -2603,11 +2630,11 @@ dependencies = [ [[package]] name = "ethers-addressbook" -version = "2.0.11" +version = "2.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c405f24ea3a517899ba7985385c43dc4a7eb1209af3b1e0a1a32d7dcc7f8d09" +checksum = "35dc9a249c066d17e8947ff52a4116406163cf92c7f0763cb8c001760b26403f" dependencies = [ - "ethers-core 2.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "ethers-core 2.0.13", "once_cell", "serde", "serde_json", @@ -2615,14 +2642,14 @@ dependencies = [ [[package]] name = "ethers-contract" -version = "2.0.11" +version = "2.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0111ead599d17a7bff6985fd5756f39ca7033edc79a31b23026a8d5d64fa95cd" +checksum = "43304317c7f776876e47f2f637859f6d0701c1ec7930a150f169d5fbe7d76f5a" dependencies = [ "const-hex", "ethers-contract-abigen", "ethers-contract-derive", - "ethers-core 2.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "ethers-core 2.0.13", "ethers-providers", "futures-util", "once_cell", @@ -2634,14 +2661,14 @@ dependencies = [ [[package]] name = "ethers-contract-abigen" -version = "2.0.11" +version = "2.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51258120c6b47ea9d9bec0d90f9e8af71c977fbefbef8213c91bfed385fe45eb" +checksum = "f9f96502317bf34f6d71a3e3d270defaa9485d754d789e15a8e04a84161c95eb" dependencies = [ "Inflector", "const-hex", "dunce", - "ethers-core 2.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "ethers-core 2.0.13", "eyre", "prettyplease", "proc-macro2", @@ -2649,36 +2676,34 @@ dependencies = [ "regex", "serde", "serde_json", - "syn 2.0.40", + "syn 2.0.50", "toml 0.8.2", "walkdir", ] [[package]] name = "ethers-contract-derive" -version = "2.0.11" +version = "2.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "936e7a0f1197cee2b62dc89f63eff3201dbf87c283ff7e18d86d38f83b845483" +checksum = "452ff6b0a64507ce8d67ffd48b1da3b42f03680dcf5382244e9c93822cbbf5de" dependencies = [ "Inflector", "const-hex", "ethers-contract-abigen", - "ethers-core 2.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "ethers-core 2.0.13", "proc-macro2", "quote", "serde_json", - "syn 2.0.40", + "syn 2.0.50", ] [[package]] name = "ethers-core" version = "2.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f03e0bdc216eeb9e355b90cf610ef6c5bb8aca631f97b5ae9980ce34ea7878d" +source = "git+https://github.com/gakonst/ethers-rs#40cc8cc54f7d36aa24147c937772600e5b119399" dependencies = [ "arrayvec 0.7.4", "bytes", - "cargo_metadata", "chrono", "const-hex", "elliptic-curve", @@ -2686,14 +2711,12 @@ dependencies = [ "generic-array 0.14.7", "k256", "num_enum", - "once_cell", "open-fastrlp", "rand 0.8.5", "rlp", "serde", "serde_json", "strum", - "syn 2.0.40", "tempfile", "thiserror", "tiny-keccak", @@ -2702,11 +2725,13 @@ dependencies = [ [[package]] name = "ethers-core" -version = "2.0.11" -source = "git+https://github.com/gakonst/ethers-rs#40cc8cc54f7d36aa24147c937772600e5b119399" +version = "2.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aab3cef6cc1c9fd7f787043c81ad3052eff2b96a3878ef1526aa446311bdbfc9" dependencies = [ "arrayvec 0.7.4", "bytes", + "cargo_metadata", "chrono", "const-hex", "elliptic-curve", @@ -2714,12 +2739,14 @@ dependencies = [ "generic-array 0.14.7", "k256", "num_enum", + "once_cell", "open-fastrlp", "rand 0.8.5", "rlp", "serde", "serde_json", "strum", + "syn 2.0.50", "tempfile", "thiserror", "tiny-keccak", @@ -2728,12 +2755,12 @@ dependencies = [ [[package]] name = "ethers-etherscan" -version = "2.0.11" +version = "2.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abbac2c890bdbe0f1b8e549a53b00e2c4c1de86bb077c1094d1f38cdf9381a56" +checksum = "16d45b981f5fa769e1d0343ebc2a44cfa88c9bc312eb681b676318b40cef6fb1" dependencies = [ "chrono", - "ethers-core 2.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "ethers-core 2.0.13", "ethers-solc", "reqwest", "semver 1.0.20", @@ -2745,14 +2772,15 @@ dependencies = [ [[package]] name = "ethers-middleware" -version = "2.0.11" +version = "2.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "681ece6eb1d10f7cf4f873059a77c04ff1de4f35c63dd7bccde8f438374fcb93" +checksum = "145211f34342487ef83a597c1e69f0d3e01512217a7c72cc8a25931854c7dca0" dependencies = [ "async-trait", "auto_impl", "ethers-contract", - "ethers-core 2.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "ethers-core 2.0.13", + "ethers-etherscan", "ethers-providers", "ethers-signers", "futures-channel", @@ -2771,9 +2799,9 @@ dependencies = [ [[package]] name = "ethers-providers" -version = "2.0.11" +version = "2.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25d6c0c9455d93d4990c06e049abf9b30daf148cf461ee939c11d88907c60816" +checksum = "fb6b15393996e3b8a78ef1332d6483c11d839042c17be58decc92fa8b1c3508a" dependencies = [ "async-trait", "auto_impl", @@ -2781,7 +2809,7 @@ dependencies = [ "bytes", "const-hex", "enr", - "ethers-core 2.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "ethers-core 2.0.13", "futures-core", "futures-timer", "futures-util", @@ -2807,9 +2835,9 @@ dependencies = [ [[package]] name = "ethers-signers" -version = "2.0.11" +version = "2.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cb1b714e227bbd2d8c53528adb580b203009728b17d0d0e4119353aa9bc5532" +checksum = "b3b125a103b56aef008af5d5fb48191984aa326b50bfd2557d231dc499833de3" dependencies = [ "async-trait", "coins-bip32", @@ -2817,7 +2845,7 @@ dependencies = [ "const-hex", "elliptic-curve", "eth-keystore", - "ethers-core 2.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "ethers-core 2.0.13", "rand 0.8.5", "sha2 0.10.8", "thiserror", @@ -2826,15 +2854,15 @@ dependencies = [ [[package]] name = "ethers-solc" -version = "2.0.11" +version = "2.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a64f710586d147864cff66540a6d64518b9ff37d73ef827fee430538265b595f" +checksum = "d21df08582e0a43005018a858cc9b465c5fff9cf4056651be64f844e57d1f55f" dependencies = [ "cfg-if", "const-hex", "dirs", "dunce", - "ethers-core 2.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "ethers-core 2.0.13", "glob", "home", "md-5", @@ -2903,7 +2931,7 @@ dependencies = [ "fs-err", "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.50", ] [[package]] @@ -3108,7 +3136,7 @@ dependencies = [ "proc-macro-warning", "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.50", ] [[package]] @@ -3117,10 +3145,10 @@ version = "4.0.0-dev" source = "git+https://github.com/paritytech/polkadot-sdk?branch=release-polkadot-v1.1.0#c8d2251cafadc108ba2f1f8a3208dc547ff38901" dependencies = [ "frame-support-procedural-tools-derive", - "proc-macro-crate 1.3.1", + "proc-macro-crate 1.1.3", "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.50", ] [[package]] @@ -3130,7 +3158,7 @@ source = "git+https://github.com/paritytech/polkadot-sdk?branch=release-polkadot dependencies = [ "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.50", ] [[package]] @@ -3160,9 +3188,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" dependencies = [ "futures-channel", "futures-core", @@ -3175,9 +3203,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" dependencies = [ "futures-core", "futures-sink", @@ -3185,15 +3213,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" [[package]] name = "futures-executor" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" dependencies = [ "futures-core", "futures-task", @@ -3203,9 +3231,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" [[package]] name = "futures-lite" @@ -3247,26 +3275,26 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.50", ] [[package]] name = "futures-sink" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" [[package]] name = "futures-task" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" [[package]] name = "futures-timer" @@ -3280,9 +3308,9 @@ dependencies = [ [[package]] name = "futures-util" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ "futures-channel", "futures-core", @@ -3551,7 +3579,7 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" dependencies = [ - "crypto-mac 0.11.1", + "crypto-mac 0.11.0", "digest 0.9.0", ] @@ -4227,7 +4255,7 @@ dependencies = [ "macro_magic_core", "macro_magic_macros", "quote", - "syn 2.0.40", + "syn 2.0.50", ] [[package]] @@ -4241,7 +4269,7 @@ dependencies = [ "macro_magic_core_macros", "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.50", ] [[package]] @@ -4252,7 +4280,7 @@ checksum = "d710e1214dffbab3b5dacb21475dde7d6ed84c69ff722b3a47a782668d44fbac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.50", ] [[package]] @@ -4263,7 +4291,7 @@ checksum = "b8fb85ec1620619edf2984a7693497d4ec88a9665d8b87e942856884c92dbf2a" dependencies = [ "macro_magic_core", "quote", - "syn 2.0.40", + "syn 2.0.50", ] [[package]] @@ -4446,6 +4474,17 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" +[[package]] +name = "nix" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" +dependencies = [ + "bitflags 2.4.1", + "cfg-if", + "libc", +] + [[package]] name = "no-std-net" version = "0.6.0" @@ -4607,7 +4646,7 @@ dependencies = [ "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.50", ] [[package]] @@ -4715,7 +4754,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.50", ] [[package]] @@ -4908,7 +4947,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d95f5254224e617595d2cc3cc73ff0a5eaf2637519e25f03388154e9378b6ffa" dependencies = [ - "crypto-mac 0.11.1", + "crypto-mac 0.11.0", ] [[package]] @@ -5006,7 +5045,7 @@ dependencies = [ "phf_shared 0.11.2", "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.50", ] [[package]] @@ -5044,7 +5083,7 @@ checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.50", ] [[package]] @@ -5198,7 +5237,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae005bd773ab59b4725093fd7df83fd7892f7d8eafb48dbd7de6e024e4215f9d" dependencies = [ "proc-macro2", - "syn 2.0.40", + "syn 2.0.50", ] [[package]] @@ -5217,12 +5256,12 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "1.3.1" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +checksum = "e17d47ce914bf4de440332250b0edd23ce48c005f59fab39d3335866b114f11a" dependencies = [ - "once_cell", - "toml_edit 0.19.15", + "thiserror", + "toml 0.5.11", ] [[package]] @@ -5267,14 +5306,14 @@ checksum = "3d1eaa7fa0aa1929ffdf7eeb6eac234dde6268914a14ad44d23521ab6a9b258e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.50", ] [[package]] name = "proc-macro2" -version = "1.0.70" +version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" +checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" dependencies = [ "unicode-ident", ] @@ -5340,9 +5379,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.33" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ "proc-macro2", ] @@ -5499,7 +5538,7 @@ checksum = "7f7473c2cfcf90008193dd0e3e16599455cb601a9fce322b5bb55de799664925" dependencies = [ "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.50", ] [[package]] @@ -5575,6 +5614,32 @@ dependencies = [ "winapi", ] +[[package]] +name = "relayer-integration-tests" +version = "0.5.15-dev" +dependencies = [ + "anyhow", + "ark-bn254", + "ark-ff 0.3.0", + "arkworks-setups", + "dotenv", + "futures", + "hex", + "reqwest", + "serde_json", + "tempfile", + "tokio", + "tracing", + "webb", + "webb-evm-test-utils", + "webb-relayer", + "webb-relayer-config", + "webb-relayer-context", + "webb-relayer-handler-utils", + "webb-relayer-store", + "webb-relayer-tx-relay-utils", +] + [[package]] name = "rend" version = "0.4.1" @@ -5984,7 +6049,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "27873eb6005868f8cc72dcfe109fae664cf51223d35387bc2f28be4c28d94c47" dependencies = [ "darling 0.14.4", - "proc-macro-crate 1.3.1", + "proc-macro-crate 1.1.3", "proc-macro2", "quote", "syn 1.0.109", @@ -6012,7 +6077,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "995491f110efdc6bea96d6a746140e32bfceb4ea47510750a5467295a4707a25" dependencies = [ "darling 0.14.4", - "proc-macro-crate 1.3.1", + "proc-macro-crate 1.1.3", "proc-macro2", "quote", "syn 1.0.109", @@ -6038,7 +6103,7 @@ version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "abf2c68b89cafb3b8d918dd07b42be0da66ff202cf1155c5739a4e0c1ea0dc19" dependencies = [ - "proc-macro-crate 1.3.1", + "proc-macro-crate 1.1.3", "proc-macro2", "quote", "syn 1.0.109", @@ -6310,7 +6375,7 @@ checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.50", ] [[package]] @@ -6700,10 +6765,10 @@ dependencies = [ "Inflector", "blake2 0.10.6", "expander", - "proc-macro-crate 1.3.1", + "proc-macro-crate 1.1.3", "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.50", ] [[package]] @@ -6815,7 +6880,7 @@ source = "git+https://github.com/paritytech/polkadot-sdk?branch=release-polkadot dependencies = [ "quote", "sp-core-hashing 9.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=release-polkadot-v1.1.0)", - "syn 2.0.40", + "syn 2.0.50", ] [[package]] @@ -6825,7 +6890,7 @@ source = "git+https://github.com/paritytech/polkadot-sdk?branch=release-polkadot dependencies = [ "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.50", ] [[package]] @@ -6967,10 +7032,10 @@ version = "11.0.0" source = "git+https://github.com/paritytech/polkadot-sdk?branch=release-polkadot-v1.1.0#c8d2251cafadc108ba2f1f8a3208dc547ff38901" dependencies = [ "Inflector", - "proc-macro-crate 1.3.1", + "proc-macro-crate 1.1.3", "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.50", ] [[package]] @@ -7092,7 +7157,7 @@ dependencies = [ "parity-scale-codec", "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.50", ] [[package]] @@ -7241,7 +7306,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.40", + "syn 2.0.50", ] [[package]] @@ -7259,9 +7324,9 @@ dependencies = [ [[package]] name = "subtle" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "subtle-ng" @@ -7316,7 +7381,7 @@ dependencies = [ "quote", "scale-info", "subxt-metadata", - "syn 2.0.40", + "syn 2.0.50", "thiserror", "tokio", ] @@ -7347,7 +7412,7 @@ dependencies = [ "darling 0.20.3", "proc-macro-error", "subxt-codegen", - "syn 2.0.40", + "syn 2.0.50", ] [[package]] @@ -7398,9 +7463,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.40" +version = "2.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13fa70a4ee923979ffb522cacce59d34421ebdea5625e1073c4326ef9d2dd42e" +checksum = "74f1bdc9872430ce9b75da68329d1c1746faf50ffac5f19e02b71e37ff881ffb" dependencies = [ "proc-macro2", "quote", @@ -7514,7 +7579,7 @@ checksum = "e4c60d69f36615a077cc7663b9cb8e42275722d23e58a7fa3d2c7f2915d09d04" dependencies = [ "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.50", ] [[package]] @@ -7525,7 +7590,7 @@ checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.50", ] [[package]] @@ -7647,7 +7712,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.50", ] [[package]] @@ -7833,7 +7898,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.50", ] [[package]] @@ -8040,6 +8105,15 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "typed-builder" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe83c85a85875e8c4cb9ce4a890f05b23d38cd0d47647db7895d3d2a79566d2" +dependencies = [ + "typed-builder-macro 0.15.2", +] + [[package]] name = "typed-builder" version = "0.16.2" @@ -8058,6 +8132,17 @@ dependencies = [ "typed-builder-macro 0.18.1", ] +[[package]] +name = "typed-builder-macro" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29a3151c41d0b13e3d011f98adc24434560ef06673a155a6c7f66b9879eecce2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.50", +] + [[package]] name = "typed-builder-macro" version = "0.16.2" @@ -8066,7 +8151,7 @@ checksum = "f03ca4cb38206e2bef0700092660bb74d696f808514dae47fa1467cbfe26e96e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.50", ] [[package]] @@ -8077,7 +8162,7 @@ checksum = "563b3b88238ec95680aef36bdece66896eaa7ce3c0f1b4f39d38fb2435261352" dependencies = [ "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.50", ] [[package]] @@ -8287,7 +8372,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.50", "wasm-bindgen-shared", ] @@ -8321,7 +8406,7 @@ checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" dependencies = [ "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.50", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -8795,8 +8880,7 @@ dependencies = [ [[package]] name = "webb" version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb8e659d1f8d68e6d7d97b364136b76f8484b22cbeb7c86f4d899403866cc293" +source = "git+https://github.com/webb-tools/webb-rs#33f65ddea4478923c8e27042265928b6f6715cd9" dependencies = [ "async-trait", "ethers", @@ -8822,7 +8906,7 @@ dependencies = [ "quote", "serde", "serde_json", - "syn 2.0.40", + "syn 2.0.50", "toml 0.7.8", ] @@ -8874,22 +8958,42 @@ dependencies = [ ] [[package]] -name = "webb-ew-dkg" -version = "0.5.15-dev" +name = "webb-evm-test-utils" +version = "0.1.0" +source = "git+https://github.com/webb-tools/webb-rs#33f65ddea4478923c8e27042265928b6f6715cd9" dependencies = [ - "async-trait", - "ethereum-types", + "ark-bls12-381 0.3.0", + "ark-bn254", + "ark-circom", + "ark-crypto-primitives", + "ark-ec 0.3.0", + "ark-ff 0.3.0", + "ark-groth16 0.3.0 (git+https://github.com/arkworks-rs/groth16?rev=765817f)", + "ark-relations", + "ark-serialize 0.3.0", + "ark-std 0.3.0", + "arkworks-native-gadgets", + "arkworks-setups", + "cfg-if", + "circom-proving", + "color-eyre 0.6.2", + "futures", "hex", - "native-tls", - "sled", + "nix", + "num-bigint", + "num-traits", + "once_cell", + "parity-scale-codec", + "rand 0.8.5", + "serde", + "serde_json", + "tempfile", + "thiserror", "tokio", - "tracing", + "typed-builder 0.15.2", + "wasmer", "webb", - "webb-event-watcher-traits", "webb-proposals", - "webb-relayer-config", - "webb-relayer-store", - "webb-relayer-utils", ] [[package]] @@ -8922,6 +9026,25 @@ dependencies = [ "webb-relayer-utils", ] +[[package]] +name = "webb-ew-tangle" +version = "0.5.15-dev" +dependencies = [ + "async-trait", + "ethereum-types", + "hex", + "native-tls", + "sled", + "tokio", + "tracing", + "webb", + "webb-event-watcher-traits", + "webb-proposals", + "webb-relayer-config", + "webb-relayer-store", + "webb-relayer-utils", +] + [[package]] name = "webb-price-oracle-backends" version = "0.5.15-dev" @@ -8965,11 +9088,11 @@ dependencies = [ [[package]] name = "webb-proposal-derive" version = "0.1.0" -source = "git+https://github.com/webb-tools/webb-rs#8a36d59110fad4861a1452330a61440137715a6f" +source = "git+https://github.com/webb-tools/webb-rs#33f65ddea4478923c8e27042265928b6f6715cd9" dependencies = [ - "ethers-core 2.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "ethers-core 2.0.13", "quote", - "syn 2.0.40", + "syn 2.0.50", ] [[package]] @@ -9001,7 +9124,7 @@ dependencies = [ [[package]] name = "webb-proposals" version = "0.8.0" -source = "git+https://github.com/webb-tools/webb-rs#8a36d59110fad4861a1452330a61440137715a6f" +source = "git+https://github.com/webb-tools/webb-rs#33f65ddea4478923c8e27042265928b6f6715cd9" dependencies = [ "frame-support", "hex", @@ -9029,15 +9152,14 @@ dependencies = [ "serde_json", "sled", "subxt-signer", - "tempfile", "tokio", "tower-http", "tracing", "url", "webb", "webb-event-watcher-traits", - "webb-ew-dkg", "webb-ew-evm", + "webb-ew-tangle", "webb-proposal-signing-backends", "webb-proposals", "webb-relayer-config", @@ -9631,7 +9753,7 @@ checksum = "be912bf68235a88fbefd1b73415cb218405958d1655b2ece9035a19920bdf6ba" dependencies = [ "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.50", ] [[package]] @@ -9651,5 +9773,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.50", ] diff --git a/Cargo.toml b/Cargo.toml index 9679ad3d2..54d50e343 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,7 +8,7 @@ repository = "https://github.com/webb-tools/relayer" edition = "2021" [workspace] -members = [".", "crates/*", "event-watchers/*", "services/webb-relayer"] +members = [".", "crates/*", "event-watchers/*", "services/webb-relayer", "relayer-tests"] [workspace.dependencies] webb-price-oracle-backends = { path = "crates/price-oracle-backends" } @@ -22,10 +22,11 @@ webb-relayer-context = { path = "crates/relayer-context" } webb-relayer-utils = { path = "crates/relayer-utils" } webb-chains-info = { path = "crates/chains-info" } webb-event-watcher-traits = { path = "crates/event-watcher-traits" } -webb-ew-dkg = { path = "event-watchers/dkg" } +webb-ew-tangle = { path = "event-watchers/tangle" } webb-ew-evm = { path = "event-watchers/evm" } webb-relayer-handler-utils = { path = "crates/relayer-handler-utils" } +webb-relayer-tx-relay-utils = { path = "crates/tx-relay-utils" } webb-relayer-types = { path = "crates/relayer-types" } webb-relayer = { path = "services/webb-relayer" } webb-proof-generation = { path = "crates/proof-generation" } @@ -41,7 +42,8 @@ tokio = { version = "^1", features = ["full"] } config = { version = "0.13", default-features = false, features = ["toml", "json"] } serde_json = { version = "^1", default-features = false } paw = { version = "^1.0" } -webb = { version = "0.8.4", default-features = false } +webb = { git = "https://github.com/webb-tools/webb-rs", default-features = false } +webb-evm-test-utils = { git = "https://github.com/webb-tools/webb-rs", default-features = false } subxt-signer = { version = "0.31", features = ["subxt"] } # Used by ethers (but we need it to be vendored with the lib). native-tls = { version = "^0.2", features = ["vendored"] } @@ -53,7 +55,7 @@ axum = { version = "0.6.12", features = ["ws"] } reqwest = { version = "0.11", default-features = false, features = ["json", "rustls-tls"] } tempfile = "^3.3" async-trait = "^0.1" -futures = { version = "^0.3", default-features = false } +futures = { version = "0.3.30", default-features = false } parking_lot = "^0.12" rand = { version = "0.8", default-features = false, features = ["getrandom"] } typed-builder = "0.16.0" diff --git a/crates/circom-proving/src/lib.rs b/crates/circom-proving/src/lib.rs index 1e8e9ef0c..725663ae8 100644 --- a/crates/circom-proving/src/lib.rs +++ b/crates/circom-proving/src/lib.rs @@ -1,3 +1,18 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + use ark_bn254::{Bn254, Fr}; use ark_circom::{CircomReduction, WitnessCalculator}; diff --git a/crates/event-watcher-traits/src/evm/bridge_watcher.rs b/crates/event-watcher-traits/src/evm/bridge_watcher.rs index 9adcc4956..6852adee4 100644 --- a/crates/event-watcher-traits/src/evm/bridge_watcher.rs +++ b/crates/event-watcher-traits/src/evm/bridge_watcher.rs @@ -1,16 +1,17 @@ -// Copyright 2022 Webb Technologies Inc. +// Copyright (C) 2022-2024 Webb Technologies Inc. // -// 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 +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. // -// 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. +// You should receive a copy of the GNU General Public License +// If not, see . use super::{event_watcher::EventWatcher, *}; use tokio::sync::Mutex; diff --git a/crates/event-watcher-traits/src/evm/event_watcher.rs b/crates/event-watcher-traits/src/evm/event_watcher.rs index 795fa7363..763fda5e6 100644 --- a/crates/event-watcher-traits/src/evm/event_watcher.rs +++ b/crates/event-watcher-traits/src/evm/event_watcher.rs @@ -1,16 +1,17 @@ -// Copyright 2022 Webb Technologies Inc. +// Copyright (C) 2022-2024 Webb Technologies Inc. // -// 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 +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. // -// 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. +// You should receive a copy of the GNU General Public License +// If not, see . use super::*; use tokio::sync::Mutex; diff --git a/crates/event-watcher-traits/src/evm/mod.rs b/crates/event-watcher-traits/src/evm/mod.rs index b544eb131..4c93ff2c9 100644 --- a/crates/event-watcher-traits/src/evm/mod.rs +++ b/crates/event-watcher-traits/src/evm/mod.rs @@ -1,16 +1,17 @@ -// Copyright 2022 Webb Technologies Inc. +// Copyright (C) 2022-2024 Webb Technologies Inc. // -// 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 +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. // -// 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. +// You should receive a copy of the GNU General Public License +// If not, see . #![warn(missing_docs)] //! # EVM Events Watcher Traits 🕸️ diff --git a/crates/event-watcher-traits/src/lib.rs b/crates/event-watcher-traits/src/lib.rs index 2582d4aac..5234f38b7 100644 --- a/crates/event-watcher-traits/src/lib.rs +++ b/crates/event-watcher-traits/src/lib.rs @@ -1,16 +1,17 @@ -// Copyright 2022 Webb Technologies Inc. +// Copyright (C) 2022-2024 Webb Technologies Inc. // -// 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 +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. // -// 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. +// You should receive a copy of the GNU General Public License +// If not, see . #![warn(missing_docs)] //! # Relayer Events Watcher Module 🕸️ diff --git a/crates/event-watcher-traits/src/substrate/event_watcher.rs b/crates/event-watcher-traits/src/substrate/event_watcher.rs index e7003d362..d55c4981f 100644 --- a/crates/event-watcher-traits/src/substrate/event_watcher.rs +++ b/crates/event-watcher-traits/src/substrate/event_watcher.rs @@ -1,16 +1,17 @@ -// Copyright 2022 Webb Technologies Inc. +// Copyright (C) 2022-2024 Webb Technologies Inc. // -// 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 +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. // -// 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. +// You should receive a copy of the GNU General Public License +// If not, see . use tokio::sync::Mutex; use webb::substrate::subxt::{config::Header, OnlineClient}; diff --git a/crates/event-watcher-traits/src/substrate/mod.rs b/crates/event-watcher-traits/src/substrate/mod.rs index aa6095a59..a76e10249 100644 --- a/crates/event-watcher-traits/src/substrate/mod.rs +++ b/crates/event-watcher-traits/src/substrate/mod.rs @@ -1,16 +1,17 @@ -// Copyright 2022 Webb Technologies Inc. +// Copyright (C) 2022-2024 Webb Technologies Inc. // -// 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 +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. // -// 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. +// You should receive a copy of the GNU General Public License +// If not, see . //! # Substrate Events Watcher Traits 🕸️ diff --git a/crates/event-watcher-traits/src/tests.rs b/crates/event-watcher-traits/src/tests.rs index a13d681c2..21805667d 100644 --- a/crates/event-watcher-traits/src/tests.rs +++ b/crates/event-watcher-traits/src/tests.rs @@ -1,16 +1,17 @@ -// Copyright 2022 Webb Technologies Inc. +// Copyright (C) 2022-2024 Webb Technologies Inc. // -// 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 +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. // -// 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. +// You should receive a copy of the GNU General Public License +// If not, see . use std::sync::Arc; use tokio::sync::Mutex; diff --git a/crates/price-oracle-backends/src/cached.rs b/crates/price-oracle-backends/src/cached.rs index a60e3dfda..a8586d4d7 100644 --- a/crates/price-oracle-backends/src/cached.rs +++ b/crates/price-oracle-backends/src/cached.rs @@ -1,3 +1,18 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + use std::{collections::HashSet, time::Duration}; use chrono::{DateTime, NaiveDateTime, Utc}; diff --git a/crates/price-oracle-backends/src/coingecko.rs b/crates/price-oracle-backends/src/coingecko.rs index de630fd0a..83e797e08 100644 --- a/crates/price-oracle-backends/src/coingecko.rs +++ b/crates/price-oracle-backends/src/coingecko.rs @@ -1,3 +1,18 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + //! Price Backend implementation for `CoinGecko` use std::{collections::HashMap, sync::Arc}; diff --git a/crates/price-oracle-backends/src/dummy.rs b/crates/price-oracle-backends/src/dummy.rs index a4529feac..127c28193 100644 --- a/crates/price-oracle-backends/src/dummy.rs +++ b/crates/price-oracle-backends/src/dummy.rs @@ -1,3 +1,18 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + use webb_relayer_utils::Result; /// A Dummy Price Oracle Backend diff --git a/crates/price-oracle-backends/src/lib.rs b/crates/price-oracle-backends/src/lib.rs index 4c8526265..bd8a18ff3 100644 --- a/crates/price-oracle-backends/src/lib.rs +++ b/crates/price-oracle-backends/src/lib.rs @@ -1,16 +1,17 @@ -// Copyright 2022 Webb Technologies Inc. +// Copyright (C) 2022-2024 Webb Technologies Inc. // -// 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 +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. // -// 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. +// You should receive a copy of the GNU General Public License +// If not, see . //! Price Oracle Backends //! diff --git a/crates/price-oracle-backends/src/merger.rs b/crates/price-oracle-backends/src/merger.rs index 69c3399eb..416cb7cb7 100644 --- a/crates/price-oracle-backends/src/merger.rs +++ b/crates/price-oracle-backends/src/merger.rs @@ -1,3 +1,18 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + use webb_relayer_utils::Result; /// A Price Oracle Merger backend is a backend that builds on top of other backends and merges the diff --git a/crates/proposal-signing-backends/src/lib.rs b/crates/proposal-signing-backends/src/lib.rs index 8db80b37f..5725524d6 100644 --- a/crates/proposal-signing-backends/src/lib.rs +++ b/crates/proposal-signing-backends/src/lib.rs @@ -1,16 +1,17 @@ -// Copyright 2022 Webb Technologies Inc. +// Copyright (C) 2022-2024 Webb Technologies Inc. // -// 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 +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. // -// 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. +// You should receive a copy of the GNU General Public License +// If not, see . #![warn(missing_docs)] //! # Relayer Proposal Signing Backends 🕸️ @@ -20,7 +21,7 @@ //! Proposal signing backends are used to sign the proposals that are generated by the relayer. //! There are two types of proposal signing backends: //! - `MockedProposalSigningBackend`: This is a mocked proposal signing backend that is used for testing purposes. -//! - `DkgProposalSigningRulesBackend`: This is the actual proposal signing backend that is used in production. +//! - `SigningRulesBackend`: This is the actual proposal signing backend that is used in production. //! //! This crate also contains the proposal queue that is used to queue the proposals that are generated by the relayer. @@ -37,7 +38,7 @@ use webb_proposals::ProposalTrait; pub mod proposal_handler; #[doc(hidden)] -pub mod dkg; +pub mod signing_rules; #[doc(hidden)] pub mod mocked; @@ -45,11 +46,11 @@ pub mod mocked; /// A module to handle the queue of proposals pub mod queue; -/// A module that Implements the DKG Proposal Signing Backend. -pub use dkg::*; -/// A module that Implements the Mocked Proposal Signing Backend. +/// A module that handles proposal signing using Mocked Proposal Signing Backend. pub use mocked::*; -use webb_relayer_config::signing_backend::DkgProposalSigningBackendConfig; +/// A module that handles proposal signing using Signing Rules Contract. +pub use signing_rules::*; +use webb_relayer_config::signing_backend::SigningRulesBackendConfig; use webb_relayer_utils::metric; /// A Proposal Signing Backend is responsible for signing proposal `P` where `P` is anything really depending on the @@ -81,7 +82,7 @@ where M: Middleware, { /// Signing rules contract config. - pub config: DkgProposalSigningBackendConfig, + pub config: SigningRulesBackendConfig, /// Contratc pub contract: SigningRulesContract, } @@ -91,10 +92,7 @@ where M: Middleware, { /// Creates wrapper around SigningRulesContract. - pub fn new( - config: DkgProposalSigningBackendConfig, - client: Arc, - ) -> Self { + pub fn new(config: SigningRulesBackendConfig, client: Arc) -> Self { Self { contract: SigningRulesContract::new(config.address, client), config, diff --git a/crates/proposal-signing-backends/src/mocked.rs b/crates/proposal-signing-backends/src/mocked.rs index 2fbd566c8..1ceec9bde 100644 --- a/crates/proposal-signing-backends/src/mocked.rs +++ b/crates/proposal-signing-backends/src/mocked.rs @@ -1,3 +1,18 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + use std::collections::HashSet; use std::sync::Arc; use tokio::sync::Mutex; diff --git a/crates/proposal-signing-backends/src/proposal_handler.rs b/crates/proposal-signing-backends/src/proposal_handler.rs index 5213effbb..896018e6d 100644 --- a/crates/proposal-signing-backends/src/proposal_handler.rs +++ b/crates/proposal-signing-backends/src/proposal_handler.rs @@ -1,16 +1,17 @@ -// Copyright 2022 Webb Technologies Inc. +// Copyright (C) 2022-2024 Webb Technologies Inc. // -// 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 +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. // -// 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. +// You should receive a copy of the GNU General Public License +// If not, see . use crate::ProposalSigningBackend; use std::sync::Arc; diff --git a/crates/proposal-signing-backends/src/queue/mem.rs b/crates/proposal-signing-backends/src/queue/mem.rs index 23e052203..44d7b9ade 100644 --- a/crates/proposal-signing-backends/src/queue/mem.rs +++ b/crates/proposal-signing-backends/src/queue/mem.rs @@ -1,3 +1,18 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + use parking_lot::RwLock; use std::collections::VecDeque; use std::sync::Arc; diff --git a/crates/proposal-signing-backends/src/queue/mod.rs b/crates/proposal-signing-backends/src/queue/mod.rs index d9ebbce33..9eb23d477 100644 --- a/crates/proposal-signing-backends/src/queue/mod.rs +++ b/crates/proposal-signing-backends/src/queue/mod.rs @@ -1,3 +1,18 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + use std::sync::{atomic, Arc}; use tokio::sync::Mutex; diff --git a/crates/proposal-signing-backends/src/queue/policy/mod.rs b/crates/proposal-signing-backends/src/queue/policy/mod.rs index 316faf695..7e963c639 100644 --- a/crates/proposal-signing-backends/src/queue/policy/mod.rs +++ b/crates/proposal-signing-backends/src/queue/policy/mod.rs @@ -1,3 +1,18 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + mod nonce; mod time; diff --git a/crates/proposal-signing-backends/src/queue/policy/nonce.rs b/crates/proposal-signing-backends/src/queue/policy/nonce.rs index fbc187f47..f347b77ad 100644 --- a/crates/proposal-signing-backends/src/queue/policy/nonce.rs +++ b/crates/proposal-signing-backends/src/queue/policy/nonce.rs @@ -1,3 +1,18 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + use webb_proposals::ProposalTrait; use crate::queue::ProposalsQueue; diff --git a/crates/proposal-signing-backends/src/queue/policy/time.rs b/crates/proposal-signing-backends/src/queue/policy/time.rs index 854e21515..310c9609a 100644 --- a/crates/proposal-signing-backends/src/queue/policy/time.rs +++ b/crates/proposal-signing-backends/src/queue/policy/time.rs @@ -1,3 +1,18 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + use parking_lot::Mutex; use std::{ ops::Add, diff --git a/crates/proposal-signing-backends/src/dkg.rs b/crates/proposal-signing-backends/src/signing_rules.rs similarity index 81% rename from crates/proposal-signing-backends/src/dkg.rs rename to crates/proposal-signing-backends/src/signing_rules.rs index 30f2a2ae3..d8ff11aaa 100644 --- a/crates/proposal-signing-backends/src/dkg.rs +++ b/crates/proposal-signing-backends/src/signing_rules.rs @@ -1,3 +1,18 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + use crate::SigningRulesContractWrapper; use std::sync::Arc; use tokio::sync::Mutex; @@ -14,7 +29,7 @@ use webb_relayer_utils::metric; /// A ProposalSigningBackend that uses Signing Rules Contract for Signing Proposals. #[derive(typed_builder::TypedBuilder)] -pub struct DkgProposalSigningRulesBackend { +pub struct SigningRulesBackend { /// Signing rules contract wrapper: SigningRulesContractWrapper, /// Something that implements the QueueStore trait. @@ -29,7 +44,7 @@ pub struct DkgProposalSigningRulesBackend { //AnchorUpdateProposal for evm #[async_trait::async_trait] -impl super::ProposalSigningBackend for DkgProposalSigningRulesBackend { +impl super::ProposalSigningBackend for SigningRulesBackend { async fn can_handle_proposal( &self, _proposal: &(impl ProposalTrait + Sync + Send + 'static), diff --git a/crates/relayer-config/src/anchor.rs b/crates/relayer-config/src/anchor.rs index 6fa9d7cb9..d754ab90a 100644 --- a/crates/relayer-config/src/anchor.rs +++ b/crates/relayer-config/src/anchor.rs @@ -1,3 +1,18 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + use ethereum_types::H256; use crate::evm::EvmLinkedAnchorConfig; diff --git a/crates/relayer-config/src/block_poller.rs b/crates/relayer-config/src/block_poller.rs index 4c9b2cc10..7a7581ba2 100644 --- a/crates/relayer-config/src/block_poller.rs +++ b/crates/relayer-config/src/block_poller.rs @@ -1,3 +1,18 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + use super::*; use webb_relayer_types::rpc_url::RpcUrl; diff --git a/crates/relayer-config/src/cli.rs b/crates/relayer-config/src/cli.rs index eb7d81cd5..3a9065606 100644 --- a/crates/relayer-config/src/cli.rs +++ b/crates/relayer-config/src/cli.rs @@ -1,3 +1,18 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + use crate::WebbRelayerConfig; use anyhow::Context; use directories_next::ProjectDirs; diff --git a/crates/relayer-config/src/defaults.rs b/crates/relayer-config/src/defaults.rs index c9eeb4b03..79a477e75 100644 --- a/crates/relayer-config/src/defaults.rs +++ b/crates/relayer-config/src/defaults.rs @@ -1,3 +1,18 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + use std::collections::HashMap; /// The default port the relayer will listen on. Defaults to 9955. diff --git a/crates/relayer-config/src/event_watcher.rs b/crates/relayer-config/src/event_watcher.rs index d6e73ea13..3a385feca 100644 --- a/crates/relayer-config/src/event_watcher.rs +++ b/crates/relayer-config/src/event_watcher.rs @@ -1,3 +1,18 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + use super::*; /// EventsWatchConfig is the configuration for the events watch. diff --git a/crates/relayer-config/src/evm/mod.rs b/crates/relayer-config/src/evm/mod.rs index e7e9f7c93..1d8e2ffe4 100644 --- a/crates/relayer-config/src/evm/mod.rs +++ b/crates/relayer-config/src/evm/mod.rs @@ -1,3 +1,18 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + use core::fmt; use ethereum_types::Address; diff --git a/crates/relayer-config/src/lib.rs b/crates/relayer-config/src/lib.rs index 7092cbc59..e4e280e86 100644 --- a/crates/relayer-config/src/lib.rs +++ b/crates/relayer-config/src/lib.rs @@ -1,16 +1,17 @@ -// Copyright 2022 Webb Technologies Inc. +// Copyright (C) 2022-2024 Webb Technologies Inc. // -// 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 +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. // -// 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. +// You should receive a copy of the GNU General Public License +// If not, see . #![warn(missing_docs)] diff --git a/crates/relayer-config/src/signing_backend.rs b/crates/relayer-config/src/signing_backend.rs index 0b0db3270..588c0b049 100644 --- a/crates/relayer-config/src/signing_backend.rs +++ b/crates/relayer-config/src/signing_backend.rs @@ -1,3 +1,18 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + use webb_relayer_types::private_key::PrivateKey; use super::*; @@ -7,15 +22,15 @@ use super::*; #[serde(tag = "type")] pub enum ProposalSigningBackendConfig { /// Uses signing rules contract to vote and submit proposals for signing. - Dkg(DkgProposalSigningBackendConfig), + Dkg(SigningRulesBackendConfig), /// Uses the Private Key of the current Governor to sign proposals. Mocked(MockedProposalSigningBackendConfig), } -/// DkgProposalSigningBackendConfig represents the configuration for the DKG signing backend. +/// SigningRulesBackendConfig represents the configuration for the DKG signing backend. #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all(serialize = "camelCase", deserialize = "kebab-case"))] -pub struct DkgProposalSigningBackendConfig { +pub struct SigningRulesBackendConfig { /// The address of this contract on this chain. pub address: Address, /// Phase1 Job Id diff --git a/crates/relayer-config/src/substrate/mod.rs b/crates/relayer-config/src/substrate/mod.rs index f1d57aff4..41cd45f43 100644 --- a/crates/relayer-config/src/substrate/mod.rs +++ b/crates/relayer-config/src/substrate/mod.rs @@ -1,3 +1,18 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + use super::*; use webb_relayer_types::{rpc_url::RpcUrl, suri::Suri}; diff --git a/crates/relayer-config/src/utils.rs b/crates/relayer-config/src/utils.rs index 6a899ee55..621de0007 100644 --- a/crates/relayer-config/src/utils.rs +++ b/crates/relayer-config/src/utils.rs @@ -1,3 +1,18 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + use config::{Config, File}; use std::path::{Path, PathBuf}; diff --git a/crates/relayer-context/src/ethers_retry_policy.rs b/crates/relayer-context/src/ethers_retry_policy.rs index c97d6d086..e648e3236 100644 --- a/crates/relayer-context/src/ethers_retry_policy.rs +++ b/crates/relayer-context/src/ethers_retry_policy.rs @@ -1,3 +1,18 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + use std::time::Duration; use webb::evm::ethers::providers::ProviderError; diff --git a/crates/relayer-context/src/lib.rs b/crates/relayer-context/src/lib.rs index a2cfdd541..6b2449a8c 100644 --- a/crates/relayer-context/src/lib.rs +++ b/crates/relayer-context/src/lib.rs @@ -1,16 +1,17 @@ -// Copyright 2022 Webb Technologies Inc. +// Copyright (C) 2022-2024 Webb Technologies Inc. // -// 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 +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. // -// 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. +// You should receive a copy of the GNU General Public License +// If not, see . #![warn(missing_docs)] //! # Relayer Context Module 🕸️ diff --git a/crates/relayer-handler-utils/src/lib.rs b/crates/relayer-handler-utils/src/lib.rs index 4fab43cc2..9cdb84209 100644 --- a/crates/relayer-handler-utils/src/lib.rs +++ b/crates/relayer-handler-utils/src/lib.rs @@ -1,16 +1,17 @@ -// Copyright 2022 Webb Technologies Inc. +// Copyright (C) 2022-2024 Webb Technologies Inc. // -// 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 +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. // -// 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. +// You should receive a copy of the GNU General Public License +// If not, see . #![allow(clippy::large_enum_variant)] #![allow(missing_docs)] @@ -20,7 +21,7 @@ use webb::evm::ethers::abi::Address; use webb::evm::ethers::prelude::I256; use webb::evm::ethers::types::Bytes; -use webb::evm::ethers::types::{H256, U256}; +use webb::evm::ethers::types::U256; use webb_relayer_tx_relay_utils::{ MaspRelayTransaction, VAnchorRelayTransaction, @@ -74,7 +75,7 @@ impl<'de> Deserialize<'de> for WebbI128 { pub type EvmVanchorCommand = EvmCommandType< Bytes, // Proof bytes Bytes, // Roots format - H256, // Element type + U256, // Element type Address, // Account identifier U256, // Balance type WebbI256, // Signed amount type @@ -82,7 +83,7 @@ pub type EvmVanchorCommand = EvmCommandType< >; /// Enumerates the supported protocols for relaying transactions -#[derive(Debug, Clone, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub enum EvmCommandType { VAnchor(VAnchorRelayTransaction), diff --git a/crates/relayer-handlers/build.rs b/crates/relayer-handlers/build.rs index 684382f93..4f6239f5e 100644 --- a/crates/relayer-handlers/build.rs +++ b/crates/relayer-handlers/build.rs @@ -1,3 +1,18 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + // build.rs fn main() { diff --git a/crates/relayer-handlers/src/lib.rs b/crates/relayer-handlers/src/lib.rs index dbd7b082a..815df7276 100644 --- a/crates/relayer-handlers/src/lib.rs +++ b/crates/relayer-handlers/src/lib.rs @@ -1,16 +1,17 @@ -// Copyright 2022 Webb Technologies Inc. +// Copyright (C) 2022-2024 Webb Technologies Inc. // -// 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 +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. // -// 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. +// You should receive a copy of the GNU General Public License +// If not, see . //! Relayer handlers for HTTP calls. diff --git a/crates/relayer-handlers/src/routes/encrypted_outputs.rs b/crates/relayer-handlers/src/routes/encrypted_outputs.rs index 5856f1cef..34c07daad 100644 --- a/crates/relayer-handlers/src/routes/encrypted_outputs.rs +++ b/crates/relayer-handlers/src/routes/encrypted_outputs.rs @@ -1,16 +1,17 @@ -// Copyright 2022 Webb Technologies Inc. +// Copyright (C) 2022-2024 Webb Technologies Inc. // -// 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 +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. // -// 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. +// You should receive a copy of the GNU General Public License +// If not, see . use axum::extract::{Path, Query, State}; use axum::http::StatusCode; diff --git a/crates/relayer-handlers/src/routes/fee_info.rs b/crates/relayer-handlers/src/routes/fee_info.rs index 56fc7c75f..66a16cc4b 100644 --- a/crates/relayer-handlers/src/routes/fee_info.rs +++ b/crates/relayer-handlers/src/routes/fee_info.rs @@ -1,3 +1,18 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + #![allow(clippy::large_enum_variant)] #![warn(missing_docs)] use axum::extract::{Path, State}; diff --git a/crates/relayer-handlers/src/routes/info.rs b/crates/relayer-handlers/src/routes/info.rs index cb9aaa1a5..93f765062 100644 --- a/crates/relayer-handlers/src/routes/info.rs +++ b/crates/relayer-handlers/src/routes/info.rs @@ -1,3 +1,18 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + use axum::extract::State; use axum::Json; use axum_client_ip::InsecureClientIp; diff --git a/crates/relayer-handlers/src/routes/leaves.rs b/crates/relayer-handlers/src/routes/leaves.rs index 2f48afcf4..a66f42a4f 100644 --- a/crates/relayer-handlers/src/routes/leaves.rs +++ b/crates/relayer-handlers/src/routes/leaves.rs @@ -1,16 +1,17 @@ -// Copyright 2022 Webb Technologies Inc. +// Copyright (C) 2022-2024 Webb Technologies Inc. // -// 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 +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. // -// 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. +// You should receive a copy of the GNU General Public License +// If not, see . use axum::extract::{Path, Query, State}; use axum::http::StatusCode; diff --git a/crates/relayer-handlers/src/routes/masp_tx_relaying.rs b/crates/relayer-handlers/src/routes/masp_tx_relaying.rs index 71d4b60cd..aab1c39a3 100644 --- a/crates/relayer-handlers/src/routes/masp_tx_relaying.rs +++ b/crates/relayer-handlers/src/routes/masp_tx_relaying.rs @@ -1,3 +1,18 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + use super::*; use axum::extract::{Path, State}; use std::sync::Arc; diff --git a/crates/relayer-handlers/src/routes/metric.rs b/crates/relayer-handlers/src/routes/metric.rs index a6ae7a763..46fee8900 100644 --- a/crates/relayer-handlers/src/routes/metric.rs +++ b/crates/relayer-handlers/src/routes/metric.rs @@ -1,3 +1,18 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + use axum::extract::{Path, State}; use axum::http::StatusCode; use axum::Json; diff --git a/crates/relayer-handlers/src/routes/mod.rs b/crates/relayer-handlers/src/routes/mod.rs index 3e524700d..db96488ac 100644 --- a/crates/relayer-handlers/src/routes/mod.rs +++ b/crates/relayer-handlers/src/routes/mod.rs @@ -1,3 +1,18 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + use ethereum_types::H512; use serde::{Deserialize, Serialize}; diff --git a/crates/relayer-handlers/src/routes/private_tx_withdraw.rs b/crates/relayer-handlers/src/routes/private_tx_withdraw.rs index 6afd54b1d..338212f0d 100644 --- a/crates/relayer-handlers/src/routes/private_tx_withdraw.rs +++ b/crates/relayer-handlers/src/routes/private_tx_withdraw.rs @@ -1,3 +1,18 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + use super::*; use axum::extract::{Path, State}; use std::sync::Arc; diff --git a/crates/relayer-handlers/src/routes/transaction_status.rs b/crates/relayer-handlers/src/routes/transaction_status.rs index 3419b0293..1a22755b2 100644 --- a/crates/relayer-handlers/src/routes/transaction_status.rs +++ b/crates/relayer-handlers/src/routes/transaction_status.rs @@ -1,3 +1,18 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + use std::sync::Arc; use axum::extract::{Path, State}; diff --git a/crates/relayer-store/src/lib.rs b/crates/relayer-store/src/lib.rs index 491c4d869..f38a1f047 100644 --- a/crates/relayer-store/src/lib.rs +++ b/crates/relayer-store/src/lib.rs @@ -1,16 +1,17 @@ -// Copyright 2022 Webb Technologies Inc. +// Copyright (C) 2022-2024 Webb Technologies Inc. // -// 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 +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. // -// 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. +// You should receive a copy of the GNU General Public License +// If not, see . //! # Relayer Store Module 🕸️ //! diff --git a/crates/relayer-store/src/mem.rs b/crates/relayer-store/src/mem.rs index 9accba834..5bf3321b2 100644 --- a/crates/relayer-store/src/mem.rs +++ b/crates/relayer-store/src/mem.rs @@ -1,16 +1,17 @@ -// Copyright 2022 Webb Technologies Inc. +// Copyright (C) 2022-2024 Webb Technologies Inc. // -// 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 +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. // -// 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. +// You should receive a copy of the GNU General Public License +// If not, see . use std::collections::{BTreeMap, HashMap}; use std::fmt::Debug; diff --git a/crates/relayer-store/src/queue.rs b/crates/relayer-store/src/queue.rs index e959e695b..f87b1a7dd 100644 --- a/crates/relayer-store/src/queue.rs +++ b/crates/relayer-store/src/queue.rs @@ -1,3 +1,18 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + use std::sync::Arc; use serde::{de::DeserializeOwned, Deserialize, Serialize}; diff --git a/crates/relayer-store/src/sled.rs b/crates/relayer-store/src/sled.rs index 185ff60f3..57db2a43b 100644 --- a/crates/relayer-store/src/sled.rs +++ b/crates/relayer-store/src/sled.rs @@ -1,16 +1,17 @@ -// Copyright 2022 Webb Technologies Inc. +// Copyright (C) 2022-2024 Webb Technologies Inc. // -// 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 +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. // -// 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. +// You should receive a copy of the GNU General Public License +// If not, see . use super::HistoryStoreKey; use super::{ diff --git a/crates/relayer-types/src/etherscan_api.rs b/crates/relayer-types/src/etherscan_api.rs index 2f2973248..a0e9b98ac 100644 --- a/crates/relayer-types/src/etherscan_api.rs +++ b/crates/relayer-types/src/etherscan_api.rs @@ -1,3 +1,18 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + use serde::{Deserialize, Serialize}; #[derive(Clone, Serialize)] pub struct EtherscanApiKey(String); diff --git a/crates/relayer-types/src/lib.rs b/crates/relayer-types/src/lib.rs index b5dbd0daf..53a1acc71 100644 --- a/crates/relayer-types/src/lib.rs +++ b/crates/relayer-types/src/lib.rs @@ -1,3 +1,18 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + use std::sync::Arc; use webb::evm::ethers::{prelude::TimeLag, providers}; use webb_relayer_utils::multi_provider::MultiProvider; diff --git a/crates/relayer-types/src/mnemonic.rs b/crates/relayer-types/src/mnemonic.rs index 9a747e07d..b84db0bcc 100644 --- a/crates/relayer-types/src/mnemonic.rs +++ b/crates/relayer-types/src/mnemonic.rs @@ -1,3 +1,18 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + use bip39::{Language, Mnemonic as BipMnemonic}; use serde::Deserialize; diff --git a/crates/relayer-types/src/private_key.rs b/crates/relayer-types/src/private_key.rs index f760bb3a2..1b26dc74c 100644 --- a/crates/relayer-types/src/private_key.rs +++ b/crates/relayer-types/src/private_key.rs @@ -1,3 +1,18 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + use std::str::FromStr; use ethereum_types::Secret; diff --git a/crates/relayer-types/src/rpc_client.rs b/crates/relayer-types/src/rpc_client.rs index c3df45c2c..600cff189 100644 --- a/crates/relayer-types/src/rpc_client.rs +++ b/crates/relayer-types/src/rpc_client.rs @@ -1,3 +1,18 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + use jsonrpsee::async_client::ClientBuilder; use jsonrpsee::client_transport::ws::WsTransportClientBuilder; use jsonrpsee::core::client::Client; diff --git a/crates/relayer-types/src/rpc_url.rs b/crates/relayer-types/src/rpc_url.rs index 2484c782d..7cedb9cf0 100644 --- a/crates/relayer-types/src/rpc_url.rs +++ b/crates/relayer-types/src/rpc_url.rs @@ -1,3 +1,18 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + use serde::{Deserialize, Serialize}; /// An RPC URL Wrapper around [`url::Url`] to support the `serde` deserialization diff --git a/crates/relayer-types/src/suri.rs b/crates/relayer-types/src/suri.rs index 2183638f7..00f4ef193 100644 --- a/crates/relayer-types/src/suri.rs +++ b/crates/relayer-types/src/suri.rs @@ -1,3 +1,18 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + use std::str::FromStr; use serde::Deserialize; diff --git a/crates/relayer-utils/src/clickable_link.rs b/crates/relayer-utils/src/clickable_link.rs index 8b98e00a2..2dedd1ecd 100644 --- a/crates/relayer-utils/src/clickable_link.rs +++ b/crates/relayer-utils/src/clickable_link.rs @@ -1,16 +1,17 @@ -// Copyright 2022 Webb Technologies Inc. +// Copyright (C) 2022-2024 Webb Technologies Inc. // -// 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 +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. // -// 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. +// You should receive a copy of the GNU General Public License +// If not, see . use std::fmt; diff --git a/crates/relayer-utils/src/lib.rs b/crates/relayer-utils/src/lib.rs index 37b79016f..d16073b45 100644 --- a/crates/relayer-utils/src/lib.rs +++ b/crates/relayer-utils/src/lib.rs @@ -1,16 +1,17 @@ -// Copyright 2022 Webb Technologies Inc. +// Copyright (C) 2022-2024 Webb Technologies Inc. // -// 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 +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. // -// 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. +// You should receive a copy of the GNU General Public License +// If not, see . use std::sync::Arc; @@ -19,8 +20,6 @@ use axum::response::{IntoResponse, Response}; use multi_provider::MultiProvider; use webb::substrate::subxt::PolkadotConfig; use webb::{evm::ethers, substrate::subxt}; -use webb_proposals::ResourceId; - pub mod clickable_link; /// Metrics functionality @@ -224,8 +223,6 @@ pub enum Error { /// The chain id of the node. chain_id: String, }, - #[error("No bridge registered with DKG for resource id {:?}", _0)] - BridgeNotRegistered(ResourceId), #[error("Failed to fetch token price for token: {token}")] FetchTokenPriceError { token: String }, #[error("Failed to read a value from substrate storage")] diff --git a/crates/relayer-utils/src/metric.rs b/crates/relayer-utils/src/metric.rs index 4c26a3fed..555393095 100644 --- a/crates/relayer-utils/src/metric.rs +++ b/crates/relayer-utils/src/metric.rs @@ -1,16 +1,17 @@ -// Copyright 2022 Webb Technologies Inc. +// Copyright (C) 2022-2024 Webb Technologies Inc. // -// 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 +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. // -// 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. +// You should receive a copy of the GNU General Public License +// If not, see . use std::collections::HashMap; diff --git a/crates/relayer-utils/src/multi_provider.rs b/crates/relayer-utils/src/multi_provider.rs index f5119125b..73ac582d1 100644 --- a/crates/relayer-utils/src/multi_provider.rs +++ b/crates/relayer-utils/src/multi_provider.rs @@ -1,3 +1,18 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + use crate::Error as WebbRelayerError; use core::fmt::Debug; use futures::prelude::*; diff --git a/crates/relayer-utils/src/probe.rs b/crates/relayer-utils/src/probe.rs index b2191c835..d2b012e47 100644 --- a/crates/relayer-utils/src/probe.rs +++ b/crates/relayer-utils/src/probe.rs @@ -1,16 +1,17 @@ -// Copyright 2022 Webb Technologies Inc. +// Copyright (C) 2022-2024 Webb Technologies Inc. // -// 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 +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. // -// 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. +// You should receive a copy of the GNU General Public License +// If not, see . use derive_more::Display; /// Target for logger diff --git a/crates/relayer-utils/src/retry.rs b/crates/relayer-utils/src/retry.rs index 1d539e942..6a3f0c561 100644 --- a/crates/relayer-utils/src/retry.rs +++ b/crates/relayer-utils/src/retry.rs @@ -1,16 +1,17 @@ -// Copyright 2022 Webb Technologies Inc. +// Copyright (C) 2022-2024 Webb Technologies Inc. // -// 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 +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. // -// 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. +// You should receive a copy of the GNU General Public License +// If not, see . //! Retry logic for async calls diff --git a/crates/relayer-utils/src/static_tx_payload.rs b/crates/relayer-utils/src/static_tx_payload.rs index e236ad362..54ce01086 100644 --- a/crates/relayer-utils/src/static_tx_payload.rs +++ b/crates/relayer-utils/src/static_tx_payload.rs @@ -1,3 +1,18 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + use core::fmt; use webb::substrate::subxt::{ diff --git a/crates/tx-queue/src/evm/evm_tx_queue.rs b/crates/tx-queue/src/evm/evm_tx_queue.rs index a275e054f..6cd033f8f 100644 --- a/crates/tx-queue/src/evm/evm_tx_queue.rs +++ b/crates/tx-queue/src/evm/evm_tx_queue.rs @@ -1,16 +1,17 @@ -// Copyright 2022 Webb Technologies Inc. +// Copyright (C) 2022-2024 Webb Technologies Inc. // -// 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 +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. // -// 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. +// You should receive a copy of the GNU General Public License +// If not, see . use std::sync::Arc; use std::time::Duration; diff --git a/crates/tx-queue/src/evm/mod.rs b/crates/tx-queue/src/evm/mod.rs index 89b214629..154770187 100644 --- a/crates/tx-queue/src/evm/mod.rs +++ b/crates/tx-queue/src/evm/mod.rs @@ -1,16 +1,17 @@ -// Copyright 2022 Webb Technologies Inc. +// Copyright (C) 2022-2024 Webb Technologies Inc. // -// 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 +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. // -// 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. +// You should receive a copy of the GNU General Public License +// If not, see . mod evm_tx_queue; use std::sync::Arc; diff --git a/crates/tx-queue/src/lib.rs b/crates/tx-queue/src/lib.rs index 148361e95..b3c22ae88 100644 --- a/crates/tx-queue/src/lib.rs +++ b/crates/tx-queue/src/lib.rs @@ -1,16 +1,17 @@ -// Copyright 2022 Webb Technologies Inc. +// Copyright (C) 2022-2024 Webb Technologies Inc. // -// 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 +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. // -// 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. +// You should receive a copy of the GNU General Public License +// If not, see . /// EVM Transaction Queue. #[cfg(feature = "evm")] diff --git a/crates/tx-queue/src/substrate/mod.rs b/crates/tx-queue/src/substrate/mod.rs index 35317041e..db8d0a030 100644 --- a/crates/tx-queue/src/substrate/mod.rs +++ b/crates/tx-queue/src/substrate/mod.rs @@ -1,16 +1,17 @@ -// Copyright 2022 Webb Technologies Inc. +// Copyright (C) 2022-2024 Webb Technologies Inc. // -// 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 +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. // -// 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. +// You should receive a copy of the GNU General Public License +// If not, see . mod substrate_tx_queue; #[doc(hidden)] diff --git a/crates/tx-queue/src/substrate/substrate_tx_queue.rs b/crates/tx-queue/src/substrate/substrate_tx_queue.rs index 2441da439..dacc38b7d 100644 --- a/crates/tx-queue/src/substrate/substrate_tx_queue.rs +++ b/crates/tx-queue/src/substrate/substrate_tx_queue.rs @@ -1,16 +1,17 @@ -// Copyright 2022 Webb Technologies Inc. +// Copyright (C) 2022-2024 Webb Technologies Inc. // -// 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 +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. // -// 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. +// You should receive a copy of the GNU General Public License +// If not, see . use futures::StreamExt; use futures::TryFutureExt; diff --git a/crates/tx-relay-utils/src/lib.rs b/crates/tx-relay-utils/src/lib.rs index 52bd80685..f9dcc904a 100644 --- a/crates/tx-relay-utils/src/lib.rs +++ b/crates/tx-relay-utils/src/lib.rs @@ -1,16 +1,17 @@ -// Copyright 2022 Webb Technologies Inc. +// Copyright (C) 2022-2024 Webb Technologies Inc. // -// 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 +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. // -// 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. +// You should receive a copy of the GNU General Public License +// If not, see . use serde::{Deserialize, Serialize}; @@ -57,7 +58,7 @@ pub struct ExtData { } /// Contains data that is relayed to the VAnchors -#[derive(Debug, Clone, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct VAnchorRelayTransaction { /// The zero-knowledge proof data structure for VAnchor transactions @@ -105,7 +106,7 @@ pub struct MaspProofData { } /// Contains data that is relayed to masp vanchors. -#[derive(Debug, Clone, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct MaspRelayTransaction { /// The zero-knowledge proof data structure for Masp VAnchor transactions diff --git a/crates/tx-relay/src/evm/fees.rs b/crates/tx-relay/src/evm/fees.rs index f351f00e0..4bb237d95 100644 --- a/crates/tx-relay/src/evm/fees.rs +++ b/crates/tx-relay/src/evm/fees.rs @@ -1,3 +1,18 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + use chrono::DateTime; use chrono::Duration; use chrono::Utc; diff --git a/crates/tx-relay/src/evm/masp_vanchor.rs b/crates/tx-relay/src/evm/masp_vanchor.rs index c6a7d5148..924e6d874 100644 --- a/crates/tx-relay/src/evm/masp_vanchor.rs +++ b/crates/tx-relay/src/evm/masp_vanchor.rs @@ -1,3 +1,18 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + use super::*; use crate::evm::fees::{get_evm_fee_info, EvmFeeInfo}; use crate::TransactionItemKey; diff --git a/crates/tx-relay/src/evm/mod.rs b/crates/tx-relay/src/evm/mod.rs index b0fd7a873..0272c914e 100644 --- a/crates/tx-relay/src/evm/mod.rs +++ b/crates/tx-relay/src/evm/mod.rs @@ -1,3 +1,18 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + use ethereum_types::U256; use webb::evm::ethers; diff --git a/crates/tx-relay/src/evm/vanchor.rs b/crates/tx-relay/src/evm/vanchor.rs index 78840e93b..f5fd08bdf 100644 --- a/crates/tx-relay/src/evm/vanchor.rs +++ b/crates/tx-relay/src/evm/vanchor.rs @@ -1,3 +1,18 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + use super::*; use crate::evm::fees::{get_evm_fee_info, EvmFeeInfo}; use crate::TransactionItemKey; @@ -97,24 +112,15 @@ pub async fn handle_vanchor_relay_tx<'a>( let public_inputs = PublicInputs { roots: roots.into(), extension_roots: cmd.proof_data.extension_roots, - input_nullifiers: cmd - .proof_data - .input_nullifiers - .iter() - .map(|v| v.to_fixed_bytes().into()) - .collect(), + input_nullifiers: cmd.proof_data.input_nullifiers, + output_commitments: cmd .proof_data .output_commitments - .into_iter() - .map(|c| U256::from(c.to_fixed_bytes())) - .collect::>() .try_into() .unwrap_or_default(), - public_amount: U256::from_big_endian( - &cmd.proof_data.public_amount.to_fixed_bytes(), - ), - ext_data_hash: cmd.proof_data.ext_data_hash.to_fixed_bytes().into(), + public_amount: cmd.proof_data.public_amount, + ext_data_hash: cmd.proof_data.ext_data_hash, }; let encryptions = Encryptions { diff --git a/crates/tx-relay/src/lib.rs b/crates/tx-relay/src/lib.rs index 2609a4f84..321c7ef70 100644 --- a/crates/tx-relay/src/lib.rs +++ b/crates/tx-relay/src/lib.rs @@ -1,3 +1,18 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + /// EVM Transactional Relayer. #[cfg(feature = "evm")] pub mod evm; diff --git a/event-watchers/dkg/src/lib.rs b/event-watchers/dkg/src/lib.rs deleted file mode 100644 index aaa5b66e2..000000000 --- a/event-watchers/dkg/src/lib.rs +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2022 Webb Technologies Inc. -// -// 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. - -/// A module for listening on DKG Governor Changes event. -mod job_result_handler; -#[doc(hidden)] -pub use job_result_handler::*; -use webb::substrate::subxt::events::StaticEvent; -use webb::substrate::tangle_runtime::api::jobs::events::JobResultSubmitted; -use webb_event_watcher_traits::SubstrateEventWatcher; -use webb_relayer_utils::TangleRuntimeConfig; - -/// The DKGMetadataWatcher watches for the events from Dkg Pallet. -#[derive(Copy, Clone, Debug, Default)] -pub struct JobResultWatcher; - -#[async_trait::async_trait] -impl SubstrateEventWatcher for JobResultWatcher { - const TAG: &'static str = "Job Pallet Event Watcher"; - - const PALLET_NAME: &'static str = JobResultSubmitted::PALLET; - - type Store = webb_relayer_store::SledStore; -} diff --git a/event-watchers/evm/src/lib.rs b/event-watchers/evm/src/lib.rs index 0e9e98cdc..ba2ce7fda 100644 --- a/event-watchers/evm/src/lib.rs +++ b/event-watchers/evm/src/lib.rs @@ -1,16 +1,17 @@ -// Copyright 2022 Webb Technologies Inc. +// Copyright (C) 2022-2024 Webb Technologies Inc. // -// 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 +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. // -// 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. +// You should receive a copy of the GNU General Public License +// If not, see . use std::ops; use std::sync::Arc; diff --git a/event-watchers/evm/src/signature_bridge_watcher.rs b/event-watchers/evm/src/signature_bridge_watcher.rs index 9d1e11403..5416b44f8 100644 --- a/event-watchers/evm/src/signature_bridge_watcher.rs +++ b/event-watchers/evm/src/signature_bridge_watcher.rs @@ -1,16 +1,17 @@ -// Copyright 2022 Webb Technologies Inc. +// Copyright (C) 2022-2024 Webb Technologies Inc. // -// 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 +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. // -// 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. +// You should receive a copy of the GNU General Public License +// If not, see . use std::ops; use std::sync::Arc; diff --git a/event-watchers/evm/src/tests.rs b/event-watchers/evm/src/tests.rs index 526e31862..6b310255a 100644 --- a/event-watchers/evm/src/tests.rs +++ b/event-watchers/evm/src/tests.rs @@ -1,3 +1,18 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + use ark_bn254::Fr as Bn254Fr; use ark_ff::{BigInteger, PrimeField}; use ark_std::collections::BTreeMap; diff --git a/event-watchers/evm/src/vanchor/mod.rs b/event-watchers/evm/src/vanchor/mod.rs index 02776061b..032af47d7 100644 --- a/event-watchers/evm/src/vanchor/mod.rs +++ b/event-watchers/evm/src/vanchor/mod.rs @@ -1,3 +1,18 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + use super::*; pub mod vanchor_deposit_handler; pub mod vanchor_encrypted_outputs_handler; diff --git a/event-watchers/evm/src/vanchor/vanchor_deposit_handler.rs b/event-watchers/evm/src/vanchor/vanchor_deposit_handler.rs index 16c55edb4..730061f29 100644 --- a/event-watchers/evm/src/vanchor/vanchor_deposit_handler.rs +++ b/event-watchers/evm/src/vanchor/vanchor_deposit_handler.rs @@ -1,16 +1,17 @@ -// Copyright 2022 Webb Technologies Inc. +// Copyright (C) 2022-2024 Webb Technologies Inc. // -// 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 +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. // -// 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. +// You should receive a copy of the GNU General Public License +// If not, see . use crate::VAnchorContractWrapper; use ethereum_types::H256; diff --git a/event-watchers/evm/src/vanchor/vanchor_encrypted_outputs_handler.rs b/event-watchers/evm/src/vanchor/vanchor_encrypted_outputs_handler.rs index c4ac8431a..8f54a46cb 100644 --- a/event-watchers/evm/src/vanchor/vanchor_encrypted_outputs_handler.rs +++ b/event-watchers/evm/src/vanchor/vanchor_encrypted_outputs_handler.rs @@ -1,16 +1,17 @@ -// Copyright 2022 Webb Technologies Inc. +// Copyright (C) 2022-2024 Webb Technologies Inc. // -// 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 +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. // -// 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. +// You should receive a copy of the GNU General Public License +// If not, see . use super::VAnchorContractWrapper; use ethereum_types::H256; diff --git a/event-watchers/evm/src/vanchor/vanchor_leaves_handler.rs b/event-watchers/evm/src/vanchor/vanchor_leaves_handler.rs index 4aacb2359..1b0c8be00 100644 --- a/event-watchers/evm/src/vanchor/vanchor_leaves_handler.rs +++ b/event-watchers/evm/src/vanchor/vanchor_leaves_handler.rs @@ -1,16 +1,17 @@ -// Copyright 2022 Webb Technologies Inc. +// Copyright (C) 2022-2024 Webb Technologies Inc. // -// 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 +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. // -// 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. +// You should receive a copy of the GNU General Public License +// If not, see . use super::VAnchorContractWrapper; use ark_bn254::Fr as Bn254Fr; diff --git a/event-watchers/dkg/Cargo.toml b/event-watchers/tangle/Cargo.toml similarity index 97% rename from event-watchers/dkg/Cargo.toml rename to event-watchers/tangle/Cargo.toml index e77f2ac9c..abe7b3b13 100644 --- a/event-watchers/dkg/Cargo.toml +++ b/event-watchers/tangle/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "webb-ew-dkg" +name = "webb-ew-tangle" version = { workspace = true } authors = { workspace = true } edition = { workspace = true } @@ -26,3 +26,4 @@ webb = { workspace = true } native-tls = { workspace = true, optional = true } webb-proposals = { workspace = true } ethereum-types = { workspace = true } + diff --git a/event-watchers/dkg/src/job_result_handler.rs b/event-watchers/tangle/src/job_result_handler.rs similarity index 82% rename from event-watchers/dkg/src/job_result_handler.rs rename to event-watchers/tangle/src/job_result_handler.rs index 8c9a9537c..007d67849 100644 --- a/event-watchers/dkg/src/job_result_handler.rs +++ b/event-watchers/tangle/src/job_result_handler.rs @@ -1,16 +1,17 @@ -// Copyright 2022 Webb Technologies Inc. +// Copyright (C) 2022-2024 Webb Technologies Inc. // -// 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 +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. // -// 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. +// You should receive a copy of the GNU General Public License +// If not, see . use std::sync::Arc; use tokio::sync::Mutex; @@ -24,7 +25,7 @@ use webb_relayer_utils::{metric, TangleRuntimeConfig}; use webb_event_watcher_traits::substrate::EventHandler; -/// DKGPublicKeyChanged handler handles the `PublicKeySignatureChanged` event and then signals +/// JobResultHandler handles the `JobResultSubmitted` event and then signals /// signature bridge watcher to update governor. #[derive(Clone, Debug)] pub struct JobResultHandler { @@ -85,8 +86,7 @@ impl EventHandler for JobResultHandler { }) .collect(); for event in job_result_submitted_events { - // Fetch job result for DKG phase - + // Fetch job result for the event job id. let known_result_addrs = RuntimeApi::storage() .jobs() .known_results(event.clone().role_type, event.clone().job_id); @@ -120,10 +120,10 @@ impl EventHandler for JobResultHandler { target: webb_relayer_utils::probe::TARGET, tracing::Level::DEBUG, kind = %webb_relayer_utils::probe::Kind::SigningBackend, - backend = "DKG", + backend = "SigningRules", signal_bridge = %bridge_key, - public_key = %hex::encode(&result.data), - signature = %hex::encode(&result.signature), + public_key = %hex::encode(&result.data.0), + signature = %hex::encode(&result.signature.0), ); // Todo enqueue transfer ownership calls diff --git a/event-watchers/tangle/src/lib.rs b/event-watchers/tangle/src/lib.rs new file mode 100644 index 000000000..afab2617d --- /dev/null +++ b/event-watchers/tangle/src/lib.rs @@ -0,0 +1,36 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + +/// A module for listening on JobResult Submissions event. +mod job_result_handler; +#[doc(hidden)] +pub use job_result_handler::*; +use webb::substrate::subxt::events::StaticEvent; +use webb::substrate::tangle_runtime::api::jobs::events::JobResultSubmitted; +use webb_event_watcher_traits::SubstrateEventWatcher; +use webb_relayer_utils::TangleRuntimeConfig; + +/// The JobResultWatcher watches for the events from Jobs Pallet. +#[derive(Copy, Clone, Debug, Default)] +pub struct JobResultWatcher; + +#[async_trait::async_trait] +impl SubstrateEventWatcher for JobResultWatcher { + const TAG: &'static str = "Job Pallet Event Watcher"; + + const PALLET_NAME: &'static str = JobResultSubmitted::PALLET; + + type Store = webb_relayer_store::SledStore; +} diff --git a/examples/in_depth.rs b/examples/in_depth.rs index 2fc39d93b..a3edbe596 100644 --- a/examples/in_depth.rs +++ b/examples/in_depth.rs @@ -1,16 +1,17 @@ -// Copyright 2022 Webb Technologies Inc. +// Copyright (C) 2022-2024 Webb Technologies Inc. // -// 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 +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. // -// 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. +// You should receive a copy of the GNU General Public License +// If not, see . //! In this example we will show how to use the webb relayer in depth. diff --git a/relayer-tests/Cargo.toml b/relayer-tests/Cargo.toml new file mode 100644 index 000000000..5bbf69be9 --- /dev/null +++ b/relayer-tests/Cargo.toml @@ -0,0 +1,43 @@ + +[package] +name = "relayer-integration-tests" +version = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +documentation = { workspace = true } +homepage = { workspace = true } +repository = { workspace = true } + + +[dependencies] +tracing = { workspace = true } +tokio = { workspace = true } +serde_json = { workspace = true } +webb = { workspace = true } +tempfile = { workspace = true } +hex = { workspace = true } +reqwest = { workspace = true } +futures = { workspace = true } +dotenv = { workspace = true } +anyhow = { workspace = true } + +# Webb relayer dependencies +webb-relayer = { workspace = true } +webb-evm-test-utils = { workspace = true } +webb-relayer-handler-utils = { workspace = true } +webb-relayer-tx-relay-utils = { workspace = true } +webb-relayer-store = { workspace = true } +webb-relayer-config = { workspace = true } +webb-relayer-context = { workspace = true } + +ark-ff = { version = "^0.3.0", default-features = false } +ark-bn254 = { version = "^0.3.0", default-features = false, features = ["curve"] } +arkworks-setups = { version = "1.2.1", features = ["r1cs"], default-features = false } + + + + + + + diff --git a/relayer-tests/chain/hermes/chain-state/state.json b/relayer-tests/chain/hermes/chain-state/state.json new file mode 100644 index 000000000..32783af0f --- /dev/null +++ b/relayer-tests/chain/hermes/chain-state/state.json @@ -0,0 +1 @@ +{"accounts":{"0x0000000000000000000000000000000000000000":{"nonce":0,"balance":"0x758ff72a07e000","code":"0x","storage":{}},"0x0000000000000000000000000000000000000001":{"nonce":0,"balance":"0x0","code":"0x","storage":{}},"0x0165878a594ca255338adfa4d48449f69242eb8f":{"nonce":1,"balance":"0x0","code":"0x7c010000000000000000000000000000000000000000000000000000000060003504806325cc70e81490635a53025d14176200003757fe5b7f236d13393ef85cc48a351dd786dd7a1de5e39942296127fd87947223ae5108ad6020527f277686494f7644bbc4a9b194e10724eb967f1dc58718e59e3cedc821b2a7ae196040527f023db68784e3f0cc0b85618826a9b3505129c16479973b0a84a4529e66b09c626060527f1d359d245f286c12d50d663bae733f978af08cdbd63017c57b3a75646ff382c16080527f2a75a171563b807db525be259699ab28fe9bc7fb1f70943ff049bc970e841a0c60a0527f083abff5e10051f078e2827d092e1ae808b4dd3e15ccc3706f38ce4157b6770e60c0527f1a5ad71bbbecd8a97dc49cfdbae303ad24d5c4741eab8b7568a9ff8253a1eb6f60e0527f0d745fd00dd167fb86772133640f02ce945004a7bc2c59e8790f725c5d84f0af610100527f2070679e798782ef592a52ca9cef820d497ad2eecbaa7e42f366b3e521c4ed42610120527f2e18c8570d20bf5df800739a53da75d906ece318cd224ab6b3a2be979e2d7eab610140527f0fa86f0f27e4d3dd7f3367ce86f684f1f2e4386d3e5b9f38fa283c6aa723b608610160527f03f3e6fab791f16628168e4b14dbaeb657035ee3da6b2ca83f0c2491e0b403eb610180527f2f545e578202c9732488540e41f783b68ff0613fd79375f8ba8b3d30958e76776101a0527f23810bf82877fc19bff7eefeae3faf4bb8104c32ba4cd701596a15623d01476e6101c0527f014fcd5eb0be6d5beeafc4944034cf321c068ef930f10be2207ed58d2a34cdd66101e0527f00c15fc3a1d5733dd835eae0823e377f8ba4a8b627627cc2bb661c25d20fb52a610200527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016044356024356004356000847f19b849f69450b06848da1d39bd5e4a4302bb86744edc26238b0878e269ed23e582089050847f265ddfe127dd51bd7239347b758f0a1320eb2cc7450acc1dad47f80c8dcf34d683089150847f199750ec472f1809e0f66a545e1e51624108ac845015c2aa3dfc36bab497d8aa84089250847f157ff3fe65ac7208110f06a5f74302b14d743ea25067f0ffd032f787c7f1cdf8850893508481818082800980090990508482818082800980090991508483818082800980090992508484818082800980090993506200038160005262003015565b847f2e49c43c4569dd9c5fd35ac45fca33f10b15c590692f8beefe18f4896ac9490282089050847f0e35fb89981890520d4aef2b6d6506c3cb2f0b6973c24fa82731345ffa2d1f1e83089150847f251ad47cb15c4f1105f109ae5e944f1ba9d9e7806d667ffec6fe723002e0b99684089250847f13da07dc64d428369873e97160234641f8beb56fdd05e5f3563fa39d9c22df4e850893508481818082800980090990508482818082800980090991508483818082800980090992508484818082800980090993506200045660005262003015565b847f0c009b84e650e6d23dc00c7dccef7483a553939689d350cd46e7b89055fd473882089050847f011f16b1c63a854f01992e3956f42d8b04eb650c6d535eb0203dec74befdca0683089150847f0ed69e5e383a688f209d9a561daa79612f3f78d0467ad45485df07093f36754984089250847f04dba94a7b0ce9e221acad41472b6bbe3aec507f5eb3d33f463672264c9f789b850893508481818082800980090990508482818082800980090991508483818082800980090992508484818082800980090993506200052b60005262003015565b847f0a3f2637d840f3a16eb094271c9d237b6036757d4bb50bf7ce732ff1d4fa28e882089050847f259a666f129eea198f8a1c502fdb38fa39b1f075569564b6e54a485d1182323f83089150847f28bf7459c9b2f4c6d8e7d06a4ee3a47f7745d4271038e5157a32fdf7ede0d6a184089250847f0a1ca941f057037526ea200f489be8d4c37c85bbcce6a2aeec91bd6941432447850893508481818082800980090990508482818082800980090991508483818082800980090992508484818082800980090993506200060060005262003015565b847f0c6f8f958be0e93053d7fd4fc54512855535ed1539f051dcb43a26fd926361cf82089050847f123106a93cd17578d426e8128ac9d90aa9e8a00708e296e084dd57e69caaf81183089150847f26e1ba52ad9285d97dd3ab52f8e840085e8fa83ff1e8f1877b074867cd2dee7584089250847f1cb55cad7bd133de18a64c5c47b9c97cbe4d8b7bf9e095864471537e6a4ae2c585089350848181808280098009099050620006b160005262003015565b847f1dcd73e46acd8f8e0e2c7ce04bde7f6d2a53043d5060a41c7143f08e6e9055d082089050847f011003e32f6d9c66f5852f05474a4def0cda294a0eb4e9b9b12b9bb4512e557483089150847f2b1e809ac1d10ab29ad5f20d03a57dfebadfe5903f58bafed7c508dd2287ae8c84089250847f2539de1785b735999fb4dac35ee17ed0ef995d05ab2fc5faeaa69ae87bcec0a5850893508481818082800980090990506200076260005262003015565b847f0c246c5a2ef8ee0126497f222b3e0a0ef4e1c3d41c86d46e43982cb11d77951d82089050847f192089c4974f68e95408148f7c0632edbb09e6a6ad1a1c2f3f0305f5d03b527b83089150847f1eae0ad8ab68b2f06a0ee36eeb0d0c058529097d91096b756d8fdc2fb5a60d8584089250847f179190e5d0e22179e46f8282872abc88db6e2fdc0dee99e69768bd98c5d06bfb850893508481818082800980090990506200081360005262003015565b847f29bb9e2c9076732576e9a81c7ac4b83214528f7db00f31bf6cafe794a9b3cd1c82089050847f225d394e42207599403efd0c2464a90d52652645882aac35b10e590e6e691e0883089150847f064760623c25c8cf753d238055b444532be13557451c087de09efd454b23fd5984089250847f10ba3a0e01df92e87f301c4b716d8a394d67f4bf42a75c10922910a78f6b5b8785089350848181808280098009099050620008c460005262003015565b847f0e070bf53f8451b24f9c6e96b0c2a801cb511bc0c242eb9d361b77693f21471c82089050847f1b94cd61b051b04dd39755ff93821a73ccd6cb11d2491d8aa7f921014de252fb83089150847f1d7cb39bafb8c744e148787a2e70230f9d4e917d5713bb050487b5aa7d74070b84089250847f2ec93189bd1ab4f69117d0fe980c80ff8785c2961829f701bb74ac1f303b17db850893508481818082800980090990506200097560005262003015565b847f2db366bfdd36d277a692bb825b86275beac404a19ae07a9082ea46bd8351792682089050847f062100eb485db06269655cf186a68532985275428450359adc99cec6960711b883089150847f0761d33c66614aaa570e7f1e8244ca1120243f92fa59e4f900c567bf41f5a59b84089250847f20fc411a114d13992c2705aa034e3f315d78608a0f7de4ccf7a72e494855ad0d8508935084818180828009800909905062000a2660005262003015565b847f25b5c004a4bdfcb5add9ec4e9ab219ba102c67e8b3effb5fc3a30f317250bc5a82089050847f23b1822d278ed632a494e58f6df6f5ed038b186d8474155ad87e7dff62b37f4b83089150847f22734b4c5c3f9493606c4ba9012499bf0f14d13bfcfcccaa16102a29cc2f69e084089250847f26c0c8fe09eb30b7e27a74dc33492347e5bdff409aa3610254413d3fad795ce58508935084818180828009800909905062000ad760005262003015565b847f070dd0ccb6bd7bbae88eac03fa1fbb26196be3083a809829bbd626df348ccad982089050847f12b6595bdb329b6fb043ba78bb28c3bec2c0a6de46d8c5ad6067c4ebfd4250da83089150847f248d97d7f76283d63bec30e7a5876c11c06fca9b275c671c5e33d95bb7e8d72984089250847f1a306d439d463b0816fc6fd64cc939318b45eb759ddde4aa106d15d9bd9baaaa8508935084818180828009800909905062000b8860005262003015565b847f28a8f8372e3c38daced7c00421cb4621f4f1b54ddc27821b0d62d3d6ec7c56cf82089050847f0094975717f9a8a8bb35152f24d43294071ce320c829f388bc852183e1e2ce7e83089150847f04d5ee4c3aa78f7d80fde60d716480d3593f74d4f653ae83f4103246db2e8d6584089250847f2a6cf5e9aa03d4336349ad6fb8ed2269c7bef54b8822cc76d08495c12efde1878508935084818180828009800909905062000c3960005262003015565b847f2304d31eaab960ba9274da43e19ddeb7f792180808fd6e43baae48d7efcba3f382089050847f03fd9ac865a4b2a6d5e7009785817249bff08a7e0726fcb4e1c11d39d199f0b083089150847f00b7258ded52bbda2248404d55ee5044798afc3a209193073f7954d4d63b0b6484089250847f159f81ada0771799ec38fca2d4bf65ebb13d3a74f3298db36272c5ca65e92d9a8508935084818180828009800909905062000cea60005262003015565b847f1ef90e67437fbc8550237a75bc28e3bb9000130ea25f0c5471e144cf4264431f82089050847f1e65f838515e5ff0196b49aa41a2d2568df739bc176b08ec95a79ed82932e30d83089150847f2b1b045def3a166cec6ce768d079ba74b18c844e570e1f826575c1068c94c33f84089250847f0832e5753ceb0ff6402543b1109229c165dc2d73bef715e3f1c6e07c168bb1738508935084818180828009800909905062000d9b60005262003015565b847f02f614e9cedfb3dc6b762ae0a37d41bab1b841c2e8b6451bc5a8e3c390b6ad1682089050847f0e2427d38bd46a60dd640b8e362cad967370ebb777bedff40f6a0be27e7ed70583089150847f0493630b7c670b6deb7c84d414e7ce79049f0ec098c3c7c50768bbe29214a53a84089250847f22ead100e8e482674decdab17066c5a26bb1515355d5461a3dc06cc85327cea98508935084818180828009800909905062000e4c60005262003015565b847f25b3e56e655b42cdaae2626ed2554d48583f1ae35626d04de5084e0b6d2a6f1682089050847f1e32752ada8836ef5837a6cde8ff13dbb599c336349e4c584b4fdc0a0cf6f9d083089150847f2fa2a871c15a387cc50f68f6f3c3455b23c00995f05078f672a9864074d412e584089250847f2f569b8a9a4424c9278e1db7311e889f54ccbf10661bab7fcd18e7c7a7d835058508935084818180828009800909905062000efd60005262003015565b847f044cb455110a8fdd531ade530234c518a7df93f7332ffd2144165374b246b43d82089050847f227808de93906d5d420246157f2e42b191fe8c90adfe118178ddc723a531902583089150847f02fcca2934e046bc623adead873579865d03781ae090ad4a8579d2e7a680035584089250847f0ef915f0ac120b876abccceb344a1d36bad3f3c5ab91a8ddcbec2e060d8befac8508935084818180828009800909905062000fae60005262003015565b847f1797130f4b7a3e1777eb757bc6f287f6ab0fb85f6be63b09f3b16ef2b1405d3882089050847f0a76225dc04170ae3306c85abab59e608c7f497c20156d4d36c668555decc6e583089150847f1fffb9ec1992d66ba1e77a7b93209af6f8fa76d48acb664796174b5326a31a5c84089250847f25721c4fc15a3f2853b57c338fa538d85f8fbba6c6b9c6090611889b797b9c5f850893508481818082800980090990506200105f60005262003015565b847f0c817fd42d5f7a41215e3d07ba197216adb4c3790705da95eb63b982bfcaf75a82089050847f13abe3f5239915d39f7e13c2c24970b6df8cf86ce00a22002bc15866e52b5a9683089150847f2106feea546224ea12ef7f39987a46c85c1bc3dc29bdbd7a92cd60acb4d391ce84089250847f21ca859468a746b6aaa79474a37dab49f1ca5a28c748bc7157e1b3345bb0f959850893508481818082800980090990506200111060005262003015565b847f05ccd6255c1e6f0c5cf1f0df934194c62911d14d0321662a8f1a48999e34185b82089050847f0f0e34a64b70a626e464d846674c4c8816c4fb267fe44fe6ea28678cb09490a483089150847f0558531a4e25470c6157794ca36d0e9647dbfcfe350d64838f5b1a8a2de0d4bf84089250847f09d3dca9173ed2faceea125157683d18924cadad3f655a60b72f5864961f145585089350848181808280098009099050620011c160005262003015565b847f0328cbd54e8c0913493f866ed03d218bf23f92d68aaec48617d4c722e5bd433582089050847f2bf07216e2aff0a223a487b1a7094e07e79e7bcc9798c648ee3347dd5329d34b83089150847f1daf345a58006b736499c583cb76c316d6f78ed6a6dffc82111e11a63fe412df84089250847f176563472456aaa746b694c60e1823611ef39039b2edc7ff391e6f2293d2c404850893508481818082800980090990506200127260005262003015565b847f2ef1e0fad9f08e87a3bb5e47d7e33538ca964d2b7d1083d4fb0225035bd3f8db82089050847f226c9b1af95babcf17b2b1f57c7310179c1803dec5ae8f0a1779ed36c817ae2a83089150847f14bce3549cc3db7428126b4c3a15ae0ff8148c89f13fb35d35734eb5d4ad0def84089250847f2debff156e276bb5742c3373f2635b48b8e923d301f372f8e550cfd4034212c7850893508481818082800980090990506200132360005262003015565b847f2d4083cf5a87f5b6fc2395b22e356b6441afe1b6b29c47add7d0432d1d4760c782089050847f0c225b7bcd04bf9c34b911262fdc9c1b91bf79a10c0184d89c317c53d7161c2983089150847f03152169d4f3d06ec33a79bfac91a02c99aa0200db66d5aa7b835265f9c9c8f384089250847f0b61811a9210be78b05974587486d58bddc8f51bfdfebbb87afe8b7aa7d3199c85089350848181808280098009099050620013d460005262003015565b847f203e000cad298daaf7eba6a5c5921878b8ae48acf7048f16046d637a533b6f7882089050847f1a44bf0937c722d1376672b69f6c9655ba7ee386fda1112c0757143d1bfa914683089150847f0376b4fae08cb03d3500afec1a1f56acb8e0fde75a2106d7002f59c5611d4daa84089250847f00780af2ca1cad6465a2171250fdfc32d6fc241d3214177f3d553ef363182185850893508481818082800980090990506200148560005262003015565b847f10774d9ab80c25bdeb808bedfd72a8d9b75dbe18d5221c87e9d857079bdc31d582089050847f10dc6e9c006ea38b04b1e03b4bd9490c0d03f98929ca1d7fb56821fd19d3b6e883089150847f00544b8338791518b2c7645a50392798b21f75bb60e3596170067d00141cac1684089250847f222c01175718386f2e2e82eb122789e352e105a3b8fa852613bc534433ee428c850893508481818082800980090990506200153660005262003015565b847f2840d045e9bc22b259cfb8811b1e0f45b77f7bdb7f7e2b46151a1430f608e3c582089050847f062752f86eebe11a009c937e468c335b04554574c2990196508e01fa5860186b83089150847f06041bdac48205ac87adb87c20a478a71c9950c12a80bc0a55a8e83eaaf0474684089250847f04a533f236c422d1ff900a368949b0022c7a2ae092f308d82b1dcbbf51f5000d85089350848181808280098009099050620015e760005262003015565b847f13e31d7a67232fd811d6a955b3d4f25dfe066d1e7dc33df04bde50a2b2d05b2a82089050847f011c2683ae91eb4dfbc13d6357e8599a9279d1648ff2c95d2f79905bb13920f183089150847f0b0d219346b8574525b1a270e0b4cba5d56c928e3e2c2bd0a1ecaed015aaf6ae84089250847f14abdec8db9c6dc970291ee638690209b65080781ef9fd13d84c7a726b5f1364850893508481818082800980090990506200169860005262003015565b847f1a0b70b4b26fdc28fcd32aa3d266478801eb12202ef47ced988d0376610be10682089050847f278543721f96d1307b6943f9804e7fe56401deb2ef99c4d12704882e7278b60783089150847f16eb59494a9776cf57866214dbd1473f3f0738a325638d8ba36535e011d5825984089250847f2567a658a81ffb444f240088fa5524c69a9e53eeab6b7f8c41c3479dcf8c644a850893508481818082800980090990506200174960005262003015565b847f29aa1d7c151e9ad0a7ab39f1abd9cf77ab78e0215a5715a6b882ade840bb13d882089050847f15c091233e60efe0d4bbfce2b36415006a4f017f9a85388ce206b91f99f2c98483089150847f16bd7d22ff858e5e0882c2c999558d77e7673ad5f1915f9feb679a8115f014cf84089250847f02db50480a07be0eb2c2e13ed6ef4074c0182d9b668b8e08ffe676925004202585089350848181808280098009099050620017fa60005262003015565b847f05e4a220e6a3bc9f7b6806ec9d6cdba186330ef2bf7adb4c13ba866343b7311982089050847f1dda05ebc30170bc98cbf2a5ee3b50e8b5f70bc424d39fa4104d37f1cbcf7a4283089150847f0184bef721888187f645b6fee3667f3c91da214414d89ba5cd301f22b0de899084089250847f1498a307e68900065f5e8276f62aef1c37414b84494e1577ad1a6d64341b78ec85089350848181808280098009099050620018ab60005262003015565b847f25f40f82b31dacc4f4939800b9d2c3eacef737b8fab1f864fe33548ad46bd49d82089050847f09d317cc670251943f6f5862a30d2ea9e83056ce4907bfbbcb1ff31ce5bb965083089150847f2f77d77786d979b23ba4ce4a4c1b3bd0a41132cd467a86ab29b913b6cf3149d084089250847f0f53dafd535a9f4473dc266b6fccc6841bbd336963f254c152f89e785f729bbf850893508481818082800980090990506200195c60005262003015565b847f25c1fd72e223045265c3a099e17526fa0e6976e1c00baf16de96de85deef2fa282089050847f2a902c8980c17faae368d385d52d16be41af95c84eaea3cf893e65d6ce4a8f6283089150847f1ce1580a3452ecf302878c8976b82be96676dd114d1dc8d25527405762f8352984089250847f24a6073f91addc33a49a1fa306df008801c5ec569609034d2fc50f7f0f4d00568508935084818180828009800909905062001a0d60005262003015565b847f25e52dbd6124530d9fc27fe306d71d4583e07ca554b5d1577f256c68b0be2b7482089050847f23dffae3c423fa7a93468dbccfb029855974be4d0a7b29946796e5b6cd70f15d83089150847f06342da370cc0d8c49b77594f6b027c480615d50be36243a99591bc9924ed6f584089250847f2754114281286546b75f09f115fc751b4778303d0405c1b4cc7df0d8e9f639258508935084818180828009800909905062001abe60005262003015565b847f15c19e8534c5c1a8862c2bc1d119eddeabf214153833d7bdb59ee197f8187cf582089050847f265fe062766d08fab4c78d0d9ef3cabe366f3be0a821061679b4b3d2d77d5f3e83089150847f13ccf689d67a3ec9f22cb7cd0ac3a327d377ac5cd0146f048debfd098d3ec7be84089250847f17662f7456789739f81cd3974827a887d92a5e05bdf3fe6b9fbccca4524aaebd8508935084818180828009800909905062001b6f60005262003015565b847f21b29c76329b31c8ef18631e515f7f2f82ca6a5cca70cee4e809fd624be7ad5d82089050847f18137478382aadba441eb97fe27901989c06738165215319939eb17b01fa975c83089150847f2bc07ea2bfad68e8dc724f5fef2b37c2d34f761935ffd3b739ceec4668f37e8884089250847f2ddb2e376f54d64a563840480df993feb4173203c2bd94ad0e602077aef9a03e8508935084818180828009800909905062001c2060005262003015565b847f277eb50f2baa706106b41cb24c602609e8a20f8d72f613708adb25373596c3f782089050847f0d4de47e1aba34269d0c620904f01a56b33fc4b450c0db50bb7f87734c9a1fe583089150847f0b8442bfe9e4a1b4428673b6bd3eea6f9f445697058f134aae908d0279a29f0c84089250847f11fe5b18fbbea1a86e06930cb89f7d4a26e186a65945e96574247fddb720f8f58508935084818180828009800909905062001cd160005262003015565b847f224026f6dfaf71e24d25d8f6d9f90021df5b774dcad4d883170e4ad89c33a0d682089050847f0b2ca6a999fe6887e0704dad58d03465a96bc9e37d1091f61bc9f9c62bbeb82483089150847f221b63d66f0b45f9d40c54053a28a06b1d0a4ce41d364797a1a7e0c96529f42184089250847f30185c48b7b2f1d53d4120801b047d087493bce64d4d24aedce2f4836bb84ad48508935084818180828009800909905062001d8260005262003015565b847f23f5d372a3f0e3cba989e223056227d3533356f0faa48f27f8267318632a61f082089050847f2716683b32c755fd1bf8235ea162b1f388e1e0090d06162e8e6dfbe4328f3e3b83089150847f0977545836866fa204ca1d853ec0909e3d140770c80ac67dc930c69748d5d4bc84089250847f1444e8f592bdbfd8025d91ab4982dd425f51682d31472b05e81c43c0f9434b318508935084818180828009800909905062001e3360005262003015565b847f26e04b65e9ca8270beb74a1c5cb8fee8be3ffbfe583f7012a00f874e7718fbe382089050847f22a5c2fa860d11fe34ee47a5cd9f869800f48f4febe29ad6df69816fb1a914d283089150847f174b54d9907d8f5c6afd672a738f42737ec338f3a0964c629f7474dd44c5c8d784089250847f1db1db8aa45283f31168fa66694cf2808d2189b87c8c8143d56c871907b39b878508935084818180828009800909905062001ee460005262003015565b847f1530bf0f46527e889030b8c7b7dfde126f65faf8cce0ab66387341d813d1bfd182089050847f0b73f613993229f59f01c1cec8760e9936ead9edc8f2814889330a2f2bade45783089150847f29c25a22fe2164604552aaea377f448d587ab977fc8227787bd2dc0f36bcf41e84089250847f2b30d53ed1759bfb8503da66c92cf4077abe82795dc272b377df57d77c8755268508935084818180828009800909905062001f9560005262003015565b847f12f6d703b5702aab7b7b7e69359d53a2756c08c85ede7227cf5f0a2916787cd282089050847f2520e18300afda3f61a40a0b8837293a55ad01071028d4841ffa9ac70636411383089150847f1ec9daea860971ecdda8ed4f346fa967ac9bc59278277393c68f09fa03b8b95f84089250847f0a99b3e178db2e2e432f5cd5bef8fe4483bf5cbf70ed407c08aae24b830ad725850893508481818082800980090990506200204660005262003015565b847f07cda9e63db6e39f086b89b601c2bbe407ee0abac3c817a1317abad7c577849282089050847f08c9c65a4f955e8952d571b191bb0adb49bd8290963203b35d48aab38f8fc3a383089150847f2737f8ce1d5a67b349590ddbfbd709ed9af54a2a3f2719d33801c9c17bdd9c9e84089250847f1049a6c65ff019f0d28770072798e8b7909432bd0c129813a9f179ba627f7d6a85089350848181808280098009099050620020f760005262003015565b847f18b4fe968732c462c0ea5a9beb27cecbde8868944fdf64ee60a5122361daeddb82089050847f2ff2b6fd22df49d2440b2eaeeefa8c02a6f478cfcf11f1b2a4f7473483885d1983089150847f2ec5f2f1928fe932e56c789b8f6bbcb3e8be4057cbd8dbd18a1b352f5cef42ff84089250847f265a5eccd8b92975e33ad9f75bf3426d424a4c6a7794ee3f08c1d100378e545e85089350848181808280098009099050620021a860005262003015565b847f2405eaa4c0bde1129d6242bb5ada0e68778e656cfcb366bf20517da1dfd4279c82089050847f094c97d8c194c42e88018004cbbf2bc5fdb51955d8b2d66b76dd98a2dbf6041783089150847f2c30d5f33bb32c5c22b9979a605bf64d508b705221e6a686330c9625c2afe0b884089250847f01a75666f6241f6825d01cc6dcb1622d4886ea583e87299e6aa2fc716fdb6cf5850893508481818082800980090990506200225960005262003015565b847f0a3290e8398113ea4d12ac091e87be7c6d359ab9a66979fcf47bf2e87d382fcb82089050847f154ade9ca36e268dfeb38461425bb0d8c31219d8fa0dfc75ecd21bf69aa0cc7483089150847f27aa8d3e25380c0b1b172d79c6f22eee99231ef5dc69d8dc13a4b5095d02877284089250847f2cf4051e6cab48301a8b2e3bca6099d756bbdf485afa1f549d395bbcbd806461850893508481818082800980090990506200230a60005262003015565b847f301e70f729f3c94b1d3f517ddff9f2015131feab8afa5eebb0843d7f84b23e7182089050847f298beb64f812d25d8b4d9620347ab02332dc4cef113ae60d17a8d7a4c91f83bc83089150847f1b362e72a5f847f84d03fd291c3c471ed1c14a15b221680acf11a3f02e46aa9584089250847f0dc8a2146110c0b375432902999223d5aa1ef6e78e1e5ebcbc1d9ba41dc1c73785089350848181808280098009099050620023bb60005262003015565b847f0a48663b34ce5e1c05dc93092cb69778cb21729a72ddc03a08afa1eb922ff27982089050847f0a87391fb1cd8cdf6096b64a82f9e95f0fe46f143b702d74545bb314881098ee83089150847f1b5b2946f7c28975f0512ff8e6ca362f8826edd7ea9c29f382ba8a2a0892fd5d84089250847f01001cf512ac241d47ebe2239219bc6a173a8bbcb8a5b987b4eac1f533315b6b850893508481818082800980090990506200246c60005262003015565b847f2fd977c70f645db4f704fa7d7693da727ac093d3fb5f5febc72beb17d8358a3282089050847f23c0039a3fab4ad3c2d7cc688164f39e761d5355c05444d99be763a97793a9c483089150847f19d43ee0c6081c052c9c0df6161eaac1aec356cf435888e79f27f22ff03fa25d84089250847f2d9b10c2f2e7ac1afddccffd94a563028bf29b646d020830919f9d5ca1cefe59850893508481818082800980090990506200251d60005262003015565b847f2457ca6c2f2aa30ec47e4aff5a66f5ce2799283e166fc81cdae2f2b9f83e426782089050847f0abc392fe85eda855820592445094022811ee8676ed6f0c3044dfb54a7c10b3583089150847f19d2cc5ca549d1d40cebcd37f3ea54f31161ac3993acf3101d2c2bc30eac1eb084089250847f0f97ae3033ffa01608aafb26ae13cd393ee0e4ec041ba644a3d3ab546e98c9c885089350848181808280098009099050620025ce60005262003015565b847f16dbc78fd28b7fb8260e404cf1d427a7fa15537ea4e168e88a166496e88cfeca82089050847f240faf28f11499b916f085f73bc4f22eef8344e576f8ad3d1827820366d5e07b83089150847f0a1bb075aa37ff0cfe6c8531e55e1770eaba808c8fdb6dbf46f8cab58d9ef1af84089250847f2e47e15ea4a47ff1a6a853aaf3a644ca38d5b085ac1042fdc4a705a7ce089f4d850893508481818082800980090990506200267f60005262003015565b847f166e5bf073378348860ca4a9c09d39e1673ab059935f4df35fb14528375772b682089050847f18b42d7ffdd2ea4faf235902f057a2740cacccd027233001ed10f96538f0916f83089150847f089cb1b032238f5e4914788e3e3c7ead4fc368020b3ed38221deab1051c3770284089250847f242acd3eb3a2f72baf7c7076dd165adf89f9339c7b971921d9e70863451dd8d1850893508481818082800980090990506200273060005262003015565b847f174fbb104a4ee302bf47f2bd82fce896eac9a068283f326474af860457245c3b82089050847f17340e71d96f466d61f3058ce092c67d2891fb2bb318613f780c275fe1116c6b83089150847f1e8e40ac853b7d42f00f2e383982d024f098b9f8fd455953a2fd380c4df7f6b284089250847f0529898dc0649907e1d4d5e284b8d1075198c55cad66e8a9bf40f92938e2e96185089350848181808280098009099050620027e160005262003015565b847f2162754db0baa030bf7de5bb797364dce8c77aa017ee1d7bf65f21c4d4e5df8f82089050847f12c7553698c4bf6f3ceb250ae00c58c2a9f9291efbde4c8421bef44741752ec683089150847f292643e3ba2026affcb8c5279313bd51a733c93353e9d9c79cb723136526508e84089250847f00ccf13e0cb6f9d81d52951bea990bd5b6c07c5d98e66ff71db6e74d5b87d158850893508481818082800980090990506200289260005262003015565b847f185d1e20e23b0917dd654128cf2f3aaab6723873cb30fc22b0f86c15ab645b4b82089050847f14c61c836d55d3df742bdf11c60efa186778e3de0f024c0f13fe53f8d8764e1f83089150847f0f356841b3f556fce5dbe4680457691c2919e2af53008184d03ee1195d72449e84089250847f1b8fd9ff39714e075df124f887bf40b383143374fd2080ba0c0a6b6e8fa5b3e8850893508481818082800980090990506200294360005262003015565b847f0e86a8c2009c140ca3f873924e2aaa14fc3c8ae04e9df0b3e9103418796f602482089050847f2e6c5e898f5547770e5462ad932fcdd2373fc43820ca2b16b0861421e79155c883089150847f05d797f1ab3647237c14f9d1df032bc9ff9fe1a0ecd377972ce5fd5a0c01460484089250847f29a3110463a5aae76c3d152875981d0c1daf2dcd65519ef5ca8929851da8c00885089350848181808280098009099050620029f460005262003015565b847f2974da7bc074322273c3a4b91c05354cdc71640a8bbd1f864b732f816388331482089050847f1ed0fb06699ba249b2a30621c05eb12ca29cb91aa082c8bfcce9c522889b47dc83089150847f1c793ef0dcc51123654ff26d8d863feeae29e8c572eca912d80c8ae36e40fe9b84089250847f1e6aac1c6d3dd3157956257d3d234ef18c91e82589a78169fbb4a8770977dc2f8508935084818180828009800909905062002aa560005262003015565b847f1a20ada7576234eee6273dd6fa98b25ed037748080a47d948fcda33256fb6bf582089050847f191033d6d85ceaa6fc7a9a23a6fd9996642d772045ece51335d49306728af96c83089150847f006e5979da7e7ef53a825aa6fddc3abfc76f200b3740b8b232ef481f5d06297b84089250847f0b0d7e69c651910bbef3e68d417e9fa0fbd57f596c8f29831eff8c0174cdb06d8508935084818180828009800909905062002b5660005262003015565b847f25caf5b0c1b93bc516435ec084e2ecd44ac46dbbb033c5112c4b20a25c9cdf9d82089050847f12c1ea892cc31e0d9af8b796d9645872f7f77442d62fd4c8085b2f150f72472a83089150847f16af29695157aba9b8bbe3afeb245feee5a929d9f928b9b81de6dadc78c32aae84089250847f0136df457c80588dd687fb2f3be18691705b87ec5a4cfdc168d31084256b67dc8508935084818180828009800909905062002c0760005262003015565b847f1639a28c5b4c81166aea984fba6e71479e07b1efbc74434db95a285060e7b08982089050847f03d62fbf82fd1d4313f8e650f587ec06816c28b700bdc50f7e232bd9b5ca9b7683089150847f11aeeb527dc8ce44b4d14aaddca3cfe2f77a1e40fc6da97c249830de1edfde5484089250847f13f9b9a41274129479c5e6138c6c8ee36a670e6bc68c7a49642b645807bfc8248508935084818180828009800909905062002cb860005262003015565b847f0e4772fa3d75179dc8484cd26c7c1f635ddeeed7a939440c506cae8b7ebcd15b82089050847f1b39a00cbc81e427de4bdec58febe8d8b5971752067a612b39fc46a68c5d4db483089150847f2bedb66e1ad5a1d571e16e2953f48731f66463c2eb54a245444d1c0a3a25707e84089250847f2cf0a09a55ca93af8abd068f06a7287fb08b193b608582a27379ce35da915dec8508935084818180828009800909905084828180828009800909915084838180828009800909925084848180828009800909935062002d8d60005262003015565b847f2d1bd78fa90e77aa88830cabfef2f8d27d1a512050ba7db0753c8fb863efb38782089050847f065610c6f4f92491f423d3071eb83539f7c0d49c1387062e630d7fd283dc339483089150847f2d933ff19217a5545013b12873452bebcc5f9969033f15ec642fb464bd60736884089250847f1aa9d3fe4c644910f76b92b3e13b30d500dae5354e79508c3c49c8aa99e0258b8508935084818180828009800909905084828180828009800909915084838180828009800909925084848180828009800909935062002e6260005262003015565b847f027ef04869e482b1c748638c59111c6b27095fa773e1aca078cea1f1c8450bdd82089050847f2b7d524c5172cbbb15db4e00668a8c449f67a2605d9ec03802e3fa136ad0b8fb83089150847f0c7c382443c6aa787c8718d86747c7f74693ae25b1e55df13f7c3c1dd735db0f84089250847f00b4567186bc3f7c62a7b56acf4f76207a1f43c2d30d0fe4a627dcdd9bd790788508935084818180828009800909905084828180828009800909915084838180828009800909925084848180828009800909935062002f3760005262003015565b847f1e41fc29b825454fe6d61737fe08b47fb07fe739e4c1e61d0337490883db4fd582089050847f12507cd556b7bbcc72ee6dafc616584421e1af872d8c0e89002ae8d3ba0653b683089150847f13d437083553006bcef312e5e6f52a5d97eb36617ef36fe4d77d3e97f71cb5db84089250847f163ec73251f85443687222487dda9a65467d90b22f0b38664686077c6a4486d5850893508481818082800980090990508482818082800980090991508483818082800980090992508484818082800980090993506200300c60005262003015565b60005260206000f35b8460205182098560405184098691088560605185098691088560805186098691088560a05183098660c05185098791088660e05186098791088661010051870987910886610120518409876101405186098891088761016051870988910887610180518809889108876101a0518509886101c0518709899108886101e051880989910888610200518909899108965094509250905060005156","storage":{}},"0x0b306bf915c4d645ff596e518faf3f9669b97016":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061038c5760003560e01c806385c00ae8116101dc578063bac426d011610102578063ced72f87116100a0578063e63ab1e91161006f578063e63ab1e914610a73578063f63ebb4514610a95578063fae0959a14610ab5578063fc97a65214610ad557600080fd5b8063ced72f87146109f8578063d539139314610a11578063d547741f14610a33578063dd62ed3e14610a5357600080fd5b8063c2ae4720116100dc578063c2ae472014610982578063c80916d4146109a2578063ca15c873146109c2578063cc3c74a1146109e257600080fd5b8063bac426d01461092f578063bf376c7a1461094f578063c18764531461096257600080fd5b8063a001ecdd1161017a578063aa6ca80811610149578063aa6ca80814610893578063ac8a260c146108b5578063b1cba258146108e5578063b3e4083f1461091557600080fd5b8063a001ecdd14610810578063a217fddf1461083e578063a457c2d714610853578063a9059cbb1461087357600080fd5b80639010d07c116101b65780639010d07c1461079b57806391d14854146107bb57806395d89b41146107db57806396cd4dfe146107f057600080fd5b806385c00ae81461073b57806385d148341461075b5780638b5478b91461077b57600080fd5b8063313ce567116102c1578063469048401161025f57806370a082311161022e57806370a08231146106bd57806379cc6790146106f35780637b2e30d6146107135780638456cb591461072657600080fd5b806346904840146106275780634808285e146106655780634f64b2be146106855780635c975abb146106a557600080fd5b806339f476931161029b57806339f47693146105b25780633f4ba83a146105d257806340c10f19146105e757806342966c681461060757600080fd5b8063313ce5671461055657806336568abe14610572578063395093511461059257600080fd5b80631c4a14361161032e578063248a9ca311610308578063248a9ca3146104d3578063261c80b6146105035780632ca69388146105235780632f2ff15d1461053657600080fd5b80631c4a14361461047d5780631f9143821461049d57806323b872dd146104b357600080fd5b8063095ea7b31161036a578063095ea7b31461040a5780630b27fb9a1461042a578063158ef93e1461044957806318160ddd1461046857600080fd5b806301ffc9a71461039157806306fdde03146103c657806307184f1c146103e8575b600080fd5b34801561039d57600080fd5b506103b16103ac366004613787565b610af5565b60405190151581526020015b60405180910390f35b3480156103d257600080fd5b506103db610b20565b6040516103bd91906137d5565b3480156103f457600080fd5b50610408610403366004613831565b610bb2565b005b34801561041657600080fd5b506103b1610425366004613866565b610d43565b34801561043657600080fd5b50600a545b6040519081526020016103bd565b34801561045557600080fd5b506007546103b190610100900460ff1681565b34801561047457600080fd5b5060045461043b565b34801561048957600080fd5b50610408610498366004613831565b610d5b565b3480156104a957600080fd5b5061043b60115481565b3480156104bf57600080fd5b506103b16104ce366004613892565b610fac565b3480156104df57600080fd5b5061043b6104ee3660046138d3565b60009081526020819052604090206001015490565b34801561050f57600080fd5b5061040861051e366004613892565b610fd0565b610408610531366004613892565b611167565b34801561054257600080fd5b506104086105513660046138ec565b6112e8565b34801561056257600080fd5b50604051601281526020016103bd565b34801561057e57600080fd5b5061040861058d3660046138ec565b61130d565b34801561059e57600080fd5b506103b16105ad366004613866565b61138b565b3480156105be57600080fd5b506104086105cd366004613866565b6113ad565b3480156105de57600080fd5b5061040861150b565b3480156105f357600080fd5b50610408610602366004613866565b61159f565b34801561061357600080fd5b506104086106223660046138d3565b61162c565b34801561063357600080fd5b5060095461064d906201000090046001600160a01b031681565b6040516001600160a01b0390911681526020016103bd565b34801561067157600080fd5b5061040861068036600461391c565b611639565b34801561069157600080fd5b5061064d6106a03660046138d3565b61178b565b3480156106b157600080fd5b5060075460ff166103b1565b3480156106c957600080fd5b5061043b6106d836600461395e565b6001600160a01b031660009081526002602052604090205490565b3480156106ff57600080fd5b5061040861070e366004613866565b6117b5565b61040861072136600461397b565b6117ca565b34801561073257600080fd5b50610408611951565b34801561074757600080fd5b5061043b6107563660046138d3565b6119e3565b34801561076757600080fd5b5061064d6107763660046138d3565b611a05565b34801561078757600080fd5b506104086107963660046139dc565b611a15565b3480156107a757600080fd5b5061064d6107b63660046139f9565b611aae565b3480156107c757600080fd5b506103b16107d63660046138ec565b611acd565b3480156107e757600080fd5b506103db611af6565b3480156107fc57600080fd5b5061043b61080b3660046138d3565b611b05565b34801561081c57600080fd5b5060095461082b9061ffff1681565b60405161ffff90911681526020016103bd565b34801561084a57600080fd5b5061043b600081565b34801561085f57600080fd5b506103b161086e366004613866565b611b2b565b34801561087f57600080fd5b506103b161088e366004613866565b611ba6565b34801561089f57600080fd5b506108a8611bb4565b6040516103bd9190613a1b565b3480156108c157600080fd5b506103b16108d036600461395e565b600e6020526000908152604090205460ff1681565b3480156108f157600080fd5b506103b161090036600461395e565b600f6020526000908152604090205460ff1681565b34801561092157600080fd5b506010546103b19060ff1681565b34801561093b57600080fd5b5061040861094a36600461395e565b611c15565b61040861095d366004613866565b611cda565b34801561096e57600080fd5b506103b161097d36600461395e565b611e27565b34801561098e57600080fd5b5061040861099d366004613a7a565b611e68565b3480156109ae57600080fd5b50600b5461064d906001600160a01b031681565b3480156109ce57600080fd5b5061043b6109dd3660046138d3565b611fc1565b3480156109ee57600080fd5b5061043b600a5481565b348015610a0457600080fd5b5060095461ffff1661082b565b348015610a1d57600080fd5b5061043b60008051602061425a83398151915281565b348015610a3f57600080fd5b50610408610a4e3660046138ec565b611fd8565b348015610a5f57600080fd5b5061043b610a6e366004613a96565b611ffd565b348015610a7f57600080fd5b5061043b60008051602061423a83398151915281565b348015610aa157600080fd5b50610408610ab0366004613ac4565b612028565b348015610ac157600080fd5b50610408610ad03660046138d3565b612201565b348015610ae157600080fd5b50610408610af0366004613831565b612260565b60006001600160e01b03198216635a05180f60e01b1480610b1a5750610b1a8261253c565b92915050565b606060058054610b2f90613b3b565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5b90613b3b565b8015610ba85780601f10610b7d57610100808354040283529160200191610ba8565b820191906000526020600020905b815481529060010190602001808311610b8b57829003601f168201915b5050505050905090565b600b546001600160a01b03163314610be55760405162461bcd60e51b8152600401610bdc90613b75565b60405180910390fd5b600754610100900460ff16610c0c5760405162461bcd60e51b8152600401610bdc90613bd2565b8063ffffffff1680600a5410610c345760405162461bcd60e51b8152600401610bdc90613c09565b600a54610c42906001613c62565b811115610c615760405162461bcd60e51b8152600401610bdc90613c75565b600a8190556001600160a01b038316610ce25760405162461bcd60e51b815260206004820152603a60248201527f46756e6769626c65546f6b656e577261707065723a204665652052656369706960448201527f656e742063616e6e6f74206265207a65726f20616464726573730000000000006064820152608401610bdc565b6009805462010000600160b01b031916620100006001600160a01b038616908102919091179091556040519081527f7a7b5a0a132f9e0581eb8527f66eae9ee89c2a3e79d4ac7e41a1f1f4d48a7fc2906020015b60405180910390a1505050565b600033610d51818585612571565b5060019392505050565b600b546001600160a01b03163314610d855760405162461bcd60e51b8152600401610bdc90613b75565b600754610100900460ff16610dac5760405162461bcd60e51b8152600401610bdc90613bd2565b8063ffffffff1680600a5410610dd45760405162461bcd60e51b8152600401610bdc90613c09565b600a54610de2906001613c62565b811115610e015760405162461bcd60e51b8152600401610bdc90613c75565b600a8190556001600160a01b0383166000908152600e602052604090205460ff16610e825760405162461bcd60e51b815260206004820152602b60248201527f46756e6769626c65546f6b656e577261707065723a20546f6b656e2073686f7560448201526a1b19081899481d985b1a5960aa1b6064820152608401610bdc565b6000805b600c54811015610ee157846001600160a01b0316600c8281548110610ead57610ead613cd2565b6000918252602090912001546001600160a01b031603610ecf57809150610ee1565b80610ed981613ce8565b915050610e86565b50600c548110610f415760405162461bcd60e51b815260206004820152602560248201527f46756e6769626c65546f6b656e577261707065723a20546f6b656e206e6f7420604482015264199bdd5b9960da1b6064820152608401610bdc565b6001600160a01b0384166000908152600e60205260409020805460ff19169055610f6a81612695565b6040516001600160a01b03851681527f4c910b69fe65a61f7531b9c5042b2329ca7179c77290aa7e2eb3afa3c8511fd39060200160405180910390a150505050565b600033610fba858285612745565b610fc58585856127b9565b506001949350505050565b610fd861296f565b600754610100900460ff16610fff5760405162461bcd60e51b8152600401610bdc90613bd2565b61101760008051602061425a83398151915233611acd565b6110335760405162461bcd60e51b8152600401610bdc90613d01565b81816001600160a01b03821661108a57804710156110635760405162461bcd60e51b8152600401610bdc90613d44565b60105460ff166110855760405162461bcd60e51b8152600401610bdc90613d8d565b61114a565b6040516370a0823160e01b815230600482015281906001600160a01b038416906370a0823190602401602060405180830381865afa1580156110d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f49190613df8565b10156111125760405162461bcd60e51b8152600401610bdc90613e11565b6001600160a01b0382166000908152600f602052604090205460ff1661114a5760405162461bcd60e51b8152600401610bdc90613e59565b611156858585886129c8565b50506111626001600855565b505050565b61116f61296f565b600754610100900460ff166111965760405162461bcd60e51b8152600401610bdc90613bd2565b6111ae60008051602061425a83398151915233611acd565b6111ca5760405162461bcd60e51b8152600401610bdc90613d01565b60095482906001600160a01b03620100009091048116908390831661122e5780156112075760405162461bcd60e51b8152600401610bdc90613ea7565b60105460ff166112295760405162461bcd60e51b8152600401610bdc90613f04565b611284565b341561124c5760405162461bcd60e51b8152600401610bdc90613f6d565b6001600160a01b0383166000908152600e602052604090205460ff166112845760405162461bcd60e51b8152600401610bdc90613fba565b6001600160a01b0382166112aa5760405162461bcd60e51b8152600401610bdc90613ffd565b6112b381612a8d565b6112cf5760405162461bcd60e51b8152600401610bdc9061404f565b6112db86868689612b06565b5050506111626001600855565b60008281526020819052604090206001015461130381612c51565b6111628383612c5b565b6001600160a01b038116331461137d5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610bdc565b6113878282612c7d565b5050565b600033610d5181858561139e8383611ffd565b6113a89190613c62565b612571565b6113b561296f565b600754610100900460ff166113dc5760405162461bcd60e51b8152600401610bdc90613bd2565b81816001600160a01b038216611433578047101561140c5760405162461bcd60e51b8152600401610bdc90613d44565b60105460ff1661142e5760405162461bcd60e51b8152600401610bdc90613d8d565b6114f3565b6040516370a0823160e01b815230600482015281906001600160a01b038416906370a0823190602401602060405180830381865afa158015611479573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061149d9190613df8565b10156114bb5760405162461bcd60e51b8152600401610bdc90613e11565b6001600160a01b0382166000908152600f602052604090205460ff166114f35760405162461bcd60e51b8152600401610bdc90613e59565b6114ff338585336129c8565b50506113876001600855565b61152360008051602061423a83398151915233611acd565b6115955760405162461bcd60e51b815260206004820152603960248201527f45524332305072657365744d696e7465725061757365723a206d75737420686160448201527f76652070617573657220726f6c6520746f20756e7061757365000000000000006064820152608401610bdc565b61159d612c9f565b565b6115b760008051602061425a83398151915233611acd565b6116225760405162461bcd60e51b815260206004820152603660248201527f45524332305072657365744d696e7465725061757365723a206d7573742068616044820152751d99481b5a5b9d195c881c9bdb19481d1bc81b5a5b9d60521b6064820152608401610bdc565b6113878282612cf1565b6116363382612dbe565b50565b61164161296f565b600754610100900460ff166116685760405162461bcd60e51b8152600401610bdc90613bd2565b82826001600160a01b0382166116bf57804710156116985760405162461bcd60e51b8152600401610bdc90613d44565b60105460ff166116ba5760405162461bcd60e51b8152600401610bdc90613d8d565b61177f565b6040516370a0823160e01b815230600482015281906001600160a01b038416906370a0823190602401602060405180830381865afa158015611705573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117299190613df8565b10156117475760405162461bcd60e51b8152600401610bdc90613e11565b6001600160a01b0382166000908152600f602052604090205460ff1661177f5760405162461bcd60e51b8152600401610bdc90613e59565b611156338686866129c8565b600c818154811061179b57600080fd5b6000918252602090912001546001600160a01b0316905081565b6117c0823383612745565b6113878282612dbe565b6117d261296f565b600754610100900460ff166117f95760405162461bcd60e51b8152600401610bdc90613bd2565b61181160008051602061425a83398151915233611acd565b61182d5760405162461bcd60e51b8152600401610bdc90613d01565b60095483906001600160a01b03620100009091048116908490831661189157801561186a5760405162461bcd60e51b8152600401610bdc90613ea7565b60105460ff1661188c5760405162461bcd60e51b8152600401610bdc90613f04565b6118e7565b34156118af5760405162461bcd60e51b8152600401610bdc90613f6d565b6001600160a01b0383166000908152600e602052604090205460ff166118e75760405162461bcd60e51b8152600401610bdc90613fba565b6001600160a01b03821661190d5760405162461bcd60e51b8152600401610bdc90613ffd565b61191681612a8d565b6119325760405162461bcd60e51b8152600401610bdc9061404f565b61193e87878787612b06565b50505061194b6001600855565b50505050565b61196960008051602061423a83398151915233611acd565b6119db5760405162461bcd60e51b815260206004820152603760248201527f45524332305072657365744d696e7465725061757365723a206d75737420686160448201527f76652070617573657220726f6c6520746f2070617573650000000000000000006064820152608401610bdc565b61159d612efe565b600954600090612710906119fb9061ffff1684614091565b610b1a91906140a8565b600d818154811061179b57600080fd5b600b546001600160a01b03163314611a3f5760405162461bcd60e51b8152600401610bdc90613b75565b600754610100900460ff16611a665760405162461bcd60e51b8152600401610bdc90613bd2565b6010805460ff19168215159081179091556040519081527f0ee33489a3708dd37659f79ff3c68b385fadf270ba08b0bd75ba882a9cbdceab906020015b60405180910390a150565b6000828152600160205260408120611ac69083612f3b565b9392505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b606060068054610b2f90613b3b565b600954600090611b1b9061ffff166127106140ca565b61ffff166119fb83612710614091565b60003381611b398286611ffd565b905083811015611b995760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610bdc565b610fc58286868403612571565b600033610d518185856127b9565b6060600c805480602002602001604051908101604052809291908181526020018280548015610ba857602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611bee575050505050905090565b600b546001600160a01b03163314611c3f5760405162461bcd60e51b8152600401610bdc90613b75565b600754610100900460ff16611c665760405162461bcd60e51b8152600401610bdc90613bd2565b6001600160a01b038116611c8c5760405162461bcd60e51b8152600401610bdc906140e5565b600b80546001600160a01b0319166001600160a01b0383169081179091556040519081527ffe149843a4404b43699d446c99c9be2d7a5bfc8bd66e15ca4cfad5ca2811dd9b90602001611aa3565b611ce261296f565b600754610100900460ff16611d095760405162461bcd60e51b8152600401610bdc90613bd2565b60095482906001600160a01b036201000090910481169083908316611d6d578015611d465760405162461bcd60e51b8152600401610bdc90613ea7565b60105460ff16611d685760405162461bcd60e51b8152600401610bdc90613f04565b611dc3565b3415611d8b5760405162461bcd60e51b8152600401610bdc90613f6d565b6001600160a01b0383166000908152600e602052604090205460ff16611dc35760405162461bcd60e51b8152600401610bdc90613fba565b6001600160a01b038216611de95760405162461bcd60e51b8152600401610bdc90613ffd565b611df281612a8d565b611e0e5760405162461bcd60e51b8152600401610bdc9061404f565b611e1a33868633612b06565b5050506113876001600855565b60006001600160a01b038216611e425760105460ff16610b1a565b6001600160a01b0382166000908152600e602052604090205460ff16610b1a565b919050565b600b546001600160a01b03163314611e925760405162461bcd60e51b8152600401610bdc90613b75565b600754610100900460ff16611eb95760405162461bcd60e51b8152600401610bdc90613bd2565b8063ffffffff1680600a5410611ee15760405162461bcd60e51b8152600401610bdc90613c09565b600a54611eef906001613c62565b811115611f0e5760405162461bcd60e51b8152600401610bdc90613c75565b600a81905561271061ffff841610611f7d5760405162461bcd60e51b815260206004820152602c60248201527f46756e6769626c65546f6b656e577261707065723a20496e76616c696420666560448201526b652070657263656e7461676560a01b6064820152608401610bdc565b6009805461ffff191661ffff85169081179091556040519081527fc8fcf8ee1425e7e60b8af83735e1eb516d5b9ef05bfd6eece552ebaeb7c75b4890602001610d36565b6000818152600160205260408120610b1a90612f47565b600082815260208190526040902060010154611ff381612c51565b6111628383612c7d565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b600754610100900460ff16156120805760405162461bcd60e51b815260206004820181905260248201527f496e697469616c697a65643a20416c726561647920696e697469616c697a65646044820152606401610bdc565b6001600160a01b0385166120f55760405162461bcd60e51b815260206004820152603660248201527f46756e6769626c65546f6b656e577261707065723a20466565205265636970696044820152750656e7420416464726573732063616e277420626520360541b6064820152608401610bdc565b6001600160a01b03841661211b5760405162461bcd60e51b8152600401610bdc906140e5565b6001600160a01b0381166121885760405162461bcd60e51b815260206004820152602e60248201527f46756e6769626c65546f6b656e577261707065723a2041646d696e204164647260448201526d06573732063616e277420626520360941b6064820152608401610bdc565b61219181612f51565b506007805461010061ff00199091161790556009805461ffff969096166001600160b01b031990961695909517620100006001600160a01b039586160217909455600b80546001600160a01b03191692909316919091179091556011556010805460ff1916911515919091179055565b600b546001600160a01b0316331461222b5760405162461bcd60e51b8152600401610bdc90613b75565b60118190556040518181527f14c192a37ba74e5a261a886dc0ea48af42ef0f8aaf19c3adfb61a21cfed3871a90602001611aa3565b600b546001600160a01b0316331461228a5760405162461bcd60e51b8152600401610bdc90613b75565b600754610100900460ff166122b15760405162461bcd60e51b8152600401610bdc90613bd2565b8063ffffffff1680600a54106122d95760405162461bcd60e51b8152600401610bdc90613c09565b600a546122e7906001613c62565b8111156123065760405162461bcd60e51b8152600401610bdc90613c75565b600a8190556001600160a01b0383166000908152600e602052604090205460ff161561238c5760405162461bcd60e51b815260206004820152602f60248201527f46756e6769626c65546f6b656e577261707065723a20546f6b656e2073686f7560448201526e1b19081b9bdd081899481d985b1a59608a1b6064820152608401610bdc565b600c8054600181019091557fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70180546001600160a01b0319166001600160a01b0385169081179091556000908152600f602052604090205460ff1661244f57600d805460018082019092557fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50180546001600160a01b0319166001600160a01b0386169081179091556000908152600f60205260409020805460ff191690911790555b6001600160a01b0383166000818152600e6020908152604091829020805460ff1916600117905590519182527f784c8f4dbf0ffedd6e72c76501c545a70f8b203b30a26ce542bf92ba87c248a49101610d36565b6124ad8282611acd565b611387576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556124e33390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000611ac6836001600160a01b038416612f8c565b60006001600160e01b03198216637965db0b60e01b1480610b1a57506301ffc9a760e01b6001600160e01b0319831614610b1a565b6001600160a01b0383166125d35760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610bdc565b6001600160a01b0382166126345760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610bdc565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600c80546126a590600190614135565b815481106126b5576126b5613cd2565b600091825260209091200154600c80546001600160a01b0390921691839081106126e1576126e1613cd2565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600c80548061272057612720614148565b600082815260209020810160001990810180546001600160a01b031916905501905550565b60006127518484611ffd565b9050600019811461194b57818110156127ac5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610bdc565b61194b8484848403612571565b6001600160a01b03831661281d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610bdc565b6001600160a01b03821661287f5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610bdc565b61288a838383612fdb565b6001600160a01b038316600090815260026020526040902054818110156129025760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610bdc565b6001600160a01b0380851660008181526002602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906129629086815260200190565b60405180910390a361194b565b6002600854036129c15760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610bdc565b6002600855565b6129d28483612dbe565b6001600160a01b038316612a1c576040516001600160a01b0382169083156108fc029084906000818181858888f19350505050158015612a16573d6000803e3d6000fd5b50612a30565b612a306001600160a01b0384168284612fe6565b826001600160a01b0316816001600160a01b0316856001600160a01b03167fc7cf326ae4d946221176a457cc309d5d2c15f3547111d8cca36951076eee4d0885604051612a7f91815260200190565b60405180910390a450505050565b6000601154306001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ad0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612af49190613df8565b612afe9084613c62565b111592915050565b6000612b266001600160a01b03851615612b2057836119e3565b346119e3565b905060006001600160a01b03851615612b4857612b438285614135565b612b52565b612b528234614135565b90506001600160a01b038516612ba757600954604051620100009091046001600160a01b0316906108fc8415029084906000818181858888f19350505050158015612ba1573d6000803e3d6000fd5b50612bdf565b612bbc6001600160a01b038616873084613049565b600954612bdf906001600160a01b03878116918991620100009091041685613049565b612be98382612cf1565b846001600160a01b0316836001600160a01b0316876001600160a01b03167f33b746cfd20b944045b4330ae6f0c76d65eb4b3939a92f6c0a5dce4e9e9f99d98585604051612c41929190918252602082015260400190565b60405180910390a4505050505050565b6116368133613081565b612c6582826124a3565b60008281526001602052604090206111629082612527565b612c8782826130da565b6000828152600160205260409020611162908261313f565b612ca7613154565b6007805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b038216612d475760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610bdc565b612d5360008383612fdb565b8060046000828254612d659190613c62565b90915550506001600160a01b0382166000818152600260209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6001600160a01b038216612e1e5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610bdc565b612e2a82600083612fdb565b6001600160a01b03821660009081526002602052604090205481811015612e9e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610bdc565b6001600160a01b03831660008181526002602090815260408083208686039055600480548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b612f0661319d565b6007805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612cd43390565b6000611ac683836131e3565b6000610b1a825490565b612f6960008051602061425a8339815191528261320d565b612f7460008261320d565b61163660008051602061423a8339815191528261320d565b6000818152600183016020526040812054612fd357508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610b1a565b506000610b1a565b611162838383613217565b6040516001600160a01b03831660248201526044810182905261116290849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261327d565b6040516001600160a01b038085166024830152831660448201526064810182905261194b9085906323b872dd60e01b90608401613012565b61308b8282611acd565b611387576130988161334f565b6130a3836020613361565b6040516020016130b492919061415e565b60408051601f198184030181529082905262461bcd60e51b8252610bdc916004016137d5565b6130e48282611acd565b15611387576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000611ac6836001600160a01b0384166134fd565b60075460ff1661159d5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610bdc565b60075460ff161561159d5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610bdc565b60008260000182815481106131fa576131fa613cd2565b9060005260206000200154905092915050565b6113878282612c5b565b60075460ff16156111625760405162461bcd60e51b815260206004820152602a60248201527f45524332305061757361626c653a20746f6b656e207472616e736665722077686044820152691a5b19481c185d5cd95960b21b6064820152608401610bdc565b60006132d2826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166135f79092919063ffffffff16565b80519091501561116257808060200190518101906132f091906141d3565b6111625760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610bdc565b6060610b1a6001600160a01b03831660145b60606000613370836002614091565b61337b906002613c62565b67ffffffffffffffff811115613393576133936141f0565b6040519080825280601f01601f1916602001820160405280156133bd576020820181803683370190505b509050600360fc1b816000815181106133d8576133d8613cd2565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061340757613407613cd2565b60200101906001600160f81b031916908160001a905350600061342b846002614091565b613436906001613c62565b90505b60018111156134ae576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061346a5761346a613cd2565b1a60f81b82828151811061348057613480613cd2565b60200101906001600160f81b031916908160001a90535060049490941c936134a781614206565b9050613439565b508315611ac65760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610bdc565b600081815260018301602052604081205480156135e6576000613521600183614135565b855490915060009061353590600190614135565b905081811461359a57600086600001828154811061355557613555613cd2565b906000526020600020015490508087600001848154811061357857613578613cd2565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806135ab576135ab614148565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610b1a565b6000915050610b1a565b5092915050565b6060613606848460008561360e565b949350505050565b60608247101561366f5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610bdc565b600080866001600160a01b0316858760405161368b919061421d565b60006040518083038185875af1925050503d80600081146136c8576040519150601f19603f3d011682016040523d82523d6000602084013e6136cd565b606091505b50915091506136de878383876136e9565b979650505050505050565b60608315613758578251600003613751576001600160a01b0385163b6137515760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610bdc565b5081613606565b613606838381511561376d5781518083602001fd5b8060405162461bcd60e51b8152600401610bdc91906137d5565b60006020828403121561379957600080fd5b81356001600160e01b031981168114611ac657600080fd5b60005b838110156137cc5781810151838201526020016137b4565b50506000910152565b60208152600082518060208401526137f48160408501602087016137b1565b601f01601f19169190910160400192915050565b6001600160a01b038116811461163657600080fd5b803563ffffffff81168114611e6357600080fd5b6000806040838503121561384457600080fd5b823561384f81613808565b915061385d6020840161381d565b90509250929050565b6000806040838503121561387957600080fd5b823561388481613808565b946020939093013593505050565b6000806000606084860312156138a757600080fd5b83356138b281613808565b925060208401356138c281613808565b929592945050506040919091013590565b6000602082840312156138e557600080fd5b5035919050565b600080604083850312156138ff57600080fd5b82359150602083013561391181613808565b809150509250929050565b60008060006060848603121561393157600080fd5b833561393c81613808565b925060208401359150604084013561395381613808565b809150509250925092565b60006020828403121561397057600080fd5b8135611ac681613808565b6000806000806080858703121561399157600080fd5b843561399c81613808565b935060208501356139ac81613808565b92506040850135915060608501356139c381613808565b939692955090935050565b801515811461163657600080fd5b6000602082840312156139ee57600080fd5b8135611ac6816139ce565b60008060408385031215613a0c57600080fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b81811015613a5c5783516001600160a01b031683529284019291840191600101613a37565b50909695505050505050565b803561ffff81168114611e6357600080fd5b60008060408385031215613a8d57600080fd5b61384f83613a68565b60008060408385031215613aa957600080fd5b8235613ab481613808565b9150602083013561391181613808565b60008060008060008060c08789031215613add57600080fd5b613ae687613a68565b95506020870135613af681613808565b94506040870135613b0681613808565b9350606087013592506080870135613b1d816139ce565b915060a0870135613b2d81613808565b809150509295509295509295565b600181811c90821680613b4f57607f821691505b602082108103613b6f57634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526039908201527f46756e6769626c65546f6b656e577261707065723a204f6e6c792068616e646c60408201527f65722063616e2063616c6c20746869732066756e6374696f6e00000000000000606082015260800190565b6020808252601c908201527f496e697469616c697a65643a204e6f7420696e697469616c697a656400000000604082015260600190565b60208082526023908201527f50726f706f73616c4e6f6e6365547261636b65723a20496e76616c6964206e6f6040820152626e636560e81b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b80820180821115610b1a57610b1a613c4c565b6020808252603a908201527f50726f706f73616c4e6f6e6365547261636b65723a204e6f6e6365206d75737460408201527f206e6f7420696e6372656d656e74206d6f7265207468616e2031000000000000606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600060018201613cfa57613cfa613c4c565b5060010190565b60208082526023908201527f546f6b656e577261707065723a206d7573742068617665206d696e74657220726040820152626f6c6560e81b606082015260800190565b60208082526029908201527f546f6b656e577261707065723a20496e73756666696369656e74206e61746976604082015268652062616c616e636560b81b606082015260800190565b60208082526045908201527f546f6b656e577261707065723a204e617469766520756e7772617070696e672060408201527f6973206e6f7420616c6c6f77656420666f72207468697320746f6b656e20777260608201526430b83832b960d91b608082015260a00190565b600060208284031215613e0a57600080fd5b5051919050565b60208082526028908201527f546f6b656e577261707065723a20496e73756666696369656e742045524332306040820152672062616c616e636560c01b606082015260800190565b6020808252602e908201527f546f6b656e577261707065723a20496e76616c696420686973746f726963616c60408201526d20746f6b656e206164647265737360901b606082015260800190565b60208082526039908201527f546f6b656e577261707065723a20496e76616c696420616d6f756e742070726f60408201527f766964656420666f72206e6174697665207772617070696e6700000000000000606082015260800190565b60208082526043908201527f546f6b656e577261707065723a204e6174697665207772617070696e6720697360408201527f206e6f7420616c6c6f77656420666f72207468697320746f6b656e20777261706060820152623832b960e91b608082015260a00190565b6020808252602d908201527f546f6b656e577261707065723a20496e76616c69642076616c75652073656e7460408201526c20666f72207772617070696e6760981b606082015260800190565b60208082526023908201527f546f6b656e577261707065723a20496e76616c696420746f6b656e206164647260408201526265737360e81b606082015260800190565b60208082526032908201527f546f6b656e577261707065723a2046656520526563697069656e742063616e6e6040820152716f74206265207a65726f206164647265737360701b606082015260800190565b60208082526022908201527f546f6b656e577261707065723a20496e76616c696420746f6b656e20616d6f756040820152611b9d60f21b606082015260800190565b8082028115828204841417610b1a57610b1a613c4c565b6000826140c557634e487b7160e01b600052601260045260246000fd5b500490565b61ffff8281168282160390808211156135f0576135f0613c4c565b60208082526030908201527f46756e6769626c65546f6b656e577261707065723a2048616e646c657220416460408201526f064726573732063616e277420626520360841b606082015260800190565b81810381811115610b1a57610b1a613c4c565b634e487b7160e01b600052603160045260246000fd5b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516141968160178501602088016137b1565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516141c78160288401602088016137b1565b01602801949350505050565b6000602082840312156141e557600080fd5b8151611ac6816139ce565b634e487b7160e01b600052604160045260246000fd5b60008161421557614215613c4c565b506000190190565b6000825161422f8184602087016137b1565b919091019291505056fe65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6a2646970667358221220cfa93c065d8df089ff1b30d808b84f1f2660335b4f1f8f02ed96a4dd1c86113064736f6c63430008120033","storage":{"0x5":"0x54616e676c6520546f6b656e0000000000000000000000000000000000000018","0x6":"0x74544e5400000000000000000000000000000000000000000000000000000008","0x7":"0x0","0x8":"0x1","0x781d7cac9c378efa22a7481e4d4d29704a680ddf504b3bc50b517700ee11e6d":"0x0","0xeb5be412f275a18f6e4d622aee4ff40b21467c926224771b782d4c095d1444b":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x25ef4724465a730631953512e5276faca131f1eb4d6aa575c6a27e5c8ffa020a":"0x1","0x3471021a57ac06568e6a3064485bde7912220cf82f2e58df9da59a7ec8e62f11":"0x1","0x64e21244e91af723e1b962171ed4828dcecc0d7b89872e516a5db8266da80000":"0x2","0x6d2487ab6e76634bbe98b9d5b39803d625a8f9249da9e03e70c638bf76d9e29b":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x6d2487ab6e76634bbe98b9d5b39803d625a8f9249da9e03e70c638bf76d9e29c":"0x68b1d87f95878fe05b998f19b66f4baba5de1aed","0x7686275f06b3db5aabdb390207b7e6256eaeeb616bad1a0d44aead6dcc8bc426":"0x1","0x8162c320ba4d6a86874063b43f81c4f0e2ab8e9423fb9fc832a61cf319bd42a1":"0x1","0x9a4da4b72a7185f66e64600477984baf61bc80d14d78478b3fb2fac167efa705":"0x2","0xa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49":"0x1","0xa88c7c1ec43ca7b89f828de86356ea828a037a1724597e3d0de9a4593d4862f9":"0x1","0xaeb411f839d816dcc07602e0c9ef96c737968331a745f1dae7a9b4b82fb680da":"0x1","0xb009fbc347bffd144efd545cc4b15a37592e1dd7063753564d9ecc6fea764b6f":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0xb1ff89dba83950c04037da9c68ad6cec10de24e9563509840b2703f67e517ba6":"0x1","0xb9cbbae02fe941283ec0eefd7b121e3bc7f89fae077b27bdd75a7fd4cf1543a8":"0x1"}},"0x0dcd1bf9a1b36ce34237eeafef220932846bcd82":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106100575760003560e01c80632e4286861461005c57806330ba9e4d1461008c5780638041ca531461009f578063e65f86af146100c2578063f8d50636146100d5575b600080fd5b60005461006f906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b60025461006f906001600160a01b031681565b6100b26100ad3660046103e5565b6100e8565b6040519015158152602001610083565b60035461006f906001600160a01b031681565b60015461006f906001600160a01b031681565b60008260ff166001036101de5781156101915760008480602001905181019061011191906104c1565b60005460405163c542c93b60e01b81529192506001600160a01b03169063c542c93b90610148908b908b908b9087906004016105b6565b602060405180830381865afa158015610165573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101899190610613565b91505061028d565b6000848060200190518101906101a79190610637565b60015460405163506150cd60e11b81529192506001600160a01b03169063a0c2a19a90610148908b908b908b90879060040161064b565b8260ff1660070361028957811561023c57600084806020019051810190610205919061069c565b60025460405163f054a9a360e01b81529192506001600160a01b03169063f054a9a390610148908b908b908b9087906004016106b0565b6000848060200190518101906102529190610701565b600354604051632a5c50a360e11b81529192506001600160a01b0316906354b8a14690610148908b908b908b908790600401610715565b5060005b9695505050505050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156102d0576102d0610297565b60405290565b600082601f8301126102e757600080fd5b6102ef6102ad565b80604084018581111561030157600080fd5b845b8181101561031b578035845260209384019301610303565b509095945050505050565b600082601f83011261033757600080fd5b813567ffffffffffffffff8082111561035257610352610297565b604051601f8301601f19908116603f0116810190828211818310171561037a5761037a610297565b8160405283815286602085880101111561039357600080fd5b836020870160208301376000602085830101528094505050505092915050565b803560ff811681146103c457600080fd5b919050565b80151581146103d757600080fd5b50565b80356103c4816103c9565b60008060008060008061016087890312156103ff57600080fd5b61040988886102d6565b9550604088605f89011261041c57600080fd5b6104246102ad565b8060c08a018b81111561043657600080fd5b838b015b8181101561045b5761044c8d826102d6565b8452602090930192840161043a565b508198506104698c826102d6565b97505050505061010087013567ffffffffffffffff81111561048a57600080fd5b61049689828a01610326565b9350506104a661012088016103b3565b91506104b561014088016103da565b90509295509295509295565b60006101208083850312156104d557600080fd5b83601f8401126104e457600080fd5b60405181810181811067ffffffffffffffff8211171561050657610506610297565b60405290830190808583111561051b57600080fd5b845b8381101561031b57805182526020918201910161051d565b8060005b6002811015610558578151845260209384019390910190600101610539565b50505050565b806000805b600280821061057257506105af565b835186845b83811015610595578251825260209283019290910190600101610577565b505050604095909501945060209290920191600101610563565b5050505050565b61022081016105c58287610535565b6105d2604083018661055e565b6105df60c0830185610535565b61010082018360005b60098110156106075781518352602092830192909101906001016105e8565b50505095945050505050565b60006020828403121561062557600080fd5b8151610630816103c9565b9392505050565b60006102e08083850312156104d557600080fd5b6103e0810161065a8287610535565b610667604083018661055e565b61067460c0830185610535565b61010082018360005b601781101561060757815183526020928301929091019060010161067d565b60006101e08083850312156104d557600080fd5b6102e081016106bf8287610535565b6106cc604083018661055e565b6106d960c0830185610535565b61010082018360005b600f8110156106075781518352602092830192909101906001016106e2565b60006103a08083850312156104d557600080fd5b6104a081016107248287610535565b610731604083018661055e565b61073e60c0830185610535565b61010082018360005b601d81101561060757815183526020928301929091019060010161074756fea2646970667358221220548fd5d9af99065ad09efd0183ecd75560e4dbe69f2702b5c824ca7ee92e6f1264736f6c63430008120033","storage":{"0x0":"0x8a791620dd6260079bf849dc5567adc3f2fdc318","0x1":"0x610178da211fef7d417bc0e6fed39f05609ad788","0x2":"0xb7f8bc63bbcad18155201308c8f3540b07f84f5e","0x3":"0xa51c1fc2f0d1a1b8494ed1fe312d7c3a78ed91c0"}},"0x14dc79964da2c08b23698b3d3cc7ca32193d9955":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x15d34aaf54267db7d7c367839aaf71a00a2c6a65":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x1cbd3b2770909d4e10f157cabc84c7264073c9ec":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106100575760003560e01c80635bb939951461005c5780638a1a52d2146100815780639cfced9714610094578063bea140b3146100a7578063e8295588146100ba575b600080fd5b61006f61006a366004610f4a565b6100cd565b60405190815260200160405180910390f35b61006f61008f366004610e6b565b61025d565b61006f6100a2366004610df0565b610629565b61006f6100b5366004610d6a565b6106b9565b61006f6100c8366004610f18565b6106f3565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183106101435760405162461bcd60e51b815260206004820181905260248201527f5f6c6566742073686f756c6420626520696e7369646520746865206669656c6460448201526064015b60405180910390fd5b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182106101bc5760405162461bcd60e51b815260206004820152602160248201527f5f72696768742073686f756c6420626520696e7369646520746865206669656c6044820152601960fa1b606482015260840161013a565b6101c4610d2e565b838152602081018390526040516314d2f97b60e11b8152735fc8d32690cc91d4c39d9d3abcbd16989f875707906329a5f2f690610205908490600401610f6c565b60206040518083038186803b15801561021d57600080fd5b505af4158015610231573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102559190610f31565b949350505050565b60408051600b8082526101808201909252600091829190602082016101608036833701905050905061028d610d4c565b610295610d4c565b60005b85518110156102ea578581815181106102b3576102b3611067565b60200260200101518482815181106102cd576102cd611067565b6020908102919091010152806102e281611036565b915050610298565b5084515b600b81101561032857600084828151811061030b5761030b611067565b60209081029190910101528061032081611036565b9150506102ee565b5060005b60058110156103b35783818151811061034757610347611067565b602002602001015183826005811061036157610361611067565b60200201528361037282600561101e565b8151811061038257610382611067565b602002602001015182826005811061039c5761039c611067565b6020020152806103ab81611036565b91505061032c565b506103bc610d2e565b604051630926f44b60e31b815273a513e6e4b8f2a923d98304ec87f64353c4d5c85390634937a258906103f3908690600401610fc5565b60206040518083038186803b15801561040b57600080fd5b505af415801561041f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104439190610f31565b8152604051630926f44b60e31b815273a513e6e4b8f2a923d98304ec87f64353c4d5c85390634937a2589061047c908590600401610fc5565b60206040518083038186803b15801561049457600080fd5b505af41580156104a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104cc9190610f31565b60208201526104d9610d2e565b6040516314d2f97b60e11b8152735fc8d32690cc91d4c39d9d3abcbd16989f875707906329a5f2f690610510908590600401610f6c565b60206040518083038186803b15801561052857600080fd5b505af415801561053c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105609190610f31565b815284518590600a90811061057757610577611067565b60200260200101518160016002811061059257610592611067565b60200201526040516314d2f97b60e11b8152735fc8d32690cc91d4c39d9d3abcbd16989f875707906329a5f2f6906105ce908490600401610f6c565b60206040518083038186803b1580156105e657600080fd5b505af41580156105fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061061e9190610f31565b979650505050505050565b604051630926f44b60e31b815260009073a513e6e4b8f2a923d98304ec87f64353c4d5c85390634937a25890610663908590600401610fc5565b60206040518083038186803b15801561067b57600080fd5b505af415801561068f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b39190610f31565b92915050565b6040516304b98e1d60e31b8152600090730165878a594ca255338adfa4d48449f69242eb8f906325cc70e890610663908590600401610f9d565b60008161072157507f2fe54c60d3acabf3343a35b6eba15db4821b340f76e741e2249685ed4899af6c919050565b816001141561075157507f13e37f2d6cb86c78ccc1788607c2b199788c6bb0a615a21f2e7a8e88384222f8919050565b816002141561078157507f217126fa352c326896e8c2803eec8fd63ad50cf65edfef27a41a9e32dc622765919050565b81600314156107b157507f0e28a61a9b3e91007d5a9e3ada18e1b24d6d230c618388ee5df34cacd7397eee919050565b81600414156107e157507f27953447a6979839536badc5425ed15fadb0e292e9bc36f92f0aa5cfa5013587919050565b816005141561081157507f194191edbfb91d10f6a7afd315f33095410c7801c47175c2df6dc2cce0e3affc919050565b816006141561084157507f1733dece17d71190516dbaf1927936fa643dc7079fc0cc731de9d6845a47741f919050565b816007141561087157507f267855a7dc75db39d81d17f95d0a7aa572bf5ae19f4db0e84221d2b2ef999219919050565b81600814156108a157507f1184e11836b4c36ad8238a340ecc0985eeba665327e33e9b0e3641027c27620d919050565b81600914156108d157507f0702ab83a135d7f55350ab1bfaa90babd8fc1d2b3e6a7215381a7b2213d6c5ce919050565b81600a141561090157507f2eecc0de814cfd8c57ce882babb2e30d1da56621aef7a47f3291cffeaec26ad7919050565b81600b141561093157507f280bc02145c155d5833585b6c7b08501055157dd30ce005319621dc462d33b47919050565b81600c141561096157507f045132221d1fa0a7f4aed8acd2cbec1e2189b7732ccb2ec272b9c60f0d5afc5b919050565b81600d141561099157507f27f427ccbf58a44b1270abbe4eda6ba53bd6ac4d88cf1e00a13c4371ce71d366919050565b81600e14156109c157507f1617eaae5064f26e8f8a6493ae92bfded7fde71b65df1ca6d5dcec0df70b2cef919050565b81600f14156109f157507f20c6b400d0ea1b15435703c31c31ee63ad7ba5c8da66cec2796feacea575abca919050565b8160101415610a2157507f09589ddb438723f53a8e57bdada7c5f8ed67e8fece3889a73618732965645eec919050565b8160111415610a5057507e64b6a738a5ff537db7b220f3394f0ecbd35bfd355c5425dc1166bf3236079b919050565b8160121415610a8057507f095de56281b1d5055e897c3574ff790d5ee81dbc5df784ad2d67795e557c9e9f919050565b8160131415610ab057507f11cf2e2887aa21963a6ec14289183efe4d4c60f14ecd3d6fe0beebdf855a9b63919050565b8160141415610ae057507f2b0f6fc0179fa65b6f73627c0e1e84c7374d2eaec44c9a48f2571393ea77bcbb919050565b8160151415610b1057507f16fdb637c2abf9c0f988dbf2fd64258c46fb6a273d537b2cf1603ea460b13279919050565b8160161415610b4057507f21bbd7e944f6124dad4c376df9cc12e7ca66e47dff703ff7cedb1a454edcf0ff919050565b8160171415610b7057507f2784f8220b1c963e468f590f137baaa1625b3b92a27ad9b6e84eb0d3454d9962919050565b8160181415610ba057507f16ace1a65b7534142f8cc1aad810b3d6a7a74ca905d9c275cb98ba57e509fc10919050565b8160191415610bd057507f2328068c6a8c24265124debd8fe10d3f29f0665ea725a65e3638f6192a96a013919050565b81601a1415610c0057507f2ddb991be1f028022411b4c4d2c22043e5e751c120736f00adf54acab1c9ac14919050565b81601b1415610c3057507f0113798410eaeb95056a464f70521eb58377c0155f2fe518a5594d38cc209cc0919050565b81601c1415610c6057507f202d1ae61526f0d0d01ef80fb5d4055a7af45721024c2c24cffd6a3798f54d50919050565b81601d1415610c9057507f23ab323453748129f2765f79615022f5bebd6f4096a796300aab049a60b0f187919050565b81601e1415610cc057507f1f15585f8947e378bcf8bd918716799da909acdb944c57150b1eb4565fda8aa0919050565b81601f1415610cf057507f1eb064b21055ac6a350cf41eb30e4ce2cb19680217df3a243617c2838185ad06919050565b60405162461bcd60e51b8152602060048201526013602482015272496e646578206f7574206f6620626f756e647360681b604482015260640161013a565b60405180604001604052806002906020820280368337509192915050565b6040518060a001604052806005906020820280368337509192915050565b600060608284031215610d7c57600080fd5b82601f830112610d8b57600080fd5b6040516060810181811067ffffffffffffffff82111715610dae57610dae61107d565b604052808360608101861015610dc357600080fd5b60005b6003811015610de5578135835260209283019290910190600101610dc6565b509195945050505050565b600060a08284031215610e0257600080fd5b82601f830112610e1157600080fd5b60405160a0810181811067ffffffffffffffff82111715610e3457610e3461107d565b604052808360a08101861015610e4957600080fd5b60005b6005811015610de5578135835260209283019290910190600101610e4c565b60006020808385031215610e7e57600080fd5b823567ffffffffffffffff80821115610e9657600080fd5b818501915085601f830112610eaa57600080fd5b813581811115610ebc57610ebc61107d565b8060051b9150610ecd848301610fed565b8181528481019084860184860187018a1015610ee857600080fd5b600095505b83861015610f0b578035835260019590950194918601918601610eed565b5098975050505050505050565b600060208284031215610f2a57600080fd5b5035919050565b600060208284031215610f4357600080fd5b5051919050565b60008060408385031215610f5d57600080fd5b50508035926020909101359150565b60408101818360005b6002811015610f94578151835260209283019290910190600101610f75565b50505092915050565b60608101818360005b6003811015610f94578151835260209283019290910190600101610fa6565b60a08101818360005b6005811015610f94578151835260209283019290910190600101610fce565b604051601f8201601f1916810167ffffffffffffffff811182821017156110165761101661107d565b604052919050565b6000821982111561103157611031611051565b500190565b600060001982141561104a5761104a611051565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea264697066735822122090ec5696fec6b3b8d24983e87d721b6b945b05244fcf755cc39a16a9f8b8984864736f6c63430008050033","storage":{}},"0x23618e81e3f5cdf7f54c3d65f7fbc0abf5b21e8f":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x2546bcd3c84621e976d8185a91a922ae77ecec30":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x4e59b44847b379578588920ca78fbf26c0b4956c":{"nonce":0,"balance":"0x0","code":"0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3","storage":{}},"0x5fbdb2315678afecb367f032d93f642f64180aa3":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106101f05760003560e01c80638ebfbfa91161010f578063c3677961116100a2578063e786d35d11610071578063e786d35d1461043e578063f2dd0bb714610451578063f5fc3d6b1461047a578063fecb95531461049957600080fd5b8063c3677961146103fc578063c7af33521461040f578063cc3c74a114610422578063d56b80141461042b57600080fd5b8063a20403e9116100de578063a20403e9146103b4578063a6e94c91146103c7578063bdfadc84146103da578063c2230d6e146103e357600080fd5b80638ebfbfa914610372578063957b49a1146103855780639d2b1ed7146103985780639e09583c146103ab57600080fd5b806342169e4811610187578063715018a611610156578063715018a614610320578063830b2f57146103285780638755bcad1461033b5780638b7e87821461034e57600080fd5b806342169e48146102b95780634c830cbd146102c95780636245e561146102e85780636c6f4846146102fd57600080fd5b80631ed13d1b116101c35780631ed13d1b1461028e5780632a69fb46146102a15780633408e470146102aa5780633a049e02146102b057600080fd5b8063016737bb146101f55780630b27fb9a146102255780630c340a241461023757806313cb01f914610262575b600080fd5b600354610208906001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b6009545b60405190815260200161021c565b60005461024a906001600160a01b031681565b6040516001600160a01b03909116815260200161021c565b60005461027990600160a01b900463ffffffff1681565b60405163ffffffff909116815260200161021c565b61024a61029c366004611da9565b6104fe565b61022960025481565b46610229565b61022960065481565b6005546102799063ffffffff1681565b6102d161051e565b60405165ffffffffffff909116815260200161021c565b6102fb6102f6366004611e54565b61056c565b005b61031061030b366004611ed4565b610635565b604051901515815260200161021c565b6102fb61065b565b610310610336366004611f10565b610734565b610310610349366004611da9565b610758565b610359600160f81b81565b6040516001600160f01b0319909116815260200161021c565b6102fb61038036600461202f565b610787565b6102fb610393366004612183565b6108c4565b6102fb6103a636600461224c565b610ac4565b61022960015481565b6102fb6103c23660046122d5565b610b35565b6102fb6103d5366004612311565b610c22565b61022960045481565b6102086103f1366004611f10565b65ffffffffffff1690565b6102fb61040a366004612344565b610c7c565b6000546001600160a01b03163314610310565b61022960095481565b6102fb6104393660046124a2565b610e2a565b6102fb61044c366004612572565b6111dd565b61024a61045f366004611f10565b600a602052600090815260409020546001600160a01b031681565b610310610488366004611f10565b60301c6001600160a01b0316301490565b6104f16104a73660046125c3565b60408051606080820183526000808352602083015291810191909152506040805160608101825263ffffffff9490941684526001600160a01b039290921660208401529082015290565b60405161021c9190612616565b81516020830120600090816105138285611258565b925050505b92915050565b60408051600160f81b602082018190524660e01b6001600160e01b031981166022840152835180840360060181526026909301909352600092916105618161267e565b60d01c935050505090565b8363ffffffff16806009541061059d5760405162461bcd60e51b8152600401610594906126b5565b60405180910390fd5b6009546105ab90600161270e565b8111156105ca5760405162461bcd60e51b815260040161059490612721565b60098190556040516105e8908890889088908890889060200161277e565b604051602081830303815290604052826106028282610758565b61061e5760405162461bcd60e51b8152600401610594906127c5565b61062a8989888861127c565b505050505050505050565b6000806106428484611258565b6000546001600160a01b03908116911614949350505050565b6000546001600160a01b031633146106855760405162461bcd60e51b815260040161059490612811565b600060028190556003805467ffffffffffffffff19166780000000000000001790556005805463ffffffff19169055546106cd90600160a01b900463ffffffff166001612857565b600080546001600160c01b031916600160a01b63ffffffff93909316929092026001600160a01b03191691909117815560405142815281907f951a28352d037e924fc829da70e177ee80caa85b070e7a5b98b81fa223edca949060200160405180910390a3565b600065ffffffffffff82168061074861051e565b65ffffffffffff16149392505050565b815160208301206000908161076d8285611258565b6000546001600160a01b0390811691161495945050505050565b610791828461287b565b8180518251146107fc5760405162461bcd60e51b815260206004820152603060248201527f5369676e61747572654272696467653a204461746120616e6420736967206c6560448201526f0dccee8d0e640daeae6e840dac2e8c6d60831b6064820152608401610594565b60005b82518110156108725761084483828151811061081d5761081d612888565b602002602001015183838151811061083757610837612888565b6020026020010151610758565b6108605760405162461bcd60e51b8152600401610594906127c5565b8061086a8161289e565b9150506107ff565b5060005b848110156108bc576108aa86868381811061089357610893612888565b90506020028101906108a591906128b7565b611587565b806108b48161289e565b915050610876565b505050505050565b6003546004546103e8916108e3916001600160401b03909116906128fd565b6108ed919061292a565b6001546108fa919061270e565b4210156109195760405162461bcd60e51b81526004016105949061293e565b80518251146109855760405162461bcd60e51b815260206004820152603260248201527f476f7665726e61626c653a20496e76616c6964206e756d626572206f6620766f60448201527174657320616e64207369676e61747572657360701b6064820152608401610594565b60005b8251811015610abf5760006001600160a01b03168382815181106109ae576109ae612888565b6020026020010151602001516001600160a01b0316036109e05760405162461bcd60e51b81526004016105949061297f565b6000610a3d8483815181106109f7576109f7612888565b6020026020010151604051602001610a0f9190612616565b604051602081830303815290604052848481518110610a3057610a30612888565b60200260200101516104fe565b9050610a84848381518110610a5457610a54612888565b60200260200101516040015182868581518110610a7357610a73612888565b6020026020010151600001516116d9565b15610aac57610aac848381518110610a9e57610a9e612888565b602002602001015182611814565b5080610ab78161289e565b915050610988565b505050565b82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250849250610b08915083905082610758565b610b245760405162461bcd60e51b8152600401610594906127c5565b610b2e8585611587565b5050505050565b6003546004546103e891610b54916001600160401b03909116906128fd565b610b5e919061292a565b600154610b6b919061270e565b421015610b8a5760405162461bcd60e51b81526004016105949061293e565b60208101516001600160a01b0316610bb45760405162461bcd60e51b81526004016105949061297f565b604081015181513391610bc89183906116d9565b610c145760405162461bcd60e51b815260206004820181905260248201527f476f7665726e61626c653a20496e76616c6964206d65726b6c652070726f6f666044820152606401610594565b610c1e8282611814565b5050565b6000546001600160a01b03163314610c4c5760405162461bcd60e51b815260040161059490612811565b610c5582611951565b6000805463ffffffff909216600160a01b0263ffffffff60a01b1990921691909117905550565b60005463ffffffff808516600160a01b9092041610610cdd5760405162461bcd60e51b815260206004820152601960248201527f476f7665726e61626c653a20496e76616c6964206e6f6e6365000000000000006044820152606401610594565b600054610cf890600160a01b900463ffffffff166001612857565b63ffffffff168363ffffffff161115610d615760405162461bcd60e51b815260206004820152602560248201527f476f7665726e61626c653a204e6f6e6365206d75737420696e6372656d656e74604482015264206279203160d81b6064820152608401610594565b815160208084019190912060405190918291610da091610d8b918b918b918b918b918b9101612a00565b60405160208183030381529060405284610758565b610dbc5760405162461bcd60e51b815260040161059490612811565b60028890556003805467ffffffffffffffff19166001600160401b0389161790556005805463ffffffff191663ffffffff888116919091179091556000805463ffffffff60a01b1916600160a01b92881692909202919091179055610e2081611951565b5050505050505050565b8460005b8151811015610efc57818181518110610e4957610e49612888565b602002602001015163ffffffff1660095410610e775760405162461bcd60e51b8152600401610594906126b5565b600954610e8590600161270e565b828281518110610e9757610e97612888565b602002602001015163ffffffff161115610ec35760405162461bcd60e51b815260040161059490612721565b818181518110610ed557610ed5612888565b602002602001015163ffffffff166009819055508080610ef49061289e565b915050610e2e565b508282610f098282610635565b610f255760405162461bcd60e51b8152600401610594906127c5565b86518851148015610f37575085518751145b610fbf5760405162461bcd60e51b815260206004820152604d60248201527f5369676e61747572654272696467653a3a626174636841646d696e536574526560448201527f736f75726365576974685369676e61747572653a204172726179206c656e677460648201526c0d0e640daeae6e840dac2e8c6d609b1b608482015260a401610594565b600088516001600160401b03811115610fda57610fda611cf4565b60405190808252806020026020018201604052801561100d57816020015b6060815260200190600190039081610ff85790505b50905060005b89518110156110bf578b8b8b838151811061103057611030612888565b60200260200101518b848151811061104a5761104a612888565b60200260200101518b858151811061106457611064612888565b602002602001015160405160200161108095949392919061277e565b6040516020818303038152906040528282815181106110a1576110a1612888565b602002602001018190525080806110b79061289e565b915050611013565b5085816040516020016110d29190612a5d565b60405160208183030381529060405280519060200120146111735760405162461bcd60e51b815260206004820152604f60248201527f5369676e61747572654272696467653a3a626174636841646d696e536574526560448201527f736f75726365576974685369676e61747572653a20486173686564206461746160648201526e040c8decae640dcdee840dac2e8c6d608b1b608482015260a401610594565b60005b89518110156111cf576111bd8c8c8b848151811061119657611196612888565b60200260200101518b85815181106111b0576111b0612888565b602002602001015161127c565b806111c78161289e565b915050611176565b505050505050505050505050565b82826040516020016111f0929190612b00565b6040516020818303038152906040528161120a8282610758565b6112265760405162461bcd60e51b8152600401610594906127c5565b60005b848110156108bc5761124686868381811061089357610893612888565b806112508161289e565b915050611229565b60008060006112678585611a4a565b9150915061127481611a8f565b509392505050565b60405163830b2f5760e01b815260048101859052309063830b2f5790602401602060405180830381865afa1580156112b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112dc9190612b9b565b6112f85760405162461bcd60e51b815260040161059490612bbd565b60405163830b2f5760e01b815260048101839052309063830b2f5790602401602060405180830381865afa158015611334573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113589190612b9b565b6113745760405162461bcd60e51b815260040161059490612bbd565b60405163f5fc3d6b60e01b815260048101859052309063f5fc3d6b90602401602060405180830381865afa1580156113b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d49190612b9b565b6114585760405162461bcd60e51b815260206004820152604960248201527f5369676e61747572654272696467653a3a61646d696e5365745265736f75726360448201527f65576974685369676e61747572653a20496e76616c696420657865637574696f6064820152681b8818dbdb9d195e1d60ba1b608482015260a401610594565b6001600160e01b03198316636245e56160e01b146114f15760405162461bcd60e51b815260206004820152604a60248201527f5369676e61747572654272696467653a3a61646d696e5365745265736f75726360448201527f65576974685369676e61747572653a20496e76616c69642066756e6374696f6e606482015269207369676e617475726560b01b608482015260a401610594565b6000828152600a60205260409081902080546001600160a01b0319166001600160a01b038481169182179092559151635c7d1b9b60e11b815260048101859052603085901c909116602482018190528392909163b8fa373690604401600060405180830381600087803b15801561156757600080fd5b505af115801561157b573d6000803e3d6000fd5b50505050505050505050565b60006115966020828486612c2b565b61159f91612c55565b60405163830b2f5760e01b815260048101829052909150309063830b2f5790602401602060405180830381865afa1580156115de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116029190612b9b565b6116665760405162461bcd60e51b815260206004820152602f60248201527f5369676e61747572654272696467653a20426174636820457865637574696e6760448201526e1037b7103bb937b7339031b430b4b760891b6064820152608401610594565b6000818152600a60205260409081902054905163712467f960e11b81526001600160a01b03909116908190819063e248cff2906116ab90869089908990600401612c73565b600060405180830381600087803b1580156116c557600080fd5b505af115801561062a573d6000803e3d6000fd5b6040516bffffffffffffffffffffffff19606084901b166020820152600090819060340160408051601f1981840301815291905280516020909101209050808360005b87518160ff16101561180557611733600283612c96565b63ffffffff166000036117955782888260ff168151811061175657611756612888565b6020026020010151604051602001611778929190918252602082015260400190565b6040516020818303038152906040528051906020012092506117e6565b878160ff16815181106117aa576117aa612888565b6020026020010151836040516020016117cd929190918252602082015260400190565b6040516020818303038152906040528051906020012092505b6117f1600283612cb9565b9150806117fd81612cdc565b91505061171c565b50506002541495945050505050565b60065460009081526007602090815260408083206001600160a01b03858116855292529091205416156118b55760065460008181526007602090815260408083206001600160a01b0380871685529083528184205494845260088352818420941680845293909152812080546001929061189590849063ffffffff16612cfb565b92506101000a81548163ffffffff021916908363ffffffff160217905550505b602082810180516006805460009081526007855260408082206001600160a01b03888116845290875281832080546001600160a01b0319169582169590951790945591548152600885528181209351909216825291909252812080546001929061192690849063ffffffff16612857565b92506101000a81548163ffffffff021916908363ffffffff160217905550610c1e8260200151611bdc565b6001600160a01b0381166119bc5760405162461bcd60e51b815260206004820152602c60248201527f476f7665726e61626c653a204e657720676f7665726e6f72206973207468652060448201526b7a65726f206164647265737360a01b6064820152608401610594565b600080546001600160a01b038381166001600160a01b03198316178355426001556006805491909216929091906119f28361289e565b9190505550816001600160a01b0316816001600160a01b03167f951a28352d037e924fc829da70e177ee80caa85b070e7a5b98b81fa223edca94600154604051611a3e91815260200190565b60405180910390a35050565b6000808251604103611a805760208301516040840151606085015160001a611a7487828585611c30565b94509450505050611a88565b506000905060025b9250929050565b6000816004811115611aa357611aa3612d18565b03611aab5750565b6001816004811115611abf57611abf612d18565b03611b0c5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610594565b6002816004811115611b2057611b20612d18565b03611b6d5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610594565b6003816004811115611b8157611b81612d18565b03611bd95760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610594565b50565b600554611bf19060029063ffffffff16612cb9565b60065460009081526008602090815260408083206001600160a01b038616845290915290205463ffffffff91821691161115611bd957611bd981611951565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611c675750600090506003611ceb565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611cbb573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611ce457600060019250925050611ceb565b9150600090505b94509492505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611d3257611d32611cf4565b604052919050565b600082601f830112611d4b57600080fd5b81356001600160401b03811115611d6457611d64611cf4565b611d77601f8201601f1916602001611d0a565b818152846020838601011115611d8c57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215611dbc57600080fd5b82356001600160401b0380821115611dd357600080fd5b611ddf86838701611d3a565b93506020850135915080821115611df557600080fd5b50611e0285828601611d3a565b9150509250929050565b80356001600160e01b031981168114611e2457600080fd5b919050565b803563ffffffff81168114611e2457600080fd5b80356001600160a01b0381168114611e2457600080fd5b60008060008060008060c08789031215611e6d57600080fd5b86359550611e7d60208801611e0c565b9450611e8b60408801611e29565b935060608701359250611ea060808801611e3d565b915060a08701356001600160401b03811115611ebb57600080fd5b611ec789828a01611d3a565b9150509295509295509295565b60008060408385031215611ee757600080fd5b8235915060208301356001600160401b03811115611f0457600080fd5b611e0285828601611d3a565b600060208284031215611f2257600080fd5b5035919050565b60008083601f840112611f3b57600080fd5b5081356001600160401b03811115611f5257600080fd5b6020830191508360208260051b8501011115611a8857600080fd5b60006001600160401b03821115611f8657611f86611cf4565b5060051b60200190565b6000611fa3611f9e84611f6d565b611d0a565b8381529050602080820190600585901b840186811115611fc257600080fd5b845b81811015611ffd5780356001600160401b03811115611fe35760008081fd5b611fef89828901611d3a565b855250928201928201611fc4565b505050509392505050565b600082601f83011261201957600080fd5b61202883833560208501611f90565b9392505050565b60008060006040848603121561204457600080fd5b83356001600160401b038082111561205b57600080fd5b61206787838801611f29565b9095509350602086013591508082111561208057600080fd5b5061208d86828701612008565b9150509250925092565b600082601f8301126120a857600080fd5b813560206120b8611f9e83611f6d565b82815260059290921b840181019181810190868411156120d757600080fd5b8286015b848110156120f257803583529183019183016120db565b509695505050505050565b60006060828403121561210f57600080fd5b604051606081016001600160401b03828210818311171561213257612132611cf4565b8160405282935061214285611e29565b835261215060208601611e3d565b6020840152604085013591508082111561216957600080fd5b5061217685828601612097565b6040830152505092915050565b6000806040838503121561219657600080fd5b82356001600160401b03808211156121ad57600080fd5b818501915085601f8301126121c157600080fd5b813560206121d1611f9e83611f6d565b82815260059290921b840181019181810190898411156121f057600080fd5b8286015b848110156122285780358681111561220c5760008081fd5b61221a8c86838b01016120fd565b8452509183019183016121f4565b509650508601359250508082111561223f57600080fd5b50611e0285828601612008565b60008060006040848603121561226157600080fd5b83356001600160401b038082111561227857600080fd5b818601915086601f83011261228c57600080fd5b81358181111561229b57600080fd5b8760208285010111156122ad57600080fd5b6020928301955093509085013590808211156122c857600080fd5b5061208d86828701611d3a565b6000602082840312156122e757600080fd5b81356001600160401b038111156122fd57600080fd5b612309848285016120fd565b949350505050565b6000806040838503121561232457600080fd5b61232d83611e3d565b915061233b60208401611e29565b90509250929050565b60008060008060008060c0878903121561235d57600080fd5b8635955060208701356001600160401b03808216821461237c57600080fd5b81965061238b60408a01611e29565b955061239960608a01611e29565b945060808901359150808211156123af57600080fd5b6123bb8a838b01611d3a565b935060a08901359150808211156123d157600080fd5b50611ec789828a01611d3a565b600082601f8301126123ef57600080fd5b813560206123ff611f9e83611f6d565b82815260059290921b8401810191818101908684111561241e57600080fd5b8286015b848110156120f25761243381611e29565b8352918301918301612422565b600082601f83011261245157600080fd5b81356020612461611f9e83611f6d565b82815260059290921b8401810191818101908684111561248057600080fd5b8286015b848110156120f25761249581611e3d565b8352918301918301612484565b600080600080600080600060e0888a0312156124bd57600080fd5b873596506124cd60208901611e0c565b955060408801356001600160401b03808211156124e957600080fd5b6124f58b838c016123de565b965060608a013591508082111561250b57600080fd5b6125178b838c01612097565b955060808a013591508082111561252d57600080fd5b6125398b838c01612440565b945060a08a0135935060c08a013591508082111561255657600080fd5b506125638a828b01611d3a565b91505092959891949750929550565b60008060006040848603121561258757600080fd5b83356001600160401b038082111561259e57600080fd5b6125aa87838801611f29565b909550935060208601359150808211156122c857600080fd5b6000806000606084860312156125d857600080fd5b6125e184611e29565b92506125ef60208501611e3d565b915060408401356001600160401b0381111561260a57600080fd5b61208d86828701612097565b6020808252825163ffffffff1682820152828101516001600160a01b031660408084019190915283015160608084015280516080840181905260009291820190839060a08601905b808310156120f2578351825292840192600192909201919084019061265e565b805160208201516001600160d01b031980821692919060068310156126ad5780818460060360031b1b83161693505b505050919050565b60208082526023908201527f50726f706f73616c4e6f6e6365547261636b65723a20496e76616c6964206e6f6040820152626e636560e81b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b80820180821115610518576105186126f8565b6020808252603a908201527f50726f706f73616c4e6f6e6365547261636b65723a204e6f6e6365206d75737460408201527f206e6f7420696e6372656d656e74206d6f7265207468616e2031000000000000606082015260800190565b9485526001600160e01b0319938416602086015260e09290921b9092166024840152602883019190915260601b6bffffffffffffffffffffffff19166048820152605c0190565b6020808252602c908201527f5369676e61747572654272696467653a204e6f742076616c696420736967206660408201526b3937b69033b7bb32b93737b960a11b606082015260800190565b60208082526026908201527f476f7665726e61626c653a2063616c6c6572206973206e6f742074686520676f6040820152653b32b93737b960d11b606082015260800190565b63ffffffff818116838216019080821115612874576128746126f8565b5092915050565b6000612028368484611f90565b634e487b7160e01b600052603260045260246000fd5b6000600182016128b0576128b06126f8565b5060010190565b6000808335601e198436030181126128ce57600080fd5b8301803591506001600160401b038211156128e857600080fd5b602001915036819003821315611a8857600080fd5b8082028115828204841417610518576105186126f8565b634e487b7160e01b600052601260045260246000fd5b60008261293957612939612914565b500490565b60208082526021908201527f476f7665726e61626c653a20496e76616c69642074696d6520666f7220766f746040820152606560f81b606082015260800190565b60208082526038908201527f476f7665726e61626c653a2050726f706f73656420676f7665726e6f7220636160408201527f6e6e6f7420626520746865207a65726f20616464726573730000000000000000606082015260800190565b60005b838110156129f75781810151838201526020016129df565b50506000910152565b8581526001600160401b0360c01b8560c01b166020820152600063ffffffff60e01b808660e01b166028840152808560e01b16602c840152508251612a4c8160308501602087016129dc565b919091016030019695505050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015612aca57878503603f1901845281518051808752612aab818989018a85016129dc565b601f01601f191695909501860194509285019290850190600101612a84565b5092979650505050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60208082528181018390526000906040600585901b8401810190840186845b87811015612b8e57868403603f190183528135368a9003601e19018112612b4557600080fd5b890185810190356001600160401b03811115612b6057600080fd5b803603821315612b6f57600080fd5b612b7a868284612ad7565b955050509184019190840190600101612b1f565b5091979650505050505050565b600060208284031215612bad57600080fd5b8151801515811461202857600080fd5b60208082526048908201527f5369676e61747572654272696467653a3a61646d696e5365745265736f75726360408201527f65576974685369676e61747572653a20457865637574696e67206f6e2077726f60608201526737339031b430b4b760c11b608082015260a00190565b60008085851115612c3b57600080fd5b83861115612c4857600080fd5b5050820193919092039150565b8035602083101561051857600019602084900360031b1b1692915050565b838152604060208201526000612c8d604083018486612ad7565b95945050505050565b600063ffffffff80841680612cad57612cad612914565b92169190910692915050565b600063ffffffff80841680612cd057612cd0612914565b92169190910492915050565b600060ff821660ff8103612cf257612cf26126f8565b60010192915050565b63ffffffff828116828216039080821115612874576128746126f8565b634e487b7160e01b600052602160045260246000fdfea2646970667358221220d581f1e6328b2b1a849bb326cdf76cb968550f18b82d61f3f2d92f21058999ca64736f6c63430008120033","storage":{"0x0":"0x1f39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x1":"0x65c99bd9","0x3":"0xffffffffffffffff","0x4":"0x2","0x6":"0x0","0x9":"0x3","0xb54e3aec63f1d9bb139bba70b255a49c4e1eb36246b3b50183501d1b2cc153e6":"0xe7f1725e7734ce288f8367e1bb143e90bb3f0512","0xbe95cdebc20cbce557eed661f96543e06ceec35137694a2d1975e9b20b1f99e1":"0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0","0xc19f93aaee3d8daa060c4cf527e22e3c6cd19b2687a3fc2790b6fffb7893a85d":"0x9a676e781a523b5d0c0e43731313a708cb607508"}},"0x5fc8d32690cc91d4c39d9d3abcbd16989f875707":{"nonce":1,"balance":"0x0","code":"0x7c010000000000000000000000000000000000000000000000000000000060003504806329a5f2f6149063299e566014176200003757fe5b7f109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b6020527f16ed41e13bb9c0c66ae119424fddbcbc9314dc9fdbdeea55d6c64543dc4903e06040527f2b90bba00fca0589f617e7dcbfe82e0df706ab640ceb247b791a93b74e36736d6060527f2969f27eed31a480b9c36c764379dbca2cc8fdd1415c3dded62940bcde0bd7716080527f2e2419f9ec02ec394c9871c832963dc1b89d743c8c7b964029b2311687b1fe2360a0527f101071f0032379b697315876690f053d148d4e109f5fb065c8aacc55a0f89bfa60c0527f143021ec686a3f330d5f9e654638065ce6cd79e28c5b3753326244ee65a1b1a760e0527f176cc029695ad02582a70eff08a6fd99d057e12e58e7d7b6b16cdfabc8ee2911610100527f19a3fc0a56702bf417ba7fee3802593fa644470307043f7773279cd71d25d5e0610120527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016024356004356000837f0ee9a592ba9a9518d05986d656f40c2114c4993c11bb29938d21d47304cd8e6e82089050837f00f1445235f2148c5986587169fc1bcd887b08d4d00868df5696fff40956e86483089150837f08dff3487e8ac99e1f29a058d0fa80b930c728730b7ab36ce879f3890ecf73f58408925083818180828009800909905083828180828009800909915083838180828009800909925062000249600052620025ba565b837f2f27be690fdaee46c3ce28f7532b13c856c35342c84bda6e20966310fadc01d082089050837f2b2ae1acf68b7b8d2416bebf3d4f6234b763fe04b8043ee48b8327bebca16cf283089150837f0319d062072bef7ecca5eac06f97d4d55952c175ab6b03eae64b44c7dbf11cfa84089250838181808280098009099050838281808280098009099150838381808280098009099250620002ec600052620025ba565b837f28813dcaebaeaa828a376df87af4a63bc8b7bf27ad49c6298ef7b387bf28526d82089050837f2727673b2ccbc903f181bf38e1c1d40d2033865200c352bc150928adddf9cb7883089150837f234ec45ca27727c2e74abd2b2a1494cd6efbd43e340587d6b8fb9e31e65cc632840892508381818082800980090990508382818082800980090991508383818082800980090992506200038f600052620025ba565b837f15b52534031ae18f7f862cb2cf7cf760ab10a8150a337b1ccd99ff6e8797d42882089050837f0dc8fad6d9e4b35f5ed9a3d186b79ce38e0e8a8d1b58b132d701d4eecf68d1f683089150837f1bcd95ffc211fbca600f705fad3fb567ea4eb378f62e1fec97805518a47e4d9c8408925083818180828009800909905083828180828009800909915083838180828009800909925062000432600052620025ba565b837f10520b0ab721cadfe9eff81b016fc34dc76da36c2578937817cb978d069de55982089050837f1f6d48149b8e7f7d9b257d8ed5fbbaf42932498075fed0ace88a9eb81f5627f683089150837f1d9655f652309014d29e00ef35a2089bfff8dc1c816f0dc9ca34bdb5460c870584089250838181808280098009099050620004bd600052620025ba565b837f04df5a56ff95bcafb051f7b1cd43a99ba731ff67e47032058fe3d4185697cc7d82089050837f0672d995f8fff640151b3d290cedaf148690a10a8c8424a7f6ec282b6e4be82883089150837f099952b414884454b21200d7ffafdd5f0c9a9dcc06f2708e9fc1d8209b5c75b98408925083818180828009800909905062000548600052620025ba565b837f052cba2255dfd00c7c483143ba8d469448e43586a9b4cd9183fd0e843a6b9fa682089050837f0b8badee690adb8eb0bd74712b7999af82de55707251ad7716077cb93c464ddc83089150837f119b1590f13307af5a1ee651020c07c749c15d60683a8050b963d0a8e4b2bdd184089250838181808280098009099050620005d3600052620025ba565b837f03150b7cd6d5d17b2529d36be0f67b832c4acfc884ef4ee5ce15be0bfb4a8d0982089050837f2cc6182c5e14546e3cf1951f173912355374efb83d80898abe69cb317c9ea56583089150837f005032551e6378c450cfe129a404b3764218cadedac14e2b92d2cd73111bf0f9840892508381818082800980090990506200065e600052620025ba565b837f233237e3289baa34bb147e972ebcb9516469c399fcc069fb88f9da2cc28276b582089050837f05c8f4f4ebd4a6e3c980d31674bfbe6323037f21b34ae5a4e80c2d4c24d6028083089150837f0a7b1db13042d396ba05d818a319f25252bcf35ef3aeed91ee1f09b2590fc65b84089250838181808280098009099050620006e9600052620025ba565b837f2a73b71f9b210cf5b14296572c9d32dbf156e2b086ff47dc5df542365a404ec082089050837f1ac9b0417abcc9a1935107e9ffc91dc3ec18f2c4dbe7f22976a760bb5c50c46083089150837f12c0339ae08374823fabb076707ef479269f3e4d6cb104349015ee046dc93fc08408925083818180828009800909905062000774600052620025ba565b837f0b7475b102a165ad7f5b18db4e1e704f52900aa3253baac68246682e56e9a28e82089050837f037c2849e191ca3edb1c5e49f6e8b8917c843e379366f2ea32ab3aa88d7f844883089150837f05a6811f8556f014e92674661e217e9bd5206c5c93a07dc145fdb176a716346f84089250838181808280098009099050620007ff600052620025ba565b837f29a795e7d98028946e947b75d54e9f044076e87a7b2883b47b675ef5f38bd66e82089050837f20439a0c84b322eb45a3857afc18f5826e8c7382c8a1585c507be199981fd22f83089150837f2e0ba8d94d9ecf4a94ec2050c7371ff1bb50f27799a84b6d4a2a6f2a0982c887840892508381818082800980090990506200088a600052620025ba565b837f143fd115ce08fb27ca38eb7cce822b4517822cd2109048d2e6d0ddcca17d71c882089050837f0c64cbecb1c734b857968dbbdcf813cdf8611659323dbcbfc84323623be9caf183089150837f028a305847c683f646fca925c163ff5ae74f348d62c2b670f1426cef9403da538408925083818180828009800909905062000915600052620025ba565b837f2e4ef510ff0b6fda5fa940ab4c4380f26a6bcb64d89427b824d6755b5db9e30c82089050837f0081c95bc43384e663d79270c956ce3b8925b4f6d033b078b96384f50579400e83089150837f2ed5f0c91cbd9749187e2fade687e05ee2491b349c039a0bba8a9f4023a0bb3884089250838181808280098009099050620009a0600052620025ba565b837f30509991f88da3504bbf374ed5aae2f03448a22c76234c8c990f01f33a73520682089050837f1c3f20fd55409a53221b7c4d49a356b9f0a1119fb2067b41a7529094424ec6ad83089150837f10b4e7f3ab5df003049514459b6e18eec46bb2213e8e131e170887b47ddcb96c8408925083818180828009800909905062000a2b600052620025ba565b837f2a1982979c3ff7f43ddd543d891c2abddd80f804c077d775039aa3502e43adef82089050837f1c74ee64f15e1db6feddbead56d6d55dba431ebc396c9af95cad0f1315bd5c9183089150837f07533ec850ba7f98eab9303cace01b4b9e4f2e8b82708cfa9c2fe45a0ae146a08408925083818180828009800909905062000ab6600052620025ba565b837f21576b438e500449a151e4eeaf17b154285c68f42d42c1808a11abf3764c075082089050837f2f17c0559b8fe79608ad5ca193d62f10bce8384c815f0906743d6930836d4a9e83089150837f2d477e3862d07708a79e8aae946170bc9775a4201318474ae665b0b1b7e2730e8408925083818180828009800909905062000b41600052620025ba565b837f162f5243967064c390e095577984f291afba2266c38f5abcd89be0f5b2747eab82089050837f2b4cb233ede9ba48264ecd2c8ae50d1ad7a8596a87f29f8a7777a7009239331183089150837f2c8fbcb2dd8573dc1dbaf8f4622854776db2eece6d85c4cf4254e7c35e03b07a8408925083818180828009800909905062000bcc600052620025ba565b837f1d6f347725e4816af2ff453f0cd56b199e1b61e9f601e9ade5e88db870949da982089050837f204b0c397f4ebe71ebc2d8b3df5b913df9e6ac02b68d31324cd49af5c456552983089150837f0c4cb9dc3c4fd8174f1149b3c63c3c2f9ecb827cd7dc25534ff8fb75bc79c5028408925083818180828009800909905062000c57600052620025ba565b837f174ad61a1448c899a25416474f4930301e5c49475279e0639a616ddc45bc7b5482089050837f1a96177bcf4d8d89f759df4ec2f3cde2eaaa28c177cc0fa13a9816d49a38d2ef83089150837f066d04b24331d71cd0ef8054bc60c4ff05202c126a233c1a8242ace360b8a30a8408925083818180828009800909905062000ce2600052620025ba565b837f2a4c4fc6ec0b0cf52195782871c6dd3b381cc65f72e02ad527037a62aa1bd80482089050837f13ab2d136ccf37d447e9f2e14a7cedc95e727f8446f6d9d7e55afc01219fd64983089150837f1121552fca26061619d24d843dc82769c1b04fcec26f55194c2e3e869acc6a9a8408925083818180828009800909905062000d6d600052620025ba565b837f00ef653322b13d6c889bc81715c37d77a6cd267d595c4a8909a5546c7c97cff182089050837f0e25483e45a665208b261d8ba74051e6400c776d652595d9845aca35d8a397d383089150837f29f536dcb9dd7682245264659e15d88e395ac3d4dde92d8c46448db979eeba898408925083818180828009800909905062000df8600052620025ba565b837f2a56ef9f2c53febadfda33575dbdbd885a124e2780bbea170e456baace0fa5be82089050837f1c8361c78eb5cf5decfb7a2d17b5c409f2ae2999a46762e8ee416240a8cb9af183089150837f151aff5f38b20a0fc0473089aaf0206b83e8e68a764507bfd3d0ab4be74319c58408925083818180828009800909905062000e83600052620025ba565b837f04c6187e41ed881dc1b239c88f7f9d43a9f52fc8c8b6cdd1e76e47615b51f10082089050837f13b37bd80f4d27fb10d84331f6fb6d534b81c61ed15776449e801b7ddc9c296783089150837f01a5c536273c2d9df578bfbd32c17b7a2ce3664c2a52032c9321ceb1c4e8a8e48408925083818180828009800909905062000f0e600052620025ba565b837f2ab3561834ca73835ad05f5d7acb950b4a9a2c666b9726da832239065b7c3b0282089050837f1d4d8ec291e720db200fe6d686c0d613acaf6af4e95d3bf69f7ed516a597b64683089150837f041294d2cc484d228f5784fe7919fd2bb925351240a04b711514c9c80b65af1d8408925083818180828009800909905062000f99600052620025ba565b837f154ac98e01708c611c4fa715991f004898f57939d126e392042971dd90e81fc682089050837f0b339d8acca7d4f83eedd84093aef51050b3684c88f8b0b04524563bc6ea4da483089150837f0955e49e6610c94254a4f84cfbab344598f0e71eaff4a7dd81ed95b50839c82e8408925083818180828009800909905062001024600052620025ba565b837f06746a6156eba54426b9e22206f15abca9a6f41e6f535c6f3525401ea065462682089050837f0f18f5a0ecd1423c496f3820c549c27838e5790e2bd0a196ac917c7ff32077fb83089150837f04f6eeca1751f7308ac59eff5beb261e4bb563583ede7bc92a738223d6f76e1384089250838181808280098009099050620010af600052620025ba565b837f2b56973364c4c4f5c1a3ec4da3cdce038811eb116fb3e45bc1768d26fc0b375882089050837f123769dd49d5b054dcd76b89804b1bcb8e1392b385716a5d83feb65d437f29ef83089150837f2147b424fc48c80a88ee52b91169aacea989f6446471150994257b2fb01c63e9840892508381818082800980090990506200113a600052620025ba565b837f0fdc1f58548b85701a6c5505ea332a29647e6f34ad4243c2ea54ad897cebe54d82089050837f12373a8251fea004df68abcf0f7786d4bceff28c5dbbe0c3944f685cc0a0b1f283089150837f21e4f4ea5f35f85bad7ea52ff742c9e8a642756b6af44203dd8a1f35c1a9003584089250838181808280098009099050620011c5600052620025ba565b837f16243916d69d2ca3dfb4722224d4c462b57366492f45e90d8a81934f1bc3b14782089050837f1efbe46dd7a578b4f66f9adbc88b4378abc21566e1a0453ca13a4159cac04ac283089150837f07ea5e8537cf5dd08886020e23a7f387d468d5525be66f853b672cc96a88969a8408925083818180828009800909905062001250600052620025ba565b837f05a8c4f9968b8aa3b7b478a30f9a5b63650f19a75e7ce11ca9fe16c0b76c00bc82089050837f20f057712cc21654fbfe59bd345e8dac3f7818c701b9c7882d9d57b72a32e83f83089150837f04a12ededa9dfd689672f8c67fee31636dcd8e88d01d49019bd90b33eb33db6984089250838181808280098009099050620012db600052620025ba565b837f27e88d8c15f37dcee44f1e5425a51decbd136ce5091a6767e49ec9544ccd101a82089050837f2feed17b84285ed9b8a5c8c5e95a41f66e096619a7703223176c41ee433de4d183089150837f1ed7cc76edf45c7c404241420f729cf394e5942911312a0d6972b8bd53aff2b88408925083818180828009800909905062001366600052620025ba565b837f15742e99b9bfa323157ff8c586f5660eac6783476144cdcadf2874be45466b1a82089050837f1aac285387f65e82c895fc6887ddf40577107454c6ec0317284f033f27d0c78583089150837f25851c3c845d4790f9ddadbdb6057357832e2e7a49775f71ec75a96554d67c7784089250838181808280098009099050620013f1600052620025ba565b837f15a5821565cc2ec2ce78457db197edf353b7ebba2c5523370ddccc3d9f146a6782089050837f2411d57a4813b9980efa7e31a1db5966dcf64f36044277502f15485f28c7172783089150837f002e6f8d6520cd4713e335b8c0b6d2e647e9a98e12f4cd2558828b5ef6cb4c9b840892508381818082800980090990506200147c600052620025ba565b837f2ff7bc8f4380cde997da00b616b0fcd1af8f0e91e2fe1ed7398834609e0315d282089050837f00b9831b948525595ee02724471bcd182e9521f6b7bb68f1e93be4febb0d3cbe83089150837f0a2f53768b8ebf6a86913b0e57c04e011ca408648a4743a87d77adbf0c9c35128408925083818180828009800909905062001507600052620025ba565b837f00248156142fd0373a479f91ff239e960f599ff7e94be69b7f2a290305e1198d82089050837f171d5620b87bfb1328cf8c02ab3f0c9a397196aa6a542c2350eb512a2b2bcda983089150837f170a4f55536f7dc970087c7c10d6fad760c952172dd54dd99d1045e4ec34a8088408925083818180828009800909905062001592600052620025ba565b837f29aba33f799fe66c2ef3134aea04336ecc37e38c1cd211ba482eca17e2dbfae182089050837f1e9bc179a4fdd758fdd1bb1945088d47e70d114a03f6a0e8b5ba650369e6497383089150837f1dd269799b660fad58f7f4892dfb0b5afeaad869a9c4b44f9c9e1c43bdaf8f09840892508381818082800980090990506200161d600052620025ba565b837f22cdbc8b70117ad1401181d02e15459e7ccd426fe869c7c95d1dd2cb0f24af3882089050837f0ef042e454771c533a9f57a55c503fcefd3150f52ed94a7cd5ba93b9c7dacefd83089150837f11609e06ad6c8fe2f287f3036037e8851318e8b08a0359a03b304ffca62e828484089250838181808280098009099050620016a8600052620025ba565b837f1166d9e554616dba9e753eea427c17b7fecd58c076dfe42708b08f5b783aa9af82089050837f2de52989431a859593413026354413db177fbf4cd2ac0b56f855a888357ee46683089150837f3006eb4ffc7a85819a6da492f3a8ac1df51aee5b17b8e89d74bf01cf5f71e9ad8408925083818180828009800909905062001733600052620025ba565b837f2af41fbb61ba8a80fdcf6fff9e3f6f422993fe8f0a4639f962344c822514508682089050837f119e684de476155fe5a6b41a8ebc85db8718ab27889e85e781b214bace4827c383089150837f1835b786e2e8925e188bea59ae363537b51248c23828f047cff784b97b3fd80084089250838181808280098009099050620017be600052620025ba565b837f28201a34c594dfa34d794996c6433a20d152bac2a7905c926c40e285ab32eeb682089050837f083efd7a27d1751094e80fefaf78b000864c82eb571187724a761f88c22cc4e783089150837f0b6f88a3577199526158e61ceea27be811c16df7774dd8519e079564f61fd13b8408925083818180828009800909905062001849600052620025ba565b837f0ec868e6d15e51d9644f66e1d6471a94589511ca00d29e1014390e6ee4254f5b82089050837f2af33e3f866771271ac0c9b3ed2e1142ecd3e74b939cd40d00d937ab84c9859183089150837f0b520211f904b5e7d09b5d961c6ace7734568c547dd6858b364ce5e47951f17884089250838181808280098009099050620018d4600052620025ba565b837f0b2d722d0919a1aad8db58f10062a92ea0c56ac4270e822cca228620188a1d4082089050837f1f790d4d7f8cf094d980ceb37c2453e957b54a9991ca38bbe0061d1ed6e562d483089150837f0171eb95dfbf7d1eaea97cd385f780150885c16235a2a6a8da92ceb01e504233840892508381818082800980090990506200195f600052620025ba565b837f0c2d0e3b5fd57549329bf6885da66b9b790b40defd2c8650762305381b16887382089050837f1162fb28689c27154e5a8228b4e72b377cbcafa589e283c35d3803054407a18d83089150837f2f1459b65dee441b64ad386a91e8310f282c5a92a89e19921623ef8249711bc084089250838181808280098009099050620019ea600052620025ba565b837f1e6ff3216b688c3d996d74367d5cd4c1bc489d46754eb712c243f70d1b53cfbb82089050837f01ca8be73832b8d0681487d27d157802d741a6f36cdc2a0576881f932647887583089150837f1f7735706ffe9fc586f976d5bdf223dc680286080b10cea00b9b5de315f9650e8408925083818180828009800909905062001a75600052620025ba565b837f2522b60f4ea3307640a0c2dce041fba921ac10a3d5f096ef4745ca838285f01982089050837f23f0bee001b1029d5255075ddc957f833418cad4f52b6c3f8ce16c235572575b83089150837f2bc1ae8b8ddbb81fcaac2d44555ed5685d142633e9df905f66d9401093082d598408925083818180828009800909905062001b00600052620025ba565b837f0f9406b8296564a37304507b8dba3ed162371273a07b1fc98011fcd6ad72205f82089050837f2360a8eb0cc7defa67b72998de90714e17e75b174a52ee4acb126c8cd995f0a883089150837f15871a5cddead976804c803cbaef255eb4815a5e96df8b006dcbbc2767f889488408925083818180828009800909905062001b8b600052620025ba565b837f193a56766998ee9e0a8652dd2f3b1da0362f4f54f72379544f957ccdeefb420f82089050837f2a394a43934f86982f9be56ff4fab1703b2e63c8ad334834e4309805e777ae0f83089150837f1859954cfeb8695f3e8b635dcb345192892cd11223443ba7b4166e8876c0d1428408925083818180828009800909905062001c16600052620025ba565b837f04e1181763050e58013444dbcb99f1902b11bc25d90bbdca408d3819f4fed32b82089050837f0fdb253dee83869d40c335ea64de8c5bb10eb82db08b5e8b1f5e5552bfd05f2383089150837f058cbe8a9a5027bdaa4efb623adead6275f08686f1c08984a9d7c5bae9b4f1c08408925083818180828009800909905062001ca1600052620025ba565b837f1382edce9971e186497eadb1aeb1f52b23b4b83bef023ab0d15228b4cceca59a82089050837f03464990f045c6ee0819ca51fd11b0be7f61b8eb99f14b77e1e6634601d9e8b583089150837f23f7bfc8720dc296fff33b41f98ff83c6fcab4605db2eb5aaa5bc137aeb70a588408925083818180828009800909905062001d2c600052620025ba565b837f0a59a158e3eec2117e6e94e7f0e9decf18c3ffd5e1531a9219636158bbaf62f282089050837f06ec54c80381c052b58bf23b312ffd3ce2c4eba065420af8f4c23ed0075fd07b83089150837f118872dc832e0eb5476b56648e867ec8b09340f7a7bcb1b4962f0ff9ed1f9d018408925083818180828009800909905062001db7600052620025ba565b837f13d69fa127d834165ad5c7cba7ad59ed52e0b0f0e42d7fea95e1906b520921b182089050837f169a177f63ea681270b1c6877a73d21bde143942fb71dc55fd8a49f19f10c77b83089150837f04ef51591c6ead97ef42f287adce40d93abeb032b922f66ffb7e9a5a7450544d8408925083818180828009800909905062001e42600052620025ba565b837f256e175a1dc079390ecd7ca703fb2e3b19ec61805d4f03ced5f45ee6dd0f69ec82089050837f30102d28636abd5fe5f2af412ff6004f75cc360d3205dd2da002813d3e2ceeb283089150837f10998e42dfcd3bbf1c0714bc73eb1bf40443a3fa99bef4a31fd31be182fcc7928408925083818180828009800909905062001ecd600052620025ba565b837f193edd8e9fcf3d7625fa7d24b598a1d89f3362eaf4d582efecad76f879e3686082089050837f18168afd34f2d915d0368ce80b7b3347d1c7a561ce611425f2664d7aa51f0b5d83089150837f29383c01ebd3b6ab0c017656ebe658b6a328ec77bc33626e29e2e95b33ea61118408925083818180828009800909905062001f58600052620025ba565b837f10646d2f2603de39a1f4ae5e7771a64a702db6e86fb76ab600bf573f9010c71182089050837f0beb5e07d1b27145f575f1395a55bf132f90c25b40da7b3864d0242dcb1117fb83089150837f16d685252078c133dc0d3ecad62b5c8830f95bb2e54b59abdffbf018d96fa3368408925083818180828009800909905062001fe3600052620025ba565b837f0a6abd1d833938f33c74154e0404b4b40a555bbbec21ddfafd672dd62047f01a82089050837f1a679f5d36eb7b5c8ea12a4c2dedc8feb12dffeec450317270a6f19b34cf186083089150837f0980fb233bd456c23974d50e0ebfde4726a423eada4e8f6ffbc7592e3f1b93d6840892508381818082800980090990506200206e600052620025ba565b837f161b42232e61b84cbf1810af93a38fc0cece3d5628c9282003ebacb5c312c72b82089050837f0ada10a90c7f0520950f7d47a60d5e6a493f09787f1564e5d09203db47de1a0b83089150837f1a730d372310ba82320345a29ac4238ed3f07a8a2b4e121bb50ddb9af407f45184089250838181808280098009099050620020f9600052620025ba565b837f2c8120f268ef054f817064c369dda7ea908377feaba5c4dffbda10ef58e8c55682089050837f1c7c8824f758753fa57c00789c684217b930e95313bcb73e6e7b8649a4968f7083089150837f2cd9ed31f5f8691c8e39e4077a74faa0f400ad8b491eb3f7b47b27fa3fd1cf778408925083818180828009800909905062002184600052620025ba565b837f23ff4f9d46813457cf60d92f57618399a5e022ac321ca550854ae23918a22eea82089050837f09945a5d147a4f66ceece6405dddd9d0af5a2c5103529407dff1ea58f180426d83089150837f188d9c528025d4c2b67660c6b771b90f7c7da6eaa29d3f268a6dd223ec6fc630840892508381818082800980090990506200220f600052620025ba565b837f3050e37996596b7f81f68311431d8734dba7d926d3633595e0c0d8ddf4f0f47f82089050837f15af1169396830a91600ca8102c35c426ceae5461e3f95d89d829518d30afd7883089150837f1da6d09885432ea9a06d9f37f873d985dae933e351466b2904284da3320d8acc840892508381818082800980090990506200229a600052620025ba565b837f2796ea90d269af29f5f8acf33921124e4e4fad3dbe658945e546ee411ddaa9cb82089050837f202d7dd1da0f6b4b0325c8b3307742f01e15612ec8e9304a7cb0319e01d32d6083089150837f096d6790d05bb759156a952ba263d672a2d7f9c788f4c831a29dace4c0f8be5f8408925083818180828009800909905062002325600052620025ba565b837f054efa1f65b0fce283808965275d877b438da23ce5b13e1963798cb1447d25a482089050837f1b162f83d917e93edb3308c29802deb9d8aa690113b2e14864ccf6e18e4165f183089150837f21e5241e12564dd6fd9f1cdd2a0de39eedfefc1466cc568ec5ceb745a0506edc84089250838181808280098009099050838281808280098009099150838381808280098009099250620023c8600052620025ba565b837f1cfb5662e8cf5ac9226a80ee17b36abecb73ab5f87e161927b4349e10e4bdf0882089050837f0f21177e302a771bbae6d8d1ecb373b62c99af346220ac0129c53f666eb2410083089150837f1671522374606992affb0dd7f71b12bec4236aede6290546bcef7e1f515c2320840892508381818082800980090990508382818082800980090991508383818082800980090992506200246b600052620025ba565b837f0fa3ec5b9488259c2eb4cf24501bfad9be2ec9e42c5cc8ccd419d2a692cad87082089050837f193c0e04e0bd298357cb266c1506080ed36edce85c648cc085e8c57b1ab54bba83089150837f102adf8ef74735a27e9128306dcbc3c99f6f7291cd406578ce14ea2adaba68f8840892508381818082800980090990508382818082800980090991508383818082800980090992506200250e600052620025ba565b837f0fe0af7858e49859e2a54d6f1ad945b1316aa24bfbdd23ae40a6d0cb70c3eab182089050837f216f6717bbc7dedb08536a2220843f4e2da5f1daa9ebdefde8a5ea7344798d2283089150837f1da55cc900f0d21f4a3e694391918a1b3c23b2ac773c6b3ef88e2e422832516184089250838181808280098009099050838281808280098009099150838381808280098009099250620025b1600052620025ba565b60005260206000f35b8360205182098460405184098591088460605185098591088460805183098560a05185098691088560c05186098691088560e0518409866101005186098791088661012051870987910894509250905060005156","storage":{}},"0x610178da211fef7d417bc0e6fed39f05609ad788":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063a0c2a19a14610030575b600080fd5b61004361003e3660046119d8565b610057565b604051901515815260200160405180910390f35b60006100616117eb565b60408051808201825287518152602080890151818301529083528151608081018352875151818401908152885183015160608301528152825180840184528883018051518252518301518184015281830152838201528151808301835286518152868201518183015283830152815160178082526103008201909352600092909182016102e08036833701905050905060005b60178110156101435784816017811061010f5761010f611ab6565b602002015182828151811061012657610126611ab6565b60209081029190910101528061013b81611ae2565b9150506100f4565b5061014e818361016f565b60000361016057600192505050610167565b6000925050505b949350505050565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018161019b610366565b9050806080015151855160016101b19190611afb565b146101f85760405162461bcd60e51b81526020600482015260126024820152711d995c9a599a595c8b5898590b5a5b9c1d5d60721b60448201526064015b60405180910390fd5b604080518082019091526000808252602082018190525b86518110156102e9578387828151811061022b5761022b611ab6565b6020026020010151106102805760405162461bcd60e51b815260206004820152601f60248201527f76657269666965722d6774652d736e61726b2d7363616c61722d6669656c640060448201526064016101ef565b6102d5826102d085608001518460016102999190611afb565b815181106102a9576102a9611ab6565b60200260200101518a85815181106102c3576102c3611ab6565b602002602001015161113a565b6111d0565b9150806102e181611ae2565b91505061020f565b5061031281836080015160008151811061030557610305611ab6565b60200260200101516111d0565b90506103486103248660000151611269565b8660200151846000015185602001518587604001518b604001518960600151611308565b6103585760019350505050610360565b600093505050505b92915050565b61036e61183c565b6040805180820182527f2d4d9aa7e302d9df41749d5507949d05dbea33fbb16c643b22f599a2be6df2e281527f14bedd503c37ceb061d8ec60209fe345ce89830a19230301f076caff004d19266020808301919091529083528151608080820184527f0967032fcbf776d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c8285019081527f0e187847ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab606080850191909152908352845180860186527f304cfbd1e08a704a99f5e847d93f8c3caafddec46b7a0d379da69a4d112346a781527f1739c1b1a457a8c7313123d24d2f9192f896b7c63eea05a9d57f06547ad0cec8818601528385015285840192909252835180820185527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c28186019081527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed828501528152845180860186527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b81527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa818601528185015285850152835190810184527f0d90715fdb8741aaa360b7d045d6570488a0af1319e0762e4b381a3cdb86e0be8185019081527f099f61db4ae4134e6b7d16180a2b9c9450f8ea918166dbcab8f6d30537631f84828401528152835180850185527f19c07eddd3f9a6ed3864ae90b6efe9de960013d17e885266e1caaaaedff1306f81527f0fec4d428029c7dc57579c18ccfa615294c88203791285bd1ed8f42b62868c2a818501528184015290840152815160188082526103208201909352919082015b60408051808201909152600080825260208201528152602001906001900390816105ea57505060808201908152604080518082019091527f28dc06fb73581c43eec4c0b4b47414ac364eff3f476014371a140432cce8055a81527f054a4c4400d2d45d71deb73f4bdf7d69364e7dc3e0b1bf83e2da4535e4c5064e60208201529051805160009061067d5761067d611ab6565b602002602001018190525060405180604001604052807f09f97aeb9ccc8dcca5eccb023298611c0c351bad9cb61222f292e04f87fe478f81526020017f16494f386fa469f5bd2249d1c78aef85dc0eaab209750cc0598ae62dbd8f145e81525081608001516001815181106106f4576106f4611ab6565b602002602001018190525060405180604001604052807f0ccaba896280b8264b415b5de71808cbe6082ad10e9630bfcf04b76309ad6acb81526020017f1497b669579fd3039ed06074d71d5fd14fb2a5a8d3fbc1db8de81dacf7ebecd3815250816080015160028151811061076b5761076b611ab6565b602002602001018190525060405180604001604052807f0d1401a696e0c5b4260401e91b76feb5ab8fcaec71cb129bc2ab7746131493c981526020017f1b8e69c0ca562847c0f2418a8ed5f00156c28f9563b5e2ffb2e6fdfeb173f4fa81525081608001516003815181106107e2576107e2611ab6565b602002602001018190525060405180604001604052807f211039b94925165c65bc1d42692767f2f152c80ee050a744ea90db3c9d393f0d81526020017f267f3f695423bcef679770f70ce399b59219cfb7dee8d6754a351e1dc9e3cae2815250816080015160048151811061085957610859611ab6565b602002602001018190525060405180604001604052807f0b17bf11a1d69f6b8134f3bddd2b859d49a94cd5cf20f1e39f49dbf3f90d76c781526020017f17ad05cd2ea90301cfef8db97a48990b1209ade677cfeee2a678b8c7530456a081525081608001516005815181106108d0576108d0611ab6565b602002602001018190525060405180604001604052807f22b2528d01b15235f4054d1c47be6eb14d99a45468af7617908d68d59d06276281526020017f02d17a4f23907703531154f874fc163c3b8871b65b7be39a611af6daaff2d9bd815250816080015160068151811061094757610947611ab6565b602002602001018190525060405180604001604052807f0aaddc280610ccbcdec55cd0a98301318f148e6df2dbb7835b008a35c172e42981526020017f053a4001a1919e6d90e7073b6341ebe62239fb0b88ef94ae5f8081964af1a53d81525081608001516007815181106109be576109be611ab6565b602002602001018190525060405180604001604052807f09991b1741b3c3e0f260bbdaed9f662d4dc2fe6eb950343b2215eb86730baec981526020017f20bd0d9b800a82c31ab684f3c33b1efe041f5038e789d51f0f127048f7be880d8152508160800151600881518110610a3557610a35611ab6565b602002602001018190525060405180604001604052807f2ef936bd2bfbfeafcc907207812762babe7e841d58b30edd406a15f1dbdad8d581526020017f192668f5a1a3ccafb1fe1f40e286412af0e276de9113f8cd1b66582c1e9c21818152508160800151600981518110610aac57610aac611ab6565b602002602001018190525060405180604001604052807f170cd61a7129b66f9b85e78110f20f138986d566284aa7206341f919522cebce81526020017f0806a59823beeb24e8cae1d42c8e2cc3c557924ab1c10ccaaa7bc1d74d61745f8152508160800151600a81518110610b2357610b23611ab6565b602002602001018190525060405180604001604052807f0e7d0b9fa8827b923caf50c7adf11cb4ca5332f218dfb5551a91e2c7d71c6fd381526020017f129066e8a22b3dc04fd7e4801cc47f278df0820d2ceb73eed14954e3d29e971f8152508160800151600b81518110610b9a57610b9a611ab6565b602002602001018190525060405180604001604052807f23f1c73ff93df0551472aa515ef19841cfacd32da7f3227cee89d0674d66290181526020017f1e79b7984940f978fc96be903f7ecb0fb209372a70ba02b1e2e18129e4fbc6578152508160800151600c81518110610c1157610c11611ab6565b602002602001018190525060405180604001604052807f1b2dab88aebb930cd51015b7837f8c2f2724f2e8b708481a09d35e1cfc0f92f981526020017f1b23fd4f021e4872c6737a2e7ac74b07a0606b8210292c3d5fd960a6035df8138152508160800151600d81518110610c8857610c88611ab6565b602002602001018190525060405180604001604052807f21e3ee66f14a19977f409915e26ce5f36600bc576cc7829440f11c9a0b2cd5a881526020017f22c9fccd55a855540bbe29e3507907e0ce3293a2ab3af4f1f2e21e0c7248a8488152508160800151600e81518110610cff57610cff611ab6565b602002602001018190525060405180604001604052807f035f91fe918c38ebdf392630a957ac8e477166ad8f5a0a36dd181f13514a140381526020017f021444019a1de1a9e957c17955fa4d6d03f343dcd77bc6a22f9caa0c9afb427b8152508160800151600f81518110610d7657610d76611ab6565b602002602001018190525060405180604001604052807f26da2cad4ba914b898877e885f6010444fa1feff343dfe11b6ef046f5585101e81526020017f182e1b4234001179baca8412a517048e374bc709df948e2b35a05909ea3f7ca78152508160800151601081518110610ded57610ded611ab6565b602002602001018190525060405180604001604052807ece06b30272787c480d19af1fb54fcf1094fcd9c1fa60a8bc1b1f4d43f6c9d881526020017f26bc72d22123e71011461f6a082fc0d08bbc6a29f8b99fa0736677a0252bb20d8152508160800151601181518110610e6357610e63611ab6565b602002602001018190525060405180604001604052807f2a05e6db6dba6a7ad8f95373041d23291c118d645cba730b285391da154b3d0781526020017f0b827de858c5743e422dc66928d093853d0ffc7cb42c33d44029ca3b890dccd18152508160800151601281518110610eda57610eda611ab6565b602002602001018190525060405180604001604052807f28855449a65dee39991cd1a14fbbac7f8fe55e5d543118f42e01a3f747e7ba1281526020017f20f2fe7867e4e1a87478b14e5fff3dc88f534809963fbd88cbdbc84513356b8a8152508160800151601381518110610f5157610f51611ab6565b602002602001018190525060405180604001604052807f286168bbf22a5da8e34a02893e56135a239e6fcc08d159d85fa8111fe32cf05d81526020017f112648ef76e887b26ad29d97df08a2e3d2ce5af205f9d4372c7e073de87131c78152508160800151601481518110610fc857610fc8611ab6565b602002602001018190525060405180604001604052807e52bf26403d0a05144606678c7e11c1d00588a32a54f4fadd652b5e56d4162481526020017f0e0a8b9f6a88b22f1d7933a3cdd129f8fee1adeeba1b798d12fc6cd765dcaf64815250816080015160158151811061103e5761103e611ab6565b602002602001018190525060405180604001604052807f2003403992340e7dabf6768d57472987c788f52eef3185551bc93a78b02a4dc081526020017f27b3af6047312e6b00ecfbec011c3661c6db4a75747f8cbb08c0506975c04e2481525081608001516016815181106110b5576110b5611ab6565b602002602001018190525060405180604001604052807f1cf69c463989836166fc25b1b15c0d69a068afa30e45f4e994e1e64294034a8281526020017f1dde8c5ae340c064b56847c464c47541c4315bb1ad1232a45723f255cea35b7f815250816080015160178151811061112c5761112c611ab6565b602002602001018190525090565b604080518082019091526000808252602082015261115661188d565b835181526020808501519082015260408101839052600060608360808460076107d05a03fa9050808061118557fe5b50806111c85760405162461bcd60e51b81526020600482015260126024820152711c185a5c9a5b99cb5b5d5b0b59985a5b195960721b60448201526064016101ef565b505092915050565b60408051808201909152600080825260208201526111ec6118ab565b8351815260208085015181830152835160408301528301516060808301919091526000908360c08460066107d05a03fa9050808061122657fe5b50806111c85760405162461bcd60e51b81526020600482015260126024820152711c185a5c9a5b99cb5859190b59985a5b195960721b60448201526064016101ef565b604080518082019091526000808252602082015281517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47901580156112b057506020830151155b156112d05750506040805180820190915260008082526020820152919050565b6040518060400160405280846000015181526020018285602001516112f59190611b0e565b6112ff9084611b30565b90529392505050565b60408051600480825260a08201909252600091829190816020015b604080518082019091526000808252602082015281526020019060019003908161132357505060408051600480825260a0820190925291925060009190602082015b61136d6118c9565b8152602001906001900390816113655790505090508a8260008151811061139657611396611ab6565b602002602001018190525088826001815181106113b5576113b5611ab6565b602002602001018190525086826002815181106113d4576113d4611ab6565b602002602001018190525084826003815181106113f3576113f3611ab6565b6020026020010181905250898160008151811061141257611412611ab6565b6020026020010181905250878160018151811061143157611431611ab6565b6020026020010181905250858160028151811061145057611450611ab6565b6020026020010181905250838160038151811061146f5761146f611ab6565b60200260200101819052506114848282611493565b9b9a5050505050505050505050565b600081518351146114df5760405162461bcd60e51b81526020600482015260166024820152751c185a5c9a5b99cb5b195b99dd1a1ccb59985a5b195960521b60448201526064016101ef565b825160006114ee826006611b43565b905060008167ffffffffffffffff81111561150b5761150b611925565b604051908082528060200260200182016040528015611534578160200160208202803683370190505b50905060005b8381101561176f5786818151811061155457611554611ab6565b6020026020010151600001518282600661156e9190611b43565b611579906000611afb565b8151811061158957611589611ab6565b6020026020010181815250508681815181106115a7576115a7611ab6565b602002602001015160200151828260066115c19190611b43565b6115cc906001611afb565b815181106115dc576115dc611ab6565b6020026020010181815250508581815181106115fa576115fa611ab6565b6020908102919091010151515182611613836006611b43565b61161e906002611afb565b8151811061162e5761162e611ab6565b60200260200101818152505085818151811061164c5761164c611ab6565b60209081029190910181015151015182611667836006611b43565b611672906003611afb565b8151811061168257611682611ab6565b6020026020010181815250508581815181106116a0576116a0611ab6565b6020026020010151602001516000600281106116be576116be611ab6565b6020020151826116cf836006611b43565b6116da906004611afb565b815181106116ea576116ea611ab6565b60200260200101818152505085818151811061170857611708611ab6565b60200260200101516020015160016002811061172657611726611ab6565b602002015182611737836006611b43565b611742906005611afb565b8151811061175257611752611ab6565b60209081029190910101528061176781611ae2565b91505061153a565b506117786118e9565b6000602082602086026020860160086107d05a03fa9050808061179757fe5b50806117dd5760405162461bcd60e51b81526020600482015260156024820152741c185a5c9a5b99cb5bdc18dbd9194b59985a5b1959605a1b60448201526064016101ef565b505115159695505050505050565b6040805160a0810190915260006060820181815260808301919091528152602081016118156118c9565b8152602001611837604051806040016040528060008152602001600081525090565b905290565b6040805160e08101909152600060a0820181815260c08301919091528152602081016118666118c9565b81526020016118736118c9565b81526020016118806118c9565b8152602001606081525090565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b60405180604001604052806118dc611907565b8152602001611837611907565b60405180602001604052806001906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561195e5761195e611925565b60405290565b6040516102e0810167ffffffffffffffff8111828210171561195e5761195e611925565b600082601f83011261199957600080fd5b6119a161193b565b8060408401858111156119b357600080fd5b845b818110156119cd5780358452602093840193016119b5565b509095945050505050565b6000806000806103e08086880312156119f057600080fd5b6119fa8787611988565b9450604087605f880112611a0d57600080fd5b611a1561193b565b8060c089018a811115611a2757600080fd5b838a015b81811015611a4c57611a3d8c82611988565b84526020909301928401611a2b565b50819750611a5a8b82611988565b9650505050508661011f870112611a7057600080fd5b611a78611964565b908601908088831115611a8a57600080fd5b61010088015b83811015611aa8578035835260209283019201611a90565b509598949750929550505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201611af457611af4611acc565b5060010190565b8082018082111561036057610360611acc565b600082611b2b57634e487b7160e01b600052601260045260246000fd5b500690565b8181038181111561036057610360611acc565b808202811582820484141761036057610360611acc56fea26469706673582212204db900dfc7d6b2ca2357022b9f752ee667754126780704fe616315f45ec470ee64736f6c63430008120033","storage":{}},"0x68b1d87f95878fe05b998f19b66f4baba5de1aed":{"nonce":1,"balance":"0x0","code":"0x6080604052600436106103b85760003560e01c80638c832b13116101f2578063cc3c74a11161010d578063ec732959116100a0578063f5fc3d6b1161006f578063f5fc3d6b14610c5e578063fa73168714610c8a578063fc0c546a14610cba578063fc7e9c6f14610cee57600080fd5b8063ec73295914610bae578063ed33639f14610be2578063f178e47c14610c02578063f5ab0dd614610c2f57600080fd5b8063e4a30116116100dc578063e4a3011614610b16578063e70ea87c14610b36578063ea495db014610b63578063ea65ba4914610b8157600080fd5b8063cc3c74a114610a8b578063cd87a3b414610aa1578063d384534d14610ab6578063dbc916b814610ad657600080fd5b8063b75e679811610185578063c1922f9e11610154578063c1922f9e146109c6578063c2230d6e146109d9578063c2b40ae414610a17578063c80916d414610a6b57600080fd5b8063b75e679814610941578063ba70f75714610961578063bc063e1a146107a3578063bfbc0a391461099257600080fd5b8063a0d192f5116101c1578063a0d192f5146108ce578063a38f76e8146108ee578063a6232a9314610901578063b2bc6e0f1461092157600080fd5b80638c832b13146108445780638f1c56bd1461086457806390eeb02b1461087a578063921563111461089e57600080fd5b806349ce8997116102e257806371523c3211610275578063830b2f5711610244578063830b2f57146107bb578063840b2791146107db5780638b7e8782146107f15780638c0d34d81461082257600080fd5b806371523c321461072757806372c1ad031461076d57806378abb49b1461078d5780637fe24ffe146107a357600080fd5b80635a129efe116102b15780635a129efe146106915780635bb93995146106c15780635d2d766c146106e15780636338bcbc1461071457600080fd5b806349ce8997146105fe5780634c830cbd1461062e5780634ecf518b1461065a578063509cd41e1461067e57600080fd5b80632570b7b41161035a57806338a26a091161032957806338a26a091461055f5780633bfa8d7a14610572578063414a37ba1461059257806343e7119f146105c657600080fd5b80632570b7b4146104d45780632b7ac3f3146104f4578063305e9eac1461052c5780633408e4701461054c57600080fd5b8063158ef93e11610396578063158ef93e146104365780631e627617146104605780631f79a1e9146104825780631f7f99f7146104b257600080fd5b80630b27fb9a146103bd5780630c394a60146103e15780630eb7606f14610414575b600080fd5b3480156103c957600080fd5b506006545b6040519081526020015b60405180910390f35b3480156103ed57600080fd5b50601054600160e01b900463ffffffff165b60405163ffffffff90911681526020016103d8565b34801561042057600080fd5b50601054600160c01b900463ffffffff166103ff565b34801561044257600080fd5b506000546104509060ff1681565b60405190151581526020016103d8565b34801561046c57600080fd5b50610475610d12565b6040516103d89190613e49565b34801561048e57600080fd5b5061045061049d366004613e8d565b60036020526000908152604090205460ff1681565b3480156104be57600080fd5b506104d26104cd366004613eb8565b610ed4565b005b3480156104e057600080fd5b506103ce6104ef366004613ee8565b610fd0565b34801561050057600080fd5b50601054610514906001600160a01b031681565b6040516001600160a01b0390911681526020016103d8565b34801561053857600080fd5b506103ce610547366004613f0a565b6110cd565b34801561055857600080fd5b50466103ce565b6104d261056d36600461432f565b611140565b34801561057e57600080fd5b5061045061058d366004613ee8565b61115e565b34801561059e57600080fd5b506103ce7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181565b3480156105d257600080fd5b506103ce6105e1366004613eb8565b600b60209081526000928352604080842090915290825290205481565b34801561060a57600080fd5b50610450610619366004613e8d565b60046020526000908152604090205460ff1681565b34801561063a57600080fd5b506106436111f5565b60405165ffffffffffff90911681526020016103d8565b34801561066657600080fd5b506010546103ff90600160e01b900463ffffffff1681565b6104d261068c366004614413565b611243565b34801561069d57600080fd5b506104506106ac366004613e8d565b60009081526003602052604090205460ff1690565b3480156106cd57600080fd5b506103ce6106dc366004613ee8565b6112bf565b3480156106ed57600080fd5b506103ff6106fc366004613e8d565b600c6020526000908152604090205463ffffffff1681565b6103ce610722366004614464565b611397565b34801561073357600080fd5b5061075b7f000000000000000000000000000000000000000000000000000000000000000181565b60405160ff90911681526020016103d8565b34801561077957600080fd5b506104d26107883660046144a5565b6115c6565b34801561079957600080fd5b506103ce600f5481565b3480156107af57600080fd5b506103ce600160f81b81565b3480156107c757600080fd5b506104506107d6366004613e8d565b6116ef565b3480156107e757600080fd5b506103ce600e5481565b3480156107fd57600080fd5b50610809600160f81b81565b6040516001600160f01b031990911681526020016103d8565b34801561082e57600080fd5b50610837611713565b6040516103d891906144d3565b34801561085057600080fd5b506104d261085f366004613eb8565b611958565b34801561087057600080fd5b506103ce600d5481565b34801561088657600080fd5b506010546103ff90600160a01b900463ffffffff1681565b3480156108aa57600080fd5b506104506108b9366004613e8d565b60009081526009602052604090205460ff1690565b3480156108da57600080fd5b506104d26108e93660046144a5565b611a42565b6104d26108fc366004614537565b611b6b565b34801561090d57600080fd5b5061045061091c366004613e8d565b611ba0565b34801561092d57600080fd5b506104d261093c3660046145f8565b611c26565b34801561094d57600080fd5b5061045061095c36600461462c565b611c8b565b34801561096d57600080fd5b50601054600160a01b900463ffffffff166000908152600160205260409020546103ce565b34801561099e57600080fd5b506103ff7f000000000000000000000000000000000000000000000000000000000000001e81565b6104d26109d4366004614660565b61205d565b3480156109e557600080fd5b506109ff6109f4366004613e8d565b65ffffffffffff1690565b6040516001600160401b0390911681526020016103d8565b348015610a2357600080fd5b50610a51610a32366004613e8d565b6001602081905260009182526040909120805491015463ffffffff1682565b6040805192835263ffffffff9091166020830152016103d8565b348015610a7757600080fd5b50600754610514906001600160a01b031681565b348015610a9757600080fd5b506103ce60065481565b348015610aad57600080fd5b506103ff601e81565b348015610ac257600080fd5b506103ce610ad1366004614687565b612675565b348015610ae257600080fd5b50610af6610af1366004613e8d565b61271b565b6040805194855260208501939093529183015260608201526080016103d8565b348015610b2257600080fd5b506104d2610b31366004613ee8565b612755565b348015610b4257600080fd5b506103ce610b51366004613e8d565b60086020526000908152604090205481565b348015610b6f57600080fd5b506011546001600160a01b0316610514565b348015610b8d57600080fd5b50610ba1610b9c3660046146fc565b6127d0565b6040516103d89190614770565b348015610bba57600080fd5b506103ce7f2fe54c60d3acabf3343a35b6eba15db4821b340f76e741e2249685ed4899af6c81565b348015610bee57600080fd5b50601154610514906001600160a01b031681565b348015610c0e57600080fd5b506103ce610c1d366004613e8d565b60026020526000908152604090205481565b348015610c3b57600080fd5b50610c4f610c4a3660046147aa565b612898565b6040516103d89392919061485c565b348015610c6a57600080fd5b50610450610c79366004613e8d565b60301c6001600160a01b0316301490565b348015610c9657600080fd5b50610450610ca5366004613e8d565b60096020526000908152604090205460ff1681565b348015610cc657600080fd5b506105147f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b9701681565b348015610cfa57600080fd5b506010546103ff90600160c01b900463ffffffff1681565b606060007f000000000000000000000000000000000000000000000000000000000000000160ff166001600160401b03811115610d5157610d51613f27565b604051908082528060200260200182016040528015610d7a578160200160208202803683370190505b50905060005b7f000000000000000000000000000000000000000000000000000000000000000160ff16811015610ece57610db681600161489b565b600a5410610e0657600a8181548110610dd157610dd16148ae565b906000526020600020906004020160010154828281518110610df557610df56148ae565b602002602001018181525050610ebc565b3063305e9eac610e3760017f000000000000000000000000000000000000000000000000000000000000001e6148c4565b6040516001600160e01b031960e084901b16815263ffffffff919091166004820152602401602060405180830381865afa158015610e79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9d91906148e8565b828281518110610eaf57610eaf6148ae565b6020026020010181815250505b80610ec681614901565b915050610d80565b50919050565b6007546001600160a01b03163314610f075760405162461bcd60e51b8152600401610efe9061491a565b60405180910390fd5b8063ffffffff168060065410610f2f5760405162461bcd60e51b8152600401610efe90614951565b600654610f3d90600161489b565b811115610f5c5760405162461bcd60e51b8152600401610efe90614994565b600681905560005460ff16610f835760405162461bcd60e51b8152600401610efe906149f1565b610f8c83600e55565b6040805184815263ffffffff841660208201527f7365fbc0361c0ff116a7632dca78f1f79cba64d281371ad578752ce44cb0f29b91015b60405180910390a1505050565b6000600160f81b82106110135760405162461bcd60e51b815260206004820152600b60248201526a496e76616c69642066656560a81b6044820152606401610efe565b611020600160f81b614a28565b831380156110315750600160f81b83125b6110725760405162461bcd60e51b8152602060048201526012602482015271125b9d985b1a5908195e1d08185b5bdd5b9d60721b6044820152606401610efe565b600061107e8385614a44565b905060008112156110c15761109281614a28565b6110bc907f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001614a64565b6110c3565b805b9150505b92915050565b601154604051631d052ab160e31b815263ffffffff831660048201526000916001600160a01b03169063e829558890602401602060405180830381865afa15801561111c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c791906148e8565b61114986611c26565b6111568585858585611b6b565b505050505050565b600081600003611170575060006110c7565b6000838152600c602052604090205463ffffffff16805b6000858152600b6020908152604080832063ffffffff8516845290915290205484036111b8576001925050506110c7565b8063ffffffff166000036111ca5750601e5b806111d481614a77565b9150508163ffffffff168163ffffffff160361118757506000949350505050565b60408051600160f81b602082018190524660e01b6001600160e01b0319811660228401528351808403600601815260269093019093526000929161123881614a97565b60d01c935050505090565b61124e843083612921565b604051632404142f60e11b81526001600160a01b038481166004830152602482018390528381166044830152851690634808285e906064015b600060405180830381600087803b1580156112a157600080fd5b505af11580156112b5573d6000803e3d6000fd5b5050505050505050565b600080306001600160a01b031663ea495db06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611300573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113249190614ace565b604051635bb9399560e01b815260048101869052602481018590529091506001600160a01b03821690635bb9399590604401602060405180830381865afa158015611373573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c391906148e8565b604051634b66a6ff60e11b81526004810182905260009081906001600160a01b038516906396cd4dfe90602401602060405180830381865afa1580156113e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140591906148e8565b90506001600160a01b0385166114f6578034146114815760405162461bcd60e51b815260206004820152603460248201527f56416e63686f72426173653a206d73672e76616c75652073686f756c6420626560448201527308195c5d585b081d1bc81ddc985c105b5bdd5b9d60621b6064820152608401610efe565b604051633d97186b60e11b81523360048201526001600160a01b03868116602483015260006044830152306064830152851690637b2e30d69034906084016000604051808303818588803b1580156114d857600080fd5b505af11580156114ec573d6000803e3d6000fd5b50505050506115be565b341561154f5760405162461bcd60e51b815260206004820152602260248201527f56416e63686f72426173653a206d73672e76616c75652073686f756c64206265604482015261020360f41b6064820152608401610efe565b604051633d97186b60e11b81523360048201526001600160a01b03868116602483015260448201839052306064830152851690637b2e30d690608401600060405180830381600087803b1580156115a557600080fd5b505af11580156115b9573d6000803e3d6000fd5b505050505b949350505050565b6007546001600160a01b031633146115f05760405162461bcd60e51b8152600401610efe9061491a565b8063ffffffff1680600654106116185760405162461bcd60e51b8152600401610efe90614951565b60065461162690600161489b565b8111156116455760405162461bcd60e51b8152600401610efe90614994565b60068190556001600160a01b0383166116965760405162461bcd60e51b8152602060048201526013602482015272048616e646c65722063616e6e6f74206265203606c1b6044820152606401610efe565b600780546001600160a01b0319166001600160a01b0385169081179091556040805191825263ffffffff841660208301527fd2e262b0385d9d9b956b22e37ce5d35b7120e1d369538757a6d7afd7bfe2d0269101610fc3565b600065ffffffffffff8216806117036111f5565b65ffffffffffff16149392505050565b606060007f000000000000000000000000000000000000000000000000000000000000000160ff166001600160401b0381111561175257611752613f27565b6040519080825280602002602001820160405280156117b157816020015b61179e6040518060800160405280600081526020016000815260200160008152602001600080191681525090565b8152602001906001900390816117705790505b50905060005b7f000000000000000000000000000000000000000000000000000000000000000160ff16811015610ece576117ed81600161489b565b600a541061186b57600a8181548110611808576118086148ae565b906000526020600020906004020160405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505082828151811061185b5761185b6148ae565b6020026020010181905250611946565b604080516080810190915260008152602081013063305e9eac6118af60017f000000000000000000000000000000000000000000000000000000000000001e6148c4565b6040516001600160e01b031960e084901b16815263ffffffff919091166004820152602401602060405180830381865afa1580156118f1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061191591906148e8565b8152602001600081526020016000801b81525082828151811061193a5761193a6148ae565b60200260200101819052505b8061195081614901565b9150506117b7565b6007546001600160a01b031633146119825760405162461bcd60e51b8152600401610efe9061491a565b8063ffffffff1680600654106119aa5760405162461bcd60e51b8152600401610efe90614951565b6006546119b890600161489b565b8111156119d75760405162461bcd60e51b8152600401610efe90614994565b600681905560005460ff166119fe5760405162461bcd60e51b8152600401610efe906149f1565b611a0783600f55565b6040805184815263ffffffff841660208201527f1aac2d1c43f1cd792e5494b49218701c2ca718a80d6d6b480b7903c049e6bb1d9101610fc3565b6007546001600160a01b03163314611a6c5760405162461bcd60e51b8152600401610efe9061491a565b8063ffffffff168060065410611a945760405162461bcd60e51b8152600401610efe90614951565b600654611aa290600161489b565b811115611ac15760405162461bcd60e51b8152600401610efe90614994565b60068190556001600160a01b038316611b125760405162461bcd60e51b8152602060048201526013602482015272048616e646c65722063616e6e6f74206265203606c1b6044820152606401610efe565b601080546001600160a01b0319166001600160a01b0385169081179091556040805191825263ffffffff841660208301527ffb66e9e8ae339b78aacff90234fbd7dd75bea9bcea581ea47833249a68f2bb8e9101610fc3565b611b997f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b9701686868686866129e9565b5050505050565b600081600003611bb257506000919050565b601054600160a01b900463ffffffff16805b63ffffffff81166000908152600160205260409020548403611bea575060019392505050565b8063ffffffff16600003611bfc5750601e5b80611c0681614a77565b9150508163ffffffff168163ffffffff1603611bc4575060009392505050565b80516001600160a01b03163314611c7f5760405162461bcd60e51b815260206004820152601c60248201527f6f6e6c79206f776e65722063616e2062652072656769737465726564000000006044820152606401610efe565b611c8881612c39565b50565b6000306001600160a01b031663a6232a9383600081518110611caf57611caf6148ae565b60200260200101516040518263ffffffff1660e01b8152600401611cd591815260200190565b602060405180830381865afa158015611cf2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d169190614aeb565b611d625760405162461bcd60e51b815260206004820152601c60248201527f43616e6e6f742066696e6420796f7572206d65726b6c6520726f6f74000000006044820152606401610efe565b611d8d7f00000000000000000000000000000000000000000000000000000000000000016001614b0d565b60ff16825114611ddf5760405162461bcd60e51b815260206004820152601b60248201527f496e636f727265637420726f6f74206172726179206c656e67746800000000006044820152606401610efe565b600160005b600a54811015611ee6576000600a8281548110611e0357611e036148ae565b90600052602060002090600402016040518060800160405290816000820154815260200160018201548152602001600282015481526020016003820154815250509050611e79816000015186846001611e5c919061489b565b81518110611e6c57611e6c6148ae565b602002602001015161115e565b611ec55760405162461bcd60e51b815260206004820152601760248201527f4e65696768626f7220726f6f74206e6f7420666f756e640000000000000000006044820152606401610efe565b82611ecf81614901565b935050508080611ede90614901565b915050611de4565b505b611f137f00000000000000000000000000000000000000000000000000000000000000016001614b0d565b60ff168114612054573063305e9eac611f4d60017f000000000000000000000000000000000000000000000000000000000000001e6148c4565b6040516001600160e01b031960e084901b16815263ffffffff919091166004820152602401602060405180830381865afa158015611f8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fb391906148e8565b838281518110611fc557611fc56148ae565b602002602001015114612042576040805162461bcd60e51b81526020600482015260248101919091527f4c696e6b61626c65416e63686f723a206e6f6e2d6578697374656e742065646760448201527f65206973206e6f742073657420746f207468652064656661756c7420726f6f746064820152608401610efe565b8061204c81614901565b915050611ee8565b50600192915050565b6007546001600160a01b031633146120875760405162461bcd60e51b8152600401610efe9061491a565b60005460ff166120a95760405162461bcd60e51b8152600401610efe906149f1565b6120b1612c85565b600065ffffffffffff8216604051639215631160e01b81526001600160401b03821660048201529091503090639215631190602401602060405180830381865afa158015612103573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121279190614aeb565b15612480576001600160401b038116600090815260086020526040902054600a805463ffffffff861692908110612160576121606148ae565b906000526020600020906004020160020154106121d65760405162461bcd60e51b815260206004820152602e60248201527f4c696e6b61626c65416e63686f723a204e6577206c65616620696e646578206d60448201526d3ab9ba1031329033b932b0ba32b960911b6064820152608401610efe565b600a60086000836001600160401b031681526020019081526020016000205481548110612205576122056148ae565b90600052602060002090600402016002015462010000612225919061489b565b8363ffffffff161061229f5760405162461bcd60e51b815260206004820152603a60248201527f4c696e6b61626c65416e63686f723a204e6577206c65616620696e646578206d60448201527f7573742062652077697468696e20325e313620757064617465730000000000006064820152608401610efe565b600a60086000836001600160401b0316815260200190815260200160002054815481106122ce576122ce6148ae565b90600052602060002090600402016003015482146123455760405162461bcd60e51b815260206004820152602e60248201527f4c696e6b61626c65416e63686f723a207372635265736f757263654944206d7560448201526d7374206265207468652073616d6560901b6064820152608401610efe565b6001600160401b038116600090815260086020526040902054600a805463ffffffff861691908390811061237b5761237b6148ae565b90600052602060002090600402016002018190555084600a82815481106123a4576123a46148ae565b6000918252602080832060016004909302018201939093556001600160401b0385168252600c90925260408120549091601e916123e99163ffffffff90911690614b26565b6123f39190614b59565b6001600160401b0384166000818152600c60209081526040808320805463ffffffff191663ffffffff878116918217909255600b84528285209085528352928190208b905580519384529189169083015281018890529091507f918597b0fdca66b353a1b90d2287c2b06307c4d35c824dfcffeb4b675c961ce49060600160405180910390a15050612665565b600a5460ff7f000000000000000000000000000000000000000000000000000000000000000116116125075760405162461bcd60e51b815260206004820152602a60248201527f4c696e6b61626c65416e63686f723a205468697320416e63686f7220697320616044820152697420636170616369747960b01b6064820152608401610efe565b6001600160401b0381166000818152600960209081526040808320805460ff19166001908117909155600a805483516080810185528781528086018c815263ffffffff8c1682870181815260608085018e81529786018755958a528351600486027fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a881019190915592517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a9840155517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2aa83015594517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2ab9091015587875260088652848720829055600b865284872087805286528487208c9055845197885294870192909252918501899052939192917f5fe2c40955fb42111954fb4f898e4db4998d64ebaae1c872141ff1943990418a910160405180910390a15050505b506126706001600555565b505050565b600060405180610100016040528084600001516001600160a01b031681526020018460200151815260200184604001516001600160a01b0316815260200184606001518152602001846080015181526020018460a001516001600160a01b031681526020018360000151815260200183602001518152506040516020016126fc9190614bcc565b6040516020818303038152906040528051906020012090509392505050565b600a818154811061272b57600080fd5b60009182526020909120600490910201805460018201546002830154600390930154919350919084565b60005460ff16156127a85760405162461bcd60e51b815260206004820181905260248201527f496e697469616c697a65643a20416c726561647920696e697469616c697a65646044820152606401610efe565b6127ba6000805460ff19166001179055565b6127c382600e55565b6127cc81600f55565b5050565b60606000826001600160401b038111156127ec576127ec613f27565b604051908082528060200260200182016040528015612815578160200160208202803683370190505b50905060005b8381101561289057612854858583818110612838576128386148ae565b9050602002013560009081526003602052604090205460ff1690565b1561287e57600182828151811061286d5761286d6148ae565b911515602092830291909101909101525b8061288881614901565b91505061281b565b509392505050565b6128a0613dfe565b6128a8613e1c565b6128b0613dfe565b50506040805180820182528351815260208085015181830152825160808082018552868501518286019081526060808901519084015282528451808601865290870151815260a08701518184015281830152835180850190945260c0860151845260e0909501519083015293909150565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015612968573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061298c91906148e8565b90508181106129ae576129a96001600160a01b0385168484612cde565b6129e3565b6040516340c10f1960e01b81526001600160a01b038481166004830152602482018490528516906340c10f1990604401611287565b50505050565b6129f68585858585612d41565b600083602001511315612ac057600f5483602001511115612a6c5760405162461bcd60e51b815260206004820152602a60248201527f616d6f756e74206973206c6172676572207468616e206d6178696d756d4465706044820152691bdcda5d105b5bdd5b9d60b21b6064820152608401610efe565b856001600160a01b03168360a001516001600160a01b031603612aab576020830151612aa6906001600160a01b0388169033903090612f48565b612ac0565b612abe8360a00151878560200151611397565b505b600083602001511215612c125782516001600160a01b0316612b245760405162461bcd60e51b815260206004820152601e60248201527f43616e277420776974686472617720746f207a65726f206164647265737300006044820152606401610efe565b600e548360200151612b3590614a28565b1015612b975760405162461bcd60e51b815260206004820152602b60248201527f616d6f756e74206973206c657373207468616e206d696e696d616c576974686460448201526a1c985dd85b105b5bdd5b9d60aa1b6064820152608401610efe565b856001600160a01b03168360a001516001600160a01b031603612bd557612bd08684600001518560200151612bcb90614a28565b612921565b612bf1565b612bf1868460a001518560000151866020015161068c90614a28565b608083015115612c1257612c12836080015184600001518560400151612f80565b606083015115612c2f57612c2f86846040015185606001516130d6565b6111568282613164565b80600001516001600160a01b03167f2c1ca5c14df2aba59d26842c5ff53f6817052ef34f6f7537f8b4c9e3805a5e508260200151604051612c7a9190614c77565b60405180910390a250565b600260055403612cd75760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610efe565b6002600555565b6040516001600160a01b03831660248201526044810182905261267090849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613367565b6000612d4e858584612675565b905060005b836040015151811015612dee57612d9684604001518281518110612d7957612d796148ae565b602002602001015160009081526003602052604090205460ff1690565b15612ddc5760405162461bcd60e51b8152602060048201526016602482015275125b9c1d5d081a5cc8185b1c9958591e481cdc195b9d60521b6044820152606401610efe565b80612de681614901565b915050612d53565b50612e197f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182614c91565b8360a0015114612e6b5760405162461bcd60e51b815260206004820152601c60248201527f496e636f72726563742065787465726e616c20646174612068617368000000006044820152606401610efe565b612e7d84602001518560600151610fd0565b836080015114612ec75760405162461bcd60e51b8152602060048201526015602482015274125b9d985b1a59081c1d589b1a58c8185b5bdd5b9d605a1b6044820152606401610efe565b612ed386868585613439565b60005b836040015151811015612f3f5760016003600086604001518481518110612eff57612eff6148ae565b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055508080612f3790614901565b915050612ed6565b50505050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526129e39085906323b872dd60e01b90608401612d0a565b823414612fe85760405162461bcd60e51b815260206004820152603060248201527f496e636f727265637420726566756e6420616d6f756e7420726563656976656460448201526f08189e481d1a194818dbdb9d1c9858dd60821b6064820152608401610efe565b6000826001600160a01b03168460405160006040518083038185875af1925050503d8060008114613035576040519150601f19603f3d011682016040523d82523d6000602084013e61303a565b606091505b50509050806129e3576000826001600160a01b03168560405160006040518083038185875af1925050503d8060008114613090576040519150601f19603f3d011682016040523d82523d6000602084013e613095565b606091505b5050905080611b995760405162461bcd60e51b815260206004820152600d60248201526c1499599d5b990819985a5b1959609a1b6044820152606401610efe565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa15801561311d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061314191906148e8565b905081156129e3578181106129ae576129a96001600160a01b0385168484612cde565b6060820151805160209091015161317b91906136bd565b5060608201517f8646243b1f3099f7f0c30af0d00cb712e1cc160b88e861c647f19d2f38eef573906000602002015160006002306001600160a01b0316630eb7606f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156131ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132109190614ca5565b61321a91906148c4565b845160405161322c9493929190614cc2565b60405180910390a160608201517f8646243b1f3099f7f0c30af0d00cb712e1cc160b88e861c647f19d2f38eef573906001602002015160006001306001600160a01b0316630eb7606f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156132a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132c89190614ca5565b6132d291906148c4565b84602001516040516132e79493929190614cc2565b60405180910390a160005b826040015151811015612670577f9218fa47e982bf1ded9b6823b77dbac4a5db62fc73f8efc325c7de424a41180283604001518281518110613336576133366148ae565b602002602001015160405161334d91815260200190565b60405180910390a18061335f81614901565b9150506132f2565b60006133bc826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166138b89092919063ffffffff16565b80519091501561267057808060200190518101906133da9190614aeb565b6126705760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610efe565b8160400151516002148061345257508160400151516010145b61349e5760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964206e756d626572206f6620696e7075747300000000000000006044820152606401610efe565b6040820151516002146000808261355457604051637d6c5ceb60e01b8152739a9f2ccfde556a7e9ff0848998aa4a0cfd8863ae90637d6c5ceb9061350a9088908a907f000000000000000000000000000000000000000000000000000000000000000190600401614ced565b600060405180830381865af4158015613527573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261354f9190810190614dbc565b6135f4565b60405163156293fb60e31b8152739a9f2ccfde556a7e9ff0848998aa4a0cfd8863ae9063ab149fd8906135af9088908a907f000000000000000000000000000000000000000000000000000000000000000190600401614ced565b600060405180830381865af41580156135cc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526135f49190810190614dbc565b9150915061360181611c8b565b6136455760405162461bcd60e51b8152602060048201526015602482015274496e76616c69642076616e63686f7220726f6f747360581b6044820152606401610efe565b6136718783857f00000000000000000000000000000000000000000000000000000000000000016138c7565b612f3f5760405162461bcd60e51b815260206004820152601960248201527f496e76616c6964207472616e73616374696f6e2070726f6f66000000000000006044820152606401610efe565b60008281526004602052604081205460ff16156136ec5760405162461bcd60e51b8152600401610efe90614eb4565b60008281526004602052604090205460ff161561371b5760405162461bcd60e51b8152600401610efe90614eb4565b600061373a6040518060400160405280868152602001858152506139d7565b60008581526004602081815260408084208054600160ff19918216811790925589865294829020805490951617909355825163ba70f75760e01b81529251939450309363ba70f7579380840193908290030181865afa1580156137a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137c591906148e8565b6040805163ffffffff8416815242602082015286917f0eb4c02013d417d0ed2dbca4ad4c749718452bf34902768ad51eb049799a217f910160405180910390a3306001600160a01b031663ba70f7576040518163ffffffff1660e01b8152600401602060405180830381865afa158015613843573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061386791906148e8565b837f0eb4c02013d417d0ed2dbca4ad4c749718452bf34902768ad51eb049799a217f613894846001614b26565b6040805163ffffffff90921682524260208301520160405180910390a39392505050565b60606115be84846000856139ea565b600080858060200190518101906138de9190614ef5565b905060008060006138ee84612898565b9250925092506000601060009054906101000a90046001600160a01b03166001600160a01b0316638041ca538585858d8c8e6040518763ffffffff1660e01b815260040161394196959493929190614f4c565b602060405180830381865afa15801561395e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139829190614aeb565b9050806139ca5760405162461bcd60e51b815260206004820152601660248201527524b73b30b634b2103bb4ba34323930bb90383937b7b360511b6044820152606401610efe565b9998505050505050505050565b805160208201516000916110c791613ac5565b606082471015613a4b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610efe565b600080866001600160a01b03168587604051613a679190614fa8565b60006040518083038185875af1925050503d8060008114613aa4576040519150601f19603f3d011682016040523d82523d6000602084013e613aa9565b606091505b5091509150613aba87838387613d60565b979650505050505050565b60105460009063ffffffff600160c01b8204811691613aee91600160e01b9091041660026150d5565b63ffffffff168163ffffffff1603613b615760405162461bcd60e51b815260206004820152603060248201527f4d65726b6c6520747265652069732066756c6c2e204e6f206d6f7265206c656160448201526f1d995cc818d85b88189948185919195960821b6064820152608401610efe565b6000613b6e6002836150ea565b90506000613b7c86866112bf565b905060008060015b60105463ffffffff600160e01b90910481169082161015613c9257613baa600286614b59565b63ffffffff16600003613c4b57601154604051631d052ab160e31b815263ffffffff831660048201528594506001600160a01b039091169063e829558890602401602060405180830381865afa158015613c08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c2c91906148e8565b63ffffffff821660009081526002602052604090208590559150613c67565b63ffffffff811660009081526002602052604090205492508391505b613c7183836112bf565b9350613c7e6002866150ea565b945080613c8a8161510d565b915050613b84565b50601054600090601e90613cb490600160a01b900463ffffffff166001614b26565b613cbe9190614b59565b6010805463ffffffff60a01b1916600160a01b63ffffffff8416021790559050613ce9866002614b26565b6010805463ffffffff60c01b1916600160c01b63ffffffff93841681029190911791829055604080518082018252978852910482166020808801918252938316600090815260019485905291909120955186555194909101805463ffffffff19169490911693909317909255509195945050505050565b60608315613dcf578251600003613dc8576001600160a01b0385163b613dc85760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610efe565b50816115be565b6115be8383815115613de45781518083602001fd5b8060405162461bcd60e51b8152600401610efe9190614c77565b60405180604001604052806002906020820280368337509192915050565b60405180604001604052806002905b613e33613dfe565b815260200190600190039081613e2b5790505090565b6020808252825182820181905260009190848201906040850190845b81811015613e8157835183529284019291840191600101613e65565b50909695505050505050565b600060208284031215613e9f57600080fd5b5035919050565b63ffffffff81168114611c8857600080fd5b60008060408385031215613ecb57600080fd5b823591506020830135613edd81613ea6565b809150509250929050565b60008060408385031215613efb57600080fd5b50508035926020909101359150565b600060208284031215613f1c57600080fd5b81356110c181613ea6565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715613f5f57613f5f613f27565b60405290565b60405160c081016001600160401b0381118282101715613f5f57613f5f613f27565b60405161010081016001600160401b0381118282101715613f5f57613f5f613f27565b604051601f8201601f191681016001600160401b0381118282101715613fd257613fd2613f27565b604052919050565b6001600160a01b0381168114611c8857600080fd5b60006001600160401b0382111561400857614008613f27565b50601f01601f191660200190565b600082601f83011261402757600080fd5b813561403a61403582613fef565b613faa565b81815284602083860101111561404f57600080fd5b816020850160208301376000918101602001919091529392505050565b60006040828403121561407e57600080fd5b614086613f3d565b9050813561409381613fda565b815260208201356001600160401b038111156140ae57600080fd5b6140ba84828501614016565b60208301525092915050565b600060c082840312156140d857600080fd5b6140e0613f65565b905081356140ed81613fda565b815260208281013590820152604082013561410781613fda565b80604083015250606082013560608201526080820135608082015260a082013561413081613fda565b60a082015292915050565b60006001600160401b0382111561415457614154613f27565b5060051b60200190565b600082601f83011261416f57600080fd5b8135602061417f6140358361413b565b82815260059290921b8401810191818101908684111561419e57600080fd5b8286015b848110156141b957803583529183019183016141a2565b509695505050505050565b600082601f8301126141d557600080fd5b6141dd613f3d565b8060408401858111156141ef57600080fd5b845b818110156142095780358452602093840193016141f1565b509095945050505050565b600060e0828403121561422657600080fd5b61422e613f65565b905081356001600160401b038082111561424757600080fd5b61425385838601614016565b8352602084013591508082111561426957600080fd5b61427585838601614016565b6020840152604084013591508082111561428e57600080fd5b5061429b8482850161415e565b6040830152506142ae83606084016141c4565b606082015260a0820135608082015260c082013560a082015292915050565b6000604082840312156142df57600080fd5b6142e7613f3d565b905081356001600160401b038082111561430057600080fd5b61430c85838601614016565b8352602084013591508082111561432257600080fd5b506140ba84828501614016565b600080600080600080610160878903121561434957600080fd5b86356001600160401b038082111561436057600080fd5b61436c8a838b0161406c565b9750602089013591508082111561438257600080fd5b61438e8a838b01614016565b965060408901359150808211156143a457600080fd5b6143b08a838b01614016565b95506143bf8a60608b016140c6565b94506101208901359150808211156143d657600080fd5b6143e28a838b01614214565b93506101408901359150808211156143f957600080fd5b5061440689828a016142cd565b9150509295509295509295565b6000806000806080858703121561442957600080fd5b843561443481613fda565b9350602085013561444481613fda565b9250604085013561445481613fda565b9396929550929360600135925050565b60008060006060848603121561447957600080fd5b833561448481613fda565b9250602084013561449481613fda565b929592945050506040919091013590565b600080604083850312156144b857600080fd5b82356144c381613fda565b91506020830135613edd81613ea6565b602080825282518282018190526000919060409081850190868401855b8281101561452a578151805185528681015187860152858101518686015260609081015190850152608090930192908501906001016144f0565b5091979650505050505050565b6000806000806000610140868803121561455057600080fd5b85356001600160401b038082111561456757600080fd5b61457389838a01614016565b9650602088013591508082111561458957600080fd5b61459589838a01614016565b95506145a48960408a016140c6565b94506101008801359150808211156145bb57600080fd5b6145c789838a01614214565b93506101208801359150808211156145de57600080fd5b506145eb888289016142cd565b9150509295509295909350565b60006020828403121561460a57600080fd5b81356001600160401b0381111561462057600080fd5b6110c38482850161406c565b60006020828403121561463e57600080fd5b81356001600160401b0381111561465457600080fd5b6110c38482850161415e565b60008060006060848603121561467557600080fd5b83359250602084013561449481613ea6565b6000806000610100848603121561469d57600080fd5b83356001600160401b03808211156146b457600080fd5b6146c087838801614016565b94506146cf87602088016140c6565b935060e08601359150808211156146e557600080fd5b506146f2868287016142cd565b9150509250925092565b6000806020838503121561470f57600080fd5b82356001600160401b038082111561472657600080fd5b818501915085601f83011261473a57600080fd5b81358181111561474957600080fd5b8660208260051b850101111561475e57600080fd5b60209290920196919550909350505050565b6020808252825182820181905260009190848201906040850190845b81811015613e8157835115158352928401929184019160010161478c565b60006101008083850312156147be57600080fd5b83601f8401126147cd57600080fd5b6147d5613f87565b9083019080858311156147e757600080fd5b845b838110156148015780358352602092830192016147e9565b5095945050505050565b8060005b60028110156129e357815184526020938401939091019060010161480f565b8060005b60028110156129e35761484684835161480b565b6040939093019260209190910190600101614832565b610100810161486b828661480b565b614878604083018561482e565b6115be60c083018461480b565b634e487b7160e01b600052601160045260246000fd5b808201808211156110c7576110c7614885565b634e487b7160e01b600052603260045260246000fd5b63ffffffff8281168282160390808211156148e1576148e1614885565b5092915050565b6000602082840312156148fa57600080fd5b5051919050565b60006001820161491357614913614885565b5060010190565b60208082526019908201527f73656e646572206973206e6f74207468652068616e646c657200000000000000604082015260600190565b60208082526023908201527f50726f706f73616c4e6f6e6365547261636b65723a20496e76616c6964206e6f6040820152626e636560e81b606082015260800190565b6020808252603a908201527f50726f706f73616c4e6f6e6365547261636b65723a204e6f6e6365206d75737460408201527f206e6f7420696e6372656d656e74206d6f7265207468616e2031000000000000606082015260800190565b6020808252601c908201527f496e697469616c697a65643a204e6f7420696e697469616c697a656400000000604082015260600190565b6000600160ff1b8201614a3d57614a3d614885565b5060000390565b81810360008312801583831316838312821617156148e1576148e1614885565b818103818111156110c7576110c7614885565b600063ffffffff821680614a8d57614a8d614885565b6000190192915050565b805160208201516001600160d01b03198082169291906006831015614ac65780818460060360031b1b83161693505b505050919050565b600060208284031215614ae057600080fd5b81516110c181613fda565b600060208284031215614afd57600080fd5b815180151581146110c157600080fd5b60ff81811683821601908111156110c7576110c7614885565b63ffffffff8181168382160190808211156148e1576148e1614885565b634e487b7160e01b600052601260045260246000fd5b600063ffffffff80841680614b7057614b70614b43565b92169190910692915050565b60005b83811015614b97578181015183820152602001614b7f565b50506000910152565b60008151808452614bb8816020860160208601614b7c565b601f01601f19169290920160200192915050565b6020815260018060a01b0382511660208201526020820151604082015260006040830151614c0560608401826001600160a01b03169052565b5060608301516080830152608083015160a083015260a0830151614c3460c08401826001600160a01b03169052565b5060c08301516101008060e0850152614c51610120850183614ba0565b915060e0850151601f198584030182860152614c6d8382614ba0565b9695505050505050565b602081526000614c8a6020830184614ba0565b9392505050565b600082614ca057614ca0614b43565b500690565b600060208284031215614cb757600080fd5b81516110c181613ea6565b84815283602082015263ffffffff83166040820152608060608201526000614c6d6080830184614ba0565b606081526000845160e06060840152614d0a610140840182614ba0565b9050602080870151605f1980868503016080870152614d298483614ba0565b60408a015187820390920160a088015281518082529184019450600092508301905b80831015614d6b5784518252938301936001929092019190830190614d4b565b5060608901519350614d8060c087018561480b565b608089015161010087015260a089015161012087015285810383870152614da78189614ba0565b9450505050506115be604083018460ff169052565b60008060408385031215614dcf57600080fd5b82516001600160401b0380821115614de657600080fd5b818501915085601f830112614dfa57600080fd5b81516020614e0a61403583613fef565b8281528882848701011115614e1e57600080fd5b614e2d83838301848801614b7c565b87820151909650935082841115614e4357600080fd5b838701935087601f850112614e5757600080fd5b83519250614e676140358461413b565b83815260059390931b8401810192818101925088841115614e8757600080fd5b938101935b83851015614ea557845183529381019391810191614e8c565b80955050505050509250929050565b60208082526021908201527f54686520636f6d6d69746d656e7420686173206265656e207375626d697474656040820152601960fa1b606082015260800190565b6000610100808385031215614f0957600080fd5b83601f840112614f1857600080fd5b614f20613f87565b908301908085831115614f3257600080fd5b845b83811015614801578051835260209283019201614f34565b6000610160614f5b838a61480b565b614f68604084018961482e565b614f7560c084018861480b565b80610100840152614f8881840187614ba0565b60ff95909516610120840152505090151561014090910152949350505050565b60008251614fba818460208701614b7c565b9190910192915050565b600181815b80851115615001578163ffffffff04821115614fe757614fe7614885565b80851615614ff457918102915b93841c9390800290614fc9565b509250929050565b600082615018575060016110c7565b81615025575060006110c7565b816001811461503b576002811461504557615076565b60019150506110c7565b60ff84111561505657615056614885565b6001841b915063ffffffff82111561507057615070614885565b506110c7565b5060208310610133831016604e8410600b84101617156150ad575081810a63ffffffff8111156150a8576150a8614885565b6110c7565b6150b78383614fc4565b8063ffffffff048211156150cd576150cd614885565b029392505050565b600063ffffffff6110c3818516828516615009565b600063ffffffff8084168061510157615101614b43565b92169190910492915050565b600063ffffffff80831681810361512657615126614885565b600101939250505056fea264697066735822122084213f9a103f30b6bd1a15d636cac2dec283c138385757b885a30156ad002e1564736f6c63430008120033","storage":{"0x0":"0x1","0x5":"0x1","0x6":"0x2","0x7":"0xe7f1725e7734ce288f8367e1bb143e90bb3f0512","0xe":"0x0","0xf":"0xd3c21bcecceda1000000","0x10":"0x1e00000000000000000dcd1bf9a1b36ce34237eeafef220932846bcd82","0x11":"0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6","0x353061a88c0592f32d7468be32ff6e5e91e49a3ea3ffb3c4fbe417c36501ba2":"0x20c6b400d0ea1b15435703c31c31ee63ad7ba5c8da66cec2796feacea575abca","0x20de3dd312970f46a1d560f6c70f0e5bd10e638b9bb3836368f28838c607ea3e":"0x1617eaae5064f26e8f8a6493ae92bfded7fde71b65df1ca6d5dcec0df70b2cef","0x2cc0eb4b3ec5bf92d601b8938793073ef9a83f91d7e5985435824ae87524336a":"0x2ddb991be1f028022411b4c4d2c22043e5e751c120736f00adf54acab1c9ac14","0x328b8e687a0a963892a735f0237cb763bbbbf8ba0c1dfe2c221debb32c4bbd89":"0x9589ddb438723f53a8e57bdada7c5f8ed67e8fece3889a73618732965645eec","0x38378c408f71c9e5f35d8db763a45d2b35da16f98182f9f4d54306cbd58c0a09":"0x2328068c6a8c24265124debd8fe10d3f29f0665ea725a65e3638f6192a96a013","0x3a5ea591190eeb3f8fcdced843c78df04ec0dfd42f5510375207515664fa0a75":"0x1184e11836b4c36ad8238a340ecc0985eeba665327e33e9b0e3641027c27620d","0x44f9494ddace41673149b1ce2120e2a8dc5880bba93ff68e6b6c883c57a0c695":"0x16fdb637c2abf9c0f988dbf2fd64258c46fb6a273d537b2cf1603ea460b13279","0x4a5bded210bb862fae2c0d18b9d29bf7f88b08a75dd1594b1369abc7881e3fe1":"0x11cf2e2887aa21963a6ec14289183efe4d4c60f14ecd3d6fe0beebdf855a9b63","0x50d9dffd10eb4437a15e8bb1c50afee98ea231805f136fb9a057e7aaeec448ae":"0x2b0f6fc0179fa65b6f73627c0e1e84c7374d2eaec44c9a48f2571393ea77bcbb","0x59dd4b18488d12f51eda69757a0ed42a2010c14b564330cc74a06895e60c077b":"0x1733dece17d71190516dbaf1927936fa643dc7079fc0cc731de9d6845a47741f","0x679795a0195a1b76cdebb7c51d74e058aee92919b8c3389af86ef24535e8a28c":"0x217126fa352c326896e8c2803eec8fd63ad50cf65edfef27a41a9e32dc622765","0x7352bc45c8aa6995480780fe15a07c4daa795263b5e7a9d04d9ed979c93ca85e":"0x202d1ae61526f0d0d01ef80fb5d4055a7af45721024c2c24cffd6a3798f54d50","0x82fb8bdd0a53542a1f59046c16f7a1350c43d22db36425bb53f551e7c6a09181":"0x23ab323453748129f2765f79615022f5bebd6f4096a796300aab049a60b0f187","0x88601476d11616a71c5be67555bd1dff4b1cbf21533d2669b768b61518cfe1c3":"0xe28a61a9b3e91007d5a9e3ada18e1b24d6d230c618388ee5df34cacd7397eee","0x9542868bcbb5bd2ea274742292a8fd9233b9d5ee15ffeb027d991190493290d8":"0x16ace1a65b7534142f8cc1aad810b3d6a7a74ca905d9c275cb98ba57e509fc10","0xa4e0f4432e44d027a7b3f953940f096bca7a9bd910297cad2ba7c703c2b799d3":"0x64b6a738a5ff537db7b220f3394f0ecbd35bfd355c5425dc1166bf3236079b","0xa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49":"0x23ab323453748129f2765f79615022f5bebd6f4096a796300aab049a60b0f187","0xa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb4a":"0x0","0xab9952baf6478d8cfb7253ce86a6c53a7b7549582c76210b1581ae682b7e556f":"0x280bc02145c155d5833585b6c7b08501055157dd30ce005319621dc462d33b47","0xac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b":"0x2fe54c60d3acabf3343a35b6eba15db4821b340f76e741e2249685ed4899af6c","0xacd8ef244210bb6898e73c48bf820ed8ecc857a3bab8d79c10e4fa92b1e9ca65":"0x267855a7dc75db39d81d17f95d0a7aa572bf5ae19f4db0e84221d2b2ef999219","0xad2d52b8047a96778c45f477dabddaae71b5ff6b355ac44a03c9522a54a18a26":"0x113798410eaeb95056a464f70521eb58377c0155f2fe518a5594d38cc209cc0","0xb98b78633099fa36ed8b8680c4f8092689e1e04080eb9cbb077ca38a14d7e384":"0x194191edbfb91d10f6a7afd315f33095410c7801c47175c2df6dc2cce0e3affc","0xbd814762a7e35d5c162a7570d14baa68bd622cabb1ad83d40dd70f8a88aa67c0":"0x45132221d1fa0a7f4aed8acd2cbec1e2189b7732ccb2ec272b9c60f0d5afc5b","0xc0c7c7c9a2a6655862feea3cc7ff13629582293fcfe0e1094efb20897bb02a65":"0x95de56281b1d5055e897c3574ff790d5ee81dbc5df784ad2d67795e557c9e9f","0xd3604db978f6137b0d18816b77b2ce810487a3af08a922e0b184963be5f3adfc":"0x2eecc0de814cfd8c57ce882babb2e30d1da56621aef7a47f3291cffeaec26ad7","0xe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0":"0x13e37f2d6cb86c78ccc1788607c2b199788c6bb0a615a21f2e7a8e88384222f8","0xeb5d92aa5b18af35c2d0c0d14a538792cf1a66aa06ab9dae49d32446e9063ca1":"0x27f427ccbf58a44b1270abbe4eda6ba53bd6ac4d88cf1e00a13c4371ce71d366","0xee60d0579bcffd98e668647d59fec1ff86a7fb340ce572e844f234ae73a6918f":"0x27953447a6979839536badc5425ed15fadb0e292e9bc36f92f0aa5cfa5013587","0xf3118d41e0deec621ee3de85ec11bfcf8aee617b34cd0b5f1496acc8de2cbdcc":"0x2784f8220b1c963e468f590f137baaa1625b3b92a27ad9b6e84eb0d3454d9962","0xf85cc6ffc513dc6cf7d199ef87b7a63cf9defe62251c1c247cd12f1eec7bff29":"0x702ab83a135d7f55350ab1bfaa90babd8fc1d2b3e6a7215381a7b2213d6c5ce","0xfa3bcae139a60d3922021a29633a6c8687b9ba7e920e2516b2cfd8f5fd3e0e51":"0x21bbd7e944f6124dad4c376df9cc12e7ca66e47dff703ff7cedb1a454edcf0ff"}},"0x70997970c51812dc3a010c7d01b50e0d17dc79c8":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x71be63f3384f5fb98995898a86b02fb2426c5788":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x8626f6940e2eb28930efb4cef49b2d1f2c9c1199":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x8a791620dd6260079bf849dc5567adc3f2fdc318":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063c542c93b14610030575b600080fd5b61004361003e366004611358565b610057565b604051901515815260200160405180910390f35b600061006161116b565b60408051808201825287518152602080890151818301529083528151608081018352875151818401908152885183015160608301528152825180840184528883018051518252518301518184015281830152838201528151808301835286518152868201518183015283830152815160098082526101408201909352600092909182016101208036833701905050905060005b60098110156101435784816009811061010f5761010f611436565b602002015182828151811061012657610126611436565b60209081029190910101528061013b81611462565b9150506100f4565b5061014e818361016f565b60000361016057600192505050610167565b6000925050505b949350505050565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018161019b610366565b9050806080015151855160016101b1919061147b565b146101f85760405162461bcd60e51b81526020600482015260126024820152711d995c9a599a595c8b5898590b5a5b9c1d5d60721b60448201526064015b60405180910390fd5b604080518082019091526000808252602082018190525b86518110156102e9578387828151811061022b5761022b611436565b6020026020010151106102805760405162461bcd60e51b815260206004820152601f60248201527f76657269666965722d6774652d736e61726b2d7363616c61722d6669656c640060448201526064016101ef565b6102d5826102d08560800151846001610299919061147b565b815181106102a9576102a9611436565b60200260200101518a85815181106102c3576102c3611436565b6020026020010151610aba565b610b50565b9150806102e181611462565b91505061020f565b5061031281836080015160008151811061030557610305611436565b6020026020010151610b50565b90506103486103248660000151610be9565b8660200151846000015185602001518587604001518b604001518960600151610c88565b6103585760019350505050610360565b600093505050505b92915050565b61036e6111bc565b6040805180820182527f2d4d9aa7e302d9df41749d5507949d05dbea33fbb16c643b22f599a2be6df2e281527f14bedd503c37ceb061d8ec60209fe345ce89830a19230301f076caff004d19266020808301919091529083528151608080820184527f0967032fcbf776d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c8285019081527f0e187847ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab606080850191909152908352845180860186527f304cfbd1e08a704a99f5e847d93f8c3caafddec46b7a0d379da69a4d112346a781527f1739c1b1a457a8c7313123d24d2f9192f896b7c63eea05a9d57f06547ad0cec8818601528385015285840192909252835180820185527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c28186019081527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed828501528152845180860186527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b81527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa818601528185015285850152835190810184527f0cc1fef90dc5ef1d150879becb97b17bfc6787ccf765201fd41d7ea4f8fd930e8185019081527f073ec54de5f3288dd532ec4bbd73ab8679b3370f0c16ee025e2cdb1e69babdbc828401528152835180850185527f1d2fe70c81acf899225546e516a0c6175700e288c9ee2da62927fa6834cbbf9d81527f275b46aa5657f9bd345fb843c229fd788083cf14e530b141759f07bd47c5b2348185015281840152908401528151600a8082526101608201909352919082015b60408051808201909152600080825260208201528152602001906001900390816105ea57505060808201908152604080518082019091527f15d511e4540e6c3ce640aacf91d983375d6dde4d522ed8e9d590f0d97538f9a081527f211bde556fe7889be081f2992d820c45de2908743311350f73773e20bd228f4260208201529051805160009061067d5761067d611436565b602002602001018190525060405180604001604052807f07e48a305a5fd6ab9740b7b1e1e446b22644ed9d1d0dc3f667a9bbaa02666ec081526020017f021eb27511e58880cb64fee4bfafb6297ea5306b9d01722a0b8b28d8c954dd2e81525081608001516001815181106106f4576106f4611436565b602002602001018190525060405180604001604052807f17521d19d8cd07dab5e845fb4c143e36f991bacf5373ad845d46e8a642cf22c781526020017f058a890cb1234b18247e41d05d55fce183fc4c86dc64e5e056f8d35d33d56c8a815250816080015160028151811061076b5761076b611436565b602002602001018190525060405180604001604052807f26dcdf0ea39c71a519fdffb33f03ec904ffd7820e229c61ab287deaf2011fb7881526020017f1b7391f7e90c2a240852407017f7db0f5cd83d61d5cd41b9f90ad26be30bf7bc81525081608001516003815181106107e2576107e2611436565b602002602001018190525060405180604001604052807f23cd7e5a278f0600921a963c0b5595ef8074d7720d27b2c1c2f60867be19227581526020017f10ab8d8e948237f373c08ab9b7f7ffb1fdfaec9eef750185f1dfcbb83c6c4a85815250816080015160048151811061085957610859611436565b602002602001018190525060405180604001604052807f154d52e042465ff365b2ee4eccd469b9c13e5d6e50f3f3d7ef8db69315e2278e81526020017f0527c8895ddf937f12b2c4023c40cba0e956294fad14a9c987f995b73cdb9f0e81525081608001516005815181106108d0576108d0611436565b602002602001018190525060405180604001604052807f236bd21deadef35aa21cc11442aad4b15e7993db9734a78862173f1960997f0281526020017f207d652edb8989c554a9a73e29ef1728134744181ea0714ff43a1b80fd7e53b1815250816080015160068151811061094757610947611436565b602002602001018190525060405180604001604052807f196dcfa39a9e220e40d2fd3fdde799423ac4e7d808eb1d3595fa8f495c2fe75181526020017f2553f9ef7f527b5f3dba1554163f766c49f0c89a6d705b0f8166378a23403ddd81525081608001516007815181106109be576109be611436565b602002602001018190525060405180604001604052807f1f7429b100880e3451f1d4690f6d18485295cd6428b889e3fa3767901bae5bef81526020017f09a8c2ea70095902ef68a0d3c7bf1b53768d7e85fdc6ec8b5adfec386c1aaff88152508160800151600881518110610a3557610a35611436565b602002602001018190525060405180604001604052807f2fb89c5d428feb02dc1baabddb5fc4a24d6c0639df4623f5ce190b4ee6bcacda81526020017f175ce26e907ec1595f1c49b542f966067cd32e5bcbe22e4b971e890bc6e8ebbd8152508160800151600981518110610aac57610aac611436565b602002602001018190525090565b6040805180820190915260008082526020820152610ad661120d565b835181526020808501519082015260408101839052600060608360808460076107d05a03fa90508080610b0557fe5b5080610b485760405162461bcd60e51b81526020600482015260126024820152711c185a5c9a5b99cb5b5d5b0b59985a5b195960721b60448201526064016101ef565b505092915050565b6040805180820190915260008082526020820152610b6c61122b565b8351815260208085015181830152835160408301528301516060808301919091526000908360c08460066107d05a03fa90508080610ba657fe5b5080610b485760405162461bcd60e51b81526020600482015260126024820152711c185a5c9a5b99cb5859190b59985a5b195960721b60448201526064016101ef565b604080518082019091526000808252602082015281517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4790158015610c3057506020830151155b15610c505750506040805180820190915260008082526020820152919050565b604051806040016040528084600001518152602001828560200151610c75919061148e565b610c7f90846114b0565b90529392505050565b60408051600480825260a08201909252600091829190816020015b6040805180820190915260008082526020820152815260200190600190039081610ca357505060408051600480825260a0820190925291925060009190602082015b610ced611249565b815260200190600190039081610ce55790505090508a82600081518110610d1657610d16611436565b60200260200101819052508882600181518110610d3557610d35611436565b60200260200101819052508682600281518110610d5457610d54611436565b60200260200101819052508482600381518110610d7357610d73611436565b60200260200101819052508981600081518110610d9257610d92611436565b60200260200101819052508781600181518110610db157610db1611436565b60200260200101819052508581600281518110610dd057610dd0611436565b60200260200101819052508381600381518110610def57610def611436565b6020026020010181905250610e048282610e13565b9b9a5050505050505050505050565b60008151835114610e5f5760405162461bcd60e51b81526020600482015260166024820152751c185a5c9a5b99cb5b195b99dd1a1ccb59985a5b195960521b60448201526064016101ef565b82516000610e6e8260066114c3565b905060008167ffffffffffffffff811115610e8b57610e8b6112a5565b604051908082528060200260200182016040528015610eb4578160200160208202803683370190505b50905060005b838110156110ef57868181518110610ed457610ed4611436565b60200260200101516000015182826006610eee91906114c3565b610ef990600061147b565b81518110610f0957610f09611436565b602002602001018181525050868181518110610f2757610f27611436565b60200260200101516020015182826006610f4191906114c3565b610f4c90600161147b565b81518110610f5c57610f5c611436565b602002602001018181525050858181518110610f7a57610f7a611436565b6020908102919091010151515182610f938360066114c3565b610f9e90600261147b565b81518110610fae57610fae611436565b602002602001018181525050858181518110610fcc57610fcc611436565b60209081029190910181015151015182610fe78360066114c3565b610ff290600361147b565b8151811061100257611002611436565b60200260200101818152505085818151811061102057611020611436565b60200260200101516020015160006002811061103e5761103e611436565b60200201518261104f8360066114c3565b61105a90600461147b565b8151811061106a5761106a611436565b60200260200101818152505085818151811061108857611088611436565b6020026020010151602001516001600281106110a6576110a6611436565b6020020151826110b78360066114c3565b6110c290600561147b565b815181106110d2576110d2611436565b6020908102919091010152806110e781611462565b915050610eba565b506110f8611269565b6000602082602086026020860160086107d05a03fa9050808061111757fe5b508061115d5760405162461bcd60e51b81526020600482015260156024820152741c185a5c9a5b99cb5bdc18dbd9194b59985a5b1959605a1b60448201526064016101ef565b505115159695505050505050565b6040805160a081019091526000606082018181526080830191909152815260208101611195611249565b81526020016111b7604051806040016040528060008152602001600081525090565b905290565b6040805160e08101909152600060a0820181815260c08301919091528152602081016111e6611249565b81526020016111f3611249565b8152602001611200611249565b8152602001606081525090565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b604051806040016040528061125c611287565b81526020016111b7611287565b60405180602001604052806001906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156112de576112de6112a5565b60405290565b604051610120810167ffffffffffffffff811182821017156112de576112de6112a5565b600082601f83011261131957600080fd5b6113216112bb565b80604084018581111561133357600080fd5b845b8181101561134d578035845260209384019301611335565b509095945050505050565b60008060008061022080868803121561137057600080fd5b61137a8787611308565b9450604087605f88011261138d57600080fd5b6113956112bb565b8060c089018a8111156113a757600080fd5b838a015b818110156113cc576113bd8c82611308565b845260209093019284016113ab565b508197506113da8b82611308565b9650505050508661011f8701126113f057600080fd5b6113f86112e4565b90860190808883111561140a57600080fd5b61010088015b83811015611428578035835260209283019201611410565b509598949750929550505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016114745761147461144c565b5060010190565b808201808211156103605761036061144c565b6000826114ab57634e487b7160e01b600052601260045260246000fd5b500690565b818103818111156103605761036061144c565b80820281158282048414176103605761036061144c56fea2646970667358221220cdf44d83d73fd9f743a221cd4ec041d15139e968d3fc7be99b3d1a016724058f64736f6c63430008120033","storage":{}},"0x90f79bf6eb2c4f870365e785982e1f101e93b906":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x976ea74026e726554db657fa54763abd0c3a0aa9":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x9965507d1a55bcc2695c58ba16fb37d819b0a4dc":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x9a676e781a523b5d0c0e43731313a708cb607508":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b506004361061007d5760003560e01c8063c54c2a111161005b578063c54c2a11146100fa578063d7f5b35914610123578063e248cff214610136578063ec97d3b41461014957600080fd5b8063318c136e146100825780637f79bea8146100b2578063b8fa3736146100e5575b600080fd5b600054610095906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100d56100c0366004610634565b60036020526000908152604090205460ff1681565b60405190151581526020016100a9565b6100f86100f3366004610656565b610177565b005b610095610108366004610682565b6001602052600090815260409020546001600160a01b031681565b6100f8610131366004610634565b6101cf565b6100f861014436600461069b565b610266565b610169610157366004610634565b60026020526000908152604090205481565b6040519081526020016100a9565b61017f6105a5565b600082815260016020818152604080842080546001600160a01b0319166001600160a01b0387169081179091558452600282528084208690556003909152909120805460ff191690911790555050565b6101d76105a5565b6001600160a01b0381166102445760405162461bcd60e51b815260206004820152602960248201527f48616e646c657248656c706572733a20427269646765206164647265737320636044820152680616e277420626520360bc1b60648201526084015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b61026e6105a5565b60008036816102806020828789610717565b61028991610741565b9350610299602460208789610717565b6102a291610760565b92506102b18560248189610717565b60008981526001602052604090205491935091506001600160a01b0316806301ea8dc760e51b6001600160e01b03198616016103935760006102f66004828688610717565b6102ff91610760565b60e01c90506000610314600660048789610717565b61031d91610790565b604051630615723960e51b815260f09190911c6004820181905263ffffffff8416602483015291506001600160a01b0384169063c2ae4720906044015b600060405180830381600087803b15801561037457600080fd5b505af1158015610388573d6000803e3d6000fd5b50505050505061059a565b6301b42cd760e11b6001600160e01b03198616016104225760006103ba6004828688610717565b6103c391610760565b60e01c905060006103d8601860048789610717565b6103e1916107be565b604051637e4bd32960e11b815260609190911c6004820181905263ffffffff8416602483015291506001600160a01b0384169063fc97a6529060440161035a565b6371daf5e560e11b6001600160e01b03198616016104b15760006104496004828688610717565b61045291610760565b60e01c90506000610467601860048789610717565b610470916107be565b604051630e250a1b60e11b815260609190911c6004820181905263ffffffff8416602483015291506001600160a01b03841690631c4a14369060440161035a565b633e39ec3960e21b6001600160e01b03198616016105405760006104d86004828688610717565b6104e191610760565b60e01c905060006104f6601860048789610717565b6104ff916107be565b6040516301c613c760e21b815260609190911c6004820181905263ffffffff8416602483015291506001600160a01b038416906307184f1c9060440161035a565b60405162461bcd60e51b815260206004820152602960248201527f546f6b656e5772617070657248616e646c65723a20496e76616c69642066756e6044820152686374696f6e2073696760b81b606482015260840161023b565b505050505050505050565b6000546001600160a01b031633146106165760405162461bcd60e51b815260206004820152602e60248201527f48616e646c657248656c706572733a2073656e646572206d757374206265206260448201526d1c9a5919d94818dbdb9d1c9858dd60921b606482015260840161023b565b565b80356001600160a01b038116811461062f57600080fd5b919050565b60006020828403121561064657600080fd5b61064f82610618565b9392505050565b6000806040838503121561066957600080fd5b8235915061067960208401610618565b90509250929050565b60006020828403121561069457600080fd5b5035919050565b6000806000604084860312156106b057600080fd5b83359250602084013567ffffffffffffffff808211156106cf57600080fd5b818601915086601f8301126106e357600080fd5b8135818111156106f257600080fd5b87602082850101111561070457600080fd5b6020830194508093505050509250925092565b6000808585111561072757600080fd5b8386111561073457600080fd5b5050820193919092039150565b8035602083101561075a57600019602084900360031b1b165b92915050565b6001600160e01b031981358181169160048510156107885780818660040360031b1b83161692505b505092915050565b6001600160f01b031981358181169160028510156107885760029490940360031b84901b1690921692915050565b6bffffffffffffffffffffffff1981358181169160148510156107885760149490940360031b84901b169092169291505056fea264697066735822122094b87e64164d0196bb5baacdd3fb65d6f339c391e2bc3c4ff112e0996116e9a264736f6c63430008120033","storage":{"0x0":"0x5fbdb2315678afecb367f032d93f642f64180aa3","0x4fffc04f11d8642ae2ad2d1e6042ca88e3e606ede6fbcb189c8c6d633a0cf480":"0x1","0x82640d74e2f15aa04c9800ef3cb254e350c5c67a421efea2e7e87d484c5cde53":"0xb306bf915c4d645ff596e518faf3f9669b97016","0xfb7270f423c99eb9d1955398a121fe07f9860b406be36a6cef3addbec4213e0a":"0xb306bf915c4d645ff596e518faf3f9669b97016010000001389"}},"0x9a9f2ccfde556a7e9ff0848998aa4a0cfd8863ae":{"nonce":1,"balance":"0x0","code":"0x739a9f2ccfde556a7e9ff0848998aa4a0cfd8863ae30146080604052600436106100615760003560e01c80633408e470146100665780634c830cbd146100795780637d6c5ceb146100985780638b7e8782146100b9578063ab149fd8146100dd575b600080fd5b6040514681526020015b60405180910390f35b6100816100f0565b60405165ffffffffffff9091168152602001610070565b6100ab6100a6366004611276565b61013e565b604051610070929190611388565b6100c4600160f81b81565b6040516001600160f01b03199091168152602001610070565b6100ab6100eb366004611276565b610bf5565b60408051600160f81b602082018190524660e01b6001600160e01b031981166022840152835180840360060181526026909301909352600092916101338161141e565b60d01c935050505090565b606080600061014b6100f0565b65ffffffffffff1690506000610162856001611455565b60ff1667ffffffffffffffff81111561017d5761017d61108d565b6040519080825280602002602001820160405280156101a6578160200160208202803683370190505b50905060608560ff16600103610618576101be611011565b600089600001518060200190518101906101d89190611482565b90508060006020020151846000815181106101f5576101f56114d7565b602090810291909101015280600160200201518460018151811061021b5761021b6114d7565b60209081029190910181019190915260808b0151835260a08b01519083015260408a01518051600090610250576102506114d7565b60200260200101518260026017811061026b5761026b6114d7565b602002015260408a015180516001908110610288576102886114d7565b6020026020010151826003601781106102a3576102a36114d7565b602002015260408a0151805160029081106102c0576102c06114d7565b6020026020010151826004601781106102db576102db6114d7565b602002015260408a0151805160039081106102f8576102f86114d7565b602002602001015182600560178110610313576103136114d7565b602002015260408a015180516004908110610330576103306114d7565b60200260200101518260066017811061034b5761034b6114d7565b602002015260408a015180516005908110610368576103686114d7565b602002602001015182600760178110610383576103836114d7565b602002015260408a0151805160069081106103a0576103a06114d7565b6020026020010151826008601781106103bb576103bb6114d7565b602002015260408a0151805160079081106103d8576103d86114d7565b6020026020010151826009601781106103f3576103f36114d7565b602002015260408a015180516008908110610410576104106114d7565b602002602001015182600a6017811061042b5761042b6114d7565b602002015260408a015180516009908110610448576104486114d7565b602002602001015182600b60178110610463576104636114d7565b602002015260408a01518051600a908110610480576104806114d7565b602002602001015182600c6017811061049b5761049b6114d7565b602002015260408a01518051600b9081106104b8576104b86114d7565b602002602001015182600d601781106104d3576104d36114d7565b602002015260408a01518051600c9081106104f0576104f06114d7565b602002602001015182600e6017811061050b5761050b6114d7565b602002015260408a01518051600d908110610528576105286114d7565b602002602001015182600f60178110610543576105436114d7565b602002015260408a01518051600e908110610560576105606114d7565b60200260200101518260106017811061057b5761057b6114d7565b602002015260408a01518051600f908110610598576105986114d7565b6020026020010151826011601781106105b3576105b36114d7565b6020908102919091019190915260608b0180515161024085015251810151610260840152610280830186905281516102a0840152818101516102c0840152604051610600918491016114ed565b60405160208183030381529060405292505050610be9565b8560ff16600703610b925761062b611030565b600089600001518060200190518101906106459190611522565b9050806000602002015184600081518110610662576106626114d7565b6020908102919091010152806001602002015184600181518110610688576106886114d7565b60209081029190910101528060026020020151846002815181106106ae576106ae6114d7565b60209081029190910101528060036020020151846003815181106106d4576106d46114d7565b60209081029190910101528060046020020151846004815181106106fa576106fa6114d7565b6020908102919091010152806005602002015184600581518110610720576107206114d7565b6020908102919091010152806006602002015184600681518110610746576107466114d7565b602090810291909101015280600760200201518460078151811061076c5761076c6114d7565b60209081029190910181019190915260808b0151835260a08b01519083015260408a015180516000906107a1576107a16114d7565b6020026020010151826002601d81106107bc576107bc6114d7565b602002015260408a0151805160019081106107d9576107d96114d7565b6020026020010151826003601d81106107f4576107f46114d7565b602002015260408a015180516002908110610811576108116114d7565b6020026020010151826004601d811061082c5761082c6114d7565b602002015260408a015180516003908110610849576108496114d7565b6020026020010151826005601d8110610864576108646114d7565b602002015260408a015180516004908110610881576108816114d7565b6020026020010151826006601d811061089c5761089c6114d7565b602002015260408a0151805160059081106108b9576108b96114d7565b6020026020010151826007601d81106108d4576108d46114d7565b602002015260408a0151805160069081106108f1576108f16114d7565b6020026020010151826008601d811061090c5761090c6114d7565b602002015260408a015180516007908110610929576109296114d7565b6020026020010151826009601d8110610944576109446114d7565b602002015260408a015180516008908110610961576109616114d7565b602002602001015182600a601d811061097c5761097c6114d7565b602002015260408a015180516009908110610999576109996114d7565b602002602001015182600b601d81106109b4576109b46114d7565b602002015260408a01518051600a9081106109d1576109d16114d7565b602002602001015182600c601d81106109ec576109ec6114d7565b602002015260408a01518051600b908110610a0957610a096114d7565b602002602001015182600d601d8110610a2457610a246114d7565b602002015260408a01518051600c908110610a4157610a416114d7565b602002602001015182600e601d8110610a5c57610a5c6114d7565b602002015260408a01518051600d908110610a7957610a796114d7565b602002602001015182600f601d8110610a9457610a946114d7565b602002015260408a01518051600e908110610ab157610ab16114d7565b6020026020010151826010601d8110610acc57610acc6114d7565b602002015260408a01518051600f908110610ae957610ae96114d7565b6020026020010151826011601d8110610b0457610b046114d7565b6020908102919091019190915260608b810180515161024086015251820151610260850152610280840187905282516102a0850152828201516102c08501526040808401516102e086015290830151610300850152608083015161032085015260a083015161034085015260c083015161036085015260e08301516103808501525161060091849101611596565b60405162461bcd60e51b815260206004820152602260248201527f56416e63686f72456e636f6465496e707574733a20496e76616c696420656467604482015261657360f01b606482015260840160405180910390fd5b97909650945050505050565b6060806000610c026100f0565b65ffffffffffff1690506000610c19856001611455565b60ff1667ffffffffffffffff811115610c3457610c3461108d565b604051908082528060200260200182016040528015610c5d578160200160208202803683370190505b50905060608560ff16600103610da357610c7561104f565b60008960000151806020019051810190610c8f9190611482565b9050806000602002015184600081518110610cac57610cac6114d7565b6020908102919091010152806001602002015184600181518110610cd257610cd26114d7565b60209081029190910181019190915260808b0151835260a08b01519083015260408a01518051600090610d0757610d076114d7565b602002602001015182600260098110610d2257610d226114d7565b602002015260408a015180516001908110610d3f57610d3f6114d7565b602002602001015182600360098110610d5a57610d5a6114d7565b6020908102919091019190915260608b0180515160808501525181015160a084015260c08301869052815160e084015281810151610100840152604051610600918491016115cb565b8560ff16600703610b9257610db661106e565b60008960000151806020019051810190610dd09190611522565b9050806000602002015184600081518110610ded57610ded6114d7565b6020908102919091010152806001602002015184600181518110610e1357610e136114d7565b6020908102919091010152806002602002015184600281518110610e3957610e396114d7565b6020908102919091010152806003602002015184600381518110610e5f57610e5f6114d7565b6020908102919091010152806004602002015184600481518110610e8557610e856114d7565b6020908102919091010152806005602002015184600581518110610eab57610eab6114d7565b6020908102919091010152806006602002015184600681518110610ed157610ed16114d7565b6020908102919091010152806007602002015184600781518110610ef757610ef76114d7565b60209081029190910181019190915260808b0151835260a08b01519083015260408a01518051600090610f2c57610f2c6114d7565b6020026020010151826002600f8110610f4757610f476114d7565b602002015260408a015180516001908110610f6457610f646114d7565b6020026020010151826003600f8110610f7f57610f7f6114d7565b6020908102919091019190915260608b8101805151608080870191909152905183015160a08087019190915260c08087018a9052855160e080890191909152868601516101008901526040808801516101208a01529487015161014089015292860151610160880152908501516101808701528401516101a08601528301516101c08501525161060091849101611600565b604051806102e001604052806017906020820280368337509192915050565b604051806103a00160405280601d906020820280368337509192915050565b6040518061012001604052806009906020820280368337509192915050565b604051806101e00160405280600f906020820280368337509192915050565b634e487b7160e01b600052604160045260246000fd5b60405160c0810167ffffffffffffffff811182821017156110c6576110c661108d565b60405290565b6040805190810167ffffffffffffffff811182821017156110c6576110c661108d565b604051601f8201601f1916810167ffffffffffffffff811182821017156111185761111861108d565b604052919050565b600082601f83011261113157600080fd5b813567ffffffffffffffff81111561114b5761114b61108d565b61115e601f8201601f19166020016110ef565b81815284602083860101111561117357600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f8301126111a157600080fd5b8135602067ffffffffffffffff8211156111bd576111bd61108d565b8160051b6111cc8282016110ef565b92835284810182019282810190878511156111e657600080fd5b83870192505b84831015611205578235825291830191908301906111ec565b979650505050505050565b600082601f83011261122157600080fd5b6112296110cc565b80604084018581111561123b57600080fd5b845b8181101561125557803584526020938401930161123d565b509095945050505050565b803560ff8116811461127157600080fd5b919050565b60008060006060848603121561128b57600080fd5b833567ffffffffffffffff808211156112a357600080fd5b9085019060e082880312156112b757600080fd5b6112bf6110a3565b8235828111156112ce57600080fd5b6112da89828601611120565b8252506020830135828111156112ef57600080fd5b6112fb89828601611120565b60208301525060408301358281111561131357600080fd5b61131f89828601611190565b6040830152506113328860608501611210565b606082015260a0830135608082015260c083013560a082015280955050602086013591508082111561136357600080fd5b5061137086828701611120565b92505061137f60408501611260565b90509250925092565b604081526000835180604084015260005b818110156113b65760208187018101516060868401015201611399565b50600060608285010152601f19601f82011683019050606081016020606085840301818601528186518084526080850191508288019450600093505b8084101561141257845182529382019360019390930192908201906113f2565b50979650505050505050565b805160208201516001600160d01b0319808216929190600683101561144d5780818460060360031b1b83161693505b505050919050565b60ff818116838216019081111561147c57634e487b7160e01b600052601160045260246000fd5b92915050565b60006040828403121561149457600080fd5b82601f8301126114a357600080fd5b6114ab6110cc565b8060408401858111156114bd57600080fd5b845b818110156112555780518452602093840193016114bf565b634e487b7160e01b600052603260045260246000fd5b60008183825b60178110156115125781518352602092830192909101906001016114f3565b5050506102e08201905092915050565b600061010080838503121561153657600080fd5b83601f84011261154557600080fd5b60405181810181811067ffffffffffffffff821117156115675761156761108d565b60405290830190808583111561157c57600080fd5b845b8381101561125557805182526020918201910161157e565b60008183825b601d8110156115bb57815183526020928301929091019060010161159c565b5050506103a08201905092915050565b60008183825b60098110156115f05781518352602092830192909101906001016115d1565b5050506101208201905092915050565b60008183825b600f811015611625578151835260209283019290910190600101611606565b5050506101e0820190509291505056fea2646970667358221220c42404013d155f86afb83ac13268483ca33383fc018561b99edcda31e03e4e0164736f6c63430008120033","storage":{}},"0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b506004361061007d5760003560e01c8063c54c2a111161005b578063c54c2a11146100fa578063d7f5b35914610123578063e248cff214610136578063ec97d3b41461014957600080fd5b8063318c136e146100825780637f79bea8146100b2578063b8fa3736146100e5575b600080fd5b600054610095906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100d56100c036600461058f565b60036020526000908152604090205460ff1681565b60405190151581526020016100a9565b6100f86100f33660046105b1565b610177565b005b6100956101083660046105dd565b6001602052600090815260409020546001600160a01b031681565b6100f861013136600461058f565b6101cf565b6100f86101443660046105f6565b610266565b61016961015736600461058f565b60026020526000908152604090205481565b6040519081526020016100a9565b61017f610500565b600082815260016020818152604080842080546001600160a01b0319166001600160a01b0387169081179091558452600282528084208690556003909152909120805460ff191690911790555050565b6101d7610500565b6001600160a01b0381166102445760405162461bcd60e51b815260206004820152602960248201527f48616e646c657248656c706572733a20427269646765206164647265737320636044820152680616e277420626520360bc1b60648201526084015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b61026e610500565b60008036816102806020828789610672565b6102899161069c565b9350610299602460208789610672565b6102a2916106bb565b92506102b18560248189610672565b60008981526001602052604090205491935091506001600160a01b031680638d3e52fd60e01b6001600160e01b03198616016103925760006102f66004828688610672565b6102ff916106bb565b60e01c90506000610314601860048789610672565b61031d916106eb565b6040516372c1ad0360e01b815260609190911c6004820181905263ffffffff8416602483015291506001600160a01b038416906372c1ad0390604401600060405180830381600087803b15801561037357600080fd5b505af1158015610387573d6000803e3d6000fd5b5050505050506104f5565b639dd3882760e01b6001600160e01b031986160161049f5760006103b96004828688610672565b6103c2916106bb565b60e01c905060006103d7601860048789610672565b6103e0916106eb565b60601c905060006103f5602c6018888a610672565b6103fe916106eb565b60601c90506000610413604c602c898b610672565b61041c9161069c565b60405163622c77d960e01b81526001600160a01b03858116600483015284811660248301526044820183905263ffffffff871660648301529192509086169063622c77d990608401600060405180830381600087803b15801561047e57600080fd5b505af1158015610492573d6000803e3d6000fd5b50505050505050506104f5565b60405162461bcd60e51b815260206004820152602560248201527f547265617375727948616e646c65723a20496e76616c69642066756e6374696f6044820152646e2073696760d81b606482015260840161023b565b505050505050505050565b6000546001600160a01b031633146105715760405162461bcd60e51b815260206004820152602e60248201527f48616e646c657248656c706572733a2073656e646572206d757374206265206260448201526d1c9a5919d94818dbdb9d1c9858dd60921b606482015260840161023b565b565b80356001600160a01b038116811461058a57600080fd5b919050565b6000602082840312156105a157600080fd5b6105aa82610573565b9392505050565b600080604083850312156105c457600080fd5b823591506105d460208401610573565b90509250929050565b6000602082840312156105ef57600080fd5b5035919050565b60008060006040848603121561060b57600080fd5b83359250602084013567ffffffffffffffff8082111561062a57600080fd5b818601915086601f83011261063e57600080fd5b81358181111561064d57600080fd5b87602082850101111561065f57600080fd5b6020830194508093505050509250925092565b6000808585111561068257600080fd5b8386111561068f57600080fd5b5050820193919092039150565b803560208310156106b557600019602084900360031b1b165b92915050565b6001600160e01b031981358181169160048510156106e35780818660040360031b1b83161692505b505092915050565b6bffffffffffffffffffffffff1981358181169160148510156106e35760149490940360031b84901b169092169291505056fea2646970667358221220b2def63342d8b09e78a88d8971ae348f942936a161d286a3cc29adcd1b33654a64736f6c63430008120033","storage":{"0x0":"0x5fbdb2315678afecb367f032d93f642f64180aa3","0x1b5d81bbd6f389e588dd54a4c52b3760da82027fc72947162d5fc26854932feb":"0xcf7ed3acca5a467e9e704c703e8d87f634fb0fc9","0xa74bfa997eddc6c0cc15d9b199a73488fc8efeb09b964e1b02095a6f0c1de0e9":"0x1","0xb3a8f172eacdb6175fe95f13e565549dcea98a18e111b1da328049958642073e":"0xcf7ed3acca5a467e9e704c703e8d87f634fb0fc9010000001389"}},"0xa0ee7a142d267c1f36714e4a8f75612f20a79720":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0xa513e6e4b8f2a923d98304ec87f64353c4d5c853":{"nonce":1,"balance":"0x0","code":"0x7c01000000000000000000000000000000000000000000000000000000006000350480634937a2581490636d2228d614176200003757fe5b7f124666f80561ed5916f2f070b1bd248c6d53f44d273d956a0c87b917692a4d186020527f11924f02fd19b09255aaa1cf46ea0518e3d7bfeef47421609491011db0bd0b026040527f247fa7f022304a1994ff505456c2201ef9b717369498d3ffce446601ed9df8456060527f03fd7b19ef2c861f22f77ff810f54e277bc94eb76c02d79d986be3dcdf051c3f6080527f18bd41239c3e71579a677443ecffbd555a81eeeea69352a68b67c8563c0c2a0660a0527f2d78c3a5d28de9ff35bf0a257635196e5730ca7f40493277078cd75da8b4ebdc60c0527f0a514a5c227f4cec95dfa029e8dd124c34895aa46bb27c0911f3780d5015540a60e0527f192e16d17d956b257b85a652eefdf2ee09589eac5be80915775723d2cb1da06d610100527f298ce0c1e3113bb935c7058e7772b533b1aa9db0c0926bdc8917e5605ca3ac10610120527f094cb4e83621afd271e41bc71727f0158ebd612239ac9d698b17fe4be05b7fc8610140527f03d880395be93c27d649af5fd142e76b33918cb8841d5a28173bd5cf7d328791610160527f28eeae6b5866ad68e443bbaf91680db7d7e2b3037e38fef61b42cbccffceca81610180527f278bb49a7b4e44aea46eb0f882cb692801a6e60fdd5b5c23c63cd65ccce4fe0a6101a0527f063edec1bed831f506af8db648d6fdea145345887e8bdcff109035a1d9b674d76101c0527f1baef1cb5509b526a42061fb53657f99b3232500e855192cbe8c940e068c475f6101e0527f1324564ac7bdf9e22164e9858d7fa8e368b165eaea3daf4eb67ee59c0df2e5d4610200527f005761b8c6aecb1a8ca4ea4dfc2c8376064a4a8004ceeda210a55240562ddc13610220527f10c9e283159d58cb4cb2e35fde83a3ba1fdc28002ed9963d2a99f186178a148d610240527f0c399e9f67aa40707a203feefb0b958bbdadcec5ca34901d253d026a2419f6a2610260527f083f0df3f1a0351d0330ec3ff602ca8cc353b7f6e762c7107184cd7b423449f6610280527f1a6764d5943fc4a720b4c0a19fdb8c711984307287a58b9b5f9f5d58212cb2636102a0527f011a63a26feabf87fa66bde66cc25a922c96382d76c6a7ff48f1537beaed683a6102c0527f08ca7b64657c3548f32bef5b63ad24288a41c0b251099ad27f9434307e3e64d46102e0527f01998270471e9361955446b0cdb8bea915ec0675f1cd648ddcb04303507a4489610300527f1d6b3d5f6ea369c26f825d2362933eaa31ea35ec0a77c1fbd9e01ca1523e4432610320527f119ef188bb3dd0d32306976c19941e8664be687e7a69692da27da215a6f06d40610340527f2d9e0ab5c06893dfdfd03481381ba86b6e6292df5609d71f2c64b2d9a79f809e610360527f25f16631bf77060f7ea34087c025bf135784319ef08cda2e31419ee0a529e658610380527f144c7a11da5a7c5dabae3f33fbd03cad86d18bc594c79a497ecb9894edb554f16103a0527f0f971162627723f3feadacb28b0c104cb8f74de508752fa8d7c0db2af13de8ee6103c0527f24be510095436206dd0abd0b0cbb95c883ab304aa52598b1a69306ec981a688d6103e0527f211610e2ad4a377426fadf7068b0c1a6c299a164c1c1a603eaed944870d0b9b9610400527f15a67d981041b1f6f09f3f9ebefd864e779d3af08157786ac077505e50ec79fc610420527f049327fa79d28c12a2c82406947f77f06775b0287468b3136877701dbe7c9598610440527f230940dcc5232658ff9c29697a3fd416d170e8c998f1aa85dea0c42d79f951aa610460527f1b121c049cd1159e289007e0c9da9995cc4bab4c26fb888ec3972a8a2e656964610480527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016084356064356044356024356004356000867f1448614598e00f98e7ae7dea45fbd83bd968653ef8390cde2e86b706ad40c65182089050867f0ab7b291388e5c9e43c0dc1f591fb83ecdb65022e1b70af43b8a7b40c1dff7c383089150867f2b7cbb217896f52c9a8c088e654af21e84cde754a3cef5b15c4d5466612d6adf84089250867f2bc6b0ddbe1d701b6570428bdc1ca1bf0da59ff3bbbb95fc2bc71c0c6e67a65c85089350867f123a55a31980384f3d20b2cecbc44ed60c38c11f7d20e9271efab9a905eefd3c86089450867f037501cc8c9dc819309a769f4df098e588b01858bc8eb7e279e2883be9fb8c5387089550868181808280098009099050868281808280098009099150868381808280098009099250868481808280098009099350868581808280098009099450868681808280098009099550620006cf60005262004ab3565b867f1c2116e47e03a86bb11695b0a5f6dab6b9a460b1eb951ab01c259eca3fd47d5182089050867f2c18213489032e85a9c8cb8e9a65839bfaed13e57bc0fae49dbdaebf54f56f9383089150867f2ee8fed3d4d2c71a0429eafd8e5db1718f29e2227985fdf2ad8703c835b9e03184089250867f28c64d8f5ed7aac004c92029d9e9bf91ba9436d1cce94b9316d111c70a0c171485089350867f18a01d9ffb747ae0de3e83c707f8b24f682c84f15abf571b34254a03478665e086089450867f1c21d92bef197e73b234e4777b60db14e642a56cee71515d54e1ac71cde72bd3870895508681818082800980090990508682818082800980090991508683818082800980090992508684818082800980090993508685818082800980090994508686818082800980090995506200080860005262004ab3565b867f0ad404ccbcb1e195897cb60c80981ebb9d66a6677dbbedad8b6455fe62d807b182089050867f0a9b6de833064f93b6adb99af6c005945cb654cb7bd14c8b97af8b60cc1fb38783089150867f13129e3f930aed6d47690331ff09dc5160efa58ddce2c3e6180d45bec3aa3a6f84089250867f0d7a614c8991508ab1ce4895813bb1c82f18bf7bfc9e280ccca18079839387f185089350867f0532f7ec36e30041b0486986875c913a49bddf2f5af5febe8c31f2f4094ffea586089450867f06bbcb8e8e180201293e712f4950f1b0bbee808c9d64263c84d9d8ae155cb892870895508681818082800980090990508682818082800980090991508683818082800980090992508684818082800980090993508685818082800980090994508686818082800980090995506200094160005262004ab3565b867f0f558a4db1a3ac07f61e2e6bee947f73586bf40f211ceb4f687ca5678a9dcb3382089050867f2be140a60b5b5f2f8edd78a818a969b20c643e419bcf0b577c24a0d0e7acfe9883089150867f1c49c4b9a9f09f7b9ad5f74ebacc710512b8e867bace27cb0dea06e89b96f63184089250867f170c1a732721b12cde7f33e476a39a1aa77a81c06e2eac503847b00d597652db85089350867f19c27d0e52f65ca34f4e31a068e49331c6bfc39d9241f9d4c302041615cf27f186089450867f2f1bdc5254f9220c1a731fc5276964dab26b385fa40b6b04bed9960e2543ba088708955086818180828009800909905086828180828009800909915086838180828009800909925086848180828009800909935086858180828009800909945086868180828009800909955062000a7a60005262004ab3565b867f05b42d2fbccbf4d39d2be9339cabe9d0dc6d921e855cd91154b639d28d4a1cf082089050867f1220040715a41ad59f4f410e0c05a42c5fd32ac52fe9d06f88188d71f61e093583089150867f25f9526526155b83946609f7bb9507dd4925ef871dee916d9144ebb4ece1343c84089250867f017bfe4284299ae7740b6d0e204951e314a8a5d0452419147978a95b3474244485089350867f2a5d4764021ca71d78a9674cb6708f1588d2ceaf3578c4111cf8b359eef089cf86089450867f17f02dab745fbe3c081321fe5cef845e7b8d070b2514d29b2a7b7d89cc0815da8708955086818180828009800909905062000b7760005262004ab3565b867f19da62626db7199b65f4adcf57fa4a3dbaa1764a7bd155708ee6f378c89ef01382089050867f0f88e295fa2ed81b426c91fa69366a73edf75f39bf18634cd266ec4038829e0583089150867f1fe31c5548546c7948fe4ee1bd7412e3280eff7d20cb09aa85f49f276614801784089250867f10fdc1613bdbf67f38bdde561b2f91e4cc48b59f98d643638fdc0afadbfe126e85089350867f1f2618c2ebe9574508b9c52f0000e33ebfddad1a03fdd6bca6ef7f0093127bef86089450867f129fe7fc3efac6a8ab23dba6d886f394da11f5953cf98e28269a0dba2a745dd38708955086818180828009800909905062000c7460005262004ab3565b867f15afd4cdf1e4f820c1631d4ab85ca4ba3bafcfee72beade9fae60523102448e382089050867f1f2c74ba5c367e370d728e71e15b268851a7bb8b45528cb734956079ac99b01283089150867f1130e1872d76f2f9369cf59b95edf9ce19f01fa89c9c36b26e09def6786dad3c84089250867f13523d173f7e6badb73b63fc1c9bbdbee242c61bc68656493327533a5c1b1dca85089350867f14da40d0af427a65f1841b5adc96538653368f7254cb5667ddadbbad7a574cd486089450867f0091f96400e4297ea85bb186c17b304e82638e57fd631ff6315976e1a5dd8b868708955086818180828009800909905062000d7160005262004ab3565b867f303329bf9031c5515b9a34d49a64bb6a0267bc7b54a0deca5c450277a002cdcb82089050867f14ed47e55c1da1c2f05d3c1a1b2e6c18509fc8336ecfe9db737916e283fa821b83089150867f1161f10b357775d810ad53bcc4a20d5add2b03251c747deb04ee94c565e58d6b84089250867f17a8a50ae72ce707f22bc070eb992851ca914eb94cc68eafbb8a96a714eb822185089350867f1a6c61d795dbaf62f99250b37ec5df88645a1c153791db6312b932dc250e4f6286089450867f1f8bd2ab8aa840664c4eee198c4684dc4b05772bb2a0869da6722b15f447a1338708955086818180828009800909905062000e6e60005262004ab3565b867f1ffcb852a4f0027a9799f131cd74b98ccfb8cbc06349d8fefcc62f10c8fb3e2f82089050867f035e742ec52f19b36d489c720f467ffad77cd53bc2db5dddb246b23021f79f1883089150867f1dfaaee41bdf94d783aa29fc62b7ec7b55673aa818d305fd42d175a05f2e3d8684089250867f2821378477a02e995005a5635088540945bd333f2d1455f038a219b8c4796b3a85089350867f1db4a4d0f238a570b1061c6eec81c02f31ffdd4a7c19e763174f238d0489742186089450867f14bf7889457b20b7a1367b34a3a538217d693b52426aff40a4bb72893b1784ca8708955086818180828009800909905062000f6b60005262004ab3565b867f2ced52c2bf296f87e57410c3ec9a9483a796d164f6049127109ff0d3a9c0846582089050867f1ddeac5805a7f4ada4d0441ed108e3149d4ce6584f49ae5bdfd46d6766eea33483089150867f2e36b4e5e9c97b462304e8e2b5f9dc88e1c9f2161ba040673f911123f042ae7084089250867f0c6840d1cb0666dc59e89b1865275d8a164b447c5ed64347caee63502c238d5e85089350867f137e2e3e89e71d461f4c9bc3e8f12183262a4d1db55c589b2caeaac01238f58c86089450867f250932e7b0adcf2c84ed4bfb60a36b6b82e55aa94751157b1d45794b081c8aad870895508681818082800980090990506200106860005262004ab3565b867f170a7292f5634c06dd3bf09ab5c9c4ecd4b00d5ce2f35f972b4555391f16b42d82089050867f0d68cbbe77289e78d5cbf51d70f1b75ba215df4e7bd0149d10b2c50f2a4f3b8183089150867f0caf74563b90525f645a6d2036ecd1306fa1dc680b49d9ce4ed24c974997317884089250867f20a7d1c0a27fcce78ffe372f4c58306b166f9456ed46cdeb255e395b7d30d42a85089350867f0623f3226b5470b2789b8a53040e44443385e96b9cfa0be4d35015158a46846586089450867f1632308688c25e790f57d68a5350241242a56305347de4a5009ce46b8cdcb91f870895508681818082800980090990506200116560005262004ab3565b867f2de4793a6f99cd14e3f6642211f4d0b7bcfa361597c544ffcb5a567e9076f47f82089050867f1d4d06d19ea1b09cad79086d51bde11725a554fa99559ca2f09f3bb73d728c6683089150867f0480e7479a66a7cd9ea61c8b28974389908350abc4aafc18cd75e33dd130c14484089250867f30430b03368ebcaa91246960490bcf917d78681463e2e7d744bfb44335dac24d85089350867f0b57b37320127d4c50f269124b0dbdcb2b1f1352241a5d12103283e089c0c74286089450867f2cf4890650d27240e195f60a4f698eda249b8dd614b23376b50178d2df6d2b8f870895508681818082800980090990506200126260005262004ab3565b867f1e221c5526898bfd12de86851a0d9703751a2f239008ab5f9b7d3b6911c6418482089050867f28e07485ad7d992ed1a58f329ca12adce4ec693ebddbb2952e54d339f2eebda583089150867f2f44d64f84de16dc67bd5ead51efb1dc8381c84520c12854dd5ef3a079acd4e084089250867f050a76bc32ebd1dfe2be330f304edc7ace7167ab7ba1516f4021c62cf0d4fac285089350867f2f58c45e5d659a67d781367241f6c35d8cb46361d97b28947d29421c270594a986089450867f25e8da9ae0e42e840e04b230370e782bdb67534844325ba36fc7e5e160c66a74870895508681818082800980090990506200135f60005262004ab3565b867f2fec734da20fe32003ea04f127f844724f38a368ba10c29544252be796040f7f82089050867f288a6778f3a83988a8ed1727f15e93b4cb14f4e3a3bbb91dd6d1facafffd5eef83089150867f20dcc6c75fd89259be7f406750b3db679a25a8cd2715d245b9175390ac922c8484089250867f17f42ba10942df25cb8a541782a18b6fd31cf965d11178c7b04ac45b4dea5dd385089350867f028eeb85d115a904020e0c6148eec6603e9cedabc664abee764aafd455986ba586089450867f0b1d7cecf3a79b2ad3fa298f6cea7ae95d80c0299ecc918e9f8c9c3d38d59d40870895508681818082800980090990506200145c60005262004ab3565b867f0440339c9764cec79c16efdb834a26261db8e3f12ce1cf722d23c0e11ff4cf0782089050867f06ca647c29727c1962a002177da2d504f4b07a5f7eb57c79b88e6b7abbbdad5c83089150867f2ea120a864f5c4093dd1a962e8f013c7b8ef778b04d2ba5bfc3cab28619ba9e384089250867f2bb737546c4aee7c0cc2ba87c1157e2a77c479ebfb5dc76adbb39cf8697633fd85089350867f0e30da6490625d33e79cd50176f568f9a2c28c2f449a2bd51a25d15686803a9386089450867f0df7ca7278a13650b919d85497b2ebb0f71035a7c20430d4131d903ab7f57521870895508681818082800980090990506200155960005262004ab3565b867f27cc589f5bf585794abace589fb8a74a2f784c0990b80fcaa6944097f870e2d582089050867f2255c36a38c8735de45cedf452afa842332d33042f78e60c43c7455421b325bf83089150867f133d9602bd3378d69f681c27b05bdffc98b7d86cca63d73a60caed485784d08784089250867f0e1548e942ae9d3e26860699b93727c817a9948616c93ef4accd981b1dc3d78a85089350867f0f20f0e55d93689fe09ec312f6af47627482e4bde0a1602a8e2c8d6e84e8a6ae86089450867f2e52328483cb5b7ff2eb4e45b12e51b26232c9bc17b7292954c0a9f6bfa51bb9870895508681818082800980090990506200165660005262004ab3565b867f02b2162d533e059a6eda2abb74712edb3a7860beea95dd8a4abfc957660804f482089050867f19e0927715d1cc6d389429947fb3737dad733974c6b2e13e5b3d432519516c7483089150867f0d3a800457d77785636303b8b94f17dcffcb46048872ac9f74ef7f27ee57370584089250867f2c974d1952557a1aac5f7bae4996616da619b73f441c4e504dc8fe9cfb559e3285089350867f0766bfeeede2ccf3708e1b4ff30714c22c1d434cdbe8f55514babc2dd5d97bef86089450867f23dac8ea54082fc131e173ae55e4630cd4ca7c871b2a0a479c1e74e7f191e62c870895508681818082800980090990506200175360005262004ab3565b867f17d5fb6c2cb37010e3e358ab2d575376870ed33186b8eae49ad3b47e340a8d7f82089050867f175dcac76d8a8126139b583ae38853290246e43e783fa6903ec8007f178c002383089150867f0c4fd08fede5d221adb7abf549898c91e5be7e85bf1fd2a611bf182cc2e7165584089250867f277934b909e72d3a3475bb1ec766ab7a38ad59b128303fc5002f02a65bdfe72985089350867f0e88349998dfe703f1b184524f9c394d6004ccacf9cb952896e8cfdb0b078b6886089450867f1f1b2078b60b0fce07824e2a2bc8cae8ee673514b0070a8b45710cc78cbb9942870895508681818082800980090990506200185060005262004ab3565b867f2eb1559566c536ddbc316f6482d51fa340557657700f5b8a846e812a0ed334d182089050867f1c4dbdc335cf6764355208b4c9d243d34541d623c669dec2c3ba066bbeaf677383089150867f2374a6b2da6f8cab8e5cfe8d805dd3a2dfca1e8b7eba5dc8574021fd1241e3b484089250867f19dd342533ccc603a99738e3fb5a569b94ef71b3e49f90fb874f6161733072f485089350867f217d66db6c7fb3effa508800587d2eb3c6d03d8385132f2fcce7f35f2705cccf86089450867f0815fb8591fe01038cd3a3b38b236f9efca77c618d3bfc6c2a7fa89296c7e64f870895508681818082800980090990506200194d60005262004ab3565b867f2bb943b40c2bd456a6c17853b1ca88eb0ff36f5974b2ff9a5f5093e9bf63a16f82089050867f11a5153fce659513ee7cb9974ae6cba581e3b4cd14570c5709fec3d8d3fc82e983089150867f1b72bfd07635d8501b2eff8785a2495bae74c7653cf90e6d5c9f144426836df484089250867f14902c0700eec897ae178ba8caf850d793f1d87512bea0ecea39cf6b1fee233d85089350867f09c138c6e0a616a49ff90d43a6b043f3b745b78865856dc4c1a45e2fd84cb3f486089450867f05b58a3dce57b281a271d69895052d887458a715783e8317e024a61a35ec10bc8708955086818180828009800909905062001a4a60005262004ab3565b867f2be8d29525c0cfdd5e6b3125e3bde3bf558e55fbe867f024457a96765474d03782089050867f061d72f78f1ba9dc6b4d7f7784225d6a81bdfc1b5ad6c24369f9c0560523d9ad83089150867f0bf18aefcacffabdf4112eddadca6145738b4803b36145bb9516db501a0692e984089250867f2e73dd105fa8b2ec931d8cdf29ec679e3a9801a93071a7d5ea30659255f03bc685089350867f0f8440ef667c9ae81337ba5d8c927a5347de7296860b211cad1ecbfb5d3598ef86089450867f004d303b2dea627b2731be83f93ac34e7d14d178a13800558ca7396395eb118f8708955086818180828009800909905062001b4760005262004ab3565b867f234541ad72040a70da2996a35269230c94699eef313a4d480508008cbc3d37c182089050867f0d123f1e72d26b92bdd8fd73d14286c312ad4c23acb46b2e08c157104409e17483089150867f2fb360776f0de79d7098ee7aa4123c05ee6b05a8be460a774f3a048e138545bb84089250867f03685c079434e167276c57d3cc79703b7dfdc41c156ea1e8b7f99b6956a5532685089350867f260af0e0fffcc9772c1631b179344566b47aaada3681eb9034c6f75c3705c1c786089450867f2862b41374f89b695274b33b773f2554916e2bff9ff672545fc2f49563f627678708955086818180828009800909905062001c4460005262004ab3565b867f02a9912fe170310227189ea1e691d0362f18b38b400b0eff192ca59513eba8d582089050867f08e513ade694a0d8ac1f3ebf1a96440d32c713d5058e1224e070348c281f4a6f83089150867f140a4a431e2ee79400ed7465978d84773213c628264ff80f21ac7a6b673d09ab84089250867f296af4d019cb5df7d959b29d549c3f071202b4eba8b53dc5ee979ed14337792785089350867f01832e284a7f4c81614882b6939fc0f185573bd2023e3e505765470bb812b34986089450867f1a84d56a67bfdd3d965abdcd329aa78d4fe93434496f2d103861fd19d66d72608708955086818180828009800909905062001d4160005262004ab3565b867f040cb82847773927d2aefdc07489037a9d1f7631eca75c9fb0dda0cb9dbde14382089050867f010dcf084cc29cb7caecf26aa633bce4ed2b019f2887cee7b1a78f89d3fabe2f83089150867f07edc22a0911ea214425ef542b776db23b0fe5817810d40c72ca98aabd9afa8384089250867f2eea4ab08aec775f2148479ea36fbb96936da58ba48bd1d2d3acd48173aaabe785089350867f1e40c0e8257fe4a61005cdcfad148cf7f47d1b5cfddfaa082738695518245f1986089450867f23a27809583bd1ea51f436de5443e108f69d44cdf51dc1f03e21948b4980b8768708955086818180828009800909905062001e3e60005262004ab3565b867f2e4652b044dbfe40e63b6b232fcd5f3f39abfbd2051ee68adc754080d49250a982089050867f11e7abdb6ecbafc2e7d8cdefe9c7b9c50475eb475db3c2caf7f7d67f485775f283089150867f199d52350cc30e8c73821f802096f0e547a13551b27bf6b899396f63ac5cf8e784089250867f0f575d6ee67cbecd98345624e032a37c859a7cbef30b3fddc949cd097848410185089350867f1c4b6f9a2ae2b418e6265acba9c96b06184d07028e5fb784f3475ae7772ff05786089450867f2dcb5cf8896de39f228e157c0c5593f4626fb9bc225206383db20360abf0c9258708955086818180828009800909905062001f3b60005262004ab3565b867f1340abb9f4e113186bdc26cbdf4bcca50b531a107f863ca544575e3cf870f8e182089050867f2368e692b72787cb8870ea888e714e006f59d2b4460cfb74c48a8cc73b1d1a5b83089150867f1fab9add9baa4a4f56f23165775c6f2d922a7632a94f96374b7dc852756f54b684089250867f0c7f7b82300d3c6ce3f8957ba1e4add54c4c015e20d9765d220571c16ab8680f85089350867f15d63e86beacd93c6083688e5d9c8f3c6947929f9f1f99ab578a4c3a922eff0386089450867f0be843ae5f9b07e52572178af7dae8ed05d36b12c0607862929355ea74023d9e870895508681818082800980090990506200203860005262004ab3565b867f1332749c523694cb6935e0963a07e81b05967ce1d950c0b731058ec92a7a0c9a82089050867f25439408810e074c0bdd4598b9815fee892bb95ca51029ecf009bffa5b9b968283089150867f057e8d19dd999a918da29b0940b383ba9fd15db0b0f64996dff67feb55f9a74284089250867f1e014e37e9b117cf3b4870d999f2b55d3534d0a6be98e9e357fa43f01e70a29d85089350867f1a4ed24e6e03aebcd6bdb100533dc966597afe15c851b4b863f6e889084c647986089450867f253420007083f1aa863ad4760905c1039ed4111c9f053f27710452f83ce36a90870895508681818082800980090990506200213560005262004ab3565b867f2276a1441971709affe6d2a99320001ec45ec72155c575ddeecac0e32759ab0682089050867f28957dd1218ea799fd3411eb19325853adf7ae8ae1281f753302fe7d31dfa7b083089150867f2fd925726ab794c88bd75796aa3e7f1e6692f2914cf802267ddf01e37902a00884089250867f1cf8a5c9c76a84b147c8238d9253cd55b47c0c43d82966c4636a28674705fd9a85089350867f0373cbbc306e1bab9e7077368715e6230b4b2e2e4a1db9c674b8c359a41e910886089450867f060283d2fe7f23dff513d9110b3dc62448bc48f531ce0c1eab5920bf23290a40870895508681818082800980090990506200223260005262004ab3565b867f0dab465d6d910740f33ef6cc0eadc71bf8119bdfd5a3527dc8bbfadfaa40263c82089050867f0cba7bcbc8224b2a8e4aba17977230a686cd6421dc0ca5346f3446b62439c4c383089150867f1e4365db0790c9c4f445b0653c466ff21db96c38b4076ba8bd68bcb4dea6911d84089250867f1bb2dba2199a9ab3bc86ef5f9de7f6c5ca13d60eab42ced68de98fc643800a8d85089350867f0ad3c1870c6d6ef40eebad52123cd1a2913d9d62e80bfbacae812e082021f9ca86089450867f01b098c91e7b0cbb5c34588077c0ddf95300ddf614935630c0ce3a2627245308870895508681818082800980090990506200232f60005262004ab3565b867f19fd5c0eac14fae7598bd4ceea3b1e2998b0c168493b6d72ae41b576e55b9c3f82089050867f0d4749d79cc163f17110a404a46fe427c6434f3fe67b7e7b4ccfa6ab95bd7e1883089150867f1ebbfe8114a41bb809e0b33399241232eb940ad8728c8a516d40ada440dbfdcf84089250867f2704e5b6133d9764d6d3f17d49d833223e3937f80eb9faeabbfba9baf4b4c1b885089350867f2165e1c8027305b1ae0e323571635e5d540d13d710c3f9a390b6913f14d035e386089450867f2e3497e4d35fda596c06afa63bc3a0f2e55d4eeba4aceb60e65081ad63aa8b8a870895508681818082800980090990506200242c60005262004ab3565b867f031da4345eecd6db6c0f7b07c7815d7add1fe0546d738f4d79ab5c57aa841edf82089050867f089ece54e47aa5c908e43e5f08737c1436967089006acab1c9cd19eac4a2087683089150867f2f53c15e2aded33c47f55a070483e6cc7f3821fbf8aa40677d0552ed9d10d84784089250867f142aa34f4b2e8ad0df7a21b3e39c00c8b0aa2857094801eaafd72befed077f9385089350867f17aea4da4c7bcf0d7588b014eb8b40979dd2725eda4e6ace331982467c7ff2bf86089450867f0e970c19d19748d8c465104d8f02200363f9a41786f02f1827742b20dc0d1727870895508681818082800980090990506200252960005262004ab3565b867f04bcad9e553795642f59baf714a6bdb432fc45a0a0b77f1aba3a9823476df9b982089050867f242c0bfbcdaa76f715dbd4ba825c71fcfed671c1b1901fa484c87f810315d0ce83089150867f25db1343c24104071023fb6ed34d9909078311e1efe85af0a11b19114fa9e79084089250867f2ffe4d9c420a59e9cdc7c31ab2bf35187ca147cb898a3942deb3677786036a8085089350867f125bb03af3e2cf18bbe6f5b590eb3bf8d0d1ba63be696483e98f283bc7cd07a386089450867f0816be42745b7dbb4ceffe5b8e24ea60fd8b719deba50037ac7b75948745c6bc870895508681818082800980090990506200262660005262004ab3565b867f111160f9acf6ec360d1b6a712313a0dbcbe23e64420055471d2ee4c5dedb35d482089050867f1377978e1b1f6a8925fa8e7b7941bdf8fb59ab9542342419283d8203435c939183089150867f0defc1d8882166ef3ccde53a4f236fba83d384621937cee57e421a513d0d339784089250867f2f8fa5c78c706e3a5d4a03f2a7a3953046d7e94cb88a7ef350e67b5ba0f0debf85089350867f1a2a957ec0a723da61c2134bab0bf17beb00e6dcd84690c230dcb9e58da9482786089450867f1cdf8710995f5e03412b4a7f699532f9fd01f0ea167a8dfc1ddf37e2805addef870895508681818082800980090990506200272360005262004ab3565b867f26fd31471828c36ae36c27b748054b0c0c4fe5239b301699e3765eebecc1894682089050867f0775d996cc2c4456f303a2c1f9007647e11a921d9fea3f7b926143b99d2fa0be83089150867f016fb9337708ca638cdfda91bd0daea6b97224ef7b2062672addd1bd18bb890084089250867f2c392fbe7d3fde42fca4f9478bb439331258255356f184af6f76f119054117d785089350867f187a2a3bf79a69fa3e5089ef9f1fd56fdb47c55eece77aa228aa3de1b486bcb186089450867f0271a863a280a32641ffa33510b2edd278c98630359532f3e506b275fd5d20ce870895508681818082800980090990506200282060005262004ab3565b867f1557459c9c74c94aa00e5af69a1e3112fb69537ce897ec0c718958d96516f2ab82089050867f2a8e26ca8d647d9a6388516ea9dcff89083d539e58168c2a50c6dae30f109f2183089150867f21cb752194cf43f3b51942eb0040eba9de2bcfb1c2a3fae97924b710f26832cd84089250867f2c26daf996be247acd6dd4acad60d38b5a471e6322188d02c137e7cb484377ec85089350867f0240176ee0e7982eebe92a68d3e3a38c26821acc0f5d058cf8c137bca2d26f1b86089450867f2636e0973c865c1bd974dd78daaa8d0a84cdaf6be1ad47ecf2a0d18f117318f2870895508681818082800980090990506200291d60005262004ab3565b867f19e84f4f25a799496041661dc5d975b681f6e06744cee89b7be5d9fde1744ac082089050867f0ebf89064a3af247ca1f36f6f3570188e271e0b326c4fb26664e89e1454ca11083089150867f25c7e97b475be00e8b559a38c452364f4c9c531fecb8ac698f7fd73ce22e71ec84089250867f0444c99e592353e5aecaa302add901c14d8c55270a160afed4429ef5598ad74f85089350867f138db8887830565f2693d0e0f02e4e79e144967f0ba53b03519aba764b5c994a86089450867f24d40f462114fe9ee02aafcf74b4fca24e1ae365dc75c3b52bb13cbbb2f21edd8708955086818180828009800909905062002a1a60005262004ab3565b867f21e65d6d8ee43760bca40e730b5df4c4cf3a8a732db148f4b2951b4c61d68e8c82089050867f248dd79669ec09dbf0350a15d6c75c6a9bdaacefca14d51300978f13d1ab6d1c83089150867f2b8238c1548f9cbe29fd35cf91e7b48f0ebda7e639edf69fe8d5aba7924d536284089250867f2439fd239257f38181c7be3cf513f1bf7235eba94f6b8942a94cbddecf6f62f785089350867f200958235281a61ba2c4be0aa3282a18c74b6d262f5de7c2e33d2bb3e893dfec86089450867f0e1eca5df88ee5f60cfa7e1fe5befbb719fad8211fa9b2d02fcc233190c17f128708955086818180828009800909905062002b1760005262004ab3565b867f26b53427f9b3ea2c769d9c660fc60881a169c12732d001b7158ee4b1b842ca2482089050867f20f3b3f4acafe9f8af3e06661b3a8f778fa2812522b9d70a67402cff8db2b1b483089150867f211e5d2b39d62520a7a627ece8cacbac9f97506def4ec286928ba6c27d463b1784089250867f0bb743ee34802129c556731aed9d302dcd085313ce572f6242d13832e536b4b485089350867f23cb2661b488ee71e4c753ff23ae4bd25d8a44094f66b6532977e22140eba5cb86089450867f03a35aa3123911cdb4535baed3359f5f6a5205b9c93ef31d35323a47807b8bc98708955086818180828009800909905062002c1460005262004ab3565b867f27803848a0aed96a93fa943b6635e450217e137f4ade74a62d7917322714b69782089050867f0cb37839c2c9a7ff79884cbec75f41e9be5e47c76d61538231bd8162996d6f6783089150867f1f0026d0bf1f8e1dd5423cc2fec1fb5cdaa1ecdc4c3cb218dbceef77c00d2f9384089250867f02a7d7bb970b8a6ed2ee66fabbba956b6da3b100f5b5fb928eef42f9708273c985089350867f0cfd7f4215e434c8da17ec3258b0bc605ad1ab2e90aa494351e4ee40bbc491fa86089450867f180b11b720622a156849dc6f7f6e7f571659be69682230c5ed9ac339700a7cde8708955086818180828009800909905062002d1160005262004ab3565b867f04e96a965bce3d3a0a24a4a457c951582c871349ce7eee1aabfe578a94c6501182089050867f15931f782b45f7fb656f2cdbd1f7705c353a23fe1d30a5a46a1522ed160df3ad83089150867f2e296e57c97a5309acd26febf55ac963a5444c1c5f703ad88a0d7b97b9dd38b184089250867f26157bceb78e846bbb262f9a1e06d4271bde5a5bce8f0419952f97ffd13eaca885089350867f2194eb89847d6b0f1897f675f19c0c56b61b13248eff3ca36e34fb9d1c79ee4386089450867f2350bf35477656899151ad7dde96ea7857e15501447008dab6b3d27c8ffa274f8708955086818180828009800909905062002e0e60005262004ab3565b867f1a486f0ae591cacdaf09c58a49c4d1795405435340819e003f0469d110b7752b82089050867f1b56dcf76fb23cc4a834d455a4065e133571402b7df309d59bc3105d42a8c30183089150867f1a749d7964af0b7202913ef204c653f2b4bfb65ceab7b685233ab59ce3bb692584089250867f18ae590073f969696af762ffa4e8f0ebbf97f8cc787e37cddd1f321be3beadbb85089350867f21c47b275d82dde6460d5e769a99421144b1c5a9da59294ade9cbb317103f24986089450867f0473ddbd52e737e527364e8eb63207975c38d5fd6cc32b272102b082cd1518fb8708955086818180828009800909905062002f0b60005262004ab3565b867f0b12fac95b6d3a881d892657c8424e645ac4e6b00515f902d594574302b26e0282089050867f08ae7616a260cf6657f8f73ac284588d2c5f07ff425d837aa7cdcef63e3e210383089150867f039daf6876280b80e873bf2a32fd2834a83c69757badd58a888ef819e926ce2884089250867f25e7b1d7470a3c75f13f0b56546c8e09f2d8efeff06ef766f9c783ca869d130d85089350867f1e8fd3634c3ff764184d03435f98584b11b5b15aeb9c75262da3f1ea2c2a9e7a86089450867f241dcc51ac37808a415dd1e3c281f05aff11789dc0cafdd77a35484e0993f9a4870895508681818082800980090990506200300860005262004ab3565b867f1ffc3153c56ef9755932cea2be0573749bdafe1c4fa0781a4b8b4078ce9d754782089050867f17630d62d9a3e510c88a4d43c360f92bc0fa00b66031adec29bd9543fd3a17ee83089150867f2980400edd1d74e3d69db5458d2ccd5fabdb236ec16a82a4301a0ab59ea4a6e984089250867f3034fb24366123ec6dcafcad35726dbfb16194c036dcd648fa69439bfcd00cd485089350867f1aa7e8f4189ca9dff3db2ab7648be0a2392995ce46041e04680dca8ad7232df086089450867f1fa195f834a69e62372f60eb497da167646eae14153d803b39dc5d11f5d7800b870895508681818082800980090990506200310560005262004ab3565b867f0f23f1c74d5fbf6195ad5a6aee5e56993c5477e8453f5b93a0d7bafd333036d382089050867f016556fac9348a735ab50aa089c97151b3caaf0a20a34fb9d9370505a151572983089150867f23d92b793648110fc5aeef0633f0c77cacb0dbbca1879b8a6f6e5df445e5f70b84089250867f2e4c10ec5e65e2f239bbc43c13031df2686ab40fd79a304b05d611b823f23b7385089350867f12418bbfd77b63ad5e16864ad9c32ffbfc5a3dd9b78ec2b79329fe5e0a8d295386089450867f1e4a8aace15abc1d5b76a9e848431d2c06a78f72b6bebb1293e6c58e5185696d870895508681818082800980090990506200320260005262004ab3565b867f0f3e96107decdbd6872c20ea09acf92cdf17a3ee1d1331488092d96176deb75582089050867f012c3780207f395cc21deb0abd951681eea32498ddba6ce897a8f9f0c235706783089150867f13eab1b4e672ba1b1c1bb901769301f1e5659d03ea10c61de2477ff0ac22142184089250867f20dc664abb20b7456c06629ce37a1ecb1a27a4e8b24e31b48b9c4635aa30323e85089350867f2c6b1e2cfea78e2c36785e76a8cfb1b057e9471f24f5b391175c3decb01e000f86089450867f188c926255f5b7af3da96355729c2a8670ab4c2c70400481b2ac903740e0c5ab87089550868181808280098009099050620032ff60005262004ab3565b867f2f9913208e09e3d6e9e6fba6384fd076ab89f2662976e3e30e0870bb30eb54f282089050867f2b33803d90889706e714f720b5628d26fb60b545a1f3e9ce49a6ae912b02408683089150867f26ccabc10eb04327cb5cc3dde2abb36f097086c97e738c133c9f57077e748b0984089250867f1b16ae0d7c54408cb75fd931f246751f2b0c3dc20d79e82a2531b76c22b4d5df85089350867f11d0bb461bd8af2844f49f0f840c94ef9518b2511344742d1f5438fe3d415ae486089450867f233031847b476bead0118d3db338e89133ec420d673e504ad647259df655571e87089550868181808280098009099050620033fc60005262004ab3565b867f1f84e97895bee438eb3c92dc9b1846c9ad29c164387b06aeb6ed1841ed8c4dca82089050867f277f7f9b542f0c2bb5f45bed054f09624536010c3cf9452d2273193327f801d683089150867f1efc9c9069e5068baac13d2e6645641b7d27e80fc23077161535c44682ee57a984089250867f0d6ec477761e2efbac4f14b3bf3d5257a99e64c3f25fe104faf988b20fe5ff4485089350867f0e0e7d7c5501999b7d16173b59b7cae1f203bef21aebf00251881439ccf9301386089450867f217bef2f4f12c6dcc91c2058a23391cb77de53ca6e44dcdc6ea3d36fea326ea687089550868181808280098009099050620034f960005262004ab3565b867f05780c88adf01531b50f817e3fe44447d29b35aa8a389c71e8cf1226acef68ba82089050867f18733887a6b2b3b4c90d8e4990196e23445e47d7ea5939ebfb89a3ee3d67b4bd83089150867f20bace63acfcae0b1c9f2bee24b8e9da85ba597d37b0905720c4f15db231b07a84089250867f166ea595375a6786ac527ee9eced73ed6bf550876abcaf3ac92b42c808b00d8f85089350867f304262a9eff4040acf43e322d6f52676ae2f853ec2e7a80db00c488cf917c74e86089450867f226bac7050166e5f6db78cd0b12d36f305b6e8c9a055114ad7709e6f57245b6b87089550868181808280098009099050620035f660005262004ab3565b867f26b2f539c573829f6aca91baa954505bc5c3eb4e1df1d638582717fbdf2388cc82089050867f06a0fbf4cd52e93ba5e4c6c4af65db02ee96297f8ad200f2f1cff252e769b55183089150867f2cb9c24112d35341aceac88360fb528924e58b6ecac321b9fb29e6aa3368ff2384089250867f20e88a4d607526dd07fe08a3552a44669129eb87fcc0b13aac8fe8afd930152185089350867f1544649a2bd73e3ba72f396df91dd65401dd8faf51de325fbaedb9d536ad94fc86089450867f1980077457995712c44da7e17713258e3f8eb354bfd80ed9eaf3ecbaf696010587089550868181808280098009099050620036f360005262004ab3565b867f25d1d22ff13e7705d3c085f97fc4e4f6914b82ffaa5d2091ec64dac423765ef782089050867f2fec990ef556efe1035a464ff5581e74067445cd54abcaf6b8c0399fe0d24cfc83089150867f1bd9563506d9544ef3e4830e13545012c579379c2dcc1330416c4ae49bc4ec6184089250867f00affcd17ba6003c56dfa85571fc29737b225a80d480e7dd7edec01f14f2301085089350867f23670dbaef966881f07f919a2d883128c7b23cf767a477b2b2e0762bc0dbc18b86089450867f1f93a532917394c7e22fd17abeea6389c66fd7ae2dd9f02f860f6d96947f0edd87089550868181808280098009099050620037f060005262004ab3565b867f2de42e9f537b7d61b0213771c0e74f555512be07b6a50934734e2c5beb40be3782089050867f25c557f45b99781cd37d3bb22931662a67f78b37782c885b456bb96d55e8840483089150867f2074c8b709705c9888538a7f8a3c4aff647731bd16f8e254fa74ea9f2be7662c84089250867f2738355956298138949e442171d6a4e4b74ef2065740db7cfc3a0b60fd573acb85089350867f13d36ad0a4ebeb81969778649659c65cb7d0c41cc519871fdb71a9ea6a0caa5686089450867f08a2c18ba41381348c1acfbf9617716806b462a1691bc2e343b79b8085e376b087089550868181808280098009099050620038ed60005262004ab3565b867f059092fc395aed285807bbf557ad9a1041f59c079822b1088457882fee7b612c82089050867f161924151b5a5ad2d8cac119522a991a906f15e8531dc70567f6b28371cc24e383089150867f1c68ca8f7aa17659075405ef6341b8e69a298b9a4d72f3bb854b309e4ba87a1b84089250867f27f5d03bca1c8207f7239a4b2cf73ae559a15aa37e7bdddf3aab05eec5ce559285089350867f0ecbff4846962a975d347ea9a8fc465fb46861557622f2c2564a7e639833c16986089450867f277c4de2363d8b5b456cfc5a7ff8e46ff2ec8daa59855f5ad64bc0521f3ac56787089550868181808280098009099050620039ea60005262004ab3565b867f1b11862c52acd351b7a464793f4fbb57fec99f832b63226f95d175c8d2fc08b282089050867f06a719c584c74ffbdd7218eb565cb4c8bd86c92e3dfb3c73e1527201aa51234e83089150867f230e4adeecb799877f7ce9a58c836b99d533584a195c1d77a313abe1c7d126bd84089250867f10b109b864809c4767a133cce6cbad6c88628173b8ea51e8cca85830ca7de52285089350867f0e21117970dcfbd4b1526b253636f377538d3b4faaeb5a8b24bf6200d14cc59186089450867f2667349978401362f6b17939eeb0e64ff55607ebdb35c7071db46bb3e7ba47788708955086818180828009800909905062003ae760005262004ab3565b867f05000fa5fda505e029a13bfe304c267b0d86c72c039babf6d3ff02ee246be02e82089050867f264d9e094aed5f41a60242220a34a284089087b2436a9bfce8174cc9be8c2e2083089150867f08076f9c4743de6130ff622cf401edd2c92f24bfe114f3c5e724891746315c4784089250867f132370abddbb0b1dd57f2a520c25336bd7cede94b95bbf5c2151d6d88e641b6485089350867f08ff1116b7a227bfdfd4465a67890882b615c8c4c17f28d8d24958edf602ddcb86089450867f2bcb0b0db8b9e3e02b7e9c1c9460fdd9c6cd98562332e648d8a3e0ab945975208708955086818180828009800909905062003be460005262004ab3565b867f12ea68ce6881becad7f8a6b117b03ab976f7abd597f903b0bf230d20d21a943a82089050867f27439c98a76688067a097b19b6fdd7d78d5f88e274e0d8fea5ea6b7406fdda7f83089150867f02f40d0ad05f5652e31ef9440ad71ebc8419e393493937f05f00499d02a99e3684089250867f2fbf04284327ee4f680f06bd390e309d0d13acc74b9c5b14b63059b8cc7abff585089350867f1be686d53e2a8ad57a828b0651425cfc6978c7027edbf247f6b6723c21df86e786089450867f2683b425e85a508f96852f14b4220fcfe9f7ad8b17bfefc0e348c47ca78bb57f8708955086818180828009800909905062003ce160005262004ab3565b867f16dace9b2e8012e31db1c7ebe672d86bbe61a1aa3e1693e0eddfc0de0a9dd95182089050867f27a321f8c7d3c9022e962f7fef2e3c848b4539dbb75aa139f30430fe545bcedb83089150867f06ccd7210dee1d6b0e22b79e12d19082d8078b788d71007b95e7a774ed86a65184089250867f0a41dd42221653752bef350f6d74a917b6cbb1fd76a3a12166f4d0be978e402685089350867f220a02881e4d47ac94d950cdf8386274d1782e27cbd0d845978deec91298f16586089450867f0e2155a545fe5f3cbb6397606589eac19cd92639339c6b017298a4ad3408b4b98708955086818180828009800909905062003dde60005262004ab3565b867f0f0f19c6291e51546a267c60cc774e5fb9d088bac530782d891ec1af4b84707382089050867f0e925bcd1c6ddb4a3a1c67ec8deefbd40c53c0d33e7aeef1b46795aed5943c9d83089150867f2ad000b1748abb812cd6e5411286b9ff3ef0a5bd3d259a36e45ef05b9eb5beeb84089250867f0a65aa232d32ed6e8de63d1cdffebc2f3fa616465c27aaf97e8cd3dcff64865285089350867f0263d8470ab4b1c61d74d8e896242f4f261dcb167a3a06923893d7cb2c93d6a186089450867f2901d946addc94b040fd58004d9a5f8cd1926540c7a8612cec1c58cb60c2b3a58708955086818180828009800909905062003edb60005262004ab3565b867f1889cfa8209f4952df9022db9dc583b5717a0696da41cee64937d0cd6321e69382089050867f236064d71cb6c64c84747ac25fcf8d881502e5f03bff87561b85a116b1f39aca83089150867f2ff7a174ffcec29862e04f5dbdc73ebf3661570033576290c0c1f6cd8ced27ae84089250867f19e724a1d742cab103455f0040edf745a2696a71084c93e322715450dd4d6f5b85089350867f03eed3892b6f0e6c5da1059c5f3793985835aa283500a8129904a94c87f161bf86089450867f08e2b8273bfa30c1ac850306d91e468a9e8d05092aee4cbc80c687248463ba308708955086818180828009800909905062003fd860005262004ab3565b867f07adcca76d8337728839a1b6ac3b3ed42afb87d72af98f52f416f2ec58b28cec82089050867f171ef37896bae2b1020a0a5839bd51784ce11bb4237d548c171169d32fa19b4083089150867f20ffdfcb86f4d005064edbc296918c332d32fbeff1729de5056a26abbc3a35fa84089250867f08ecd7a6f1735eed86baa094e608f488f38dbb398fcfed4b994383a0ca8e464785089350867f1c3f5d86e5921fde9890189f1d8c618754288600e6928bc182ac4d5e4c9f0ccb86089450867f29c61184ed9d460f337558a1af639aa7e3c0975e4014ed8ebcad4a25d51eabf387089550868181808280098009099050620040d560005262004ab3565b867f0defd45b28958728228adbb2dbdaef6a5e9b1a64902a734f402b8cefb8ab3b5682089050867f0a74ea22d8a09336060610179ac1d82fffa9492df76deed4ea60e0133b0811a883089150867f03a37bf12daf1400d297ac4ac13ba24c17dc262db16c8523deee4e0ccde9a68084089250867f11fe1790d5abbf5935ff22318e4f7ffe69966ada2f9136b54f830eacb0a6536885089350867f018165842f406375f2346686915afb14bf1fe0564c8858ee3bde0aba3de5f68f86089450867f261db25e7cff5a9fb72f276b1f9260b667300fb7d361b50fd5c0e8b6995b05f987089550868181808280098009099050620041d260005262004ab3565b867f2a3ac3314b2b66e796fbe36df778c5e46972320cc43ec807048826b6704ba7c482089050867f23caa4b80ecfa99e9d3fea2bbc1dbbf369d1bfc8937d03d074061c30fd8cd76b83089150867f27db260085e224898df145f23f635f2066d8e4e124e581e8c6261929b1dfe10784089250867f274f6c5fd34a784d6b915ef05d424ee6c0babbf369e79ab138b8167b5618ec7f85089350867f2c3a29e13a84d26a0911c9289daf1aa4cf5840aada0701d57e23dfc796da6da186089450867f1ea210f2001a334d3e801f4e53270d42da7aaf317a553b4282aa78eaa2282e6d87089550868181808280098009099050620042cf60005262004ab3565b867f254dbeb52884b699c1ba7fa0d6e80d610903b18a3e509c36351ccc3b024946e382089050867f059e781d65896ebe0e4ba26dc2f29907f47bcdeda4a2ca2c713d8505ea31fd5d83089150867f0b5b1cec63d42d5e615dc269b885a24cef303ec78c972dd17cdbb3e915cc4ffb84089250867f2a7c015e9c3b2c57ca8b7d26d39a1bcc85d6ffacb7d9fbd66d2a8f1d64ed0c9285089350867f29b736b911d71a79cf63d8a6f786f11bd5abee24161dc567a7c851eae1e43b5186089450867f285745a90a7fe3d09af5a808704bc69c6f1701e573912df5cc1e265d596c414187089550868181808280098009099050620043cc60005262004ab3565b867f2d901b8195c3c96c8c36eb99fec0134ec2b8304ae810bd30da554e308082671582089050867f1905d3518355eaba7859b591ed7b8c9c253980f0450dbdf54d7a7782ba05839283089150867f23e813026fc0b80064d19b5c5428942fdf7efea80bfa8ec4095272bfdb7b4c9f84089250867f23c0a19a252c87e6b1c1c21b1a79800200c3fbff3e3300e7e5568071de9efb8185089350867f11c4ae607bae492413bf62cdaa2c2868ed1fec6dc0631b067ca60fab125b9e2a86089450867f2cd055ebb7ee4686365dea450f046ff62405fae1b1afc9fb01707cf81da0e3b987089550868181808280098009099050620044c960005262004ab3565b867f053c9fef2e021fa9a20fada22fdea1505b58a3159bbb47337dbf791b215b145282089050867f0a35bd74e87cbabaabe89ad1319d2c9e863b4c631c21938c9a5395bf97872a9f83089150867f1c115056539ce20cd5a04d1a5c43e2b00fbe83b25901be36f5ddc4666fc383fe84089250867f242954047e5772fd3bded590ec8beb4c542f2e264c8c3e284cdc473505c51a9085089350867f0e2abd315b47c0dc93849c0cdf267e811cbdbdb200a6e7c2b67edf7cb017421486089450867f282b37020c0890d751c3fd76950d8068668e1dfeae621dd552d2de887da2ea7587089550868181808280098009099050620045c660005262004ab3565b867f28933852266b52d9ea6b5bb923d9d94f2e5a5be5c778e75e07942c234b643bd982089050867f099ab6765505ba1198ef140e77b7954d4fbe79a056ce72bace39c048c00da3cf83089150867f2af211d8e0ac2d8fda7f849b8f229a225c6186b55762c7a7b2ae2d1dd85c57cb84089250867f0cd070f234014a2809ab90c71c1da61e98a96322fedd99b6aaae1ca104f3facf85089350867f26793e2abc8d3c30c60626fbaa158f263587d6bd15833d448b116264b930256a86089450867f225be36ed0ee85e1f845ada84e5748a56699152113ff61b5056b6d8bde60c19d87089550868181808280098009099050868281808280098009099150868381808280098009099250868481808280098009099350868581808280098009099450868681808280098009099550620046ff60005262004ab3565b867f02174f49edb02d5154d2beca2dc92b9cc595383da1fde8f09e4b5ee3ea5a065e82089050867f0f64891c2c8b020e46c3594cb758f0bddcdbd09bd0308816fb41734a869872c383089150867f192a84ca2f99d36991e2d2b1deff3989d1c156c239e10e9f56140e185457606784089250867f29dfcd7b63f05abf2753a8c341d6b7a60c6243b04c9a1b8b3320bba04a4d478785089350867f1ee27ad6b9b5a867733afc61a2b3e76a52ba3e4bd5e657ade91fc038819dba5b86089450867f0ab4773f150c3f8ad3bc9538f43cec395a7e3731ae973fefeb623a09217e64c7870895508681818082800980090990508682818082800980090991508683818082800980090992508684818082800980090993508685818082800980090994508686818082800980090995506200483860005262004ab3565b867f13c352a02f595186202cb0b99fa58c5542ab67f9b6d3a0afd103deeff6d80f4182089050867f2a97cf2c10c4bfbfd299f67c52a169f92c05b7dac56a41c4dd4fe87c8246ce1483089150867f00becbb47042bd7f8c9f6bb422162d1aed089a28482f7fd16ab06a13285fe70284089250867f008e44da21d738691b881757ef37ed29c5bd9f7a4450fcf53290a92cc2ca217685089350867f2b205a8b6d4b7063d931f3bb5d3464053843fe7fbe4b83c17883f86527882a1886089450867f2d9e32a7c90556fe108d255ac01e75df338fcd63b2bf84c19280d427298863fc870895508681818082800980090990508682818082800980090991508683818082800980090992508684818082800980090993508685818082800980090994508686818082800980090995506200497160005262004ab3565b867f29a322a84c25bd2ddf6e2e4200228d95abd6349a02266ac1dbba520738ceca9782089050867f0678c9bfc6f2df012f4fe55e33bb68ac14ced1df0d02152792089d046d828c4383089150867f0faff3a5e7425794fe20a7e0eb615b8b1760394b7f2304286a3ae4009124db2384089250867f1f8f5b611af9feb9cea86c084058120553e404103aee213f5a41d1d02541c0d385089350867f160875d8479602f96f40acc2d042ee52c1588b6a29de4284965a6dc6c930ea0786089450867f16d87a5183a316a1d70afc951efe2cd667c77328fcfda458cbf5fe3045f46d9e8708955086818180828009800909905086828180828009800909915086838180828009800909925086848180828009800909935086858180828009800909945086868180828009800909955062004aaa60005262004ab3565b60005260206000f35b8660205182098760405184098891088760605185098891088760805186098891088760a05187098891088760c05188098891088760e05183098861010051850989910888610120518609899108886101405187098991088861016051880989910888610180518909899108886101a0518409896101c05186098a9108896101e05187098a9108896102005188098a9108896102205189098a910889610240518a098a9108896102605185098a6102805187098b91088a6102a05188098b91088a6102c05189098b91088a6102e0518a098b91088a610300518b098b91088a6103205186098b6103405188098c91088b6103605189098c91088b610380518a098c91088b6103a0518b098c91088b6103c0518c098c91088b6103e05187098c6104005189098d91088c610420518a098d91088c610440518b098d91088c610460518c098d91088c610480518d098d91089a509850965094509250905060005156","storage":{}},"0xa51c1fc2f0d1a1b8494ed1fe312d7c3a78ed91c0":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b506004361061002b5760003560e01c806354b8a14614610030575b600080fd5b61004361003e366004611ca4565b610057565b604051901515815260200160405180910390f35b6000610061611ab7565b604080518082018252875181526020808901518183015290835281516080810183528751518184019081528851830151606083015281528251808401845288830180515182525183015181840152818301528382015281518083018352865181528682015181830152838301528151601d8082526103c08201909352600092909182016103a08036833701905050905060005b601d811015610143578481601d811061010f5761010f611d82565b602002015182828151811061012657610126611d82565b60209081029190910101528061013b81611dae565b9150506100f4565b5061014e818361016f565b60000361016057600192505050610167565b6000925050505b949350505050565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018161019b610366565b9050806080015151855160016101b19190611dc7565b146101f85760405162461bcd60e51b81526020600482015260126024820152711d995c9a599a595c8b5898590b5a5b9c1d5d60721b60448201526064015b60405180910390fd5b604080518082019091526000808252602082018190525b86518110156102e9578387828151811061022b5761022b611d82565b6020026020010151106102805760405162461bcd60e51b815260206004820152601f60248201527f76657269666965722d6774652d736e61726b2d7363616c61722d6669656c640060448201526064016101ef565b6102d5826102d085608001518460016102999190611dc7565b815181106102a9576102a9611d82565b60200260200101518a85815181106102c3576102c3611d82565b6020026020010151611406565b61149c565b9150806102e181611dae565b91505061020f565b5061031281836080015160008151811061030557610305611d82565b602002602001015161149c565b90506103486103248660000151611535565b8660200151846000015185602001518587604001518b6040015189606001516115d4565b6103585760019350505050610360565b600093505050505b92915050565b61036e611b08565b6040805180820182527f2d4d9aa7e302d9df41749d5507949d05dbea33fbb16c643b22f599a2be6df2e281527f14bedd503c37ceb061d8ec60209fe345ce89830a19230301f076caff004d19266020808301919091529083528151608080820184527f0967032fcbf776d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c8285019081527f0e187847ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab606080850191909152908352845180860186527f304cfbd1e08a704a99f5e847d93f8c3caafddec46b7a0d379da69a4d112346a781527f1739c1b1a457a8c7313123d24d2f9192f896b7c63eea05a9d57f06547ad0cec8818601528385015285840192909252835180820185527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c28186019081527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed828501528152845180860186527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b81527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa818601528185015285850152835190810184527f1cc7ac279784340642b1cc49d773a417a38bd7a80fc82ac74cb60a687cca413e8185019081527f20d8a26ba687447378c13cfc7582d10d45e796df727f537581691b50fd087c94828401528152835180850185527f03a011f2c98d9a7a3965dcf51acdd54f36b09102a1c285469ed7c897ff07f17b81527f12315cb01ba5132d2eb44c0f3b67d08a25d9982d96b9fe185d93592f89ef1c918185015281840152908401528151601e8082526103e08201909352919082015b60408051808201909152600080825260208201528152602001906001900390816105ea57505060808201908152604080518082019091527f19804926191ba300560244c0ae0cc099cee18f334652af7e043c0d05023e06e281527f06ae2719273a3aec6544e09c743f98542b7004d7ddcb06bef04ff616301ff9d360208201529051805160009061067d5761067d611d82565b602002602001018190525060405180604001604052807f12a72d298dc7148b0e7d96354c2ac218ce68e984530750cd743dc878495c7ac281526020017f1f1f172ca09859d572bde8f1f76a00ae9ac173b89e80c896bf63f4e49b07a59581525081608001516001815181106106f4576106f4611d82565b602002602001018190525060405180604001604052807f2b125029d111496e07ca75e82106ced35a4485e61711d42bd25bffee331768f481526020017f17732fafc2f7e10e87ffeedccbd033dfd17e4d811bbff6c24bb1ec92c7ce229d815250816080015160028151811061076b5761076b611d82565b602002602001018190525060405180604001604052807f18f233abe02dcc79817c59ce21fa19f14318c7148ca035307578669d1e4d73c081526020017f0853bb479ff75d612e80bda376c94604a5f2d5e6d619d4508147a41dc84e593d81525081608001516003815181106107e2576107e2611d82565b602002602001018190525060405180604001604052807f2ead0de572402347dbda5d965c1feafb8e339860e730ea5d7f000cae27aee87581526020017f29935b54a32251dd4b9121b4a5a3d74570d90ea6c3e5415c419dc36c1c8a0b31815250816080015160048151811061085957610859611d82565b602002602001018190525060405180604001604052807f27c0bf5c324b84fbdb6e44fc58eaf38d26c1edb862954a4071b2c9955cf300ec81526020017f18b6b11bfc2a160c2ac7d7b540e57589ad2be4f83d8be325c7e98dd6a2d0574381525081608001516005815181106108d0576108d0611d82565b602002602001018190525060405180604001604052807f05e9c1477c52bb0dae3d9bc10c37c9493fe816e1966556fa1c7907a72f31182081526020017f27fdf27ebb712097e483194ba4b6078e5aa5a25a9a8aea7abe0afc752b955b9b815250816080015160068151811061094757610947611d82565b602002602001018190525060405180604001604052807f216086e63c589b732f7619a09e8678d4e1ec0d7273435f49e19f26f27d27b7ce81526020017f1e350de5443548a6819a3d3da6f946fb514f95798ba4e07067b6f2fb67c496bd81525081608001516007815181106109be576109be611d82565b602002602001018190525060405180604001604052807f25423ba709e0cbf4261d697dee52fc5e43504b2f62d2ceebe55186ddceca828e81526020017f04dddf4d6bf84d623de70acd5ba0344c8f796538f8a07e6914d7aac00302c4568152508160800151600881518110610a3557610a35611d82565b602002602001018190525060405180604001604052807f27c27e95e96ab30616da5ffda14628a22a38f75dba17215c85fd087be8519da681526020017f0e3ba204c1d793c685837542579b18e12856e6034594df67c622d85c8c64731e8152508160800151600981518110610aac57610aac611d82565b602002602001018190525060405180604001604052807f15b2a4bce3bf314175c3645749a9d49a268dc65fd0964f2f291c280b4e540a1e81526020017f05dbc398bd2f41052a30226690f25abecb185545324f50953bfcf9eae17b92628152508160800151600a81518110610b2357610b23611d82565b602002602001018190525060405180604001604052807f1ba472ee0d936e08c500a111ce0836b2a476b7bc27e09f1890bc04f5e977c40681526020017f26d4db915d205b87bbc9b54f0d94c18c87293fa1822519d291bd30508dcac7328152508160800151600b81518110610b9a57610b9a611d82565b602002602001018190525060405180604001604052807f11e5b3a32eec3ea692fb15f0a18b72744e2bc44801025b0630efb0c55f4bef9d81526020017f2d09b14a5d47245ed44242979391bb60232305e066b745f2686465f7da23e5198152508160800151600c81518110610c1157610c11611d82565b602002602001018190525060405180604001604052807f29746db985251727d1c240cad3f0782644dbb5dab126c69b115956d95639fbb481526020017f2f3d625e3d7e39c2a139189524b30167b158e1c15e629c07f7bba738f4592c678152508160800151600d81518110610c8857610c88611d82565b602002602001018190525060405180604001604052807f1d28f7081a2889ba756a3b7d00d05e6ca7bf18e448caaaedc938ef6db67d5ff081526020017f022d1f81de96bdd31a002553b1da367e146ab2f5f75abbb4d5511bf137c27bd38152508160800151600e81518110610cff57610cff611d82565b602002602001018190525060405180604001604052807f1f79a78fe2249a8c1e2c380980918cdeefdf6bf9df24ce27cd289819fe6cc9c281526020017f28a2529f4fbb30d680af5071c8e2dd79a90a8400abf8273a6ebe6a50f8cdab468152508160800151600f81518110610d7657610d76611d82565b602002602001018190525060405180604001604052807f20e91c5e1b3c3e0647d9162766419dd481641b05340b010cdeace0f7d0ac991281526020017f08b30f35eca901a04d30d6b50c146edd15a54f9bf86341159b6d13465c9bba8d8152508160800151601081518110610ded57610ded611d82565b602002602001018190525060405180604001604052807f2e1a0bc6ce5abe53983412e07bf125eaf8fb45997b3dae89ae65bbcc80de9a1881526020017f2da6993aa197b78333f5e5f4f254ad542dce3c77acd3b264271f7a2fe4b865f98152508160800151601181518110610e6457610e64611d82565b602002602001018190525060405180604001604052807f0da2cb4fc4fced47c513a9464e48baebf066102bec6219bb0da24626a3f89a6781526020017f1f31fa8e032ba7848e89bbeed55385da34e435f61d9384833bd1f4664a2c60408152508160800151601281518110610edb57610edb611d82565b602002602001018190525060405180604001604052807f2e30a1f87c3e80f0eecf7ea771a020e9eef33b58e753f9cc74679b78d2ab367481526020017f27319b6002022cd2030f508650412e49988f38e62ba5b48222dab6699eec2df78152508160800151601381518110610f5257610f52611d82565b602002602001018190525060405180604001604052807f2d923106a6e37f1f83002d9e51433ef556fd66079e66e4a33313d4bac48b30b481526020017f2cfe56c5ded16b5721a4398f210e147d8245ffbd9272bfe92294879c417231b48152508160800151601481518110610fc957610fc9611d82565b602002602001018190525060405180604001604052807f2d5f939f9e66d23b643b360ce20dcaacd6e699e12cd574de04c23653df554e3681526020017f0d58464d8f4a35cfe27368b12224b41bf7d6c477479746ea530d501172977937815250816080015160158151811061104057611040611d82565b602002602001018190525060405180604001604052807f2d2019ff7518c0c23779ca10244b9f14def76bdd4a9fa2c964888bd47c9a35cd81526020017f1d28c7c57800aa5d86e2105868365d4ae442b77dd8a076362c6ee1f8e81c55a981525081608001516016815181106110b7576110b7611d82565b602002602001018190525060405180604001604052807f06f504d9c93181f0dcd8a5a7c91f1ddbf3bc87059abb29c4bc1184b8657620f381526020017f16fc550bc3d84422fd5afbce9e4ede678bdba2c0248a357dc55faf0874483a05815250816080015160178151811061112e5761112e611d82565b602002602001018190525060405180604001604052807f2f666eef59792cd8205bf8988ed10fde00ee86da5873913ee20a8220129cabb281526020017f1022083670d04a80aa315317a3f905e71b40d3819dd618203669b2168696e80f81525081608001516018815181106111a5576111a5611d82565b602002602001018190525060405180604001604052807f1b59ec0f2702b6ef5519ef95b7e5eb0b56b77e03a9994714c2242b99327c47ac81526020017f1d0923c00f9d3e414145ee3f8fd6c9730fde740a0cf181d654b044bba6e4f366815250816080015160198151811061121c5761121c611d82565b602002602001018190525060405180604001604052807f2f91a05874f6b576f69c89299b3d698ece2d0c9fbc065cef80dd8f306e901f0b81526020017f23fd71617903108e7f2eb1c4a019d3d6936765b09ff858b2bf2dfa4d2abe6e9e8152508160800151601a8151811061129357611293611d82565b602002602001018190525060405180604001604052807f0d121590ac45174cac44a71a05247690e56d8afe54e4f477eaeacea619b0f35481526020017f1b3862a8978ef430b77acd0a50e6cb6f38fba544694c50c065e38b2e622b2f098152508160800151601b8151811061130a5761130a611d82565b602002602001018190525060405180604001604052807f2d341b0f01a5d6355de67b5555eba95015560a8ca3396aab1c81608f488d99e181526020017f1cb5490a942735507550c1071b1e196d679f036a94dd42c2f218a077a9894a198152508160800151601c8151811061138157611381611d82565b602002602001018190525060405180604001604052807f10bf0a6c57666fa2a737fbe0ec9d78f5fbd27b139e6b18fad0e640f66231778881526020017f11f55a0ef7d63613b81bf127dcfff253671e245c80e70317d7630013513f37938152508160800151601d815181106113f8576113f8611d82565b602002602001018190525090565b6040805180820190915260008082526020820152611422611b59565b835181526020808501519082015260408101839052600060608360808460076107d05a03fa9050808061145157fe5b50806114945760405162461bcd60e51b81526020600482015260126024820152711c185a5c9a5b99cb5b5d5b0b59985a5b195960721b60448201526064016101ef565b505092915050565b60408051808201909152600080825260208201526114b8611b77565b8351815260208085015181830152835160408301528301516060808301919091526000908360c08460066107d05a03fa905080806114f257fe5b50806114945760405162461bcd60e51b81526020600482015260126024820152711c185a5c9a5b99cb5859190b59985a5b195960721b60448201526064016101ef565b604080518082019091526000808252602082015281517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd479015801561157c57506020830151155b1561159c5750506040805180820190915260008082526020820152919050565b6040518060400160405280846000015181526020018285602001516115c19190611dda565b6115cb9084611dfc565b90529392505050565b60408051600480825260a08201909252600091829190816020015b60408051808201909152600080825260208201528152602001906001900390816115ef57505060408051600480825260a0820190925291925060009190602082015b611639611b95565b8152602001906001900390816116315790505090508a8260008151811061166257611662611d82565b6020026020010181905250888260018151811061168157611681611d82565b602002602001018190525086826002815181106116a0576116a0611d82565b602002602001018190525084826003815181106116bf576116bf611d82565b602002602001018190525089816000815181106116de576116de611d82565b602002602001018190525087816001815181106116fd576116fd611d82565b6020026020010181905250858160028151811061171c5761171c611d82565b6020026020010181905250838160038151811061173b5761173b611d82565b6020026020010181905250611750828261175f565b9b9a5050505050505050505050565b600081518351146117ab5760405162461bcd60e51b81526020600482015260166024820152751c185a5c9a5b99cb5b195b99dd1a1ccb59985a5b195960521b60448201526064016101ef565b825160006117ba826006611e0f565b905060008167ffffffffffffffff8111156117d7576117d7611bf1565b604051908082528060200260200182016040528015611800578160200160208202803683370190505b50905060005b83811015611a3b5786818151811061182057611820611d82565b6020026020010151600001518282600661183a9190611e0f565b611845906000611dc7565b8151811061185557611855611d82565b60200260200101818152505086818151811061187357611873611d82565b6020026020010151602001518282600661188d9190611e0f565b611898906001611dc7565b815181106118a8576118a8611d82565b6020026020010181815250508581815181106118c6576118c6611d82565b60209081029190910101515151826118df836006611e0f565b6118ea906002611dc7565b815181106118fa576118fa611d82565b60200260200101818152505085818151811061191857611918611d82565b60209081029190910181015151015182611933836006611e0f565b61193e906003611dc7565b8151811061194e5761194e611d82565b60200260200101818152505085818151811061196c5761196c611d82565b60200260200101516020015160006002811061198a5761198a611d82565b60200201518261199b836006611e0f565b6119a6906004611dc7565b815181106119b6576119b6611d82565b6020026020010181815250508581815181106119d4576119d4611d82565b6020026020010151602001516001600281106119f2576119f2611d82565b602002015182611a03836006611e0f565b611a0e906005611dc7565b81518110611a1e57611a1e611d82565b602090810291909101015280611a3381611dae565b915050611806565b50611a44611bb5565b6000602082602086026020860160086107d05a03fa90508080611a6357fe5b5080611aa95760405162461bcd60e51b81526020600482015260156024820152741c185a5c9a5b99cb5bdc18dbd9194b59985a5b1959605a1b60448201526064016101ef565b505115159695505050505050565b6040805160a081019091526000606082018181526080830191909152815260208101611ae1611b95565b8152602001611b03604051806040016040528060008152602001600081525090565b905290565b6040805160e08101909152600060a0820181815260c0830191909152815260208101611b32611b95565b8152602001611b3f611b95565b8152602001611b4c611b95565b8152602001606081525090565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b6040518060400160405280611ba8611bd3565b8152602001611b03611bd3565b60405180602001604052806001906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715611c2a57611c2a611bf1565b60405290565b6040516103a0810167ffffffffffffffff81118282101715611c2a57611c2a611bf1565b600082601f830112611c6557600080fd5b611c6d611c07565b806040840185811115611c7f57600080fd5b845b81811015611c99578035845260209384019301611c81565b509095945050505050565b6000806000806104a0808688031215611cbc57600080fd5b611cc68787611c54565b9450604087605f880112611cd957600080fd5b611ce1611c07565b8060c089018a811115611cf357600080fd5b838a015b81811015611d1857611d098c82611c54565b84526020909301928401611cf7565b50819750611d268b82611c54565b9650505050508661011f870112611d3c57600080fd5b611d44611c30565b908601908088831115611d5657600080fd5b61010088015b83811015611d74578035835260209283019201611d5c565b509598949750929550505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201611dc057611dc0611d98565b5060010190565b8082018082111561036057610360611d98565b600082611df757634e487b7160e01b600052601260045260246000fd5b500690565b8181038181111561036057610360611d98565b808202811582820484141761036057610360611d9856fea2646970667358221220383494e986a3f48a15788da49b2106dd317b974dd6475ca92342c3338f9e2e2864736f6c63430008120033","storage":{}},"0xb7f8bc63bbcad18155201308c8f3540b07f84f5e":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f054a9a314610030575b600080fd5b61004361003e366004611622565b610057565b604051901515815260200160405180910390f35b6000610061611435565b604080518082018252875181526020808901518183015290835281516080810183528751518184019081528851830151606083015281528251808401845288830180515182525183015181840152818301528382015281518083018352865181528682015181830152838301528151600f8082526102008201909352600092909182016101e08036833701905050905060005b600f811015610143578481600f811061010f5761010f611700565b602002015182828151811061012657610126611700565b60209081029190910101528061013b8161172c565b9150506100f4565b5061014e818361016f565b60000361016057600192505050610167565b6000925050505b949350505050565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018161019b610366565b9050806080015151855160016101b19190611745565b146101f85760405162461bcd60e51b81526020600482015260126024820152711d995c9a599a595c8b5898590b5a5b9c1d5d60721b60448201526064015b60405180910390fd5b604080518082019091526000808252602082018190525b86518110156102e9578387828151811061022b5761022b611700565b6020026020010151106102805760405162461bcd60e51b815260206004820152601f60248201527f76657269666965722d6774652d736e61726b2d7363616c61722d6669656c640060448201526064016101ef565b6102d5826102d085608001518460016102999190611745565b815181106102a9576102a9611700565b60200260200101518a85815181106102c3576102c3611700565b6020026020010151610d84565b610e1a565b9150806102e18161172c565b91505061020f565b5061031281836080015160008151811061030557610305611700565b6020026020010151610e1a565b90506103486103248660000151610eb3565b8660200151846000015185602001518587604001518b604001518960600151610f52565b6103585760019350505050610360565b600093505050505b92915050565b61036e611486565b6040805180820182527f2d4d9aa7e302d9df41749d5507949d05dbea33fbb16c643b22f599a2be6df2e281527f14bedd503c37ceb061d8ec60209fe345ce89830a19230301f076caff004d19266020808301919091529083528151608080820184527f0967032fcbf776d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c8285019081527f0e187847ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab606080850191909152908352845180860186527f304cfbd1e08a704a99f5e847d93f8c3caafddec46b7a0d379da69a4d112346a781527f1739c1b1a457a8c7313123d24d2f9192f896b7c63eea05a9d57f06547ad0cec8818601528385015285840192909252835180820185527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c28186019081527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed828501528152845180860186527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b81527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa818601528185015285850152835190810184527f106fb48e5e192dd95da2a9a095ca6610b742dc50bb1f1aeda5ae3fc058bddb9d8185019081527f0b8832b25b67a62e5860aee7bdc0a02add27a5b95ac5bd748573e5ed5641c193828401528152835180850185527f219264f52b0ff4842d312e8314cf6baa309e56b453697829e4a6d3cb1168689d81527f2950ed77e9ae00f2c38bab4ea99f8792e14a55d3796c94f71af72099df64f858818501528184015290840152815160108082526102208201909352919082015b60408051808201909152600080825260208201528152602001906001900390816105ea57505060808201908152604080518082019091527f0cbbbe7fb9ccce6ce39be4d2cc28f867513f6cb4aed4d3503816a1bea415b02281527f2417973d39c8e2752d08fc34f98707185899701a80d63965d9457ccdc961468c60208201529051805160009061067d5761067d611700565b602002602001018190525060405180604001604052807f14122e94f7d54d95bd9f801df80c547f5e771ce659e5986352e128a376c79a4c81526020017f1f37240058c64d9c6e6fe4873433c2284a1f8a515c80e42cd09d53875925fb6481525081608001516001815181106106f4576106f4611700565b602002602001018190525060405180604001604052807f20f42c6b7f6d72e78e63f7456ee954b15064cf330228a06d73a656c1eb65c18981526020017f0c0faf8ea94ddda6f94065c94b4e9564d44d071402d78a72bbae9b0c7cb7a02b815250816080015160028151811061076b5761076b611700565b602002602001018190525060405180604001604052807f08f68d0bbc9a36db803b24e9382f7327d21423c7ae1d261ddf3f96a9e3947a0781526020017f08f72c8020d4bcbba872f6353e840d35e1c166511386c42053efb794f15c884981525081608001516003815181106107e2576107e2611700565b602002602001018190525060405180604001604052807f05233e51c130de05dd1a85607e5594fae0d698f56e7560a33feb4aa454844cc081526020017f1ec5b7849b470c3e7d770d2682bf30a62ffd7dd8b00991b9bb0166b605dd89dc815250816080015160048151811061085957610859611700565b602002602001018190525060405180604001604052807f0d36fb19d845b1dd516c59345a347c7032e753a545680d187b378209a8e5770e81526020017f24d0a9b1dc7109ba586b0bda719aa2a692f5befdcfa8bf1fbc7c89d87ed7ac2b81525081608001516005815181106108d0576108d0611700565b602002602001018190525060405180604001604052807f16ed4685abe09a44fb5cf3276562919bc5b212b1f602bba35208af5a72055e7d81526020017f1c10f6b50d2d302c24cff6cfc42c421a2ad8314df265b1e43f6f65e70ed40e0b815250816080015160068151811061094757610947611700565b602002602001018190525060405180604001604052807f0ffdb60275502746226e97b4305863cc24c630d4005582a29e592933aa64f45181526020017f249d3748d1bf7a8c6b11638a11ec1157afa1f6c8e769ac7d8920c2dee95b0ef381525081608001516007815181106109be576109be611700565b602002602001018190525060405180604001604052807f11d6e66351ca08858e5653c1fc9c1159dc5495269f4e712f288488252b6f688c81526020017f1d34893d128369b7994e47224ebaf87fe3d64ff86bc1dcc1f6a048c57f1ccfbc8152508160800151600881518110610a3557610a35611700565b602002602001018190525060405180604001604052807f0bead4334151c6320bedda529d1dfce79b86468b1fa49a625a369855efbd9c5681526020017f2c1f3a0a26f18a4792310f1ecec0cb06c777bb9ca9273a77d5cf25f03453ee1c8152508160800151600981518110610aac57610aac611700565b602002602001018190525060405180604001604052807f03bd7cd88e5c9fe2566bd83c487d3a58a05b87bc53610f7c430ad2dfdf1e64fe81526020017f3020ee3347439c3d80a4e1279e70a0aeb2f44a4ff3699c6b08759927c51bfc148152508160800151600a81518110610b2357610b23611700565b602002602001018190525060405180604001604052807f2429ec1a6dfb2f01e9b6a072cea4e3fd63f1ea0941dae5ac573db864c5af32dd81526020017f189f7dc9361badfff9c6b92417f5098ac79b6fc65b1d058ef7f365b6ac6dea348152508160800151600b81518110610b9a57610b9a611700565b602002602001018190525060405180604001604052807f2f8a061d0e1b8a62d875e2a4878edbe5a17a458c05f5992a9c41284493cec90481526020017f1bfe883751ca460f93fdf11ee4620d1061c5ef2419a508b1df13e2f58d8c2c578152508160800151600c81518110610c1157610c11611700565b602002602001018190525060405180604001604052807f1a8f9c5186d637af233e5bd6be9eb36048126ade28c159eca461acf4f3770a5081526020017f2731f17ee3fe535450a046c248c04214d805c4b74d487eb05dbadc6ce904c3b98152508160800151600d81518110610c8857610c88611700565b602002602001018190525060405180604001604052807f02f86dbd34fffee3f2d0e89cc229fc8ab5078a4f1f899245ca6daa7fe9c8010681526020017f1e66a2922d7f05c62d34b18573cf30ec2220530a13f2e9d32c983ab1673cb36a8152508160800151600e81518110610cff57610cff611700565b602002602001018190525060405180604001604052807f2a4422f2c472a7513ccdbdc6f5cf613598332dea7e100418351c9aed98af4a2e81526020017f095c612e91f72f005c7aa12f7b6a2739d1331c88cd7e89560f243ae4e11cfb078152508160800151600f81518110610d7657610d76611700565b602002602001018190525090565b6040805180820190915260008082526020820152610da06114d7565b835181526020808501519082015260408101839052600060608360808460076107d05a03fa90508080610dcf57fe5b5080610e125760405162461bcd60e51b81526020600482015260126024820152711c185a5c9a5b99cb5b5d5b0b59985a5b195960721b60448201526064016101ef565b505092915050565b6040805180820190915260008082526020820152610e366114f5565b8351815260208085015181830152835160408301528301516060808301919091526000908360c08460066107d05a03fa90508080610e7057fe5b5080610e125760405162461bcd60e51b81526020600482015260126024820152711c185a5c9a5b99cb5859190b59985a5b195960721b60448201526064016101ef565b604080518082019091526000808252602082015281517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4790158015610efa57506020830151155b15610f1a5750506040805180820190915260008082526020820152919050565b604051806040016040528084600001518152602001828560200151610f3f9190611758565b610f49908461177a565b90529392505050565b60408051600480825260a08201909252600091829190816020015b6040805180820190915260008082526020820152815260200190600190039081610f6d57505060408051600480825260a0820190925291925060009190602082015b610fb7611513565b815260200190600190039081610faf5790505090508a82600081518110610fe057610fe0611700565b60200260200101819052508882600181518110610fff57610fff611700565b6020026020010181905250868260028151811061101e5761101e611700565b6020026020010181905250848260038151811061103d5761103d611700565b6020026020010181905250898160008151811061105c5761105c611700565b6020026020010181905250878160018151811061107b5761107b611700565b6020026020010181905250858160028151811061109a5761109a611700565b602002602001018190525083816003815181106110b9576110b9611700565b60200260200101819052506110ce82826110dd565b9b9a5050505050505050505050565b600081518351146111295760405162461bcd60e51b81526020600482015260166024820152751c185a5c9a5b99cb5b195b99dd1a1ccb59985a5b195960521b60448201526064016101ef565b8251600061113882600661178d565b905060008167ffffffffffffffff8111156111555761115561156f565b60405190808252806020026020018201604052801561117e578160200160208202803683370190505b50905060005b838110156113b95786818151811061119e5761119e611700565b602002602001015160000151828260066111b8919061178d565b6111c3906000611745565b815181106111d3576111d3611700565b6020026020010181815250508681815181106111f1576111f1611700565b6020026020010151602001518282600661120b919061178d565b611216906001611745565b8151811061122657611226611700565b60200260200101818152505085818151811061124457611244611700565b602090810291909101015151518261125d83600661178d565b611268906002611745565b8151811061127857611278611700565b60200260200101818152505085818151811061129657611296611700565b602090810291909101810151510151826112b183600661178d565b6112bc906003611745565b815181106112cc576112cc611700565b6020026020010181815250508581815181106112ea576112ea611700565b60200260200101516020015160006002811061130857611308611700565b60200201518261131983600661178d565b611324906004611745565b8151811061133457611334611700565b60200260200101818152505085818151811061135257611352611700565b60200260200101516020015160016002811061137057611370611700565b60200201518261138183600661178d565b61138c906005611745565b8151811061139c5761139c611700565b6020908102919091010152806113b18161172c565b915050611184565b506113c2611533565b6000602082602086026020860160086107d05a03fa905080806113e157fe5b50806114275760405162461bcd60e51b81526020600482015260156024820152741c185a5c9a5b99cb5bdc18dbd9194b59985a5b1959605a1b60448201526064016101ef565b505115159695505050505050565b6040805160a08101909152600060608201818152608083019190915281526020810161145f611513565b8152602001611481604051806040016040528060008152602001600081525090565b905290565b6040805160e08101909152600060a0820181815260c08301919091528152602081016114b0611513565b81526020016114bd611513565b81526020016114ca611513565b8152602001606081525090565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b6040518060400160405280611526611551565b8152602001611481611551565b60405180602001604052806001906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156115a8576115a861156f565b60405290565b6040516101e0810167ffffffffffffffff811182821017156115a8576115a861156f565b600082601f8301126115e357600080fd5b6115eb611585565b8060408401858111156115fd57600080fd5b845b818110156116175780358452602093840193016115ff565b509095945050505050565b6000806000806102e080868803121561163a57600080fd5b61164487876115d2565b9450604087605f88011261165757600080fd5b61165f611585565b8060c089018a81111561167157600080fd5b838a015b81811015611696576116878c826115d2565b84526020909301928401611675565b508197506116a48b826115d2565b9650505050508661011f8701126116ba57600080fd5b6116c26115ae565b9086019080888311156116d457600080fd5b61010088015b838110156116f25780358352602092830192016116da565b509598949750929550505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161173e5761173e611716565b5060010190565b8082018082111561036057610360611716565b60008261177557634e487b7160e01b600052601260045260246000fd5b500690565b8181038181111561036057610360611716565b80820281158282048414176103605761036061171656fea2646970667358221220dc826a907050904b65334266adb3488004bf27c9252d81b9eb18700ba38e4b7464736f6c63430008120033","storage":{}},"0xbcd4042de499d14e55001ccbb24a551f3b954096":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0xbda5747bfd65f08deb54cb465eb87d40e51b197e":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0xcd3b766ccdd6ae721141f452c550ca635964ce71":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0xcf7ed3acca5a467e9e704c703e8d87f634fb0fc9":{"nonce":1,"balance":"0x0","code":"0x6080604052600436106100435760003560e01c80630b27fb9a1461004f578063622c77d91461007257806372c1ad0314610094578063cc3c74a1146100b457600080fd5b3661004a57005b600080fd5b34801561005b57600080fd5b506000545b60405190815260200160405180910390f35b34801561007e57600080fd5b5061009261008d36600461077f565b6100ca565b005b3480156100a057600080fd5b506100926100af3660046107d0565b610365565b3480156100c057600080fd5b5061006060005481565b6001546001600160a01b031633146100fd5760405162461bcd60e51b81526004016100f490610805565b60405180910390fd5b8063ffffffff1680600054106101255760405162461bcd60e51b81526004016100f490610862565b6000546101339060016108a5565b8111156101525760405162461bcd60e51b81526004016100f4906108cc565b60008190556001600160a01b0384166101c55760405162461bcd60e51b815260206004820152602f60248201527f54726561737572793a2043616e6e6f742073656e64206c69717569646974792060448201526e746f207a65726f206164647265737360881b60648201526084016100f4565b306001600160a01b0386160361022b5760405162461bcd60e51b815260206004820152602560248201527f54726561737572793a2043616e6e6f7420726573637565207772617070656420604482015264185cdcd95d60da1b60648201526084016100f4565b6001600160a01b0385166102bb574783811061027d576040516001600160a01b0386169085156108fc029086906000818181858888f19350505050158015610277573d6000803e3d6000fd5b506102b5565b6040516001600160a01b0386169082156108fc029083906000818181858888f193505050501580156102b3573d6000803e3d6000fd5b505b5061035e565b6040516370a0823160e01b81523060048201526000906001600160a01b038716906370a0823190602401602060405180830381865afa158015610302573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103269190610929565b9050838110610348576103436001600160a01b0387168686610495565b61035c565b61035c6001600160a01b0387168683610495565b505b5050505050565b6001546001600160a01b0316331461038f5760405162461bcd60e51b81526004016100f490610805565b8063ffffffff1680600054106103b75760405162461bcd60e51b81526004016100f490610862565b6000546103c59060016108a5565b8111156103e45760405162461bcd60e51b81526004016100f4906108cc565b60008190556001600160a01b03831661043f5760405162461bcd60e51b815260206004820152601d60248201527f54726561737572793a2048616e646c65722063616e6e6f74206265203000000060448201526064016100f4565b600180546001600160a01b0319166001600160a01b0385169081179091556040519081527fd64709474b2b7511a8009e565185fb39031554a6eb9962ef785c97d8759f11d79060200160405180910390a1505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526104e79084906104ec565b505050565b6000610541826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166105be9092919063ffffffff16565b8051909150156104e7578080602001905181019061055f9190610942565b6104e75760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016100f4565b60606105cd84846000856105d5565b949350505050565b6060824710156106365760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016100f4565b600080866001600160a01b03168587604051610652919061098f565b60006040518083038185875af1925050503d806000811461068f576040519150601f19603f3d011682016040523d82523d6000602084013e610694565b606091505b50915091506106a5878383876106b0565b979650505050505050565b6060831561071f578251600003610718576001600160a01b0385163b6107185760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016100f4565b50816105cd565b6105cd83838151156107345781518083602001fd5b8060405162461bcd60e51b81526004016100f491906109ab565b6001600160a01b038116811461076357600080fd5b50565b803563ffffffff8116811461077a57600080fd5b919050565b6000806000806080858703121561079557600080fd5b84356107a08161074e565b935060208501356107b08161074e565b9250604085013591506107c560608601610766565b905092959194509250565b600080604083850312156107e357600080fd5b82356107ee8161074e565b91506107fc60208401610766565b90509250929050565b60208082526039908201527f54726561737572793a2046756e6374696f6e2063616e206f6e6c79206265206360408201527f616c6c65642062792074726561737572792068616e646c657200000000000000606082015260800190565b60208082526023908201527f50726f706f73616c4e6f6e6365547261636b65723a20496e76616c6964206e6f6040820152626e636560e81b606082015260800190565b808201808211156108c657634e487b7160e01b600052601160045260246000fd5b92915050565b6020808252603a908201527f50726f706f73616c4e6f6e6365547261636b65723a204e6f6e6365206d75737460408201527f206e6f7420696e6372656d656e74206d6f7265207468616e2031000000000000606082015260800190565b60006020828403121561093b57600080fd5b5051919050565b60006020828403121561095457600080fd5b8151801515811461096457600080fd5b9392505050565b60005b8381101561098657818101518382015260200161096e565b50506000910152565b600082516109a181846020870161096b565b9190910192915050565b60208152600082518060208401526109ca81604085016020870161096b565b601f01601f1916919091016040019291505056fea264697066735822122024a5991820812443719a474fb98a87f8ae9f0ea5ea3496ec38fab1af87e1361f64736f6c63430008120033","storage":{"0x1":"0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0"}},"0xdd2fd4581271e230360230f9337d5c0430bf44c0":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0xdf3e18d64bc6a983f673ab319ccae4f1a57c7097":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0xe7f1725e7734ce288f8367e1bb143e90bb3f0512":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b506004361061007d5760003560e01c8063c54c2a111161005b578063c54c2a11146100fa578063d7f5b35914610123578063e248cff214610136578063ec97d3b41461014957600080fd5b8063318c136e146100825780637f79bea8146100b2578063b8fa3736146100e5575b600080fd5b600054610095906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100d56100c0366004610789565b60036020526000908152604090205460ff1681565b60405190151581526020016100a9565b6100f86100f33660046107ab565b610177565b005b6100956101083660046107d7565b6001602052600090815260409020546001600160a01b031681565b6100f8610131366004610789565b6101cf565b6100f86101443660046107f0565b610266565b610169610157366004610789565b60026020526000908152604090205481565b6040519081526020016100a9565b61017f6106fa565b600082815260016020818152604080842080546001600160a01b0319166001600160a01b0387169081179091558452600282528084208690556003909152909120805460ff191690911790555050565b6101d76106fa565b6001600160a01b0381166102445760405162461bcd60e51b815260206004820152602960248201527f48616e646c657248656c706572733a20427269646765206164647265737320636044820152680616e277420626520360bc1b60648201526084015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b61026e6106fa565b6000803681610280602082878961086c565b61028991610896565b935061029960246020878961086c565b6102a2916108b5565b92506102b1856024818961086c565b6000898152600160209081526040808320546001600160a01b03168084526003909252909120549294509092509060ff166103545760405162461bcd60e51b815260206004820152603760248201527f416e63686f7248616e646c65723a2070726f766964656420746f6b656e41646460448201527f72657373206973206e6f742077686974656c6973746564000000000000000000606482015260840161023b565b638d3e52fd60e01b6001600160e01b031985160161041857600061037b600482858761086c565b610384916108b5565b60e01c9050600061039960186004868861086c565b6103a2916108e5565b6040516372c1ad0360e01b815260609190911c6004820181905263ffffffff8416602483015291506001600160a01b038416906372c1ad03906044015b600060405180830381600087803b1580156103f957600080fd5b505af115801561040d573d6000803e3d6000fd5b5050505050506106f0565b635f2e6d0b60e01b6001600160e01b03198516016104a757600061043f600482858761086c565b610448916108b5565b60e01c9050600061045d60186004868861086c565b610466916108e5565b60405163a0d192f560e01b815260609190911c6004820181905263ffffffff8416602483015291506001600160a01b0384169063a0d192f5906044016103df565b631f36e83160e11b6001600160e01b03198516016105885760006104ce600482858761086c565b6104d7916108b5565b60e01c905060006104ec60246004868861086c565b6104f591610896565b9050600061050760446024878961086c565b61051091610896565b6040516360c917cf60e11b81526004810184905263ffffffff85166024820152604481018290529091506001600160a01b0385169063c1922f9e90606401600060405180830381600087803b15801561056857600080fd5b505af115801561057c573d6000803e3d6000fd5b505050505050506106f0565b63e080660960e01b6001600160e01b03198516016106125760006105af600482858761086c565b6105b8916108b5565b60e01c905060006105cd60246004868861086c565b6105d691610896565b604051631f7f99f760e01b81526004810182905263ffffffff841660248201529091506001600160a01b03841690631f7f99f7906044016103df565b63737cd4ed60e01b6001600160e01b031985160161069c576000610639600482858761086c565b610642916108b5565b60e01c9050600061065760246004868861086c565b61066091610896565b604051638c832b1360e01b81526004810182905263ffffffff841660248201529091506001600160a01b03841690638c832b13906044016103df565b60405162461bcd60e51b815260206004820152602360248201527f416e63686f7248616e646c65723a20496e76616c69642066756e6374696f6e2060448201526273696760e81b606482015260840161023b565b5050505050505050565b6000546001600160a01b0316331461076b5760405162461bcd60e51b815260206004820152602e60248201527f48616e646c657248656c706572733a2073656e646572206d757374206265206260448201526d1c9a5919d94818dbdb9d1c9858dd60921b606482015260840161023b565b565b80356001600160a01b038116811461078457600080fd5b919050565b60006020828403121561079b57600080fd5b6107a48261076d565b9392505050565b600080604083850312156107be57600080fd5b823591506107ce6020840161076d565b90509250929050565b6000602082840312156107e957600080fd5b5035919050565b60008060006040848603121561080557600080fd5b83359250602084013567ffffffffffffffff8082111561082457600080fd5b818601915086601f83011261083857600080fd5b81358181111561084757600080fd5b87602082850101111561085957600080fd5b6020830194508093505050509250925092565b6000808585111561087c57600080fd5b8386111561088957600080fd5b5050820193919092039150565b803560208310156108af57600019602084900360031b1b165b92915050565b6001600160e01b031981358181169160048510156108dd5780818660040360031b1b83161692505b505092915050565b6bffffffffffffffffffffffff1981358181169160148510156108dd5760149490940360031b84901b169092169291505056fea26469706673582212207b3634587d49cffe9d5f0dbb74d4984249592a4bb25d4d4b1214eedd1d077e2964736f6c63430008120033","storage":{"0x0":"0x5fbdb2315678afecb367f032d93f642f64180aa3","0xa379f8c48f99fb5d5eaeb12d02116320392c412ab3036c903432bacff68739af":"0x68b1d87f95878fe05b998f19b66f4baba5de1aed","0xc892208a331b64c86e4947775465a9d119409b5c586ad31ab44fbf167444c8f6":"0x1","0xdd29adcfd06ae392ef802d7d99dced991846cd4edba07b9e25ea67b849f78a80":"0x68b1d87f95878fe05b998f19b66f4baba5de1aed010000001389"}},"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266":{"nonce":24,"balance":"0x21e193fa1a0c2f2f548","code":"0x","storage":{}},"0xfabb0ac9d68b0b445fb7357272ff202c5651694a":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}}}} \ No newline at end of file diff --git a/relayer-tests/chain/relayer-configs/.env.example b/relayer-tests/chain/relayer-configs/.env.example new file mode 100644 index 000000000..ba23ac058 --- /dev/null +++ b/relayer-tests/chain/relayer-configs/.env.example @@ -0,0 +1 @@ +HERMES_PRIVATE_KEY="" diff --git a/relayer-tests/chain/relayer-configs/hermes.json b/relayer-tests/chain/relayer-configs/hermes.json new file mode 100644 index 000000000..74458db16 --- /dev/null +++ b/relayer-tests/chain/relayer-configs/hermes.json @@ -0,0 +1,43 @@ +{ + "evm": { + "hermes": { + "name": "hermes", + "http-endpoint": "http://localhost:8545", + "ws-endpoint": "ws://localhost:8545", + "chain-id": 5001, + "private-key": "0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d", + "tx-queue": { + "max-sleep-interval": 1500, + "polling-interval": 12000 + }, + "relayer-fee-config" : { + "relayer-profit-percent": 5, + "max-refund-amount": 5 + }, + "enabled": true, + "contracts": [ + { + "contract": "VAnchor", + "address": "0x68b1d87f95878fe05b998f19b66f4baba5de1aed", + "deployed-at": 1, + "events-watcher": { + "enabled": true, + "polling-interval": 1000, + "print-progress-interval": 60000 + } + + }, + { + "contract": "SignatureBridge", + "address": "0x5fbdb2315678afecb367f032d93f642f64180aa3", + "deployed-at": 1, + "events-watcher": { + "enabled": true, + "polling-interval": 1000, + "print-progress-interval": 60000 + } + } + ] + } + } +} diff --git a/relayer-tests/chain/relayer-configs/main.toml b/relayer-tests/chain/relayer-configs/main.toml new file mode 100644 index 000000000..447593939 --- /dev/null +++ b/relayer-tests/chain/relayer-configs/main.toml @@ -0,0 +1,20 @@ +port = 9955 + +[experimental] +smart-anchor-updates = false +smart-anchor-updates-retries = 3 + +[features] +governance-relay = false +data-query = true +private-tx-relay = true + +# etherscan api key +[evm-etherscan.mainnet] +chain-id = 5001 +api-key = "YI7KXQGB98UKGZJ5595E6Q7ZH2PGU32BG7" + +# The following is the default configuration for Unlisted Assets +[assets] +tTNT = { name = "Test Tangle Token", decimals = 18, price = 0.10 } +TNT = { name = "Tangle Token", decimals = 18, price = 0.10 } diff --git a/relayer-tests/solidity-fixtures.dvc b/relayer-tests/solidity-fixtures.dvc new file mode 100644 index 000000000..f4f55f3eb --- /dev/null +++ b/relayer-tests/solidity-fixtures.dvc @@ -0,0 +1,12 @@ +md5: 68983869cb2108989cce1cd9e62de647 +frozen: true +deps: +- path: solidity-fixtures + repo: + url: https://github.com/webb-tools/solidity-fixtures + rev_lock: 97cb9f8e2a11ef5e67c4d451c496fe15e089ca72 +outs: +- md5: 5a60727de10eb4fc2486f04a16d9eb5d.dir + size: 6627655556 + nfiles: 230 + path: solidity-fixtures diff --git a/relayer-tests/src/api_test.rs b/relayer-tests/src/api_test.rs new file mode 100644 index 000000000..fc5849ccf --- /dev/null +++ b/relayer-tests/src/api_test.rs @@ -0,0 +1,130 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + +#[cfg(test)] +mod tests { + use webb::evm::contract::protocol_solidity::fungible_token_wrapper::FungibleTokenWrapperContract; + use webb::evm::ethers::core::rand::thread_rng; + use webb::evm::ethers::utils::parse_ether; + use webb::evm::{ + contract::protocol_solidity::variable_anchor_tree::VAnchorTreeContract, + ethers::signers::{LocalWallet, Signer}, + }; + use webb_relayer_config::cli::setup_logger; + + use crate::utils::{ + get_evm_leaves, get_git_root_path, get_hermes_bridge_info, + start_hermes_chain, vanchor_deposit_setup, + }; + use webb_relayer::service::build_web_services; + use webb_relayer_context::RelayerContext; + + #[tokio::test] + async fn test_data_caching_apis() { + dotenv::dotenv().unwrap(); + let git_root_path = get_git_root_path(); + + // start hermes chain + let hermes_chain = start_hermes_chain(); + let hermes_bridge = get_hermes_bridge_info(); + + let secret_key = hermes_chain.keys()[0].clone(); + let deployer_wallet1 = + LocalWallet::from(secret_key.clone()).with_chain_id(5001u32); + + // Start the relayer + setup_logger(3i32, "webb_relayer").unwrap(); + let config_path = + git_root_path.join("relayer-tests/chain/relayer-configs"); + let config = webb_relayer_config::utils::load(config_path).unwrap(); + let store = webb_relayer_store::sled::SledStore::temporary().unwrap(); + let ctx = RelayerContext::new(config, store.clone()).await.unwrap(); + let server_handle = tokio::spawn(build_web_services(ctx.clone())); + webb_relayer::service::ignite(ctx.clone(), std::sync::Arc::new(store)) + .await + .unwrap(); + + // Vanchor instance on hermes chain + let vanchor = VAnchorTreeContract::new( + hermes_bridge.vanchor, + hermes_chain.client(), + ); + let fungible_token_wrapper = FungibleTokenWrapperContract::new( + hermes_bridge.fungible_token_wrapper, + hermes_chain.client(), + ); + // Approve token spending on vanchor. + fungible_token_wrapper + .approve(vanchor.address(), parse_ether(1000).unwrap()) + .send() + .await + .unwrap(); + // Mint tokens on wallet. + fungible_token_wrapper + .mint(deployer_wallet1.address(), parse_ether(1000).unwrap()) + .send() + .await + .unwrap(); + + let recipient_wallet = + LocalWallet::new(&mut thread_rng()).with_chain_id(5002u32); + let relayer_wallet = + LocalWallet::new(&mut thread_rng()).with_chain_id(5001u32); + + let root = vanchor.get_last_root().call().await.unwrap(); + let neighbor_roots = + vanchor.get_latest_neighbor_roots().call().await.unwrap(); + let typed_source_chain_id = hermes_chain.typed_chain_id(); + let types_target_chain_id = hermes_chain.typed_chain_id(); + + let vanchor_tx_setup = vanchor_deposit_setup( + typed_source_chain_id, + types_target_chain_id, + relayer_wallet.address(), + recipient_wallet.address(), + hermes_bridge.fungible_token_wrapper, + root, + neighbor_roots, + ); + let proof_bytes = vanchor_tx_setup.proof.encode().unwrap(); + let tx = vanchor.transact( + proof_bytes.into(), + [0u8; 32].into(), + vanchor_tx_setup.common_ext_data, + vanchor_tx_setup.public_inputs.clone(), + vanchor_tx_setup.encryptions, + ); + tx.send() + .await + .map_err(|e| e.decode_revert::()) + .unwrap(); + + println!(" Deposit successful"); + + let cached_leaves = + get_evm_leaves(hermes_chain.chain_id(), hermes_bridge.vanchor) + .await + .unwrap(); + println!("Statues: {:?}", cached_leaves.status()); + println!("Cached leaves: {:?}", cached_leaves.text().await.unwrap()); + assert_eq!(1, 2); + + // Shutdown chains. + hermes_chain.shutdown(); + // Shutdown relayer + ctx.shutdown(); + server_handle.abort(); + } +} diff --git a/relayer-tests/src/lib.rs b/relayer-tests/src/lib.rs new file mode 100644 index 000000000..f788805f3 --- /dev/null +++ b/relayer-tests/src/lib.rs @@ -0,0 +1,18 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + +pub mod api_test; +pub mod tx_relaying; +pub mod utils; diff --git a/relayer-tests/src/tx_relaying.rs b/relayer-tests/src/tx_relaying.rs new file mode 100644 index 000000000..473d00760 --- /dev/null +++ b/relayer-tests/src/tx_relaying.rs @@ -0,0 +1,331 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + +//! In this example we will show how to use the webb relayer in depth. + +#[cfg(test)] +mod tests { + use webb::evm::contract::protocol_solidity::fungible_token_wrapper::FungibleTokenWrapperContract; + use webb::evm::ethers::core::rand::thread_rng; + use webb::evm::ethers::utils::parse_ether; + use webb_relayer_handler_utils::{ + EvmCommandType, EvmVanchorCommand, WebbI256, + }; + use webb_relayer_tx_relay_utils::{ + ExtData as RelayerExtData, ProofData as RelayerProodData, + VAnchorRelayTransaction, + }; + + use webb::evm::ethers::types::{Bytes, U256}; + use webb::evm::{ + contract::protocol_solidity::variable_anchor_tree::VAnchorTreeContract, + ethers::signers::{LocalWallet, Signer}, + }; + + use crate::utils::{ + get_git_root_path, get_hermes_bridge_info, send_evm_tx, + start_hermes_chain, vanchor_deposit_setup, vanchor_withdraw_setup, + }; + use webb_relayer::service::build_web_services; + use webb_relayer_context::RelayerContext; + + #[tokio::test] + async fn test_tx_relaying() { + dotenv::dotenv().unwrap(); + let git_root_path = get_git_root_path(); + + // start hermes chain + let hermes_chain = start_hermes_chain(); + let hermes_bridge = get_hermes_bridge_info(); + + let secret_key = hermes_chain.keys()[0].clone(); + let deployer_wallet1 = + LocalWallet::from(secret_key.clone()).with_chain_id(5001u32); + + // Start the relayer + let config_path = + git_root_path.join("relayer-tests/chain/relayer-configs"); + let config = webb_relayer_config::utils::load(config_path).unwrap(); + let store = webb_relayer_store::sled::SledStore::temporary().unwrap(); + let ctx = RelayerContext::new(config, store.clone()).await.unwrap(); + let server_handle = tokio::spawn(build_web_services(ctx.clone())); + webb_relayer::service::ignite(ctx.clone(), std::sync::Arc::new(store)) + .await + .unwrap(); + + // Vanchor instance on hermes chain + let vanchor = VAnchorTreeContract::new( + hermes_bridge.vanchor, + hermes_chain.client(), + ); + let fungible_token_wrapper = FungibleTokenWrapperContract::new( + hermes_bridge.fungible_token_wrapper, + hermes_chain.client(), + ); + // Approve token spending on vanchor. + fungible_token_wrapper + .approve(vanchor.address(), parse_ether(1000).unwrap()) + .send() + .await + .unwrap(); + // Mint tokens on wallet. + fungible_token_wrapper + .mint(deployer_wallet1.address(), parse_ether(1000).unwrap()) + .send() + .await + .unwrap(); + + let recipient_wallet = + LocalWallet::new(&mut thread_rng()).with_chain_id(5002u32); + let relayer_wallet = + LocalWallet::new(&mut thread_rng()).with_chain_id(5001u32); + + let root = vanchor.get_last_root().call().await.unwrap(); + let neighbor_roots = + vanchor.get_latest_neighbor_roots().call().await.unwrap(); + let typed_source_chain_id = hermes_chain.typed_chain_id(); + let types_target_chain_id = hermes_chain.typed_chain_id(); + + let vanchor_tx_setup = vanchor_deposit_setup( + typed_source_chain_id, + types_target_chain_id, + relayer_wallet.address(), + recipient_wallet.address(), + hermes_bridge.fungible_token_wrapper, + root, + neighbor_roots, + ); + let proof_bytes = vanchor_tx_setup.proof.encode().unwrap(); + let tx = vanchor.transact( + proof_bytes.into(), + [0u8; 32].into(), + vanchor_tx_setup.common_ext_data, + vanchor_tx_setup.public_inputs.clone(), + vanchor_tx_setup.encryptions, + ); + tx.send() + .await + .map_err(|e| e.decode_revert::()) + .unwrap(); + + println!(" Deposit successful"); + + // Withdraw tokens on hermes chain. + let root = vanchor.get_last_root().call().await.unwrap(); + let neighbor_roots = + vanchor.get_latest_neighbor_roots().call().await.unwrap(); + let vanchor_withdraw_setup = vanchor_withdraw_setup( + typed_source_chain_id, + types_target_chain_id, + relayer_wallet.address(), + recipient_wallet.address(), + hermes_bridge.fungible_token_wrapper, + root, + neighbor_roots, + vanchor_tx_setup.output_utxos, // output_utxos from deposit + ); + let proof_bytes = vanchor_withdraw_setup.proof.encode().unwrap(); + + // Check recipient balance before withdrawal should be 0. + let balance_before = fungible_token_wrapper + .balance_of(recipient_wallet.address()) + .call() + .await + .unwrap(); + + println!("Recipient balance before: {}", balance_before); + assert_eq!(balance_before, U256::zero()); + + let vanchor_cmd = VAnchorRelayTransaction { + proof_data: RelayerProodData { + proof: Bytes(proof_bytes.clone().into()), + roots: vanchor_withdraw_setup.public_inputs.roots.clone(), + extension_roots: Bytes(b"0x".to_vec().into()), + input_nullifiers: vanchor_withdraw_setup + .public_inputs + .input_nullifiers + .clone(), + output_commitments: vanchor_withdraw_setup + .public_inputs + .output_commitments + .to_vec(), + public_amount: vanchor_withdraw_setup + .public_inputs + .public_amount, + ext_data_hash: vanchor_withdraw_setup + .public_inputs + .ext_data_hash, + }, + ext_data: RelayerExtData { + recipient: vanchor_withdraw_setup.common_ext_data.recipient, + relayer: vanchor_withdraw_setup.common_ext_data.relayer, + ext_amount: WebbI256( + vanchor_withdraw_setup.common_ext_data.ext_amount, + ), + fee: vanchor_withdraw_setup.common_ext_data.fee, + refund: vanchor_withdraw_setup.common_ext_data.refund, + token: vanchor_withdraw_setup.common_ext_data.token, + encrypted_output1: vanchor_withdraw_setup + .encryptions + .encrypted_output_1, + encrypted_output2: vanchor_withdraw_setup + .encryptions + .encrypted_output_2, + }, + }; + let evm_cmd: EvmVanchorCommand = EvmCommandType::VAnchor(vanchor_cmd); + let _response = + send_evm_tx(hermes_chain.chain_id(), vanchor.address(), evm_cmd) + .await + .unwrap(); + + // Check recipient balance after withdrawal should be 10. + let balance = fungible_token_wrapper + .balance_of(recipient_wallet.address()) + .call() + .await + .unwrap(); + assert_eq!(balance, U256::from(10)); + + // Shutdown chains. + hermes_chain.shutdown(); + // Shutdown relayer + ctx.shutdown(); + server_handle.abort(); + } + + #[tokio::test] + async fn test_submit_invalid_proof() { + dotenv::dotenv().unwrap(); + let git_root_path = get_git_root_path(); + + // start hermes chain + let hermes_chain = start_hermes_chain(); + let hermes_bridge = get_hermes_bridge_info(); + + let secret_key = hermes_chain.keys()[0].clone(); + let deployer_wallet1 = + LocalWallet::from(secret_key.clone()).with_chain_id(5001u32); + + // Start the relayer + let config_path = + git_root_path.join("relayer-tests/chain/relayer-configs"); + let config = webb_relayer_config::utils::load(config_path).unwrap(); + let store = webb_relayer_store::sled::SledStore::temporary().unwrap(); + let ctx = RelayerContext::new(config, store.clone()).await.unwrap(); + let server_handle = tokio::spawn(build_web_services(ctx.clone())); + webb_relayer::service::ignite(ctx.clone(), std::sync::Arc::new(store)) + .await + .unwrap(); + + // Vanchor instance on hermes chain + let vanchor = VAnchorTreeContract::new( + hermes_bridge.vanchor, + hermes_chain.client(), + ); + let fungible_token_wrapper = FungibleTokenWrapperContract::new( + hermes_bridge.fungible_token_wrapper, + hermes_chain.client(), + ); + // Approve token spending on vanchor. + fungible_token_wrapper + .approve(vanchor.address(), parse_ether(1000).unwrap()) + .send() + .await + .unwrap(); + // Mint tokens on wallet. + fungible_token_wrapper + .mint(deployer_wallet1.address(), parse_ether(1000).unwrap()) + .send() + .await + .unwrap(); + + let recipient_wallet = + LocalWallet::new(&mut thread_rng()).with_chain_id(5002u32); + let relayer_wallet = + LocalWallet::new(&mut thread_rng()).with_chain_id(5001u32); + + let root = vanchor.get_last_root().call().await.unwrap(); + let neighbor_roots = + vanchor.get_latest_neighbor_roots().call().await.unwrap(); + let typed_source_chain_id = hermes_chain.typed_chain_id(); + let types_target_chain_id = hermes_chain.typed_chain_id(); + + let vanchor_tx_setup = vanchor_deposit_setup( + typed_source_chain_id, + types_target_chain_id, + relayer_wallet.address(), + recipient_wallet.address(), + hermes_bridge.fungible_token_wrapper, + root, + neighbor_roots, + ); + let proof_bytes = vanchor_tx_setup.proof.encode().unwrap(); + let tx = vanchor.transact( + proof_bytes.into(), + [0u8; 32].into(), + vanchor_tx_setup.common_ext_data, + vanchor_tx_setup.public_inputs.clone(), + vanchor_tx_setup.encryptions, + ); + tx.send() + .await + .map_err(|e| e.decode_revert::()) + .unwrap(); + + println!(" Deposit successful"); + + // Withdraw tokens on hermes chain. + let root = vanchor.get_last_root().call().await.unwrap(); + let neighbor_roots = + vanchor.get_latest_neighbor_roots().call().await.unwrap(); + let vanchor_withdraw_setup = vanchor_withdraw_setup( + typed_source_chain_id, + types_target_chain_id, + relayer_wallet.address(), + recipient_wallet.address(), + hermes_bridge.fungible_token_wrapper, + root, + neighbor_roots, + vanchor_tx_setup.output_utxos, // output_utxos from deposit + ); + let proof_bytes = vanchor_withdraw_setup.proof.encode().unwrap(); + let mut proof_input = vanchor_withdraw_setup.public_inputs.clone(); + proof_input.input_nullifiers[0] = U256::zero(); + let tx = vanchor.transact( + proof_bytes.into(), + [0u8; 32].into(), + vanchor_withdraw_setup.common_ext_data, + proof_input, + vanchor_withdraw_setup.encryptions, + ); + let maybe_res = tx.send().await; + match maybe_res { + Ok(_) => {} + Err(e) => { + assert_eq!( + "Invalid withdraw proof".to_string(), + e.decode_revert::().unwrap() + ); + } + } + + // Shutdown chains. + hermes_chain.shutdown(); + // Shutdown relayer + ctx.shutdown(); + server_handle.abort(); + } +} diff --git a/relayer-tests/src/utils.rs b/relayer-tests/src/utils.rs new file mode 100644 index 000000000..6f55f702f --- /dev/null +++ b/relayer-tests/src/utils.rs @@ -0,0 +1,381 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + +#![allow(clippy::unwrap_used, clippy::indexing_slicing)] + +use ark_ff::{BigInteger, PrimeField}; +use arkworks_setups::utxo::Utxo; +use reqwest::Response; +use std::{path::PathBuf, str::FromStr}; +use webb::evm::contract::protocol_solidity::variable_anchor_tree::{ + CommonExtData, Encryptions, PublicInputs, +}; +use webb::evm::ethers::{ + types::{H160, U256}, + utils::keccak256, +}; +use webb_evm_test_utils::circom_proving::types::Proof as SolidityProof; +use webb_evm_test_utils::types::IntoAbiToken; +use webb_evm_test_utils::{ + types::ExtData, + utils::{ + deconstruct_public_inputs_el, setup_utxos, setup_vanchor_circuit, + vanchor_2_2_fixtures, + }, + v_bridge::VAnchorBridgeInfo, + LocalEvmChain, +}; +use webb_relayer_handler_utils::EvmVanchorCommand; + +type Bn254Fr = ark_bn254::Fr; + +pub fn start_hermes_chain() -> LocalEvmChain { + // Get saved chain state with deployed contracts for testing. + let git_root_path = get_git_root_path(); + let source = + git_root_path.join("relayer-tests/chain/hermes/chain-state/state.json"); + let tmp_dir = tempfile::TempDir::with_prefix("hermes").unwrap(); + let hermes_chain_state = tmp_dir.path(); + std::fs::copy(source, hermes_chain_state.join("state.json")).unwrap(); + + LocalEvmChain::new_with_chain_state( + 5001, + String::from("Hermes"), + hermes_chain_state, + Some(8545u16), + ) +} + +pub fn get_git_root_path() -> PathBuf { + let git_root = std::process::Command::new("git") + .args(["rev-parse", "--show-toplevel"]) + .output() + .expect("Failed to get git root") + .stdout; + let git_root = std::str::from_utf8(&git_root) + .expect("Failed to parse git root") + .trim() + .to_string(); + PathBuf::from(&git_root) +} + +// Returns bridge info for saved chain state after deploying contracts. +pub fn get_hermes_bridge_info() -> VAnchorBridgeInfo { + VAnchorBridgeInfo { + bridge: H160::from_str("0x5fbdb2315678afecb367f032d93f642f64180aa3") + .unwrap(), + vanchor: H160::from_str("0x68b1d87f95878fe05b998f19b66f4baba5de1aed") + .unwrap(), + vanchor_handler: H160::from_str( + "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", + ) + .unwrap(), + treasury: H160::from_str("0xcf7ed3acca5a467e9e704c703e8d87f634fb0fc9") + .unwrap(), + treasury_handler: H160::from_str( + "0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0", + ) + .unwrap(), + fungible_token_wrapper: H160::from_str( + "0x0b306bf915c4d645ff596e518faf3f9669b97016", + ) + .unwrap(), + token_wrapper_handler: H160::from_str( + "0x9a676e781a523b5d0c0e43731313a708cb607508", + ) + .unwrap(), + } +} + +pub async fn send_evm_tx( + chain_id: u32, + vanchor_address: H160, + evm_cmd: EvmVanchorCommand, +) -> Result { + let api = format!( + "http://0.0.0.0:9955/api/v1/send/evm/{}/{}", + chain_id, vanchor_address + ); + let payload = + serde_json::to_string(&evm_cmd).expect("Failed to serialize JSON"); + // send post api + let response = reqwest::Client::new() + .post(api) + .json(&payload) + .send() + .await + .unwrap(); + Ok(response) +} + +pub async fn get_evm_leaves( + chain_id: u32, + vanchor_address: H160, +) -> Result { + let api = format!( + "http://0.0.0.0:9955/api/v1/leaves/evm/{}/0x{}", + chain_id, + hex::encode(vanchor_address.0) + ); + + println!("api: {}", api); + let response = reqwest::Client::new().get(api).send().await.unwrap(); + Ok(response) +} + +pub struct VanchorTxSetup { + pub input_utxos: [Utxo; 2], + pub output_utxos: [Utxo; 2], + pub common_ext_data: CommonExtData, + pub public_inputs: PublicInputs, + pub encryptions: Encryptions, + pub proof: SolidityProof, +} +pub fn vanchor_deposit_setup( + typed_source_chain_id: u64, + types_target_chain_id: u64, + relayer: H160, + recipient: H160, + token: H160, + root: U256, + neighbor_roots: Vec, +) -> VanchorTxSetup { + let git_root_path = get_git_root_path(); + let fixture_path = git_root_path.join("relayer-tests/solidity-fixtures"); + let (params_2_2, wc_2_2) = vanchor_2_2_fixtures(&fixture_path); + + let ext_amount = 10_i128; + let public_amount = 10_i128; + let fee = 0_i128; + let refund = 0_i128.into(); + + let input_chain_ids = [typed_source_chain_id, types_target_chain_id]; + let input_amounts = [0, 0]; + let input_indices = [0, 1]; + let output_chain_ids = [typed_source_chain_id, types_target_chain_id]; + let output_amount = [10, 0]; + let output_indices = [0, 0]; + + let input_utxos = + setup_utxos(input_chain_ids, input_amounts, Some(input_indices)); + let output_utxos = + setup_utxos(output_chain_ids, output_amount, Some(output_indices)); + + let encrypted_output1 = + output_utxos[0].commitment.into_repr().to_bytes_be(); + let encrypted_output2 = + output_utxos[1].commitment.into_repr().to_bytes_be(); + + let leaf0 = input_utxos[0].commitment.into_repr().to_bytes_be(); + let leaf1 = input_utxos[1].commitment.into_repr().to_bytes_be(); + + let leaves: Vec> = vec![leaf0, leaf1]; + + let ext_data = ExtData::builder() + .recipient(recipient) + .relayer(relayer) + .ext_amount(ext_amount) + .fee(fee.into()) + .refund(refund) + .token(token) + .encrypted_output1(encrypted_output1.clone()) + .encrypted_output2(encrypted_output2.clone()) + .build(); + + let ext_data_hash = keccak256(ext_data.encode_abi_token()); + + let (proof, public_inputs) = setup_vanchor_circuit( + public_amount, + typed_source_chain_id, + ext_data_hash.to_vec(), + input_utxos.clone(), + output_utxos.clone(), + root, + [neighbor_roots[0]], + leaves, + ¶ms_2_2, + wc_2_2, + ); + + let solidity_proof = SolidityProof::try_from(proof).unwrap(); + + let common_ext_data = CommonExtData { + recipient, + ext_amount: ext_data.ext_amount.into(), + relayer, + fee: ext_data.fee, + refund, + token, + }; + + // Deconstructing public inputs + let ( + _chain_id, + public_amount, + root_set, + nullifiers, + commitments, + ext_data_hash, + ) = deconstruct_public_inputs_el(&public_inputs); + + let flattened_root: Vec = root_set + .iter() + .flat_map(|x| { + let mut be_bytes = [0u8; 32]; + x.to_big_endian(&mut be_bytes); + be_bytes + }) + .collect(); + let public_inputs = PublicInputs { + roots: flattened_root.into(), + extension_roots: b"0x".to_vec().into(), + input_nullifiers: nullifiers, + output_commitments: commitments, + public_amount, + ext_data_hash, + }; + + let encryptions = Encryptions { + encrypted_output_1: encrypted_output1.into(), + encrypted_output_2: encrypted_output2.into(), + }; + + VanchorTxSetup { + input_utxos, + output_utxos, + common_ext_data, + public_inputs, + encryptions, + proof: solidity_proof, + } +} + +#[allow(clippy::too_many_arguments)] +pub fn vanchor_withdraw_setup( + typed_source_chain_id: u64, + types_target_chain_id: u64, + relayer: H160, + recipient: H160, + token: H160, + root: U256, + neighbor_roots: Vec, + output_utxos: [Utxo; 2], +) -> VanchorTxSetup { + let git_root_path = get_git_root_path(); + let fixture_path = git_root_path.join("relayer-tests/solidity-fixtures"); + let (params_2_2, wc_2_2) = vanchor_2_2_fixtures(&fixture_path); + + let ext_amount = -10_i128; + let public_amount = -10_i128; + let fee = 0_i128; + let refund = 0_i128; + + let output_chain_ids = [typed_source_chain_id, types_target_chain_id]; + let output_amount = [0, 0]; + let output_indices = [0, 0]; + let input_utxos = output_utxos; // Use the output utxos from the previous transaction as input utxos. + + let output_utxos = + setup_utxos(output_chain_ids, output_amount, Some(output_indices)); + + let encrypted_output1 = + output_utxos[0].commitment.into_repr().to_bytes_be(); + let encrypted_output2 = + output_utxos[1].commitment.into_repr().to_bytes_be(); + + let leaf0 = input_utxos[0].commitment.into_repr().to_bytes_be(); + let leaf1 = input_utxos[1].commitment.into_repr().to_bytes_be(); + + let leaves: Vec> = vec![leaf0, leaf1]; + + let ext_data = ExtData::builder() + .recipient(recipient) + .relayer(relayer) + .ext_amount(ext_amount) + .fee(fee.into()) + .refund(refund.into()) + .token(token) + .encrypted_output1(encrypted_output1.clone()) + .encrypted_output2(encrypted_output2.clone()) + .build(); + + let ext_data_hash_bytes = keccak256(ext_data.encode_abi_token()); + + let (proof, public_inputs) = setup_vanchor_circuit( + public_amount, + typed_source_chain_id, + ext_data_hash_bytes.to_vec(), + input_utxos.clone(), + output_utxos.clone(), + root, + [neighbor_roots[0]], + leaves, + ¶ms_2_2, + wc_2_2, + ); + + let solidity_proof = SolidityProof::try_from(proof).unwrap(); + + // Deconstructing public inputs + let ( + _chain_id, + public_amount, + root_set, + nullifiers, + commitments, + ext_data_hash, + ) = deconstruct_public_inputs_el(&public_inputs); + + let flattened_root: Vec = root_set + .iter() + .flat_map(|x| { + let mut be_bytes = [0u8; 32]; + x.to_big_endian(&mut be_bytes); + be_bytes + }) + .collect(); + + let common_ext_data = CommonExtData { + recipient, + ext_amount: ext_data.ext_amount.into(), + relayer, + fee: ext_data.fee, + refund: ext_data.refund, + token, + }; + + let public_inputs = PublicInputs { + roots: flattened_root.into(), + extension_roots: b"0x".to_vec().into(), + input_nullifiers: nullifiers, + output_commitments: commitments, + public_amount, + ext_data_hash, + }; + + let encryptions = Encryptions { + encrypted_output_1: encrypted_output1.into(), + encrypted_output_2: encrypted_output2.into(), + }; + + VanchorTxSetup { + input_utxos, + output_utxos, + common_ext_data, + public_inputs, + encryptions, + proof: solidity_proof, + } +} diff --git a/services/webb-relayer/Cargo.toml b/services/webb-relayer/Cargo.toml index 2e18f35c0..a9b01a8c9 100644 --- a/services/webb-relayer/Cargo.toml +++ b/services/webb-relayer/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "webb-relayer" description = "The Webb Relayer toolkit" -exclude = ["tests", "config", ".github", "ci", "assets", "docker"] +exclude = ["config", ".github", "ci", "assets", "docker"] version = { workspace = true } authors = { workspace = true } edition = { workspace = true } @@ -23,6 +23,8 @@ name = "in-depth" path = "../../examples/in_depth.rs" required-features = ["cli"] + + [dependencies] webb-proposal-signing-backends = { workspace = true } webb-relayer-tx-queue = { workspace = true } @@ -33,7 +35,7 @@ webb-relayer-context = { workspace = true } webb-relayer-utils = { workspace = true } webb-relayer-types = { workspace = true } webb-event-watcher-traits = { workspace = true } -webb-ew-dkg = { workspace = true } +webb-ew-tangle = { workspace = true } webb-ew-evm = { workspace = true } anyhow = { workspace = true, optional = true } @@ -55,8 +57,7 @@ axum = { workspace = true } tower-http = { version = "0.4", features = ["cors", "trace"] } -[dev-dependencies] -tempfile = { workspace = true } + [features] default = ["evm-runtime", "substrate-runtime"] diff --git a/services/webb-relayer/src/lib.rs b/services/webb-relayer/src/lib.rs index a0de9f406..01e62a570 100644 --- a/services/webb-relayer/src/lib.rs +++ b/services/webb-relayer/src/lib.rs @@ -1,16 +1,17 @@ -// Copyright 2022 Webb Technologies Inc. +// Copyright (C) 2022-2024 Webb Technologies Inc. // -// 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 +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. // -// 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. +// You should receive a copy of the GNU General Public License +// If not, see . #![deny(unsafe_code)] #![warn(missing_docs)] diff --git a/services/webb-relayer/src/main.rs b/services/webb-relayer/src/main.rs index 3ff0ca2a0..6b63142a3 100644 --- a/services/webb-relayer/src/main.rs +++ b/services/webb-relayer/src/main.rs @@ -1,16 +1,17 @@ -// Copyright 2022 Webb Technologies Inc. +// Copyright (C) 2022-2024 Webb Technologies Inc. // -// 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 +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. // -// 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. +// You should receive a copy of the GNU General Public License +// If not, see . //! Webb Relayer Binary. #![deny(unsafe_code)] diff --git a/services/webb-relayer/src/service/evm.rs b/services/webb-relayer/src/service/evm.rs index 53fd7dc0b..e44a21d72 100644 --- a/services/webb-relayer/src/service/evm.rs +++ b/services/webb-relayer/src/service/evm.rs @@ -1,3 +1,18 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + use std::sync::Arc; use axum::routing::{get, post}; diff --git a/services/webb-relayer/src/service/mod.rs b/services/webb-relayer/src/service/mod.rs index e32984b55..6964251d3 100644 --- a/services/webb-relayer/src/service/mod.rs +++ b/services/webb-relayer/src/service/mod.rs @@ -1,16 +1,17 @@ -// Copyright 2022 Webb Technologies Inc. +// Copyright (C) 2022-2024 Webb Technologies Inc. // -// 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 +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. // -// 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. +// You should receive a copy of the GNU General Public License +// If not, see . //! # Relayer Service Module 🕸️ //! @@ -31,7 +32,7 @@ use tower_http::cors::CorsLayer; use tower_http::trace::TraceLayer; use webb_proposal_signing_backends::SigningRulesContractWrapper; use webb_proposal_signing_backends::{ - DkgProposalSigningRulesBackend, MockedProposalSigningBackend, + MockedProposalSigningBackend, SigningRulesBackend, }; use webb_relayer_config::anchor::LinkedAnchorConfig; @@ -103,7 +104,7 @@ pub enum ProposalSigningBackendSelector { /// Mocked Mocked(MockedProposalSigningBackend), /// Dkg - Dkg(DkgProposalSigningRulesBackend), + Dkg(SigningRulesBackend), } /// utility to configure proposal signing backend pub async fn make_proposal_signing_backend( @@ -127,7 +128,7 @@ pub async fn make_proposal_signing_backend( let client = ctx.evm_provider(chain_id).await?; let wrapper = SigningRulesContractWrapper::new(signing_rules_config, client); - let backend = DkgProposalSigningRulesBackend::builder() + let backend = SigningRulesBackend::builder() .wrapper(wrapper) .src_chain_id(chain_id) .store(store.clone()) @@ -136,7 +137,7 @@ pub async fn make_proposal_signing_backend( } Some(ProposalSigningBackendConfig::Mocked(mocked)) => { // if it is the mocked backend, we will use the MockedProposalSigningBackend to sign the proposal. - // which is a bit simpler than the DkgProposalSigningRulesBackend. + // which is a bit simpler than the SigningRulesBackend. // get only the linked chains to that anchor. let mut signature_bridges: HashSet = HashSet::new(); diff --git a/services/webb-relayer/src/service/tangle.rs b/services/webb-relayer/src/service/tangle.rs index 318c33c36..6cfbe2325 100644 --- a/services/webb-relayer/src/service/tangle.rs +++ b/services/webb-relayer/src/service/tangle.rs @@ -1,7 +1,22 @@ +// Copyright (C) 2022-2024 Webb Technologies Inc. +// +// Tangle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Tangle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should receive a copy of the GNU General Public License +// If not, see . + use std::sync::Arc; use webb::substrate::subxt; use webb_event_watcher_traits::SubstrateEventWatcher; -use webb_ew_dkg::*; +use webb_ew_tangle::*; use webb_relayer_config::substrate::{ JobsPalletConfig, Pallet, SubstrateConfig, }; @@ -52,7 +67,7 @@ async fn ignite_tangle_runtime( } } } - // start the transaction queue for dkg-substrate extrinsics after starting other tasks. + // start the transaction queue for tangle based extrinsics after starting other tasks. start_tx_queue::(ctx, chain_id, store)?; Ok(()) }