diff --git a/Cargo.lock b/Cargo.lock index 1ba6a0fb..5586d70a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -333,7 +333,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0944d18a9a37691b87733b39c9360c9950af9aa5f97e2455bc108d8eb64fc1c1" dependencies = [ "bitvec", - "blake2s_simd", + "blake2s_simd 0.5.11", "byteorder", "crossbeam-channel", "ff", @@ -469,6 +469,17 @@ dependencies = [ "constant_time_eq", ] +[[package]] +name = "blake2s_simd" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db539cc2b5f6003621f1cd9ef92d7ded8ea5232c7de0f9faa2de251cd98730d4" +dependencies = [ + "arrayref", + "arrayvec 0.7.2", + "constant_time_eq", +] + [[package]] name = "blanket" version = "0.2.0" @@ -490,6 +501,15 @@ dependencies = [ "generic-array", ] +[[package]] +name = "block-buffer" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf7fe51849ea569fd452f37822f606a5cabb684dc918707a0193fd4664ff324" +dependencies = [ + "generic-array", +] + [[package]] name = "block-modes" version = "0.8.1" @@ -548,9 +568,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.9.1" +version = "3.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a45a46ab1f2412e53d3a0ade76ffad2025804294569aae387231a0cd6e0899" +checksum = "8f1e260c3a9040a7c19a12468758f4c16f31a81a1fe087482be9570ec864bb6c" [[package]] name = "bytemuck" @@ -962,6 +982,16 @@ dependencies = [ "subtle", ] +[[package]] +name = "crypto-common" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57952ca27b5e3606ff4dd79b0020231aaf9d6aa76dc05fd30137538c50bd3ce8" +dependencies = [ + "generic-array", + "typenum", +] + [[package]] name = "crypto-mac" version = "0.11.1" @@ -1010,7 +1040,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90f9d052967f590a76e62eb387bd0bbb1b000182c3cefe5364db6b7211651bc0" dependencies = [ "byteorder", - "digest", + "digest 0.9.0", "rand_core 0.5.1", "serde", "subtle", @@ -1205,6 +1235,16 @@ dependencies = [ "generic-array", ] +[[package]] +name = "digest" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506" +dependencies = [ + "block-buffer 0.10.2", + "crypto-common", +] + [[package]] name = "directories" version = "4.0.1" @@ -1378,9 +1418,18 @@ dependencies = [ [[package]] name = "equihash" version = "0.1.0" -source = "git+https://github.com/ZcashFoundation/librustzcash.git?tag=0.5.1-zebra-v1.0.0-beta.4#80d5b049b8e8127671026320a1c22841035345a4" +source = "git+https://github.com/ZcashFoundation/librustzcash.git?rev=c3ff94134b472ba90af665e5454983dc12de1338#c3ff94134b472ba90af665e5454983dc12de1338" dependencies = [ - "blake2b_simd 0.5.11", + "blake2b_simd 1.0.0", + "byteorder", +] + +[[package]] +name = "equihash" +version = "0.1.0" +source = "git+https://github.com/zcash/librustzcash.git?rev=d14e7a707ce01cefcbc82651dad48f002185dded#d14e7a707ce01cefcbc82651dad48f002185dded" +dependencies = [ + "blake2b_simd 1.0.0", "byteorder", ] @@ -1739,16 +1788,35 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" [[package]] -name = "halo2" -version = "0.1.0-beta.1" +name = "halo2_gadgets" +version = "0.1.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f186b85ed81082fb1cf59d52b0111f02915e89a4ac61d292b38d075e570f3a9" +checksum = "7524b798b8b3689a198cd87ee1d22fe3ca007a51d35c4093f32d75c0efc30abe" dependencies = [ - "blake2b_simd 0.5.11", + "arrayvec 0.7.2", + "bitvec", + "ff", + "group", + "halo2_proofs", + "lazy_static", + "pasta_curves", + "rand 0.8.5", + "subtle", + "uint", +] + +[[package]] +name = "halo2_proofs" +version = "0.1.0-beta.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0240b05b791cccfd6451b010b19711280e63b87f495bd84df0103f35c9139e7" +dependencies = [ + "blake2b_simd 1.0.0", + "bumpalo", "ff", "group", "pasta_curves", - "rand 0.8.5", + "rand_core 0.6.3", "rayon", ] @@ -1784,6 +1852,17 @@ dependencies = [ "num-traits", ] +[[package]] +name = "hdwallet" +version = "0.3.0" +source = "git+https://github.com/nuttycom/hdwallet?rev=9b4c1bdbe0517e3a7a8f285d6048a37d472ba3bc#9b4c1bdbe0517e3a7a8f285d6048a37d472ba3bc" +dependencies = [ + "lazy_static", + "rand_core 0.6.3", + "ring", + "secp256k1", +] + [[package]] name = "heck" version = "0.3.3" @@ -1817,7 +1896,7 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01706d578d5c281058480e673ae4086a9f4710d8df1ad80a5b03e39ece5f886b" dependencies = [ - "digest", + "digest 0.9.0", "hmac", ] @@ -1828,7 +1907,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" dependencies = [ "crypto-mac", - "digest", + "digest 0.9.0", ] [[package]] @@ -1948,17 +2027,9 @@ dependencies = [ [[package]] name = "incrementalmerkletree" -version = "0.1.0" -source = "git+https://github.com/zcash/incrementalmerkletree.git?rev=b7bd6246122a6e9ace8edb51553fbf5228906cbb#b7bd6246122a6e9ace8edb51553fbf5228906cbb" -dependencies = [ - "serde", -] - -[[package]] -name = "incrementalmerkletree" -version = "0.2.0" +version = "0.3.0-beta.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "186fd3ab92aeac865d4b80b410de9a7b341d31ba8281373caed0b6d17b2b5e96" +checksum = "5812f2cfa06a7694b842402e9a100529d80fdc3022ead65ad98ce0af0bcd3311" dependencies = [ "serde", ] @@ -2694,19 +2765,20 @@ dependencies = [ [[package]] name = "orchard" -version = "0.0.0" -source = "git+https://github.com/ZcashFoundation/orchard.git?rev=568e24cd5f129158375d7ac7d98c89ebff4f982f#568e24cd5f129158375d7ac7d98c89ebff4f982f" +version = "0.1.0-beta.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3bb8c5f5a0977683b5071650f1e7d91f296e344a796fda585086d5b4b0a74ea" dependencies = [ "aes", - "arrayvec 0.7.2", - "bigint", "bitvec", - "blake2b_simd 0.5.11", + "blake2b_simd 1.0.0", "ff", "fpe", "group", - "halo2", - "incrementalmerkletree 0.1.0", + "halo2_gadgets", + "halo2_proofs", + "hex", + "incrementalmerkletree", "lazy_static", "memuse", "nonempty", @@ -2715,7 +2787,7 @@ dependencies = [ "reddsa", "serde", "subtle", - "zcash_note_encryption", + "zcash_note_encryption 0.1.0 (git+https://github.com/zcash/librustzcash.git?rev=d14e7a707ce01cefcbc82651dad48f002185dded)", ] [[package]] @@ -2828,11 +2900,11 @@ dependencies = [ [[package]] name = "pasta_curves" -version = "0.2.1" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d647d91972bad78120fd61e06b225fcda117805c9bbf17676b51bd03a251278b" +checksum = "82b6fc4f73033f6aa52fdde0c38f1f570e7f2c244f22e441f62a144556891b8c" dependencies = [ - "blake2b_simd 0.5.11", + "blake2b_simd 1.0.0", "ff", "group", "lazy_static", @@ -3358,12 +3430,12 @@ dependencies = [ [[package]] name = "reddsa" -version = "0.0.0" -source = "git+https://github.com/str4d/redjubjub.git?rev=416a6a8ebf8bd42c114c938883016c04f338de72#416a6a8ebf8bd42c114c938883016c04f338de72" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a2efaed2ccc184ca4f82ed083ec0afe700c6254acae3d7732fc50ef79d5cbe9" dependencies = [ - "blake2b_simd 0.5.11", + "blake2b_simd 1.0.0", "byteorder", - "digest", "group", "jubjub", "pasta_curves", @@ -3380,7 +3452,7 @@ source = "git+https://github.com/ZcashFoundation/redjubjub.git?rev=a32ae3fc871bc dependencies = [ "blake2b_simd 0.5.11", "byteorder", - "digest", + "digest 0.9.0", "jubjub", "rand_core 0.6.3", "serde", @@ -3517,14 +3589,12 @@ dependencies = [ ] [[package]] -name = "ripemd160" -version = "0.9.1" +name = "ripemd" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eca4ecc81b7f313189bf73ce724400a07da2a6dac19588b03c8bd76a2dcc251" +checksum = "1facec54cb5e0dc08553501fa740091086d0259ad0067e0d4103448e4cb22ed3" dependencies = [ - "block-buffer", - "digest", - "opaque-debug", + "digest 0.10.3", ] [[package]] @@ -3564,7 +3634,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e05c2603e2823634ab331437001b411b9ed11660fbc4066f3908c84a9439260d" dependencies = [ "byteorder", - "digest", + "digest 0.9.0", "lazy_static", "num-bigint-dig", "num-integer", @@ -3963,10 +4033,10 @@ version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" dependencies = [ - "block-buffer", + "block-buffer 0.9.0", "cfg-if 1.0.0", "cpufeatures", - "digest", + "digest 0.9.0", "opaque-debug", ] @@ -3976,10 +4046,10 @@ version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" dependencies = [ - "block-buffer", + "block-buffer 0.9.0", "cfg-if 1.0.0", "cpufeatures", - "digest", + "digest 0.9.0", "opaque-debug", ] @@ -3989,8 +4059,8 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f81199417d4e5de3f04b1e871023acea7389672c4135918f05aa9cbf2f2fa809" dependencies = [ - "block-buffer", - "digest", + "block-buffer 0.9.0", + "digest 0.9.0", "keccak", "opaque-debug", ] @@ -4531,7 +4601,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e4157b94753f8a92d05c549b0d9fc3a3b504ca5fc420f867d3f4f7c45e93f2b" dependencies = [ "caret", - "digest", + "digest 0.9.0", "signature", "tor-bytes", "tor-checkable", @@ -4616,7 +4686,7 @@ version = "0.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc7e43aaa30b9bf401f8a617fcbbbefb1632145c79277bf93836ccc50615cdca" dependencies = [ - "digest", + "digest 0.9.0", "hex", "thiserror", "tor-llcrypto", @@ -4654,7 +4724,7 @@ dependencies = [ "async-trait", "base64", "derive_builder", - "digest", + "digest 0.9.0", "fslock", "futures", "hex", @@ -4728,7 +4798,7 @@ dependencies = [ "arrayref", "base64", "curve25519-dalek", - "digest", + "digest 0.9.0", "ed25519-dalek", "getrandom 0.2.5", "hex", @@ -4777,7 +4847,7 @@ checksum = "93d86c132e5f474e2793ab81769094b030c7363a142b91468ebe1307c8a170ce" dependencies = [ "base64", "bitflags", - "digest", + "digest 0.9.0", "hex", "once_cell", "phf", @@ -4818,7 +4888,7 @@ dependencies = [ "cipher", "coarsetime", "crypto-mac", - "digest", + "digest 0.9.0", "futures", "generic-array", "hkdf", @@ -5123,9 +5193,9 @@ checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" [[package]] name = "uint" -version = "0.9.3" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12f03af7ccf01dd611cc450a0d10dbc9b745770d096473e2faf0ca6e2d66d1e0" +checksum = "6470ab50f482bde894a037a57064480a246dbfdd5960bd65a44824693f08da5f" dependencies = [ "byteorder", "crunchy 0.2.2", @@ -5554,7 +5624,16 @@ dependencies = [ [[package]] name = "zcash_encoding" version = "0.0.0" -source = "git+https://github.com/ZcashFoundation/librustzcash.git?tag=0.5.1-zebra-v1.0.0-beta.4#80d5b049b8e8127671026320a1c22841035345a4" +source = "git+https://github.com/ZcashFoundation/librustzcash.git?rev=c3ff94134b472ba90af665e5454983dc12de1338#c3ff94134b472ba90af665e5454983dc12de1338" +dependencies = [ + "byteorder", + "nonempty", +] + +[[package]] +name = "zcash_encoding" +version = "0.0.0" +source = "git+https://github.com/zcash/librustzcash.git?rev=d14e7a707ce01cefcbc82651dad48f002185dded#d14e7a707ce01cefcbc82651dad48f002185dded" dependencies = [ "byteorder", "nonempty", @@ -5572,15 +5651,22 @@ dependencies = [ [[package]] name = "zcash_note_encryption" -version = "0.0.0" -source = "git+https://github.com/ZcashFoundation/librustzcash.git?tag=0.5.1-zebra-v1.0.0-beta.4#80d5b049b8e8127671026320a1c22841035345a4" +version = "0.1.0" +source = "git+https://github.com/ZcashFoundation/librustzcash.git?rev=c3ff94134b472ba90af665e5454983dc12de1338#c3ff94134b472ba90af665e5454983dc12de1338" +dependencies = [ + "chacha20", + "chacha20poly1305", + "rand_core 0.6.3", + "subtle", +] + +[[package]] +name = "zcash_note_encryption" +version = "0.1.0" +source = "git+https://github.com/zcash/librustzcash.git?rev=d14e7a707ce01cefcbc82651dad48f002185dded#d14e7a707ce01cefcbc82651dad48f002185dded" dependencies = [ - "blake2b_simd 0.5.11", - "byteorder", "chacha20", "chacha20poly1305", - "ff", - "group", "rand_core 0.6.3", "subtle", ] @@ -5588,44 +5674,78 @@ dependencies = [ [[package]] name = "zcash_primitives" version = "0.5.0" -source = "git+https://github.com/ZcashFoundation/librustzcash.git?tag=0.5.1-zebra-v1.0.0-beta.4#80d5b049b8e8127671026320a1c22841035345a4" +source = "git+https://github.com/ZcashFoundation/librustzcash.git?rev=c3ff94134b472ba90af665e5454983dc12de1338#c3ff94134b472ba90af665e5454983dc12de1338" dependencies = [ "aes", "bip0039", "bitvec", - "blake2b_simd 0.5.11", - "blake2s_simd", + "blake2b_simd 1.0.0", + "blake2s_simd 1.0.0", "bls12_381", "byteorder", "chacha20poly1305", - "equihash", + "equihash 0.1.0 (git+https://github.com/ZcashFoundation/librustzcash.git?rev=c3ff94134b472ba90af665e5454983dc12de1338)", "ff", "fpe", "group", "hex", - "incrementalmerkletree 0.1.0", + "incrementalmerkletree", "jubjub", "lazy_static", - "log", "memuse", "nonempty", "orchard", - "pasta_curves", "rand 0.8.5", "rand_core 0.6.3", "sha2", "subtle", - "zcash_encoding", - "zcash_note_encryption", + "zcash_encoding 0.0.0 (git+https://github.com/ZcashFoundation/librustzcash.git?rev=c3ff94134b472ba90af665e5454983dc12de1338)", + "zcash_note_encryption 0.1.0 (git+https://github.com/ZcashFoundation/librustzcash.git?rev=c3ff94134b472ba90af665e5454983dc12de1338)", +] + +[[package]] +name = "zcash_primitives" +version = "0.5.0" +source = "git+https://github.com/zcash/librustzcash.git?rev=d14e7a707ce01cefcbc82651dad48f002185dded#d14e7a707ce01cefcbc82651dad48f002185dded" +dependencies = [ + "aes", + "bip0039", + "bitvec", + "blake2b_simd 1.0.0", + "blake2s_simd 1.0.0", + "bls12_381", + "bs58", + "byteorder", + "chacha20poly1305", + "equihash 0.1.0 (git+https://github.com/zcash/librustzcash.git?rev=d14e7a707ce01cefcbc82651dad48f002185dded)", + "ff", + "fpe", + "group", + "hdwallet", + "hex", + "incrementalmerkletree", + "jubjub", + "lazy_static", + "memuse", + "nonempty", + "orchard", + "rand 0.8.5", + "rand_core 0.6.3", + "ripemd", + "secp256k1", + "sha2", + "subtle", + "zcash_encoding 0.0.0 (git+https://github.com/zcash/librustzcash.git?rev=d14e7a707ce01cefcbc82651dad48f002185dded)", + "zcash_note_encryption 0.1.0 (git+https://github.com/zcash/librustzcash.git?rev=d14e7a707ce01cefcbc82651dad48f002185dded)", ] [[package]] name = "zcash_proofs" version = "0.5.0" -source = "git+https://github.com/ZcashFoundation/librustzcash.git?tag=0.5.1-zebra-v1.0.0-beta.4#80d5b049b8e8127671026320a1c22841035345a4" +source = "git+https://github.com/ZcashFoundation/librustzcash.git?rev=c3ff94134b472ba90af665e5454983dc12de1338#c3ff94134b472ba90af665e5454983dc12de1338" dependencies = [ "bellman", - "blake2b_simd 0.5.11", + "blake2b_simd 1.0.0", "bls12_381", "byteorder", "directories", @@ -5635,26 +5755,25 @@ dependencies = [ "lazy_static", "minreq", "rand_core 0.6.3", - "zcash_primitives", + "zcash_primitives 0.5.0 (git+https://github.com/ZcashFoundation/librustzcash.git?rev=c3ff94134b472ba90af665e5454983dc12de1338)", ] [[package]] name = "zcash_script" version = "0.1.6-alpha.0" -source = "git+https://github.com/ZcashFoundation/zcash_script.git?rev=270d32d192c5880f911acf21ef100caa128e6179#270d32d192c5880f911acf21ef100caa128e6179" +source = "git+https://github.com/ZcashFoundation/zcash_script.git?rev=98c74180ff2899898457090b95578dc4e58ce85d#98c74180ff2899898457090b95578dc4e58ce85d" dependencies = [ "bindgen", - "blake2b_simd 0.5.11", + "blake2b_simd 1.0.0", "cc", - "halo2", - "incrementalmerkletree 0.1.0", "libc", "memuse", "orchard", "rand_core 0.6.3", "tracing", - "zcash_note_encryption", - "zcash_primitives", + "zcash_encoding 0.0.0 (git+https://github.com/zcash/librustzcash.git?rev=d14e7a707ce01cefcbc82651dad48f002185dded)", + "zcash_note_encryption 0.1.0 (git+https://github.com/zcash/librustzcash.git?rev=d14e7a707ce01cefcbc82651dad48f002185dded)", + "zcash_primitives 0.5.0 (git+https://github.com/zcash/librustzcash.git?rev=d14e7a707ce01cefcbc82651dad48f002185dded)", ] [[package]] @@ -5667,7 +5786,7 @@ dependencies = [ "bitflags", "bitvec", "blake2b_simd 1.0.0", - "blake2s_simd", + "blake2s_simd 1.0.0", "bls12_381", "bs58", "byteorder", @@ -5676,13 +5795,13 @@ dependencies = [ "criterion", "displaydoc", "ed25519-zebra", - "equihash", + "equihash 0.1.0 (git+https://github.com/zcash/librustzcash.git?rev=d14e7a707ce01cefcbc82651dad48f002185dded)", "fpe", "futures", "group", - "halo2", + "halo2_proofs", "hex", - "incrementalmerkletree 0.2.0", + "incrementalmerkletree", "itertools", "jubjub", "lazy_static", @@ -5693,7 +5812,7 @@ dependencies = [ "rand_chacha 0.3.1", "rand_core 0.6.3", "redjubjub", - "ripemd160", + "ripemd", "secp256k1", "serde", "serde-big-array", @@ -5708,8 +5827,8 @@ dependencies = [ "uint", "x25519-dalek", "zcash_history", - "zcash_note_encryption", - "zcash_primitives", + "zcash_note_encryption 0.1.0 (git+https://github.com/zcash/librustzcash.git?rev=d14e7a707ce01cefcbc82651dad48f002185dded)", + "zcash_primitives 0.5.0 (git+https://github.com/zcash/librustzcash.git?rev=d14e7a707ce01cefcbc82651dad48f002185dded)", "zebra-test", ] @@ -5730,7 +5849,7 @@ dependencies = [ "displaydoc", "futures", "futures-util", - "halo2", + "halo2_proofs", "hex", "jubjub", "lazy_static", @@ -5852,7 +5971,7 @@ dependencies = [ "dirs", "displaydoc", "futures", - "halo2", + "halo2_proofs", "hex", "insta", "itertools", diff --git a/Cargo.toml b/Cargo.toml index 829aae53..bd248f14 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -32,7 +32,10 @@ opt-level = 3 [profile.dev.package.pasta_curves] opt-level = 3 -[profile.dev.package.halo2] +[profile.dev.package.halo2_proofs] +opt-level = 3 + +[profile.dev.package.halo2_gadgets] opt-level = 3 [profile.dev.package.bls12_381] @@ -50,31 +53,17 @@ panic = "abort" [patch.crates-io] -# TODO: replace with upstream orchard (#3056) -orchard = { git = "https://github.com/ZcashFoundation/orchard.git", rev = "568e24cd5f129158375d7ac7d98c89ebff4f982f" } - # TODO: replace with upstream librustzcash when these changes are merged (#3037) # remove these after a new librustzcash release (#2982) -# Use the ZcashFoundation fork where possible, to avoid duplicate dependencies -equihash = { git = "https://github.com/ZcashFoundation/librustzcash.git", tag = "0.5.1-zebra-v1.0.0-beta.4" } -zcash_note_encryption = { git = "https://github.com/ZcashFoundation/librustzcash.git", tag = "0.5.1-zebra-v1.0.0-beta.4" } -zcash_primitives = { git = "https://github.com/ZcashFoundation/librustzcash.git", tag = "0.5.1-zebra-v1.0.0-beta.4" } -zcash_history = { git = "https://github.com/ZcashFoundation/librustzcash.git", tag = "0.5.1-zebra-v1.0.0-beta.4" } - -# This zcash_proofs patch doesn't work, maybe because of features? -#zcash_proofs = { git = "https://github.com/ZcashFoundation/librustzcash.git", tag = "0.5.1-zebra-v1.0.0-beta.4" } - -# These are librustzcash git requirements specified in its workspace Cargo.toml, -# that we must replicate here -incrementalmerkletree = { git = "https://github.com/zcash/incrementalmerkletree.git", rev = "b7bd6246122a6e9ace8edb51553fbf5228906cbb" } - -# Replaced by the ZcashFoundation fork above -#orchard = { git = "https://github.com/zcash/orchard.git", rev = "2c8241f25b943aa05203eacf9905db117c69bd29" } - - # These are librustzcash file requirements specified in its workspace Cargo.toml, # that we must replace with git requirements -# -# Replaced by the ZcashFoundation fork above -#zcash_note_encryption = { git = "https://github.com/zcash/librustzcash.git", rev = "53d0a51d33a421cb76d3e3124d1e4c1c9036068e" } +equihash = { git = "https://github.com/zcash/librustzcash.git", rev = "d14e7a707ce01cefcbc82651dad48f002185dded" } +hdwallet = { git = "https://github.com/nuttycom/hdwallet", rev = "9b4c1bdbe0517e3a7a8f285d6048a37d472ba3bc" } +zcash_encoding = { git = "https://github.com/zcash/librustzcash.git", rev = "d14e7a707ce01cefcbc82651dad48f002185dded" } +zcash_note_encryption = { git = "https://github.com/zcash/librustzcash.git", rev = "d14e7a707ce01cefcbc82651dad48f002185dded" } +zcash_primitives = { git = "https://github.com/zcash/librustzcash.git", rev = "d14e7a707ce01cefcbc82651dad48f002185dded" } +# Currently pointing to `download-sprout-params-new` branch which contains the +# changes from `download-sprout-params-d14e7a70` rebased on top of d14e7a70 as +# required by `zcash/Cargo.toml`. +zcash_proofs = { git = "https://github.com/ZcashFoundation/librustzcash.git", rev = "c3ff94134b472ba90af665e5454983dc12de1338" } diff --git a/deny.toml b/deny.toml index a216d9ad..a362ad3a 100644 --- a/deny.toml +++ b/deny.toml @@ -24,7 +24,12 @@ allow = [ # Certain crates/versions that will be skipped when doing duplicate detection. skip = [ - #{ name = "ansi_term", version = "=0.11.0" }, + # wait for zcash_proofs fork be merged back into upstream + # https://github.com/ZcashFoundation/zebra/issues/3831 + { name = "equihash", version = "=0.1.0" }, + { name = "zcash_encoding", version = "=0.0.0" }, + { name = "zcash_note_encryption", version = "=0.1.0" }, + { name = "zcash_primitives", version = "=0.5.0" }, ] # Similarly to `skip` allows you to skip certain crates during duplicate # detection. Unlike skip, it also includes the entire tree of transitive @@ -37,20 +42,29 @@ skip-tree = [ # ticket #3000: tower-fallback dependencies { name = "pin-project", version = "=0.4.29" }, - # ticket #3063: redjubjub dependencies - { name = "redjubjub", version = "=0.4.0" }, - # ticket #3315: ordered-map dependencies that should be dev-dependencies { name = "ordered-map", version = "=0.4.2" }, # ticket #2984: owo-colors dependencies { name = "color-eyre", version = "=0.5.11" }, - # ticket #2980: inferno and orchard/cryptographic dependencies - { name = "orchard", version = "=0.0.0" }, + # wait for bellman to upgrade + { name = "blake2s_simd", version = "=0.5.11" }, - # upgrade orchard from deprecated `bigint` to `uint`: https://github.com/zcash/orchard/issues/219 - { name = "bigint", version = "=4.4.3" }, + # wait for halo2 to upgrade + { name = "blake2b_simd", version = "=0.5.11" }, + + # wait for zcash_primitives to remove duplicated dependency + { name = "block-buffer", version = "=0.9.0" }, + + # wait for orchard -> bigint to upgrade + { name = "crunchy", version = "=0.1.6" }, + + # wait for curve25519-dalek to upgrade + { name = "digest", version = "=0.9.0" }, + + # Wait for inferno -> num-format to upgrade + { name = "arrayvec", version = "=0.4.12" }, # upgrade sentry, metrics-exporter-prometheus, reqwest, hyper, # which needs #2953: upgrade tracing to the latest major version @@ -60,14 +74,8 @@ skip-tree = [ { name = "tracing-subscriber", version = "=0.1.6" }, # upgrade abscissa and arti - { name = "darling", version = "=0.10.2" }, { name = "darling", version = "=0.12.4" }, - - # recent major version bumps - # we should re-check these dependencies in February 2022 - - # wait for lots of crates in the cryptographic ecosystem to upgrade - { name = "rand", version = "=0.7.3" }, + { name = "darling", version = "=0.13.4" }, ] # This section is considered when running `cargo deny check sources`. @@ -85,8 +93,7 @@ unknown-git = "deny" allow-registry = ["https://github.com/rust-lang/crates.io-index"] # List of URLs for allowed Git repositories allow-git = [ - # ticket #2982: librustzcash and orchard git versions - "https://github.com/str4d/redjubjub", + "https://github.com/nuttycom/hdwallet", ] [sources.allow-org] diff --git a/zebra-chain/Cargo.toml b/zebra-chain/Cargo.toml index bc04a9c2..385a71e8 100644 --- a/zebra-chain/Cargo.toml +++ b/zebra-chain/Cargo.toml @@ -20,7 +20,7 @@ bigint = "4.4.3" bitvec = "0.22" bitflags = "1.3.2" blake2b_simd = "1.0.0" -blake2s_simd = "0.5.11" +blake2s_simd = "1.0.0" bls12_381 = "0.6.0" bs58 = { version = "0.4.0", features = ["check"] } byteorder = "1.4.3" @@ -29,34 +29,32 @@ displaydoc = "0.2.3" fpe = "0.5.1" futures = "0.3.21" group = "0.11.0" -halo2 = "=0.1.0-beta.1" +halo2 = { package = "halo2_proofs", version = "=0.1.0-beta.4" } hex = "0.4.3" -incrementalmerkletree = "0.2.0" +incrementalmerkletree = "0.3.0-beta.2" itertools = "0.10.3" jubjub = "0.8.0" lazy_static = "1.4.0" rand_core = "0.6.3" -ripemd160 = "0.9" +ripemd = "0.1.1" serde = { version = "1.0.136", features = ["serde_derive", "rc"] } serde_with = { version = "1.12.0", optional = true } serde-big-array = "0.4.1" - +# Matches version used by hdwallet secp256k1 = { version = "0.21.3", features = ["serde"] } sha2 = { version = "0.9.9", features=["compress"] } static_assertions = "1.1.0" subtle = "2.4.1" thiserror = "1.0.30" -uint = "0.9.3" +uint = "0.9.1" x25519-dalek = { version = "1.2.0", features = ["serde"] } -# TODO: replace with upstream orchard (#3056) -orchard = { git = "https://github.com/ZcashFoundation/orchard.git", rev = "568e24cd5f129158375d7ac7d98c89ebff4f982f" } +orchard = "=0.1.0-beta.3" -# TODO: replace with upstream librustzcash when these changes are merged (#3037) -equihash = { git = "https://github.com/ZcashFoundation/librustzcash.git", tag = "0.5.1-zebra-v1.0.0-beta.4" } -zcash_note_encryption = { git = "https://github.com/ZcashFoundation/librustzcash.git", tag = "0.5.1-zebra-v1.0.0-beta.4" } -zcash_primitives = { git = "https://github.com/ZcashFoundation/librustzcash.git", tag = "0.5.1-zebra-v1.0.0-beta.4" } +equihash = "0.1.0" +zcash_note_encryption = "0.1" +zcash_primitives = { version = "0.5", features = ["transparent-inputs"] } zcash_history = { git = "https://github.com/ZcashFoundation/librustzcash.git", tag = "0.5.1-zebra-v1.0.0-beta.4" } proptest = { version = "0.10.1", optional = true } diff --git a/zebra-chain/src/orchard/arbitrary.rs b/zebra-chain/src/orchard/arbitrary.rs index 30ac3a53..82acd760 100644 --- a/zebra-chain/src/orchard/arbitrary.rs +++ b/zebra-chain/src/orchard/arbitrary.rs @@ -1,4 +1,4 @@ -use group::prime::PrimeCurveAffine; +use group::{ff::PrimeField, prime::PrimeCurveAffine}; use halo2::{arithmetic::FieldExt, pasta::pallas}; use proptest::{arbitrary::any, array, collection::vec, prelude::*}; @@ -46,7 +46,7 @@ impl Arbitrary for note::Nullifier { (vec(any::(), 64)) .prop_map(|bytes| { let bytes = bytes.try_into().expect("vec is the correct length"); - Self::try_from(pallas::Scalar::from_bytes_wide(&bytes).to_bytes()) + Self::try_from(pallas::Scalar::from_bytes_wide(&bytes).to_repr()) .expect("a valid generated nullifier") }) .boxed() @@ -120,7 +120,7 @@ impl Arbitrary for tree::Root { (vec(any::(), 64)) .prop_map(|bytes| { let bytes = bytes.try_into().expect("vec is the correct length"); - Self::try_from(pallas::Base::from_bytes_wide(&bytes).to_bytes()) + Self::try_from(pallas::Base::from_bytes_wide(&bytes).to_repr()) .expect("a valid generated Orchard note commitment tree root") }) .boxed() diff --git a/zebra-chain/src/orchard/commitment.rs b/zebra-chain/src/orchard/commitment.rs index 88b26c2e..ab3566a8 100644 --- a/zebra-chain/src/orchard/commitment.rs +++ b/zebra-chain/src/orchard/commitment.rs @@ -3,7 +3,7 @@ use std::{convert::TryFrom, fmt, io}; use bitvec::prelude::*; -use group::{prime::PrimeCurveAffine, GroupEncoding}; +use group::{ff::PrimeField, prime::PrimeCurveAffine, GroupEncoding}; use halo2::{ arithmetic::{Coordinates, CurveAffine, FieldExt}, pasta::pallas, @@ -65,12 +65,12 @@ impl fmt::Debug for NoteCommitment { match option { Some(coordinates) => d - .field("x", &hex::encode(coordinates.x().to_bytes())) - .field("y", &hex::encode(coordinates.y().to_bytes())) + .field("x", &hex::encode(coordinates.x().to_repr())) + .field("y", &hex::encode(coordinates.y().to_repr())) .finish(), None => d - .field("x", &hex::encode(pallas::Base::zero().to_bytes())) - .field("y", &hex::encode(pallas::Base::zero().to_bytes())) + .field("x", &hex::encode(pallas::Base::zero().to_repr())) + .field("y", &hex::encode(pallas::Base::zero().to_repr())) .finish(), } } @@ -192,12 +192,12 @@ impl fmt::Debug for ValueCommitment { match option { Some(coordinates) => d - .field("x", &hex::encode(coordinates.x().to_bytes())) - .field("y", &hex::encode(coordinates.y().to_bytes())) + .field("x", &hex::encode(coordinates.x().to_repr())) + .field("y", &hex::encode(coordinates.y().to_repr())) .finish(), None => d - .field("x", &hex::encode(pallas::Base::zero().to_bytes())) - .field("y", &hex::encode(pallas::Base::zero().to_bytes())) + .field("x", &hex::encode(pallas::Base::zero().to_repr())) + .field("y", &hex::encode(pallas::Base::zero().to_repr())) .finish(), } } diff --git a/zebra-chain/src/orchard/keys.rs b/zebra-chain/src/orchard/keys.rs index b9ba4d34..36093939 100644 --- a/zebra-chain/src/orchard/keys.rs +++ b/zebra-chain/src/orchard/keys.rs @@ -16,7 +16,7 @@ use aes::Aes256; use bech32::{self, ToBase32, Variant}; use bitvec::prelude::*; use fpe::ff1::{BinaryNumeralString, FF1}; -use group::{prime::PrimeCurveAffine, Group, GroupEncoding}; +use group::{ff::PrimeField, prime::PrimeCurveAffine, Group, GroupEncoding}; use halo2::{ arithmetic::{Coordinates, CurveAffine, FieldExt}, pasta::pallas, @@ -231,7 +231,7 @@ impl ConstantTimeEq for SpendAuthorizingKey { /// Check whether two `SpendAuthorizingKey`s are equal, runtime independent /// of the value of the secret. fn ct_eq(&self, other: &Self) -> Choice { - self.0.to_bytes().ct_eq(&other.0.to_bytes()) + self.0.to_repr().ct_eq(&other.0.to_repr()) } } @@ -245,7 +245,7 @@ impl fmt::Debug for SpendAuthorizingKey { impl From for [u8; 32] { fn from(sk: SpendAuthorizingKey) -> Self { - sk.0.to_bytes() + sk.0.to_repr() } } @@ -281,7 +281,7 @@ impl PartialEq for SpendAuthorizingKey { impl PartialEq<[u8; 32]> for SpendAuthorizingKey { fn eq(&self, other: &[u8; 32]) -> bool { - self.0.to_bytes().ct_eq(other).unwrap_u8() == 1u8 + self.0.to_repr().ct_eq(other).unwrap_u8() == 1u8 } } @@ -341,14 +341,14 @@ impl ConstantTimeEq for NullifierDerivingKey { /// Check whether two `NullifierDerivingKey`s are equal, runtime independent /// of the value of the secret. fn ct_eq(&self, other: &Self) -> Choice { - self.0.to_bytes().ct_eq(&other.0.to_bytes()) + self.0.to_repr().ct_eq(&other.0.to_repr()) } } impl fmt::Debug for NullifierDerivingKey { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { f.debug_tuple("NullifierDerivingKey") - .field(&hex::encode(self.0.to_bytes())) + .field(&hex::encode(self.0.to_repr())) .finish() } } @@ -357,13 +357,13 @@ impl Eq for NullifierDerivingKey {} impl From for [u8; 32] { fn from(nk: NullifierDerivingKey) -> [u8; 32] { - nk.0.to_bytes() + nk.0.to_repr() } } impl From<&NullifierDerivingKey> for [u8; 32] { fn from(nk: &NullifierDerivingKey) -> [u8; 32] { - nk.0.to_bytes() + nk.0.to_repr() } } @@ -375,7 +375,7 @@ impl From for pallas::Base { impl From<[u8; 32]> for NullifierDerivingKey { fn from(bytes: [u8; 32]) -> Self { - Self(pallas::Base::from_bytes(&bytes).unwrap()) + Self(pallas::Base::from_repr(bytes).unwrap()) } } @@ -399,7 +399,7 @@ impl PartialEq for NullifierDerivingKey { impl PartialEq<[u8; 32]> for NullifierDerivingKey { fn eq(&self, other: &[u8; 32]) -> bool { - self.0.to_bytes().ct_eq(other).unwrap_u8() == 1u8 + self.0.to_repr().ct_eq(other).unwrap_u8() == 1u8 } } @@ -414,14 +414,14 @@ impl ConstantTimeEq for IvkCommitRandomness { /// Check whether two `IvkCommitRandomness`s are equal, runtime independent /// of the value of the secret. fn ct_eq(&self, other: &Self) -> Choice { - self.0.to_bytes().ct_eq(&other.0.to_bytes()) + self.0.to_repr().ct_eq(&other.0.to_repr()) } } impl fmt::Debug for IvkCommitRandomness { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { f.debug_tuple("IvkCommitRandomness") - .field(&hex::encode(self.0.to_bytes())) + .field(&hex::encode(self.0.to_repr())) .finish() } } @@ -459,7 +459,7 @@ impl PartialEq for IvkCommitRandomness { impl PartialEq<[u8; 32]> for IvkCommitRandomness { fn eq(&self, other: &[u8; 32]) -> bool { - self.0.to_bytes().ct_eq(other).unwrap_u8() == 1u8 + self.0.to_repr().ct_eq(other).unwrap_u8() == 1u8 } } @@ -467,7 +467,7 @@ impl TryFrom<[u8; 32]> for IvkCommitRandomness { type Error = &'static str; fn try_from(bytes: [u8; 32]) -> Result { - let possible_scalar = pallas::Scalar::from_bytes(&bytes); + let possible_scalar = pallas::Scalar::from_repr(bytes); if possible_scalar.is_some().into() { Ok(Self(possible_scalar.unwrap())) @@ -658,7 +658,7 @@ impl From for IncomingViewingKey { // I2LEBSP_l^Orchard_base(ak)︁ let ak_bytes = extract_p(pallas::Point::from_bytes(&fvk.spend_validating_key.into()).unwrap()) - .to_bytes(); + .to_repr(); M.extend_from_bitslice(&BitArray::::from(ak_bytes)[0..255]); // I2LEBSP_l^Orchard_base(nk)︁ @@ -677,7 +677,7 @@ impl From for IncomingViewingKey { Self { dk: fvk.into(), // mod r_P - ivk: pallas::Scalar::from_bytes(&commit_x.into()).unwrap(), + ivk: pallas::Scalar::from_repr(commit_x.into()).unwrap(), } } } @@ -931,12 +931,12 @@ impl fmt::Debug for TransmissionKey { match option { Some(coordinates) => d - .field("x", &hex::encode(coordinates.x().to_bytes())) - .field("y", &hex::encode(coordinates.y().to_bytes())) + .field("x", &hex::encode(coordinates.x().to_repr())) + .field("y", &hex::encode(coordinates.y().to_repr())) .finish(), None => d - .field("x", &hex::encode(pallas::Base::zero().to_bytes())) - .field("y", &hex::encode(pallas::Base::zero().to_bytes())) + .field("x", &hex::encode(pallas::Base::zero().to_repr())) + .field("y", &hex::encode(pallas::Base::zero().to_repr())) .finish(), } } @@ -1013,7 +1013,7 @@ impl ConstantTimeEq for EphemeralPrivateKey { /// Check whether two `EphemeralPrivateKey`s are equal, runtime independent /// of the value of the secret. fn ct_eq(&self, other: &Self) -> Choice { - self.0.to_bytes().ct_eq(&other.0.to_bytes()) + self.0.to_repr().ct_eq(&other.0.to_repr()) } } @@ -1021,7 +1021,7 @@ impl Eq for EphemeralPrivateKey {} impl From for [u8; 32] { fn from(esk: EphemeralPrivateKey) -> Self { - esk.0.to_bytes() + esk.0.to_repr() } } @@ -1033,7 +1033,7 @@ impl PartialEq for EphemeralPrivateKey { impl PartialEq<[u8; 32]> for EphemeralPrivateKey { fn eq(&self, other: &[u8; 32]) -> bool { - self.0.to_bytes().ct_eq(other).unwrap_u8() == 1u8 + self.0.to_repr().ct_eq(other).unwrap_u8() == 1u8 } } /// An ephemeral public key for Orchard key agreement. @@ -1051,12 +1051,12 @@ impl fmt::Debug for EphemeralPublicKey { match option { Some(coordinates) => d - .field("x", &hex::encode(coordinates.x().to_bytes())) - .field("y", &hex::encode(coordinates.y().to_bytes())) + .field("x", &hex::encode(coordinates.x().to_repr())) + .field("y", &hex::encode(coordinates.y().to_repr())) .finish(), None => d - .field("x", &hex::encode(pallas::Base::zero().to_bytes())) - .field("y", &hex::encode(pallas::Base::zero().to_bytes())) + .field("x", &hex::encode(pallas::Base::zero().to_repr())) + .field("y", &hex::encode(pallas::Base::zero().to_repr())) .finish(), } } diff --git a/zebra-chain/src/orchard/note.rs b/zebra-chain/src/orchard/note.rs index 32eb3362..bf7e7c09 100644 --- a/zebra-chain/src/orchard/note.rs +++ b/zebra-chain/src/orchard/note.rs @@ -3,7 +3,7 @@ #![allow(clippy::unit_arg)] #![allow(dead_code)] -use group::GroupEncoding; +use group::{ff::PrimeField, GroupEncoding}; use halo2::{arithmetic::FieldExt, pasta::pallas}; use rand_core::{CryptoRng, RngCore}; @@ -48,7 +48,7 @@ pub struct Rho(pub(crate) pallas::Base); impl From for [u8; 32] { fn from(rho: Rho) -> Self { - rho.0.to_bytes() + rho.0.to_repr() } } @@ -78,7 +78,7 @@ pub struct Psi(pub(crate) pallas::Base); impl From for [u8; 32] { fn from(psi: Psi) -> Self { - psi.0.to_bytes() + psi.0.to_repr() } } diff --git a/zebra-chain/src/orchard/note/nullifiers.rs b/zebra-chain/src/orchard/note/nullifiers.rs index 049e91a5..33a506bd 100644 --- a/zebra-chain/src/orchard/note/nullifiers.rs +++ b/zebra-chain/src/orchard/note/nullifiers.rs @@ -6,7 +6,7 @@ use std::{ hash::{Hash, Hasher}, }; -use halo2::{arithmetic::FieldExt, pasta::pallas}; +use halo2::pasta::{group::ff::PrimeField, pallas}; use crate::serialization::{serde_helpers, SerializationError}; @@ -48,7 +48,7 @@ pub struct Nullifier(#[serde(with = "serde_helpers::Base")] pub(crate) pallas::B impl Hash for Nullifier { fn hash(&self, state: &mut H) { - self.0.to_bytes().hash(state); + self.0.to_repr().hash(state); } } @@ -56,7 +56,7 @@ impl TryFrom<[u8; 32]> for Nullifier { type Error = SerializationError; fn try_from(bytes: [u8; 32]) -> Result { - let possible_point = pallas::Base::from_bytes(&bytes); + let possible_point = pallas::Base::from_repr(bytes); if possible_point.is_some().into() { Ok(Self(possible_point.unwrap())) @@ -94,7 +94,7 @@ impl From<(NullifierDerivingKey, Note, NoteCommitment)> for Nullifier { // // [︀ (PRF^nfOrchard_nk(ρ) + ψ) mod q_P ]︀ K^Orchard + cm let scalar = - pallas::Scalar::from_bytes(&(prf_nf(nk.0, note.rho.0) + psi.0).to_bytes()).unwrap(); + pallas::Scalar::from_repr((prf_nf(nk.0, note.rho.0) + psi.0).to_repr()).unwrap(); // Basically a new-gen Pedersen hash? Nullifier(extract_p((K * scalar) + cm.0)) diff --git a/zebra-chain/src/orchard/sinsemilla.rs b/zebra-chain/src/orchard/sinsemilla.rs index eb72cc36..923454ca 100644 --- a/zebra-chain/src/orchard/sinsemilla.rs +++ b/zebra-chain/src/orchard/sinsemilla.rs @@ -1,10 +1,9 @@ //! Sinsemilla hash functions and helpers. use bitvec::prelude::*; -use group::Group; use halo2::{ arithmetic::{Coordinates, CurveAffine, CurveExt}, - pasta::pallas, + pasta::{group::Group, pallas}, }; /// [Coordinate Extractor for Pallas][concreteextractorpallas] @@ -204,7 +203,7 @@ mod tests { #[cfg(test)] fn x_from_str(s: &str) -> pallas::Base { - use group::ff::PrimeField; + use halo2::pasta::group::ff::PrimeField; pallas::Base::from_str_vartime(s).unwrap() } @@ -212,7 +211,7 @@ mod tests { #[test] #[allow(non_snake_case)] fn single_test_vector() { - use group::Curve; + use halo2::pasta::group::Curve; let D = b"z.cash:test-Sinsemilla"; let M = bitvec![ @@ -244,8 +243,7 @@ mod tests { #[test] #[allow(non_snake_case)] fn hackworks_test_vectors() { - use group::GroupEncoding; - use halo2::arithmetic::FieldExt; + use halo2::pasta::group::{ff::PrimeField, GroupEncoding}; for tv in tests::vectors::SINSEMILLA.iter() { let D = tv.domain.as_slice(); @@ -258,7 +256,7 @@ mod tests { assert_eq!( sinsemilla_hash(D, M).expect("should not fail per Theorem 5.4.4"), - pallas::Base::from_bytes(&tv.hash).unwrap() + pallas::Base::from_repr(tv.hash).unwrap() ) } } @@ -270,7 +268,7 @@ mod tests { #[test] #[allow(non_snake_case)] fn hackworks_group_hash_test_vectors() { - use group::GroupEncoding; + use halo2::pasta::group::GroupEncoding; for tv in tests::vectors::GROUP_HASHES.iter() { let D = tv.domain.as_slice(); diff --git a/zebra-chain/src/orchard/tests/tree.rs b/zebra-chain/src/orchard/tests/tree.rs index 86e830bf..2022288d 100644 --- a/zebra-chain/src/orchard/tests/tree.rs +++ b/zebra-chain/src/orchard/tests/tree.rs @@ -1,5 +1,4 @@ -use halo2::arithmetic::FieldExt; -use halo2::pasta::pallas; +use halo2::pasta::{group::ff::PrimeField, pallas}; use crate::orchard::tests::vectors; use crate::orchard::tree::*; @@ -10,7 +9,7 @@ fn empty_roots() { for i in 0..EMPTY_ROOTS.len() { assert_eq!( - EMPTY_ROOTS[i].to_bytes(), + EMPTY_ROOTS[i].to_repr(), // The test vector is in reversed order. vectors::EMPTY_ROOTS[MERKLE_DEPTH - i] ); @@ -27,7 +26,7 @@ fn incremental_roots() { for (i, commitment_set) in vectors::COMMITMENTS.iter().enumerate() { for cm_x_bytes in commitment_set.iter() { - let cm_x = pallas::Base::from_bytes(cm_x_bytes).unwrap(); + let cm_x = pallas::Base::from_repr(*cm_x_bytes).unwrap(); leaves.push(cm_x); diff --git a/zebra-chain/src/orchard/tree.rs b/zebra-chain/src/orchard/tree.rs index 2d8b45fb..636ce1d2 100644 --- a/zebra-chain/src/orchard/tree.rs +++ b/zebra-chain/src/orchard/tree.rs @@ -21,7 +21,7 @@ use std::{ }; use bitvec::prelude::*; -use halo2::{arithmetic::FieldExt, pasta::pallas}; +use halo2::pasta::{group::ff::PrimeField, pallas}; use incrementalmerkletree::{bridgetree, Frontier}; use lazy_static::lazy_static; use thiserror::Error; @@ -54,8 +54,8 @@ fn merkle_crh_orchard(layer: u8, left: pallas::Base, right: pallas::Base) -> pal // Prefix: l = I2LEBSP_10(MerkleDepth^Orchard − 1 − layer) let l = MERKLE_DEPTH - 1 - layer as usize; s.extend_from_bitslice(&BitArray::::from([l, 0])[0..10]); - s.extend_from_bitslice(&BitArray::::from(left.to_bytes())[0..255]); - s.extend_from_bitslice(&BitArray::::from(right.to_bytes())[0..255]); + s.extend_from_bitslice(&BitArray::::from(left.to_repr())[0..255]); + s.extend_from_bitslice(&BitArray::::from(right.to_repr())[0..255]); match sinsemilla_hash(b"z.cash:Orchard-MerkleCRH", &s) { Some(h) => h, @@ -99,7 +99,7 @@ pub struct Root(#[serde(with = "serde_helpers::Base")] pub(crate) pallas::Base); impl fmt::Debug for Root { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { f.debug_tuple("Root") - .field(&hex::encode(&self.0.to_bytes())) + .field(&hex::encode(&self.0.to_repr())) .finish() } } @@ -118,7 +118,7 @@ impl From<&Root> for [u8; 32] { impl Hash for Root { fn hash(&self, state: &mut H) { - self.0.to_bytes().hash(state) + self.0.to_repr().hash(state) } } @@ -126,7 +126,7 @@ impl TryFrom<[u8; 32]> for Root { type Error = SerializationError; fn try_from(bytes: [u8; 32]) -> Result { - let possible_point = pallas::Base::from_bytes(&bytes); + let possible_point = pallas::Base::from_repr(bytes); if possible_point.is_some().into() { Ok(Self(possible_point.unwrap())) @@ -187,7 +187,7 @@ impl serde::Serialize for Node { where S: serde::Serializer, { - self.0.to_bytes().serialize(serializer) + self.0.to_repr().serialize(serializer) } } @@ -197,7 +197,7 @@ impl<'de> serde::Deserialize<'de> for Node { D: serde::Deserializer<'de>, { let bytes = <[u8; 32]>::deserialize(deserializer)?; - Option::::from(pallas::Base::from_bytes(&bytes)) + Option::::from(pallas::Base::from_repr(bytes)) .map(Node) .ok_or_else(|| serde::de::Error::custom("invalid Pallas field element")) } diff --git a/zebra-chain/src/parameters/network_upgrade.rs b/zebra-chain/src/parameters/network_upgrade.rs index ac4be740..aec127f3 100644 --- a/zebra-chain/src/parameters/network_upgrade.rs +++ b/zebra-chain/src/parameters/network_upgrade.rs @@ -102,7 +102,7 @@ pub(super) const TESTNET_ACTIVATION_HEIGHTS: &[(block::Height, NetworkUpgrade)] (block::Height(584_000), Blossom), (block::Height(903_800), Heartwood), (block::Height(1_028_500), Canopy), - (block::Height(1_599_200), Nu5), + (block::Height(1_842_420), Nu5), ]; /// Fake testnet network upgrade activation heights, used in tests. @@ -190,7 +190,7 @@ pub(crate) const CONSENSUS_BRANCH_IDS: &[(NetworkUpgrade, ConsensusBranchId)] = (Blossom, ConsensusBranchId(0x2bb40e60)), (Heartwood, ConsensusBranchId(0xf5b9230b)), (Canopy, ConsensusBranchId(0xe9ff75a6)), - (Nu5, ConsensusBranchId(0x37519621)), + (Nu5, ConsensusBranchId(0xc2d6d0b4)), ]; /// The target block spacing before Blossom. diff --git a/zebra-chain/src/primitives/redpallas/batch.rs b/zebra-chain/src/primitives/redpallas/batch.rs index 8126cd00..d048272c 100644 --- a/zebra-chain/src/primitives/redpallas/batch.rs +++ b/zebra-chain/src/primitives/redpallas/batch.rs @@ -19,8 +19,7 @@ use std::convert::TryFrom; -use group::{Group, GroupEncoding}; -use halo2::arithmetic::FieldExt; +use group::{ff::PrimeField, Group, GroupEncoding}; use rand_core::{CryptoRng, RngCore}; use super::{private::Sealed, scalar_mul::VartimeMultiscalarMul, *}; @@ -231,7 +230,7 @@ impl Verifier { let s = { // XXX-pallas: should not use CtOption here - let maybe_scalar = pallas::Scalar::from_bytes(&s_bytes); + let maybe_scalar = pallas::Scalar::from_repr(s_bytes); if maybe_scalar.is_some().into() { maybe_scalar.unwrap() } else { diff --git a/zebra-chain/src/primitives/redpallas/scalar_mul.rs b/zebra-chain/src/primitives/redpallas/scalar_mul.rs index b528b4aa..a7108fa2 100644 --- a/zebra-chain/src/primitives/redpallas/scalar_mul.rs +++ b/zebra-chain/src/primitives/redpallas/scalar_mul.rs @@ -15,8 +15,8 @@ use std::{borrow::Borrow, fmt::Debug}; -use group::Group; -use halo2::{arithmetic::FieldExt, pasta::pallas}; +use group::{ff::PrimeField, Group}; +use halo2::pasta::pallas; /// A trait to support getting the Non-Adjacent form of a scalar. pub trait NonAdjacentForm { @@ -81,7 +81,7 @@ impl NonAdjacentForm for pallas::Scalar { let mut naf = [0i8; 256]; let mut x_u64 = [0u64; 5]; - LittleEndian::read_u64_into(&self.to_bytes(), &mut x_u64[0..4]); + LittleEndian::read_u64_into(&self.to_repr(), &mut x_u64[0..4]); let width = 1 << w; let window_mask = width - 1; diff --git a/zebra-chain/src/primitives/redpallas/signing_key.rs b/zebra-chain/src/primitives/redpallas/signing_key.rs index c068ff34..c9011178 100644 --- a/zebra-chain/src/primitives/redpallas/signing_key.rs +++ b/zebra-chain/src/primitives/redpallas/signing_key.rs @@ -1,7 +1,7 @@ use std::convert::{TryFrom, TryInto}; use std::marker::PhantomData; -use group::GroupEncoding; +use group::{ff::PrimeField, GroupEncoding}; use halo2::{arithmetic::FieldExt, pasta::pallas}; use rand_core::{CryptoRng, RngCore}; @@ -26,7 +26,7 @@ impl<'a, T: SigType> From<&'a SigningKey> for VerificationKey { impl From> for [u8; 32] { fn from(sk: SigningKey) -> [u8; 32] { - sk.sk.to_bytes() + sk.sk.to_repr() } } @@ -34,7 +34,7 @@ impl TryFrom<[u8; 32]> for SigningKey { type Error = Error; fn try_from(bytes: [u8; 32]) -> Result { - let maybe_sk = pallas::Scalar::from_bytes(&bytes); + let maybe_sk = pallas::Scalar::from_repr(bytes); if maybe_sk.is_some().into() { let sk = maybe_sk.unwrap(); @@ -114,7 +114,7 @@ impl SigningKey { .update(msg) .finalize(); - let s_bytes = (nonce + (c * self.sk)).to_bytes(); + let s_bytes = (nonce + (c * self.sk)).to_repr(); Signature { r_bytes, diff --git a/zebra-chain/src/primitives/redpallas/verification_key.rs b/zebra-chain/src/primitives/redpallas/verification_key.rs index f8442712..c047382c 100644 --- a/zebra-chain/src/primitives/redpallas/verification_key.rs +++ b/zebra-chain/src/primitives/redpallas/verification_key.rs @@ -1,7 +1,7 @@ use std::marker::PhantomData; -use group::{cofactor::CofactorGroup, GroupEncoding}; -use halo2::{arithmetic::FieldExt, pasta::pallas}; +use group::{cofactor::CofactorGroup, ff::PrimeField, GroupEncoding}; +use halo2::pasta::pallas; use super::*; @@ -154,7 +154,7 @@ impl VerificationKey { let s = { // XXX-pasta_curves: should not use CtOption here - let maybe_scalar = pallas::Scalar::from_bytes(&signature.s_bytes); + let maybe_scalar = pallas::Scalar::from_repr(signature.s_bytes); if maybe_scalar.is_some().into() { maybe_scalar.unwrap() } else { diff --git a/zebra-chain/src/primitives/zcash_note_encryption.rs b/zebra-chain/src/primitives/zcash_note_encryption.rs index 6d68ae79..ed4be9de 100644 --- a/zebra-chain/src/primitives/zcash_note_encryption.rs +++ b/zebra-chain/src/primitives/zcash_note_encryption.rs @@ -21,7 +21,7 @@ pub fn decrypts_successfully(transaction: &Transaction, network: Network, height .expect("zcash_primitives and Zebra transaction formats must be compatible"); let alt_height = height.0.into(); - let null_sapling_ovk = zcash_primitives::sapling::keys::OutgoingViewingKey([0u8; 32]); + let null_sapling_ovk = zcash_primitives::keys::OutgoingViewingKey([0u8; 32]); if let Some(bundle) = alt_tx.sapling_bundle() { for output in bundle.shielded_outputs.iter() { diff --git a/zebra-chain/src/primitives/zcash_primitives.rs b/zebra-chain/src/primitives/zcash_primitives.rs index 8ae8fc99..b4a2c5da 100644 --- a/zebra-chain/src/primitives/zcash_primitives.rs +++ b/zebra-chain/src/primitives/zcash_primitives.rs @@ -7,6 +7,8 @@ use std::{ ops::Deref, }; +use zcash_primitives::transaction as zp_tx; + use crate::{ amount::{Amount, NonNegative}, parameters::{Network, NetworkUpgrade}, @@ -15,7 +17,131 @@ use crate::{ transparent::{self, Script}, }; -impl TryFrom<&Transaction> for zcash_primitives::transaction::Transaction { +// Used by boilerplate code below. + +#[derive(Clone, Debug)] +struct TransparentAuth<'a> { + all_prev_outputs: &'a [transparent::Output], +} + +impl zp_tx::components::transparent::Authorization for TransparentAuth<'_> { + type ScriptSig = zcash_primitives::legacy::Script; +} + +// In this block we convert our Output to a librustzcash to TxOut. +// (We could do the serialize/deserialize route but it's simple enough to convert manually) +impl zp_tx::sighash::TransparentAuthorizingContext for TransparentAuth<'_> { + fn input_amounts(&self) -> Vec { + self.all_prev_outputs + .iter() + .map(|prevout| { + zp_tx::components::amount::Amount::from_nonnegative_i64_le_bytes( + prevout.value.to_bytes(), + ) + .expect("will not fail since it was previously validated") + }) + .collect() + } + + fn input_scriptpubkeys(&self) -> Vec { + self.all_prev_outputs + .iter() + .map(|prevout| { + zcash_primitives::legacy::Script(prevout.lock_script.as_raw_bytes().into()) + }) + .collect() + } +} + +// Boilerplate mostly copied from `zcash/src/rust/src/transaction_ffi.rs` which is required +// to compute sighash. +// TODO: remove/change if they improve the API to not require this. + +struct MapTransparent<'a> { + auth: TransparentAuth<'a>, +} + +impl<'a> + zp_tx::components::transparent::MapAuth< + zp_tx::components::transparent::Authorized, + TransparentAuth<'a>, + > for MapTransparent<'a> +{ + fn map_script_sig( + &self, + s: ::ScriptSig, + ) -> ::ScriptSig { + s + } + + fn map_authorization( + &self, + _: zp_tx::components::transparent::Authorized, + ) -> TransparentAuth<'a> { + // TODO: This map should consume self, so we can move self.auth + self.auth.clone() + } +} + +struct IdentityMap; + +impl + zp_tx::components::sapling::MapAuth< + zp_tx::components::sapling::Authorized, + zp_tx::components::sapling::Authorized, + > for IdentityMap +{ + fn map_proof( + &self, + p: ::Proof, + ) -> ::Proof + { + p + } + + fn map_auth_sig( + &self, + s: ::AuthSig, + ) -> ::AuthSig{ + s + } + + fn map_authorization( + &self, + a: zp_tx::components::sapling::Authorized, + ) -> zp_tx::components::sapling::Authorized { + a + } +} + +impl zp_tx::components::orchard::MapAuth + for IdentityMap +{ + fn map_spend_auth( + &self, + s: ::SpendAuth, + ) -> ::SpendAuth { + s + } + + fn map_authorization(&self, a: orchard::bundle::Authorized) -> orchard::bundle::Authorized { + a + } +} + +struct PrecomputedAuth<'a> { + _phantom: std::marker::PhantomData<&'a ()>, +} + +impl<'a> zp_tx::Authorization for PrecomputedAuth<'a> { + type TransparentAuth = TransparentAuth<'a>; + type SaplingAuth = zp_tx::components::sapling::Authorized; + type OrchardAuth = orchard::bundle::Authorized; +} + +// End of (mostly) copied code + +impl TryFrom<&Transaction> for zp_tx::Transaction { type Error = io::Error; /// Convert a Zebra transaction into a librustzcash one. @@ -42,7 +168,7 @@ impl TryFrom<&Transaction> for zcash_primitives::transaction::Transaction { pub(crate) fn convert_tx_to_librustzcash( trans: &Transaction, network_upgrade: NetworkUpgrade, -) -> Result { +) -> Result { let serialized_tx = trans.zcash_serialize_to_vec()?; let branch_id: u32 = network_upgrade .branch_id() @@ -52,16 +178,16 @@ pub(crate) fn convert_tx_to_librustzcash( let branch_id: zcash_primitives::consensus::BranchId = branch_id .try_into() .expect("zcash_primitives and Zebra have the same branch ids"); - let alt_tx = zcash_primitives::transaction::Transaction::read(&serialized_tx[..], branch_id)?; + let alt_tx = zp_tx::Transaction::read(&serialized_tx[..], branch_id)?; Ok(alt_tx) } /// Convert a Zebra Amount into a librustzcash one. -impl TryFrom> for zcash_primitives::transaction::components::Amount { +impl TryFrom> for zp_tx::components::Amount { type Error = (); fn try_from(amount: Amount) -> Result { - zcash_primitives::transaction::components::Amount::from_u64(amount.into()) + zp_tx::components::Amount::from_u64(amount.into()) } } @@ -98,33 +224,32 @@ pub(crate) fn sighash( Some(input_index) => { let output = all_previous_outputs[input_index].clone(); script = (&output.lock_script).into(); - zcash_primitives::transaction::sighash::SignableInput::Transparent( - zcash_primitives::transaction::sighash::TransparentInput::new( - input_index, - &script, - output - .value - .try_into() - .expect("amount was previously validated"), - ), - ) + zp_tx::sighash::SignableInput::Transparent { + hash_type: hash_type.bits() as _, + index: input_index, + script_code: &script, + script_pubkey: &script, + value: output + .value + .try_into() + .expect("amount was previously validated"), + } } - None => zcash_primitives::transaction::sighash::SignableInput::Shielded, + None => zp_tx::sighash::SignableInput::Shielded, }; - let txid_parts = alt_tx - .deref() - .digest(zcash_primitives::transaction::txid::TxIdDigester); + let txid_parts = alt_tx.deref().digest(zp_tx::txid::TxIdDigester); + let f_transparent = MapTransparent { + auth: TransparentAuth { + all_prev_outputs: all_previous_outputs, + }, + }; + let txdata: zp_tx::TransactionData = + alt_tx + .into_data() + .map_authorization(f_transparent, IdentityMap, IdentityMap); - SigHash( - *zcash_primitives::transaction::sighash::signature_hash( - alt_tx.deref(), - hash_type.bits(), - &signable_input, - &txid_parts, - ) - .as_ref(), - ) + SigHash(*zp_tx::sighash::signature_hash(&txdata, &signable_input, &txid_parts).as_ref()) } /// Compute the authorizing data commitment of this transaction as specified @@ -136,7 +261,7 @@ pub(crate) fn sighash( /// /// [ZIP-244]: https://zips.z.cash/zip-0244. pub(crate) fn auth_digest(trans: &Transaction) -> AuthDigest { - let alt_tx: zcash_primitives::transaction::Transaction = trans + let alt_tx: zp_tx::Transaction = trans .try_into() .expect("zcash_primitives and Zebra transaction formats must be compatible"); diff --git a/zebra-chain/src/serialization/serde_helpers.rs b/zebra-chain/src/serialization/serde_helpers.rs index f87d28c9..38e064cd 100644 --- a/zebra-chain/src/serialization/serde_helpers.rs +++ b/zebra-chain/src/serialization/serde_helpers.rs @@ -1,5 +1,5 @@ -use group::GroupEncoding; -use halo2::{arithmetic::FieldExt, pasta::pallas}; +use group::{ff::PrimeField, GroupEncoding}; +use halo2::pasta::pallas; #[derive(Deserialize, Serialize)] #[serde(remote = "jubjub::AffinePoint")] pub struct AffinePoint { @@ -42,25 +42,25 @@ impl From for pallas::Affine { #[derive(Deserialize, Serialize)] #[serde(remote = "pallas::Scalar")] pub struct Scalar { - #[serde(getter = "pallas::Scalar::to_bytes")] + #[serde(getter = "pallas::Scalar::to_repr")] bytes: [u8; 32], } impl From for pallas::Scalar { fn from(local: Scalar) -> Self { - pallas::Scalar::from_bytes(&local.bytes).unwrap() + pallas::Scalar::from_repr(local.bytes).unwrap() } } #[derive(Deserialize, Serialize)] #[serde(remote = "pallas::Base")] pub struct Base { - #[serde(getter = "pallas::Base::to_bytes")] + #[serde(getter = "pallas::Base::to_repr")] bytes: [u8; 32], } impl From for pallas::Base { fn from(local: Base) -> Self { - pallas::Base::from_bytes(&local.bytes).unwrap() + pallas::Base::from_repr(local.bytes).unwrap() } } diff --git a/zebra-chain/src/transaction/serialize.rs b/zebra-chain/src/transaction/serialize.rs index d4ecf873..579380b9 100644 --- a/zebra-chain/src/transaction/serialize.rs +++ b/zebra-chain/src/transaction/serialize.rs @@ -4,7 +4,7 @@ use std::{borrow::Borrow, convert::TryInto, io, sync::Arc}; use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt}; -use halo2::{arithmetic::FieldExt, pasta::pallas}; +use halo2::pasta::{group::ff::PrimeField, pallas}; use crate::{ amount, @@ -41,7 +41,7 @@ impl ZcashDeserialize for jubjub::Fq { impl ZcashDeserialize for pallas::Scalar { fn zcash_deserialize(mut reader: R) -> Result { - let possible_scalar = pallas::Scalar::from_bytes(&reader.read_32_bytes()?); + let possible_scalar = pallas::Scalar::from_repr(reader.read_32_bytes()?); if possible_scalar.is_some().into() { Ok(possible_scalar.unwrap()) @@ -55,7 +55,7 @@ impl ZcashDeserialize for pallas::Scalar { impl ZcashDeserialize for pallas::Base { fn zcash_deserialize(mut reader: R) -> Result { - let possible_field_element = pallas::Base::from_bytes(&reader.read_32_bytes()?); + let possible_field_element = pallas::Base::from_repr(reader.read_32_bytes()?); if possible_field_element.is_some().into() { Ok(possible_field_element.unwrap()) diff --git a/zebra-chain/src/transaction/tests/vectors.rs b/zebra-chain/src/transaction/tests/vectors.rs index 00f0289e..8f937701 100644 --- a/zebra-chain/src/transaction/tests/vectors.rs +++ b/zebra-chain/src/transaction/tests/vectors.rs @@ -896,36 +896,36 @@ fn zip244_sighash() -> Result<()> { for (i, test) in zip0244::TEST_VECTORS.iter().enumerate() { let transaction = test.tx.zcash_deserialize_into::()?; - let (input_index, output) = match test.amount { - Some(amount) => ( - Some( - test.transparent_input - .expect("test vector must have transparent_input when it has amount") - as usize, - ), - Some(transparent::Output { - value: amount.try_into()?, - lock_script: transparent::Script::new( - test.script_code - .as_ref() - .expect("test vector must have script_code when it has amount"), - ), - }), - ), - None => (None, None), - }; - let all_previous_outputs: Vec<_> = match output { - Some(output) => mock_pre_v5_output_list(output, input_index.unwrap()), - None => vec![], - }; + + let all_previous_outputs: Vec<_> = test + .amounts + .iter() + .zip(test.script_pubkeys.iter()) + .map(|(amount, script_pubkey)| transparent::Output { + value: (*amount).try_into().unwrap(), + lock_script: transparent::Script::new(script_pubkey.as_ref()), + }) + .collect(); + let result = hex::encode(transaction.sighash( NetworkUpgrade::Nu5, HashType::ALL, &all_previous_outputs, - input_index, + None, )); - let expected = hex::encode(test.sighash_all); + let expected = hex::encode(test.sighash_shielded); assert_eq!(expected, result, "test #{}: sighash does not match", i); + + if let Some(sighash_all) = test.sighash_all { + let result = hex::encode(transaction.sighash( + NetworkUpgrade::Nu5, + HashType::ALL, + &all_previous_outputs, + test.transparent_input.map(|idx| idx as _), + )); + let expected = hex::encode(sighash_all); + assert_eq!(expected, result, "test #{}: sighash does not match", i); + } } Ok(()) diff --git a/zebra-chain/src/transparent/address.rs b/zebra-chain/src/transparent/address.rs index 0780532d..5951264a 100644 --- a/zebra-chain/src/transparent/address.rs +++ b/zebra-chain/src/transparent/address.rs @@ -2,8 +2,9 @@ use std::{fmt, io}; -use ripemd160::{Digest, Ripemd160}; +use ripemd::{Digest, Ripemd160}; use secp256k1::PublicKey; +use sha2::Digest as Sha256Digest; use sha2::Sha256; use crate::{ diff --git a/zebra-consensus/Cargo.toml b/zebra-consensus/Cargo.toml index 1fe02ed8..4af9bd61 100644 --- a/zebra-consensus/Cargo.toml +++ b/zebra-consensus/Cargo.toml @@ -16,7 +16,7 @@ bls12_381 = "0.6.0" jubjub = "0.8.0" rand = { version = "0.8.5", package = "rand" } -halo2 = "=0.1.0-beta.1" +halo2 = { package = "halo2_proofs", version = "=0.1.0-beta.4" } chrono = "0.4.19" dirs = "4.0.0" @@ -34,11 +34,13 @@ tower = { version = "0.4.12", features = ["timeout", "util", "buffer"] } tracing = "0.1.31" tracing-futures = "0.2.5" -# TODO: replace with upstream orchard (#3056) -orchard = { git = "https://github.com/ZcashFoundation/orchard.git", rev = "568e24cd5f129158375d7ac7d98c89ebff4f982f" } +orchard = "=0.1.0-beta.3" # TODO: replace with upstream librustzcash when these changes are merged (#3037) -zcash_proofs = { git = "https://github.com/ZcashFoundation/librustzcash.git", tag = "0.5.1-zebra-v1.0.0-beta.4", features = ["local-prover", "multicore", "download-params"] } +# Currently pointing to `download-sprout-params-new` branch which contains the +# changes from `download-sprout-params-d14e7a70` rebased on top of d14e7a70 as +# required by `zcash/Cargo.toml`. +zcash_proofs = { git = "https://github.com/ZcashFoundation/librustzcash.git", rev = "c3ff94134b472ba90af665e5454983dc12de1338", features = ["local-prover", "multicore", "download-params"] } tower-fallback = { path = "../tower-fallback/" } tower-batch = { path = "../tower-batch/" } diff --git a/zebra-consensus/src/primitives/halo2/tests.rs b/zebra-consensus/src/primitives/halo2/tests.rs index ce9b1e2a..9bdd7e07 100644 --- a/zebra-consensus/src/primitives/halo2/tests.rs +++ b/zebra-consensus/src/primitives/halo2/tests.rs @@ -5,12 +5,12 @@ use std::convert::TryInto; use futures::stream::{FuturesUnordered, StreamExt}; use tower::ServiceExt; -use halo2::{arithmetic::FieldExt, pasta::pallas}; +use halo2::pasta::{group::ff::PrimeField, pallas}; use orchard::{ builder::Builder, bundle::Flags, circuit::ProvingKey, - keys::{FullViewingKey, SpendingKey}, + keys::{FullViewingKey, Scope, SpendingKey}, value::NoteValue, Anchor, Bundle, }; @@ -30,7 +30,7 @@ fn generate_test_vectors() { let rng = OsRng; let sk = SpendingKey::from_bytes([7; 32]).unwrap(); - let recipient = FullViewingKey::from(&sk).default_address(); + let recipient = FullViewingKey::from(&sk).address_at(0u32, Scope::External); let enable_spends = true; let enable_outputs = true; @@ -56,7 +56,7 @@ fn generate_test_vectors() { let bundle: Bundle<_, i64> = builder.build(rng).unwrap(); let bundle = bundle - .create_proof(&proving_key) + .create_proof(&proving_key, rng) .unwrap() .apply_signatures(rng, [0; 32], &[]) .unwrap(); @@ -76,7 +76,7 @@ fn generate_test_vectors() { cv: a.cv_net().to_bytes().try_into().unwrap(), nullifier: a.nullifier().to_bytes().try_into().unwrap(), rk: <[u8; 32]>::from(a.rk()).try_into().unwrap(), - cm_x: pallas::Base::from_bytes(&a.cmx().into()).unwrap(), + cm_x: pallas::Base::from_repr(a.cmx().into()).unwrap(), ephemeral_key: a.encrypted_note().epk_bytes.try_into().unwrap(), enc_ciphertext: a.encrypted_note().enc_ciphertext.into(), out_ciphertext: a.encrypted_note().out_ciphertext.into(), @@ -134,7 +134,7 @@ where async fn verify_generated_halo2_proofs() { zebra_test::init(); - // These test vectors are generated by `generate_text_vectors()` function. + // These test vectors are generated by `generate_test_vectors()` function. let shielded_data = zebra_test::vectors::ORCHARD_SHIELDED_DATA .clone() .iter() @@ -200,7 +200,7 @@ where async fn correctly_err_on_invalid_halo2_proofs() { zebra_test::init(); - // These test vectors are generated by `generate_text_vectors()` function. + // These test vectors are generated by `generate_test_vectors()` function. let shielded_data = zebra_test::vectors::ORCHARD_SHIELDED_DATA .clone() .iter() diff --git a/zebra-consensus/src/transaction/tests.rs b/zebra-consensus/src/transaction/tests.rs index c1d2ac56..462975a5 100644 --- a/zebra-consensus/src/transaction/tests.rs +++ b/zebra-consensus/src/transaction/tests.rs @@ -1,13 +1,12 @@ //! Tests for Zcash transaction consensus checks. use std::{ - cmp::max, collections::HashMap, convert::{TryFrom, TryInto}, sync::Arc, }; -use halo2::{arithmetic::FieldExt, pasta::pallas}; +use halo2::pasta::{group::ff::PrimeField, pallas}; use tower::{service_fn, ServiceExt}; use zebra_chain::{ @@ -306,23 +305,29 @@ async fn v5_transaction_is_accepted_after_nu5_activation_for_network(network: Ne let state_service = service_fn(|_| async { unreachable!("Service should not be called") }); let verifier = Verifier::new(network, state_service); - let transaction = fake_v5_transactions_for_network(network, blocks) + let mut transaction = fake_v5_transactions_for_network(network, blocks) .rev() .next() .expect("At least one fake V5 transaction in the test vectors"); + if transaction + .expiry_height() + .expect("V5 must have expiry_height") + < nu5_activation_height + { + let expiry_height = transaction.expiry_height_mut(); + *expiry_height = nu5_activation_height; + } let expected_hash = transaction.unmined_id(); - - let fake_block_height = max( - nu5_activation_height, - transaction.expiry_height().unwrap_or(nu5_activation_height), - ); + let expiry_height = transaction + .expiry_height() + .expect("V5 must have expiry_height"); let result = verifier .oneshot(Request::Block { transaction: Arc::new(transaction), known_utxos: Arc::new(HashMap::new()), - height: fake_block_height, + height: expiry_height, time: chrono::MAX_DATETIME, }) .await; @@ -2166,7 +2171,7 @@ fn fill_action_with_note_encryption_test_vector( ) -> zebra_chain::orchard::Action { let mut action = action.clone(); action.cv = v.cv_net.try_into().expect("test vector must be valid"); - action.cm_x = pallas::Base::from_bytes(&v.cmx).unwrap(); + action.cm_x = pallas::Base::from_repr(v.cmx).unwrap(); action.nullifier = v.rho.try_into().expect("test vector must be valid"); action.ephemeral_key = v .ephemeral_key diff --git a/zebra-network/src/constants.rs b/zebra-network/src/constants.rs index c6cb4b7d..ebe50146 100644 --- a/zebra-network/src/constants.rs +++ b/zebra-network/src/constants.rs @@ -241,7 +241,7 @@ pub const USER_AGENT: &str = "/Zebra:1.0.0-beta.7/"; /// /// The current protocol version typically changes before Mainnet and Testnet /// network upgrades. -pub const CURRENT_NETWORK_PROTOCOL_VERSION: Version = Version(170_015); +pub const CURRENT_NETWORK_PROTOCOL_VERSION: Version = Version(170_050); /// The default RTT estimate for peer responses. /// @@ -278,7 +278,7 @@ lazy_static! { pub static ref INITIAL_MIN_NETWORK_PROTOCOL_VERSION: HashMap = { let mut hash_map = HashMap::new(); hash_map.insert(Network::Mainnet, NetworkUpgrade::Canopy); - hash_map.insert(Network::Testnet, NetworkUpgrade::Nu5); + hash_map.insert(Network::Testnet, NetworkUpgrade::Canopy); hash_map }; diff --git a/zebra-network/src/protocol/external/arbitrary.rs b/zebra-network/src/protocol/external/arbitrary.rs index 229d2f0a..e2090d80 100644 --- a/zebra-network/src/protocol/external/arbitrary.rs +++ b/zebra-network/src/protocol/external/arbitrary.rs @@ -116,7 +116,7 @@ impl Arbitrary for Version { type Parameters = (); fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy { - prop_oneof![170_002_u32..=170_015, 0_u32..] + prop_oneof![170_002_u32..=170_100, 0_u32..] .prop_map(Version) .boxed() } diff --git a/zebra-network/src/protocol/external/types.rs b/zebra-network/src/protocol/external/types.rs index a4e8238e..309ebbe0 100644 --- a/zebra-network/src/protocol/external/types.rs +++ b/zebra-network/src/protocol/external/types.rs @@ -113,8 +113,8 @@ impl Version { (Mainnet, Heartwood) => 170_011, (Testnet, Canopy) => 170_012, (Mainnet, Canopy) => 170_013, - (Testnet, Nu5) => 170_015, - (Mainnet, Nu5) => unreachable!("Nu5 Mainnet protocol version not yet defined"), + (Testnet, Nu5) => 170_050, + (Mainnet, Nu5) => 170_100, }) } } diff --git a/zebra-script/Cargo.toml b/zebra-script/Cargo.toml index d746a03e..998e944a 100644 --- a/zebra-script/Cargo.toml +++ b/zebra-script/Cargo.toml @@ -8,7 +8,7 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -zcash_script = { git = "https://github.com/ZcashFoundation/zcash_script.git", rev = "270d32d192c5880f911acf21ef100caa128e6179" } +zcash_script = { git = "https://github.com/ZcashFoundation/zcash_script.git", rev = "98c74180ff2899898457090b95578dc4e58ce85d" } zebra-chain = { path = "../zebra-chain" } diff --git a/zebra-script/src/lib.rs b/zebra-script/src/lib.rs index 1a539d66..79404f7a 100644 --- a/zebra-script/src/lib.rs +++ b/zebra-script/src/lib.rs @@ -103,9 +103,8 @@ impl CachedFfiTransaction { let all_previous_outputs_serialized = all_previous_outputs .zcash_serialize_to_vec() .expect("serialization into a vec is infallible"); - // TODO: pass to zcash_script after API update - let _all_previous_outputs_serialized_ptr = all_previous_outputs_serialized.as_ptr(); - let _all_previous_outputs_serialized_len: u32 = all_previous_outputs_serialized + let all_previous_outputs_serialized_ptr = all_previous_outputs_serialized.as_ptr(); + let all_previous_outputs_serialized_len: u32 = all_previous_outputs_serialized .len() .try_into() .expect("serialized transaction lengths are much less than u32::MAX"); @@ -114,11 +113,11 @@ impl CachedFfiTransaction { // the `tx_to_*` fields are created from a valid Rust `Vec` // the `all_previous_outputs_*` fields are created from a valid Rust `Vec` let precomputed = unsafe { - zcash_script::zcash_script_new_precomputed_tx( + zcash_script::zcash_script_new_precomputed_tx_v5( tx_to_serialized_ptr, tx_to_serialized_len, - // all_previous_outputs_ptr, - // all_previous_outputs_len, + all_previous_outputs_serialized_ptr, + all_previous_outputs_serialized_len, &mut err, ) }; @@ -279,7 +278,9 @@ mod tests { use std::convert::TryInto; use std::sync::Arc; use zebra_chain::{ - parameters::NetworkUpgrade::*, serialization::ZcashDeserializeInto, transparent, + parameters::{ConsensusBranchId, NetworkUpgrade::*}, + serialization::ZcashDeserializeInto, + transparent, }; use zebra_test::prelude::*; @@ -290,22 +291,19 @@ mod tests { .expect("Block bytes are in valid hex representation"); } - #[test] - fn verify_valid_script() -> Result<()> { - zebra_test::init(); - + fn verify_valid_script( + branch_id: ConsensusBranchId, + tx: &[u8], + amount: u64, + pubkey: &[u8], + ) -> Result<()> { let transaction = - SCRIPT_TX.zcash_deserialize_into::>()?; - let coin = u64::pow(10, 8); - let amount = 212 * coin; + tx.zcash_deserialize_into::>()?; let output = transparent::Output { value: amount.try_into()?, - lock_script: transparent::Script::new(&SCRIPT_PUBKEY.clone()), + lock_script: transparent::Script::new(pubkey), }; let input_index = 0; - let branch_id = Blossom - .branch_id() - .expect("Blossom has a ConsensusBranchId"); let previous_output = vec![output]; let verifier = super::CachedFfiTransaction::new(transaction, previous_output); @@ -314,6 +312,18 @@ mod tests { Ok(()) } + #[test] + fn verify_valid_script_v4() -> Result<()> { + zebra_test::init(); + + verify_valid_script( + Blossom.branch_id().unwrap(), + &SCRIPT_TX, + 212 * u64::pow(10, 8), + &SCRIPT_PUBKEY, + ) + } + #[test] fn count_legacy_sigops() -> Result<()> { zebra_test::init(); diff --git a/zebra-state/Cargo.toml b/zebra-state/Cargo.toml index 528104a8..a0ae3b2a 100644 --- a/zebra-state/Cargo.toml +++ b/zebra-state/Cargo.toml @@ -47,7 +47,7 @@ proptest-derive = "0.3.0" # TODO: replace w/ crate version when released: https://github.com/ZcashFoundation/zebra/issues/2083 # Note: if updating this, also update the workspace Cargo.toml to match. -halo2 = "=0.1.0-beta.1" +halo2 = { package = "halo2_proofs", version = "=0.1.0-beta.4" } jubjub = "0.8.0" tokio = { version = "1.17.0", features = ["full"] } diff --git a/zebra-state/src/constants.rs b/zebra-state/src/constants.rs index df0476f5..7fd16659 100644 --- a/zebra-state/src/constants.rs +++ b/zebra-state/src/constants.rs @@ -12,13 +12,13 @@ pub use zebra_chain::transparent::MIN_TRANSPARENT_COINBASE_MATURITY; /// /// For the best chain, coinbase spends are only allowed from blocks at or below /// the finalized tip. For other chains, coinbase spends can use outputs from -/// early non-finalized blocks or finalized blocks. But if that chain becomes +/// early non-finalized blocks, or finalized blocks. But if that chain becomes /// the best chain, all non-finalized blocks past the [`MAX_BLOCK_REORG_HEIGHT`] /// will be finalized. This includes all mature coinbase outputs. pub const MAX_BLOCK_REORG_HEIGHT: u32 = MIN_TRANSPARENT_COINBASE_MATURITY - 1; /// The database format version, incremented each time the database format changes. -pub const DATABASE_FORMAT_VERSION: u32 = 22; +pub const DATABASE_FORMAT_VERSION: u32 = 23; /// The maximum number of blocks to check for NU5 transactions, /// before we assume we are on a pre-NU5 legacy chain. diff --git a/zebra-state/src/service/finalized_state/tests/vectors.rs b/zebra-state/src/service/finalized_state/tests/vectors.rs index 299f9d61..107c3776 100644 --- a/zebra-state/src/service/finalized_state/tests/vectors.rs +++ b/zebra-state/src/service/finalized_state/tests/vectors.rs @@ -1,7 +1,6 @@ //! Fixed test vectors for the finalized state. -use halo2::arithmetic::FieldExt; -use halo2::pasta::pallas; +use halo2::pasta::{group::ff::PrimeField, pallas}; use hex::FromHex; use crate::service::finalized_state::disk_format::{FromDisk, IntoDisk}; @@ -72,7 +71,7 @@ fn orchard_note_commitment_tree_serialization() { ]; for (idx, cm_x_bytes) in commitments.iter().enumerate() { - let cm_x = pallas::Base::from_bytes(cm_x_bytes).unwrap(); + let cm_x = pallas::Base::from_repr(*cm_x_bytes).unwrap(); incremental_tree.append(cm_x).unwrap(); if idx % 2 == 0 { // Cache the root half of the time to make sure it works in both cases diff --git a/zebra-test/src/vectors/block-test-1-599-200.txt b/zebra-test/src/vectors/block-test-1-599-200.txt deleted file mode 100644 index fb070857..00000000 --- a/zebra-test/src/vectors/block-test-1-599-200.txt +++ /dev/null @@ -1 +0,0 @@ -04000000ed34eead710be6b5da373edd2e5515407a0d9f5f2b511f09f1ddabd3764e27008039c40bd3ab96700f2242b1200608d4a1c74264bc71b3f956a2339b4606957ba7d9248f4d9300eca388220a40b4e98ab8f0459af40d74dff3bb07a9691df4487e365d61a94e6d1f2a00ab6acaf882cba8e6f322ab507bf2c349664286203c6f194b1708250c0000fd40050008feecb65909d17f1120a372873dacc148305f700e82b5b34e8898135857f4a4f3cc568ad4d0bed15913e4461ed0d39e56a038737e664414b53b5db2d763666c1d99096ce943ebc9c9fb7fd665be8c049b6218178d33323a94502f1afa91eb9552f254b9796afa3f2a80dff1dc1dfae350eb733ee840512630fef7658525ad7740256720d1a469725d0b2fe8f6a8161807843933a43b83245073b4fd161c38cdce0ac57bd9629e0ce5961d33848464ee2fb1cc64529f1588820e06e62d52a476721bdf95add623872aef7cc13622b58103182b969f0d66b38f8351f20d0919e3a111e3f74f843746877d349a75eed5df74983fc3726e15fbf1bcce1054e38a2096ef4fc087f10c6fae6fb1a0fd78c4cd343bb3f52d939d36d204e3b55c3e26599ed2dcb2ee2b541195d06757a58908a536c04d83b67581bed02e3f72c584122ff27dadd6657e61b5375f092cfb4cf700785920fd8e3b92f58ba3d98be05a799257dd02945c8c9b0637a5d39bc3ac16d491f7355af88a9be77212d248bace52cab1dab316e83dfa7ae208a532d7ab16157abd0b299b377927d3db496e832db82739b9a91abeef2ea7942c2f1893b310969ff051786352f5884e8a572c8317d659efe1089f7a4e68bef3135ea9501e9b15c4ec91cfa1c875435cbbfda4421eab78f0d42439bde9230965617ef5c5b099fff24a52d139d07e07f1388f8caf6e25a7be438a487ad9b2f46e3d029d3831cb9337b6fcb3bb53c4ee9cc79d4b894ebd02d60e125f220c543ed1f5adb320cc3da5026bf41ecc9b15497a39662a66315de4f488f2cbe4f57d4b0d14e80be341a3678ccfb9aa1011c86934d8619324cea3a71768a37dd2ce37d59730484e5dccde868ee3fc2aef1befe9c117504c01a6325a5de16824c70e73f9267844666bc043d848fd72d7289a83ec15a2c1eefb08cd0085657436e2fca122681375d86109d986a6b6a1d110cc656138cd90b89422aae8a27da27b6e7abf9dcf0b21c3370cf453a9eafe12331a72a85338dddf45af34234cd3f50db21b6c5a67eea8e2e4965618bf9f3e0abeec58e91d4d55b138416743b3f179496addcb7633b9dfcacf128ff17e471368c5e7469246145e690c0b54f492d4c50cf7d40f80d36e7b25607c8d2a4bfe19073da2b82a1ce3ca6ac4fc12f6b4c9ea185ca61401cbfd34f09f1cff1ae9119c9fc09d00f07c56e01e0ce223c7b1c7066accf135917ac60e79f2a117c72e108012c5342f79c9938f32f1ca77445cca50ef81dc2a95ad681f4c6b44be22e4afc8bc7b11718b58ea3e02b4a48b4a8f90cefb4b804443b6b5e83b0af55a7a1ebb7b4409cfa2134c5e291dd2750eaac6131c0d4710bbda6d9b4ead5ce43681cd7ac8dc27c3081e76775f959f2692a1c5d3e8bd0629c54cadae408bd5149a0129e966b8091e2eba31b294ff5d47c0f91655691917ef791dc912f5c78bc373285d36d57ea68f9971ce0bb0fb4e4d1970637a8fa24dc858e914bfbfa9953320dfd474a36bcc39ffcff67becfb7122c2885a0aa605b09470e5456d349b5eb32685fdb460ce7bcaf75f13b927536de5a29530b6e27da228736cae7abe4a490b358c38424ce53ac123e419acec6aa1c28936b38d10edcb2c2790a282af0d8302fe734d58f507fec0470410fd20bb615f65f516a0921bd8ca8cc494ade81313ac0b2411e24d57d3f5ca742dd91e12ae27dfe74e07f9fc1c1b26ba7574d544095d30495efb0efe3eaf438c2e1c6b1a635f8ea4d4fd362948e20d85de15f80d22a3e8815f995f58bce5afe3cd79918dcdb25a09160a1a59d1d0d33b6535a1fe58920f06cca21d562716b2ee3a91df66639bb4921b93ff4b58bab61668ab295b49f77367d513e0c9088e55dada66fe65dc7d5601050000800a27a7262196513700000000e0661800010000000000000000000000000000000000000000000000000000000000000000ffffffff0603e066180102ffffffff0480b2e60e000000001976a9146e82b7c719334e3aac3916872a088b548c43c9fb88ac286bee000000000017a9140c0bcca02f3cba01a5d7423ac3903d40586399eb8738c94d010000000017a914221c95f83bf073cfb76724ed23af737c1ee3bb498740787d010000000017a91471e1df05024288a00802de81e08c437859586c8787000000 diff --git a/zebra-test/src/vectors/block-test-1-599-201.txt b/zebra-test/src/vectors/block-test-1-599-201.txt deleted file mode 100644 index ed383583..00000000 --- a/zebra-test/src/vectors/block-test-1-599-201.txt +++ /dev/null @@ -1 +0,0 @@ -04000000da438160fc9c57ca00c5251e689f9c8b21e1f84fcd645b95c0a85e9948e43100f6c3f2ef2b6f542ad77967e75314f45c509033eb887b09828ff9137c2b73ef4752da86ea6380c2353ec868cba9a16edb3b1a483a2d084ae76ab4404b2d929b048f365d61149c6c1f1c007c736075333a175f237e246890a5906e0c065d4adfedcb16fecaca250000fd4005002699b2262a65cdf85c128de3aaa471314b5c2cbb0e307fbdc2046603836141116974b80890ed989b7b19890642cc641f17fd31b7a92c7d74af40cbdefda224896b818b9baad78d22e2fa0ba66f2dd7251fe241095ced9f9249c4d7955392c4a228fa6e6bfb973c6e0d632ec3bcc389eaa15bb3c3193536862f4071a3b92bb0f227c10e3120f9b42331204428d6585b1abf396dda3c47b31ef2a5887979ae9a7efc534c7c3c3cc407355da6c927245f6ea0e15f0d1d7ed13b73d48f8021b415f63d93e04fa3a4644e3c529926a4d976d81e13a7c965cfb7e1b9d812b7c01af0bff6a4aa9ad00819e92754c1d9c5c12427e4434c2670c33df93d6eb41fbc7684220ec890a62a93ec3e4c7eb5329c5cece735eebdfa670d97c50b6689b9e0fb713f8e39fdd8e4223e3aa8abe23de3e4fc94b6fcf2708930abf88aac55ca4dd5f2d80998c678285e7ad52186ffef7f229800a24f98f9d8b0995beff6e980d17f4e73f9da5b3603da84b20f876d57eb53b3eedbcf17b6cf561e9ccf2f41570f009e4131c3f983d81ef3fb65a66d70e6114255c5b46559b0fdca9c4a51fee1c146d117fb235c1150d22b2b45848bec53a5fc7bb1a98757003e0f2c49d98e949cdd69b7340be5df7ddb553668425efb6a123bd981e425cb29e96d31898f250815c644b9365d1835316d520e234ccd22c8c459488fbee8e6fcb66202c83ed96dd298933a32f251ddc96f69b788759c7d1319baada1924e137eede59400512bea082a71ad020c120aa559c72bc7690ad163b7af65a1dc7d1d635c3a78154f57a5fec9ed1327f9d2f6749a0a08d72a4e05e1e840e82b3d61e15cc3684a4847f79cfdbd1b2506a998fc018c636c6dcc74a4fc61690abd06da5be806c1a9e44184dcc0f602b340aa72716a03f435671a2230a4699d568a44cbe043261a46eff0de687852470138a4b0bd20b685bd011a1e89fc9c731ba35c2ba90f8d17a86d3069f38ef3827076a8a4553b844d5dc60289e4638707f5aecfdaf25255d62b54b4032c8d5f086306f1b34466407508012dd59d14ea80025dd0270372bce36d49e8c9db0c0224e118e2455c42cf038b0cd955cda1b15ac9964ce1132f24daf05f43d0e8c226f9fe7080187c997798136b013dbb876b4d1c314b566af314b11f5e779614b5b8a878439d8727bb45a601eeebaf58d3f6c93f77a17b5370eb199e33d698010b345f0e0649677e985e923d12b6ab7d0c3aaf48720741d65e611979edd512368ab8e6b5a5bb9777fd245079733d5e57324b2089c61f5bbf921ecebd970eb6036f56c937cba3fba4dca34c293e01aa7e7fdaf1dd127df1c17d8d7b19dad363cbfe69c79d24107840aa0bfc447158535d772b3453fa2ce7a99e87bbd8f6a5160c7538a993e9b1251c8396e8bc678a56353662b401b72494df058c6e4941f13ad05655ca34d571f93d2e175a2cb8937259668dd3dcf9e4c81edc3fd77464167affc3c39e34bff852c3c45cbde28f9b9a5f8a7e54763dc2fd970271cade79ae49d40a8706853eb116185a6eeef82745d18957e2ce01169c38bbc31c68684a47dbe3de542463771e9711de6c3476291034f5032ba18e8e924c4f30c4df96dbe15f2a5a55503a9cdd40a8f62fc5a70107df34a68cc6756c33a137be63540d2551218a248fe92dae21d922bef56a42d7bda739383ad9fd27d63c74d1d2253c752fc1f57e852e8bc912a8cb8f12d5b50d97569560d8661afdb00b7c711e23a31d1d025f13a9779343268b5233f9af589a9b2a17b7e9915dcc65c39c4a5612b3f74b6a30c8762280352b122afad7caafd1ae1883e7c5de831d539c605c21376469eb113e88abbcf5578c6b2e56445bdc6f6321b8eff24e97d43ecfcc62d1f4ebd4acfd63d4c69701050000800a27a7262196513700000000e1661800010000000000000000000000000000000000000000000000000000000000000000ffffffff0603e166180101ffffffff0480b2e60e000000001976a9146e82b7c719334e3aac3916872a088b548c43c9fb88ac286bee000000000017a9140c0bcca02f3cba01a5d7423ac3903d40586399eb8738c94d010000000017a914221c95f83bf073cfb76724ed23af737c1ee3bb498740787d010000000017a91471e1df05024288a00802de81e08c437859586c8787000000 diff --git a/zebra-test/src/vectors/block.rs b/zebra-test/src/vectors/block.rs index 1bbcc31c..b72f2af8 100644 --- a/zebra-test/src/vectors/block.rs +++ b/zebra-test/src/vectors/block.rs @@ -224,9 +224,6 @@ lazy_static! { (1_116_001, BLOCK_TESTNET_1116001_BYTES.as_ref()), (1_326_100, BLOCK_TESTNET_1326100_BYTES.as_ref()), (1_599_199, BLOCK_TESTNET_1599199_BYTES.as_ref()), - // Nu5 - (1_599_200, BLOCK_TESTNET_1599200_BYTES.as_ref()), - (1_599_201, BLOCK_TESTNET_1599201_BYTES.as_ref()), ].iter().cloned().collect(); /// Testnet final Sprout roots, indexed by height. @@ -281,9 +278,6 @@ lazy_static! { (1_116_001, SAPLING_FINAL_ROOT_TESTNET_1116001_BYTES.as_ref().try_into().unwrap()), (1_326_100, SAPLING_FINAL_ROOT_TESTNET_1326100_BYTES.as_ref().try_into().unwrap()), (1_599_199, SAPLING_FINAL_ROOT_TESTNET_1599199_BYTES.as_ref().try_into().unwrap()), - // Nu5 - (1_599_200, SAPLING_FINAL_ROOT_TESTNET_1599200_BYTES.as_ref().try_into().unwrap()), - (1_599_201, SAPLING_FINAL_ROOT_TESTNET_1599201_BYTES.as_ref().try_into().unwrap()), ].iter().cloned().collect(); // Mainnet @@ -865,21 +859,9 @@ lazy_static! { pub static ref BLOCK_TESTNET_1599199_BYTES: Vec = >::from_hex(include_str!("block-test-1-599-199.txt").trim()) .expect("Block bytes are in valid hex representation"); - pub static ref BLOCK_TESTNET_1599200_BYTES: Vec = - >::from_hex(include_str!("block-test-1-599-200.txt").trim()) - .expect("Block bytes are in valid hex representation"); - pub static ref BLOCK_TESTNET_1599201_BYTES: Vec = - >::from_hex(include_str!("block-test-1-599-201.txt").trim()) - .expect("Block bytes are in valid hex representation"); pub static ref SAPLING_FINAL_ROOT_TESTNET_1599199_BYTES: [u8; 32] = <[u8; 32]>::from_hex("4de75d10def701ad22ecc17517a3adc8789ea8c214ac5bfc917b8924377e6c89") .expect("final root bytes are in valid hex representation").rev(); - pub static ref SAPLING_FINAL_ROOT_TESTNET_1599200_BYTES: [u8; 32] = - <[u8; 32]>::from_hex("4de75d10def701ad22ecc17517a3adc8789ea8c214ac5bfc917b8924377e6c89") - .expect("final root bytes are in valid hex representation").rev(); - pub static ref SAPLING_FINAL_ROOT_TESTNET_1599201_BYTES: [u8; 32] = - <[u8; 32]>::from_hex("4de75d10def701ad22ecc17517a3adc8789ea8c214ac5bfc917b8924377e6c89") - .expect("final root bytes are in valid hex representation").rev(); } #[cfg(test)] diff --git a/zebra-test/src/vectors/orchard-shielded-data-1.txt b/zebra-test/src/vectors/orchard-shielded-data-1.txt index f4da6b92..82004fa3 100644 --- a/zebra-test/src/vectors/orchard-shielded-data-1.txt +++ b/zebra-test/src/vectors/orchard-shielded-data-1.txt @@ -1 +1 @@ -0230e2b520fae19071aec3ead6e7b9b7b70e8cd50bed24d3cda4c0fd2a7d49e69482e4d223b7c51da15565bf7370bdca547ad282c502851b3d1200ea73a26bb50611628f1407b4145a6cd6679889e381bb7a234988e5b87a1e3d887c09238e3abfcd679124bf1913652e122cbcbb3f1f4df063a0f4fc51255d6aeb7823db590317ac3a1225bbafc1953729e388f5862990c475cc6ddfb7b121846002b3fd8ac92a847c4b47460475497009733c37262149dc485a257ce817fe8e86739bab3ff9c14dc26e40aa975000f24e3466327d85ff90abf24d8941b43b574e553a076b7ec204f5591d31087f38c317f6c376a1b75bb8360f3f3952c59ca5fa5f1faa3e04b5e51a0dc348745a91ac6ce18675c20d5ce9dce15568519729e5e1f2d51e88fa85ab5a91f73ef14d80898b0915f1dcb3482c6a1fa11526cb466eb751374635b8a63d1e1d5b606af0f5741850b7818ea35cec06bcf662f322ff97aca470b99af15ef3a262ab692f7e8a0c9cccb9de21082aeb8d563408719210cc8adfca4f245059b8f61e07ec43c09c396d733511bb5dab2ed9d0a8119aa8377f56b98eef07be3acd686b85daec8401a088d5561b132ba5e63bbd0932e0c3dd9067bf26888350e58d45570d5790016957e9f22c262285fcb250d33e351a56e5070ecae86f121a3a6510b5dbf5a798a8b1e3460657919d95db31c87c131c38f1cf6db3be0288fd2dbc1019d76a3cd429570fa5135350618adc2560279b8c92a9a699b2d098063aa0184507ef9adf1dde8d022e089bc633f830cffa03d10255f8dd6f90d1efc08d409a4e565bf1122db8a374cd20145fe7308d6cb44dc74c453930ec1f58db63b53a3ec9eb13b3060548502f7b2314bca5d9dc435574f4d30dd5fd99b017f78e365d008d1e1a7463e1ea6a21f0df13d6f662dca295c78652a46d21c3e90de3591a19d35911c09f869470bd93758f1a11c06785a7d9636817731c0b66c583f89c140ec5eaf5f3c629debc89be6ea953056d3c4cdcd4bf860c0c130e3227d17908550158411d530f0610f96aa8d8b94e448de2d354804acd56a81da7f2077a003f78ed017f876b37d6ef00a25c0810a72a40e8c4408b796b7be1c35d420837a28cd8a9fc648e9ec239cb0889ceaae896fdb7ffefad3a85547bb9100bcba5772e080c9f7f4f4f19f6dcaad9b2656bd599fc2c07495b2090ec59ed926bd9c0319f0b10d79668d4b7bc13a35ef2dd50799b67670c47d03b335c65f46abc356dad1bd9ae1707557bf57e8253f657464991a35d245000f16722d4a189ac52b11c466530aa33e6e18d6143f0b62dc7ab1ac8402fd36e660abf1b9116fa5ff18f99fff0d829579fb2ce309217402747192a6ebdfcc9af6ddfd70eed1fb5e5d4d6904099864ea0dd1e4ffc314dfd39eb40cd2407c6aa3cc2f74b13ca4e734ed05f76fb3233f5d8f932b816f9404c614e195a91d1e5055f588a09f81754b150b17f406d9d6e8525b5c4b805ca465e3cbe70204661f0944af9bb73a19a012ef4c2e05ae04ed0a6a3f7da5ae96b7d35de7948d291e1c970a9b80c20f97eec3b29a068df7c68f74b8d50ff67a9a6cfecc5f31fa514410c9993f920239fc62dd4b47975e32701ab4b5e5b9c7fae55561e838d15b10ae069dfe2a647df3367733a2976701d432416cd6ec2c0e401daea3d9c8396739349aa911750017efd4fb07440df2d8fb21ee9ac5443cc4e2c135aa2929dc79b0bc36a54a7344e6a988c2c12d0675efd6fa0fb35eb5b216d9a2c5d6767d750a4a671678ede585aadcfb1b51b1ebafe5f14c134929cb33c30049dbf42e89ad03d51e4648af6e033871cf218834b116a413f018ad4277e45aac1f22295ef9e08f528b0c125fa97e1953302af8c05d2a39df4050c2972c24c2ce79c115e9e2341aef96b4bfcc807ff765bb8bea4ac7eab408f5a656e46c3e32cb381661846fb3126218806690686d62b698e96f96b135e87ed1f547ed87e94e1f43d2651300b48d73c1b1f7460bd63ebe7b08dc8582d2cb42c0b9b44b3cc9a17832afc60192f776e2aa206eee77594bcabfb64c94001d70919fe6d7d52d5a4234c243df7e109c401c82184802822a527bd7077e128358e7faff7626e588af7b4a1a22999854fdb6d55646647849e554f1534770ae519ad2cb42eee07eb26a0efcda39fa332d720853b7b41840838518da526f89d35b4c1e067df01f32999228c513e4c0f21cb96268e4e30144bb0f3d7c3d0e0faad2665b2ab57cebede00f1fec4a7064be121972cf99c9a0869d40075b39281137c95862736f1ee9c89f87d7c46228a5ae7030a000000000000000000000000000000000000000000000000000000000000000000000000000000fd601c04c2e3be07d4601c6190a5838b79fecb03a7e7fde949eb2909d20fc3e6401f013270eb6134cb28eaf93cee375e3a5b887c5abc00a4913957b76df853e2ee05a9352b37c6b87ce27aaaa4cbd1451e101c00bc2cbd7f142ed8ed8d41384091970cc6ec7d6fc6c4833b9bd377ca2bd2f164d267b1980a7db4b45a8d97d0bff84b3a28632356abd199ff94b2f7b9bb2084ecf3b164e8bc568aff111a4e99b6b195bea377366f1e677a8648954657249dd4f7363901f3d55b4354e34d64dcb4587aa18c1721ea9cde5386b7df7c72567146acef8a33688a05fa8ac0b115f17f3811bb204a9fee7036a9f84e55e2bd84fbbe8e7e255d62fbd8874c61101cd4ede0e316a082f225be37267c5fe1a5dd287bb987b632c47c788c4e837db1f042a07c6918e4c9aee1d294007d7de571384edccc9c0628f326d0bde4529b05177dcd9ea626261a1cf3143b51a78c2c93087e01e708a30253a38ab9b1a0fb05dccb0281a02cee6f279c1344d24ecc5812e08fbd91066fea96db229a1b7bfc60d7dc2494fbbe809f35d81f8d1d56bbdd0786e186d831e4ee6978d8958739772071db8c867011e8f18baaaf1489bab2263faa0a6d76823169ee01ac210395672aee186efa8d111e22d981cd399cd993b1e4230be2ed30752781c94625c81cbb51e1f4aff1c93ae200bcf791905962ec1a6a3e78c3a0dff6b90d3866fb04ea254819c00f27511bbda9382ed30d908b939c1dc91f89ecf4aa298ef07b4d1286aee88d84c5c6d518ec35e4e704afd96bfb0aab2add9fe3197ddb074208926f9a8d284a9090edf99d92afa8a272f36a72d5bfb78e72cf5d8176f0a12dc1b8978a61686977e3a397b479ce7d6ae480aff655a7544f17360001a680947d3756e22c499455d31bbc769215954fe6b3a8ac73ffbbceef80b24f8968454497d667941d80f95428e06b40142b6ef172b2ed72b7f14f427c192caf81bb3a61ee4d1c5b2859c75a8b318b089eab302a80a13631d4e07baf96dfbbc91eaaa16e1183883d9843f2b740bcaf6584bf1173b30715a2db3eb90c4d5d67466639dbd14b7203ad23e6147fd24a4d352a87608da266619037e9f840b3df3578b19e3e3b6f275bbb9fa297880ed9ad34146b98e2a0d0d7cacc384bd2d1d9d98efb05039e93c9adc82405cfb1f2c8b40a148c0615de7437a481976001a6b480faa15ace0f7552e56ede0c9948ed07a27792c1ae127f5fe4f9297ad056bc175a4b1e30c5d2779496d3d67d34482c160ffd2cb376a3e5e92a4f97f7b973ae52e58d730aac0098bb38f8c5aa096ab738cb3488e182560ca3af4949d8746926e8d8b90fce8c1ca46eda9b77aa924ff7b7f76c2bf00b336f73a00e5b7aabb30f21b9e18105d60135b4bb8de7c9fc98fb0e1b9f9878ce6e2efdbbf37b4cf9ff5b71efd85041f17adcbb7fad7c630e70a7a5b5650b3e511b780ba1e254d6609777382eb9b7edfd46677d4fe4e4d0fcd9da8abf9821080c7dedc10be9c6f26c90c5e86193382c4a61db66d973bd433251c3f6a41c34eb1e39647dc4e512e1e9cfc4a1db921757dabbd854da5d882eb4036c94aa948723e7aea234052a7730a1d59ffba8a389d8280b55cf14ebd5e49707c2f533109840e9da2ee2d782115675a78a77f349fd6bada80ca8e76cee2708d3f9f091822813825a0c8fc7d56e1046e7bf7d185e1aa0e2e30dbe540017ef75aab226bfa1b7d2aeaefd513b4fb33e693edf71ddcef4a5b136e1dfe3f7d8c1ee83258234770b08e6c56ba18f4eba0e4e780ce5278a5c565760c69182e29cedc0d57c67e7012b9b8c2a78e4cb647955167c47c4e0a34fef0426037a33c12c43104c6c164f0d2c6b909ce78cc93b0016b9638e86899d9bb14faaba66017f9d2137913fc453248cbdb09b76cea1d6ee493ce4dedd501db76a83cfad6e9ea92f40fcaa9f536a0a900a5d8e03592a1827a542c763f01c932293c0a35418340a65edd2e295419100144ba832aa94dc9bb5fd8e383ebd48def1f01a3eea82bd7c146617ff6bfd7645307deb206a031f39bb188ebd52a781dae3b86ead58782d2f6cd3bc8bf38b480f9f377e33f5905294e135dedfe542708a573c9cbfa53573f9ed973db68381ab9793fd9f6c145b09e191cd34ffa293fff75cf977376aa3a441d75a80fa70f6d5852b2fa8a7fe131b48ac8d5c6030760d16e6bb5be4fed549391730b7fceadee9babb298ff28cf5fad5ea002da349d3d3bec0437e5bb4b155e7a015a6fe2560199f371ad8e6ce2906dfae0d0fe2ed4a92d3efcf415a1eac560e974634048349a1c617500b621635b9d19e20afa8cd6d44485116ab2089457b40003e04832c9ffb093d5c6757d818487c0f178cfc6ef9b89b9f849b0d517f693cc9e0a5b58a3f1cd7bda5034c0da55cad0aca94b92ae0447b9a79fc40255fd9944d944304264d6a680b3c2e435b77c0cc7e5cc593e87f8750081d3c93ee0b5dd214023150a9c77370252a31b0d3de9de37b2a2b0d750c49594cea407ea75ed50f84f2da4c82a4820a270644079a0c8a5adbe052253597720e6e7d48877c060aa666bd8fe30239445f34c3c22f31005ffc04c9308707729d35ed9fe4c9f78360e4802fe817da060fea1658145a098e1b8e4a0eb59a6455af36eaadb1281f832369cf2a39f8e307483f1ab5dd82ff207443d69dd69d999b583d71b03926da756443866033fc1aa1c94d206fab1f4fd0f2a2ad8f55522aa9d3bddc8b7cb0dd69d203c8ea9bc6f4e4cfef0f2514c25e3ae05cae5bcd72cd55a08dab6af19319a2e174620001a098eb476602ebfafd03890d647dd5d5be8f3a6594f6da402de9d6621b064c510997eea82529d435688bc64fcbebba9416e456c0dccde21e555b4492cea7e29ce1111a01a50d19f1fdbd03c665742d01f5e76c974f05ab8940305b4c88dd215045a29a067720ce1638773d06c6be07c3272be9d73c6c55d47e5b72da704ab70ecf1bc58b6131fdaff7e2e8d3cc4f4153d116e8177c3ac5d9ff55a492d162c3107a237ecb9b262f312a868dade348a1401c302be149c2f3449179932f8d4c3658c75858755826dfe4845d0b7b3fbfd830b6e601eb77521021811d2508a2ad5eb9d410c5405b33015f0a51cab6064b14f94b6b79e414393ab43aad30dffb41524e45b3a5679a189e3606b0d2fd9c1ded19e994e59ca0bbe47fbda44412ad50ba3ff482bc8fc8183e9a85375f2e600903a26f43d218503027e802f9882e7c9abc51efc37f2b3e1c7da957c88fb14d3e3f58075d230c3d242f8e1bc9827818b96ddd00013a795b35d65e6c1ac860e171a28f972db3a14d4a071c93c80b3ff43dba2db8fb85d0401a9ba990e19bb8e7cfe8bb3a0303bdb64efffc5cb0f05053fd57544f9bcf14df1152a23cc59fce55c8dae060c90a622db06a31056ba8472e4e75ad0c9f167a51248857c781c85f0123fa5fc5a74c5bf2cc9599ac2ad49c4afd11a3dcce20c3ec3563be6e798f2079cebc7fa98e9993d9aae8d01d7d59daf554afc249370a875e28e18374db40fade3e279eb606cacc28cad3a2a706792853414e6a41a010c2ad048aa8ce14f62291b7c8fbddee1bbcec1a87eb81aba6516d3c3ca9df5102cef615257576793244d4f98ca14015468b1d7ee7063b7b8cc30a691880fdb54b5e7902dea2f506533e6bb26d0161ad50a05603623185a75921c099f9f08fd5c7f36d315f0103a5110f36c424760e32f83cbd78f850ff0f7d610f176ac654705070882edb8ea2ecb56ba53eb26c1eacd92c79e321bf7c2ccecc1213d231562d256da73d70f513c93d3baabe4eb6415aa6c1ed0dba0e6369ea20f61feaf47703309ba424a6aeab097a77eeef17180bb9e2318e88007762637b184d978bf1c7edd0595a27e79b109c70baaf89f55e085e68fd35f037414a23853b83bea2adfb8420f33c16915208e423ac08c81c8b5a709c2671a63af0b4e6d8eb90c6b9dc11ae4b4a4d13b3f0da46956f999d9ccfba6cf963183c45d9d31c85b28d77b4daf09165df0133fa2742d86896b058910330d09a033e2be632930b2397f4af88de9c10b10543360a717d7cc09c277ab8aeea9894a9dda9d460e805bed7fca4e260ac9c8e9d603c305d95e9c8f85377cbc64d4822f070dae0528c2b5b8cb5d3cc97190fb840d503b07853964e1687334986796659b28aa0286ed88c986e04418f355dedf112a1316d606de4a17dddb63f85c9dacbfc81f905f4ff6f997d4a0d1939986e16ffec3d2f6acb9d081570b4564b511940f655ec6553bf8f12a35e7ac080be502665882b90cdbe9e5d9225c9d087d3f8dd40d0204bd93856ce987961b3b661c79d070a398332abfc07ed8f09fd2a7bfb7cc02f40a2903f78be46442d9e225160615b773b1724fce894e7d0e63a1cc40642f79a8813d8d56c3fb3cefe801da1b6439d9b0199626fd878c65a0e298a43b28d3f2989e2e59a5cb1102fc643f2964196ef371f2abdf0ac206dac8d1e3d53b3284ba4e9920f96eba6d74775843ea7d2a668b42ddb4c56aad0c599f98b6c937163f7423c88a55d2b376b425d3597145ba2d6e22b17f2073bbb08096ad0318eaa25bede67da088cec9653c857544b1a287bdfe932f296433df2cd6281039f78ba1f4b7032df98f2656019153ac77edf47d270a1389ddc414590423b0003c23ce27cce628c9b73b37f2dc8b7f24ea335b9877623035df2817906026e376653346502b3176a763583fb0bf96c325a3dda14cd2b5b1bfc67aecf047b721d8615b107713bd3fef642a8503351f5904b4706791e2283373951a2025859773a15715345efaae8d26c5467ccfdbeec9b4e7f9e9f63c0913fa766d0df8f311c9263dfce90b5562f3f1467970c10a2304a97580ccc31a44724043eb2c49ce1621664bf8dd14f969616f8970da1d9ab002798756bc3b8e71a16dbb28f77ab80776a759383274ac85a3e6d44676229c4471a947d97754916eb0b99f4fd8ea46062565095bf24c7c8376fa9ac53bde17e0e33d343bad15fa349179f2f162744ac3fd38b7123f754420731877271effd931efb0413b522d9adf303a88fa0ed6128bfd09caad70e4680b1fe99a4fdc6614bf220c19b4fa6c354880f5582d28d887222f8a1a4d7425fe53b022d31fe46c237b5b31f25a6ade9cd6e02f83a947f44c28ad4cee9b37597cfcee2d4917b9442a7201ed735934423a62a2d14eb8c2ae2dac6f0400fc3bb094cf8a31da5030d92efffc799a4e31c8ed6c91c91e7bd40ae31c8a665e68db45b6996f74c1e978204a40460bf4725fd0da434343ffd509e0acaa9195237204c7b06586291e5b92751558e05d3e4f1061c68792df97f33a684c634ccc651c290f65f89da0f60ae301c753376d15252992374820e8d8bdd4058277ec9b8414d15a7139b7569a15804480326480f9ca0a32e60d732291c6d8363e3e447145877b6a3bbe475e7440c5cb67fb4ef2879f5f0e660a3353821f6c562608e25d6727053502e79ea4c89de39a2e278b67bb0a0c0bf2da12c78af7ef28326ead14156262fefbb1ed9bfd276a8c5355f1bfa2717d78229a63c321c9a4b452c7186847d9d67f07473a68da2885627218dcbcf86300c64df5429b52f929e0776c95ea59e53b3e4b5d04f26d2c42db56b4cbb3ea431185cdd6502385972c7e9853779db75ed53cb2cf4ba9f6ef24a44bbc119ebc0f148bd006024e92c6a8d6c7aef4965447f981f60a64b0902bed587d5e8476605fdf10f8bf82c3e5f524ab2a124b5ea48a9d3ea0727b38a983756b843de154c0cbb5a9630940865415b7070f3c646387d5d980fb044a54f8031757ef5368b8f5540ebb444a0148ff3c005e388188469bee9fcc78ddfeda8913f6d81931c3b662a98e6843bee368a79b33c0f3c00851e326a3c3d23c5f4d5c0830ccfb989d9f3e6c513a7291d2f31ea4e046a6fa81b145eaf0f7ba79c09de6f508ff74aa5ed4d4d917c98295a19c557eb32da85fbb30914943b93e418da1009cc4f9705120e3df4e9e8c89da51f814a3bbe2f9221bc300482fa7ff6d1927384c1eb419f059feb0d4163325b3331fa032764c31d2f50112e6e2aa4acaa6035fdf3128c625ea468ce2549ad94691512d239bdaf37838bc54a1c10d79eaef07c8906d7117c82d8a94ecb96a3095723e9f2db243a5fb5a6463d501ecba763d514bcaeb1466775305fa626008efa252b54e28d7ceb84613abdf34a88b8639c4f5bf5e38af528a97797884204e036e7205b1e6d0b719e3b983cb15d981e5bb8c280f477fa17695090dbd54b22518065219169b4c0e1e379e9ebb9ce75cb9616a115466476e9717d63c9c2827afc3dcd0b10795708ab5cbe29cac7d53ea381e859d9a0634b9c2455e368e8c7d43443f221b9d2f2682508cf62e9817c25843b7ea33a01ae2affdd2b2dd868ef02445deb10c60c69cb96310ffd293d0f163f1e7d333e9611aa0cafa1b02e035201dff1761cb8f2673fb462a39ac1435fded4a2574e8f3ab1755011add0961bcbed871c7a354686912bd5e2f6a2ec65422db6066e6e2404f61eff01032e3d1d3e7ec5e7a11fee930bdf2d8823bb421781431dd8581552d81d3a5f3083b3e9fe0df7f08b6e1b91e7ce0839e84c3ee0fa9002cf23b0d9c21c101d203135dffab6e062c7bf2a23764119d583ced3a8b1be79555422b892db431ddb0baf3e751c7bb9354bba2937aa4e7bde233ba5b438b47b3f4d087aa338f47c7d217a6175558bdb7d1c8ce31ee79aaa48f8499b8f91a1f1fac1e219f49115f63bbb9181c2d24c256d5e6fa22f568fb4384e2d14d3c18f572a3efc8aad4f09cf6d15353410ea2a5c0adb882f37efed76fbce709302d30ae3778ee609f07e4bd9b1fbd30d1409e0e5e2391ac4236393c475108518709f2902edbe4103325c0d046d6df4e36730cf023bd280bd2329e70cda2e4b47f03aca265da07882562dccb2beba14216cd45a27da8fd8741746e7d05221e90598fd524e385e0eb6aebaafb121a5f4584cb23cdc2cd9dc643f889505a2b061cf6cdfb46e177c276e9d0c1484ec2313c4ea9eb1e875bbb832122d6f5c41457417add6e888b7a7c972e5ccf1760797ef37fb64f7300de0bc2b24f1ae287f8c80694a68a06523a5bd649cc3c8da8a1f292b5b80d63eb3c87ad72da14ee5db60b866d02893c8a594bb26f90c1d850375578f9cb259823617556118409264f951b6d9b0aa55be54c029739061cedb14e33e85b29f94df2c4bd27718a92b7af1e85875e745d27687785e113f0a7c5bf56bc302dc5f4a4b28806805264e96379485703516c9cc279f3b7b463927b54947410e78cc895be26a30f3173c8c6d3699daca0203f39879f1cd0d985c8ea7822724d25aec0bb7bb20d1dfcb3bfd0f62268af41f50ce19b9667126978b8da29756c27f427f9bde230cf244dc36f2baf54df441d5a046885d64758a013ed2ddb1234727bb7357e49b5850f8610f53e003d3f3b508d7d1eba15a5ff1a9aaf317ab7ac071315b7b22e6a3b7013439fa5d5fb1a927cd82dad0dbd7d1e64a1eb59b0bb937f9b58ff000b5cdcc20433b6b30ce6133b73d28a47d2d5e3b1ce5a1ce851940b2537766873241462ea1041e286495d7a2df3f928ac022631a9119b54d8919ff37f8d3cde9ac4a517b0be125d5c74181ce7610cde02797b15408cadc9ca8e32bacdf994ecab597572d71550cf37d7d511e021d72ad433bd586c6d12c183d37eae8abae4e2e72a2930e138e2d9e8cb7d4bd73b97c2cdf3a2d0b408fb5e6400e2385cc54c3de8c9c61a77a0301f8058482aaefd83f57a2519bf1c87f3af9d164d783a843528c5fad1f9435112e9a75f6db3ddf57a5e5082d8398ec9db6fcd2a3ba450e0060eadcb80f96dd8a178817c155794ae13cf4897d71d0526ddb66f4b0a6c72287a96de1570844f02d005de76147dc2e56cd202b672f3ba377ee1e515250ab6ad49f7654a1cf5c392913358e4161bcb9dcff81efb335094eaa9988bef989c4bf130eba8285a9c51fcf026b7bebbf00b3a03ca4e3c621c589c14c45a2d61e15f945edbe68cf89cae99d1b72cfd726f3bdc46e16b2fbccde56240f91c7d76d618af9a1fbb6cdc8df4a3e360b8d74304cda52e951c9cb9f702624e5c652405f44348c7a32bd803af8ce653fcc0afb5b3762d165bd3d620af072e52e03ef6c301601ace184c59d65235cdc27c0dbb9f8f866f3f43733057053c8871911a8121df000d92f4c3724cacf8f792f8aa36aa0f89a0588a43d9e11ebfbd3c803c31af3a038f87d5b2dcdf5c77b3a13fed3d840237392aeb4f45c2029763c486fabe7b0c8ad3d7e8329cf4002784822fe07f4efb207b2768419937f2ed869c37e45912d6ee5ebc81740f3039f089e14c9e766864f3767540485792a3f5d79af37cafec254d674a0b9d6ed55e1883f3ff42e02b269a20af2125fa607c2c6dd27fa5055d4a717b04679395967a57b853bd194760a677e7148ada06561b741f45f1ac4eeda19cc5e81e5c8aabf55207b163410c4ee03f8a4dfb8f4a681f62b848c62f58cfba923f5da0cfffe95c05ee0390d07e5642cc7dcb92d195cac95fc776071745e6fda35dc5a3567d13e55196836dfa5878361e43085a047d0ad3e63b04a74a4830d574aee6ebcbc18cb7709360e9a0e769c6181ba7bb50dbcc095dc8f2747c1912471fa19d6e984ba996bc9e7359d385c298e7fab94a6a3eab791a806dfacc2e6cc1b1eaaa72f6a00dbad08943c13045b543403bb4085c6c9ce6daeff5e44abb254edc8fbdfd374bcd9c363d1101b3cb72240684b4d8011143ba97a7152c74f79249774e6e225aa958b490e462309a2c92aac2c5ef5f86a8bb8fb2ba82541b615f8d2ca0328cf669fe835366608e601e2fab2dabde1aa5a9c8cce099899f494f198bc88af927a1fa694f2162501903ad6deaf14f68c477c94991311d11de1a4332cc25f7b3723423c21a3f6c806d2ccb202d327b7bd8dc45d734ed3023b0a8f4ea5e9b28afe41fa50ccbd0a8b1ed3d50364cf155e529c1e36cefd47429f5a2a59f27f7c652a7e14b09bcef6d92dc601e9cdd41f0edea0dc49cd69e9ee15d068715df69c5f66c0341f82394b9d117223ba20dfbd68cfccc37eae1a9457e11ae3423e14c410ad0a92728ab42e161340b826c978c08ff65ae2eccb850516c9b598528bf5ee644e34c482c2a9c8cd9bb86ad5c9bea3b11b46e2b9867d1c8e04c50b82eb1713038b3de16afea3807009465654b662420aee3e3128c1cd076edfaf561dfa834f0e75be0fc764acb9af37c371183af576c6b1060d3e2ccb008441ed0fceaa0477138e99af3593a224c9aa313e45a50af5aceb4d769b96b18cbf44489d1eee90f20d514136b6066b70739c288638eb4cfcc8e7159deb7e14b0b3236b120b0fe3bca04578565e4338f0d80a162ea2a0c2a3e6a696c6052078c93c9d0dce17f59f1840ad44609a729595a4253bb7c659ccfa1bcfe5dc3f01d746da295fb1b98e175de9d042debd7c21f03137000f2b3e3d242752b469d7ab806fd9a5cb053e5339abab7ebbbc271bf493213d656689ec3023e6d358e4111615514729c10eb4c8b47e00bf1767f7480ae04c85b3172fabc96aa9610a9cc8566a748d42c3ef3f7413c8fbd73dc34e56ecb614234262a3f6c90abcc1d87ac27c165caa7bdcf1684559faa294f3f6be3bc03c00004df1075306e047dd831bbc775321adb1bb73bd23b5477ac4b77345ac1cee3e176a3ef4a4b072287ed5d994e0e2f7e991981ec9e93f87501c548a0d96d1921d81d2fcc7a4432cbeceb1613fa1307f6d206792789d8614c8641e93a6016eeb6e3658ea1c791edebbb7a9f6d68570d089e63358601db9e4d59174a4273597b6cc1821e577cb9892aa64de796e12344fc965642fda2e11a6bec55ce6428dc967dc8db3101ef439131c92771e6388521ea4627cba5c49a86d87d1e268f0f61c33018f8b5ba94bf23637aa97a6dc44a4da60cfefbc48464453fbb709c99e26725076bb60fb4d07e6d7eb2d02e9f7e783eaa896c017c980a6570f4e5df900cad1ff3d07d4e90bfc6edce38796f085ad11f335b856cef010067f271490317c5f187863924599c0fd33ac974d50c5540ae4f634015fdc28b50c3d031c9c1a2fc6b1f3f61eda8f0ddc3b8fe7c27e8343c3d7dd6ece0b34d30f095e696891399f821b87329807e6bb59a0e94658486854863c22534f0d379683a842ad3ca38b5da7f9923331876e76037d2f57358e73202af29475fc617b3754f253f9288c600d9e9813fe14a13515dce84a716a5e46ddeb323ed54f0d03d4104ffa4d1c95b2ff4d8d3d23a285e950981dcf178387f06cbda064cfb064f2bf90fe581d60b7093f54846c9038ae6bcd23fa9bba974483fa20d7bc9321bd34e59826165aec7cad512823716abe0aebdf2c8f4323f1a2236148882a63cee98611c69d8ee8fb3dfff7803efafb16eea3091ba8516e5cc34f7a120a95880ee97664dcc02b813eeb3e649761d391988c4c650ebe171ff066936f756bc177611d8d641530a66cd4c72e9e974bbc6035 +04da796597a983e98fb4bc9ffe6967d0bb8edcba2586e2518e322bcd7b974d2586b8f125dfad068d68c8491505e83f442126dcf1c0218f75425d6e56f8930ecd1672b5b3bdde7ae120f00c3662dbe07070d77822bff0547c879973065d563269b6eaba09ae7b9e6520726947ad9c0a756e92f6fd6dd9e472e7f69cd4fca5f165103f9776f469fec3e15ddd08f09e876adaa53a942e70871ba4a336cbb5e734f69cdd20290b0713b988714f426e25f0f242abc42f2f82b898ef2988fe5ae9759f6a2801129d0718c654141015eee8f64c25f703a66ceaa6190679c50cfb277d0760c4905cd09316601d03f7702697684c2f5527da18b550118001ae22a7f2621e0188c29412c38446112ac9a4e8b0b8d78371edb4e17683ac31bcb221c42bc4656139a177abf486915e25643cad962f4d49a225f8232d127682f8e68ecb737e2c071a9fcb96b6ad0ba37f319b27709de224bd23ba703170563cef4629f4d12584ccacad79482fe1b46a8aa0441e71b633e4c3fa73079e3970d6fbbed4391854ed8107272c23771aa30dc5adf336fb7622e71da316bb3f9eba40ddb8bfa774cc37e8ec9270a53844a213e9388a2f432020c3aa6029854362a0b737ec6f29ad29d822834a2380df1b46a33047126f278017493c55f36cccaa6186239e9713989f427c8888eda68cc66c422d9821be696587580fd5121e113526384b9124ea7d42459fe7bd7a0e28fa44fd62146e1acc03f0267130c9a0c1ad053d12df7fb627cc9db25de740b993a922c088cd0a8818805cae834759e39e3e0d2bea8a7c79bfa1972023ef7c3182c798370ddc14acd016f183017e853546f0bd31c67bd29bbe72e2fd40ba2293410a1693abbf837c51dea07eb603da205045842909a3e762f6280f74707babccc79be5050062c2aa318c95ca130784c1f0ad92754813779837c4865a699cd73f9b2e258e339e98d77272d7063aaea60d8acd759071f1f9dbc3b003a9077a9a36b6c4e0c55456117b7ade28ae9861d325964a62407febafc7f1d727a49784b7b1865ac23dce0690c436e553512c1c23983d983dc130aae1cd53cb90d3b415da3a9fcd8086cd1069ee1bbff2c88e529b6b8c752982b496026994886ce5b01ebcc86c1597378e7a4837d340ef9e6e0160fa31d07ae4a2464e4e3079f35001c7532a1508c7a4c256a2d5a3acf409820480b0206691356b1f99d036ea3dd20bee473128b0b0e5254832d3aec714dec43eb938eab52c017bba12378db442912367d06408335d27c951f6d6581f41f3efb661176f5474abb4c75dcac2869f39b16a8a8614be6e84775e7c29843fe4f8d12d1d388c67edc2a0eb132265153c7c04604536f75c2e03d33c48ac40a70f51dd2bfea9112a45819151adc95fff2c76e4e194f7122d0870aab1e8bac7e25144a18c602e187649f66fffa7b57010e6a7f6f88438beb7c8f5b7eb169734beabe164840e44e58541c5375f33fdf988926688e4269b7ec36306399a97e3be1eea00944497468b22474bc59a8bb0c7e15d0b4df9028a2b777668f6bf87d1c4e7d8d721c6860a2c7967924ab3dd25ced4a95a215352d566999d3fe5c1c4ef3b2c3d9bdfcb736de96f84084e0f660426054f28ee9e77e88f3ede938427b80ae0e1545c387c8ef0454e2e4e627f895b76419d4f074c88496609aa02bb99ef523a92cdec58051bac28abc9369cfadb06160f6a7fd18925240c5d5567eb45739c2373844d7e8516355feffdd13a18f02796893e18ed2c64f3bbc8feb4a52a0b9c4a9f043e631c357fae06b7ec672180477cc624df120a2c4bb80265acc0cd375e5179b1cae3f7ce08aecfb84feec104727bf884096f298f92fe2d948cfd51edea90da21883bb219d80aee19e092b858764b04040ce56d5f5068ae0fbb5345b21febc25a02680ff4e0b0d2930b0810dd8e6cd2bf31bcdfad02294d4386cc3dc44798644033c8e2d2dfca3250139de93b1d465122d8c3ecec416b1bf20caedeb26b8f499337489eddb6769a8365bec1d195051c3a3c89f1cb4b305de2bd834f5286c3c06e972adfecf5ef6ea02c77e75bc6ff660ed7d21a34bb05fdb8ac76eb7ca106c62f01e94d0cfb04f72d6e3b16efc88136fbd5a7e038178237ee1953358a6a94e7150a10add760c38bb50fc4ff2ed5b1d94a443652f26623c2f323532ad986a503d2271f353ee6b512d1135535b99c1ff7d2fb544729430a372be4bed09e7f78837023ebaebf83c1a258601bfc030168b9f9110f20a3ecdc66bd1662abd5a6c4053ed44ad926716ca8ac609d3e4c34acd06922f7bf4c5ffeab43f1d9c46de5ec007bc0bb2038ff5f22e6c47ad9f01315491615431aa920f98341275e13d1796ca4452914495fcac376db64b2645a3fe6f7a4abb60c1a93a95beb0ca21ec2dc16aecdc71033b5a42c63129624a87398a5bb2aab3c9761845aaa341493cc4e2c94a1a99feb2c21a3624ed3931586340526fc195d1f78ca4ea690770e3abc452072652d78312a0b8ab6fdefbef4cfc833fd4f1b537498c260fdf0ee284c943be62febb35467de96abda8d0b9d8c3d116647a0ccd26f27f9553394e5a61b8b1c9b031a7fa093fdc34f980cd9ec39d14242958b67780791aa4063ed5c8bd352da4c577ca970eddbadd30964cf82e7adb7fb987e07a08d1c43dcb98516d2852e9687e0f09c0b31f569e11a93388330b43f75e9254e9f1567a36e2c4e23b918788828e0e1feac36b1c4782e1fe46e98087952d5ec0f30452e83fc00b791cef239de79cfae0c190be7824a70a4bc1d35fb2b83dc48b7154acdc06b993a8d5415e479a0540fbcfe7677df154ddd212d8282d4d4937f25db787aa53f4b55c6dfc3b3bee60835ce2ada9521f5948836396af7b543a385b2afbeceee4e8fa3e30d9f8dc79054530e7bea21ae9f4a1109d8c795e2c04480e0ded9a1a441228563e6804519e7f70abfcc35b123a8579bd54c2fca83d8bd8db75b8753f2d63fc516c7cb49f1e64f3752f4fa14db4ded088f525a303cfb3e5e3dfa41a56670d92d07790f552c561fffa11824e02b0b66185f7f02a1a9c1debbef24c6ff81ce594c7d5d3f67f121223289e88db338d4f730ecf5c5114ec0ed9fd478a9325a02a177338e16c212a25741a51268147e420ebc610f4e707f1f223a95136911a9e29d10c68e1bae96b5c80dcb4fd29b6d0c2d8986a6364112fc9946824f98ad12bb8e5cb93143709276ddaf23398d39f8b98850ad0371e65287b45bb7898b8982605a6684f4aa4772c53db4a210deafdb3d365e306a6a78d553f3316a38360ac0fcecb700f4846f9bda97c3c989ac67a0b38d869af41d804e70cf8cd85ea8791153549e7f92ea761e972421285c3b9b7304dd9909741be0fd35d5499bb46591b36dbd7ebf6a1e1d386514d177003f4cc74369527c14641d889489b9f2b681afa4d55b26705a9797187bf3497cedda90d271c6149ad73a4e7d3d56664efc0d687710737c46d8423077710ea9975b273c64a130e5d7f71569ca174a20da9c10b42c8ac7f3d619197c9862be3eabed434f8dd240fdfb50a717d2110da9475a608ade86ed92557a224efe1365768fa9da9529001b18fd46f601092dccf08856a7ac2358abb31f62b4704c5728e3945db125dc8b112ff4cce2870f159a14fb0704d8f9339dcc020784f22db6524f5a65c9e25613b61c9a8223d5ca994633fb5d6922a92f2c1c9cd8ea8d10733b0bd5c5431b5ae1a659888b2ff7b8b4bf6762d73c0f7fbc9ae2a59a3bbbe3d0c84da6a94ff115f3f377ed35aa0b5efd01316518d1dce98a2eaf56f3b11f91f1abfc240ee5ca4b080c8e2863a0b5c2f675932735e35080423119ab48d604108cd718fbaccebbc7da6c662e360d30fb1c7fe88528289c65378bcfe60c3293182e190d5b1fca51692935a8b0b142180889d0647c771d0d7540378af64dc03b90dcc9cddb5be1848bdbb9c153441449e51db635e6c92726ce7027c7f2765ba792e27f3e93bffa1b00ce7e68a7979cdcbd7d7ac6f06fb9b8db3dfdd9ab7b157efb05902579ae9a18c86fedb0c4ede95ca0d0de51fd7fcc196e1f5ba164198bc90f4c2ffbe8b137c8a037476a9765d92a3b61d2916b904b60faeed2e7e8e2bb71b368f4c48b0fe0ab64109fee20b28b428e2927fe059497fa57595d5e235f41f0cb96b9278b0b211332aa71ce20605d5d19f0459d3479c566cbfc01355acb9a4cc9b66e03af545a4159d2b905f2fd3fbd1c015d6e427811c50009f430767730537b3bab32a6774d5a6167c42764a3eb19f2eed279560a78a86db42677e3d5bffe2ed112efceffbea4fd2aa8446266951e73eaaac8b239b3b3b3613bad811c3aace7eebe10aae81f03678a2efd125a74b79afac3a38f1f575af7609253b7e4f32d72a8c29b944091fcd2d7ed71e5b0467e6671aab95c0262ac8df1d2a0792407adf83bbaf25a3ed9d0151e6ad5fe0fda61c640244188bb0a18f5a8fdf86b4ac307413a896e838b0aa19d9e6ce103b199cb07668a6d41407529a6b3a77092e76e878e5718e724acf9a973f535294069961369594c29c4e1d4d0101eb12ee1f9903719ec1f5e2cf9dd6831889d2163dd7e41b7763ddda7bbda428674ec178fd6e8badcaf75517c6b030a000000000000000000000000000000000000000000000000000000000000000000000000000000fd202edf0b58783f8cee7a5e629d3c5f8d95c4abc4c1048079ff232e920f8973d0be194f85ec9b9bb22aa517c98d5819768d238d0fc8542c5a4d9e00590701abf8c932c8550efbed3fefc187a21c305172bdd80ec10e0a10632bb74d3682a1e88d09bf7df41481b910faa35bcf250c7994c93f6722b5bb30b49359fe126897ecf29e83de7fff3362f90d4fe99ecd6507dfe68aa1147024981a1b1164ed43335c51013cd5f951ae82881acce0ce11df02b333b4cd736a6c9a2107694da4c5980a57bd1492f90e8b980d33b7ebba1a9c5a5c6a1de2f3337e794fb09eb9c8d5a487d748ab09c05d0a7c85611f24750d81cfbae419412f1a9c4deb47237b7e045eb599160194e37bba4ee271cefbf32983630a94bd597c30c3daca3ac456d7dea775ee6b18e1da47ec074350d39176a0a0cac7cf54c9f43b91fc53888a716b7c4afed6433b785e857ba22d259f8912ae7aafc542d3cce512af8ba032b3027f7d11a2f8cbab66a7326e0a68f73955aafec48b9d41a3c96e2ca86f3d327b28fb9b45c175791c510f8d56bf6b34a0fb20080c70e23949268e31c8ef7958f39dd2ab5c26536a00797d5c4bef2ffbda4557ea7baba7de08718215336676a53d6fc04236a38f079757d74c7519652630f06f16e77ec5829b44cecb1c2172a16fa99bb9f050eddb88e2070863a6bec068b52eebdf4f536d629d5c4f578f143e9dc8b167425fdbe88d88fc8108b28885808e7906b21fe9c7117ec860be897a30b34e90066d2cfca7233ad4f1bd6a985aa589d16063138ea9c8eac411b6b5d05ff8cbbd6a2756ba748bcbc3841ba29316d8960cfb8ae643c0895bb1b05e106b1579a2157e580e7ad7aed5d5b8f8ce6575fd16742d925be30849842ff9f99c5c8b8a23e64b796f5579282d5ac22a5e5aaae1b073cc74601c9c44b25bbd62f87346f4cd9c55faf5e0238a4c34285587251b64614b3aaf001ab8d89b71cffb07d881d51363fab4817f590471d953c8cfc1d5f644b57c6d7de65567b820be9f380f94df0a136b6113542100390b211bc85b1cf819b8b440b7a7fb9b97d58cc422cdc515698e0d51a3cb1098019fff18504bed84ce8577ec496e31bc02a315d771879e63dd3d9ce688bbc328224e69061d660518c3ed56d8b34e39fd11eafddc896d77607a2048088aaee6a9c3cd54c00f90a493edd38ea4a907847d2ade3fa787cd6f60c0a9abae5908cb36883e13160eb1ce9c7e704d11e729be9c730b50791b07df11237715bae9c80b9112d76398ab0bebf32bd463accf1dfd65b0114635f39356a98b3a23f75cac96a167a60fde62e8db56d420ccca7dfb3620a982fc1078df26cef8723011dcd128bd3c65e92a293933616bbc2c39321ad964b42bc1f64ad6bf46d1781269ef92e00da89b4b2d754ff56f1bcd9a54232cceeb5f17d501dfba716b7c7d35bcd79d2a3036b88d48aa040d86368451e59dfc3d5babf11b5192e3559a268ba7e907a5fe24ba9a4bc73e71ce43922625902d13acdc233a8444a81a01a00eeb4e469fc1d6aca71ba54c380356c458cef64dc24f1c010ad6658b29891ebea4c240f995fe3f08630ca72f2836d6fa7188e31eba326b2d4902e2af29d7f755aa3239138f341391da40760d67181179a0928db64676b600bde5e8e0e0f33ede508147a94d61da300cc378ea684c1d43a108f8c9867087ee9f0dcb45ca04d23007d59c0d11a5e5325d13c13f0cd894244d16b29daca1566c792a547b4aa4d4bd7b4aac8f968a45a4802bb3925972425e83c91137ee88bd7402c33ced80b0eb745fe25b5457040c141d29fd7ed774fdf10b48df8d062aa0ebdf1fcc0cc9b1abd0167cb7707900949f97c4ca7ceb85c46cd9ac32aa672bba38780f4a4c19914e05cd74a0b012d892b2e1585eb0723ac2820efc910d3a8f57e42e5d2b05abe5c2108a09221f909a56b50a43447f30252181f5008b6da06c80e6c7102ecf19caf9861577379c3e712926ba9fff02ea663bd7fd9b2b910c9657e69df6ee9fca0bf16b070f33fb8c97302f213f153c22cdd4fa3d4d7deeaec84b461612a0ab70a2f601d68117c06c97a3a7c39d218064eac1ef18034715b92e6c8eb46a0e9d55eaefdd0a46b4d1dbc2ec8865ce22a48b63c68d4e022945fe3df0c59ddcf659d5ee9fffb6f37378dfb8c0bb64950408ff781942af12715041c7fcaa9f37439a0e5fd1590a82e028211aff0c1fa5c1c9ba61044f267c53cc2d3008d633d9d861d4579f4d8a71f78b85c77135afcf5885bf832295984c3482fc077e3c9697e1792d8c6ac0cc5e5fbf000a56ae30cf199cb9afeae3e792a1ed2784262a8f1d957afc0b25b1cbe9d8320610b908b03e94dfbf0e86f4d06fc1d6f0020044e61e6a848548af6b213947d43f44873bcb30b1798d24f87f550b3527435a1e769af38adccd7288bded7ae9913ec1b59c0814be650201f9c7b5001690b4273e43926c1ba2b784df5ccd49e3ef33de472ca14194ee1339a7aa8881a6a5008b24d10eaf6dc02ee763fa81861dd7b646218540b76913adb50b7f360f8bd2333df64caecd94a909f72fcdc6b556051e2568a3e14cbe4d511f592a28045a1af68019d702f1a8bcbf82d03d5fcac0f2c8d63d8671cf0ebccb3ebdf5ef25ba5279db283547dcaf31c69cefe1f79bb6c96c7c2dba76497ee88ab70af55bc0441e160700b6a13248bac0f929f92e3825e74b765bab12f770706f87290e84709723ffc3c97db2c2620dd98d934b1b0980cab7094137d81a55b3d94441bb838c1b892344739a058ad030111e04c437d1dd0ebd15ea07bd612fe6f4f21242e4269a4a733fdcfc1502d7c314f665e8245de6c723af91a40d9304f1e48382b3b194d1c4b5cd73807fcec8d7cbee8bf8025eae92e58c3bbf16f6c8d012b9dcbf563b51711bdbe6e3e8649763aea2ab8a707e23f338b42d1fadf88b0e1cadfbd2bb37b7a120964c6f5e2a512c30ddff1ff52ac62bc9afe00879589392fb8efa1dda34ad1358505fbf2e68519b206de0291bb8e7fa14244f879677872c59ec7cd5d13027a6570a2166d6a63ca2fcad88c04b26fbb0784214bfae89f669d8703a74846376143b836a3a2e68e836aaa948981acc1271e71203a2f74cbc75b304fe06c2d5ed899de7176f2746d903ffe3973df3077ff0e9d6c704e159097b0931af4ab7a163aea71323f73b41b1c679120d92636d6b5ab02b0a36caca227de1a5903e34f14e949fb301b0b5c774f49f6e1ee9cb718953b13329246b7dbdf3085de30a432cb1fc44e58f49af54a670bad51645f5594d0aaaef0a0859fe1db4787e33baaa2c3d91fd5da109969e65d8a521aea3338c0d223791c52b017bce1bde17e5f555bd0c88e176abf4579f835355920aa9c079d91437ffe710696fc8f3ebf9652d2d5e0852ea10b438ee83bcc3cf965c055912709f2d7c8b35eb0036bf53dc3c95152f9c845e5d2dd535056d9dbbedf9c2d0a680337b4ff7248c2cf3966f06de3485cfefc908c4dcf8540066c3747e84d394a42047c15f6720b357ec8a42928ce60766b2cfa9afa5aaaa3f5ac3adfac7080b47640e25ddb19e17b2ab0aebcd22e0e6151ab247e5c91b9e5e1549c5cc8e977ffef4a0140f6a39e3cd7f60ab23e8855e8544c4ae4df2395d21bc83b61e757ab06c1db3710d85a3a14abc6989818217bd7cb62297415cc0ebc92644fb9f2a7181eb7f642678ca38ae40da03dc557c4c8f95b4df48142502b03f3a5f1b0f6eaef2cf0387e5599c9540325a3cf4d8a74613127394106daf9fe38dc8dd42cc1c624ff34c2661977e0f3c7ed7ab15c412224518147e645307b08936f00fe8a7b325a49ca2c146e22d8df0cb8738373e5e13a7a1aa2882468a8f99e8cffe60782b6000972fbff5c90b12c3bd2ff78ebea9599a9b4fcbab4083576d080465ff0ec359f9549084be3ef22a516f0be8275f5223d4bc96066b79e1da55069492d10cd2dcf4a32e916aac10b46dd93c5933315c52426e5449262be7634fd18f446f33692debc9c25153b6b4285da4df6c82bd690af04befe7f964cee4f255987640c3c10ed2340ce432c26894ea942d7979b39621ff5c271c56ebb7dda681d5e7a35df347543e644cf2ef6f3f4281fa55b5a62db7ae53daabc6f0aff0244e7223da64e9a10f1728b27a1e36a6a77ffaa4d87d7bf6a61b2675eef5915ff1ecb712a8de210f2668bab0d66d812fa42721eccd185da303cd0cc7efb099ae83c2a1c1c786981ff2438d17fcad6f27209e636f37a815d3f3dbe8e8b75a76183e93e2c3e35a55c5d4cf362768da261f4d26ab1e36577df082969494ed9b1ac622a196082f0c1fad57503c628035423634b45f23cda9c0bb817285ac7505015b551272a1a3fa03328e4f410feb9f460beacffcd2b26a4e88c44961762d084124ef1073871a0e2683fdf56f3735711b0214dda6d31228259d9efc06882946bb3b1a849173853f8dabf9302dd5b05f7a12ea94e35b4c19c453a46c49e707f8f699fdafed06691e6cc9d60279fc2154e02c6f231e16ac8559ea871a829401de62d51b595f842b87c6bfb02fcd4096e8eb2466df651fc352131d45e4c64675a49dd5c15a8bca435c1ed350d43e929453d73ceb08853bb69a0b5d8660d92f88783136596dc7e28de3229d5056e0c0cc680517ae30b69700b5b736d43dc694f1e0935b2b50ebc7420420fab689e42557d917309d43ff4bec3f1b6a4a4721e2a004f8c139436a29a10c7e0a61ffcf4dfc95b2067287565741c524e912b2e9639d75af8e64228bb8b071e5858ef480af058b251f8490408113d1cb76824c37b753a9b1caa273702254fb0b9a31fa01cadda75d21b4d4c3d9614ba3e1415abccff601ae97c8b86ba0441426c7f6d6677f1127091f242a2ad78870c46c5b51c16cce32be2158106d353180f5b5475601a3f1bb4f2b43245cf90adda4d3633ec2e32ab7d037830d4444174d7649ac3bb0155a2e442c3127b98c207629714a58da14fbc821a72c34b48874aa7b3c9f4f2ee6f7ee273cc4d88b5d33eebe46a9a86a0b920477ad368567b35a4f54e83bf6690a0ed73d096635e03e6224dc57e789c5a669f7c249e2167ea2321bc5b885b4edd66385b60e10ef242317bc13c9ec7d0090566a6285837bc5c1fd230204dcafdb8370d9520cc8af876d57f9815e59f2f6d1d678919970581f572aaa577bca77757ee579152d59ae0d331bb0be460718149d318b229928a8bf937fe6efcef19700d4398add1c0cc78031dff999f773df454cc939c6e8f1606141ef15c2f8f5c52493b6fea718cf84122c7cf713add9a157cb917a2bfcc080b41b84397ab898363cc9f7e7bb20917cece73b2e39940b1301b4731e1c632ea97e9fccad61840856a42ae4157b13ef8b9e6e837f76c6f4e603e01afd5cc46c0ed90000cbd08b43728fb946c4470a128a2fb6e8a6b36939f7e74e824f5a90c43da483737fd8672f0c7e818c96e30325d5235839e42122096362312d38d4ae9461a671e3a7c8cf894f52f6f81e95328ab1a155146e4019ec1fbeefc17337b6e3910a03ecf797f5170d6915fbd3cd1e6a9f486de2e443fa2727996b0cb6e2c7d4f357e42945c7c27f94243f6482303504f89ab1d0aa6a32fa1f091ef2d7a80661feb001bcabeecac9cbe6b9826b660d32954bf5000b243ba5060d2f92187874e5379b84ee003877f61b704d3e48ab35da47566567ef6749500edd2eec70323ced74cbd71b53ef44a4cdf401c17b7426288ce5aee6f3e440bd9340344e903e53a0d7bd51872d560eaf05abfe26ddf73c21935fe933c2fe2249e89da059d9d4fd775d738a1f46439f2dbdac564a38fc30cea85a07fabf45a11bdaf6bed1616011038d688de6a635b07bf040f7ca65d80663e0a6485d461924441b7cc2dc013f42d5a67a4eeff079db573ce2b5f8a39a1dcc9f48441bc1cfffa73ac49fd9d755b0e4bf278ddcf3905c4664e2ab6c2e863093cedb5d62c03ccf3ed2e24f6674efde60c21ad02dd839c475658ab81acaa7112e231e12a2c04b1b2e94bceca9d0f4c5205f5bd697ff27f3302717ebd3595811236c722d25254689432b41514eb609f93a6b49990b2ec7653debe6d5efe19c0218decd12824ed72e1ec02af59ebb7773868de2a86bd505061d5019edac1a221e4431c1bb236d2e9b05e20366bcb1e07646cc2db08c476ae11042bd058dc0042c0d664d9989883e5ffb036f08120d81c994959bb1c1573c514ad9884cc67b532c3964a66683ba32fbdae8675ecdf9c58715367da4f0a66963a99f7489c7e5d5327df8bb27ef7cbf0e01584674fce3fecc6c9073cbd8691ee2f3807be2b42c4d304848e23d40e372783ee3610aa8c11cd1f92871a57d9abaecca3ce1099635a40af96396574d2b8e879f78e9967e6eef8cbbc4d92118c6700e864db161addb10104349d972fe8640fe716b49a11734fef1ecd95e93ba485af0d32720d09f055814a46215af21f25cedcfb20d1bd1d309d09dc048aaf36ff619b9b5d004da503334ce1d36ba0526c177a7ba73cb53fe91fec4b17f37f1617eb9ebf5b80b4473ca22c8dc1a57b26a98dec6401fba6049c1e54cfeeffeffc02cc2f58e3e57b6e20a20171cb76dedefec062437a9993eea44a23e5aaee1209761c1b1e48db9ccc7ed1e9596278750f6065e6860733240856792dbb81cc3fe50513b88ef81506eeef8149dba24f42fbb2352353b26433f8c1d320f0b0458f8b542a3e8a68e90b8a9ba2cd64b4e5aca7b26807ea7a6c591eff177b7694716f796dfe4dde2c48e6958441421f53c17e02dacd246a076960b4ed829868cd673420f7fb3117195f8fd27861f074e73d4b9689e0275c15b73c35325fbe26a06db35173e826a32dda40e33d92b51e037873802cb977d0ffd68f9bb31d068183d46c56bec6f2020e54f92a9be304ee2de163e4c89c2b6eec2747cd2e6d36e330cc370d95d746c70a6280baa2307b4fca6c2c9f691d92722293691cc3ff227044a54fbe24bce211721ff68981c0d7c2093c02537fadeec8e0d53b52ec321baeff75fba66ac8af0e745e24411a41e5f5ff1b90162866a92bea4b3fb2be4aa4f4f2b5a637895bc1955c9e0db567a2ca9214209337d5a68eb37408c3c3151e609e5e484f94d89a9f84899aff4fa192075b7424e654dbe88352d3bc38e11d7a11d3364ca5acd1b07095cc8163044422d6922fbe2368ccd56d710db98553c5f994f37dc68df40eb24a4a9f99aee6c131af7cf8dc9a5698906995ce5067d25a4438d0c95588776a4c21a77c0fb4cd70c08b7d28ad9f967833930041e089857f066801f6fc565f7f8e8ee0b5440c0a32c191beffd584dc9a79f4d7c191deeef4b77fa67b67426c300c4607bb95f4428d332fa95855fb37ab7c3940462793a0b09715b55df7221098c10522b0f5d19ba603c202fb8e806b1e667b646f3414919a41770faf77906eb4ce8cf9142e7209fd6357258a8f07d31a1cff29ded5526c44f104a4f919462778b5b307e3b58fa396c186a6c2a5513969ef6c8a8e24756b2857a5c64343ec225e4ccd674b99c2533930c39871c46d2f1bcaafe5139f9d76aa6dcbf499db604b68a9401e8cf81e4b61018e29400472e952503fa62696edfe2c7eb3b2944710f30049baf5832cbcc36d00d6bd105d5b668063174a3240b4ab35edab5fd91bb99f27cdb29713d0c33e0203bacf0528c08cd1995efa0273e169650eafb07740b8cc81e066b20d28beb8dc03936df865cc4ebde24cd8d34241cfb446fba91a3aa4dca4ff2afc998a4eade131ddbaa7f8a4eedfcf3c87712115614971b48728b8b5ce48c525e9d9497aff74c39d39ee32f7e2855ec38c522c4332395eb3825738b566762e74ef8607163658612c4ad6da852d87129c4220021b70453a0c016f35d31f51db66a7e08ccb297bc2a17c7a069b1dc98b354617aa4d591a35a63f3d7ef7a1a97f779b733bf0a4fce087a4a1ea9678c05375aee7477c5d56a9a6a2a742eff113db21129ca411bc75d1faef1ce38ce045b9402f2f9b88200e8495798d99375c7ed37225f0bfc4710603e66ae72d8d963daff9bef65a51f1733ed1d52ae6dd1f989ce72d7618914d7bc3aa3873ec22bf35f27b2f46735fc989432a0c66b098b0b4db8d7a7d2e77e735a28c3fdbce2f477b7a5ef3b63d2e7ae24bd39e9bbd376644a0fbdfdd85dab2a590b22662d33a958ba694ebc0c7de388cf78946a83a90174b9500bed459cf9586f0d1a47610badc4302f4df6dfa2e171601ac3091868ed15a1b44219c35a5f2932121dd768eeae2d7a8970e865ced288a5aef217669c94fa2b9e36207ffc447420384c2e758cc0c05838bcf7f0f5971a063411a79516293eb6bdb653b3b2faca8e283852461f497b404e499f75ae4ac0a5841e966772e304dab947d1c183bac49c3a0fccf930c7d1183fae9264f2cd927f12d5e62f420df444f09ecd8b371b70bd14764b8e9cb52423c3bf504f3d7af4018ddd9a47929be2f3f9c94bfa177e2aee3a6ed065389c05cec266602cabde52e09bf93bc4609390393e54be68e164098d04349f3ada5f0566bcfa8efa297f2d72ed720d0c35f13c368e466e3a711678ba109f35e4dd4cb67610e489da3f2d0fcfa3ee8f0d8063ed80faf544d72cf5819c0ed0ff8c8fa2d14aa7bcd7498d20251d4931b8609011a573ca31d227c4fddf583c792119a69c94924dd4389fe2fc5e0f10f38ccc8361acea5748833f89cf47fe0a1832a9a9fb007b3213aa66c52770505f0cd86dd101d1a02ba409005d8e57b30a9740684e29b8793190b02d9849174a2cefc1af68ec0462b1ec2912442b1dcb2608217d5ef86b5ede48872cf94d65ab15086484ca185df5002e4348e6365a800f3604d6f8449b433f3110cb59c303db13a992345d201a95dbaad9abe115f0751de2d110d20bf5ba2addc60ae494a7b586f5b4ea69857d1979f35823661a545004cfe956ec42146c378e35ced7ec2e291964de864694c72cfd3d5d1c1dfcb9253de115e3585b2a1b6c021ba85c0b9c88977648470a9e1e4ac5706e2361eabf2c04819f1abacead2c8d1ae7d4455362172d072978198b4c97b79de7a0f6a162621677cc5e52de8835ab2ff1b020d38ee62d490bf317cd53870baf5d7a9e2748f7005aa5093e5b58d10019b412849ec16ca010d4ba96ca8fac70fe89b6b6f8b0c51530fa853a1e8d7f466c713677c70482c68e4d182ec075216aa5efaf4c797c3633c5425ca0d9f67bb8282df370e83a7411fecba02c1f3f0feade0f1a44584ae51ea771cd130657fae6c2415106b657c56a15934fbd633f7a91185cdb1b266f210b218acf5f2fe8b0e4d943320bac81a6423189af77c2098645791fd253a773b0346d90a0f01c6a04e926eeca61e0622f9b19ce2927771ec5ecec75f798a4140d359551cf4cecf7f8fd2586aef7f6672a28c8d369e2f563b2c88fe9578056db3626166476a53d29f205806f94061ca2ff5ed112cd0d1651cd040da4eae17ab7d00e2174172d52de47349c2edb567ab7e1726f1aa62c606d3a2bcbc3bee4cfe56f0da622c766bfd3da384bf0c79760a664fb63c383762fe9bafc0b1c2bebe83b2f0e71901ce482b1fd6e1c0c5644d34e8263041067090e4c05958c5ead763f851b33692561502b354a9f2ee109af57b3108733da002f3e969827a84b1db829f4a71522ac01d5b6ffc64dce5c322956f7a71601c6d0bb0740bf5988673840896e41297df429ea91ea50199e42923faab681f6b38278a3ff16910b0aab33df9f7931211bc388245fecaeae21c8dd7242a698682c7f7e624d466a2f67175c33918a5817a06270bcd32e61b3b7d674770f080970d40d5740d5bf3562a612117f83f5042ff35c406a819ec2ce15796a93321d86a9ff0e2c3a2113f1b8d9e4dadd1447f424aebb4fcebbe4fffcc0a574286d5c3bf67603f4b15888690ea8d2c7c31d6c993e092ffab496aa8e5e57aaf15dc773a0e0a8e3f81375586431396e94956b5f2e3cf84b91c403df5b6a83b032cb723624c6cc966c8f85e38591dbe9fcc84f900e0d386809376454eeb378340372b20ce5f2918b426e253dbade656cc295b12d9331adc9bcf4a391309e3d408eba70d1c640b82c88ea7b1491e290fbf47010353d1f3a7db7b86b3676f609ce79423fc86fced1f6a957b23244228cf01a6232df5b2b253bf4ce79babb8d6c704247aef14e5b319c4dc5817813a3a5b5ecd024407620dfafeb5bd013f14c8b4b86407ac8333714c8e7e0e1ad9f3f2625552df62db339e150f82331f4d430a1a4d3873f96ca50f427cc75d910fab98d47898929f1d31ff879ee8f2ce8553678677c732393d7fbf0145cdb37e2d840cfe967ad83e6cf36c9f9d53329878ebc6ce1a7092f276038603cc1cef2f1102a3d822f5498f2252deddb3fd4bbdb60f4b5724143e06abcce795527e7dd8718910c67deaa9993cf210f19feabd7aba28cd81a46c759f649bd91e3f5618a887ea827dbca2e0ab8703995b7a21de85c6707beb32dc83d2412339ef70ac89018c0a0f9f598cfd5ac7c05bcc6af9e74631e27a2c078513e2634bf0ccde596060d040b28fe878c4616063b4f9783cfd68dfee3576fd81f3cc1c9e816447f0f5b2fe8fea193cb853bb7b906377b7e5532b2207a8017f138081b0e26aa182c5e16e5362f500bf4cf9c1b2626639fb6fdedf9dc951bf4e6491c05a5a9fa5ae05b1a5eb070d4f2b498c557db34b65bff72a35b85aa04af3ab93b9b7a6b0461bc811e75df457139a4f3e6e42136745efa07a9e1b127d912d1a167128517c3f4b11c1be864b7bc9364c7bd18ad317194773a89960efa65081c9096f1db1dd12b9351652f8274cb338aca5667fd1718b93ecb0d0bb501c35379facb51c34a1d2d62c36c6d4b2a7573c952d5d96f1e872b4c658908a5aeda1589c89a2acc420cdcaa5a5ba8d74f2c016f00762cbb31e21c2163673c69b6530bdd37b216b9cd950c774a7de12f87b51db5afd9952d211340eb1b9c669d79e0e3c29ca3deb703f34e4b444cc1e8c48386bfd36e263c1082a26f6d73576a6e2068d3e413c6bc99a851a50aebb394664293c26b53523933e87b8ad00e8f9fd702f38850d4d0d6622e29a2c8910f0aaef4517694b2c80f0123e563435261a946b13f1647501fc03f9850a4c691a94c663f4cf63145445711b1029ccb48917eeb89e736aca573b4d255618517e070085dcda2a8d3516aed095f094286de6251de4b3f76df8af373a73826808da247b36d492fe025aefb5a18c50fbd0c313a229e13f34dd55fd8d0c6210dd0e5c0686c03e185d5178e991c304045d5f10fdab522f709f3dbf42b0fb4c85f65c619d0d0f7d519f3c4b810240c61360795a11b069f6836d426a6451afac6c03c9d587ad3c0b59dd4017a3c9b049ce00e0a0a57da97f08b0083bbd22c6c9f093f02090a1a7789e17fb53af592061ce5b8cf4caad00f5ad77036796d6fb364c4e45112079b8429000debf949322dd983ea17d2701fdf760a60660add4432c1841fa1ad03c4ea395e86029323571f8ff7c04c83c7751bdb1e974c0fab3b8786aed2fc87367078fbd05fcb43f24c34ca6d2d06e439e90442a50ffa0926e1edf04bb65c64d098f90c6afbfb80769400cc02d55b224b9c9d9889565aef7febaeb7dfce858d371bbd4603f960245b3822c4bb3eded7a3487b498d771152e4bf51fe93f04bda318f1d5eda27334edbe936c1b9303c2824e07eb38c4dcd5c168d94ba6c70f23a335d4df235364a180e880be074ce116aa8ee643ba2cffbe0e0d4e715eb3848a116ad2ea717518259fc7e2a913f3e64e6634e47ce23b96f3168a931ecb08b36ca3ffa5d826bc0379ce8423c9de98339a325d94e0f1ac2dbe612be5a23359c404c2e430915e0e3c7a13a212d4f1f18e51e4725ee6c97ee7cebb7317e7da4b13287536c72e5c3aadea69e0d1b61da81a38585ba888ca021d1cb55c6b82231eca2c6be1ad903999902e41ce820274b8d5407f195c74176ae6f1810f571d47172340f79dd62b4434d8f2d49681e249d02f09ca5cacf56c881441ab51c22856323d4f26b8f16dcbf57e4a0a64a00cdaa12079a8bcb524516a731fb4a4bf35f48c8978bf1fb2a72305fd608238205a5b660c12377e36ccc3d1e6a753386479c62e088317ac463585c19144e00cd2c92cf793523bc45e51dce196762cd18bf1ff4ac989de65886e8ef65d7b162d100507ee285f5def4d7285e8ee2906715c178da970d6b386a894f90435506d9361a7885c614928bcf5f36aa6a903cd54006ce529863f4a3ef58059888fb1d3fe1040e207b72bf98893cf5324ad9800ee86e1a92908a4d2cc1d47ba64c0f03406314d1fc47bd278be4341e9bc5cab2f49476201874222e1b7109eb6f0249ed19ac3e280de516981fba474e07a0a5b9a3a4b90f2cddcbc2e6dcf0a6ca564e6cb41c2d1c73abb35740ae2bf016cb6ecf4f42ccfa980a986618abc1cf88a71778aaae22abc6b2a5df2d6666e89dbf8e5511421a84f48c307cd00b49088ffd820bc306268325b6f07471a03bb7a691b1bd3c0c5d60fa7de5be782f97f5b774855ea2361665ea47fcdf8e49747475b1963ad3491d8c376ebea2254f0bcf18c6a5d5cca42a639919944f4ec364d04050c8b509d30b613de352ad1b4f70eba43a74c0cb5c2b1516bbe857afad47eeb643c37ed338f9c124044c85d778c8232d036587e8bf0b5bb24550faf4fd465298669a046ab702fd69afd929685fd3804fece8cb5fd911bf446145b78e060751f390bcf0793909060289219c866603760d1cabff652d021ee96b9567a4eff516b6faa106547a2536195897f72d1d0852a6bd614463c632c569c19cf81d5bcb554ba3ceb9a2bdab7cf6e2b7746ae9acee735816518dcb0dbc4d3a301d22d58421a27a7ec4ba94c9c7f698a233a94b2140364943b8e0d012587758dd3b1f1a6881c53fe50bdc24650c560f2436a51efa98248e784a9f081440d401397a64569908546334dee850a661402ce40dfd31ea5ea3e120af914e05c564bf9b6c0ed33924843a036532934e7ff2ace7b04e2ce4d09a58a768f35901bdd406822c5faa4268312c917152325bce93f6ae88291234efd25d6ad33adf269c673ef77fbb2f0cf72216732d2537300da305995bcc53e1cc1639021ff85e35b605807da0e231b579cccdb53b1c9f7ba2335c4037065ee15d5ba6cbf05f713f0035e42a342ec211b6ff8c3da4ff8c7eb2cad9a6dd25474f7a1d36aa3bfafa37f45984e79f86c3261e80ef9a7c3cf3bb72d0f95836e072ad68df46ce28a7290cd8cfac357c56052dd143a9ba2922bde08cdf653a44a13628efa9ffef4e09443ce13be19f415984da7ea9cddf6cee53d5464b535e3fdbbbf310c25b648583c63368c0632adafd241301c43bddff1fc55c7304baa2f825ca16fa4e3484fe59ce13165d35cdbf6e21a1bdba6800d6d85fceedbbbc82b068361cb32b8fd1c2bce910c29621781aa9ba283166d3930dddd2ef27879693241fd4da6cda559db7e5e419a4f4ab8ce16003f5862b513e56282631b162456ccd48793c6cbcb37612a1f427ae9ab657f0a2646af8fddb4acf68f1c86b259411199d6e941bcda36e72b23512606a03900aed11a266a54047dc88eeea8b5a3878bb69b3407d2c0c43d9b26427cd3bf8c46bd26d3389b7dbcbfdb8e1e2edcd13e8fef2fec10907e5be6b3fd4207effb1fc0aef71040fe3b0629de132b6f9bc65f26d6a347ad69c091ecb40af2df8e16de34c4ccd98c445d6c6a055a70686ba85c54b4f0e346e4c15f7c90560056a5ba1cab90b0965cbd5a4b2ddebce70ce8262ebc0d297a8d3d60e38ecc86703ec2f25b81b297366adef2d05560f69d088c98fb10bc8105393c862647fe0e610dde154929b209735c49d4b7b58a94cb0760f1e4e66b6de75249fe57c556e9024bb19fe2f69d722e0970ede73d1517dd32e3b9ff4f11d16ed28cee98ec305012c6c6f6c31da9bc723ff29512a76747f0f3fed1b5b3828f4f18264b2148d6eea17efea77ee82d4e3ee7ee0cb822f36d9ccfb548bcfeb2020de1b13e62b6fec051827748060e13faa6bfa85d5a9f4ad0fe3012dfe69db58b1e60ad309c0d9a69e16c375b0c1b96fdf0666b787f305c8f2639ca58ef14e559b4feaa90941ae0bf83a73fdbc0344b1c1e33df3f7cc7b89402c4f7eb01d7fb8ff33983725ea17d0022cfb97d6603a100b76fe01db31dd44bfadba1b6082516819257c7adda28e5ff62513fe1c2aadb7a76eb92032d7c4ff434f291ba8b68c4aa5d6750cfed84e1d7c0e7a1bb4d69eaabff32c2ce7c3bdc1afbdee0be85b9ad0a2fc4b3951de00ac480a489a1c8822ce0bc965816e305a760bb7891e8c2a2fd5f4e8e4c18ef5890a9008b8bbf3d3085f439538981a0488fbfe57127f96be426d9977bf7209920a128c102d8401116f12543d5a23dca8a9b17031d7cb4e9e92a712820f0ab8d4a59ffa2f090abd37976ecffdc2d43162a6860d619bf8ec1e474ec866cb23225fef73f00f969f01887c87291f683ffee19c133414ef876357f33867734b9e46d7d7113d05eba414a828a15c2ea091307ed7695ccf1ab806b063569fa1cdd5cd79a8d0a31857d87a0b8283132917ff8f4aa40a3f1137502693e2d217100ac1bbe357b75a3e0590c8b678be4a41a65fd25fca323dd5b4ebd91efbd0e4d6ed096f6314cee009414221968593dc901dc3eecb57050776959329749f7c28db90dd8d227e4332018a1acdf50f2ed10d67564c43b6379199610a715da9f1e93d47f8b8b0cc5a421933c648695d22532d90516c23c178dee7f933c106dd0bd6296542ac38c9f3c53e49e3e545d1ba86eae4bba6b0e1f9446c37bbf388a2dc0d23a224fbf344d0c80e152c66e27cb5bb50090072594851bc5300155af7587845b0894a06b580e27f08d4a54733198e0d50026e500d0381162a71a4b36d8fe7c68834332468066785272f60bcef7e46328a8c5e73b7baf505f1a834ea337ca5fd46fbba21c694416b22ce9cd7dc2b3bf1a4cbb462107762ad604e3538681042ad8e24efabcfae9a993047b190338a6cf602635bf38ba6a78d409a984292a561453883cb4dab1477d124355335cb2962687378e2c040cbeac407080253411dcbea5aab18b7498cbb743404ce0a72d4c1a325b3e6f4826339e2822a9f622af888eab4b5f4f6bfb7b0b62b870d429535e6aa29e10a70d5faf31ce05f2041a82758faf089703b2ee5574500e61999cd7ef35dc8e0f31d1e1c419d73ee69ca0720c94b913be281aa00fa9227b3837e85d4e0c0e63805963486b32b5886b95ed5ce61524b57669ae3ea33820f2040bfba6e6325b979d59ff41ea86cd94eaa6ef8fd4696d32d0f394e89a8df1f802777528d1bec46f2b3ada646f778f15c1c1e5f2e10325739e088a65467241d26f837b3ded6d39501a2e01d3b3eb8b42624adef98729689deff594129619f36daee38ea9d1272c390d7f260cea2f1003533cf47d7aeb7701ad7f380c1178c34f57aede4175dc9f487c4ffb2cd8bcd3972756c278db3d729ea8d989c50001425ba26118c42d0b69a6ed430fd0f38dbacd6372f4dc0e90afcf9419e275dc0d32981e0375c05962c07cdea24dab0d664d90af663dfca5b6eea2714c62e521139839261e9445a2af434827bec98fde345846058dd37ec52437f1d6516a7923528a38ecef3561bdf62155711fb49438f93b982f9f3dc1f1afe72abfff9283fd6d0a73e0b013e15f418f4e234e2fa75493902324a5b95777ecfd01ec098ebab17449af7cb5b1a9de8f1c90f3978f26a0da44919d5aede823a46e2a45c7b6a3ae3a3ac4feba2fae8d9336039efc2762989e1443c6857fbcba027f57ef80fe7b987b2ac13e85cb159e4270ddb9ffb8cba9a42db8304b9a65ec3d30afae7a5b5e589a51837270bb495f0936a4df9ae9df44cdd5caa623798e9afa4f5fa8bfd06c26bfa9daac7f4b26dcab8eb4150c8d89a4d1c98c1433606e31507fa63b24442e1e70e1ae185445031a6749f39556212b0eb22a6858f026b5fd726638e1d9cc1d2d463b20df0b8a2991a14625719426600fe6c3af131b66ea61352e0a8a6025ad187469140d7a626cf0d42cf1de1140b84182eea83b737a990826d92db9301c320fc760f2236a2223586c7e137fe2a90959eddce0dfb2974a3da4cbdb0ffd6c5aa5f17017a117b72b1a4203e31a8409c13c45172c4f76e2818849e9cfad656a6774f6626b8f9299e628b48b3ba4d1fe26c2090b54c3d2fe15736a605d226dd014fcd6794b13039a1ba862793e2d01453d31f259e016960bec4d9002d0f26c5dae6a6bd895507e1e88342a00aa1291a8d973c573542bd6f15806e81f9343dd4f03a5bec06b985ea47a85f9f7f7326fb4008c3132f46a1862ee513875bd540de046cddf0abbaab91ac13e88d99da25a00f6e5becd41969354703c448cf0fbed954c94533ac3fb2c2ebd4a8bf2662ccc42a02ec75ae06bc55dff7af9f4156ec63806bb5283c9f35fcb96bbe7c191689bf4233ba45d9629de9163615ae0f74c964a3e24722131c3bacf8ab3d3e006de82ab367746d4cd63f54a09299b1985c0082a9f71446060682fbd81545de6aa7f3579db3e1b128b9b7d21c04d9584aa69fa2b36ee68f05f4903f46357b7547a8a06492cae5ee7471e6b4febe462ab647b5e671bc883e2cf53d07aea5aeab6556c6f8cf63e0dfb223def3084dd5faae907f67b26bb0d11f0c3ef86146a1eeba61bbb264e998fabfeaf30eda022cddb44bef06e688604f2934d2c6f7d7cd6845c974ff00f4acbfd21a982f8530d08c64320d08b98be33ea217ed6fd597dd8ee98410b8f569e99ef2a6068cc341e14337cff6eb89f7d19c2b00d51dbf63383ee6e13c2d43909a2995cf7fbf5c93d84efcc51e04f9b2fe3920217d597702cbef3a3c2d24931d01f717b5d86fb4a2d339bd8eecfb1e09788d17aa6315fa39bf2180381d067aa8b70a8bdac6dee60e0cc7f530a9edd5ca8da1b162e4a46314603efc05a7d52d418b4ddc891544e39400faf9896fe36b1de0912ff2f7b9f3ca3ea8d4c61eba97d8f90e0b8ebaaa6450939d8ae7a1b561491c2fabf5dceab0a626b681cd06edf951c8945720f55947d2294b397d3db75b587d0730 \ No newline at end of file diff --git a/zebra-test/src/vectors/orchard-shielded-data-2.txt b/zebra-test/src/vectors/orchard-shielded-data-2.txt index 5f2e0660..d55ffbd9 100644 --- a/zebra-test/src/vectors/orchard-shielded-data-2.txt +++ b/zebra-test/src/vectors/orchard-shielded-data-2.txt @@ -1 +1 @@ -02520cdd57d89fc02076a954dbf96a53fa2c4a618f73abaa5f6d695a38f144bc9179998805be8d67ff6f9c5206a4e5b2f2e2d56fc52ffa9498c7ce2b2db9102439067fe4e18b02b926c04176c552baabe48f477d36a8f17fc168bafdc931dd7caf9c9d8986aabd3cc5fe448d7f2a258e152d9cfacdb6c83a77eca80088321d773e5bc765f2b9c95c0ee8d9a38aacb2e9173920cd708c9610963c7e6d8e263bab3884b8bda4ee117291018f31680bd6e4531876e5bd970baa6fbef092f042a59cc0a65fef1c5e35c50a4f6db86427d2038b091e72c3243e438ea1829fb7a9e4aaf654cbfe4f0709fa673def37b6dce171e954713d39b9f6e1a36752ca19fdc28f6184e037164194b6568cc7f0879e32885b9196e0f204795ac110ac3e60d57b3206857e375e943f25a7e761497ad957a67259d7d4ca242fd1bf5fd82f98d2d73e4e886f6ca27bebf7300aa6ed3d7d29b7143928c92ff27b59d1adff1374fde239b0e7c6c38701838ab7dcc3cf0ccfc2eac7da8666bb08fe401576f6e2f9a0d33eecdd0d9fd9bf5bc156b1f8070632a1a1e5fc16089475b268b123e3e04da619dec28e3174a3a5123d06eedbdd6d6938464aed620753c8ee192afba0b82d4f35bdd9a2db0e38f5015cb6ad81f74159424df896293408e5444ea78946e966fa1296d93dcbca05db5916f514253dfa576a64c961af8ced6f339181eddbf77a4273370a3fc19f131f348fc99e5d8796068cb5cb50c0b88dc26a87cd398855711afc4556f7b272268e8e08c93a9cdbe24cb706869582f7919a354ec737f300ed3b1bfeb6960a1815847117850432942b4b8b5092c38729c97aa69651fe9fcc4d17944e69e5e040f45bb83dafcf6e5a07a1eb1dda46f22ee4a9cb6cbb0df863335bdbae5d5404bd552c6350ddc03d78e02377a052a5d97c276c3a37ac96217056097bf0bc9655815ba7ff94d8bda1744231587354a8460c6cab4d75d3e79db2f44e7c140a86e03c1e7c7ebd10bb435de7422d1be078d882a4c07485adaa291a044afab61b96df14a72659467cdfce89ec2ba0c39b50a1b5f459bf5e9e68ec22e6372eb066134f8ded15c82538ee02b3e8829b60b9550b3209bab13346a081c51453640635f9fb7b3a41a83483b24ab09add2f3a94a13bb8da5c1041196b99fa59130c9c4418e4f5201899ba870602578807368cc2a88079900aea9c018b2abceac6eafdca68a42adac6c180285158f9782050f23f856f112c37d8739f89e952e414c8bdb4732f0f045a4b6ded87796ae3109e3733aa68e530926b9146f41bfda7a98ad64d7dc2c7ff2911b3c3c5a3c8619808a8412a0c631f1be162025dc2ef9ae2ee3f0a7f91f4eebeeda1ef603ee1d0d6288a386b745d87ed201535c036c8d04a9a591d6c1a9a714bd1d2ad8faf93955993b51ea09e6447b10f2501174f3e69d76d9c81287110367865d451ec26c6b63bec98f653f7dc06adca36902af8e7c935b88cac0402a52560c3fbaf6d1fbc89f196611ef54bb3d7a5154e6f37cf2a7f20665aba2339f89b243f79d7dc53c9aaf6e975f6c5eda9aa66c61bf7b2f571153403675b3280920978fd2f224533f5a4657a1a09e7bbbdcdfbcbf9095a28dc8ee6bdd96c0017995fcf68e565673761368f5b4a9a3a05e665f2f22bc9524312873f50d74b56d7cc60fa1495c2fe1326514564f63a6bba2a9cae95be5ac3358c386601bb0aa85f97ac97ade1b1165958085c2265d69ef8f140f130d0d8a31dcdc44cf5ee84be11236e5eb764ba5edd773567916d9263d06f97540332c579556b1bfe0f65464bb32f419e15f014dbd8e33fa70ab6c56c5c31e7d2ca3673a50e64cb4593dccb77823c34ebed29aecf581a6f6da9ccbec31d9bf51b19967c069e18dce98b3f2e1fe3be54dfc4472e74100624ed91b08e3da084b4ddd1a1d0178c99f197fba50ae21d2994a2eabcc4794b2e3f54d192e2d8b51f3c07717e69a127fe9e8f9a94b9e08c227ee9855959d535b28fe3a71090e81c52c7e23d57ad998e688073510798b5ab509999faefafa447ebedba0b36dcc88c5eb21bb63d836ce256a7dc4c3023cbb283f891b026404aad00d1cbb67027ae909a912ccffcbd15713b0253d9142f768fc30424bed82c0892486729775b3c814c9271bb14df2df851885bede538f60121405cca860a184ae2e91238761eccf07de2a1af10f4e5d829e5d0d53415bf104ff1a03bed200787efe23daa88334c3abf513b7bc4f35e0f48504f699fbdbabab0f0609b8ebe1c805aa634ade5381ae1220e9e200c4645be0feb6d647196118132485052b8caa1030a000000000000000000000000000000000000000000000000000000000000000000000000000000fd601c94102bd27ae821c48c8724461ca4be7598490673b047f4bc8b4fc2f4cc56e0a2c589e869c959547e35dd781744d93b35950d218b1df5321e5d7fa458d20a9106896e16dccfad9cd3c42c38fd0293ebc719c33e5f59d1be05c8f18f1285376fb6ca200c3d33192509c666546973e3acf46fe6bc006b0e961788dbdc02fdd7fc94499d662bfd0a479b8510f2ceca688932c64c11f20aa48899b3de221ce90afdb21e1385aa91395e04ba7c20ebd671de460c114868a27515b570d9e8fd8f248ab58bb4f5a33463fa78caf8dca1bd0080763711ba35b20e14f2ef08a52fb666a09a79747b43becd7474e7af8caa124bfcea9c0514c202a10be86cbf984fccdd123ce40e941e3f9dab5bc430ab2cb275b91373b36c3cfee84974d381c96595e4b83be3963029833aba87fcd40f67deb293fe6ef8ea3138ddaac141236ecbfaec999a5fc75e31bf013776a60cabc834854c99d1051f4d5ef58ea4904a301f89de32298e27f4466109b25238c1cffb44af80e00e3744782bada8a0de61eb9b43aef03cf85e8b4e6dd37110cde6df32f9ad778dafd5b37f6f66c145fd8200738296efa7a3587d913e1e17121e7a739969b0301d0f78950246270988975e6c9815243ba04321952c54ebedb37d208d49f954c810dd639298af279eee10c5fca2fc71abba6beef961bcbec23ecd41f7327241a9684541aab05d21cc11fb1d46f46676981f23c7362bf5439d47c9478af18db71e6c53721543764149516a169388b80befb1a4d42eb1c2c5a0d443a8600778906512f4ec54625c66f0e1cbb4dbb6fb8490ad8d86285673c547a442c362f2d16b0ce16dd6f5f604e106ead0481093f3bb9431295782026dabe388f43200f34308f674ff639c7e191ae95391707e7b720a450e0032b2087ca6d6e8a7f09267e73f5e6ba5d2d87a481070c2c090557c129a18b58e2df3a1d624c9f39ac12ba806c16bc6774c1a29c9826b6f23b63b33697a529aa5860b9095992c1bb113ec158548b287e984addca6171ab7844268dfea01c891880b6ae28bea7355f7ef4a169b7ec9d04a185c1c2809f6b8d1dacb30e40e6211c1569f52d50fff40e4130bdda2dfe91616347b41d9fd7b04f5fcd23c64a1500ae15f16ee0449706e7deccfeea1648b5f38c7947ed88494274f01bc39e59b3c90fd2728da213261042797094b5512fe7248df09c2fb74a5a617444206c3dcddbbc36ce8f01b32aebf2399f2a0fbc6901e1f09c629319d71ce8b1a6d7bd03f05aa49248578d5a19f17d94f48247c72a01ea9bfccc76da77521a30dbc9ae08da30407a79002dc3613bf930b2ef0be728a95d91fa031ccebad321cf7080315e076234d346761cd80d2bd433d87b658fdf882b2093ea822f58030ebf92b3b970311046d05601b65d24fce2db0fafdba247e871c6b9e37e2fd9c1410e65535c36063b50420c43fa5adcdd86f5d5b25e5a5deb9d5189d3d5146a7723f7db00521c76b901a4cbca9e56786a06a4d3297eb82c71391eb96525703995f09e400ce7bbd731630f15f382dbdad5c39b69df690ded325a53c44c6a37c48b79cee071f91bc7a2e60b98336f6ee86f556d7b89275822d2c36038d63e1582bf0881d0ca524c16309a7a54be87186157db43430ec64efdf98c939e5b0795c3c1c63b9197dc706cfac9b6fc627e2ce945e991ffc6a3996ed5a2eb602637b6ce34f7ae906a1a7924abe8bcd80c8b8ba9f60ac9c87a876aadb8eb0b3f997c0e40ffc8a2c19967f082d86680d28ffae9947e95e1e403315b2e60c2d900a15dbb5ac2a1826b0721b9f9e147eeaf12d23072523f1887f6fda58a04c55839b76e099478d880551e354d5bf3092f50a082275474d1ae0f08505299dc2b923835a0693a8991258d0fb4446e419e4e70be0d9084dd03c83dfcdd416130250f7149c383b3ee7100d60a18b52153478772f0223ef21d6f377bba0701ed4b21d622584f493457e157b5cc7a75ab933a35b8130e3b1e2f6a9dc6f61ca9e67c0b52fad01e08305922c7f36714606acaf751fbc2b5b8f37026e10eb7df119142cbe812f9b13832b35f4e233eb4372c4a28075290b01a423bf64bd41d1a21ef3c931d34c1940fb93711c9b5e9cca71b58398681085e771d8ba4d50737c8d1c8f697331bd48c29dbd61ea2f31b1560e0513e1cd6c588681afb5b60713740c712a77cee4c291d9046735f8d5e2ef8ab5b23fd53d5fb4e5d7145ede77ed786c924345906cb15ee0f84dd89a992d5f41051105f9eb03321006b47a4b6cde912046c29b7324125b3865334927eee864eaf5edaf754c88637d07679581c5e3482b6a2d669d1d6bc9688bcc6c260d6cc71dfe1a8545032433af1e2ff5fc607c10cb589a4e3fefda6374a082070016acaa081dd3b8039226c71f7518a638e5ddc88320bcc463c21a15d76367969bef0773883eed213876ec69d0cc85a65b8d0708976cbcd2c7cf527ef555b616a91fc2eb86398427f109a66c857a8eead0bbb3acf462d81f4c74bc3246c0f9e636253f12ffcbae36ec00361ebf95747f46a5a15c0acff251ecddb1dca9bcdc48e825be643202b92dbd40866033ce350ce3c1d03e44e72bb964a89dbf2a8e411fb72d462930bf1c0ec057e99088e9c3c650eca46538e8b9f6a15e403a325998cc90a705f8acaa742200cf6082617b8a5e474b0853efcad1e87c6bccb0fde80b6c8f1871765d930608c26ee13bf18058ea43d8eab58abde77cbe8fd7581e934fd0bb22ab6d81b7a135afda3c78bd4afbb6cf98472585710cbb4560401d3bbb6e7cf9bfb4e79a35121f02a5433e5eb1225a67f4ead84a22f1c9e1de3c3635a26cfca3886c829ed20c3ae36bc858f9e91b382d289fe7ae3da8fa71a77d8ad73f1ea5e49df7e1e51748050064d19d16791ce96e65ada3353f8acf78dd7125096eee11fbf42d619c457f02f3a3c28b725d7bcef8c3dfb353445c3bc2991f619beccab2e11718186f3e1a0e9c922be0ab5627f44e077c2fab8de26f2fd919f6704c89268b4f5c3b8ddef0024738099823edd1abe5e2aa20240d9be73dc85948d7d54869488bcdb1bbad073c5a3c94f859dca674a99abb08dda84ddf94e54e90bd9fdcc56d18b782b1ab3a0b6fcb4494a9499d95489c73a476eef8e000333f4e1883298f4a11b49f008d5e2666f47339f626d0768e114cfc3dab5af009dee8c166ca33da0ff6fa3ae938ed0e09c63292db410b550f4376541f87f38061453e4d831770e34768030a84e4801218bc037a1a9fb1ded2b96e960324d3f586b8d90d75b7d0bbcf3436920275bd02fb10ca28ab8f9ac42a57f8928a5eaa90716b2dc75188e26f770449553693540741ef3594ab803477083409c518cd4ffd8c5631801effc61b035e5d83d3941535eaa5bc419cf692448ccebe4b3b2f701af49d0a010298ca7b3e2388dd75f0670d15ad649a4519365a4ea7a1a9df4af41f2abf0c7742d17101f5af5c23e312fa3ed2863a87870b245fdf21bce3b2d707707857db41a9b10830c0c2bf2348438420e613fa2d9feddabc9814a5ddbdba01df46f946c71d0e522263c872930ec7a1340b59c8132b3fb8b6bcb4efc00e7b96d2340e4b2df5d8a3a11ef12a6247a3872a05bb7184e9668797c605af2a85ebb8b103bb3f62a9e03382379ace880ad38d1a07b0d0fcd0226c327241c72536b8060870ca5329446e706e0f7b96ba1c366825f793c39b60597b81a56abb708bc2c60227342ad7fe45aebb8bc9fc93e527363917366df5a30566286afd722bdfe3439f079ef83e84c52862375b95c4ee966b37d7ff1f5dcb60b0ca851386d0e10acc8722e26711ac266d9f6de5bdfc540a0b21cbe76397f1e9e957365992c6196ca5f6e5cdb2e63790714b4f6feee7e84f4b0901d4e5c81f3b9c4b87f811351cddae43ab10a002caa6e7e4b0cd088cda78563c8bc0bafecaf12b4b320be1dddbf10081411b2542ec1f2cd453dec3690e2e2e017b8ff4f471f17ae24646cae4bd55bb03165d7ba50f46b496d3681d7fe829f2120d5554c13a63f3ab944af91adcef1bdb36dbebc931bc5ff673c5008e5264ce2e57472a07052bd9ebb282a68b1402e06ca605ea74abd1210701193dbdb3461f18e424b79597bdd3c070072c438cc1a15afde6a12b69defd8739c89a113122b03f81ca070959ec23472bdd575d4d78c19a460dbfc238906eb5b1d66f64a8a01f204fa9fb4e808233153878341cafbdc5332268e094f13ca677dbe5adc5fd6753106866e3332abff7401f76b848c5e96114b9d7acb57206192edb2b995d7f1bad2a5f682553e23218654db3bb1360989593d820507c969c7524a2dceb3859fdcc1709f9e45e612b2c7431587c7a2dcb9d9a0d6cf7ceb58230247d3e765d001e461b076c46c7349ab799d0826ec3de43e29471f063af1295473bcdf9c2161f05440e4b96d8d323d5d49032b5ee541dc92679d0b108b8bad6b0577877ff8047f36b3ec846a9c62bb0589b3eca7054f2fd45b7e77c903efa986a3bd8e2d534db28cc06f3e607b5efec7bf9f801eeee60ee0f3d7209fdec34cdd92f6d132b323d713523409f0238d8eafbdd1684c054d081a6fce2e71836090ffaae2c137fc140f2dc178fd14a774b7cab1701efc9eaf3950578075240af5ae45cedc499d54fba608f3f843d0c8e9595cfabd78cd006594597f24748611a352326cbb50e09c5617ef615777a5332e3abca10594733417b848d5c03d2a812283d813bda13fed7bf302815afca628e54bc314a304cb45d25f67e7d8d489632cc95bf28d0ec35a53379991180c63966354c26cad350c3cc90eacb58d4f713cdaf29cd293e842b731d390a2d2ef4ecafdfd3172dd097666d34c36d8f852c05b2a7def986b6ec3534e2f7c415fb0d3c20c7229bbf93bb787e8a3325ce51e48d1ece51b10c207f5a89b75d0703a4595427139973d3bad2fa73eb227cefdeeb898391cd4efef45a50ea4b7a1121efb9592e7c0940e35e0f6eaf5c9685f32387475f7f6e75dca843497a4d19fc127d3f3675a08a69af324cefc5952a8d24c0f72daae81eac5bc979a183e94ec000354c8dd4e9c0b310b648f302601fb5359d567144c1fc34bbb1caca8ab283272929e5a2319c8c7ffdb7304e1c2bb677f9186907672f1a4064a363ce68d81ea72faa29594127c5236c964e126e06d622363e1a95fa4f347ff7dbf95b0547dc3e3fe0c1a8bcbaa41dd8be9706edecf7c4c1f5b83e3e6b7220c3a5ec9990aa6c4b1487528f4b03a8f8caafdc8876f646ff2b5a3b2c7c5f6cf99598167744f8c3be0f4665d39ed1616b6b8bf29a9a93e64bb53640ad8148ae2a274e64d995a9262635b7f500ae2ce92d71db16dd0f55d71272d40540433c4c95feab82390bf49cc336bef8a3075595f618b75c4bb99f52923aa6c7fff1fa75e0ebe4959b4786807c1081ba4407802c6b95e8523f8b423cb38c7a234c0ba2e8f8e63d86e2f123f9a90b5763be618c4367dc72166bd2264208ae135f2e3b7d04e82e9873acd020156a15fc66676cd6f1fb2ce73b13690ca1c37700b936745acb5c61150a669b9599c32f58968f60edd228bb64503e7da7e2fb9c12da3613d3e331f87b57519656764838f0c75560a769ce6ca379ccbc43d4ba3dc3f9b9ab1266aad4b36ae10d90d8a73ebff98659cf7a45a018687c790beaeb4c8052bda14fe0574196fd23c0dce3f50a7e07ec6029dbbca67c68662462d620b754924ccadd736459f6c39050ff27a91e3078e82f858e4d5543589d3609ba28948106560610178d27cf15a9d5da8b52072ccdfc4eb3d00a913273e0e37af85d30cc14d4a7fdd44e05e55e777ce8cea82d14f69de51559697a016eebf9b4863a16e9a753b980dd28fd33894a9c1360b03865616b87e46e0341ef151488efe703951716b58cdbb444e3ce2c515651e5c3307d9aa4af637bf2ea8216a9782b5420fa2d8c9747a7b21ad24cee7a3dee90080878ff796995f67d65f5072179411028d371bfd697e7c74bfe9b5944fd1f3c463ca42846a531c2a057c1386676d36f3d1b30c2ada3e765d018dff381690b44bc308c54976f1bacfd7d5ac613e5d5aa3551b0e08500a6da06d1215763b689e8c9031490aab0a79255e23fbc3dd0b93c53c87a83890120a4d8b9f9b72e2daf30611d7b5d90ccb5634fdc40cc3b815b8718d7209c24f6f88edfa3081139ad31e88233341128216b637424c91029db7d571fa3e6feef1b5706b2e8a4e3cff7cd29100db1414838b5b87b1bb082f181f8d8b969147da23de3873e31881c51cc3c187a1e3b423643e68fbcffe8ee97ea9cf71ff71fc3600e97ed96bc2ed89744d798051530d09965a57ea7db9251c67b0ed7beb6879bed79047754ba2f3ef2f4b80d943277569a539bf8f61ad11638d729c86d774342b1640c2a55fa5a2412a1cdd6c11aca780c72f7ad71c2f81f6fe24b4810d4b1d82366f05c0ec6e1df10a0be33393ed3f09ecc500c3123180be606d8d816a79e11a4a32f4054512d5411fb02a97c1472420769295bc17bf56f21ffb8d8802672e30a0e2a63905f216f46536e12c9094b423fecdb05fa40029f3db7b651e36a130df6d1dc0bedd7f584e0a02e9eb31eb2dfca96e4fa11b3b41db4faefd35e67f182b27704118498a3b60d6d96e6661a286a9589b83f3fd7009da0707cb98bdd4e986fd04db1012d0e966b6bf6dc42224762c6cd076368cfa791044bfe21a4e3fee47a5b311bd8b36122a3fa640c212c37144e501e1a14754b55c561f92db534eb4bb4d736f1d4f72c98550b25a16139ce3038721087487a366369ca7db475b6a0c5bac81a12276ce85d816a822d8d0b57882f10108db2ee1ff4a81d65c3384d149a891eaa6330b67bf66fd65c456e20c92a89bcb569a08c58c55dee8e912ffaa20ad2c48ac3797f963375994750800a302c8de1752d88003050e4faf4bd43b4712f29c7450123465525d652f2eb6f2938d4bb7b085db6d5027d8561a17ae40c5f915782a743382a92ede5243e9fe720ba35af94d2c53323bca5e92a33c5d6c351f5b7eff20ce2e61346fc7dedd06d1c82b24b4659c4ebaebc2a0e08a296a215c14ddc7380451be056b56096a2404f26ff7b9e4e9d72fb2640d7b9a130649df207645bbb35d085c98669c0a23ab6291da2386ef934da7ef007a4a562da0da4ef847bbe84d2cf70f2095d0f5a280eda095dfdf3bb7c20912338d9506b247e29414d74a5ace3a6572792d4b394dc8c982961056567034e92fd53b1dae2176378151f05ce4ab21ce4409b961c43afd27d1fbf0ffa8c9f30476df8e1bea3061abd9996b4f2a8cbdb5a786294654981423d2e3b065a6094fc3431508b3c815fe732085913b6404cfc3945aaa2e02fa4f2c2232ea13c3b286f85d21857a10af7d077c799774da00898d9f4a19920d829c1f4103b6fb6327a75c4fa5eb3c15d495d84fb6307289ac78757e9fa199059bf79c83a8cb4584f706cd700a4323806085555adf36f658eb7e394e22c6bde459215a22cefb4101b8c64a70467fc6ccb452ca269fae3c3feb0075dc57663c17bf4ce5332348d55704fc5528290092f3005d261c5698d8f0124240aad87cc04f972e7bb12f8909d3344b880e98eba5e23b8797d798129c2ee54b8beae102e179e75954e1d93e9f490b99f0143b5c566e48fa2941952cfd9fc3a3c55a1cebd0896b7a58412cd8b3ceccf35ee3e7b2d21454b551f35b577c7f478029d1311d0b6f908d71d1a0f1b85ed92cbe9b96e709bde7fe421b3b94f82b7a4a6bba04cad69f6848cf404e186a87c6b44947b6a035fdb17657663572e81371cb7a56c94a99e5b430d4c156bbc311f1c66e83915069f2988cd84330203a2e029db308a4fad19492d488b22d23950c92e91fee4e7a1756615ca92aaad184d5af42a4b9a3fb8f6b7ba3fc43e99661a097d5cbe02d36e4d2f1be53a892a3e2344d67bbbfd8ace93844785a4285c6e8fb4766fa2b1c8aa99fabae2c38f511f5c6ba97df7888c9dff4b41bd8b29e0799503018c246c585ef9e6d5e5b6e95920314f6fafec3903569c4530a65f17f49856b0783fd575ae289e1ff5c11ddba07d868685472043d6ebcc83c7a529367fa390d57f129ce0d12d532b23bf9596d1677dccb8c1fbfc53bc5825c9ddc424ccb48f759733c2ef47e6e2d174222baf394c146c1539a2de78333caa0099362f304c379fbb1efe8aae95e0a7e37cd9a3a782c6be6ef6aa1e5579f95e38f54415c546c00559ec0ba80a9e522df7f28b6ab768660d5ea6da30bd349e9e2db8fd31fbe2d19592fb05a2521ba70e1e906333aaed60fc91de821a87299f46b2479c0e1c0e0f27f889907eed6c7e7971480f810d9c74e1406fb54dfbbd37fc32ec3c232339b42929c9a1d6444665b1edf3282e7a4ca16d76c51efd22a94208a9ffc10a7d64e5f3c6e9c4995db11417bee89cf93671030851d43b18f583e7f7033a8a236e82ef16d8f301b9201db31eeeb8ec5770e28066169d1d07f1deadbb8690ce1bd4f61b22729df8472fe319f46d2ad056b5bd8fbdc8c81ce922db9cc8f5420c01e6c696443f75a268cb84451e91ca22eb150bc57b9be304eaf7fc3f8f09188f387e53eca84c01b4920eb6c05c355fbf10bef828cc457f661313f906dd05e51815c53ef48c649dec558364a5f4f16217c521a1215a0d12ba9cf48e521c4ebd8602baea537e0261d5824d20608a6c7ce9f5f00d13685a7b43e2b362242a68c9cc1fe0d20c80ea95e7e2fe2d3cf9b57defeb39553a43b127af70c637b50f5a5ce132c8b40d974dab8e739e99a0094602bb0669116e0e6d659cd543b29fc6d26c7a0bc6d86b1e91f194a4bb0063fe6d4dfbfb3f55fe856ed8265324a8e2ae556589006a7ac7c8dd44eb5de6a90163f9732dd8fae05e76c83027d22c86fcc8871b90addeaaa1450690b7e6587d712573e2003bc09bd0a0752087ddd0b852323d739b2c579a0c6439084eb1e39b7b40801f4b664ec154b736f0e006c7cb13dc2e324f10b5db66bd1db228249ffdb4eeb9ca3a2790838131b7b9bcb8698098b77a1be00a80ced3feb2e4ad516caa85fc0e42ccb7da4fad858d5e52f746c738da10102111a689034fc1e2f16e0ff045a3ae6d277b1c0d79251ddfe933365545fcdc2c5c1fdca8db2c6f0f6fb85084daeaf0ee08e3d9d05c01794221f328c5984216c8e68115c6b97fcfd4140da5dfe04ce432e6b6b977f669a6b72e6bc6ca9407d59d35001c4ce64728eb43f7036885730720d285e67dcdcaf01b9ad8833fa11b854c7fb659665b55da025d1d4ec5f7d4bb552837a4ba442736cb4b6aadd71045b06f4f15ef95e22a9a8d83ef8ae6390a20f1b79ff35eb8046de0eb8eeb9bf3be963f5ab129e7e49a26805f4b810484bd5195291d7366c71140cb06d6f19c0743f59bbf0ea0b735b83c07e5748a632df0fdaf0b01fcc5270bab9db7a36f429eedbafe36372f2efc9dadd03995990f1c598254b95feb333582e9f411b1a4578a282ea94884d82f8d0433f90e257a88555b45e2b99f42b7dfaaac5b1812d88c2d419d70351dd0c79403bce305f2fcbefb0a730210307fb2e85ffafda5d31279244a62713d21c4ce5e4ceac1812abb603773c7ff9700452987cb74f3d97fbc965e991fc32988bba1238a6c0ee808d377e10c8edb9ad1d174de00e12ef76812b555d5ee8c82188099effa0e372cbafd336e3dd65b54286528dc2d51010ea752f59e8b40148d899094410e08459960ba7fb505ded2b71d71bb344ee5a43fc7cd0b9b4101e2193f0fd6deec76ae16f8b9accd15328ba4704a3a2db760d23dc64d5c46af5ea41e8c09bbc74b3dd48dc89c983d3a06c6a672f49f7ef9695359f2cf6a8c98eef41b8fa13fdd2fdf04965a0c0cbc534f036b89a3c6e5532c020c2c4a7f238463c7a3b6e457a6020fec0f19fe172963acd6c645ed4a2fa1cb8037388e00a4fe8d4d1e8bca6a263f0dd2a8c847e799c4e5437c61e757b49a90f56307aeae31dd02db7db87c9727076e590adc895c3d500cd1ff1c12769706d0aaceed25ef3e759929be9b8a402115040228cdaa2905e960a4587571659064271bd6dbedb856fad86ac5a3052a7b23472e8bba85ab79f0d380870f963df77afc7d393463119246aae20022cb201c881f2ac2753a9ca6119f17d7efc638a45c2a4a07bf9135ddb43555ce3f9c769cd4652aef2283549fe0e02bb785b2a96725f6cac415a58b60149327930a679479a7a8880afbc912e86debcca039a1fef4f75853ba614e92ddd5b4c44d3813be565b1b37c30f70703ae5ccb554a55f948edc526a3e780f8e5fef08246fae9b2963bb146fef0e5a7f23b09299f00683844c372d12a9e3e9be6f404fba8e3e85598cc78e822dc7cc996a9d419d323388c85a274752fe84796dcd19b6cf292f44a3650ad400b9bcd0d66ffa7b9107413fa6b52783cb3114e55c618243ea88132f46cb6187ad313d42fa2314e4150ef2ff45e6d37068d5bb35155ef164ff91b550377d0424c3f2d86cbcd79384d902e986a0eb33b53b098fd10ea08103e11128 +0476507ad98ca00c09241c3e69390d0c9fbeef74c79d487085e9855036bfc03dbd3984dc3be742b0a434652537f75c46efd0ab412ab9eb76dde928bd8e703a4a2233c800b589b9399e769e420433982fb47f56cb3dc1a5092935230538567a911b971d73ff5d5456ce1a7af951b80c648b334aef8b91963ff3e0886fa98f89413549f1a6bf1433326ac008317c6e634c6837487f68193ab7faeeb36310935fa91f5fa31abbf814fa6d7fda289e258763d1c963f5d82d2742725a9935c55676053d760ecba6a0e47453d94475c0ea57e9dcfbbc78f479df85f775d7ba850e7bd866e2f6c6fa5585449ef95d3a57baca79f434ad0e5035d56e1926c51f335182b10c11f42018e5e00bb589cc96fbb9f0d0804e9e609ffeeabcd0b30b47b70a0e6f6f6efa82deab9c2ff0c76286531ce7ca2c1a78e3539afd37adc3b89e020edbf32b4a3fa52da61944582874c801de5bb2b37f5283991e7d7cdc1e82498d2826509fce7933707cfaa8da2cf7ad0e11eb4410908d3da7b50cf1379dc9754efc328c5d2015073da6a4f89cb9cfb8a430d46bc9bb401850b8c23a04a5081a43e83ebb961950b07c13a23d0b4888dbde212009dbe2241446e678e4d68b73874e3e067dbba51892d8c8481428118fac09fbef8a26fce3670ce4c6dd78b1debb9b108e356e2a5b4b7e864329735bffe511fc1596c073791676828af2649a40770b26c564cabac151230e7a6e932ce9b814af5b6910ec09800c73f608a2b96c63b18ab2d22c82e0a8708ec486a40e389e5100b705b2847bfcd215e718cbee4c85d881d8d59c44bb101df512e14395b3711618b1981224207ab7f028f83ff2cca350c0bfb2e16706acf82940c64654830df35eccb8b2b225a7ce42df2780f668dc3a34b288dad0e0bf90d263b9c9dbf8ff359a2a75415083bab6423c3083431fa1232cf4f29085ebd5003557fc3a1b3b6e48e68651f429aad91508777aa1d9b1b0a709c3c4f17fb4ab4c64b0ef8e8bafb5534ffbce8475854cca76877da3a67da2b0f91554eda1e940ea2b549f18d0480f16b5ee063351be70c963949493244addee59b1cda167acc861e37b3f52d1505ee800865ed58da82634e7f095df3abb9e14af69c779916f2040bc5802e390bd1a68cfa1245524e29221cdf1d3f080819b787701898327046ea6330acf41d61bb2793d688884e7eabca60b5312947cfb01acc79a44a1543b47a087fe425c5ee339f34bfde7c013a1271e789b67e70b19cf5270e3515a32c68a7a90ea52cda63c9fc7662bc4a69ba3d03cea24b5cbc40b218f574ce14fcfa888c1e788f2455f981ac578140087412cfd29616597e6a2bf1b7b436f5089d2b19e0436d9b1c0d1641ac2b9a74b446b1915be588a0af2195aed3c1f621556a1859d4316c2e8f6009749f3decd7222ebad50cbdb93802e5ea2f778e70ac2c395f338dc3b612046dfe8a0e498a31f7fcd58c955b56b921a71196f71649e466ae2b7a466c4d2fda6a3a8decd4aea565ad76ef47364c7561c1d687129c67d5059902d51ff87802da8842109fb9c1daf7d91e3c2f9c90cd9ac69b1a15256c76861e6b97dc194bc956a1cf8aa7749f3c661fd48f864a852bf50ec388c6735614d047eeca4149918cbbd54e9c7871b2c09ffbf675e2b47edadd298b49e9cb4d1b5f4fd9367f73438a5808e218a1ad3ac18b4514aefe90d0f56906ece350a767c8516842e9232274bee41c665cf912a3b10ba4085a8596fb6fd7434e1e0fa098987260271a29768dabd5d3c149873f02688c0bca400229108f3ce5624f4389876746ebef52f0bedc1ca8039ead117fab7bc0c160d8b2e361b117a315d2fdf4afb80721448b4387f3eaa630d70574db79aad972cd6dbe0ac5e6d22d4bbb4ac2f447adb06837cc086fefbc62ffed66d612706ef8a0d21644b108037aa0a7e4270188772a96e2b9162a550420bf2cbd993079aa1531b5bf562150b8df8b2e5144b7f0643b8d055339b4182c177d8382f41ce0139c928e2f498e0ebfbdecc94bda46dfced28aa06eb5e0976343be02830df4033a5c6e7d526960c561b3c35d73f3e870b4e9b4e49aabc91890aa88568b5ffde7729f499a708e15667990d44ab87a51a82adc86dc2a023bbc5a4a8fb51fb622c624ac167c9a1a8899624b906c4d9ab0c232fd4af59d93b062075746e4afe201507fc36e9a44df14737621df0d15a73f37e52aae3576a8db27029a5e098039fcfdc1552c960ae710f86007752048b0044289986f95074e4c07e3c83e005d89bbdbd7b508596aef8930d7fcbcec8a1f7aea0ff5f4b122952ab74ae5609eadd6e861ee75ac0669985d097b7fa2af6e1bcd6d9b4ab4af5511e5763393380520f45ae22c86b127725e5b7a67eb116762e190c9f8124f69929e5ba803914830110784a170bf39e4dd78bec2c1ccaa62383a7a9c6355ba7cba13694398f565179457a3e4ef918260047e52c40176232306118383a7b34b5d9ebaf7138000a6112fb5249fac6c10bf523bb851ce58f5f7910627877040a3b7e661245919fb8464722af256b34223e5ae6265e3de724d2cf14aa488ff98dff9a622420ed5c210a1971755e4f5bef70213b3ec274a2cfb9a799e8f0124d864e9fb2c256eea17b7962749e8c4581fdc315e386b5306849bc24c10673e08b61e50a10fc6511e71df4e583ae5adf3850f6ff9fbe81bf02e98f1b32baa63387d03e7a53f3f6d279585b183c93f42584802a158eb0b90efdb0dce56f7ae19ad5bd7ac28576d6d1bade3e069f7bc0aa9f27d43647e09d037e4570dc8c353715761d3159b4bafd3493d0e795259d8d0ceeb0e0de28ddcbf0aaaa658b64f6613121a8382eedcaf141ebed92a464228a045d8541a46b62bdb4912989504db6eec070c579b053f2082a6ce0691cc90df682da27e44c3bb63fed9423c64557dd0db94205216d21face148edb3e157680be52cc23008cc2df6d123af3364b3677dd041d1fdc9d2b5ae7cbeb9a778b7ed31fd0f2c30a008d77c009c2ae499b3f1ac3e9ddd37af0b65565807a7ad522c62bbf8a3d62e9e7c2fa03ada78e9be22ccbcd7af02c20b8bad48dc19037c416bafc4c962fdeff1c0b74d40d149618a9c56e0c7747091d16cf8bb1f849fe9191ee970fecc7f755a1fffc80e335d1ddbeff3bb359b047c605fbc61d69b5384a9c5a5f4e7d40bcbd00a32c729feeeceace1dc64852e63ca98185de51e2d1972f23347cb83fb2ccaa94be56335fc69729e7c7b6cd30f4a62434b955ca9f84d7ed1b428b0e5d87e2fcf8da56fa2a19375df839beb27a0d9b9aab2605a929b9a7f14ba61a0efd6883c0885843d1fe3beb0b7fc92d4c13d5ad3f608b72dbcc7833ae1a68e765fe6c27fd39f439d95080d9dbbf7739e37d28ea3874ddf2d145e6dc447a079146a7373eda92693b339bdb393280665c58be1f5acb1e97df8384a0588e3065a0a7ac1966029d3acdcb88c2acbfc7cbaf4e07448b3096a3cc01aebc945944907796c09323ab73ceeef155a7245c7ab27fe6833ddd7ea6266803a9cf6f3dd166878f1e86405bb30b6114005ae967db349fe783b39bef70041668cfa9deacea9008999dfaa73ae9fca6acf671291de384414fea1f2c0dbae2024a47da653820100072351e405a3ccb7692f972e41a5a1f20d483b27c4af7ef5a3472ff5855af01b731dc2ef2ee172817bf2698f5fbf204be9ddc8b2739afb2c793c10d213bafe94af9783facdf606182bdfce0e09cb000250147de9b5ad594df0cd8750cdf88876df9230958b4c7d768ee93686517cae624732da9d2bd09fed7e1f56c97fc952d2142fc4dec2165f4b4c4a70ab9f4c1191d5ee09b4d23f9d36fe28dc85b3ee952e9731709c5a4c52c6bb46f18e7842bd211fa1a2cfa35fa10cd8e5ad9a12636f717a8252a32657730b777ba89379f869d97992b32d6fac780ef4fb22d99d7945e2db2a17b57b6534ae7b0b417e3cb10d23999375264226da674cd19bcb98b67f4e9fe8c37f199e2aee42adf77868d2a342ba805c47fd682d7340dda1253bd74915149d9a64698e34ec63a07fb352d384ee85f936209c9d1a5f691f675b025363ebe2446505a1952424f136c2e6e2f6be4f81325c44bf6d2092549fc710721a08ff52d2703f8ccf08c6474da553a259e5733ba40256ba5251846d3f0d953030339c439e382a1864308416368da5cecefbe82bfd8cd09eb4ee02ce3f8784d901bdb798f18a2f6512966de1597252317eed866b1c420a5a3c562758ef535c69530fdacf659f2c0d12c001963bb7743e640da5aa39ca194abf5837709189255bb4034e54a6b079be656eb7593dee89a8b0e1f84a3d01539dcb9a45c9d3bfdefb2e3b32ccb95698fb4f06d9251630a9f1fd8c29e8b8777c44ad539e42fa5543975d2f42b5f55ce25ddcef7fef0eeef5d5d37f431af9c40ade55b97bd7c45fd5c3f9b1fc385f49434e94f27ab3abfb67af42d43299f20c22acad5e48cba19c06c64f0bacb5d63d740effbe664e223468923861084688f2ec95f97432ad5b0aee576ef0196ebb37e74c7a36168ced08c922ad1c8cc9500ca9f8771d9be55c35d8ca5f39120bdca0ee583c43c4a36ec91de6ff2a470e3c85055e03e998529f44555bf24b71a38106c030a000000000000000000000000000000000000000000000000000000000000000000000000000000fd202e3657cfa557160cc2fccf868b3fc2a5626b0a9deca83f458dd9e7841a81435abecd9c36712c7e77ae3711d78e7259c1f1492b4a8a845130649f6ff59853650193c65a83f58c36069a09e81403f2206cf49599ae3fc40d6dd0c5d3ce937d65d8023af4d0f2ac2e81d1eb1af80fb24b2626bf69ec690ac03fa20f041c68d440189dd180305ee32ce7565492068c3d683bc9dc640393a723284ebcc48cbca9ba661551e816e90891d3b1931933ccd7075fea58e373e302027dc044e0ca7573b66d254f20a7e523df06bfe2d13aeaccc1e69e220132b6d8b7fa7727ea5d1e540983a6c82fabc044ad7a1037a8337a070696960994ba47ff53e11460cdb9a4b7376cb2711c0446fcab5d81d1155dd459066956199b8e2f8fa5a45efe81c6b5e1e830821d44f3c9568d38273d92af475539e82fd95e5e1af2a71cdc1504c27d3c45a998292f181873019b17af46412c1f891672c925db36a9038cf0037219e044d2a12225f630f414b7670a872e882d80d6e9e590919d2a4071b7067dd632d40743a30dfed05ea76601611a6300aebb57da3e0cff4325f79650513c1eae3615bf876e25dc0fc87b497f478466b07b9ea493060de3c4e461453b374fe572ef0b8a7401bce24528cfc70028479b71fe377c57d36a461b4d97a8083b9d4503a7f71cfc3dbf9c4b03ab83c97113088d912692f33ac9eafdfdc2961bac2a2c9a5a41dcb768899a7eed942d319a58f80ca7d574822d63132860562593f59c6089d383d30048a0489b56ad32933c9ddf070998970ecbaa0dd7ea6c4b9efa63b63b2bc27fd0473882f975d4142c4ed04866a28408b279d9afc9f7ace57706a3730215ee109026220863bd769c05ce7408be582ffb6bda9ea4016f74e09bd52a6d80f68417dabf213a878a10559bdf6e4b0967b4aea2be8fbd4538f011e3a39197440ddf31ad1736f6d825ec9a547973fbcf79698f4d3ac6ce855ace19fd4c2b67f360bf6347e304d1aa3d84161bd1c0a1c4d2bd1aec3537bba663ded9ccfd6a59282f28d59449126638fdcc6df7e2b391157c0a8f946cd2288f812e6c826c07f60c0ed226debf3b1c4354e68f96b392ff9544f8c56c63b804e273740a66a5ece4282c5964b8e382490145c845f2d3460cd3544c1f4d8e9d2762b8fe6af295077094f560273b6ab8620dacdc1b49221e8317e9b99926e06a34f2b33a303c21cd919fc77fee419f3e7dd8ade0698ec8fe6186c37aa7deec619d7afb2bd6a3ed3fd53aa80d7ec1dc86764ffc95593ef20fda607f73562afe470d608769f5628441e5cd5f554157393a7fadb4fd34ff57bfbef7b43996454b3beb9d334e8aad7dee8b419123f0afc5ba48e6be24e740c354950ae22bd23e931a8a9aebb93170b0be174cec6f832f1e1ad0466721615c761780eb989cdfb957e559037898007891796b3cdcdb3ae778824f7acab4944a8d22d7e80fe42768227f11c381a6ab02bc7e5313b875ca070c094551f1ff347947bdffc2499a52e8904d761dbd19c8c92550ef9c63bd4bd0a709379baaf70cc94d2326e1c3592b341563ea10b8cf5e0df99ed6022b221073b62c8cf66b6ee0afd6146acaae0fdde594cb7c037cad3be438d0f988093edf033e347e22bfd6d10bc3a2f5db7ec9051ad5e1fb403354c9ebbd8e210c8847b472950a1c63ac7d89cf13fad5c174abe7c8c6a8c3b5978d2d7f0ffe08ff1855dbb5ad2e8ba264d2885fc16e9a77fac7e90d1d202d1c7a4c5906101daf7d8c798b9e813146152f552c7b839028d4f840d58ca092de9255578b153cb6c9e571490e2a5c1a0560b9b894efe87310ac664a87e35bb7d36de757e1f943d96d6ece83ac056a0906fed766df7f527aaecc6b260ca0847733d950d254c6342c217112440e44e080bf9b2782e68772fbd869010b56b6cd9a63b3a12dd0dda9cef92427cdaa8646bc03b5affdf97b86d94ed0b6f915888d46255130c2b9c787d7e862eb2a2b00412db185ea82258f56c06a353ff12881fc982cbf398e8ec36ff2ac1974d5c17abbbf4780d3934cb8e183222246fb3d74669cb152595f29720a258aa69f3c047298ab5ad298e919e252cf7f7f8270eeae31bb6cb090f8282b86921d8d96ee4442990bb3a64aa313a38864aaa1f8ca61d164afb0c74ffbebd1be4251074107b7634a21869b14f659e7f634f7e1c560f861739a8d72a14e470cade7b46aad920be7b88ecdfef827add82ea126c24cd245a20c5e55879a86b9ba892e6e58e6935cc72083da4bf276cdba800d5154b8838fe12830fc84d713af29a11e0fddb5c2de6c82080775813bcf76e335d9c1605677ea115ca38cd06f039fe0f875a461797e91d724f162f8977fe80ce9bbf0603d95d69e3133c0b31c66d728686112aefc67d7678eb81bd5377860cc880b62c8ece005524b1a158dd8b11c35d40d11786329ab2c862b9feeff32b1f556bc6650c639127f1a9c980e0a4a53d4bfbce1a5a0e8e06116251489c119a457327af1b6c88f0c1c14d9035b03bbe897dd01cb346d48b746317e93151caea08bd0765bc4216980a9709ec2b7355e3a1cfe937aaf5abc54cc1738b0bd6044b8195e6126f0c55f16c4118bacd83d5a6033eb5b52d7aa7667d381def8a78b23a831deda790827a68fdef61094bb7d0bd46ce8d5bdc76a0b26e61d99fa3b0ac9f6f830d221eed0d3ff40672f12a43c6c1b093842527352d499b6bf2a9769c87952c69991df518e09fae78da74ee2b684102ae50623aa16b25ad53ee1023136f1ac9c74bded1a1fcad3dc74b804bfd851b540cd283d37a318360daa153d1a5aa5b44619081002b72d129734abf11e751e1f1a445afccf06644c39058791543bceef6c7faac8762b7fa408956e6ad912656d0e70184f9769f9dd9a25cbe61ebcf4107a2885bb071c9f7bbd36772ce636059fb82b73fe875268d4f6bbb2e1e4ecebdf17455abdb483d51b958e1c068656cc667e3b4b1b3baa39d71d285166c4420e155624459680e758563525e08657b97030cb0920aba2aa647c9083ebc4150449a933349ef12e81961b539c035e075f104c84ef6b2d7386ede22226c314a2577d9246a2db1577e3b6512a0fae0cd8ae472f56e4490c1de51c8c601ca9335f9e0ebb90e03d65c787631660a722b0e2d04c53cbcf3968804942ed023466d62dff21918167756bb8f3211284781174927b90f11b2f6aa535b975c675bd5cf3b965177b0591f855cc202ac0a42c4ed0dfc29735c0359de9266f0afe748e042ebbadb17c5edc32b6dce6b69fb54d9a69f70bcdee7849029845b68f063e20219525c1910aa280ed65efb8f0688791c346150c258f42edbb327d7ffe510a271b700335aa6f707c67401b10e7e00084b65673efb6a9c55e154835e11b99f89be6d506a4d8c70a6aafae719b470b4a0ded03213a642b940a264b4a701fa6f8a9913b67785e9067e6be29bb051f8a133bfea6ed57989b2cc3af6719266243a19a51f9dab8fa6a43865b1bdd09b3bafc886cc0ec84021f103fd7ee4576cb1bae830c7520d3f27c25fc99edd155674aaa99831388c35fa313d2817abef0ca4b810e88763407fcd5a8601e146a92d42de17c383d7d38a7a4de3e1a3dbdfdc00f5c857b27a28f46d00851f8df9b3ce38f642cec2676aef9eabb3a6cb3b0632583028d472338ef614e573f660d8e21b7848350b02837a1f7f8c144ba2630e39a4834157836880271b33d13c88e112ca979e8f436d6ec4f8440361cf8019d6dfc375d8c68bcf46712e1affe62770c411294290ed5f25c962d06d55c584ebca9f6397a9044536b8ba4b04bb71b63569a151087e688967f0443e1f1c3af2c5b94256f6b2cb4e6b69e590dcb7a9f3df3313fea7b3991651bff2ebc91e9bea25d474974362deee243a0b7907acf2d706780e2cebc3669491a0c76d63336403982372afafc8896f580a57e45388f27204e4128732ed975a405d9530fe7d19c1422b0adde8a8baf28c3f6b107785a48a6c6ebb0265e8bb3a761a97e7f74ab34c908513ffe5322a2a653b1b46f1b29f7f84ed817c6d1e7061e06f573473b2acdb026d476443a880a3073e565f6a3caceb1272de69f32d7183ff6bbcb4e67c8ad55a22d06e492bb163b1dbd4178c10106d5a1e817c98f92ab07e793c25cca4560ff09e3a67624062a2b0a40d7b91e7f51fe8f2a437acecb3da383a6b4b3c375ae1ebf29c70efea8818a783c71b8ad782be34488f451cc04568f4d79a23eaca5bbb4bbcd6e1e0dbc8692710c38dddb9444a98800638bbbdb939eb10505fb562cae89ca3909dabe98398e6565d2910f8304220aeeae2e0f9620e1d80ad8d9ebae73b57d5a702a22245b472e4f1d0213865b49bab0fc32f4817ebe965c3241abf53a6cace6355a3ea882d13d63672c70e5fa5959e80c89ee1845e21997ace5a307d9de2ed2dd88f31800e6197c8e7ab50f901a97fc12cd6444c90c8659f62ecaf199c3cd8a751d59184b062cecaa49688e65718ccbdff6e0d2253f5f8bd59dd85ac19d896ffa267b36849cead154e0d43d9a507d1205112effa4e4a4e5f00936725fdd672816dbe90f8576dbc6700e3177141fcd9bf48a5688dcf1912744083f69c6dcee33b5ad25205e866452190b956d693f74816bf05ed7258395ce4f4f450adc16f180cc7b8600ad586d2b28bec79029156fe083255e5930f1a33c4092ec95286b301e153e0a0994f5fec04acff5580f882cf22b824f673a272004149a63443f513268c95246009eadfec50f178594ef5b4ca852efc96113bbb44add6e7f742b50e075226324002be5df2484e15a78959a5180503469d987d3aa6673d152730907f722ec2ade2ae9f4c89796cfc8ed1baa09251bb4174920ac631333fa257c1a637378905b46050d46c53df6ad5bbe38f52f286f9f9bafc04ec7744b13f019aa7bbeb05f26813db59e1e7ef6efadd7b4ec14298551593815f5dcdf87d83d1f7758bd7757e0dd3b6ff2c9f7ab1906df472f9abee0c6085b05c106d24068cd81086d1c512b764e097e647304d68a4a35efce15f806907d4b7e7537ad5cf2e96bb9111c3f35cdf31b4ee3538cd2eb54207a2cb116b729f549380b57a19e1eaf34b23b6a76952c4913ff7cb51b55c0c7209529e33c73523affbecaec7db1d6382db5826f14d460b93fe962ee880ef7b904ed2c46059afee6de3d583cc041d051ac308213519f6b6e39eb6e18a78da18c8c49bab71bd5b501f8d12ab539d2c9d6b033f7f97c76ef902ee91041e2d3d8511e8c214b67be24a8ca16451a68a1e0ab6e7a516b59ed487a13d2e44615ec2bbc91b97887bc0df8cca69bb4f79a649c309500de3c486cb5872d7d81756bfe13120c1a8b3e6fa30fd711de60c9e58b2ac4ccfcd6869e9040680515fdd8eaec73ba2f9c67734f684861bbb8435e7639a46555180072f7863d1d02da7a06d0af51fec7f0c700d03384e7b7a9b883d389e3549430be4141dffdbe1f6deaccbdc97526f45c90b7bdfe70a32214b74f3c3c4355629120490260fb863aa2de5af26f05a7492bbae4875bf2da81d62c41f4904a2dc4214f7487c601943ae78b33afe1595062c5298edce4571800f3252453fb78b3d445675b6dffceec29760abcf5d1166afaa3a9250fe5c3675fc81586bc4a0cec2bd130437badf4a92055c6ffdf2abbef341fb364058b89f4ff9f094b7600a31a06f6fffdfe6910df3b24c6047340c53aa161c73f63f8478bd48b5a970db0f464fca4c29f33ba0ae40b5f61137a0b6b8de772a002e79e96408727630347a8843879cc07a05edd32b023e7e92392f5a01515e03caab489d1e772298c690ac669dbace119dafbf25aa220d8f7a2cc395f6ce9433f269d67824c29897fc701f24f93a2827bde47f6dbe21daf3fee9b1ffc677e7ce43d2df636da0543588b5ca07bc0d50562c408757fab32eafaab16b6b4e4848115980dd6769e3e3019dd9cdf3dcc4e383108e512c1b60b9ba31d1e7b14d9eaed95242d8cacc83c7b608c95e1df6f913fd27d1833234e0847ac3de358609a4e3c01700d5503c90ab0074b8daa3607d9537bc1398b29af357f91879d5527ca7f6b7cbc09f26cf25095ebcd5813155e03de4f3e34a1d18512d8a0df5014107ba844dc71f8f3a0fd5a1622fa6987cf4c3db45ea5f7ae343939cf8bd7268beab0ad9672b1ccb39d9530d329ff4eff068913fced7112e58549249273a74590ad8a4fa2f3b21ce5bc8c05ef61c1a7e54b6bf3141adcfaf2627d23b7217386eaf9ce36550ef455b65022811386f6bf4dae452ef3ca254e8053f426f77782dbe7b4efecc9a638976a6cd19ee056648fa36fb411910bb3121defb40b708d3912acd1c50c09f73b6b7a70c40a5033161e6343ce00be8113c7dc12e2398310e70fb84eb060ba111b324d388efe6120331943dba2b64621ba6eb6fec61a82e49b37d1d9db285920c9d3d5bec2bdf50e53f8d86328b1ce38f227717d1a00f4f6d6bb694e319a8f3b7145eb6810f2a27efa89f8a4296fdb0c4750f8cece2b76d92704efd14b0c2b732cdc75115f4896462b7532ed358ec1e64555682d000e5221567fc6c54f6599db183ba6d80e861c25b07e33e7991c72fb597c4c14c9284db17b8016efd29eff5734be7f159abc23520bbba185a7e2a61c291654f02e3a7266e0b6d8e50cd4c5b1a3e13337e8283679475c9e85f7c360195e0271b8b924175e07da1d9e63b59041d7cc0eb0158a4faca19cd4352f72771598e64027d20a6157748166f359e531dfc020a182cbe9c0e3801272af108af7c54a42dfd2591b162595ee7a8db64622a39a754a35ad39771e55627e472b3ac1d2c45353abc9200f233277807a400ca1f51e39f8210a3cfb8fc3709aa69812d50f5f10c9c67a275e9b8132c450377a47833e7476fe94f8af19ef643fa8bc04c80502494a543318b45c041bd12ba0ee19fb9449a8d7d6b6f1fade8dbc17ef205933ffe9ef5e9e34a7d0f373c321cc61639ba5bbe0501059b53007b0127c0b56ce00a86696cb8b0e73947e1d6c79044c226fa86f8cf6ab56ff977af4d3939c92c7bbac030f212a29c3091be705683da3974fe71e8582b700fc6b19216b9cb4cef81620f5571de62bdaea45cb244eaeadeb492689626ea6eabc30870389d6664329e5c2ea6b4b790912a914876c4ea9aac9f1adb15a9781d2c54a28b99063fcfff2b056aa104c900637928f2b0a314549ebaeaf8a891681e32a8bdb446fcf9bfb78a61bc87c6ebe17f0e41fc48be08f8549f43f29ef032f7c25fa4dc7c36689b3cd8342a14872201026fe1cea0fc4e7e579d04b4d6872c64ae21c80e9ff75945a50495e00d3aadd180e6055fd435a78056f8c5abc4bdb8f3de1185b6aa1121d221c0b75f4727f532a181f2310ec74a72ece35a267a42e7c5687bad7c627e0818e93bce9c4f3e92425dc341fb086f9cf2586e160531b8c4db46fc6e14fa8b0603908be547b810e76086be1e2cfd5faf4987825a5f9e516c9a13c76bc2aedda360fa7502c29e9f90c1ced438aafdebc16b64cb0c644caa760897bd822e3f1c915aca5eae27f5a72f9253aad65e4e5e0220c42ea18a3ef53be481ed5f48a9e153b62640f10e90c272820b66663a07875f0336d769d40b09435c8fd7019c2e87f1afe2e4a8acd5d09711895be5e1aa127ae2cebb164637c2d9a92750941295188d20e296543aaba6b34056f90e012050a4297f1bf99f231baadf96f5558d3bdb6cbd77ff71d9eff7d570190f647977518e9d2f21742b63da8415fb812249277cb614a0d11b58e3b56e93e2bc1696ea2137a6102923b39bbd1805926d10f2826761e12c4c3f6896a4b1b2679e26892593704519afba4ec09b21bdd98279fa43e3eba0389b963c148bce234c17b880a0d0b608be7505a3445affa0af8d99b455beffbc18bc909bc3d9e832d9c6e9c0ef4603190bd48cc5c6a989967b61c2c6dbd469cc4e146ac1a7b4fc2356a4b828405691bcc7ca8c7db9ec7e33a8c43fe0aec72dbf93de73e7d5829a410aa1fb5244f6d2463e32bf538f556862e59ca272735bd2b2f60bebd1e37786608e6a81524c4d2730c1ea5c67b5f0f4855fa5bbaea193b759114e33918a0164e0a237e545ad8fe5848fbb1f9d07539ccec772b7fc93b92eb45e2f75848b359020a15871fa8b50afba45c9013e59fab6dee74434e2440075667ce62874acc7d8e3757b946e5c6c0002e710d91383ea5887b1ced4f7ebc51780f2ae067dcddbf170f22b6cc58065e81682f74febee117ef2900adc6ca546607f77a62c0a398d011255bb9fde8a905d4a3f114ef440dd15f0dccba981b9f253004a039bbc21f2d951ea09bcb17936ea0af3a58bdbd3fc8159faf74b6b089e658af8391ddc6fe9f4d03b7fb84f1c6914ee7ade50f1fe6becc5e506e7b8df5198c6bb4bcebfbec566226fb571a35c488d2f9676b7b92cbb384824eb4816842276edaf222e6fcab89a20b864f935cc144fc75821f973464494ade78cde35dbf2ef2cbc0a646c385dd4b0b213c3a020a9725fd5fc59729aec8d2099ef14c4769c6c3ece9030e14085be10f003793fe757957f3c056ccf081c1a6738a9c3885354722dca7584487ffc5183b0b4c53dca71dd7cc4b5775a49adb20f1e71b5e97e5775cd7e80db05408abbc2932800956386d7d5eff1af0dc46d3d97b2a56a70e41289999c5437672b0d47532ba53c77e1aaae8abb2f28ce0174e84929bdd1a9354f2a6d581662666d40b542150413737cc10da8c54fe614cd99d1812692605802647b5780d1783cb58236f1cabac169cf762318ebc4dfe9bc065fbabf0e49c5e02cb1eb79349622429f7e10e5974df1e24f2ea0f405b1f5d9bc92248093e0d5f52682b3f0b1323e0ca727428836a9dda9ad472135a632882b573113bbe2e3d1759033ee85c21f52961125d17398520f1df2547786c5cd1ee0d874279b2941733ffc3243e1915fae12266c102e755d293f04b72b3f57dd88f2716780bddc15e1fd529eb050ec81ae04d93b230005206c0bf6de8731519bc0f3b97da616cd9a52b4ffb08ade1456a5ec641103d9e0c1aa31fd815953e964ae4ea1918f8fd83edbd77dcbd3fb2cd6196f7680d193c3e3d454b9e51a8e06019dcf4f37f0fa48d7e7c1bb3a37116183d8b37de1b2cebe5ba35599980c361d933e990a64b9987fee21fa85f8547c475861ac019793377778a7f5c5f60ca48fad6bada4778be7f2adcbd60b2690cac4121ab67321905181c7884c04ae89faccea462faa104262843821e86d08980e3db02b2ba21c2391d2bfe44419db8d7360139b5e044424e25fc909abe6cc61647d8eab9885404251a656d1ad86164da07140bf98abe7f56843771c5680899b168b3c290d096bf134d04d3f6ba7935a7fdb8f79f9fe7b678938a22bbd9cfd5beacb3ea865a34d817b1ec63c678244bd6b496e9f8e19e8aa4d9a98aad0094c4d0e7a65e1d3a373e274f7892d9f997e0bd9afac3e9e85a65bd7d87363d3f592e76d1661de8b1c88c180b6c8f7f2029dc9f3ef57627701f8dbbb0818b18d2645e48ffae2ae9baf977140bb012414ddd70cf121e49c4bb63fc01f000c6514e0b1ef8f70d6b210c58e013fd50703fea0e9e8b2a5dbce566a3d0581f5f751beea094d1adfd70be4e5143072cd9d0f1376bea463d0f0909755a354b1c2cf948b25c67aa234c945c994e4b3a0b0433561d1f854ae07a8a3359c6a30b718e0f5ca3b49bfbaaf600b5f478901952e65bde536114044fb214e37d8f22aca41580bfc39f9acfbeb11fa97da0c63283a68fad8a02f16bff4ae80fcb059ed9ec9973afdf3992fc30b4c55929a82a1945b606d4a90b57fb8434d0159dc1708295aa6149c97ca96154eddaf9bce0951d60bfa4b172e0ba0f4631a44ee604a24bcca7c1605541e30fd23b02c42942d2086fae1392c5baf87b3afd0dc1b13ba50e9d3d12da85a578069f49c9e383bae20371905668073cf8cd6f2a10ed7416784fdaf1a8b9de6d2451868ca53330ecc133218d47d75643ac1a08ff296c5eba591aee932b032cdec18bc4b320c3e9e464152eafa214bae8e39b29a9e14023636486912f9bd9a725ba903ffcb946b429e03a3017edb8e5bf663b1fd21d1bf0c2b4843241a2d5f3781e8b27d47f734b5f31196e44ba8595276097a20792b91136d139f2e183655affb4eb3f5eca9257be4112ef64443ef659bf4c69fa3728afc00be98af9491c570a06fca838509c37dae61ffee34c41f7c882eebc2cf5a768b809a18fa22f420351e5d9378b88250de0d90cf89e1f94cbece5d550c4ab2b13009e8722602956bf6560e37ea9426804fa8a040556f60efa8deb0232d06551559ccd3d504e2dcba4a79d60ff490a5b41b08c185b3276c8ec82f2fc821df38b518e2807796dc7ba25ec71e96e803b53304f6700fec7433d8d0bc6b6b0680a4f229ffe2d8049192e7d688b90f646036b52a9fc235809efb18bd31c231a32db6e1aeaa9e8c5b5065f37daea7829bcbf67c1afa40fbbc0a2ecbab1a1520c64543b712b8f4ad4b4b1d2f48bd1bfbfd75022b91f6702e22d85d76d66197dab43960a34b7fa71d9884cae13404435db1ca32ae30493112cbedc8301d3ffb411915ea8aed33be895706b7f49abc7b308d804655506d4325871ce53fe9a51921a8f5b44647af96584a2de56c528897d75656d8dc3331724b8ce44ce9eba15c0cbdeb5942eacce550ef2102329d9c15a1a60900cf41cf931a49412edfd83e87222371f6914f086f21ff17f2a58c6602920ce153fe055a7352ff2b99412303b2925dcc4f855ab155739878ff4dd9896825b23d8e2e2cb1b39ae95d5dd7e801ce78e3337aeba904beafb14b43883ed0c315b11c8345dfd2a3cda117d3f26af0f0f4080a406d5efd66a6905d8355d2ea1cb461978f68577dc11238610a08e089aa314a250afc1a69f36e5d096ec2bb3aedb8904bb28b0a5f10e2d5b33a537b55c19ca85928f368518cbf80db5f93a6110fb22cfd891e3078316f2d1c3e1826eb89f2d127ab6b292bf7033621bcbc5ab70cf2c42aafd18020b3e93fbb85fbd59fdc182ebb7f0497bb4d6c57af0554db9c351700193aa91b1463264ce8863745d89702eba3b66aef09212cd80f273e570d26a69e766564e812e164acd60a11660cb2162463de4b17654f3ce1dd7b68536abd4e837d43a91b8da0fcac6fa6fb3aa5e4de2064793617b70bda5e9ccf76100ad9dd8937adf9f28212f4bcc1083a6016647a6cf3de1a02b17ab19fd7e071b516e4755a8dc82d7180f34e82bba17fa01353dcc6fcae5d6026a1338c9e22f6c075ea5149a22f515b039215457c0e1419f69b1df6b2bccbd2644086536322b8be200a10bfcb1f2e22c1423bee25bdb18eceac4c15ca2c610ce806c8aa4b50e0bc775f8cc103624d181570a67d8498bc54c426ca8c29ffe3f8a8a414d42fcc8be79b29651e332eacace0d2a21478052f3c29de0953899536f41d8bb8b5ba9b8d1314155010204f5ccc1652c64ff599d839c4790ad53916b9ee9e4d54d48244609a0e11aa157056c52f0a52cdab3b06cef359aa1b5668bd0b5b65f8a6ee57221c6b93b950a5a650566c1f50a551f99c63edac037f9d28cf59ca1b3be9d3a04073f1291afdb480f3b83f0422ee0aa4d475072b74dfbfee5c6738a31076d16068da14897f1d193f3d94eb7251b895526e74743d75a408a0ddfd328d43a07514dc71074c257f7025a5cd2e6bd229e52f77ef8e3f7fba7e7380326aba07e2a804b7e5ef2fb5430480a398f5faf29a955719ed1cc5226cd8d9d400a5905549db8a78b0a059005b754a0c89a65d51435eed359310c2c8d94198ed8add3ed0d84c1f0c2512c9f558f3ee77992438930ae32c11ef178f531e0aa6172c3f146204b0eb62b5fc9904effa8f93818225605b2342b90877df3f0eaf277365224e77518c8eceac64ff5b25b0d742981c9bc1573962fce4a544d86c0446323783019cecf4ee5d06853f859790722af17271735bc6bc422ef5fa10557cb445da6b34ee5338bf0c37d4e894a8aed0c0f4fda930edcd56e6fe5b12f668b837d29a7a506466eadfc7b56292cd842a17d5db939733152080f029c2b6ead5f756bf0f20f155a53349814676345327040dadf39e58e1dc6ff6975cffb2779263291f825508c1a5c1eb6b7c3f1428fa1e398361e24c11562de4b438db174cffda060f554e8c85b56b6ce7bb19c030c9915f911f7254a05b2ef1ff54331638086ca52f029dc51ac62ca0bf29c68e45b74802dd8bc0d5d0f106c92db1de86388dcc31d35d135e8493565da88127dd5a2bc06e18505c4430f7b1206868b55218eac99933670d71d9d4b2bbd56b171cf95423d62b2be1970216e7286204a1ec1736fcd6610a7d3953a7d2bad443426c3f33422b6e305ba31325ece5663a25316783512cc0ed73083d38e4d7fd84f8c1372ea476f433898750d502c3f293090a9c5c2cde172d7f8b2d897ebfd357baa537d0f788eb3392ff435de79833e039256bbb57a47f1ce00faa25756232beaa5b32077aeb5012d4b5d19b3a4d9bd3648a34741bf729f17ee5e8deacf32545f8d955a9a9b6815eee4e028300afc375e39e074f15c4aeb82b653b5ce2829ab41440e50c1da039119b5ee1562ba9d59eaf2f54592a592432c7a2ab97a061ec2fa99fb2a01c617e94f9da33ef510ba5c61994d3710e2e774212608620acd3b7ba62664fb3e8379c64150b52d2dce1360fe8ee60e78767693d5b46e3c636eaffb285aa26c370943738e70031d8c1b407dc02e0c925203b9e0dde774af37e5ecf9c7d11f9dabb9c2e26216b31c7573fbe0747fc534e4f44cc30e825c71727dde0c90c9e5c08a7f88b50dacca0cee394738b3c14ae8fa99db0708a01745a08553c5972a72546e3966ab032844038a2b88d28bf67fba70fb1d3270d8d00809155f420d8068974b65b9c1ed7e53146bef0612def8205cfab76aebb3ae143f77c1bacca70f0cc890c39666f576fa3f6d90938e663984fbbe76ea52edd44000f98d7997f897c5410e20dfe75f9bb71b6d10f61490c8956e9de05e4a546086ff64bb34c60856d3f4e2af934d553f8f05b2758230087e2ce2c94ebd9e8a05f5a511b99b99a735ed7b307ab73f6cbfec2ae61227eff95b14b65f0070d7f0bb7406a45294d1b126995a9fc3450fd7992f116367302ef08b041ce0bf694025924bac37e898593bc02e1eb4942bfe8b4e1f1bb3d9f4c045b71a4f8329c6acfd1b1f9a3defb29fcdfbd6790ec9c2f6a266bb1d8a941d6c59d39814cd4c84bf54bedab0277c04c3f52b42d58170e08f614e900267787899c70d1cff6813248375bb8e221bab37b36694edb24785d21a077a2c34e33be068a3ebf4df409d012ee8e08dcaff88a1a1a1b6a7a198990b9f43eff41d1c2c22a3f45135917ba8b410c02a80aff2887f376e72dfa64ba833eff4b6a225c090a4719cee58aeec764f55c37ccc8c92f17193feff2b931466313b15aff3114e8ce6233350908f73f542f1385a9c6817ef2f01a935b35e735fd8ea4c8cea3f450f0442cba74488914057aba36e1097a6a205c6faf4d09316d3ee2e97b14313b7185a1056472e4dc1f788c5b25ef4a90408086b8381137881b53180a41e611def69bdcc7674e56d5ea876a2d240968861c0420aa88e59a3eb893785cbd7ee1203970968bd0f21da655650f633f814baae53e1838d2f7227232bc0c0502f2700555f2bab42dc2b270d37624e61c7da643be0fa29017bfbe7d2a92b07815d1c10a16f3c4556e3b671f41e78a262b15fedea14c904398309271e07a0ff84906d2d6d9f6cf5d3fad5245186125fbf4efedcd4c0cdec0d6c3f75506771047d0a67392c233332b837585382ae82e2ef668ce87d4311bd7bc92ec5fa69dd29e307b82b0de89ba1fc9ce86a17cb0ad10592c587a4d6cd89d4b3f6b241307d68f58c832c5fa03db5802adddd72cfb33f31e6f25aca917c75832db1653a94945fbc98d4230371d2c5e221766b89123d34eabc9833659aea2b8740dd9d5d2211ac4ef9de305f27b1a70ee81601373db4f387dc354cede93563e504eb1675a926d304c2a706708e40fcd37a89091a96ec2940656c5887da6c0a66ecf2aabcdc2bb5268ef6144523a58ceab6cd7d20f3999bff1fd568470bbddb0d604bfd2352149ff35adc0cf50b9fcc077781f66a20fc3752c167a346f804a65c08a6d1bd418273bcb84a0aac17405ba1c4eb48320a9a99689c6725356d523c80a6d761ca96696283831d354d7a2e60c9c1944d104a8d943bc15fc661acc55a63f24267bd7264c738647614c7904a66dea7dec0a4e0e6ee2ab08ccd2d2d5cee9e6bfe23c8f3ee1286227c3964cdc1726713ec55d3c459b11e324076d50b81499a1415365dd39da63d5d8a23c7044913e96c0b8c6b5c3e25ee37683496ed1fb236820dc4d681810626586f018e6dadec1c32f653d793e2bc473f2a941f6fa80bfd59fae45746be6d3358360c78be14b577ee8c25070b39da4a9eaa622fd32bc5ca4d65b681ed605cf964970f5809cb217c4ec3eeb5448dc2e9407fe422a5749ff95b439b5f95191a0bc3cd1b85d8714d359a50d9dff94395992e963eb334d293af9d1a295cd8a8e60bcca63f91d29e48c465d633bf2ed36b783cc1eabdfd514781e931e4b3405a088efc8f2c003dc9bb3e090db8b7a3950eeaab14b4fc43ce5b14842823aec394c501b7f12aeaaea5c2fb78f26ad2a0806aee5baf21dda90835e89833a0ccb96906cc11923f78d28bd1f907541f47d37f020289ff90719818230c6f0953b85bd92e150ed43d5195d31c82707cc916b0bcd7caa7dc4a01318f9e060b773c483475ccaba35013c0d5feb0c305eb520fc6e4fa2bbf47b00bdd9ef149d3aef55a1f44821e9c2a0f8679fa6766d0819569adb71d4ed6c3ec8969f21825b7bbc91cf85d56df4042353416f5a6d285cff8229a75f757065c634a8bae10c0ad4932d86cc95c5623ae21dc8d358a515ae7a80488bd0f9f33b959078771c4408a0e9219400a9ff29f3509a472dec11c1e78ba586fb3d48c2e6dbc6bc45783812d1ac576352c556704af05881b3499abc5cc448fe871643103b2dd606012bddfbf55ef7d6d72e4a403260f659c8816d3071e4d8729f419c2e81d0e6b8c72d54ba6c8e40510d26047378e3847fe0e35036adf1165ccf047deb0f5280435f9e17c7bd673db4713f65ba62202858b6a36062e24a282aeb082715ecb8c855dbfd91e4dd33b91ea680518786d2784418344e737a0778da4acd107ea1b6bd4e1f10c840febb13da1d52041cdd00698d7207981d69504f180b66ee873669dda5373d0140bba506b6b34465d2f569e81088df2620cc613c2757f2dc7d872ede35fd02c44a4057f481c0a7ca504a82c899d1a8df5ff69cebb27d3911ecac23fe6654e139908f1883224165020e27d1eef31474318cbe81d1c9fcfba241b345d743516a3b11ce14ae34c11a92bf7e02714578bab817f87b04758c5de6b0b969e9f642657ee0388db46efe722e04ac43bb94e77cb4d06ab90b1f6c80aec0ee1c3e764b791d54b7c8c063d062e3d1f582068ea73eb17cc021dd2ea7a8609d33c5bc392dafed010ccce100c199ffdb15927cab8d7c11c4469ded126c8600438b0ba29ef14250bddff51d9aa9277b763c79041337f352277f66d2fd4f401a67cafbd2fa18a7386bb8808bfc9894089f67e093b468ca2cbf352454e08ec6b2f619f3dfc7cc4dce05aae39ab4d28f20822b0b2ad8cab009aeae986e83ce54608175d3a6513ea15df203244c63f40699e4888002960d22a4449f3537ebc1c2da0fe1e8e98e7a499ac324032eb2aaf2e76f08e279deb81955505aa0b108167781c7d63e5e648219759d2b67b5a361c0fe0e94bb806d66b87be53610753447b40e59a7b5fd65b14e082970016ce1ab95afcfa76b3e1a252f28f9f3e2460515da843a9ad12dad1754e5c9b3e12f1142b0aade8858057dd31d2cc832b130c78ac8daa68b67a2ded4e30810f5f68db1374ef6d8ce9b515ef108d45b3f86c1da86b228d45c4b8e6762df87f9996cf071383286bf403359c678feb7f7ce7740f8e933ee794b4076c654de6da8f71d163e98515e0c20fb3046b488f313aca7055a411bf8f2bbc3364754a2b4fc75e62b6bfe05d5a7c1e0bbda16157ff344acced84ecb1780ce25b8a50cf88d7bef84ea10c820dba35e8179ca78832d17093e78e0070e7c67133a62eb3a4eb0b93c917aef805f4188b933bc53777a16c4874129883e3064107b6fa58619a97d52fb6e8a31bdbace8e4362986ac065fdb79abe3c7692d62c8566d7a4b1e284acb51cd91109064c313a6d32585a041747164c0b15fcac6f094fdabb39677d3ece16802186fd97508796cd2b99fd29e0ce6b2b702d06cf4a7b958a75498d2cfa5ad15b6a16b9c4e1b4d2afbad302beb52206f30c825ce900d80c9e6088fa0d17f8eb716d1975a5f1897bf5bbb4ea0bb3b479c634ebef59939859674b20452ae320762588f2e3a14295cb89e9c519d0db299acfcad6796599adb742b68c3e9af78498470e839139eb1d27569b197d748ce31a15c79f4ab9f2ca1f49fd5360a256037815b98aa885c2a3ea2a23c4f5e83c8a525a602f8bee80d242bd98e3db8629b76db9b9aa7fe57a365e39c20a522923a2acb727dbb6eb62ddd378e29bb1b28222b5ad73ecdde3e0771ee981ac9ca93a6fbc0db6bb8cdb4d4b6db78c2217b5c6ac7f0915c6eb6d23cd7326cbee6f90f1213c97888582c96044adce8f70de4fb31bca52ff0c89aba6c97caf42bc1534d8c2fbe778536a42ba433b11e15a3e4f94cdd4dcc792128ffc03c23cbbc83c0795254e921638abaa76d542f31107e77bbe38e808e6615def5cbf4c49f2b39a2fb3474ae1f94d0a1c330d1a814bf5c9edd670940f97f83935b7ea817039c5d750ce64dd1e7b7789f86c745498bb9ea8c3b449306c585427b65f0054cf0316cd9a8f7aa486ed0ac23b1390fbd13f605fb444a7a2e787f64b6974d434ea61cedcf032cab65463d8dbc25c84a77778a7a24fd07ae76b3b7863a2e6fdfff490e7044ee950dadd85468a22b7e806d8ac9c8757e60bf49415dc4e5f8423f236b1e5c67387a9c431d945ac57417efd8592de7a5151aef4ce7c40ef98c566caa8717 diff --git a/zebra-test/src/vectors/orchard-shielded-data-3.txt b/zebra-test/src/vectors/orchard-shielded-data-3.txt index a1e9aeed..80f877fd 100644 --- a/zebra-test/src/vectors/orchard-shielded-data-3.txt +++ b/zebra-test/src/vectors/orchard-shielded-data-3.txt @@ -1 +1 @@ -038bbed0eea64e53a836cb658a81ccbee399066d13ae228fd522b72005c634c32efc8a0c8af8efb5e8e787aa81878ce795448a10da0338fa656878172617e9d1023ddb4b0c06d73de4b93ee138d69fe5ee5a8a4805a4d9ed68d82398673a9b613418695f4451acc0e637458f50083e37bc6b6c150bec8b14cf8753a67b1b813933f3083f93912ec4fa9a197a60c2c3ed12938769ee9aebd0b5cdfd559b998ec38abfc92eac5f7bc1dbf15cf0a5e3ff583e7e93962779526da764e511c503fc81f2702b4f394e5c8f235c51827730d79c29ae113da8fc57373236b5dfddc390df95e60a2ccd18ed567afcf72908e2348d7e37d788572c1f8af169e243f2b7ea734d2805ac711b2fd21660e319be03998f0b92db88b25697584170cd8e0a66829f6b86ef9b37127d3ee990d79adeddb2b42fed879d0164246f0c2f3c6c488f7ada3d55bcf98baa6c59f75c6035dfefe06e92a9e581ee78c3b228bc1d0786ad35b4dc512a5f5ee61a6cb05edd7c7255e6b63b3de0a1adf6c3566cf48ba798255575f1f7661179f16839e132b9931059e4ade7f403804d2f67b8819fd4dc1c188acdc962c8f80709669f0da9dd0d71be404eb30b46226457e77e9c70809f87f8bee97a4bd1101642c13f664102c87d42571eabf1fcd8f1a5cf126879e78519bc02c655fa3eb84b36607b36024a3e3288e10345154117119c61d3ab15cdf956d6a1e0748d21556c225ebc5fac32b7f5af3c6d021521651684e0b6e99cff393e20f7bb3c1e07509ded8ff29c1f3aa6e693c12012610144f82b6a31b14f339cfa8eda191c87aea675567c974c3955fd332f3a473fd6e8094167bee64b4ac039cf4e1bb2904307a44eb891c3716ca58facefdbf917afd8bb6b4c82307e7fff081ecd18c2d20e4d5f6e37c57ba994b9131827b8a4fc3f0b687de6c14e4d9deff9850d2b4835f95433e9fdde0159b8a6d89b5e01c052866a85e4cc813727cbf351e2505be63b486e11b1fb6344cd237824c0f2fdea0dfc234f67aa937b84a03cba9cf2f645751d5e8e8858feb2c6b05198f4a5f38d6b9a1b63a6ca463919b34afea26d00fd58ebb557c3af00fe60c9662aebd9a2ca409c0ec85f7378046dba0aa8d1d4a01739ac7a52cb81cf5ed79201c596e7571dda61f246af632ac2165692a77fe84975a2be143f2ba97bf74717d5eba89f9ab1e3c86ec509ef8a06c8e784d58fd7b6606cc0ee46aac629ef6093ca7fca4829d324d6100d358e536214c60ea702d77b50b2b60089a41300fe24b25f0223eaffa7e13bc03a33087e67800d1cd6b443a3eb485c637c4328b6030067a721d89bf43f1d74ba84151062eb7e06d776a36a126aef289e0b69a9da11be97c79210f82d3f8236c5c21cec2c237733204ed245fe171fddc036496e543c5321d3747d1af5a4229d04f57a45ca8be67bb518064823d900c32e01ff22585271a8c677e690d1a65084bac6691e9bc97a07a016abe5be9ba3d4b0e36326dadce76f5bdcfad6b779b8ebf6bf7feca6eb55f0879a0d73ceeae890d7e13eff56219058f1c8cac0dae07884ad0cafd07abeb52eb2dafa035193e6bcbfa51941e26977d4e2771d2eb7ea65e10ca868abe5690788ae66ec1136bcec8bce4854d4e2e5be6aa154a4e40f8d0ea144e8e1ca8cd7f8e203b0f05c3f2f6ace4b716a211c89fb1774daae3f2d82870adbec5802e4d3f35a211e8a93e04f855caaebf54220280bbcf8d943b3d734324324cf9658065f8083c8fdf6918bd5443f7fda3b618f0a79cab02dcab66847e4372b5400afe1132af4a77bf27826548afc33310e5dd21fd4c7a229bea19c5316478e57228a14475302806382972aeb24ed6325e32b42374148d179ca4c9145e674504844e3272461bfcba5e566f26f9fc0d11bd920751a7da806f735fdef2d32bf4386b436ce920a66b52fb2b1d70792dc051a2df4fbf36e9b7a53e3c34e2cbb15f47cedad766a38b66ab119afb12753067a23f0e35f6bee30fbd885cc0f361e5a0657ca8ae5e2eadc4bfeb23e00d946f3b6c0da72352c85d415bd892cfc3a63b60ebdbcb6d5a93ce6bd80e9236085eadae1876403b7bc5eb3018c49088f27709ab764c35edbf197ab55a8ff32f973b23c4f8b7c3cf280990e709bcc8993db5a52d1add3c2497abf1ebc891e7dc4f46f2d992d18964f832dd7b358a6b475b4e07fa6220796c6e750433cfc7d7975f0a5e801ef5e218259b636d46d64c60832315814408e1e9bf004a96187966f42aeb3ce50e42752af9331aded60a895ba4c310190ca5fcf75362174706a6ee0ab3696b2c96d49363d1cc5dd87eb879ba14d61eea15ba820db9fe761d1d1b34077922844d15c8b8687fc97573d0a6bb60f099a8a5c797960f9266f0d824e40eff824d821f9616bb41fa61077fb0a9fcee9f908325d7c7cb2e31fddfcf86972ccc6950d9c306a0af05b08070113e429c24ccd8663a279d31a575d9c7b63e69ea6e109cf7e3e690ae2bafd1ca5e95860f5cbd59d957b18f5da9a1364ba83d4e6bfeed0163d5b10a61b4a0190129b2cf5ad76529465622f754bddb6b8d145d4bf963d926e1295b7f889e761ca8f623646b23ccd12a36fcfabd4d0986ff2b52b801fedd9241ab1153cc1df4ea2d6daef950f399093f0d1944dc2ca40528603d5987e78174b92a7eb61b2b231a8d461e80b6ea754d19bb38cab65aec4c01a99f07da7dc408b812adc5cfbd26b71495bc6cb8e48e6d8ef7adcf4737e5a9333f04a68def528f7458df64c04f5924acecb2ad9c066e358f454d0618b3900d376c2b401601ac15123581290b7f192e45cb7b62ec633425799f54a98d0d1e313119021c1cba2b37a1bc8c43489eee760f2f2d0b4db6d37412612d7d9a64ab957edd47e8f5cf5bafbacf994e8744a3b74c5923077af90c7c9884e96ece3d652d2dc5702d7b6dc698a7011749fca8bd4143ded78a15c1303e8013da864b508e1d89f22c2f098959416fc8d7fad8ece82ef556b696acd3026d77683a12e7a286103be987c8db4ba534cc95500517e4b5f278f9afcef5e7f728c4923ee442f96bcbc099a6e187097dcabca2217b04c4f1c3cd81b96942f3aa74b326e57a9e052daa657d0159f65e9a6570c5d11fac90cb8705ec931e1717f3b6f7b03e3ece960a37e4b8267f4ed9f124f7a750be9741805d55ad6740db768b968d021b941f7b2cf862d413fed8c266f865b228d7a19c314cfc73149371044383ceb655f2345e9ef7ea6cf8f9e1a546018a87c6286ccde22bb04459351acec45958599b1c57c8acfdb11cc1ccbbcc583694c131090a61e735e334151818004b33f0b83b6062aa767c36d94e322299a14b75ce6357df26f3238426eb2e025cd6d84881ff1913e82c598377c75f53f026e8a18f9b490929df94becdef9676b53f5685b2d7264ab92e04b403cb12a57a5dc8d0c20de2dee8f09f42277f6a92d21e29c7c839fec6d59c572be0b8158030a000000000000000000000000000000000000000000000000000000000000000000000000000000fd40256165fcc35cec152a1fb4893fd25e648a8cf6e3a8142ee0eeda72d68fa6293a97b2f33121505e2bd4c4ce8aeca9e59429acb5a8f50ebbcd31bdbb26f01f34d689dd5ae1912ac14bff0b5e512e1e5f9b20b414c7576b361c0c9c4016f084887db83c237600f97272e4e479825b4ae1a34817929052a98eb80aa379a82c726799188042d9f285fc0475ad362e7e436bd1a09a46b939b23980d8be0e34266dc7e8872073f00c177a0f600c00ce3863ce1615ebb80ebde29388da1fd9865e4893b23dd492ca6b76cdda13748099506cf85df17bf9e7ff2e4e9bb6ebee3777a923a788476aef564b488fbec21167e2770e8bd578a09d4b74ffa7200600582b4e796990743d4837ea4d12eac18a24095c65044578344541569f335182ab5eb1e65b43b6f060a668bdbacaf39ecb5070378e2f6f73a35e1ae574371ca1b11509a22d0826554d830e6d62cc21f1c2bfe31b4672512a547a48f4861654a329c449782b2d378e49b16a83ba9ecacb3ff612ede89ac2b9cdd34ecd9d3d896ac302f9b653662632eb8cda4e58ca207f2d85e898369994cb81af0d311466b23881855267d3bcb5f4937186bdf06d52e06bef329406d3fd1f7b58753d765a3ad6bdbbd4ec9b2c9028686772cfddeced1d522f6db6ad30026599e58eb747bff456af0faa10db2d13f60724c583907ddadf04039e57f287090e649d558ef0f7067efa9323a2231239c89bc6e80b7228d9348d6949a0b8f19e5e086a7d7d68d7606c5fab65e63a02bcb1350f0cb0181865d3f276decfbecb6ebeab19067161748fa06fa39cc986533e2451f64745eaa7d3c0a6add6c3f497114edb10c129f8ca3c3658287ecd998eba3c0bbaa8cac168ac167c5c0abd062e533dc9b9c6de84f1d6ced42d023cc374b6e44985f3d79bb2b149aff53e2f1c801580bb660210587a601979914d0ae0273785addb9700c6cbd44973ce545f6c3437c0455354ba291e93ed055aaea4667b1a319081026bc3e23bde36aabd9f78bfdab88efc9ff75678e68f622ac8a40ff2128b8292148b5ab73df56de8b3bd7d2f32c262a30945aee69c556306eb409c973b600e68e0c5fde9a514b0d9191487615b41841fe5b5b12447cf7f0fb50aaf1d857afc6b0d255164c2bfc1537b452102d5cda3eaea5325ee411a326a50001290bce7ba572c366d4fa501b5bfd9463e9dc8d2b3c69d87ba0bc3f99cf89025394737e74d49edbe483860c79a8ad536b9882e7434bf605911db21ccf0f7e7b8e7a0a91c753ba15db2ab00994aaa6d08761a3f19e0f2b43f2d450d4207b6b839ebd03a0512de2eeff33b68e9baea0d42a5a4facd70ecdbb73087f60be1194cc9149fb62850f1adeab5702ef36f89129ce7d3a5a64f5d411f2c4c2d9482a7f844df06a6a435eac45e683c7746aae3d406ed5fab8f64bde516704fb564c74911a7c1e612573516906e4093fc79457780ccb19208271cefa42b3d2151725702c6e5fca42bdf3b51946f714b71d1976f2270be47a5a16d0f6d7d201968531c3544b8a5ee9172adf63149a34838af59648e2334f55602da8cdbc6919dfd014f4abe64e0dbaae767fa9a97c42a2a62ada89d77293382443b84aa088a85fb75fa5852e9db1f9a834480f0c351824cf0a3919c7794a68422f62ee1817bd64ac4533691649f37a3ca8a4232cd811781b8169de9583d3d111738ac501bd349f8c346b73b4a47d70ee03d29fe94f35b1bb40fad490b8e87820aadb3c310efa4f1cca8ec1878e7ce12532940f1ac021b7a01bdabcfe2b8bf6c66d187859b3762025cea9fc83af9aa1ea1c0445c2feb41e53cb372743c0f1650b9f12c4282414736ba0beddb72d32b8b9497816495438cc7ad71c13ab3fdfc7a9662695462bd6ea9a08929a8a98b23125226a460f7e1bed1edecb5ccd9509c4363f1625a00eddead2c98a93cf15907ac6d14fe09e0e8d1395b417875ae4afa3945fc9f625965b15cc04d4314bf9408a5a3152e480efa0e8c9e1d26ca0f493ecdc16707c354e39fc60a0e4431b1cb209196e1449480e86e17ab7d53c2b86836287dafa2030558eaba4c7f897c1a7272b196afaa42dda235dd6be588014dd682e48be2d4fc2b4f7db370d1b3aae3b88a367803c8c167400452329d03668f13f9086568eb8202349bf906cf19387903a184d6968d71fd4471afd68655efd5a2d42bce2a7521ed25a09ea89870d3fb4d3cb7c41fa9b117b9152ff70b1a1e37309dd13d80603a24a1ff086e98abd282e2459b47afc7e96b97a6212607f590e0c8aa0d88224e9cb950c5c779203617cdcd05171281e243b28e443048ff71991ee1041fc2cc3cb1c7b102ba3ee6628aa8fd9c322efd5a2652425caf02aa07aacd7efe0e9b0f6d7708dd9952805da16b1d23d41488206b864ba49c248d53e4f359f913743eb8eddb889f5562a0ef8080adc9e2bb89a6bb352d043afb8588e58629915d93a3af682e0ebfa6584ce8aa6b1a9ca2bc5f88c5b80ae8b741d5cdae55fa522c289274ecb9da9c9087e00bac4792700104950beb9cec8f4ddc2aff57dace6733e68d3311effc9088bb1775fb6c4bd4720ffb667486b43e5a573283422263eb3a8d94e572c451ddded4670c955c3f53d331d73fb97eebc22a70525785cb44c2bb9f7434890f32834bb5877a23d7cdfcd5a77e711df310f13756809b595e9e0953694b1ecbf1e808b06e42e89f7309bee81282305ab300476e63d1ccf33d41775b67551f39c4177c84616ab92479c9caaa1f8a8abf69b80af537b6ee071673543ad9bc89923d6e0dd9e596eccffd288ece1768fbac7008efe20f58508e0c6bfd19a3b346bed83de90139400b31d0d45d4839af25fe38a20b8e630f931fc29b916f5966f884f3196d9b7b3539d842937820b89572b291a0ffa1c091bf82d6a2c63464138482b064de08c80f60f202b176d03877a7e2d11653354b527bd9c70de4f22975727fa6c8356bad45d65f5104e877a0277610f264f013e369e29d738573f385512c69e2a502938b38b0ca5e629622a002de947acf1bcfcd1f9fa6c3c6557622ee31477f5bd08ef7050a32951e93b800868c2861e9200ecd0312d70e0684a80e38e870ccdcbfee5440d1f779723d792eecedd08fd73f0e09c2c0868beb51cd19009c9bf8fef9f71688e6207ae6f9590b4be263143b9eb92e7a569011b11d5a50be700b6d8f91d6504cd636b7c6e42800ae4c99fbf212ee1f103d3b8944c001c7c9bf56f511cebd4e69b3c4068da69017efa2fb51c449461065a0eea324326f6423e2a3bd5f15e0e6d6de3b9c25863a3569eba1fdfb9c4cf43b4b4416578f318e28557277ca94656f3edf05f18ba010b1db381c0aa907fc17a79a26ffab3066b010242dd172360093cf6cb1dfd485e41aaf5c2bba215ff7458fbe3dab25bbdf102c50ed481bee41a719249f32af8cca3ff4053a925ef0315aa9cfbc88696234c1db068beedb52fa332e80028d44803405859e6475099e6512231d51a80c5b5511e916cf0b6673cc2b557e66b0e7d45510bd63d0fa451542cff88d97b4aa6964e68206913134b03a78bf4e845250a050020970e29808f1e91a4bd303c3f7897a8dbc9cb8a12f5fa6c2acec72794b2ab63509ef1f48d424baa561c14d2934d11335d52fe899b2b9720e6b9a7916eb5bf03835bb718a3b7cf88016966c324893965fa597af0d3d94b0f57fb8505bff62582bcbf2594b9d3df5ea583e1fd4ecf95876b905710bcff11a38174b3006c00a7522006d3739370f24e2037c813a24a40b874be512130c2a9f9350b368fc9b4e260d8e20b77de78b94770169f292a019aea90bc6e435e0c3ea383516c635ed8a8e254b5aa4348a8b16693128b689e7db0e153eb8a0d99a38ce6104741a9e8ee5e31f906b59b830f003e4dafd1c7fb92f1d0a238886ca923b347ae8504af5e4ffba11a1b76b09fa3a90794c934f26de72939bd0e0a988c2ecf2ca146b93804cd79406d2b07ac629ae247f5f2cf00cf479d36c0747b10fb815e13eb41ef98227d3202093592eaeb38def22cfb9dfa93d5a95c289092c689627907c720893cf574c1225808be4c4a51822dc7050ba41489e39a0dc9869bc67280c4285c13d4fd13c8f08310f408705abc3063ed5995b60def5d07b0de79d0b56b61f5c9d5d6f65061434725df2b80b19f268aed4d71bc4b6a7b804505b9c9b4dac1fd0467491d8cb893eb7f6bfa9b348166039c75348f398a12b4981d7494d274be0b215398735162b3cb2d3ac5b3af4aa8c364914e0e1e3454bdfe85f51ed48fc58b32f2334bec96506fbc5142d8dcb1992449f5fddf6b51e339d6dc3c266ed5094d4cace2cde73962c746c171838add0db164fcd61ba512482d86e9611b4343177c87c830487d74b0b2fef9dde3ad8ff49a249380f68421fc21fe1ff3044bbfa84a080c365efd1ed02af4072a17f080449fbff17bc10fe693bb7961b006091d739123fa4497b2ab70f4c2f64a8f2981baefeb26ad794bd9be692d70d18d828e9d69a602823f0fc3427377c99f3e24b1ea50b0a746dd5512b88e8f274ff684ed901d2a7e7885cfcb0000da86f1cff90f859993a496d9ced536e27b0c4dc52c8448c7b0a47b3479d382f5d22b08a0c7a2fd9d25716d85354e55ae74599815d1850d9d762ffd593b37e28b5c4d623554f68d28d6b7d605bf084599626f4a407b602b88480dadafd2f733ad49dc1efbb53c23ffaddf15c5201cdc86219314c53ab71b5255c252b50683925ab1f26027d0e39cf5c4ba59ff5ee96f747f686a3195043e9957cb6d67e7dcb390b60d64e3f1da7269c6c0f5d052da8209e4ced0819e1d1f0f6c75c4d488a4f146a52974ceb188fec823f051a65b706e8916f00652300651662fb24b5f8eabe218d702876ba59da219e45f59bf2420e30e71a5ac4b383ec023e1bd6fc5169f31742c0b7d60de6d379e932b6cd0352274ac74f336219c583a8b9333ea572ec99314880ede2455031da54a4601cc7baee4635985982b11b5681c09f42f386cb8d24bb6212f572c32d62355093c9efefc62afa042e5ed24a95f815a6308ea60a8d0c1683ef1394b9fdf7fb719cea0fa8d81f88a3ab803a4c9a0fb8a8429249eb8e105e8c3fa18bcdc3b769928767360fca5f744b2a6701c10d1924bef74e69649b33259d52d57b67f63ce97c1d4f99becbde572070e97c514d77b8cf6fef55e02434cc16b4f1ca6ca9480cfd0a082b09cd8cf2b16a965d7a98eada182991e58b6e198237bb0dcf73f5e45a0bc30477a6aff8e957e4969e423399972574de0face0143aa609afd3655833ba02e3e58c2c5004e84a555627cca203db63229ab2ea74013b5a339508bb6be6175b96a2a9e3977546e22a7221a1484e0285da39ef40a2042545ed003dd2d657b2552d8aade9c19e220eaa0ea7e4c9c3631366015e736631d51c59ad5e1aeaf5bbc77a741dc6e71d9b2b76fbb68ca321e5948b4c804f7d2599ce99628b7b0f67028633ab86f26b118394509336e09a4257578eb954a51b009b2ae72aef20813f33f81ce4e0f057a379ed7ae94a5e8fb1bec12bf3467e060fa9a435f83b8cdc457c4dd4ee93361a42e35a3b20d2b067063dfba9d67663c637bda214c8ea5e275da3296a2b8249af8ac4e7240159ac57e8c6867789a640d60f24c055ee32e76bf0a86d17f7a8132ae6a180acfe5eda87a705edbc1726da5b1f03b190e5b66853fb4a710bc8625de508b7c31cb554031e5656af78e3077e8735377bbb110878d594a76b4d53e60a468fd490469efed9799d9042a54891e50a038b4811c8cac95b4b22c613620f2a5dc2c1b76ab04151d9b90b269643e98cc81232aacaee7a7d91e56ea5ef848203482d0057a2cdc09170ae1971f7a67e0b4e05973833ffff5209b0e82f32d599b0a5bee9a4c94976a845410b512cbc6c9ff2091c20180bcf25e35a422c9a0e037bb51de527f9189df8e0d6757d8ae2900b153ff5866a77cd9fe91edd431477a521da9a169c253cd8b32b050786a97fa9d5fd02147edc7c8dbf30937c59e786965f27bc52fa7608f924d51b169a2c374ac18221f847f94c84145aeeb3a5a2993515b2df1101888074e753b14b75bbc1a964702652e588fdfa26490e84d168e50ef85808644c02d1d5bb4a494b437f07fd2875370bebb48043fb6633613fe51308bf0bba8480d819aeda8397c6ab9cddaea58625e0bfce2dd0b2ebf77444b7dd21b166f4a072f67c20cfd19f5909abb4e1385017333bcc72bf76ab3770caf7f7b42eecdce3bd8dfbc477e4b421118689943b7001f2176d3e39aa91529475352f08e1b5bfb3b381ba741a4036735dcc76a0540b1dfe4612fff0be86e77064b75250bfa11c07071106f47438e8dcd714118ee8da25dd0fe796285fa23d113ab5b1a5593622031200c5209c91a2fd5a3887b49458348728a3e682f96e0c44fdcef5c5a1ec1646ce4a46bff44942db305b26f87fe802c88c5c00761fe10f0d91103851d91285e1fcc48d573a24ae00133df7c87e5203c122a59b59fb9a8d346aa363a377498e81a10380c7ededab940b129cc2599a327f1e2fb28df6e63803fbeb18960061c8b3e390056e83b3bb1f98153f591d241fec108552232d22e0268bcafb458bfa9c80694fa6d32caf23540db84b70074a3ca63eb8a0956c9a9c8b446519e8ae72646ce789458502201d8b264e4725e2201759e06510ac85bfda6ff1ef108e3974816477681e5a7611909e970211935dbf3e0a4a76f83719f284861b2125b3fe8a573f2ba9259cb75188d0c196395273551762ed183715e89ab1da065740d9f0296cac340865b999852ca3ca2ac3799d0901f93159463de983577c4a0a6c1cc3665be5aead9b5a56eec9fcc031e22611fd07ff39a6a5a86e4cbd7dbc70b4118380189c732365bcf6e0e94e0b5e2868583e3cfbc6752c6468bfec22833f6916af78cff5734dac861eed4465ff09e6972a110f54e3d7fa74212e6c6326e0dd7c311065a9bcb73270daded4b19837997a8719151342befcb42157359d7cf2d7c64e7f71e6deb91d9546c95b9c5426b64b9dba361e6f16739aece4535592a5f7012e478c8d5fc3339823246f6a2c1ef6fc4a451dcc600bcdb5074579c4bbf9b4a75977073bc2bc3f6b4222b045b2a074573263381ded12176a038764dc3692b56d215096f741d5445883ace89c5d48a86d570d0b0565e94efae1ad9e90ffcef46312a23ce60df283baea5546381134c3b46e822750e2e1863b504bb2d846bc8d3d6b7e00beb3efd4a3f02675bd8df4393d498e11df5a63ecd614b118d9ba06b1b9b4251b9a2bfc1229c2d8566383666f520f133b23bb8719d264a4cff9f4e5dcb3ac481d006d4e04b15a8f1950048682d4f2f11cd3baec55320fdec0bb41936d42b84537c488eca794acf89fb5399ff71f558d374c1aa816ffe2163cc99438f94e52b8aa020694d74260027ffccb45215aed6c23b0b10face9946ec5a9f44b869080f0e6aa046855d043f0cf200e3f55919a3d2b150aab398a2edb7a92a1333f7461384006108ac81da73e2b394e183a5de5753aa80c3a3a063f0b5bc04d5e95838e75f3c321d5f4bd94ab6ca53eaeafda0d0e2b9cf82afa335c214011ad10e64536990a0e9ef09a7d10da151dd193e1479af110aad8d08467fb6f5a1aaf8b7bd75eb6c413a2af67c156063ac4a1b2e83a3c1031cbb47e4b41f2e196df9fc2c3e8916d6570b0297f78dc1a4fae66d748f4a2ef22df3a35a5c164a6bb070a4e031768dafc9b134c06be86b32c2a3d423dc567162e1361360f768d725754e40554f35658f3f847781186b9f4d5379b7ea2ab1b29327c7251851f399731dc6a848cce62d46b50190edf2b605a97f6246bb393cb0024d7282e6a4a1f9322398a1196ff105ea45d31155a2b262215a47b8be5dc614333424ce0fcc15c12f9deda2101f9d64e7e6c63c0f85954c4c1a6c1cbf1793cc03afa2f2f1119b80ccc5441e3b2d42c70d0b531bc6417e41d1c8a33d88782bf230d5d2896ff3978787b075c4d1e5a173486d1c64caf3d38c0e24789481b22153a1869a59ad6fa7e484db5420c8c6d7d642c2efda9da6a6f8b53a914a732d8e51607bf9fac1ee94a51ac3393352cd6bdd2e6d87d46539ac1bee6fbc5cd5aa692aa141e3b772ef2327b5b0745cae21adbf360345ffdd3c4bb49b0a9f63e1403967d06b362b9d86fe6ac3711ffb638b34384e52ee734c6522f64a8804fbc97241c312db2c888de15a10e3dd908492fea882e98729e3009166330a08c7dd4d1043c9009a0c037f57d693857ef2e35965d9db9897884e2e560e4725b74b2399da5ff1e3a8e0aa6a8669ab21cf15c7a17e8a8c948f7124ce2a59b9c5c435f1894e84e8d096d54c343dbc3f1a93dac1635efc1e2d384ba34eabae9aa5b74ad85d99c3fc927a3e49996c5d3c592024cb2e1e2ee94f28d4b06ab9b3b0e91c22f4a689a12d033bd3ecce78c491d282e50435aa900cafdb1e6efa9279e3134e4d04d179e3c73287b9ba97ff3129b7211c6a971637abfe676b03c251095a4b0dd6104f1d8275706e4c9dcc849603e4dedf57d2f53d07cf693741f649b8f3b275ad85143f61a4031af21e71ee6e9f3370bc4d468441ae86fdbd0e8d73e831b287dd79f05f71599169c1dc9de69fa8ced777318054ca5238c479b90a85c979c03252e032717bf1a3b4ab05831517fcfe5ac9b445a90f67880930b413839e57d3fba907e600e68470a983e01e6687a354729121520b212139a7aafa839ed84655a2aabf5e0e5ffcd08cdfbe1f2c7b3554da640b9ec0f5aab58ad713dd5d591423ec6611480da512931e789f44bfc0e71962aff76e8aa54f7b040e4924fd5e3a8778846c847f96d34216bafbeefe630da34cf0b1961ff3c74c0bb1ae86ee30b2fff4e2454ed2d26152a40af05b9033cf650e3d081c4684b818a51189a2f5b637212dfface72a2ff222fd356405babd708a2ec07c14654381f5feae397c446bba7974a8355a754136a3f2054d9e672ca3b35c7fcc472ecedd7f8651495005747785a92a296a9516eb038a2e0bec14eba44480507500290bf2295fdddacdc6d48a6e9476ea7d02eeba3007d5362f832241a456114d73ad34520fe1bba120b0fee522b773898c02acb253eaa4012bcbf8267a8b9fab2fc442a1c05a0f502fdd47b2e4d5f30d280036f6e2666639d1a09050ccd28ea8aa5358829d6306fa0b9fa6e1fcaf84f633fbd130b2bebf77065ee9973f187d31f8ef4a0caeff9038482d578fcf0471361464431f12ef8242d34d04d6b8ec3db89efa88277feafc80fa8bd8cb7389a0036f6c7bc5b05561d08c6e1064c0c011d0d6e3df83f344cecdd96cc54eb0d3a53e8ce5e7ff50de48debf69419f8b49caff89f275909ca5debd22d1355e188d6833911e0614618b65e9d2b330df5ba9e05d74abc64fc90495c4f25259419b608592a401ef89a1992635b2efef2391723be4d22fcc958b8dd39b7fc52ebbdf664fb25317d71d100fb63a73ff88a494f5e0cec8e0a9e0eaef431d84c84f3ff1c9db769fa7829e6074365e302a7abbb0ece5a5a809e3a7e273b136ba61d5101c73054a81456c36e3aa009771d07f68ce69b86618f0a8d272402e86fa252530a2217cc54ea854b021a157927855455f48a078be880399c2f747e3d426ed72d1831eb4e29270dbb731cb52a5ea54ec24ab7f22476afc661ece8ac3d439ef6ea7019d64ccf3f2b5d243765ae1151faf24a38a1612f50a9521f8f95c59c4331a771210ecc5fa2964ab403770044f28e24dfbb9199a8dd6e9df21031a46e331ce8bda986cef2632cf8ba1bdf3aa35f65c0e191cb1c9defefef1961b8fd872cb6c0429c4a1b3ff4b5067f3fcd7645effc2aae880aa8397c10e4765fbc569b4ec46ed46ed125b5814bfd7d0834a7bd2f55554643a42aeee08e146a7ecd3904941a6ac53b37463cea1335cb0f27e8d394b12565b711c02ba475592365c2e4da0fc36d0a603b51a8afea77b8255c9b0ee939da5f12e356d5fd09d395be5cce7269410f4d3c0042fbc5d42a3b09036f490df6fda2c37dd3e4e9d0d0c2ce196fa54ddecfea7a2610d82935a14d12761b4fc179d02b77d57926751ef689bb7adc7bc2f953474766422b060651812fd184255f95936520780ab8628e3df04fbdaf1b942a97a40add627a067b0b3518e737cdfa971d591c21e0bfe2527a84bcb478eb64ce5a638b064ea3d330e12503893e03e4e82341f6c7d7b5cd00ee16b69c2c8e1b550403282470b1031147bb3fc7c170b9f89312697b74ccd542b0bde28c93918ff3e3fa8570e7e5813d4a3d2edcb713c228c56bfea01d7d05f3c687cd3163cb5bf4174503ec7465fb392d65171e7407a6f02c289f5298cabcc863ff958608a2f028f7f527e8ea40ddf5b80f33f196f49fc4c794f2990862e9512a0438b14998cf9765c5e4a355d24629df1d2d7ba0c4b5ca2fe901ef3a50d60e78107bf50ab5542853fbd44afa38a8142f4112b273645c50a87863d0bcfce4839de6ec6c19cea84d15dbcb1182d7391152461ca6704c98c8ac37641da8c3c73025ad5f7d20d60535b01017a70ab49e29b7e303fe832f612dd956eadfa031371ea4a9fa37534505c38ead226f2cf35638280928b9cf116dc98252ed5378c7f2ea02b25c2fc5cce6eb2a88d5bc886ba52eeb773743305eeb4e1cae343a20b393f23a780181477c5bb5c5b932d40f377c54bc0014a5812ea63025dc1bcbe209ee193c83f043b6f2fbd5b204fc2ef88f5f27b2b61d225ef1ee659a6c9ec7c544156042db52a4e5b9ed53db94595e67c002ac53342c687774e2861bc565fad9ed01aa9e775396d7348c3fe34fa3871e390f883a7e133992ae9424a1bf45c13d3bf21b9461a8af9b07d7ba3855f96f50560dc8d9530e88f44983f9b6f9faff82df9fb459024ad2ff45790fefa97e4cca6cd859978618174d626e6a60f36a2458c06cff830062f096f7af692655e53c6e324c7b44ea1dbaca7bf1a3b5e052473b2260b3f29f5f4c6dee4638c3e4447a8c6842b74b56291fb21aee77fc03b684ae21c497f041f932e71ac913f2348bd3e549b16e660207c75a420349043b38ff02c0c597a750d1977c3ba910f7b9e32c582a45b978782573a39ecc101b69ef50c66cf19cfe1e291acb96f38341c4f8544620ee9308853a36baf40b81871c0dfecf7130aeae8b812477321cc0fb3b86ed75d606bd399a24b2d57dd4a7d2a6a38cda7423007465c50f23e7c4e3e9cba309724666085cc229927853657b44851b620c7e84860342c6acc0e015d35a2c6528ccfad8e19b7506e546d451a55a9643c1c0ba044f7ad1a7b065ff7a1b19ff6be4bda3d0ccf02a371869e01036b7e8595ce952f6b8bfd3a8d1cd2faa8dcb2625d6321f7342e76c1f172d32f3a18d6f9ffa03d0a46dcf10eeeb100fcab0fe606d115b871fd8fe062de44148ef44b2e348df5d9b3fe376e722f4149c712cb4188aeef884deba1609223d17e6430d8053405deffbe31ba7bbcdb41c639e697d0dc8c707169c89d37a2a3ff3e3d24af05c77fcf331cfe4d672c513849db6bb7d883cfdfba30e2107543ddf71ab22df11d9b2c20b2e91acacfb1a10fb347d47d0e4841297795f8e2c2a008f25d5e451f1ad95db51813ae9afdd60c7fee5a2008b0ac1bdf9f73dc94b2824456bd0b03fc40e2723f42c165583233c1b8aaceb5f680cea8805508266f0c11c7c7dd3c9d2d860b1c4ec3baeea05b0e9a4a11f591f03ac389714b57f2c959528891bbe5ede91564a8708bba85fa699241e6cf5cf8fe7b34aa52f9708e5c01a2e32968d943f642212db6dd347deb924f65ee07094f9afe24e9c2cd330c45b572baffd8f94bc9450edc55ce499bb975b352bedb74ecffdf4c1770512dfa3ee9634ef6bf049714a524aa4254e6b716a07b5e8811e8ba3d2d07c3836fd826487dd35a81e381ca9df24691484bf8f0efcf111e2b0b5485a1429fc009730530e009c226da35c31f50c5f7e8f755e9c5dfbf3d406555eaa9b5adf552fea61f9f55fe60668b5790c605525622fedf626f2cd738d4492cbbcd41dc6b612d172d8955125232ad3620f9086d8138466d6e6e67b6584c2324b2c15f9c58f2dcdd576d8dd93a8c95e07633588b134f569411bf712610b342629acdd57ed42e6995138c4ae4c10bee10b4e72a73357120b9f40c42c522870a70092f841fe58b180d8f1521e3b021bb97c2fdc86566f263aa6fe3090d0a2cd1945a2de9344256445c9e07ddfc512e29fe6b801acac771e7e9907d1bcf81f5be9cbac995f5ddcc4a7d17bf8361221d821c5a8d49c75e8ca786531273ba820836afe3ea89628e53a265676d35dc30966b0eeca70c172ac6395658240cd64f71222c7f6cd740fc2400c23847a783824070f4a97b1e9dc39f393a4ae25954b57410b0d51182c35f5de719aa728c5f0046411e41f985fa72bfcfb585db0b4e2b9f5357a462c88837cc06c72464546ea0301a8ae027abca9348d1ee0003f365755b5cc4ca89ae5472884cd5645d90cbe87116b1cf33d24bc7ac9bd8b001867198672662616189135941ff810847ed379a4ccc1c3ab0b0a3e83f0f4d0a46aa576ad4438f19dce68e3efc01431ac63eb6f16332c35e53eb99a954d667a615f24ed9fe44f599528708a35dc3b9a074837270b0c8c54e7d348aed87e158f892566cbb4834d84daba95ec7d54d5dfbb77bb12a3398d96e115ec5b5d84a720468d1816965c47687d649c696e5939f7c3f52b301edc75cf71bc871539b90895f9e3c0b26ba5ffe7cac99af180863744331b5f748fdfd73c1cbc6f1f54483540c1bb7b0ec6b37dbacf1cb1fb5dba3dd7a29b3d802a4838b10fa3e93586f8e59814f78b8f87b5b3ebe2167be190d5ca0e29b15ced18c07a3c56f227508549d764793f5663d90836988020dbe12a6afd24fdc6d3892178bb5ad221510ff70e072c64449be4da9ea06c6a9f0821ab31328ae00e20da9bc7d813f0af1ce7908e8f41715418c4ca639cb0d1193d6fa8e6a03518f09032152ad7e8a24b96c06643e58583aade58f9f70457f340393ccd8f01faf04724d892f88cec5990f769e083d7913f1cb7a5211b6dd4cc46e55213064254bea436ba307706482b07976479f9fa9f63fe9715037b13f218dbdc7237a65d7b6c6dd2d8b200c79092af04ce6dbecc38e74963ff0824249705bd4922371fd38432fde1d53d8558596e403e799730b6890b07a126dc63482f697e45633ca7b7ff75f3d5bf30257abca7f244958e7d8379716b61001268486f0b591d8580005b8996373625865ad57801074ce753954ed4a72c2f1a39e6e5f31f83a91201af345c52412d498ce81e9a4d075e6861c6863b09756aa5cecd8b22675f9b247f15613e9b3444bc39f5a0b06c51c890e9a532acca95805e9759661daf82bd86d06e2e6f7e4ab47f262ee3b50e816cd18efb7e3ea2d0d0e094094d741de361362687d5967dc85b2e1f86c1c3e2949e15c7e291762d3394f69a17b6888f8021981cd11ce11b42082403c765edb73bbce4b0f7d9305cd24af969b03b11abf0d1898b835de54af8d2690dda321946e3cc8c47061b797abea11ca10f76555c2da9c85b009682651a88a02aa8a22f4a01b74826ae647f49f25a603164df05df91af107daf8916b7f3933d04574fbf9372f339dac6c2890a3e7a66b45ae3bf6a07053e5226fb4cc18ecabdb1c44d0ecddd30e70c2e10db3dff59a7ac0a6871f049b2f49f31e21f7df6c19b2acbc549b380277cab8ec3541c9e53d1338041c00bd178ad645a7f4f4ea32163b36f2e4830fd089ce565af73195564e9924bd180e15591dca85fcf0275ff335408 +04a6f250e4bada3b92cb54e118c1f9ce689db8c9ff9392ef607e844eea42778a0fa6366768a0e9f3b1bcdb7ddf57fc350161be8b85f1fab08f3a4c35d3e15032321abe75b2f78f8c2de4c0c635958f74ec615acb8d99e86da3115ad2a7c7c5b531a28b252ab870da029f2d112d0554d40feb28214bc2be0d2d067f24168fbece1d11062231592caa229a69ce2f075a780fc419e2a771db6f56b9f444a909eb8abc332bf02c0ac78fbda7efa6923859413b813ea680ed93e98099c9000f2d63659707fcdb2aeac47792eba97616b4569cc982e21cabaabc7a7aad496d2fcbad9fc3a269e032350e3be16425b28dbc211d1dbb16da6027bb8a9e9250ba3e4a45bdfc1c0599966c272261ec6ebf0fb54bfbac19bd5b56b99817a2286d75a2aab88652edb47c84b9b902f758cdc5502b99791d1ad09bb2dfeef5a32aa2e6605bde128b2904b2b22a47801fc753b0db96839de7513ad1d8f950c469d4efc239ccecbb9632a66768fd01887359f7ffdf97efffc324069d16b8f949a59c6e7dfff4f253aac8d56cc7f93fe7e6ec7bec9e4afcf7d0544d99f3290cc67e5b6de2b072fcc502cacc13e7f2266aeeea9aeaf6b482c42725d909c8a8d19a22991ac0476f9eac49afc68d5b90830ebead7deb90b7e503b0fb0e979fa900763eddc3f1df1b06b635d0336697b9ad5df48d897d6905a39d687550762710eb3003a4152b828883d3c9429d20d42473e83245a7c608648580bed2bbcce95610ecebcb902a04b52dffe90e9c7937f77583581118e21812d43040a8e2209ecd6275b22351453480fc0e6f170a5d748754b95be238962b56699c15f63ad45f0d85ed068383780955481956810dfcd3ba7c80e50841ebd56ac7b49992423fe6a8899219b680b4b594617998235e0f6d1568419f3d3e87b54f5d4008eb47c2781fe2f72e4adac339a3a9d8588344a016ffe8bec18ea4c2c462e00dd4241d524429d571b41e777dbc80a92001b8850bbd48596aeee133542302f442c618f2d73a98917c9678590c7bd209627541317e5788282788e26513ed739493b13d58c5d4c63bb9c6609116c9bda89f25fccfb0096c3d2950c87432768371c94e634f63c655350bbb47047a3d995137a9530fa84a96da4427b52858db70c625096233ecbabde793d835b52142fe82b053f59bb613440a57c1bb1b43be9a627c1e8f25518ff47a78a53b7b2bee8496346f378e2ff06a3f16b51314ecbe2e4d0d381abad9126e05be514418af27251b0aca283de93484031ab8408fa22f09a37f18da80b390fb5eff8d829e128e7161f70a8d4b3a76c8cbfcfb4e0c7dc86fa43349bf7ece29c03c205dcd23fbe4892c5cbd2a07ba7f9f6910b020dd8a6103f1e6be11ba6d2d9c86d73d7acb2ed96acbcd5543e80cad687c9b54e5d89cdca870805b48cfd684f1632c4367cb93fbecd557377032d310582be5486568c25cd1975bcc6669cbda54cd7d11cb0a4d93054556d20aaece6f4618b1dc973d53e24f75ffd3a5679769d5dfeb6ca7c18c3c3cb41fe571fdaa61ef0953e501382556efdf420db598e19924f8c4431a53899f7b31cfe6ac905d226b138052d4b84078ca98d0ee3af5f76b45aa11870dbc92db3d9a6103af951070b6ccf435745dfe644a00858329918e8444ef31f0b82e3080e7653e6aee6caa657610612b77033928d243ccb05aca9e1bf7b2ea02baac15faf80985cb52a08cd92f4942f7beca74bc998dbe6c0cefbb8c1c198b1efb0b106262f36d7a8ddde88ef2e21df55f0b98286c0a1223b380f017148dedf823e4c359b6aa4e7f53b1c6336594a55d642c6c38feacc70738509242d9cb73865a83d62938ef1a4bd8767ce0f9ecceb8d7586106080ac774ac53742aef5f56c71ce24ee71adc90815b4eeec3d3f938dea53508e5760e557604f3e36ec69f3f230a11e7feea5d9018c77e037ac558d2e9ec6048b19fca0d729ea7bf63f0fe653f016c06099d5a8d17e850c2263b643709a8a01843c888e756f84758195d68ab20cb3f02fe9eb3016e34770f21670f236d2880b3f51f215c6fd4e7c45340881d36df2818df584d15606ec85766c73729999f05c3f7ac616f15580f6e976fc0dcf706a9be9c1e9ed1032c4c59da0c4895f7e2738ef7fa71bd7b32096c0a292f053e65efadad23742c4b3cb6d233bf7b3336824c0fccf09c78361c22c41d10cd4cbd1f5c0d738e4aaffd4c4b05ba5aa1dd13c1f04e9d3f15ef95c5599a700213ec59807e2f2d7dcf39965f8396f31c5dd9f5ae2568783129777118bdc544be4a1f778170c98391dd925ec0d1ef14baee1aed4d019d20e6c335eb5216fd41f710c33ccd7e7d2227f52f4ae0121f049781af31164f5ea8a04322d96dfcbe8a8ae4d3242660fa9d4f3f5940010080350c5d91134a63c27cdc0562f3331b015b9df466522d88151cfbb8eca89b6f6b9969ba14207a0979c891a15b84659ff644191af4059208dd431e9ecb83ba4a8d998000a21b73bb46e71aabe31303489ffdbab490a29f955b21d48e0482c5b883b29ccd161ee7dc7b9130125a3b2ff045c86bfabcf3e7b3ce4145e275022ba279aaa7b0262584ca0eff5fac76e278e4d9e2d8b0983c5ead79dc3af99c03dad29f2a3f519389473f3c0f3a2a0697e925b4b8f26294a773643ccfb0a736b5d1915bbd0813b06a53afd7048145186f174180d28986097d6b5ffd4b2311534cc35776efe903bcd12152d5fe6b29217758f87f6ad04a6a99845fad85209ff8c2308868d671e1f0e6ebb34798f8a555cef544c7e4b1eea0ecc118e8bac97de013867a9a6273e7f3636a90392aa617cdc89cd4383e9f9833184edf48ac471866cfebb44f86eeb641b4e5cc0947be6599366798c64bec47e0a74418a2f335ff2457865c3a3b9fc1e464616ed0fb74640d96b9ccff01b544479a7dfd01769b7565a0b7f7195e9dc0cbd8f9c72520a08d68adbf3fbfcbaa93433438480f029a806869a513d6abfbdc56bb378a5147fbb3af3c391ba67d6882abf935e655d9f4069b9a9dcc422261db7f87a346ac655314a8997764e55c5040653528e165532bcb4cb08d8272fa10d85eb50f05c2a25428feb15ecbf28988df1b2105d6758a12a33725224c3bbc5233fae1ed47f2f5febd6e24eb293fbc852740acd0ca9db2731f95031354d8cb6f11da26f5787a449018a6275cfac032a25ec71da481fbace8cf111f4e9385a54be9bc889af921c7154a27fc625246a3b93af263b953c915cdf602524053d361632e41c5e592db6e8374a47b6f701b90f36c8e8f4ca63b9fb7b5df2f5098eb01fd2b59301e74ebd45bdd6923497cd802411a02be3616d793b2ea7aa42e44571b66d7d8bb807211d5fb82078cca5af97db221afa625221e1f79efe1a184e2fbdfb38771e02648a61b52b4b1d06e28d275c93aef7baaf6b085e5ed89f1d2bc18ca5ea116437c6fe68dbabe6710d696cb1f2b726402259590bb1d56d5a739a873eae6ee112018eb22a0b6f5ee286859db7b323fb9524d6c4c8c0534915bffd8d7098414db0a91007999d5a2cc299ebaccaf1b9c5270bdcc963d180315d49473cf4ee501fc754444dd339c1213f3c9cfde5fb13b693a69bdca2e50b3d941025d63471e372db9315b6e35121074657675cb0eede9688a24cb3239c151701ae050207b754e1d96fa5508672199dde0f527f4133ae1869e2ac296b0df626e2e256ad551049945ea8436b68ec6850405cfe1ea462974b58eb0cd5339abdd26a6e69ce6da8d800ce4c160a642d4a3ee0248b7fb94fe898667db79b54fdde112e7b150366e056782b8737fbca68e0186127de2fd1f1547335cfc0315ca996771ca083fb8173a0aab89f47b2eacad6962e7bb11c41afd0d4d8c5498c9ffab4f5482a33bd6e30459b939d75bc3898ee00877f81c569f0719db428903d2edf468661b5df100ca20377174595a819f20de5a4a590036d8a69ff8fee84daa1cb7ad65bdb93963e749a170c87fee1f384340cd1091fc3a7cc8acefca8fbeb35da3d145384df313fd6ac0ec406e54e7d116a6c02fff4c7ad043bc30329eec7c879d28af614451eef533b0eba9c014ab23eff9cb6082ea042b6d723ec797e82c53f58b6f03dc10ff7143356ab430dbd996a3bf7542505205e957a4fd3c7cfb356cda15a85d3784b32c101aef2ca208bfe2c11b24d61be79b77ea64580e64bed024b15247576bb0423942b682e753e17ac80c7a0d57dceb0d1f52bb8d529b3714e8a9c262052a7f9f0b18f1b1e9f4dc28e664fcf7a9020717767eb72fab1231323d046f537a93f854b86f9006ce59d50c0695323fcca15561e088bc12fad422c641d5a05dd25a9716292db996d40b40619e23b2d7e79799d57351f4eec0d00b5919146e96e5d0c75f962e63ff0cc4c2835e52cad8099a33aa74152fdc57fd07b81da342767ed3794375dfe7d7a40ea9138a7a99aa07c71bc6fac99726a3f068cae1d8c831cc147d3c304dfd7d34b66e1cffd14c28d31b5cbda2a0cd6e2274f488b72be66b250cc56ec4e48bf0d222a35628acc0d78d14fb7453f09b89064ff337588d2567ab5874e3462130163cb98920306086d1da18d27f2796ee2f65e33f36d8b784a373ad16f62794fc94bfcf647d5ef3f3bae9030a000000000000000000000000000000000000000000000000000000000000000000000000000000fd202e7c83c8c1f1c40d2fdabefa29ffcec9b5e03aa33ac981d43dc7f3e6ae72b2f51d427bad6e2023b6cd0fac3e30d6632b1f615d1a2d2cda48eb7c0d29821a89f9039124ed294c8cdfb88737b8f78fbc49c2f14a2162a9e148fdb63b235314cfa18e5123e99e1a0bc68ddfaf9a978a62f910b0935d7db4ad3d2cb82b84373796828b9a965d5dd9eeed3807b87c282ba4ea0bd1219cb7d1dca54425298952a262061e3da339c54c4dddf3840173f428cf39e8b9c963376540bebadce734e92f160083246a41a47ca50a74432d08078ac82dfc759205fb1e7e348fb14c24f9dd3f7dbd5907cde56c91fc18235c1f7aa34d16b2695e4b00e976fbea680ded7a355f2b343595521b3e78484bf430b864bc927f3d596454beb6ae908a8b1a720fc532700319dd495e768609874b0077d29ff47a0992046e2ac9b45392d18db6ade8f3640d4bf88b5d12668468575c28da0f3eb0e10495f9c4bc13898bdc2b95e8d98f1838a4eb8ec83f39d4c3cfaa7f0df42ff8e0611b30d2b8b30f7dcf1477d8d12bdcb0dc367a1c6a10d5f110358be896e6c5debf56e4b2edf9d88435a34556f1861f8ace08cd8f0c907f8f673a59a00aefb5092911ac6e774f915429bc235a883f5fb80287fa957faab9c73522b6992293de7b1bca219390ab0cbffe027e59664bb503a7707b9391ce6fab43ac10b1c9318c5afccc38cee20549f0fe55ddc8dae02687e9cc96b2c66f80836dfbf2eff198d93ec66dcdc00c7fcbf6e9343a482c6a1a003b7bef5755b3749f64464be52aec2bfa88191799672503d9d184a98e00ff5407edd57a73642c93ab3013f33fd4f08a0937a094ee6d6bffa151f923121568f3928877ac2fd32fa4ef0a2f24d1a632474a7fa769baf3bc89042016074b1fdce3b1e71a2ac2d7cb97991804262a5195e1502ce4515925df32774e358855caf357ad8d7c4c0ab9ccdf20b9791af7a9ffea9f3865bb0330f090fdfd7e078ae60ed891a3c308118a2fb6ac037f958475b70b93ff7588ab161bb822b906d189669f5c85beb0007eaf335cdc969d31cc5a90b40acf64a7ae493e65b6622f9202990f993763266d3b3e16bd237e3e033f4a728fb8e3c251bb63e1c797ea0fee2bddd84b9553bb23ba9caf769666eb71474f494b6af6b3134505045eb83bb7e9d144015bb554b844a0097b21ce1cbc228d557d09206d47169028b08f0d51e37f8a40632da543759fdef1feb7629cd53cb7e2b195c332e57529e608903be9188d3c49693323358a256315130d09573cf9cd30300d0467ea45c468d614c8a4644c2661feb599ee73a0fb55d1f584abad5d974e58ea32b42624dfde4d79f3a9588471618e4a9bc908d7c29f32ec4a0debd20fe77cf92486f06fcbbed27bebc49936951b4dd628d2a556f41f25952706ebdeaf57f28876c0a02bf208626d4d66ad965b724705ab206ab2959436e5c3c4046105eee68d191d3b93f69c67c683f0daa0d66dbfc39f97a6886755ef394f6653cb86df77b4527ac62fed83d1d82b75147653c410159e0f89991de5cc920992e488d5ca65c19ccd70958d2f7067fb778df8e446b84c0beeae33f41abda189f1b3ce391ac0c49ec8c40e9a0dba0b901c7a048e51624c33337c1d4d2b81b234a5152b2dffe2b373b0e9265cd58dd396043a256c00876488751d6790f85ec9a6c351272dab78c511821651fa93b90628027902771d7b032320e46ee0af01f889703372af239368e3e8b8d3bd6c64956b718750961a6eefb720fdd22ad8cbdac4b495003647fbe39d228d54305b0b42c461c1d30c2eeacb183477e6ef6bc759517a714d947e63c06fdd466ed8da043e04ace4b6d4149bbe1031b79ce655e0acf63ad8ce5b11594cb407bf8465bbf1214dd1c2fbc57acb2a0ce2637d03f8e1efc09deda7b3c965b1c0d3afb01da79114b2da8116dee081032317783551725e04d9a31456e9d13308535ac7d4fce76b58a9460eff0e60676816032d6c9174db5d8321833a6e7ed711ae7f2f25dafd0f2529c37362237ab67211f64c5c949dc0dc500f3bd6e116bc09c9f5a8d3563b2dd5df5eea10e27a17fda98b1a384afe5e906a473a77200f225ab228d03f46f6cf61f9ea1bfbd8e26a263067d3cb8193122241c81eb246fc3725393ac786ec2256a5137fbe892188d0dd30d686a73b6c10df4c22c9422ec66f871c6ccaa3aa7cf23b7acd231850273c003634a2d9de68a34e7289f22333a2a7909f6d731dcb2a4c78ed3a1c8c344fe8caa4e404f65a2a6617b5d9b61880fe65847ccb557062665ee774799ec35345d774be2ca6e5856c84fcffd3006923f039f7db532758c93a3456297fbe343a91415f8111fb476309acb9184fd2dc60cef8607d5747e9fc7b136dc0d0272bcd932612996b4077c2d059d370cf91f91f4c0c0969fd7264f641aa87ff714296e84d8cd736b666d0161354ce407db76a81d9ebc06e7df14bbacfbff6707e114863b008e928101175b669133a6d1feed15550158b3f83178b142d88c41fde694c43bbdfa2bd08838e15eb96231a73a4fc32e9d8ae9352b55bf29bfec4e40ff578916b8fe99c7efa38b0d29257523281eb0e4444a9b9f653921a7d3349c9a07e1e22679f8cb4053b15624a6141d4e351647b8965c6200c99399a7577333e92af75a162b3a83ac955e96382beedf2a6a20271bd9003d85c8168898706a77af1b436c7f0f07caf5af655c0a7357e7649dbf73c15b54d72d8a83c6afbfaf7648a6afb31fdc90b9280ed3923160d080817f7e48267e003d20af8235db5adc60b720201c46a1df111019c1a7db798a0dbaf55e890b3d1899dac5f77885b69c3fdb3810d297229d89be914163665fcedbeba0b45853f4110c63014b510f7dbca77a07347b7b1c2d809f8436eafe1a26be67a0eef5767f84cc179b20f9bba06b1c399f0119b64ec7d13c8c838c6e057d2d5dcd40a3c9e85c7dea2e7601ca90e07fe3767eb08f0030c27656f03b651c1a6bebadcd6f201c0c9e7d5aa802a6943b4e3166f81ebf97fdf2c64874b3d95cdbceb52ad39f4c6c1929aa6a1067d2940c3bee67c76a371a152064ec30eda8d4eb4ab80ae5b9196c20481a47f63a6e0e62733754b6625186657acd14faa4581e76e6aa42eedb2a4b4c5b23421c857d20066a2c711ef90a66670b57b9b0806b3844d506b00adc4504b9a4a0bcb287d862c561314a290c1135199395816d3fd6c1ce489fdf03eb69a7733d06892543f96c23d8b5d7d906f88a82c31561be3d8b46659fb7b246d9616a6b2273f3c0b6c31140342310a7c0edfa0f4b8cd38e3b66a3ca99441befead44efca9086fd49825127606c5701e818664f32b1cc935e754d8d4397803ea3fb196b4e3fde96efc9c45ed94362da409438bb133998801ab0e55b80bb8f59a685920f9e4787d026bacb001a7e47cec501906c5295877d22b575977a0a64bff6fe1a0970a582ca6275e9c495696849c2409dd0680d765dbbf089c81b910d62b8fd7ef496f9a4814018f3472671a7eef65b91fb21bbe7d3ee64cf4c45a13c87fbbc1669b3cd1847828be4c60a42e3a2684531fc8126645fb2846f039c4fa87b4d84607469f00ede5c4088ea843c9cafa128c9ebc093bf510bf1d852dc755377aa0f313bdad1d50fbb9a4fab8c086468e8a29fe5f08946b7a409769db58f991ac02af25335609764609b53cdda8c79fd78b48c68df9b27d05105aa2dd314489284d7fdcb35f6e63c35184f6181aa2b195a8cadecb71ab8aa46f6d5f7ed2e5df7ad96ed61738e535649b8fdeaadcc5b0aa4126bb0963c27d633e64fc0203efaaaf4febed78ceb136394868670746bcac17e60b72e488645ff9031d918bf033ff1a299697a05655acc50f97df06db3c2b705b4b6e7a4bee4e270c99c15b6cb52b3d63b6ac8e1002541c9b344d2e2bdf36591dd740e9b9247b3bd61eb08f039b2a2ac3743d47dd361f1d9236726197fb5a423a9ac1756a2fb05fc70ce7c19974563601b748fb087edd6c1d676c80a700ae9be10bc4caf12d1404a76f99bdaaff18f406196e12fc92a9461e657d8cdf497066502621cafadd0478a149b5dee59aec5e94952804964730fbc6b3320230738b2c5dfece9f69de1dcfd206dd49feda7b979e688d320437d1b21d2b5784a5aa793e05eebcd6726f1ec4c7a62efcb9af863bbf5cc49c4138fb9c98eeecfa2f7b96dcdd3dbc5a2a0b790d9cdbd9a949c5a88ef6fcd282f136de32be9f50a0c7732042beac265b1ae250c38a120b86166fb6f23c49a786a45c02ff062dd6bb08af35fe2c19d9c5134e67c5cccbf9a5dcb364e847b3885d8125ae66d22923bd4a49f67262f2b549425c7375da6430426b6c7ee60861931e69efee2067a9352b5ef4f5f4b498193c6b31a5f7bf8fe3717f5cf60744907e3d2c03b34c2c9f127fbb27796d917837bfd0f29608af1699f9d0e4ae752bef1e46389b962625e94f0d5e2f5edcb457e41ea1c05a9615cbafaba27edfcce6e8f48eccf42cc585bb7ce7af240b3e08ef90d7135e114a510ffe30d2110a2e1da40d4a722579eb15cdffca302bac312542be9b50805c28a1520cdcffe716bee1859e288c5c9230110c07b6792c26fa3df8fb4101077b83474b8be3ebfaf6381ce56faa34d3bbdfd673c702b1c1bade2725d0a40194bf6e62a9c6a1d92cdbf74a5256f28e38b363799140bd83606cae972e5d64b13dc99a6150b1e7093af0391192adc2fda825e704d71aad1599d504987c091c50795ad773c14b7c18d5004f76c5e7ac2a10322a62bd1733ec2f7be0df91d35e619c2bf8776877a68059887a9a32327d893e71d17a058595924860caa68104c9f0c707822a1401b320798cef77b2e8d4a7bd7b8feef37dc3a4381e847a487976a36e6e4eba78d17864b3e51ef14549807bb3834e67577d34aca84a942ff9a6c8f28bba57db9608367099a20bf044a816ebe892a2162758370e3e1fc225beabbad3db12c70aec6b07c613381bf37054c73b3829d7f44f292d6936ffef152fc64bd291760d2ee530498e40d0377642eddba87b7a85a5422d9c29c0d88c538e3dafc35ab3c13bd8e35d807b1e0dac2d41f17796f498f11b8d03db9e9c7459a7290b92143701d17b9ad731908f2afe643b48fff107b542304a2a558c5a1be7ccce5d225ca7d60eb26a57568ff3cfd4479ede3f2585727447d2340413a13c0ffe3fcea1df0dadad0ce9e52779d573c956c3da6515b9fc4fb3c32f7fa685a450e8be40e20461a91081e7eff3f8014336cff50f67822b89deba4b37910945796090b858439133c8bfa7554d187ef2430ba2a7294eefb069e50444694323d331b00814c0c1f675795b940f3323cbcefae43e0622664a40d5dc55af66b74eb04563bdb343e2441fd7c25a44081b7467961e6944b41665ec389e3505180edc531a9cd5b1f1d0d448d7ed0a05b253806d001b755633738086256b186e211b8b25d5d619e5bee3afd40fac9e60fd4211c32e4e6ed3bed29f422f6641cc4fc184fb8c23aafa5150ad54dc98e317ece0bc84c1dedd51fe4afd233425e732f97c28b157b007812750b6b5137673085553d874ce58655c56c82904daaf82fc90c555c9475bf1dd791188b074bc1571cbcf5622ef32ed146bb57fa9cf0ded6c8323dcdee21842c9a921ed628130bf8bd5e5b820b7f89f3bfd8bda7b84959b8fb6fe7455fa2125426e70608ba051bf6ec702fa06ab9dda8a353778d17b5240ff53caf32039821d8e61c2995d56309817d3269fe00ea83ae90b4ef1065e122ef1b9c04b434c1f08e3ed126d24f92e9b09ff38a5bf25778c39cb7694cf717d2e2cd8af3a70d9617c3f7570d42dda6415aa4de7194a8788a0f5be8d1883696c5ff990586fe53f6491beacf04533828bd0fc36b895a9d4ae6830bde8add0942c95014aecf07f653ab874300054d05ffd0a4c85a20f06fd5a9a90982b02a904b71d65101b2d7b442c6e9946d3d5fce715e4f3bd0d0794a283681c2caba238210595be85e36b9fe01cc9700af30e3be60f825e1fa6f42ed17db9cb13a8d90085bc67aba72651b04819649ce7629e00a49a4102e3027bd3d9989fc3ce609fa115153395796a2438e949b33f72a17a35c59c7b8717cf3f2086107da24ea795cff62be83cd542fe1a6abc8d67b601fa179e8cc81dc88aaa4803bfaa8638c392e7e5fe25875eebf3eedbb7138de413dd341202c29dd814e0504ce525eafa7eb265ab48fecff7c855461f2f49d38182fe6e120122ea7d2cc6385ec17e83a912f37f22dccbafefd18a04f063887787a21749aa3f03604641d10e913d06c2971aaef841d488202a73e222e9518bc45a30b79cb632b1d644d1de7470d5f2b730d6fe97dc03177600f4706ee32d86cfea01bc7c0fc70f176de737c873b450fc517e506a4fa16e31000c9cb3c9a4e91d14f31c2abd6cc49635b3c93ef02827c794ae085fbdb122783db76be8a6f10615da11998223c38f4f3fab9eace0e1a2e62beed1bf8ef1ee3ffd358cdeb74f90a8c9c0e1efc356d6f42554a281bffbc424d86fb7ffc1058a78ae1f2bc9f3cbec96e5e08521746c465c24554d201d3e34879af66c2f51cc42730bcde709126f0f02e571626f3ed10b683a105abd695e36b754441193f510e77af0c9ff4b20fe5402e4b3c1e181338edd3f81b33e1770da08014015b4d2315fb6d760bf7a15dac83c6e730ceabd9e47bfbccd0c78208ec4288f977358b7f4189bcff5263cac036779f4119c46296cb216cbd75b301bdc21f75ef35de4334631a00d163f8410c9090ba280af2593f21ad1ca3075cfb23fde4bac35298fe8f32cf0db35b1ad13fa812c18616a541e4db00be4eb604466113e0800ca75103de7c4c0690d6afea189fb34a06278d1d17a655f66a05cf692620afe08c811846cf933814162e1cb0bc8fc83b953bc2804047e81b015e1f5d451e162d560f15d72e990db5207ca96433b429153f23b1a557fbe2a2c58c7566c78a7f6acdaf04da81f497795c5c1ecf09bad79265231062616b620572c47902264a9171e7dc7a3a547a5b27eba900d01166b4b9be2d5260f7d75c8515970569f8057169f175cadcfaf1ca0bc43908659ac30175cd2323822690b2e48e2a8754a6b082f4b949e298f0b296da72c9b0defa861be75125e42356b2dca9688311fa3d626fcae1771b155116479cbb1e923dc929e8816339f2442cca3f341afdbb770bbba03c9c7362e87ba502b7ee51b1862b85615cd012cd13b00a26cc32192b3faa463f911f69b0e9662fdb52e6e623c5c672da7e4e172137daabacdcc88859cc875f2993a8126e28edf500c7e3e2d527d7a22e75083adca584a35f5b01dc1129735e59ada505ea53fd44040ebe7965ba4e27072d993ff1d2c6bcfe12ad7aed8635d3db661518284f0302c2e8333879422078a87db31fd6fae8fcec7b8f0115f827bc41341d723d42e0336c224353f6853db0838d520792fdd6b8bb442ff66f129271cbb704451afde251e49ca1b81a37f15b7f5ba63b57d41b82a63252866104601e204483e4e7d7094d6bf143cbdb863b9a41d6841b87a7c3189921f3cd45315a036b401c86f29ee720bd8e704ed3c1a2d1129ebf02ee80428c2a0d211c846de8947f63b86c668b480da84e15eb0764fda0e5481d1b114042d0e41574f42b4740d1d71f4985678d136048567b2d2c232bc171dfd51fe46985d81acaac42dc1c47ffe5f23a472c53dac1e0b06472a85df806355bbe2c859e328bbdd32c9d078b867b915d2850db070fe7d8686137a03875abe4c9f23d0f5cb96c9972d5284bd4cfe3eaa31da16a991c54e37dbfe4f65cacf97f7d8b202acd12ffc21ae0b47a9cf87dfa9e2a74f2236247d30e795294b8bde7c4acca312e80ef1b63fe3c2a60473e7af5072ad0c0e9863b884f6b634fd61dfb82d85c2cdb3cbe29f8b367c020bfd6729633d1cbe25457e637182ba068fb1012c645bd0a8c0f9112cfee66e91f21e54266aa7f33306bd82debd0f46fe47ba212fc31c333b70dcbc426aeddbb7ee874903b818a5b031e20cbb5a32cfb2a8e03b9975e393e9ff6fcd5cb3f494a4e5b9dc1e6d774eb32d0f1dd951c6e868a76429ee8f3b033caeee4d487a3fc61e16a9ac192a0f4bcdc5ad2abc6c38e6957efa847ab3f101e7e8d34009a42c1a847ed4d10218c5e9d99da22bd10ce055021d766b3e9c5863fbc2752e53ab5d89d46614cd38898f1cfcfda116d0ef1a56b28f2cd5ef6c8722c3413e32e286419f20ad9fb38ca8e552a539c841f6caf7deae32661537002f51954993d4bdfe6e27b393772d1f46309ef8cc502817970a8f84b08a918ac54da15005b94af84e6ab5b50aaae8bc3288423c94465ae350429a29e80dc9981e5d10cfeebc34e6b59b393770b0fd3f18c457aa8b1504c06157e9be26d5d060c2aa40382e8821108ca65c6be66a47fe8b433af3bb7447d29a4c798b728010e46993e02b6281d87bd7444457459e9162d32f69a2237d7922d91920db6b695fa7cc75f17ef9334b29688c0b37e713e88edf612d476048dc1e43844af16463476ba845225c39c20f9b452c9b0853d30e6bdb36fd09f4f960366299384ab0d41f95381c715eee0503235c7a400229a95476ffdcc0f294c0e595715e0eee777440dc4febc14e030bb99a799816965eb1c1dcd659df06677a99e1cbad78cfde9296c2a188b3bc537f0650358f451c727261fe19ff1fc64118a172fdc8721f6edd099b4d50a1e4613bfa13022916d47f3c389dc9d44a6c536ec103dfc2369a50d4ff0a4cc051834dced784c7307508f464e1efb0dafef27150cd0c82e105edef23e5e8152212a4482cb24f06081818993308e6478640f698a285984a8a94347f99dbf2e83ae183697a8d1246b303fd737fe6eb3c4e2b86058d4bf6e7187e6b6d328ccead2033173522cbce34d380750a5fec959630136d94d1eef9ca88cacf040855e7c54f83b016f608f852ee1ba53d18209b8f8f617c4d84f01b62eac7cfac35794ff1594055504c72caf35fd9ce5e344bfc7bee564f7b0fc9c4c01a69dade3ca0636e5ce1dab0316a38206626df3c55ce8464ca9fe387b2b93f42338e7d61f8f727b039039cbd7892b3077eb01424c2305fbc75f69f45ae9edebae23130adfed7ddc5f1d0edbc755d50bcf63ffc693f691bdf47f482730be17960b3309704820a1e398c026301ae15c46bce50aff39be69efb569d59fec87a7fc296f3aed95590f52b2352cb075deed3d5f45cf8558ef58c026586282d332fa95c02846bb3e9240da74ca10cc59bafd27a45401087b6141c4602975d069110bf400b3e2e9e0309368d1b02ad90f07ade0863187f1ee0c594ec2ae52723a0cd9edd8ff6da092943d898edb1d0797de65d88ca3aef38a5e8209b194799fe0f933e16dce60ec6eb986b3848334f866def0df8fba121173ccd2e60418263defc666d98859c5bf8b80257d445236d865df2b4e608218f3b347610bd917170b3f59d9ecb24a448664a334aece830350256781a2245a5c4f8b0506b7f144f088f1c8b9dc89d3bcb5eb6b1eb3b2cc15e07e834a5ae660dd65888c6e9090ec707a65b83f6cba4cfa4ed6674303f8cf0918894034123fcc78ccb6815f89f2e92bf9d099c2b99067620ec6d343e5e8c431f9fa86f350ed081077f7c7466275d9e46be60c4efc80101edac60291b76c511213ea922105ed3b32a61e0ad241f9569617bfffe0f09bc001e8823ae2696e7c3995e03d4614adcbc88b6055e150b3ec9c5f070ac64dd890e3579261c6c9551c04a33f4531eb913c67857fe34e90b3ee9faa13ba3f68bd39284b81cea9955eba350c50f5fbf6fb225cdef6e16ac8f2d8d022e269e20452ecee048c906b9dbb663a1cb6a7e72796f88dd3703d1c3c1294a72716d21b3ee823e98b740af5956bc20cbf20b3ad2050fce26503369b8aca792294a12cce068e09e43c8d1b578192fc24942192b788c495399f864b556a364458d41b5de63a2ea519daefd1cf0de8ec3f9c2bce93b4270de22d54bcea48d1b06a8e5091c43f5acd6b13472d5c4e270e0232cc38495f5e042ce9e73a17b69ab940ececcf15bad9db20eab74f07a966e72244d9c93c42a1d9a690fe77c5c57177224e88bff82888d79e6b966489e01883304c71a7ecfccbbc568b046adb07b454928929616a18d289bfb9dc71ca8be6b337dce06fda9a7457b2adb04e0bd6650d0038f2a915351d562a2c2e30dd920d9523ccc8a0dba4e27bb5facd749e035dfc8b2c851365d0d7dd5d9ae07351b24105178c3725fd7f3bcb8c362d127674876b01bf1bc19af78b4ab0682ff57835e0861da5f9eb11a81daf48d0cd6c6de424a7f7554af3088153693b6842d8545cada90bf2b98b9aa4cd2f5234987f5811ae12b83215e2372e3d20afa7bc91c3578b2b373c73c34dc471bd5cd5b662729fb88d7e1f9dc03de4d64f4bbc302e1828d7462d82dd3d9c000df25e7c8a131dbcb56d04b97a689b3adeac240fe63397aaf8e82edde9fa0f205d5cf6c6d08b00e1f001f90c426e8d0d49f81d340cd08b01ec7e38d04632a303310d05d0fe213d8b2381d8659764fb09458830f2731da3f8612e00da425be95eb189b1fc8735c96ddf671458cd0ced8d4a149f32ba90476073a815e58116ae7ebb62bfb8879174cb8fbf586e6b74ec74aaca5cfe2d9a110db29130fb9d4b783285946661fb86c86c1ec0fd95818bb8b42315a70d4536f1dad5c83d59eec033b5b4e1506418ec14ab3e5b3c13f0ae6f24d6fa1d3a5748a4941edf166aa54ab971d16d146479744077aa8983a149deeda2121e15af35fe934bde0315ecb7b3fe3546d371972f97d9788b983df6d30cd12cfa0715c0bf4f21259e9b3afd7a44241b27fe3fa56630706181a5ddd858388524f98066d4625a9f8d3aef0e316d24790516a7b44b923232179d4cbdfa9395924dbc4246aa58af90d0cefb2084ba79051370bf560899fd295887f58d677a826aac030850b0ea8f1cb8b1f2171f91ac7fd3e6eaeb42f8f50dfef624211d096c11375d2bb7a06eeb692f38f139848bcfd5018a4dc574384303bc19741ce1f26c663461cfe6b48775bccfd7f40b9821e70a361e2e56d0bfd3e3e86eb9026804287233d8ef5a90165907e267463703124ff4584c0275e5f103a443b41b0e8313b5e77122ac63041cf17f4b44072038ece93098ecefc0fb4af0b122fa96d09e2f43ee1b524b9cb0d2d1e9341f100595a8963746188b13785ea0791724c5704de8f5dc06906b9464ba420bf06aec01dd242a5ab802cbd9185f5b73fe93015623853be18d99671fcf69005c55dd0a10797a3feb77850ec51daf296835b64fb776b22f6ae76ee354c2a7b127ad550b28b29443453d97f1f730e7bff9608b89048cd071a50a4887443fc8db2fb7295a213655da488407897055b4cd21166ce7a0f01134e145b631639d74426c706c58171a8374569333584612d6150d57ea267a4b289989f74bbd64f5c2689a9e52c10f9dd5eb632cd4031e15f049e93fe7880a40dd770711c83292c1d4fe1b2102192e257a52a9017c628bb400b65d458935749755170b75adedf9a6a3df9f8d971c20eca6d9ef709d6bea672e38910b798bc24b2a1c1f4e907b9fc583b8b7cda73d28deed3cf550c6c677456f5a5aaec7e00b1771c1cd2aabc09210294cef768983309eaed4b6f706611430e480f83e8e7783064e21e4b6d6020caa49b189c357f316b3be6df0b9d0a2905839300652b45b6ae2f2bbc3b3348045d288cbfcc0cae93791b0810e19ffeb19f7535d047a38a327d14176980f35a0f2e10363ece7bfe32c8cb68298ba7ffc4aec24ef2cfc5b7da4b1516f8c238ebae4c889c53f304ac326d0dea8fe033e6b727f3b60a28e7759506932e4f4a8d03492d8216a40441a470415c449c44c275d3f3150210b3a13a8d61edbd7adaa08b01b70b7e6a96b4f1f13c543e7043f1152627589d03fb8f34892210fc5db236dfe7d600cf1fef2d14a1b8e3a1e0eff7e5b33e96be93f737ea747bb5835a5bb4feec23de6e5e74f45ae190903804402bcc2d3123f72d36607213f7ed37c38ecb819a8d2e5f1e8e410690f076853d676e9a4e944d7341f6885c1157c870deb08fdade34198bc07e38efd2d462ab8ac1fa42f5c79321efbbdf9bb223e0f5a52d8642239e7449851290bf0219ce7c6cd195ceabe179f7f2080a3945b5b97e85b8a108058d08627adcf10da1d0db11ee158cbc9714bd32c17716f10660d2510dff1e202106f4c8e195f575511b3634949cab6a0f1ed6f0113938c0d5dbf655e385593e17ce76c47385214fe25baf0d123880378242cfaacaf3788b7f8416c58fd7e502a5ef1350683544ea53e880b4c9eb553ecd75216fb251e453f3bf087741ce876021237c52be0d24fef27ae319d9a3c9e7faf984ed1f3b6f9f900c180d08aed143f6458e37ba809cb1623a08f29344040c697196b01fc50eebd7e045978016e480c28714163444915622fdab99d4a7c88a2105d15ba90291ed2cf25dc8a62a93d12830992035da78f7e30e541502322769dd1367dc1d3465a63835f488d3e70bbd673469c58a39403b92d78fa3a7001761f7e24ce2b0fcac43f000250ab3fee513791a25f98b54a7d6214899c58f6fc5228edeb13c0e07160112fcf9047be5c3ed74364a9233480fdb62dc21452c0efca088c16ff5863bf216ae4f8dba0c515dbd5933bd6b48c7a6cd12efb371bac6082457c18875fdf966265e52b9f4cc2ce0ac40d1dd240d1e11db7259723a8ce55ba22e65fe099aa34a74cec5025c568c7b16755f2d662f382575a370633baa7c4a3452260c4fe5f131f4d48cb316c7fcdf89af8d98b449d9e7cf715d68af8782b924e1410b5839953a60f6353dba9ee6c08a7f7c1a940cb0528c03c9de19a307a5a4b9a3b75310eac7f0390853e41b05908e17b2b0b545c95230b0c702b2230eb8d3def6777981152dfa3f9ebf44f32618229ff16a0f13730ef2710a932387bfcdaca370b724f77f9beb2c670a7ddfb41471fe5471e7b04dd130336a5de35baaad43c31bdbdd5eeca430a032f24ec14c88032f7a4e73c109c48870b30456ad3b0ae6d83fd3bd4d3ffad91c480a391b40555a58aa97a8a68d4bbec3ded9a7680df1ce1d1524ccc6cc22c1d70bebc8ff5a095315e6f5090f073b2af3ee4147609a2ebe3fcb9f1be6c740356e6016d5ce1ed32360c4b13f7108bf1352e4e68e8c924a7bc1e1023f0684d69545b0d1abc99eab2936e8b53f13f9e9e9f2597f203e019989afddb80319dcca3abaa0534d803ac99aad0eb724576f3140729c25a135fa0426c3f457da7d5d259bc427b41a43a4afc2e277f300035351a3225cbf7340f67532d762b622c66e409802bc6a3a3eecdad05ca51d0d0c56d90be397009b10f5fe5113cc9b7512710ec56609a545e6e688f4037c61c59f8b9ec58241827e7a3f08cac3fa67e3ae8c05e0d691a5d4ab5ea29da92fc2cd09a0b0ad113dc98ec213e771ffb285d5926d68bb98357c52fbb3f364a10bcdfbd996fbd6f2076e9f1cfe0ed1f197f2311be12ccba709ee76343aba8449e8b4e71dcff4cb6132b6756e58a0292fbee1657d202bc629b5586cd075e64dd7c9ddc7c1cb0971e386045af37d1d3f2a6df5755ef1fe2d71abfb50d0c7300d2000d4a6406a1a71f1706b137a0ab6a0eeacfa4a1086b3193f6115c933df268bec1e4b2acaf8a877a0c7133a33d70055bb8672ec9d1828297dcff1b68053ba987154ff729fdfec15a1321d3e1b4680e6c096b3c004aef2680d835b10bd8489fbd9e35f789a767fd8414c888d5e00ccb8b0690d9571f2c6e5065e6b00fc33fa6a7213745d53d62b182338db7712fc9d3c181269aa399581ec6a278c59a0b5fa7f66ff1938f1d2939e903f1913b95532181b5c146ebaf76f18c0e9e662180a202a464b74c48147d4dde1fa983b7ae6592d9d779a84940fb12f89ba76f36044459458b6c534162ddf17d15956ed1cc83dfcc3284ede935eac4573a807324d7d23c993a3b181d6c12f8093cfa52e9c14f122d0518aa9dee8fef8fcb28437b5807fec4bf78bff98991e58a04f493d94d13080748fc5337637d80f5ec45881bff2bf10a6328a4988be1618b1b939473e0d275f8af31187a86f71b3354d344383aa85f936d559caef9a31fe5398ed78737090e809d0cef2dca35b0b0de81044c0e43921e8372ffba9aeae89b01c0cad85da2ddcd51d3d5f660ac66cbeea099ce41261d2de166b0054a97b1ae089d3433c3696c215f224d4fcd410e55a74fa5adb4abd53951cbc2278f4deb65035021ec3995a53a77a9dab729dc3fac7c6abe0ba91f6690e3919e351c75bcb511c80ee0d8092c953f635584523b63474c48156222baa1eb7cef8c8a709b04d30fb4e59bbe7a05f3b201bcf13db03f4f0aeea427833cdc3ea9765c316dae12bc376cf52ec5a36d7995b7d48a972acce335ba2c9ef37911fa16e7248605d2092635643182ac871da023ea2430b90cd97bb598bd3aa104debf92a68e7a63b89689214959cbc035583dc921205112e4694267e4cfbd37957a4181cf93b42a66cdff17208e3a865c263588ce68185d1f67c2d9f270139a92adbaae793b5ef51f0ba0255bb46dac8b3ba974960484a8732bd7b715972102e1b59eece8bafd9c84a2ce17a416282bbaacbb8c481b094cfe1876a0f89c8b95813364fcf6a7814c3580453a69febc938faabee35ffd7209306b61f538356e7dcffe52549a2981e77a78a72b3361b7cbc17c46a39ad4ec75eb5ea7f23d6400ee9c8faa7ffe5ca65a7a8ef802276dcbbaab874a419867826a5ba1a05674416da854f6f697ce83ff4b4a26493e07691172677de0777efc235726b90f3fbf4176bcaec865694fea164a2f42d41f51dd2419947663e6f2fe5f0e93fa93526dd17e30e12b1ff926f8bd6ff7d82c1750966ce416ccd86e86783faec9302f43115244577597d4d9f5072d1bae433836aa94db5f89ef4879cf51eb2b539dee0f5722aaaa3510dbb3b1e9c2d05e96630bdc9be676645e1fa7f7d8c02e853c8b30abdf648cc180ee05585c8e0797bb381ab3457022ddf02311209287c9af1f20c4b25c2c3dccf41e0fbb2c70151f164204a283a02c4bed740cae584aef2ad803e6ba6d4d05adc7a5611758d0f85da0b91e2fe72276bbfce1f0220a989dedc0392ab5f6a8d0fe1a2e7a59743891bf00161c775a90b956db2688a64e15ef40424bfd557ecd6a7a5be6bce824c7d161695a26b83c912bac6cc399921ab894bd38fcf2dc649017b3c1dfeff01bc91334ce4c20664a6cbf1f36764b20e9817fac404a1d8a2bb877ada8d21dbbb9ebeeca61fbbe207cc810c6ec9d0df74d233ece5b00d7f36b81c827bd1654338df30057872813f2b9d7a45bb0565c09322cdda54c9a61e745e859568e92c13e044dbd9f70af0925a2c13b55a265905f1fa68a9ae9b2341398619a3023b28da42965f2d205ef028634bc538d46c1c99c7fbf3b597e50ae11eb14a52fecf13d13c7f1bcdc78d30a0c8dd12ad7e9a88e63556da184f4dc70e8ad40942a05ab640eb2634f1775b702de4deae3a33b621a76642fa4a9a11ed7b78969327c24b39704f61a27468a65052741c64766d1aeb96fef9f95e19f6718fab9b34721729fc0a01febcb5177bd3bfbc16f0370d262d82d8969d17df51598398a4d5e835ceadf27aab48a67a20f12af14ffe8e9934418c8b82df20a0745f0fe219dddc13260762b08b76fc8c79190a356edac58c95edd84f9738ba441e55d47758a6c4b19466b24b74354b234f29612303807a801799081007a53474243e6d91b8c0e89ae4b790dc939db235a61122a102f4f598af203cf1a01b755e8e962b6e255c77b237527216275568f48e79ca3b8db8e776761d1cde4cc81ee3256e6e45639e168ea34dfb2ee62e07369f3bb564b501c65a21075c442e872a2ef2c72faaecd4a08e878d2fd25d2854e06200371ef6190f620a99f82f9559aedb2297eea92d440ad78a3b0412b75bc84a1631aea393f1b57f99c13baf1e89864991254384069dd92f6dbcca42fcd7ca66c2db27fd26b7a9348cfe4eff9b9a95e331a137497531d61d72f30ea0f94abe727c3925744e33c2ac76650a72a09420d923c0024bc9810b304b12136c2080f5bdf4f86eff1c982457f228a36353c35da13c4152868aa2dc180f22bc93afb22c8fc8c27a5141a44c7b5e242f7551d8d4deec95c6cb0c6e0df2167fd09b80a38467438a44b3ce9acc65c7959ecbd3b9ff4fe9742a114ffafc65035b18eac24a5817d6f27a5d218f12631bcba4dd07b339b26fdc3211448d0f2759bf9658027b160d00da898fc1a7a7779a0baf90dbd883dbb8117e5bb22988c5325634760700e16150e0ecebdaec69fe77f8119d73be749e869f77b23a152d1e126a0e35fd310a545acb6b29cf0e64c14744903596c9feaa5152fe8d4fba812541c37c3d9d0c879fe669835b67c37ffe7312f81a18d9925b4acc480b60461d4056beeddb884df9e227989994d302d8c1f8e4fcbf13d00c81720b37c00a2213bdc42953f5126a7cc99fe9a0c49117d7e6e325dd3160e1cb39e2bec8719b3ed9102cf10c4bc958ac2411e01aee2a3d637c69de9bea0756de806332396d0def381fbf1248efce973e5af5c2918828f0be2f9e0b3533be354090e51276425c470fb3e0f7bf27dc08b8d350f37898f459fe69883f4e3b180a37548068ee91e3ed36ba73628b6f4ed534246023f4557a8bf5db267b7733dac3089aedf3065916381fb38b4649552da776f78f6168ee5b7c50e55f03fc79d046565648ce380d41ce5ff1d7a5974da60846e0282979a5df205dfd0d61d9062d6b72d1c6da834e134f0a7842d29c50b92d5c70e901a5ab0434ea4d98d493fee6b8d7a3b764ff027489a242188727045e646bbc88b079d9be34a41c0e582904e4506cc0d4d70a2aa052b8bf1e44e0efe92bbaa9cae1446e99c0bf96d15e04bfa47aab3026a7e1cdf9183b0e30523b37b06f7842f3a04c9c50ea3fbd689a19cc25761e2f6d64ff434da024e86ee9c3829bd143065f113ee7634f8288366512c4e669d10c96c077396603ba25ee1b0423e5b2e5018d83b2a14baa3a2eebd6d590f2a37410f8f8efbc804953f161f180507caed58a2a911 \ No newline at end of file diff --git a/zebra-test/src/vectors/orchard-shielded-data-4.txt b/zebra-test/src/vectors/orchard-shielded-data-4.txt index 7aae110d..2510ec20 100644 --- a/zebra-test/src/vectors/orchard-shielded-data-4.txt +++ b/zebra-test/src/vectors/orchard-shielded-data-4.txt @@ -1 +1 @@ -040e32c513d3f56741e86d8fe325b4bbb582f74c9472ad525bbc5c7cd01ba6230959122b63f3cf0ce16af21d0338e542e2cae3ce5d8341bfb927abc35b3cc8fc1c42677ec5bb2a8b40daf549bbb48542ec46ce8df5c5f78d4c338b6d742c24cda774c9828fb31d05e7fa99dd26a2c9ea46298ea2fe9e92f2fa77a6138935e04d157f515a356c6eeb750fff0ca5126d7134373cc1cb0dac43476434630f687b8f10a6630239609e2e2ea63680a05ab93a1d94236acdb9c075c89c24d9807e77ea914a8fd67366d6c560630c532e6b9c55f61bef86bb9c3abc0d2b76f6ae0bf44532438e10ad83ec0af949a3850c147bee227b1c333c1cb7ae98789dfce93241c313a5f57c7eb2bd92b29dfb41fda873db912e79fc3f93cfd267899c4ace0fd0b3575120db7c646a814d6eeb846c61175a10f17862db7a336cc9016d0600260629dda20b76c4b457de6d346d1bf6521c048473d598b4fdabb1fa1c8c78bfe59da76ce5b5054d852ce0783f4a30ee926402143b825bc577e4401264da49f5ecf3350d75cc4d6c1ba977d8785fef46a42d03c2c37b45713c1f9ca0a59171293dca915dd8d6fe212080f6d3f9dc1af76725b4313f0eded66c104ce064c687fa80c9f43f321a059817f2004195889b1fa3ec05f6fceab3801d6ec70f5581629e9d3509258c6f4d61d5862907cb7400433a882868d3e118897b9137e690b6743f0e9317fa815ef9fcfea465ef8c42345147552f2e6fc2bc9b125114baef5781af818bf66b4f0ca700d1f43a9a122d9898acc905f7257680508a37eae3fad665d8cdb477d556e93adf03f0d26f2793d14a14b562c28259ac56e546088ed498c3e8795905284422b3dd9afbe900566c7ddd27bc15dc4fa47368ce7499e5950d0a5d65d398e97e10128bed6c875cc3121ff2a38abb3a11916aedce71c2aaffb7be3fefaaec4fc290e26b6af6c8f09452c5d17a84949c3f073ede163d5c16328763d2c79ba86a82f57d5222be9c1ef2610673bba8e2325dfa8c99b902552ccafde4f56d0a63a89bb9bb2dfc8834e13ba1e4ab333c819723b7018d2ba9b978d128cfd7bf17ca1b383c2729e17d7cd4b2b7e4f84af2fb2eb347bb4e6a92f859eb72054c9a33a26f50caeb14c4e6799e131f87620b297af145bf8c2c7cb85970313843edcea7c0da45fe14363e487709bf31b840865fff4b9d125ea9386d8929a91fc8396a5b957ba5d8c996c66384efb369e6c914f55f71c50e5d2bac84d279d3b07dc95c339c44e0c8381a3e839cf4553a749c00a14caf20c8b7bff12cf2d42f4f11c07eabda17c2e36c455e3ec61b8e5055bf5511805c1be16d1a692d38d25f60544b5efc5bd29b1de560e2c857921fd4f57f72d3d17c1126ab8be2e96976867eb3e24f828e1f7afbff8d601c1cad8bde847b722143401ea6afd519838251ee85ace5d327dce7460a8b1063d3db3016b0b8abaa979f57ff3b3e4c91a3292edd567ee35d8b3335865e3217b4b4179f8a0481e98102df1484b27cf36a8eede574c23375826985fc4eab71fde036bf086eae0f98c3fa21efc2bb4968ab4c87c417aa735dea256abfe5efbf0e862334449bb173581893602e3b740a52e48704f0bb8c562719baebd0ef54d2a9f40eafaab80233672e7f9e664396cf3a7cf6687959b9c3fcf2f6275997dce37ca836a1896d3264625e7c09e8e410032f3c22abed449f46979bbfe02aaaa94f191478341c8840a2d3049cbff0c72780cf3ceb9cab8bbbf1c2b422fb5ebbcdfff4fcd88d907956d42091fa4d98e23f29df1be49d16a79c9e53edb70f071a4af5b97ac98d2e10ae0511d567f672e353cf10c5c7ca80c8f23b555d18fb1450b5f19dcb2195388e7cd2bc1ab17717a376821f3005c53922c5bb452b467c74db5790531a5ca8cd818f3d6666853bdc43da0ebef77273748ed8a059ae109c5ca625672a60006038429d8759d43d33bc0994024633653d71ec09d8301e8c6e4f93663f729f4150baaebbc894ed2e23d13cb568aa02c83ccd78222619ac45ea6085cc0ef60874e2980439245d189e7b9d9125c454cd2117a363e4316ab72654f9348447d62db929a2e43a12ea1dc81ed537cf5e3b8a5cbcad0268780dc4796fc0782dee77ddf34e3fa9d96025438e1969190aeaeb0c53e7ad28d6aa1288dda94c1543b3668bcbf12c715b473f552abb94436a2395d211f1f6ec7bab26e38324af592aca0d0de2f3bda2bdd42ca1148919ad9ecdc3fce1ad8607677949d445a5b36c4abddf63b328f885461b6227e56baaca18220b872c2eb027f7910e4134f64dee894bc5bd1714fb4b7a1b0a70ff04d38afef289f2f0ff292b137d217c2ae85cc40664a7809fa583f1e7fcc27cda69d83d4709a25889cf29b7d248ebd4da15dd898acd4a90e4b237234f6164b1f199ad6d31e6776a28a619f69b8e32b85ace699bb00aa8d8eb5a9e3a4a3a45ea0949062810ebacf5747ef48b9376c1b61861264757f3d278a0340dec84c4c3e2f80ec6344c2863183cc3e7ec3e9a6900ef641aa7a04da79a8bd43f94a536bf5bcdb055cbe421b7265ee99ee2dc25a9a6385568471a6c2dc46485b5fb2114a4ee684f28f8a4c1f82ce8729f98ebfc3492bbc9770fb605b4a0502c8eb4517259e9d299c0f9498003811ec6afc3579c1e10e3f5ebfd2828fbc47e859eb0c47e1887dc70d050bd9fa9bae8b6a43f171fc393b8db9739e4b3e4a40e1f84d3f44cb06a684dfe9b87df46081c069f4d6da767fd0b203644bf07a81cb99d16ff456e95a152342af9d87594579a9372e013480e931202a6d15bb2ea43bf843c72f7c7350abf446f0cf51a88bb05d5ceed2b3359b0211c5367914593703aba7266d18556a3eaf074f8279e76171d61a7e59b068f9bd2b6c7a0a664224c7c3370efadf7b07b5b07dc9f3b2c3efd9da4a8c552c615ce712ec1cba58a7db4e8cef8f42ea98846ee454f098ef3ec9177de820813faef0ed37d7714521655362d745a26751375674f6cf7b98d0ee6cd4a50328214c22e1c8eb849cf9636338239e5f2e5a1089522bf79ce49c840b2097ecf73e49c8d69d03008f420b371be005b2362968426f7ad9229b9a0b0064839cfa099580a78dbc988757ca03f3eada8d13a8cc9dfe9e534076a43b86ca9a9c9e53736fe13e376386a2d139a69dc99055284c11681f7db86e9a1bb445d4e29caf55e4fbcf0461bba8c6eda7d9aaea0fe0d2ae05cdadb0f667482546c0d75f68de465672101f09c3ee179bbc55d2cb44f4112b432a4751946ca30813fff6eeb447b85a8a6eb25a83911e83786678b31e519bccb973a5d48ee7594be0f62a9e50d891e8fcefcd205d659c4b7132d92b73f98ab83fe77b4fc9000bf7d9faad8052ce6d86c05e82ecc8dfc1756d7a0ad57bb70649f97a1fb04e7afdd19ad65a130bf31278ac417f052b089240a2a5b57889df3c7583116979d3b92581e266216df025277522941ea5508444b7875ecc7cbc5035002b1505710f2e1c5859f1ef40d8811e88d06c56f92e44820e61cc5e091384ac2f159d809f60ff0c2b0d2f92a4b5278e5c7138cc83fbd0e3c41a2481cbc0a2e9bea6dd5d3031547f11dcb6abd3196c5c7e69feabb87ee9389b8e18565a22d89ef759422ef443a198cab949860ba28cb1bce12bd613475faa95f90357345d64ab971496319e4948b129c70d8b554eee23381ba08af2e97de6ae66e5a56e75dc48c55cd627fe7c41a9c95613e6fc4d9e02fde9b85ed2d3ec66a5bec27b664c79fe8cf40e261ef257cd88a6687b89123def41cf719ffcf5a6fe751861de83be45ee724af5e0b82f079d980251419e2f543e505626d1ed74d939ae50d7ea56912e185a415455285c9495e2548777bd270b30a7e4a411741892afcede6a87689417ad0d67fbb44175077c8016653a3d9e1544026a1280b08ff57058eeb30348789d02c2d40ea7bd67dbe3da22b7cba291449c409d24340a621909d09b069057444a4689598328c855e105bccc4be0d1c119a8c919a12ee2196e196d4f2aea3d6d0183a5b5c889af6ae15e9a4f2d33a2e392d25ed7732d08f901add5ff7974740242035edc8602471ee7e1294c4e2a5f9bea4a024debaa9997b75af6da00a6a9b7e0710bd61bb81eb2ba4f2fd4ab89814db6dbcfbbf57cdca05a8f4339eb1736ab9ed6bc01b0fbcd597fe54909279cbea79bafc97838f60758991926d8afdaebb060469b306f6be76962d2bb454559f364f38292ad8255147b5db99e5ec9a3b976e14d1cc2e7fe9c691d40ca158c79d7cbe92a0dbfbeddaf3df71fd4aa10a7a123ff2989727d245ebb95533c39e30195e96c9f846172a3dd80f878215eac5f38673267d3a4bb34611bb76b87c14a57fee266324ed75caa296aa60eb6a1a7a218088ee56ba0256e81a11717e8d83f2d8d50a14d54cb6775f47d28e58ecc77bb49e7b75720025b7414c2b4f690166593f14b746e4493135d18f0bc5c952f39eff5b6f6c169c3784afbbd4b8161ad6b68ff53b4ea27aec15d787fd5627b580699dfc1bc1fb7207194ac006b411859af9711701173964d1248f9da64863437c21b7e2801e59e8c761440e1cca71897a2f458cca38f57a938dfbb2adb589e69ff54572ef924642263999fa6041279a030a000000000000000000000000000000000000000000000000000000000000000000000000000000fd202eb63dfec183a50c9c75180faf17e9e20911576b03a0ee0fc937665d1b01994503dd99bf0f380cd6c7ecc3e0fededfd8730f3344603fe2b4342260f07c81a5549d7bd28865cd581a5adf8734e73c897701acfebc01d8a7818b56df106ae9ea89ad174612702e754c1a395f35fb8f186cbd7b47db60caaec4d54c40dda3df45e40f7a2aa7a2a3cecdf54546f146fc6f689b490e061357880c85677feeac3fa684396023e9c90ec49feea0929c592ce8d3accd68df3e96e47e587046108199914a3854869a77a326ca893ffa3a32b9b0b5021817dad59e40be7fd982208cf7bbf1bc0157ed8ec1bc318708bb4794646925e4137563a3f8b4d84b5a24ad4a871f980b76848eb27bd0b1a6e38856649fce015aaf86cbac4b3b89d7e8a4d43b11ab25b4f91ed8016e231314be8a2a5fe666321e1f270f2096c4d03c9d46bca3f1b559a158aac1ad31adee3798fc2e39cbd0df63a9a3b51e4d8cacc73f18ffa02f547822974613554b464280e7f79b868a346f3216b4853612084e4017fc2b05a61c240ce76dee4c5fb4d84fc499d0c9ad8e5e4a978ef95a43158ec0da98081bcd1b718ada3015f1aea46e93595b671a026e2ce8a3e03ca055d336fa40b8e0af8c83071314f23e9ee5594e66894cfdf70e56322f72edec8f1623e6e3283eb162fe91dd8e92209572353953c7b272a3b8de3173df4804c8ea30177846123cf27f9a572735d8c89fdb28bbbedfe1d95aa61309809961889013efeb50149f47545942b1639564ca5ad45a4034079de3f0941aea5d888075705318fc92e6e78498e964363c9c03a8198724348bcb5a82b3c4574e18db65bc41c13aac6537c3e92f4e44f5ae099be636d1fd1f48ee1e992121ede00177a9ebfcaac8563e0a52fb8b2abe4f130ac114662126b3ebaa670d3ac23ad26f4502726d693fdb38248cb8f80e736e10af8634dbe2dd124be56978970e21d6c0de423ac29490266dca1e58ee1c6924af3f5c2f0e55662ddac5071b6585fc17144e709ad771604e7349a40802569303cf9bae43457f12b8b89dbf10a137a05b65d0a1b7d29bb61c42dec987313a578a6d159e6aaa71b84ca07f0cd110072d8d172d201e73eb2edd3f291c9282c6b782839860590204236eb992b28065c0ec101e62a26e8d5863b7399f373575ab82d6c1bdaeb76893737e19ba32c5141983d02a57ea85be0bea7305de0a253cdef279510d587307f8f09bdaf8713bf7b991d4c010b84d820984b450ffc6fb91199ec09f3018f7723371ed87336ec3f4752765a4fdab9634d399193a9fbceaa73db74477ad6849a6ffcfafa4da0e44ad47342ed8b0e3e7c67a33f41425d2c594680b4ab70a574157b796df0f4ee6867f5043969feabdaa9c5f4b6a5360ee080bc12bc2bf8f7be4485b80d57d69de75871b76e6b7483ecb0d011cab69a87490d067780ff6339ceb136e62f8171adefabcaca912360d16dcca093f1aa9e73d1ede8765eb7e3987d9a65ea3b6aec6854c6c217ee179e96e6de3c294cfb7a7c0ae4fbad816cfbc6fe678529f0c8ce56b9d6978273afc0513eede2a8ef51f67ad4e11c981d4e80fc1d935f3cb4d006031f3c3949c1b69c921beb63bd5b78942e9aa7d105222b7868f4f0b2d940b5f7ef9261773b551e0df7a901927903a7398392bf792831c382be51fb37cb86278229fbabbff595685f9c3fcd384a3ddb6c83f526088c6abd62cf1782aa95eb5d60bebee7609ade4c4dfa0a6d40bd3d9a011c89e8e15a0af5733a2b1a1c7710c1564aafeedeb706ccc687c580bc48324fa5809bd390115e59f19e1de04e22c95f0e9b08a02f09cb8e112d3b87767e4a3b508a816b90a7df89e2b4231da0976a0b16ed9eb7892b2d33e12f81c2d87299fa390927d4166a86eca1961804c6304d610523402b8b2eeedd192f1f9664197db0f8a21fa02303133903a85c1881f6c05626332a0384991911650e320fd7df6c03ab87a362971554bef845b46a9019f43954c95eba01c3d03ac752fa0a8c0edab3f7aeda127cbd9d4290db26ca93afff5c4a84cd5d8d770a4c7447e1fbd8c7fad24ae9fa70288ce738ca5e93e485d61a863587dbf22e7f041af47cf7cc528e520d225ed0295509e28143f1cc3f80a78ae6dea1980b9c875677cdf369ca0a12874560db66f3d49bbadca3f365eff547293c22aee211507f6ff0a86ce8b5b0b588cc966a87c46add27cce861a7f5889849755cc84f846bc51bdcd470b1cfedf870a254783b24cac2325908131a2d84969b929c0ab6b77e5576da8dc3d1ecae2e35307caebf8f61282707a3d1f390015ecec1870d5c22025bdad46220e7ca4ab5be6cc42445bc00dee66b61903718e4e507e707197588fc62fb7b6fa10165ff643856e80eef440bef4363180e48c6fec40eeb1208b8a8a5eff0fd481f6f3974b82e71de0143971f67df93f8b78120793072698df27f97757a56a1a557d917eaf66207b559afe84c9c51e0aa6aace2b8fe9d0e476f8229e08af586625e3b40377151fbac5517cdc21d306ad23cd31033b1182a15ea7d4dcd2a12692211659d16973b548db33fa972c9ffdffbfc15ccd223ceb61eb120cd50c1d38d11b36331c811787fbb7aff3b7850ecdfe32503c5a2f6427c2d0ed8b6a50f91563c5b7d2a44723ed140844f77945a25e618dbe89e47ed3bedc8aba16158befd4c8e47eb86d0d0d13542a86198c1acf2b422cb275242905a037a87cde133ef6ef8a81dfdbc0d8f623da648a3ea9b84fe59f032119022801d712f3123d2977bb2f47d49300c1e9843003a1604e243de5fdb33c54a99f823a1ded91285c4df69840cd541958c53e85e376e7f5ab15517fade002926457e2373d6c54fc2f573b561e5a7e3557d52272c896a6dbfbfad9afd4ec177356df8f55b5673bf35c59c465d1a17bf09c0cf26c004a06045a80b139ac2b8e87fe162dd553a0fe9763c2f55c2eb6a65d672474c51d4677168c8066c3ff618af2becdf7263f4aa346440bb0445023ce7b62be54cd29f99e2c287cf553b92000c73d9227aa0be070f36a5ac52ea9db839bd7051a9ee570e705320a60ee4fc43737dc062a5342c756c0f8a258d7ad8b56337d60d00bf09976bfe1b844ea7734be0b19ff4031721f6a5683e82f2b1cca7b2c9f80a306666ff3b8b5f6601e316b084c59942a0d87de8e4493def573aa4de1d7c4584e65a4a18c1cd4c9f3b251bbad9f9bacd0c6f848d76904416c4486689bbfd4f96c292e8971055808e2c2ce418b279c9c254fc14218abf1ed9ea45b6afdc703564541ce39f1cd9b0db2f70a289f01aa3037f0266fb4138560d43ed639022f25b36c459280224eedb62fb4a188285f3a2c23fc0aa1a2203d2e3ae31aba052c8652d2e50401d0b3b2e92adc2f5bad5fdd9226915b1c5e635951b965dfb1c8968d4fadb6ceac690642a2e94b42c6af61c7466fe0308a52d24e8a52882cd1b8cfbf16be166d4118591c25984138710c623855744443adcbd2777175c3cee08cd3e0b39c4d7b8434bc17127a50c7f6ab80e661ec29e86150c9bf69cd2ed1ec7515cb0f3421c83d7c90f9a952a236701c4143aefe94e015a2f3dff29ab4fb4befdca4cdb925058eb5497483317f2050becf4b74c97ec0bf14f7da953844b245d38d6600ef977e6c049f318c25f348511751e3e28499b7a0448dbef7980383c5972957e2b9101e9ad54930bb32a7eb108fd5520bf9422a03138f23ca8522f6983ac9fdefd5ded8c6829db0f197160f8606b6a2107fa76e0b29599d7d94b1b509ddb3f2bcb49850635fdb9c64fdff6e048361c0a9b3e3080138009f30a7f7ae18a3470ee8e339dfb8b5dac5d13915d8952044824708b2db0363d932e0836846621429913b813468de56bcd4bc987b0833ab6daa14c8b06eb56aad8658339b45885840219351fea5d38806049fb62e237dae8558e4841e222828f4e5df23d2839c24461adc19d169f4828dd305d85f17ea3d58adaeba929dff265f3e4bf519909f4ca8bd4b92ba4e4b60dcfd62d20b13d8b2b5e62b9e5321841d9874c911573502a0c178c637aa977da32de32ec2e18d0f236f755d0f4422f5bf195bc7f3b19b9bf44f634b6c5661af900cbfafccbd29f821b7ff49c4508a7afe3443ee3f53a80033afbeca6d32cf7fa5f470c6aee4e6dba11401d914dc7de3a6db390e01e74fcec11f716c20c4d8ff0d6bb68171b9b9481fa0969050e82cd9ef608d22397677c066045515c63e76db560540471bf5e3d7b9611489065714f5d50a042cbcf06cba6f89281bfea0984a5ea54dc8db95cfc49c815864b375d732d539c18c4c1f3830fa6b4dba788951489bacb1721f765b6b046c42e4ec71dbb67b3d093ebd0b40102ada833d2d34fdc0e5539a95f843bd2fbc98a8c26248a843ecac0e58a42ea82763b797addfc67473bde0b9c0608307580bb6fffd68cb7a0591777e07c0812b302a7a6d7c77cd3133f5ee8f0811a1dbfa14cd8051bc14478ee298893e9c0a437775f34d0f9aec94381054135a17d752bd235966c682a50ba322ca5da452b613e174bb5010c6b95eb0f12c9560522c2b1a24343c2eb8c3323624c2e5637cebc28a3010f709fd468b6c6ed74f6bbbf5522b017ef3dc9ebd1c1ad8cc07df3bf080fee215c91b7c1e30b86fe335e2f501712b23e3d69ba72cd110bb81d3442c9d7b52638e51d3bada35fb5a02ed65c70ec6aa3161d52338af841560d919ffdb31a86373f0c8a31e46d9ff8063036f5036da590efca7b01a6f386e3b53d708027b8d0225e951f1cb03c4098131ef76e676f7d635c165143aca381954feeb29e0e78bd597625b0aee48fe7fd938116085ccee890478fc0540a257f3a4208e89f82946f7974ebc50161ef1cd7479466ae09fcc690009904055502766f0a887ff26b9f1fce93d7486997eebac3baa9d5fa46a9cf51d58ff61bcafd16e6cc94ef19b02631986cecacd1fc2d42b726e0d478d4df775220cc6d768dd86e415e8f22a9d996b9d7cbe01554943d96bb68398a79f6f65901e9f79437d285535f25950ba0dd2d5f1ea73ea2b061e97fc52b2dc9195812a5d2798f0580b28e99ddabc874fb3eca46291cea4ddc0445138a55d13d0a69ecf2e1a5b7c59d15a89d9f19a582cbc71291247145c5ca1f6acde0432c587ca56817f3b9ee9fc23b2c548d79a462dddbeca7432ef50032b3faf863d57968d87b298c31986646188d02dcaf62d958b4d178cad0d17d87a01ef08349510f3e7ca085269253aba020cf46ab6ae83f16cfc9ce4d9800d44667ab75abfda1bf747866daf70326b464da381d056f7be2ea09cfa6464998483f64fc6e51cf64455f66ecc787a09d8f8d427716b4ea211915114517015712a066b8efaae1b0efa9590580e95462b496d561a2c39585873f1327272895bf5fc7866bff8622944e7e5eccb79b5ed002a82c9ad0201b1fb3899503b1f0f0cab2a0b1dadf620c7de86b9d0ce6f28bd28570deadb100a4630be42f8540de8074d12a2273bdba05d558f76359c36237f051de216eaf2465a2cd1ea134eed0715552ad618bcbc8e32c2da8780afc07bad14ae50f9e047905f0b5c214fe2127679a3577a03776dd6ac8e627244aed735121987e2332ba11b8865b63a92b63330881d6f721cf05698375e7e20496a18acf701cac9822ed7a70f46f8e1ea671e16aea1946c88efdb7421c36c10202b8a0ff62fc174d03ca125235ba119fdd186cd1afd00cf3d4f21c7523771bf0b285e33a81f026f32a19b80d65e7c024e6a47c3ca9269d1d7f6cd08c8a6d0fc30fe0e5e7e2dd6562306982399a56ce3f5561ed0aa369e024ff5ed0784ab0f07ec45c89a982709d461016bcefb4209d51c439dc9eb17516bde8bbfe716babc7ec90fbe2a7a0ffb9e4cc2b391ed013bcde71f97d626cbfca3e902520408c938d97b1d2404731135117a3d02f5d33255880ad9de456bb0721ffa1f45556e50240f0067a89da21cb0780f7b9639e0f5de544c479084df126d223b0182f95fc4f59c0713a6e8763300c95af3219fa52e2df46a44d45e267d2eed491f8ed5d67113f7f749c7a4622f14745c70139a0f6345251f266c42fccd4276dfd2be05d61e49c70745af080e05beb6754db01c38fc3785c850e7ec92943af78460f6f1480f5bc7e649d934a606f4a08f852c858bf1dbfee64ad1412951093a611456afa4da6f1fb556feeaa43ba6c8eb771858f37c5cc8c88f13b0827580e606926c7a7ac9a6a384f803c21709db347dbbffd36142311e1f83d2a4d8feb18026473f791fe3bd7ed031ab1ec61eafd8babebe1e1609a6ee16c03c8d07e80c79bec581572023492283170580153fcaef6dd1ea936ac1a321cf1d2bff16a6420c89dbdb3889e1573dc0854dcddb3dfa33e4d5b391ab13adec624b61f85c1aa2a7edddbcaf1845d8114ab6e882e331cd2481d0d8a9b810346eb82a49dbe7a7cdd15db5f4040932e91ed4d17c3ab609e4d181982a36cfef50f7211364a524495449cb88eb241453d36b5d8564395101e2b99bd6230e9b08f3d093e50405e1d1232297e913ae316d01e6eb07547d613858f92b85b9145926275eeb8f1d2300d44f326f62fe2eaff4b27a6875b50c41008ed13994778530d50a5cba7ab0e211ff396609ed32b7310fa9fb2c4f4b3eed3d08f28bd195db0b29ed0ede8c8e3454b75222cb90c42ed118f8be3c36e71e5f1e9083c393ab85d1f2ce45f86a15a1ef7d11cbafcdd4c9d9360da2856a87a8e606178515264de193ea9b59072b3cad3602d68ed62cdb43944e3e3305d9f39ea01bcb52969a41daca3ab6f49b7a06763a4d50ef7f2054ed850d1cc4deaf8bdf982d896f51b901491f11a23d1b615d541a8ca05c7b91e23db585d87f990d0ce41003995802e183a467d5534b72948b6accc8143831ecbf35dc72144f197cffbf860c020e1355b659e92f85aef876e21fc912203d219a662785c3c38379db19a52a167056eb6b8a6bb944db2d6d6cc4093574ff7a5c6419afeef65a9d56c1ec76cc17906ca2cf2184879369af06afad3502c6f2221b235c55f8073fba23e7391da837d4318725fe1a378cb7b26225d521230de077e8f9e8059184ae63f3c1ded8cc1f32c4b9c9018e4f4fbb7a6058fc7acf2b770a6fb82a34943e402b9985961f4b0489360ae58c6bc66fd7344d1463e6a22a7f07120b322e63d9068bf3779dcabc0373f33c5d68aa0569eaea14a7ef3b3d5aea730514b8ef8b0f0a9da3721e0880286bff7b5c5f51d7b60c932adfbb959e921ca3fddfd5088c7887c21f6e6ac11920d360445e0fefc5cab84f37e22a76e506e59b0c52f5f11d61fd2d2dac4a51eb1c6ad78e6619ed4be91b3e71b6728f716e4529952e32c0a8863a5e872894b0a72d4b620bd26994c6aa81ca88bb4d531d086ebc478c64f94cff026d9c3a830b6906dd75d3ac050224a8992e4d3f4372ddcc3da62b82260012a38dbfdab44bc1f21bf794c23284862726ec90de07ae8001952e1fbd2dea27fa204178c97986a45723b61cc6795e67b751470f9d89efd7a3ff9886f6dfcaf2b22c5aed0a646c44b918095820f5e296f365f9d13a1c35fe7d289129f3d6b5a3c4fcf971d44a0b1e28297f205db1614976b99ac524eb51c6bd4abd528055ca23a91cde15f74595e7a330e8bfc3ced0adb8134e207ded569985676354f14aab0067e0d8b712642dc97b1af2b12c5a5f7129fd2962df3ce5c0c057d2d45bbc9dbf41fd955858d7aaeeb00eb22e50c3d63e6124f589082cd974e2d22df68fe0421f5440e363931816d69f14c219c0a05316a236f487307ce30fc063283acc9a5b01df16a80b697813b18f3fc66dbbb2f13ab28806d91391bcf6d002d94d596c640896b2f1340a26496fc20ab83bc51f1a425d14ff55d06cd4324ef950301708ab7ec9d2c80bc0435be27b308e281827b687545d0419426bd6969e4d024c2a6073d8e67569790fdd274ea311435b8dd4a0e386684611d369e78046f4b330527a46261201aa49e18ae785c10410f9a61146e0976c5fc1527acf626caacbea942a6801fbb51627a3f1500dae2b7571c19c5fc71113b11c44a556d621f56b6c996d357cd1a6e9d6a9eac6841e0c6fa4095bedea316c8c0a5c52058dd432997663a06857827ffe0e7144dc6bc83c8af917d5127839dcd4f096b365b0f4df8ed0e756adc2c1947cbb859ec90d2a383d7a1a53c8146430a00d5434902cc7e25c62095934eff4c4eb334c04651d89175affe2db7c178255f8896b2cac084437a9494fdcdbfb8ad8a5d4e8d1a63dd431fe40fb97871ccb86d01fdc678862fa54455bd7dc641c3a03b8aa1aae7b0b4e3f4bc4c09d34b863ff97da05f1cf1b875a182e7ff7d08efe7366306450401cf7178d52264de482e6d39c8078ccc68ffb1fd0e29c3d36f91f1f97256860d0ad36067489be6e5330fbcd01a6ea2027c4608ce6816f5eba53f5c7aeac5229acf9552daccf547fcdc7883fb9f1ef2f9a770c7a972d32283ce0c11e8316cc6c7ecb8535e3917883f426a473a84c19468468c720cbe1b99dad19c41ea8ef8372becc9530ba98cad2146b4e3ca6d36fd41b908c34ae59215ada6d200faf344ff3e3ec0d22475d29cad8557ec9536e0c0195c85919db76e373d5d141be17e0ec81beea3a15a2fdb4552bd55e604a7dbb37eaf79e8938614e216dae5a464c99faf71ed6dd3d5d42baa14a47dd061669fbb6f4b45cad8ec068102824c813c7b52c920f521d05ec11b201505a40021fa66943d309830257680ba8fd9583c180ce28318dc21c1c0c8cc2cc861b47a4e84b6efb50211dc37c24a300cfc3606e06f5baa746084b13be9f4753af7d5dc733fa93adf849d2bbdba833127e384d9cef6a4dc2637e0d28633397fc56416d19a82a8d0eeecd7f351350b829c2be878b47ec041c248e4f14f1b9e072f5eb40570a388f7cc0aaa8da5208a401022c16c565bf8fef7ecc382002ce94e16cfacb4d01fc87905066f6a44b1c0c3da6c06fd799b80c05207e303593987b293edeb50ed4459492a52bf8e29b3506feb8304294c1c871e18e8a261542a77c591ab99f8a533834ea476173ead259c8765b7aa2e86770492f9896913e15ec824e1642367f2bcb89744192740c1f8a1a2d88264de051fde21ecb1a800308b479c8cd73b1d02f3ab5f5823332f5578b039d524529baa4dcb5185760051e4a12b6694a9b1d2e15a772a066624d5769533ac8891b9ce3e83f25371de08a31ee61fac1b6af29019838264acea5999151cca884b9a465a162920968d1d571134d0d6987dc09ab4a897c95aa9323633e64fb58c1ebd554463897b239e7f17e0c4a0bc7b4e1fa7652adb0125401b983cadb90767f575d8e5797963077a2537f170de05ed2dd6d1bc0749c5bf2ef205f08fc5e485301fc5f46363131d399e08017a91ea926a253779468f07fcd39b709ed68c6a26fdf19e8b86ac994b19198cf39b21c661124a6e1e492b98f71d13ee86dd51e90ccd9871aa7673d2f9b4a3acf067c1eb0ea5ef6f37bd0c3d6900a775a6154d8ad4b70e29e13074e26acb74c2d09ec4b29447f2cd80f85717ac1a3d47af8692db9a57b88d4661f4b544c9155932dabae26028fe08fa7b93bf14725e5ea8a21a735cc71241a28b0228a7cad66322a93cc631feeacff14e3d3cc70d123bf24fd2cafcfced3a2f1f0eb80d9a5953110cb3ad0e7a93b4f7eeaac7ee1e27d3dedf1ccdac4c7e0f8d010f4df53f26c35173cebe15c5c0c24e475a0a5f9f069a6ee450753f105e59b07bed71a29e3a54f2f2f992f309b8aa9b82c2bb973214f27ba8cc73c85b63e94195ecd2f50afe90c1424d3f9592c296fa8988a6ea14c2ba073db99e72ebe351d994a85211a2c20012ede5d45d66845c9a167dc6814e6ce147a3428f8a304eece7a2e5211fb048abc2e6a409be22c5e75f044f8e8594e21d00a22b91c3279e5720d3438f908d7905d17edc95088bc7bba87cebc7519f2982bef7c5ed8a44849f31b61588e12b6ac012d6820dfcdede5f0958c9cae6494538c14e51cce8c3d08b0e0d5af90a193878b12b6b789d6069106d0e439decdeb48657ae86f124051760ce1b7f27f14b7d5bf1bd2e170b2a390ceceec33c7009f289e8975218c4852f3e0909fd6806fb96fe223cfc21dc7710cccd45fd64f669985e34ac756eccd48e5a12169b30cd7b9f90b2c9bfaecc0f327b857ca2a6c6c1b1e9d59be7b211a5913a29e39af2481b169d1368253814d4476cdc2c007680080c4246f1b3b8008e1e00ec6ad21837fee935e3f619fd0c3c5ae7b03968b2da0c6af35a96f5b4b0373a4548d4cefadce47f7f43b98bbd02cd7b7f460359fb47082d1ba1b2cac02ea5e9082a95f9ed9523bd5822f478cf81bdcbb3b6c0b7f61dd24548d69df9575e625a7f7070cd32d1c76a40e2239f62ee5c890ff634837187637a9a604d087fddc0830233cf8cc94aa1e3da62717c70ebb05a8f92b11022e551962e7faedc38725493fda7ee4d04aa982b173221199dc54666b8cd574b529fc26d3fc3e8c07d0a8fe9c6d294b59dce0c4c5dd0faa23f64de1640f6efcc62c3f308d8836aa87041f07787d334fd22f60c38e8b28df7c6cf12a0eaa4c5d59fee6ecb9e99f7843927cf40d48efc205f739f3c00f2319ec51d4f7b1082da35b627292520ffd8bb1f8810add8f020e30e62ea5431d3f3ffa0990eb8a0e11c4c276b13a5c3152b70427b711710f950f10499ae40be4106e6234b4934be15a66f6d4b609e87eae0e9dc864cda9d9f94d908a554859a31b2267c8bddd35acfc1442f5c94e7709e78f3a1e37ee31df095b4f13ff5fd77a388955d81a4302becafcbeea78604cb5bfb26e11a5f07a05a196e2ac64ed3b6e2643ac05ed670d3161a42c3369d68eacc361d6075b4e5f5a0850bb96ea7837ef2df6719b43add6c1cc2e36cee3e52a52e70f8a3388629204dbf0366dedc3e41504ea29c0c1733f92c9bbb613e1337514499a7b2a5e6923e446f09b4806fed41b27f64ae2d4cdc31650880fb4880718df813109714f1b2ee3e09342d688e707d50172dfa54f84f186e88441766c79c3892927c091293bc53647c32fea8ca8ff021c67826d6febc93f1919cedee4982c2b540f510fd35f517a95b93f6300d004a120d1002254fdb8588b10d934a887fdd976425ef5d9f207d15c69083577414fdf316e804d777d8c56a017aa18e835c4d93b62b5df579adf65f04206f409e6b1491a8ae0c29233a62e95edb8177d9bb209eb9b05715b0f8cf82bd83d109c4601dd25358408688adcc44acbb2bc9c5b18157d4b85d1e60e31a1cdd8accb77e652001baa818d5ea6656ea54699804fbe90cc19f7efb96b2770235cc882b08ed96ef13b12696c499631ff0b5f4cea5a8ba9142cde40a216b7ae9a5bf31798d95a97d30cd9b4ae986d4fd5f5ab2b1699c3c000f2fef990b85c7a132d41a71608b04c7525457e20c2b007748102619bd32e60648c365692fa5c00a5ab4f8d67784b8cdb1a94b7e696a505249a691304a4d3ee851ca9468323d43777afc43bf3390be18c1f53bec28493a373ece4956feb5166222a6cbe715474e4d554319022a7824a7810b3ae8b9512252d59bcf131ee4964090275d9112ddb2f328dad33d28ad1089b0327c8b6686d851a00cd63c6de57e08104c43611f4c7cf3ec035a994f0ac258b312b16d53b8adf090eb14b9705d8a3b2a9f92f3e151afec5b41f9e6a43d4814738abf020d2edc2ac7e2fbab2cfc16e7257f480e2dcb3711addab789f0345d6163bb6a9b4d88beebdff4e853ea7570f2cdda9bbfa96b4743e71aff211a8144ec213c5a06ccf0f6552cb199d9d72825aec07be02df9ac20562c4855b9c851d99743295d06d76c64f3be1d36a0b950e2aa40b5cfa9eb5ae641abab3adbe29bddabc08c2f7849011ab54a66913a320faedba0d40a855738938394e8640cb095dbac128149e94bb14d47384ad413c57a1ad130eb7277070444998db560075354fec2a2b59baadb7e8f6ced51d8810b75d225972b01554e269c71e7f3207ab7fe5281827aae384f06f30b8992ea6a213535e4d8aa0d9cb0feeaae1ef1b42d7accb54bb39383ef3a2abac6d7b9f4bd3f7e87566b08846778355aca4dce0245fc56c426416b5e676a67c5e671835e7ec754b334fe6a850512bf3b48b88fb6479f681bec4257d0f274bc397bfa578b04f91d6b93fcfb81186cdbd2f39915cd4d4c7ec891e16689d7e087a4dd55b00dc1798e0387c82aca8576e81946630bdc88669bd3ef123572437c67ce255a22bfb58d00e058a7ea0cd44f84231b218d3cb008ee0aebf06978de497a69043083f7815c34de27f0fd871cd14499bd49f8d12573410576021599be9ddca83d37938a8f9155f852ba60e49995de099ede5b354f41921a3ac13afe1d868e125de195e561c341bd6976f9f946507c58e41cd6f01b7b8f631ae3ea8bd269ebaab237d5f77d034a4ca82668f2148ca0dae40aeaffc0a0791b61d0e63f8225c6c22128f265fb7e4895d0330c9ab1d3a5d5fd143dbe57cb8a3c8a92212314a21f01cf6fc2d17ecdb1318f1027fb29374dcb0c525f26ccb3387661736bb724e8c4d3dce24f5f8295a4503dca6995d3eaf732cc238553bf2b5796ba20e4bfa912625e0f1621d11bda653aaee277ce8b578ce1843c4ed1cfe05d111c008ffc2f8d38997c11b92bb07d8e4851994490ffb3de4ef41dd16843b0a656c0128d22e23b2e1d493da1ea1b96074d30946eca6a1fe22676f305aca3684a93521025bd17c72b6449b58a883169c8dacaa743c128303ae008caa66ad9c8b2b05ea003f534fa8b3ccc8691d5b0db04f03976b564d10868dc47404658e0e1329f1b6373948ba36a84e3ed19ac331ff5803b84cad3c4e45bb72805a68de33288860b621c17ba220182186aa6b822231fbb5795e906623b5165ebcad26ce7cdbf00a38175a976a22f5743c5d7161183461c295779b9783225a57b07d844707890799462b97046c6008cc0e33ded838f3cd1e87bed2c8918788cd84a297db8aff4c17df13e36bdc686595a58b19d9ad8d55e24d423da1a2a566656f25087c41e03221bf1ae651a1b47561ec91df0d83b36b39bc5b1c285de0d3f6b070dfa621c82d4b66097eaad6a3ce6392af0fd36d7afae62b7d2796b2da5bc057713919e3761575a62bca2220b04c7fad678416131f00128561ea99385ee6c9f0b729a99c760deff928fc4d15e313cc5a2ee7824c201714581864c250f4844ddd6e5a651ec66087e30af5db13882ebbf22f58d19acb644bd9074ef042d9138a8a564c2ff9a366a3031bcbf810e257b722e7b5c8d5314264dd621d7d00865d2db7ed4e5ae49968b08b331af576517b8c13dff72b0cf7d0b189af5842c378c2ca970c273e87c1334dca16787c5fb6d06129d2d6cfa7c1f84ad3eca89abb1cd787a079e99ddaebfcd65b30bd58dbe850ec71abdbdab4e0e859b84bd7d0477cc1bf8ad3704f767816a9390df0c99c35c93586c0dc19f9ad4e23982b0cba3480cf26fe2b9191362f9b0f8606f66822e0a1170cb1b0b78c1634294ea40e9941598db24d479cfc0338daad430a772f68ee90b51354315989c992cd8155095b57f7f74df5459eeba72088e67834c8d22577ee9d0abbb26fe5273c9a6883e77b8cd35e8e536c963dfd1ee91856097ed33c63bacf35a92143fd3ffbe3476152bed910ada62e535ced099d367c87162c8dc6a3b01d6e28e48e6241ff6004b71f894530edb9e0ce7b2d50be680ed73d89ec0c87a331f203e19420a6e1adbd3e5fac03cfc853ba5e40fee961d45fe729b8be4cba60e3d715c4a44845b264c503fc9661d2fc75f01ac79a59138c7b552f8595a7d4edc8cbbc545b98cf7107e7ae597859e18524156d21d6b4dca2afa30dfbdd64f57d5df3ba28342d3a259ad7710cce77a291116aff13aaea82ee171c043ba73a3738e6e7958ffc59eee906885ccbfa2c45c5457afd50d0395f319ff439d91d83db97c44dccefbbd42502cc6a12f8d8cf6f7b27966914b7016870937b063a19f35b73f8655171a315d67a45122efb3dbdd17bff43dc52b14b0fa0d33a3d18df5f3bdeca05153ca1b0fb3d24eadf10d4f01949565b5792a79c823d6714293752a262f5263661971293ddbe6b939c672db5403497f21cede130bc1ac49007f1606a13233347d9108562c1c4e81b96b91e0caf4a4909a1acabedb394430a07fb00650559b3f5b7d213dd137fa0e95c936c315cc6101a0902c46b9c03171507dc334a856c5280a37ae6e024bfa7ef172261c85b335d561c9f56610cc2a6b90fa28d8735b9693b802615c69afa433a3067a05a979ac8fad685bcdfd41087263e97603e0a9cbbf609fa93c64c1a8df03cb9b23663cefd5a06913b2cd6a0999f1bc69b07368788e28e38dd2693f99d5a038ee6ca4e7127dfe334daee14d131122fa831180b15431a05667ffd2e834a895b8dfb90a790f840a3219f303eecd61b01eec639fe25581c58f477f1f6ec75da03cb31f2e3d5dad317322ac6922e4d883ae118155713a2f1bd0770e4f1ebe1431c9d7eb93260eb6a50470fbac26f58ed1ede6ce99173087a40031472eb9146a4033d8856190dea3edc885b536d9c649e3e2cbc0af7d06dd14d3014b3602a5e890d946c0fc3cd5ce3b1a30fac4341491a320a5bd3cf934df7f741753720b2836910695dd1629badcddb58d8ef1a6f422f1ed33f504a2141b1b4330d765193bc40147cdd356d4212e361e6fd63ef62ed9211a7267e65ac94b34bc6365d53463be512a5cec33115d1e5a90fce35d065a3910a5efc0559d06733b13c714124de0b43e455f35dff7dbe3695d8e70dd04c82db0717fd7c7c58c2a1c91335c11a447a9cbdaaaea480802cfd3717f102a5b1f511282b9704ae993afc64b064c7d2ca329931ff82319dbcf5b02853ef0acade36d60383a1bff89ade83b5e7bc8b9f81d1ba8ec9fc738d1c80c9a97095557a85a97b3d10df435681332a4f401be8eb673709e88e0aed39b5437a78817c64f6358ae03053ed49955a842e6397503b7df4e49469b00d2d6da499e951f78aec8f2d06ad0ac3172e512f6b4c37b4e803e5d2f86aeb3fd7549665b5ed5ab6b1ec00f0899424c18ba1264003f79bdc99c1b110a6cedb9f3aa259e731513d0e5d43a053410318f224c6cbd9d9e97c9c316d52506203d21ed9d99d2b2578199bd8d594fc0aed00f253b0244376d22ffa00ec2275e72432ff752d4d0557c08e8d47162442d5e9048884f6f680355d90479720caa12b472e0bbb41e4d79ab66995bcebf619ac863abf8012c001afbbb7ed4c05315ec6f805447bc68dc15ec6b9152035043b9a1ea4fb05ad5bcd325d9f41f482777d700615681ef3c09157cf42ad19a5cc73386b15d9b5e12626608f1fcf48905d8bd924549e2b564a4ef4f7dd74aa10d2d16423062fdeb75f9cbd5ea5293988dba5924a541f1851a35bad00090481a7237d6da8007afc2fb3770de1748870f511524e4d9e45eef07d774d2bb247124c258d3633046e964ae198bc517a6199d3d85a860e31239bd6d719cb6c40a434e2900902cb3bffe004c4d0128d637162975d8c381274c142493c6c81e0b51452b95839ca89b401a66d7f5c51ff0fafc11cbe2a4db5f146d3e1324be67b72c52f22d6850b48328ecc6481fbaae986537922e09aaee1cb66e4c2d5c3fa9f35bfa7995c8ccb53bd6a37958343fb8e26ee0f41aedd9f6249f24c0e5d2e7337734a3d696df99098862eae2849dc455255a1d21db6eab50b2d60bac862358b1a922c5e0ed6fcf09ab42ba82e34d45fdf141706a80926822236553725cfc18edab0066761dd6c6c42afc04cdc7751516b84417ccb95e3a8cb1245cf25f2f62cb691beca7830f1a4c42b94399101ca2ba5446f2f6c397f51be765299c635c01b50a52ee449afd9b77f1f6d8475df7d908ec889b432905065a15e419323c9fc82334acb737d48712db486e84681b96a0fb6f78fa6066eaf5631c10654e8558811f0bbe0ce5fae8ad8eb8350911b684d11647a64f5dc077874e3ec1f9e843128208394214ea82665ca7e046126ad3641c69a9fb6610937f33a9d818d07f78447cafd86cac5c9917c1e9a308062fe98411d9e58debb4dd3e9505d435511963ef6086dd607c2f100bbf7892353cb9ed660ddfa20b06e987c4bdb5c96869b5af01057f0daeb8804786a84b582457fad5f046d9166060aad9e18540c5997e7cd7bbb904b9bd62d25b4e4b64b0349c288909657c037d5efedf4010f0908e90af605ae2effdb1ce018df709f7b18c40c37e728b8933cac9495ec07f15c994eb03a449cb904db51d14db5de6020194fc0221282a1df86098b0640160306b08521b5391ba8a86929aa138eb9ebd9171f5f46a32d57947e230b25cebbfdeae5596b97eb244b8811b942d58639e8e039f08b5819ea3a2e5164b1ada30c8fa8db81d85d1a5ec175d1754400d0a0d213a24d11529123ae156593aeb78a317d3206db9365e4060308325e43bbcdad3ea6013f30bea84118efaa7276debcf869a335e8bc5a4cd96d0c55a78241982109443d554f4380a3b959d9ef923634bce67b4b5e5144ff3e6e1524b611915d001c080511a11669295ce053d33644ccfd89c578f9027e686a67a7b345a912da6c1f3c1ffd9e340a069e23892dab84a4ac618e428c8e2c48ffdde9db565fd8c446e44826a94359639cd0f43b9b7922901c945e818ff81c6112f3f8ee7dae710c75b6c130039f0bf213227abda5d307103ec6c80d637cbc87bc6f539a0f6ea6feb33f34195fe1de92e349ab83b9f254cca1fa16072d832b4b37ca44ab5a6734a7f04067809148b0f17aa7a688645f303ffc24538068936993c2fc636fd6b958b222258b3658a830a6810fcc31ca99a8983730b5b64fc14d4c2b1056353147a2c76878620be0930b0181501c4ec1abde68ce639d8900619f7b0e469b1e4707cd4908e9d40a17e6b8fcd255fe6d241f832858a017a9d62e59b2c2e727a4ec00ff98ad80c4bfd538b91feb1976835dcf974330e77f7d2cc70bcdab9d21720071bfaffc1571201154901a411d5694649e233bf2d6fe7b62a79c901f3e7417a2337ca88048e2837c611181ec623f5810ee0c456f974285f7d7d2a592ace443c54d6cdc223e2026 +045cc3b6c59c9d90456f4f8b1b125419003c02e8e6810574271713e9fc8acd0e09f6735e1cbf9ea6d3e91c1f2981173c9d092fb39095d8bf1437996ce221f4b01c4c19d88656ce46092841f2360ff79c3d59118d598f3e0b3680b102c31e08b03d05388997a9185ca7993a0682cb84759edc134ca918064657d70511b041417d273738f7cb7a0dbfde80c5c79b53f82ba48b139c001fa1efb075630a4ba64c78b7a8ad85633649818d0fb6736c15bf425b474c62d3521813a789acf5e04a3c26a025a3eb8dbc3874153f110430612d3ae2e4fef9012fb9dc658348be41aa765a594e41b72fc9fe4ce1d52b84f07c6c931337566a2a0b1e6b47753dfaed1ec12a1dea45bc7ea5a9001c0cb92e31188c539bd3c3f35f142875c9c9ebe188eae6efc87ae6234dc2f0efe909ef9fb0acbaa5632f8df308b34b47575ebe03336dfbf39ac8dc7580dc70891bdd24ab38807af7640b0ebcb29889cb17498f03fd17be4677f7b25f76229ed64c33974abd056c71311660f3a2aa0a4ef751a7a5e9a6d9cc5ec457f00ede5c6f8bb3f4ab0a7b6f20adc8f573e1610c9ff811f2226ada8af96c403695e40137ded0714aa96070bae6154b8d1d18bb2408e2707f7bdd68a3242efdc4656422f33d06fd550a9a0309117ff5d091037811f851b72c98cd35beb37cabd915b59437b075455682e14ff39e44157a39bee4ef4f224f2f25360d1c2a9be5422c26acaefadb870515cab99ddc363a4dd50213e8157cc23a5d97340a772fc1b920140a29dca85ce49eaf2899655fe95eff424eb9717f6bb547fcce73874484e4695b000915b0b2d67bc5f1cc613eff85ff4c03525fbe84b245bc9c32f9639ce4d101e815b24e7cd2515cf5df0bdf8769e2cea0633fd7e1089161e6a4338a746ce94b3d0fd59f74ba0796148aea7b14ce36e028e915809e76b1d0f9c6f3a4d3c06c9d063c0138e917ddd04cfda0078ac3af6de86bb4e835425e023420d2c4d4296a987992f0d116d120b4f8ea598ddfd2d84e37cd7c3bab725df2b196729cf8a702787f17a600a53ca0125d782111be7825614e73edd7aff742a3964434ba343f8931010e12fe3726a56802dc80992a9d1acd54136090d7569dcc40c188e063b563e81eadaf818a7ece87121dbe117ebd796202a9710a29a086fbe2d1fa97d286914c7d75c8f02b221bfa12cda7cb0cab910b3ed20ac2c77621999584816b06b369d06e5caf992be179d14998a52db593f6271d04e83c5ac70e7dc1cae7675f772037fd1c22e92a73f141ae34c1cd2b875b13fb1f5524dde1e0c0094f97513d54284161a376587cd25d3d81909919f2742b0da795813028ee80c3a63800a1a7efc831d65eabedecd3f22a3c4492026478853c90bdc360e1ad98fc10334bd89773c11dbb90b2884695ad338187875515ef193f9cbf3e9f442a1cfa10e18da2dbde30b152815b74c87097eaff36433e2f8fad167f692b70389102eb84836f325f76979e46e73232388c54166407bb622f20fcb1fe0a58e028b21801ceec0841024184dc5c15201427175963b58a832233dda11f7f6a62c205ac558428536e1cceebcb7e7b7022ca31dfd17f6403fcda3b4810e66f12c4cd161fadf5b3d502dfb3c400b16f9680b8e2ae8af66a5d15eb52d669d97e51d00295d9466db8b7a350c9d3ea9ca1c4b20c449f650c0f20787e80a349abe12145ec6afcdf470af33c3261d248538de147a086f67c71973f69bbb6461d5090dcfb5bc17f6a24207ae48721fd3c4877ef774424169616a6efe2ab577fe1735b4e855ef82dd5e7e4b22b34d022a614bfecb09ea6dc340de5a6ed45cafe3b73b648b1dee649ccdb7f8a9af2ed6cfeb2a56ebb38ad4a2e2cbc3cf82793823407730d5bebe980e3834bd9b1e283fc5a99888cb397724ff0fc49071c6c4f01e42c5aad7f2cbe6855785bc8e4fcbe2c0056063250c8e1e1a6ab6cc7465d8e24b2c77327c32384e686734bd46d00ef7c8188a36e13d13bb3ae926d56c44b0f3167d22ca36321ddc5c47021896a3bc44b28dfceaaff6a020c0352dcefcb08fe20581e3ca81ad4748e99756807cf962f087dcea8e32a472b37804be735b7e4fda13e4b40b86294c8ca091f2c540c0f1059909091242b6bc6d2df6f08b3091647797868a2a9129e383fea33e91691725de122d3bf0eb609f7a3d86ba439469cb5fe338c33b2b6882a4bf6d3b7576c1aeca6532072b61c5ea5f869bd5acdaaf658799ef7501046ca5eaa3952c6b30e46e69fda635acbe5fcbc924590bfbc3242118b515651154c5b52e819525c0e486d67fbb4368fa2840a62d50da57b458828d0a6af323881c897b75c6845c944fe50d58a138eb59eae9983508cebdd4a945947daaaf1100a511e05f2082d9d704f8ad4286683ec2c9b0ea6e97dc0845b1606658290ca588bc6769248e3af061ffdca9b8681c35434859aadb586915010f85242c38f1315e90a109b6998493ff16141a7f63c77577d13029717b99d160c4078395ae8235105f69f2a0f21a4373c84854a4e16d48cfece3457eee1aacb67f2dd2236f53735263eeef27c2925b74e8f009ffeb1d7fdcfbc5b888a182f615623df3c962736f3717382486852297354144d247a4206eb8b277e9f39279c260bcabb778055d3b4d747739eb327576c7108243ff744b273ee624061de59dc6873fabc9c3e9e84b6beae5aa97582e85f4ecdecf88880c7bbe0901619fe51810affe6be6c7ad59a2b34ab48a67c25f9008c6ee5f658d7b667e46607624c1b9fe57f51cf02578507e315a54c55899fb852190962e102f3735b66ae7c5fa84ae90e2e3145aeae1398ba7c01072918a99b2d38e35085c5d4798630d2904d686a6684bcaffa6c2a5c0277ca9c851504ff08817810e724c8d04527305ea99933702982aae84074175e35806e7eb4ef01c248b272967ec0f74d5017b661ec0a6030303aee7f45e1e2c14db5d6cc1d615bdc84413e846a783e8196c5beda5bccc8536b9a2f6664df6b97c7a5e06bd22d53236ab2969b094842c73a61c195c2416ebf1ba8ff83db41dae10a41fbc712d91e84a34e3da3616cb0904f0870047b7683f9ac75a454a941b7c222c295ba3725cdc1f5d89aba01fe4d37da1eb0d2c28165c4a9e289958085d358f18b97273277cdeb3e5ee4856cb605d3cef5050acd6ada914c5f657214a9ddf81be8e3ad2b3b4a150637e09495f9f3a7e25c492bd53e334b649a23c7506ff4df653746d98c2e3579e22e1bb631dec446b7e02cc28f4d52255e4412287a6f75a5141e9debe43531707afa9fbdcb7bd57b7f7aa481f46a6780cfc9ff4c8d54cfa8a3e6fcd6df4d77e433754e8ea55dbc1e6cf96557e80a72569129e8e3f184f7948d08958059e7106d6b99465fae6dfde0b5544209d7231752de7ddf2a1fd898da2dcd6f1d74ee9104a783f6b3ec8cc97226bc85ac17f7f2fd5bf2c397cfde545b443c8472d577fdd1920772e868386e6c508cbf0729a0867fb7dc6ca3003da4c2064bca5c8fdb328a23b6a232a8a5e328e74f686b500b18756ddac9db817d67d188340c37d42e90d93098542fd83ce8f1e2c2644ae202b53aa80500182757058e3ce5d29f03bba3aa25ae02b7046f851511218e1d2e2498c5de1d8f13123c3f2c693b5b113194799e2162eb869d22b111da4d8a04e7d1e3859ed858e350622317d5f9b4d4a96bb45b23d65960ec43f837db4dbd815d596567ef7558a7677e06554e801d7d7e8482d6ae98eee7c9ea70ae684a88eb4c2aeb69286f852b23748a7adba00c09b05304cd0773d6eafb23d3925f87b8c0e10dabdff580d16f408d268e81b0b9281f79e39056b1400a834db56e7bf8e7673f2e54e3a13cc5956677eb28f851ee762deb006b70b9ca79c81d29ac960ed8742633da76159c7f1bb2a40e6c03ce1d1eaef1cd11eb518eb7608854b0438ca4c298703278adf4db44a966a99c428920eb1e0b161340217d3c591ee44bdd50aa4822e30f74a04027a6f63098711e21d009fbec622bb382a15abb446b6fc45901be67276a6b22cdd17498da90863d3e216cba5490f048ba0de6043f966e74bb23813e18e8bce16d3c62ee6cd62f2dfff317b71f31a832086a11c6691580c63ab3fcfa3b45fb38216aa12829c83a5abafdf373c0776c3f0e87df013093f427ce8b63c00ce79f125612bd76046b11203a113ad42d9cf2a1c09eaa70241a78b2dc3227c8dac67496eb9162a642891640125c4d4277acf0ca69b5faf31ed637b0005a6c6284ee9f8e6b324b0f7347995f9d7d37bdfd2081f3d784ed3ab6bb1c6e614e71af8370e7bb7369fe551d56d2f5f6351a41c85e13b705857c9df2dcc09c168f23b4ea435a7b6ff86e0f85d0c062f5326a45c0ca43061c878c020e5bdabe5c65a9d171c86d9d6c60b33292bbd6f68b153c78e8321f95d6a21cfbac33fdf06ddf8dabbd7deb04b005e56996e44661cd351792e9f5dbdd617788edf2a6c8c12f44d182776cc54f05a7132b765124a9941d6e90f2e2357ac1a7c4e23cc6bcf13d5964e6e7c82120e207223cda29163b4e47c0ba898ae5aa8930f0659260daee48df9ecbc61f41a135159b039718ccf5f24bed74b34cc3c4dafbff7b190b9d0d21461f32f011064d085eee5c030a000000000000000000000000000000000000000000000000000000000000000000000000000000fd202ee0af59c35de2acde6a01ae0b3a62c9bd3d2caf0b096c102c5a15d4765af8a48c8f95c3c7460ac3a389883e1d06cb6c82768102e130633c046b2189ff5ee1dd81e392fce0d79de73aee79570c105c515402c09558ae97d12e467c72376522d7ba0d008ed15a94465926130a6a621a119a9fb192621240041b46895523ae4f960e1e0601832501cba204dd21bdb83ba0d9feef83f6e9aff8c213908aceb875b234e3f513e986735d626b98800f15a49240dd367fde841ece2ea04570de68941a277f209925ff7c4850bc5ad6022b72f54db97c44a9f2fc336448838969fdd3f59dca3dd69c582ae63e8d23f04a43aec7b967f0163b25eadea2b0c764607cc7b784249db9afbd7d1509b798ebaa40c7d17d9b43053b9e65bca43bd254f30a0f028b7ccdf737354df23f29bd0a9330b6ccf7a0e1de9f07eb079079eaee76df2fcbbf2821aa02d9aca75f4d78ec3ffee88ebb35f0c8a09409b68d19df988f333822a2f2cab87562684e455cddd40b8ebb9a6c7653810e8a8da0146799f0fa3f74423bad85c35b144f404b93a2851a5ab85bb128c424a93ca7f7f2333432d73bb8783d133ce52c6aa8782802e1bbdf6d89a45cbaec19841418bc99e2599040651b05910fce6d11ec7816ae5f3fc6fa466095db9632a5a0a56a21b9d46959b3590a68ac67a6519d3772f1da11bf562f047437a21a08525e499e2db5569767462d5ca81ba839b2356b036fff7d1fdaa66841acec2bc57ed29f67f0a8aa323c9231ea6a808b8bb120c7df294f21d3a8f968932ec6140c8d94a791346cfa5e80e910d93910bedb1a1648061bbe8b97f3c7ca17c0ef7f455b2bd767ab66c6de847c884f9f0fc7cd9e6773bd26d5cf521859ef444a3f0f668a43511f9b6f28bc6a99758f66bdbc44e15fa5b1ab75e1d93cd588201ef0a5bbd5cbf0be79853ee2010051c2b520bab49c11a4f637c275eeeb03b00a2ad0d80eadc24293b32bd273e2e302636ca0bebdb538b30705544f8446fb3eb649911253fd6b973973f8db4b08711bcd2a078ed04dd12d6ef015a741b188a59cd029e63ae4fced0335f740996354204e06b379c1868fe7a19217935a98ec3ff6b6e047d361b65382d2384fb996427d4cac0456460c8c013ac896d5b4ad27037c55a7a2f57a3f0e96dd970eb7d1bbe0a99a8a415d2eaa0d99812273b77babe1e087235f14853ff81d64a6ef86bc780c7e63849ed87b605b23ebc40e77453dfe9a0f335265538033de3289779f263b91ddb015ed04ef88da336ae70e2a062f4c6f526feade76511bfab6926ec8825e34147c1a5daea3d6a7e453287fb89055dc48b02109ff949cd244556db4d2ad20eaf34d928b46227d52a0be1aadc9711cfef310704d58410b7c5c36c1d529f63a69a9243f628ad89828009f61518c44adcf8b9df89898f39a250f59ab889425ce509e3b8e7055434a46f99166c50f2fb8ccd5ac48b4d9118d499957b82f14710f8911fb26bdf80ab8c89b8eef6e629688a2b28f34b5404f1ad41e3e09fb47367630247da477f063fb5febdae524594959b1925c3eddd0b8969b6f33b1d3b11d46225e232574dfc9bddf31f52d8ad89a710a7de0b881c60db1d6598d4d6170f66ce2a6013883d1f72aad737028d9e737bf2a5fea7f729d0053ea2a3092815dce22b4af57b544e12964655c0479415d160cade780fcd8921aefce94f342d3e716f94c89ccb5600d6f03361c6e4d422e084c73244029b06a67840a34d54c29dea706654fbe9c9bc5e601efbc0b6ad23124d9e9f5bcc23b98386c139d40e641601459f0b735935c8017f5be5d9ea701ed8d5a8e9ab5c2bd8ebceed13bd6a695e10e7448905702a79bf6cac632e4fb0d87c5d48cc3c9ce0ca23d404f15648024065f6b5866051cb713d3c029399a8874800d210bad1bd92e0ee2c296d9c9c1c8f7a68ef50c6216f9be3dddabfd0e0c06715a84e0f40fa61619c432453a2118fe2f8d34c536fb0048f98be576e642303cc337c15060db6169388c2ba6a6fbacc9418fb228382ba5bb433890caef212479391cae581a2b7aecac7896c23daeb56aca07c9ee0a4215bc80b465c499de70ca5d6c1afb9d4a5f959bb45c96f0b11f209ab78fa7950a9a6ec0b18f0c0eebf2fc5f1c7e42c7e9486707e4a9f53a6720b6e207983f5e483e57717be894412ed82e217df9d1f24d802a36a7877837c3d8ef5a6bbabe356f2460abc1399191cad516885229e109381c7adeae45ed4f0b19ef59b216975a838336b146dd592d0b092a7c0ccc084954369438fbd53251203bdea23b561ce25623fbcf792cf9cbb38342f36f65d2557c7a2b048e4ea41f381365a27ac55e3d553889a0828e144f138d3703004a67bd09103eb2200dc09ed195a6da549f6da672041c5975ba70075f91c118380cac44ffa445e75dff8065eddd842f49be359b30291fb9883445880d012c6c4f8e17bc0d12cfc84e41f0f60e6fb315173b8a58e28e4d803b4113f5d092d5962450f06fdf2f1227dfd58fc51292666c9f3f7a0949a3b43cf350c6f7912801f31a9a6ac399654a7e87c06fdb7ec4ea72c7be549c2830f353cdc11ab1ec5ec31356c2bed8cbbd8635ebe1e4149a012fdabf62c6d66a3d2789a5d6026fe5d75f092bf1a63d8c746971093591f975cb8395a6a88d6ed527718c4b7ceb5f1fce308ecc38712803005354da3c5316a949afcd5c67faa6f0b6736450c7532803bb5dfac46969818337114ef12cb886beb896cd89d8f5aaf5102fb2ec89274d9841842ab748b6404f3211b5c353b9df6e15d81c2e519b45a1aef84e2ffa24ccae163a1e6b97c025e3f9288a6a662ad470a86ca91bec93de9c12048c07bfe4f9c8fefb5c18c441e960ea5ea6dacf37bcc35860c002f51a1de027a874d55c4e6d5dd2d19339450f032ac134e142a9198406fb9e0bd668332b2fb38a489774fc0d92627ceabe7f88ef2d2875fa77343a40e7e6754e90bc3d9fe50711dc8e75d07ab03acb806ef1d845331ff62a2a556282a95b5e2e9807b17b0d26f60b21832cda22106150050f5b16a090e40445cac23deddb4580a391b094a0052127e5d24b385f62288e5b5037479945508ee82ae4dc4cbae916e1da4cbe678c14f59aa2cc208da194c75ed12ea4d1850a12b57581b6ce0f723ad0ea8c71e1338581db7d80d5ba45f3af0b9eb5f496285de360cd2954ff2d31e78cd79d3ce89045d9d4c30baff8ffa38a020ebc3ee1b24563a84c43948223fc9525988af471961bcb1fac6193251bbc6a9a66bd438f5879d8537b396ee038f75bd7d60eebc50d29b828329415ac99df50865563e35ebe697a15749a85ecae254955aeea05749a6eba518a73dc7fd572ac168147d69450f75ce9519f1e2349464a6149002f0d37554142e474e3ae398fd3543cbe6a9ce349a4a8d4fbd1be6b2527b87b82a0de8cfc2c3578987b4d615339831344becf1cb99e84b7f273993d0ceffeb96acfd92e6065a22a04a2e8b9a3f74c96de65a905f22dec999ac65a8271bb3703e9f082b25dc501275a214ca017b32c8572d94102aa554d5d1ed9e60ac471c3d294ffc810d237906f9243fb0dc69b04530d0da09fd068c6085a5c983cdfd5afd1802dffbccc3c57e34fd5e4ec6feed0c4e006748738e9da1db7758901846e5b5db6d7db2bcc7673209c18bb6f8aa828677cb911eddf0cff326a9e74c821c554c5c6f02087a273bb5f7adaed5f399f085c05e4d1eef3136170bb6ab6f1e14d50b642d938276b6b49c7a95588ed6ef3f34dab7f5ead1df2875db233a83acb4053bbfbc378976da9b1b82c82db99fc79ea6d1ec5e6b81d45141acfd185651cad220d212f250f21f4769fa890f4d1843b9523c2430676c65c5202f874c1a55eeed2ea6b9cd2977538edaef149e7c5f8b9a16630537d9ca02ea29869702a464110d9f4e6b402090c9a080d81ae773302f36de454e09c5e43f1ab8c7b5b86922f388214c1c5671fe00a4fdfaedae5cedd59823a15e70a55d29f9ff6afb4b95595c6e03635c40bb3f034cd126bc2951c6f98f96116b40ab57f78e6999aa63dde97958d0a9e0b2ca604a992848c03e7d6befd837929a5edabf5a906515cd5be2e339b3ed618478e08f2fbad49fb4d74543e4269de543b119ec57421a582a025fee23e261188466e336f6d13cf4b8633c2379accb1b2d08e50a2355df693b73e436417c9ceee808a07c7bc3d3f2442a032efaec538737da3995d6bc0eda33ebbf42526ea8816509825ed5b8d83313c68b737c1b1ed8046adde570547bdf403275e17ad0daae2f88c29a2be2ce15b8889f95cc797934177ee74abf9b92cc0c91f58692b71979335cd82c60383807acd26d7ccbe37bb05e98a8e8dd6d22e67e3450fb9bcd8e59e299a953e5d08fcd1326638a7c29a38a8c64ffed1e2e5c821bb2b49b9b2c4912c6c37382cea2e3685a850f92ced7aeb6e6f73eb29bf426538eb7a20fd80537908a4ec0b93301e9152ec720627a9a613eac7bedae754307f8234360a68ebdc6bedd29a3416caffb8591dc779bf547dc4170fa7382b4e5d99ce3df2cfc4e81de811cb1d1bac34a4114fcd4d2450ff2c70cbb1d1de1d2f88b6a5c4bf90bf7322f002fd4c174800ada15d2c47c5ecdb8d388887325cbcd7d142755cb515a429808dabacbf2de7cb4ac54cf2b6b65df1a9273603b5046fc099c3de37bd351ac7f23348a4610ef64b0d20914c16b41bafddcbcda66c24398eb910a685bcd2e8d5dabcea8fed1084f9d3bb04468e4c4e7f4b729b1f455627f4322de119ed95dee7b96d303eb1146459dd923a48e1d0d2e22c973d937ff4dafb2cd12a706e07b18fa12a9cce4e32358d74f1073ac7b79cc3ed6167549e2c354091c139ccd28d49e7abf00b6e660b7c8a3616249e032c5022b358f108b7c61f46a2a9f45186d7000831e2ea552e37e698ad0ca90330cace1a7f7c9e32bb937196cf8aa4609e4aa80fea0cd408b201e3ec14aa42a77dc1004b170a6c0a77c0fe7528b9d5f3cc2269dd04e29020ea02f39f084776d7236e8fc34b217905755bc52164944cc64464e2720c2f273a103b8b80a62ba7adb7c066084ebe0f654ff1e35b228db2a38f69eb219e95b87c6328ef16ae755b6cf3655bdc3c4a6c288d48caa78cdd45169097640c0d3498601a2b494b731007320526e28668293967cf4e58aec2d8fe6f5b312cd68e027cd63910f15d6b5021e3d52f8399a4802f03175d5e719e52bad4d9f79345ebb74ca51f3092a3773c942952b7045bb39b7fee5d853cb6ec295eb86de98ce457b2fabb03038bca08aa3771e9da485e21b17599faec98bda619b96eeafbfa9b24f29f9371020cc7f4e668fe24cee1840e071e3e8f5bbc3ab39894a92db796d02a10c1bf3c0af2f915c127b0d2d1e5f68c74dffa7549a50bc57b39aee6577c507313505ab23bc2506acb4cddc9850cd7d520c38669bd44e6f0b4a2fd52428aa4b00e414d4b18647ab9728f9eabeb4a89365f331f55f560f10c3b8876ec7a6bcaa589ced3d50a8bac35300b6ac17dc95092b36e821db212f35cae252d879b8c53a3d8762b2f374b54a09d90f19bc74dc676105f7c1931fa60043797e7e9f15ce749e197076b0bce0935b762bcc982169a0d37605ca3dc5816a7f6e7c14c4659b5857adc2ea6018e2644b2abc784c62d2ba5c64afb5d13055a7c66347b61742391e95abdfaeb26c5c9026978fc4db0bd42afe30a1808e0d43fc9975dbe932f28c771b0e95cac0c7a7e95e330720ed8fc1050549244384f5190c12fe91ec6dd70d0795b04c410032f3bbade7d2c53a9c1dffbcec5afe9d0605831b74fd813163e3f943e36f9dc2227f2dbe8db536272d14967231fac85627ba6a47833c38bb349e0c3bb96ffc6138aadc805ac5854b588dd99d7a6a243e0947be7355010030f46f2f09131f9440aebcba6b1856a4448dcd3218d1b85cea7cee09240f05c7c73fe165d57517a2f0e108a0d56953d14bf45470b62bd0e366ee4be5065a7e881a43c5a4e572a543a2062ecc928f85f2f9226ca95a34e3195b34c436968f1f43f1856f403f78248612dc3edee1c49db99570ecf0f85c13e6568f1f30e8e9db92fd55f124167da366427d8e777d849b1a6cda39ede3ff4ee7f1767127cae10e186e6c40c646564e00f38672d8f66ad6a5be24d25eda45b5dd00d3df549588ab36e7d241f2fd3fdc1c01a5be99ba3c4ff38e792bbd89a0e7f69701a8e05d695b1fd7c3915e7ddb10e673c17d56d98bf7b39ef43e97b6f8244c13a7b7c9bb9638a6550478fc2264a5fd03269630163e28bbd22a8fb2e527e5402fc4c5050449d84f57fed473b9b42cb7c267b0e758d220fdd5ae5c882160ae50c88b03193d4503658b31aec511935d64b1f283e4a4a7e686e0441b4d51a7db83fd6e2c844e4372b94491a01472643832b04526536175d1a7ecd112fb0e64dfe1feea3895b029aa5f1c9982ae6e02141a2053530bfa94ec39ca0aa5f4ac4533f107a74ec3fdadac6d5383ec677d6b4cd1013e791b66e1636764b03dae19c87ee2cfa0e81277c739708c07b9e30642ba681289817f85fe557c4cf42b8a20843029190d4e2bd9d510125a70e9e3ee1c402122b1498e57bb3082f2562609c5770b5ced299eb8061a9d248ccdedff59787998c1d5c65f9db5a610c646da525009bc43f0aca330499627119354ecb2ffe1404ef2f2f6cbfe4bfc3e325e4151c91895e398d13c994a522220607beb45626a34d893eab307ec7f37ff3d87ab3f2efa3af6ce02b0f725334806bdea28c170ba17715281361ac5ac746b931ba6fbb7652a0d287df4783698f2c7c8838f54a13ee98e7366ec7880cd83cfce2f85af4f1d4a64f4504ee9e4e3c9265aa0a15bcc7009db83fef1bbb335511f1e2bf79b8f32ce7f3d4b0f9e0fb2e7f1f42613978916929bd3f13d12fef53cfa499a32c3f28187eaa83314cff397afda160f76baebd82708817af8e9d5520f3bf8f95779a3d3fb0c79e34912a1dd7c43f560e9f6253d2b8221a889b05495acef26225ee1e821d0f0b838cdfeabff6ce3d1e59d0d1da867e6d356793eff691900c12154b104d54ed62cd7a8b5e7f518ec8bf7da5c7189d444b3621cc69ddaf98e9b950d75ff2bfcfdef694a30161964b853216b33f04eb7249093c9880700f2b8a5f4ac90a7ff90ffa7e449d80cde9cd59a58a641a0b290f351e16c3451dced24a61b7007307ed88a8d75d7c1a2ec4e3352e6ec4cb42d814d906808abc8dd1793a4b4913ba4dc6bae815d3f3109a4e62df24e8a1d0aa809ef33d26c1abe875a5105f20bdb31e20f75ea96c3033845f68e3c04b45ad98ec0f881009510b8af989bf02e8cc14ec19bb377769d0367d109687fd8ea9dfac9b81ef208c14211bd153c33b96b094c15f9153358f441fb0daaebdef72ef43331e88073b364fb380e671c42c8e2351e998049386f1956ff236d5128b2afc0b269b16ac2a62c7821987266f06e8a8d8a3f3f62d5d7d23e0adfc28f20d52a1aabc005aca07e86aaac481cc4d840cef67e3d267da628cf5d1c2ed7e3082d767ce979c192d30cf453e9c1db5e9c8b2070a1b40e6e3e25319b1186104d20f402af0a02d21c3383c8bb650ae8c2abb1e81b515f52c86accad70eb901fde22e2d74a85b2089633f33599c78dfa4b48e93d9ebbe02041c210bfe289550742a3aea410382cdb3051e52c7a0d01baa9bd7ff477ad86f62b0e6d17ae6a81a41fa4da4624fd427c7700bb712ce7a5784fc732d9739b6b555f51e3e7cb4e140b2720b39201fd28b71ba22d2e45dd8d1fb432048346d7feb8868172f276fbb4fd5f8e1962920c13f945e0f0a13a477062ff845f650e11164169b0e28dac9c0ed352f23f3668694dec8dc3dcf4714e544dfcb7c63e4a38ae6f94d60a029f9ca9d8ec2d212f520aa4312d43c653a1f916e94d5dc66239ce4f003d72a70fdf728946211c5e34db8411a69331e150b5bd50eabab2b5a8d2c1ebc57d7bcf370fcac6581c386ec0960b8d02edf3b632a49e820e3be7f1355764cac532a6cde32b93079db85aa0b339719314b893cf1ce39f385aaadf116467d648350b850794297daa97c535634978b2b63fec819f353558b01f42b3c7cc880cb1a2f27388154acc3ac5f966378d5a0dc4134501c143d2422a587929c372a999d41a640b55792981d8576fb3dc34cf54fdc928c3c72ec17683a5e5a59d5c706e43a1a2dd963f5d3a3e14c3ac1d0fc9c6052fab40fdffbc115a4a22788dc83b0d04a72c2b029972e2a82c5d1cf33c12cde460d9c1a9894f27e7b34380d6cc1c28455acd7c402b34cb78eb95cd3bfa606125cf3c512aed8e3baa65cf6565188bad529a4003174c5e258fe1d59b939838d37e4f6933f3493b3c8e30e2072d5f7b26fa4336c22be8bfd517d5afc5bddba7266b1e0f11af4b56c019f68b0a29839a0a18bd3b6113d02b6d220d39c91325e24adbe9e5129de4c64db7a59bdbdae669a5b7f4ffe13f179b2bb7ce91366f42acf072976a806e593bf82ae3f477601efa0ee56b589416d53b9ed9b7e4b4fe5b955b8c9d4bf18922452a815c866bb151cf7935e57d7ca31d27bf5ef437b88a5c3f78d671a12153bfcbfe2491da3b78973096bcf90bd679ae8a6aaa2092c443d592de67d6997370088977bb90ea699726877f7e42141fae27c4d8200b6621d64d21baf6ae7be209003f30319596d0a3d386f7f13223008dcd54b9cb69bbcdc7745c8039bb43d050c3e270face2d4138593f61d26ca5400f72b0991ba90dd053ca0d22b3fe576378786f343fc264985cccfd2351b58434751a356762213d5cdcb4751d4e577f12ecfe82a4589da57d0d9707d9dcca6c77ad63f0c8afcf104c6cb6cda90e4daf63d90203ec9f90ac970c935147951247f4bbceaf2587525dd4c739a92acc7681619fad26d8e0b2ab5dee8ae46413f494853800843329c4acae70f7c3ea972fd521e00301c61de6dea202ce2070ec3299dced068f965455e42fd22afd1a70d45641c0c5bf57d4e30ae6fe08d5ba19f40ac71f005d882a55b639af390efd52f6b3621ae187627dcd2e2fdb97396d9d732fd90dd0335e4f4deba73c7fbe89cfdf3a101ecbca6979435722225f6e69dba54cb4d5dcee58f72911fab96378b1afea7b631355c9d3a4b56fdfcdfcd609f7e4df4f70666546961500151e7816dbd8fb7ab347f3d24dc1651c55a080ce0fea4c0f84f6f62dc55136dcc93e0d4abe3aded6e324a7d9d438ad0a377361a2ad7a5e01b5002bfdaa8d95798d228874d00819539267aba880f28c54149affb3404b0b5df8df334d5fdcbc5ce9348da1188965280384f1fc61b066c67e8dcbabbecef93b7be7370f6ec705748058ef8e17e5fa4541d2a9b6261638ca63651f2bed9e8d97a162ac957f76e74273d69f510c1f6da7b00d9c3041be2e9cf88fca1d8aa943355eb8d9a2e84ffcadaf8557e90a5db13a02be7adb09279333cd6bfaeced9c9a5a3c884fdeeca3df29d34853b1ba85562d12529c412f2af107b24e0b6d0f19fdfe24fac77c38ca7b056bb73da18978abcfb1e5d3639bf1814e945c03cfa685ed35dd4ac48b590014823f23dc903cf6889cc1ff26c625543eed36f2603418e7bf1cf2c28bc79ba878910ec5e461194d9e0763cb5749dc13f71d84e3f4b75248a68f6c3ccbb1be5aa2e6dd72d20f16d7ade6612f4fc510460f22d15ecd5fac01906ef6a9091dd82694e34ef5e8a0cc7b9537931e94af892e7ea389acc10b341e72bdbae55243b2a54bfbe52724e15996b61d136d9d36be11b83824608174365c26c9eaa5404e3f2bd62b8616ebf7bb0edea2f38be81237e7f1a32dae0b7dfe78742beaa6bf27d3a4756e0f677b9ec8f58bf0a04c32e213c13e2b94afd2c10043b4766c254ceaa37a6741266ae2d461c1bb6153630600a6739d86e7f2447a58d30625f0a2e80344f3c12eecb092952dd4d72a13397d98804678ff206c2a2ab95d1e370479cefbb7a380fbc7bca317b70ae78a106346442c2bb509d3387805e319a344ee0bf24e4c3a3b8ca40ee2f76b6a56165201b9fba22f1d9ba839002b05ce0e29251e7f08a57392ac973be474fe563d26e1f480f6d790666c73b46cd0dc537937cd581d3394939bfdfb53bbc7bf2098c7d220ec757d75b781055d7fce8b703dff48e5253f7477905ad2c377f15581411470732e8e6874ee085096c2b47313b8a06be84b0abee0bf71b409abdb757979fda297ebcdcf9ecf53018853ba3331d28021f91cc23d850232b7669220dd2a57e1b1e74fc96c584f5af851e00c4418a46b009743d91773001ec21a058b85ee61bc63a86df1ec8354786b3db922bfc2b0e4ad2f57edf6c3f382ab8240106220c9c6f09b87ed88076db0d2ab009680b44e3571fa085198df018c0dcff3bbbc4abe19c23aa5643ba398b6bb2e89105ed2c38a0eda1970576aad80a4cb5f06af1710caa340f7dcf462308feabea040e54a10317f83dfe272cd918376b8d261deda6bce70b130bc3a545fe3982b77d301126d8247c728b15b3588e591aab68ee2d7d55f524d0d6d30769c2dc1bb6dafc3d11c907c3d58be850ba90189e6288bafba4c9032d08f6a926b9dcce5710b7bbbbcae4675faddca19c4f1445733513e2ca9b01ea17cd72849a729897ff65cc7f4d451b2251ddbcef82ee711c98aa93e8a88f9fb612bd62e0bea04f60509bc8697690a2cd5bab2f7533214a093076ecef8921302a27a021b46aabf4831a331c728b9620f82a302e062f4a6345eb03b55f48b5169c13ee7e233b58281f86a3578e3827c358256c7eec1b5de6b1662719db34169cae179fabc6c5094da426e0ccaf61113b68edfe0af65ba2e07ee21d13ad68d10afb19bf650d430699ab72205b4f4d4de190875ac57ae22f2c0a648f7f3602ab598d3a2dd089f5cd023b6d56e1049e3a7af55b653a8bb82f950f173f93184b900dfa03b7b4d23486c2269e4620bc7a844620afd949b0dfa56b88e2b3d91340387a9b18eea629c05deb2f51acca9249389c13a28f8fc17a73dfa93c5917592ac8b4c82af449833bac90ac5d1c2531e59643481d323046e5a7918139a7f5ed2fe2b23d0f2d295b7b1dc088dd2c58bcbbb3a5c24a7717438d9511e68a1f1b5f3c05996220d13c97fbc1d35291d0f434827830bff80da4fdc5c7362e96dbf8dcab048d3202fb363cd2e7683a6c8d0163730765dd1f62fb2f144bf1e114d7e9924446dad822d6b2146f9b477e748bc599156ae1c57229ca5b41cc1b69507c83b03f01cbef3123b9eff0675f8743da6cfa171a6c03b060dd85626e5c595bf7f1b1726e8f0038d221eb98b711a06b0dd9fb64d50f90aec55abe7653e718595ce628130c6a5c1341be7a34f6427fc9e8a5588d8fd737720d9dc7393819d7e0c07dfe00347df92ecad7d5796f7fdadda2856e7ee838061ac13f4df134609972f0b54eb46d39ea389446c18165fcd7d6468f259adfe660c0e6d71c5ed6f3e39fb3ceaf1a2b21c015b9bae754bf2eb2c4737c1b1cca6294fe862d2e9a72e73bb1406fed101fd74f1bd73d38e4654d65003184db8714e720d445164f84d954dfa6e813cc3f65ce5815981fdd23bb892767fe7f0a2304fac732e381861abed13fff92f7dabe50050f32e0bd6e5affc146330ef0c78a63c93087a193d85c225c257fd448397c3d59091702b4350231c8caca1651e04cdc7682681eba29a0ce51055950d29d3b1bff1518c29906a2c346c303f950123b37fa42951322958d8b04520174602e01528e890a6d93c424bf0a213da50076cb4039d1acec33ecc309d38279090943feffa27612670d99b9481ca0971df7272b637b45d8ea7f37bba6ba600eb8f70e23be5e761c04039a0bf79e25408c3fa21effe6781891f27a81cff998e890f99159fcd3860e039028b423efcda99e9466316ae62c69e71af43617f727ff61510965e6914129e31ab42304c42df591824cdc46768290809575b2a05e3d336a6620daf7a48f00be746dea7592d1d46b7bd483b3181c9b494c1612029ff81cfd8a2a0073662b0b1d5b03db0141f42f21fc3f0c33c3a41b04b23feda4c9f52674702b6de988e633f696b4b619d1f79c97d056cfab6c2e48a9645da7555b31c9860c8bd1f44c1e1ae4f004f1d3796d85dd424b1ebaaa68b095a32b81d647926259c0fe4a627bc936e22c02573781efcdbaff2fd9b3a613551b85c572e76624cb22ff874e6f643b2e47fe2ac3f9696a7c3a5e71200018114ada61295bd8d1b5c276ceedbda51080244638998ebf4f0a6d8bf23758758b53b4fa9d88d8a81ca8367ae463d0c66699030a6c5ed4bcd829a7ce9848374ab9d8822fc747cf8acfedd2eaf555daf63e6a222048b48660bc8cb1aa75f1aa9cae6f4e83054dae54dfd1be17246687d9ff132b4f1d2f724c1eb82eb57ed04ed31b7c3254a4c373e0e6d031313c845aa54bdb1d21a569980f0ec2d411f0bf89acfd647d406bddf9979ea65fc935c9dda36b0e2d6110481648b8fe09fe8ed70cd88f0497fffa519a7e7e35f22062b253d2fef23cb15eba82cdff902716863c66fd38a3f33cf5f64071b108be7dcafe3d2b6622397ce1e2f77203fc261feb909e1e8742a4e1ee8c1ad67368f0105af5802f9d74098df7b6a990fde0edad63bf47c22d7e53851323448f0fe79e9e59cf16469cf31be83abca68eeb04e7b65693edf68f4a825570b5906341352fafc707ba2c0d2a3d0e7a3a8d5ffa00bdba94801bc47f3fd91d9b5a8ce2e738fccfd3ea0ab979e11d2ead6029b707ffcee257d2270a7d3133247169ead5953992d2247c06024cef0b8eaa97a3942cac18fe3911067a778a61ee9059f4056d4deb1c59828fbd0105356cb3380000660a47bd36357ce7296dc3af43999c6b215df017cb9281a95d692b5248e07a5ab3293da8755558ee7dc4c1ee1ea61c4a0cd590f3dd425843885c36a14049abd8950da9f97875c33945e8aa961a97c81e2c798f94b12a6b171d472edaa72efab86721a4f4d25f1bebef36db35d17c6067f1de26bd421f9463ee4600d503e0448b53649770d278a38d5699fa48958bf135bdfffb6e6ae44fa056f739373b70c3805df4c9f6bd092681f802d8957341864221ba545414a43906b807355d535195d9b81f0badf5376dac3345fba9a1aa9ccba16326d9879372b0968c1b51aadb088b6aeda554c5344cde86115956ca31a52ca2c678a6b8b9ce0bd1313d6d0c20c44b3e2dd7283b86efe6a5b3edf2b76796b7428d52d0bed21e5cf52e2ba3fd5ec3fefafb217840ae10b03bb19b58cd2f23208e5b4e89a38e6c5373cc370bae196ba7d570d9a1ee3a752a609a53efcda59b0b2732c6ce248e56602d2f3758d51af93812943955931505aba193618979c4cfefb939b8f8f10d789314302433c6c4bf3d73276c841d3d1e06e3b56534adb9701631a3fb7867eba66af69730f84719938bb7b14a9019f63b2340835b067db5fc9170edc6c6bc9551e27af70fd5abef38908e08dad1856ea0580f2e8a8e755a28dd407c6b3806c11ffe41b719f3b48f40d3ff1dcd1763c3eadfeb14c360396e98b1e63c73eb3eab25d865dd04f7a99b168d0b649094753a78d5b8434476d763a9de2c5d3926f3295b7265d9353729205fac3cdafe5dc40bf178acd3da5d2419c51a7c566d2ec5a98c961fa20a95fee7f7f37df341dd7f004a86c412be4b7e5622cb97487bf590ae80533754176dd4ec727025d1f1bec88382cbfc80202719b71ec16c4fa826edd1689739e70deb5288e715232bfff74861e8ccba7766b773a231a3f1847f02eb8f1005f8f637dd1a51713566046e991f698e1b1ce13414f6beff55e26aaf2a031e6a3d9fe03496afcf4bcf22bc171237be33ba65cec5694ac923d35724aa41bdb8626bb3fc1ed794bb602f5f15c18686f64ef35743f6ec9bc44a7455c757c3b6685474b19b32a3f230c11030a0160d6be75fca46b7a2790019240a06898a16bc93cddcce000e10a92c66e68b7de8f1d05c18b2fa7b7b112f7592daef90baa9d944eb3336c525335703cd6b2781d69d80b60e55b70e002e86cd6544636bd69ad7f0050cdbf90a10a670496d4c1c431bccc741250ef858d7ce1f140fd47647d7cab18a8ca0aa38c77435458af7dfaffcaac2cdc8a2d23cdfe6c0f9de520a90dabf06e255e2ea3a31a4e2c318bae6524f776c60013ac3410e471c636f3746b9c9a77481d64c3827b9ad05dc3d6a095b2603c4eeeaa280551b2dab94cd4728179592c97370f3903453d895c83249b9bb4779eafca4a17966293ba66cb09ef4f53bc775014989ce29747e6244b1ba674bc40744d4ace01067be9dfc88f306a67f8bbd049b2fa0d61b7a87210523daee74b6b29261d4ea7a2498dd2c5433fa83efcd3c4c8d8cc5d913bdc7e4d154ce2dfc736d4f9682afb7c1d421db5f54f0ef4932687004d934982143b64919d442f4b99ad450de814609a1ab23816881625633e3a65f1d9d25bc2f00d44d990d94a709241962db1048a0f8596358b64f0eb915eb120af1b09a220195eb7c4d83f45976699384be6f5164666ad4e0d47efb87b2d9d479a7e74fe131f12c796e29c9ddd8e95b0af0c5134aee96d6963d85267ef83b37093523855b072a15406dff9d6e523e8ead22ccdec239952e8880027a2c2108fc1eccd24f1929a3a6383409280f0ce33c26103ac5145a28f76e000a70c31f8e54b6100db861340be9541f4e79e66a47c12f6a3ce48591e69a63f3318ab2e68688326803dbeb15cbc5c3960c93e8005595748398f2f8fe85a3503e019aea07ab57fadf730d7a1050954bf494beb0400dbc09c3249357a44404afa77a1e76d85823b58f188624056a604c4c7230c28ca00fe698b4e725409da764a63df10ae386fe19764871d8232696d60aea477d3539105929575d5948ee5ca12b6787212d0e3a9366889b191ae8f40ce19ddfab6e6fb81a27f96e121970b604e31f6c9f0578c361da2e567d3c99ff40cd168cd33c65b8a7cb9cd082b1f841efbce9f03e47de17dc19bfc05f18c74c40cae1c9b69c792e1e034e99942d09e4e10b4131fa4560833e3aefd402213dd2d4866e26fd1ff00aedaa31ee067b7b314a85f83deaf119e7df458fe3db025d5f5b6a34f1b262b1a0d218baf885b2bc45b2c6be8c56675b29960ac63d092a477db2f8fd0a02e1f34f28c31e591d60fed8a8c0fa1bf6c6a9547c6d614070029b94d4d685a7bb4fb90f24026768c41b30749cbb04e32c927153fe4c507f1d026ae4bcb9a8471e4862c333f5155bebd485762f70b675ebb7686ef095e2e4d41d50b96d7aa08ea72e882dff79353a8866326d2efe5bd9c61fdb1fe0601b775ea907c2434e5f1df89c10deb205fafd1b03ec91be8f22c58faa08d1c3e7aa3a68215a1020d2362a17aef8bb72ce462d28c19c8ead23291c8b98e96d46c183546e03a9f02c5bd1a41c136c25c7479d1392f1017e10be36aa652ad9be400f6926e237db6a45668bd131e02bb49bb12386fd8badbd5814513bed66ae0ab6b43dda2d1bf462a56a29413449f4bb7f7586cdc5a8b0ae6fc1592803da2b1536ebdf07691be4abb4591f4366bed48fcb1ec584b0163d231b6e869163c6b2881b3903821a34ee46a66cb5675a4a0d89899802406205dff8bc62ae19af6cbe06713156eb5d2bb1a04fb28a14374a78ba5b7fc3bb1987c34e3270be409559e57acc55cee029257ea76e9ed1da7b83f7403b1c913f9ba08755e09c28859869b081f54f8f75621e24bbd994b5c257196ae08129b5338f7c3f47e9febf66729f2d3629af9891971ecd80207d74c2d4356d14cd9b89231bd500f256197ff4b96fb0ac305455114021a338e0e0497c5329ecc802782cf26c3095990b83243891a10fcc13393c86ad2f3627639ac00df40b46bda075d373d19e133df9aae2bd7ef56d477e9c24f2b89919e6e38e538e6e991a042c0683d821fe4678c4da4e285e91ccff6c07e13206168db9a3660dd1db5e46f04996febefa8a77553cce56312b9d8b4720e832598d1da8a774affb1584831fb40fdff5ad7c8043a6742a8e173828efab6491e51cc12ec563358dfdadfcbf13a1944711d163a0d76dbf136e82b555d6fa2805f7cd1d19388b1b370cef6e6d2b4140735acdb04cf9c97474e49904298cf9a21f4536ff9e0af18a4389f07d17375d7a96fc979dcee9e3a0b0786ed3e5546b230aaa07e3abf8e56f53836cda422f6b833194755a33e562cf5db3b766ce0789386916823928a6476171417b9f90d510e02cc8de96068bb6babd43aee80e2b8e4a0d881e453f94b306a9501188eec67d2c4f85f966a20588ffcb5e9816f8b1fe59c6beac2130528212c5ff7fb0ebc8603ed9e3c78c67d316d23a2630ae40fff3072b5531f69d73a7aca0bfc79ebd052798c74e7182ea2f3283af7fc65f86bbd192359c7dc7971e94ebc968f07c349aff39f291504f6e3a4da1c05199b579d703b0c894272f2a28650cb862940cc909c00814d35a44b164aff7b9f0ed99e32976f91b51b1e49d9a6643835f2fe1d0fc252fc438e162b3a3c86b270d519fabcf9605d69e012a8f9b48ab5b7237bd49e36ba44f8233f563b72144cbe942591dbae19ded098460a546d1bcd3d3b378500dcf12403198e1ed8bac9f40a214763770ef004083299228c7a0f37f6f39b589a9d0fbc9fc5628ffffc17ffdc7c1585aca38a1aa589fc3337e8917ce3337e6615d58edca701b7967342b4b1aaeccfac99f9cd793b1f7a123952ddc457491e38a0b3c75431f5f2137735a2fcb6717c0d113dc071bdb3ba72305eb057e477b64b9089d2218ac6e1e56c96443a0f0159b04d168b7b1981d4a39c3bfb38e2880b7a53f0eea11dce05593de3c80692c8c0a3dd9a01852baf3df0ab14c507c8e729ca55c6f03ba95f854f108dd41d706d600d0e8f5cf0d49b2cf31e1b3c6ceab53df45cead7872cc1b108f5b42dac5bafc51b906f4aa64602a221c50bbc193bd018230a76e2b0be1e31079047440592f2337fa5f76eb9b297945b11088d8e2a2c440bf0f5800fd1b92fcf6d96b54158dcb25c26101e081aee4ae2b5e7da305449c78bfee2a992f3da911e1a1ad134c4ebed87aa70501690b3a28b04c3315ed504a1f5d0f3f788c638a4923453b76806ae2e24c8ad04af6def9f312 \ No newline at end of file diff --git a/zebra-test/src/zip0244.rs b/zebra-test/src/zip0244.rs index 91417f31..c9196fa9 100644 --- a/zebra-test/src/zip0244.rs +++ b/zebra-test/src/zip0244.rs @@ -9,14 +9,16 @@ pub struct TestVector { pub txid: [u8; 32], /// The expected auth digest. pub auth_digest: [u8; 32], + /// The amounts of the outputs matching each transparent input + pub amounts: Vec, + /// The script pubkey of the outputs matching each transparent input + pub script_pubkeys: Vec>, /// Which transparent input the ID refers to, if any. pub transparent_input: Option, - /// The script code for the given transparent input, if any. - pub script_code: Option>, - /// The amount of the transparent input, if any. - pub amount: Option, + /// The signature hash for shielded transactions. + pub sighash_shielded: [u8; 32], /// The signature hash for the SIGHASH_ALL type. - pub sighash_all: [u8; 32], + pub sighash_all: Option<[u8; 32]>, /// The signature hash for the SIGHASH_NONE type. pub sighash_none: Option<[u8; 32]>, /// The signature hash for the SIGHASH_SINGLE type. @@ -35,7 +37,7 @@ lazy_static! { pub static ref TEST_VECTORS: Vec = vec![ TestVector { tx: vec![ - 0x05, 0x00, 0x00, 0x80, 0x0a, 0x27, 0xa7, 0x26, 0x21, 0x96, 0x51, 0x37, 0x7a, 0x8f, + 0x05, 0x00, 0x00, 0x80, 0x0a, 0x27, 0xa7, 0x26, 0xb4, 0xd0, 0xd6, 0xc2, 0x7a, 0x8f, 0x73, 0x9a, 0x2d, 0x6f, 0x2c, 0x02, 0x01, 0xe1, 0x52, 0xa8, 0x04, 0x9e, 0x29, 0x4c, 0x4d, 0x6e, 0x66, 0xb1, 0x64, 0x93, 0x9d, 0xaf, 0xfa, 0x2e, 0xf6, 0xee, 0x69, 0x21, 0x48, 0x1c, 0xdd, 0x86, 0xb3, 0xcc, 0x43, 0x18, 0xd9, 0x61, 0x4f, 0xc8, 0x20, 0x90, @@ -286,199 +288,148 @@ lazy_static! { 0x6b, 0x4f, 0xe1, 0x2d, 0xad, 0x9a, 0x17, 0xf5, 0xdb, 0x70, 0x31, ], txid: [ - 0x3c, 0x7c, 0xe9, 0x2a, 0x10, 0x59, 0xc0, 0xf6, 0x3f, 0x14, 0x0f, 0x1c, 0xb9, 0xac, - 0x5e, 0x38, 0x90, 0x0a, 0x68, 0x45, 0x95, 0x63, 0x8f, 0xce, 0xf7, 0x73, 0x18, 0x5d, - 0xcf, 0x2f, 0x7f, 0x91, + 0x55, 0x2c, 0x96, 0xbd, 0x33, 0x83, 0x4b, 0xa1, 0xa8, 0xa3, 0xec, 0xd8, 0x0a, 0x2c, + 0x9c, 0xb4, 0x11, 0x87, 0x55, 0x3a, 0x3d, 0xcf, 0xe7, 0x92, 0x83, 0x16, 0xbb, 0x70, + 0x70, 0x4b, 0x85, 0xd0, ], auth_digest: [ - 0x1b, 0x60, 0x46, 0xb6, 0x82, 0xf6, 0x9d, 0xb1, 0x66, 0x65, 0x63, 0x2d, 0x21, 0xdc, - 0x7f, 0x83, 0x46, 0xb2, 0x82, 0xec, 0x04, 0xb8, 0x40, 0xf2, 0x45, 0x1d, 0x09, 0xc0, - 0x86, 0x3c, 0xda, 0x6b, + 0x12, 0x76, 0x7e, 0x5f, 0x67, 0x85, 0x67, 0x36, 0x0f, 0xb3, 0xa1, 0xcb, 0x9c, 0xf8, + 0x58, 0x61, 0x3f, 0xfe, 0x22, 0x63, 0xb6, 0x53, 0xc6, 0xa3, 0x70, 0xee, 0x1f, 0x68, + 0x20, 0xab, 0xdc, 0x57, ], + amounts: vec![1800841178198868], + script_pubkeys: vec![vec![0x65, 0x00, 0x51]], transparent_input: Some(0), - script_code: Some(vec![0x65, 0x00, 0x51]), - amount: Some(570688904498311), - sighash_all: [ - 0x12, 0x5a, 0xab, 0x82, 0x97, 0xf3, 0x0d, 0xe0, 0x38, 0xd1, 0x1a, 0xf8, 0x93, 0xbb, - 0x77, 0x90, 0x47, 0xec, 0xad, 0x86, 0x7d, 0x03, 0x0a, 0x11, 0x6d, 0x32, 0x08, 0x7a, - 0x3c, 0xad, 0x1f, 0x2d, + sighash_shielded: [ + 0x88, 0xda, 0x64, 0xb9, 0x5b, 0x56, 0xd8, 0x29, 0x6a, 0xb1, 0xf7, 0x21, 0xeb, 0x5b, + 0xe6, 0x6d, 0x0f, 0xd4, 0x78, 0xf2, 0xb9, 0x6b, 0x93, 0xd5, 0xdc, 0xee, 0x8f, 0x7a, + 0x10, 0x00, 0xb0, 0xff, ], + sighash_all: Some([ + 0x2d, 0x4e, 0xbf, 0x4d, 0x42, 0x42, 0x38, 0xad, 0x0b, 0xc2, 0x46, 0x99, 0x70, 0x34, + 0x7e, 0xaf, 0x76, 0x7f, 0xf9, 0x06, 0x95, 0x8e, 0x35, 0x10, 0x7f, 0xd2, 0x2c, 0x1d, + 0xc5, 0x36, 0xe4, 0x59, + ]), sighash_none: Some([ - 0x08, 0xef, 0x7b, 0x65, 0xb9, 0xd4, 0x15, 0x2b, 0x00, 0x55, 0x24, 0xc9, 0x9e, 0x85, - 0x0b, 0x0a, 0x7c, 0xe2, 0x6c, 0xc1, 0xbc, 0x00, 0xf7, 0x91, 0x5b, 0xe4, 0x7f, 0xdd, - 0x4a, 0x0e, 0xe8, 0xe0, - ]), - sighash_single: Some([ - 0x08, 0xef, 0x7b, 0x65, 0xb9, 0xd4, 0x15, 0x2b, 0x00, 0x55, 0x24, 0xc9, 0x9e, 0x85, - 0x0b, 0x0a, 0x7c, 0xe2, 0x6c, 0xc1, 0xbc, 0x00, 0xf7, 0x91, 0x5b, 0xe4, 0x7f, 0xdd, - 0x4a, 0x0e, 0xe8, 0xe0, + 0x68, 0x3e, 0xca, 0xa5, 0x64, 0x00, 0x2c, 0xa5, 0xa8, 0x0b, 0xea, 0x04, 0x37, 0x0c, + 0x78, 0x85, 0x5b, 0x8d, 0x9c, 0x9c, 0x38, 0x23, 0x09, 0xc7, 0x0b, 0x29, 0xbd, 0xd9, + 0x8d, 0x75, 0xb0, 0x66, ]), + sighash_single: None, sighash_all_anyone: Some([ - 0x0e, 0xba, 0xe2, 0x6e, 0xee, 0xc6, 0x28, 0xbe, 0x1e, 0x76, 0x42, 0xd0, 0xfd, 0xb1, - 0xdc, 0x13, 0x5b, 0xd1, 0x4f, 0x4f, 0x82, 0xc0, 0x83, 0x4c, 0x02, 0xab, 0xd1, 0xdf, - 0x5e, 0x3d, 0x77, 0xc6, + 0x9c, 0x9e, 0x75, 0xee, 0x15, 0xf4, 0xed, 0xa1, 0x5d, 0x77, 0x79, 0x39, 0x52, 0x9f, + 0xa3, 0xa4, 0xf6, 0x4b, 0x93, 0x5c, 0x7d, 0x21, 0x83, 0x5f, 0x79, 0x39, 0x3e, 0x7a, + 0xa2, 0x3e, 0x28, 0x79, ]), sighash_none_anyone: Some([ - 0x0e, 0xba, 0xe2, 0x6e, 0xee, 0xc6, 0x28, 0xbe, 0x1e, 0x76, 0x42, 0xd0, 0xfd, 0xb1, - 0xdc, 0x13, 0x5b, 0xd1, 0x4f, 0x4f, 0x82, 0xc0, 0x83, 0x4c, 0x02, 0xab, 0xd1, 0xdf, - 0x5e, 0x3d, 0x77, 0xc6, - ]), - sighash_single_anyone: Some([ - 0x0e, 0xba, 0xe2, 0x6e, 0xee, 0xc6, 0x28, 0xbe, 0x1e, 0x76, 0x42, 0xd0, 0xfd, 0xb1, - 0xdc, 0x13, 0x5b, 0xd1, 0x4f, 0x4f, 0x82, 0xc0, 0x83, 0x4c, 0x02, 0xab, 0xd1, 0xdf, - 0x5e, 0x3d, 0x77, 0xc6, + 0xa7, 0xdf, 0xf0, 0x0a, 0x96, 0xfd, 0x2b, 0x41, 0xc5, 0x80, 0x8d, 0x35, 0xe4, 0xa6, + 0xa2, 0xaa, 0x7b, 0x40, 0xee, 0xeb, 0xb6, 0xdc, 0xf3, 0xb9, 0xf2, 0x81, 0xeb, 0x6c, + 0x17, 0xe4, 0x3a, 0xf4, ]), + sighash_single_anyone: None, }, TestVector { tx: vec![ - 0x05, 0x00, 0x00, 0x80, 0x0a, 0x27, 0xa7, 0x26, 0x21, 0x96, 0x51, 0x37, 0x1f, 0xc9, - 0x98, 0xc3, 0x1f, 0x4d, 0xd2, 0x08, 0x00, 0x01, 0x50, 0x58, 0xe5, 0x75, 0x4c, 0x21, - 0x04, 0x00, 0x07, 0x53, 0xac, 0x51, 0x53, 0x00, 0x51, 0x52, 0x02, 0xf8, 0x9d, 0x32, - 0x26, 0xfb, 0x53, 0x29, 0x2b, 0xfb, 0x5d, 0xbb, 0xf7, 0xff, 0x01, 0x3a, 0xf3, 0x34, - 0x1e, 0xa7, 0xa3, 0x5f, 0x55, 0x3f, 0x6d, 0x7a, 0x02, 0x21, 0xae, 0x19, 0x5e, 0xa8, - 0x4e, 0xb9, 0x7a, 0x14, 0x94, 0x36, 0x49, 0x30, 0x55, 0x21, 0x32, 0x6b, 0xde, 0x08, - 0x56, 0x30, 0x86, 0x46, 0x29, 0x29, 0x1b, 0xae, 0x25, 0xff, 0x88, 0x22, 0xa1, 0x4c, - 0x4b, 0x66, 0x6a, 0x92, 0x59, 0xbe, 0xa6, 0xfa, 0x0b, 0xf2, 0x99, 0x99, 0x56, 0xfb, - 0xfd, 0x0e, 0xe6, 0x8e, 0xc3, 0x6e, 0x46, 0x88, 0x80, 0x9a, 0xe2, 0x31, 0xeb, 0x8b, - 0xc4, 0x36, 0x9f, 0x5f, 0xe1, 0x57, 0x3f, 0x57, 0xe0, 0x68, 0x54, 0x06, 0x99, 0x4d, - 0x28, 0x26, 0x4e, 0x4d, 0x74, 0xd5, 0xa2, 0x5f, 0xa3, 0xfa, 0x38, 0xfe, 0xd8, 0x13, - 0xc5, 0x05, 0xdd, 0x90, 0x28, 0x9f, 0x30, 0x1c, 0x75, 0xe5, 0x3a, 0x71, 0x6c, 0x5b, - 0x54, 0xa4, 0x5e, 0xb3, 0x2c, 0x16, 0x54, 0x48, 0xd4, 0xd5, 0xd6, 0x1c, 0xa2, 0x85, - 0x95, 0x85, 0x36, 0x9f, 0x53, 0xf1, 0xa1, 0x37, 0xe9, 0xe8, 0x2b, 0x67, 0xb8, 0xfd, - 0xaf, 0x01, 0xbd, 0xa5, 0x4a, 0x31, 0x73, 0x11, 0x89, 0x6a, 0xe1, 0x02, 0x80, 0xa0, - 0x32, 0x44, 0x0c, 0x42, 0x0a, 0x42, 0x1e, 0x94, 0x4d, 0x1e, 0x95, 0x2b, 0x70, 0xd5, - 0x82, 0x6c, 0xd3, 0xb0, 0x8b, 0x7d, 0xb9, 0x01, 0xe5, 0x84, 0x9f, 0x96, 0xba, 0xe6, - 0xf2, 0x05, 0x6f, 0x33, 0xab, 0x1e, 0x69, 0x89, 0xd7, 0xd2, 0x64, 0xad, 0xc9, 0x78, - 0x55, 0xa9, 0x90, 0x10, 0x3b, 0x4d, 0x1e, 0x63, 0x50, 0xd5, 0xc3, 0x1a, 0x39, 0xc3, - 0xca, 0xf6, 0x94, 0x59, 0xe4, 0x62, 0xf1, 0x41, 0xbe, 0x8b, 0x39, 0x03, 0x7f, 0xfa, - 0x25, 0x5c, 0xe2, 0x7e, 0x4a, 0xd7, 0xb5, 0x66, 0xa2, 0x96, 0x20, 0xa9, 0xf0, 0x11, - 0xab, 0x08, 0xfb, 0x2a, 0xd3, 0x05, 0x06, 0x52, 0xb3, 0xf6, 0x5b, 0x8e, 0x34, 0x52, - 0x6a, 0x2a, 0x15, 0xfc, 0x2d, 0xdc, 0x5b, 0x51, 0x13, 0xe4, 0x88, 0x2c, 0x7c, 0xca, - 0x0d, 0xd5, 0x57, 0x7b, 0xe0, 0x67, 0xba, 0x7a, 0x17, 0x5d, 0xae, 0x4b, 0xbe, 0x3e, - 0xf4, 0x86, 0x3d, 0x53, 0x70, 0x89, 0x15, 0x09, 0x0f, 0x47, 0xa0, 0x68, 0xe2, 0x27, - 0x43, 0x3f, 0x9e, 0x49, 0xd3, 0xaa, 0x09, 0xe3, 0x56, 0xd8, 0xd6, 0x6d, 0x0c, 0x01, - 0x21, 0xe9, 0x1a, 0x3c, 0x4a, 0xa3, 0xf2, 0x7f, 0xa1, 0xb6, 0x33, 0x96, 0xe2, 0xb4, - 0x1d, 0xb9, 0x08, 0xfd, 0xab, 0x8b, 0x18, 0xcc, 0x73, 0x04, 0xe9, 0x4e, 0x97, 0x05, - 0x68, 0xf9, 0x42, 0x1c, 0x0d, 0xbb, 0xba, 0xf8, 0x45, 0x98, 0xd9, 0x72, 0xb0, 0x53, - 0x4f, 0x48, 0xa5, 0xe5, 0x26, 0x70, 0x43, 0x6a, 0xaa, 0x77, 0x6e, 0xd2, 0x48, 0x2a, - 0xd7, 0x03, 0x43, 0x02, 0x01, 0xe5, 0x34, 0x43, 0xc3, 0x6d, 0xcf, 0xd3, 0x4a, 0x0c, - 0xb6, 0x63, 0x78, 0x76, 0x10, 0x5e, 0x79, 0xbf, 0x3b, 0xd5, 0x8e, 0xc1, 0x48, 0xcb, - 0x64, 0x97, 0x0e, 0x32, 0x23, 0xa9, 0x1f, 0x71, 0xdf, 0xcf, 0xd5, 0xa0, 0x4b, 0x66, - 0x7f, 0xba, 0xf3, 0xd4, 0xb3, 0xb9, 0x08, 0xb9, 0x82, 0x88, 0x20, 0xdf, 0xec, 0xdd, - 0x75, 0x37, 0x50, 0xb5, 0xf9, 0xd2, 0x21, 0x6e, 0x56, 0xc6, 0x15, 0x27, 0x2f, 0x85, - 0x44, 0x64, 0xc0, 0xca, 0x4b, 0x1e, 0x85, 0xae, 0xdd, 0x03, 0x82, 0x92, 0xc4, 0xe1, - 0xa5, 0x77, 0x44, 0xeb, 0xba, 0x01, 0x0b, 0x9e, 0xbf, 0xbb, 0x01, 0x1b, 0xd6, 0xf0, - 0xb7, 0x88, 0x05, 0x02, 0x5d, 0x27, 0xf3, 0xc1, 0x77, 0x46, 0xba, 0xe1, 0x16, 0xc1, - 0x5d, 0x9f, 0x47, 0x1f, 0x0f, 0x62, 0x88, 0xa1, 0x50, 0x64, 0x7b, 0x2a, 0xfe, 0x9d, - 0xf7, 0xcc, 0xcf, 0x01, 0xf5, 0xcd, 0xe5, 0xf0, 0x46, 0x80, 0xbb, 0xfe, 0xd8, 0x7f, - 0x6c, 0xf4, 0x29, 0xfb, 0x27, 0xad, 0x6b, 0xab, 0xe7, 0x91, 0x76, 0x66, 0x11, 0xcf, - 0x5b, 0xc2, 0x0e, 0x48, 0xbe, 0xf1, 0x19, 0x25, 0x9b, 0x9b, 0x8a, 0x0e, 0x39, 0xc3, - 0xdf, 0x28, 0xcb, 0x95, 0x82, 0xea, 0x33, 0x86, 0x01, 0xcd, 0xc4, 0x81, 0xb3, 0x2f, - 0xb8, 0x2a, 0xde, 0xeb, 0xb3, 0xda, 0xde, 0x25, 0xd1, 0xa3, 0xdf, 0x20, 0xc3, 0x7e, - 0x71, 0x25, 0x06, 0xb5, 0xd9, 0x96, 0xc4, 0x9a, 0x9f, 0x0f, 0x30, 0xdd, 0xcb, 0x91, - 0xfe, 0x90, 0x04, 0xe1, 0xe8, 0x32, 0x94, 0xa6, 0xc9, 0x20, 0x3d, 0x94, 0xe8, 0xdc, - 0x2c, 0xbb, 0x44, 0x9d, 0xe4, 0x15, 0x50, 0x32, 0x60, 0x4e, 0x47, 0x99, 0x70, 0x16, - 0xb3, 0x04, 0xfd, 0x43, 0x7d, 0x82, 0x35, 0x04, 0x5e, 0x25, 0x5a, 0x19, 0xb7, 0x43, - 0xa0, 0xa9, 0xf2, 0xe3, 0x36, 0xb4, 0x4c, 0xae, 0x30, 0x7b, 0xb3, 0x98, 0x7b, 0xd3, - 0xe4, 0xe7, 0x77, 0xfb, 0xb3, 0x4c, 0x0a, 0xb8, 0xcc, 0x3d, 0x67, 0x46, 0x6c, 0x0a, - 0x88, 0xdd, 0x4c, 0xca, 0xd1, 0x8a, 0x07, 0xa8, 0xd1, 0x06, 0x8d, 0xf5, 0xb6, 0x29, - 0xe5, 0x71, 0x8d, 0x0f, 0x6d, 0xf5, 0xc9, 0x57, 0xcf, 0x71, 0xbb, 0x00, 0xa5, 0x17, - 0x8f, 0x17, 0x5c, 0xac, 0xa9, 0x44, 0xe6, 0x35, 0xc5, 0x15, 0x9f, 0x73, 0x8e, 0x24, - 0x02, 0xa2, 0xd2, 0x1a, 0xa0, 0x81, 0xe1, 0x0e, 0x45, 0x6a, 0xfb, 0x00, 0xb9, 0xf6, - 0x24, 0x16, 0xc8, 0xb9, 0xc0, 0xf7, 0x22, 0x8f, 0x51, 0x07, 0x29, 0xe0, 0xbe, 0x3f, - 0x30, 0x53, 0x13, 0xd7, 0x7f, 0x73, 0x79, 0xdc, 0x2a, 0xf2, 0x48, 0x69, 0xc6, 0xc7, - 0x4e, 0xe4, 0x47, 0x14, 0x98, 0x86, 0x1d, 0x19, 0x2f, 0x0f, 0xf0, 0xf5, 0x08, 0x28, - 0x5d, 0xab, 0x6b, 0x6a, 0x36, 0xcc, 0xf7, 0xd1, 0x22, 0x56, 0xcc, 0x76, 0xb9, 0x55, - 0x03, 0x72, 0x0a, 0xc6, 0x72, 0xd0, 0x82, 0x68, 0xd2, 0xcf, 0x77, 0x73, 0xb6, 0xba, - 0x2a, 0x5f, 0x66, 0x48, 0x47, 0xbf, 0x70, 0x7f, 0x2f, 0xc1, 0x0c, 0x98, 0xf2, 0xf0, - 0x06, 0xec, 0x22, 0xcc, 0xb5, 0xa8, 0xc8, 0xb7, 0xc4, 0x0c, 0x7c, 0x2d, 0x49, 0xa6, - 0x63, 0x9b, 0x9f, 0x2c, 0xe3, 0x3c, 0x25, 0xc0, 0x4b, 0xc4, 0x61, 0xe7, 0x44, 0xdf, - 0xa5, 0x36, 0xb0, 0x0d, 0x94, 0xba, 0xdd, 0xf4, 0xf4, 0xd1, 0x40, 0x44, 0xc6, 0x95, - 0xa3, 0x38, 0x81, 0x47, 0x7d, 0xf1, 0x24, 0xf0, 0xfc, 0xf2, 0x06, 0xa9, 0xfb, 0x2e, - 0x65, 0xe3, 0x04, 0xcd, 0xbf, 0x0c, 0x4d, 0x23, 0x90, 0x17, 0x0c, 0x13, 0x0a, 0xb8, - 0x49, 0xc2, 0xf2, 0x2b, 0x5c, 0xdd, 0x39, 0x21, 0x64, 0x0c, 0x8c, 0xf1, 0x97, 0x6a, - 0xe1, 0x01, 0x0b, 0x0d, 0xfd, 0x9c, 0xb2, 0x54, 0x3e, 0x45, 0xf9, 0x97, 0x49, 0xcc, - 0x4d, 0x61, 0xf2, 0xe8, 0xaa, 0xbf, 0xe9, 0x8b, 0xd9, 0x05, 0xfa, 0x39, 0x95, 0x1b, - 0x33, 0xea, 0x76, 0x9c, 0x45, 0xab, 0x95, 0x31, 0xc5, 0x72, 0x09, 0x86, 0x2a, 0xd1, - 0x2f, 0xd7, 0x6b, 0xa4, 0x80, 0x7e, 0x65, 0x41, 0x7b, 0x6c, 0xd1, 0x2f, 0xa8, 0xec, - 0x91, 0x6f, 0x01, 0x3e, 0xbb, 0x87, 0x06, 0xa9, 0xa5, 0x56, 0xc7, 0x62, 0xf8, 0x85, - 0x00, 0x00, 0xbd, 0xcb, 0xd4, 0x9f, 0xe4, 0xf8, 0x5b, 0x62, 0x3c, 0x78, 0x28, 0xc7, - 0x13, 0x82, 0xe1, 0x03, 0x4e, 0xa6, 0x7b, 0xc8, 0xae, 0x97, 0x40, 0x4b, 0x0c, 0x50, - 0xb2, 0xa0, 0x4f, 0x55, 0x9e, 0x49, 0x99, 0xd9, 0xc0, 0x99, 0x01, 0xbf, 0x39, 0xca, - 0xac, 0x48, 0xdc, 0x11, 0x95, 0x6a, 0x8a, 0xe9, 0x05, 0xea, 0xd8, 0x69, 0x54, 0x54, - 0x7c, 0x44, 0x8a, 0xe4, 0x3d, 0x31, 0x5e, 0x66, 0x9c, 0x42, 0x42, 0xda, 0x56, 0x59, - 0x38, 0xf4, 0x17, 0xbf, 0x43, 0xce, 0x7b, 0x2b, 0x30, 0xb1, 0xcd, 0x40, 0x18, 0x38, - 0x8e, 0x1a, 0x91, 0x0f, 0x0f, 0xc4, 0x1f, 0xb0, 0x87, 0x7a, 0x59, 0x25, 0xe4, 0x66, - 0x81, 0x9d, 0x37, 0x5b, 0x0a, 0x91, 0x2d, 0x4f, 0xe8, 0x43, 0xb7, 0x6e, 0xf6, 0xf2, - 0x23, 0xf0, 0xf7, 0xc8, 0x94, 0xf3, 0x8f, 0x7a, 0xb7, 0x80, 0xdf, 0xd7, 0x5f, 0x66, - 0x9c, 0x8c, 0x06, 0xcf, 0xfa, 0x43, 0xeb, 0x47, 0x56, 0x5a, 0x50, 0xe3, 0xb1, 0xfa, - 0x45, 0xad, 0x61, 0xce, 0x9a, 0x1c, 0x47, 0x27, 0xb7, 0xaa, 0xa5, 0x35, 0x62, 0xf5, - 0x23, 0xe7, 0x39, 0x52, 0xbb, 0xf3, 0x3d, 0x8a, 0x41, 0x04, 0x07, 0x8a, 0xde, 0x3e, - 0xaa, 0xa4, 0x96, 0x99, 0xa6, 0x9f, 0xdf, 0x1c, 0x5a, 0xc7, 0x73, 0x21, 0x46, 0xee, - 0x5e, 0x1d, 0x6b, 0x6c, 0xa9, 0xb9, 0x18, 0x0f, 0x96, 0x4c, 0xc9, 0xd0, 0x87, 0x8a, - 0xe1, 0x37, 0x35, 0x24, 0xd7, 0xd5, 0x10, 0xe5, 0x82, 0x27, 0xdf, 0x6d, 0xe9, 0xd3, - 0x0d, 0x27, 0x18, 0x67, 0x64, 0x01, 0x77, 0xb0, 0xf1, 0x85, 0x6e, 0x28, 0xd5, 0xc8, - 0xaf, 0xb0, 0x63, 0x0f, 0xe4, 0xfd, 0x5f, 0x22, 0x12, 0x5d, 0xe8, 0x40, 0xfc, 0xc4, - 0x0b, 0x98, 0x03, 0x8a, 0xf1, 0x1d, 0x55, 0xbe, 0x25, 0x43, 0x25, 0x97, 0xb4, 0xb6, - 0x5b, 0x9e, 0xc1, 0xc7, 0xa8, 0xbb, 0xfd, 0x05, 0x2c, 0xbf, 0x7e, 0x1c, 0x17, 0x85, - 0x31, 0x49, 0x34, 0xb2, 0x62, 0xd5, 0x85, 0x37, 0x54, 0xf1, 0xf1, 0x77, 0x71, 0xcf, - 0xb7, 0x50, 0x30, 0x72, 0x65, 0x57, 0x53, 0xfa, 0x3f, 0x54, 0xec, 0xc5, 0x87, 0xe9, - 0xf8, 0x3b, 0x58, 0x19, 0x16, 0x09, 0x2d, 0xf2, 0x6e, 0x63, 0xe1, 0x89, 0x94, 0xcb, - 0x0d, 0xb9, 0x1a, 0x0b, 0xbd, 0xc7, 0xb6, 0x11, 0x9b, 0x32, 0x22, 0x2a, 0xdf, 0x5e, - 0x61, 0xd8, 0xd8, 0xae, 0x89, 0xda, 0xe4, 0x95, 0x4b, 0x54, 0x81, 0x3b, 0xb3, 0x3f, - 0x08, 0xd5, 0x62, 0xba, 0x51, 0x3f, 0xee, 0x1b, 0x09, 0xc0, 0xfc, 0xd5, 0x16, 0x05, - 0x54, 0x19, 0x47, 0x4d, 0xd7, 0xfd, 0xa0, 0x38, 0xa8, 0x9c, 0x84, 0xea, 0x7b, 0x94, - 0x68, 0x28, 0x7f, 0x0e, 0xb0, 0xc1, 0x0c, 0x4b, 0x13, 0x25, 0x20, 0x19, 0x4d, 0x3d, - 0x8d, 0x53, 0x51, 0xfc, 0x10, 0xd0, 0x9c, 0x15, 0xc8, 0xcc, 0x10, 0x1a, 0xa1, 0x66, - 0x3b, 0xbf, 0x17, 0xb8, 0x41, 0x11, 0xf3, 0x8b, 0xb4, 0x39, 0xf0, 0x73, 0x53, 0xbd, - 0xea, 0x35, 0x96, 0xd1, 0x5e, 0x71, 0x3e, 0x1e, 0x2e, 0x7d, 0x3f, 0x1c, 0x93, 0xcf, - 0xcb, 0x46, 0x23, 0x8b, 0x6e, 0x03, 0x98, 0xb4, 0x6d, 0x76, 0xaf, 0xf2, 0xd8, 0xf0, - 0x57, 0x45, 0xc4, 0x65, 0xa9, 0x4f, 0xca, 0x43, 0x65, 0xa9, 0x37, 0x41, 0xb2, 0xe7, - 0x51, 0x6a, 0x1d, 0x2a, 0x00, 0xde, 0x7d, 0x1f, 0x80, 0xa5, 0xd3, 0xf7, 0x91, 0xd3, - 0x50, 0x58, 0xa9, 0x63, 0x80, 0xdc, 0xed, 0x30, 0x2c, 0x60, 0xc0, 0x06, 0x2f, 0x67, - 0xa3, 0x31, 0xcf, 0x71, 0xe0, 0x04, 0xef, 0x78, 0x40, 0x7a, 0x7c, 0x51, 0x16, 0x1c, - 0x7b, 0x8d, 0x46, 0xab, 0xa7, 0x67, 0x14, 0xba, 0xc1, 0x70, 0xd1, 0x85, 0xe2, 0x7c, - 0xe3, 0xeb, 0xff, 0x24, 0x46, 0x16, 0x4e, 0x0d, 0xb2, 0x3c, 0x02, 0xea, 0x33, 0x2b, - 0x6a, 0xfe, 0x11, 0x08, 0x4a, 0xc2, 0x5d, 0x73, 0xe6, 0x3e, 0x51, 0xe7, 0x5f, 0x6d, - 0xa7, 0x47, 0x07, 0xbe, 0xc9, 0xb1, 0xc2, 0x22, 0x4f, 0x11, 0xdc, 0x18, 0xed, 0x0a, - 0x6e, 0xff, 0xed, 0xa0, 0x6c, 0x4b, 0xe2, 0x4b, 0x04, 0x84, 0x63, 0x92, 0xe9, 0xd1, - 0xe6, 0x93, 0x0e, 0xae, 0x01, 0xfa, 0x21, 0xfb, 0xd7, 0x00, 0x58, 0x3f, 0xb5, 0x98, - 0xb9, 0x2c, 0x8f, 0x4e, 0xb8, 0xa6, 0x1a, 0xa6, 0x23, 0x5d, 0xb6, 0x0f, 0x28, 0x41, - 0xcf, 0x3a, 0x1c, 0x6a, 0xb5, 0x4c, 0x67, 0x06, 0x68, 0x44, 0x71, 0x1d, 0x09, 0x1e, - 0xb9, 0x31, 0xa1, 0xbd, 0x62, 0x81, 0xae, 0xdf, 0x2a, 0x0e, 0x8f, 0xab, 0x18, 0x81, - 0x72, 0x02, 0xa9, 0xbe, 0x06, 0x40, 0x2e, 0xd9, 0xcc, 0x72, 0x0c, 0x16, 0xbf, 0xe8, - 0x81, 0xe4, 0xdf, 0x42, 0x55, 0xe8, 0x7a, 0xfb, 0x7f, 0xc6, 0x2f, 0x38, 0x11, 0x6b, - 0xbe, 0x03, 0xcd, 0x8a, 0x3c, 0xb1, 0x1a, 0x27, 0xd5, 0x68, 0x41, 0x47, 0x82, 0xf4, - 0x7b, 0x1a, 0x44, 0xc9, 0x7c, 0x68, 0x04, 0x67, 0x69, 0x4b, 0xc9, 0x70, 0x9d, 0x32, - 0x91, 0x6c, 0x97, 0xe8, 0x00, 0x6c, 0xbb, 0x07, 0xba, 0x0e, 0x41, 0x80, 0xa3, 0x73, - 0x80, 0x38, 0xc3, 0x74, 0xc4, 0xcc, 0xe8, 0xf3, 0x29, 0x59, 0xaf, 0xb2, 0x5f, 0x30, - 0x3f, 0x58, 0x15, 0xc4, 0x53, 0x31, 0x24, 0xac, 0xf9, 0xd1, 0x89, 0x40, 0xe7, 0x75, - 0x22, 0xac, 0x5d, 0xc4, 0xb9, 0x57, 0x0a, 0xae, 0x8f, 0x47, 0xb7, 0xf5, 0x7f, 0xd8, - 0x76, 0x7b, 0xea, 0x1a, 0x24, 0xae, 0x7b, 0xed, 0x65, 0xb4, 0x09, 0xe1, 0xdd, 0x26, - 0xb8, 0xdd, 0xdd, 0x68, 0x85, 0x8d, 0x6f, 0x51, 0x61, 0xf0, 0x73, 0xd9, 0x06, 0x36, - 0x86, 0x0a, 0x9a, 0xae, 0xe1, 0x86, 0x29, 0xb0, 0x63, 0x30, 0xa8, 0xee, 0x30, 0x59, - 0x1d, 0xeb, 0xfc, 0xef, 0x56, 0xa0, 0x26, 0xbb, 0x28, 0xc3, 0xb0, 0x6e, 0xc2, 0xcf, - 0xaf, 0x5b, 0x79, 0xab, 0x72, 0x69, 0x4d, 0x1d, 0x01, 0x2a, 0x75, 0x94, 0xdd, 0x80, - 0xae, 0x7d, 0xfa, 0x0c, 0x00, + 0x05, 0x00, 0x00, 0x80, 0x0a, 0x27, 0xa7, 0x26, 0xb4, 0xd0, 0xd6, 0xc2, 0x1f, 0xc9, + 0x98, 0xc3, 0x1f, 0x4d, 0xd2, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x06, 0x04, 0x1f, 0x4d, 0xd2, 0x08, 0x00, 0xff, 0xff, 0xff, 0xff, 0x01, 0x50, + 0x58, 0xe5, 0x75, 0x4c, 0x21, 0x04, 0x00, 0x07, 0x53, 0xac, 0x51, 0x53, 0x00, 0x51, + 0x52, 0x00, 0x01, 0xe5, 0x84, 0x9f, 0x96, 0xba, 0xe6, 0xf2, 0x05, 0x6f, 0x33, 0xab, + 0x1e, 0x69, 0x89, 0xd7, 0xd2, 0x64, 0xad, 0xc9, 0x78, 0x55, 0xa9, 0x90, 0x10, 0x3b, + 0x4d, 0x1e, 0x63, 0x50, 0xd5, 0xc3, 0x1a, 0x39, 0xc3, 0xca, 0xf6, 0x94, 0x59, 0xe4, + 0x62, 0xf1, 0x41, 0xbe, 0x8b, 0x39, 0x03, 0x7f, 0xfa, 0x25, 0x5c, 0xe2, 0x7e, 0x4a, + 0xd7, 0xb5, 0x66, 0xa2, 0x96, 0x20, 0xa9, 0xf0, 0x11, 0xab, 0x08, 0xfb, 0x2a, 0xd3, + 0x05, 0x06, 0x52, 0xb3, 0xf6, 0x5b, 0x8e, 0x34, 0x52, 0x6a, 0x2a, 0x15, 0xfc, 0x2d, + 0xdc, 0x5b, 0x51, 0x13, 0xe4, 0x88, 0x2c, 0x7c, 0xca, 0x0d, 0xd5, 0x57, 0x7b, 0xe0, + 0x67, 0xba, 0x7a, 0x17, 0x5d, 0xae, 0x4b, 0xbe, 0x3e, 0xf4, 0x86, 0x3d, 0x53, 0x70, + 0x89, 0x15, 0x09, 0x0f, 0x47, 0xa0, 0x68, 0xe2, 0x27, 0x43, 0x3f, 0x9e, 0x49, 0xd3, + 0xaa, 0x09, 0xe3, 0x56, 0xd8, 0xd6, 0x6d, 0x0c, 0x01, 0x21, 0xe9, 0x1a, 0x3c, 0x4a, + 0xa3, 0xf2, 0x7f, 0xa1, 0xb6, 0x33, 0x96, 0xe2, 0xb4, 0x1d, 0xb9, 0x08, 0xfd, 0xab, + 0x8b, 0x18, 0xcc, 0x73, 0x04, 0xe9, 0x4e, 0x97, 0x05, 0x68, 0xf9, 0x42, 0x1c, 0x0d, + 0xbb, 0xba, 0xf8, 0x45, 0x98, 0xd9, 0x72, 0xb0, 0x53, 0x4f, 0x48, 0xa5, 0xe5, 0x26, + 0x70, 0x43, 0x6a, 0xaa, 0x77, 0x6e, 0xd2, 0x48, 0x2a, 0xd7, 0x03, 0x43, 0x02, 0x01, + 0xe5, 0x34, 0x43, 0xc3, 0x6d, 0xcf, 0xd3, 0x4a, 0x0c, 0xb6, 0x63, 0x78, 0x76, 0x10, + 0x5e, 0x79, 0xbf, 0x3b, 0xd5, 0x8e, 0xc1, 0x48, 0xcb, 0x64, 0x97, 0x0e, 0x32, 0x23, + 0xa9, 0x1f, 0x71, 0xdf, 0xcf, 0xd5, 0xa0, 0x4b, 0x66, 0x7f, 0xba, 0xf3, 0xd4, 0xb3, + 0xb9, 0x08, 0xb9, 0x82, 0x88, 0x20, 0xdf, 0xec, 0xdd, 0x75, 0x37, 0x50, 0xb5, 0xf9, + 0xd2, 0x21, 0x6e, 0x56, 0xc6, 0x15, 0x27, 0x2f, 0x85, 0x44, 0x64, 0xc0, 0xca, 0x4b, + 0x1e, 0x85, 0xae, 0xdd, 0x03, 0x82, 0x92, 0xc4, 0xe1, 0xa5, 0x77, 0x44, 0xeb, 0xba, + 0x01, 0x0b, 0x9e, 0xbf, 0xbb, 0x01, 0x1b, 0xd6, 0xf0, 0xb7, 0x88, 0x05, 0x02, 0x5d, + 0x27, 0xf3, 0xc1, 0x77, 0x46, 0xba, 0xe1, 0x16, 0xc1, 0x5d, 0x9f, 0x47, 0x1f, 0x0f, + 0x62, 0x88, 0xa1, 0x50, 0x64, 0x7b, 0x2a, 0xfe, 0x9d, 0xf7, 0xcc, 0xcf, 0x01, 0xf5, + 0xcd, 0xe5, 0xf0, 0x46, 0x80, 0xbb, 0xfe, 0xd8, 0x7f, 0x6c, 0xf4, 0x29, 0xfb, 0x27, + 0xad, 0x6b, 0xab, 0xe7, 0x91, 0x76, 0x66, 0x11, 0xcf, 0x5b, 0xc2, 0x0e, 0x48, 0xbe, + 0xf1, 0x19, 0x25, 0x9b, 0x9b, 0x8a, 0x0e, 0x39, 0xc3, 0xdf, 0x28, 0xcb, 0x95, 0x82, + 0xea, 0x33, 0x86, 0x01, 0xcd, 0xc4, 0x81, 0xb3, 0x2f, 0xb8, 0x2a, 0xde, 0xeb, 0xb3, + 0xda, 0xde, 0x25, 0xd1, 0xa3, 0xdf, 0x20, 0xc3, 0x7e, 0x71, 0x25, 0x06, 0xb5, 0xd9, + 0x96, 0xc4, 0x9a, 0x9f, 0x0f, 0x30, 0xdd, 0xcb, 0x91, 0xfe, 0x90, 0x04, 0xe1, 0xe8, + 0x32, 0x94, 0xa6, 0xc9, 0x20, 0x3d, 0x94, 0xe8, 0xdc, 0x2c, 0xbb, 0x44, 0x9d, 0xe4, + 0x15, 0x50, 0x32, 0x60, 0x4e, 0x47, 0x99, 0x70, 0x16, 0xb3, 0x04, 0xfd, 0x43, 0x7d, + 0x82, 0x35, 0x04, 0x5e, 0x25, 0x5a, 0x19, 0xb7, 0x43, 0xa0, 0xa9, 0xf2, 0xe3, 0x36, + 0xb4, 0x4c, 0xae, 0x30, 0x7b, 0xb3, 0x98, 0x7b, 0xd3, 0xe4, 0xe7, 0x77, 0xfb, 0xb3, + 0x4c, 0x0a, 0xb8, 0xcc, 0x3d, 0x67, 0x46, 0x6c, 0x0a, 0x88, 0xdd, 0x4c, 0xca, 0xd1, + 0x8a, 0x07, 0xa8, 0xd1, 0x06, 0x8d, 0xf5, 0xb6, 0x29, 0xe5, 0x71, 0x8d, 0x0f, 0x6d, + 0xf5, 0xc9, 0x57, 0xcf, 0x71, 0xbb, 0x00, 0xa5, 0x17, 0x8f, 0x17, 0x5c, 0xac, 0xa9, + 0x44, 0xe6, 0x35, 0xc5, 0x15, 0x9f, 0x73, 0x8e, 0x24, 0x02, 0xa2, 0xd2, 0x1a, 0xa0, + 0x81, 0xe1, 0x0e, 0x45, 0x6a, 0xfb, 0x00, 0xb9, 0xf6, 0x24, 0x16, 0xc8, 0xb9, 0xc0, + 0xf7, 0x22, 0x8f, 0x51, 0x07, 0x29, 0xe0, 0xbe, 0x3f, 0x30, 0x53, 0x13, 0xd7, 0x7f, + 0x73, 0x79, 0xdc, 0x2a, 0xf2, 0x48, 0x69, 0xc6, 0xc7, 0x4e, 0xe4, 0x47, 0x14, 0x98, + 0x86, 0x1d, 0x19, 0x2f, 0x0f, 0xf0, 0xf5, 0x08, 0x28, 0x5d, 0xab, 0x6b, 0x6a, 0x36, + 0xcc, 0xf7, 0xd1, 0x22, 0x56, 0xcc, 0x76, 0xb9, 0x55, 0x03, 0x72, 0x0a, 0xc6, 0x72, + 0xd0, 0x82, 0x68, 0xd2, 0xcf, 0x77, 0x73, 0xb6, 0xba, 0x2a, 0x5f, 0x66, 0x48, 0x47, + 0xbf, 0x70, 0x7f, 0x2f, 0xc1, 0x0c, 0x98, 0xf2, 0xf0, 0x06, 0xec, 0x22, 0xcc, 0xb5, + 0xa8, 0xc8, 0xb7, 0xc4, 0x0c, 0x7c, 0x2d, 0x49, 0xa6, 0x63, 0x9b, 0x9f, 0x2c, 0xe3, + 0x3c, 0x25, 0xc0, 0x4b, 0xc4, 0x61, 0xe7, 0x44, 0xdf, 0xa5, 0x36, 0xb0, 0x0d, 0x94, + 0xba, 0xdd, 0xf4, 0xf4, 0xd1, 0x40, 0x44, 0xc6, 0x95, 0xa3, 0x38, 0x81, 0x47, 0x7d, + 0xf1, 0x24, 0xf0, 0xfc, 0xf2, 0x06, 0xa9, 0xfb, 0x2e, 0x65, 0xe3, 0x04, 0xcd, 0xbf, + 0x0c, 0x4d, 0x23, 0x90, 0x17, 0x0c, 0x13, 0x0a, 0xb8, 0x49, 0xc2, 0xf2, 0x2b, 0x5c, + 0xdd, 0x39, 0x21, 0x64, 0x0c, 0x8c, 0xf1, 0x97, 0x6a, 0xe1, 0x01, 0x0b, 0x0d, 0xfd, + 0x9c, 0xb2, 0x54, 0x3e, 0x45, 0xf9, 0x97, 0x49, 0xcc, 0x4d, 0x61, 0xf2, 0xe8, 0xaa, + 0xbf, 0xe9, 0x8b, 0xd9, 0x05, 0xfa, 0x39, 0x95, 0x1b, 0x33, 0xea, 0x76, 0x9c, 0x45, + 0xab, 0x95, 0x31, 0xc5, 0x72, 0x09, 0x86, 0x2a, 0xd1, 0x2f, 0xd7, 0x6b, 0xa4, 0x80, + 0x7e, 0x65, 0x41, 0x7b, 0x6c, 0xd1, 0x2f, 0xa8, 0xec, 0x91, 0x6f, 0x01, 0x3e, 0xbb, + 0x87, 0x06, 0xa9, 0xa5, 0x56, 0xc7, 0x62, 0xf8, 0x85, 0x00, 0x00, 0x6e, 0xff, 0xed, + 0xa0, 0x6c, 0x4b, 0xe2, 0x4b, 0x04, 0x84, 0x63, 0x92, 0xe9, 0xd1, 0xe6, 0x93, 0x0e, + 0xae, 0x01, 0xfa, 0x21, 0xfb, 0xd7, 0x00, 0x58, 0x3f, 0xb5, 0x98, 0xb9, 0x2c, 0x8f, + 0x4e, 0xb8, 0xa6, 0x1a, 0xa6, 0x23, 0x5d, 0xb6, 0x0f, 0x28, 0x41, 0xcf, 0x3a, 0x1c, + 0x6a, 0xb5, 0x4c, 0x67, 0x06, 0x68, 0x44, 0x71, 0x1d, 0x09, 0x1e, 0xb9, 0x31, 0xa1, + 0xbd, 0x62, 0x81, 0xae, 0xdf, 0x2a, 0x0e, 0x8f, 0xab, 0x18, 0x81, 0x72, 0x02, 0xa9, + 0xbe, 0x06, 0x40, 0x2e, 0xd9, 0xcc, 0x72, 0x0c, 0x16, 0xbf, 0xe8, 0x81, 0xe4, 0xdf, + 0x42, 0x55, 0xe8, 0x7a, 0xfb, 0x7f, 0xc6, 0x2f, 0x38, 0x11, 0x6b, 0xbe, 0x03, 0xcd, + 0x8a, 0x3c, 0xb1, 0x1a, 0x27, 0xd5, 0x68, 0x41, 0x47, 0x82, 0xf4, 0x7b, 0x1a, 0x44, + 0xc9, 0x7c, 0x68, 0x04, 0x67, 0x69, 0x4b, 0xc9, 0x70, 0x9d, 0x32, 0x91, 0x6c, 0x97, + 0xe8, 0x00, 0x6c, 0xbb, 0x07, 0xba, 0x0e, 0x41, 0x80, 0xa3, 0x73, 0x80, 0x38, 0xc3, + 0x74, 0xc4, 0xcc, 0xe8, 0xf3, 0x29, 0x59, 0xaf, 0xb2, 0x5f, 0x30, 0x3f, 0x58, 0x15, + 0xc4, 0x53, 0x31, 0x24, 0xac, 0xf9, 0xd1, 0x89, 0x40, 0xe7, 0x75, 0x22, 0xac, 0x5d, + 0xc4, 0xb9, 0x57, 0x0a, 0xae, 0x8f, 0x47, 0xb7, 0xf5, 0x7f, 0xd8, 0x76, 0x7b, 0xea, + 0x1a, 0x24, 0xae, 0x7b, 0xed, 0x65, 0xb4, 0x09, 0xe1, 0xdd, 0x26, 0xb8, 0xdd, 0xdd, + 0x68, 0x85, 0x8d, 0x6f, 0x51, 0x61, 0xf0, 0x73, 0xd9, 0x06, 0x36, 0x86, 0x0a, 0x9a, + 0xae, 0xe1, 0x86, 0x29, 0xb0, 0x63, 0x30, 0xa8, 0xee, 0x30, 0x59, 0x1d, 0xeb, 0xfc, + 0xef, 0x56, 0xa0, 0x26, 0xbb, 0x28, 0xc3, 0xb0, 0x6e, 0xc2, 0xcf, 0xaf, 0x5b, 0x79, + 0xab, 0x72, 0x69, 0x4d, 0x1d, 0x01, 0x2a, 0x75, 0x94, 0xdd, 0x80, 0xae, 0x7d, 0xfa, + 0x0c, 0x00, ], txid: [ - 0x2f, 0x95, 0xe5, 0xa9, 0x5d, 0x20, 0x9e, 0x0a, 0x27, 0xd1, 0xfe, 0x66, 0x9a, 0x46, - 0xf4, 0xa6, 0x44, 0xa3, 0x27, 0xd7, 0x9b, 0x84, 0x6e, 0x97, 0x92, 0x64, 0x18, 0x6a, - 0xde, 0x04, 0x9b, 0xa0, + 0xa3, 0xcb, 0xad, 0xd7, 0xa5, 0x8d, 0x80, 0xa4, 0xc2, 0xf6, 0x18, 0x09, 0xc2, 0x4a, + 0x2f, 0x08, 0x6c, 0x58, 0xce, 0xec, 0xaf, 0x7a, 0xf9, 0x41, 0x4c, 0x38, 0xbd, 0xbd, + 0xc4, 0xe4, 0x6e, 0x98, ], auth_digest: [ - 0x36, 0x4e, 0xa0, 0xbf, 0x6b, 0xd4, 0xb4, 0xa6, 0x26, 0xdc, 0xcf, 0x0f, 0x96, 0xca, - 0x1b, 0x0c, 0x3b, 0x4c, 0x46, 0x81, 0x60, 0x24, 0x7b, 0xce, 0x13, 0xf4, 0x68, 0x98, - 0x84, 0x10, 0x4e, 0xb1, + 0xad, 0x64, 0x58, 0x0e, 0xd3, 0xa2, 0x8a, 0x3b, 0xa4, 0x1e, 0x2d, 0x32, 0x0b, 0x5f, + 0xf2, 0xa0, 0x7f, 0xa1, 0x9d, 0xb0, 0x74, 0xaf, 0xc4, 0x55, 0xe9, 0x2e, 0x0f, 0x32, + 0x6b, 0xe0, 0x8a, 0x6a, ], + amounts: vec![], + script_pubkeys: vec![], transparent_input: None, - script_code: None, - amount: None, - sighash_all: [ - 0x2f, 0x95, 0xe5, 0xa9, 0x5d, 0x20, 0x9e, 0x0a, 0x27, 0xd1, 0xfe, 0x66, 0x9a, 0x46, - 0xf4, 0xa6, 0x44, 0xa3, 0x27, 0xd7, 0x9b, 0x84, 0x6e, 0x97, 0x92, 0x64, 0x18, 0x6a, - 0xde, 0x04, 0x9b, 0xa0, + sighash_shielded: [ + 0xa3, 0xcb, 0xad, 0xd7, 0xa5, 0x8d, 0x80, 0xa4, 0xc2, 0xf6, 0x18, 0x09, 0xc2, 0x4a, + 0x2f, 0x08, 0x6c, 0x58, 0xce, 0xec, 0xaf, 0x7a, 0xf9, 0x41, 0x4c, 0x38, 0xbd, 0xbd, + 0xc4, 0xe4, 0x6e, 0x98, ], + sighash_all: None, sighash_none: None, sighash_single: None, sighash_all_anyone: None, @@ -487,27 +438,32 @@ lazy_static! { }, TestVector { tx: vec![ - 0x05, 0x00, 0x00, 0x80, 0x0a, 0x27, 0xa7, 0x26, 0x21, 0x96, 0x51, 0x37, 0xc2, 0xeb, - 0x51, 0x8f, 0x68, 0x98, 0x4d, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x80, 0x0a, 0x27, 0xa7, 0x26, 0xb4, 0xd0, 0xd6, 0xc2, 0xc2, 0xeb, + 0x51, 0x8f, 0x68, 0x98, 0x4d, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x06, 0x04, 0x68, 0x98, 0x4d, 0x02, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, ], txid: [ - 0xa2, 0x2f, 0x92, 0xf0, 0x43, 0x79, 0x3d, 0x10, 0x9d, 0xb7, 0x43, 0x54, 0xc7, 0xd4, - 0xe3, 0x28, 0x43, 0xe2, 0x11, 0x95, 0xe7, 0xca, 0xe4, 0xc0, 0x03, 0x0c, 0xf8, 0xb4, - 0x2c, 0xb6, 0x40, 0xf5, + 0x28, 0xd1, 0x6c, 0x3c, 0xd7, 0x8a, 0x6b, 0x7a, 0x50, 0xb1, 0x1a, 0x1b, 0x84, 0x17, + 0x76, 0x4c, 0x4e, 0x63, 0xc6, 0xe3, 0xd8, 0xaa, 0x28, 0x9f, 0x7e, 0x87, 0xe3, 0x98, + 0x45, 0x87, 0x27, 0x64, ], auth_digest: [ - 0xd4, 0xfb, 0x0a, 0x17, 0xd1, 0x4a, 0xee, 0x9b, 0x7f, 0x67, 0x05, 0xff, 0x78, 0xa1, - 0x43, 0xba, 0x07, 0xae, 0x4c, 0x59, 0xb2, 0x3c, 0x84, 0x77, 0xd0, 0xfd, 0x72, 0xf5, - 0x70, 0x97, 0xb7, 0x38, + 0x33, 0x21, 0x55, 0xb1, 0xcc, 0x23, 0xa2, 0x57, 0x1e, 0x86, 0xe4, 0x9e, 0x06, 0x01, + 0x0c, 0xd2, 0x53, 0x21, 0xdc, 0xfc, 0xca, 0x34, 0xae, 0x14, 0xe8, 0xb3, 0xf4, 0xf0, + 0x02, 0x70, 0xd2, 0x87, ], + amounts: vec![], + script_pubkeys: vec![], transparent_input: None, - script_code: None, - amount: None, - sighash_all: [ - 0xa2, 0x2f, 0x92, 0xf0, 0x43, 0x79, 0x3d, 0x10, 0x9d, 0xb7, 0x43, 0x54, 0xc7, 0xd4, - 0xe3, 0x28, 0x43, 0xe2, 0x11, 0x95, 0xe7, 0xca, 0xe4, 0xc0, 0x03, 0x0c, 0xf8, 0xb4, - 0x2c, 0xb6, 0x40, 0xf5, + sighash_shielded: [ + 0x28, 0xd1, 0x6c, 0x3c, 0xd7, 0x8a, 0x6b, 0x7a, 0x50, 0xb1, 0x1a, 0x1b, 0x84, 0x17, + 0x76, 0x4c, 0x4e, 0x63, 0xc6, 0xe3, 0xd8, 0xaa, 0x28, 0x9f, 0x7e, 0x87, 0xe3, 0x98, + 0x45, 0x87, 0x27, 0x64, ], + sighash_all: None, sighash_none: None, sighash_single: None, sighash_all_anyone: None, @@ -516,28 +472,32 @@ lazy_static! { }, TestVector { tx: vec![ - 0x05, 0x00, 0x00, 0x80, 0x0a, 0x27, 0xa7, 0x26, 0x21, 0x96, 0x51, 0x37, 0x5e, 0x3d, - 0xba, 0xf7, 0xae, 0x12, 0x67, 0x0d, 0x00, 0x01, 0x51, 0x6c, 0xf4, 0xad, 0xec, 0x75, - 0x07, 0x00, 0x03, 0x65, 0x65, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x80, 0x0a, 0x27, 0xa7, 0x26, 0xb4, 0xd0, 0xd6, 0xc2, 0x5e, 0x3d, + 0xba, 0xf7, 0xae, 0x12, 0x67, 0x0d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x06, 0x04, 0xae, 0x12, 0x67, 0x0d, 0x00, 0xff, 0xff, 0xff, 0xff, 0x01, 0x51, + 0x6c, 0xf4, 0xad, 0xec, 0x75, 0x07, 0x00, 0x03, 0x65, 0x65, 0x00, 0x00, 0x00, 0x00, ], txid: [ - 0x83, 0xc8, 0xe3, 0x41, 0x04, 0xf1, 0x8b, 0xdb, 0xe8, 0xbb, 0xf6, 0xf0, 0xb9, 0xba, - 0x53, 0xb5, 0xc6, 0x69, 0x40, 0x61, 0x0c, 0x89, 0x4b, 0xc0, 0xa8, 0x4a, 0x16, 0xdc, - 0x99, 0x51, 0x24, 0x74, + 0x6b, 0xf4, 0xef, 0xe7, 0x7a, 0xf6, 0x9b, 0x72, 0x19, 0x47, 0x5f, 0x60, 0xa0, 0xf7, + 0x92, 0xdb, 0x02, 0x63, 0xe4, 0xe1, 0x2f, 0xa1, 0xd9, 0xee, 0x1a, 0x1b, 0x9a, 0x68, + 0x54, 0x05, 0x90, 0xda, ], auth_digest: [ - 0xd4, 0xfb, 0x0a, 0x17, 0xd1, 0x4a, 0xee, 0x9b, 0x7f, 0x67, 0x05, 0xff, 0x78, 0xa1, - 0x43, 0xba, 0x07, 0xae, 0x4c, 0x59, 0xb2, 0x3c, 0x84, 0x77, 0xd0, 0xfd, 0x72, 0xf5, - 0x70, 0x97, 0xb7, 0x38, + 0x99, 0x3b, 0xfc, 0xa6, 0x14, 0x99, 0x75, 0xa4, 0x01, 0x37, 0x97, 0xea, 0xd5, 0x58, + 0x39, 0xa1, 0x3a, 0x0f, 0xb1, 0x52, 0xf6, 0x83, 0x72, 0xbb, 0x0e, 0x0f, 0xd9, 0x49, + 0x94, 0x77, 0xf9, 0x03, ], + amounts: vec![], + script_pubkeys: vec![], transparent_input: None, - script_code: None, - amount: None, - sighash_all: [ - 0x83, 0xc8, 0xe3, 0x41, 0x04, 0xf1, 0x8b, 0xdb, 0xe8, 0xbb, 0xf6, 0xf0, 0xb9, 0xba, - 0x53, 0xb5, 0xc6, 0x69, 0x40, 0x61, 0x0c, 0x89, 0x4b, 0xc0, 0xa8, 0x4a, 0x16, 0xdc, - 0x99, 0x51, 0x24, 0x74, + sighash_shielded: [ + 0x6b, 0xf4, 0xef, 0xe7, 0x7a, 0xf6, 0x9b, 0x72, 0x19, 0x47, 0x5f, 0x60, 0xa0, 0xf7, + 0x92, 0xdb, 0x02, 0x63, 0xe4, 0xe1, 0x2f, 0xa1, 0xd9, 0xee, 0x1a, 0x1b, 0x9a, 0x68, + 0x54, 0x05, 0x90, 0xda, ], + sighash_all: None, sighash_none: None, sighash_single: None, sighash_all_anyone: None, @@ -546,7 +506,7 @@ lazy_static! { }, TestVector { tx: vec![ - 0x05, 0x00, 0x00, 0x80, 0x0a, 0x27, 0xa7, 0x26, 0x21, 0x96, 0x51, 0x37, 0xff, 0x6a, + 0x05, 0x00, 0x00, 0x80, 0x0a, 0x27, 0xa7, 0x26, 0xb4, 0xd0, 0xd6, 0xc2, 0xff, 0x6a, 0xcc, 0x0f, 0xfc, 0x2e, 0x49, 0x0d, 0x03, 0x14, 0x6b, 0x9d, 0x49, 0xdd, 0x8c, 0x78, 0x35, 0xf4, 0x3a, 0x37, 0xdc, 0xa0, 0x78, 0x7e, 0x3e, 0xc9, 0xf6, 0x60, 0x52, 0x23, 0xd5, 0xba, 0x7a, 0xe0, 0xab, 0x90, 0x25, 0xb7, 0x3b, 0xc0, 0x3f, 0x7f, 0xac, 0x36, @@ -562,362 +522,344 @@ lazy_static! { 0x00, 0x09, 0x63, 0x6a, 0x53, 0x51, 0x52, 0x00, 0x65, 0xac, 0x65, 0x00, 0x00, 0x00, ], txid: [ - 0x42, 0xf4, 0x80, 0xd6, 0x10, 0xe0, 0xcd, 0xb6, 0xc8, 0x9c, 0xeb, 0xe9, 0x7a, 0xf4, - 0x0e, 0xd9, 0x8a, 0xb9, 0x0e, 0x43, 0x73, 0xfd, 0xd2, 0x46, 0xb1, 0x01, 0xe4, 0x30, - 0x21, 0xe7, 0x26, 0x2b, + 0xbc, 0x34, 0xe5, 0xca, 0x58, 0x1c, 0x5c, 0x65, 0x44, 0xaa, 0xfb, 0x3e, 0x58, 0x65, + 0x34, 0x8f, 0x71, 0xb8, 0xaa, 0x2a, 0x78, 0x2d, 0xf8, 0xb6, 0xbf, 0xa1, 0x79, 0x1b, + 0xf5, 0xa7, 0x37, 0x58, ], auth_digest: [ - 0x4b, 0x58, 0x88, 0x55, 0x8d, 0x0e, 0xa2, 0x9a, 0x24, 0x27, 0x28, 0x16, 0xb4, 0x14, - 0x2b, 0x9d, 0xc6, 0x82, 0x56, 0x81, 0xc0, 0xd6, 0xed, 0x99, 0x09, 0x76, 0x35, 0x55, - 0x40, 0xed, 0x45, 0xf7, + 0x6c, 0x36, 0xbc, 0x25, 0xfc, 0x48, 0x56, 0xe5, 0x09, 0x8e, 0x5d, 0x33, 0x03, 0x3c, + 0x5b, 0x38, 0x75, 0x21, 0x7f, 0xcb, 0x45, 0x52, 0x61, 0x18, 0xbb, 0x05, 0x8a, 0x2d, + 0xd7, 0xb6, 0xea, 0x5e, + ], + amounts: vec![1848924248978091, 447389782351145, 620151782842275], + script_pubkeys: vec![vec![0xac, 0x00, 0x00], vec![0x65, 0x65], vec![]], + transparent_input: Some(0), + sighash_shielded: [ + 0xa9, 0x60, 0xf4, 0xba, 0xa5, 0xf4, 0x33, 0x1f, 0x4d, 0xad, 0xc3, 0x74, 0x56, 0x6b, + 0xc0, 0x47, 0xe7, 0xc0, 0x71, 0x53, 0xb0, 0x38, 0x5a, 0x58, 0x7a, 0x2b, 0xe8, 0x6a, + 0x51, 0x8a, 0xb5, 0xd3, + ], + sighash_all: Some([ + 0x8f, 0x60, 0x76, 0x56, 0xc5, 0x2d, 0x9a, 0xd2, 0x23, 0x11, 0x20, 0xc2, 0x4f, 0xaa, + 0x7b, 0x68, 0x55, 0xae, 0x57, 0x1b, 0xee, 0x46, 0xe6, 0x1d, 0x76, 0xa2, 0x5c, 0xff, + 0xb2, 0xbb, 0x4f, 0xcb, + ]), + sighash_none: Some([ + 0xfd, 0xcf, 0x8a, 0x04, 0x69, 0x0d, 0xc2, 0x76, 0x9d, 0x93, 0x43, 0x37, 0xfe, 0x8b, + 0x47, 0x24, 0x2a, 0x6e, 0xd7, 0xc9, 0xd8, 0x6d, 0x3e, 0x01, 0x33, 0x24, 0x84, 0xd3, + 0x8d, 0x71, 0xe7, 0x85, + ]), + sighash_single: Some([ + 0xb3, 0xa2, 0x8e, 0xbd, 0x7c, 0xf3, 0x7a, 0x44, 0x3a, 0x40, 0x90, 0x9f, 0x51, 0x3f, + 0x08, 0x1f, 0xbe, 0x0f, 0xd7, 0x8c, 0x67, 0xf7, 0xc4, 0xf0, 0x1b, 0x5f, 0xb1, 0x15, + 0x97, 0x89, 0x86, 0x1a, + ]), + sighash_all_anyone: Some([ + 0x62, 0xea, 0xda, 0x92, 0xbb, 0xc5, 0xaf, 0x09, 0xab, 0x7b, 0x95, 0x83, 0x4a, 0xe6, + 0xba, 0x41, 0x3b, 0x17, 0xcd, 0xf1, 0x96, 0xa6, 0xf9, 0x9c, 0x54, 0x1b, 0x71, 0x0d, + 0xda, 0xcf, 0xa5, 0x45, + ]), + sighash_none_anyone: Some([ + 0xdf, 0xf0, 0xeb, 0x1e, 0x03, 0xb9, 0xc2, 0xfe, 0x30, 0x1d, 0xb9, 0xb0, 0x18, 0x35, + 0x83, 0x61, 0x88, 0x93, 0xc8, 0x47, 0x4e, 0xf5, 0x65, 0x92, 0x1d, 0x5f, 0x28, 0x32, + 0xed, 0xe3, 0xbf, 0x49, + ]), + sighash_single_anyone: Some([ + 0x1d, 0xe6, 0x07, 0xf1, 0x88, 0xa4, 0x0b, 0x5c, 0x15, 0x22, 0x26, 0xd9, 0x4e, 0x44, + 0x41, 0x1b, 0x69, 0x02, 0x94, 0x7d, 0x42, 0xfb, 0xb2, 0x5f, 0xb8, 0x6c, 0x9a, 0x4e, + 0x77, 0xa4, 0xf3, 0x5b, + ]), + }, + TestVector { + tx: vec![ + 0x05, 0x00, 0x00, 0x80, 0x0a, 0x27, 0xa7, 0x26, 0xb4, 0xd0, 0xd6, 0xc2, 0x23, 0xe1, + 0x19, 0xf6, 0x35, 0xef, 0x1d, 0x05, 0x02, 0x4b, 0x21, 0x6b, 0x70, 0x23, 0xfa, 0xdc, + 0x2d, 0x25, 0x94, 0x9c, 0x90, 0x03, 0x7e, 0x71, 0xe3, 0xe5, 0x50, 0x72, 0x6d, 0x21, + 0x0a, 0x2c, 0x68, 0x83, 0x42, 0xe5, 0x24, 0x40, 0x63, 0x5e, 0x9c, 0xc1, 0x4a, 0xfe, + 0x10, 0x06, 0x65, 0x51, 0x51, 0x51, 0xac, 0x53, 0x78, 0x2e, 0x9e, 0x4a, 0x5f, 0xa8, + 0x7f, 0x0a, 0x95, 0x6f, 0x5b, 0x85, 0x50, 0x99, 0x60, 0x28, 0x5c, 0x22, 0x62, 0x7c, + 0x59, 0x48, 0x3a, 0x5a, 0x4c, 0x28, 0xcc, 0xe4, 0xb1, 0x56, 0xe5, 0x51, 0x40, 0x6a, + 0x7e, 0xe8, 0x35, 0x56, 0x56, 0xa2, 0x00, 0x43, 0xe3, 0x8c, 0xe1, 0x03, 0xbd, 0x9a, + 0x27, 0x4e, 0x28, 0x8d, 0x02, 0x00, 0x00, 0xaa, 0xfe, 0x03, 0x32, 0x52, 0xc7, 0x03, + 0x00, 0x05, 0x51, 0x6a, 0x63, 0x65, 0x63, 0x38, 0xeb, 0x8b, 0x41, 0xca, 0x51, 0x04, + 0x00, 0x06, 0x53, 0x51, 0x63, 0x65, 0xac, 0xac, 0x00, 0x00, 0x00, + ], + txid: [ + 0x90, 0xd2, 0x88, 0x6c, 0xb6, 0x28, 0x81, 0x33, 0x71, 0xc7, 0xd1, 0xbd, 0x02, 0x03, + 0x1b, 0x6c, 0xa6, 0x6b, 0x42, 0xd1, 0xdb, 0x4e, 0x11, 0x8d, 0x65, 0xf3, 0x1b, 0x2d, + 0xcc, 0xb6, 0x32, 0x35, + ], + auth_digest: [ + 0x9c, 0x05, 0x32, 0xe6, 0x78, 0x8f, 0xe9, 0xe2, 0x8b, 0x3b, 0x67, 0xf5, 0x71, 0x98, + 0x9b, 0xe7, 0x7a, 0xe7, 0x61, 0xdf, 0xd3, 0x75, 0xc7, 0x4b, 0xbf, 0x5d, 0xb3, 0xca, + 0xfa, 0xa1, 0xf9, 0xa5, + ], + amounts: vec![1561051182746413, 1535468271734483], + script_pubkeys: vec![ + vec![0x65, 0x6a, 0x51, 0x6a, 0xac, 0x51, 0x6a, 0x65, 0x52], + vec![0x52], ], transparent_input: Some(1), - script_code: Some(vec![0xac, 0x00, 0x00]), - amount: Some(693972628630138), - sighash_all: [ - 0x2c, 0xac, 0x9b, 0xfd, 0x4a, 0x4a, 0xb0, 0x12, 0x49, 0x21, 0xa2, 0x0c, 0x04, 0xf2, - 0x53, 0xaf, 0xd3, 0xba, 0x17, 0xec, 0x5c, 0xae, 0xc9, 0xa8, 0x22, 0x35, 0x62, 0xb7, - 0xa6, 0x41, 0x3a, 0x4f, + sighash_shielded: [ + 0x24, 0xa9, 0x1d, 0x01, 0x7e, 0x69, 0x1f, 0xe7, 0xd5, 0x80, 0xe3, 0xfc, 0x16, 0x87, + 0x2d, 0x61, 0x2c, 0x14, 0xbf, 0xcb, 0xe5, 0xe2, 0x72, 0x5e, 0x16, 0xd0, 0x9e, 0xc0, + 0xc1, 0xc9, 0x13, 0x05, ], + sighash_all: Some([ + 0x2b, 0xea, 0x7c, 0x00, 0xcf, 0x77, 0xfa, 0x59, 0xa6, 0x3a, 0xb0, 0xbd, 0x3e, 0xb7, + 0xb1, 0x06, 0x59, 0xf8, 0xfc, 0x9e, 0x4c, 0x48, 0x94, 0xba, 0xfc, 0x37, 0x64, 0x0e, + 0x86, 0x55, 0xf5, 0x62, + ]), sighash_none: Some([ - 0x98, 0x6d, 0xf7, 0x0c, 0xe9, 0x5b, 0x5c, 0x4c, 0x4f, 0x42, 0xb9, 0x66, 0xbb, 0x4d, - 0x2a, 0x73, 0x1a, 0x78, 0x7d, 0x7f, 0xa8, 0x40, 0xed, 0x5e, 0x7b, 0x02, 0x40, 0x93, - 0x58, 0x50, 0x70, 0xc3, + 0xe6, 0x36, 0x03, 0xea, 0xde, 0x7d, 0xde, 0x98, 0xef, 0x0e, 0xd6, 0x8d, 0xe6, 0x40, + 0x70, 0x7d, 0xf6, 0xcc, 0x9c, 0x33, 0x78, 0x37, 0xbc, 0xbd, 0xcd, 0xe0, 0x5a, 0x07, + 0xff, 0x7d, 0x87, 0x3b, ]), sighash_single: Some([ - 0x5c, 0x0d, 0x6b, 0xce, 0x77, 0xa3, 0x94, 0x2c, 0xba, 0x43, 0x28, 0x42, 0xb0, 0xdc, - 0x51, 0xef, 0x5a, 0x5a, 0xe1, 0x53, 0x9f, 0xf9, 0x9c, 0xf1, 0x55, 0xa5, 0x9f, 0x45, - 0xaf, 0x2a, 0xe3, 0x0c, + 0xe4, 0xb2, 0xf9, 0x8a, 0xd7, 0xb5, 0x5f, 0xb2, 0x56, 0xa1, 0x29, 0x23, 0x30, 0x3a, + 0xbc, 0xae, 0xee, 0x38, 0x35, 0x10, 0x90, 0xe9, 0x76, 0xb0, 0x19, 0x5d, 0xd7, 0x5b, + 0xdc, 0xf9, 0x4a, 0xd9, ]), sighash_all_anyone: Some([ - 0xd7, 0x52, 0x77, 0xd4, 0x24, 0x0e, 0x70, 0xab, 0x54, 0x98, 0xbf, 0xa7, 0xcf, 0x99, - 0x89, 0x1c, 0x46, 0x16, 0x57, 0xce, 0xa0, 0xf6, 0x28, 0xf0, 0x53, 0x6e, 0x42, 0x87, - 0x6d, 0xde, 0x6e, 0x52, + 0x61, 0xc7, 0x05, 0xd5, 0x50, 0x5f, 0x0d, 0x5c, 0xfb, 0x3a, 0x28, 0x51, 0x9d, 0x79, + 0x1f, 0x14, 0x57, 0x70, 0x4f, 0x7b, 0x38, 0x39, 0x2e, 0xff, 0x88, 0x5a, 0x82, 0x07, + 0xfa, 0x68, 0x3c, 0x57, ]), sighash_none_anyone: Some([ - 0xe6, 0x9b, 0xf5, 0x8c, 0x28, 0x86, 0xa8, 0xa4, 0xd8, 0x57, 0x53, 0x24, 0xce, 0x8e, - 0xe5, 0xd9, 0x19, 0x80, 0x83, 0xc8, 0xde, 0x79, 0x9e, 0x3b, 0x6c, 0x2b, 0x58, 0xa4, - 0x74, 0xa6, 0x9b, 0x28, + 0xf3, 0x5e, 0xa9, 0xbe, 0xb0, 0xb7, 0xed, 0x68, 0x2d, 0x27, 0xef, 0x78, 0xdd, 0xe1, + 0x17, 0x8d, 0x6a, 0x55, 0xf3, 0x07, 0xc8, 0x51, 0x21, 0xcd, 0x83, 0x02, 0x58, 0xd8, + 0x9d, 0x33, 0xcd, 0xd1, ]), sighash_single_anyone: Some([ - 0x9e, 0x53, 0x5b, 0x3d, 0x36, 0x52, 0xae, 0xf5, 0xe9, 0x63, 0xf2, 0xff, 0xec, 0x33, - 0x27, 0x8d, 0x92, 0xee, 0xed, 0xd0, 0x0d, 0xaf, 0x9c, 0x6c, 0x2b, 0x42, 0xb0, 0xdc, - 0x41, 0x84, 0x98, 0x5d, + 0xae, 0xce, 0x3f, 0x45, 0x76, 0x98, 0x76, 0xd8, 0x7b, 0x50, 0x47, 0x8b, 0x90, 0xcd, + 0x5e, 0x3b, 0x37, 0xb7, 0xf4, 0xc5, 0x5b, 0x38, 0xf7, 0x56, 0xa5, 0x74, 0x86, 0xa3, + 0x10, 0x61, 0xdf, 0xa8, ]), }, TestVector { tx: vec![ - 0x05, 0x00, 0x00, 0x80, 0x0a, 0x27, 0xa7, 0x26, 0x21, 0x96, 0x51, 0x37, 0xde, 0xdc, - 0x5e, 0x5f, 0x07, 0x56, 0xfb, 0x19, 0x00, 0x01, 0x33, 0xa4, 0x90, 0x76, 0x8c, 0x16, - 0x00, 0x00, 0x08, 0x51, 0x53, 0x53, 0x51, 0x51, 0x65, 0x63, 0x00, 0x00, 0x01, 0xda, - 0xb9, 0x57, 0x81, 0x57, 0xeb, 0xf9, 0xcd, 0x81, 0x13, 0x07, 0x88, 0x66, 0xe9, 0x52, - 0xd6, 0x21, 0x8c, 0x69, 0x45, 0x5f, 0xbc, 0x9c, 0x55, 0x48, 0x72, 0x5b, 0x18, 0x9c, - 0xc2, 0x16, 0xab, 0x58, 0x48, 0x3a, 0x5a, 0x4d, 0x28, 0xcc, 0xe4, 0xb2, 0xfa, 0xe6, - 0x51, 0x3d, 0xc6, 0xc0, 0x94, 0x30, 0x7e, 0xb4, 0x98, 0x16, 0x6b, 0xa9, 0x59, 0x99, - 0xac, 0x5f, 0x84, 0x64, 0xb2, 0xff, 0x6b, 0x29, 0x5d, 0x6e, 0x94, 0xb0, 0x22, 0x7b, - 0x5c, 0x43, 0xa1, 0x21, 0xa3, 0x4a, 0xc9, 0x07, 0xe8, 0xd0, 0xd0, 0x7a, 0x2d, 0x6d, - 0x79, 0x71, 0x2a, 0x77, 0x66, 0x14, 0xb0, 0xcd, 0xec, 0x4d, 0xe0, 0x9b, 0x26, 0x27, - 0x21, 0x8f, 0x0c, 0x29, 0x2f, 0xa6, 0x6a, 0xda, 0x94, 0x5f, 0xa5, 0x5b, 0xb2, 0x35, - 0x48, 0xe3, 0x3a, 0x83, 0xa5, 0x62, 0x95, 0x7a, 0x31, 0x49, 0xa9, 0x93, 0xcc, 0x47, - 0x23, 0x62, 0x29, 0x87, 0x36, 0xa8, 0xb7, 0x78, 0xd9, 0x7c, 0xe4, 0x23, 0x01, 0x3d, - 0x64, 0xb3, 0x2c, 0xd1, 0x72, 0xef, 0xa5, 0x51, 0xbf, 0x7f, 0x36, 0x8f, 0x04, 0xbd, - 0xae, 0xc6, 0x09, 0x1a, 0x30, 0x04, 0xa7, 0x57, 0x59, 0x8b, 0x80, 0x1d, 0xcf, 0x67, - 0x5c, 0xb8, 0x3e, 0x43, 0xa5, 0x3a, 0xe8, 0xb2, 0x54, 0xd3, 0x33, 0xbc, 0xda, 0x20, - 0xd4, 0x81, 0x7d, 0x34, 0x77, 0xab, 0xfb, 0xa2, 0x5b, 0xb8, 0x3d, 0xf5, 0x94, 0x9c, - 0x12, 0x6f, 0x14, 0x9b, 0x1d, 0x99, 0x34, 0x1e, 0x4e, 0x6f, 0x91, 0x20, 0xf4, 0xd4, - 0x1e, 0x62, 0x91, 0x85, 0x00, 0x2c, 0x72, 0xc0, 0x12, 0xc4, 0x14, 0xd2, 0x38, 0x2a, - 0x6d, 0x47, 0xc7, 0xb3, 0xde, 0xab, 0xa7, 0x70, 0xc4, 0x00, 0xca, 0x96, 0xb2, 0x81, - 0x4f, 0x6b, 0x26, 0xc3, 0xef, 0x17, 0x42, 0x9f, 0x1a, 0x98, 0xc8, 0x5d, 0x83, 0xdb, - 0x20, 0xef, 0xad, 0x48, 0xbe, 0x89, 0x96, 0xfb, 0x1b, 0xff, 0x59, 0x1e, 0xff, 0xf3, - 0x60, 0xfe, 0x11, 0x99, 0x05, 0x6c, 0x56, 0xe5, 0xfe, 0xec, 0x61, 0xa7, 0xb8, 0xb9, - 0xf6, 0x99, 0xd6, 0x01, 0x2c, 0x28, 0x49, 0x23, 0x2f, 0x32, 0x9f, 0xef, 0x95, 0xc7, - 0xaf, 0x37, 0x00, 0x98, 0xff, 0xe4, 0x91, 0x8e, 0x0c, 0xa1, 0xdf, 0x47, 0xf2, 0x75, - 0x86, 0x7b, 0x73, 0x9e, 0x0a, 0x51, 0x4d, 0x32, 0x09, 0x32, 0x5e, 0x21, 0x70, 0x45, - 0x92, 0x7b, 0x47, 0x9c, 0x1c, 0xe2, 0xe5, 0xd5, 0x4f, 0x25, 0x48, 0x8c, 0xad, 0x15, - 0x13, 0xe3, 0xf4, 0x4a, 0x21, 0x26, 0x6c, 0xfd, 0x84, 0x16, 0x33, 0x32, 0x7d, 0xee, - 0x6c, 0xf8, 0x10, 0xfb, 0xf7, 0x39, 0x3e, 0x31, 0x7d, 0x9e, 0x53, 0xd1, 0xbe, 0x1d, - 0x5a, 0xe7, 0x83, 0x9b, 0x66, 0xb9, 0x43, 0xb9, 0xed, 0x18, 0xf2, 0xc5, 0x30, 0xe9, - 0x75, 0x42, 0x23, 0x32, 0xc3, 0x43, 0x9c, 0xce, 0x49, 0xa2, 0x9f, 0x2a, 0x33, 0x6a, - 0x48, 0x51, 0x26, 0x3c, 0x5e, 0x9b, 0xd1, 0x3d, 0x73, 0x11, 0x09, 0xe8, 0x44, 0xb7, - 0xf8, 0xc3, 0x92, 0xa5, 0xc1, 0xdc, 0xaa, 0x2a, 0xe5, 0xf5, 0x0f, 0xf6, 0x3f, 0xab, - 0x97, 0x65, 0xe0, 0x16, 0x70, 0x2c, 0x35, 0xa6, 0x7c, 0xd7, 0x36, 0x4d, 0x3f, 0xab, - 0x55, 0x2f, 0xb3, 0x49, 0xe3, 0x5c, 0x15, 0xc5, 0x02, 0x50, 0x45, 0x3f, 0xd1, 0x8f, - 0x7b, 0x85, 0x59, 0x92, 0x63, 0x2e, 0x2c, 0x76, 0xc0, 0xfb, 0xf1, 0xef, 0x96, 0x3e, - 0xa8, 0x0e, 0x32, 0x23, 0xde, 0x32, 0x77, 0xbc, 0x55, 0x92, 0x51, 0x72, 0x58, 0x29, - 0xec, 0x03, 0xf2, 0x13, 0xba, 0x89, 0x55, 0xca, 0xb2, 0x82, 0x2f, 0xf2, 0x1a, 0x9b, - 0x0a, 0x49, 0x04, 0xd6, 0x68, 0xfc, 0xd7, 0x72, 0x24, 0xbd, 0xe3, 0xdd, 0x01, 0xf6, - 0xff, 0xc4, 0x82, 0x8f, 0x6b, 0x64, 0x23, 0x0b, 0x35, 0xc6, 0xa0, 0x49, 0x87, 0x34, - 0x94, 0x27, 0x6e, 0xa1, 0xd7, 0xed, 0x5e, 0x92, 0xcb, 0x4f, 0x90, 0xba, 0x83, 0xa9, - 0xe4, 0x96, 0x01, 0xb1, 0x94, 0x04, 0x2f, 0x29, 0x00, 0xd9, 0x9d, 0x31, 0x2d, 0x7b, - 0x70, 0x50, 0x8c, 0xf1, 0x76, 0x06, 0x6d, 0x15, 0x4d, 0xbe, 0x96, 0xef, 0x9d, 0x43, - 0x67, 0xe4, 0xc8, 0x40, 0xe4, 0xa1, 0x7b, 0x5e, 0x51, 0x22, 0xe8, 0xeb, 0xe2, 0x15, - 0x8a, 0x3c, 0x5f, 0x4c, 0xba, 0xe2, 0x1e, 0xa3, 0xfa, 0x1a, 0xe6, 0xc2, 0x5a, 0x94, - 0x62, 0xeb, 0xcb, 0xb0, 0xfd, 0x5f, 0x14, 0x55, 0x4b, 0xc9, 0x77, 0x47, 0xc3, 0x3e, - 0x34, 0xda, 0x90, 0xc8, 0x16, 0xd8, 0xd0, 0xd5, 0x0b, 0xfe, 0x37, 0x61, 0x8c, 0x58, - 0x12, 0x89, 0x14, 0x84, 0xfa, 0x25, 0x93, 0x22, 0xc1, 0x50, 0x92, 0xd4, 0x15, 0x5d, - 0x86, 0x96, 0xd6, 0xf1, 0x2f, 0x24, 0xfd, 0x36, 0x44, 0x96, 0xb3, 0xbe, 0x08, 0x71, - 0xca, 0x3d, 0xd9, 0x62, 0x53, 0x48, 0xa6, 0x14, 0xb5, 0x9b, 0xde, 0x45, 0x88, 0x56, - 0x49, 0xba, 0xe3, 0x6d, 0xe3, 0x4d, 0xef, 0x8f, 0xce, 0xc8, 0x53, 0x43, 0x47, 0x5d, - 0x97, 0x6a, 0xe1, 0xe9, 0xb2, 0x78, 0x29, 0xce, 0x2a, 0xc5, 0xef, 0xd0, 0xb3, 0x99, - 0xa8, 0xb4, 0x48, 0xbe, 0x65, 0x04, 0x29, 0x4e, 0xe6, 0xb3, 0xc1, 0xc6, 0xa5, 0x34, - 0x2d, 0x7c, 0x01, 0xae, 0x9d, 0x8a, 0xd3, 0x07, 0x0c, 0x2b, 0x1a, 0x91, 0x57, 0x3a, - 0xf5, 0xe0, 0xc5, 0xe4, 0xcb, 0xbf, 0x4a, 0xcd, 0xc6, 0xb5, 0x4c, 0x92, 0x72, 0x20, - 0x0d, 0x99, 0x70, 0x25, 0x0c, 0x17, 0xc1, 0x03, 0x6f, 0x06, 0x08, 0x5c, 0x41, 0x85, - 0x8e, 0xd3, 0xa0, 0xc4, 0x81, 0x50, 0xbc, 0x69, 0x7e, 0x4a, 0x69, 0x5f, 0xef, 0xc6, - 0xbe, 0x7b, 0x68, 0xd0, 0x12, 0x02, 0x00, 0x33, 0x5f, 0x7a, 0xd0, 0x7e, 0x1a, 0x46, - 0xdc, 0x76, 0x7f, 0xf8, 0x22, 0xdb, 0x70, 0xe6, 0x66, 0x90, 0x80, 0xb9, 0x81, 0x6b, - 0x22, 0x32, 0xc8, 0x1a, 0x4c, 0x66, 0xcc, 0x58, 0x6a, 0xbf, 0xe1, 0xea, 0xa8, 0xca, - 0x6c, 0xf4, 0x1f, 0xc3, 0xc3, 0xe6, 0xc7, 0xb8, 0x86, 0xfb, 0x6d, 0xac, 0x9f, 0x48, - 0x22, 0xb4, 0xfc, 0x6f, 0xff, 0x9d, 0x05, 0x13, 0xd6, 0x1a, 0x21, 0xc8, 0x0a, 0x37, - 0x76, 0x71, 0xd1, 0x35, 0xa6, 0x68, 0xa0, 0xae, 0x2b, 0xb9, 0x34, 0xc8, 0x2c, 0x41, - 0x42, 0xda, 0x69, 0xd1, 0x2c, 0xa7, 0xde, 0x9a, 0x7d, 0xf7, 0x06, 0x40, 0x0e, 0xc7, - 0x98, 0x78, 0xd8, 0x68, 0xe1, 0x7e, 0x8f, 0x71, 0xea, 0x31, 0x49, 0x5a, 0xf8, 0x19, - 0xa0, 0x16, 0xcc, 0x41, 0x9e, 0x07, 0xc5, 0x01, 0xaa, 0x83, 0x09, 0xb2, 0xe6, 0xc8, - 0x5b, 0x79, 0xb2, 0x76, 0x37, 0x33, 0xa3, 0x7b, 0xbc, 0x04, 0x20, 0xd4, 0x25, 0x37, - 0xb8, 0x71, 0xb4, 0x29, 0x4a, 0x65, 0xd3, 0xe0, 0x55, 0xff, 0x71, 0x8d, 0xd9, 0xdc, - 0x8c, 0x75, 0xe7, 0xe5, 0xb2, 0xef, 0xe4, 0x42, 0x63, 0x73, 0x71, 0xb7, 0xc4, 0x8f, - 0x6e, 0xe9, 0x9e, 0x3e, 0xa3, 0x8a, 0x4b, 0x0f, 0x2f, 0x67, 0xfc, 0x2b, 0x90, 0x8c, - 0xda, 0x65, 0x7e, 0xae, 0x75, 0x4e, 0x03, 0x7e, 0x26, 0x2e, 0x9a, 0x9f, 0x9b, 0xd7, - 0xec, 0x42, 0x67, 0xb5, 0x42, 0x02, 0x40, 0xad, 0xd2, 0x0a, 0x38, 0x9c, 0xb6, 0x78, - 0x70, 0x69, 0x17, 0xf9, 0x7c, 0xc8, 0x16, 0x2f, 0xb1, 0xdc, 0xc6, 0xc2, 0x8b, 0x6e, - 0xda, 0x93, 0x0f, 0x05, 0x5c, 0xe8, 0x6b, 0xd8, 0x4e, 0xc0, 0xf3, 0xff, 0xac, 0xda, - 0x10, 0x48, 0x5c, 0xce, 0x03, 0x7a, 0x43, 0xb0, 0x78, 0x0f, 0xd5, 0x91, 0x45, 0x23, - 0x90, 0xc9, 0x24, 0xc0, 0x4f, 0x54, 0x92, 0x4b, 0xf6, 0xac, 0x0d, 0x02, 0x5b, 0x39, - 0xb0, 0x13, 0x98, 0xf3, 0x7e, 0x78, 0x06, 0x7c, 0xfa, 0x37, 0x4b, 0xb5, 0x3e, 0xb0, - 0x0f, 0xb2, 0xa9, 0x5d, 0x03, 0xda, 0xbf, 0x6b, 0xf6, 0xc5, 0xf7, 0x7f, 0xee, 0xaf, - 0x65, 0x10, 0x68, 0xaa, 0xe4, 0x77, 0xfc, 0xe4, 0x10, 0xac, 0x2d, 0x5d, 0xe6, 0x09, - 0x58, 0x61, 0xc1, 0x11, 0xd7, 0xfe, 0xb3, 0xe6, 0xbb, 0x4f, 0xbb, 0x5a, 0x54, 0x95, - 0x54, 0x95, 0x97, 0x27, 0x98, 0x35, 0xc7, 0x2c, 0x63, 0x3a, 0x4b, 0xd0, 0x1b, 0x15, - 0x0b, 0xe2, 0x8e, 0xc3, 0xd8, 0x43, 0xf1, 0xbc, 0xfc, 0x0b, 0xf3, 0x5b, 0x77, 0x2a, - 0x3c, 0x72, 0x63, 0xdc, 0x89, 0x01, 0x6e, 0xd4, 0xa1, 0x12, 0xed, 0x84, 0x06, 0xf9, - 0x69, 0x80, 0x28, 0x87, 0x26, 0x59, 0x9c, 0x12, 0x38, 0x97, 0x86, 0x91, 0xba, 0x42, - 0x1d, 0xf6, 0x02, 0x7d, 0xe5, 0xaf, 0x1e, 0x47, 0x45, 0xd5, 0x86, 0x81, 0x06, 0x15, - 0x64, 0xd9, 0x51, 0xeb, 0x76, 0x84, 0xde, 0xdc, 0xd3, 0x35, 0xfb, 0x1b, 0xd2, 0xa6, - 0x97, 0x8c, 0xdb, 0x79, 0x7e, 0x1f, 0x3b, 0x65, 0x9d, 0x3a, 0x55, 0x7e, 0x40, 0x77, - 0x35, 0x75, 0x3c, 0x8f, 0x8a, 0x2b, 0x7d, 0x43, 0x85, 0xf1, 0xc9, 0x5a, 0xf9, 0x37, - 0xdf, 0x78, 0xdf, 0xd8, 0x75, 0x7f, 0xab, 0x43, 0x49, 0x68, 0xb0, 0xb5, 0x7c, 0x66, - 0x57, 0x44, 0x68, 0xf1, 0x60, 0xb4, 0x47, 0xac, 0x82, 0x21, 0xe5, 0x06, 0x06, 0x76, - 0xa8, 0x42, 0xa1, 0xc6, 0xb7, 0x17, 0x2d, 0xd3, 0x34, 0x0f, 0x76, 0x40, 0x70, 0xab, - 0x1f, 0xe0, 0x91, 0xc5, 0xc7, 0x4c, 0x95, 0xa5, 0xdc, 0x04, 0x33, 0x90, 0x72, 0x3a, - 0x4c, 0x12, 0x7d, 0xa1, 0x4c, 0xdd, 0xe1, 0xdc, 0x26, 0x75, 0xa6, 0x23, 0x40, 0xb3, - 0xe6, 0xaf, 0xd0, 0x52, 0x2a, 0x31, 0xde, 0x26, 0xe7, 0xd1, 0xec, 0x3a, 0x9c, 0x8a, - 0x09, 0x1f, 0xfd, 0xc7, 0x5b, 0x7e, 0xcf, 0xdc, 0x7c, 0x12, 0x99, 0x5a, 0x5e, 0x37, - 0xce, 0x34, 0x88, 0xbd, 0x29, 0xf8, 0x62, 0x9d, 0x68, 0xf6, 0x96, 0x49, 0x24, 0x48, - 0xdd, 0x52, 0x66, 0x97, 0x47, 0x6d, 0xc0, 0x61, 0x34, 0x6e, 0xbe, 0x3f, 0x67, 0x72, - 0x17, 0xff, 0x9c, 0x60, 0xef, 0xce, 0x94, 0x3a, 0xf2, 0x8d, 0xfd, 0x3f, 0x9e, 0x59, - 0x69, 0x25, 0x98, 0xa6, 0x04, 0x7c, 0x23, 0xc4, 0xc0, 0x14, 0x00, 0xf1, 0xab, 0x57, - 0x30, 0xea, 0xc0, 0xae, 0x8d, 0x58, 0x43, 0xd5, 0x05, 0x1c, 0x37, 0x62, 0x40, 0x17, - 0x2a, 0xf2, 0x18, 0xd7, 0xa1, 0xec, 0xfe, 0x65, 0xb4, 0xf7, 0x51, 0x00, 0x63, 0x89, - 0x83, 0xc1, 0x4d, 0xe4, 0x97, 0x47, 0x55, 0xda, 0xde, 0x80, 0x18, 0xc9, 0xb8, 0xf4, - 0x54, 0x3f, 0xb0, 0x95, 0x96, 0x15, 0x13, 0xe6, 0x7c, 0x61, 0xdb, 0xc5, 0x9c, 0x60, - 0x7f, 0x9b, 0x51, 0xf8, 0xd0, 0x9b, 0xdc, 0xad, 0x28, 0xbc, 0xfb, 0x9e, 0x5d, 0x27, - 0x44, 0xea, 0x88, 0x48, 0xb2, 0x62, 0x3a, 0xc0, 0x7f, 0x8e, 0xf6, 0x1a, 0x81, 0xa3, - 0x59, 0x10, 0xb8, 0xa1, 0xba, 0xf3, 0x9a, 0x91, 0x9a, 0x7b, 0x60, 0xbc, 0x60, 0x4d, - 0x63, 0x18, 0x5f, 0x75, 0x92, 0x21, 0xd8, 0x47, 0xcc, 0x54, 0xa2, 0x27, 0x65, 0xa4, - 0xc3, 0x34, 0x75, 0xb5, 0x79, 0x1e, 0x9a, 0xf3, 0x27, 0x1f, 0xc8, 0xd9, 0x35, 0x06, - 0x67, 0x09, 0x0d, 0x81, 0x84, 0xec, 0x50, 0x52, 0x2d, 0x80, 0x4f, 0x23, 0xc4, 0xfb, - 0x44, 0xff, 0xa4, 0x81, 0xbc, 0x92, 0xae, 0x40, 0x8d, 0x1b, 0x9f, 0x2b, 0x13, 0x19, - 0x04, 0xf9, 0x70, 0x5c, 0x59, 0xe2, 0xf4, 0xbd, 0xe7, 0xa3, 0xb2, 0xc0, 0x85, 0xd9, - 0x3f, 0xd2, 0xab, 0xc5, 0xe1, 0x4d, 0x16, 0x30, 0x01, 0xa1, 0x2f, 0x51, 0x93, 0x8d, - 0x02, 0x1a, 0xfa, 0x92, 0x23, 0x9b, 0x87, 0x3d, 0xc6, 0xc3, 0x57, 0xea, 0xa8, 0xaf, - 0x4e, 0xe6, 0xd0, 0x05, 0x40, 0x65, 0x7f, 0xe3, 0x29, 0x14, 0x10, 0x3b, 0x5d, 0x98, - 0xf6, 0x8b, 0xd3, 0xe2, 0xb5, 0x35, 0x9f, 0x08, 0xcc, 0xd8, 0x8d, 0x0c, 0x81, 0x1e, - 0x4c, 0x31, 0xfb, 0xb4, 0x9f, 0x3a, 0x90, 0xbb, 0xd0, 0x5d, 0xce, 0x62, 0xf3, 0x44, - 0xe7, 0x07, 0x75, 0x93, 0x15, 0x9a, 0xe3, 0x50, 0x50, 0xb0, 0x4c, 0x9e, 0x6b, 0x86, - 0xbc, 0x43, 0x2d, 0xc8, 0xb0, 0x48, 0xc7, 0x3c, 0x00, 0x18, 0xca, 0x5b, 0x69, 0x41, - 0x12, 0x97, 0x73, 0x2a, 0x4e, 0x1a, 0xa9, 0x9a, 0x92, 0x8c, 0x71, 0xe7, 0xa2, 0x4f, - 0xd2, 0x77, 0x85, 0x6a, 0xa4, 0x25, 0x01, 0xe5, 0x1b, 0x01, 0x2a, 0xea, 0x94, 0x46, - 0xa2, 0x10, 0x4e, 0x93, 0xf8, 0x15, 0xa0, 0xb3, 0xa2, 0x9b, 0x45, 0x83, 0x14, 0xf3, - 0xd8, 0xbe, 0x2b, 0x98, 0x23, 0xd3, 0x42, 0xf4, 0x62, 0x13, 0xe9, 0x42, 0xa7, 0xe1, - 0x9a, 0x46, 0xe9, 0x70, 0xb5, 0xc5, 0x06, 0x70, 0x84, 0x30, 0x31, 0x7b, 0x1b, 0xb3, - 0xb3, 0x5d, 0xf6, 0x8a, 0xe3, 0x3a, 0x49, 0x26, 0xa0, 0x3e, 0x6b, 0xfe, 0xb5, 0x51, - 0x04, 0x16, 0xfc, 0xbb, 0x05, 0x24, 0xc9, 0xca, 0x50, 0x74, 0x15, 0x6c, 0xc5, 0xa5, - 0xd6, 0xfe, 0x1c, 0x99, 0x5e, 0xdc, 0x60, 0xa2, 0xf5, 0x50, 0x41, 0x1a, 0xa4, 0x1e, - 0x3d, 0xa3, 0xbd, 0xcf, 0x64, 0xbc, 0xf0, 0x4a, 0x05, 0x10, 0x57, 0x1b, 0x93, 0x6d, - 0x47, 0xe5, 0x5c, 0xec, 0x03, 0x30, 0xee, 0x8d, 0xfe, 0x73, 0x56, 0x34, 0x04, 0xf0, - 0x47, 0xd7, 0xf3, 0xa8, 0xa3, 0xd7, 0x74, 0x3b, 0xc5, 0x54, 0x95, 0x52, 0x10, 0xf1, - 0xeb, 0x0d, 0x08, 0x59, 0x9e, 0xa7, 0x7d, 0x5f, 0x97, 0x4d, 0x87, 0x17, 0x6d, 0x37, - 0xd9, 0x8b, 0x9c, 0x0a, 0xd4, 0x40, 0x40, 0x72, 0x09, 0xed, 0x6a, 0x9f, 0x08, 0x46, - 0x4d, 0x56, 0x55, 0x93, 0xe1, 0xa6, 0x3b, 0x93, 0x85, 0x36, 0xb4, 0x92, 0x44, 0xe9, - 0x7d, 0x88, 0x01, 0x73, 0xb6, 0x40, 0xf2, 0xdd, 0xb7, 0x4d, 0x06, 0x8e, 0xcb, 0x46, - 0xcf, 0x28, 0x9b, 0x7d, 0x89, 0x13, 0x07, 0xbb, 0xa3, 0x70, 0x54, 0xcf, 0x91, 0xb3, - 0x1f, 0xc8, 0x2f, 0x74, 0xd5, 0xfc, 0x46, 0x1f, 0xc5, 0xe9, 0x78, 0x92, 0x0e, 0x95, - 0xd2, 0x80, 0x4b, 0xbd, 0x5b, 0xe7, 0xfb, 0x86, 0xb1, 0xb0, 0x96, 0x1f, 0x35, 0x38, - 0x6c, 0x58, 0x6b, 0xf4, 0x89, 0x0e, 0xa6, 0xd6, 0x07, 0xae, 0x27, 0xb4, 0xc2, 0xb2, - 0x71, 0x06, 0x18, 0x57, 0xee, 0xcb, 0x8f, 0xd9, 0x0f, 0xd0, 0x8e, 0xb5, 0xc4, 0x3c, - 0xeb, 0x73, 0x6b, 0x68, 0x31, 0xe8, 0xc1, 0x10, 0xf1, 0x6c, 0xfd, 0xb3, 0xa4, 0x27, - 0x11, 0x21, 0x5c, 0xa7, 0x05, 0x17, 0xfd, 0x02, 0xdd, 0x25, 0xc8, 0x42, 0x36, 0xe8, - 0xde, 0x61, 0xe7, 0xed, 0x8a, 0x3f, 0x26, 0xc8, 0x3f, 0x4b, 0xeb, 0x39, 0x2c, 0xc0, - 0x7f, 0xc3, 0x75, 0xaf, 0x19, 0x68, 0xa5, 0x25, 0x10, 0x74, 0x4e, 0x95, 0xf8, 0x37, - 0x49, 0x9a, 0xbf, 0x7d, 0x7e, 0xae, 0xf5, 0x06, 0xf1, 0x88, 0x3a, 0x75, 0x15, 0x88, - 0xc7, 0xef, 0xa5, 0x06, 0xc3, 0xe8, 0xd0, 0x06, 0x96, 0x1b, 0x94, 0x16, 0xaf, 0x62, - 0x1e, 0x21, 0xc6, 0x78, 0x7c, 0x5c, 0xf1, 0x6e, 0xf8, 0x46, 0x09, 0x0f, 0x40, 0xf6, - 0x15, 0x84, 0x84, 0x00, 0x7a, 0x6f, 0x53, 0x6f, 0x65, 0x6c, 0x52, 0x98, 0x56, 0x73, - 0xec, 0xe7, 0xfa, 0xc7, 0x3a, 0x0e, 0xd4, 0x1a, 0xb0, 0x05, 0x17, 0x53, 0xa7, 0xca, - 0xa8, 0x9b, 0xe3, 0x13, 0x9a, 0xfd, 0x97, 0x93, 0xb3, 0xe0, 0x2f, 0x27, 0xf0, 0x40, - 0x04, 0x65, 0x95, 0xac, 0xd4, 0x7b, 0xf1, 0x3f, 0xd0, 0xda, 0x27, 0xf0, 0x9e, 0xda, - 0x48, 0x03, 0x6d, 0x3e, 0xe4, 0x37, 0xf2, 0xee, 0x8f, 0x86, 0x06, 0xea, 0x97, 0x34, - 0x3c, 0x33, 0x58, 0x46, 0x57, 0xf4, 0x6d, 0xba, 0x99, 0xdb, 0x5c, 0xfe, 0x6c, 0xa1, - 0x76, 0xfa, 0xb7, 0xb0, 0xf3, 0xbf, 0xa0, 0xab, 0x61, 0xe3, 0x40, 0xc3, 0x4e, 0xb9, - 0xf1, 0x7c, 0x7e, 0xc2, 0xbe, 0x03, 0xb1, 0x80, 0xf0, 0xbb, 0x6f, 0x43, 0x4c, 0x2a, - 0x65, 0x42, 0xe0, 0x0e, 0x84, 0x37, 0x3f, 0x4f, 0x46, 0x49, 0xcd, 0xa3, 0x2b, 0xf6, - 0x86, 0x66, 0x61, 0x43, 0xf6, 0x22, 0xaa, 0x48, 0x04, 0x60, 0xb5, 0xaf, 0xac, 0x51, - 0x86, 0x07, 0xcd, 0x9a, 0xf8, 0xbc, 0xd6, 0xb5, 0x8c, 0x30, 0x12, 0x73, 0x16, 0xb2, - 0x5d, 0x5e, 0xa7, 0xbf, 0x6b, 0x0c, 0xab, 0x85, 0x42, 0xff, 0x69, 0xd9, 0xb2, 0xf1, - 0x80, 0xbe, 0x12, 0xed, 0x75, 0x34, 0x4a, 0x39, 0x5a, 0xa1, 0x0f, 0x85, 0x2f, 0x08, - 0x3a, 0xd6, 0x4e, 0xf4, 0x0e, 0x9c, 0x03, 0x09, 0xe9, 0xbb, 0xa5, 0x4b, 0x8c, 0xb3, - 0x3c, 0x95, 0x49, 0x8a, 0x69, 0x53, 0x8d, 0x3a, 0xe5, 0xb2, 0x5e, 0x24, 0x70, 0x98, - 0x30, 0x6f, 0xa8, 0xc7, 0x4a, 0x8e, 0xe5, 0xbc, 0xa9, 0x41, 0x53, 0x1d, 0x61, 0xaa, - 0xc2, 0x7a, 0xab, 0x3d, 0xc5, 0x61, 0x7d, 0x56, 0x06, 0xc9, 0x57, 0x7a, 0x2a, 0x83, - 0x46, 0xe8, 0xd8, 0x5b, 0x32, 0xb8, 0x50, 0x57, 0x75, 0x10, 0x8d, 0xc8, 0x5e, 0x2a, - 0xde, 0x2e, 0xac, 0x1e, 0x63, 0x6e, 0x1a, 0xf4, 0x05, 0x4c, 0x8b, 0x6f, 0x57, 0x63, - 0x2d, 0xf2, 0x69, 0xc3, 0x72, 0x3b, 0x32, 0x08, 0x72, 0xe4, 0xc5, 0x7b, 0x21, 0x83, - 0x58, 0xdc, 0x7e, 0x99, 0x05, 0xbb, 0x04, 0xed, 0xf9, 0x2e, 0xdf, 0x0d, 0xf6, 0x35, - 0xf3, 0xbf, 0x36, 0x1e, 0x57, 0xa1, 0x32, 0x96, 0xe1, 0x44, 0x7a, 0xf5, 0x08, 0x78, - 0x72, 0xd6, 0x36, 0xe2, 0x75, 0x18, 0xa9, 0x87, 0x6e, 0x15, 0xeb, 0x01, 0xf5, 0xe8, - 0xde, 0xd8, 0x18, 0x92, 0x51, 0x1c, 0xc2, 0x85, 0x1b, 0x00, 0xb8, 0x32, 0x71, 0x2a, - 0x6d, 0x3b, 0xa5, 0x66, 0x65, 0x17, 0xbc, 0xd3, 0x56, 0x76, 0x21, 0xa7, 0xcf, 0x84, - 0x45, 0x58, 0x96, 0x53, 0x26, 0x20, 0x20, 0xc3, 0x3b, 0xf7, 0x80, 0x31, 0xb8, 0xee, - 0x07, 0x07, 0xde, 0x07, 0x20, 0x68, 0xc1, 0x70, 0x57, 0x03, 0x27, 0xe6, 0xd9, 0xf5, - 0xc6, 0xdd, 0xc3, 0x35, 0x40, 0x2e, 0xfc, 0x54, 0x88, 0x62, 0xf5, 0xa0, 0x70, 0x94, - 0xfd, 0x42, 0x8a, 0x7b, 0xbc, 0x15, 0xd7, 0xb3, 0x8d, 0x05, 0x36, 0x2c, 0x9c, 0xa9, - 0x85, 0xf5, 0x8a, 0x76, 0x64, 0x7d, 0x2b, 0xe4, 0xc2, 0xcd, 0x6b, 0x3d, 0x17, 0xd6, - 0x87, 0x09, 0x71, 0xd7, 0xa0, 0x98, 0xba, 0xf7, 0x2c, 0x6f, 0x6f, 0x12, 0x14, 0xcf, - 0x1f, 0xaa, 0xe4, 0x88, 0xbd, 0x7d, 0xe2, 0x59, 0xd3, 0x41, 0x5c, 0x2f, 0x0d, 0xde, - 0xc7, 0x45, 0x70, 0x04, 0xf3, 0x57, 0x08, 0xd1, 0xec, 0xcc, 0xcc, 0x0d, 0xf6, 0x5a, - 0x04, 0x94, 0x3a, 0xd5, 0xcb, 0xc1, 0x3f, 0x29, 0x5f, 0x00, 0x0f, 0xe0, 0x56, 0xc4, - 0x0b, 0x2d, 0x88, 0xf2, 0x7d, 0xc3, 0x4c, 0xfe, 0xb8, 0x03, 0xbe, 0x34, 0x83, 0xa9, - 0xeb, 0xf9, 0xb5, 0xa9, 0x02, 0x60, 0x57, 0x72, 0x5d, 0x63, 0xea, 0xd2, 0xc0, 0xc0, - 0xff, 0x1f, 0xe2, 0x6a, 0xc1, 0xe7, 0xbd, 0xfc, 0xd6, 0xfa, 0xd8, 0x75, 0x84, 0x2d, - 0x19, 0x4f, 0x33, 0x17, 0x50, 0x46, 0x2c, 0x06, 0xb8, 0xd7, 0x98, 0x2d, 0x67, 0x99, - 0x5e, 0xd5, 0xd3, 0xae, 0x96, 0xa0, 0x5a, 0xe0, 0x06, 0x7f, 0x4e, 0xb1, 0xc7, 0xc9, - 0x32, 0x31, 0xbd, 0x39, 0x77, 0x3c, 0xbe, 0x0a, 0x9d, 0x66, 0xb0, 0xc9, 0xaa, 0x8c, - 0xff, 0x6a, 0x37, 0x6e, 0x1f, 0x37, 0x2e, 0xac, 0x6a, 0xc4, 0xe4, 0x6c, 0xc0, 0x94, - 0x22, 0x45, 0xd4, 0xc2, 0xdc, 0xf0, 0x2d, 0x76, 0x40, 0xff, 0xcc, 0x5a, 0x6a, 0xc3, - 0xa8, 0x7f, 0x5c, 0x41, 0x15, 0x51, 0xbc, 0xc2, 0xf2, 0x6c, 0xb9, 0x49, 0x61, 0xd5, - 0x3f, 0x95, 0xdd, 0xb1, 0x9a, 0xe9, 0x30, 0xc8, 0xd7, 0x0f, 0x03, 0x1b, 0x29, 0xa5, - 0xdf, 0x99, 0xff, 0x36, 0x69, 0x5e, 0x80, 0x2c, 0xbc, 0xb6, 0xb5, 0x8c, 0x1b, 0xa7, - 0xed, 0x5e, 0xac, 0xfa, 0x76, 0x41, 0x4a, 0x41, 0xad, 0x4a, 0x44, 0xf7, 0x1f, 0x1b, - 0x58, 0x0d, 0x34, 0xc3, 0xa9, 0x52, 0x92, 0x0b, 0x25, 0x4a, 0x14, 0x5f, 0xea, 0x51, - 0x7f, 0x5b, 0x42, 0xb2, 0xf6, 0x5e, 0xcd, 0x0f, 0x82, 0x59, 0x54, 0x78, 0xd8, 0x0a, - 0x01, 0x47, 0xe3, 0x9a, 0x9c, 0xf3, 0xef, 0x02, 0x00, 0x08, 0x60, 0xf7, 0xbf, 0x17, - 0x78, 0xa1, 0x51, 0xc9, 0xfa, 0x66, 0x7f, 0x5b, 0x88, 0x0e, 0x55, 0x6f, 0xa0, 0x52, - 0x41, 0xb1, 0x0f, 0x5a, 0xc9, 0xa8, 0x40, 0x8e, 0x92, 0x5b, 0x62, 0x6b, 0x32, 0x3a, - 0x47, 0x1f, 0xe3, 0xbe, 0xde, 0x52, 0xbb, 0xa0, 0x97, 0xb2, 0xa9, 0x9a, 0x9b, 0xa5, - 0xa8, 0x66, 0x58, 0xc3, 0xfd, 0x9e, 0xc5, 0x5b, 0xfa, 0x9b, 0x32, 0x85, 0x67, 0x25, - 0x4a, 0xb3, 0x6d, 0x2c, 0x7f, 0x44, 0xd2, 0xc7, 0xe1, 0x3e, 0xb5, 0x4b, 0xeb, 0x70, - 0xea, 0x8f, 0xa9, 0x4b, 0x6c, 0x6e, 0x01, 0x2d, 0x79, 0xe3, 0xf5, 0x36, 0x89, 0xc2, - 0xb1, 0xa1, 0x81, 0x02, 0xfc, 0x23, 0x34, 0xb7, 0xd0, 0x94, 0xeb, 0x07, 0x8f, 0x66, - 0x6e, 0xf9, 0x6e, 0xfc, 0x00, 0xb8, 0xf2, 0x7f, 0xe2, 0x80, 0xe8, 0xdb, 0xac, 0xa6, - 0x85, 0x58, 0xa3, 0xf1, 0x2b, 0x87, 0x67, 0xa0, 0x75, 0xe8, 0x82, 0x91, 0xc7, 0xfa, - 0xe1, 0x9d, 0x48, 0xf8, 0x58, 0xac, 0xb2, 0x92, 0xfb, 0x0e, 0xec, 0x64, 0x5f, 0xfc, - 0xbb, 0xe0, 0xca, 0x5f, 0x8c, 0x56, 0x1b, 0x25, 0x7d, 0x12, 0x32, 0xe2, 0x0c, 0xf8, - 0x50, 0x61, 0x0c, 0x5e, 0x7f, 0x9e, 0x83, 0x7e, 0x0c, 0xb4, 0x2b, 0x22, 0x55, 0xe5, - 0x63, 0xc9, 0xd8, 0x71, 0x40, 0xad, 0x39, 0xca, 0xa2, 0x33, 0xf9, 0xe9, 0xd2, 0x00, - 0xae, 0x7f, 0x3c, 0xea, 0xc6, 0xe8, 0xfa, 0x0e, 0x42, 0x21, 0x92, 0x50, 0x59, 0xc0, - 0x88, 0x7c, 0x2d, 0x3b, 0x60, 0x97, 0x8d, 0x81, 0xa6, 0x78, 0xb9, 0xed, 0x8e, 0x44, - 0x86, 0xb4, 0xd1, 0x06, 0x3c, 0x09, 0x60, 0x44, 0x10, 0x70, 0x89, 0x68, 0x98, 0xbd, - 0x5c, 0x0e, 0x8f, 0x5f, 0x72, 0x9c, 0x87, 0x2a, 0x27, 0x32, 0x5c, 0x36, 0xfe, 0xce, - 0x03, 0x05, 0x8b, 0xdb, 0x03, 0x5c, 0x40, 0x13, 0xb4, 0x21, 0x60, 0x56, 0x76, 0x2c, - 0xe3, 0xa3, 0x96, 0xbe, 0xcc, 0x83, 0x3f, 0xeb, 0x8a, 0xea, 0xc0, 0xa0, 0x8b, 0x8a, - 0x11, 0xd8, 0x4d, 0x04, 0x09, 0xb7, 0x34, 0xf4, 0x52, 0xaa, 0xf0, 0x16, - ], - txid: [ - 0x44, 0x1f, 0xad, 0xb2, 0x5a, 0x6e, 0x02, 0x43, 0x6f, 0xe6, 0xa9, 0x8a, 0x28, 0x04, - 0x56, 0xe1, 0x71, 0x72, 0x14, 0x55, 0x5d, 0xf7, 0x5a, 0xfd, 0xb8, 0x5a, 0xb1, 0x7a, - 0x10, 0x81, 0x01, 0x1a, - ], - auth_digest: [ - 0x37, 0xce, 0xcf, 0x21, 0x40, 0x6b, 0xfb, 0x00, 0x2d, 0x1e, 0xde, 0x64, 0x4c, 0xff, - 0x52, 0xd2, 0x2c, 0x12, 0x36, 0x9f, 0xb4, 0x9e, 0x34, 0xae, 0xf8, 0xa0, 0x3b, 0x4b, - 0x61, 0xb6, 0x4f, 0xa5, - ], - transparent_input: None, - script_code: None, - amount: None, - sighash_all: [ - 0x44, 0x1f, 0xad, 0xb2, 0x5a, 0x6e, 0x02, 0x43, 0x6f, 0xe6, 0xa9, 0x8a, 0x28, 0x04, - 0x56, 0xe1, 0x71, 0x72, 0x14, 0x55, 0x5d, 0xf7, 0x5a, 0xfd, 0xb8, 0x5a, 0xb1, 0x7a, - 0x10, 0x81, 0x01, 0x1a, - ], - sighash_none: None, - sighash_single: None, - sighash_all_anyone: None, - sighash_none_anyone: None, - sighash_single_anyone: None, - }, - TestVector { - tx: vec![ - 0x05, 0x00, 0x00, 0x80, 0x0a, 0x27, 0xa7, 0x26, 0x21, 0x96, 0x51, 0x37, 0x8f, 0x50, - 0x25, 0x86, 0x83, 0xda, 0xf6, 0x12, 0x02, 0x39, 0x9f, 0xd0, 0x47, 0xee, 0xe2, 0x88, - 0xbb, 0x45, 0x85, 0x85, 0x1d, 0xc9, 0x3e, 0xcc, 0xc6, 0x23, 0x22, 0x92, 0x4c, 0xd1, - 0x3b, 0x5d, 0xd4, 0xee, 0xd6, 0x6e, 0xd8, 0xd9, 0x97, 0x2d, 0x77, 0x26, 0x29, 0xea, - 0x64, 0x06, 0x65, 0xac, 0x53, 0x51, 0x51, 0x00, 0x06, 0xc0, 0x62, 0x46, 0x8e, 0x4b, - 0xd8, 0xf7, 0xdd, 0x9a, 0xf6, 0x98, 0xf5, 0x2a, 0xe8, 0x14, 0x63, 0x4e, 0x81, 0xd7, - 0xf3, 0xe0, 0xc4, 0x20, 0x31, 0x7c, 0xac, 0xa9, 0xae, 0x48, 0x11, 0xc6, 0xaf, 0x06, - 0xfe, 0x80, 0xa8, 0xc0, 0x2a, 0xb7, 0x04, 0x65, 0x00, 0xac, 0x65, 0xaa, 0x1e, 0xa1, - 0xb7, 0x00, 0x00, 0x00, 0x00, - ], - txid: [ - 0x6b, 0x71, 0x52, 0x9c, 0x56, 0x99, 0xb0, 0x64, 0xd8, 0x1b, 0x02, 0x3e, 0xdf, 0xf2, - 0xb1, 0x02, 0xe6, 0x39, 0x7c, 0x81, 0x24, 0x6c, 0xce, 0x0a, 0x55, 0x61, 0xfb, 0x79, - 0x5d, 0xd4, 0x88, 0x77, - ], - auth_digest: [ - 0x07, 0xec, 0x2d, 0xf0, 0xc6, 0xf7, 0x77, 0x15, 0x8d, 0xcb, 0xf7, 0xfc, 0x74, 0x08, - 0xf2, 0x35, 0xdd, 0xdb, 0x55, 0x7e, 0x4a, 0x48, 0x56, 0xd9, 0x51, 0x90, 0xda, 0xb5, - 0x59, 0x86, 0x9e, 0xe2, - ], - transparent_input: Some(0), - script_code: Some(vec![0x63, 0x52, 0x51, 0x63, 0x53]), - amount: Some(107504874564564), - sighash_all: [ - 0x20, 0x6d, 0x56, 0x7f, 0x65, 0xef, 0x19, 0x3f, 0x5a, 0xd7, 0x99, 0x99, 0xd8, 0xab, - 0x08, 0x56, 0xa0, 0xfa, 0xcc, 0xe6, 0xae, 0x9c, 0xe4, 0x1c, 0x30, 0xf1, 0x26, 0xc6, - 0x41, 0xbe, 0xb5, 0x1e, - ], - sighash_none: Some([ - 0xdf, 0x16, 0x3f, 0x6f, 0x0d, 0x56, 0x7c, 0xfd, 0x97, 0x78, 0xa1, 0x42, 0x5c, 0xc8, - 0x3d, 0x6e, 0x54, 0x8f, 0xd9, 0x37, 0x43, 0x10, 0x4d, 0x72, 0xfd, 0x7d, 0xf5, 0x42, - 0xed, 0xaa, 0xe2, 0xb2, - ]), - sighash_single: Some([ - 0xdf, 0x16, 0x3f, 0x6f, 0x0d, 0x56, 0x7c, 0xfd, 0x97, 0x78, 0xa1, 0x42, 0x5c, 0xc8, - 0x3d, 0x6e, 0x54, 0x8f, 0xd9, 0x37, 0x43, 0x10, 0x4d, 0x72, 0xfd, 0x7d, 0xf5, 0x42, - 0xed, 0xaa, 0xe2, 0xb2, - ]), - sighash_all_anyone: Some([ - 0x2a, 0xb9, 0x5b, 0x8f, 0xb6, 0xb6, 0x3d, 0xb8, 0x7d, 0x65, 0x0e, 0xad, 0x2b, 0x73, - 0x89, 0x12, 0x92, 0x31, 0x19, 0x7c, 0xfd, 0x20, 0x0c, 0x8a, 0x44, 0x56, 0x96, 0x69, - 0xf4, 0x50, 0xc1, 0xe6, - ]), - sighash_none_anyone: Some([ - 0x2a, 0xb9, 0x5b, 0x8f, 0xb6, 0xb6, 0x3d, 0xb8, 0x7d, 0x65, 0x0e, 0xad, 0x2b, 0x73, - 0x89, 0x12, 0x92, 0x31, 0x19, 0x7c, 0xfd, 0x20, 0x0c, 0x8a, 0x44, 0x56, 0x96, 0x69, - 0xf4, 0x50, 0xc1, 0xe6, - ]), - sighash_single_anyone: Some([ - 0x2a, 0xb9, 0x5b, 0x8f, 0xb6, 0xb6, 0x3d, 0xb8, 0x7d, 0x65, 0x0e, 0xad, 0x2b, 0x73, - 0x89, 0x12, 0x92, 0x31, 0x19, 0x7c, 0xfd, 0x20, 0x0c, 0x8a, 0x44, 0x56, 0x96, 0x69, - 0xf4, 0x50, 0xc1, 0xe6, - ]), - }, - TestVector { - tx: vec![ - 0x05, 0x00, 0x00, 0x80, 0x0a, 0x27, 0xa7, 0x26, 0x21, 0x96, 0x51, 0x37, 0x02, 0x5f, - 0x13, 0xec, 0x91, 0x3c, 0x29, 0x02, 0x00, 0x01, 0x78, 0x8f, 0x26, 0x02, 0xa2, 0xcf, - 0x06, 0x00, 0x01, 0x53, 0x00, 0x00, 0x03, 0x42, 0xf7, 0x36, 0xa0, 0xfb, 0x38, 0xae, - 0x3e, 0x42, 0xec, 0x67, 0xb0, 0x74, 0x86, 0xf9, 0x0e, 0x60, 0x75, 0x2e, 0x0d, 0xc6, - 0xee, 0x03, 0x65, 0xcb, 0xd2, 0x1d, 0xb5, 0xae, 0x70, 0xfd, 0xba, 0x02, 0x69, 0x15, - 0x08, 0xdb, 0x30, 0x1d, 0x73, 0x22, 0x72, 0xd9, 0x65, 0xc1, 0x46, 0x02, 0xe2, 0x29, + 0x05, 0x00, 0x00, 0x80, 0x0a, 0x27, 0xa7, 0x26, 0xb4, 0xd0, 0xd6, 0xc2, 0x47, 0x23, + 0x62, 0x29, 0x87, 0xd8, 0xd7, 0x04, 0x00, 0x00, 0x02, 0xac, 0xa3, 0xc4, 0xc6, 0x43, + 0x3b, 0x1d, 0xa6, 0x05, 0x95, 0xc2, 0xba, 0xfc, 0x72, 0x2b, 0x38, 0xe7, 0x91, 0x0f, + 0x63, 0x61, 0x6b, 0x22, 0xc9, 0xd6, 0x77, 0xb1, 0x79, 0x79, 0x56, 0x6d, 0xb2, 0x14, + 0x9b, 0x1d, 0x99, 0x34, 0x1e, 0x4e, 0x6f, 0x91, 0x20, 0xf4, 0xd4, 0x1e, 0x62, 0x91, + 0x85, 0x00, 0x2c, 0x72, 0xc0, 0x12, 0xc4, 0x14, 0xd2, 0x38, 0x2a, 0x6d, 0x47, 0xc7, + 0xb3, 0xde, 0xab, 0x59, 0x1e, 0xff, 0xf3, 0x60, 0xfe, 0x11, 0x99, 0x05, 0x6c, 0x56, + 0xe5, 0xfe, 0xec, 0x61, 0xa7, 0xb8, 0xb9, 0xf6, 0x99, 0xd6, 0x01, 0x2c, 0x28, 0x49, + 0x23, 0x2f, 0x32, 0x9f, 0xef, 0x95, 0xc7, 0xd1, 0x81, 0x17, 0x2c, 0x28, 0x4c, 0xe8, + 0xa4, 0xb3, 0x22, 0x96, 0x1a, 0xd7, 0x81, 0xa5, 0xb9, 0x73, 0x6d, 0x7f, 0x12, 0xe8, + 0x64, 0x34, 0x53, 0xc1, 0x05, 0xa7, 0x9a, 0x9f, 0x5a, 0xe0, 0x09, 0xfa, 0x1a, 0xe6, + 0xc2, 0x5a, 0x94, 0x62, 0xeb, 0xcb, 0xb0, 0xfd, 0x5f, 0x14, 0x55, 0x4b, 0xc9, 0x77, + 0x47, 0xc3, 0x3e, 0x34, 0xda, 0x90, 0xc8, 0x16, 0xd8, 0xd0, 0xd5, 0x0b, 0xfe, 0x37, + 0x61, 0x8c, 0x58, 0x12, 0x89, 0x14, 0x84, 0xfa, 0x25, 0x93, 0x22, 0xc1, 0x50, 0x92, + 0xd4, 0x15, 0x5d, 0x86, 0x96, 0xd6, 0xf1, 0x2f, 0x24, 0xfd, 0x36, 0x44, 0x96, 0xb3, + 0xbe, 0x08, 0x71, 0xca, 0x3d, 0x02, 0xd2, 0xb6, 0xbc, 0xd5, 0x9e, 0xad, 0x5e, 0x27, + 0xe8, 0x3e, 0xf2, 0xd4, 0x40, 0x87, 0x54, 0xe9, 0x00, 0x31, 0x61, 0x87, 0x76, 0x69, + 0xe1, 0xa4, 0xd8, 0x50, 0xbf, 0x9f, 0xc1, 0xc2, 0x31, 0x85, 0x4d, 0x03, 0x7e, 0x26, + 0x2f, 0x9a, 0x9f, 0x9b, 0xd8, 0x90, 0x44, 0x67, 0xea, 0xea, 0xd8, 0x3f, 0x09, 0x38, + 0xe2, 0x6e, 0x34, 0x5f, 0x9c, 0xc6, 0x95, 0x98, 0x5f, 0x00, 0xa1, 0x25, 0x5a, 0x0a, + 0x4f, 0x95, 0xdb, 0x9d, 0xad, 0xcd, 0xb7, 0xc2, 0x40, 0x89, 0x9a, 0xea, 0x27, 0x83, + 0xc2, 0xd2, 0x1c, 0x2d, 0x32, 0x79, 0xf8, 0x86, 0xf7, 0xab, 0x3d, 0x4e, 0x8a, 0xf5, + 0x38, 0x1f, 0xa0, 0xb0, 0x18, 0x48, 0xf1, 0xab, 0x14, 0xad, 0x33, 0x4f, 0x2b, 0x68, + 0x03, 0x58, 0x08, 0xcd, 0xf1, 0xbb, 0x9e, 0x9d, 0x9a, 0x81, 0x6b, 0xaf, 0x72, 0x8a, + 0x95, 0x5b, 0x96, 0x0b, 0x77, 0x01, 0xfa, 0x62, 0x66, 0x87, 0xdc, 0x3c, 0x9c, 0xba, + 0x64, 0x63, 0x37, 0xb5, 0x3e, 0x29, 0x81, 0x6e, 0x94, 0x82, 0xdd, 0xf5, 0x57, 0x8a, + 0x87, 0x68, 0xaa, 0xe4, 0x77, 0xfc, 0xe4, 0x10, 0xac, 0x2d, 0x5d, 0xe6, 0x09, 0x58, + 0x61, 0xc1, 0x11, 0xd7, 0xfe, 0xb3, 0xe6, 0xbb, 0x4f, 0xbb, 0x5a, 0x54, 0x95, 0x54, + 0x95, 0x97, 0x27, 0x98, 0x35, 0x0a, 0x25, 0x3f, 0x05, 0xf6, 0x6c, 0x2e, 0xcf, 0xcb, + 0xc0, 0xed, 0x43, 0xf5, 0xec, 0x2e, 0x6d, 0x8d, 0xba, 0x15, 0xa5, 0x12, 0x54, 0xd9, + 0x7b, 0x18, 0x21, 0x10, 0x7c, 0x07, 0xdd, 0x9a, 0x16, 0xef, 0x84, 0x06, 0xf9, 0x43, + 0xe2, 0x82, 0xb9, 0x5d, 0x4b, 0x36, 0x25, 0x30, 0xc9, 0x13, 0xd6, 0xba, 0x42, 0x1d, + 0xf6, 0x02, 0x7d, 0xe5, 0xaf, 0x1e, 0x47, 0x45, 0xd5, 0x86, 0x81, 0x06, 0x95, 0x4b, + 0xe6, 0xc1, 0x96, 0x27, 0x80, 0xa2, 0x94, 0x10, 0x72, 0xe9, 0x51, 0x31, 0xb1, 0x67, + 0x9d, 0xf0, 0x63, 0x76, 0x25, 0x04, 0x2c, 0x37, 0xd4, 0x8f, 0xfb, 0x15, 0x2e, 0x5e, + 0xbc, 0x18, 0x5c, 0x8a, 0x2b, 0x7d, 0x43, 0x85, 0xf1, 0xc9, 0x5a, 0xf9, 0x37, 0xdf, + 0x78, 0xdf, 0xd8, 0x75, 0x7f, 0xab, 0x43, 0x49, 0x68, 0xb0, 0xb5, 0x7c, 0x66, 0x57, + 0x44, 0x68, 0xf1, 0x60, 0xb4, 0x47, 0xac, 0x82, 0x21, 0xe5, 0x06, 0x06, 0x76, 0xa8, + 0x42, 0xa1, 0xc6, 0xb7, 0x17, 0x2d, 0xd3, 0x34, 0x0f, 0x76, 0x40, 0x70, 0xab, 0x1f, + 0xe0, 0x91, 0xc5, 0xc7, 0x4c, 0x95, 0xa5, 0xdc, 0x04, 0x33, 0x90, 0x72, 0x3a, 0x4c, + 0x12, 0x7d, 0xa1, 0x4c, 0xdd, 0xe1, 0xdc, 0x26, 0x75, 0xa6, 0x23, 0x40, 0xb3, 0xe6, + 0xaf, 0xd0, 0x52, 0x2a, 0x31, 0xde, 0x26, 0xe7, 0xd1, 0xec, 0x3a, 0x9c, 0x8a, 0x09, + 0x1f, 0xfd, 0xc7, 0x5b, 0x7e, 0xcf, 0xdc, 0x7c, 0x12, 0x99, 0x5a, 0x5e, 0x37, 0xce, + 0x34, 0x88, 0xbd, 0x29, 0xf8, 0x62, 0x9d, 0x68, 0xf6, 0x96, 0x49, 0x24, 0x48, 0xdd, + 0x52, 0x66, 0x97, 0x47, 0x6d, 0xc0, 0x61, 0x34, 0x6e, 0xbe, 0x3f, 0x67, 0x72, 0x17, + 0xff, 0x9c, 0x60, 0xef, 0xce, 0x94, 0x3a, 0xf2, 0x8d, 0xfd, 0x3f, 0x9e, 0x59, 0x69, + 0x25, 0x98, 0xa6, 0x04, 0x7c, 0x23, 0xc4, 0xc0, 0x14, 0x00, 0xf1, 0xab, 0x57, 0x30, + 0xea, 0xc0, 0xae, 0x8d, 0x58, 0x43, 0xd5, 0x05, 0x1c, 0x37, 0x62, 0x40, 0x17, 0x2a, + 0xf2, 0x18, 0xd7, 0xa1, 0xec, 0xfe, 0x65, 0xb4, 0xf7, 0x51, 0x00, 0x63, 0x89, 0x83, + 0xc1, 0x4d, 0xe4, 0x97, 0x47, 0x55, 0xda, 0xde, 0x80, 0x18, 0xc9, 0xb8, 0xf4, 0x54, + 0x3f, 0xb0, 0x95, 0x96, 0x15, 0x13, 0xe6, 0x7c, 0x61, 0xdb, 0xc5, 0x9c, 0x60, 0x7f, + 0x9b, 0x51, 0xf8, 0xd0, 0x9b, 0xdc, 0xad, 0x28, 0xbc, 0xfb, 0x9e, 0x5d, 0x27, 0x44, + 0xea, 0x88, 0x48, 0xb2, 0x62, 0x3a, 0xc0, 0x7f, 0x8e, 0xf6, 0x1a, 0x81, 0xa3, 0x59, + 0x10, 0xb8, 0xa1, 0xba, 0xf3, 0x9a, 0x91, 0x9a, 0x7b, 0x60, 0xbc, 0x60, 0x4d, 0x63, + 0x18, 0x5f, 0x75, 0x92, 0x21, 0xd8, 0x47, 0xcc, 0x54, 0xa2, 0x27, 0x65, 0xa4, 0xc3, + 0x34, 0x75, 0xb5, 0x79, 0x1e, 0x9a, 0xf3, 0x27, 0x1f, 0xc8, 0xd9, 0x35, 0x06, 0x67, + 0x09, 0x0d, 0x81, 0x84, 0xec, 0x50, 0x52, 0x2d, 0x80, 0x4f, 0x23, 0xc4, 0xfb, 0x44, + 0xff, 0xa4, 0x81, 0xbc, 0x92, 0xae, 0x40, 0x8d, 0x1b, 0x9f, 0x2b, 0x13, 0x19, 0x04, + 0xf9, 0x70, 0x5c, 0x59, 0xe2, 0xf4, 0xbd, 0xe7, 0xa3, 0xb2, 0xc0, 0x85, 0xd9, 0x3f, + 0xd2, 0xab, 0xc5, 0xe1, 0x4d, 0x16, 0x30, 0x01, 0xa1, 0x2f, 0x51, 0x93, 0x8d, 0x02, + 0x1a, 0xfa, 0x92, 0x23, 0x9b, 0x87, 0x3d, 0xc6, 0xc3, 0x57, 0xea, 0xa8, 0xaf, 0x4e, + 0xe6, 0xd0, 0x05, 0x40, 0x65, 0x7f, 0xe3, 0x29, 0x14, 0x10, 0x3b, 0x5d, 0x98, 0xf6, + 0x8b, 0xd3, 0xe2, 0xb5, 0x35, 0x9f, 0x08, 0xcc, 0xd8, 0x8d, 0x0c, 0x81, 0x1e, 0x4c, + 0x31, 0xfb, 0xb4, 0x9f, 0x3a, 0x90, 0xbb, 0xd0, 0x5d, 0xce, 0x62, 0xf3, 0x44, 0xe7, + 0x07, 0x75, 0x93, 0x15, 0x9a, 0xe3, 0x50, 0x50, 0xb0, 0x4c, 0x9e, 0x6b, 0x86, 0xbc, + 0x43, 0x2d, 0xc8, 0xb0, 0x48, 0xc7, 0x3c, 0x00, 0x18, 0xca, 0x5b, 0x69, 0x41, 0x12, + 0x97, 0x73, 0x2a, 0x4e, 0x1a, 0xa9, 0x9a, 0x92, 0x8c, 0x71, 0xe7, 0xa2, 0x4f, 0xd2, + 0x77, 0x85, 0x6a, 0xa4, 0x25, 0x01, 0xe5, 0x1b, 0x01, 0x2a, 0xea, 0x94, 0x46, 0xa2, + 0x10, 0x4e, 0x93, 0xf8, 0x15, 0xa0, 0xb3, 0xa2, 0x9b, 0x45, 0x83, 0x14, 0xf3, 0xd8, + 0xbe, 0x2b, 0x98, 0x23, 0xd3, 0x42, 0x15, 0x05, 0xff, 0x6d, 0x88, 0x90, 0xe9, 0x04, + 0xa2, 0x4a, 0x7d, 0xe9, 0x51, 0xa2, 0xa1, 0xc6, 0x4e, 0xd2, 0xe4, 0xf9, 0xe9, 0xa5, + 0x16, 0x5e, 0xba, 0x47, 0x99, 0xce, 0xfe, 0xb5, 0xd1, 0x48, 0x00, 0x55, 0x45, 0xf9, + 0xb5, 0xfb, 0x0e, 0xec, 0x65, 0x03, 0xfe, 0xbb, 0xdd, 0x26, 0xa2, 0x38, 0x51, 0x43, + 0x83, 0x73, 0x4a, 0xfe, 0xc8, 0xa4, 0x81, 0xcf, 0xb2, 0xfe, 0x1f, 0xf9, 0x2f, 0x1e, + 0xa7, 0x84, 0x07, 0xb4, 0x07, 0xc6, 0xb8, 0x4a, 0x21, 0x4e, 0xf6, 0x07, 0xcc, 0x59, + 0x04, 0xd9, 0xe8, 0xc7, 0x3f, 0xeb, 0xff, 0xa0, 0x1c, 0x2b, 0x17, 0x79, 0xdc, 0x42, + 0x0f, 0x08, 0x9e, 0xad, 0xe2, 0x0b, 0x69, 0xd5, 0xd7, 0xc4, 0x3c, 0xeb, 0x73, 0x6b, + 0x68, 0x31, 0xe8, 0xc1, 0x10, 0xf1, 0x6c, 0xfd, 0xb3, 0xa4, 0x67, 0xe9, 0x41, 0x4c, + 0x00, 0xec, 0xf1, 0x37, 0x31, 0x50, 0x08, 0x94, 0x55, 0x56, 0x78, 0xc4, 0x97, 0xfa, + 0xba, 0x9a, 0x95, 0xd0, 0x1c, 0xc4, 0x64, 0x39, 0x0f, 0xc4, 0xa7, 0x6b, 0xfa, 0x8b, + 0x0e, 0x1c, 0x68, 0xa5, 0x25, 0xd7, 0x06, 0xd6, 0x60, 0x4b, 0x23, 0x30, 0xb6, 0xb3, + 0x48, 0x52, 0x15, 0xf6, 0x06, 0xf1, 0x88, 0x3a, 0x75, 0x15, 0x88, 0xc7, 0xef, 0xa5, + 0x06, 0xc3, 0xe8, 0xd0, 0xc6, 0x01, 0x92, 0xe8, 0x47, 0x6b, 0xd1, 0x17, 0x5d, 0x95, + 0x62, 0x08, 0x7b, 0xdb, 0x81, 0x8e, 0x66, 0x21, 0x62, 0x86, 0xba, 0xfe, 0x47, 0xff, + 0x4d, 0xbc, 0xce, 0xd5, 0x14, 0x44, 0x48, 0x0a, 0x9a, 0x56, 0x73, 0xec, 0xe7, 0xfa, + 0xc7, 0x3a, 0x0e, 0xd4, 0x1a, 0xb0, 0x05, 0x17, 0x53, 0xa7, 0xca, 0xa8, 0x9b, 0xe3, + 0x13, 0x9a, 0xfd, 0x97, 0x93, 0xb3, 0xe0, 0x2f, 0x27, 0xf0, 0x40, 0x04, 0x65, 0x95, + 0xac, 0xd4, 0x7b, 0xf1, 0x3f, 0xd0, 0xda, 0x27, 0xf0, 0x9e, 0xda, 0x48, 0x03, 0x6d, + 0x3e, 0xe4, 0x37, 0xf2, 0xee, 0x8f, 0x86, 0x06, 0xea, 0x97, 0x34, 0x3c, 0x33, 0x58, + 0x46, 0x57, 0xf4, 0x6d, 0xba, 0x99, 0xdb, 0x5c, 0xfe, 0x6c, 0xa1, 0x76, 0xfa, 0xb7, + 0xb0, 0xf3, 0xbf, 0xa0, 0xab, 0x61, 0xe3, 0x40, 0xc3, 0x4e, 0xb9, 0xf1, 0x7c, 0x7e, + 0xc2, 0xbe, 0x03, 0xb1, 0x80, 0xf0, 0xbb, 0x6f, 0x43, 0x4c, 0x2a, 0x65, 0x42, 0xe0, + 0x0e, 0x84, 0x37, 0x3f, 0x4f, 0x46, 0x49, 0xcd, 0xa3, 0x2b, 0xf6, 0x86, 0x66, 0x61, + 0x43, 0xf6, 0x22, 0xaa, 0x48, 0x04, 0x60, 0xb5, 0xaf, 0xac, 0x51, 0x86, 0x07, 0xcd, + 0x9a, 0xf8, 0xbc, 0xd6, 0xb5, 0x8c, 0x30, 0x12, 0x73, 0x16, 0xb2, 0x5d, 0x5e, 0xa7, + 0xbf, 0x6b, 0x0c, 0xab, 0x85, 0x42, 0xff, 0x69, 0xd9, 0xb2, 0xf1, 0x80, 0xbe, 0x12, + 0xed, 0x75, 0x34, 0x4a, 0x39, 0x5a, 0xa1, 0x0f, 0x85, 0x2f, 0x08, 0x3a, 0xd6, 0x4e, + 0xf4, 0x0e, 0x9c, 0x03, 0x09, 0xe9, 0xbb, 0xa5, 0x4b, 0x8c, 0xb3, 0x3c, 0x95, 0x49, + 0x8a, 0x69, 0x53, 0x8d, 0x3a, 0xe5, 0xb2, 0x5e, 0x24, 0x70, 0x98, 0x30, 0x6f, 0xa8, + 0xc7, 0x4a, 0x8e, 0xe5, 0xbc, 0xa9, 0x41, 0x53, 0x1d, 0x61, 0xaa, 0xc2, 0x7a, 0xab, + 0x3d, 0xc5, 0x61, 0x7d, 0x56, 0x06, 0xc9, 0x57, 0x7a, 0x2a, 0x83, 0x46, 0xe8, 0xd8, + 0x5b, 0x32, 0xb8, 0x50, 0x57, 0x75, 0x10, 0x8d, 0xc8, 0x5e, 0x2a, 0xde, 0x2e, 0xac, + 0x1e, 0x63, 0x6e, 0x1a, 0xf4, 0x05, 0x4c, 0x8b, 0x6f, 0x57, 0x63, 0x2d, 0xf2, 0x69, + 0xc3, 0x72, 0x3b, 0x32, 0x08, 0x72, 0xe4, 0xc5, 0x7b, 0x21, 0x83, 0x58, 0xdc, 0x7e, + 0x99, 0x05, 0xbb, 0x04, 0xed, 0xf9, 0x2e, 0xdf, 0x0d, 0xf6, 0x35, 0xf3, 0xbf, 0x36, + 0x1e, 0x57, 0xa1, 0x32, 0x96, 0xe1, 0x44, 0x7a, 0xf5, 0x08, 0x78, 0x72, 0xd6, 0x36, + 0xe2, 0x75, 0x18, 0xa9, 0x87, 0x6e, 0x15, 0xeb, 0x01, 0xf5, 0xe8, 0xde, 0xd8, 0x18, + 0x92, 0x51, 0x1c, 0xc2, 0x85, 0x1b, 0x00, 0xb8, 0x32, 0x71, 0x2a, 0x6d, 0x3b, 0xa5, + 0x66, 0x65, 0x17, 0xbc, 0xd3, 0x56, 0x76, 0x21, 0xa7, 0xcf, 0x84, 0x45, 0x58, 0x96, + 0x53, 0x26, 0x20, 0x20, 0xc3, 0x3b, 0xf7, 0x80, 0x31, 0xb8, 0xee, 0x07, 0x07, 0xde, + 0x07, 0x20, 0x68, 0xc1, 0x70, 0x57, 0x03, 0x27, 0xe6, 0xd9, 0xf5, 0xc6, 0xdd, 0xc3, + 0x35, 0x40, 0x2e, 0xfc, 0x54, 0x88, 0x62, 0xf5, 0xa0, 0x70, 0x94, 0xfd, 0x42, 0x8a, + 0x7b, 0xbc, 0x15, 0xd7, 0xb3, 0x8d, 0x05, 0x36, 0x2c, 0x9c, 0xa9, 0x85, 0xf5, 0x8a, + 0x76, 0x64, 0x7d, 0x2b, 0xe4, 0xc2, 0xcd, 0x6b, 0x3d, 0x17, 0xd6, 0x87, 0x09, 0x71, + 0xd7, 0xa0, 0x98, 0xba, 0xf7, 0x2c, 0x6f, 0x6f, 0x12, 0x14, 0xcf, 0x1f, 0xaa, 0xe4, + 0x88, 0xbd, 0x7d, 0xe2, 0x59, 0xd3, 0x41, 0x5c, 0x2f, 0x0d, 0xde, 0xc7, 0x45, 0x70, + 0x04, 0xf3, 0x57, 0x08, 0xd1, 0xec, 0xcc, 0xcc, 0x0d, 0xf6, 0x5a, 0x04, 0x94, 0x3a, + 0xd5, 0xcb, 0xc1, 0x3f, 0x29, 0x5f, 0x00, 0x0f, 0xe0, 0x56, 0xc4, 0x0b, 0x2d, 0x88, + 0xf2, 0x7d, 0xc3, 0x4c, 0xfe, 0xb8, 0x03, 0xbe, 0x34, 0x83, 0xa9, 0xeb, 0xf9, 0xb5, + 0xa9, 0x02, 0x60, 0x57, 0x72, 0x5d, 0x63, 0xea, 0xd2, 0xc0, 0xc0, 0xff, 0x1f, 0xe2, + 0x6a, 0xc1, 0xe7, 0xbd, 0xfc, 0xd6, 0xfa, 0xd8, 0x75, 0x84, 0x2d, 0x19, 0x4f, 0x33, + 0x17, 0x50, 0x46, 0x2c, 0x06, 0xb8, 0xd7, 0x98, 0x2d, 0x67, 0x99, 0x5e, 0xd5, 0xd3, + 0xae, 0x96, 0xa0, 0x5a, 0xe0, 0x06, 0x7f, 0x4e, 0xb1, 0xc7, 0xc9, 0x32, 0x31, 0xbd, + 0x39, 0x77, 0x3c, 0xbe, 0x0a, 0x9d, 0x33, 0xa0, 0xa4, 0x0b, 0x10, 0x1d, 0x02, 0x00, + 0x77, 0xd9, 0x7c, 0xe4, 0x24, 0x01, 0x3d, 0x64, 0xb4, 0xd0, 0xd2, 0x72, 0xec, 0x01, + 0x94, 0x6b, 0x7a, 0x5e, 0xed, 0xfa, 0xb4, 0xd6, 0x8c, 0xd6, 0xd1, 0xb2, 0x66, 0x7d, + 0x04, 0xb2, 0x9d, 0x0c, 0xaf, 0x37, 0x00, 0x98, 0xff, 0xe4, 0x91, 0x8e, 0x0c, 0xa1, + 0xdf, 0x47, 0xf2, 0x75, 0x86, 0x7b, 0x73, 0x9e, 0x0a, 0x51, 0x4d, 0x32, 0x09, 0x32, + 0x5e, 0x21, 0x70, 0x45, 0x92, 0x7b, 0x47, 0x9c, 0x1c, 0xe2, 0xe5, 0xd5, 0x4f, 0x25, + 0x48, 0x8c, 0xad, 0x15, 0x13, 0xe3, 0xf4, 0x4a, 0x21, 0x26, 0x6c, 0xfd, 0x84, 0x16, + 0x33, 0x32, 0x7d, 0xee, 0x6c, 0xf8, 0x10, 0xfb, 0xf7, 0x39, 0x3e, 0x31, 0x7d, 0x9e, + 0x53, 0xd1, 0xbe, 0x1d, 0x5a, 0xe7, 0x83, 0x9b, 0x66, 0xb9, 0x43, 0xb9, 0xed, 0x18, + 0xf2, 0xc5, 0x30, 0xe9, 0x75, 0x42, 0x23, 0x32, 0xc3, 0x43, 0x9c, 0xce, 0x49, 0xa2, + 0x9f, 0x2a, 0x33, 0x6a, 0x48, 0x51, 0x26, 0x3c, 0x5e, 0x9b, 0xd1, 0x3d, 0x73, 0x11, + 0x09, 0xe8, 0x44, 0xb7, 0xf8, 0xc3, 0x92, 0xa5, 0xc1, 0xdc, 0xaa, 0x2a, 0xe5, 0xf5, + 0x0f, 0xf6, 0x3f, 0xab, 0x97, 0x65, 0xe0, 0x16, 0x70, 0x2c, 0x35, 0xa6, 0x7c, 0xd7, + 0x36, 0x4d, 0x3f, 0xab, 0x55, 0x2f, 0xb3, 0x49, 0xe3, 0x5c, 0x15, 0xc5, 0x02, 0x50, + 0x45, 0x3f, 0xd1, 0x8f, 0x7b, 0x85, 0x59, 0x92, 0x63, 0x2e, 0x2c, 0x76, 0xc0, 0xfb, + 0xf1, 0xef, 0x96, 0x3e, 0xa8, 0x0e, 0x32, 0x23, 0xde, 0x32, 0x77, 0xbc, 0x55, 0x92, + 0x51, 0x72, 0x58, 0x29, 0xec, 0x03, 0xf2, 0x13, 0xba, 0x89, 0x55, 0xca, 0xb2, 0x82, + 0xd9, 0x62, 0x53, 0x48, 0xa6, 0x14, 0xb5, 0x9b, 0xde, 0x45, 0x88, 0x56, 0x49, 0xba, + 0xe3, 0x6d, 0xe3, 0x4d, 0xef, 0x8f, 0xce, 0xc8, 0x53, 0x43, 0x47, 0x5d, 0x97, 0x6a, + 0xe1, 0xe9, 0xb2, 0x78, 0x29, 0xce, 0x2a, 0xc5, 0xef, 0xd0, 0xb3, 0x99, 0xa8, 0xb4, + 0x48, 0xbe, 0x65, 0x04, 0x29, 0x4e, 0xe6, 0xb3, 0xc1, 0xc6, 0xa5, 0x34, 0x2d, 0x7c, + 0x01, 0xae, 0x9d, 0x8a, 0xd3, 0x07, 0x0c, 0x2b, 0x1a, 0x91, 0x57, 0x3a, 0xf5, 0xe0, + 0xc5, 0xe4, 0xcb, 0xbf, 0x4a, 0xcd, 0xc6, 0xb5, 0x4c, 0x92, 0x72, 0x20, 0x0d, 0x99, + 0x70, 0x25, 0x0c, 0x17, 0xc1, 0x03, 0x6f, 0x06, 0x08, 0x5c, 0x41, 0x85, 0x8e, 0xd3, + 0xa0, 0xc4, 0x81, 0x50, 0xbc, 0x69, 0x7e, 0x4a, 0x69, 0x5f, 0xef, 0x33, 0x5f, 0x7a, + 0xd0, 0x7e, 0x1a, 0x46, 0xdc, 0x76, 0x7f, 0xf8, 0x22, 0xdb, 0x70, 0xe6, 0x66, 0x90, + 0x80, 0xb9, 0x81, 0x6b, 0x22, 0x32, 0xc8, 0x1a, 0x4c, 0x66, 0xcc, 0x58, 0x6a, 0xbf, + 0xe1, 0xea, 0xa8, 0xca, 0x6c, 0xf4, 0x1f, 0xc3, 0xc3, 0xe6, 0xc7, 0xb8, 0x86, 0xfb, + 0x6d, 0xac, 0x9f, 0x48, 0x22, 0xb4, 0xfc, 0x6f, 0xff, 0x9d, 0x05, 0x13, 0xd6, 0x1a, + 0x21, 0xc8, 0x0a, 0x37, 0x76, 0x71, 0xd1, 0x35, 0xa6, 0x68, 0xa0, 0xae, 0x2b, 0xb9, + 0x34, 0xc8, 0x2c, 0x41, 0x42, 0xda, 0x69, 0xd1, 0x2c, 0xa7, 0x24, 0x75, 0x6a, 0x37, + 0x9a, 0x69, 0xf8, 0x3e, 0x70, 0xce, 0xe0, 0xc7, 0x8c, 0xf3, 0x13, 0xa7, 0x77, 0xfa, + 0xb4, 0x8e, 0xe2, 0x03, 0xe1, 0x4f, 0xed, 0x62, 0x41, 0x62, 0xe9, 0xcf, 0x38, 0x65, + 0x24, 0x5c, 0xfb, 0x31, 0xea, 0x07, 0xee, 0x88, 0x9e, 0x47, 0x0f, 0xee, 0x46, 0xa0, + 0x62, 0x30, 0xf7, 0x00, 0x51, 0xf1, 0x1e, 0x79, 0x8c, 0x72, 0x0d, 0x37, 0xf2, 0x27, + 0xca, 0x01, 0xb1, 0x09, 0xa1, 0xce, 0xe9, 0x2a, 0xd5, 0xf6, 0xb0, 0x20, 0x1a, 0xe7, + 0x1e, 0xab, 0x44, 0x69, 0x99, 0xcd, 0xcb, 0xc4, 0xa5, 0xfc, 0x3b, 0x1a, 0xf1, 0x38, + 0x94, 0xae, 0x93, 0xdd, 0xff, 0xe8, 0xee, 0x18, 0x50, 0x13, 0x6b, 0x30, 0xcd, 0xa1, + 0xd8, 0x3d, 0x8d, 0x3b, 0xea, 0x7b, 0x13, 0x1c, 0x06, 0x14, 0x1c, 0xc2, 0xa8, 0x5f, + 0xa5, 0xb4, 0x3d, 0x05, 0xec, 0x95, 0x4e, 0x11, 0xb6, 0xf3, 0x7b, 0x03, 0xf4, 0x62, + 0x13, 0xe9, 0x42, 0xa7, 0xe1, 0x9a, 0x46, 0xe9, 0x70, 0xb5, 0xc5, 0x06, 0x70, 0x84, + 0x30, 0x31, 0x7b, 0x1b, 0xb3, 0xb3, 0x5d, 0xf6, 0x8a, 0xe3, 0x3a, 0x49, 0x26, 0xa0, + 0x3e, 0x6b, 0xfe, 0xb5, 0x51, 0x04, 0x16, 0xfc, 0xbb, 0x05, 0x24, 0xc9, 0xca, 0x50, + 0x74, 0x15, 0x6c, 0xc5, 0xa5, 0xd6, 0xfe, 0x1c, 0x99, 0x5e, 0xdc, 0x60, 0xa2, 0xf5, + 0x50, 0x41, 0x1a, 0xa4, 0x1e, 0x3d, 0xa3, 0xbd, 0xcf, 0x64, 0xbc, 0xf0, 0x4a, 0x05, + 0x10, 0x57, 0x1b, 0x93, 0x6d, 0x47, 0xe5, 0x5c, 0xec, 0x03, 0x30, 0xee, 0x8d, 0xfe, + 0x73, 0x56, 0x34, 0x04, 0xf0, 0x47, 0xd7, 0xf3, 0xa8, 0xa3, 0xd7, 0x74, 0x3b, 0xc5, + 0x54, 0x95, 0x52, 0x10, 0xf1, 0xeb, 0x0d, 0x08, 0x59, 0x9e, 0xa7, 0x7d, 0x5f, 0x97, + 0x4d, 0x87, 0x17, 0x6d, 0x37, 0xd9, 0x8b, 0x9c, 0x0a, 0xd4, 0x40, 0x40, 0x72, 0x09, + 0xed, 0x6a, 0x9f, 0x08, 0x46, 0x4d, 0x56, 0x55, 0x93, 0xe1, 0xa6, 0x3b, 0x93, 0x85, + 0x36, 0xb4, 0x92, 0x44, 0xe9, 0x7d, 0x88, 0x01, 0x73, 0xb6, 0x40, 0xf2, 0xdd, 0xb7, + 0x4d, 0x06, 0x8e, 0xcb, 0x46, 0xcf, 0x28, 0x9b, 0x7d, 0x89, 0x13, 0x07, 0xbb, 0xa3, + 0x70, 0x54, 0xcf, 0x91, 0xb3, 0x1f, 0xc8, 0x2f, 0x74, 0xd5, 0xfc, 0xc0, 0x00, 0x94, + 0x2e, 0xde, 0x91, 0x18, 0x25, 0xf5, 0x3f, 0xe6, 0x66, 0xb0, 0xc9, 0xaa, 0x8c, 0xff, + 0x6a, 0x37, 0x6e, 0x1f, 0x37, 0x2e, 0xac, 0x6a, 0xc4, 0xe4, 0x6c, 0xc0, 0x94, 0x22, + 0x45, 0xd4, 0xc2, 0xdc, 0xf0, 0x2d, 0x76, 0x40, 0xff, 0xcc, 0x5a, 0x6a, 0xc3, 0xa8, + 0x7f, 0x5c, 0x41, 0x15, 0x51, 0xbc, 0xc2, 0xf2, 0x6c, 0xb9, 0x49, 0x61, 0xd5, 0x3f, + 0x95, 0xdd, 0xb1, 0x9a, 0xe9, 0x30, 0xc8, 0xd7, 0x0f, 0x03, 0x1b, 0x29, 0xa5, 0xdf, + 0x99, 0xff, 0x36, 0x69, 0x5e, 0x80, 0x2c, 0xbc, 0xb6, 0xb5, 0x8c, 0x1b, 0xa7, 0xed, + 0x5e, 0xac, 0xfa, 0x76, 0x41, 0x4a, 0x41, 0xad, 0x4a, 0x44, 0xf7, 0x1f, 0x1b, 0x58, + 0x0d, 0x34, 0xc3, 0xa9, 0x52, 0x92, 0x0b, 0x25, 0x4a, 0x14, 0x5f, 0xea, 0x51, 0x7f, + 0x5b, 0x42, 0xb2, 0xf6, 0x5e, 0xcd, 0x0f, 0x82, 0x59, 0x54, 0x78, 0xd8, 0x0a, 0xe5, + 0xc8, 0xce, 0xea, 0x12, 0xa1, 0x61, 0xcc, 0xbb, 0x5e, 0xac, 0x09, 0x99, 0x0f, 0xc6, + 0x19, 0xa4, 0x60, 0x80, 0x43, 0x6d, 0xbd, 0x08, 0xd7, 0x47, 0x84, 0xaf, 0x00, 0x2d, + 0x58, 0xe0, 0x6f, 0xaf, 0x7f, 0x3c, 0xea, 0xe7, 0xd3, 0x41, 0x9b, 0x1f, 0xca, 0x26, + 0x5a, 0x55, 0x59, 0xcf, 0x9e, 0x2d, 0x3b, 0x60, 0x97, 0x8d, 0x81, 0xa6, 0x78, 0xb9, + 0xed, 0x8e, 0x44, 0x86, 0xb4, 0xd1, 0x46, 0x09, 0xd6, 0xc1, 0x27, 0xc0, 0xc2, 0xfb, + 0xff, 0xe3, 0x0a, 0x60, 0x51, 0x98, 0x36, 0x70, 0x17, 0xdf, 0x5c, 0x2b, 0x2c, 0x02, + 0x0b, 0x40, 0x50, 0x35, 0xfe, 0xb4, 0xb2, 0xcd, 0xfe, 0x3a, 0x28, 0x1b, 0xdb, 0xd9, + 0x68, 0xe0, 0xa9, 0x0f, 0xa6, 0x51, 0x36, 0x1a, 0x42, 0xde, 0x27, 0x2c, 0xb8, 0xc2, + 0xf5, 0x4e, 0x96, 0xf5, 0x1d, 0xf9, 0x1e, 0xf1, 0x19, 0xcc, 0x7a, 0xb7, 0xe1, 0x36, + 0xa3, 0xbd, 0xb8, 0x18, 0xb4, 0xd7, 0x8c, 0x8e, 0x98, 0x66, 0x70, 0x03, 0x02, 0x74, + 0x39, 0x22, 0x65, 0x43, 0x32, 0x81, 0xc8, 0xa7, 0x71, 0x17, 0x1c, 0x2b, 0x70, 0xa0, + 0x72, 0x72, 0xd2, 0xfb, 0xaa, 0xbf, 0x81, 0x3b, 0xf2, 0xcc, 0x8c, 0x2b, 0x2b, 0xc2, + 0x56, 0xd4, 0x98, 0x27, 0xff, 0xa8, 0xf6, 0xb0, 0x96, 0xb4, 0xc3, 0xa7, 0x92, 0xc5, + 0xde, 0x00, 0x3f, 0x4c, 0x33, 0xb7, 0x21, 0x60, 0x56, 0xd9, 0xed, 0xb7, 0x48, 0x2f, + 0xb9, 0x8a, 0xa0, 0x33, 0xb6, 0x5e, 0x11, 0x99, 0xf5, 0x83, 0x7e, 0x81, 0xed, 0x2f, + 0xe4, 0x94, 0xa7, 0x19, 0xff, 0xc6, 0x53, 0xfd, 0x2b, 0xb9, 0xef, 0x91, 0x32, 0x7a, + 0xc2, 0x10, 0x48, 0x2a, 0x6d, 0xed, 0x0a, 0xb8, 0xe1, 0xc8, 0x09, 0x88, 0xbb, 0x45, + 0x85, 0x85, 0x1d, 0xc9, 0x3e, 0xcc, 0xc6, 0x23, 0x22, 0x92, 0x4c, 0xd1, 0x3b, 0x5d, + 0xd4, 0xee, 0xd6, 0x6e, 0xd8, 0xd9, 0x97, 0x2d, 0x77, 0x26, 0x29, 0xea, 0x64, 0x74, + 0x2e, 0xe8, 0x3c, 0x04, 0x11, 0x2f, 0x09, 0xae, 0x57, 0x48, 0x27, 0xaa, 0x4b, 0xeb, + 0x00, 0x38, 0xf2, 0x55, 0x5a, 0x8b, 0xa3, 0x6a, 0x9b, 0xfb, 0xa0, 0x28, 0xd7, 0xc2, + 0x1e, 0xa3, 0xcd, 0x0b, 0xba, 0xa9, 0xae, 0x48, 0x11, 0xc6, 0xaf, 0x06, 0xfe, 0x80, + 0xa8, 0xc0, 0x2a, 0xb7, 0xa0, 0x0e, 0x18, 0xe4, 0xa6, 0xaa, 0x1e, 0xa1, 0xb7, 0x69, + 0x45, 0xd2, 0x61, 0x5d, 0x43, 0xac, 0x11, 0x8b, 0x56, 0xc2, 0xf2, 0x96, 0x0f, 0xe9, + 0x3a, 0x02, 0x5f, 0x13, 0xec, 0x91, 0xff, 0xc6, 0xd2, 0xc3, 0x53, 0x69, 0x9a, 0xbb, + 0x09, 0x2d, 0xed, 0xc0, 0x65, 0xdb, 0x8f, 0xa2, 0x14, 0xdb, 0xc4, 0x64, 0x66, 0xf8, + 0x97, 0xb8, 0x8c, 0x58, 0xb3, 0x01, 0x52, 0x13, 0x3a, 0xa3, 0x83, 0x1a, 0xf3, 0x7c, + 0x74, 0xd9, 0x9e, 0x9e, 0x36, 0xff, 0x70, 0x11, 0xd3, 0x23, 0x83, 0x05, 0x69, 0x15, + 0x08, 0xa2, 0xc3, 0xa4, 0x3e, 0x75, 0x5d, 0xc0, 0x81, 0xb5, 0x11, 0xd6, 0x48, 0x2a, 0x7d, 0xb6, 0x5f, 0xa9, 0x69, 0x9e, 0xa8, 0x7f, 0xf4, 0x70, 0x99, 0xed, 0x36, 0x37, - 0x1b, 0x2d, 0xb3, 0x81, 0x16, 0x15, 0xbb, 0xf5, 0x2d, 0xc6, 0x55, 0xda, 0x35, 0xa9, - 0xfc, 0x03, 0xf3, 0x11, 0xbe, 0x83, 0x0e, 0x28, 0x55, 0x0a, 0x71, 0xce, 0x28, 0x9b, - 0x24, 0xfa, 0xb9, 0x3c, 0x01, 0x63, 0xa5, 0xca, 0x95, 0x9b, 0xe6, 0x3f, 0x37, 0xf2, + 0xdb, 0xb0, 0xa3, 0xd0, 0xef, 0x79, 0x79, 0x6a, 0x8e, 0xf1, 0xe4, 0xd9, 0x4d, 0x42, + 0xb4, 0xbc, 0x2b, 0x4a, 0x03, 0x8a, 0xe6, 0xe4, 0x6b, 0x24, 0xcf, 0xc8, 0x41, 0x53, + 0xd3, 0x1e, 0xaf, 0x89, 0x50, 0x63, 0xa5, 0xca, 0x95, 0x9b, 0xe6, 0x3f, 0x37, 0xf2, 0xba, 0x0d, 0x43, 0x23, 0x66, 0x73, 0x6d, 0x86, 0x32, 0xfc, 0xe0, 0x72, 0xb6, 0xae, - 0x5b, 0x6f, 0x3f, 0xd5, 0x9d, 0x3f, 0xaf, 0xf6, 0x38, 0x1e, 0x86, 0x57, 0x65, 0x81, - 0xe2, 0xaf, 0x57, 0x81, 0x19, 0xdc, 0xb6, 0xec, 0xdd, 0xaf, 0x21, 0x15, 0xbd, 0xed, - 0x85, 0xc8, 0x1a, 0xc2, 0xa8, 0x13, 0x6f, 0xc8, 0x37, 0x25, 0x90, 0xf2, 0x8a, 0x36, + 0x5b, 0x6f, 0x3f, 0xd5, 0x9d, 0x3f, 0xaf, 0xf6, 0x38, 0x27, 0x5a, 0x99, 0x2f, 0xef, + 0xc8, 0x7e, 0x60, 0xd4, 0x4c, 0x2c, 0xad, 0xc2, 0xb5, 0xc4, 0x94, 0xe3, 0xe7, 0x2e, + 0xb4, 0x59, 0x7c, 0x96, 0xb4, 0x01, 0x67, 0x79, 0x9a, 0x90, 0x01, 0xa2, 0xed, 0x36, 0x76, 0xa8, 0xb4, 0x03, 0xae, 0x25, 0xff, 0xd7, 0x72, 0xf7, 0x08, 0x1e, 0x9a, 0x32, 0xbc, 0xc1, 0xc5, 0xe2, 0xed, 0xd4, 0xe2, 0xa6, 0x57, 0x6b, 0x78, 0x3c, 0xce, 0x3a, 0xae, 0x11, 0xfa, 0x43, 0x22, 0x62, 0x54, 0x88, 0x56, 0x18, 0x3e, 0xe6, 0x82, 0xd5, @@ -949,34 +891,34 @@ lazy_static! { 0xc0, 0x68, 0x93, 0xbd, 0x02, 0xdb, 0x9b, 0x61, 0x19, 0x1d, 0xfb, 0x13, 0x3b, 0xfa, 0xbe, 0x48, 0x58, 0xe4, 0x7a, 0x4c, 0xc3, 0x2e, 0x41, 0x6e, 0xc0, 0x8b, 0x8a, 0xc7, 0x91, 0x5a, 0x43, 0x73, 0x3f, 0x44, 0x06, 0xe9, 0xd9, 0x67, 0xc5, 0x60, 0xf3, 0x44, - 0xd7, 0xe9, 0x04, 0xa2, 0x80, 0x45, 0xd9, 0x9f, 0x3a, 0xf8, 0xc8, 0x2e, 0x97, 0xe1, - 0xb9, 0xc1, 0xb2, 0x05, 0xe5, 0x85, 0xfb, 0xeb, 0xb4, 0x8f, 0xaf, 0x58, 0xf1, 0xb6, - 0x5d, 0xca, 0x24, 0x97, 0xe0, 0x9a, 0x70, 0xaa, 0xd4, 0x86, 0x5f, 0x85, 0x71, 0x5a, - 0x28, 0x0e, 0x18, 0x6f, 0x3f, 0xc1, 0x74, 0x0d, 0x81, 0x84, 0xd3, 0x3e, 0x83, 0x22, - 0x16, 0x95, 0x21, 0xcd, 0xc1, 0x32, 0x21, 0x29, 0x39, 0xc8, 0x4a, 0x10, 0x89, 0x64, - 0xe2, 0xde, 0x74, 0xb6, 0xea, 0x55, 0xb4, 0xcb, 0x8f, 0x6f, 0x9b, 0xee, 0x98, 0xb1, - 0x0d, 0x41, 0x51, 0x09, 0x45, 0x5f, 0x48, 0xb7, 0x76, 0x08, 0x2d, 0xc3, 0x0b, 0x4b, - 0xc7, 0x34, 0x77, 0x07, 0x55, 0x11, 0x70, 0x03, 0x08, 0x15, 0x8c, 0xe2, 0xf2, 0xf9, - 0xbf, 0x0f, 0x69, 0x1b, 0x2c, 0xe5, 0x3e, 0x61, 0x14, 0x2c, 0xb7, 0x40, 0xc1, 0x5b, - 0x7b, 0x62, 0x3c, 0xf4, 0x8b, 0x3f, 0x7b, 0xfe, 0xfa, 0x31, 0xbc, 0xdc, 0x66, 0x5c, - 0x6d, 0x71, 0x23, 0xe9, 0x53, 0x50, 0x81, 0x13, 0x75, 0x94, 0x7b, 0x05, 0x5a, 0x43, - 0xdb, 0x07, 0xe0, 0x3f, 0x33, 0x62, 0x7d, 0xf5, 0xc6, 0x38, 0xbf, 0xad, 0x95, 0x6d, - 0xdc, 0x1e, 0xa7, 0xd7, 0x62, 0x0a, 0x20, 0xf2, 0x79, 0x2f, 0x63, 0x81, 0x7a, 0x1c, - 0xf3, 0x25, 0x80, 0xd0, 0x42, 0x74, 0x23, 0x4a, 0xf2, 0xa5, 0x1b, 0x56, 0xbb, 0x68, - 0xa2, 0x9e, 0x43, 0xa9, 0x54, 0x14, 0x2b, 0xa4, 0xca, 0x68, 0x23, 0xbd, 0xe9, 0x05, - 0x3d, 0x72, 0xfd, 0xad, 0xbc, 0x61, 0xad, 0x59, 0x36, 0xc5, 0x3f, 0xdd, 0x75, 0x79, - 0x44, 0x1c, 0x5b, 0x96, 0x9e, 0x08, 0xe9, 0xf2, 0xe1, 0xeb, 0x20, 0xc9, 0x09, 0xb3, - 0xde, 0x65, 0x53, 0xf5, 0x74, 0x84, 0x84, 0xd9, 0xdd, 0xcc, 0x42, 0x27, 0xee, 0xc9, - 0x2d, 0x78, 0x0a, 0xa5, 0x1d, 0xe2, 0x0e, 0x95, 0x96, 0x8a, 0x36, 0xc4, 0x25, 0x7b, - 0xb2, 0x5f, 0x3f, 0xf7, 0x5d, 0xbc, 0x38, 0xff, 0xf2, 0xf2, 0xf2, 0x71, 0xea, 0xb8, - 0x9c, 0x62, 0x8e, 0x18, 0xb5, 0xfc, 0xb4, 0x38, 0x02, 0xce, 0x65, 0x25, 0x6d, 0x33, - 0xee, 0x8f, 0x5f, 0xe0, 0x37, 0x95, 0x1b, 0xe9, 0xa7, 0x60, 0x73, 0x44, 0x60, 0xa2, - 0xcf, 0x02, 0x6b, 0xc8, 0xdd, 0xae, 0xac, 0xef, 0x00, 0x5a, 0xbc, 0xfe, 0x08, 0x24, - 0x84, 0x9a, 0x30, 0x57, 0x6d, 0x58, 0x46, 0xd6, 0x04, 0x54, 0x2a, 0x13, 0x2d, 0xa9, - 0x57, 0x07, 0x62, 0xc0, 0xb1, 0xc6, 0x58, 0x55, 0xde, 0xba, 0x84, 0x22, 0xca, 0x4b, - 0x88, 0xab, 0x2e, 0x03, 0x99, 0x8f, 0xc6, 0xe1, 0x22, 0x3e, 0x7c, 0x42, 0x67, 0x26, - 0x56, 0xb9, 0xd0, 0xb3, 0x87, 0x64, 0x2d, 0xff, 0x18, 0x83, 0x66, 0xb6, 0x5a, 0x3a, - 0xe4, 0x9c, 0x20, 0x6b, 0x9a, 0x06, 0x36, 0x40, 0x7f, 0xd7, 0xda, 0x93, 0xfd, 0x0d, + 0xd7, 0xe9, 0x04, 0xa2, 0x80, 0x45, 0xd9, 0x1e, 0x50, 0xd7, 0x9e, 0x42, 0x86, 0x7c, + 0x0a, 0xd0, 0xff, 0xb5, 0x5f, 0x68, 0x87, 0x5e, 0x58, 0x64, 0x20, 0x10, 0x8a, 0x1b, + 0x09, 0x25, 0x76, 0x41, 0x5d, 0xc1, 0x36, 0x93, 0xa1, 0x21, 0x2b, 0x0e, 0x70, 0x03, + 0x08, 0x4e, 0xf9, 0x5a, 0x27, 0xa7, 0xd4, 0x28, 0x4d, 0x27, 0x61, 0x11, 0xd8, 0x60, + 0x14, 0x2c, 0xb7, 0x40, 0xc1, 0x5b, 0x7b, 0x62, 0x3c, 0xf4, 0x8b, 0x3f, 0x7b, 0xfe, + 0x3a, 0xf0, 0x8d, 0xf8, 0xd1, 0xd3, 0xe1, 0x1f, 0xf1, 0x98, 0x21, 0x4e, 0x67, 0x37, + 0x76, 0xf0, 0x4f, 0x0c, 0x4e, 0x84, 0x6c, 0x32, 0xa1, 0x0c, 0x0d, 0x55, 0x9e, 0x49, + 0x68, 0xb4, 0xf8, 0xe1, 0xb9, 0x6c, 0xdc, 0x1e, 0xa7, 0xea, 0x31, 0xdd, 0x86, 0xd6, + 0x80, 0xe2, 0x59, 0x85, 0xe1, 0xd5, 0xd0, 0x25, 0x80, 0xd0, 0x42, 0x74, 0x23, 0x4a, + 0xf2, 0xa5, 0x1b, 0x56, 0xbb, 0x68, 0xa2, 0x9e, 0x03, 0xba, 0xb7, 0xb5, 0x0f, 0x30, + 0x6e, 0xf5, 0xd9, 0xa4, 0xf8, 0x13, 0x5d, 0x69, 0x61, 0x4a, 0xb3, 0x41, 0x58, 0xfb, + 0xa3, 0x70, 0xf7, 0x87, 0x63, 0xd4, 0x02, 0x00, 0x81, 0xfe, 0x39, 0xcc, 0x23, 0x16, + 0x30, 0xe4, 0xc0, 0x89, 0x15, 0xe6, 0x31, 0x77, 0x15, 0x50, 0xe9, 0xce, 0x1f, 0xca, + 0x2c, 0x63, 0xfe, 0x06, 0xb7, 0x98, 0x9d, 0x58, 0x4f, 0xa7, 0xd7, 0x82, 0xa8, 0x8c, + 0x1e, 0x7d, 0x64, 0xb6, 0xfb, 0xf5, 0x5e, 0x35, 0x96, 0xaf, 0x9b, 0xcb, 0x75, 0x85, + 0xf8, 0xc7, 0xd3, 0xaa, 0x5c, 0x20, 0x82, 0xb2, 0x65, 0x24, 0x9d, 0xf0, 0x57, 0x01, + 0xda, 0xb0, 0x31, 0xc4, 0xba, 0xc1, 0xea, 0x26, 0x7a, 0x29, 0x96, 0xa2, 0x02, 0x8d, + 0x1e, 0x6a, 0x0f, 0x80, 0xa3, 0x84, 0x7c, 0x53, 0x1d, 0xba, 0x96, 0xee, 0x65, 0xa2, + 0x41, 0x89, 0xbd, 0x27, 0x12, 0xe4, 0x0e, 0x95, 0x96, 0x64, 0x98, 0x1e, 0x58, 0xb2, + 0xa4, 0xf9, 0x51, 0xef, 0x8f, 0x49, 0x7d, 0xff, 0xf2, 0xf2, 0xf2, 0x71, 0xea, 0xb8, + 0x9c, 0x62, 0x8e, 0x18, 0xb5, 0xfc, 0xb4, 0x38, 0x82, 0x53, 0x7e, 0xaf, 0x6a, 0xd2, + 0xa6, 0xb1, 0x75, 0x46, 0x33, 0xca, 0xa8, 0x6b, 0xf2, 0xc7, 0x6f, 0x39, 0x93, 0x15, + 0x4f, 0xc7, 0x3e, 0x6f, 0xbb, 0xa2, 0x21, 0x0c, 0x27, 0x43, 0xf5, 0x30, 0xa4, 0x27, + 0x84, 0x9a, 0x30, 0x1e, 0x00, 0xe0, 0x11, 0x29, 0xf0, 0x3a, 0x46, 0x07, 0xf8, 0x7c, + 0xbe, 0x07, 0x62, 0xc0, 0xb1, 0xc6, 0x58, 0x55, 0xde, 0xba, 0x84, 0x22, 0xca, 0x4b, + 0x88, 0xab, 0xee, 0xa6, 0xa4, 0x38, 0x2c, 0xf1, 0x6c, 0xcd, 0x6d, 0xc7, 0xc3, 0x7c, + 0x44, 0xe5, 0x49, 0xc4, 0x53, 0x48, 0x19, 0xac, 0xd8, 0xbb, 0x0a, 0x02, 0xa5, 0xfa, + 0x7a, 0x1c, 0x1d, 0x38, 0x06, 0xfb, 0xc3, 0x40, 0x7f, 0xd7, 0xda, 0x93, 0xfd, 0x0d, 0xe6, 0x40, 0x0d, 0x3a, 0xb8, 0x97, 0x74, 0x85, 0xcd, 0xdf, 0xbe, 0xd5, 0x93, 0x2f, 0x50, 0x7b, 0x79, 0x94, 0x7a, 0xdb, 0x2f, 0xad, 0x37, 0x61, 0x5a, 0xa7, 0x17, 0xdb, 0x5f, 0x29, 0x80, 0x99, 0xf2, 0x0f, 0x26, 0x3b, 0x35, 0x9a, 0x11, 0x51, 0xa6, 0xb7, @@ -1008,140 +950,60 @@ lazy_static! { 0xbd, 0x79, 0x0a, 0x80, 0xd7, 0xc2, 0x3f, 0x90, 0xcc, 0x03, 0x49, 0x5b, 0x51, 0xe4, 0xd2, 0x84, 0x3e, 0x55, 0x7f, 0x9e, 0x25, 0x45, 0x10, 0x8c, 0x6c, 0x6f, 0xae, 0x35, 0x9f, 0x64, 0x5c, 0x27, 0x68, 0x91, 0xc0, 0xdc, 0xab, 0x3f, 0xaf, 0x18, 0x77, 0x00, - 0xc0, 0x82, 0xdc, 0x47, 0x77, 0x40, 0xfb, 0x3f, 0x2c, 0xd7, 0xbb, 0x59, 0xfb, 0x35, - 0x85, 0x54, 0xe9, 0x4c, 0x7e, 0x67, 0x8c, 0xe0, 0x1a, 0xeb, 0xf9, 0x4e, 0x51, 0x5e, - 0x49, 0x72, 0x29, 0x67, 0x99, 0x5a, 0xea, 0x85, 0x8d, 0x64, 0xe7, 0x78, 0x9f, 0xf3, - 0x06, 0x36, 0x95, 0x77, 0x22, 0x81, 0x80, 0x32, 0x6a, 0x5b, 0x0a, 0xf4, 0x75, 0xe2, - 0x7a, 0x54, 0xb2, 0x07, 0xb4, 0x1f, 0x92, 0xe3, 0x76, 0x17, 0x0e, 0x3f, 0xb0, 0x05, - 0x02, 0x82, 0x61, 0xc9, 0x9c, 0x2d, 0xbd, 0x0e, 0xed, 0xee, 0x87, 0x1c, 0x1c, 0x0f, - 0x48, 0xb8, 0xe9, 0xb8, 0xe4, 0xbe, 0x77, 0xd1, 0xb7, 0x37, 0xfe, 0x21, 0xf0, 0xfa, - 0x5a, 0x18, 0xeb, 0xb5, 0x27, 0x55, 0xb5, 0xa6, 0xcf, 0x61, 0x30, 0xfb, 0x56, 0x94, - 0x4c, 0xfa, 0xb8, 0x75, 0x27, 0xc2, 0x50, 0xd1, 0x13, 0xb2, 0x9b, 0xca, 0xc9, 0xaa, - 0xa1, 0x0c, 0x2e, 0x7d, 0xe4, 0x15, 0xed, 0xb0, 0x80, 0x6c, 0x6d, 0xa0, 0x30, 0x20, - 0xa1, 0x34, 0xca, 0x7e, 0xcd, 0xc8, 0xda, 0x1b, 0xd5, 0x7a, 0x37, 0xf5, 0x5a, 0x46, - 0x94, 0x0b, 0x45, 0xb2, 0x41, 0xb1, 0xc1, 0x6e, 0xe1, 0x00, 0x92, 0x7d, 0x1b, 0xd8, - 0x60, 0xd4, 0x45, 0xa9, 0xde, 0x50, 0xd4, 0xc3, 0x84, 0xd6, 0xe1, 0xd0, 0x01, 0x08, - 0x02, 0x6c, 0x0e, 0xa5, 0xeb, 0xbf, 0x0b, 0x72, 0xfb, 0xf5, 0xc3, 0x70, 0xbc, 0xe1, - 0x8d, 0x3a, 0xcb, 0xc4, 0x65, 0x99, 0x09, 0x9b, 0xaa, 0xe1, 0xd8, 0x02, 0xf7, 0x73, - 0x33, 0x49, 0x4a, 0x7a, 0xe1, 0x30, 0xfe, 0x86, 0xe8, 0x35, 0xcf, 0xb9, 0xf5, 0xdb, - 0x2a, 0x72, 0x1a, 0xc6, 0x46, 0xea, 0xdf, 0x76, 0xe4, 0x26, 0xd8, 0xe8, 0x88, 0x32, - 0x18, 0x27, 0xab, 0xcb, 0xff, 0xbf, 0xbf, 0x52, 0xd7, 0x5e, 0x07, 0x13, 0x1c, 0xca, + 0xc0, 0x03, 0x10, 0xa4, 0xfe, 0xf5, 0x63, 0x14, 0x00, 0x00, 0x9a, 0x2d, 0xbd, 0x0e, + 0x13, 0x8d, 0x2d, 0xea, 0xe4, 0x1c, 0xae, 0xa5, 0xf1, 0x86, 0x57, 0x7a, 0x77, 0xd1, + 0xb7, 0x37, 0xfe, 0x21, 0xf0, 0xfa, 0x5a, 0x18, 0xeb, 0xb5, 0x27, 0x55, 0xb5, 0x26, + 0xef, 0x61, 0x30, 0xfb, 0x56, 0x94, 0x4c, 0xfa, 0xb8, 0x75, 0x27, 0xc2, 0x50, 0xd1, + 0x13, 0xb2, 0x9b, 0xca, 0xc9, 0xaa, 0xa1, 0x0c, 0x2e, 0x7d, 0xe4, 0x15, 0xed, 0xb0, + 0x80, 0x6c, 0x6d, 0xa0, 0x30, 0x20, 0xa1, 0x34, 0xca, 0x7e, 0xcd, 0xc8, 0xda, 0x1b, + 0xd5, 0x7a, 0x37, 0xf5, 0x5a, 0x46, 0x94, 0x0b, 0x45, 0xb2, 0x41, 0xb1, 0xc1, 0x6e, + 0xe1, 0x00, 0x92, 0x7d, 0x1b, 0xd8, 0x60, 0xd4, 0x45, 0xa9, 0xde, 0x50, 0xd4, 0xc3, + 0x84, 0xd6, 0xe1, 0xd0, 0x01, 0x08, 0x02, 0x6c, 0x0e, 0xa5, 0xeb, 0xbf, 0x0b, 0x72, + 0xfb, 0xf5, 0xc3, 0x70, 0xbc, 0xe1, 0x8d, 0x3a, 0xcb, 0xc4, 0x65, 0x99, 0x09, 0x9b, + 0xaa, 0xe1, 0xd8, 0x02, 0xf7, 0x73, 0x33, 0x49, 0x4a, 0x7a, 0xe1, 0x30, 0xfe, 0x86, + 0xe8, 0xf8, 0x18, 0xf9, 0x26, 0x1a, 0x2d, 0xad, 0xb4, 0x12, 0x52, 0x29, 0xba, 0x0f, + 0xfc, 0x0e, 0x70, 0x90, 0x32, 0x44, 0x30, 0xb5, 0x21, 0xa9, 0x0d, 0x22, 0x4a, 0xb7, + 0xa1, 0x02, 0x4e, 0x1d, 0x89, 0x3e, 0x74, 0x04, 0xfe, 0xdb, 0x34, 0x8e, 0x4d, 0x5e, + 0x22, 0x35, 0xc5, 0x9a, 0x78, 0x76, 0xa0, 0xfc, 0x60, 0x14, 0x5c, 0x6a, 0x00, 0x96, + 0x87, 0x68, 0x44, 0x60, 0x27, 0x1e, 0xe1, 0x33, 0xa4, 0x37, 0xfe, 0x52, 0xfb, 0x6c, + 0xfb, 0xa9, 0x7f, 0xce, 0xc1, 0x61, 0xdf, 0x51, 0x5d, 0xde, 0x90, 0x5a, 0x24, 0xda, + 0x6d, 0x37, 0xbd, 0xc3, 0x40, 0x44, 0xa9, 0x55, 0xe6, 0x82, 0xb4, 0x74, 0x71, 0xca, 0x1e, 0x8c, 0x78, 0xc5, 0x1e, 0xd3, 0x77, 0xcd, 0x4a, 0xfa, 0x89, 0x4b, 0xd9, 0xbd, 0x12, 0xe7, 0x07, 0x15, 0x6d, 0xa0, 0x72, 0x6f, 0x7c, 0xf5, 0x72, 0x9f, 0xab, 0xe3, - 0x72, 0x16, 0x04, 0x34, 0x76, 0x42, 0xba, 0x50, 0x5e, 0xc9, 0x40, 0xba, 0xb4, 0x83, - 0x70, 0x84, 0x5a, 0x5b, 0xbf, 0x48, 0x3e, 0xa8, 0xf8, 0x56, 0xe5, 0xe2, 0x86, 0x00, - 0x90, 0x4b, 0x97, 0x22, 0x6e, 0xac, 0x27, 0x55, 0x7d, 0xef, 0xf7, 0xc6, 0x56, 0x40, - 0x6f, 0x9f, 0x95, 0x99, 0x96, 0x09, 0x3b, 0x2c, 0xd7, 0x10, 0xd3, 0xe1, 0xb3, 0x29, - 0x9d, 0xc9, 0x52, 0x1f, 0x8b, 0x51, 0x3b, 0xad, 0xb0, 0x10, 0x29, 0xa3, 0x1b, 0x36, - 0x6a, 0x37, 0x0f, 0xa1, 0xc2, 0xeb, 0x42, 0x6c, 0x7a, 0x9f, 0x32, 0x7e, 0x56, 0xb3, - 0xb9, 0xb5, 0xb3, 0x2a, 0x22, 0x6b, 0x2d, 0xe1, 0x4b, 0x7f, 0x52, 0x59, 0xbb, 0xf5, - 0x25, 0xaa, 0xba, 0x56, 0x5b, 0x84, 0xb8, 0x45, 0xe1, 0x63, 0xd1, 0xca, 0xef, 0x25, - 0x33, 0xc3, 0x98, 0x16, 0x37, 0x20, 0x4f, 0x96, 0xa5, 0x9c, 0x8e, 0x80, 0x24, 0xd9, - 0x04, 0x1b, 0x20, 0x29, 0xe9, 0x4c, 0x15, 0x24, 0x5f, 0x1a, 0x95, 0x88, 0x40, 0xba, - 0x3f, 0x38, 0x0a, 0x4d, 0x20, 0xf1, 0x18, 0x4e, 0x77, 0x82, 0x7d, 0xe3, 0xff, 0x8f, - 0x3d, 0x73, 0x45, 0x9a, 0xfe, 0x24, 0x1f, 0x72, 0x3c, 0x08, 0x48, 0x23, 0x23, 0x0e, - 0x00, 0x3d, 0x3d, 0x21, 0xe5, 0x35, 0x01, 0xec, 0x04, 0x99, 0xb0, 0x83, 0xa7, 0xda, - 0xd6, 0x85, 0xc5, 0x71, 0x27, 0xf4, 0xde, 0x64, 0x73, 0x3a, 0x88, 0x0c, 0x2d, 0xb2, - 0x8f, 0xda, 0xab, 0xf1, 0xb5, 0x42, 0xd2, 0x05, 0xf6, 0x64, 0xa3, 0x51, 0x35, 0x71, - 0x27, 0x11, 0xdc, 0xcc, 0xd9, 0x31, 0xa5, 0x0b, 0x9c, 0x56, 0x61, 0x88, 0x23, 0x60, - 0xd4, 0xca, 0xc0, 0x04, 0x76, 0x81, 0xbc, 0x2e, 0x2b, 0x3b, 0xf6, 0xc9, 0x97, 0x60, - 0xd7, 0xcf, 0xb4, 0xfa, 0x21, 0x39, 0x43, 0x77, 0xa4, 0x55, 0x1c, 0x76, 0xd1, 0xf7, - 0x5a, 0xc0, 0x3c, 0x26, 0x20, 0x54, 0xdf, 0xfd, 0x79, 0xa9, 0xde, 0xd0, 0x5e, 0x88, - 0x89, 0x58, 0x19, 0x9e, 0xea, 0x45, 0x01, 0xe2, 0x99, 0x0a, 0x53, 0xa5, 0xcd, 0x2a, - 0x46, 0xa4, 0x01, 0x57, 0x65, 0x88, 0xfd, 0x7d, 0x05, 0x8a, 0x26, 0xf2, 0x84, 0x38, - 0xe5, 0x78, 0x2f, 0x45, 0xac, 0x1d, 0x07, 0xf6, 0xf6, 0xf5, 0xed, 0x73, 0x74, 0x1d, - 0x57, 0x85, 0x83, 0x7a, 0x6b, 0x84, 0x4b, 0x47, 0x47, 0x75, 0x71, 0x8c, 0x29, 0xdd, - 0x99, 0x08, 0x4e, 0x9f, 0x88, 0xef, 0x15, 0x3a, 0x83, 0x29, 0xf5, 0x32, 0xa6, 0x90, - 0x17, 0xdc, 0x3a, 0x97, 0xed, 0x75, 0x43, 0x67, 0x72, 0x30, 0x98, 0xe5, 0x76, 0x58, - 0x40, 0xb0, 0x22, 0x89, 0x72, 0x44, 0x74, 0x5f, 0xbb, 0xbb, 0x30, 0xa7, 0xcb, 0x54, - 0xfa, 0x05, 0x11, 0x16, 0x6e, 0x95, 0x44, 0x12, 0x20, 0x00, 0x61, 0x0b, 0xd2, 0xaa, - 0xcb, 0xd8, 0x23, 0x25, 0xa5, 0x9b, 0x95, 0x15, 0x4e, 0xcd, 0x82, 0xc8, 0x8d, 0x23, - 0xab, 0xd1, 0xe2, 0x07, 0x70, 0xff, 0xb8, 0xaa, 0xbf, 0x83, 0xfc, 0x07, 0x34, 0x96, - 0x4c, 0xcd, 0x41, 0x1d, 0x1c, 0x93, 0x57, 0x14, 0xe2, 0x4a, 0xab, 0x56, 0x6f, 0x4f, - 0x08, 0x42, 0x40, 0x14, 0xc4, 0xec, 0xa9, 0x1b, 0x59, 0x0f, 0x08, 0x2b, 0x47, 0x3f, - 0x36, 0x1c, 0x87, 0x41, 0x5d, 0x37, 0xbd, 0x20, 0xd7, 0x0f, 0xd0, 0xb5, 0x2b, 0x6d, - 0xdf, 0x18, 0x65, 0xf7, 0x66, 0x70, 0x2e, 0x32, 0xb0, 0x5b, 0x3c, 0xf1, 0x63, 0x0e, - 0xe8, 0x59, 0x7a, 0xae, 0x19, 0x63, 0x3f, 0x35, 0x16, 0xa8, 0x55, 0x5a, 0xc5, 0xbe, - 0x32, 0xc6, 0x75, 0xbe, 0x18, 0x17, 0xef, 0xbf, 0xfd, 0x93, 0x69, 0x04, 0x1a, 0x08, - 0x9c, 0x28, 0x3f, 0x19, 0x64, 0x99, 0x68, 0xc2, 0x49, 0x8c, 0xde, 0x56, 0xf5, 0x00, - 0x43, 0x4f, 0x28, 0x0d, 0x77, 0xa9, 0xc6, 0x2e, 0x43, 0xcb, 0xd3, 0xf1, 0x36, 0xa4, - 0xc6, 0xa0, 0x0a, 0x43, 0xe6, 0xed, 0x53, 0x0c, 0xb2, 0xe8, 0xae, 0x83, 0x88, 0x60, - 0xad, 0xc8, 0x8a, 0xac, 0xc7, 0xbd, 0x6a, 0x00, 0xae, 0x0c, 0x19, 0xff, 0x45, 0x33, - 0xa4, 0x85, 0xef, 0xde, 0x08, 0x2b, 0x5f, 0x4d, 0x1f, 0x7a, 0x8e, 0xbe, 0x7e, 0xd8, - 0x2b, 0x7b, 0x05, 0xa8, 0xcf, 0xe1, 0xe3, 0x73, 0x45, 0x9f, 0x1b, 0xdc, 0xbf, 0x95, - 0x25, 0x74, 0x7e, 0x8c, 0x95, 0x08, 0xa5, 0x55, 0xfa, 0xcb, 0x79, 0x87, 0x40, 0xe0, - 0xbd, 0xf9, 0x94, 0xd9, 0x73, 0x9b, 0xbe, 0x55, 0x38, 0xa0, 0xae, 0x0f, 0x07, 0x6c, - 0x58, 0x2c, 0x0f, 0x5b, 0xa8, 0x78, 0xb9, 0x9b, 0x82, 0x49, 0xdb, 0x1d, 0x7e, 0x95, - 0x05, 0x6c, 0x98, 0xaf, 0x08, 0x3d, 0x98, 0xcb, 0x0e, 0xd9, 0xe3, 0xf7, 0x43, 0x6e, - 0x1c, 0x76, 0x43, 0x76, 0x6f, 0x96, 0x6b, 0x83, 0xe9, 0x99, 0x20, 0x6e, 0xbd, 0x13, - 0x93, 0xb9, 0xb2, 0xa7, 0xf4, 0x14, 0x48, 0x0f, 0xa0, 0x17, 0x48, 0x00, 0x69, 0xf8, - 0x5c, 0x77, 0x49, 0xc4, 0x35, 0xae, 0x2f, 0xba, 0x2d, 0xdc, 0x10, 0x38, 0xd5, 0x47, - 0xd8, 0x48, 0x54, 0x81, 0x7e, 0xf3, 0x96, 0x35, 0xc2, 0x98, 0x27, 0xaa, 0xd8, 0x67, - 0x26, 0xc9, 0xad, 0xe3, 0xb2, 0x65, 0xb9, 0x08, 0x6c, 0x8b, 0x5b, 0x75, 0xef, 0x56, - 0xfe, 0x4b, 0xd8, 0xb4, 0xd6, 0x28, 0x93, 0x89, 0x5b, 0x3f, 0xd2, 0x73, 0x4f, 0xda, - 0xc4, 0x64, 0x15, 0x6d, 0x7e, 0x5e, 0xbc, 0x7e, 0xcf, 0x1d, 0x83, 0xb8, 0x6f, 0x65, - 0x96, 0x37, 0xe3, 0xb1, 0x42, 0xc1, 0x64, 0x96, 0x3b, 0x8c, 0xdc, 0xf4, 0xba, 0x4f, - 0x40, 0x35, 0xdf, 0xfc, 0x5a, 0x78, 0x94, 0x58, 0x84, 0x77, 0x81, 0x91, 0x8a, 0xc7, - 0x2f, 0xc1, 0x8b, 0x01, 0x95, 0x4e, 0xa6, 0xbf, 0x46, 0x50, 0x02, 0x00, 0xe2, 0xf7, - 0x90, 0xfb, 0xba, 0xc4, 0xc4, 0x5b, 0xc3, 0x2d, 0x24, 0x0a, 0xc1, 0x63, 0x91, 0x20, - 0x28, 0x22, 0x33, 0x0b, 0x32, 0xd5, 0x8e, 0x67, 0x77, 0x76, 0x5f, 0x22, 0xa4, 0x11, - 0x63, 0x04, 0xfd, 0x0e, 0x01, 0xb6, 0x5b, 0x2e, 0xc5, 0x16, 0x39, 0x3a, 0xb3, 0x75, - 0x1b, 0x53, 0x56, 0xd2, 0xb0, 0xc9, 0x50, 0x0c, 0x0f, 0x3e, 0x46, 0x91, 0x81, 0x03, - 0x5b, 0xc3, 0x66, 0x0f, 0x0b, 0x8f, 0x9f, 0xbe, 0x6e, 0x40, 0xb5, 0xe8, 0x9c, 0xb7, - 0x9b, 0x06, 0x37, 0x14, 0xca, 0x75, 0xe7, 0x2e, 0x2e, 0x10, 0x0a, 0x10, 0xd6, 0x3b, - 0xf7, 0x84, 0xdf, 0x08, 0x20, 0xef, 0x25, 0xf8, 0xef, 0x40, 0xfe, 0x5f, 0x05, 0xfb, - 0x95, 0x68, 0x3f, 0x91, 0x05, 0xff, 0x3c, 0xb2, 0xd2, 0x19, 0xab, 0x76, 0x60, 0x5a, - 0x06, 0x4f, 0x69, 0x21, 0x9f, 0x1d, 0xc0, 0xd0, 0x0b, 0x3b, 0x48, 0x64, 0x2f, 0x97, - 0x0d, 0xc0, 0x0c, 0xca, 0x4b, 0x8b, 0x43, 0x30, 0x8b, 0xe1, 0x82, 0x86, 0xec, 0x5a, - 0x42, 0x88, 0xd6, 0x00, 0xa3, 0x78, 0x5c, 0xb6, 0x22, 0xd4, 0x68, 0xa4, 0xc6, 0x96, - 0x9b, 0x37, 0x92, 0xf2, 0x48, 0x50, 0x27, 0xd0, 0xad, 0x9a, 0xa4, 0xa9, 0xc2, 0xcc, - 0x97, 0x2f, 0x9e, 0xe5, 0x19, 0x0a, 0x95, 0xb1, 0xeb, 0x05, 0x8d, 0xdd, 0xd8, 0xc0, - 0x8e, 0x7d, 0x75, 0x3f, 0x5e, 0x01, 0x1b, 0x2b, 0xcf, 0xee, 0x1d, 0x52, 0xc1, 0xc4, - 0xf2, 0xca, 0xcd, 0xa3, 0x0b, 0xdb, 0x69, 0x30, 0x65, 0x3c, 0x0c, 0xc4, 0x48, 0x6e, - 0x60, 0xe8, 0x9f, 0xa8, 0x49, 0xb3, 0x20, 0x83, 0xba, 0x9d, 0xb4, 0x53, 0xfb, 0x8d, - 0xf6, 0x83, 0xcd, 0x68, 0x75, 0x4c, 0x87, 0xda, 0xa7, 0x31, 0xf5, 0x70, 0xa7, 0xa4, - 0x06, 0x0a, 0xf0, 0xce, 0x70, 0x0d, 0x31, 0xbc, 0xa7, 0xe7, 0x4b, 0x3e, 0x3b, 0xa3, - 0xd0, 0xe8, 0xa6, 0x39, 0x2a, 0x06, 0x2b, 0x8e, 0x86, 0xd9, 0xd7, 0xd0, 0x0b, 0x21, - 0x70, 0x1e, 0x7b, 0x06, 0x2e, 0x06, 0xb1, 0xbc, 0xd8, 0x2a, 0x01, 0xd3, 0x75, 0x62, - 0x6f, 0xbf, 0x87, 0x2d, 0x27, 0xfa, 0x45, 0x11, 0xf5, 0xf8, 0xcf, 0x8c, 0x9a, 0xbc, - 0xef, 0x2a, 0x99, 0x01, 0x76, 0xae, 0x33, 0x93, 0x25, 0x30, 0x2e, 0x42, 0x23, 0x6a, - 0x1e, 0xb1, 0x05, 0x72, 0x88, 0xce, 0x53, 0x22, 0x1f, 0xb6, 0x08, 0xa5, 0x47, 0xf2, - 0xcf, 0xa5, 0x12, 0x16, 0x33, 0x8d, 0x4e, 0xa1, 0x33, 0x0d, 0x6b, 0xad, 0x84, 0x7f, - 0xa8, 0x8c, 0x1e, 0x1a, 0xa3, 0xe1, 0x56, 0x5d, 0x64, 0x77, 0x79, 0xbb, 0xd0, 0xf7, - 0x0e, 0x85, 0xf8, 0xc7, 0xd3, 0xaa, 0x5c, 0x20, 0x82, 0xb2, 0x65, 0x24, 0x9d, 0xf0, - 0x57, 0x01, 0x1a, 0x79, 0x53, 0x5e, 0x36, 0xc4, 0x4f, 0xe9, 0xea, 0xe8, 0x46, 0xfa, - 0x19, 0xc2, 0x25, 0x37, 0x46, 0xbc, 0x55, 0x89, 0x25, 0x94, 0x4f, 0x89, 0x8b, 0xb2, - 0xcf, 0x44, 0x49, 0x60, 0x4b, 0xcc, 0xb2, 0x3c, 0x74, 0x04, 0xfe, 0x99, 0x5e, 0x00, - 0x35, 0xa3, 0xd0, 0x0b, 0xb2, 0xa2, 0x46, 0xe9, 0x5b, 0xfc, 0x60, 0x14, 0x5c, 0x6a, - 0x00, 0x96, 0x87, 0x68, 0x44, 0x60, 0x27, 0x1e, 0xe1, 0x33, 0x24, 0x41, 0xce, 0x68, - 0xdb, 0x5c, 0x8e, 0x80, 0x2e, 0x0d, 0xf3, 0x5b, 0x93, 0xbb, 0xd7, 0xf3, 0x87, 0x3e, - 0xa0, 0x0d, 0x19, 0x16, 0x12, 0xa1, 0x80, 0x42, 0xb2, 0x55, 0x20, 0xc6, 0xe5, 0xdc, - 0x0e, 0xa4, 0x52, 0xf3, 0x73, 0x1c, 0x8c, 0xb6, 0x50, 0x82, 0xa6, 0x22, 0xa7, 0xc2, - 0xe0, 0x01, 0x3e, 0xa4, 0x7d, 0x0b, 0xdd, 0x42, 0xd6, 0x99, 0x04, 0x66, 0x64, 0x9a, - 0x90, 0x5c, 0x68, 0x4c, 0x32, 0x00, 0xe4, 0x77, 0xea, 0x16, 0x53, 0x00, 0xaa, 0xa4, - 0xcf, 0x6a, 0xdf, 0x8e, 0x7d, 0x13, 0xb0, 0xfb, 0xa2, 0x9f, 0x44, 0x99, 0x01, 0x6e, - 0xf5, 0x3c, 0x10, 0x43, 0xb4, 0x38, 0x91, 0xe7, 0x34, 0xb6, 0xa4, 0x35, 0x1a, 0xec, - 0xe9, 0xb0, 0xe9, 0x29, 0x7f, 0x06, 0x40, 0x3d, 0x19, 0x78, 0xea, 0xd2, 0xda, 0x0d, - 0xff, 0x82, 0xcd, 0x1f, 0x55, 0xeb, 0xca, 0x57, 0xb6, 0x33, 0x7c, 0x85, 0x13, + 0x72, 0x16, 0x22, 0x15, 0x07, 0xc5, 0x50, 0x6e, 0xf5, 0x9e, 0xce, 0x2a, 0x58, 0x1c, + 0x9d, 0x8b, 0x0b, 0x20, 0x74, 0xab, 0x0e, 0x84, 0x8c, 0xa6, 0xb7, 0x05, 0x4d, 0x18, + 0x41, 0x83, 0x7e, 0x87, 0x91, 0xbd, 0x82, 0x71, 0x5a, 0x28, 0xab, 0x56, 0x9a, 0x9a, + 0x28, 0x7a, 0x4f, 0x64, 0x90, 0x08, 0x6b, 0x1c, 0x22, 0x16, 0x95, 0x21, 0xcd, 0xc1, + 0x32, 0x21, 0x29, 0x39, 0xc8, 0x4a, 0x10, 0x89, 0x64, 0x22, 0x17, 0x02, 0x34, 0xcd, + 0x82, 0x05, 0x5a, 0x8c, 0x1c, 0x2e, 0x53, 0xa0, 0xe2, 0x14, 0x93, 0x8a, 0x97, 0xed, + 0x7c, 0xc8, 0xde, 0x0f, 0x4e, 0xd4, 0xb2, 0x1b, 0x94, 0x5b, 0x55, 0xe9, 0xeb, 0x05, + 0x59, 0xea, 0x85, 0x8d, 0x43, 0xfc, 0x31, 0x13, 0x16, 0x5e, 0xa1, 0x8b, 0x7b, 0x89, + 0x3a, 0x5e, 0x32, 0x6a, 0x5b, 0x0a, 0xf4, 0x75, 0xe2, 0x7a, 0x54, 0xb2, 0x07, 0xb4, + 0x1f, 0x92, 0xe3, 0x36, 0x99, 0x06, 0x0c, 0xb6, 0x70, 0x4a, 0xb5, 0x69, 0x0d, 0xb5, + 0x7a, 0xa8, 0x12, 0xcb, 0x9c, 0x24, 0x43, 0x06, 0x44, 0xc3, 0xb3, 0xb2, 0xa4, 0x4f, + 0x27, 0x18, 0xa7, 0xdf, 0x88, 0xab, 0xc4, 0x11, 0x7b, 0x58, 0x7d, 0xef, 0xf7, 0x8d, + 0xe9, 0xc7, 0x3a, 0xf2, 0x80, 0x80, 0xb2, 0xfd, 0x05, 0x00, 0x3e, 0x11, 0xd3, 0xe1, + 0xb3, 0x29, 0x9d, 0xc9, 0x52, 0x1f, 0x8b, 0x51, 0x3b, 0xad, 0xb0, 0x10, ], txid: [ - 0x1b, 0x72, 0x8a, 0xf8, 0xd8, 0x7e, 0xeb, 0x9f, 0x7b, 0x87, 0xab, 0xd9, 0x0b, 0x5f, - 0x4e, 0x93, 0x62, 0x46, 0xad, 0x17, 0x89, 0x31, 0xb4, 0x04, 0x9f, 0x60, 0x42, 0x43, - 0xa9, 0xaa, 0x54, 0x5c, + 0x3f, 0x1b, 0x9f, 0xaa, 0x40, 0x5d, 0x82, 0x70, 0xe2, 0xd9, 0x53, 0x8e, 0x33, 0x9f, + 0x91, 0x97, 0x93, 0x84, 0x16, 0x91, 0xab, 0x03, 0x3d, 0x18, 0x30, 0xa8, 0xdc, 0xbe, + 0xed, 0x4a, 0xfc, 0x4d, ], auth_digest: [ - 0x00, 0x23, 0x09, 0x27, 0x5d, 0x8c, 0x01, 0xf1, 0x69, 0xa0, 0x51, 0x2a, 0x3e, 0x48, - 0xe5, 0x21, 0x81, 0x25, 0xfa, 0x16, 0x1a, 0x87, 0xb4, 0xac, 0xa6, 0x3d, 0xaf, 0xe3, - 0x12, 0x8e, 0x05, 0x27, + 0xc9, 0x0c, 0x05, 0x9f, 0xeb, 0x7c, 0x80, 0x7a, 0x6b, 0x34, 0x77, 0x7c, 0x14, 0xa6, + 0xc0, 0x28, 0xb0, 0x92, 0xd8, 0x2c, 0xd5, 0x85, 0x5e, 0xd5, 0xfe, 0x8d, 0xef, 0xae, + 0x87, 0xd2, 0x89, 0xf7, ], + amounts: vec![], + script_pubkeys: vec![], transparent_input: None, - script_code: None, - amount: None, - sighash_all: [ - 0x1b, 0x72, 0x8a, 0xf8, 0xd8, 0x7e, 0xeb, 0x9f, 0x7b, 0x87, 0xab, 0xd9, 0x0b, 0x5f, - 0x4e, 0x93, 0x62, 0x46, 0xad, 0x17, 0x89, 0x31, 0xb4, 0x04, 0x9f, 0x60, 0x42, 0x43, - 0xa9, 0xaa, 0x54, 0x5c, + sighash_shielded: [ + 0x3f, 0x1b, 0x9f, 0xaa, 0x40, 0x5d, 0x82, 0x70, 0xe2, 0xd9, 0x53, 0x8e, 0x33, 0x9f, + 0x91, 0x97, 0x93, 0x84, 0x16, 0x91, 0xab, 0x03, 0x3d, 0x18, 0x30, 0xa8, 0xdc, 0xbe, + 0xed, 0x4a, 0xfc, 0x4d, ], + sighash_all: None, sighash_none: None, sighash_single: None, sighash_all_anyone: None, @@ -1150,437 +1012,603 @@ lazy_static! { }, TestVector { tx: vec![ - 0x05, 0x00, 0x00, 0x80, 0x0a, 0x27, 0xa7, 0x26, 0x21, 0x96, 0x51, 0x37, 0x79, 0x81, - 0x3d, 0x20, 0x21, 0x0c, 0x6f, 0x10, 0x00, 0x03, 0x31, 0xef, 0xba, 0xa1, 0xcc, 0xfd, - 0x05, 0x00, 0x08, 0x51, 0x53, 0x00, 0xac, 0x52, 0x65, 0xac, 0x65, 0x65, 0x7c, 0x6e, - 0x39, 0x0e, 0xcf, 0x04, 0x00, 0x09, 0x51, 0x6a, 0xac, 0xac, 0x52, 0x51, 0x65, 0x65, - 0x63, 0x94, 0x26, 0x6f, 0xd6, 0x49, 0x6e, 0x06, 0x00, 0x01, 0xac, 0x00, 0x00, 0x01, - 0xbb, 0xdf, 0x18, 0x6d, 0x8c, 0x75, 0xd0, 0xfb, 0x19, 0x1a, 0x1b, 0x11, 0x9b, 0x2a, - 0x4a, 0xc4, 0xa4, 0x41, 0x81, 0x3f, 0x92, 0x55, 0x1d, 0x94, 0x1f, 0x63, 0x36, 0xc8, - 0x7a, 0x6e, 0xe0, 0x1e, 0xd7, 0x99, 0x2c, 0xff, 0x3e, 0xca, 0x24, 0xde, 0x3e, 0x09, - 0x84, 0xe1, 0x0e, 0x68, 0xae, 0x38, 0x75, 0x34, 0xb9, 0x6c, 0xde, 0x37, 0x92, 0xf1, - 0x35, 0xbf, 0x5f, 0x68, 0x78, 0x7d, 0x37, 0x0c, 0xa4, 0x4e, 0x77, 0xb3, 0xed, 0x5c, - 0xcd, 0x60, 0x36, 0x9c, 0x0f, 0x47, 0x60, 0xaa, 0x05, 0xc0, 0xa6, 0xf6, 0x2f, 0xf8, - 0x90, 0x55, 0x8d, 0x72, 0x21, 0xf9, 0x20, 0xbf, 0x1f, 0x1b, 0x77, 0x8a, 0x06, 0xe5, - 0x7a, 0x85, 0x30, 0x2d, 0xe1, 0xd6, 0x91, 0x97, 0x19, 0xf3, 0x8d, 0xd1, 0x80, 0xe9, - 0x72, 0xa1, 0x5d, 0x5c, 0xd0, 0xfc, 0xc5, 0x74, 0x39, 0xa4, 0x35, 0x0e, 0xaf, 0x09, - 0x8d, 0x3b, 0x85, 0xba, 0x3d, 0xbe, 0xcc, 0xfc, 0xc2, 0x95, 0xfd, 0x49, 0x00, 0x51, - 0xdb, 0x41, 0xe2, 0xc4, 0xd1, 0x81, 0x44, 0x37, 0x08, 0xb1, 0x9a, 0x4d, 0x0d, 0x0e, - 0x2e, 0xfa, 0x1d, 0x79, 0xe0, 0x0f, 0x66, 0xe4, 0xc0, 0x15, 0x5a, 0x9c, 0x74, 0xa7, - 0xa5, 0x7c, 0xcf, 0x34, 0xc4, 0x83, 0xac, 0x7d, 0xa1, 0x58, 0x8a, 0x1b, 0x6b, 0x99, - 0x41, 0xf1, 0x10, 0x40, 0xf9, 0x4c, 0xf7, 0x8f, 0xad, 0x89, 0xbf, 0x11, 0xfe, 0xd6, - 0x9a, 0xa0, 0xd8, 0x31, 0x05, 0xad, 0xac, 0xdd, 0x4e, 0x5f, 0x04, 0xa6, 0x24, 0x24, - 0x02, 0x3c, 0x9b, 0x9e, 0x33, 0xc4, 0xfb, 0x7f, 0x12, 0xbd, 0xf2, 0x1f, 0x07, 0xf2, - 0x65, 0xc5, 0x37, 0xd5, 0x1c, 0x65, 0x51, 0xf4, 0x61, 0x7b, 0x91, 0x5d, 0x21, 0x99, - 0x18, 0x39, 0xc3, 0xd0, 0xd3, 0x63, 0x93, 0xd6, 0x46, 0xe0, 0xa8, 0xa4, 0x15, 0x09, - 0x21, 0x7d, 0x0e, 0x7d, 0x2c, 0xa1, 0xa0, 0xa0, 0xd6, 0x77, 0xa3, 0xea, 0xca, 0x23, - 0xed, 0xeb, 0x07, 0xb7, 0x4e, 0x65, 0x2a, 0x0b, 0xc5, 0x0c, 0x6c, 0x08, 0x3a, 0x55, - 0xd6, 0xc7, 0x30, 0x6e, 0x74, 0x08, 0x6f, 0x47, 0x68, 0x93, 0x3a, 0xa2, 0x48, 0x73, - 0x68, 0x18, 0x67, 0xa7, 0x89, 0x3d, 0x77, 0xcb, 0x7f, 0x29, 0xb8, 0xc8, 0x47, 0xc5, - 0x83, 0xf2, 0xd0, 0x71, 0xa6, 0x86, 0x61, 0x6e, 0x20, 0x67, 0x19, 0xf7, 0x61, 0xae, - 0x39, 0xc1, 0x10, 0x44, 0x2e, 0x06, 0x16, 0x3d, 0x2b, 0x84, 0x59, 0x03, 0x60, 0x69, - 0x5d, 0x4e, 0x19, 0x84, 0x9e, 0x63, 0x4f, 0x24, 0xd9, 0xad, 0x39, 0x6c, 0x19, 0xff, - 0x83, 0xce, 0x74, 0xf4, 0x6e, 0x64, 0x5f, 0x93, 0x2e, 0x14, 0x1a, 0x41, 0x19, 0x59, - 0x36, 0xc8, 0x5d, 0x51, 0x44, 0x14, 0xf1, 0x12, 0xe6, 0x0b, 0x1a, 0x25, 0x37, 0xc3, - 0x8d, 0x6d, 0xc6, 0xc4, 0x63, 0x83, 0x05, 0xc9, 0xbd, 0x6c, 0x62, 0xe3, 0x66, 0xbc, - 0x63, 0x12, 0x3e, 0x3e, 0x6d, 0xd3, 0x6e, 0xed, 0xd3, 0x13, 0x6f, 0xce, 0x8d, 0xee, - 0xca, 0x2a, 0xa0, 0x9a, 0x32, 0x98, 0xa3, 0x9d, 0x83, 0x85, 0x9e, 0xfc, 0x9b, 0x2b, - 0x69, 0xcf, 0x9a, 0x7d, 0xee, 0x08, 0xa9, 0x8e, 0x4b, 0xe5, 0x58, 0xac, 0x79, 0x12, - 0xfd, 0xcb, 0x42, 0x20, 0x90, 0x75, 0x42, 0x02, 0x60, 0xf7, 0xca, 0xd0, 0xf2, 0xc0, - 0x1f, 0x2a, 0xfe, 0x33, 0x07, 0x3f, 0x26, 0x24, 0x9d, 0x94, 0x4f, 0x7a, 0x50, 0xdd, - 0x84, 0x83, 0x9b, 0xc3, 0xea, 0x7f, 0xde, 0xe4, 0xed, 0x71, 0x44, 0x9c, 0xf0, 0x75, - 0x33, 0xd2, 0x6e, 0x1e, 0x27, 0xa3, 0xef, 0xb0, 0x32, 0xc3, 0xa3, 0xb3, 0x4b, 0xd3, - 0x09, 0x26, 0x22, 0xd2, 0x06, 0x2a, 0xe5, 0x36, 0xef, 0x51, 0x49, 0xc4, 0x9b, 0x5b, - 0xc9, 0x47, 0x5e, 0xaf, 0xab, 0x6e, 0x67, 0x57, 0x61, 0x00, 0x8b, 0x0d, 0xad, 0xde, - 0xec, 0xaa, 0x60, 0x44, 0x70, 0xbb, 0xe0, 0xfa, 0xda, 0x25, 0x5d, 0x29, 0x0e, 0x92, - 0xb1, 0x90, 0xc2, 0xc2, 0xd8, 0xc2, 0xde, 0xe5, 0x45, 0x5d, 0x1f, 0xa9, 0xa9, 0xf3, - 0xdb, 0x77, 0x79, 0xb5, 0x84, 0x64, 0x34, 0x64, 0xaa, 0x80, 0x14, 0xba, 0x66, 0x99, - 0x4d, 0xe2, 0x55, 0x17, 0xf8, 0x39, 0x80, 0xe6, 0x6e, 0xe4, 0xf6, 0x23, 0x14, 0xae, - 0x6d, 0xbe, 0xf4, 0x52, 0xd5, 0xd3, 0x8b, 0x0a, 0x16, 0xf3, 0x99, 0x1f, 0x36, 0xd8, - 0xa8, 0xb3, 0x9d, 0xdc, 0x0d, 0x55, 0x95, 0xee, 0xd9, 0x87, 0x62, 0x87, 0x8c, 0xdf, - 0x3f, 0x4a, 0x2e, 0xdc, 0x5c, 0xda, 0x77, 0xd5, 0xfe, 0x4f, 0xaf, 0x63, 0xa1, 0x5f, - 0x56, 0x8a, 0x54, 0x0d, 0xa5, 0x7d, 0xd9, 0xbe, 0xb6, 0xfb, 0x1a, 0x97, 0x7c, 0xcb, - 0x91, 0xb4, 0xd7, 0x9c, 0xb3, 0x9b, 0x28, 0x91, 0x1a, 0x29, 0xe7, 0xbf, 0x02, 0x8a, - 0xc6, 0x10, 0x37, 0x96, 0xdf, 0xb6, 0xb2, 0x09, 0x67, 0x23, 0x9a, 0xd3, 0x73, 0xc3, - 0x8c, 0x53, 0xf6, 0xdf, 0x18, 0x23, 0xd4, 0x95, 0x0a, 0x02, 0x83, 0xe9, 0x9b, 0x9c, - 0x06, 0xab, 0x29, 0x66, 0x66, 0x7c, 0x9d, 0xf6, 0x77, 0x71, 0x6b, 0x0c, 0xad, 0xed, - 0x81, 0x8d, 0xf9, 0xe4, 0x49, 0xc0, 0x72, 0xe2, 0x2f, 0x9d, 0x98, 0xbb, 0x0f, 0x9b, - 0x03, 0xbd, 0x5f, 0xd0, 0x13, 0xfc, 0xef, 0x3e, 0xd6, 0xa4, 0x9a, 0xeb, 0x98, 0x72, - 0x02, 0x54, 0x08, 0x7e, 0xf7, 0x28, 0xe3, 0x19, 0x47, 0xff, 0xe8, 0xf7, 0x66, 0xe6, - 0x3e, 0xe4, 0x6f, 0xf2, 0x08, 0x16, 0xd5, 0xfa, 0x8f, 0xf5, 0x5a, 0x26, 0x39, 0x89, - 0x61, 0x49, 0x0a, 0xb9, 0xae, 0x36, 0x6f, 0xc5, 0xa2, 0xd1, 0x99, 0x6e, 0xd6, 0x93, - 0xcc, 0xca, 0x82, 0x35, 0x6f, 0x60, 0x0a, 0xb0, 0x99, 0xf6, 0xec, 0xa8, 0xbf, 0xe6, - 0x45, 0x27, 0x0d, 0x3f, 0x95, 0xed, 0xba, 0x5b, 0x0d, 0xe7, 0xa3, 0x28, 0x19, 0x23, - 0x3b, 0xcc, 0x75, 0x4a, 0x5c, 0xe2, 0xe5, 0xea, 0x07, 0x84, 0x2e, 0x5f, 0xf2, 0xce, - 0xbe, 0x62, 0xad, 0x76, 0xe8, 0xef, 0xf8, 0xd1, 0x5e, 0xa4, 0xc2, 0x4a, 0x5f, 0x20, - 0x78, 0x68, 0x31, 0x9a, 0x5a, 0xf6, 0xb0, 0x35, 0x00, 0x69, 0x89, 0x62, 0x4f, 0x8f, - 0xf7, 0x03, 0x00, 0x92, 0x1a, 0x63, 0xb5, 0xda, 0x5f, 0x25, 0x53, 0xb8, 0x3a, 0x94, - 0x7b, 0x16, 0x42, 0x4b, 0xbf, 0x5f, 0x7c, 0xbc, 0x70, 0xb4, 0xcd, 0x7e, 0x8e, 0x3c, - 0x95, 0x1f, 0x35, 0x85, 0x72, 0xe3, 0x37, 0x87, 0xe7, 0xd5, 0x27, 0x04, 0xa6, 0x72, - 0x1b, 0x30, 0xef, 0xc4, 0x10, 0x17, 0xae, 0x4d, 0x23, 0x15, 0x58, 0xc5, 0xc8, 0x2c, - 0xc7, 0xdd, 0x7e, 0x33, 0x56, 0xc0, 0x9d, 0xc2, 0x49, 0x06, 0xf0, 0x43, 0x8d, 0xfc, - 0xc3, 0x00, 0x85, 0x6a, 0xc2, 0xce, 0xd8, 0xf7, 0x7f, 0xa8, 0x01, 0x57, 0x36, 0xc6, - 0x61, 0xe8, 0x02, 0x48, 0xae, 0xeb, 0x77, 0x48, 0x74, 0xaa, 0x79, 0xd2, 0x90, 0xb8, - 0xf5, 0x02, 0x7a, 0x0a, 0x50, 0x95, 0x37, 0xfc, 0x7c, 0x68, 0x9b, 0x7a, 0xd8, 0x61, - 0x16, 0xcf, 0xec, 0x26, 0x47, 0xcc, 0xaa, 0xe1, 0xc7, 0x4b, 0x41, 0x6f, 0x3e, 0x6a, - 0xe8, 0xf7, 0xcc, 0x60, 0xea, 0xaf, 0x7b, 0x6a, 0x59, 0x0d, 0x51, 0x54, 0x41, 0x38, - 0xe1, 0x73, 0x29, 0x45, 0x60, 0x3a, 0x53, 0x46, 0x2c, 0x60, 0xe1, 0xf6, 0xcb, 0x0c, - 0x9c, 0xa0, 0x39, 0x0c, 0x48, 0x82, 0x24, 0xc3, 0x13, 0x26, 0x9f, 0xcd, 0x59, 0xfc, - 0xb6, 0x11, 0xfb, 0x20, 0x49, 0xdd, 0x4b, 0xe6, 0x8c, 0x3c, 0xda, 0xe9, 0xae, 0xdc, - 0x88, 0xad, 0x2c, 0xc8, 0xe3, 0x7f, 0xd8, 0x95, 0x01, 0x7f, 0x67, 0x27, 0x54, 0x1a, - 0x8e, 0x35, 0xdf, 0xaf, 0x48, 0x78, 0x1e, 0xa3, 0x54, 0x44, 0x89, 0xb9, 0x47, 0x0b, - 0x0d, 0xc6, 0x2e, 0xe1, 0x63, 0xc0, 0x5f, 0x94, 0x12, 0xfc, 0x97, 0x13, 0xaa, 0xac, - 0x25, 0xb4, 0xc2, 0x6e, 0xb0, 0x3f, 0x71, 0x66, 0x46, 0x61, 0x1a, 0xd7, 0xc2, 0xed, - 0x9b, 0xe4, 0xc8, 0x5e, 0x42, 0xf7, 0x34, 0xb5, 0x78, 0x6a, 0x82, 0xce, 0x41, 0x77, - 0xa3, 0xc4, 0x76, 0x47, 0x60, 0x35, 0x5a, 0xdf, 0xbf, 0xc3, 0xf0, 0xc8, 0x46, 0x65, - 0xbd, 0x6a, 0x1e, 0xbf, 0x89, 0x5f, 0x67, 0xe1, 0x10, 0x53, 0x88, 0x34, 0x49, 0xf7, - 0x06, 0x95, 0xd0, 0xc4, 0xe9, 0x51, 0xd7, 0x13, 0x05, 0xef, 0x33, 0xd9, 0x73, 0x71, - 0x26, 0xd0, 0xe6, 0x62, 0x10, + 0x05, 0x00, 0x00, 0x80, 0x0a, 0x27, 0xa7, 0x26, 0xb4, 0xd0, 0xd6, 0xc2, 0x1b, 0xfe, + 0xb9, 0x1b, 0x0b, 0x31, 0x69, 0x1c, 0x03, 0xc2, 0xe8, 0x25, 0xa5, 0x97, 0xb8, 0xfb, + 0x75, 0xbc, 0x56, 0x2d, 0x65, 0x4d, 0x62, 0x10, 0x46, 0x40, 0xdd, 0x74, 0xe5, 0x6c, + 0xd1, 0x4b, 0xaa, 0xba, 0x56, 0x5b, 0x84, 0xb8, 0x45, 0xe1, 0x63, 0xd1, 0xca, 0xef, + 0x25, 0x01, 0x53, 0x98, 0x16, 0x37, 0x20, 0x4f, 0x96, 0xa5, 0x9c, 0x8e, 0x80, 0x24, + 0xd9, 0x04, 0x1b, 0x20, 0x29, 0xe9, 0x4c, 0x15, 0x24, 0x5f, 0x1a, 0x95, 0x88, 0x40, + 0xba, 0x3f, 0x38, 0x0a, 0x4d, 0x20, 0xf1, 0x18, 0x4e, 0x77, 0x82, 0x7d, 0xe3, 0xff, + 0x8f, 0x01, 0x53, 0x45, 0x9a, 0xfe, 0x24, 0x1f, 0x72, 0x3c, 0x08, 0x48, 0x23, 0x23, + 0x0e, 0x00, 0x3d, 0x3d, 0x21, 0xe5, 0x35, 0x01, 0xec, 0x04, 0x99, 0xb0, 0x83, 0xa7, + 0xda, 0xd6, 0x85, 0xc5, 0x71, 0x27, 0xf4, 0xde, 0x64, 0x73, 0x3a, 0x88, 0x0c, 0x2d, + 0xb2, 0x07, 0x52, 0x53, 0x51, 0x63, 0x52, 0x52, 0x63, 0xf6, 0x64, 0xa3, 0x51, 0x00, + 0x00, 0x00, 0x03, 0xf9, 0x27, 0xb9, 0x46, 0x9e, 0x18, 0x22, 0x9d, 0x02, 0xc3, 0x3d, + 0xec, 0x3f, 0x11, 0x7c, 0x5d, 0x2a, 0x8a, 0x85, 0xdb, 0x9b, 0x57, 0x56, 0xdd, 0x52, + 0xb8, 0x19, 0x0d, 0xb2, 0x59, 0x62, 0x80, 0xfa, 0x21, 0x39, 0x43, 0x77, 0xa4, 0x55, + 0x1c, 0x76, 0xd1, 0xf7, 0x5a, 0xc0, 0x3c, 0x26, 0x20, 0x54, 0xdf, 0xfd, 0x79, 0xa9, + 0xde, 0xd0, 0x5e, 0x88, 0x89, 0x58, 0x19, 0x9e, 0xea, 0x45, 0x01, 0xcc, 0xfa, 0x41, + 0x52, 0xd4, 0x45, 0xa6, 0xb3, 0x08, 0x54, 0x9e, 0xfc, 0x1d, 0x9b, 0x2b, 0x97, 0xd3, + 0x9d, 0xa9, 0x0c, 0x63, 0x88, 0xbe, 0x80, 0x52, 0x45, 0x83, 0x25, 0xbf, 0xd2, 0xf5, + 0xbf, 0x73, 0x74, 0x1d, 0x57, 0x85, 0x83, 0x7a, 0x6b, 0x84, 0x4b, 0x47, 0x47, 0x75, + 0x71, 0x8c, 0x29, 0xdd, 0x99, 0x08, 0x4e, 0x9f, 0x88, 0xef, 0x15, 0x3a, 0x83, 0x29, + 0xf5, 0x32, 0xa6, 0x90, 0x17, 0x1c, 0x2d, 0x1e, 0x30, 0x74, 0xdf, 0xae, 0x3e, 0x23, + 0xdb, 0x39, 0x48, 0xa4, 0x53, 0xc3, 0x94, 0x81, 0xa9, 0x91, 0x4d, 0xd0, 0xac, 0x79, + 0xe9, 0x27, 0x36, 0x01, 0x29, 0xbe, 0x3a, 0x7f, 0x11, 0x95, 0x44, 0x12, 0x20, 0x00, + 0x61, 0x0b, 0xd2, 0xaa, 0xcb, 0xd8, 0x23, 0x25, 0xa5, 0x9b, 0x95, 0x15, 0x4e, 0xcd, + 0x82, 0xc8, 0x8d, 0x23, 0xab, 0xd1, 0xe2, 0x07, 0x70, 0xff, 0xb8, 0xaa, 0xbf, 0x83, + 0xfc, 0x07, 0x34, 0x96, 0x4c, 0xcd, 0x41, 0x1d, 0x1c, 0x93, 0x57, 0x14, 0xe2, 0x4a, + 0xab, 0x56, 0x6f, 0x4f, 0x08, 0x42, 0x40, 0x14, 0xc4, 0xec, 0xa9, 0x1b, 0x59, 0x0f, + 0x08, 0x2b, 0x47, 0x3f, 0x36, 0x1c, 0x87, 0x41, 0x5d, 0x37, 0xbd, 0x20, 0xd7, 0x0f, + 0xd0, 0xb5, 0x2b, 0x6d, 0xdf, 0x18, 0x65, 0xf7, 0x66, 0x70, 0x2e, 0x32, 0xb0, 0x5b, + 0x3c, 0xf1, 0x63, 0x0e, 0xe8, 0x59, 0x7a, 0xae, 0x19, 0x63, 0x3f, 0x35, 0x16, 0xa8, + 0x55, 0x5a, 0xc5, 0xbe, 0x32, 0xc6, 0x75, 0xbe, 0x18, 0x17, 0xef, 0xbf, 0xfd, 0x93, + 0x69, 0x04, 0x1a, 0x08, 0x9c, 0x28, 0x3f, 0x19, 0x64, 0x99, 0x68, 0xc2, 0x49, 0x8c, + 0xde, 0x56, 0xf5, 0x00, 0x43, 0x4f, 0x28, 0x0d, 0x77, 0xa9, 0xc6, 0x2e, 0x43, 0xcb, + 0xd3, 0xf1, 0x36, 0xa4, 0xc6, 0xa0, 0x0a, 0x43, 0xe6, 0xed, 0x53, 0x0c, 0xb2, 0xe8, + 0xae, 0x83, 0x88, 0x60, 0xad, 0xc8, 0x8a, 0xac, 0xc7, 0xbd, 0x6a, 0x00, 0xae, 0x0c, + 0x19, 0xff, 0x45, 0x33, 0xa4, 0x85, 0xef, 0xde, 0x08, 0x2b, 0x5f, 0x4d, 0x1f, 0x7a, + 0x8e, 0xbe, 0x7e, 0xd8, 0x2b, 0x7b, 0x05, 0xa8, 0xcf, 0xe1, 0xe3, 0x73, 0x45, 0x9f, + 0x1b, 0xdc, 0xbf, 0x95, 0x25, 0x74, 0x7e, 0x8c, 0x95, 0x08, 0xa5, 0x55, 0xfa, 0xcb, + 0x79, 0x87, 0x40, 0xe0, 0xbd, 0xf9, 0x94, 0xd9, 0x73, 0x9b, 0xbe, 0x55, 0x38, 0xa0, + 0xae, 0x0f, 0x07, 0x6c, 0x58, 0x2c, 0x0f, 0x5b, 0xa8, 0x78, 0xb9, 0x9b, 0x82, 0x49, + 0xdb, 0x1d, 0x7e, 0x95, 0x05, 0x6c, 0x98, 0xaf, 0x08, 0x3d, 0x98, 0xcb, 0x0e, 0xd9, + 0xe3, 0xf7, 0x43, 0x6e, 0x1c, 0x76, 0x43, 0x76, 0x6f, 0x96, 0x6b, 0x83, 0xe9, 0x99, + 0x20, 0x6e, 0xbd, 0x13, 0x93, 0xb9, 0xb2, 0xa7, 0xf4, 0x14, 0x48, 0x0f, 0xa0, 0x17, + 0x48, 0x00, 0x69, 0xf8, 0x5c, 0x77, 0x49, 0xc4, 0x35, 0xae, 0x2f, 0xba, 0x2d, 0xdc, + 0x10, 0x38, 0xd5, 0x47, 0xd8, 0x48, 0x54, 0x81, 0x7e, 0xf3, 0x96, 0x35, 0xc2, 0x98, + 0x27, 0xaa, 0xd8, 0x67, 0x26, 0xc9, 0xad, 0xe3, 0xb2, 0x65, 0xb9, 0x08, 0x6c, 0x8b, + 0x5b, 0x75, 0xef, 0x56, 0xfe, 0x4b, 0xd8, 0xb4, 0xd6, 0x28, 0x93, 0x89, 0x5b, 0x3f, + 0xd2, 0x73, 0x4f, 0xda, 0xc4, 0x64, 0x15, 0x6d, 0x7e, 0x5e, 0xbc, 0x7e, 0xcf, 0x1d, + 0x83, 0xb8, 0x6f, 0x65, 0x96, 0x37, 0xe3, 0xb1, 0x42, 0xc1, 0x64, 0x96, 0x3b, 0x8c, + 0xdc, 0xf4, 0xba, 0x4f, 0x40, 0x35, 0xdf, 0xfc, 0x5a, 0x78, 0x94, 0x58, 0x84, 0x77, + 0x81, 0x91, 0x8a, 0xc7, 0x2f, 0xc1, 0x8b, 0xbb, 0xf5, 0x11, 0x00, 0x32, 0xe6, 0x6d, + 0x75, 0xb3, 0x17, 0x1e, 0xf4, 0xb5, 0x13, 0x29, 0x01, 0x64, 0xa7, 0x7b, 0x42, 0xb0, + 0xa4, 0xcf, 0xb8, 0x96, 0x39, 0xab, 0x23, 0x84, 0x5e, 0x1a, 0xa2, 0xa4, 0x52, 0xf3, + 0x73, 0x1c, 0x8c, 0xb6, 0x50, 0x82, 0xa6, 0x22, 0xa7, 0xc2, 0xe0, 0x01, 0x3e, 0xa4, + 0x7d, 0x0b, 0xdd, 0x42, 0xd6, 0x99, 0x04, 0x66, 0x64, 0x9a, 0x90, 0x5c, 0x68, 0x4c, + 0x32, 0x51, 0x71, 0x6d, 0x61, 0xf7, 0x60, 0xd5, 0x3d, 0xe6, 0xe3, 0xf7, 0x90, 0xfb, + 0xa7, 0xf5, 0xf1, 0xf4, 0xde, 0x26, 0x71, 0x13, 0xbd, 0xfc, 0xd7, 0x42, 0x28, 0x22, + 0x33, 0x0b, 0x32, 0xd5, 0x8e, 0x67, 0x77, 0x76, 0x5f, 0x22, 0xa4, 0x11, 0x63, 0x44, + 0xee, 0xb6, 0x5b, 0x2e, 0xc5, 0x16, 0x39, 0x3a, 0xb3, 0x75, 0x1b, 0x53, 0x56, 0xd2, + 0xb0, 0xc9, 0x50, 0x0c, 0x0f, 0x3e, 0x46, 0x91, 0x81, 0x03, 0x5b, 0xc3, 0x66, 0x0f, + 0x0b, 0x8f, 0x9f, 0xbe, 0x6e, 0x40, 0xb5, 0xe8, 0x9c, 0xb7, 0x9b, 0x06, 0x37, 0x14, + 0xca, 0x75, 0xe7, 0x2e, 0x2e, 0x10, 0x0a, 0x10, 0xd6, 0x3b, 0xf7, 0x84, 0xdf, 0x08, + 0x20, 0xef, 0x25, 0xf8, 0xef, 0x40, 0xfe, 0x5f, 0x05, 0xfb, 0x95, 0x68, 0x3f, 0x91, + 0x05, 0xff, 0x3c, 0xb2, 0xd2, 0x19, 0xab, 0x76, 0x60, 0x5a, 0x06, 0x4f, 0x69, 0x21, + 0x9f, 0x1d, 0xc0, 0xd0, 0x0b, 0x3b, 0x48, 0x64, 0x2f, 0x97, 0x0d, 0xc0, 0x0c, 0xca, + 0x4b, 0x8b, 0x43, 0x30, 0x8b, 0xe1, 0x82, 0x86, 0xec, 0x5a, 0x42, 0x88, 0xd6, 0x00, + 0xa3, 0x78, 0x5c, 0xb6, 0x22, 0xd4, 0x68, 0xa4, 0xc6, 0x96, 0x9b, 0x37, 0x92, 0xf2, + 0x48, 0x50, 0x27, 0xd0, 0xad, 0x9a, 0xa4, 0xa9, 0xc2, 0xcc, 0x97, 0x2f, 0x9e, 0xe5, + 0x19, 0x0a, 0x95, 0xb1, 0xeb, 0x05, 0x8d, 0xdd, 0xd8, 0xc0, 0x8e, 0x7d, 0x75, 0x3f, + 0x5e, 0x01, 0x1b, 0x2b, 0xcf, 0xee, 0x1d, 0x52, 0xc1, 0xc4, 0xf2, 0x0a, 0xa3, 0xf7, + 0x12, 0x74, 0x1f, 0xc0, 0x93, 0xa1, 0xb3, 0x6a, 0xf5, 0x55, 0xf7, 0x4e, 0x30, 0xf8, + 0x5d, 0x5c, 0xc9, 0x59, 0x30, 0x7f, 0x74, 0x35, 0xf7, 0xef, 0x04, 0xca, 0x2c, 0x31, + 0x25, 0xbc, 0xef, 0x2a, 0x99, 0x01, 0x76, 0xae, 0x33, 0x93, 0x25, 0xd5, 0xa5, 0x88, + 0xda, 0x57, 0x96, 0xfa, 0xae, 0x5b, 0xab, 0x7c, 0x82, 0x97, 0x7c, 0x0f, 0xf7, 0x97, + 0x09, 0x3e, 0x2c, 0x1f, 0x3a, 0x77, 0x82, 0xa6, 0xd3, 0x9a, 0x61, 0xee, 0x55, 0x28, + 0x99, 0x0d, 0x8d, 0x36, 0x9e, 0x8e, 0xdc, 0xfe, 0x38, 0xbb, 0x70, 0x2d, 0xff, 0x02, + 0xda, 0x34, 0x28, 0x54, 0x5d, 0x9d, 0x61, 0x57, 0xa5, 0x1e, 0x55, 0xeb, 0xca, 0x6a, + 0x85, 0x06, 0xe3, 0x69, 0x9a, 0x3d, 0x70, 0x85, 0xa4, 0xd9, 0xfe, 0xd5, 0x09, 0x4c, + 0x68, 0xb3, 0x75, 0xe9, 0x84, 0xf6, 0x83, 0x93, 0x30, 0x08, 0x71, 0xe3, 0x08, 0xfc, + 0xf7, 0x4e, 0x27, 0x6b, 0x62, 0x26, 0x6a, 0x8f, 0x4e, 0xe3, 0x94, 0x5f, 0x09, 0x4d, + 0x17, 0xa7, 0xc0, 0x7c, 0xfe, 0x0b, 0xfd, 0x48, 0x95, 0xa1, 0x4f, 0xac, 0x97, 0x1c, + 0x92, 0xa1, 0x95, 0xb4, 0x42, 0x68, 0x3c, 0x49, 0x56, 0xbb, 0xb1, 0x95, 0xa4, 0xfa, + 0x66, 0xdc, 0x9c, 0xd5, 0x42, 0xc7, 0x6b, 0x91, 0x50, 0xc8, 0x4b, 0xf8, 0x90, 0x78, + 0x99, 0x42, 0xf5, 0x5c, 0x20, 0x0b, 0x77, 0x3e, 0xcd, 0xd7, 0x99, 0x2c, 0xff, 0x3e, + 0xca, 0x24, 0xde, 0x3e, 0x09, 0x84, 0xe1, 0x0e, 0x68, 0xae, 0x38, 0x75, 0x34, 0xb9, + 0x6c, 0xde, 0x37, 0x92, 0xf1, 0x35, 0xbf, 0x5f, 0x68, 0x78, 0x7d, 0x37, 0x0c, 0xa8, + 0xc4, 0xc4, 0x07, 0x4d, 0xc5, 0xd6, 0x01, 0xae, 0x90, 0x49, 0x54, 0x37, 0xc3, 0xc2, + 0xd4, 0x8a, 0x3d, 0x96, 0x66, 0x83, 0xac, 0x05, 0x16, 0x0b, 0x7a, 0x84, 0xea, 0xa7, + 0xaa, 0xb7, 0x40, 0x09, 0xe5, 0x7a, 0x85, 0xf7, 0xbf, 0x68, 0xa2, 0xe4, 0x82, 0x00, + 0x0f, 0x82, 0x9c, 0x54, 0x50, 0x73, 0xa1, 0x5d, 0x5c, 0xd0, 0xfc, 0xc5, 0x74, 0x39, + 0xa4, 0x35, 0x0e, 0xaf, 0x09, 0x8d, 0xfb, 0x82, 0xa0, 0x85, 0xea, 0x8a, 0x4a, 0xf6, + 0xfa, 0x83, 0x81, 0xf0, 0x65, 0x88, 0x19, 0xea, 0xb4, 0x83, 0xf6, 0x5b, 0x32, 0x5d, + 0x5a, 0xed, 0xa1, 0x52, 0x32, 0xcf, 0xad, 0xec, 0x75, 0xab, 0x18, 0x66, 0xe4, 0xc0, + 0x15, 0x5a, 0x9c, 0x74, 0xa7, 0xa5, 0x7c, 0xcf, 0x34, 0xc4, 0x83, 0xac, 0x7d, 0xa1, + 0x58, 0x8a, 0x1b, 0x6b, 0x99, 0x41, 0xf1, 0x10, 0x40, 0xf9, 0x4c, 0xf7, 0x8f, 0xad, + 0x89, 0xbf, 0x11, 0xfe, 0xd6, 0x9a, 0xa0, 0xd8, 0x31, 0x05, 0xad, 0xac, 0xdd, 0x4e, + 0x5f, 0x04, 0xa6, 0x24, 0x24, 0x02, 0x3c, 0x9b, 0x9e, 0x33, 0xc4, 0xfb, 0x7f, 0x12, + 0xbd, 0xf2, 0x1f, 0x07, 0xf2, 0x65, 0xc5, 0x37, 0xd5, 0x1c, 0x65, 0x51, 0xf4, 0x61, + 0x7b, 0x91, 0x5d, 0x21, 0x99, 0x18, 0x39, 0xc3, 0xd0, 0xd3, 0x63, 0x93, 0xd6, 0x46, + 0xe0, 0xa8, 0xa4, 0x15, 0x09, 0x21, 0x7d, 0x0e, 0x7d, 0x2c, 0xa1, 0xa0, 0xa0, 0xd6, + 0x77, 0xa3, 0xea, 0xca, 0x23, 0xed, 0xeb, 0x07, 0xb7, 0x4e, 0x65, 0x2a, 0x0b, 0xc5, + 0x0c, 0x6c, 0x08, 0x3a, 0x55, 0xd6, 0xc7, 0x30, 0x6e, 0x74, 0x08, 0x6f, 0x47, 0x68, + 0x93, 0x3a, 0xa2, 0x48, 0x73, 0x68, 0x18, 0x67, 0xa7, 0x89, 0x3d, 0x77, 0xcb, 0x7f, + 0x29, 0xb8, 0xc8, 0x47, 0xc5, 0x83, 0xf2, 0xd0, 0x71, 0xa6, 0x86, 0x61, 0x6e, 0x20, + 0x67, 0x19, 0xf7, 0x61, 0xae, 0x39, 0xc1, 0x10, 0x44, 0x2e, 0x06, 0x16, 0x3d, 0x2b, + 0x84, 0x59, 0x03, 0x60, 0x69, 0x5d, 0x4e, 0x19, 0x84, 0x9e, 0x63, 0x4f, 0x24, 0xd9, + 0xad, 0x39, 0x6c, 0x19, 0xff, 0x83, 0xce, 0x74, 0xf4, 0x6e, 0x64, 0x5f, 0x93, 0x2e, + 0x14, 0x1a, 0x41, 0x19, 0x59, 0x36, 0xc8, 0x5d, 0x51, 0x44, 0x14, 0xf1, 0x12, 0xe6, + 0x0b, 0x1a, 0x25, 0x37, 0xc3, 0x8d, 0x6d, 0xc6, 0xc4, 0x63, 0x83, 0x05, 0xc9, 0xbd, + 0x6c, 0x62, 0xe3, 0x66, 0xbc, 0x63, 0x12, 0x3e, 0x3e, 0x6d, 0xd3, 0x6e, 0xed, 0xd3, + 0x13, 0x6f, 0xce, 0x8d, 0xee, 0xca, 0x2a, 0xa0, 0x9a, 0x32, 0x98, 0xa3, 0x9d, 0x83, + 0x85, 0x9e, 0xfc, 0x9b, 0x2b, 0x69, 0xcf, 0x9a, 0x7d, 0xee, 0x08, 0xa9, 0x8e, 0x4b, + 0xe5, 0x58, 0xac, 0x79, 0x12, 0xfd, 0xcb, 0x42, 0x20, 0x90, 0x75, 0x42, 0x02, 0x60, + 0xf7, 0xca, 0xd0, 0xf2, 0xc0, 0x1f, 0x2a, 0xfe, 0x33, 0x07, 0x3f, 0x26, 0x24, 0x9d, + 0x94, 0x4f, 0x7a, 0x50, 0xdd, 0x84, 0x83, 0x9b, 0xc3, 0xea, 0x7f, 0xde, 0xe4, 0xed, + 0x71, 0x44, 0x9c, 0xf0, 0x75, 0x33, 0xd2, 0x6e, 0x1e, 0x27, 0xa3, 0xef, 0xb0, 0x32, + 0xc3, 0xa3, 0xb3, 0x4b, 0xd3, 0x09, 0x26, 0x22, 0xd2, 0x06, 0x2a, 0xe5, 0x36, 0xef, + 0x51, 0x49, 0xc4, 0x9b, 0x5b, 0xc9, 0x47, 0x5e, 0xaf, 0xab, 0x6e, 0x67, 0x57, 0x61, + 0x00, 0x8b, 0x0d, 0xad, 0xde, 0xec, 0xaa, 0x60, 0x44, 0x70, 0xbb, 0xe0, 0xfa, 0xda, + 0x25, 0x5d, 0x29, 0x0e, 0x92, 0xb1, 0x90, 0xc2, 0xc2, 0xd8, 0xc2, 0xde, 0xe5, 0x45, + 0x5d, 0x1f, 0xa9, 0xa9, 0xf3, 0xdb, 0x77, 0x79, 0xb5, 0x84, 0x64, 0x34, 0x64, 0xaa, + 0x80, 0x14, 0xba, 0x66, 0x99, 0x4d, 0xe2, 0x55, 0x17, 0xf8, 0x39, 0x80, 0xe6, 0x6e, + 0xe4, 0xf6, 0x23, 0x14, 0xae, 0x6d, 0xbe, 0xf4, 0x52, 0xd5, 0xd3, 0x8b, 0x0a, 0x16, + 0xf3, 0x99, 0x1f, 0x36, 0xd8, 0xa8, 0xb3, 0x9d, 0xdc, 0x0d, 0x55, 0x95, 0xee, 0xd9, + 0x87, 0x62, 0x87, 0x8c, 0xdf, 0x3f, 0x4a, 0x2e, 0xdc, 0x5c, 0xda, 0x77, 0xd5, 0xfe, + 0x4f, 0xaf, 0x63, 0xa1, 0x5f, 0x56, 0x8a, 0x54, 0x0d, 0xa5, 0x7d, 0xd9, 0xbe, 0xb6, + 0xfb, 0x1a, 0x97, 0x7c, 0xcb, 0x91, 0xb4, 0xd7, 0x9c, 0xb3, 0x9b, 0x28, 0x91, 0x1a, + 0x29, 0xe7, 0xbf, 0x02, 0x8a, 0xc6, 0x10, 0x37, 0x96, 0xdf, 0xb6, 0xb2, 0x09, 0x67, + 0x23, 0x9a, 0xd3, 0x73, 0xc3, 0xc5, 0x1d, 0x39, 0x27, 0xf2, 0x38, 0x00, 0x19, 0xfb, + 0xdb, 0xdd, 0xe5, 0x96, 0x97, 0x32, 0x26, 0x36, 0xa0, 0xae, 0xa1, 0xfd, 0x22, 0xc5, + 0x88, 0x57, 0x5c, 0x0f, 0x89, 0x64, 0x9e, 0x9f, 0x3e, 0xd3, 0x93, 0xcc, 0xca, 0xbb, + 0xa2, 0xe7, 0x94, 0xb7, 0xc4, 0xb2, 0xda, 0xf8, 0xdd, 0xeb, 0x7f, 0x45, 0x27, 0x0d, + 0x3f, 0x95, 0xed, 0xba, 0x5b, 0x0d, 0xe7, 0xa3, 0x28, 0x19, 0x23, 0x3b, 0x0c, 0x55, + 0x35, 0x01, 0x14, 0xcc, 0xbc, 0x48, 0x15, 0x86, 0xfd, 0x05, 0x42, 0xc3, 0xa0, 0xaf, + 0xdd, 0x24, 0x52, 0x28, 0xac, 0x74, 0x74, 0xb3, 0xf5, 0x49, 0xb1, 0x03, 0xa0, 0x06, + 0x2d, 0xf1, 0xbd, 0xae, 0x35, 0xbe, 0x3f, 0x6a, 0x92, 0xda, 0xd6, 0x17, 0x7c, 0xb8, + 0x48, 0xee, 0xe2, 0x4c, 0x85, 0x20, 0xa3, 0x30, 0xbd, 0xfb, 0x26, 0xd7, 0x5f, 0xe7, + 0xb4, 0xb3, 0x65, 0xd0, 0x94, 0x45, 0x12, 0x22, 0xea, 0xe1, 0x8b, 0x98, 0x49, 0xf5, + 0xaa, 0x17, 0xe5, 0x2c, 0xa5, 0xc7, 0x1e, 0x84, 0x40, 0x75, 0xcd, 0x44, 0x03, 0x8e, + 0x5c, 0x89, 0x4c, 0xa2, 0xcd, 0x19, 0x76, 0x5c, 0xf8, 0xf6, 0x1b, 0x61, 0x9a, 0xf0, + 0x24, 0x56, 0xae, 0x69, 0x59, 0x62, 0xfe, 0x5e, 0x93, 0x1a, 0x63, 0xb5, 0xc7, 0x90, + 0x52, 0xec, 0xd3, 0x33, 0xe1, 0x84, 0x12, 0xdb, 0x91, 0xe1, 0x5f, 0x7c, 0xbc, 0x70, + 0xb4, 0xcd, 0x7e, 0x8e, 0x3c, 0x95, 0x1f, 0x35, 0x85, 0x72, 0xe3, 0x77, 0x67, 0xe7, + 0xd5, 0x27, 0x04, 0xa6, 0x72, 0x1b, 0x30, 0xef, 0xc4, 0x10, 0x17, 0xae, 0x4d, 0x23, + 0x15, 0x58, 0xc5, 0xc8, 0x2c, 0xc7, 0xdd, 0x7e, 0x33, 0x56, 0xc0, 0x9d, 0xc2, 0x49, + 0x06, 0xf0, 0x43, 0x8d, 0xfc, 0xc3, 0x00, 0x85, 0x6a, 0xc2, 0xce, 0xd8, 0xf7, 0x7f, + 0xa8, 0x01, 0x57, 0x36, 0xc6, 0x61, 0xe8, 0x02, 0x48, 0xae, 0xeb, 0x77, 0x48, 0x74, + 0xaa, 0x79, 0xd2, 0x90, 0xb8, 0xf5, 0x02, 0x7a, 0x0a, 0x50, 0x95, 0x37, 0xfc, 0x7c, + 0x68, 0x9b, 0x7a, 0xd8, 0x61, 0x16, 0xcf, 0xec, 0x26, 0x47, 0xcc, 0xaa, 0xe1, 0xc7, + 0x4b, 0x41, 0x6f, 0x3e, 0x6a, 0xe8, 0xf7, 0xcc, 0x60, 0xea, 0xaf, 0x7b, 0x6a, 0x59, + 0x0d, 0x51, 0x54, 0x41, 0x38, 0xe1, 0x73, 0x29, 0x45, 0x60, 0x3a, 0x53, 0x46, 0x2c, + 0x60, 0xe1, 0xf6, 0xcb, 0x0c, 0x9c, 0xa0, 0x39, 0x0c, 0x48, 0x82, 0x24, 0xc3, 0x13, + 0x26, 0x9f, 0xcd, 0x59, 0xfc, 0xb6, 0x11, 0xfb, 0x2d, 0x9b, 0x4c, 0x8f, 0xa6, 0x01, + 0xbb, 0x1c, 0xb8, 0xd0, 0x7d, 0x79, 0x7b, 0xf5, 0xde, 0x52, 0xbc, 0xee, 0xb0, 0x23, + 0x01, 0xc8, 0x96, 0x2a, 0xc1, 0xfc, 0x04, 0x91, 0xdc, 0x81, 0xaf, 0xfd, 0x6c, 0x1e, + 0xbf, 0x89, 0xa1, 0x3d, 0x6f, 0x29, 0x0e, 0xda, 0x5d, 0x5c, 0xef, 0x38, 0x22, 0x15, + 0xc5, 0xe9, 0x51, 0xd7, 0x13, 0x05, 0xef, 0x33, 0xd9, 0x73, 0x71, 0x26, 0xd0, 0xe6, + 0x62, 0x90, 0x5f, 0x12, 0x50, 0x92, 0x6f, 0x6a, 0x22, 0x99, 0x90, 0xe3, 0x8f, 0x69, + 0xad, 0x9a, 0x91, 0x92, 0xb3, 0x02, 0xf2, 0x6b, 0xdd, 0xa4, 0x65, 0xd9, 0x0b, 0x94, + 0xb1, 0x2c, 0x57, 0xfa, 0x3f, 0xd6, 0x93, 0x00, 0x83, 0xf1, 0x84, 0x43, 0x8d, 0x8a, + 0x88, 0x9d, 0x3f, 0x5e, 0xce, 0xa2, 0xc6, 0xd2, 0x3d, 0x67, 0x36, 0xf2, 0xa0, 0xf1, + 0x8e, 0x26, 0xf4, 0xfa, 0x45, 0xd1, 0xbe, 0x8f, 0x3d, 0xc4, 0xa7, 0x07, 0x13, 0x7e, + 0x95, 0xd2, 0xad, 0x59, 0x4f, 0x6c, 0x03, 0xd2, 0x49, 0x23, 0x06, 0x7a, 0xe4, 0x7f, + 0xd6, 0x42, 0x5e, 0xfb, 0x9c, 0x1d, 0x50, 0x4e, 0x6f, 0xd5, 0x57, 0x53, 0x40, 0x94, + 0x56, 0x01, 0xfe, 0x80, 0x6f, 0x57, 0x56, 0xac, 0xb5, 0x62, 0xf1, 0x3c, 0x0c, 0xa1, + 0xd8, 0x03, 0xa1, 0x95, 0xc2, 0xeb, 0xb2, 0xef, 0x02, 0xac, 0x33, 0xe6, 0xa8, 0x8d, + 0xea, 0x07, 0x5b, 0xa9, 0x96, 0xd3, 0xc3, 0x36, 0x64, 0x8e, 0x86, 0x94, 0xd3, 0xa1, + 0x9d, 0x3d, 0xca, 0x53, 0x1b, 0xeb, 0x50, 0xd4, 0x32, 0x7c, 0x5c, 0x0c, 0x23, 0xcb, + 0x7c, 0xfd, 0xb0, 0x8c, 0xa7, 0xcf, 0x2c, 0xac, 0x6b, 0xc1, 0x39, 0xd0, 0x74, 0x14, + 0x73, 0xd3, 0x76, 0x02, 0x9c, 0xb4, 0xab, 0x6b, 0xf0, 0x54, 0x55, 0x7c, 0xe2, 0x94, + 0xc7, 0x28, 0xa4, 0x68, 0x7d, 0x57, 0xec, 0x89, 0x09, 0xff, 0x51, 0xa4, 0xd0, 0x2f, + 0x9d, 0xcd, 0x11, 0x19, 0x3d, 0x7d, 0x1c, 0x9f, 0xda, 0xe6, 0xa1, 0x73, 0x96, 0xa1, + 0xbf, 0x57, 0xa9, 0x94, 0x93, 0x4f, 0x5e, 0x7a, 0x59, 0xf0, 0x45, 0xde, 0xbe, 0xaf, + 0xf6, 0x2e, 0xf3, 0x26, 0xb9, 0x47, 0xf2, 0xa8, 0xb4, 0x95, 0x55, 0xe4, 0xd9, 0x9b, + 0x3b, 0xf5, 0xc8, 0x1f, 0xf9, 0xfe, 0x31, 0x4e, 0x04, 0x7a, 0xf1, 0x52, 0x50, 0x8f, + 0x57, 0x01, 0x5c, 0xa4, 0x02, 0xc6, 0x7d, 0x92, 0x5c, 0x99, 0xac, 0xea, 0x3e, 0xe8, + 0xcc, 0x4b, 0x00, 0x8c, 0x5c, 0xb4, 0x39, 0x66, 0xe7, 0x14, 0xef, 0x48, 0x0f, 0xd0, + 0x5e, 0x07, 0xc7, 0xb2, 0xdd, 0xa9, 0xaa, 0x39, 0x66, 0x11, 0x3e, 0xaa, 0x29, 0x3d, + 0x3f, 0x62, 0x2b, 0x30, 0x9d, 0x64, 0x80, 0x3c, 0xe1, 0xe6, 0x37, 0x8b, 0x6a, 0xac, + 0x4f, 0xab, 0x52, 0x7c, 0x43, 0xcd, 0x45, 0xed, 0x0a, 0x3c, 0x1a, 0x4b, 0x9f, 0xb1, + 0x8d, 0xcc, 0xcf, 0xcd, 0xb6, 0xac, 0x0c, 0x24, 0x21, 0x63, 0x9c, 0xda, 0x00, 0x75, + 0xa2, 0x0d, 0xc5, 0x11, 0x1b, 0x8d, 0x3d, 0x31, 0x99, 0x49, 0x5b, 0xd9, 0x13, 0x3d, + 0xba, 0xb9, 0x45, 0x41, 0x41, 0x0e, 0x4f, 0xba, 0x92, 0xc7, 0xb6, 0x06, 0xa5, 0xcb, + 0x12, 0x2f, 0x14, 0x0c, 0xf1, 0xa3, 0x59, 0x6f, 0x27, 0x88, 0xf3, 0xc8, 0xb9, 0x26, + 0x60, 0xf1, 0x4c, 0xb6, 0x5a, 0xf5, 0xdd, 0x23, 0xdf, 0xdb, 0xac, 0x13, 0x71, 0xec, + 0xf4, 0xb3, 0x37, 0x12, 0xfe, 0xd2, 0x29, 0x2c, 0x44, 0xf7, 0x08, 0x34, 0xcf, 0x96, + 0xc0, 0x5d, 0x58, 0x82, 0x7e, 0x69, 0xbf, 0xc2, 0xe6, 0x96, 0xfa, 0x08, 0x74, 0x02, + 0x5e, 0x2c, 0x3d, 0x19, 0xb0, 0x72, 0x02, 0x00, 0x31, 0x51, 0x3b, 0x19, 0x62, 0xec, + 0x54, 0x08, 0x56, 0xcb, 0x18, 0x93, 0x87, 0xcf, 0xbf, 0xcc, 0x0f, 0x7c, 0x68, 0x22, + 0x3c, 0xba, 0x47, 0xfb, 0x0c, 0x9b, 0x48, 0x6e, 0x4d, 0x99, 0x17, 0x19, 0x61, 0xf7, + 0x67, 0x5a, 0x8b, 0x46, 0x32, 0x8a, 0x3b, 0xc1, 0x09, 0xbf, 0x07, 0xc6, 0x6d, 0x5e, + 0xde, 0x77, 0x1c, 0xc4, 0xc7, 0x4c, 0xe8, 0x03, 0x33, 0x82, 0x91, 0x91, 0xee, 0xdc, + 0x49, 0x35, 0x08, 0xa6, 0x44, 0x53, 0x0a, 0x61, 0x44, 0xf2, 0x2d, 0xcf, 0x97, 0x52, + 0x5a, 0x4c, 0xdc, 0xa1, 0xad, 0x71, 0x07, 0x3b, 0x08, 0x0b, 0x73, 0xea, 0x45, 0x49, + 0xf5, 0x40, 0x1b, 0xff, 0x43, 0x18, 0x26, 0x8e, 0x6a, 0xd6, 0x37, 0x36, 0x31, 0x57, + 0xa1, 0x9a, 0x53, 0xf1, 0x23, 0xa0, 0xb0, 0xe1, 0x6d, 0x0b, 0x77, 0xf0, 0x20, 0x28, + 0xda, 0x46, 0x41, 0x00, 0xfd, 0xe7, 0x6d, 0x83, 0xdd, 0x0b, 0xb2, 0x24, 0xed, 0xe2, + 0x80, 0x42, 0x29, 0x0a, 0xb2, 0xbc, 0xe8, 0x54, 0x13, 0x9b, 0xca, 0x36, 0xe5, 0xb2, + 0xcb, 0xdf, 0xdd, 0x91, 0x06, 0xfc, 0x9f, 0x18, 0xb9, 0x55, 0x53, 0xe4, 0xfe, 0x54, + 0x8b, 0x3e, 0x4a, 0x87, 0xda, 0xa7, 0xef, 0x1e, 0xe3, 0x8e, 0xe9, 0xb4, 0xe0, 0xdc, + 0xd6, 0x3e, 0x80, 0xec, 0xbb, 0xa7, 0xe7, 0x4b, 0x3e, 0x3b, 0xa3, 0xd0, 0xe8, 0xa6, + 0x39, 0x2a, 0x06, 0x2b, 0x8e, 0x06, 0x5a, 0x54, 0x41, 0x4c, 0x3c, 0x5b, 0xd9, 0xce, + 0x4e, 0x85, 0xca, 0x62, 0x93, 0xe8, 0x84, 0xd1, 0x45, 0x6a, 0x4c, 0x31, 0xe1, 0x65, + 0x4f, 0xf2, 0x3e, 0xf2, 0x6e, 0x2e, 0x14, 0xe1, 0x29, 0x8a, 0x49, 0xc0, 0x72, 0xe2, + 0x2f, 0x9d, 0x98, 0xbb, 0x0f, 0x9b, 0x03, 0xbd, 0x5f, 0xd0, 0x13, 0xfc, 0xef, 0x3e, + 0xd6, 0xa4, 0x9a, 0xeb, 0x98, 0x72, 0x02, 0x54, 0x08, 0x7e, 0xf7, 0x28, 0xe3, 0x19, + 0xdb, 0x96, 0x4c, 0xea, 0x54, 0xd0, 0xec, 0xa7, 0x6c, 0xfe, 0x56, 0x28, 0x8b, 0x6f, + 0x64, 0xf4, 0xa1, 0x9d, 0xf3, 0x7e, 0xd1, 0x7b, 0xe8, 0x12, 0xe8, 0x2d, 0x7d, 0x40, + 0x53, 0x6f, 0x37, 0x8a, 0x93, 0x1c, 0x82, 0xcf, 0x71, 0x11, 0xd6, 0xe1, 0x17, 0x80, + 0x93, 0x63, 0x80, 0x9b, 0x6b, 0xe3, 0x78, 0xf8, 0xfd, 0x5a, 0x1c, 0xe2, 0x2a, 0x8d, + 0x3c, 0x45, 0x47, 0xab, 0xd9, 0x59, 0x83, 0x0a, 0xaa, 0xf0, 0x13, 0xde, 0x2b, 0xf2, + 0x7a, 0x1f, 0xba, 0xe8, 0xb1, 0x6f, 0x38, 0xd1, 0x34, 0x9b, 0x60, 0x31, 0xce, 0x02, + 0x34, 0x8a, 0x24, 0x05, 0x79, 0xc0, 0xe5, 0x35, 0x79, 0x04, 0x58, 0xb4, 0x96, 0x3b, + 0x61, 0x69, 0x33, 0xd1, 0x00, 0x5c, 0x1d, 0x03, 0xd4, 0xc9, 0x51, 0x80, 0xc8, 0xd1, + 0x7a, 0x55, 0xef, 0x4b, 0xee, 0x46, 0x56, 0x68, 0xb2, 0x0e, 0xa4, 0x11, 0x8c, 0xa5, + 0x69, 0x2e, ], txid: [ - 0x43, 0x67, 0x86, 0x11, 0xad, 0x3e, 0x86, 0x5b, 0x49, 0xc6, 0x6d, 0x5b, 0xcf, 0x32, - 0xad, 0xce, 0xf1, 0x34, 0x82, 0x29, 0xf1, 0xdc, 0x57, 0x6c, 0xfe, 0x7f, 0x79, 0xcf, - 0x3d, 0xd2, 0xcf, 0x57, + 0x67, 0x62, 0xf9, 0xc5, 0x72, 0x30, 0xa5, 0x8d, 0xca, 0x6d, 0x44, 0x45, 0x47, 0xb2, + 0xf6, 0xe0, 0xe2, 0x13, 0x49, 0x2d, 0xbb, 0x40, 0x56, 0x4a, 0xe1, 0x01, 0xdf, 0x13, + 0x94, 0x1c, 0x61, 0x52, ], auth_digest: [ - 0x47, 0x37, 0x40, 0x67, 0x05, 0xc0, 0x55, 0x45, 0x75, 0x9e, 0xb8, 0x20, 0x84, 0xad, - 0xd3, 0xfc, 0xef, 0xd6, 0xb0, 0x98, 0x22, 0x70, 0xf3, 0x57, 0x11, 0xad, 0x67, 0x6f, - 0x4f, 0xcf, 0x39, 0xdb, + 0x1c, 0x3e, 0xc5, 0x10, 0x4d, 0x96, 0xb6, 0x68, 0x37, 0xb6, 0xe3, 0x81, 0xf7, 0x02, + 0xc7, 0xe4, 0x8a, 0x09, 0x7a, 0xaf, 0x12, 0x5c, 0x9b, 0x82, 0x89, 0x5b, 0x57, 0x8b, + 0x92, 0xea, 0xfd, 0x14, ], - transparent_input: None, - script_code: None, - amount: None, - sighash_all: [ - 0x43, 0x67, 0x86, 0x11, 0xad, 0x3e, 0x86, 0x5b, 0x49, 0xc6, 0x6d, 0x5b, 0xcf, 0x32, - 0xad, 0xce, 0xf1, 0x34, 0x82, 0x29, 0xf1, 0xdc, 0x57, 0x6c, 0xfe, 0x7f, 0x79, 0xcf, - 0x3d, 0xd2, 0xcf, 0x57, + amounts: vec![787459282010655, 1685382316228727, 1715663111103469], + script_pubkeys: vec![ + vec![0x65, 0x6a], + vec![0x65, 0x00, 0x51, 0x52, 0x6a], + vec![0x52, 0x6a, 0x51, 0x53, 0x00, 0x51, 0x52, 0x51, 0x6a], ], - sighash_none: None, - sighash_single: None, - sighash_all_anyone: None, - sighash_none_anyone: None, - sighash_single_anyone: None, - }, - TestVector { - tx: vec![ - 0x05, 0x00, 0x00, 0x80, 0x0a, 0x27, 0xa7, 0x26, 0x21, 0x96, 0x51, 0x37, 0x12, 0x50, - 0x92, 0x6f, 0x6a, 0x8e, 0x63, 0x19, 0x03, 0x8f, 0x69, 0xad, 0x9a, 0x91, 0x92, 0xb3, - 0x02, 0xf2, 0x6b, 0xdd, 0xa4, 0x65, 0xd9, 0x0b, 0x94, 0xb1, 0x2c, 0x57, 0xfa, 0x3f, - 0xd6, 0x93, 0x00, 0x83, 0xf1, 0x84, 0x43, 0x8d, 0x8a, 0x88, 0x9d, 0x3f, 0x5e, 0xce, - 0xa2, 0x02, 0x52, 0x63, 0x67, 0x36, 0xf2, 0xa0, 0xf1, 0x8e, 0x26, 0xf4, 0xfa, 0x45, - 0xd1, 0xbe, 0x8f, 0x3d, 0xc4, 0xa7, 0x07, 0x13, 0x7e, 0x95, 0xd2, 0xad, 0x59, 0x4f, - 0x6c, 0x03, 0xd2, 0x49, 0x23, 0x06, 0x7a, 0xe4, 0x7f, 0xd6, 0x42, 0x5e, 0xfb, 0x9c, - 0x1d, 0x50, 0x08, 0x6a, 0x63, 0x6a, 0x53, 0x00, 0xac, 0x65, 0x51, 0xfe, 0x80, 0x6f, - 0x57, 0x56, 0xac, 0xb5, 0x62, 0xf1, 0x3c, 0x0c, 0xa1, 0xd8, 0x03, 0xa1, 0x95, 0xc2, - 0xeb, 0xb2, 0xef, 0x02, 0xac, 0x33, 0xe6, 0xa8, 0x8d, 0xea, 0x07, 0x5b, 0xa9, 0x96, - 0xd3, 0xc3, 0x36, 0x64, 0x8e, 0x86, 0x94, 0xd3, 0xa1, 0x01, 0x63, 0xca, 0x53, 0x1b, - 0xeb, 0x03, 0x1a, 0xa2, 0x37, 0x7f, 0xca, 0x6c, 0x00, 0x00, 0x07, 0x00, 0xac, 0x6a, - 0x6a, 0xac, 0xac, 0x53, 0xd4, 0xe9, 0x59, 0xaf, 0x4a, 0x2e, 0x02, 0x00, 0x02, 0xac, - 0xac, 0xb7, 0x57, 0x47, 0xfc, 0x90, 0x3c, 0x05, 0x00, 0x03, 0x00, 0xac, 0x00, 0x02, - 0x75, 0x61, 0x49, 0x34, 0xb7, 0xeb, 0x2b, 0xef, 0x27, 0x9e, 0x31, 0xb9, 0x65, 0xe6, - 0xd3, 0x38, 0x74, 0xb4, 0xe1, 0x1b, 0x25, 0x7f, 0x89, 0x60, 0x31, 0x6c, 0x9a, 0x17, - 0xc6, 0xa5, 0x73, 0xa5, 0x8f, 0x57, 0x01, 0x5c, 0xa4, 0x02, 0xc6, 0x7d, 0x92, 0x5c, - 0x99, 0xac, 0xea, 0x3e, 0xe8, 0xcc, 0x4b, 0x00, 0x8c, 0x5c, 0xb4, 0x39, 0x66, 0xe7, - 0x14, 0xef, 0x48, 0x0f, 0xd0, 0x5e, 0x07, 0xc7, 0xb2, 0xdd, 0xa9, 0xaa, 0x39, 0x66, - 0x11, 0x3e, 0xaa, 0x29, 0x3d, 0x3f, 0x62, 0x2b, 0x30, 0x9d, 0x64, 0x80, 0x3c, 0xe1, - 0xe6, 0x37, 0x8b, 0x6a, 0xac, 0x4f, 0xab, 0x52, 0x7c, 0x43, 0xcd, 0x45, 0xdb, 0xad, - 0x57, 0xe9, 0xd2, 0x59, 0x69, 0xbf, 0x43, 0xd0, 0x14, 0x3b, 0x76, 0xc8, 0x5c, 0xa0, - 0x95, 0xa9, 0x0d, 0xac, 0x4b, 0xa0, 0x78, 0x17, 0xf0, 0x26, 0x31, 0xd7, 0x2e, 0xe5, - 0xda, 0xc1, 0xe1, 0x6d, 0x0b, 0x77, 0xf0, 0x20, 0x28, 0xda, 0x46, 0x41, 0x00, 0xfd, - 0xe7, 0x6d, 0x83, 0xdd, 0x0b, 0xb2, 0x24, 0xf7, 0xb5, 0x7a, 0x00, 0xc0, 0x2f, 0x68, - 0xae, 0x64, 0x8f, 0xdc, 0x52, 0x99, 0x57, 0xa1, 0x04, 0x90, 0xdc, 0xe1, 0xfd, 0xdb, - 0xb0, 0x90, 0x4f, 0x0d, 0x51, 0x8b, 0xb3, 0x87, 0x54, 0x40, 0x19, 0x98, 0x3b, 0x61, - 0x69, 0x75, 0xa7, 0x8e, 0x74, 0xd8, 0x54, 0xfd, 0xdc, 0x49, 0x00, 0xf7, 0x53, 0xdb, - 0x06, 0xf5, 0x10, 0x01, 0x00, 0x7c, 0x57, 0xec, 0x89, 0x0a, 0xff, 0x51, 0xa4, 0xd1, - 0xd3, 0x9e, 0xcd, 0x0e, 0x75, 0x7f, 0x29, 0x17, 0xc7, 0x38, 0xdd, 0x99, 0x9b, 0x5c, - 0x6e, 0x77, 0xda, 0x0b, 0x6b, 0x40, 0xa8, 0x70, 0x06, 0xed, 0x0a, 0x3c, 0x1a, 0x4b, - 0x9f, 0xb1, 0x8d, 0xcc, 0xcf, 0xcd, 0xb6, 0xac, 0x0c, 0x24, 0x21, 0x63, 0x9c, 0xda, - 0x00, 0x75, 0xa2, 0x0d, 0xc5, 0x11, 0x1b, 0x8d, 0x3d, 0x31, 0x99, 0x49, 0x5b, 0xd9, - 0x13, 0x3d, 0xba, 0xb9, 0x45, 0x41, 0x41, 0x0e, 0x4f, 0xba, 0x92, 0xc7, 0xb6, 0x06, - 0xa5, 0xcb, 0x12, 0x2f, 0x14, 0x0c, 0xf1, 0xa3, 0x59, 0x6f, 0x27, 0x88, 0xf3, 0xc8, - 0xb9, 0x26, 0x60, 0xf1, 0x4c, 0xb6, 0x5a, 0xf5, 0xdd, 0x23, 0xdf, 0xdb, 0xac, 0x13, - 0x71, 0xec, 0xf4, 0xb3, 0x37, 0x12, 0xfe, 0xd2, 0x29, 0x2c, 0x44, 0xf7, 0x08, 0x34, - 0xcf, 0x96, 0xc0, 0x5d, 0x58, 0x82, 0x7e, 0x69, 0xbf, 0xc2, 0xe6, 0x96, 0xfa, 0x08, - 0x74, 0x86, 0x9c, 0x02, 0xf3, 0xdc, 0xa1, 0x1c, 0x3b, 0x90, 0xcb, 0x21, 0x4e, 0x68, - 0xbc, 0x1c, 0xae, 0x03, 0x9d, 0x7a, 0x14, 0x6c, 0xdc, 0x1d, 0x60, 0x9d, 0x7a, 0x6b, - 0x3f, 0xd5, 0xd4, 0x61, 0xb0, 0x95, 0x1c, 0x82, 0xcf, 0xb3, 0xe7, 0x63, 0xfa, 0xd2, - 0xd1, 0xbc, 0x76, 0x78, 0xcd, 0xf8, 0x27, 0x79, 0xf8, 0xfd, 0x5a, 0x1c, 0xe2, 0x2a, - 0x8d, 0x3c, 0x45, 0x47, 0xab, 0xd9, 0x59, 0x83, 0x8a, 0x46, 0xfb, 0x80, 0xaf, 0xe0, - 0x1f, 0x8e, 0xcc, 0x99, 0x31, 0x51, 0x3b, 0x19, 0x62, 0xec, 0x54, 0x08, 0x56, 0xcb, - 0x18, 0x93, 0x87, 0xcf, 0xbf, 0xb2, 0x55, 0x16, 0x7b, 0x55, 0xef, 0x4b, 0xee, 0x46, - 0x56, 0x68, 0xb2, 0x0e, 0xa4, 0x11, 0x8c, 0xa5, 0x69, 0xae, 0x48, 0x0e, 0x0f, 0x6e, - 0x5e, 0x04, 0x3a, 0x35, 0x7b, 0x36, 0xd3, 0xab, 0x36, 0xc8, 0x61, 0xf2, 0x27, 0x83, - 0x01, 0xdc, 0xe5, 0x76, 0x74, 0xd5, 0x07, 0x3b, 0x3a, 0x6f, 0x51, 0x03, 0xa0, 0x79, - 0x3a, 0xf1, 0xb7, 0xd4, 0x6f, 0x95, 0x7e, 0x22, 0xd8, 0xd2, 0x58, 0x3b, 0xf1, 0x81, - 0x83, 0x6c, 0x3b, 0xe9, 0x93, 0x0b, 0xac, 0x8f, 0xa4, 0x60, 0xe9, 0x68, 0xaa, 0x71, - 0x09, 0x87, 0x0b, 0xbe, 0xd1, 0x7d, 0xf5, 0xf8, 0x88, 0xc8, 0xca, 0x14, 0x67, 0xae, - 0x17, 0xdb, 0xbc, 0xde, 0x31, 0xc1, 0x10, 0x5c, 0xb5, 0xbd, 0xa8, 0x8a, 0xc6, 0xc6, - 0x27, 0x00, 0x2c, 0xe2, 0x1c, 0x02, 0x14, 0x0f, 0xfe, 0x81, 0xec, 0x58, 0xbf, 0x1e, - 0x6d, 0x1b, 0xb7, 0xaa, 0xad, 0xa4, 0x1f, 0xba, 0x0b, 0xb5, 0x88, 0x77, 0x8a, 0x7f, - 0x65, 0x20, 0x2a, 0xd8, 0x11, 0xea, 0x73, 0xd2, 0x6c, 0x74, 0x55, 0x03, 0x95, 0xaf, - 0xf7, 0x53, 0x25, 0x10, 0x7c, 0x9b, 0x3f, 0x9a, 0xe9, 0xdc, 0xdc, 0xd8, 0x6e, 0xd0, - 0x81, 0xa2, 0xe7, 0x42, 0x47, 0x19, 0xa3, 0xd1, 0x85, 0xb7, 0xe0, 0xa4, 0x3a, 0x47, - 0x2e, 0x29, 0x8a, 0xc0, 0xaf, 0xdc, 0x52, 0x87, 0xd7, 0xad, 0x12, 0x4c, 0xd9, 0x40, - 0x5a, 0x65, 0x50, 0x59, 0xe1, 0x83, 0xe9, 0x64, 0xe7, 0xfc, 0x98, 0xbb, 0x48, 0xe3, - 0x67, 0xbb, 0xd6, 0x8d, 0x8c, 0x9e, 0xce, 0x7b, 0x6b, 0xd2, 0x13, 0x62, 0x48, 0x56, - 0x08, 0x3f, 0xbf, 0x92, 0x0c, 0xa5, 0x3f, 0xfc, 0x83, 0x35, 0xf0, 0x72, 0xaf, 0x59, - 0x3b, 0xc9, 0x91, 0xe8, 0x05, 0xc3, 0x89, 0x2b, 0x93, 0x96, 0x32, 0x44, 0x95, 0x54, - 0xe4, 0x0a, 0xe3, 0xc7, 0xa9, 0x96, 0xc0, 0xee, 0x02, 0xfc, 0x62, 0x66, 0x03, 0xde, - 0xf3, 0x06, 0xfd, 0x1f, 0xf4, 0x11, 0x8b, 0x1c, 0x8e, 0x06, 0x69, 0xef, 0xe1, 0xb1, - 0x0f, 0xc1, 0x60, 0x87, 0x19, 0x98, 0x15, 0x43, 0x0b, 0xf8, 0x15, 0xa7, 0x18, 0xba, - 0xb9, 0x1d, 0x8c, 0xf2, 0x95, 0x0d, 0xbf, 0x25, 0xb4, 0x2e, 0xc4, 0x9a, 0x1f, 0x33, - 0x5d, 0xdf, 0xd5, 0xca, 0xd4, 0xbb, 0xaf, 0xc1, 0xdc, 0xba, 0x2c, 0xd1, 0xc3, 0xd2, - 0x2b, 0x56, 0x05, 0xb9, 0x16, 0x9e, 0x4a, 0xb2, 0x1f, 0xf8, 0x1d, 0xc3, 0x6b, 0x21, - 0xec, 0x34, 0x9b, 0x66, 0xbd, 0x88, 0xff, 0xe7, 0xff, 0x46, 0xee, 0x18, 0xec, 0xe4, - 0x9e, 0x64, 0x19, 0x87, 0x58, 0x93, 0x8b, 0xc0, 0x52, 0x15, 0xdb, 0xd8, 0x35, 0x46, - 0x13, 0xa0, 0x02, 0x94, 0x89, 0xfe, 0x7b, 0x1d, 0xfe, 0xbd, 0xa9, 0xda, 0x98, 0x01, - 0x47, 0x39, 0x7e, 0x97, 0xaa, 0x45, 0xd0, 0x94, 0x51, 0x12, 0x08, 0x03, 0x13, 0x57, - 0x01, 0xb8, 0x59, 0x5c, 0x6e, 0x0f, 0x17, 0x64, 0xc3, 0x33, 0x6e, 0x48, 0xe7, 0xf7, - 0x74, 0x67, 0x54, 0x36, 0x50, 0x2e, 0xdd, 0xa9, 0xcc, 0x00, 0xc7, 0xf2, 0x4c, 0xb6, - 0x09, 0x0a, 0x80, 0xd0, 0xa6, 0x19, 0x49, 0x60, 0x8b, 0xa6, 0x73, 0x71, 0x0e, 0x93, - 0x14, 0x06, 0x30, 0xbf, 0x86, 0x72, 0xc4, 0x14, 0x3d, 0x8b, 0x7a, 0xcf, 0xd7, 0x4e, - 0x72, 0xc0, 0x4d, 0x89, 0x24, 0x0d, 0x22, 0xd6, 0x7c, 0x92, 0xd7, 0x91, 0x3f, 0x99, - 0x06, 0xf0, 0x21, 0x9e, 0x84, 0xff, 0xd3, 0x93, 0x2f, 0x8b, 0x41, 0x44, 0x46, 0x1d, - 0x07, 0x00, 0xcb, 0x7a, 0xd6, 0xcf, 0x94, 0x17, 0x53, 0x3c, 0x26, 0xd2, 0x05, 0x0d, - 0x25, 0xb7, 0x4b, 0x0e, 0x7b, 0x5a, 0x54, 0xdf, 0x51, 0x15, 0x7d, 0xc9, 0xe6, 0x2d, - 0x5f, 0x6c, 0x4a, 0xbe, 0x5c, 0xe9, 0x0a, 0x7f, 0xe2, 0xe5, 0x2a, 0x8d, 0x78, 0x06, - 0x78, 0xcf, 0xcb, 0xdc, 0x0d, 0x5d, 0x9e, 0x43, 0x66, 0x5a, 0xf0, 0xfd, 0xbf, 0x5c, - 0x4b, 0x77, 0x27, 0x68, 0x0f, 0x4c, 0x53, 0x4b, 0x54, 0xf9, 0xd5, 0xe9, 0xa3, 0x57, - 0xc8, 0x36, 0xe0, 0x85, 0xe1, 0x0c, 0x1e, 0x3f, 0xac, 0x40, 0x58, 0xb6, 0x82, 0xc6, - 0x8e, 0x54, 0xfa, 0xca, 0xe0, 0xf9, 0xc2, 0xdd, 0x4d, 0x64, 0xd9, 0x04, 0x61, 0x52, - 0xb4, 0x76, 0x23, 0x32, 0x93, 0x9f, 0x17, 0xe6, 0xaa, 0xf7, 0xd8, 0xb9, 0xd3, 0x58, - 0xe2, 0x21, 0x8d, 0x4e, 0x0d, 0x69, 0xa4, 0xf1, 0x19, 0xe1, 0xc6, 0x4e, 0xec, 0x4c, - 0x8b, 0x53, 0x28, 0x09, 0x70, 0x71, 0x31, 0xf0, 0x1f, 0x55, 0xc7, 0xad, 0x04, 0xcf, - 0xb6, 0x3f, 0x7c, 0x4a, 0x3d, 0x0a, 0x2b, 0x0f, 0xfb, 0x0b, 0x05, 0xa6, 0xbe, 0x05, - 0x5b, 0x8c, 0x94, 0xca, 0x80, 0xbb, 0x0a, 0x1d, 0x13, 0xcd, 0x4c, 0xd6, 0x9a, 0xb9, - 0x83, 0x04, 0xae, 0x25, 0x15, 0xd5, 0xf7, 0x69, 0x9d, 0x4a, 0xbe, 0xe5, 0xc2, 0x0b, - 0xe6, 0x09, 0xd8, 0x73, 0x51, 0x10, 0x12, 0xf2, 0x34, 0xbd, 0x85, 0xa7, 0xef, 0xf5, - 0xfb, 0x63, 0x4c, 0xff, 0x26, 0x58, 0xba, 0x65, 0x16, 0x04, 0x85, 0x63, 0x09, 0x5e, - 0xce, 0xfb, 0x30, 0x15, 0xee, 0x3f, 0x03, 0xca, 0x52, 0xa1, 0x77, 0xf2, 0x61, 0xec, - 0xdc, 0x26, 0xbc, 0x08, 0x9d, 0x34, 0xc6, 0x40, 0x48, 0x46, 0xe9, 0xc6, 0x47, 0xfc, - 0xfe, 0x98, 0xcc, 0x6a, 0xcd, 0xbb, 0x46, 0x4f, 0x64, 0x27, 0x8a, 0xd8, 0xce, 0x9d, - 0x1a, 0xe0, 0xd4, 0x15, 0xbc, 0x0c, 0x05, 0x24, 0x5f, 0xdd, 0xaf, 0x4e, 0xbc, 0x8d, - 0xc7, 0x03, 0xa8, 0x5c, 0xb2, 0x70, 0xf7, 0x96, 0xad, 0x2d, 0x93, 0x7e, 0x2a, 0xc0, - 0xd5, 0xe0, 0xa3, 0x48, 0x21, 0x75, 0x80, 0x00, 0xaa, 0x59, 0xc9, 0xd4, 0x65, 0x24, - 0x85, 0x29, 0x4e, 0xe0, 0xab, 0x29, 0x69, 0x6b, 0x21, 0x43, 0x0f, 0xa5, 0x4d, 0xcf, - 0xbf, 0x2b, 0x9c, 0x49, 0xd1, 0x42, 0x06, 0x42, 0x09, 0xee, 0xee, 0xd4, 0xd4, 0x71, - 0xff, 0xc0, 0x17, 0xd4, 0xe2, 0x0a, 0x79, 0x6b, 0x09, 0x27, 0x80, 0x4c, 0x06, 0x1b, - 0x9f, 0x4a, 0x70, 0x91, 0xfe, 0x01, 0x5a, 0xda, 0x68, 0xfd, 0x84, 0x42, 0xe0, 0x18, - 0x25, 0xc8, 0x8d, 0xfe, 0x55, 0xcf, 0x5d, 0xe3, 0x89, 0x36, 0xf7, 0xce, 0x25, 0x31, - 0x1b, 0x90, 0x2b, 0xa9, 0x7a, 0x3c, 0x12, 0xa9, 0x5c, 0xfa, 0x1c, 0x3a, 0x59, 0x1b, - 0x81, 0x8f, 0x60, 0x83, 0x27, 0x09, 0xd9, 0xe4, 0x83, 0x9e, 0x41, 0x0f, 0xb3, 0x6b, - 0x84, 0xf3, 0xac, 0x4f, 0x07, 0x0f, 0xc3, 0x5e, 0x16, 0x19, 0x78, 0x25, 0x9e, 0x5b, - 0x8e, 0xdc, 0x74, 0x4d, 0x90, 0x91, 0x9a, 0xa7, 0x70, 0xbb, 0x36, 0x21, 0x51, 0x28, - 0xe5, 0x82, 0xb5, 0x96, 0x41, 0xe2, 0x38, 0x52, 0xe9, 0x58, 0xeb, 0x8f, 0xc3, 0xc0, - 0xaa, 0x96, 0x15, 0x2b, 0xa4, 0xf7, 0x7f, 0x13, 0x8d, 0x6a, 0x67, 0x12, 0xa3, 0xae, - 0x32, 0x26, 0x01, 0x58, 0x83, 0xf8, 0x1d, 0xb2, 0x3e, 0x58, 0x3c, 0x86, 0x9c, 0x4c, - 0x71, 0x14, 0x3a, 0x6f, 0xff, 0xd6, 0x5e, 0x8d, 0xfd, 0xc5, 0x0c, 0x99, 0xa2, 0xf1, - 0xf3, 0x14, 0xcd, 0xcc, 0x71, 0x35, 0x9e, 0x23, 0x5f, 0x1d, 0x7d, 0xc2, 0xb5, 0xf3, - 0x8e, 0xf7, 0xb9, 0x70, 0x84, 0x31, 0x63, 0xc0, 0x3f, 0x9d, 0xd4, 0x0a, 0x80, 0x15, - 0xef, 0xdc, 0x87, 0x91, 0x95, 0x6a, 0x3f, 0x3c, 0xed, 0xd9, 0xea, 0x64, 0xf8, 0xef, - 0xa7, 0xa0, 0x81, 0x5a, 0x70, 0x38, 0x1d, 0x71, 0x46, 0x78, 0x17, 0xbd, 0x04, 0xca, - 0x52, 0x9a, 0xed, 0xe0, 0x7f, 0xf6, 0x0d, 0x17, 0x6a, 0xed, 0x0f, 0x85, 0x5a, 0x2e, - 0xae, 0xa8, 0x9e, 0xae, 0xac, 0xa8, 0x93, 0x58, 0xc0, 0x81, 0x82, 0x6a, 0x08, 0x12, - 0xa5, 0xbc, 0xa2, 0x8b, 0xe1, 0x37, 0x3f, 0x08, 0x6d, 0xbd, 0xba, 0x7e, 0x43, 0xe2, - 0x03, 0x21, 0x2c, 0x9f, 0xed, 0x21, 0x47, 0x4b, 0xa1, 0x9a, 0x05, 0x5f, 0xfc, 0xc1, - 0x79, 0x41, 0x2e, 0x89, 0x3a, 0x74, 0x48, 0x32, 0x29, 0x8c, 0x5f, 0xe2, 0x4c, 0xc6, - 0xb1, 0x86, 0x67, 0xf4, 0x9b, 0x34, 0xdf, 0xb1, 0x23, 0x79, 0x26, 0x74, 0x19, 0xa9, - 0xcb, 0x94, 0x03, 0xd8, 0x16, 0x7d, 0x8d, 0x1e, 0x91, 0xd2, 0x81, 0x1a, 0x04, 0x3b, - 0x29, 0x24, 0x3b, 0x06, 0x9b, 0x37, 0x58, 0x78, 0x47, 0xdc, 0x6f, 0xcd, 0xdb, 0x18, - 0x31, 0xbd, 0x1c, 0xc2, 0x56, 0x7c, 0xa0, 0x33, 0xac, 0x40, 0xf7, 0x4a, 0xb6, 0x95, - 0x5f, 0x68, 0x3b, 0x12, 0xe4, 0xe8, 0x25, 0x4e, 0x4e, 0xa7, 0x60, 0xd3, 0x8b, 0x3f, - 0x46, 0x79, 0x1c, 0x5c, 0x4c, 0xb1, 0x2b, 0xc7, 0xcc, 0xb0, 0xed, 0x18, 0x65, 0xf2, - 0x5d, 0x60, 0x1c, 0x30, 0x3f, 0x81, 0xfb, 0x1f, 0xa1, 0xdb, 0x48, 0x53, 0x3d, 0x3d, - 0x6b, 0x28, 0x8e, 0x4d, 0x9a, 0x4d, 0xff, 0x8e, 0xc2, 0x1c, 0x96, 0xf5, 0x78, 0x39, - 0x97, 0x10, 0xc8, 0x25, 0xfe, 0x7e, 0x32, 0xf9, 0x3a, 0x8c, 0x07, 0x43, 0xf9, 0xeb, - 0xd5, 0x4c, 0xc1, 0x51, 0xc7, 0x61, 0xcb, 0x66, 0x38, 0xeb, 0xa3, 0xa1, 0xfe, 0xa6, - 0xb9, 0xa9, 0x72, 0xaa, 0x26, 0x1b, 0x13, 0x7d, 0x01, 0x58, 0x61, 0xe1, 0x4c, 0x59, - 0xec, 0x3a, 0x6f, 0x4c, 0x6d, 0x8e, 0x19, 0xe6, 0x46, 0x3f, 0xa1, 0xe4, 0x30, 0x4f, - 0x49, 0xe4, 0x3a, 0xe0, 0x65, 0xe3, 0xfb, 0x19, 0x6f, 0x76, 0xd9, 0xb8, 0x79, 0xc7, - 0x20, 0x08, 0x62, 0xea, 0xd1, 0x8d, 0xea, 0x5f, 0xb6, 0xa1, 0x7a, 0xce, 0xa3, 0x33, - 0x88, 0x70, 0xbd, 0xe6, 0x64, 0x49, 0x89, 0x1b, 0x3e, 0xb0, 0x51, 0xda, 0x40, 0x7e, - 0x71, 0x05, 0xcd, 0xa2, 0x0d, 0x73, 0x59, 0x11, 0x39, 0xe9, 0xb2, 0xa2, 0xc7, 0x29, - 0x06, 0x0c, 0x4a, 0x9f, 0xce, 0x5c, 0x0b, 0x6e, 0xac, 0xb9, 0x36, 0x2d, 0xdc, 0xd7, - 0x74, 0xa0, 0xf2, 0xe1, 0x47, 0xc3, 0x07, 0x07, 0xa2, 0xcb, 0x66, 0x80, 0xa2, 0x49, - 0xea, 0x9c, 0x72, 0x24, 0x39, 0x2c, 0xbc, 0x0a, 0x9d, 0x58, 0xac, 0xdc, 0x4b, 0xa5, - 0x62, 0x3c, 0x49, 0x8c, 0x72, 0xd7, 0xba, 0xc4, 0xf3, 0x01, 0x3d, 0x09, 0x38, 0xbc, - 0xda, 0x4f, 0x45, 0x16, 0x66, 0x57, 0xe1, 0xf0, 0xd7, 0x9d, 0x50, 0x8b, 0x17, 0x78, - 0x52, 0xaf, 0xd0, 0xab, 0xb9, 0x0a, 0xde, 0x1d, 0x68, 0x27, 0x26, 0xf4, 0x20, 0x08, - 0xb4, 0x6a, 0xd7, 0xf8, 0xab, 0xdb, 0x18, 0x11, 0x7f, 0x72, 0x64, 0x13, 0x90, 0xf0, - 0x86, 0xb6, 0xe1, 0x49, 0x8b, 0xe6, 0x95, 0x48, 0x52, 0x7e, 0x6a, 0xda, 0x2b, 0x38, - 0xb9, 0xfe, 0x12, 0x1e, 0xf6, 0x70, 0xaf, 0x74, 0x37, 0xd3, 0x25, 0x36, 0xd5, 0xcf, - 0x5c, 0x4a, 0xb1, 0x9d, 0xd9, 0x97, 0x71, 0x58, 0x2d, 0x03, 0x81, 0x04, 0xb7, 0xe0, - 0x39, 0xa3, 0x76, 0xf7, 0xac, 0xbb, 0xea, 0xdb, 0x34, 0xf9, 0x45, 0xbe, 0xb9, 0xd7, - 0xca, 0x0e, 0x4e, 0x3d, 0x5c, 0x5e, 0x4e, 0xb1, 0xd8, 0x52, 0x6e, 0xbd, 0x13, 0xda, - 0xcb, 0x1b, 0xa3, 0x57, 0x35, 0xc6, 0xd0, 0x4a, 0x45, 0x55, 0xac, 0xf4, 0xbf, 0x11, - 0x76, 0x26, 0x50, 0x0d, 0x77, 0xb3, 0x81, 0x89, 0xdd, 0x48, 0x88, 0x04, 0x12, 0x25, - 0xac, 0xbe, 0x38, 0x74, 0xa4, 0xc0, 0xf6, 0x07, 0xfe, 0x67, 0x45, 0xf9, 0x35, 0x5b, - 0x3f, 0xa1, 0x88, 0xf1, 0xd6, 0x5c, 0x09, 0xf3, 0x89, 0xaf, 0x1b, 0x9d, 0x62, 0x32, - 0xaa, 0x79, 0x44, 0x79, 0x19, 0xc5, 0x50, 0xf6, 0xf3, 0x1f, 0xec, 0x35, 0x48, 0x1c, - 0xb9, 0x22, 0xde, 0x2d, 0xb5, 0xb4, 0xda, 0x2f, 0x81, 0x94, 0x86, 0x17, 0x02, 0x8e, - 0x32, 0x17, 0x06, 0xa3, 0xa7, 0x78, 0xc1, 0x93, 0x8c, 0x44, 0x3b, 0xb0, 0x0e, 0x5b, - 0x0f, 0xf0, 0x6a, 0xd8, 0xab, 0x9b, 0x1a, 0xb0, 0xc1, 0x14, 0x77, 0x67, 0x3f, 0x85, - 0xdf, 0x95, 0x61, 0xdb, 0xea, 0x45, 0xd5, 0xf9, 0x78, 0x1e, 0xbe, 0x31, 0x7a, 0x07, - 0x10, 0xae, 0x54, 0x61, 0xe3, 0x4f, 0xe6, 0xf1, 0xb1, 0xaa, 0x9b, 0x4e, 0x67, 0xb1, - 0x49, 0x10, 0x98, 0x48, 0x02, 0xc2, 0xa7, 0xe3, 0x81, 0x93, 0xbc, 0x7b, 0xdc, 0x8b, - 0xa3, 0xe4, 0xe3, 0xd1, 0xd9, 0x33, 0xbf, 0xb5, 0x80, 0xf5, 0xb3, 0xe8, 0x7a, 0x2a, - 0x06, 0x51, 0x70, 0x51, 0x41, 0x0f, 0xe1, 0xb4, 0xff, 0x1e, 0xa0, 0xad, 0xe8, 0x24, - 0xf3, 0x38, 0x51, 0x54, 0x56, 0xa5, 0x7c, 0x7a, 0x91, 0x6a, 0x74, 0x38, 0x8e, 0xe8, - 0xf1, 0x28, 0x1f, 0x9a, 0xde, 0x0a, 0xe2, 0xa2, 0x61, 0x3a, 0x06, 0x12, 0xc4, 0x69, - 0xdf, 0x79, 0x2b, 0x8d, 0xf4, 0xca, 0xe4, 0xfc, 0x25, 0xc1, 0xca, 0xdb, 0xa9, 0x5a, - 0x80, 0x7c, 0xe6, 0x1e, 0x5a, 0x53, 0x03, 0xfa, 0xaf, 0x9e, 0x14, 0x65, 0x39, 0x96, - 0xb5, 0xa8, 0xad, 0xc3, 0x4f, 0xd4, 0x75, 0xef, 0x14, 0x99, 0x09, 0x4b, 0xab, 0xaf, - 0x1f, 0x3f, 0x07, 0xda, 0x9a, 0x39, 0x0b, 0x1d, 0x9f, 0xc9, 0xa0, 0x83, 0x27, 0x98, - 0x7a, 0xdf, 0xe9, 0x56, 0x48, 0x63, 0xfb, 0xdf, 0xa8, 0xf6, 0xb4, 0x6a, 0x88, 0x41, - 0x58, 0x30, 0x99, 0xaf, 0xb7, 0x87, 0x01, 0x18, 0xfa, 0xce, 0x76, 0x34, 0x7e, 0x40, - 0xb6, 0xfd, 0x8c, 0xd1, 0x55, 0x82, 0xae, 0x8e, 0x23, 0xbe, 0x9a, 0x02, 0x19, 0xbc, - 0x3e, 0x4e, 0x45, 0x46, 0xa3, 0x0d, 0x3b, 0xbb, 0xbd, 0x16, 0x86, 0x08, 0x68, 0x76, - 0xbe, 0x0e, 0x4c, 0x85, 0x9b, 0xe7, 0x1f, 0xb5, 0x8f, 0x4f, 0xab, 0x3d, 0x28, 0xc0, - 0xb4, 0xf7, 0xe7, 0x5a, 0xd1, 0xed, 0xb7, 0xf8, 0x89, 0x46, 0xfb, 0x40, 0xcf, 0xa5, - 0x78, 0x6a, 0x0f, 0xcb, 0xa1, 0x30, 0x3c, 0x83, 0x47, 0xec, 0xee, 0x93, 0xd4, 0x6d, - 0x14, 0x0b, 0xb5, 0xf6, 0x95, 0x31, 0xd6, 0x66, 0x54, 0x8b, 0x10, 0x9c, 0xe7, 0x64, - 0xbe, 0xad, 0x7c, 0x87, 0xbd, 0x4c, 0x87, 0x64, 0x94, 0xde, 0x82, 0xdb, 0x6e, 0x50, - 0x73, 0xa6, 0xc9, 0x4f, 0x7c, 0x09, 0x9a, 0x40, 0xd7, 0xa3, 0x1c, 0x4a, 0x04, 0xb6, - 0x9c, 0x9f, 0xcc, 0xf3, 0xc7, 0xdd, 0x56, 0xf5, 0x54, 0x47, 0x76, 0xc5, 0x3b, 0x4d, - 0xf7, 0x95, 0x39, 0x81, 0xd5, 0x5a, 0x96, 0xa6, 0xdc, 0xff, 0x99, 0x04, 0xa9, 0x08, - 0x42, 0xe5, 0xba, 0xfe, 0xc8, 0x84, 0x0c, 0x2d, 0x25, 0x5b, 0xf5, 0xad, 0x61, 0xc4, - 0x60, 0xf9, 0x8f, 0xeb, 0x82, 0xa1, 0x0f, 0xa1, 0xc0, 0x99, 0xf6, 0x27, 0x76, 0x79, - 0x82, 0x36, 0xc5, 0xca, 0x7f, 0x1e, 0x46, 0xeb, 0xdb, 0x2b, 0x14, 0x4d, 0x87, 0x13, - 0xe5, 0x6c, 0x77, 0x2f, 0x2c, 0x3b, 0x86, 0x0e, 0xa5, 0xb0, 0x3a, 0x88, 0x54, 0xbc, - 0x6e, 0x65, 0x90, 0xd6, 0x3c, 0xc0, 0xea, 0x54, 0xf1, 0x0b, 0x73, 0xba, 0x24, 0x1b, - 0xf7, 0x4b, 0x63, 0x55, 0x51, 0xa2, 0xaa, 0xca, 0x96, 0x87, 0xac, 0x52, 0x69, 0xfd, - 0x36, 0x8b, 0x26, 0xd7, 0x0a, 0x73, 0x7f, 0x26, 0x76, 0x85, 0x99, 0x8a, 0x3f, 0x7d, - 0x26, 0x37, 0x91, 0x49, 0x09, 0xc7, 0x46, 0x49, 0x5d, 0x24, 0xc4, 0x98, 0x63, 0x5e, - 0xf9, 0x7a, 0xc6, 0x6a, 0x40, 0x08, 0x94, 0xc0, 0x9f, 0x73, 0x48, 0x8e, 0xb7, 0xcf, - 0x77, 0x92, 0x37, 0xdb, 0x2a, 0xc1, 0x4e, 0x22, 0x65, 0x8b, 0xe2, 0x8a, 0xe9, 0x88, - 0xce, 0xc4, 0xa6, 0x71, 0x65, 0x3b, 0x57, 0x5f, 0xde, 0xa4, 0x4f, 0x7d, 0xe6, 0x9c, - 0xb7, 0xe3, 0x96, 0x82, 0x1e, 0x7c, 0x66, 0x17, 0x39, 0xf9, 0xf0, 0x28, 0xa9, 0x26, - 0x2b, 0xd8, 0x0e, 0xbf, 0x9c, 0xe8, 0xc4, 0xa9, 0x38, 0x2c, 0x6b, 0x03, 0xe7, 0xd8, - 0x08, 0x5e, 0x90, 0x6c, 0xf8, 0x4c, 0xa2, 0x01, 0x73, 0xfc, 0x57, 0xbe, 0x19, 0x36, - 0x1a, 0x83, 0xa7, 0xe3, 0x77, 0x5f, 0x5b, 0x01, 0x3a, 0x9a, 0x04, 0xb1, 0xa5, 0x06, - 0xfc, 0x59, 0x80, 0x2c, 0xfc, 0x3c, 0xac, 0xfb, 0x63, 0x5b, 0xeb, 0x0b, 0x76, 0x39, - 0x5c, 0xba, 0x74, 0x3c, 0x36, 0x27, 0x9b, 0xa3, 0xb4, 0xf2, 0xc8, 0xba, 0x4a, 0xdb, - 0x5b, 0x87, 0x63, 0xfb, 0x96, 0xd7, 0xca, 0x33, 0x3a, 0x12, 0xde, 0x3c, 0xef, 0xa9, - 0x1c, 0x2c, 0x96, 0x59, 0x99, 0x19, 0xa4, 0xdf, 0xe8, 0x40, 0x8a, 0xcb, 0x99, 0x10, - 0x5e, 0xe5, 0x4b, 0x79, 0xf2, 0x27, 0xb6, 0xcb, 0x7e, 0x33, 0x7b, 0xab, 0x04, 0x98, - 0x98, 0x57, 0xfe, 0x4f, 0x44, 0x37, 0xdd, 0xfa, 0xbb, 0x7b, 0x65, 0x54, 0x3b, 0x5f, - 0x39, 0xcb, 0x20, 0x23, 0xd4, 0x67, 0x89, 0xeb, 0x7d, 0x98, 0x9a, 0xf7, 0x79, 0xe5, - 0xb8, 0xd2, 0x83, 0x85, 0xa8, 0x5b, 0x0d, 0xa2, 0xab, 0xe0, 0x7f, 0x0c, 0x2b, 0xb4, - 0x25, 0x5f, 0xce, 0xa0, 0x31, 0x88, 0x52, 0x7a, 0x30, 0x7d, 0x40, 0x91, 0x59, 0xe9, - 0x01, 0x66, 0xfa, 0xc6, 0xa0, 0x70, 0xba, 0x05, 0xb3, 0xe4, 0xdb, 0xfd, 0x3a, 0x2b, - 0xfc, 0xc9, 0xee, 0x6e, 0xd0, 0x16, 0xc0, 0xf6, 0x65, 0xbe, 0x81, 0x33, 0xb7, 0xdc, - 0x1d, 0x86, 0x04, 0x4d, 0xb0, 0xf9, 0xdb, 0x40, 0xfb, 0x0e, 0x9f, 0x8b, 0xc2, 0xe4, - 0xdb, 0x53, 0x82, 0xa8, 0xb4, 0xf8, 0x15, 0xb4, 0xe8, 0x43, 0x4a, 0xd0, 0xdf, 0xbc, - 0x51, 0xa5, 0xe9, 0xb1, 0x45, 0xe1, 0x59, 0x6c, 0xbf, 0x46, 0x70, 0xb7, 0xe0, 0x5d, - 0xfd, 0xaf, 0xbb, 0x0c, 0xf3, 0xdd, 0xee, 0x28, 0xd7, 0x6a, 0x82, 0x42, 0x8e, 0x8a, - 0xba, 0x43, 0x64, 0xe8, 0x4b, 0xac, 0x37, 0x92, 0x98, 0xdf, 0x29, 0x32, 0xe6, 0x9b, - 0xb5, 0xd0, 0x45, 0x51, 0x6e, 0xfc, 0x33, 0xae, 0x6c, 0xc3, 0x94, 0x7c, 0xeb, 0x09, - 0xed, 0x37, 0x16, 0x67, 0x21, 0x2a, 0x83, 0x1b, 0x54, 0x85, 0xea, 0xfc, 0xe8, 0x48, - 0x81, 0x88, 0xea, 0x4e, 0x27, 0xd0, 0xcd, 0xf7, 0xdd, 0xd3, 0x48, 0xab, 0xff, 0x77, - 0x7f, 0x4a, 0x13, 0xbb, 0xc7, 0x16, 0xb6, 0xa5, 0x94, 0x4e, 0xe7, 0x27, 0x96, 0x56, - 0x90, 0xe2, 0x09, 0xb4, 0x9e, 0xb9, 0x62, 0xc0, 0x39, 0x97, 0x5f, 0x93, 0x9e, 0xd5, - 0xc6, 0xe4, 0xc4, 0x00, 0xd8, 0x87, 0x75, 0x94, 0x33, 0xd3, 0xad, 0x71, 0x6d, 0xa0, - 0xcb, 0x44, 0x61, 0x13, 0xc7, 0x72, 0x7a, 0x64, 0xb5, 0x8c, 0x3f, 0x8a, 0x0f, 0x81, - 0x18, 0x9f, 0x98, 0x00, 0x52, 0x33, 0xa8, 0x13, 0x66, 0xae, 0xe7, 0x3c, 0xec, 0x85, - 0x22, 0x8e, 0xbc, 0xfd, 0x5e, 0xe3, 0xc3, 0xfb, 0x44, 0xdb, 0x76, 0xba, 0x24, 0x3f, - 0x28, 0x42, 0xb7, 0xb5, 0xfc, 0x74, 0x6a, 0xe5, 0x1b, 0x0b, 0xc4, 0xbd, 0x4f, 0xc9, - 0xfd, 0x83, 0x35, 0x65, 0xea, 0x85, 0x2b, 0x92, 0xb2, 0x24, 0xf6, 0x99, 0x03, 0x18, - 0xad, 0x8c, 0x7d, 0x94, 0x37, 0xe2, 0x0e, 0x2a, 0x1f, 0x20, 0xe8, 0x18, 0xf9, 0x05, - 0x7c, 0x5a, 0xba, 0xaa, 0x2e, 0x5c, 0x15, 0xb9, 0x49, 0x45, 0xcd, 0x42, 0x4c, 0x28, - 0xa5, 0xfa, 0x38, 0x5d, 0xad, 0xfe, 0x49, 0x07, 0xb2, 0x74, 0xd8, 0x42, 0x70, 0x7d, - 0xb3, 0x69, 0x7a, 0x5a, 0xe6, 0xc8, 0xf5, 0x42, 0xe5, 0xec, 0xc0, 0x7f, 0xe4, 0x73, - 0x50, 0xd1, 0x01, 0x46, 0x70, 0x21, 0x2e, 0xfe, 0x81, 0xfb, 0x7c, 0x73, 0xe8, 0x45, - 0x0d, 0xf8, 0x14, 0xef, 0x62, 0x32, 0xf7, 0x49, 0x0f, 0x63, 0xcc, 0xf0, 0x74, 0x80, - 0xf8, 0x84, 0xa6, 0x6e, 0xaf, 0xfc, 0x28, 0xfe, 0xa4, 0x48, 0xd7, 0xb4, 0x01, 0xcd, - 0xae, 0x10, 0xe7, 0xc0, 0xc7, 0xf9, 0xa7, 0xb1, 0x53, 0x31, 0x96, 0x9f, 0xc8, 0xcb, - 0x36, 0x39, 0x67, 0x73, 0xde, 0x19, 0x19, 0x31, 0xc7, 0x50, 0xf6, 0xce, 0x5c, 0xaa, - 0xf2, 0x97, 0x68, 0xeb, 0xb2, 0x7d, 0xac, 0xc7, 0x38, 0x05, 0x6a, 0x81, 0x25, 0xb4, - 0x77, 0x2b, 0xf8, 0x7a, 0xe1, 0x0a, 0x8a, 0x30, 0x9b, 0x9b, 0xd6, 0x55, 0x04, 0x3c, - 0xfc, 0x31, 0x59, 0x49, 0x43, 0x68, 0xc5, 0xab, 0x8c, 0xad, 0xb7, 0xf6, 0x71, 0xe9, - 0x62, 0x6b, 0xd2, 0x63, 0xe3, 0x11, 0x81, 0xa6, 0x04, 0xb5, 0x06, 0xa0, 0x3b, 0x43, - 0x9a, 0x7f, 0xfe, 0x43, 0x55, 0x89, 0x24, 0x77, 0xe2, 0xbd, 0xf3, 0x38, 0xc6, 0x2c, - 0x39, 0x22, 0xf7, 0xd3, 0xc9, 0xa5, 0x6c, 0x71, 0x03, 0xd9, 0x11, 0x94, 0x8a, 0x84, - 0xb5, 0xae, 0x2d, 0xbb, 0x16, 0xa3, 0x76, 0x1a, 0xdd, 0x05, 0x3a, 0x0f, 0x96, 0x7e, - 0x6b, 0x5b, 0xc9, 0x42, 0x11, 0xb6, 0x54, 0x71, 0x53, 0x26, 0x7c, 0x6e, 0xe1, 0xca, - 0xd0, 0xd9, 0x74, 0xa7, 0x10, 0x88, 0x58, 0x37, 0x35, 0xe4, 0xf6, 0x3d, 0x33, 0x15, - 0x6d, 0xad, 0xd5, 0x4c, 0x2f, 0xaf, 0x89, 0x11, 0x4a, 0x12, 0x7b, 0x97, 0xb9, 0x4c, - 0xc2, 0xa2, 0x2e, 0xf3, 0x03, 0xf4, 0x59, 0xd0, 0x4f, 0xc0, 0xb5, 0x3a, 0xce, 0x59, - 0x18, 0xd4, 0x7f, 0xf3, 0x3a, 0x55, 0x8b, 0xd7, 0x1a, 0x75, 0xf3, 0x55, 0xfb, 0xd0, - 0x6b, 0xbc, 0xcf, 0x4e, 0x02, 0xc3, 0xc0, 0xa4, 0xb6, 0x3d, 0x0c, 0xc9, 0x49, 0x80, - 0x1d, 0x63, 0xa6, 0x4c, 0xb2, 0xd3, 0x23, 0x73, 0xb2, 0xc7, 0xb2, 0x74, 0xab, 0x2d, - 0xb4, 0x68, 0x21, 0x42, 0xc8, 0xb2, 0x1d, 0x84, 0xc4, 0x81, 0xf5, 0xef, 0x21, 0xe4, - 0xb5, 0xe3, 0x60, 0x34, 0x51, 0xbf, 0x94, 0x77, 0x4d, 0x0e, 0xf4, 0x7f, 0x63, 0xfa, - 0x6a, 0xbb, 0x78, 0xd2, 0x1c, 0x19, 0x3c, 0xbe, 0x00, 0x4d, 0x43, 0x55, 0x23, 0x1d, - 0xfd, 0x03, 0x00, 0x3d, 0xa4, 0xea, 0x2a, 0x4c, 0x88, 0xbf, 0x67, 0x7c, 0xf9, 0x75, - 0x4f, 0x0c, 0x47, 0xef, 0x82, 0xe2, 0x09, 0x75, 0xba, 0xae, 0xcb, 0x02, 0x32, 0xdf, - 0x88, 0x0b, 0xd7, 0xd1, 0xde, 0x13, 0x21, 0x54, 0x94, 0x62, 0xec, 0x8d, 0x5d, 0xf3, - 0xe7, 0x80, 0xff, 0xa7, 0x2e, 0xba, 0x8a, 0x8d, 0xf7, 0xfc, 0xf3, 0x98, 0xec, 0x23, - 0x05, 0x13, 0xca, 0x9d, 0x61, 0x23, 0xf8, 0xb9, 0xd8, 0x17, 0x85, 0x60, 0xda, 0xf9, - 0x75, 0x11, 0x19, 0x55, 0xa2, 0xbc, 0xa3, 0x42, 0x3e, 0xee, 0xfc, 0x52, 0x7b, 0xe3, - 0xa8, 0x54, 0x3e, 0xb9, 0x0a, 0x5e, 0xc0, 0x2f, 0x35, 0xa7, 0xc6, 0x4b, 0x7d, 0xd5, - 0x9a, 0x72, 0xda, 0x00, 0x74, 0x63, 0x4e, 0x01, 0xd2, 0xab, 0xf3, 0x63, 0x7a, 0xdd, - 0x77, 0xc7, 0x35, 0x0f, 0x12, 0xb0, 0x11, 0xb2, 0xb2, 0x44, 0x61, 0x3c, 0x3f, 0x63, - 0x8d, 0xfb, 0xc0, 0x36, 0xc4, 0x55, 0x41, 0x59, 0x0a, 0x6f, 0x07, 0x05, 0x34, 0xb1, - 0x3f, 0x4d, 0x4e, 0xc0, 0x99, 0x5a, 0x08, 0x23, 0x37, 0x43, 0x8d, 0x04, 0xea, 0x53, - 0xf4, 0x92, 0x07, 0x0e, 0x20, 0x1c, 0xdb, 0xb1, 0xdc, 0x5b, 0xd1, 0x94, 0xd4, 0x91, - 0x9f, 0x91, 0x1d, 0xfa, 0x72, 0x41, 0xc8, 0xd5, 0x79, 0x2d, 0x43, 0xc4, 0x57, 0xd5, - 0xde, 0x16, 0x67, 0xc6, 0x2e, 0xc0, 0x9f, 0x08, 0xcb, 0x58, 0xf7, 0x35, 0xe5, 0xe3, - 0x5e, 0xfe, 0xd1, 0x84, 0xa5, 0x00, 0x10, 0x18, 0xc1, 0x0f, 0x8c, 0xb6, 0x4b, 0x0a, - 0x7b, 0x76, 0x81, 0x4b, 0xe1, 0x17, 0xfa, 0xe2, 0x04, 0xa5, 0x20, 0x08, 0xdb, 0xef, - 0xce, 0xc9, 0xfc, 0x34, 0xc0, 0xe5, 0xbe, 0x77, 0xfc, 0x8b, 0x5b, 0x5c, 0xd0, 0x77, - 0x11, 0x5a, 0xfd, 0xe1, 0x84, 0x05, 0x05, 0x4e, 0x5d, 0x29, 0x1a, 0xa8, 0xeb, 0x16, - 0x19, 0xc0, 0x49, 0xa6, 0x05, 0x76, 0xb8, 0x78, 0x67, 0x93, 0x6b, 0x8c, 0x9b, 0x29, - 0x68, 0x88, 0xa8, 0x60, 0x34, 0x8e, 0x53, 0xc1, 0x5f, 0x73, 0x41, 0xd8, 0xf1, 0xac, - 0xdd, 0x0d, 0xde, 0x23, 0x07, 0x55, 0xb4, 0xce, 0x86, 0x0f, 0x9f, 0x65, 0x0f, 0xe4, - 0x0a, 0xf6, 0x41, 0x36, 0x40, 0xb8, 0x1e, 0x4f, 0x63, 0x1c, 0x98, 0x1c, 0x11, 0xa2, - 0xe1, 0xd1, 0x84, 0x06, 0xf1, 0xec, 0x93, 0xae, 0x09, 0x7d, 0x4c, 0x4c, 0x15, 0x9a, - 0xb6, 0xc4, 0xe6, 0xf5, 0x27, 0xe8, 0x0a, 0x8a, 0x7f, 0xaf, 0xf9, 0x1d, 0x41, 0x0d, - 0xe4, 0x44, 0x38, 0xdb, 0x1c, 0x7e, 0x9d, 0x2f, 0x17, 0xca, 0xd2, 0x42, 0xfa, 0x9c, - 0x31, 0x79, 0xc1, 0xa3, 0xaa, 0x81, 0xf7, 0x36, 0x16, 0x49, 0x57, 0x2c, 0x71, 0x5c, - 0x25, 0xa1, 0xf6, 0xcd, 0x5a, 0xce, 0x82, 0xc0, 0x0a, 0xb2, 0x34, 0x2b, - ], - txid: [ - 0xf2, 0x09, 0x0e, 0xc3, 0xe4, 0xd7, 0x61, 0x3e, 0xee, 0x5d, 0x3a, 0x77, 0xc5, 0xd6, - 0x4e, 0xea, 0xa2, 0x29, 0xe0, 0xf4, 0x42, 0x74, 0x0c, 0x06, 0x1b, 0x2c, 0xb0, 0x8e, - 0x93, 0x35, 0xa0, 0x03, - ], - auth_digest: [ - 0xb0, 0x9c, 0x87, 0xf9, 0x85, 0x52, 0x9f, 0x8d, 0x51, 0x1d, 0x2c, 0xf0, 0xca, 0x42, - 0xda, 0xac, 0xea, 0x04, 0x59, 0x18, 0x12, 0x18, 0x90, 0x41, 0x0d, 0x24, 0xdb, 0xdc, - 0x19, 0x23, 0x96, 0xc6, - ], - transparent_input: Some(0), - script_code: Some(vec![]), - amount: Some(1405243945822387), - sighash_all: [ - 0x84, 0x83, 0xbf, 0x1b, 0x6a, 0xbb, 0x10, 0xa0, 0xce, 0x4a, 0x9a, 0x35, 0xfc, 0x1f, - 0x56, 0xdf, 0x6e, 0x29, 0xec, 0xd3, 0x4d, 0xf6, 0x52, 0x75, 0xd0, 0x09, 0x77, 0xc5, - 0x3f, 0x42, 0xf8, 0x91, + transparent_input: Some(2), + sighash_shielded: [ + 0xa7, 0xe2, 0x72, 0xca, 0x04, 0x40, 0x87, 0xc4, 0xd3, 0x56, 0x61, 0x88, 0x8b, 0x34, + 0x8c, 0x57, 0xe9, 0x8b, 0x79, 0x81, 0xa1, 0x6f, 0xe5, 0xe8, 0x81, 0x81, 0xc8, 0xe1, + 0x5a, 0xae, 0x58, 0x1c, ], + sighash_all: Some([ + 0xda, 0x3e, 0xdd, 0x81, 0xf4, 0xfa, 0x79, 0xe4, 0x7f, 0xb6, 0x76, 0xca, 0x0b, 0x56, + 0xb1, 0x29, 0x9f, 0xf5, 0xb5, 0xec, 0x58, 0x23, 0xec, 0x87, 0x1e, 0x3d, 0x7c, 0x12, + 0x88, 0x4f, 0xe5, 0x77, + ]), sighash_none: Some([ - 0xc2, 0x0a, 0x39, 0x19, 0x20, 0x96, 0x78, 0xb6, 0x0f, 0x22, 0xee, 0xe4, 0x32, 0xc4, - 0xf8, 0x9a, 0x1d, 0x4a, 0x8e, 0x08, 0x6e, 0xeb, 0xd6, 0xfc, 0xef, 0x98, 0xab, 0x3f, - 0x1c, 0x83, 0x61, 0x17, - ]), - sighash_single: Some([ - 0x53, 0x98, 0xd8, 0x46, 0x02, 0xae, 0x39, 0xad, 0xdf, 0x98, 0x04, 0x0a, 0xa5, 0xdb, - 0xfc, 0xfe, 0xc2, 0x66, 0xb5, 0x08, 0xdb, 0xbf, 0xac, 0xf6, 0x3a, 0xdd, 0xc3, 0x75, - 0x81, 0xef, 0x81, 0x51, + 0xdd, 0xe8, 0x6c, 0x69, 0x61, 0xd0, 0x2d, 0x65, 0x51, 0x03, 0xc9, 0xd1, 0x9c, 0x89, + 0x62, 0x3f, 0xde, 0x4e, 0xc6, 0xb5, 0x28, 0x2b, 0xb8, 0xfb, 0xc7, 0xe8, 0xba, 0x46, + 0x91, 0x1e, 0x9a, 0x3e, ]), + sighash_single: None, sighash_all_anyone: Some([ - 0x53, 0x91, 0xce, 0xef, 0xa5, 0x0a, 0x8e, 0x12, 0x1a, 0xa7, 0xb6, 0xde, 0xf7, 0xa7, - 0x6e, 0x22, 0xcd, 0x81, 0xce, 0x0d, 0x82, 0x6f, 0xd0, 0x40, 0xdc, 0x21, 0x6d, 0xe6, - 0x7b, 0x01, 0x5b, 0xbd, + 0x41, 0x15, 0x08, 0xbb, 0x7b, 0x21, 0x94, 0xf6, 0x17, 0xad, 0xc6, 0xc7, 0x82, 0xbb, + 0x77, 0x20, 0xc8, 0xdf, 0xc2, 0x5f, 0xef, 0x3b, 0xc4, 0x8e, 0xc7, 0x31, 0xa2, 0x4a, + 0xa2, 0xc1, 0xc1, 0x05, ]), sighash_none_anyone: Some([ - 0xe0, 0x9f, 0x3b, 0xe0, 0x44, 0x11, 0x00, 0x81, 0xcf, 0xb8, 0x01, 0xc4, 0x4f, 0xf6, - 0x38, 0x6c, 0x61, 0x17, 0xaf, 0xd1, 0x42, 0xd3, 0x2a, 0xbe, 0xee, 0x01, 0x47, 0xdc, - 0xbb, 0x74, 0x77, 0x82, + 0xb4, 0x25, 0x3a, 0x25, 0xbf, 0x7e, 0xe6, 0xcd, 0x20, 0x9c, 0x5f, 0x07, 0x66, 0x6f, + 0xea, 0x85, 0x3e, 0x4b, 0x80, 0x08, 0x62, 0xa2, 0x9a, 0xa5, 0xa8, 0x96, 0x1f, 0x95, + 0x32, 0x03, 0xa3, 0xb0, + ]), + sighash_single_anyone: None, + }, + TestVector { + tx: vec![ + 0x05, 0x00, 0x00, 0x80, 0x0a, 0x27, 0xa7, 0x26, 0xb4, 0xd0, 0xd6, 0xc2, 0x81, 0x83, + 0x6c, 0x3b, 0xe9, 0x9a, 0x08, 0x17, 0x03, 0xa4, 0x60, 0xe9, 0x68, 0xaa, 0x71, 0x09, + 0x87, 0x0b, 0xbe, 0xd1, 0x7d, 0xf5, 0xf8, 0x88, 0xc8, 0xca, 0x14, 0x67, 0xae, 0x17, + 0xdb, 0xbc, 0xde, 0x31, 0xc1, 0x10, 0x5c, 0xb5, 0xbd, 0xa8, 0x8a, 0xc6, 0xc6, 0x27, + 0x00, 0x04, 0x52, 0xac, 0x52, 0xac, 0x0f, 0xfe, 0x81, 0xec, 0x58, 0xbf, 0x1e, 0x6d, + 0x1b, 0xb7, 0xaa, 0xad, 0xa4, 0x1f, 0xba, 0x0b, 0xb5, 0x88, 0x77, 0x8a, 0x7f, 0x65, + 0x20, 0x2a, 0xd8, 0x11, 0xea, 0x73, 0xd2, 0x6c, 0x74, 0x55, 0x03, 0x95, 0xaf, 0xf7, + 0x53, 0x25, 0x10, 0x7c, 0x09, 0x6a, 0x52, 0x51, 0xac, 0xac, 0x00, 0x65, 0x00, 0x51, + 0xa2, 0xe7, 0x42, 0x47, 0x19, 0xa3, 0xd1, 0x85, 0xb7, 0xe0, 0xa4, 0x3a, 0x47, 0x2e, + 0x29, 0x8a, 0xc0, 0xaf, 0xdc, 0x52, 0x87, 0xd7, 0xad, 0x12, 0x4c, 0xd9, 0x40, 0x5a, + 0x62, 0xcd, 0x1c, 0xa0, 0x8b, 0x28, 0x2e, 0xfe, 0xf7, 0xf9, 0x28, 0xdf, 0x08, 0x52, + 0x52, 0x52, 0x51, 0xac, 0x53, 0x53, 0xac, 0xea, 0xa5, 0xff, 0x12, 0x00, 0x00, 0x00, + 0x00, + ], + txid: [ + 0x22, 0x1d, 0x40, 0x59, 0x7b, 0x56, 0x3f, 0x20, 0x64, 0x58, 0xf9, 0x73, 0x6b, 0x85, + 0x49, 0x23, 0x7c, 0x55, 0x54, 0x24, 0x2c, 0x41, 0x90, 0x22, 0x43, 0x5a, 0x33, 0x50, + 0xa0, 0x70, 0x8e, 0xa1, + ], + auth_digest: [ + 0x6a, 0x75, 0xe4, 0x93, 0x24, 0xe8, 0x53, 0x20, 0xfe, 0x2f, 0x22, 0x46, 0x66, 0x18, + 0xb7, 0x0b, 0x4b, 0xbe, 0xfe, 0xa2, 0x48, 0xe5, 0xd3, 0x67, 0x3f, 0x18, 0xf2, 0xe4, + 0x87, 0xa2, 0xb2, 0x0a, + ], + amounts: vec![1076763594431866, 316847576141144, 1780844721475339], + script_pubkeys: vec![ + vec![0x00, 0x65, 0x51, 0xac, 0x65, 0x63, 0x00, 0x53], + vec![0x63, 0x52, 0x00, 0x53], + vec![0xac, 0xac, 0x00, 0x65, 0x6a, 0x63, 0x51], + ], + transparent_input: Some(2), + sighash_shielded: [ + 0xb5, 0xa1, 0x8f, 0xf6, 0x57, 0x83, 0x9c, 0x69, 0x79, 0xc2, 0xf2, 0xaf, 0xae, 0xea, + 0xf2, 0xf5, 0xc1, 0xcf, 0x43, 0xdf, 0x92, 0xf4, 0xa6, 0x57, 0x55, 0xfa, 0x42, 0xae, + 0x2b, 0x77, 0x06, 0xab, + ], + sighash_all: Some([ + 0x9d, 0x80, 0x2c, 0x8a, 0xce, 0x5b, 0xc5, 0xf5, 0xb0, 0x3c, 0x7d, 0xac, 0x8a, 0x29, + 0xef, 0x33, 0x42, 0x4d, 0xef, 0x82, 0xcb, 0xc4, 0xfc, 0x84, 0x00, 0xc0, 0xbb, 0x9d, + 0x5e, 0x08, 0x41, 0x47, + ]), + sighash_none: Some([ + 0xae, 0x2d, 0xb1, 0x4c, 0x57, 0x78, 0x1f, 0xb5, 0x5c, 0x2f, 0x66, 0x58, 0xf6, 0x14, + 0x18, 0x83, 0xf7, 0xeb, 0xe0, 0xd3, 0x9f, 0x43, 0x9c, 0xf5, 0x66, 0xdc, 0x55, 0x0f, + 0xb9, 0xda, 0x71, 0x68, + ]), + sighash_single: None, + sighash_all_anyone: Some([ + 0xe7, 0x11, 0x83, 0x4b, 0x5a, 0x4e, 0xb8, 0x4a, 0xa2, 0x98, 0x6a, 0x53, 0xc2, 0xb2, + 0xba, 0x2f, 0xd6, 0x37, 0x4e, 0x66, 0x6f, 0x03, 0x11, 0xbf, 0xca, 0x8c, 0xbc, 0xee, + 0xfd, 0xde, 0x1e, 0x38, + ]), + sighash_none_anyone: Some([ + 0x5c, 0x3a, 0x08, 0x39, 0xfd, 0xc7, 0x34, 0x17, 0xae, 0x7d, 0x5f, 0x15, 0xdc, 0xee, + 0xd6, 0xc1, 0xa4, 0xcb, 0xe8, 0x0c, 0x6c, 0x25, 0xce, 0x03, 0x86, 0xfe, 0xf7, 0xc0, + 0x58, 0xa8, 0xb9, 0x43, + ]), + sighash_single_anyone: None, + }, + TestVector { + tx: vec![ + 0x05, 0x00, 0x00, 0x80, 0x0a, 0x27, 0xa7, 0x26, 0xb4, 0xd0, 0xd6, 0xc2, 0x57, 0xb8, + 0x57, 0x51, 0x23, 0x5d, 0xbc, 0x10, 0x02, 0x52, 0xe4, 0x1e, 0x00, 0x29, 0x31, 0xb4, + 0x57, 0x46, 0x19, 0x8e, 0x5d, 0xd9, 0x57, 0x1a, 0x56, 0xa7, 0xe0, 0xd4, 0x23, 0xff, + 0x27, 0x98, 0x9d, 0x3e, 0xb4, 0x17, 0xec, 0xd3, 0xc3, 0x09, 0x3f, 0xb8, 0x2c, 0x56, + 0x58, 0x00, 0x96, 0x24, 0xc5, 0x32, 0x19, 0xa6, 0x0c, 0xd0, 0xa8, 0xc4, 0xda, 0x36, + 0x7e, 0x29, 0xa7, 0x17, 0x79, 0xa7, 0x30, 0x32, 0x98, 0x5a, 0x3d, 0x1f, 0xd0, 0x3d, + 0xd4, 0xd0, 0x6e, 0x05, 0x56, 0x6f, 0x3b, 0x84, 0x36, 0x7c, 0xf0, 0xfa, 0xee, 0x9b, + 0x09, 0x63, 0x52, 0x52, 0x00, 0x52, 0x6a, 0x53, 0xac, 0xac, 0x5d, 0x82, 0xd0, 0xa6, + 0x02, 0xef, 0xab, 0xec, 0xef, 0x1b, 0xc7, 0x01, 0x00, 0x02, 0x00, 0x63, 0x97, 0x76, + 0x63, 0x55, 0x0e, 0x76, 0x06, 0x00, 0x01, 0x6a, 0x00, 0x00, 0x03, 0x09, 0xa8, 0x9a, + 0x5f, 0x40, 0xb3, 0x73, 0x03, 0xe1, 0x81, 0x6d, 0xf1, 0x3a, 0x9d, 0x7e, 0x20, 0xdb, + 0x15, 0x9c, 0x9f, 0x42, 0x77, 0x3a, 0x2f, 0xb0, 0x23, 0xd9, 0x5a, 0xbb, 0x1e, 0x1c, + 0xbe, 0x81, 0xc0, 0x92, 0xed, 0xb2, 0x30, 0xfa, 0x38, 0xea, 0x13, 0xc5, 0xde, 0x7c, + 0x0e, 0x50, 0x31, 0xa1, 0xe8, 0x4d, 0xae, 0xc3, 0xeb, 0xe6, 0x2d, 0x5f, 0x6c, 0x4a, + 0xbe, 0x5c, 0xe9, 0x0a, 0x3f, 0xcd, 0xc3, 0xa6, 0x50, 0x0c, 0x01, 0x1c, 0x8a, 0x0f, + 0xc0, 0x3d, 0xb6, 0xcc, 0x0c, 0x56, 0xcf, 0xd6, 0x54, 0x3a, 0xed, 0x33, 0xac, 0x6b, + 0x7c, 0x4d, 0xb7, 0x83, 0xde, 0xe6, 0xb3, 0x29, 0x27, 0x7f, 0x96, 0xc7, 0xe9, 0x0b, + 0xb9, 0xb4, 0x73, 0x02, 0x46, 0x5f, 0x37, 0x5c, 0x1d, 0x3c, 0xa4, 0x8e, 0x54, 0xfa, + 0xca, 0xe0, 0xf9, 0xc2, 0xdd, 0x4d, 0x64, 0xd9, 0x04, 0x61, 0x52, 0xb4, 0x36, 0x34, + 0x22, 0x7f, 0xbe, 0x32, 0xf6, 0x63, 0xbd, 0x1d, 0x90, 0xbb, 0xfa, 0x22, 0xf0, 0xe9, + 0xc7, 0x93, 0x47, 0x71, 0x93, 0xdd, 0xcb, 0x40, 0x18, 0x1a, 0x67, 0x9e, 0xae, 0x78, + 0x11, 0x32, 0x32, 0x31, 0xf0, 0x1f, 0x55, 0xc7, 0xad, 0x04, 0xcf, 0xb6, 0x3f, 0x7c, + 0x4a, 0x3d, 0x0a, 0x2b, 0x0f, 0xfb, 0x0b, 0x05, 0xa6, 0xbe, 0x05, 0x5b, 0x8c, 0x94, + 0xca, 0x80, 0xbb, 0x0a, 0x1d, 0x13, 0xcd, 0x4c, 0xd6, 0x9a, 0xb9, 0x83, 0x04, 0xae, + 0x25, 0x15, 0xd5, 0xf7, 0x69, 0x9d, 0x4a, 0xbe, 0xe5, 0xc2, 0x0b, 0xe6, 0x09, 0xd8, + 0x73, 0x51, 0x10, 0x12, 0xf2, 0x34, 0xbd, 0x85, 0xa7, 0xef, 0xf5, 0xfb, 0x63, 0x4c, + 0xff, 0x26, 0x58, 0xba, 0x65, 0x16, 0x04, 0x85, 0x63, 0x09, 0x5e, 0xce, 0xfb, 0x30, + 0x15, 0xee, 0x3f, 0x03, 0xca, 0x52, 0xa1, 0x77, 0xf2, 0x61, 0xec, 0xdc, 0x26, 0xbc, + 0x08, 0x9d, 0x34, 0xc6, 0x40, 0x48, 0x46, 0xe9, 0xc6, 0x47, 0xfc, 0xfe, 0x98, 0xcc, + 0x6a, 0xcd, 0xbb, 0x46, 0x4f, 0x64, 0x27, 0x8a, 0xd8, 0xce, 0x9d, 0x1a, 0xe0, 0xd4, + 0x15, 0xbc, 0x0c, 0x05, 0x24, 0x5f, 0xdd, 0xaf, 0x4e, 0xbc, 0x8d, 0xc7, 0x03, 0xa8, + 0x5c, 0xb2, 0x70, 0xf7, 0x96, 0xad, 0x2d, 0x93, 0x7e, 0x2a, 0xc0, 0xd5, 0xe0, 0xa3, + 0x48, 0x21, 0x75, 0x80, 0x00, 0xaa, 0x59, 0xc9, 0xd4, 0x65, 0x24, 0x85, 0x29, 0x4e, + 0xe0, 0xab, 0x29, 0x69, 0x6b, 0x21, 0x43, 0x0f, 0xa5, 0x4d, 0xcf, 0xbf, 0x2b, 0x9c, + 0x49, 0xd1, 0x42, 0x06, 0x42, 0x09, 0xee, 0xee, 0xd4, 0xd4, 0x71, 0xff, 0xc0, 0x17, + 0xd4, 0xe2, 0x0a, 0x79, 0x6b, 0x09, 0x27, 0x80, 0x4c, 0x06, 0x1b, 0x9f, 0x4a, 0x70, + 0x91, 0xfe, 0x01, 0x5a, 0xda, 0x68, 0xfd, 0x84, 0x42, 0xe0, 0x18, 0x25, 0xc8, 0x8d, + 0xfe, 0x55, 0xcf, 0x5d, 0xe3, 0x89, 0x36, 0xf7, 0xce, 0x25, 0x31, 0x1b, 0x90, 0x2b, + 0xa9, 0x7a, 0x3c, 0x12, 0xa9, 0x5c, 0xfa, 0x1c, 0x3a, 0x59, 0x1b, 0x81, 0x8f, 0x60, + 0x83, 0x27, 0x09, 0xd9, 0xe4, 0x83, 0x9e, 0x41, 0x0f, 0xb3, 0x6b, 0x84, 0xf3, 0xac, + 0x4f, 0x07, 0x0f, 0xc3, 0x5e, 0x16, 0x19, 0x78, 0x25, 0x9e, 0x5b, 0x8e, 0xdc, 0x74, + 0x4d, 0x90, 0x91, 0x9a, 0xa7, 0x70, 0xbb, 0x36, 0x21, 0x51, 0x28, 0xe5, 0x82, 0xb5, + 0x96, 0x41, 0xe2, 0x38, 0x52, 0xe9, 0x58, 0xeb, 0x8f, 0xc3, 0xc0, 0xaa, 0x96, 0x15, + 0x2b, 0xa4, 0xf7, 0x7f, 0x13, 0x8d, 0x6a, 0x67, 0x12, 0xa3, 0xae, 0x32, 0x26, 0x01, + 0x58, 0x83, 0xf8, 0x1d, 0xb2, 0x3e, 0x58, 0x3c, 0x86, 0x9c, 0x4c, 0x71, 0x14, 0x3a, + 0x6f, 0xff, 0xd6, 0x5e, 0x8d, 0xfd, 0xc5, 0x0c, 0x99, 0xa2, 0xf1, 0xf3, 0x14, 0xcd, + 0xcc, 0x71, 0x35, 0x9e, 0x23, 0x5f, 0x1d, 0x7d, 0xc2, 0xb5, 0xf3, 0x8e, 0xf7, 0xb9, + 0x70, 0x84, 0x31, 0x63, 0xc0, 0x3f, 0x9d, 0xd4, 0x0a, 0x80, 0x15, 0xef, 0xdc, 0x87, + 0x91, 0x95, 0x6a, 0x3f, 0x3c, 0xed, 0xd9, 0xea, 0x64, 0xf8, 0xef, 0xa7, 0xa0, 0x81, + 0x5a, 0x70, 0x38, 0x1d, 0x71, 0x46, 0x78, 0x17, 0xbd, 0x04, 0xca, 0x52, 0x9a, 0xed, + 0xe0, 0x7f, 0xf6, 0x0d, 0x17, 0x6a, 0xed, 0x0f, 0x85, 0x5a, 0x2e, 0xae, 0xa8, 0x9e, + 0xae, 0xac, 0xa8, 0x93, 0x58, 0xc0, 0x81, 0x82, 0x6a, 0x08, 0x12, 0xa5, 0xbc, 0xa2, + 0x8b, 0xe1, 0x37, 0x3f, 0x08, 0x6d, 0xbd, 0xba, 0x7e, 0x43, 0xe2, 0x03, 0x21, 0x2c, + 0x9f, 0xed, 0x21, 0x47, 0x4b, 0xa1, 0x9a, 0x05, 0x5f, 0xfc, 0xc1, 0x79, 0x41, 0x2e, + 0x89, 0x3a, 0x74, 0x48, 0x32, 0x29, 0x8c, 0x5f, 0xe2, 0x4c, 0xc6, 0xb1, 0x86, 0x67, + 0xf4, 0x9b, 0x34, 0xdf, 0xb1, 0x23, 0x79, 0x26, 0x74, 0x19, 0xa9, 0xcb, 0x94, 0x03, + 0xd8, 0x16, 0x7d, 0x8d, 0x1e, 0x91, 0xd2, 0x81, 0x1a, 0x04, 0x3b, 0x29, 0x24, 0x3b, + 0x06, 0x9b, 0x37, 0x58, 0x78, 0x47, 0xdc, 0x6f, 0xcd, 0xdb, 0x18, 0x31, 0xbd, 0x1c, + 0xc2, 0x56, 0x7c, 0xa0, 0x33, 0xac, 0x40, 0xf7, 0x4a, 0xb6, 0x95, 0x5f, 0x68, 0x3b, + 0x12, 0xe4, 0xe8, 0x25, 0x4e, 0x4e, 0xa7, 0x60, 0xd3, 0x8b, 0x3f, 0x46, 0x79, 0x1c, + 0x5c, 0x4c, 0xb1, 0x2b, 0xc7, 0xcc, 0xb0, 0xed, 0x18, 0x65, 0xf2, 0x5d, 0x60, 0x1c, + 0x30, 0x3f, 0x81, 0xfb, 0x1f, 0xa1, 0xdb, 0x48, 0x53, 0x3d, 0x3d, 0x6b, 0x28, 0x8e, + 0x4d, 0x9a, 0x4d, 0xff, 0x8e, 0xc2, 0x1c, 0x96, 0xf5, 0x78, 0x39, 0x97, 0x10, 0xc8, + 0x25, 0xfe, 0x7e, 0x32, 0xf9, 0x3a, 0x8c, 0x07, 0x43, 0xf9, 0xeb, 0xd5, 0x4c, 0xc1, + 0x51, 0xc7, 0x61, 0x03, 0x37, 0xae, 0xbf, 0x7e, 0x9b, 0x91, 0x57, 0x20, 0xa5, 0x43, + 0x51, 0xd4, 0x9a, 0xb8, 0xc2, 0x2f, 0xa3, 0x49, 0x98, 0xdc, 0xf5, 0x83, 0xd4, 0x38, + 0x73, 0x61, 0xef, 0x3f, 0xf8, 0x6f, 0x50, 0xec, 0x53, 0xf4, 0x92, 0x49, 0xe4, 0xad, + 0x34, 0x96, 0x03, 0x06, 0x6f, 0xc9, 0xc6, 0x61, 0xd6, 0x9f, 0x91, 0x1d, 0xfa, 0x72, + 0x41, 0xc8, 0xd5, 0x79, 0x2d, 0x78, 0x33, 0x2e, 0x93, 0xdb, 0x65, 0x93, 0xe5, 0x93, + 0xfd, 0x5d, 0x45, 0x6a, 0xbd, 0xac, 0x79, 0xa7, 0x16, 0xfa, 0x6e, 0x3f, 0x39, 0x28, + 0xa8, 0x4d, 0x19, 0x70, 0x86, 0xec, 0xc2, 0x7e, 0xac, 0x18, 0x8f, 0xf2, 0xb7, 0x15, + 0x21, 0x76, 0x2a, 0xd4, 0x7b, 0xec, 0x08, 0x99, 0x2d, 0x86, 0x85, 0x0e, 0xb3, 0xea, + 0x13, 0xd5, 0x07, 0x08, 0x07, 0xa2, 0xcb, 0x66, 0x80, 0xa2, 0x49, 0xea, 0x1c, 0x04, + 0x20, 0x37, 0x48, 0xda, 0xab, 0x9b, 0x0d, 0x3b, 0x3c, 0x2e, 0x9d, 0xcf, 0xe7, 0x76, + 0x0c, 0x79, 0xdd, 0xa3, 0xc0, 0x25, 0x9e, 0x7d, 0xa9, 0xcc, 0xfa, 0x5f, 0xb6, 0x47, + 0xa5, 0xe2, 0x0f, 0x3f, 0x3b, 0xc8, 0x66, 0xda, 0x24, 0xea, 0xde, 0x36, 0xb6, 0x83, + 0xa2, 0xbd, 0x71, 0x97, 0xfb, 0x67, 0x27, 0x26, 0xf4, 0x20, 0x08, 0xb4, 0x6a, 0xd7, + 0xf8, 0xab, 0xdb, 0x18, 0x11, 0x7f, 0x32, 0x2c, 0x57, 0xdc, 0x01, 0x7b, 0x0a, 0x37, + 0x1f, 0x48, 0x63, 0x13, 0x5b, 0x4d, 0xb5, 0xa1, 0xb6, 0xe0, 0x11, 0x1e, 0x63, 0x0e, + 0x23, 0x45, 0x9a, 0x74, 0x88, 0x33, 0x99, 0x1c, 0xff, 0x71, 0xa0, 0x5c, 0x4a, 0xb1, + 0x9d, 0xd9, 0x97, 0x71, 0x58, 0x2d, 0x03, 0x81, 0x04, 0xb7, 0xe0, 0x39, 0xa3, 0x76, + 0xf7, 0xac, 0xbb, 0xea, 0xdb, 0x34, 0xf9, 0x45, 0xbe, 0xb9, 0xd7, 0xca, 0x0e, 0x4e, + 0x3d, 0x5c, 0x5e, 0x4e, 0xb1, 0xd8, 0x52, 0x6e, 0xbd, 0x13, 0xda, 0xcb, 0x1b, 0xa3, + 0x57, 0x35, 0xc6, 0xd0, 0x4a, 0x45, 0x55, 0xac, 0xf4, 0xbf, 0x11, 0x76, 0x26, 0x50, + 0x0d, 0x77, 0xb3, 0x81, 0x89, 0xdd, 0x48, 0x88, 0x04, 0x12, 0x25, 0xac, 0xbe, 0x38, + 0x74, 0xa4, 0xc0, 0xf6, 0x07, 0xfe, 0x67, 0x45, 0xf9, 0x35, 0x5b, 0x3f, 0xa1, 0x88, + 0xf1, 0xd6, 0x5c, 0x09, 0xf3, 0x89, 0xaf, 0x1b, 0x9d, 0x62, 0x32, 0xaa, 0x79, 0x44, + 0x79, 0x19, 0xc5, 0x50, 0xf6, 0xf3, 0x1f, 0xec, 0x35, 0x48, 0x1c, 0xb9, 0x22, 0xde, + 0x2d, 0xb5, 0xb4, 0xda, 0x2f, 0x81, 0x94, 0x86, 0x17, 0x02, 0x8e, 0x32, 0x17, 0x06, + 0xa3, 0xa7, 0x78, 0xc1, 0x93, 0x8c, 0x44, 0x3b, 0xb0, 0x0e, 0x5b, 0x0f, 0xf0, 0x6a, + 0xd8, 0xab, 0x9b, 0x1a, 0xb0, 0xc1, 0x14, 0x77, 0x67, 0x3f, 0x85, 0xdf, 0x95, 0x61, + 0xdb, 0xea, 0x45, 0xd5, 0xf9, 0x78, 0x1e, 0xbe, 0x31, 0x7a, 0x07, 0x10, 0xae, 0x54, + 0x61, 0xe3, 0x4f, 0xe6, 0xf1, 0xb1, 0xaa, 0x9b, 0x4e, 0x67, 0xb1, 0x49, 0x10, 0x98, + 0x48, 0x02, 0xc2, 0xa7, 0xe3, 0x81, 0x93, 0xbc, 0x7b, 0xdc, 0x8b, 0xa3, 0xe4, 0xe3, + 0xd1, 0xd9, 0x33, 0xbf, 0xb5, 0x80, 0xf5, 0xb3, 0xe8, 0x7a, 0x2a, 0x06, 0x51, 0x70, + 0x51, 0x41, 0x0f, 0xe1, 0xb4, 0xff, 0x1e, 0xa0, 0xad, 0xe8, 0x24, 0xf3, 0x38, 0x51, + 0x54, 0x56, 0xa5, 0x7c, 0x7a, 0x91, 0x6a, 0x74, 0x38, 0x8e, 0xe8, 0xf1, 0x28, 0x1f, + 0x9a, 0xde, 0x0a, 0xe2, 0xa2, 0x61, 0x3a, 0x06, 0x12, 0xc4, 0x69, 0xdf, 0x79, 0x2b, + 0x8d, 0xf4, 0xca, 0xe4, 0xfc, 0x25, 0xc1, 0xca, 0xdb, 0xa9, 0x5a, 0x80, 0x7c, 0xe6, + 0x1e, 0x5a, 0x53, 0x03, 0xfa, 0xaf, 0x9e, 0x14, 0x65, 0x39, 0x96, 0xb5, 0xa8, 0xad, + 0xc3, 0x4f, 0xd4, 0x75, 0xef, 0x14, 0x99, 0x09, 0x4b, 0xab, 0xaf, 0x1f, 0x3f, 0x07, + 0xda, 0x9a, 0x39, 0x0b, 0x1d, 0x9f, 0xc9, 0xa0, 0x83, 0x27, 0x98, 0x7a, 0xdf, 0xe9, + 0x56, 0x48, 0x63, 0xfb, 0xdf, 0xa8, 0xf6, 0xb4, 0x6a, 0x88, 0x41, 0x58, 0x30, 0x99, + 0xaf, 0xb7, 0x87, 0x01, 0x18, 0xfa, 0xce, 0x76, 0x34, 0x7e, 0x40, 0xb6, 0xfd, 0x8c, + 0xd1, 0x55, 0x82, 0xae, 0x8e, 0x23, 0xbe, 0x9a, 0x02, 0x19, 0xbc, 0x3e, 0x4e, 0x45, + 0x46, 0xa3, 0x0d, 0x3b, 0xbb, 0xbd, 0x16, 0x86, 0x08, 0x68, 0x76, 0xbe, 0x0e, 0x4c, + 0x85, 0x9b, 0xe7, 0x1f, 0xb5, 0x8f, 0x4f, 0xab, 0x3d, 0x28, 0xc0, 0xb4, 0xf7, 0xe7, + 0x5a, 0xd1, 0xed, 0xb7, 0xf8, 0x89, 0x46, 0xfb, 0x40, 0xcf, 0xa5, 0x78, 0x6a, 0x0f, + 0xcb, 0xa1, 0x30, 0x3c, 0x83, 0x47, 0xec, 0xee, 0x93, 0xd4, 0x6d, 0x14, 0x0b, 0xb5, + 0xf6, 0x95, 0x31, 0xd6, 0x66, 0x54, 0x8b, 0x10, 0x9c, 0xe7, 0x64, 0xbe, 0xad, 0x7c, + 0x87, 0xbd, 0x4c, 0x87, 0x64, 0x94, 0xde, 0x82, 0xdb, 0x6e, 0x50, 0x73, 0xa6, 0xc9, + 0x4f, 0x7c, 0x09, 0x9a, 0x40, 0xd7, 0xa3, 0x1c, 0x4a, 0x04, 0xb6, 0x9c, 0x9f, 0xcc, + 0xf3, 0xc7, 0xdd, 0x56, 0xf5, 0x54, 0x47, 0x76, 0xc5, 0x3b, 0x4d, 0xf7, 0x95, 0x39, + 0x81, 0xd5, 0x5a, 0x96, 0xa6, 0xdc, 0xff, 0x99, 0x04, 0xa9, 0x08, 0x42, 0xe5, 0xba, + 0xfe, 0xc8, 0x84, 0x0c, 0x2d, 0x25, 0x5b, 0xf5, 0xad, 0x61, 0xc4, 0x60, 0xf9, 0x8f, + 0xeb, 0x82, 0xa1, 0x0f, 0xa1, 0xc0, 0x99, 0xf6, 0x27, 0x76, 0x79, 0x82, 0x36, 0xc5, + 0xca, 0x7f, 0x1e, 0x46, 0xeb, 0xdb, 0x2b, 0x14, 0x4d, 0x87, 0x13, 0xe5, 0x6c, 0x77, + 0x2f, 0x2c, 0x3b, 0x86, 0x0e, 0xa5, 0xb0, 0x3a, 0x88, 0x54, 0xbc, 0x6e, 0x65, 0x90, + 0xd6, 0x3c, 0xc0, 0xea, 0x54, 0xf1, 0x0b, 0x73, 0xba, 0x24, 0x1b, 0xf7, 0x4b, 0x63, + 0x55, 0x51, 0xa2, 0xaa, 0xca, 0x96, 0x87, 0xac, 0x52, 0x69, 0xfd, 0x36, 0x8b, 0x26, + 0xd7, 0x0a, 0x73, 0x7f, 0x26, 0x76, 0x85, 0x99, 0x8a, 0x3f, 0x7d, 0x26, 0x37, 0x91, + 0x49, 0x09, 0xc7, 0x46, 0x49, 0x5d, 0x24, 0xc4, 0x98, 0x63, 0x5e, 0xf9, 0x7a, 0xc6, + 0x6a, 0x40, 0x08, 0x94, 0xc0, 0x9f, 0x73, 0x48, 0x8e, 0xb7, 0xcf, 0x33, 0xf6, 0xda, + 0xd1, 0x66, 0x6a, 0x05, 0xf9, 0x1a, 0xd7, 0x75, 0x79, 0x65, 0xc2, 0x99, 0x36, 0xe7, + 0xfa, 0x48, 0xd7, 0x7e, 0x89, 0xee, 0x09, 0x62, 0xf5, 0x8c, 0x05, 0x1d, 0x11, 0xd0, + 0x55, 0xfc, 0xe2, 0x04, 0xa5, 0x62, 0xde, 0x68, 0x08, 0x8a, 0x1b, 0x26, 0x48, 0xb8, + 0x17, 0x4c, 0xbc, 0xfc, 0x8b, 0x5b, 0x5c, 0xd0, 0x77, 0x11, 0x5a, 0xfd, 0xe1, 0x78, + 0x3f, 0x5c, 0xdb, 0x26, 0xf7, 0xbf, 0xdf, 0x87, 0xb2, 0x1b, 0x1c, 0x70, 0xdc, 0x56, + 0xbf, 0x1c, 0x82, 0x85, 0x7a, 0x40, 0xca, 0x2a, 0xa2, 0x36, 0xec, 0x56, 0x69, 0x12, + 0xd8, 0x64, 0x93, 0x7a, 0xa0, 0x7d, 0xdf, 0xfc, 0xd3, 0x77, 0x39, 0x5c, 0xba, 0x61, + 0x6d, 0x63, 0xc0, 0xb6, 0x9c, 0x01, 0xfc, 0xc4, 0x53, 0x91, 0xfd, 0x5b, 0x87, 0x63, + 0xfb, 0x96, 0xd7, 0xca, 0x33, 0x3a, 0x12, 0x79, 0x11, 0xb4, 0xed, 0x95, 0xb0, 0x0c, + 0x24, 0xcb, 0x57, 0x8f, 0xfa, 0xb9, 0xf1, 0x11, 0x60, 0x30, 0x04, 0x86, 0x08, 0xcc, + 0x99, 0x0e, 0x74, 0xeb, 0xad, 0x5c, 0x34, 0x8a, 0xd9, 0xa8, 0x85, 0xe9, 0x07, 0xe0, + 0xbe, 0x5a, 0x78, 0x83, 0xc8, 0x84, 0x89, 0xcb, 0x41, 0x43, 0x2d, 0xac, 0x86, 0x20, + 0x23, 0xd4, 0x67, 0x89, 0xeb, 0x7d, 0x98, 0x9a, 0xf7, 0x79, 0xe5, 0xb8, 0xd2, 0x83, + 0x05, 0xd7, 0xe2, 0x12, 0x4d, 0x3b, 0x55, 0x77, 0x0f, 0x8c, 0x05, 0x0a, 0xb2, 0x5e, + 0x1a, 0x46, 0x02, 0xeb, 0x58, 0xcf, 0x12, 0x34, 0xea, 0xe1, 0x5f, 0x33, 0xbb, 0xde, + 0xce, 0x27, 0xa6, 0xb1, 0x2d, 0xb3, 0xe4, 0xdb, 0xfd, 0x3a, 0x2b, 0xfc, 0xc9, 0xee, + 0x6e, 0xd0, 0x16, 0xc0, 0xf6, 0x65, 0xbe, 0x81, 0x33, 0xb7, 0xdc, 0x1d, 0x86, 0x04, + 0x4d, 0xb0, 0xf9, 0xdb, 0x40, 0xfb, 0x0e, 0x9f, 0x8b, 0xc2, 0xe4, 0xdb, 0x53, 0x82, + 0xa8, 0xb4, 0xf8, 0x15, 0xb4, 0xe8, 0x43, 0x4a, 0xd0, 0xdf, 0xbc, 0x51, 0xa5, 0xe9, + 0xb1, 0x45, 0xe1, 0x59, 0x6c, 0xbf, 0x46, 0x70, 0xb7, 0xe0, 0x5d, 0xfd, 0xaf, 0xbb, + 0x0c, 0xf3, 0xdd, 0xee, 0x28, 0xd7, 0x6a, 0x82, 0x42, 0x8e, 0x8a, 0xba, 0x43, 0x64, + 0xe8, 0x4b, 0xac, 0x37, 0x92, 0x98, 0xdf, 0x29, 0x32, 0xe6, 0x9b, 0xb5, 0xd0, 0x45, + 0x51, 0x6e, 0xfc, 0x33, 0xae, 0x6c, 0xc3, 0x94, 0x7c, 0xeb, 0x09, 0xed, 0x37, 0x16, + 0x67, 0x21, 0x2a, 0x83, 0x1b, 0x54, 0x85, 0xea, 0xfc, 0xe8, 0x48, 0x81, 0x88, 0xea, + 0x4e, 0x27, 0xd0, 0xcd, 0xf7, 0xdd, 0xd3, 0x48, 0xab, 0xff, 0x77, 0x7f, 0x4a, 0x13, + 0xbb, 0xc7, 0x16, 0xb6, 0xa5, 0x94, 0x4e, 0xe7, 0x27, 0x96, 0x56, 0x90, 0xe2, 0x09, + 0xb4, 0x9e, 0xb9, 0x62, 0xc0, 0x39, 0x97, 0x5f, 0x93, 0x9e, 0xd5, 0xc6, 0xe4, 0xc4, + 0x00, 0xd8, 0x87, 0x75, 0x94, 0x33, 0xd3, 0xad, 0x71, 0x6d, 0xa0, 0xcb, 0x44, 0x61, + 0x13, 0xc7, 0x72, 0x7a, 0x64, 0xb5, 0x8c, 0x3f, 0x8a, 0x0f, 0x81, 0x18, 0x9f, 0x98, + 0x00, 0x52, 0x33, 0xa8, 0x13, 0x66, 0xae, 0xe7, 0x3c, 0xec, 0x85, 0x22, 0x8e, 0xbc, + 0xfd, 0x5e, 0xe3, 0xc3, 0xfb, 0x44, 0xdb, 0x76, 0xba, 0x24, 0x3f, 0x28, 0x42, 0xb7, + 0xb5, 0xfc, 0x74, 0x6a, 0xe5, 0x1b, 0x0b, 0xc4, 0xbd, 0x4f, 0xc9, 0xfd, 0x83, 0x35, + 0x65, 0xea, 0x85, 0x2b, 0x92, 0xb2, 0x24, 0xf6, 0x99, 0x03, 0x18, 0xad, 0x8c, 0x7d, + 0x94, 0x37, 0xe2, 0x0e, 0x2a, 0x1f, 0x20, 0xe8, 0x18, 0xf9, 0x05, 0x7c, 0x5a, 0xba, + 0xaa, 0x2e, 0x5c, 0x15, 0xb9, 0x49, 0x45, 0xcd, 0x42, 0x4c, 0x28, 0xa5, 0xfa, 0x38, + 0x5d, 0xad, 0xfe, 0x49, 0x07, 0xb2, 0x74, 0xd8, 0x42, 0x70, 0x7d, 0xb3, 0x69, 0x7a, + 0x5a, 0xe6, 0xc8, 0xf5, 0x42, 0xe5, 0xec, 0xc0, 0x7f, 0xe4, 0x73, 0x50, 0xd1, 0x01, + 0x46, 0x70, 0x21, 0x2e, 0xfe, 0x81, 0xfb, 0x7c, 0x73, 0xe8, 0x45, 0x0d, 0xf8, 0x14, + 0xef, 0x62, 0x32, 0xf7, 0x49, 0x0f, 0x63, 0xcc, 0xf0, 0x74, 0x80, 0xf8, 0x84, 0xa6, + 0x6e, 0xaf, 0xfc, 0x28, 0xfe, 0xa4, 0x48, 0xd7, 0xb4, 0x01, 0xcd, 0xae, 0x10, 0xe7, + 0xc0, 0xc7, 0xf9, 0xa7, 0xb1, 0x53, 0x31, 0x96, 0x9f, 0xc8, 0xcb, 0x36, 0x39, 0x67, + 0x73, 0xde, 0x19, 0x19, 0x31, 0xc7, 0x50, 0xf6, 0xce, 0x5c, 0xaa, 0xf2, 0x97, 0x68, + 0xeb, 0xb2, 0x7d, 0xac, 0xc7, 0x38, 0x05, 0x6a, 0x81, 0x25, 0xb4, 0x77, 0x2b, 0xf8, + 0x7a, 0xe1, 0x0a, 0x8a, 0x30, 0x9b, 0x9b, 0xd6, 0x55, 0x04, 0x3c, 0xfc, 0x31, 0x59, + 0x49, 0x43, 0x68, 0xc5, 0xab, 0x8c, 0xad, 0xb7, 0xf6, 0x71, 0xe9, 0x62, 0x6b, 0xd2, + 0x63, 0xe3, 0x11, 0x81, 0xa6, 0x04, 0xb5, 0x06, 0xa0, 0x3b, 0x43, 0x9a, 0x7f, 0xfe, + 0x43, 0x55, 0x89, 0x24, 0x77, 0xe2, 0xbd, 0xf3, 0x38, 0xc6, 0x2c, 0x39, 0x22, 0xf7, + 0xd3, 0xc9, 0xa5, 0x6c, 0x71, 0x03, 0xd9, 0x11, 0x94, 0x8a, 0x84, 0xb5, 0xae, 0x2d, + 0xbb, 0x16, 0xa3, 0x76, 0x1a, 0xdd, 0x05, 0x3a, 0x0f, 0x96, 0x7e, 0x6b, 0x5b, 0xc9, + 0x42, 0x11, 0xb6, 0x54, 0x71, 0x53, 0x26, 0x7c, 0x6e, 0xe1, 0xca, 0xd0, 0xd9, 0x74, + 0xa7, 0x10, 0x88, 0x58, 0x37, 0x35, 0xe4, 0xf6, 0x3d, 0x33, 0x15, 0x6d, 0xad, 0xd5, + 0x4c, 0x2f, 0xaf, 0x89, 0x11, 0x4a, 0x12, 0x7b, 0x97, 0xb9, 0x4c, 0xc2, 0xa2, 0x2e, + 0xf3, 0x03, 0xf4, 0x59, 0xd0, 0x4f, 0xc0, 0xb5, 0x3a, 0xce, 0x59, 0x18, 0xd4, 0x7f, + 0xf3, 0x3a, 0x55, 0x8b, 0xd7, 0x1a, 0x75, 0xf3, 0x55, 0xfb, 0xd0, 0x6b, 0xbc, 0xcf, + 0x4e, 0x02, 0xc3, 0xc0, 0xa4, 0xb6, 0x3d, 0x0c, 0xc9, 0x49, 0x80, 0x1d, 0x63, 0xa6, + 0x4c, 0xb2, 0xd3, 0x23, 0x73, 0xb2, 0xc7, 0xb2, 0x74, 0xab, 0x2d, 0xb4, 0x68, 0x21, + 0x42, 0xc8, 0xb2, 0x1d, 0x84, 0xc4, 0x81, 0xf5, 0xef, 0x21, 0xe4, 0xb5, 0xe3, 0x60, + 0x34, 0x51, 0xbf, 0x94, 0x77, 0x4d, 0x0e, 0xf4, 0x7f, 0x63, 0xfa, 0x6a, 0xbb, 0x78, + 0xd2, 0x1c, 0x19, 0x3c, 0xbe, 0x65, 0xb6, 0x95, 0xfe, 0x67, 0x42, 0x3c, 0x1e, 0x2d, + 0x31, 0x2e, 0x27, 0x76, 0xfa, 0x24, 0xec, 0xe8, 0x46, 0x83, 0xe7, 0x48, 0x76, 0xc5, + 0x5e, 0xa0, 0x36, 0x9e, 0x4e, 0xa0, 0xe8, 0x64, 0x94, 0xe0, 0x0d, 0xde, 0x23, 0x6a, + 0x16, 0x89, 0x73, 0x1f, 0x0a, 0x5d, 0x82, 0x03, 0xaf, 0xde, 0x5c, 0x42, 0x36, 0x40, + 0xb8, 0x1e, 0x4f, 0x63, 0x1c, 0x98, 0x1c, 0x03, 0x83, 0x9f, 0x4b, 0x44, 0xc9, 0xe8, + 0x03, 0x00, 0x23, 0xf8, 0xb9, 0xd8, 0x17, 0x85, 0x60, 0xda, 0xf9, 0x75, 0x11, 0x19, + 0x55, 0xa2, 0xbc, 0xa3, 0x42, 0x3e, 0xee, 0xfc, 0x52, 0x7b, 0xe3, 0xa8, 0x54, 0x3e, + 0xb9, 0x0a, 0x5e, 0xc0, 0x2f, 0x35, 0xc7, 0xc6, 0x4b, 0x7d, 0xd5, 0x9a, 0x72, 0xda, + 0x00, 0x74, 0x63, 0x4e, 0x01, 0xd2, 0xab, 0xf3, 0x63, 0x7a, 0xdd, 0x77, 0xc7, 0x35, + 0x0f, 0x12, 0xb0, 0x11, 0xb2, 0x94, 0x16, 0x8e, 0xc7, 0x55, 0x76, 0xe4, 0x7d, 0x16, + 0x9e, 0x39, 0x38, 0xbf, 0x6a, 0xe2, 0xaa, 0x8f, 0xf7, 0xcf, 0xba, 0x7c, 0xac, 0xb1, + 0xf9, 0x2b, 0x6e, 0x4c, 0x24, 0x97, 0xbf, 0xfa, 0x9f, 0x17, 0xca, 0xd2, 0x42, 0xfa, + 0x9c, 0x31, 0x79, 0xc1, 0xa3, 0xaa, 0x81, 0xf7, 0x36, 0x16, 0x49, 0x57, 0x2c, 0x71, + 0x5c, 0x25, 0xa1, 0xf6, 0xcd, 0x5a, 0xce, 0x82, 0xc0, 0x0a, 0xb2, 0x34, 0x2b, 0x9c, + 0x3c, 0xb4, 0xff, 0xfd, 0xda, 0x16, 0x0c, 0xa5, 0xab, 0x9e, 0x9b, 0xaf, 0x21, 0x39, + 0xef, 0x9a, 0xfb, 0xe1, 0xb1, 0xf3, 0x09, 0x46, 0x2a, 0xfc, 0xe4, 0x62, 0xa7, 0x9b, + 0xb9, 0x69, 0x8e, 0x22, 0xc9, 0x57, 0xc5, 0x90, 0xa7, 0x53, 0xa7, 0x6b, 0x87, 0xe0, + 0x09, 0x12, 0x1e, 0x06, 0xf6, 0xa1, 0xbf, 0x62, 0xa0, 0x8b, 0xf4, 0x35, 0xd9, 0x2e, + 0x2f, 0xff, 0xe8, 0x6e, 0x2a, 0x9c, 0xbb, 0xa9, 0x13, 0x3a, 0x68, 0xe4, 0xae, 0xbf, + 0x33, 0xc3, 0x84, 0x36, 0xf2, 0x54, 0x5f, 0xc2, 0xd5, 0x28, 0x32, 0xd1, 0x65, 0xaf, + 0x41, 0x5b, 0x24, 0x4a, 0xdc, 0x5f, 0x57, 0x37, 0x7d, 0xee, 0xdf, 0x46, 0x0a, 0xa3, + 0xbe, 0xb4, 0x34, 0x19, 0xc6, 0xb0, 0x82, 0xe8, 0x35, 0xce, 0xe2, 0xf1, 0x6f, 0x2f, + 0x87, 0x67, 0xf0, 0x3d, 0x9f, 0x42, 0xa8, 0x4a, 0x76, 0xcb, 0x68, 0x67, 0xb2, 0xbc, + 0x75, 0xba, 0xee, 0xcc, 0xaf, 0xe6, 0x15, 0x19, 0xcf, 0xce, 0xac, 0x55, 0x27, 0x96, + 0x1b, 0x32, 0x4d, 0xce, 0x09, 0x33, 0x5a, 0x58, 0x53, 0xa6, 0xb4, 0xda, 0x3e, 0x47, + 0x1f, 0xc1, 0xfb, 0x19, 0x6f, 0x76, 0xd9, 0xb8, 0x79, 0xc7, 0x20, 0x08, 0x62, 0xea, + 0xd1, 0x8d, 0xea, 0x1f, 0x3e, 0xc9, 0x03, 0x7f, 0x37, 0xb6, 0xea, 0x28, 0x91, 0x66, + 0x51, 0x0b, 0x47, 0x5b, 0x20, 0x04, 0x4d, 0x45, 0x2e, 0x0f, 0x6e, 0xc3, 0xab, 0x47, + 0x16, 0x15, 0x07, 0xd5, 0x3a, 0x2d, 0xc6, 0x09, 0x49, 0xf1, 0xe4, 0x50, 0xc3, 0xea, + 0xda, 0xef, 0x88, 0x6e, 0x6b, 0x82, 0x7c, 0x5b, 0xb5, 0xef, 0x11, 0xf4, 0x02, 0x8a, + 0x70, 0x4f, 0xc5, 0xa9, 0x38, 0x2c, 0x6b, 0x03, 0xe7, 0xd8, 0x08, 0x1e, 0x07, 0x98, + 0x92, 0x86, 0xa0, 0xd9, 0xce, 0x56, 0x1f, 0xaa, 0x1b, 0x6e, 0x96, 0x23, 0xd7, 0xab, + 0x71, 0x00, 0x7f, 0xd2, 0x77, 0xb9, 0x86, 0xa0, 0x48, 0x83, 0x46, 0x02, 0xea, 0xf8, + 0x78, 0x0f, 0x06, 0x75, 0xba, 0xae, 0x68, 0x41, 0x5d, 0x3a, 0xf0, 0x10, 0x19, 0xb5, + 0xea, 0x48, 0x0d, 0xce, 0x93, 0x62, 0xec, 0x8d, 0x5d, 0xf3, 0xe7, 0x80, 0xff, 0xa7, + 0x2e, 0xba, 0x8a, 0x8d, 0xf7, 0x3c, 0x54, 0x08, 0x70, 0xa8, 0x39, 0xbb, 0x03, 0x91, + 0x0a, 0x49, 0x17, 0x70, 0xe1, 0xc8, 0x4b, 0x22, 0x3e, 0xe9, 0x16, 0x52, 0x70, 0xc4, + 0xcc, 0xf6, 0xfc, 0x70, 0x75, 0xc3, 0x7e, 0x6f, 0xbb, 0x14, 0x38, 0x15, 0x07, 0xfa, + 0x18, 0xf1, 0x39, 0x53, 0x33, 0x6a, 0xb2, 0xbe, 0xdc, 0x60, 0x0c, 0x61, 0x5b, 0xd4, + 0x99, 0x27, 0xe9, 0xd7, 0xf4, 0x88, 0x4e, 0x6e, 0xd3, 0xfd, 0x5e, 0x4b, 0x7c, 0x38, + ], + txid: [ + 0x5b, 0xb4, 0x4e, 0xbf, 0x80, 0x30, 0xac, 0x2f, 0xb7, 0x4d, 0x82, 0xb4, 0x32, 0xd4, + 0x80, 0x21, 0x8a, 0x3d, 0x16, 0x48, 0xe3, 0x27, 0x0b, 0x89, 0xff, 0xb3, 0xcf, 0x73, + 0x5c, 0x2c, 0xe7, 0xa0, + ], + auth_digest: [ + 0xb3, 0xd8, 0xef, 0x97, 0x5a, 0x6a, 0xfa, 0x72, 0x00, 0x92, 0x3c, 0x11, 0x60, 0xb7, + 0xeb, 0xcf, 0xce, 0x43, 0xb5, 0xb9, 0x1e, 0xe3, 0xb3, 0xdd, 0x91, 0x78, 0x49, 0x38, + 0xbf, 0xa6, 0x8e, 0xa6, + ], + amounts: vec![1399781968202734, 1999413718097392], + script_pubkeys: vec![ + vec![0x00, 0x53, 0x00], + vec![0x53, 0x51, 0x52, 0x52, 0x65, 0x52, 0x00, 0x53, 0x63], + ], + transparent_input: Some(1), + sighash_shielded: [ + 0xa8, 0x19, 0x23, 0x45, 0x81, 0x21, 0xcd, 0xb5, 0x64, 0x75, 0xf9, 0x6e, 0xd2, 0xd9, + 0x20, 0x80, 0xf5, 0x6e, 0xd3, 0x06, 0xe4, 0x1f, 0x45, 0x01, 0x2a, 0xf5, 0x7c, 0xfb, + 0x34, 0x8a, 0xcd, 0xa1, + ], + sighash_all: Some([ + 0x0b, 0x75, 0x2d, 0xe9, 0x48, 0x55, 0x2d, 0x11, 0x70, 0xc1, 0xc9, 0x38, 0x2d, 0xb1, + 0x4e, 0xb4, 0x6a, 0xda, 0x2d, 0xb1, 0x64, 0xda, 0x90, 0x14, 0x1a, 0x62, 0x6a, 0x03, + 0x5d, 0xf3, 0xb4, 0xd5, + ]), + sighash_none: Some([ + 0xef, 0x8a, 0xf0, 0x6f, 0x6a, 0xec, 0x49, 0x39, 0x4f, 0x46, 0x6d, 0xdd, 0x5a, 0x6c, + 0x11, 0x2f, 0x80, 0xde, 0xd7, 0x68, 0x7c, 0xa2, 0x1c, 0x10, 0x78, 0x2f, 0xda, 0x26, + 0x1b, 0xe5, 0xf6, 0x87, + ]), + sighash_single: Some([ + 0x9b, 0xa5, 0x4f, 0xf9, 0xf5, 0xda, 0x79, 0xfb, 0xa5, 0x1c, 0xdf, 0x48, 0x91, 0xc0, + 0x21, 0xd8, 0xdb, 0xe8, 0x88, 0xbf, 0x21, 0x5f, 0x7c, 0x2f, 0xd7, 0x9e, 0x43, 0xba, + 0x5d, 0xd1, 0xcc, 0x76, + ]), + sighash_all_anyone: Some([ + 0x22, 0x54, 0x83, 0x9a, 0x4e, 0xd2, 0x5a, 0x96, 0x54, 0x8d, 0xd8, 0x04, 0xdc, 0x33, + 0x38, 0x29, 0xba, 0xa4, 0xda, 0x26, 0x77, 0xe9, 0xc8, 0x3d, 0xf8, 0xab, 0x2d, 0x5a, + 0x57, 0xcd, 0x66, 0x6a, + ]), + sighash_none_anyone: Some([ + 0x14, 0x97, 0xbf, 0x31, 0xdf, 0x9b, 0x0f, 0x6e, 0x77, 0xe1, 0x17, 0x3a, 0x9e, 0xb4, + 0x08, 0xef, 0x5e, 0x19, 0xd8, 0x44, 0xaa, 0x9a, 0x85, 0xb6, 0xe7, 0x54, 0x6f, 0x30, + 0xde, 0x1f, 0x0b, 0xe2, ]), sighash_single_anyone: Some([ - 0x0b, 0xf0, 0x3e, 0x2c, 0xa5, 0x30, 0xf6, 0xac, 0x7d, 0xaa, 0xf4, 0xcc, 0x64, 0xf3, - 0xe0, 0x26, 0x9b, 0x5b, 0x0b, 0x3e, 0xd6, 0x66, 0xcf, 0x19, 0xe9, 0xd2, 0x6f, 0x63, - 0x19, 0x1e, 0x0a, 0xfb, + 0x39, 0xac, 0xb5, 0xfd, 0x91, 0xa1, 0x2d, 0xd4, 0x07, 0x36, 0xfc, 0x6a, 0xba, 0x53, + 0xfd, 0xf5, 0x2f, 0x05, 0x83, 0x80, 0x94, 0xc3, 0xaa, 0x6e, 0xf3, 0x45, 0xd9, 0x4a, + 0x1a, 0x07, 0x24, 0xbf, ]), }, ];