From 1e111ea9dbfb00e4f6731f29f3dfad477e1b52e0 Mon Sep 17 00:00:00 2001 From: James Wilson Date: Mon, 15 Apr 2024 15:20:11 +0100 Subject: [PATCH] Make subxt-core ready for publishing (#1508) * Move Extrinsic decoding things to subxt_core and various tidy-ups * A couple more fixes and fmt * first pass moving tx logic to subxt_core * cargo fmt * fix wasm example * clippy * more clippy * WIP Adding examples and such * Move storage functionality more fully to subxt_core and nice examples for storage and txs * Add example for events * consistify how addresses/payloads are exposed in subxt-core and add runtime API fns * Add runtime API core example * fmt * remove scale-info patch * Add a little to the top level docs * swap args around * clippy * cargo fmt and fix wasm-example * doc fixes * no-std-ise new subxt-core additions * alloc, not core * more no-std fixes * A couple more fixes * Add back extrinsic decode test --- Cargo.lock | 495 ++-- artifacts/demo_chain_specs/polkadot.json | 8 +- artifacts/polkadot_metadata_small.scale | Bin 59331 -> 59334 bytes artifacts/polkadot_metadata_tiny.scale | Bin 37597 -> 37597 bytes cli/src/commands/explore/pallets/calls.rs | 7 +- codegen/src/api/calls.rs | 4 +- codegen/src/api/constants.rs | 4 +- codegen/src/api/custom_values.rs | 4 +- codegen/src/api/runtime_apis.rs | 4 +- codegen/src/lib.rs | 9 + core/Cargo.toml | 4 + .../src/blocks/extrinsic_signed_extensions.rs | 169 ++ core/src/blocks/extrinsics.rs | 709 +++++ core/src/blocks/mod.rs | 106 +- core/src/blocks/static_extrinsic.rs | 23 + core/src/{client/mod.rs => client.rs} | 64 +- core/src/config/default_extrinsic_params.rs | 2 +- core/src/config/extrinsic_params.rs | 2 +- core/src/config/polkadot.rs | 2 +- core/src/config/refine_params.rs | 2 +- core/src/config/signed_extensions.rs | 16 +- core/src/config/substrate.rs | 2 +- .../{constant_address.rs => address.rs} | 8 +- core/src/constants/mod.rs | 71 +- .../{custom_value_address.rs => address.rs} | 24 +- core/src/custom_values/mod.rs | 70 +- core/src/dynamic.rs | 10 +- core/src/error.rs | 34 +- core/src/{events/mod.rs => events.rs} | 78 +- core/src/lib.rs | 26 +- core/src/macros.rs | 4 + core/src/metadata/decode_encode_traits.rs | 2 +- core/src/metadata/metadata_type.rs | 86 +- core/src/metadata/mod.rs | 30 +- core/src/runtime_api/mod.rs | 262 +- core/src/runtime_api/payload.rs | 188 ++ .../{storage_address.rs => address.rs} | 13 +- core/src/storage/mod.rs | 146 +- core/src/storage/storage_key.rs | 4 + core/src/storage/utils.rs | 84 +- core/src/tx/mod.rs | 410 ++- core/src/tx/payload.rs | 178 ++ core/src/tx/signer.rs | 2 +- core/src/utils/account_id.rs | 2 +- core/src/utils/bits.rs | 2 +- core/src/utils/era.rs | 2 +- core/src/utils/mod.rs | 9 +- core/src/utils/multi_address.rs | 2 +- core/src/utils/multi_signature.rs | 2 +- core/src/utils/static_type.rs | 2 +- core/src/utils/unchecked_extrinsic.rs | 2 +- core/src/utils/wrapper_opaque.rs | 2 +- examples/wasm-example/Cargo.lock | 553 ++-- examples/wasm-example/src/routes/signing.rs | 89 +- examples/wasm-example/src/services.rs | 4 +- signer/src/ecdsa.rs | 2 +- signer/src/sr25519.rs | 2 +- subxt/examples/setup_client_offline.rs | 5 +- subxt/examples/setup_config_custom.rs | 2 +- subxt/examples/storage_fetch.rs | 5 +- subxt/src/backend/legacy/mod.rs | 16 +- subxt/src/backend/unstable/mod.rs | 5 +- subxt/src/blocks/block_types.rs | 6 +- subxt/src/blocks/extrinsic_types.rs | 844 +----- subxt/src/blocks/mod.rs | 2 +- subxt/src/book/usage/runtime_apis.rs | 2 +- subxt/src/book/usage/storage.rs | 4 +- subxt/src/book/usage/transactions.rs | 2 +- subxt/src/client/offline_client.rs | 35 +- subxt/src/client/online_client.rs | 23 +- subxt/src/constants/constants_client.rs | 13 +- subxt/src/constants/mod.rs | 2 +- .../src/custom_values/custom_values_client.rs | 27 +- subxt/src/custom_values/mod.rs | 2 +- subxt/src/error/mod.rs | 29 +- subxt/src/events/events_client.rs | 2 +- subxt/src/events/mod.rs | 2 +- subxt/src/lib.rs | 2 +- subxt/src/runtime_api/mod.rs | 2 +- subxt/src/runtime_api/runtime_types.rs | 48 +- subxt/src/storage/mod.rs | 18 +- subxt/src/storage/storage_client.rs | 26 +- subxt/src/storage/storage_type.rs | 112 +- subxt/src/storage/utils.rs | 60 - subxt/src/tx/mod.rs | 19 +- subxt/src/tx/tx_client.rs | 209 +- .../src/full_client/client/unstable_rpcs.rs | 16 +- .../src/full_client/codegen/polkadot.rs | 2283 +++++++++-------- testing/ui-tests/src/correct/custom_values.rs | 7 +- 89 files changed, 4415 insertions(+), 3456 deletions(-) create mode 100644 core/src/blocks/extrinsic_signed_extensions.rs create mode 100644 core/src/blocks/extrinsics.rs create mode 100644 core/src/blocks/static_extrinsic.rs rename core/src/{client/mod.rs => client.rs} (50%) rename core/src/constants/{constant_address.rs => address.rs} (93%) rename core/src/custom_values/{custom_value_address.rs => address.rs} (73%) rename core/src/{events/mod.rs => events.rs} (91%) create mode 100644 core/src/runtime_api/payload.rs rename core/src/storage/{storage_address.rs => address.rs} (94%) create mode 100644 core/src/tx/payload.rs delete mode 100644 subxt/src/storage/utils.rs diff --git a/Cargo.lock b/Cargo.lock index 348f4d15eb..19bf353b9d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -59,9 +59,9 @@ dependencies = [ [[package]] name = "ahash" -version = "0.8.8" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42cd52102d3df161c77a887b608d7a4897d7cc112886a9537b738a887a03aaff" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", "getrandom", @@ -72,9 +72,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] @@ -117,9 +117,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.11" +version = "0.6.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e2e1ebcb11de5c03c67de28a7df593d32191b44939c482e97702baaaa6ab6a5" +checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb" dependencies = [ "anstyle", "anstyle-parse", @@ -165,9 +165,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.79" +version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" +checksum = "0952808a6c2afd1aa8947271f3a60f1a6763c7b912d210184c5149b5cf147247" [[package]] name = "ark-bls12-377" @@ -345,17 +345,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f28243a43d821d11341ab73c80bed182dc015c514b951616cf79bd4af39af0c3" dependencies = [ "concurrent-queue", - "event-listener 5.0.0", - "event-listener-strategy 0.5.0", + "event-listener 5.3.0", + "event-listener-strategy 0.5.1", "futures-core", "pin-project-lite", ] [[package]] name = "async-executor" -version = "1.8.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17ae5ebefcc48e7452b4987947920dac9450be1110cadf34d1b8c116bdbaf97c" +checksum = "5f98c37cf288e302c16ef6c8472aad1e034c6c84ce5ea7b8101c98eb4a802fee" dependencies = [ "async-lock 3.3.0", "async-task", @@ -378,9 +378,9 @@ dependencies = [ [[package]] name = "async-io" -version = "2.3.1" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f97ab0c5b00a7cdbe5a371b9a782ee7be1316095885c8a4ea1daf490eb0ef65" +checksum = "dcccb0f599cfa2f8ace422d3555572f47424da5648a4382a9dd0310ff8210884" dependencies = [ "async-lock 3.3.0", "cfg-if", @@ -389,7 +389,7 @@ dependencies = [ "futures-lite", "parking", "polling", - "rustix 0.38.31", + "rustix 0.38.32", "slab", "tracing", "windows-sys 0.52.0", @@ -428,19 +428,21 @@ dependencies = [ [[package]] name = "async-process" -version = "2.0.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15c1cd5d253ecac3d3cf15e390fd96bd92a13b1d14497d81abf077304794fb04" +checksum = "d999d925640d51b662b7b4e404224dd81de70f4aa4a199383c2c5e5b86885fa3" dependencies = [ "async-channel", "async-io", "async-lock 3.3.0", "async-signal", + "async-task", "blocking", "cfg-if", - "event-listener 4.0.3", + "event-listener 5.3.0", "futures-lite", - "rustix 0.38.31", + "rustix 0.38.32", + "tracing", "windows-sys 0.52.0", ] @@ -456,7 +458,7 @@ dependencies = [ "cfg-if", "futures-core", "futures-io", - "rustix 0.38.31", + "rustix 0.38.32", "signal-hook-registry", "slab", "windows-sys 0.48.0", @@ -476,7 +478,7 @@ checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.58", ] [[package]] @@ -504,15 +506,15 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" [[package]] name = "backtrace" -version = "0.3.69" +version = "0.3.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" dependencies = [ "addr2line 0.21.0", "cc", @@ -547,6 +549,12 @@ version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +[[package]] +name = "base64" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9475866fec1451be56a3c2400fd081ff546538961565ccb5b7142cbd22bc7a51" + [[package]] name = "base64ct" version = "1.6.0" @@ -643,9 +651,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.2" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" [[package]] name = "bitvec" @@ -737,9 +745,9 @@ dependencies = [ [[package]] name = "bs58" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5353f36341f7451062466f0b755b96ac3a9547e4d7f6b70d603fc721a7d7896" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" dependencies = [ "sha2 0.10.8", "tinyvec", @@ -747,9 +755,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.14.0" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "byte-slice-cast" @@ -765,9 +773,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.5.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" [[package]] name = "cast" @@ -777,12 +785,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.0.83" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" -dependencies = [ - "libc", -] +checksum = "2678b2e3449475e95b0aa6f9b506a28e61b3dc8996592b983695e8ebb58a8b41" [[package]] name = "cfg-if" @@ -809,14 +814,14 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.34" +version = "0.4.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bc015644b92d5890fab7489e49d21f879d5c990186827d42ec511919404f38b" +checksum = "8a0d04d43504c61aa6c7531f1871dd0d418d91130162063b789da00fd7057a5e" dependencies = [ "android-tzdata", "iana-time-zone", "num-traits", - "windows-targets 0.52.0", + "windows-targets 0.52.4", ] [[package]] @@ -870,9 +875,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.3" +version = "4.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "949626d00e063efc93b6dca932419ceb5432f99769911c0b995f7e884c778813" +checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0" dependencies = [ "clap_builder", "clap_derive", @@ -887,19 +892,19 @@ dependencies = [ "anstream", "anstyle", "clap_lex 0.7.0", - "strsim 0.11.0", + "strsim 0.11.1", ] [[package]] name = "clap_derive" -version = "4.5.3" +version = "4.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90239a040c80f5e14809ca132ddc4176ab33d5e17e49691793296e3fcb34d72f" +checksum = "528131438037fd55894f62d6e9f068b8f45ac57ffa77517819645d10aed04f64" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.58", ] [[package]] @@ -1203,7 +1208,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.58", ] [[package]] @@ -1251,7 +1256,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.10.0", - "syn 2.0.53", + "syn 2.0.58", ] [[package]] @@ -1273,14 +1278,14 @@ checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" dependencies = [ "darling_core 0.20.8", "quote", - "syn 2.0.53", + "syn 2.0.58", ] [[package]] name = "der" -version = "0.7.8" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" dependencies = [ "const-oid", "zeroize", @@ -1299,13 +1304,13 @@ dependencies = [ [[package]] name = "derive-syn-parse" -version = "0.1.5" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79116f119dd1dba1abf1f3405f03b9b0e79a27a3883864bfebded8a3dc768cd" +checksum = "d65d7ce8132b7c0e54497a4d9a55a1c2a0912a0d786cf894472ba818fba45762" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.58", ] [[package]] @@ -1316,7 +1321,7 @@ checksum = "62d671cc41a825ebabc75757b62d3d168c577f9149b2d49ece1dad1f72119d25" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.58", ] [[package]] @@ -1361,18 +1366,18 @@ dependencies = [ [[package]] name = "docify" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cc4fd38aaa9fb98ac70794c82a00360d1e165a87fbf96a8a91f9dfc602aaee2" +checksum = "43a2f138ad521dc4a2ced1a4576148a6a610b4c5923933b062a263130a6802ce" dependencies = [ "docify_macros", ] [[package]] name = "docify_macros" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63fa215f3a0d40fb2a221b3aa90d8e1fbb8379785a990cb60d62ac71ebdc6460" +checksum = "1a081e51fb188742f5a7a1164ad752121abcb22874b21e2c3b0dd040c515fdad" dependencies = [ "common-path", "derive-syn-parse", @@ -1380,7 +1385,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.53", + "syn 2.0.58", "termcolor", "toml", "walkdir", @@ -1388,9 +1393,9 @@ dependencies = [ [[package]] name = "downcast-rs" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" [[package]] name = "dyn-clonable" @@ -1415,9 +1420,9 @@ dependencies = [ [[package]] name = "dyn-clone" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "545b22097d44f8a9581187cdf93de7a71e4722bf51200cfaba810865b49a495d" +checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" [[package]] name = "ecdsa" @@ -1554,9 +1559,9 @@ dependencies = [ [[package]] name = "event-listener" -version = "5.0.0" +version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b72557800024fabbaa2449dd4bf24e37b93702d457a4d4f2b0dd1f0f039f20c1" +checksum = "6d9944b8ca13534cdfb2800775f8dd4902ff3fc75a50101466decadfdf322a24" dependencies = [ "concurrent-queue", "parking", @@ -1575,25 +1580,26 @@ dependencies = [ [[package]] name = "event-listener-strategy" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "feedafcaa9b749175d5ac357452a9d41ea2911da598fde46ce1fe02c37751291" +checksum = "332f51cb23d20b0de8458b86580878211da09bcd4503cb579c225b3d124cabb3" dependencies = [ - "event-listener 5.0.0", + "event-listener 5.3.0", "pin-project-lite", ] [[package]] name = "expander" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f86a749cf851891866c10515ef6c299b5c69661465e9c3bbe7e07a2b77fb0f7" +checksum = "00e83c02035136f1592a47964ea60c05a50e4ed8b5892cfac197063850898d4d" dependencies = [ "blake2", "fs-err", + "prettier-please", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.58", ] [[package]] @@ -1614,9 +1620,9 @@ checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" [[package]] name = "fastrand" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984" [[package]] name = "ff" @@ -1630,9 +1636,9 @@ dependencies = [ [[package]] name = "fiat-crypto" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1676f435fc1dadde4d03e43f5d62b259e1ce5f40bd4ffb21db2b42ebe59c1382" +checksum = "c007b1ae3abe1cb6f85a16305acd418b7ca6343b953633fee2b76d8f108b830f" [[package]] name = "fixed-hash" @@ -1750,9 +1756,9 @@ checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" [[package]] name = "futures-lite" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445ba825b27408685aaecefd65178908c36c6e96aaf6d8599419d46e624192ba" +checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" dependencies = [ "fastrand", "futures-core", @@ -1769,7 +1775,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.58", ] [[package]] @@ -1834,9 +1840,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.12" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" +checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" dependencies = [ "cfg-if", "js-sys", @@ -1953,7 +1959,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap 2.2.3", + "indexmap 2.2.6", "slab", "tokio", "tokio-util", @@ -1962,9 +1968,9 @@ dependencies = [ [[package]] name = "half" -version = "2.3.1" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc52e53916c08643f1b56ec082790d1e86a32e58dc5268f897f313fbae7b4872" +checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" dependencies = [ "cfg-if", "crunchy", @@ -2000,7 +2006,7 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" dependencies = [ - "ahash 0.8.8", + "ahash 0.8.11", ] [[package]] @@ -2009,7 +2015,7 @@ version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" dependencies = [ - "ahash 0.8.8", + "ahash 0.8.11", "allocator-api2", "serde", ] @@ -2037,9 +2043,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.3.6" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd5256b483761cd23699d0da46cc6fd2ee3be420bbe6d020ae4a091e70b7e9fd" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] name = "hex" @@ -2100,9 +2106,9 @@ dependencies = [ [[package]] name = "http" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" dependencies = [ "bytes", "fnv", @@ -2259,9 +2265,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.2.3" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" dependencies = [ "equivalent", "hashbrown 0.14.3", @@ -2329,7 +2335,7 @@ dependencies = [ "subxt-metadata", "subxt-signer", "subxt-test-macro", - "syn 2.0.53", + "syn 2.0.58", "test-runtime", "tokio", "tracing", @@ -2343,7 +2349,7 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" dependencies = [ - "hermit-abi 0.3.6", + "hermit-abi 0.3.9", "libc", "windows-sys 0.48.0", ] @@ -2368,9 +2374,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "js-sys" @@ -2610,15 +2616,15 @@ dependencies = [ [[package]] name = "log" -version = "0.4.20" +version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" [[package]] name = "lru" -version = "0.12.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2c024b41519440580066ba82aab04092b333e09066a5eb86c7c4890df31f22" +checksum = "d3262e75e648fce39813cb56ac41f3c3e3f65217ebf3844d818d1f9398cfb0dc" dependencies = [ "hashbrown 0.14.3", ] @@ -2643,9 +2649,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.1" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" +checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" [[package]] name = "memfd" @@ -2653,7 +2659,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2cffa4ad52c6f791f4f8b15f0c05f9824b2ced1160e88cc393d64fff9a8ac64" dependencies = [ - "rustix 0.38.31", + "rustix 0.38.32", ] [[package]] @@ -2808,7 +2814,7 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.3.6", + "hermit-abi 0.3.9", "libc", ] @@ -2847,9 +2853,9 @@ checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" [[package]] name = "opaque-debug" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] name = "openssl-probe" @@ -3000,14 +3006,14 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.58", ] [[package]] name = "pin-project-lite" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" [[package]] name = "pin-utils" @@ -3038,9 +3044,9 @@ dependencies = [ [[package]] name = "platforms" -version = "3.3.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "626dec3cac7cc0e1577a2ec3fc496277ec2baa084bebad95bb6fdbfae235f84c" +checksum = "db23d408679286588f4d4644f965003d056e3dd5abcaaa938116871d7ce2fee7" [[package]] name = "plotters" @@ -3109,7 +3115,7 @@ dependencies = [ "polkavm-common 0.8.0", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.58", ] [[package]] @@ -3121,7 +3127,7 @@ dependencies = [ "polkavm-common 0.9.0", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.58", ] [[package]] @@ -3131,7 +3137,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "15e85319a0d5129dc9f021c62607e0804f5fb777a05cdda44d750ac0732def66" dependencies = [ "polkavm-derive-impl 0.8.0", - "syn 2.0.53", + "syn 2.0.58", ] [[package]] @@ -3141,19 +3147,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ba81f7b5faac81e528eb6158a6f3c9e0bb1008e0ffa19653bc8dea925ecb429" dependencies = [ "polkavm-derive-impl 0.9.0", - "syn 2.0.53", + "syn 2.0.58", ] [[package]] name = "polling" -version = "3.4.0" +version = "3.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30054e72317ab98eddd8561db0f6524df3367636884b7b21b703e4b280a84a14" +checksum = "e0c976a60b2d7e99d6f229e414670a9b85d13ac305cc6d1e9c134de58c5aaaf6" dependencies = [ "cfg-if", "concurrent-queue", + "hermit-abi 0.3.9", "pin-project-lite", - "rustix 0.38.31", + "rustix 0.38.32", "tracing", "windows-sys 0.52.0", ] @@ -3175,6 +3182,16 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +[[package]] +name = "prettier-please" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22020dfcf177fcc7bf5deaf7440af371400c67c0de14c399938d8ed4fb4645d3" +dependencies = [ + "proc-macro2", + "syn 2.0.58", +] + [[package]] name = "pretty_assertions" version = "1.4.0" @@ -3356,9 +3373,9 @@ dependencies = [ [[package]] name = "rayon" -version = "1.8.1" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7237101a77a10773db45d62004a272517633fbcc3df19d96455ede1122e051" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" dependencies = [ "either", "rayon-core", @@ -3416,7 +3433,7 @@ checksum = "5fddb4f8d99b0a2ebafc65a87a69a7b9875e4b1ae1f00db265d300ef7f28bccc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.58", ] [[package]] @@ -3427,8 +3444,8 @@ checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.5", - "regex-syntax 0.8.2", + "regex-automata 0.4.6", + "regex-syntax 0.8.3", ] [[package]] @@ -3442,13 +3459,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" +checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.2", + "regex-syntax 0.8.3", ] [[package]] @@ -3459,9 +3476,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" [[package]] name = "rfc6979" @@ -3475,16 +3492,17 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.7" +version = "0.17.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", + "cfg-if", "getrandom", "libc", "spin", "untrusted", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -3539,11 +3557,11 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.31" +version = "0.38.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" +checksum = "65e04861e65f21776e67888bfbea442b3642beaa0138fdb1dd7a84a52dffdb89" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.5.0", "errno", "libc", "linux-raw-sys 0.4.13", @@ -3564,9 +3582,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.22.2" +version = "0.22.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e87c9956bd9807afa1f77e0f7594af32566e830e088a5576d27c5b6f30f49d41" +checksum = "99008d7ad0bbbea527ec27bddbc0e432c5b87d8175178cee68d2eec9c4a1813c" dependencies = [ "log", "ring", @@ -3595,7 +3613,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792" dependencies = [ "openssl-probe", - "rustls-pemfile 2.0.0", + "rustls-pemfile 2.1.2", "rustls-pki-types", "schannel", "security-framework", @@ -3612,19 +3630,19 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "2.0.0" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35e4980fa29e4c4b212ffb3db068a564cbf560e51d3944b7c88bd8bf5bec64f4" +checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" dependencies = [ - "base64 0.21.7", + "base64 0.22.0", "rustls-pki-types", ] [[package]] name = "rustls-pki-types" -version = "1.3.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "048a63e5b3ac996d78d402940b5fa47973d2d080c6c6fffa1d0f19c4445310b7" +checksum = "ecd36cc4259e3e4514335c4a138c6b43171a8d61d8f5c9348f9fc7529416f247" [[package]] name = "rustls-webpki" @@ -3649,9 +3667,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" +checksum = "80af6f9131f277a45a3fba6ce8e2258037bb0477a67e610d3c1fe046ab31de47" [[package]] name = "rusty-fork" @@ -3678,9 +3696,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" [[package]] name = "same-file" @@ -3760,9 +3778,9 @@ dependencies = [ [[package]] name = "scale-info" -version = "2.11.1" +version = "2.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "788745a868b0e751750388f4e6546eb921ef714a4317fa6954f7cde114eb2eb7" +checksum = "7c453e59a955f81fb62ee5d596b450383d699f152d350e9d23a0db2adb78e4c0" dependencies = [ "bitvec", "cfg-if", @@ -3774,9 +3792,9 @@ dependencies = [ [[package]] name = "scale-info-derive" -version = "2.11.1" +version = "2.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dc2f4e8bc344b9fc3d5f74f72c2e55bfc38d28dc2ebc69c194a3df424e4d9ac" +checksum = "18cf6c6447f813ef19eb450e985bcce6705f9ce7660db221b59093d15c79c4b7" dependencies = [ "proc-macro-crate 1.3.1", "proc-macro2", @@ -3804,7 +3822,7 @@ dependencies = [ "quote", "scale-info", "smallvec", - "syn 2.0.53", + "syn 2.0.58", "thiserror", ] @@ -3862,7 +3880,7 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "772575a524feeb803e5b0fcbc6dd9f367e579488197c94c6e4023aad2305774d" dependencies = [ - "ahash 0.8.8", + "ahash 0.8.11", "cfg-if", "hashbrown 0.13.2", ] @@ -3946,9 +3964,9 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.9.2" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" +checksum = "770452e37cad93e0a50d5abc3990d2bc351c36d0328f86cefec2f2fb206eaef6" dependencies = [ "bitflags 1.3.2", "core-foundation", @@ -3959,9 +3977,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.9.1" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" +checksum = "41f3cc463c0ef97e11c3461a9d3787412d30e8e7eb907c79180c4a57bf7c04ef" dependencies = [ "core-foundation-sys", "libc", @@ -3969,9 +3987,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.21" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" +checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" [[package]] name = "send_wrapper" @@ -4011,14 +4029,14 @@ checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.58", ] [[package]] name = "serde_json" -version = "1.0.114" +version = "1.0.115" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" +checksum = "12dc5c46daa8e9fdf4f5e71b6cf9a53f2487da0e86e55808e2d35539666497dd" dependencies = [ "itoa", "ryu", @@ -4127,9 +4145,9 @@ checksum = "620a1d43d70e142b1d46a929af51d44f383db9c7a2ec122de2cd992ccfcf3c18" [[package]] name = "siphasher" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54ac45299ccbd390721be55b412d41931911f654fa99e2cb8bfb57184b2061fe" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" [[package]] name = "slab" @@ -4142,9 +4160,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.13.1" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "smol" @@ -4256,12 +4274,12 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.5" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" dependencies = [ "libc", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -4377,7 +4395,7 @@ checksum = "48d09fa0a5f7299fb81ee25ae3853d26200f7a348148aed6de76be905c007dbe" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.58", ] [[package]] @@ -4509,7 +4527,7 @@ dependencies = [ "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.58", ] [[package]] @@ -4573,7 +4591,7 @@ version = "32.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1aa91ad26c62b93d73e65f9ce7ebd04459c4bad086599348846a81988d6faa4" dependencies = [ - "ahash 0.8.8", + "ahash 0.8.11", "hash-db", "lazy_static", "memory-db", @@ -4640,9 +4658,9 @@ dependencies = [ [[package]] name = "ss58-registry" -version = "1.46.0" +version = "1.47.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1114ee5900b8569bbc8b1a014a942f937b752af4b44f4607430b5f86cedaac0" +checksum = "4743ce898933fbff7bbf414f497c459a782d496269644b3d650a398ae6a487ba" dependencies = [ "Inflector", "num-format", @@ -4682,9 +4700,9 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "strsim" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "strum" @@ -4778,7 +4796,7 @@ dependencies = [ name = "subxt-cli" version = "0.35.0" dependencies = [ - "clap 4.5.3", + "clap 4.5.4", "color-eyre", "frame-metadata 16.0.0", "heck 0.5.0", @@ -4798,7 +4816,7 @@ dependencies = [ "subxt", "subxt-codegen", "subxt-metadata", - "syn 2.0.53", + "syn 2.0.58", "thiserror", "tokio", ] @@ -4818,7 +4836,7 @@ dependencies = [ "scale-info", "scale-typegen", "subxt-metadata", - "syn 2.0.53", + "syn 2.0.58", "thiserror", "tokio", ] @@ -4827,6 +4845,7 @@ dependencies = [ name = "subxt-core" version = "0.35.0" dependencies = [ + "assert_matches", "base58", "bitvec", "blake2", @@ -4849,7 +4868,9 @@ dependencies = [ "sp-crypto-hashing", "sp-keyring", "sp-runtime", + "subxt-macro", "subxt-metadata", + "subxt-signer", "tracing", ] @@ -4888,7 +4909,7 @@ dependencies = [ "quote", "scale-typegen", "subxt-codegen", - "syn 2.0.53", + "syn 2.0.58", ] [[package]] @@ -4939,7 +4960,7 @@ name = "subxt-test-macro" version = "0.35.0" dependencies = [ "quote", - "syn 2.0.53", + "syn 2.0.58", ] [[package]] @@ -4955,9 +4976,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.53" +version = "2.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7383cd0e49fff4b6b90ca5670bfd3e9d6a733b3f90c686605aa7eec8c4996032" +checksum = "44cfb93f38070beee36b3fef7d4f5a16f27751d94b187b666a5cc5e9b0d30687" dependencies = [ "proc-macro2", "quote", @@ -4972,9 +4993,9 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "target-lexicon" -version = "0.12.13" +version = "0.12.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69758bda2e78f098e4ccb393021a0963bb3442eac05f135c30f61b7370bbafae" +checksum = "e1fc403891a21bcfb7c37834ba66a547a8f402146eba7265b5a6d88059c9ff2f" [[package]] name = "tempfile" @@ -5015,9 +5036,9 @@ dependencies = [ [[package]] name = "textwrap" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" +checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" [[package]] name = "thiserror" @@ -5036,14 +5057,14 @@ checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.58", ] [[package]] name = "thread_local" -version = "1.1.7" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" dependencies = [ "cfg-if", "once_cell", @@ -5108,7 +5129,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.58", ] [[package]] @@ -5138,7 +5159,7 @@ version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" dependencies = [ - "rustls 0.22.2", + "rustls 0.22.3", "rustls-pki-types", "tokio", ] @@ -5171,14 +5192,14 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.10" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a9aad4a3066010876e8dcf5a8a06e70a558751117a145c6ce2b82c2e2054290" +checksum = "e9dd1545e8208b4a5af1aa9bbd0b4cf7e9ea08fabc5d0a5c67fcaafa17433aa3" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.22.5", + "toml_edit 0.22.9", ] [[package]] @@ -5196,7 +5217,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.2.3", + "indexmap 2.2.6", "toml_datetime", "winnow 0.5.40", ] @@ -5207,7 +5228,7 @@ version = "0.20.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" dependencies = [ - "indexmap 2.2.3", + "indexmap 2.2.6", "toml_datetime", "winnow 0.5.40", ] @@ -5218,22 +5239,22 @@ version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" dependencies = [ - "indexmap 2.2.3", + "indexmap 2.2.6", "toml_datetime", "winnow 0.5.40", ] [[package]] name = "toml_edit" -version = "0.22.5" +version = "0.22.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99e68c159e8f5ba8a28c4eb7b0c0c190d77bb479047ca713270048145a9ad28a" +checksum = "8e40bb779c5187258fd7aad0eb68cb8706a0a81fa712fbea808ab43c4b8374c4" dependencies = [ - "indexmap 2.2.3", + "indexmap 2.2.6", "serde", "serde_spanned", "toml_datetime", - "winnow 0.6.1", + "winnow 0.6.5", ] [[package]] @@ -5283,7 +5304,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.58", ] [[package]] @@ -5617,9 +5638,9 @@ dependencies = [ [[package]] name = "walkdir" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" dependencies = [ "same-file", "winapi-util", @@ -5661,7 +5682,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.58", "wasm-bindgen-shared", ] @@ -5695,7 +5716,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.58", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5907,7 +5928,7 @@ dependencies = [ "either", "home", "once_cell", - "rustix 0.38.31", + "rustix 0.38.32", "windows-sys 0.48.0", ] @@ -5948,7 +5969,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.4", ] [[package]] @@ -5975,7 +5996,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.4", ] [[package]] @@ -6010,17 +6031,17 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" dependencies = [ - "windows_aarch64_gnullvm 0.52.0", - "windows_aarch64_msvc 0.52.0", - "windows_i686_gnu 0.52.0", - "windows_i686_msvc 0.52.0", - "windows_x86_64_gnu 0.52.0", - "windows_x86_64_gnullvm 0.52.0", - "windows_x86_64_msvc 0.52.0", + "windows_aarch64_gnullvm 0.52.4", + "windows_aarch64_msvc 0.52.4", + "windows_i686_gnu 0.52.4", + "windows_i686_msvc 0.52.4", + "windows_x86_64_gnu 0.52.4", + "windows_x86_64_gnullvm 0.52.4", + "windows_x86_64_msvc 0.52.4", ] [[package]] @@ -6037,9 +6058,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" +checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" [[package]] name = "windows_aarch64_msvc" @@ -6055,9 +6076,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" +checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" [[package]] name = "windows_i686_gnu" @@ -6073,9 +6094,9 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" +checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" [[package]] name = "windows_i686_msvc" @@ -6091,9 +6112,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" +checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" [[package]] name = "windows_x86_64_gnu" @@ -6109,9 +6130,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" +checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" [[package]] name = "windows_x86_64_gnullvm" @@ -6127,9 +6148,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" +checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" [[package]] name = "windows_x86_64_msvc" @@ -6145,9 +6166,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" +checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" [[package]] name = "winnow" @@ -6160,9 +6181,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.6.1" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d90f4e0f530c4c69f62b80d839e9ef3855edc9cba471a160c4d692deed62b401" +checksum = "dffa400e67ed5a4dd237983829e66475f0a4a26938c4b04c21baede6262215b8" dependencies = [ "memchr", ] @@ -6217,7 +6238,7 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.58", ] [[package]] @@ -6237,5 +6258,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.58", ] diff --git a/artifacts/demo_chain_specs/polkadot.json b/artifacts/demo_chain_specs/polkadot.json index e3ebd6b34a..9fb30fb369 100644 --- a/artifacts/demo_chain_specs/polkadot.json +++ b/artifacts/demo_chain_specs/polkadot.json @@ -43,10 +43,10 @@ }, "id": "polkadot", "lightSyncState": { - "babeEpochChanges": "0x04123ae85881861156a074a07110a5f59142b0b762ac89422d0a601116ee1e8c49721f320101d369001100000000337300110000000004efc8cb869ae5714a4f4f590372f3a9a76d748e084658d023958a3a549d616486cb283201013373001100000000937c00110000000004100d6ae96c2f95f1bcfbedfa0dd48a4b97a6ffee38103c65d55cc8e7d609125f1a32320101937c001100000000f38500110000000000000c100d6ae96c2f95f1bcfbedfa0dd48a4b97a6ffee38103c65d55cc8e7d609125f1a32320101d020000000000000937c0011000000006009000000000000a50432904ec260963195582a1d339f9fbd2d5d76f551160105c922423cad0d94482f010000000000000076441c448aefcf40a72128edc9b44a4f7ef9c267c503e98f5f9c72d5e9e92f000100000000000000526e055ade4ac425e9b5f93ce4394601335d3599a5b742603126d78ce99a4a540100000000000000d0e8ddfdeacd8e163b01ca4da1a4e856312b0de412b492247070f2721f7d803801000000000000008008c1b7061a2402634fc15d3849e2913863beb9f55024bc8cc7fa7d6e397817010000000000000024a51a9bdb67213626d1b52bd8dbc0e9b94ea88ea417aa17b56212d1cea3e1780100000000000000488d520146f681678e9d229f5e29354edf65e521246b28a4175c0502e060b9200100000000000000da663fef002e63d5de9676a1a930abe7b0d8088657d67a3f24076bce08c661490100000000000000a86e2248480b1f6ad903a965344ecef69838aae812ba3c39d3d9eaae22963f2a01000000000000004ceef9b2b8e3b5cd971f7557c3a3ad02c9c7a7bbc7365c2db5622fa74853790d0100000000000000f03555628bc649cebf75046ab9663faa1a5421df323f99c82782b7a3d162ce080100000000000000aca7a86b6fcf25daa7f0767bfe36b284f3100dc1ee4dcc971fbb3244bb57221c0100000000000000ba395fcb33327501109ed40712c7a372d25bf3339edfabe2a1964fb7b5d4d82401000000000000009cb389c209afbebda2b12113e0266b3d30f46e2a91aaf4451c193d640288357101000000000000004c9886e2e62ee92a6778d6a7928052732044b64fa61969cd8e37f3f7e3406f7201000000000000005237e4509f24bc9e8bf9bfd78b594219d86853ae16601f692f10c9b16b88f83b01000000000000006869737a2873891c0e4ef80a69e331f64ffc3663c9f3cdf86b440bb41827a252010000000000000098192016f83ef2fe74dba1ecc6526efc61b79f3177c00dc7c053160391858f70010000000000000078c35105ea4cd9d6ea0ba91b2c19e78f60931bef5918c1bd2e14259229e7c330010000000000000006d2846642c835b0fb1ff1ef908449376aa8e7c0f3352e55da9a1e97e9528b230100000000000000f8a681118ea0bb9dfde2813ce5144eeb5cee881c27883de1c0c759255ec326540100000000000000ac8b2b59f77eb5f3725961767878166a3817747018f18cf48c933e284320b90e010000000000000064838c162c251bc34c0f5a2696183fb518527d4681821dbc3ad53b004a8da7220100000000000000e67c524e443cda4cd27dfcce70488a5d23a93c8c46a5e83ef5a69eff3a02fa5a0100000000000000a42289d68c963358f3c450a850242bb53121e73e17f0e2ea2b93327446bea33c01000000000000006c50859d9dde209012eb3868c1a3a6e80ae8fa528ace9df68e92dbbae60368200100000000000000a8e470f2339e3ed0da456780dd9207e9c6a02459238ec3057a6ade01fd6cd60a01000000000000005c7f05d77f853f3eb8d4989fce36d0808b6d2b881e26f13c01e939b5d489a57d01000000000000002addf696d5a42b0a3dada689731e00c991db936909df869ac6600662abc35310010000000000000072ed7192625403acef94aa9189f9f179deb89e60478816ca96c79b742f757e750100000000000000b4ffe3c5959ff37c11c6f19d91926cb97aa4bf0f604919e1753bb55664d061680100000000000000bc4c9b5425f9a2aa09e3239332c702dedbfffa2b9f4cc1b978b307fc1fa1337c0100000000000000e07d5b19d98a6f8ef5c964b507fcd88f500a2a0a9afd5cffe9d4e3f74d83b27f010000000000000024532b17fc5fb786660c52aeb03150799165dd05e88ce359189189a4b771f51e0100000000000000b0033313d23127061d7f052a965bfeead348e6fe54f9915474ed52b843382e790100000000000000be18787b5177e58664cd893fdaa20a3ca1bc9f1acbbb15036b046ae49c17c15b010000000000000072a85a9dcc0af833b5a21a51ecbc4a9855c2bef8848e080ed70ac48cd1efdd5f0100000000000000c49cfd152ce3ac1fa142b3b6e720cb173eb7f43c82f021418253a070036f870c01000000000000006ec27dfa7ac9d35eb002c55d3e4d56b4df928dd5c44323ac228305741c9e09360100000000000000125becf853d8dc03bc97114ca0c751f6045bd7ef5580e58d32e3b47d7ac5b60301000000000000009237113cf97fee5fafbeb82de593f6125e9c498bd59f0369625f46b326c7d9170100000000000000722d7d57085c250af633f2d461874d59aebc8021eb1112ec8805db5ddea53e5a0100000000000000acfd0e585d89c54d57bdbcfcbef574217ce0997c82fab720b2d4e12ce61bd3610100000000000000562fd7529c92f9370dd6d7ce60d06ea4a826cbefa238231993ecfc9e7725ca240100000000000000a20797f3a8669a909adb22a3aee2844dba82d231cc33f5d9be0e2c533cb82a6701000000000000006a1274b6748bf822ba80c9a9416abd3cf591b7aee6adabb8359b7dbed8ebb3770100000000000000dc1274e0689c7a3eac31b41ce352719529e65c01f26999f74ce17c9905fce87401000000000000009c9bc1074cf465c0dd39f74bfdf16a67f81339ba2ad117a0c7030b4f0678771701000000000000005c0494412a296a92296160ac510697d97288753829a5e9d02eafb5f101e60f510100000000000000d8b38c77823eb1912bf8b743cca6c655ea1844ee468fbd78b394bf222bf8bc2001000000000000007251d6c376064f07f27d2532b05c091bd0978067b078c9f8d9984fd4216bdd4b0100000000000000487c6aad1cc26893dc7e498916a4c23d303f098c04b0a8b0c8242fbb7e73a16e010000000000000088f9a16886165d00612032cb1b36669ad62b7325536f499191e711134c71b6070100000000000000d6152835cb59040a40a5a4ee3a4d481937b7ee9d4a5649abeac6c535d9e177080100000000000000bc4b95226de4e10f91e0254cfe4541232252deaa347f567df124aba81bac4d3f01000000000000001eb833e31087d6baffee4e7f1d9a8e3b7013ea392c81f74313a354ba82e92f6b01000000000000009c8c7c8c91df0ed53864f69017d530b5ebda3ab4bde3c67027e70893213d533a010000000000000018ec239eec5457ba11a41518e7c5f98266d1bdbd67602641d04706f95dba5c560100000000000000ee0c4369d7e5dca53a68ef223db7c858f2a97f47394c7bc678a8edf719a49e130100000000000000c65c0a74887e9fe5cc56696fac7e7f5f1cd4a68f9661c8384b300bcdfbe67a1801000000000000003690e6ef639f685849ed93a6386d1fccf026c3fb64520940aa46af97f929e112010000000000000028a027ca1c0bdeebfc8fce85ac4bac48cc072523d9c4a86b4f2594f9142e7e3b010000000000000042e4c41a899dfb238649e5b17dc232c2699353635d60e6a3bdcd71f9b82cda300100000000000000ce4bfd8c5611b1637066ef9e579c85efadfc9513b882184e00b75871ef7f5a2d01000000000000005c0419f37036f2bf999f3958b49f63ab19d6dc19847a393dfd26cf303fc8d911010000000000000028558e46037c51ece4d39a8a4d34688662e629413c221d6226afe454240e702101000000000000000e76ad5033ec80da424503f80ce2bff64d8cad0e807d7c6516a369b46ed0355f01000000000000004a2073ae31b3df10d285eae6a5befe069183c4c6a6ffa1b2bf432011d0d475200100000000000000f8cb6b856e416fc9e9eec947c6f76eefed65cfe5f1e117a7271396729e5cc8490100000000000000bad91c9aefe173441dae1f273e55090706d412b0723d39bd6c3af053feb183200100000000000000b05ad6cde0dfc019d740c3f50b8aac16550ff4c197da19cf23b9293f0c5c39070100000000000000bc56c07cea21bcbbe058aedd2ced9fb4757caead55f96bda9bed1c9669c32b64010000000000000078e1a4fecbaac940c04e0b591a01ea66a574b5098852ded2810e3a534971111f01000000000000006ccf2ce8e149999a7bb996faa65194e60aeb7bcd1937c787f886fe979fb49e6601000000000000000e5650026c7bee4fa43a2c7fcdc3452daa10b0530863ec686b1d5ee4d707600501000000000000001e866bed92016cd2dcabe2d87fcaf8c1d7248255cafb9e10638fc3a2b476221b0100000000000000946071eab9c0fa1de9be2ad3c18041f1326faab41d84d9daf9f89c0daf9c0f00010000000000000082b820c5bee8ee77e35203dab387f3434b8502e5f1c35dfb2ad15b5c89d47b3c01000000000000001cf3446b4b5116a1784d92cdc5101e55a5fb91ed3d93efccd06b304a94362d0a0100000000000000c6d5dc6e1ec83491397390449d8cddaa88631e8855efe50697788a93de00fb5501000000000000003a4b0919068523aa04ab29f1b49bdc03a176a4b93f9b5a7e6e0cdcc8318691030100000000000000b288a9832e07bef83c5a8ca72c5a5583b321672ba7c6cdd44a971f855d32d95c01000000000000007480edf84ab569e559dccc99b87ecb9ae9db670b45a259b7f6e618b063e43113010000000000000020bedd48a5965e2fc0e221bd164deecdee849eb69cb8dc63a37df80b50a3093b010000000000000026c4a27200f70748b52f7277150d2db7e192b258d5001412e42c62c6e3ee1e51010000000000000040a2527ffa7d30d788eca127d435c8b5aa48972cda538b9a1627a57e85c8fa190100000000000000844b691aa95ff9a15b50f5e5f4f0e582db6621326cf18d7533f55bc27549497a01000000000000002254fb9324a6a9af450ce3a4f5ab25f55deb22161e520b2308b8aaff42e3aa740100000000000000a64dd29103d43e3e898a41f3630ff88b2420953febb931c70ff543673efa251b01000000000000005ca58c138fe321d15a82c8562ea9b1f3e5e608e0cba12e361c3a5c977153e77d01000000000000007c4f928b915062d9cb15e854a9476cddbf7126c9de2fd70f67beaf2ebf6dbc5c01000000000000002cf9dbc1e451ba3ead20d5d826533b9315699b3ba0784bd812e15ac9ad31f85d0100000000000000fced8f1dff4f6c6852b0d643e26ee532086e72be7aecee28d94d1d59b5f9986701000000000000004a905d0574cebf6e8d00d382b104fc8ee1c008f1b9ffa6fa5c3b67ff29719c0d01000000000000008c64cd873a53fec10c4624239ce35d31d4422e32a109605a162fcbf632427733010000000000000026d7422872cbf4d4918046f240a13a37219a272f4326b3f3bd1249829bbcd12b0100000000000000be6106f9217a1847af66de9510fdfb40514409556506ddc1c1a897818434125b010000000000000094af0a39f196a145c9406ace38b2b2b9b9ccec2bf2da2e95d0b0b8507b6f38560100000000000000bca6409d6d7e4f94ce797594db4363bb8bebd5387770aee0bb7663b36354fe2a0100000000000000b2518044cc31062ee50fa81cb6983f314291a0300865fa5cfe149829c5050d24010000000000000086c1922e4ed392d72e0fbc0ee28e7ec0a8ba2b33470330a606cec9a159a79626010000000000000036465f4be77147914969ea78f8e39610310679011dfbb6137dab12e18a687a5201000000000000004e8cc21504fda961cf1cfe78e651d033b10f8ab1a4a0c757bd4848a7f2827f0601000000000000004ad8fedb395dc0ed63e0edbdbd2d20555b61a46aa7cd751e4308335c277cbd6a01000000000000001285919470b092c61b3deaa9ad83226d41f36d58f0ca5f2e14d11d0724f6f00a01000000000000004c5e6997b6f186855b1f4c9f8ab2d6cea3da2e86445605ab89e5b5821e05bd3d0100000000000000944ad19383a9ae136f4f11c15687923b9b21319efab021336a3e8f2bd5b5ca20010000000000000068508b2ca3e01d7c8d79d99f1bb06a93058d14f1061d5fed4df13d4bc30aa557010000000000000074f02ed037d28c883df643034a596e4d2a97a23782ee8483c9ae3429ede7e7090100000000000000566948c62b699e382e5379592d1ad3e1823640d386936142cb9b82915ed02d1801000000000000009493e6de34e09c9679b6dca602e38d8c07abb77b3cc487ae3a80661968caa37f01000000000000006e7a78e9fdfe275f3e000382ba30452729970578258839db6c0fc568e20b3515010000000000000004734733edcd9cf662389208fb8ccb5f274a7db8187ccc53dc84250f8599d54d01000000000000004e1b48e67c1e62e46add39fa523b956946228ea0f08bd9d20ced798cfc9a0f5b0100000000000000ba78c26db96a9ce3ccc2980dfef7346042ade9769f95afaea559f784af167a5d0100000000000000faa6ae896c2d1040e495acbdcd8d90a02ccb17ba6e507efa2f7deacb3b28466e0100000000000000840290d318350bff32db3dcf6138b822cb2adf1dedf5bad8729471988955915c0100000000000000907ff7ac1e6c451d236c05c8d3f85640d9f9472d6a30115fc26135dae020e6380100000000000000c264fe63e84cd004530d2a3eabdde5098fe5c6b619af7fc6c9cfeba01e75ee5701000000000000001ec005e9ca3c15b2994641dd22efcbb20032f10894f76f57296d219dc149817b0100000000000000a07f151db53097c2da9dac4b2e0f194931a677a3ba99df0f3976e34409fd64760100000000000000d8faee17dcc461acb22ca1720b86385414ea8810ba31509fbd8da8733029eb190100000000000000b071e9d6b444a555e034ecdc4d04f2528cc36b347b231b33388564a40fd32b2c01000000000000004e047857f2ec0c7cf295a0673fcc750d4c268cf852711196c4f05bd9dc6414260100000000000000f820a8ed2c97f639fea2892d0a89ae98ffc4c0054f948f9a0108e4d99f89994c0100000000000000fcd5f4c4fe11f20ad99dc8345b7dc5600caba5d5b7d3f499c3253c095152d45401000000000000005eac8ac37c95fc11921839550a30ef071bbc80fb10ea1482cc67818e184d544a0100000000000000ea2b17bd1b69a7b442dd000db0f12f0bd4bf7a87a540427986bd32f3d3bd55580100000000000000142445d894c1236a38c6b1bcd9f5a7245897026424ce9544002008a7702c3b1d0100000000000000d6acabff06fe9a6ccf02f780f33902672fae0f038d8e19ee234ce28a0b6a01410100000000000000780e4353aca40b0f2b2403c862cb33032d49a820244bdc2853ce158d48c4f61001000000000000000e2daa2ef7884bdc7ca5f843f4f33f070c790e9a19d314bceefd04622920216301000000000000003e8394db87d36ddce56bfe0b86922dcc9a86d1ba061600e22d9694027b18c840010000000000000042bbfd10e95a6a1a57b34cbe01ab26605536797742d6d24394ebe95f87bd925c010000000000000040b77fd8fcabe868dc7f2a08bf14c67e4d433886c3cd3738d1b0b9c649bafc230100000000000000009463e59f6b021a1dbdbf65e56f568ac5736baf96470440d7123605a4bcd93f0100000000000000b633c47d126eceb0e36d788370ebaa179b0c7a3a21cf5f1421bfac40c895ed3c010000000000000092ee092cd2215c7c1628086c08be10a3cb969f6b276f600422f3526f303bd8780100000000000000020d34131c7a0ab6d104839ed8b9e0cdf075b80409a36fbe94d0cf83f7ea1f1e010000000000000022333a4409728530184f55b95171d2ddcec037603382fc7d6443b1f7b96c813601000000000000009acfd215519f40156749868afc8d56e015759f71cf183fe68382e8c02c75b2510100000000000000f44b3ec5c7b2188f208d60d159d1f5b0914a51a0632eacea6b88ec7b26d6673d01000000000000005ce79c3ad8a0e1806e863f0858c28a81408d19870a62ac0316b3e6345cbb5f76010000000000000006451fa7b2d831264e40a3e5b8452ede10164b7162a0e93bb9789a102c3010420100000000000000b672ee2f0f9183585ac4875368a0defda6d3c81927fbfc34bbacc7481058cb4b010000000000000022a66dd6397c2631df509db3482baac28b546729e6ce965472a9ba2e648ccc74010000000000000082bb250beb58df1c5346dc5dc26dbc38647a59fcd5c220c41466606cd855a2520100000000000000a065f45a353f24ba187248aacd9c64d5c3a92ddf92b4a5c33994f56a07cea840010000000000000078c91c4ee02089ea86612f66d6022a0cbd54afe470a162a72036611623924f6d01000000000000005432de09683010f3c1a6a977dd0dfdd8c5ce9fdb85225b9b7dc8e451e340cb240100000000000000464cb5dfedc6938caef6caaf5a58f4925a295f24a4f37337033dafa0cc733e660100000000000000f60b5e74957220ed7664befb71e9621436e40f2b6c1bdb1c90a6de9c3540a84001000000000000002a98fbaf7ec22832522e3f96821711ef684283911a524960efb14953255baa2b0100000000000000fe0af833307f4cff497d006ec63385b1c191efd6a4547fb05a355cd23686dd0401000000000000004ed5f55ec45727a57e2d8d6914f6d2acffb17b9515d347ba045067502a0b140201000000000000004cb98af1a70e917453f5dea682917e7b3077ea9d41dda7764433258a9d5db54b01000000000000002a0fda136ae348db338b87bed349145a94ce091227774b0542e533a83d1ba455010000000000000036c5a061b47768957b2b939b2e37e4cdf8825a4abf963c4f912f3ba4cd567f1e010000000000000076fa252aeca5b108fe76ce12e395ed8105d5c98e4abae38bfc7cb4fbd4d43d5501000000000000006a5607bc375d7ac0908e7643ea2e89dbe42f4f805c2fb6e2a22d0385c1232b310100000000000000f4ccdf83d734edcc568462572abaf32d22ac7faf8000195e02273d1c9665430801000000000000007eb2b0b6adbe5a5bad38f46db207f94c896d419661f4ab8f21e302a543df9b11010000000000000048ce0aba6f1554e139568b4d2358d6cca9bc291d3600787cc3e732291002ca220100000000000000fcf8846340018e82ccee12f3fa59b0ce9d69bcc1c062435658455674427d481201000000000000007a07e4b6b4daf45f4af2a98e7458034447ae0e67e9a22596848e58d4ba73b9530100000000000000a8731d355eefdfbdb7fb12cfa5a280c0b1e408aca264ef585d42bf97fcfba1160100000000000000c4c5fe47a568c2fe4876eafd5e0093dcc31b450eb87bfe58397dfae2a590d4650100000000000000fa5a4da949ce29dd0fc20fe56c40d63ffded8e2dd88844f725efda0814ed526401000000000000001cc40fa83cd0a4431aa63315b55c669370a4037756089f3402a9021e2d80666401000000000000003ce775a4a6215dbfbdc2b0a8a8b71936abd61642b5fd1a0c1d06ba548ad3025e0100000000000000bcb998778b7c2c182f396b311f92ae1289daeed9e62a3d8a8298b8dde7e1a52401000000000000004a1069d2203a75cd1078c39de35c16a6c4c12acbad34f1cba8efc065f80398610100000000000000eedea8652413b5a97c1eda13e1e050b777bd0a8ca31dafd63aeab576a68fb75e0100000000000000cebdabff22e607a75aa8db1bf875511a563200cce3f089972aca719649b6e1760100000000000000245a9f1c784e83aa6e1a22b7a560de42348ae1c3402060929d669f110da1b749010000000000000062c6c1f6f2478ee092c958842ac4351973bfeb49f55e33b8415ac0296a967b5f01000000000000005c25d331b2e023d12ee512689c3ea95edaadc300c9dc804e98806117f2edf57c01000000000000006205ea8c9da2e39792b9504100d0ce7eec4b9c732297afea3c2a885fe4f5832401000000000000009a64daca74d14dab93385e52ca70940732a8d45ae4b853ce156c3eeca06f0c5f0100000000000000c63e31fd558807e07f9c7dc51f8fa8110679bb1b1cf5585e56d0b6164179b9790100000000000000eed7e8e8a64dfa89c548a31c1b9fec7af5aef4dbbdb26997b2ddca72d4f8790c0100000000000000fa49d3457520dd98ca1489b78354d7d30a9bdf2181140072ebda1c3dc3371e450100000000000000fe5ba24461a8be22c5e553d2715748ece9c50a621d1794e36ad6c40dcd5d9c2301000000000000001e534cbbe982369a968006efa465cf2a16807a88a5c877d45f090192ea619c6001000000000000001a15acd9aec8d1dd06c7b6a46be298c3fc2ecd51be6724a63da4da286e306f72010000000000000078cf1debe3fc0da2ed2473d1e1835a478cc3e7008e0cf42043f287bc36804b710100000000000000f853a1534a3af56217661420536dd7bea0db6f6db843d8fead77c308ed7dcc7c010000000000000032e2c97e308c84afea4b37d7dd8f62e67763126c357c9e6e49b27f54c3702b73010000000000000050d2e3ed042861cfddfecfb31d47caa1927064cb0372213a3015b2acdf1dd1450100000000000000843778dfeddea10578fab2773f2827c62fe0efe374d9a01eb370bd8f1427e7630100000000000000140fbeeabfb02dede7214a17c2cf78279d076c80d962431f35d1105c87b8d95501000000000000007cb1f225b90c00f426c33ac4338eeb2dae6467b8a9da5c1556e6588c12ca977b0100000000000000b261a66b9bae17b65e7f6a88d65efb4519925d6c418c9e2ba17bfdbf684b776301000000000000009c5d3bb1387f53f0306bf7f24e81dafa5bf972048de867e2e517938c4ebdf7120100000000000000560c91919fc22867159ed77bee1b3e70d2e222a5fe6e830fceb13b58b0daa5290100000000000000e03e94cd4419d9cb8709ad2859e598912c78c01b15eed53ec0c336d8d6c491420100000000000000fe9d62e17387326c0e4b75697b2f0fbdff9506992e745d61b4c536c4dc10f57d01000000000000003227028def74f8ea7bede3e112e4ce09d8fb823790ed599f2259019945f2690a0100000000000000c686fbbc968476537924f90aaa4993eef8314685d150228c462f8ae4e5e1e57f0100000000000000464d95a7c8cce76af088d8f781e3073fc194333ab20956b4dd2c25d4a29ac56d01000000000000004ca838afa9f12e88436eacb5024f3f94c95a66c32e114f65f3136176e426c75501000000000000000c60356c02d5d99293952c478fd07b2cff982dbad863ebdadf25c9e69206f14901000000000000003a8b589c8222ede45b3d95c8d9176543ffa9a29cbfa0ba2af60fc412e732d75e0100000000000000a43b19f13ec057124df240aad303e969f7d02fafc02c263d7ec814b6729d1b2001000000000000000884c85734b971a88cd94d86d3c62fdf163256a0387e15e2d36d8f25523a77480100000000000000f2cd13ba1efd67dfd5f8c9150b1a74d1ed1bad1a72c36fed96163b062e463d0101000000000000002001d47fbff7291a50650047b27cc47f1d22a0bdfbbfb0b8b7a6e8bbf350bf620100000000000000ecf0297bddebd3d766ea7def2bac79ad6eb650fabdcd029b99cb1649ff7dc8150100000000000000121f9d8ba85d89e3c6f9a0fedcdfc9b05cc40a6d3324eff6e8a58aec5f52590501000000000000008a16fb5a6718a714296cb8fa2ca708f677f78c7f883ba3c5ad1bbb9e23f37705010000000000000038c9a0897d9caff03a308d2120bbe892974ae8cb05f1cfe8b97259f0ac2e852901000000000000005c3615a5e2072a618f0e434f7c572f4e4b1a89348dfe0f7939c99de095d54a55010000000000000006adb1e6e78084fd5e5df37fafc180d1ed84377ca41de3b5ca43b764f0cb19090100000000000000a496ba57e511f86ff4cf264f9fd7bd3595b37ae55ad671c7790574c87d40415201000000000000004e466f6a4930d856a1f53f21c1a44451ead20c8c71319f6a685f0e254d24c32101000000000000007617b69110c43683b5000788259be855890c474be8fed65d7b1dae1d534ef85c01000000000000002037d70f4c244c81422409ad01d28d72a30d26e595fbcc791daeb57f78a856700100000000000000c28c2dbe1a9bc290af0d795ef11c1d1b694b91ae685e891e599596aaafbab73b01000000000000003cfa50228b841c7d2fab03db7e4bf282cf14e127ab9b31c23fca1a79be54e823010000000000000088fa8bb07ebce99964718c65d0d6f1b091ef2f4d4cdf7b94a22c42c007ecd706010000000000000052ac28ba2601723d23a086b5d775f19319f110ba5e9292f2af461e71903b5b50010000000000000002a4b2935b657f9ec563642ab0f34e223ef594cc70c856b9bd70fbe0837215600100000000000000c280e82e46ecabc4d68169e292c59cef96432f25fe849b8a147db5ca0ce7e17b010000000000000092e5bb9d0906f768dbdde0696b78e493cc78dc1f68789575b24f0b962799b51e01000000000000009295a1f023157921d346b73484b120d46048382107015aa9ed998f1fae95970e010000000000000010e37a12fc6ed768d1a2d33c8abc6db675381dfe69c832abb77d9ba2341b3c4a0100000000000000d8de542a748c14224ee7faa16157727c852ce502a45b408de0975c88a39c690f01000000000000008013bf5a25c703e64dc4ae7e1248c0f2c7abad9e43672d82611d109740199856010000000000000004a3d449da9c2c02c963df1433b66d0b6599e7a667e3818ecebe84357081703b0100000000000000188d1a45dca0c370ba6b7952ba682570fd4f61501c4dea9826a981374a3f815f01000000000000004c1dbdaaf0fb061228d2245561476088bc608788cb3e9c5266f5a8e54bdd1e670100000000000000d23c53a531e356646133db73065cd83999693a5bdfc05931238434f5b031522f0100000000000000585ecf59c1396544c1f1dfa5693ded0c96daaf05cc70d55fc8c6fab487b2022e01000000000000006a40a8b74a142958efb2d75cd363635eccbfb70cddb24f0626d0ec927d98233801000000000000005e127fe875a9c6396693b778833a710b0426a4fc0af4af490e7ff0a6f3e8b61f0100000000000000aa74176b5870c97b754a157ec0d8032148c2ae717a905e0e5e626048b6f53343010000000000000032fdd22fdc3662f97008fbb6f52d0fbe7b62c24956849fe04f9b023007a8932301000000000000003e07b075219fc7ace8dc3bf3a06f5dc12aa9c7e45fe30244d2284bcfb1e6ee190100000000000000a4a0bc81aaad1ebce3fdf896a8d6d081ab93efc2de9d5c56f2632edfeaa7ad0f0100000000000000465242c8915eea46e25549f2ab97cfe78784f25083e51773e07d5a0cafc2de32010000000000000022376791bf19fefac611324d27bc6acb4b7f7eec713c186adbeda5a1e1b88f340100000000000000bc8f93a45201992fa9d04355095d03adeb5ff1aea206425eae4f902ffd47fe200100000000000000288c08430a7e427400dd5b61926b74a82abcbbc91ac739190cc791a581f6836a0100000000000000eec1df2a382f2f9d0e7dbd91ebffe7be19dc9e01159cf3b82229a3ad2a33685b01000000000000001810712fbe92f2394892a99e3a825490baf1efaf7a3dd1c9bd0e58da0d6711330100000000000000fecb15325d9baf603112dd397d2e83d3694414f529d75c4b639c7e775b979b14010000000000000028052d0b965ed862b7861aa7f3f91fe52ff8b0f795ff476c7e0a7aa42e79933001000000000000001c860d36fc84a54978d99ad400a719dbbef493f8631856e6def3e9ec998cde3e01000000000000002ef781a1d268b8afb0a8331ece83f3fff6877baa2d06ed9a23d484d5d70a50030100000000000000163687f38841bbbd2b93787f7f65cc74a2ab94478888abce52207e1b81f46c4d0100000000000000e0b770b1bcf7deb030ee75d5bad6ec1ebfe06ded0fc406a8520a9650fe83233001000000000000003622bfbaf9350b5906bdf9ce362e06726224ed141c5d29e8e175e0beedbd3d3d01000000000000000469db5710f30dc9ed7411417170efd62ce8bbe36ccab6df758a94aa7b7f720b01000000000000007a661c99fd40492b4893407b03822464e7d4853e9ba47fc9e9960c3800d6725f01000000000000007836067da2bc290dc3c428c548a4dbebfdeddbc10a2db206abb6ac11741dc63e01000000000000006ed90090a744a0d55adf8f8af5af4d5198bb67220ce33fe71121d7c51f27a4130100000000000000bc20aa968087f7c0d4bb35dd9c502db39fd7f4596a412880fdcd5ddba22fcf460100000000000000386f18b82ffe824f7ee1fda0f511d5112dee1c677bee0069f3d8e3d8be1a321d0100000000000000d636bcd260e36a2bea4bb1667bbc86285967381ad5822f8cd98ff7d5c88c7430010000000000000072f2ff3d21f4126e217f10f9d9bd18069c12eaab6922d073dd5241ac718e91200100000000000000f25d3265659fca9d24ca877823644f1223714b0167d0a676cf3c9c447173d12f01000000000000009ab493c4c8007f49a3e7d1e9f1aef39b39cd66a496e90486e62664725c6ba06f010000000000000094cc8c46f9670417f5ad9492d17189c4e03e96122782e92824f05e176d6843790100000000000000369a7419ed7884aecd3cda7ec3576942cacde7a9b8f2fe9a1115be827e2ba83b010000000000000096ef8b525c38b9a74a3014bd99979230dab2f20221e8c7d1db50c7a61a02e97e0100000000000000769d9f8b45bcbed8fd84b86d2203ee20d199212007387b10216f8fd9441dfa28010000000000000092c996c1fedd09190bb0fa8cc79e4075ad79eca3d6895d2a99d20e6f89e4182b0100000000000000f2065428f52da2f7a881f9b94bfd38719bb6e5ff88a6800bbb3aebb1a9ad2102010000000000000092006149452119964a75232851f01361608dc0a52031f240e93e70e98a3ff21901000000000000009ad36892ec05281de9c63c7cefb3f31e448957a9572e650d9f3af1f21b2f515e0100000000000000bae8e68bc8f1b66fe3229ee72d77137b394c6b7dfbf55e424f9d2c82d5c99600010000000000000098f7988d5a74a0e52f58dd3d232ac3e93ff757480db9d4c12761b04fef032c460100000000000000248cddedee20dbb65f20a1715c2490c09241f6800b72d0c4029a1c234f2ce74b0100000000000000a8c366514ae829385912b04b0192e934a20045b36cf1911bccc4c064d6d3c46101000000000000001cf3abc7c9d8027488ea2f5f2463fd091b194fbeeebf560875e8648fbc67dc24010000000000000060b521110672f6f871978fd3ac4a835b5e30c3fa727c04c70dbc543fcad38b0e01000000000000002ab0b5cc358184be4fa29e7a3dc24806a72e55baad40ec9a117324a884242c280100000000000000e05c7c7d82498be85294ee984e1f0caf23c53fa9a64cc7e6c5053304c4bb785101000000000000005afe620da258a48f00c3afbb8a98161e977f076c7e7f8392975a4f0db4b57d610100000000000000a61667ea6442054b56111477f57ecf39b6e90480bfadf54c3e6cb5ac3a3e275801000000000000001ae9aab4a890c558ac8ab90ccbbf193b3841083670ebed278b2161fa2ec7b3040100000000000000c2d156c96e21691a06cecd4a396978f94cfb3a1760d41180efe382b7ce8e993f01000000000000004616ac86f0d45899eed3f1246dc5744858a694a92b0abd9f10e52dfc9c2867460100000000000000a4b31af719e5d9c3b69326ef920736e8b620b329eade475ae23a33fbd445df7201000000000000009281394b5d35827c826e1d7444f346c247b9a004aa0292a9ca2b16e0fb55687701000000000000007e88cd54f47c1f4ddd9d3a198fc689d24a523fe186d526b14e476f14ced7db3c0100000000000000229fcd7685d064b9c265aaa3a771582b6600cef963f57af160b34a81c9f84a690100000000000000b225550bd99c7b1ebfce319d76f52fe96c661d6106a4b4c37fd4eede1ba4654f010000000000000024ad842dcdc5f4d84262c6aee5116e88116fb191dbbd1331453202d3583b1f4401000000000000005474f03ced668a1459e8ed416f510a16f551ec1415c42b292670545a3967d311010000000000000096e0b71982f3e7ba6ab06d28dfbf803caf4ac51b7633bee848f4f3fadc0dac480100000000000000386bcf52f4c464e6a18169f776d69e90880301f01fcc8cc0ba451f1d7e6c3b7c010000000000000078fd4f7b7da839a4112a456fb1bf7a1f935087b4d456153f04fec37ee0f7a90e0100000000000000b41546275611fa185c88c7016e909222b3a757b476316766a72729d074d8e92b0100000000000000a8d082a4289fe5ccaada604e70c4b1473d6fae4374663672e61474852c1ebf2a0100000000000000309ab613bea03c4431f7602c937f5a4d17e2102db6fc7f77e32f7a245041b90c0100000000000000e0ee8ff76b364ad2ccc3e82e69cd700c0895607a449c5af3745bb3018a1843220100000000000000756735333d79a12166b3932837c94c9de2b85bc1a5230264408416140c16ca700100000000000000040000000000000002123ae85881861156a074a07110a5f59142b0b762ac89422d0a601116ee1e8c49721f320101ce20000000000000d3690011000000006009000000000000a50432904ec260963195582a1d339f9fbd2d5d76f551160105c922423cad0d94482f010000000000000076441c448aefcf40a72128edc9b44a4f7ef9c267c503e98f5f9c72d5e9e92f000100000000000000526e055ade4ac425e9b5f93ce4394601335d3599a5b742603126d78ce99a4a540100000000000000d0e8ddfdeacd8e163b01ca4da1a4e856312b0de412b492247070f2721f7d803801000000000000008008c1b7061a2402634fc15d3849e2913863beb9f55024bc8cc7fa7d6e397817010000000000000024a51a9bdb67213626d1b52bd8dbc0e9b94ea88ea417aa17b56212d1cea3e1780100000000000000488d520146f681678e9d229f5e29354edf65e521246b28a4175c0502e060b9200100000000000000da663fef002e63d5de9676a1a930abe7b0d8088657d67a3f24076bce08c661490100000000000000a86e2248480b1f6ad903a965344ecef69838aae812ba3c39d3d9eaae22963f2a0100000000000000f03555628bc649cebf75046ab9663faa1a5421df323f99c82782b7a3d162ce080100000000000000aca7a86b6fcf25daa7f0767bfe36b284f3100dc1ee4dcc971fbb3244bb57221c0100000000000000ba395fcb33327501109ed40712c7a372d25bf3339edfabe2a1964fb7b5d4d82401000000000000009cb389c209afbebda2b12113e0266b3d30f46e2a91aaf4451c193d640288357101000000000000004c9886e2e62ee92a6778d6a7928052732044b64fa61969cd8e37f3f7e3406f72010000000000000026db7c5786fddc15f7e96905024905d877537451ed444cb97d3786361a59f64b01000000000000005237e4509f24bc9e8bf9bfd78b594219d86853ae16601f692f10c9b16b88f83b01000000000000006869737a2873891c0e4ef80a69e331f64ffc3663c9f3cdf86b440bb41827a252010000000000000098192016f83ef2fe74dba1ecc6526efc61b79f3177c00dc7c053160391858f70010000000000000078c35105ea4cd9d6ea0ba91b2c19e78f60931bef5918c1bd2e14259229e7c330010000000000000006d2846642c835b0fb1ff1ef908449376aa8e7c0f3352e55da9a1e97e9528b230100000000000000f8a681118ea0bb9dfde2813ce5144eeb5cee881c27883de1c0c759255ec326540100000000000000ac8b2b59f77eb5f3725961767878166a3817747018f18cf48c933e284320b90e0100000000000000e67c524e443cda4cd27dfcce70488a5d23a93c8c46a5e83ef5a69eff3a02fa5a0100000000000000a42289d68c963358f3c450a850242bb53121e73e17f0e2ea2b93327446bea33c01000000000000006c50859d9dde209012eb3868c1a3a6e80ae8fa528ace9df68e92dbbae60368200100000000000000a8e470f2339e3ed0da456780dd9207e9c6a02459238ec3057a6ade01fd6cd60a01000000000000005c7f05d77f853f3eb8d4989fce36d0808b6d2b881e26f13c01e939b5d489a57d01000000000000002addf696d5a42b0a3dada689731e00c991db936909df869ac6600662abc35310010000000000000072ed7192625403acef94aa9189f9f179deb89e60478816ca96c79b742f757e750100000000000000b4ffe3c5959ff37c11c6f19d91926cb97aa4bf0f604919e1753bb55664d061680100000000000000bc4c9b5425f9a2aa09e3239332c702dedbfffa2b9f4cc1b978b307fc1fa1337c0100000000000000e07d5b19d98a6f8ef5c964b507fcd88f500a2a0a9afd5cffe9d4e3f74d83b27f010000000000000024532b17fc5fb786660c52aeb03150799165dd05e88ce359189189a4b771f51e0100000000000000b0033313d23127061d7f052a965bfeead348e6fe54f9915474ed52b843382e790100000000000000be18787b5177e58664cd893fdaa20a3ca1bc9f1acbbb15036b046ae49c17c15b010000000000000072a85a9dcc0af833b5a21a51ecbc4a9855c2bef8848e080ed70ac48cd1efdd5f0100000000000000c49cfd152ce3ac1fa142b3b6e720cb173eb7f43c82f021418253a070036f870c01000000000000006ec27dfa7ac9d35eb002c55d3e4d56b4df928dd5c44323ac228305741c9e0936010000000000000078f674626909d11d18b6b9d6c21ec4023a2073965c68b2172197f5a12e3e17600100000000000000125becf853d8dc03bc97114ca0c751f6045bd7ef5580e58d32e3b47d7ac5b60301000000000000009237113cf97fee5fafbeb82de593f6125e9c498bd59f0369625f46b326c7d9170100000000000000722d7d57085c250af633f2d461874d59aebc8021eb1112ec8805db5ddea53e5a0100000000000000562fd7529c92f9370dd6d7ce60d06ea4a826cbefa238231993ecfc9e7725ca240100000000000000a20797f3a8669a909adb22a3aee2844dba82d231cc33f5d9be0e2c533cb82a6701000000000000006a1274b6748bf822ba80c9a9416abd3cf591b7aee6adabb8359b7dbed8ebb3770100000000000000dc1274e0689c7a3eac31b41ce352719529e65c01f26999f74ce17c9905fce87401000000000000009c9bc1074cf465c0dd39f74bfdf16a67f81339ba2ad117a0c7030b4f0678771701000000000000005c0494412a296a92296160ac510697d97288753829a5e9d02eafb5f101e60f510100000000000000d8b38c77823eb1912bf8b743cca6c655ea1844ee468fbd78b394bf222bf8bc2001000000000000007251d6c376064f07f27d2532b05c091bd0978067b078c9f8d9984fd4216bdd4b0100000000000000487c6aad1cc26893dc7e498916a4c23d303f098c04b0a8b0c8242fbb7e73a16e010000000000000088f9a16886165d00612032cb1b36669ad62b7325536f499191e711134c71b6070100000000000000bc4b95226de4e10f91e0254cfe4541232252deaa347f567df124aba81bac4d3f01000000000000001eb833e31087d6baffee4e7f1d9a8e3b7013ea392c81f74313a354ba82e92f6b01000000000000009c8c7c8c91df0ed53864f69017d530b5ebda3ab4bde3c67027e70893213d533a010000000000000018ec239eec5457ba11a41518e7c5f98266d1bdbd67602641d04706f95dba5c560100000000000000ee0c4369d7e5dca53a68ef223db7c858f2a97f47394c7bc678a8edf719a49e130100000000000000c65c0a74887e9fe5cc56696fac7e7f5f1cd4a68f9661c8384b300bcdfbe67a1801000000000000003690e6ef639f685849ed93a6386d1fccf026c3fb64520940aa46af97f929e112010000000000000028a027ca1c0bdeebfc8fce85ac4bac48cc072523d9c4a86b4f2594f9142e7e3b010000000000000042e4c41a899dfb238649e5b17dc232c2699353635d60e6a3bdcd71f9b82cda300100000000000000ce4bfd8c5611b1637066ef9e579c85efadfc9513b882184e00b75871ef7f5a2d01000000000000005c0419f37036f2bf999f3958b49f63ab19d6dc19847a393dfd26cf303fc8d911010000000000000028558e46037c51ece4d39a8a4d34688662e629413c221d6226afe454240e702101000000000000004a2073ae31b3df10d285eae6a5befe069183c4c6a6ffa1b2bf432011d0d475200100000000000000f8cb6b856e416fc9e9eec947c6f76eefed65cfe5f1e117a7271396729e5cc8490100000000000000bad91c9aefe173441dae1f273e55090706d412b0723d39bd6c3af053feb183200100000000000000b05ad6cde0dfc019d740c3f50b8aac16550ff4c197da19cf23b9293f0c5c390701000000000000006e3d07ca7f680aee933830ff37197bba65eea7d3645ac0190cab4715d024bf780100000000000000bc56c07cea21bcbbe058aedd2ced9fb4757caead55f96bda9bed1c9669c32b64010000000000000078e1a4fecbaac940c04e0b591a01ea66a574b5098852ded2810e3a534971111f01000000000000006ccf2ce8e149999a7bb996faa65194e60aeb7bcd1937c787f886fe979fb49e6601000000000000000e5650026c7bee4fa43a2c7fcdc3452daa10b0530863ec686b1d5ee4d70760050100000000000000dc19020c36e3442a05940551f1d6b4b7dffb3343dea0418a8203fc22ac129e6101000000000000001e866bed92016cd2dcabe2d87fcaf8c1d7248255cafb9e10638fc3a2b476221b0100000000000000946071eab9c0fa1de9be2ad3c18041f1326faab41d84d9daf9f89c0daf9c0f00010000000000000082b820c5bee8ee77e35203dab387f3434b8502e5f1c35dfb2ad15b5c89d47b3c01000000000000001cf3446b4b5116a1784d92cdc5101e55a5fb91ed3d93efccd06b304a94362d0a0100000000000000c6d5dc6e1ec83491397390449d8cddaa88631e8855efe50697788a93de00fb5501000000000000003a4b0919068523aa04ab29f1b49bdc03a176a4b93f9b5a7e6e0cdcc8318691030100000000000000b288a9832e07bef83c5a8ca72c5a5583b321672ba7c6cdd44a971f855d32d95c01000000000000007480edf84ab569e559dccc99b87ecb9ae9db670b45a259b7f6e618b063e43113010000000000000020bedd48a5965e2fc0e221bd164deecdee849eb69cb8dc63a37df80b50a3093b010000000000000026c4a27200f70748b52f7277150d2db7e192b258d5001412e42c62c6e3ee1e51010000000000000040a2527ffa7d30d788eca127d435c8b5aa48972cda538b9a1627a57e85c8fa190100000000000000844b691aa95ff9a15b50f5e5f4f0e582db6621326cf18d7533f55bc27549497a01000000000000002254fb9324a6a9af450ce3a4f5ab25f55deb22161e520b2308b8aaff42e3aa740100000000000000a64dd29103d43e3e898a41f3630ff88b2420953febb931c70ff543673efa251b01000000000000007c4f928b915062d9cb15e854a9476cddbf7126c9de2fd70f67beaf2ebf6dbc5c01000000000000002cf9dbc1e451ba3ead20d5d826533b9315699b3ba0784bd812e15ac9ad31f85d0100000000000000fced8f1dff4f6c6852b0d643e26ee532086e72be7aecee28d94d1d59b5f9986701000000000000004a905d0574cebf6e8d00d382b104fc8ee1c008f1b9ffa6fa5c3b67ff29719c0d01000000000000008c64cd873a53fec10c4624239ce35d31d4422e32a109605a162fcbf632427733010000000000000026d7422872cbf4d4918046f240a13a37219a272f4326b3f3bd1249829bbcd12b0100000000000000be6106f9217a1847af66de9510fdfb40514409556506ddc1c1a897818434125b0100000000000000da98e4363908fa4d7980fe5574ceeac74fae49bf77b3a191654c7731214a565e010000000000000094af0a39f196a145c9406ace38b2b2b9b9ccec2bf2da2e95d0b0b8507b6f38560100000000000000bca6409d6d7e4f94ce797594db4363bb8bebd5387770aee0bb7663b36354fe2a0100000000000000b2518044cc31062ee50fa81cb6983f314291a0300865fa5cfe149829c5050d24010000000000000086c1922e4ed392d72e0fbc0ee28e7ec0a8ba2b33470330a606cec9a159a79626010000000000000036465f4be77147914969ea78f8e39610310679011dfbb6137dab12e18a687a5201000000000000004e8cc21504fda961cf1cfe78e651d033b10f8ab1a4a0c757bd4848a7f2827f0601000000000000004ad8fedb395dc0ed63e0edbdbd2d20555b61a46aa7cd751e4308335c277cbd6a01000000000000001285919470b092c61b3deaa9ad83226d41f36d58f0ca5f2e14d11d0724f6f00a01000000000000004c5e6997b6f186855b1f4c9f8ab2d6cea3da2e86445605ab89e5b5821e05bd3d0100000000000000944ad19383a9ae136f4f11c15687923b9b21319efab021336a3e8f2bd5b5ca20010000000000000068508b2ca3e01d7c8d79d99f1bb06a93058d14f1061d5fed4df13d4bc30aa557010000000000000074f02ed037d28c883df643034a596e4d2a97a23782ee8483c9ae3429ede7e7090100000000000000566948c62b699e382e5379592d1ad3e1823640d386936142cb9b82915ed02d1801000000000000009493e6de34e09c9679b6dca602e38d8c07abb77b3cc487ae3a80661968caa37f01000000000000006e7a78e9fdfe275f3e000382ba30452729970578258839db6c0fc568e20b3515010000000000000004734733edcd9cf662389208fb8ccb5f274a7db8187ccc53dc84250f8599d54d01000000000000004e1b48e67c1e62e46add39fa523b956946228ea0f08bd9d20ced798cfc9a0f5b0100000000000000faa6ae896c2d1040e495acbdcd8d90a02ccb17ba6e507efa2f7deacb3b28466e0100000000000000840290d318350bff32db3dcf6138b822cb2adf1dedf5bad8729471988955915c0100000000000000907ff7ac1e6c451d236c05c8d3f85640d9f9472d6a30115fc26135dae020e6380100000000000000c264fe63e84cd004530d2a3eabdde5098fe5c6b619af7fc6c9cfeba01e75ee5701000000000000001ec005e9ca3c15b2994641dd22efcbb20032f10894f76f57296d219dc149817b0100000000000000a07f151db53097c2da9dac4b2e0f194931a677a3ba99df0f3976e34409fd64760100000000000000d8faee17dcc461acb22ca1720b86385414ea8810ba31509fbd8da8733029eb190100000000000000b071e9d6b444a555e034ecdc4d04f2528cc36b347b231b33388564a40fd32b2c01000000000000004e047857f2ec0c7cf295a0673fcc750d4c268cf852711196c4f05bd9dc6414260100000000000000f820a8ed2c97f639fea2892d0a89ae98ffc4c0054f948f9a0108e4d99f89994c0100000000000000fcd5f4c4fe11f20ad99dc8345b7dc5600caba5d5b7d3f499c3253c095152d45401000000000000005eac8ac37c95fc11921839550a30ef071bbc80fb10ea1482cc67818e184d544a0100000000000000ea2b17bd1b69a7b442dd000db0f12f0bd4bf7a87a540427986bd32f3d3bd55580100000000000000142445d894c1236a38c6b1bcd9f5a7245897026424ce9544002008a7702c3b1d0100000000000000d6acabff06fe9a6ccf02f780f33902672fae0f038d8e19ee234ce28a0b6a01410100000000000000780e4353aca40b0f2b2403c862cb33032d49a820244bdc2853ce158d48c4f61001000000000000000e2daa2ef7884bdc7ca5f843f4f33f070c790e9a19d314bceefd04622920216301000000000000003e8394db87d36ddce56bfe0b86922dcc9a86d1ba061600e22d9694027b18c840010000000000000042bbfd10e95a6a1a57b34cbe01ab26605536797742d6d24394ebe95f87bd925c010000000000000040b77fd8fcabe868dc7f2a08bf14c67e4d433886c3cd3738d1b0b9c649bafc230100000000000000009463e59f6b021a1dbdbf65e56f568ac5736baf96470440d7123605a4bcd93f0100000000000000b633c47d126eceb0e36d788370ebaa179b0c7a3a21cf5f1421bfac40c895ed3c010000000000000092ee092cd2215c7c1628086c08be10a3cb969f6b276f600422f3526f303bd8780100000000000000020d34131c7a0ab6d104839ed8b9e0cdf075b80409a36fbe94d0cf83f7ea1f1e010000000000000022333a4409728530184f55b95171d2ddcec037603382fc7d6443b1f7b96c813601000000000000009acfd215519f40156749868afc8d56e015759f71cf183fe68382e8c02c75b2510100000000000000f44b3ec5c7b2188f208d60d159d1f5b0914a51a0632eacea6b88ec7b26d6673d01000000000000005ce79c3ad8a0e1806e863f0858c28a81408d19870a62ac0316b3e6345cbb5f76010000000000000006451fa7b2d831264e40a3e5b8452ede10164b7162a0e93bb9789a102c3010420100000000000000b672ee2f0f9183585ac4875368a0defda6d3c81927fbfc34bbacc7481058cb4b010000000000000022a66dd6397c2631df509db3482baac28b546729e6ce965472a9ba2e648ccc74010000000000000082bb250beb58df1c5346dc5dc26dbc38647a59fcd5c220c41466606cd855a2520100000000000000a065f45a353f24ba187248aacd9c64d5c3a92ddf92b4a5c33994f56a07cea840010000000000000078c91c4ee02089ea86612f66d6022a0cbd54afe470a162a72036611623924f6d01000000000000005432de09683010f3c1a6a977dd0dfdd8c5ce9fdb85225b9b7dc8e451e340cb240100000000000000464cb5dfedc6938caef6caaf5a58f4925a295f24a4f37337033dafa0cc733e6601000000000000002a98fbaf7ec22832522e3f96821711ef684283911a524960efb14953255baa2b0100000000000000fe0af833307f4cff497d006ec63385b1c191efd6a4547fb05a355cd23686dd0401000000000000004ed5f55ec45727a57e2d8d6914f6d2acffb17b9515d347ba045067502a0b140201000000000000004cb98af1a70e917453f5dea682917e7b3077ea9d41dda7764433258a9d5db54b01000000000000002a0fda136ae348db338b87bed349145a94ce091227774b0542e533a83d1ba455010000000000000036c5a061b47768957b2b939b2e37e4cdf8825a4abf963c4f912f3ba4cd567f1e010000000000000076fa252aeca5b108fe76ce12e395ed8105d5c98e4abae38bfc7cb4fbd4d43d5501000000000000006a5607bc375d7ac0908e7643ea2e89dbe42f4f805c2fb6e2a22d0385c1232b310100000000000000f4ccdf83d734edcc568462572abaf32d22ac7faf8000195e02273d1c9665430801000000000000007eb2b0b6adbe5a5bad38f46db207f94c896d419661f4ab8f21e302a543df9b11010000000000000048ce0aba6f1554e139568b4d2358d6cca9bc291d3600787cc3e732291002ca2201000000000000007a07e4b6b4daf45f4af2a98e7458034447ae0e67e9a22596848e58d4ba73b9530100000000000000a8731d355eefdfbdb7fb12cfa5a280c0b1e408aca264ef585d42bf97fcfba1160100000000000000c4c5fe47a568c2fe4876eafd5e0093dcc31b450eb87bfe58397dfae2a590d4650100000000000000fa5a4da949ce29dd0fc20fe56c40d63ffded8e2dd88844f725efda0814ed526401000000000000001cc40fa83cd0a4431aa63315b55c669370a4037756089f3402a9021e2d80666401000000000000003ce775a4a6215dbfbdc2b0a8a8b71936abd61642b5fd1a0c1d06ba548ad3025e0100000000000000bcb998778b7c2c182f396b311f92ae1289daeed9e62a3d8a8298b8dde7e1a52401000000000000004a1069d2203a75cd1078c39de35c16a6c4c12acbad34f1cba8efc065f80398610100000000000000eedea8652413b5a97c1eda13e1e050b777bd0a8ca31dafd63aeab576a68fb75e0100000000000000cebdabff22e607a75aa8db1bf875511a563200cce3f089972aca719649b6e1760100000000000000245a9f1c784e83aa6e1a22b7a560de42348ae1c3402060929d669f110da1b7490100000000000000feebe707a9a5eb136d04e5b3b2124627fa76129c1e33cba1d1323047f76b3f22010000000000000062c6c1f6f2478ee092c958842ac4351973bfeb49f55e33b8415ac0296a967b5f01000000000000005c25d331b2e023d12ee512689c3ea95edaadc300c9dc804e98806117f2edf57c01000000000000006205ea8c9da2e39792b9504100d0ce7eec4b9c732297afea3c2a885fe4f5832401000000000000009a64daca74d14dab93385e52ca70940732a8d45ae4b853ce156c3eeca06f0c5f0100000000000000c63e31fd558807e07f9c7dc51f8fa8110679bb1b1cf5585e56d0b6164179b9790100000000000000eed7e8e8a64dfa89c548a31c1b9fec7af5aef4dbbdb26997b2ddca72d4f8790c0100000000000000fa49d3457520dd98ca1489b78354d7d30a9bdf2181140072ebda1c3dc3371e450100000000000000fe5ba24461a8be22c5e553d2715748ece9c50a621d1794e36ad6c40dcd5d9c2301000000000000001e534cbbe982369a968006efa465cf2a16807a88a5c877d45f090192ea619c6001000000000000001a15acd9aec8d1dd06c7b6a46be298c3fc2ecd51be6724a63da4da286e306f72010000000000000078cf1debe3fc0da2ed2473d1e1835a478cc3e7008e0cf42043f287bc36804b710100000000000000f853a1534a3af56217661420536dd7bea0db6f6db843d8fead77c308ed7dcc7c010000000000000032e2c97e308c84afea4b37d7dd8f62e67763126c357c9e6e49b27f54c3702b73010000000000000050d2e3ed042861cfddfecfb31d47caa1927064cb0372213a3015b2acdf1dd1450100000000000000843778dfeddea10578fab2773f2827c62fe0efe374d9a01eb370bd8f1427e7630100000000000000140fbeeabfb02dede7214a17c2cf78279d076c80d962431f35d1105c87b8d95501000000000000007cb1f225b90c00f426c33ac4338eeb2dae6467b8a9da5c1556e6588c12ca977b0100000000000000b261a66b9bae17b65e7f6a88d65efb4519925d6c418c9e2ba17bfdbf684b776301000000000000009c5d3bb1387f53f0306bf7f24e81dafa5bf972048de867e2e517938c4ebdf712010000000000000050cb54b1bf159465d07933eb2bb1f435edd935c308418ffdd6f25d43bac8362b0100000000000000560c91919fc22867159ed77bee1b3e70d2e222a5fe6e830fceb13b58b0daa5290100000000000000e03e94cd4419d9cb8709ad2859e598912c78c01b15eed53ec0c336d8d6c491420100000000000000fe9d62e17387326c0e4b75697b2f0fbdff9506992e745d61b4c536c4dc10f57d01000000000000003227028def74f8ea7bede3e112e4ce09d8fb823790ed599f2259019945f2690a0100000000000000464d95a7c8cce76af088d8f781e3073fc194333ab20956b4dd2c25d4a29ac56d01000000000000004ca838afa9f12e88436eacb5024f3f94c95a66c32e114f65f3136176e426c75501000000000000000c60356c02d5d99293952c478fd07b2cff982dbad863ebdadf25c9e69206f14901000000000000003a8b589c8222ede45b3d95c8d9176543ffa9a29cbfa0ba2af60fc412e732d75e0100000000000000a43b19f13ec057124df240aad303e969f7d02fafc02c263d7ec814b6729d1b2001000000000000000884c85734b971a88cd94d86d3c62fdf163256a0387e15e2d36d8f25523a77480100000000000000f2cd13ba1efd67dfd5f8c9150b1a74d1ed1bad1a72c36fed96163b062e463d0101000000000000002001d47fbff7291a50650047b27cc47f1d22a0bdfbbfb0b8b7a6e8bbf350bf620100000000000000ecf0297bddebd3d766ea7def2bac79ad6eb650fabdcd029b99cb1649ff7dc8150100000000000000121f9d8ba85d89e3c6f9a0fedcdfc9b05cc40a6d3324eff6e8a58aec5f52590501000000000000008a16fb5a6718a714296cb8fa2ca708f677f78c7f883ba3c5ad1bbb9e23f37705010000000000000038c9a0897d9caff03a308d2120bbe892974ae8cb05f1cfe8b97259f0ac2e8529010000000000000006adb1e6e78084fd5e5df37fafc180d1ed84377ca41de3b5ca43b764f0cb19090100000000000000a496ba57e511f86ff4cf264f9fd7bd3595b37ae55ad671c7790574c87d40415201000000000000004e466f6a4930d856a1f53f21c1a44451ead20c8c71319f6a685f0e254d24c32101000000000000007617b69110c43683b5000788259be855890c474be8fed65d7b1dae1d534ef85c01000000000000002037d70f4c244c81422409ad01d28d72a30d26e595fbcc791daeb57f78a8567001000000000000003cfa50228b841c7d2fab03db7e4bf282cf14e127ab9b31c23fca1a79be54e823010000000000000088fa8bb07ebce99964718c65d0d6f1b091ef2f4d4cdf7b94a22c42c007ecd706010000000000000052ac28ba2601723d23a086b5d775f19319f110ba5e9292f2af461e71903b5b50010000000000000002a4b2935b657f9ec563642ab0f34e223ef594cc70c856b9bd70fbe0837215600100000000000000c280e82e46ecabc4d68169e292c59cef96432f25fe849b8a147db5ca0ce7e17b010000000000000092e5bb9d0906f768dbdde0696b78e493cc78dc1f68789575b24f0b962799b51e01000000000000009295a1f023157921d346b73484b120d46048382107015aa9ed998f1fae95970e010000000000000010e37a12fc6ed768d1a2d33c8abc6db675381dfe69c832abb77d9ba2341b3c4a0100000000000000d8de542a748c14224ee7faa16157727c852ce502a45b408de0975c88a39c690f01000000000000008013bf5a25c703e64dc4ae7e1248c0f2c7abad9e43672d82611d109740199856010000000000000004a3d449da9c2c02c963df1433b66d0b6599e7a667e3818ecebe84357081703b0100000000000000188d1a45dca0c370ba6b7952ba682570fd4f61501c4dea9826a981374a3f815f01000000000000004c1dbdaaf0fb061228d2245561476088bc608788cb3e9c5266f5a8e54bdd1e670100000000000000d23c53a531e356646133db73065cd83999693a5bdfc05931238434f5b031522f0100000000000000585ecf59c1396544c1f1dfa5693ded0c96daaf05cc70d55fc8c6fab487b2022e01000000000000006a40a8b74a142958efb2d75cd363635eccbfb70cddb24f0626d0ec927d98233801000000000000005e127fe875a9c6396693b778833a710b0426a4fc0af4af490e7ff0a6f3e8b61f0100000000000000aa74176b5870c97b754a157ec0d8032148c2ae717a905e0e5e626048b6f5334301000000000000003e07b075219fc7ace8dc3bf3a06f5dc12aa9c7e45fe30244d2284bcfb1e6ee190100000000000000a4a0bc81aaad1ebce3fdf896a8d6d081ab93efc2de9d5c56f2632edfeaa7ad0f0100000000000000465242c8915eea46e25549f2ab97cfe78784f25083e51773e07d5a0cafc2de32010000000000000022376791bf19fefac611324d27bc6acb4b7f7eec713c186adbeda5a1e1b88f3401000000000000008e3509e2bcb4497b4bd7b09dbc1d5647212386afc663222f97602067211607160100000000000000bc8f93a45201992fa9d04355095d03adeb5ff1aea206425eae4f902ffd47fe200100000000000000288c08430a7e427400dd5b61926b74a82abcbbc91ac739190cc791a581f6836a0100000000000000eec1df2a382f2f9d0e7dbd91ebffe7be19dc9e01159cf3b82229a3ad2a33685b01000000000000001810712fbe92f2394892a99e3a825490baf1efaf7a3dd1c9bd0e58da0d6711330100000000000000fecb15325d9baf603112dd397d2e83d3694414f529d75c4b639c7e775b979b14010000000000000028052d0b965ed862b7861aa7f3f91fe52ff8b0f795ff476c7e0a7aa42e79933001000000000000001c860d36fc84a54978d99ad400a719dbbef493f8631856e6def3e9ec998cde3e01000000000000002ef781a1d268b8afb0a8331ece83f3fff6877baa2d06ed9a23d484d5d70a50030100000000000000163687f38841bbbd2b93787f7f65cc74a2ab94478888abce52207e1b81f46c4d0100000000000000e0b770b1bcf7deb030ee75d5bad6ec1ebfe06ded0fc406a8520a9650fe832330010000000000000066a5a598bd5d484fe66e630a3e57f3b245fe0413f81401d7a5d59aeed1a3a46301000000000000003622bfbaf9350b5906bdf9ce362e06726224ed141c5d29e8e175e0beedbd3d3d01000000000000000469db5710f30dc9ed7411417170efd62ce8bbe36ccab6df758a94aa7b7f720b01000000000000007a661c99fd40492b4893407b03822464e7d4853e9ba47fc9e9960c3800d6725f01000000000000007836067da2bc290dc3c428c548a4dbebfdeddbc10a2db206abb6ac11741dc63e01000000000000006ed90090a744a0d55adf8f8af5af4d5198bb67220ce33fe71121d7c51f27a4130100000000000000bc20aa968087f7c0d4bb35dd9c502db39fd7f4596a412880fdcd5ddba22fcf460100000000000000386f18b82ffe824f7ee1fda0f511d5112dee1c677bee0069f3d8e3d8be1a321d0100000000000000d636bcd260e36a2bea4bb1667bbc86285967381ad5822f8cd98ff7d5c88c7430010000000000000072f2ff3d21f4126e217f10f9d9bd18069c12eaab6922d073dd5241ac718e91200100000000000000f25d3265659fca9d24ca877823644f1223714b0167d0a676cf3c9c447173d12f01000000000000009ab493c4c8007f49a3e7d1e9f1aef39b39cd66a496e90486e62664725c6ba06f010000000000000094cc8c46f9670417f5ad9492d17189c4e03e96122782e92824f05e176d6843790100000000000000369a7419ed7884aecd3cda7ec3576942cacde7a9b8f2fe9a1115be827e2ba83b010000000000000096ef8b525c38b9a74a3014bd99979230dab2f20221e8c7d1db50c7a61a02e97e0100000000000000769d9f8b45bcbed8fd84b86d2203ee20d199212007387b10216f8fd9441dfa28010000000000000092c996c1fedd09190bb0fa8cc79e4075ad79eca3d6895d2a99d20e6f89e4182b0100000000000000f2065428f52da2f7a881f9b94bfd38719bb6e5ff88a6800bbb3aebb1a9ad2102010000000000000092006149452119964a75232851f01361608dc0a52031f240e93e70e98a3ff21901000000000000009ad36892ec05281de9c63c7cefb3f31e448957a9572e650d9f3af1f21b2f515e0100000000000000bae8e68bc8f1b66fe3229ee72d77137b394c6b7dfbf55e424f9d2c82d5c99600010000000000000098f7988d5a74a0e52f58dd3d232ac3e93ff757480db9d4c12761b04fef032c460100000000000000248cddedee20dbb65f20a1715c2490c09241f6800b72d0c4029a1c234f2ce74b0100000000000000a8c366514ae829385912b04b0192e934a20045b36cf1911bccc4c064d6d3c46101000000000000001cf3abc7c9d8027488ea2f5f2463fd091b194fbeeebf560875e8648fbc67dc24010000000000000060b521110672f6f871978fd3ac4a835b5e30c3fa727c04c70dbc543fcad38b0e01000000000000002ab0b5cc358184be4fa29e7a3dc24806a72e55baad40ec9a117324a884242c280100000000000000e05c7c7d82498be85294ee984e1f0caf23c53fa9a64cc7e6c5053304c4bb785101000000000000005afe620da258a48f00c3afbb8a98161e977f076c7e7f8392975a4f0db4b57d610100000000000000a61667ea6442054b56111477f57ecf39b6e90480bfadf54c3e6cb5ac3a3e275801000000000000001ae9aab4a890c558ac8ab90ccbbf193b3841083670ebed278b2161fa2ec7b3040100000000000000c2d156c96e21691a06cecd4a396978f94cfb3a1760d41180efe382b7ce8e993f01000000000000004616ac86f0d45899eed3f1246dc5744858a694a92b0abd9f10e52dfc9c2867460100000000000000a4b31af719e5d9c3b69326ef920736e8b620b329eade475ae23a33fbd445df7201000000000000009281394b5d35827c826e1d7444f346c247b9a004aa0292a9ca2b16e0fb55687701000000000000007e88cd54f47c1f4ddd9d3a198fc689d24a523fe186d526b14e476f14ced7db3c0100000000000000229fcd7685d064b9c265aaa3a771582b6600cef963f57af160b34a81c9f84a690100000000000000b225550bd99c7b1ebfce319d76f52fe96c661d6106a4b4c37fd4eede1ba4654f010000000000000024ad842dcdc5f4d84262c6aee5116e88116fb191dbbd1331453202d3583b1f44010000000000000008c21904ad29b5bb3f450de1e5bc20687a45865b5fa3794b3ca089e8c6af761f0100000000000000247e193d802c4416d584533476f39f42cbfc5f35236bbafa4c3bde394eb17f1301000000000000005474f03ced668a1459e8ed416f510a16f551ec1415c42b292670545a3967d311010000000000000096e0b71982f3e7ba6ab06d28dfbf803caf4ac51b7633bee848f4f3fadc0dac48010000000000000052add6e82367acf14eb6bba76b60b8bbe010dd1a58d62ed7814d1c385467a2730100000000000000267e26d0bda346533f2d75c1f49329e20c962cb487d933919647ee110e9e24750100000000000000386bcf52f4c464e6a18169f776d69e90880301f01fcc8cc0ba451f1d7e6c3b7c0100000000000000206997febf44c717312b9dd8e0a2601abb9cd8bfcf04ae893aee5788702fb9520100000000000000b41546275611fa185c88c7016e909222b3a757b476316766a72729d074d8e92b0100000000000000a8d082a4289fe5ccaada604e70c4b1473d6fae4374663672e61474852c1ebf2a0100000000000000309ab613bea03c4431f7602c937f5a4d17e2102db6fc7f77e32f7a245041b90c0100000000000000e0ee8ff76b364ad2ccc3e82e69cd700c0895607a449c5af3745bb3018a1843220100000000000000ee52af7afebbad49a1631a96d790be136a9ae9ef0befcef3944ca16214484af90100000000000000040000000000000002efc8cb869ae5714a4f4f590372f3a9a76d748e084658d023958a3a549d616486cb28320101cf2000000000000033730011000000006009000000000000a50432904ec260963195582a1d339f9fbd2d5d76f551160105c922423cad0d94482f010000000000000076441c448aefcf40a72128edc9b44a4f7ef9c267c503e98f5f9c72d5e9e92f000100000000000000526e055ade4ac425e9b5f93ce4394601335d3599a5b742603126d78ce99a4a540100000000000000d0e8ddfdeacd8e163b01ca4da1a4e856312b0de412b492247070f2721f7d803801000000000000008008c1b7061a2402634fc15d3849e2913863beb9f55024bc8cc7fa7d6e397817010000000000000024a51a9bdb67213626d1b52bd8dbc0e9b94ea88ea417aa17b56212d1cea3e1780100000000000000488d520146f681678e9d229f5e29354edf65e521246b28a4175c0502e060b9200100000000000000da663fef002e63d5de9676a1a930abe7b0d8088657d67a3f24076bce08c661490100000000000000a86e2248480b1f6ad903a965344ecef69838aae812ba3c39d3d9eaae22963f2a0100000000000000f03555628bc649cebf75046ab9663faa1a5421df323f99c82782b7a3d162ce080100000000000000aca7a86b6fcf25daa7f0767bfe36b284f3100dc1ee4dcc971fbb3244bb57221c0100000000000000ba395fcb33327501109ed40712c7a372d25bf3339edfabe2a1964fb7b5d4d82401000000000000009cb389c209afbebda2b12113e0266b3d30f46e2a91aaf4451c193d640288357101000000000000004c9886e2e62ee92a6778d6a7928052732044b64fa61969cd8e37f3f7e3406f72010000000000000026db7c5786fddc15f7e96905024905d877537451ed444cb97d3786361a59f64b01000000000000005237e4509f24bc9e8bf9bfd78b594219d86853ae16601f692f10c9b16b88f83b01000000000000006869737a2873891c0e4ef80a69e331f64ffc3663c9f3cdf86b440bb41827a252010000000000000098192016f83ef2fe74dba1ecc6526efc61b79f3177c00dc7c053160391858f70010000000000000078c35105ea4cd9d6ea0ba91b2c19e78f60931bef5918c1bd2e14259229e7c330010000000000000006d2846642c835b0fb1ff1ef908449376aa8e7c0f3352e55da9a1e97e9528b230100000000000000f8a681118ea0bb9dfde2813ce5144eeb5cee881c27883de1c0c759255ec326540100000000000000ac8b2b59f77eb5f3725961767878166a3817747018f18cf48c933e284320b90e0100000000000000e67c524e443cda4cd27dfcce70488a5d23a93c8c46a5e83ef5a69eff3a02fa5a0100000000000000a42289d68c963358f3c450a850242bb53121e73e17f0e2ea2b93327446bea33c01000000000000006c50859d9dde209012eb3868c1a3a6e80ae8fa528ace9df68e92dbbae60368200100000000000000a8e470f2339e3ed0da456780dd9207e9c6a02459238ec3057a6ade01fd6cd60a01000000000000005c7f05d77f853f3eb8d4989fce36d0808b6d2b881e26f13c01e939b5d489a57d01000000000000002addf696d5a42b0a3dada689731e00c991db936909df869ac6600662abc35310010000000000000072ed7192625403acef94aa9189f9f179deb89e60478816ca96c79b742f757e750100000000000000b4ffe3c5959ff37c11c6f19d91926cb97aa4bf0f604919e1753bb55664d061680100000000000000bc4c9b5425f9a2aa09e3239332c702dedbfffa2b9f4cc1b978b307fc1fa1337c0100000000000000e07d5b19d98a6f8ef5c964b507fcd88f500a2a0a9afd5cffe9d4e3f74d83b27f010000000000000024532b17fc5fb786660c52aeb03150799165dd05e88ce359189189a4b771f51e0100000000000000b0033313d23127061d7f052a965bfeead348e6fe54f9915474ed52b843382e790100000000000000be18787b5177e58664cd893fdaa20a3ca1bc9f1acbbb15036b046ae49c17c15b010000000000000072a85a9dcc0af833b5a21a51ecbc4a9855c2bef8848e080ed70ac48cd1efdd5f0100000000000000c49cfd152ce3ac1fa142b3b6e720cb173eb7f43c82f021418253a070036f870c01000000000000006ec27dfa7ac9d35eb002c55d3e4d56b4df928dd5c44323ac228305741c9e0936010000000000000078f674626909d11d18b6b9d6c21ec4023a2073965c68b2172197f5a12e3e17600100000000000000125becf853d8dc03bc97114ca0c751f6045bd7ef5580e58d32e3b47d7ac5b60301000000000000009237113cf97fee5fafbeb82de593f6125e9c498bd59f0369625f46b326c7d9170100000000000000722d7d57085c250af633f2d461874d59aebc8021eb1112ec8805db5ddea53e5a0100000000000000562fd7529c92f9370dd6d7ce60d06ea4a826cbefa238231993ecfc9e7725ca240100000000000000a20797f3a8669a909adb22a3aee2844dba82d231cc33f5d9be0e2c533cb82a6701000000000000006a1274b6748bf822ba80c9a9416abd3cf591b7aee6adabb8359b7dbed8ebb3770100000000000000dc1274e0689c7a3eac31b41ce352719529e65c01f26999f74ce17c9905fce87401000000000000009c9bc1074cf465c0dd39f74bfdf16a67f81339ba2ad117a0c7030b4f0678771701000000000000005c0494412a296a92296160ac510697d97288753829a5e9d02eafb5f101e60f510100000000000000d8b38c77823eb1912bf8b743cca6c655ea1844ee468fbd78b394bf222bf8bc2001000000000000007251d6c376064f07f27d2532b05c091bd0978067b078c9f8d9984fd4216bdd4b0100000000000000487c6aad1cc26893dc7e498916a4c23d303f098c04b0a8b0c8242fbb7e73a16e010000000000000088f9a16886165d00612032cb1b36669ad62b7325536f499191e711134c71b6070100000000000000bc4b95226de4e10f91e0254cfe4541232252deaa347f567df124aba81bac4d3f01000000000000001eb833e31087d6baffee4e7f1d9a8e3b7013ea392c81f74313a354ba82e92f6b01000000000000009c8c7c8c91df0ed53864f69017d530b5ebda3ab4bde3c67027e70893213d533a010000000000000018ec239eec5457ba11a41518e7c5f98266d1bdbd67602641d04706f95dba5c560100000000000000ee0c4369d7e5dca53a68ef223db7c858f2a97f47394c7bc678a8edf719a49e130100000000000000c65c0a74887e9fe5cc56696fac7e7f5f1cd4a68f9661c8384b300bcdfbe67a1801000000000000003690e6ef639f685849ed93a6386d1fccf026c3fb64520940aa46af97f929e112010000000000000028a027ca1c0bdeebfc8fce85ac4bac48cc072523d9c4a86b4f2594f9142e7e3b010000000000000042e4c41a899dfb238649e5b17dc232c2699353635d60e6a3bdcd71f9b82cda300100000000000000ce4bfd8c5611b1637066ef9e579c85efadfc9513b882184e00b75871ef7f5a2d01000000000000005c0419f37036f2bf999f3958b49f63ab19d6dc19847a393dfd26cf303fc8d911010000000000000028558e46037c51ece4d39a8a4d34688662e629413c221d6226afe454240e702101000000000000004a2073ae31b3df10d285eae6a5befe069183c4c6a6ffa1b2bf432011d0d475200100000000000000f8cb6b856e416fc9e9eec947c6f76eefed65cfe5f1e117a7271396729e5cc8490100000000000000bad91c9aefe173441dae1f273e55090706d412b0723d39bd6c3af053feb183200100000000000000b05ad6cde0dfc019d740c3f50b8aac16550ff4c197da19cf23b9293f0c5c390701000000000000006e3d07ca7f680aee933830ff37197bba65eea7d3645ac0190cab4715d024bf780100000000000000bc56c07cea21bcbbe058aedd2ced9fb4757caead55f96bda9bed1c9669c32b64010000000000000078e1a4fecbaac940c04e0b591a01ea66a574b5098852ded2810e3a534971111f01000000000000006ccf2ce8e149999a7bb996faa65194e60aeb7bcd1937c787f886fe979fb49e6601000000000000000e5650026c7bee4fa43a2c7fcdc3452daa10b0530863ec686b1d5ee4d70760050100000000000000dc19020c36e3442a05940551f1d6b4b7dffb3343dea0418a8203fc22ac129e6101000000000000001e866bed92016cd2dcabe2d87fcaf8c1d7248255cafb9e10638fc3a2b476221b0100000000000000946071eab9c0fa1de9be2ad3c18041f1326faab41d84d9daf9f89c0daf9c0f00010000000000000082b820c5bee8ee77e35203dab387f3434b8502e5f1c35dfb2ad15b5c89d47b3c01000000000000001cf3446b4b5116a1784d92cdc5101e55a5fb91ed3d93efccd06b304a94362d0a0100000000000000c6d5dc6e1ec83491397390449d8cddaa88631e8855efe50697788a93de00fb5501000000000000003a4b0919068523aa04ab29f1b49bdc03a176a4b93f9b5a7e6e0cdcc8318691030100000000000000b288a9832e07bef83c5a8ca72c5a5583b321672ba7c6cdd44a971f855d32d95c01000000000000007480edf84ab569e559dccc99b87ecb9ae9db670b45a259b7f6e618b063e43113010000000000000020bedd48a5965e2fc0e221bd164deecdee849eb69cb8dc63a37df80b50a3093b010000000000000026c4a27200f70748b52f7277150d2db7e192b258d5001412e42c62c6e3ee1e51010000000000000040a2527ffa7d30d788eca127d435c8b5aa48972cda538b9a1627a57e85c8fa190100000000000000844b691aa95ff9a15b50f5e5f4f0e582db6621326cf18d7533f55bc27549497a01000000000000002254fb9324a6a9af450ce3a4f5ab25f55deb22161e520b2308b8aaff42e3aa740100000000000000a64dd29103d43e3e898a41f3630ff88b2420953febb931c70ff543673efa251b01000000000000007c4f928b915062d9cb15e854a9476cddbf7126c9de2fd70f67beaf2ebf6dbc5c01000000000000002cf9dbc1e451ba3ead20d5d826533b9315699b3ba0784bd812e15ac9ad31f85d0100000000000000fced8f1dff4f6c6852b0d643e26ee532086e72be7aecee28d94d1d59b5f9986701000000000000004a905d0574cebf6e8d00d382b104fc8ee1c008f1b9ffa6fa5c3b67ff29719c0d01000000000000008c64cd873a53fec10c4624239ce35d31d4422e32a109605a162fcbf632427733010000000000000026d7422872cbf4d4918046f240a13a37219a272f4326b3f3bd1249829bbcd12b0100000000000000be6106f9217a1847af66de9510fdfb40514409556506ddc1c1a897818434125b0100000000000000da98e4363908fa4d7980fe5574ceeac74fae49bf77b3a191654c7731214a565e010000000000000094af0a39f196a145c9406ace38b2b2b9b9ccec2bf2da2e95d0b0b8507b6f38560100000000000000bca6409d6d7e4f94ce797594db4363bb8bebd5387770aee0bb7663b36354fe2a0100000000000000b2518044cc31062ee50fa81cb6983f314291a0300865fa5cfe149829c5050d24010000000000000086c1922e4ed392d72e0fbc0ee28e7ec0a8ba2b33470330a606cec9a159a79626010000000000000036465f4be77147914969ea78f8e39610310679011dfbb6137dab12e18a687a5201000000000000004e8cc21504fda961cf1cfe78e651d033b10f8ab1a4a0c757bd4848a7f2827f0601000000000000004ad8fedb395dc0ed63e0edbdbd2d20555b61a46aa7cd751e4308335c277cbd6a01000000000000001285919470b092c61b3deaa9ad83226d41f36d58f0ca5f2e14d11d0724f6f00a01000000000000004c5e6997b6f186855b1f4c9f8ab2d6cea3da2e86445605ab89e5b5821e05bd3d0100000000000000944ad19383a9ae136f4f11c15687923b9b21319efab021336a3e8f2bd5b5ca20010000000000000068508b2ca3e01d7c8d79d99f1bb06a93058d14f1061d5fed4df13d4bc30aa557010000000000000074f02ed037d28c883df643034a596e4d2a97a23782ee8483c9ae3429ede7e7090100000000000000566948c62b699e382e5379592d1ad3e1823640d386936142cb9b82915ed02d1801000000000000009493e6de34e09c9679b6dca602e38d8c07abb77b3cc487ae3a80661968caa37f01000000000000006e7a78e9fdfe275f3e000382ba30452729970578258839db6c0fc568e20b3515010000000000000004734733edcd9cf662389208fb8ccb5f274a7db8187ccc53dc84250f8599d54d01000000000000004e1b48e67c1e62e46add39fa523b956946228ea0f08bd9d20ced798cfc9a0f5b0100000000000000faa6ae896c2d1040e495acbdcd8d90a02ccb17ba6e507efa2f7deacb3b28466e0100000000000000840290d318350bff32db3dcf6138b822cb2adf1dedf5bad8729471988955915c0100000000000000907ff7ac1e6c451d236c05c8d3f85640d9f9472d6a30115fc26135dae020e6380100000000000000c264fe63e84cd004530d2a3eabdde5098fe5c6b619af7fc6c9cfeba01e75ee5701000000000000001ec005e9ca3c15b2994641dd22efcbb20032f10894f76f57296d219dc149817b0100000000000000a07f151db53097c2da9dac4b2e0f194931a677a3ba99df0f3976e34409fd64760100000000000000d8faee17dcc461acb22ca1720b86385414ea8810ba31509fbd8da8733029eb190100000000000000b071e9d6b444a555e034ecdc4d04f2528cc36b347b231b33388564a40fd32b2c01000000000000004e047857f2ec0c7cf295a0673fcc750d4c268cf852711196c4f05bd9dc6414260100000000000000f820a8ed2c97f639fea2892d0a89ae98ffc4c0054f948f9a0108e4d99f89994c0100000000000000fcd5f4c4fe11f20ad99dc8345b7dc5600caba5d5b7d3f499c3253c095152d45401000000000000005eac8ac37c95fc11921839550a30ef071bbc80fb10ea1482cc67818e184d544a0100000000000000ea2b17bd1b69a7b442dd000db0f12f0bd4bf7a87a540427986bd32f3d3bd55580100000000000000142445d894c1236a38c6b1bcd9f5a7245897026424ce9544002008a7702c3b1d0100000000000000d6acabff06fe9a6ccf02f780f33902672fae0f038d8e19ee234ce28a0b6a01410100000000000000780e4353aca40b0f2b2403c862cb33032d49a820244bdc2853ce158d48c4f61001000000000000000e2daa2ef7884bdc7ca5f843f4f33f070c790e9a19d314bceefd04622920216301000000000000003e8394db87d36ddce56bfe0b86922dcc9a86d1ba061600e22d9694027b18c840010000000000000042bbfd10e95a6a1a57b34cbe01ab26605536797742d6d24394ebe95f87bd925c010000000000000040b77fd8fcabe868dc7f2a08bf14c67e4d433886c3cd3738d1b0b9c649bafc230100000000000000009463e59f6b021a1dbdbf65e56f568ac5736baf96470440d7123605a4bcd93f0100000000000000b633c47d126eceb0e36d788370ebaa179b0c7a3a21cf5f1421bfac40c895ed3c010000000000000092ee092cd2215c7c1628086c08be10a3cb969f6b276f600422f3526f303bd8780100000000000000020d34131c7a0ab6d104839ed8b9e0cdf075b80409a36fbe94d0cf83f7ea1f1e010000000000000022333a4409728530184f55b95171d2ddcec037603382fc7d6443b1f7b96c813601000000000000009acfd215519f40156749868afc8d56e015759f71cf183fe68382e8c02c75b2510100000000000000f44b3ec5c7b2188f208d60d159d1f5b0914a51a0632eacea6b88ec7b26d6673d01000000000000005ce79c3ad8a0e1806e863f0858c28a81408d19870a62ac0316b3e6345cbb5f76010000000000000006451fa7b2d831264e40a3e5b8452ede10164b7162a0e93bb9789a102c3010420100000000000000b672ee2f0f9183585ac4875368a0defda6d3c81927fbfc34bbacc7481058cb4b010000000000000022a66dd6397c2631df509db3482baac28b546729e6ce965472a9ba2e648ccc74010000000000000082bb250beb58df1c5346dc5dc26dbc38647a59fcd5c220c41466606cd855a2520100000000000000a065f45a353f24ba187248aacd9c64d5c3a92ddf92b4a5c33994f56a07cea840010000000000000078c91c4ee02089ea86612f66d6022a0cbd54afe470a162a72036611623924f6d01000000000000005432de09683010f3c1a6a977dd0dfdd8c5ce9fdb85225b9b7dc8e451e340cb240100000000000000464cb5dfedc6938caef6caaf5a58f4925a295f24a4f37337033dafa0cc733e6601000000000000002a98fbaf7ec22832522e3f96821711ef684283911a524960efb14953255baa2b0100000000000000fe0af833307f4cff497d006ec63385b1c191efd6a4547fb05a355cd23686dd0401000000000000004ed5f55ec45727a57e2d8d6914f6d2acffb17b9515d347ba045067502a0b140201000000000000004cb98af1a70e917453f5dea682917e7b3077ea9d41dda7764433258a9d5db54b01000000000000002a0fda136ae348db338b87bed349145a94ce091227774b0542e533a83d1ba455010000000000000036c5a061b47768957b2b939b2e37e4cdf8825a4abf963c4f912f3ba4cd567f1e010000000000000076fa252aeca5b108fe76ce12e395ed8105d5c98e4abae38bfc7cb4fbd4d43d5501000000000000006a5607bc375d7ac0908e7643ea2e89dbe42f4f805c2fb6e2a22d0385c1232b310100000000000000f4ccdf83d734edcc568462572abaf32d22ac7faf8000195e02273d1c9665430801000000000000007eb2b0b6adbe5a5bad38f46db207f94c896d419661f4ab8f21e302a543df9b11010000000000000048ce0aba6f1554e139568b4d2358d6cca9bc291d3600787cc3e732291002ca2201000000000000007a07e4b6b4daf45f4af2a98e7458034447ae0e67e9a22596848e58d4ba73b9530100000000000000a8731d355eefdfbdb7fb12cfa5a280c0b1e408aca264ef585d42bf97fcfba1160100000000000000c4c5fe47a568c2fe4876eafd5e0093dcc31b450eb87bfe58397dfae2a590d4650100000000000000fa5a4da949ce29dd0fc20fe56c40d63ffded8e2dd88844f725efda0814ed526401000000000000001cc40fa83cd0a4431aa63315b55c669370a4037756089f3402a9021e2d80666401000000000000003ce775a4a6215dbfbdc2b0a8a8b71936abd61642b5fd1a0c1d06ba548ad3025e0100000000000000bcb998778b7c2c182f396b311f92ae1289daeed9e62a3d8a8298b8dde7e1a52401000000000000004a1069d2203a75cd1078c39de35c16a6c4c12acbad34f1cba8efc065f80398610100000000000000eedea8652413b5a97c1eda13e1e050b777bd0a8ca31dafd63aeab576a68fb75e0100000000000000cebdabff22e607a75aa8db1bf875511a563200cce3f089972aca719649b6e1760100000000000000245a9f1c784e83aa6e1a22b7a560de42348ae1c3402060929d669f110da1b7490100000000000000feebe707a9a5eb136d04e5b3b2124627fa76129c1e33cba1d1323047f76b3f22010000000000000062c6c1f6f2478ee092c958842ac4351973bfeb49f55e33b8415ac0296a967b5f01000000000000005c25d331b2e023d12ee512689c3ea95edaadc300c9dc804e98806117f2edf57c01000000000000006205ea8c9da2e39792b9504100d0ce7eec4b9c732297afea3c2a885fe4f5832401000000000000009a64daca74d14dab93385e52ca70940732a8d45ae4b853ce156c3eeca06f0c5f0100000000000000c63e31fd558807e07f9c7dc51f8fa8110679bb1b1cf5585e56d0b6164179b9790100000000000000eed7e8e8a64dfa89c548a31c1b9fec7af5aef4dbbdb26997b2ddca72d4f8790c0100000000000000fa49d3457520dd98ca1489b78354d7d30a9bdf2181140072ebda1c3dc3371e450100000000000000fe5ba24461a8be22c5e553d2715748ece9c50a621d1794e36ad6c40dcd5d9c2301000000000000001e534cbbe982369a968006efa465cf2a16807a88a5c877d45f090192ea619c6001000000000000001a15acd9aec8d1dd06c7b6a46be298c3fc2ecd51be6724a63da4da286e306f72010000000000000078cf1debe3fc0da2ed2473d1e1835a478cc3e7008e0cf42043f287bc36804b710100000000000000f853a1534a3af56217661420536dd7bea0db6f6db843d8fead77c308ed7dcc7c010000000000000032e2c97e308c84afea4b37d7dd8f62e67763126c357c9e6e49b27f54c3702b73010000000000000050d2e3ed042861cfddfecfb31d47caa1927064cb0372213a3015b2acdf1dd1450100000000000000843778dfeddea10578fab2773f2827c62fe0efe374d9a01eb370bd8f1427e7630100000000000000140fbeeabfb02dede7214a17c2cf78279d076c80d962431f35d1105c87b8d95501000000000000007cb1f225b90c00f426c33ac4338eeb2dae6467b8a9da5c1556e6588c12ca977b0100000000000000b261a66b9bae17b65e7f6a88d65efb4519925d6c418c9e2ba17bfdbf684b776301000000000000009c5d3bb1387f53f0306bf7f24e81dafa5bf972048de867e2e517938c4ebdf712010000000000000050cb54b1bf159465d07933eb2bb1f435edd935c308418ffdd6f25d43bac8362b0100000000000000560c91919fc22867159ed77bee1b3e70d2e222a5fe6e830fceb13b58b0daa5290100000000000000e03e94cd4419d9cb8709ad2859e598912c78c01b15eed53ec0c336d8d6c491420100000000000000fe9d62e17387326c0e4b75697b2f0fbdff9506992e745d61b4c536c4dc10f57d01000000000000003227028def74f8ea7bede3e112e4ce09d8fb823790ed599f2259019945f2690a0100000000000000464d95a7c8cce76af088d8f781e3073fc194333ab20956b4dd2c25d4a29ac56d01000000000000004ca838afa9f12e88436eacb5024f3f94c95a66c32e114f65f3136176e426c75501000000000000000c60356c02d5d99293952c478fd07b2cff982dbad863ebdadf25c9e69206f14901000000000000003a8b589c8222ede45b3d95c8d9176543ffa9a29cbfa0ba2af60fc412e732d75e0100000000000000a43b19f13ec057124df240aad303e969f7d02fafc02c263d7ec814b6729d1b2001000000000000000884c85734b971a88cd94d86d3c62fdf163256a0387e15e2d36d8f25523a77480100000000000000f2cd13ba1efd67dfd5f8c9150b1a74d1ed1bad1a72c36fed96163b062e463d0101000000000000002001d47fbff7291a50650047b27cc47f1d22a0bdfbbfb0b8b7a6e8bbf350bf620100000000000000ecf0297bddebd3d766ea7def2bac79ad6eb650fabdcd029b99cb1649ff7dc8150100000000000000121f9d8ba85d89e3c6f9a0fedcdfc9b05cc40a6d3324eff6e8a58aec5f52590501000000000000008a16fb5a6718a714296cb8fa2ca708f677f78c7f883ba3c5ad1bbb9e23f37705010000000000000038c9a0897d9caff03a308d2120bbe892974ae8cb05f1cfe8b97259f0ac2e8529010000000000000006adb1e6e78084fd5e5df37fafc180d1ed84377ca41de3b5ca43b764f0cb19090100000000000000a496ba57e511f86ff4cf264f9fd7bd3595b37ae55ad671c7790574c87d40415201000000000000004e466f6a4930d856a1f53f21c1a44451ead20c8c71319f6a685f0e254d24c32101000000000000007617b69110c43683b5000788259be855890c474be8fed65d7b1dae1d534ef85c01000000000000002037d70f4c244c81422409ad01d28d72a30d26e595fbcc791daeb57f78a8567001000000000000003cfa50228b841c7d2fab03db7e4bf282cf14e127ab9b31c23fca1a79be54e823010000000000000088fa8bb07ebce99964718c65d0d6f1b091ef2f4d4cdf7b94a22c42c007ecd706010000000000000052ac28ba2601723d23a086b5d775f19319f110ba5e9292f2af461e71903b5b50010000000000000002a4b2935b657f9ec563642ab0f34e223ef594cc70c856b9bd70fbe0837215600100000000000000c280e82e46ecabc4d68169e292c59cef96432f25fe849b8a147db5ca0ce7e17b010000000000000092e5bb9d0906f768dbdde0696b78e493cc78dc1f68789575b24f0b962799b51e01000000000000009295a1f023157921d346b73484b120d46048382107015aa9ed998f1fae95970e010000000000000010e37a12fc6ed768d1a2d33c8abc6db675381dfe69c832abb77d9ba2341b3c4a0100000000000000d8de542a748c14224ee7faa16157727c852ce502a45b408de0975c88a39c690f01000000000000008013bf5a25c703e64dc4ae7e1248c0f2c7abad9e43672d82611d109740199856010000000000000004a3d449da9c2c02c963df1433b66d0b6599e7a667e3818ecebe84357081703b0100000000000000188d1a45dca0c370ba6b7952ba682570fd4f61501c4dea9826a981374a3f815f01000000000000004c1dbdaaf0fb061228d2245561476088bc608788cb3e9c5266f5a8e54bdd1e670100000000000000d23c53a531e356646133db73065cd83999693a5bdfc05931238434f5b031522f0100000000000000585ecf59c1396544c1f1dfa5693ded0c96daaf05cc70d55fc8c6fab487b2022e01000000000000006a40a8b74a142958efb2d75cd363635eccbfb70cddb24f0626d0ec927d98233801000000000000005e127fe875a9c6396693b778833a710b0426a4fc0af4af490e7ff0a6f3e8b61f0100000000000000aa74176b5870c97b754a157ec0d8032148c2ae717a905e0e5e626048b6f5334301000000000000003e07b075219fc7ace8dc3bf3a06f5dc12aa9c7e45fe30244d2284bcfb1e6ee190100000000000000a4a0bc81aaad1ebce3fdf896a8d6d081ab93efc2de9d5c56f2632edfeaa7ad0f0100000000000000465242c8915eea46e25549f2ab97cfe78784f25083e51773e07d5a0cafc2de32010000000000000022376791bf19fefac611324d27bc6acb4b7f7eec713c186adbeda5a1e1b88f3401000000000000008e3509e2bcb4497b4bd7b09dbc1d5647212386afc663222f97602067211607160100000000000000bc8f93a45201992fa9d04355095d03adeb5ff1aea206425eae4f902ffd47fe200100000000000000288c08430a7e427400dd5b61926b74a82abcbbc91ac739190cc791a581f6836a0100000000000000eec1df2a382f2f9d0e7dbd91ebffe7be19dc9e01159cf3b82229a3ad2a33685b01000000000000001810712fbe92f2394892a99e3a825490baf1efaf7a3dd1c9bd0e58da0d6711330100000000000000fecb15325d9baf603112dd397d2e83d3694414f529d75c4b639c7e775b979b14010000000000000028052d0b965ed862b7861aa7f3f91fe52ff8b0f795ff476c7e0a7aa42e79933001000000000000001c860d36fc84a54978d99ad400a719dbbef493f8631856e6def3e9ec998cde3e01000000000000002ef781a1d268b8afb0a8331ece83f3fff6877baa2d06ed9a23d484d5d70a50030100000000000000163687f38841bbbd2b93787f7f65cc74a2ab94478888abce52207e1b81f46c4d0100000000000000e0b770b1bcf7deb030ee75d5bad6ec1ebfe06ded0fc406a8520a9650fe832330010000000000000066a5a598bd5d484fe66e630a3e57f3b245fe0413f81401d7a5d59aeed1a3a46301000000000000003622bfbaf9350b5906bdf9ce362e06726224ed141c5d29e8e175e0beedbd3d3d01000000000000000469db5710f30dc9ed7411417170efd62ce8bbe36ccab6df758a94aa7b7f720b01000000000000007a661c99fd40492b4893407b03822464e7d4853e9ba47fc9e9960c3800d6725f01000000000000007836067da2bc290dc3c428c548a4dbebfdeddbc10a2db206abb6ac11741dc63e01000000000000006ed90090a744a0d55adf8f8af5af4d5198bb67220ce33fe71121d7c51f27a4130100000000000000bc20aa968087f7c0d4bb35dd9c502db39fd7f4596a412880fdcd5ddba22fcf460100000000000000386f18b82ffe824f7ee1fda0f511d5112dee1c677bee0069f3d8e3d8be1a321d0100000000000000d636bcd260e36a2bea4bb1667bbc86285967381ad5822f8cd98ff7d5c88c7430010000000000000072f2ff3d21f4126e217f10f9d9bd18069c12eaab6922d073dd5241ac718e91200100000000000000f25d3265659fca9d24ca877823644f1223714b0167d0a676cf3c9c447173d12f01000000000000009ab493c4c8007f49a3e7d1e9f1aef39b39cd66a496e90486e62664725c6ba06f010000000000000094cc8c46f9670417f5ad9492d17189c4e03e96122782e92824f05e176d6843790100000000000000369a7419ed7884aecd3cda7ec3576942cacde7a9b8f2fe9a1115be827e2ba83b010000000000000096ef8b525c38b9a74a3014bd99979230dab2f20221e8c7d1db50c7a61a02e97e0100000000000000769d9f8b45bcbed8fd84b86d2203ee20d199212007387b10216f8fd9441dfa28010000000000000092c996c1fedd09190bb0fa8cc79e4075ad79eca3d6895d2a99d20e6f89e4182b0100000000000000f2065428f52da2f7a881f9b94bfd38719bb6e5ff88a6800bbb3aebb1a9ad2102010000000000000092006149452119964a75232851f01361608dc0a52031f240e93e70e98a3ff21901000000000000009ad36892ec05281de9c63c7cefb3f31e448957a9572e650d9f3af1f21b2f515e0100000000000000bae8e68bc8f1b66fe3229ee72d77137b394c6b7dfbf55e424f9d2c82d5c99600010000000000000098f7988d5a74a0e52f58dd3d232ac3e93ff757480db9d4c12761b04fef032c460100000000000000248cddedee20dbb65f20a1715c2490c09241f6800b72d0c4029a1c234f2ce74b0100000000000000a8c366514ae829385912b04b0192e934a20045b36cf1911bccc4c064d6d3c46101000000000000001cf3abc7c9d8027488ea2f5f2463fd091b194fbeeebf560875e8648fbc67dc24010000000000000060b521110672f6f871978fd3ac4a835b5e30c3fa727c04c70dbc543fcad38b0e01000000000000002ab0b5cc358184be4fa29e7a3dc24806a72e55baad40ec9a117324a884242c280100000000000000e05c7c7d82498be85294ee984e1f0caf23c53fa9a64cc7e6c5053304c4bb785101000000000000005afe620da258a48f00c3afbb8a98161e977f076c7e7f8392975a4f0db4b57d610100000000000000a61667ea6442054b56111477f57ecf39b6e90480bfadf54c3e6cb5ac3a3e275801000000000000001ae9aab4a890c558ac8ab90ccbbf193b3841083670ebed278b2161fa2ec7b3040100000000000000c2d156c96e21691a06cecd4a396978f94cfb3a1760d41180efe382b7ce8e993f01000000000000004616ac86f0d45899eed3f1246dc5744858a694a92b0abd9f10e52dfc9c2867460100000000000000a4b31af719e5d9c3b69326ef920736e8b620b329eade475ae23a33fbd445df7201000000000000009281394b5d35827c826e1d7444f346c247b9a004aa0292a9ca2b16e0fb55687701000000000000007e88cd54f47c1f4ddd9d3a198fc689d24a523fe186d526b14e476f14ced7db3c0100000000000000229fcd7685d064b9c265aaa3a771582b6600cef963f57af160b34a81c9f84a690100000000000000b225550bd99c7b1ebfce319d76f52fe96c661d6106a4b4c37fd4eede1ba4654f010000000000000024ad842dcdc5f4d84262c6aee5116e88116fb191dbbd1331453202d3583b1f44010000000000000008c21904ad29b5bb3f450de1e5bc20687a45865b5fa3794b3ca089e8c6af761f0100000000000000247e193d802c4416d584533476f39f42cbfc5f35236bbafa4c3bde394eb17f1301000000000000005474f03ced668a1459e8ed416f510a16f551ec1415c42b292670545a3967d311010000000000000096e0b71982f3e7ba6ab06d28dfbf803caf4ac51b7633bee848f4f3fadc0dac48010000000000000052add6e82367acf14eb6bba76b60b8bbe010dd1a58d62ed7814d1c385467a2730100000000000000267e26d0bda346533f2d75c1f49329e20c962cb487d933919647ee110e9e24750100000000000000386bcf52f4c464e6a18169f776d69e90880301f01fcc8cc0ba451f1d7e6c3b7c0100000000000000206997febf44c717312b9dd8e0a2601abb9cd8bfcf04ae893aee5788702fb9520100000000000000b41546275611fa185c88c7016e909222b3a757b476316766a72729d074d8e92b0100000000000000a8d082a4289fe5ccaada604e70c4b1473d6fae4374663672e61474852c1ebf2a0100000000000000309ab613bea03c4431f7602c937f5a4d17e2102db6fc7f77e32f7a245041b90c0100000000000000e0ee8ff76b364ad2ccc3e82e69cd700c0895607a449c5af3745bb3018a1843220100000000000000d45eba22870b24bf516e7df25b67c81986e93d3327e8b10c32d8a1b3208f9efc0100000000000000040000000000000002", - "babeFinalizedBlockWeight": 5011401, - "finalizedBlockHeader": "0xe054f8f24f0d2997d51756fce6cc7ecb7731a656dc50abb672766ecf0ec6d20fa2e6c804fd14c44bcfc4f7a1f66608af6d08e9b52feff6130ad0eb519fbefad408e6919a7755b0321b2c6b9d3ebd65f57347dd9abf9d1213988a24eea6c41c1063fdd8c90c0642414245b5010311000000cd7a0011000000003cd64eeb4d432862e7ed6446ded0b2e42934b6349bebc98e7e3179938e5d2350696bea1b896f6cd45e2f05baddb61aed7ba6b4edecc5399f8049f909db29820f7c8b859264a59c98872a9716e83af46db366cca16d8a2e1ed64e49488095b30d044245454684030752c33f306b93f0ac407f15fc50c711a0a540d37531e0720ac1eb5a0ea53fa605424142450101b2984693bdc6dc781fcbb1114cd597c7ab6827faebe7d71c9dc2da43f376a416428caad6394a6b745f695c85b06698683c7277d633f85405068f7028feb54681", - "grandpaAuthoritySet": "0xa5046f706506065685b322054d22e8a1f23ca9df75c32a88dda5214ad58b553b4cca01000000000000008a239af78d4659897af698b5670533fa6d215864be8c41e3a2fc4309f9f83dcb0100000000000000e2b9e72d9202e99526fa626d9a6651dfd7c1daec8fc6ba1130af96f7d21a42da010000000000000056b838dd2005e499be47ceef086df4ca9c5fbc1f81968391c31af062a8a8bef301000000000000004a3fc0fe1020c7f460c7bd23d0b657c03368552b2f0a12d80a1c406fd066e0db01000000000000009b992b5e9b99eb2cd3b2b648d6db81ed722a2feb4938d998b58dcb5d159fadfa0100000000000000aee9de3938173700b3e3f4fbf2b200ae296173a0854157f40de2598dd4cad8f10100000000000000262562429feb60edcc7f1db025cc39e6c7b113e26e884338b3f844168e6f6f420100000000000000e3606b27e4146ffe1437860746968e0a026071120cc09d88494126a86d7281090100000000000000b9284bdf22aa83317140b91288555c900d208634f50d07ce8b772d149364085101000000000000005a40b78008713bef1a35714bd32e0ec4c8905dd0728aeb4943280efe766936080100000000000000e8d7333e457fa740db924866152f31c3bfa6124c0367b0878a61aff2d5d6e27e0100000000000000426b2be4596a759a15028d84e08c5c56440e6cede68d088f47c671cc3387c3e6010000000000000070ba6e5985990ba1b1392713236f1b50df750f10f744cc6eb95fa7c5cfbc68760100000000000000116768c765c7ce5a5e895a5342d1f56f1a118901d8d36fe584bab325506f3b280100000000000000e511d441d6d3c822cb276bb2a14b1c8071d9fe1995802383fb5dcf8a92edcfc2010000000000000003e385d1bbcaeed57930ff625035cd65781e3fe9de1d350d783ba261e678c0ac0100000000000000be2235b9d9c9164f494dd688000fb569a37d5c47912ef99b9ebda9318d13345e01000000000000000e0ac68072ac35b8f19f98d13385b6eb75cf6fd4d513d9a2abfe9711b19883bb01000000000000007818639057900f8fb58e3aa8180f6108c251884a9fcb8041ca645cf612bc1eda0100000000000000a8dbfc6cb88ac105e25b9dc7f11e883631824647cd4d0c18014bb6239627b2900100000000000000ed7a7ea18c2d3b3effd9e8d7031592bc99517ca321c1faf7370f7d6d0fdebc47010000000000000041ef4a31eb7dc1e01f4630604e1908e644d7cdee3f66a60f98d6d59605326f8b0100000000000000890f5c296681b8c23038b3d36a491ca9e0e7e809e6455b2bcd28a13700f81abb010000000000000008cc1d6c743da905511a39a6f0a68809a6bc32f8ac25e53bb2d6aca4f493fc9b0100000000000000acd71d4269b3ba2a9de822d494c4d841708e1519c08de41d7fc6153eaf48da8101000000000000007c1024f3b93e54cb1cdde0d2f685e2e16cadabe59e407ebc45eabb07efebca6101000000000000000f42866aa6927f1c5916a8a1a5a5cba2d88e1fff957d80df701617d93ee6407801000000000000005cba2c6f569da1edc3778308da406f266aa53140381dbb3f14f22909ba6e30040100000000000000dac2e90de824b109043f70818d53eabe05e79d518bda504e951d7f4056b0b2720100000000000000652f455eb3d30486151c716a4031bc02bd00254ef3e8290fd29f946d958a46b60100000000000000589fc35b132ef9d7ed9a6787a203e5a3a37f8cd6c775f47ac5e589d55d381a640100000000000000a34b3f8e84aa86be3b47260f67720030795fc96379e5b31cc6c87c2f4d1cc3e001000000000000007a99eb5f9dd892ab541176abfcb3a9b87e184c9f5737f0c1e69b90f62c522aef0100000000000000dccafad8bba5affbc80095564afc9376881907073a060979fabbb962bef08d5601000000000000003bf5b70cb5789c7ac4f6a4c97e6fabfe7a58fe9fed1d79f39c2aabc2c5816ece0100000000000000aa3be8112cdf851411fe9e00fe9ef0a6b58217326ba7c1ab7ed9ce8a34620b250100000000000000c1c1ff5f66fefb5c0849e3b2333411d1f7e9dd4888600e334e7a33623f15fa3601000000000000001e6ce7e1c936b8872d22b1d24f0d5f4eb0ce13d6cda46bbc9b1b93812cbe674c0100000000000000594f51d31b1ae51a8c8ec48f5ab2428607440dd9c8f690ea377e99444529acb501000000000000002f40f2660559a4472aa7d2b5dac22c8925b9baeaec9fa2463cef2a77eb9d3a1b0100000000000000fa2c21f1a03638d4cb35202102240c2b85f5667924d5838cc503721117049da601000000000000008c461493dcd314f4b384169f3741954d8cde37bc8ad988149e40ddf18b4b95e101000000000000008aabd4f6d7ecec7a749c83fc7be33f3b4818cca6f93a4927b4964900df9454e50100000000000000fcc0d954c7d519851e0094cd9a015b4789022a37091e3a04791d0731bd85f0d301000000000000003948bfd09bbbc2fe6ac5dfe53146e32df50828eecf7b2b18cdcff8dc385cbd750100000000000000a2a4af2a11ae7ba812fcc32845583d0354a0f2ffb1271a53c9a976a0f47fff4401000000000000002385953f1ac49461b9c243159d9668b26e7322e19fff7bc18d90634f0f767ce8010000000000000058e304af91397247f704ce95d60845629aa59a50fba1c13896bb2300708db47201000000000000008663371a5899d5e7a8bc99b9a6ce24c8c3f5f1149c1e70accf9560405c1a5bf201000000000000003d28789c6d574f3aa6d14360471901c5bf8255d072c2209fa22ac773bd32e5bf010000000000000041763df8284ae8248ee0f649982ffc7d4f613e07c7bb83cd554aca5dcf8f56250100000000000000cc0c6a91c7971438b621cd9a3bd37a67f52ec4093336585d1e2c73416195e28a0100000000000000de52bfa88c4a76bb22fbebb0f078dfcc5a327034e0044e8f8034f2a96e7adfef0100000000000000bf3fd3d4065b306638662c3e789d830a63d9b343cef5f863d346058387844b58010000000000000005197187ac7eb8d0a3cfadd32f1a7fb662e7e4a16ea718af3f1e4437b865205b01000000000000007d09497b4d65162d28d4940f8eaf8342798e7794ec0f5028d163fea6156cb4f30100000000000000c84074bb67af84cdf84b9df1dadc1188cd75709a8d11bba65f2835d76f38c4730100000000000000aaecb94cc62ac90656976daa8955353e0ff22fcabd55715903be2f958988bc070100000000000000b98c920666586f392d129d480e78a965764ac82de45e691589b3aab7831a7f020100000000000000cb92ffeace78dbafe6fbf275741b4b38657fb81590712aa0bca7877931f6ad39010000000000000034a18d21097f479eecbe51b91c522a798582caafc787134bab6888854742406e010000000000000027791275ae7d4735aa45e70210663067f7d268aa57126a26044c8f6d8572a7d80100000000000000f7c9f4bc8669969246cfb748ac6996db6cd4c1fc634d981a1093b2c3d7a2eadf0100000000000000f001e2e99b378fa4f2d1a50b28c3fcefcd7da3a66314af1280fb7f9cb429dd380100000000000000604ac1feb76a5f2e7100ea7c8546c1b40bd6c59fd96ef9d58c2e93d7afc8aa20010000000000000083a8ca034fded71f681224d5f905b69084b17a51c18f0a06aeff60e868898bb20100000000000000c8185ca8ae6330a1e03490e132163adf517f76402ecac6881a51c8a14ed62f9401000000000000004a68c3ada00a5c4248e74840b836cdb87eec6adbf99dabbb90a8ded6e04de6c60100000000000000c49e3cd2c701bb845963c2870dcca12ed070c3f67ffc20144327a93aa6e896ec010000000000000081b1fce3ee9e31723f1023eaa9f8793e8663e72c50fbb0fbcea9bc78bacc491b01000000000000002dad5b2212ee688f2eeb9ca1fb6a90574f006dc1c6680ac3a8523363a248940b01000000000000004bb953c285fc6de7ef27baf835e8d905e60d86fb1bca0e52af8323e9d1ff219d0100000000000000c69539d72b0745440a1fb4323bd3ce26e309d801d13d5002ba23da25e18e1ce5010000000000000050f9fd6c0623020debb7843bcb832ee1d80db9b156d8e6083ccebd434fe979470100000000000000b8183b905f28b87c68c2d5b2f39f009f2ee22b47235f6c6d6cf6e63121b490300100000000000000b7c13f1239888cda5c8e6ac9ea10675df17633368906e66a487f91ddd3268ca601000000000000002cd51e09c3197e04155b78f3d97742ceffface390dc46f81f2613a94b2e483fd0100000000000000affb713ecdae328aa4436756f6a3e8add6b274d5ef1cc19d7aa69ab82c80e472010000000000000052912b3dfd0ccacd00586b97f1abe32431a2f6fa9c2b3bb17837a1ecde61728001000000000000008a2b50acd1a4955fc814bf6720c7427902a6ce709f3a2d7c17c55b67f6f1c0630100000000000000ff80f99fcf0f4072402a4e522aecd41ff231c5b579d978d0383dda0407ee498b0100000000000000fd856413411b2e50cf1d32f8253c9bf7b055df259c42fc3a501ced6850173f8f01000000000000006565187c86eca2aaf37db6d59405535a5e6dd85e2743a07ebf50e55c2b7fbc890100000000000000d1c146d2429a5a827660008721c7a880e71f44feaa3dc75524c1a9281bac48cd0100000000000000e4b2cffd0b9cacfc500050b27ecae3c55b9b51bd9a416d62605118c8ad4fb09f0100000000000000f42c2e2a4157d51d22d5997dea1342f65e1882e207fd0e64e8e5d44330857eef01000000000000001a13a82af5e22b9863c01e5f0f6bdcebc4a295934e339fa915cada1d5eba7eb801000000000000006ad5224d5c8f7fb3ae15dcb3766c0956ca627a6c91e93c4e770a2908e8f590150100000000000000c898dac07a659dcf7a5d8cd593ce9b463a3a7452678f9a6b4f6ae3785823e5cf0100000000000000f5fef7a87c9f3917fd28640907ce59ad26f33e41baa25d8ead8033ae0b944d7901000000000000005d0124063ede3e49f037df33948477235e5a58f93f8b98bf7203f25e11d4f0b4010000000000000049bfee2608fe8c9d280c80fe2e7e50d15980deeb1d29a2edc7507d17b319e7760100000000000000be95095d93298171c6fb8a1847adfa173d127e13f53482dcb694f891d68f0c58010000000000000085b714accac0654ba57fac59b626dd35802269d2c1d995cea7c335cb05a88f7f0100000000000000098e7f6085499cc37621458acc5a44dd928202482d456fed047f76a7edf1c08a010000000000000033346b5629c0c499b8cce8b797ee9a312d06155fbe898c8a4a09777ecf8ba91c01000000000000007448b6f6db7cfffd8650a1f3f08ddad1e114321ea770c9cfe6154882f586edb50100000000000000eea0e8d1a0aae5e5cd38dda0e172b49f8ea02287fd7d2ca79ffcdf6e593a2831010000000000000037483029302a84623f0a8db165fbed905b0a4fc25e7cfb56e975a0e98336a59b010000000000000053b5918f72e73f92f32b578d1b602f0cc554d98bee8c4e131ef0ac7a63399fb40100000000000000178838772f4eb26785673a57c8365e98a21ede2ed8d1ca3aeccbf7ef2631da110100000000000000587473ac474bbd8c99d14bec88d614426944b5c84dbf2912abac7610741560ff0100000000000000f3300017c9cadc38d61b118edd05c0540768521f88c5092215e47a9d0403fc7a01000000000000001935d43843c66ecf76a9f4c4229de9ed7c172f52aa53d1a279f2856a736661b80100000000000000501c3978722a089f663f75c7865626a43d13ce19bd924583e43a46720584ed140100000000000000cdeaed45451971dcdcf886df977f31b3c004c497037d9940bcbbf2bd6dd2e3340100000000000000cc5dc1c5155dfcf43ee8dc4443292e966cb3226aea4fdf88e73daa259d66b6730100000000000000f14cb581296c3261284a2ed4e5a85dc0280e5618cc8dc1e76d8ab4ab415ecdd30100000000000000096e6c93e51502bdb63438d1cc1207bc5fa4cc1a1330b152ce46ca62f0c88ffd01000000000000006727561447ed474ff4e15645b952a37fa5008d4e694d4853bb55594fa34c4f340100000000000000c05f72a55f91f613b2da541ae27eb6053e80f267c906c135a4ebd848ecfb49db0100000000000000ec295fb809e22c332aa36a57afe05f2c093b2d13e52b0971d8265c5514e4e9690100000000000000efb5f1e4c4ba37f8c159d452d897c607a58518b8355a8454620b3e3ccc3271230100000000000000099a9eb71f9cb1b7d15eae384790b4ec35045a19acea1730ba62f3e7caf31e8b0100000000000000d34560b879f8f4dd8d2fbd4f6d51b9b6f41b76656860646fcef4e1498859a190010000000000000061914b4dba0a1e42e692016cb74943266b257339008ffed4644231a2b48df21a0100000000000000a703a37bd5d93619bfb6ad72c24840b396b2ddb8700db2e1d372a82363ec7d580100000000000000a892342c56149812a43e98c82b6a3dfee7eff384d9b6d832002ea63838f64900010000000000000081bbaa3313b09e3b0ea2817c3e968a33587ec8928539c3f3a6d0e65644612f4901000000000000003d884e3f58913c10c26d8af2a095e231079a3a0b69f775052f7173ff1c3ace2e0100000000000000a81425a86503d911cf060b51310f0bb796f5ce2cb656e524d23f7fac3c9c48000100000000000000c13b603b5fe774d98e59c26fac03f8096ccc42c57d0cbc6a443b4f07a3c077920100000000000000be6b59cb464fadec4e0b22a9f12857ba5cf7a14c4f9551439d36305d582dd7fb0100000000000000f916634f9fd7e54374e30ac6b722ad1793c13cb2d5f2ad38769eaca2f79d414b01000000000000007ba967a2dae0d8839cf44710591db994d18e53b25ec6d0f861da0037c4a4366a0100000000000000222ee6c6a6c62d56cadb4eaad5104d595fe962fbbdd551c81562d3b509212907010000000000000055ca63358082034ddaf76b75f41a396081dd4f39a61eff13f7575e506e10335601000000000000000aadf1b2009026f8f5dd75d532e91dc756fd47572aa0f3c15d26790e6d6b2f27010000000000000050e16d897010823670148ef157d77933bc1721d82c45e80eb73b46b12b5daab601000000000000000228d7fc42b304906518cbd91d73a5384c4893de6cbfe1e7346999df642d3d000100000000000000db9e49a8dc2d75fc63151f9dadc11b7d2d435b9625f62747928fbf7f1be8506f010000000000000082e6b6bf1f275c59fbde0dad91393ae690d5e644d11d23898a9ccfdda025920a01000000000000001bfc78866edf1c38c02c1d1fbea39a2a33f46227dca527ed002d96532e61114a0100000000000000d761043f405069ac01285f1ff258450aac675f08d906b1ae0a1ce54eabcb36d901000000000000000dfbc1b5757e1f0ba348f8af64fb631aaff86cd21fa0529e0bb1fbab250879260100000000000000d791b58285e2c4f17c82a518e099812d2a3f63e1090f1cb2576e2c7695ee24970100000000000000de74612da9080d47be35bf4ded2094e23c1de14477114ddcd7b76b815456ec0c0100000000000000d3b3d9703a265a51a137b9de348587c645a168981ef3e01c9dc482856751b8ef010000000000000003dd543dddd6ad00137ddf94a218bfa19d2f08b4365d696765dc25deef76598b0100000000000000cfb9f7f1fcf903a51af729ed1647aee928630e148990309f9dc9f3b14b114b7601000000000000005216ff912251cd2bcf9db256b3927e737cf909e4b53a375586dad21bb7b907ef0100000000000000d14a779884de1b2fbf079b8e47e8c0edb1c29e282996899a4eab5aaf1f4f41130100000000000000b5b64e522ece2a1a3325f95082e33bbf5832e6116d378ac0f437b7b49727292401000000000000004bf6037c3820cb7468601051701164948b7f7cbbe1ac8cad97e809c76170dddf01000000000000001ec0811cbe4f2ea1e5a714d3ba08c6d7fdec138bcc6406da3c6cd32f1686616d010000000000000025ebbb2a00126545bbedf00318a78b6e61a0b52c81e30231ff45bd32e311472f01000000000000008b7baa89dbac95969a0042fa876a37eaccfcecd3591c4d7ed0e8051aea814cfa01000000000000004715211e268489d1eeccfbd8a5e67235244322c17127226184448741ae332ba10100000000000000055c25dcc9cf8a08ad007ed9c8afb0ba53cebd129a20f194d272535ca9fa06490100000000000000cc8db7467349129a20ab4ba7e705044216651c0eba9d39f1054849edbcd677af01000000000000004df6e4d7da2c11ddb9153c714699f9ab625bbcd5e8e38f1cdeee567dc04abc610100000000000000982d9e3cc8ef3f8d99638b6f9df32c82356e1cd88f123d1e586a604d1d4b0cb401000000000000009cfeed14dd2f96550a0e7edebd9c9a8c8b1d8f7efdd1abca01987654239f3c860100000000000000736925c31654df870fbc29437c9b2a488ac3262e5d80798534ad00c43a61e5470100000000000000e08ce24248f3f8c0cdd313a5d46e6d491fccf6711788b6aca2de82f6700ced5101000000000000008404cabeb0674765bb77af690fa838ba28fa2045d602994a89f07680f4851c83010000000000000006b9e740c0a0e1f8fd31717438d5918ed8680eaccb70fdc9511931ce0d164ae50100000000000000b8cf76a8082d518016ea5588be57b64e156ed23b0f72248975522c23d15ef16101000000000000002565e04c6e0b665fac87f8238bee74837f8f621ed63409f3838d263603400a980100000000000000373b26b330a41547971874dd81c2cbbf8b7e3eda05b861c57205ad7e8c15bbcf0100000000000000056986ef8b6f0f9e092e29540e8d220b40bed9e459e7b9d0247e0e156601e3c20100000000000000620c78305072857b43dadced80ebc057dbfc82b58c14c7b63372ef02140867650100000000000000546ce2099b3863d2d75324d5866bfd5324d8ee4701a99dd53528f8a8c898ca4801000000000000004dc2e72680dbf0156818114fa34d3591f8e6948df25a128e191190c66f6ac35301000000000000005d50d6099c7c88f367568fa473b44785acccd030251627cb371de16e5fa704260100000000000000301b983e5e1320b7c9ff0f2525121b9f3007f68c273ba8ff662b7244f1f95f210100000000000000ef5b937d1eb14d07785430ca8efb57cb965060fac808b9a25ab9d4ab52cf0ad10100000000000000a85e95b303450b71e03368ab702fe362ddb6710e9f374e0814f65fe4b46bd3f20100000000000000b1f748c87b12edf7242b4719cfe68e6761acaa4329beee538d6ff740941d3cd301000000000000009e4dc072780c293ebda8107e014d03b3dea3d3f14bc9d02cb0c9c0776ce63b990100000000000000eedd48a4e6e202e92845fc2fb09da5e1eb2b839e48227f2531142e5fdeb44b2b010000000000000014a3f3f45d0bc1352f8665d1e24cb13d72d95b48c595913cc985dcf58e63c1230100000000000000b1fb5116f8c92bf1d763969194db84f09eaac810117f40a8f84410dd54d6518f010000000000000081a47767e6abad1d3c805d4eedb10a226dd9efb967d5f78f8ac4cec55027f1ac010000000000000028139ae721b771cf57d5afa58579d8dc0f04f04c1e1b631cac64a9fdfaf8b5250100000000000000c5f7618b9d80d894e37364f041cc37cb1350386bc5e236dc91a41948e976c0e60100000000000000b66e24ea84d5e02a7b2b58e20bbf17a0f2a19c4654bf8b07669ba3b9fc4a468101000000000000003c1dcee818434058b7de26ee874ade21bd1149185d6dcba1f67048b931ec3dda01000000000000000d8e0ceb31d11634ff50f20c90d57239a9307602e221baa190c784b144a7eb980100000000000000cab191a66c54e412fbe7fbc074ea0d916279d55d856d870d15bdf88c00538dda010000000000000015b49bdd8cb8b9110a45bd1985746655b330829e1dbe7580ade2fab6531799d301000000000000000428e3ccdba17d779ffba05c9ec7a6264187d13bf89b6009e97200474ad3439701000000000000004c43a374e6b3e6f7d6c5a6b8518ae0d0d232a1c46d63af8fbc800045a14cbe930100000000000000c34f62968a87b2e4a9340a75004029dff5777a020f60fb287f08038491881f220100000000000000f54bb82d58c665ce3289b8765c40e60d84f74da663c164c38e16784d5c142b2c0100000000000000607737116e62ba11852c68515933afb8165f3174d594eef6d01dd7eaddb60ec30100000000000000dea32ed7afbb5b31cb45b6e5daff40fb33e80042994d8d6527ee262e32fb2131010000000000000065dc4c53802befd2acfc3d6d3f66eeb84947e5c15fc7a2165a375352a4faace101000000000000007c39d28f80a16bf0cedb70e36c5ac9063dd9b513c5fbbe2c2222389f428921340100000000000000bdee8597e248688fddc627ad9c95cbebf7d3b5f248b9a742aa2d8e761fa365050100000000000000d28bb3ab66767f313a9510e83fc686e576f0886c03faa6fd2b61eca4e0d5a7d90100000000000000a128a73c5eaa1803618a75bc368c38e4c5cd40999cb72d615b8af1d30cb8cf1d010000000000000020270811c3dc453f37b27d958ef7ad7dd4c7f217c83f94bd0ecd84c60018a8660100000000000000f595e043c5f1974fe8467f514a656265c4e64896b47c6dedddd35bbdcff2bded010000000000000020869a63e7a343094ad0b4ffaa3d83344ffec8c7fb9b177008f78d17eda7dcbf01000000000000003ee731da725307266b32393e3d353b49dcf27f3b55220edbe210af3094f1b2940100000000000000d64083c00178b8dd224afade9792fed8076031bdfe9efc5b8128e6372a9261e201000000000000001c6842f07fb07b318a8d00ce6258844374f8e894853ae5fd4a85c867d3fc32e30100000000000000417e120dbfd0297d59458b48407b62570987f1e907dd6dfa9a20bfe64eb489d80100000000000000443bd12fcb944a0e19b2f76ddd066a713a99d2dd3530a5f39275300d11ac96590100000000000000be724139e9bdd099b70f7edab7d1acf0d05fa1a4ca212f5e2958d31f4272dcda0100000000000000134cf4720486824c6a27fa7892c8d82e805653ba1d98480267ec284a76b792c20100000000000000f701f07489e11959ace47ce003808f4248a6c64b35f51f0551f4a69aa0572e2f0100000000000000c2eb94269c5e5d2ab9a1a300387358679640763b053aca99ba5c1c9083ee717f0100000000000000316bafdefb60951da2738d6c9c2ef1866d139b34b5eab6944d6bae754dd3fb110100000000000000b65475766e6229c87ff34263f5ca58525ab133962bc599ca0eab096ff296f4e60100000000000000ebb1834a568ea7653bc66f394937a0aa4f2f617118d2161e2c11c0d7d2febb9d0100000000000000a51a49fa663cbea3b953fee99f911391d75d638349a2681e30759820c6f3c60b01000000000000000c802c4d0fda23bc38f40210827903d520a0a4cf44ae4da7fb36ff933188faae010000000000000042f47dad5949be7b7b8f81faaec17b1b53465b01b9f8f81e6a45f2fc74e12daf01000000000000007a1291795805dbe300425311ae50ed698450b1912b62e5b5a3264c68bfa970760100000000000000e0df5b2f299314d2d419b46d15c3c8a739182d91c3d4b98cd16c013c3a25c04b01000000000000000150276c1b3d28d42630801c1d4a738ae723887d9286e40ba48d10b0752f7dcc010000000000000098a6defcfeb3dfca36ec46eb373734627a2c395cdd2d886046a11788ed6467af0100000000000000853ba986f8785e8fc1a2ae2fb86f17cc91886d931182ccb8d148379a35cbf02701000000000000009bbc024bfe4f072b94735afda064dc3c7da2b4bc0c50cfad44722543583a372e010000000000000086dee2a2c1977cb6ff99dde8fc5b0cb10dcac44b50b19b80f8252899b091c84b0100000000000000496826b538d97906e14d417b48598d7d591a483ab5f4c6786cd0b96239c2f4cf010000000000000021235f4afb5b0d8ea5123cd4be4205ed27dc25e5e08813563e47f363590928400100000000000000348e8bacc2d40191a6a00e137c745a422ff8fb03148d2ff9cad75efbb7a670140100000000000000768d47629bf074d88ded200706ce2f2ae38434c192129d1736ef8f6af01562b20100000000000000525661070154e9eebb48a7befd2c03e125b218eadb27cb121786678c0f67e5d90100000000000000e12f2b7cb74e1af470eb75f366ab1942e1daa3d84b812d2614b1fbcce156e5c00100000000000000d227434a77cd7b7127c039eb9995aeb025a242c36ca7116372c7c8fe5bc921b50100000000000000510a0c61dca3e1044d3540c08272054462c6353aac4dc06cda265753b126b38501000000000000005db4206baa8706a1b1de0ac7edacbd2a2c93452481808b8fe6c582265b57a60d0100000000000000f8e50e8b63b242e30e5bd266584b6fc690817455d2eac1e04d146dfc1dd3614d0100000000000000761ce3eef4bd0d15601aef70728f54ca72a9859e90841c3d02d5060201671878010000000000000000132d9e682cf8d45ce8efd4bef165a26da5d1349ea1fe9f51abd6dc7622720201000000000000001262625cc59c0e4b7548904c31a02231a601305881a231d4dea45eec6cbbbdcc0100000000000000c3576342cbf99792896ee5329b04ff2eee2fc2bb6d53c5c03d52c8957ee793fb01000000000000006ad4bc289673029ab44f3045eb6fdd3589d05e0e5fd76ee017f650a662f898fb0100000000000000a82f563264d1892dd46873205d03c098d8b03f53e21c797839737e4e5f66a87e010000000000000059dadf17dc0f84c1c334e6a815a04bdfcd0988a3f3bcb713c66ae29e17276cc60100000000000000a54cf1007cb124c12d4fe9c27e1d9aa2c4a238f35be9d6ef4c321f061039ea3f0100000000000000297dc7cf28b3d40a42c5e8faac876bf7227c670e6e031dd0e0537f4fb70e6fbe010000000000000043601ae31cf5b03cb49395dda13809f7398d8670ee4d2172b14a1ab05986ac3b0100000000000000e7f57bd0bc756f24574e3a77c90616adb393e9d4ffceb2c63df19f605cb6a0240100000000000000d207ebfe07d6c8bfd5badd7a25373ef5a9ddac08da3e542e5a9d36439259e8370100000000000000a5f788e86ee2d311357b7aa4a128f063fa4ee36958baf10304c10bde7421aa2c0100000000000000290321d793b7dcb12ad148c2438bb60821bd938b7e9164a0c3d0fc82987f8b6301000000000000002ef11bc5ce1e7b53f788ba01ba581b9171ef36449719ff3eb20973342a4a82850100000000000000ab45f730dd495f657b61b2777091fa8cd11b5a626bea2b514e5e6118021037970100000000000000b79f919442f4ca5ac9195fd09a1239b1a80bd225f8372f1b36a24a8c55de61f201000000000000002832b59000d2027d2bf57fdb40da04bd8aac1498923397517181cc487a92815201000000000000000cd7067f96a2d63fa72065302432f48690485fa5f47c9afab17123e0482785230100000000000000f6f23ae9bb4c269a5959d51f9173270ddefcc354b63de77b672bce58cabe60c801000000000000007a1df073f4a474faa4616f9a6f5d93cedf25716cbe8d05a08afafb570b6e6f9501000000000000004ab3fb4afcd05ee5df8e2bdc39a0a7ec1008355062b9d493fda9158a29f8bee40100000000000000be223d49fdccd102646c9b0d62130fbc8e7f0324d55a3eabaaffb5ed1616795a010000000000000062a91ffda8611ffce3edeb628ea6d3b8b12e5b2448beda6da8334e77a9ecbdd7010000000000000071893ca83ebe6ee06c3eb10dcbfaf70d8267959f6159b4ca36929a69604cadbc010000000000000006cfc80018342011eef81de0346bbc3997cd97f04dcbeccaa30bd4529388976701000000000000007e05f9592cac9232e17c222d076c6abdb6f5f5b8175d5b3858ffdae0324b411f01000000000000004ad600cc461daf6d287d5d2ff0791f74fd7c6aab5714ad50340187a7ce509ea9010000000000000005062bede97a45c6e1c6b593675ee07ce969fae45136cc2b2afc6e705a77f4700100000000000000dc6e03f650e4304ca8d1598dde8d4faf45891987bfc49ef785ace47c4c0b5573010000000000000026cdfb88461d7125f438c599e062799219b385bacca93f3cdbe5418c9d4d499301000000000000000f19c3ed807ad5f2b7546f5e6c5e9bb934835d54ed1f4f989540b86a2ca02b550100000000000000e4c1d1377894eee032e1a60dbac6252e23f35bbb43ce51d5f98652cfee58d5bf0100000000000000666bc268601f06ff4b004b1509bf379603d3f4b7ea684f9638060c0ee5d400620100000000000000f2e75ee2303b2cf903b882c9888cc1c51f978abd58ba88354dcdad717f4b8a590100000000000000b426ef68c50245a003dd068c5c086fc9012c08a7f9ec53fbf7df4318261c8c2c0100000000000000e7931a825260ba7d4fdb5f4990d39a71e2a8b215a776ebf770102ca772f103a3010000000000000095fde7b91441fae9d2a6360d30228392519293be5e78cf3305667595cb15e566010000000000000096847258e5fdd261a8df1b3958366b29d28363aeb96a71c2b705e4c8864b97e10100000000000000e7eb7de26e0e24fd528fbbcecf837f26579784dfd4db512c9237e2811139738701000000000000009f677785cfbf44140bdf38770f3d8076f222aa1c9997842d89d580b0f256198f0100000000000000fe76110186e8a72cb09ec93757b5447cc21d543888903f50e95c68dbea91b06301000000000000003adbd2d5abdb70ef56c2d8bd4a7c0d67882a1c2050a856937491e98496a496fe0100000000000000716a181407939b3ea68289e09265d3b9d8a8f21ba7d9f50d8ef8a86fa3c0fd0301000000000000008e3d1c8c0261e193e87403c8959919ef035ba39175d3ba22f31190303601412e0100000000000000e2cbfcc26562b49e656aed7d837a26fe0f9802db088b10330227b6147e150012010000000000000094416582fe359e0a310da59bf93df8ff9665b89071d4977a9a9f3390b75c0c4501000000000000003c718ab91d9b10efbe954734920955972fcb714627739f8cd97280ea67aa5a020100000000000000ac5230e4338aa51c44ab6a0fb903e6fd914fd029dab8f7ca447be54ceba749340100000000000000a76b32c8c28cce206ddf70ff3ad591ed01a0067f9f9baa77f9052ce938d359c701000000000000003a4bfd825ccd308def4a61bac80c579db42b02ea5f1a0768656a326e83a0dd8801000000000000007fab4769c41af85b9de8e784d3b1cda093fc0a8dffcdff21e914c62f131c77580100000000000000d2f1b3b5f7eb1b0d8328911d9ec920327d7a30729e80c1238f86dfe27c4fa3470100000000000000841584e602ab975c936fe7c2025fcea2b5a0061e839b1ad96528942b33d0974b0100000000000000c6b8a9bf9c374cc7c6bf921877097081f5127027a31739fc472e1099c5b3b0ef0100000000000000280084dd48c4c3ebf743e3a8448e2815fcf183dfd0121c19453278da053c20a30100000000000000ca35d63347f9deafb433ec20ef8c469bf2e21dc5e67c0c048a5a04fa369424ac0100000000000000a4f4bbd302c06389ee3614c0943af03d52364f172ef05021aa93d12aef53c3290100000000000000fe3a0547055f2f40e6a286fd5f0f184ad1cc3cbb43bb7ef8ca03b946ab469c0401000000000000009d56cbbe3020b94ea8cb122df6527ceecc8cade4632e81f23b485e773d27b58c010000000000000085b6321d0044ba1f9ed6baf255065c5d9947cd2fd6067f66dfddc74511fe583b0100000000000000db8e840e99078eaf04cb3f1a4d7973607f3e54060b8d100a966f370daf9adc8f0100000000000000fecf7a7926767c290749d398205bdc5460218121022740d3bbf464ec7de046c4010000000000000098763eb72b3f7dbb7a793bd1d4367af5f072ff45a1a6eae0e002e1eaa24c5d5501000000000000008f95a0bd1121c1269f4cab1936bb6017c778d51fed4f204c52ce7b4fac645df1010000000000000079f73931b31ce353119fb4063412e844b16cb3eb92e592ebd822a8c21303554801000000000000002929dacc53614cea1848e7ba20fdeed7cb0bd81571aa72dfb63dfc84d3965d2b010000000000000031a46e639e57d1a11119b17f76617a35b3606d206fb5c3e87710f464f7a57de50100000000000000ed25d7114e2aef2f0e57dc2be1401a4994d8aaafb30223162634a512604a236601000000000000006e070000000000000001a839320100b91d00000000000000002904050001000000000000002a0d050002000000000000002f16050003000000000000008e1f05000400000000000000ee28050005000000000000004d32050006000000000000009d3b05000700000000000000fd44050008000000000000005c4e05000900000000000000b75705000a00000000000000176105000b00000000000000766a05000c00000000000000d67305000d00000000000000357d05000e00000000000000958605000f00000000000000f58f0500100000000000000055990500110000000000000095a205001200000000000000d8ab050013000000000000000db50500140000000000000024da05001500000000000000aaec05001600000000000000f4f5050017000000000000003bff050018000000000000008b0806001900000000000000992406001a00000000000000f92d06001b000000000000000d4a06001c00000000000000685306001d00000000000000b65c06001e00000000000000f76506001f00000000000000308b060020000000000000007b940600210000000000000025a70600220000000000000033c3060023000000000000007fcc06002400000000000000c3d50600250000000000000011df060026000000000000005ae806002700000000000000a0f106002800000000000000410407002900000000000000880d07002a000000000000001b3c07002b00000000000000764507002c00000000000000357407002d00000000000000239907002e000000000000006fa207002f00000000000000c3ab070030000000000000006abe07003100000000000000bdc7070032000000000000000fd107003300000000000000b2e3070034000000000000000aed07003500000000000000971b080036000000000000009d24080037000000000000009c4008003800000000000000255308003900000000000000735c08003a000000000000000c6f08003b00000000000000048b08003c00000000000000589408003d00000000000000d3c208003e00000000000000e4de08003f000000000000003fe808004000000000000000f7fa08004100000000000000aa0d09004200000000000000153309004300000000000000fc6a090044000000000000003e74090045000000000000009a7d0900460000000000000000a30900470000000000000014db0900480000000000000020130a004900000000000000791c0a004a00000000000000364b0a004b0000000000000043830a004c00000000000000e5950a004d0000000000000045bb0a004e0000000000000059f30a004f000000000000000e060b005000000000000000812b0b005100000000000000dc340b005200000000000000ef500b005300000000000000a3630b005400000000000000b69b0b005500000000000000c7d30b005600000000000000dd0b0c005700000000000000f3430c005800000000000000087c0c00590000000000000052b30c005a0000000000000060eb0c005b00000000000000baf40c005c0000000000000072230d005d00000000000000805b0d005e000000000000007e930d005f000000000000007ccb0d00600000000000000076030e006100000000000000793b0e00620000000000000088730e00630000000000000092ab0e00640000000000000083e30e006500000000000000731b0f00660000000000000079530f006700000000000000748b0f0068000000000000001fc30f006900000000000000d0fa0f006a00000000000000633210006b00000000000000826a10006c0000000000000028a210006d0000000000000005b310006e0000000000000055d810006f000000000000004810110070000000000000006548110071000000000000008e8011007200000000000000bfb811007300000000000000bbf011007400000000000000e828120075000000000000001561120076000000000000003b991200770000000000000058d112007800000000000000770913007900000000000000944113007a00000000000000c07913007b00000000000000e7b113007c000000000000000cea13007d0000000000000067f313007e00000000000000d31814007f000000000000002e22140080000000000000008c2b14008100000000000000545a14008200000000000000ad63140083000000000000000e89140084000000000000006892140085000000000000008dca14008600000000000000b00215008700000000000000d03a15008800000000000000f3721500890000000000000015ab15008a000000000000003be315008b000000000000005d1b16008c00000000000000855316008d00000000000000b18b16008e00000000000000d3c316008f00000000000000e9fb16009000000000000000073417009100000000000000bf4617009200000000000000286c1700930000000000000029a41700940000000000000041dc17009500000000000000591418009600000000000000bf3918009700000000000000704c18009800000000000000948418009900000000000000f28d18009a00000000000000bcbc18009b00000000000000e4f418009c000000000000000b2d19009d000000000000002c6519009e00000000000000896e19009f00000000000000519d1900a00000000000000075d51900a100000000000000920d1a00a200000000000000ec161a00a300000000000000b6451a00a400000000000000887d1a00a50000000000000077b51a00a600000000000000cdbe1a00a70000000000000070ed1a00a80000000000000083091b00a9000000000000004e251b00aa00000000000000fe371b00ab00000000000000065d1b00ac000000000000005f661b00ad00000000000000bd6f1b00ae00000000000000de941b00af00000000000000fecc1b00b0000000000000001f041c00b1000000000000000c321c00b2000000000000002f3b1c00b3000000000000002e721c00b4000000000000000ca01c00b50000000000000044a91c00b60000000000000022e11c00b70000000000000044191d00b8000000000000000c481d00b9000000000000006b511d00ba000000000000008b891d00bb00000000000000a5c11d00bc0000000000000053f91d00bd00000000000000ff301e00be00000000000000054d1e00bf0000000000000002691e00c000000000000000d1a01e00c100000000000000c5d81e00c200000000000000cf101f00c30000000000000083481f00c400000000000000af801f00c500000000000000d0b81f00c600000000000000f0f01f00c7000000000000001b292000c80000000000000039612000c90000000000000054992000ca000000000000004fd12000cb000000000000004c092100cc00000000000000031c2100cd000000000000006d412100ce00000000000000cc4a2100cf0000000000000098792100d000000000000000c4b12100d100000000000000eee92100d20000000000000011222200d300000000000000325a2200d40000000000000055922200d50000000000000075ca2200d6000000000000008f022300d700000000000000b13a2300d800000000000000cd722300d90000000000000078852300da00000000000000ce8e2300db00000000000000bdaa2300dc00000000000000abe22300dd0000000000000012112400de00000000000000501a2400df0000000000000045512400e000000000000000a1882400e1000000000000005fc02400e20000000000000013f82400e30000000000000007302500e40000000000000013682500e500000000000000c37a2500e600000000000000a8962500e700000000000000fb9f2500e80000000000000000d82500e90000000000000019102600ea000000000000002b482600eb0000000000000028802600ec000000000000002eb82600ed0000000000000044d42600ee0000000000000058f02600ef00000000000000b3f92600f00000000000000065282700f10000000000000057602700f20000000000000064982700f3000000000000008dd02700f400000000000000a7ec2700f500000000000000b9082800f600000000000000e0402800f700000000000000f6782800f80000000000000019b12800f90000000000000040e92800fa000000000000006c212900fb00000000000000a0592900fc00000000000000107f2900fd00000000000000bc912900fe00000000000000eac92900ff00000000000000fd012a000001000000000000ff1d2a0001010000000000000c3a2a0002010000000000002b722a00030100000000000005aa2a000401000000000000fce12a0005010000000000004ceb2a000601000000000000e0fd2a000701000000000000c3192b000801000000000000be512b0009010000000000000a772b000a01000000000000ae892b000b01000000000000b0a52b000c01000000000000abc12b000d010000000000009bf92b000e0100000000000093312c000f0100000000000087692c00100100000000000075a12c00110100000000000074d92c00120100000000000089112d00130100000000000099492d001401000000000000b0812d001501000000000000c3b92d001601000000000000d1f12d001701000000000000d6292e001801000000000000e9612e001901000000000000ea992e001a01000000000000efd12e001b01000000000000f8092f001c01000000000000f0412f001d01000000000000e9792f001e0100000000000036832f001f01000000000000b2b12f002001000000000000a9cd2f00210100000000000094e92f0022010000000000007121300023010000000000003b5930002401000000000000089130002501000000000000599a30002601000000000000f6c830002701000000000000e30031002801000000000000c03831002901000000000000a17031002a01000000000000f27931002b010000000000007fa831002c010000000000005de031002d01000000000000aae931002e01000000000000441832002f01000000000000295032003001000000000000fe8732003101000000000000aa9a3200320100000000000010c0320033010000000000003af8320034010000000000005f303300350100000000000059683300360100000000000078a0330037010000000000009bd833003801000000000000cb1034003901000000000000f44834003a010000000000001c8134003b0100000000000044b934003c0100000000000055f134003d010000000000009dfa34003e01000000000000302935003f01000000000000c6573500400100000000000023613500410100000000000053993500420100000000000080d135004301000000000000560036004401000000000000b10936004501000000000000ce4136004601000000000000037a3600470100000000000031b2360048010000000000005fea360049010000000000007b2237004a01000000000000995a37004b01000000000000f56337004c01000000000000c69237004d01000000000000feca37004e01000000000000340338004f01000000000000683b380050010000000000009e7338005101000000000000c9ab38005201000000000000dcc7380053010000000000003cd138005401000000000000f8e338005501000000000000b0f6380056010000000000001c1c390057010000000000007a2539005801000000000000da2e39005901000000000000525439005a01000000000000878c39005b01000000000000bbc439005c01000000000000f3fc39005d0100000000000028353a005e010000000000005f6d3a005f0100000000000098a53a006001000000000000cedd3a0061010000000000000c163b006201000000000000404e3b00630100000000000019853b006401000000000000608e3b006501000000000000b8973b0066010000000000000fa13b006701000000000000a7b33b006801000000000000fabc3b00690100000000000049c63b006a010000000000009ccf3b006b01000000000000eed83b006c01000000000000c1f43b006d0100000000000014fe3b006e0100000000000066073c006f01000000000000b7103c0070010000000000009e2c3c007101000000000000ee353c00720100000000000094483c007301000000000000e0513c0074010000000000007c643c0075010000000000001d773c0076010000000000004b9c3c00770100000000000010d43c007801000000000000d80b3d0079010000000000001a153d007a0100000000000053433d007b01000000000000ea553d007c01000000000000225f3d007d0100000000000072683d007e01000000000000b4713d007f01000000000000fb7a3d0080010000000000007a8d3d008101000000000000b8963d00820100000000000006a03d00830100000000000088b23d008401000000000000c8bb3d0085010000000000000bc53d0086010000000000001dea3d008701000000000000e9053e008801000000000000b5213e0089010000000000003b343e008a01000000000000843d3e008b010000000000005e593e008c010000000000001f913e008d0100000000000065c83e008e010000000000006bed3e008f01000000000000a9f63e009001000000000000f6ff3e009101000000000000c1373f0092010000000000005c4a3f0093010000000000003b663f009401000000000000856f3f009501000000000000cf783f0096010000000000003ea73f009701000000000000ccde3f0098010000000000008516400099010000000000001e2940009a010000000000006e4e40009b01000000000000c35740009c010000000000009b8640009d01000000000000cebe40009e0100000000000001f740009f01000000000000372f4100a00100000000000097384100a10100000000000070674100a201000000000000a99f4100a30100000000000065b24100a401000000000000ddd74100a50100000000000096ea4100a6010000000000000b104200a70100000000000044484200a8010000000000009c514200a9010000000000003b804200aa0100000000000051b84200ab010000000000006fd44200ac010000000000005ef04200ad01000000000000b9f94200ae010000000000006a284300af0100000000000078604300b00100000000000077984300b101000000000000abd04300b20100000000000064e34300b30100000000000072ff4300b401000000000000d2084400b50100000000000008414400b6010000000000002e794400b7010000000000005eb14400b8010000000000007de94400b9010000000000009e214500ba010000000000005d344500bb01000000000000d0594500bc0100000000000006924500bd010000000000001aca4500be010000000000004a024600bf01000000000000603a4600c00100000000000084724600c101000000000000abaa4600c20100000000000047bd4600c3010000000000009ec64600c401000000000000a0e24600c5010000000000005df54600c601000000000000bf1a4700c701000000000000d1524700c8010000000000007f814700c901000000000000dd8a4700ca0100000000000039944700cb01000000000000f2c24700cc0100000000000010fb4700cd01000000000000d5294800ce010000000000002c334800cf01000000000000f9614800d001000000000000596b4800d10100000000000078874800d2010000000000008da34800d301000000000000aadb4800d401000000000000c6134900d501000000000000eb4b4900d601000000000000e7834900d701000000000000f9bb4900d801000000000000b6ce4900d9010000000000001bf44900da010000000000004a2c4a00db0100000000000066644a00dc010000000000002f7d4a00dd0100000000000019994a00de01000000000000c0ab4a00df01000000000000aec74a00e001000000000000fed04a00e101000000000000bbff4a00e20100000000000019094b00e301000000000000902e4b00e40100000000000041414b00e50100000000000010704b00e6010000000000006e794b00e7010000000000002b8c4b00e80100000000000094b14b00e901000000000000a4e94b00ea01000000000000d4214c00eb01000000000000d7594c00ec01000000000000e8914c00ed0100000000000004ae4c00ee01000000000000ebc94c00ef0100000000000014024d00f001000000000000fe394d00f1010000000000000a724d00f201000000000000667b4d00f30100000000000013aa4d00f40100000000000031c64d00f50100000000000037e24d00f6010000000000004afe4d00f7010000000000002c1a4e00f801000000000000ea2c4e00f90100000000000049364e00fa010000000000004e524e00fb01000000000000628a4e00fc0100000000000079a64e00fd010000000000001ab94e00fe0100000000000079c24e00ff0100000000000094de4e000002000000000000aafa4e00010200000000000059324f00020200000000000004654f000302000000000000ff764f0004020000000000000d804f0005020000000000007e924f000602000000000000c29b4f000702000000000000f4d34f000802000000000000160c50000902000000000000504450000a02000000000000877c50000b02000000000000b6b450000c02000000000000e7ec50000d0200000000000046f650000e02000000000000b61b51000f020000000000001625510010020000000000004f5d510011020000000000000f7051001202000000000000889551001302000000000000b5cd5100140200000000000014d751001502000000000000e605520016020000000000001f3e5200170200000000000053765200180200000000000089ae52001902000000000000e8b752001a02000000000000b7e652001b0200000000000074f952001c02000000000000e81e53001d020000000000001a5753001e02000000000000558f53001f020000000000008ac753002002000000000000b9ff53002102000000000000f13754002202000000000000277054002302000000000000418c54002402000000000000d1a354002502000000000000d9c8540026020000000000007edb54002702000000000000b81355002802000000000000e34b55002902000000000000c58355002a02000000000000d6bb55002b0200000000000007f455002c02000000000000c30656002d020000000000002c2c56002e020000000000005d6456002f020000000000008f9c56003002000000000000c9d456003102000000000000070d570032020000000000004345570033020000000000007a7d570034020000000000007d99570035020000000000009ab557003602000000000000b4ed57003702000000000000f225580038020000000000002f5e580039020000000000006b9658003a02000000000000a6ce58003b02000000000000e30659003c02000000000000183f59003d02000000000000517759003e02000000000000ad8059003f020000000000008baf59004002000000000000e9b859004102000000000000c5e75900420200000000000002205a0043020000000000003f585a0044020000000000007c905a004502000000000000bcc85a004602000000000000f1005b004702000000000000111d5b00480200000000000030395b0049020000000000006f715b004a02000000000000aca95b004b02000000000000e9e15b004c02000000000000251a5c004d0200000000000060525c004e020000000000009f8a5c004f02000000000000dbc25c00500200000000000019fb5c00510200000000000058335d005202000000000000956b5d005302000000000000c7a35d005402000000000000f7db5d00550200000000000031145e0056020000000000006f4c5e005702000000000000a7845e005802000000000000e0bc5e0059020000000000003fc65e005a020000000000001cf55e005b02000000000000582d5f005c0200000000000093655f005d02000000000000cf9d5f005e0200000000000005d65f005f02000000000000440e600060020000000000008346600061020000000000006a7e6000620200000000000056b46000630200000000000000ec60006402000000000000a72361006502000000000000e25b61006602000000000000f293610067020000000000001bcc61006802000000000000dade61006902000000000000590462006a02000000000000963c62006b02000000000000cc7462006c020000000000008c8762006d02000000000000ffac62006e020000000000003ae562006f02000000000000731d63007002000000000000b05563007102000000000000e98d630072020000000000001dc6630073020000000000005dfe63007402000000000000993664007502000000000000d86e6400760200000000000017a76400770200000000000051df640078020000000000008a1765007902000000000000c34f65007a02000000000000018865007b020000000000003ec065007c020000000000007af865007d02000000000000b63066007e02000000000000f06866007f0200000000000004a16600800200000000000041d966008102000000000000711167008202000000000000ac4967008302000000000000de8167008402000000000000f8b967008502000000000000b8cc6700860200000000000035f2670087020000000000006e2a680088020000000000001c3d680089020000000000007f6268008a02000000000000ba9a68008b02000000000000f3d268008c02000000000000310b69008d02000000000000704369008e02000000000000ae7b69008f02000000000000eeb3690090020000000000002bec6900910200000000000065246a009202000000000000a45c6a009302000000000000e0946a0094020000000000001dcd6a009502000000000000dbdf6a00960200000000000059056b00970200000000000018186b009802000000000000923d6b009902000000000000b0756b009a02000000000000e6ad6b009b0200000000000021e66b009c020000000000005e1e6c009d0200000000000096566c009e02000000000000d28e6c009f020000000000000ac76c00a00200000000000047ff6c00a10200000000000077376d00a202000000000000876f6d00a3020000000000000fa76d00a40200000000000059dc6d00a50200000000000022146e00a602000000000000464c6e00a70200000000000071846e00a802000000000000eea96e00a902000000000000aabc6e00aa0200000000000085eb6e00ab02000000000000e4f46e00ac020000000000001c2d6f00ad02000000000000da3f6f00ae0200000000000053656f00af020000000000008c9d6f00b002000000000000c4d56f00b102000000000000d90d7000b202000000000000d7457000b302000000000000f67d7000b402000000000000deb57000b502000000000000b2ed7000b602000000000000a9257100b702000000000000975d7100b802000000000000338c7100b9020000000000007e957100ba0200000000000068b17100bb0200000000000050cd7100bc020000000000001c057200bd02000000000000610e7200be02000000000000c13c7200bf020000000000006b747200c0020000000000005aac7200c10200000000000032e47200c202000000000000dcf67200c302000000000000321c7300c4020000000000002b547300c5020000000000007d8b7300c60200000000000020c37300c702000000000000cefa7300c8020000000000003c327400c9020000000000009b697400ca02000000000000eda07400cb0200000000000056d87400cc0200000000000090107500cd02000000000000ad2c7500ce020000000000000b367500cf02000000000000c7487500d002000000000000fe807500d10200000000000039b97500d20200000000000073f17500d30200000000000030047600d4020000000000004b207600d502000000000000a9297600d60200000000000006337600d702000000000000d3617600d80200000000000090747600d902000000000000089a7600da020000000000002fd27600db020000000000001a0a7700dc0200000000000022427700dd02000000000000007a7700de02000000000000d2b17700df02000000000000f8e97700e0020000000000002b227800e102000000000000635a7800e202000000000000a0927800e302000000000000daca7800e40200000000000011037900e502000000000000483b7900e60200000000000085737900e702000000000000b1ab7900e802000000000000dae37900e902000000000000121c7a00ea0200000000000049547a00eb02000000000000878c7a00ec02000000000000bfc47a00ed02000000000000edfc7a00ee0200000000000026357b00ef02000000000000606d7b00f0020000000000009da57b00f102000000000000cddd7b00f20200000000000006167c00f3020000000000003f4e7c00f402000000000000fb607c00f50200000000000077867c00f602000000000000b4be7c00f70200000000000014c87c00f802000000000000e0f67c00f9020000000000001b2f7d00fa0200000000000058677d00fb02000000000000959f7d00fc02000000000000d2d77d00fd02000000000000ec0f7e00fe0200000000000025487e00ff020000000000005f807e0000030000000000009ab87e000103000000000000d3f07e000203000000000000ee0c7f0003030000000000000a297f000403000000000000c53b7f00050300000000000043617f0006030000000000007b997f000703000000000000b9d17f000803000000000000f20980000903000000000000284280000a030000000000005e7a80000b0300000000000099b280000c03000000000000d2ea80000d03000000000000082381000e030000000000003e5b81000f030000000000007b9381001003000000000000b8cb81001103000000000000f30382001203000000000000313c82001303000000000000697482001403000000000000a6ac82001503000000000000c4c882001603000000000000e0e482001703000000000000ff00830018030000000000001e1d83001903000000000000dd2f83001a030000000000005b5583001b03000000000000988d83001c03000000000000d5c583001d0300000000000010fe83001e030000000000004e3684001f03000000000000826e84002003000000000000bba684002103000000000000f5de840022030000000000006f0485002303000000000000cc0d850024030000000000002c1785002503000000000000ea2985002603000000000000634f850027030000000000007e6b850028030000000000009a878500290300000000000017ad85002a03000000000000d2bf85002b0300000000000031c985002c030000000000000ef885002d030000000000004a3086002e03000000000000866886002f03000000000000bea086003003000000000000f2d8860031030000000000002a1187003203000000000000871a870033030000000000006449870034030000000000001d5c87003503000000000000998187003603000000000000cfb987003703000000000000eed5870038030000000000000cf2870039030000000000004a2a88003a03000000000000a83388003b03000000000000826288003c03000000000000b69a88003d03000000000000efd288003e030000000000002d0b89003f030000000000004d27890040030000000000006c4389004103000000000000ab7b89004203000000000000eab38900430300000000000028ec8900440300000000000068248a004503000000000000a05c8a004603000000000000b4948a004703000000000000f4cc8a00480300000000000030058b0049030000000000006f3d8b004a030000000000008e598b004b03000000000000ae758b004c03000000000000ecad8b004d0300000000000028e68b004e03000000000000331e8c004f030000000000004f568c0050030000000000008e8e8c005103000000000000c7c68c00520300000000000005ff8c00530300000000000041378d005403000000000000746f8d005503000000000000a4a78d00560300000000000064ba8d005703000000000000e4df8d0058030000000000000a188e00590300000000000023508e005a0300000000000027888e005b03000000000000d89a8e005c0300000000000043c08e005d0300000000000082f88e005e03000000000000c0308f005f03000000000000ff688f0060030000000000001ba18f00610300000000000059d98f006203000000000000981190006303000000000000d64990006403000000000000f56590006503000000000000158290006603000000000000758b9000670300000000000053ba9000680300000000000092f290006903000000000000d22a91006a03000000000000106391006b03000000000000489b91006c03000000000000a2a491006d030000000000001bd391006e03000000000000530992006f03000000000000d32e9200700300000000000090419200710300000000000074799200720300000000000094b19200730300000000000072e092007403000000000000d2e992007503000000000000b21893007603000000000000122293007703000000000000445a93007803000000000000739293007903000000000000f3b793007a03000000000000abca93007b030000000000005ddd93007c03000000000000c40294007d03000000000000e13a94007e03000000000000217394007f0300000000000059ab9400800300000000000090e394008103000000000000c31b95008203000000000000ea53950083030000000000009866950084030000000000000b8c9500850300000000000046c49500860300000000000057fc950087030000000000008f3496008803000000000000cf6c960089030000000000000ba596008a0300000000000045dd96008b03000000000000a3e696008c03000000000000801597008d03000000000000bc4d97008e03000000000000f78597008f030000000000002ebe9700900300000000000030f6970091030000000000005a2e98009203000000000000956698009303000000000000d49e9800940300000000000014d7980095030000000000003b0f990096030000000000006c4799009703000000000000ac7f9900980300000000000078b79900990300000000000026ca99009a030000000000007cef99009b0300000000000085279a009c03000000000000be5f9a009d03000000000000fd979a009e03000000000000b9aa9a009f0300000000000022d09a00a0030000000000003dec9a00a10300000000000058089b00a20300000000000074249b00a3030000000000008b409b00a403000000000000e4499b00a50300000000000038789b00a60300000000000076819b00a703000000000000e4af9b00a803000000000000b7e79b00a903000000000000731f9c00aa03000000000000a6289c00ab030000000000002f3b9c00ac0300000000000012579c00ad030000000000005d609c00ae03000000000000cb8e9c00af0300000000000057a19c00b00300000000000086c69c00b1030000000000005afe9c00b20300000000000002369d00b303000000000000bc6d9d00b40300000000000099a59d00b5030000000000004edd9d00b603000000000000db149e00b703000000000000e0399e00b803000000000000724c9e00b9030000000000002a849e00ba03000000000000ee9f9e00bb03000000000000d1bb9e00bc030000000000007df39e00bd03000000000000f02a9f00be030000000000006a629f00bf03000000000000ff999f00c0030000000000002ed19f00c1030000000000004608a000c203000000000000893fa000c303000000000000a476a000c403000000000000dfada000c5030000000000001cb7a000c6030000000000003ce5a000c703000000000000921ca100c8030000000000008c53a100c903000000000000988aa100ca0300000000000010a6a100cb03000000000000a0c1a100cc03000000000000e5d3a100cd0300000000000072f8a100ce030000000000007c2fa200cf030000000000003766a200d003000000000000389da200d10300000000000056a6a200d203000000000000a9b8a200d303000000000000cac1a200d4030000000000001ad4a200d503000000000000200ba300d6030000000000002714a300d703000000000000bc41a300d8030000000000006778a300d9030000000000000aafa300da0300000000000046dca300db0300000000000065e5a300dc03000000000000a81ba400dd03000000000000d72da400de030000000000002352a400df030000000000006288a400e003000000000000c1bea400e103000000000000f8f4a400e203000000000000212ba500e3030000000000003f61a500e403000000000000656aa500e503000000000000e497a500e60300000000000040cea500e703000000000000b204a600e803000000000000fc3aa600e9030000000000009471a600ea0300000000000037a8a600eb030000000000001adfa600ec03000000000000ea0ca700ed030000000000000e16a700ee030000000000005228a700ef030000000000007d31a700f003000000000000034da700f1030000000000002084a700f2030000000000004a8da700f303000000000000a99fa700f403000000000000f6baa700f503000000000000c1f1a700f603000000000000be28a800f703000000000000a65fa800f8030000000000003e7ba800f903000000000000c296a800fa03000000000000c3cda800fb03000000000000d504a900fc03000000000000f83ba900fd030000000000005f73a900fe03000000000000ceaaa900ff030000000000000bb4a900000400000000000005e2a90001040000000000005e19aa000204000000000000c12baa0003040000000000008e50aa000404000000000000fd62aa0005040000000000008175aa000604000000000000fa87aa0007040000000000002f91aa0008040000000000005dbfaa000904000000000000a3c8aa000a04000000000000e5f6aa000b04000000000000e41bab000c040000000000005b2eab000d04000000000000e765ab000e040000000000004c9dab000f0400000000000085a6ab001004000000000000b8d4ab001104000000000000fdddab0012040000000000003b0cac001304000000000000d043ac001404000000000000827bac001504000000000000b8a0ac0016040000000000005bb3ac00170400000000000029ebac0018040000000000006af4ac0019040000000000000e07ad001a04000000000000f422ad001b04000000000000432cad001c040000000000009935ad001d04000000000000ee3ead001e04000000000000d55aad001f04000000000000bd76ad002004000000000000a592ad00210400000000000076caad002204000000000000f6dcad002304000000000000e001ae0024040000000000004f39ae0025040000000000001371ae0026040000000000005f7aae002704000000000000fc8cae002804000000000000cda8ae0029040000000000005ebbae002a0400000000000081e0ae002b040000000000004f18af002c040000000000001e50af002d04000000000000e687af002e04000000000000a0bfaf002f040000000000005ff7af003004000000000000042fb0003104000000000000da66b00032040000000000009a9eb000330400000000000063d6b0003404000000000000300eb1003504000000000000da45b10036040000000000009a7db100370400000000000050b5b100380400000000000029edb1003904000000000000971bb2003a04000000000000e024b2003b04000000000000995cb2003c040000000000006694b2003d0400000000000048b0b2003e040000000000002eccb2003f0400000000000075d5b200400400000000000008e8b2004104000000000000e703b3004204000000000000ce1fb3004304000000000000b63bb30044040000000000000d45b30045040000000000009f57b30046040000000000007573b3004704000000000000c67cb30048040000000000003aabb3004904000000000000e4e2b3004a04000000000000651ab4004b04000000000000f951b4004c040000000000009389b4004d0400000000000025c1b4004e04000000000000f6f8b4004f04000000000000241eb5005004000000000000b130b50051040000000000007068b500520400000000000040a0b5005304000000000000ecd7b50054040000000000000510b60055040000000000003e48b60056040000000000007a80b6005704000000000000b7b8b6005804000000000000f3f0b60059040000000000002f29b7005a04000000000000ae4eb7005b040000000000006861b7005c04000000000000a599b7005d04000000000000ded1b7005e040000000000005cf7b7005f04000000000000160ab80060040000000000005042b8006104000000000000964bb8006204000000000000687ab8006304000000000000a6b2b800640400000000000066c5b8006504000000000000e5eab80066040000000000000423b90067040000000000003f5bb90068040000000000005d77b90069040000000000007b93b9006a04000000000000b7cbb9006b04000000000000ef03ba006c04000000000000133cba006d040000000000003358ba006e040000000000005174ba006f0400000000000042acba0070040000000000006ce4ba007104000000000000a21cbb007204000000000000e054bb007304000000000000405ebb0074040000000000001b8dbb0075040000000000002ec5bb0076040000000000006dfdbb007704000000000000a435bc007804000000000000d06dbc0079040000000000000ca6bc007a040000000000004adebc007b040000000000008716bd007c04000000000000c34ebd007d04000000000000fc86bd007e040000000000003bbfbd007f040000000000007af7bd008004000000000000d500be008104000000000000b32fbe008204000000000000ea67be00830400000000000027a0be00840400000000000065d8be008504000000000000a410bf008604000000000000dd48bf0087040000000000003b52bf0088040000000000001881bf0089040000000000008fb8bf008a04000000000000cbc1bf008b04000000000000f8efbf008c040000000000007602c0008d040000000000008327c0008e04000000000000075fc0008f040000000000005d96c000900400000000000009cec00091040000000000003b06c10092040000000000002d3ec10093040000000000006476c10094040000000000007aaec1009504000000000000b9e6c1009604000000000000ef1ec20097040000000000002c57c2009804000000000000698fc20099040000000000008cc7c2009a040000000000009effc2009b04000000000000da37c3009c04000000000000ee6fc3009d0400000000000029a8c3009e0400000000000067e0c3009f04000000000000240fc400a0040000000000008218c400a104000000000000b150c400a204000000000000c088c400a304000000000000d2c0c400a404000000000000f6f8c400a5040000000000001231c500a604000000000000d143c500a7040000000000004d69c500a80400000000000089a1c500a904000000000000c4d9c500aa040000000000000112c600ab040000000000005c1bc600ac040000000000003a4ac600ad040000000000007482c600ae04000000000000abbac600af04000000000000e4f2c600b0040000000000001d2bc700b1040000000000002e47c700b2040000000000004863c700b304000000000000687fc700b404000000000000829bc700b5040000000000009bd3c700b604000000000000d80bc800b7040000000000001144c800b804000000000000704dc800b904000000000000d056c800ba040000000000004e7cc800bb0400000000000080b4c800bc04000000000000b1ecc800bd040000000000009808c900be040000000000008d24c900bf04000000000000c75cc900c004000000000000df94c900c104000000000000feb0c900c2040000000000001dcdc900c3040000000000004605ca00c4040000000000006e3dca00c5040000000000009e75ca00c604000000000000029bca00c704000000000000aeadca00c8040000000000008adcca00c904000000000000eae5ca00ca04000000000000251ecb00cb04000000000000fa55cb00cc04000000000000778ccb00cd04000000000000eec3cb00ce0400000000000005fccb00cf040000000000004134cc00d004000000000000716ccc00d10400000000000096a4cc00d204000000000000d3dccc00d30400000000000086efcc00d4040000000000000215cd00d504000000000000ac27cd00d604000000000000264dcd00d7040000000000008656cd00d8040000000000006385cd00d9040000000000003bb4cd00da0400000000000099bdcd00db04000000000000d8f5cd00dc04000000000000172ece00dd040000000000005366ce00de04000000000000909ece00df04000000000000b7d6ce00e00400000000000068e9ce00e104000000000000cc0ecf00e2040000000000000547cf00e304000000000000427fcf00e40400000000000079b7cf00e504000000000000b8efcf00e604000000000000f427d000e7040000000000000b60d000e8040000000000004698d000e90400000000000083d0d000ea04000000000000c008d100eb04000000000000fa40d100ec040000000000003679d100ed0400000000000073b1d100ee0400000000000087cdd100ef04000000000000a6e9d100f004000000000000e521d200f1040000000000001e5ad200f2040000000000005692d200f30400000000000092cad200f40400000000000052ddd200f504000000000000ce02d300f604000000000000e13ad300f7040000000000003444d300f804000000000000dc56d300f904000000000000ef72d300fa040000000000004d7cd300fb0400000000000024abd300fc04000000000000a1d0d300fd040000000000005be3d300fe04000000000000901bd400ff04000000000000ce53d40000050000000000000a8cd40001050000000000003ac4d40002050000000000004ae0d400030500000000000069fcd4000405000000000000a134d50005050000000000006047d5000605000000000000de6cd50007050000000000001ba5d500080500000000000058ddd50009050000000000009415d6000a05000000000000d24dd6000b05000000000000f085d6000c050000000000001ebed6000d05000000000000fbecd6000e050000000000005bf6d6000f050000000000008b2ed7001005000000000000c566d7001105000000000000029fd700120500000000000036d7d70013050000000000006f0fd80014050000000000009f47d8001505000000000000c97fd8001605000000000000e4b7d80017050000000000001ff0d80018050000000000005928d90019050000000000009560d9001a050000000000005473d9001b05000000000000718fd9001c05000000000000d198d9001d0500000000000031a2d9001e050000000000000fd1d9001f05000000000000cfe3d90020050000000000004f09da0021050000000000008941da002205000000000000b979da002305000000000000edb1da00240500000000000047bbda00250500000000000054d7da00260500000000000007eada00270500000000000067f3da0028050000000000003a22db0029050000000000005e5adb002a050000000000007892db002b05000000000000b0cadb002c05000000000000e702dc002d05000000000000183bdc002e050000000000007644dc002f050000000000002773dc003005000000000000dd85dc0031050000000000004dabdc00320500000000000086e3dc003305000000000000bb1bdd003405000000000000944add003505000000000000f453dd003605000000000000ad66dd003705000000000000298cdd00380500000000000060c4dd0039050000000000009cfcdd003a05000000000000fa05de003b05000000000000d734de003c05000000000000b56cde003d0500000000000045a4de003e05000000000000a1d2de003f05000000000000e4dbde0040050000000000002fe5de0041050000000000003c05df004205000000000000d81adf004305000000000000d636df0044050000000000002840df004505000000000000d252df004605000000000000cf6edf004705000000000000a9a6df004805000000000000eeafdf00490500000000000047b9df004a05000000000000b1dedf004b050000000000000de8df004c050000000000006e0de0004d05000000000000cb16e0004e05000000000000d84ee0004f050000000000007886e0005005000000000000b3bee0005105000000000000c3f6e0005205000000000000fe2ee10053050000000000002c67e1005405000000000000e679e1005505000000000000a68ce1005605000000000000629fe10057050000000000009bd7e10058050000000000005806e2005905000000000000b10fe2005a05000000000000e647e2005b050000000000001880e2005c050000000000007689e2005d050000000000004cb8e2005e050000000000007ef0e2005f05000000000000b228e3006005000000000000e760e30061050000000000002499e300620500000000000060d1e30063050000000000009c09e4006405000000000000d441e4006505000000000000334be40066050000000000000a7ae4006705000000000000e0a8e400680500000000000040b2e40069050000000000006feae4006a05000000000000a022e5006b05000000000000de5ae5006c050000000000001a93e5006d0500000000000055cbe5006e050000000000000bdee5006f050000000000008203e6007005000000000000db0ce6007105000000000000b53be6007205000000000000f073e60073050000000000004e7de60074050000000000002cace60075050000000000008cb5e60076050000000000006be4e6007705000000000000a51ce7007805000000000000dc54e7007905000000000000168de7007a050000000000004ac5e7007b0500000000000057fde7007c050000000000009335e8007d05000000000000d06de8007e050000000000002e77e8007f0500000000000004a6e80080050000000000003fdee80081050000000000007b16e9008205000000000000b74ee9008305000000000000e886e900840500000000000015bfe900850500000000000046f7e9008605000000000000602fea0087050000000000000442ea0088050000000000005a4bea0089050000000000006a67ea008a05000000000000889fea008b05000000000000daa8ea008c0500000000000079d7ea008d050000000000009f0feb008e050000000000005c22eb008f050000000000001c35eb009005000000000000d847eb0091050000000000000e80eb0092050000000000003eb8eb00930500000000000076f0eb009405000000000000ad28ec009505000000000000e660ec0096050000000000002399ec00970500000000000060d1ec0098050000000000009e09ed0099050000000000005e1ced009a05000000000000da41ed009b050000000000009654ed009c050000000000005567ed009d05000000000000127aed009e050000000000004ab2ed009f0500000000000082eaed00a005000000000000e1f3ed00a105000000000000bd22ee00a205000000000000fa5aee00a3050000000000003493ee00a405000000000000929cee00a50500000000000070cbee00a605000000000000ac03ef00a705000000000000eb3bef00a805000000000000fb73ef00a905000000000000feabef00aa05000000000000bebeef00ab0500000000000038e4ef00ac050000000000004e1cf000ad050000000000008854f000ae05000000000000958cf000af05000000000000c5c4f000b005000000000000fffcf000b1050000000000002e35f100b205000000000000de47f100b305000000000000466df100b4050000000000005da5f100b50500000000000094ddf100b605000000000000c115f200b705000000000000fa4df200b8050000000000002d86f200b90500000000000067bef200ba05000000000000a0f6f200bb05000000000000b52ef300bc050000000000003254f300bd05000000000000ef66f300be05000000000000239ff300bf0500000000000032d7f300c005000000000000dde9f300c1050000000000001e0ff400c2050000000000004f47f400c3050000000000008d7ff400c4050000000000006bb7f400c5050000000000009beff400c605000000000000c927f500c705000000000000ff5ff500c8050000000000003198f500c90500000000000063d0f500ca050000000000008908f600cb05000000000000c240f600cc050000000000001d66f600cd05000000000000ca78f600ce05000000000000fbb0f600cf0500000000000031e9f600d0050000000000006021f700d1050000000000009e59f700d205000000000000d891f700d3050000000000000acaf700d4050000000000004402f800d5050000000000007b3af800d605000000000000fa5ff800d705000000000000b672f800d805000000000000ebaaf800d90500000000000048b4f800da0500000000000024e3f800db05000000000000601bf900dc050000000000009753f900dd05000000000000ac8bf900de05000000000000e3c3f900df050000000000001cfcf900e0050000000000005934fa00e105000000000000936cfa00e205000000000000a7a4fa00e305000000000000dfdcfa00e4050000000000001a15fb00e5050000000000004d4dfb00e605000000000000a656fb00e7050000000000007b85fb00e805000000000000a2bdfb00e905000000000000dff5fb00ea050000000000005f1bfc00eb050000000000001e2efc00ec050000000000005266fc00ed050000000000000c79fc00ee05000000000000cc8bfc00ef050000000000002995fc00f005000000000000899efc00f105000000000000c1d6fc00f2050000000000007ee9fc00f3050000000000003dfcfc00f405000000000000f00efd00f5050000000000004c18fd00f6050000000000001a47fd00f7050000000000004a7ffd00f80500000000000086b7fd00f905000000000000beeffd00fa050000000000001ef9fd00fb05000000000000ee27fe00fc050000000000000944fe00fd050000000000002560fe00fe05000000000000307cfe00ff050000000000002798fe000006000000000000e2aafe00010600000000000042b4fe0002060000000000005dd0fe0003060000000000009a08ff000406000000000000ca40ff000506000000000000244aff000606000000000000f278ff0007060000000000002db1ff00080600000000000063e9ff000906000000000000712100010a06000000000000313400010b060000000000004c5000010c06000000000000ac5900010d06000000000000b49100010e06000000000000e3c900010f06000000000000f60101011006000000000000103a010111060000000000003056010112060000000000004c720101130600000000000084aa01011406000000000000c2e201011506000000000000fe1a02011606000000000000235302011706000000000000618b020118060000000000009dc3020119060000000000005ad602011a06000000000000badf02011b06000000000000d7fb02011c06000000000000370503011d06000000000000f71703011e06000000000000133403011f06000000000000516c03012006000000000000107f030121060000000000008da403012206000000000000cadc03012306000000000000f81404012406000000000000324d0401250600000000000070850401260600000000000080bd040127060000000000008bf504012806000000000000842d05012906000000000000d73605012a060000000000008b6505012b06000000000000c19d05012c06000000000000f9d505012d060000000000002e0e06012e06000000000000664606012f060000000000009d7e06013006000000000000d7b60601310600000000000011ef06013206000000000000442707013306000000000000725f07013406000000000000af9707013506000000000000e7cf070136060000000000001f0808013706000000000000372408013806000000000000544008013906000000000000917808013a06000000000000c8b008013b0600000000000001e908013c060000000000000f2109013d06000000000000085909013e06000000000000a99009013f06000000000000b5c809014006000000000000c5000a014106000000000000d2380a01420600000000000006710a014306000000000000f5a80a0144060000000000002be10a01450600000000000012190b01460600000000000048510b01470600000000000086890b014806000000000000e5920b014906000000000000c4c10b014a0600000000000000fa0b014b060000000000001d320c014c060000000000000b6a0c014d06000000000000c5980c014e060000000000001aa20c014f06000000000000d7d00c0150060000000000002dda0c01510600000000000069120d015206000000000000a44a0d015306000000000000df820d0154060000000000001dbb0d01550600000000000055f30d015606000000000000852b0e01570600000000000083630e015806000000000000c39b0e0159060000000000001ba50e015a060000000000007bae0e015b06000000000000f7d30e015c06000000000000afe60e015d06000000000000290c0f015e0600000000000065440f015f06000000000000db690f016006000000000000977c0f016106000000000000d2b40f016206000000000000ecec0f016306000000000000062510016406000000000000ea5c10016506000000000000f49410016606000000000000ffcc100167060000000000005ed610016806000000000000d6fb10016906000000000000340511016a06000000000000613d11016b060000000000008b7511016c06000000000000919111016d06000000000000abad11016e06000000000000e0e511016f060000000000001d1e120170060000000000005556120171060000000000006c8e120172060000000000008aaa12017306000000000000a3c612017406000000000000bdfe12017506000000000000f83613017606000000000000126f130177060000000000006c9413017806000000000000c99d1301790600000000000029a713017a060000000000005bdf13017b06000000000000b8e813017c0600000000000016f213017d060000000000008d1714017e06000000000000ec2014017f06000000000000a43314018006000000000000bc4f14018106000000000000d58714018206000000000000919a1401830600000000000005c0140184060000000000005fc914018506000000000000f8f714018606000000000000a10a15018706000000000000fa1315018806000000000000561d15018906000000000000fa2f15018a06000000000000513915018b06000000000000aa4215018c06000000000000106815018d060000000000002f8415018e060000000000004ba015018f060000000000002cbc15019006000000000000ccce1501910600000000000019d81501920600000000000076e115019306000000000000331016019406000000000000664816019506000000000000998016019606000000000000d5b81601970600000000000093cb16019806000000000000f3d4160199060000000000000ff116019a06000000000000cd0317019b06000000000000492917019c06000000000000a33217019d06000000000000444517019e060000000000003a6117019f06000000000000117d1701a0060000000000001c991701a10600000000000059d11701a2060000000000008c091801a306000000000000c2411801a4060000000000001e4b1801a50600000000000037671801a606000000000000f2791801a7060000000000001fb21801a806000000000000dec41801a90600000000000056ea1801aa0600000000000005fd1801ab0600000000000079221901ac06000000000000b25a1901ad06000000000000e5921901ae06000000000000f9ca1901af060000000000005df01901b00600000000000017031a01b1060000000000003a3b1a01b206000000000000e64d1a01b30600000000000044731a01b406000000000000a37c1a01b50600000000000078ab1a01b6060000000000006ee31a01b706000000000000921b1b01b806000000000000be531b01b9060000000000001d5d1b01ba06000000000000ec8b1b01bb0600000000000009c41b01bc06000000000000e5fb1b01bd06000000000000f1331c01be06000000000000ef6b1c01bf06000000000000a39a1c01c006000000000000fba31c01c106000000000000f2db1c01c206000000000000f8131d01c306000000000000df4b1d01c40600000000000075831d01c506000000000000aaa81d01c6060000000000003bbb1d01c7060000000000002fd71d01c80600000000000017f31d01c90600000000000067fc1d01ca06000000000000ad211e01cb06000000000000fb2a1e01cc0600000000000052341e01cd06000000000000da621e01ce06000000000000c87e1e01cf06000000000000b09a1e01d00600000000000089d21e01d1060000000000000fe51e01d2060000000000005fee1e01d3060000000000003b0a1f01d406000000000000f8411f01d50600000000000098541f01d606000000000000ac5d1f01d70600000000000094791f01d8060000000000006eb11f01d90600000000000038e91f01da060000000000000b212001db06000000000000e6582001dc06000000000000c8902001dd0600000000000062a32001de060000000000007ac82001df060000000000001cdb2001e0060000000000005d002101e10600000000000021382101e206000000000000f76f2101e3060000000000003d792101e406000000000000cea72101e50600000000000095df2101e6060000000000006e172201e706000000000000334f2201e80600000000000085582201e90600000000000010872201ea06000000000000eea22201eb06000000000000cbbe2201ec06000000000000a9da2201ed060000000000009ef62201ee060000000000003d092301ef06000000000000782e2301f0060000000000000c412301f1060000000000005e4a2301f20600000000000045662301f3060000000000003b822301f406000000000000299e2301f506000000000000fed52301f606000000000000990d2401f7060000000000002c202401f806000000000000173c2401f90600000000000063452401fa06000000000000fd572401fb060000000000002a7d2401fc0600000000000000b52401fd06000000000000b8ec2401fe0600000000000037242501ff06000000000000155c25010007000000000000e69325010107000000000000a6cb25010207000000000000630326010307000000000000b30c260104070000000000000916260105070000000000005b1f26010607000000000000523b260107070000000000004857260108070000000000002d732601090700000000000018ab26010a07000000000000fdc626010b07000000000000ede226010c070000000000008d1127010d07000000000000e31a27010e07000000000000cc5227010f07000000000000ac8a270110070000000000004b9d2701110700000000000090c22701120700000000000087fa27011307000000000000583228011407000000000000fe6928011507000000000000557328011607000000000000f4a128011707000000000000ced9280118070000000000007d1129011907000000000000414929011a070000000000001a8129011b07000000000000deb829011c07000000000000bff029011d07000000000000a8282a011e070000000000008b602a011f07000000000000dc692a0120070000000000002d732a0121070000000000007a7c2a012207000000000000198f2a01230700000000000069982a01240700000000000003ab2a0125070000000000004ab42a0126070000000000009ebd2a01270700000000000041d02a012807000000000000e7e22a01290700000000000089f52a012a0700000000000023082b012b07000000000000cb1a2b012c0700000000000018242b012d070000000000006b2d2b012e07000000000000ba362b012f070000000000000e402b013007000000000000af522b013107000000000000035c2b0132070000000000004c652b0133070000000000009b6e2b013407000000000000e4772b013507000000000000abaf2b013607000000000000f8b82b01370700000000000052c22b013807000000000000f0d42b0139070000000000008de72b013a0700000000000081032c013b070000000000005e1f2c013c070000000000004a3b2c013d0700000000000037572c013e070000000000000a8f2c013f070000000000005e982c014007000000000000eeaa2c0141070000000000007fbd2c014207000000000000d2c62c014307000000000000b6fe2c0144070000000000008f362d014507000000000000426e2d014607000000000000d9a52d014707000000000000a0dd2d0148070000000000003df02d0149070000000000004f152e014a07000000000000971e2e014b07000000000000e2272e014c0700000000000035312e014d07000000000000cb432e014e07000000000000174d2e014f07000000000000a57b2e015007000000000000f8842e015107000000000000e0bc2e015207000000000000bdf42e0153070000000000009d2c2f015407000000000000e9352f015507000000000000353f2f015607000000000000cf512f0157070000000000006e642f0158070000000000001b772f015907000000000000659c2f015a070000000000005bd42f015b0700000000000001e72f015c07000000000000470c30015d07000000000000464430015e07000000000000904d30015f07000000000000e456300160070000000000003b6030016107000000000000327c30016207000000000000d68e300163070000000000002d983001640700000000000032b430016507000000000000faeb30016607000000000000f12331016707000000000000c65b310168070000000000001c6531016907000000000000bb9331016a0700000000000002b931016b07000000000000a4cb31016c07000000000000870332016d07000000000000721f3201" + "babeEpochChanges": "0x0480df609c40171d0f62924a7d83db3a5c52c2f78dbe0dab0497b8786e659872e8daff340101734e031100000000d35703110000000004877d77dc713f5db844a860efb4ea0372343b3deca76cc7fa0827780217a6c4d33609350101d3570311000000003361031100000000046204e22a5bed51dced77343ac746411fa965babf73ef76b57e185eebd64f32af8d123501013361031100000000936a03110000000000000c6204e22a5bed51dced77343ac746411fa965babf73ef76b57e185eebd64f32af8d123501011f2100000000000033610311000000006009000000000000a50432904ec260963195582a1d339f9fbd2d5d76f551160105c922423cad0d94482f010000000000000076441c448aefcf40a72128edc9b44a4f7ef9c267c503e98f5f9c72d5e9e92f000100000000000000526e055ade4ac425e9b5f93ce4394601335d3599a5b742603126d78ce99a4a540100000000000000d0e8ddfdeacd8e163b01ca4da1a4e856312b0de412b492247070f2721f7d803801000000000000008008c1b7061a2402634fc15d3849e2913863beb9f55024bc8cc7fa7d6e397817010000000000000024a51a9bdb67213626d1b52bd8dbc0e9b94ea88ea417aa17b56212d1cea3e1780100000000000000e033368bc2edee96d72e43448824a642d53939c6c190693971b05ccd1054464a01000000000000004ceef9b2b8e3b5cd971f7557c3a3ad02c9c7a7bbc7365c2db5622fa74853790d0100000000000000aca7a86b6fcf25daa7f0767bfe36b284f3100dc1ee4dcc971fbb3244bb57221c01000000000000004ea4871b3ccdd1276ee604eb0e06aa4a62536dfe8fb053042a8f36caddb94c510100000000000000ba395fcb33327501109ed40712c7a372d25bf3339edfabe2a1964fb7b5d4d82401000000000000009cb389c209afbebda2b12113e0266b3d30f46e2a91aaf4451c193d640288357101000000000000004c9886e2e62ee92a6778d6a7928052732044b64fa61969cd8e37f3f7e3406f7201000000000000005237e4509f24bc9e8bf9bfd78b594219d86853ae16601f692f10c9b16b88f83b01000000000000006869737a2873891c0e4ef80a69e331f64ffc3663c9f3cdf86b440bb41827a252010000000000000098192016f83ef2fe74dba1ecc6526efc61b79f3177c00dc7c053160391858f700100000000000000a6f10752adf745ad55866031836194ad027ed8d6710d9853ef62982bcf45fd0e010000000000000078c35105ea4cd9d6ea0ba91b2c19e78f60931bef5918c1bd2e14259229e7c330010000000000000006d2846642c835b0fb1ff1ef908449376aa8e7c0f3352e55da9a1e97e9528b230100000000000000f8a681118ea0bb9dfde2813ce5144eeb5cee881c27883de1c0c759255ec326540100000000000000ac8b2b59f77eb5f3725961767878166a3817747018f18cf48c933e284320b90e0100000000000000e67c524e443cda4cd27dfcce70488a5d23a93c8c46a5e83ef5a69eff3a02fa5a0100000000000000a42289d68c963358f3c450a850242bb53121e73e17f0e2ea2b93327446bea33c0100000000000000caa53cf3e8ff5604d82bac45868bf3e25115f7e8f4d1cdfada68f8487d03e91b01000000000000000219b9856c2d50592c3821d7df9329795c9f6bc1e8d62b76072a4289617e5a060100000000000000e4ba5ffce05c90e6a5eea52b15922b6b3a78d13ca98f53fdbe08e5c24ce3c8410100000000000000a8e470f2339e3ed0da456780dd9207e9c6a02459238ec3057a6ade01fd6cd60a01000000000000005c7f05d77f853f3eb8d4989fce36d0808b6d2b881e26f13c01e939b5d489a57d01000000000000002addf696d5a42b0a3dada689731e00c991db936909df869ac6600662abc35310010000000000000072ed7192625403acef94aa9189f9f179deb89e60478816ca96c79b742f757e750100000000000000b4ffe3c5959ff37c11c6f19d91926cb97aa4bf0f604919e1753bb55664d061680100000000000000bc4c9b5425f9a2aa09e3239332c702dedbfffa2b9f4cc1b978b307fc1fa1337c0100000000000000e07d5b19d98a6f8ef5c964b507fcd88f500a2a0a9afd5cffe9d4e3f74d83b27f01000000000000001ee57665488b5ad6f7358157b73009a4ec4b14b4a03c976487e188f54bff7d640100000000000000be18787b5177e58664cd893fdaa20a3ca1bc9f1acbbb15036b046ae49c17c15b01000000000000004c50abd9279d48439dc8f93aaf679e47981f25372b63d838786dcaf7a3f8d0740100000000000000c49cfd152ce3ac1fa142b3b6e720cb173eb7f43c82f021418253a070036f870c01000000000000006ec27dfa7ac9d35eb002c55d3e4d56b4df928dd5c44323ac228305741c9e093601000000000000002803ef26679fce0495aa4066e053c4fa9cda5bfb54e24497fcb1bcef2902cb400100000000000000125becf853d8dc03bc97114ca0c751f6045bd7ef5580e58d32e3b47d7ac5b60301000000000000009237113cf97fee5fafbeb82de593f6125e9c498bd59f0369625f46b326c7d9170100000000000000722d7d57085c250af633f2d461874d59aebc8021eb1112ec8805db5ddea53e5a0100000000000000562fd7529c92f9370dd6d7ce60d06ea4a826cbefa238231993ecfc9e7725ca240100000000000000a20797f3a8669a909adb22a3aee2844dba82d231cc33f5d9be0e2c533cb82a6701000000000000006a1274b6748bf822ba80c9a9416abd3cf591b7aee6adabb8359b7dbed8ebb3770100000000000000dc1274e0689c7a3eac31b41ce352719529e65c01f26999f74ce17c9905fce87401000000000000009c9bc1074cf465c0dd39f74bfdf16a67f81339ba2ad117a0c7030b4f06787717010000000000000090708d1a49ef0acfea32147a109d08d9aa15ee975b5237d56ca9b8e324108d0f0100000000000000d8b38c77823eb1912bf8b743cca6c655ea1844ee468fbd78b394bf222bf8bc2001000000000000007251d6c376064f07f27d2532b05c091bd0978067b078c9f8d9984fd4216bdd4b0100000000000000487c6aad1cc26893dc7e498916a4c23d303f098c04b0a8b0c8242fbb7e73a16e0100000000000000d6152835cb59040a40a5a4ee3a4d481937b7ee9d4a5649abeac6c535d9e177080100000000000000bc4b95226de4e10f91e0254cfe4541232252deaa347f567df124aba81bac4d3f01000000000000001eb833e31087d6baffee4e7f1d9a8e3b7013ea392c81f74313a354ba82e92f6b01000000000000009c8c7c8c91df0ed53864f69017d530b5ebda3ab4bde3c67027e70893213d533a010000000000000018ec239eec5457ba11a41518e7c5f98266d1bdbd67602641d04706f95dba5c560100000000000000ee0c4369d7e5dca53a68ef223db7c858f2a97f47394c7bc678a8edf719a49e13010000000000000024efac2829d615703c5375dae24d394207fdd26d9522bad7af6bac64ede127020100000000000000ac0596c32a2144b2214a588fa0dc2e589dd829395a569b1f60ee8db6a2b5b111010000000000000028a027ca1c0bdeebfc8fce85ac4bac48cc072523d9c4a86b4f2594f9142e7e3b010000000000000042e4c41a899dfb238649e5b17dc232c2699353635d60e6a3bdcd71f9b82cda300100000000000000ce4bfd8c5611b1637066ef9e579c85efadfc9513b882184e00b75871ef7f5a2d01000000000000005c0419f37036f2bf999f3958b49f63ab19d6dc19847a393dfd26cf303fc8d911010000000000000028558e46037c51ece4d39a8a4d34688662e629413c221d6226afe454240e702101000000000000000e76ad5033ec80da424503f80ce2bff64d8cad0e807d7c6516a369b46ed0355f01000000000000004a2073ae31b3df10d285eae6a5befe069183c4c6a6ffa1b2bf432011d0d475200100000000000000bad91c9aefe173441dae1f273e55090706d412b0723d39bd6c3af053feb183200100000000000000be03fe6bc03a7884524047567a8ccf43b3c988bf3b447ca9e1520d1c1f83c5390100000000000000b05ad6cde0dfc019d740c3f50b8aac16550ff4c197da19cf23b9293f0c5c39070100000000000000bc56c07cea21bcbbe058aedd2ced9fb4757caead55f96bda9bed1c9669c32b64010000000000000078e1a4fecbaac940c04e0b591a01ea66a574b5098852ded2810e3a534971111f01000000000000006ccf2ce8e149999a7bb996faa65194e60aeb7bcd1937c787f886fe979fb49e6601000000000000000e5650026c7bee4fa43a2c7fcdc3452daa10b0530863ec686b1d5ee4d707600501000000000000001e866bed92016cd2dcabe2d87fcaf8c1d7248255cafb9e10638fc3a2b476221b010000000000000092bb282d46ed819e46fb3ee929f7662354fd095b67a8ed51326b47e83f86653a010000000000000082b820c5bee8ee77e35203dab387f3434b8502e5f1c35dfb2ad15b5c89d47b3c01000000000000001cf3446b4b5116a1784d92cdc5101e55a5fb91ed3d93efccd06b304a94362d0a0100000000000000c6d5dc6e1ec83491397390449d8cddaa88631e8855efe50697788a93de00fb5501000000000000003a4b0919068523aa04ab29f1b49bdc03a176a4b93f9b5a7e6e0cdcc8318691030100000000000000b288a9832e07bef83c5a8ca72c5a5583b321672ba7c6cdd44a971f855d32d95c01000000000000007480edf84ab569e559dccc99b87ecb9ae9db670b45a259b7f6e618b063e43113010000000000000012e4e8f29b147f5596fa9f59ccdd35467884318f010063feac87e8985b00ba7f010000000000000026c4a27200f70748b52f7277150d2db7e192b258d5001412e42c62c6e3ee1e5101000000000000004628f93047462b43ec0886f2c7d7318ddad1764fd32af4f32ef0b2dcfa4b297a010000000000000040a2527ffa7d30d788eca127d435c8b5aa48972cda538b9a1627a57e85c8fa1901000000000000005673f82330a1ee6e6889f745fe15c353f5f8989e4a281e8aa53e38ce1e74556d01000000000000002254fb9324a6a9af450ce3a4f5ab25f55deb22161e520b2308b8aaff42e3aa740100000000000000a64dd29103d43e3e898a41f3630ff88b2420953febb931c70ff543673efa251b010000000000000028e972febaf463f22d1108053e7c26ccde1e6018d7c302985bc227557e0a663b01000000000000007c4f928b915062d9cb15e854a9476cddbf7126c9de2fd70f67beaf2ebf6dbc5c0100000000000000c473d994ae0f9b8532523f5ebc52014bb3fad20e68770fceaf80fa105cbefd0d0100000000000000fced8f1dff4f6c6852b0d643e26ee532086e72be7aecee28d94d1d59b5f9986701000000000000004a905d0574cebf6e8d00d382b104fc8ee1c008f1b9ffa6fa5c3b67ff29719c0d010000000000000002ecd96c1f4fe196d53f262e75770f1a81c80b5764b01383fb77e20684f2096d0100000000000000fcccf8e328b4cc968af52a23f6c960b5e34241047b630c19a0661ace6b9c273b0100000000000000be6106f9217a1847af66de9510fdfb40514409556506ddc1c1a897818434125b010000000000000094af0a39f196a145c9406ace38b2b2b9b9ccec2bf2da2e95d0b0b8507b6f38560100000000000000bca6409d6d7e4f94ce797594db4363bb8bebd5387770aee0bb7663b36354fe2a0100000000000000b2518044cc31062ee50fa81cb6983f314291a0300865fa5cfe149829c5050d24010000000000000086c1922e4ed392d72e0fbc0ee28e7ec0a8ba2b33470330a606cec9a159a79626010000000000000036465f4be77147914969ea78f8e39610310679011dfbb6137dab12e18a687a520100000000000000187fcd65da5b05c572bd1809b465ee23d8139deca61327a33a1cbbeccd5b335a01000000000000004ad8fedb395dc0ed63e0edbdbd2d20555b61a46aa7cd751e4308335c277cbd6a01000000000000004c5e6997b6f186855b1f4c9f8ab2d6cea3da2e86445605ab89e5b5821e05bd3d0100000000000000125f4bb2b8d56e62b303ed525cce2e08f1baf016c3e89f28df7f61a3222ddf4e010000000000000068508b2ca3e01d7c8d79d99f1bb06a93058d14f1061d5fed4df13d4bc30aa557010000000000000074f02ed037d28c883df643034a596e4d2a97a23782ee8483c9ae3429ede7e7090100000000000000566948c62b699e382e5379592d1ad3e1823640d386936142cb9b82915ed02d1801000000000000009493e6de34e09c9679b6dca602e38d8c07abb77b3cc487ae3a80661968caa37f0100000000000000dab69c099895a293508bafd5bd96a1f5ed7193012d71d546d4792f6452bec619010000000000000004734733edcd9cf662389208fb8ccb5f274a7db8187ccc53dc84250f8599d54d01000000000000004e1b48e67c1e62e46add39fa523b956946228ea0f08bd9d20ced798cfc9a0f5b0100000000000000ba78c26db96a9ce3ccc2980dfef7346042ade9769f95afaea559f784af167a5d0100000000000000faa6ae896c2d1040e495acbdcd8d90a02ccb17ba6e507efa2f7deacb3b28466e0100000000000000840290d318350bff32db3dcf6138b822cb2adf1dedf5bad8729471988955915c0100000000000000907ff7ac1e6c451d236c05c8d3f85640d9f9472d6a30115fc26135dae020e6380100000000000000c264fe63e84cd004530d2a3eabdde5098fe5c6b619af7fc6c9cfeba01e75ee5701000000000000001ec005e9ca3c15b2994641dd22efcbb20032f10894f76f57296d219dc149817b0100000000000000a07f151db53097c2da9dac4b2e0f194931a677a3ba99df0f3976e34409fd64760100000000000000d8faee17dcc461acb22ca1720b86385414ea8810ba31509fbd8da8733029eb190100000000000000b071e9d6b444a555e034ecdc4d04f2528cc36b347b231b33388564a40fd32b2c0100000000000000f820a8ed2c97f639fea2892d0a89ae98ffc4c0054f948f9a0108e4d99f89994c0100000000000000fcd5f4c4fe11f20ad99dc8345b7dc5600caba5d5b7d3f499c3253c095152d4540100000000000000dafd1b81e8401d6715a61ca7c3d32920b24cd28a8708ecdb65b5e7c557d14c4401000000000000005eac8ac37c95fc11921839550a30ef071bbc80fb10ea1482cc67818e184d544a0100000000000000ea2b17bd1b69a7b442dd000db0f12f0bd4bf7a87a540427986bd32f3d3bd55580100000000000000142445d894c1236a38c6b1bcd9f5a7245897026424ce9544002008a7702c3b1d010000000000000032f75d00cbb3125b7bbbea02cefa67be8dad66d54e84f7c116ddd0dd2e3d9f490100000000000000d6acabff06fe9a6ccf02f780f33902672fae0f038d8e19ee234ce28a0b6a01410100000000000000780e4353aca40b0f2b2403c862cb33032d49a820244bdc2853ce158d48c4f6100100000000000000104b41830f092484a00f2d595b8aac969bca6cbf7f386efdd0f79ee9a8c0201101000000000000000e2daa2ef7884bdc7ca5f843f4f33f070c790e9a19d314bceefd04622920216301000000000000003e8394db87d36ddce56bfe0b86922dcc9a86d1ba061600e22d9694027b18c840010000000000000042bbfd10e95a6a1a57b34cbe01ab26605536797742d6d24394ebe95f87bd925c010000000000000040b77fd8fcabe868dc7f2a08bf14c67e4d433886c3cd3738d1b0b9c649bafc230100000000000000f6147fc504809de982f75aa2a806945bad883bf3854f6cdecf6f8a7b79b998540100000000000000009463e59f6b021a1dbdbf65e56f568ac5736baf96470440d7123605a4bcd93f0100000000000000b633c47d126eceb0e36d788370ebaa179b0c7a3a21cf5f1421bfac40c895ed3c010000000000000092ee092cd2215c7c1628086c08be10a3cb969f6b276f600422f3526f303bd878010000000000000084a7633f080e6223b983763cc426583d4bd923709b327a38e5ebf4167f6767770100000000000000020d34131c7a0ab6d104839ed8b9e0cdf075b80409a36fbe94d0cf83f7ea1f1e010000000000000022333a4409728530184f55b95171d2ddcec037603382fc7d6443b1f7b96c813601000000000000009acfd215519f40156749868afc8d56e015759f71cf183fe68382e8c02c75b2510100000000000000f44b3ec5c7b2188f208d60d159d1f5b0914a51a0632eacea6b88ec7b26d6673d01000000000000005ce79c3ad8a0e1806e863f0858c28a81408d19870a62ac0316b3e6345cbb5f76010000000000000006451fa7b2d831264e40a3e5b8452ede10164b7162a0e93bb9789a102c3010420100000000000000b672ee2f0f9183585ac4875368a0defda6d3c81927fbfc34bbacc7481058cb4b010000000000000022a66dd6397c2631df509db3482baac28b546729e6ce965472a9ba2e648ccc74010000000000000082bb250beb58df1c5346dc5dc26dbc38647a59fcd5c220c41466606cd855a252010000000000000052b41700df65ea66ffc6cbae47c04a2f20618f5d62ce1ac9304313373d39fe440100000000000000767cb742c94b22fff80da70a4ea77069aecde7ded53fbf5d957b01196924cd2d0100000000000000a065f45a353f24ba187248aacd9c64d5c3a92ddf92b4a5c33994f56a07cea8400100000000000000e4a9f30dd10e786b66881c8811a0e1042df8b7bfa90ee55cbce2f4a9d1dcff5a01000000000000002ea8960211dab2883e7b15dc18336ccf12f096572c66831279c9a5e2492ef51b01000000000000005432de09683010f3c1a6a977dd0dfdd8c5ce9fdb85225b9b7dc8e451e340cb240100000000000000464cb5dfedc6938caef6caaf5a58f4925a295f24a4f37337033dafa0cc733e6601000000000000005c9b116ed7527b0521213299bee8025e89136d819295fa16ef7cf4f4b86887490100000000000000f60b5e74957220ed7664befb71e9621436e40f2b6c1bdb1c90a6de9c3540a84001000000000000002a98fbaf7ec22832522e3f96821711ef684283911a524960efb14953255baa2b0100000000000000fe0af833307f4cff497d006ec63385b1c191efd6a4547fb05a355cd23686dd0401000000000000004cb98af1a70e917453f5dea682917e7b3077ea9d41dda7764433258a9d5db54b01000000000000002a0fda136ae348db338b87bed349145a94ce091227774b0542e533a83d1ba455010000000000000036c5a061b47768957b2b939b2e37e4cdf8825a4abf963c4f912f3ba4cd567f1e01000000000000006a5607bc375d7ac0908e7643ea2e89dbe42f4f805c2fb6e2a22d0385c1232b310100000000000000f4ccdf83d734edcc568462572abaf32d22ac7faf8000195e02273d1c9665430801000000000000007eb2b0b6adbe5a5bad38f46db207f94c896d419661f4ab8f21e302a543df9b11010000000000000048ce0aba6f1554e139568b4d2358d6cca9bc291d3600787cc3e732291002ca220100000000000000e002b608a4148a8616e5435dfaa8681d0012bd78fea4502541249d97f56acc640100000000000000a8731d355eefdfbdb7fb12cfa5a280c0b1e408aca264ef585d42bf97fcfba1160100000000000000c4c5fe47a568c2fe4876eafd5e0093dcc31b450eb87bfe58397dfae2a590d4650100000000000000fa5a4da949ce29dd0fc20fe56c40d63ffded8e2dd88844f725efda0814ed5264010000000000000022350f7b389967ec6e8c8b6c56ac75a138db742abcff27b1d6b3bfab894d187201000000000000003ce775a4a6215dbfbdc2b0a8a8b71936abd61642b5fd1a0c1d06ba548ad3025e0100000000000000bcb998778b7c2c182f396b311f92ae1289daeed9e62a3d8a8298b8dde7e1a52401000000000000004a1069d2203a75cd1078c39de35c16a6c4c12acbad34f1cba8efc065f80398610100000000000000eedea8652413b5a97c1eda13e1e050b777bd0a8ca31dafd63aeab576a68fb75e01000000000000001836b6f7bcdf39ec4f786ee982799a549605b62f384a74981bf9de018c26fd430100000000000000245a9f1c784e83aa6e1a22b7a560de42348ae1c3402060929d669f110da1b7490100000000000000dc4ae9ca42fe496af7a466de59735813691d9c050f3256c3d4a96664cb6f9f6701000000000000005c25d331b2e023d12ee512689c3ea95edaadc300c9dc804e98806117f2edf57c01000000000000006205ea8c9da2e39792b9504100d0ce7eec4b9c732297afea3c2a885fe4f5832401000000000000009a64daca74d14dab93385e52ca70940732a8d45ae4b853ce156c3eeca06f0c5f0100000000000000c63e31fd558807e07f9c7dc51f8fa8110679bb1b1cf5585e56d0b6164179b9790100000000000000eed7e8e8a64dfa89c548a31c1b9fec7af5aef4dbbdb26997b2ddca72d4f8790c0100000000000000dcb8d42bd4e3b7b597542ea3dbbc6ac36058a9b73ca50b23bcc7fe19d08bbc580100000000000000fe5ba24461a8be22c5e553d2715748ece9c50a621d1794e36ad6c40dcd5d9c2301000000000000001e534cbbe982369a968006efa465cf2a16807a88a5c877d45f090192ea619c60010000000000000078cf1debe3fc0da2ed2473d1e1835a478cc3e7008e0cf42043f287bc36804b710100000000000000f853a1534a3af56217661420536dd7bea0db6f6db843d8fead77c308ed7dcc7c010000000000000032e2c97e308c84afea4b37d7dd8f62e67763126c357c9e6e49b27f54c3702b73010000000000000050d2e3ed042861cfddfecfb31d47caa1927064cb0372213a3015b2acdf1dd1450100000000000000843778dfeddea10578fab2773f2827c62fe0efe374d9a01eb370bd8f1427e7630100000000000000140fbeeabfb02dede7214a17c2cf78279d076c80d962431f35d1105c87b8d95501000000000000007cb1f225b90c00f426c33ac4338eeb2dae6467b8a9da5c1556e6588c12ca977b0100000000000000b261a66b9bae17b65e7f6a88d65efb4519925d6c418c9e2ba17bfdbf684b776301000000000000009c5d3bb1387f53f0306bf7f24e81dafa5bf972048de867e2e517938c4ebdf7120100000000000000560c91919fc22867159ed77bee1b3e70d2e222a5fe6e830fceb13b58b0daa5290100000000000000e03e94cd4419d9cb8709ad2859e598912c78c01b15eed53ec0c336d8d6c491420100000000000000fe9d62e17387326c0e4b75697b2f0fbdff9506992e745d61b4c536c4dc10f57d01000000000000003227028def74f8ea7bede3e112e4ce09d8fb823790ed599f2259019945f2690a0100000000000000c686fbbc968476537924f90aaa4993eef8314685d150228c462f8ae4e5e1e57f0100000000000000464d95a7c8cce76af088d8f781e3073fc194333ab20956b4dd2c25d4a29ac56d01000000000000004ca838afa9f12e88436eacb5024f3f94c95a66c32e114f65f3136176e426c75501000000000000000c60356c02d5d99293952c478fd07b2cff982dbad863ebdadf25c9e69206f14901000000000000003a8b589c8222ede45b3d95c8d9176543ffa9a29cbfa0ba2af60fc412e732d75e0100000000000000a43b19f13ec057124df240aad303e969f7d02fafc02c263d7ec814b6729d1b200100000000000000fc6b68c2f556cb4bbfb09cea4ee39e47aceb7809408e38ae4696d4caeed3c91b01000000000000000884c85734b971a88cd94d86d3c62fdf163256a0387e15e2d36d8f25523a77480100000000000000f2cd13ba1efd67dfd5f8c9150b1a74d1ed1bad1a72c36fed96163b062e463d0101000000000000005258f48e31bc89f5d53ea6a12eea9698f8e72c6068ac1588100d8632bc674d1e0100000000000000ecf0297bddebd3d766ea7def2bac79ad6eb650fabdcd029b99cb1649ff7dc8150100000000000000121f9d8ba85d89e3c6f9a0fedcdfc9b05cc40a6d3324eff6e8a58aec5f52590501000000000000008a16fb5a6718a714296cb8fa2ca708f677f78c7f883ba3c5ad1bbb9e23f37705010000000000000038c9a0897d9caff03a308d2120bbe892974ae8cb05f1cfe8b97259f0ac2e852901000000000000005c3615a5e2072a618f0e434f7c572f4e4b1a89348dfe0f7939c99de095d54a55010000000000000006adb1e6e78084fd5e5df37fafc180d1ed84377ca41de3b5ca43b764f0cb190901000000000000004e466f6a4930d856a1f53f21c1a44451ead20c8c71319f6a685f0e254d24c32101000000000000007617b69110c43683b5000788259be855890c474be8fed65d7b1dae1d534ef85c01000000000000005e0fa84f762f7d6e4c4b0c18a86e1b7da6cb4fe7dfcf6b5c0056a7ccd8eb201401000000000000002037d70f4c244c81422409ad01d28d72a30d26e595fbcc791daeb57f78a8567001000000000000006eebb90d453e3e26540730fe99339d907a0e46365f6f2c8e2bd1a2dc83c2897e010000000000000088fa8bb07ebce99964718c65d0d6f1b091ef2f4d4cdf7b94a22c42c007ecd706010000000000000000f79cec5a6b6b70f768ed05e94d2cfd70b13bc58fa16e62d742ee49aabe967e010000000000000052ac28ba2601723d23a086b5d775f19319f110ba5e9292f2af461e71903b5b50010000000000000002a4b2935b657f9ec563642ab0f34e223ef594cc70c856b9bd70fbe0837215600100000000000000c280e82e46ecabc4d68169e292c59cef96432f25fe849b8a147db5ca0ce7e17b010000000000000092e5bb9d0906f768dbdde0696b78e493cc78dc1f68789575b24f0b962799b51e01000000000000009295a1f023157921d346b73484b120d46048382107015aa9ed998f1fae95970e01000000000000004a512ac212da2c96d7bc8590865ce627e6b60246700595bb100b240e80a3f076010000000000000010e37a12fc6ed768d1a2d33c8abc6db675381dfe69c832abb77d9ba2341b3c4a0100000000000000d8de542a748c14224ee7faa16157727c852ce502a45b408de0975c88a39c690f0100000000000000188d1a45dca0c370ba6b7952ba682570fd4f61501c4dea9826a981374a3f815f01000000000000004c1dbdaaf0fb061228d2245561476088bc608788cb3e9c5266f5a8e54bdd1e670100000000000000d23c53a531e356646133db73065cd83999693a5bdfc05931238434f5b031522f01000000000000006a40a8b74a142958efb2d75cd363635eccbfb70cddb24f0626d0ec927d98233801000000000000005e127fe875a9c6396693b778833a710b0426a4fc0af4af490e7ff0a6f3e8b61f01000000000000008af88ab005ea3b1a0b3412054c721e574c4b4469e231aa487d9132946e42bb690100000000000000aa74176b5870c97b754a157ec0d8032148c2ae717a905e0e5e626048b6f5334301000000000000003e07b075219fc7ace8dc3bf3a06f5dc12aa9c7e45fe30244d2284bcfb1e6ee190100000000000000a4a0bc81aaad1ebce3fdf896a8d6d081ab93efc2de9d5c56f2632edfeaa7ad0f0100000000000000465242c8915eea46e25549f2ab97cfe78784f25083e51773e07d5a0cafc2de32010000000000000022376791bf19fefac611324d27bc6acb4b7f7eec713c186adbeda5a1e1b88f340100000000000000bc8f93a45201992fa9d04355095d03adeb5ff1aea206425eae4f902ffd47fe200100000000000000288c08430a7e427400dd5b61926b74a82abcbbc91ac739190cc791a581f6836a0100000000000000eec1df2a382f2f9d0e7dbd91ebffe7be19dc9e01159cf3b82229a3ad2a33685b0100000000000000e08b1d1e40c5452afab2df7f9ce391eab8fbe0096e9fe744c9b72c414127722f010000000000000028052d0b965ed862b7861aa7f3f91fe52ff8b0f795ff476c7e0a7aa42e79933001000000000000001c860d36fc84a54978d99ad400a719dbbef493f8631856e6def3e9ec998cde3e01000000000000002ef781a1d268b8afb0a8331ece83f3fff6877baa2d06ed9a23d484d5d70a50030100000000000000163687f38841bbbd2b93787f7f65cc74a2ab94478888abce52207e1b81f46c4d0100000000000000e0b770b1bcf7deb030ee75d5bad6ec1ebfe06ded0fc406a8520a9650fe832330010000000000000066a5a598bd5d484fe66e630a3e57f3b245fe0413f81401d7a5d59aeed1a3a46301000000000000003622bfbaf9350b5906bdf9ce362e06726224ed141c5d29e8e175e0beedbd3d3d01000000000000002c6ef636d3bba8ef79dfc0e6d77bcb38426b54c92b764b29115d25f3af9c871601000000000000007a661c99fd40492b4893407b03822464e7d4853e9ba47fc9e9960c3800d6725f01000000000000007836067da2bc290dc3c428c548a4dbebfdeddbc10a2db206abb6ac11741dc63e01000000000000006ed90090a744a0d55adf8f8af5af4d5198bb67220ce33fe71121d7c51f27a4130100000000000000bc20aa968087f7c0d4bb35dd9c502db39fd7f4596a412880fdcd5ddba22fcf460100000000000000dc0aaa8a9d617e5d1ce58d8279747ac87766edfe7028c9c5a8793ea3ba9c94450100000000000000386f18b82ffe824f7ee1fda0f511d5112dee1c677bee0069f3d8e3d8be1a321d010000000000000072f2ff3d21f4126e217f10f9d9bd18069c12eaab6922d073dd5241ac718e91200100000000000000e4e005984bbae507a03d158ea8ca3a87505ae3e8723d8f5bfffccb63a23ea61c01000000000000008a40c3acc862dcac958866b738b304be7d84c33d9420b0747eb82aaa21b8c40c010000000000000094cc8c46f9670417f5ad9492d17189c4e03e96122782e92824f05e176d6843790100000000000000369a7419ed7884aecd3cda7ec3576942cacde7a9b8f2fe9a1115be827e2ba83b010000000000000096ef8b525c38b9a74a3014bd99979230dab2f20221e8c7d1db50c7a61a02e97e0100000000000000769d9f8b45bcbed8fd84b86d2203ee20d199212007387b10216f8fd9441dfa28010000000000000092c996c1fedd09190bb0fa8cc79e4075ad79eca3d6895d2a99d20e6f89e4182b0100000000000000f2065428f52da2f7a881f9b94bfd38719bb6e5ff88a6800bbb3aebb1a9ad2102010000000000000092006149452119964a75232851f01361608dc0a52031f240e93e70e98a3ff21901000000000000009ad36892ec05281de9c63c7cefb3f31e448957a9572e650d9f3af1f21b2f515e0100000000000000bae8e68bc8f1b66fe3229ee72d77137b394c6b7dfbf55e424f9d2c82d5c99600010000000000000098f7988d5a74a0e52f58dd3d232ac3e93ff757480db9d4c12761b04fef032c4601000000000000004aa3c1b56e8c58951fb89119ce93f6dc3d42f114ee1679cc9bbb154d57f422360100000000000000b81bd21787e12343691c1fd404bb7f939d53b3c067a82aedcc0b0aca1e8fc17b0100000000000000a8c366514ae829385912b04b0192e934a20045b36cf1911bccc4c064d6d3c461010000000000000060b521110672f6f871978fd3ac4a835b5e30c3fa727c04c70dbc543fcad38b0e01000000000000002ab0b5cc358184be4fa29e7a3dc24806a72e55baad40ec9a117324a884242c280100000000000000e05c7c7d82498be85294ee984e1f0caf23c53fa9a64cc7e6c5053304c4bb785101000000000000005afe620da258a48f00c3afbb8a98161e977f076c7e7f8392975a4f0db4b57d6101000000000000001ae9aab4a890c558ac8ab90ccbbf193b3841083670ebed278b2161fa2ec7b3040100000000000000c2d156c96e21691a06cecd4a396978f94cfb3a1760d41180efe382b7ce8e993f01000000000000004616ac86f0d45899eed3f1246dc5744858a694a92b0abd9f10e52dfc9c2867460100000000000000a4b31af719e5d9c3b69326ef920736e8b620b329eade475ae23a33fbd445df7201000000000000009281394b5d35827c826e1d7444f346c247b9a004aa0292a9ca2b16e0fb55687701000000000000002e1c4e3a1474325086c1ebf51c0cb6d335242921c645b7d0e070d9aa092afa68010000000000000012bfb35bdbc174f07745b29eb649c6c896fa7f38b13a728fedc4a4853a75014e01000000000000007e88cd54f47c1f4ddd9d3a198fc689d24a523fe186d526b14e476f14ced7db3c010000000000000024ad842dcdc5f4d84262c6aee5116e88116fb191dbbd1331453202d3583b1f440100000000000000c2a54db27458236d0902be95fe0e09227a0c07320855f1f1ead7e58bcaf0e3090100000000000000068245d8a483bdbd4e9d88b49e17a651ec168f25e6851fc52c2e36a516031d5e0100000000000000386bcf52f4c464e6a18169f776d69e90880301f01fcc8cc0ba451f1d7e6c3b7c0100000000000000da132f2f832c8e2a4e268b4faa923d9449c94ebe66f03fa0ac4303f2ceb1b05301000000000000007e0da5500e4e91faec6b7c3763c52058a7a9350be3009f2fe00a8e3bf0c59e790100000000000000a8d082a4289fe5ccaada604e70c4b1473d6fae4374663672e61474852c1ebf2a0100000000000000309ab613bea03c4431f7602c937f5a4d17e2102db6fc7f77e32f7a245041b90c01000000000000009623ad5bd17b75cc58839c76474636ad5675c519e15f090ec008eb626db73b14010000000000000092fa7c1aa1320b16bf2fd9a0e11a9faf91c02ecaab551ff29bd77958206dca68010000000000000004000000000000000280df609c40171d0f62924a7d83db3a5c52c2f78dbe0dab0497b8786e659872e8daff3401011d21000000000000734e0311000000006009000000000000a50432904ec260963195582a1d339f9fbd2d5d76f551160105c922423cad0d94482f010000000000000076441c448aefcf40a72128edc9b44a4f7ef9c267c503e98f5f9c72d5e9e92f000100000000000000526e055ade4ac425e9b5f93ce4394601335d3599a5b742603126d78ce99a4a540100000000000000d0e8ddfdeacd8e163b01ca4da1a4e856312b0de412b492247070f2721f7d803801000000000000008008c1b7061a2402634fc15d3849e2913863beb9f55024bc8cc7fa7d6e397817010000000000000024a51a9bdb67213626d1b52bd8dbc0e9b94ea88ea417aa17b56212d1cea3e1780100000000000000e033368bc2edee96d72e43448824a642d53939c6c190693971b05ccd1054464a01000000000000004ceef9b2b8e3b5cd971f7557c3a3ad02c9c7a7bbc7365c2db5622fa74853790d0100000000000000aca7a86b6fcf25daa7f0767bfe36b284f3100dc1ee4dcc971fbb3244bb57221c0100000000000000ba395fcb33327501109ed40712c7a372d25bf3339edfabe2a1964fb7b5d4d82401000000000000009cb389c209afbebda2b12113e0266b3d30f46e2a91aaf4451c193d640288357101000000000000004c9886e2e62ee92a6778d6a7928052732044b64fa61969cd8e37f3f7e3406f7201000000000000005237e4509f24bc9e8bf9bfd78b594219d86853ae16601f692f10c9b16b88f83b01000000000000006869737a2873891c0e4ef80a69e331f64ffc3663c9f3cdf86b440bb41827a252010000000000000098192016f83ef2fe74dba1ecc6526efc61b79f3177c00dc7c053160391858f700100000000000000a6f10752adf745ad55866031836194ad027ed8d6710d9853ef62982bcf45fd0e01000000000000004eac292b47117bc6f534374e202ab80c0d3738db05910a29bf263408d547661c010000000000000078c35105ea4cd9d6ea0ba91b2c19e78f60931bef5918c1bd2e14259229e7c330010000000000000006d2846642c835b0fb1ff1ef908449376aa8e7c0f3352e55da9a1e97e9528b230100000000000000f8a681118ea0bb9dfde2813ce5144eeb5cee881c27883de1c0c759255ec326540100000000000000ac8b2b59f77eb5f3725961767878166a3817747018f18cf48c933e284320b90e0100000000000000e67c524e443cda4cd27dfcce70488a5d23a93c8c46a5e83ef5a69eff3a02fa5a0100000000000000a42289d68c963358f3c450a850242bb53121e73e17f0e2ea2b93327446bea33c0100000000000000caa53cf3e8ff5604d82bac45868bf3e25115f7e8f4d1cdfada68f8487d03e91b01000000000000003057a5ccdbce651c71b1ce9d48e9fa23e6720e8e2bbf52f65a0ed14e4a6f3f700100000000000000a8e470f2339e3ed0da456780dd9207e9c6a02459238ec3057a6ade01fd6cd60a01000000000000005c7f05d77f853f3eb8d4989fce36d0808b6d2b881e26f13c01e939b5d489a57d01000000000000002addf696d5a42b0a3dada689731e00c991db936909df869ac6600662abc35310010000000000000072ed7192625403acef94aa9189f9f179deb89e60478816ca96c79b742f757e750100000000000000b4ffe3c5959ff37c11c6f19d91926cb97aa4bf0f604919e1753bb55664d061680100000000000000bc4c9b5425f9a2aa09e3239332c702dedbfffa2b9f4cc1b978b307fc1fa1337c0100000000000000e07d5b19d98a6f8ef5c964b507fcd88f500a2a0a9afd5cffe9d4e3f74d83b27f01000000000000001ee57665488b5ad6f7358157b73009a4ec4b14b4a03c976487e188f54bff7d640100000000000000be18787b5177e58664cd893fdaa20a3ca1bc9f1acbbb15036b046ae49c17c15b01000000000000004c50abd9279d48439dc8f93aaf679e47981f25372b63d838786dcaf7a3f8d074010000000000000072a85a9dcc0af833b5a21a51ecbc4a9855c2bef8848e080ed70ac48cd1efdd5f0100000000000000c49cfd152ce3ac1fa142b3b6e720cb173eb7f43c82f021418253a070036f870c01000000000000006ec27dfa7ac9d35eb002c55d3e4d56b4df928dd5c44323ac228305741c9e093601000000000000002803ef26679fce0495aa4066e053c4fa9cda5bfb54e24497fcb1bcef2902cb400100000000000000125becf853d8dc03bc97114ca0c751f6045bd7ef5580e58d32e3b47d7ac5b60301000000000000009237113cf97fee5fafbeb82de593f6125e9c498bd59f0369625f46b326c7d9170100000000000000722d7d57085c250af633f2d461874d59aebc8021eb1112ec8805db5ddea53e5a010000000000000080c4603361b35d83eb9195126bfd81d8f1c49182c48e8f18e7ea772ff2bfd9400100000000000000562fd7529c92f9370dd6d7ce60d06ea4a826cbefa238231993ecfc9e7725ca240100000000000000a20797f3a8669a909adb22a3aee2844dba82d231cc33f5d9be0e2c533cb82a6701000000000000006a1274b6748bf822ba80c9a9416abd3cf591b7aee6adabb8359b7dbed8ebb3770100000000000000dc1274e0689c7a3eac31b41ce352719529e65c01f26999f74ce17c9905fce87401000000000000009c9bc1074cf465c0dd39f74bfdf16a67f81339ba2ad117a0c7030b4f06787717010000000000000090708d1a49ef0acfea32147a109d08d9aa15ee975b5237d56ca9b8e324108d0f0100000000000000d8b38c77823eb1912bf8b743cca6c655ea1844ee468fbd78b394bf222bf8bc2001000000000000007251d6c376064f07f27d2532b05c091bd0978067b078c9f8d9984fd4216bdd4b0100000000000000487c6aad1cc26893dc7e498916a4c23d303f098c04b0a8b0c8242fbb7e73a16e010000000000000088f9a16886165d00612032cb1b36669ad62b7325536f499191e711134c71b6070100000000000000bc4b95226de4e10f91e0254cfe4541232252deaa347f567df124aba81bac4d3f01000000000000001eb833e31087d6baffee4e7f1d9a8e3b7013ea392c81f74313a354ba82e92f6b01000000000000009c8c7c8c91df0ed53864f69017d530b5ebda3ab4bde3c67027e70893213d533a010000000000000018ec239eec5457ba11a41518e7c5f98266d1bdbd67602641d04706f95dba5c560100000000000000ee0c4369d7e5dca53a68ef223db7c858f2a97f47394c7bc678a8edf719a49e13010000000000000024efac2829d615703c5375dae24d394207fdd26d9522bad7af6bac64ede1270201000000000000001c5981afeb58dd37f7ea785c1ac804fa790b9ec8a098b7d80ef2342dbb41d06c0100000000000000ac0596c32a2144b2214a588fa0dc2e589dd829395a569b1f60ee8db6a2b5b111010000000000000028a027ca1c0bdeebfc8fce85ac4bac48cc072523d9c4a86b4f2594f9142e7e3b010000000000000042e4c41a899dfb238649e5b17dc232c2699353635d60e6a3bdcd71f9b82cda300100000000000000ce4bfd8c5611b1637066ef9e579c85efadfc9513b882184e00b75871ef7f5a2d01000000000000005c0419f37036f2bf999f3958b49f63ab19d6dc19847a393dfd26cf303fc8d911010000000000000028558e46037c51ece4d39a8a4d34688662e629413c221d6226afe454240e702101000000000000000e76ad5033ec80da424503f80ce2bff64d8cad0e807d7c6516a369b46ed0355f01000000000000004a2073ae31b3df10d285eae6a5befe069183c4c6a6ffa1b2bf432011d0d475200100000000000000bad91c9aefe173441dae1f273e55090706d412b0723d39bd6c3af053feb183200100000000000000be03fe6bc03a7884524047567a8ccf43b3c988bf3b447ca9e1520d1c1f83c5390100000000000000b05ad6cde0dfc019d740c3f50b8aac16550ff4c197da19cf23b9293f0c5c39070100000000000000bc56c07cea21bcbbe058aedd2ced9fb4757caead55f96bda9bed1c9669c32b64010000000000000078e1a4fecbaac940c04e0b591a01ea66a574b5098852ded2810e3a534971111f01000000000000006ccf2ce8e149999a7bb996faa65194e60aeb7bcd1937c787f886fe979fb49e6601000000000000000e5650026c7bee4fa43a2c7fcdc3452daa10b0530863ec686b1d5ee4d707600501000000000000001e866bed92016cd2dcabe2d87fcaf8c1d7248255cafb9e10638fc3a2b476221b010000000000000092bb282d46ed819e46fb3ee929f7662354fd095b67a8ed51326b47e83f86653a010000000000000082b820c5bee8ee77e35203dab387f3434b8502e5f1c35dfb2ad15b5c89d47b3c01000000000000001cf3446b4b5116a1784d92cdc5101e55a5fb91ed3d93efccd06b304a94362d0a0100000000000000c6d5dc6e1ec83491397390449d8cddaa88631e8855efe50697788a93de00fb5501000000000000003a4b0919068523aa04ab29f1b49bdc03a176a4b93f9b5a7e6e0cdcc8318691030100000000000000b288a9832e07bef83c5a8ca72c5a5583b321672ba7c6cdd44a971f855d32d95c01000000000000007480edf84ab569e559dccc99b87ecb9ae9db670b45a259b7f6e618b063e43113010000000000000012e4e8f29b147f5596fa9f59ccdd35467884318f010063feac87e8985b00ba7f010000000000000026c4a27200f70748b52f7277150d2db7e192b258d5001412e42c62c6e3ee1e51010000000000000040a2527ffa7d30d788eca127d435c8b5aa48972cda538b9a1627a57e85c8fa1901000000000000005673f82330a1ee6e6889f745fe15c353f5f8989e4a281e8aa53e38ce1e74556d01000000000000002254fb9324a6a9af450ce3a4f5ab25f55deb22161e520b2308b8aaff42e3aa74010000000000000006a45181daed2665c4725d23a29578240c003af72848d0d088359abec0a62d110100000000000000a64dd29103d43e3e898a41f3630ff88b2420953febb931c70ff543673efa251b010000000000000028e972febaf463f22d1108053e7c26ccde1e6018d7c302985bc227557e0a663b01000000000000007c4f928b915062d9cb15e854a9476cddbf7126c9de2fd70f67beaf2ebf6dbc5c0100000000000000c473d994ae0f9b8532523f5ebc52014bb3fad20e68770fceaf80fa105cbefd0d0100000000000000fced8f1dff4f6c6852b0d643e26ee532086e72be7aecee28d94d1d59b5f9986701000000000000004a905d0574cebf6e8d00d382b104fc8ee1c008f1b9ffa6fa5c3b67ff29719c0d010000000000000002ecd96c1f4fe196d53f262e75770f1a81c80b5764b01383fb77e20684f2096d0100000000000000fcccf8e328b4cc968af52a23f6c960b5e34241047b630c19a0661ace6b9c273b0100000000000000be6106f9217a1847af66de9510fdfb40514409556506ddc1c1a897818434125b010000000000000094af0a39f196a145c9406ace38b2b2b9b9ccec2bf2da2e95d0b0b8507b6f38560100000000000000bca6409d6d7e4f94ce797594db4363bb8bebd5387770aee0bb7663b36354fe2a0100000000000000b2518044cc31062ee50fa81cb6983f314291a0300865fa5cfe149829c5050d24010000000000000086c1922e4ed392d72e0fbc0ee28e7ec0a8ba2b33470330a606cec9a159a79626010000000000000036465f4be77147914969ea78f8e39610310679011dfbb6137dab12e18a687a520100000000000000187fcd65da5b05c572bd1809b465ee23d8139deca61327a33a1cbbeccd5b335a01000000000000004ad8fedb395dc0ed63e0edbdbd2d20555b61a46aa7cd751e4308335c277cbd6a01000000000000004c5e6997b6f186855b1f4c9f8ab2d6cea3da2e86445605ab89e5b5821e05bd3d0100000000000000125f4bb2b8d56e62b303ed525cce2e08f1baf016c3e89f28df7f61a3222ddf4e010000000000000068508b2ca3e01d7c8d79d99f1bb06a93058d14f1061d5fed4df13d4bc30aa557010000000000000074f02ed037d28c883df643034a596e4d2a97a23782ee8483c9ae3429ede7e7090100000000000000566948c62b699e382e5379592d1ad3e1823640d386936142cb9b82915ed02d1801000000000000009493e6de34e09c9679b6dca602e38d8c07abb77b3cc487ae3a80661968caa37f0100000000000000dab69c099895a293508bafd5bd96a1f5ed7193012d71d546d4792f6452bec619010000000000000004734733edcd9cf662389208fb8ccb5f274a7db8187ccc53dc84250f8599d54d01000000000000004e1b48e67c1e62e46add39fa523b956946228ea0f08bd9d20ced798cfc9a0f5b0100000000000000ba78c26db96a9ce3ccc2980dfef7346042ade9769f95afaea559f784af167a5d01000000000000001a6ae3ba55d3b68146f9b366df0ff4300d8e4cab26dc3892c1207c783caac92f0100000000000000faa6ae896c2d1040e495acbdcd8d90a02ccb17ba6e507efa2f7deacb3b28466e0100000000000000840290d318350bff32db3dcf6138b822cb2adf1dedf5bad8729471988955915c0100000000000000907ff7ac1e6c451d236c05c8d3f85640d9f9472d6a30115fc26135dae020e6380100000000000000c264fe63e84cd004530d2a3eabdde5098fe5c6b619af7fc6c9cfeba01e75ee5701000000000000001ec005e9ca3c15b2994641dd22efcbb20032f10894f76f57296d219dc149817b0100000000000000a07f151db53097c2da9dac4b2e0f194931a677a3ba99df0f3976e34409fd64760100000000000000d8faee17dcc461acb22ca1720b86385414ea8810ba31509fbd8da8733029eb190100000000000000b071e9d6b444a555e034ecdc4d04f2528cc36b347b231b33388564a40fd32b2c0100000000000000f820a8ed2c97f639fea2892d0a89ae98ffc4c0054f948f9a0108e4d99f89994c0100000000000000fcd5f4c4fe11f20ad99dc8345b7dc5600caba5d5b7d3f499c3253c095152d45401000000000000005eac8ac37c95fc11921839550a30ef071bbc80fb10ea1482cc67818e184d544a0100000000000000ea2b17bd1b69a7b442dd000db0f12f0bd4bf7a87a540427986bd32f3d3bd55580100000000000000142445d894c1236a38c6b1bcd9f5a7245897026424ce9544002008a7702c3b1d0100000000000000d6acabff06fe9a6ccf02f780f33902672fae0f038d8e19ee234ce28a0b6a01410100000000000000780e4353aca40b0f2b2403c862cb33032d49a820244bdc2853ce158d48c4f6100100000000000000104b41830f092484a00f2d595b8aac969bca6cbf7f386efdd0f79ee9a8c0201101000000000000000e2daa2ef7884bdc7ca5f843f4f33f070c790e9a19d314bceefd04622920216301000000000000003e8394db87d36ddce56bfe0b86922dcc9a86d1ba061600e22d9694027b18c840010000000000000042bbfd10e95a6a1a57b34cbe01ab26605536797742d6d24394ebe95f87bd925c010000000000000040b77fd8fcabe868dc7f2a08bf14c67e4d433886c3cd3738d1b0b9c649bafc230100000000000000009463e59f6b021a1dbdbf65e56f568ac5736baf96470440d7123605a4bcd93f0100000000000000b633c47d126eceb0e36d788370ebaa179b0c7a3a21cf5f1421bfac40c895ed3c010000000000000092ee092cd2215c7c1628086c08be10a3cb969f6b276f600422f3526f303bd878010000000000000084a7633f080e6223b983763cc426583d4bd923709b327a38e5ebf4167f6767770100000000000000020d34131c7a0ab6d104839ed8b9e0cdf075b80409a36fbe94d0cf83f7ea1f1e010000000000000022333a4409728530184f55b95171d2ddcec037603382fc7d6443b1f7b96c813601000000000000009acfd215519f40156749868afc8d56e015759f71cf183fe68382e8c02c75b2510100000000000000f44b3ec5c7b2188f208d60d159d1f5b0914a51a0632eacea6b88ec7b26d6673d01000000000000005ce79c3ad8a0e1806e863f0858c28a81408d19870a62ac0316b3e6345cbb5f76010000000000000006451fa7b2d831264e40a3e5b8452ede10164b7162a0e93bb9789a102c3010420100000000000000b672ee2f0f9183585ac4875368a0defda6d3c81927fbfc34bbacc7481058cb4b010000000000000022a66dd6397c2631df509db3482baac28b546729e6ce965472a9ba2e648ccc74010000000000000082bb250beb58df1c5346dc5dc26dbc38647a59fcd5c220c41466606cd855a2520100000000000000767cb742c94b22fff80da70a4ea77069aecde7ded53fbf5d957b01196924cd2d0100000000000000a065f45a353f24ba187248aacd9c64d5c3a92ddf92b4a5c33994f56a07cea8400100000000000000e4a9f30dd10e786b66881c8811a0e1042df8b7bfa90ee55cbce2f4a9d1dcff5a0100000000000000c6ac76a6bb70dfe6f7bf1e96793c011842148482eb1320b8deeaf0a8d1f1c12101000000000000002ea8960211dab2883e7b15dc18336ccf12f096572c66831279c9a5e2492ef51b01000000000000005432de09683010f3c1a6a977dd0dfdd8c5ce9fdb85225b9b7dc8e451e340cb240100000000000000464cb5dfedc6938caef6caaf5a58f4925a295f24a4f37337033dafa0cc733e660100000000000000f60b5e74957220ed7664befb71e9621436e40f2b6c1bdb1c90a6de9c3540a84001000000000000002a98fbaf7ec22832522e3f96821711ef684283911a524960efb14953255baa2b0100000000000000fe0af833307f4cff497d006ec63385b1c191efd6a4547fb05a355cd23686dd0401000000000000004cb98af1a70e917453f5dea682917e7b3077ea9d41dda7764433258a9d5db54b01000000000000002a0fda136ae348db338b87bed349145a94ce091227774b0542e533a83d1ba455010000000000000036c5a061b47768957b2b939b2e37e4cdf8825a4abf963c4f912f3ba4cd567f1e01000000000000006a5607bc375d7ac0908e7643ea2e89dbe42f4f805c2fb6e2a22d0385c1232b310100000000000000f4ccdf83d734edcc568462572abaf32d22ac7faf8000195e02273d1c9665430801000000000000007eb2b0b6adbe5a5bad38f46db207f94c896d419661f4ab8f21e302a543df9b11010000000000000048ce0aba6f1554e139568b4d2358d6cca9bc291d3600787cc3e732291002ca220100000000000000e002b608a4148a8616e5435dfaa8681d0012bd78fea4502541249d97f56acc640100000000000000a8731d355eefdfbdb7fb12cfa5a280c0b1e408aca264ef585d42bf97fcfba1160100000000000000c4c5fe47a568c2fe4876eafd5e0093dcc31b450eb87bfe58397dfae2a590d4650100000000000000fa5a4da949ce29dd0fc20fe56c40d63ffded8e2dd88844f725efda0814ed5264010000000000000022350f7b389967ec6e8c8b6c56ac75a138db742abcff27b1d6b3bfab894d187201000000000000003ce775a4a6215dbfbdc2b0a8a8b71936abd61642b5fd1a0c1d06ba548ad3025e0100000000000000bcb998778b7c2c182f396b311f92ae1289daeed9e62a3d8a8298b8dde7e1a5240100000000000000eedea8652413b5a97c1eda13e1e050b777bd0a8ca31dafd63aeab576a68fb75e01000000000000001836b6f7bcdf39ec4f786ee982799a549605b62f384a74981bf9de018c26fd430100000000000000245a9f1c784e83aa6e1a22b7a560de42348ae1c3402060929d669f110da1b7490100000000000000dc4ae9ca42fe496af7a466de59735813691d9c050f3256c3d4a96664cb6f9f6701000000000000005c25d331b2e023d12ee512689c3ea95edaadc300c9dc804e98806117f2edf57c01000000000000006205ea8c9da2e39792b9504100d0ce7eec4b9c732297afea3c2a885fe4f5832401000000000000009a64daca74d14dab93385e52ca70940732a8d45ae4b853ce156c3eeca06f0c5f0100000000000000c63e31fd558807e07f9c7dc51f8fa8110679bb1b1cf5585e56d0b6164179b9790100000000000000eed7e8e8a64dfa89c548a31c1b9fec7af5aef4dbbdb26997b2ddca72d4f8790c0100000000000000dcb8d42bd4e3b7b597542ea3dbbc6ac36058a9b73ca50b23bcc7fe19d08bbc580100000000000000fe5ba24461a8be22c5e553d2715748ece9c50a621d1794e36ad6c40dcd5d9c2301000000000000001e534cbbe982369a968006efa465cf2a16807a88a5c877d45f090192ea619c60010000000000000078cf1debe3fc0da2ed2473d1e1835a478cc3e7008e0cf42043f287bc36804b710100000000000000f853a1534a3af56217661420536dd7bea0db6f6db843d8fead77c308ed7dcc7c010000000000000032e2c97e308c84afea4b37d7dd8f62e67763126c357c9e6e49b27f54c3702b73010000000000000050d2e3ed042861cfddfecfb31d47caa1927064cb0372213a3015b2acdf1dd1450100000000000000843778dfeddea10578fab2773f2827c62fe0efe374d9a01eb370bd8f1427e7630100000000000000140fbeeabfb02dede7214a17c2cf78279d076c80d962431f35d1105c87b8d95501000000000000007cb1f225b90c00f426c33ac4338eeb2dae6467b8a9da5c1556e6588c12ca977b0100000000000000b261a66b9bae17b65e7f6a88d65efb4519925d6c418c9e2ba17bfdbf684b776301000000000000009c5d3bb1387f53f0306bf7f24e81dafa5bf972048de867e2e517938c4ebdf7120100000000000000560c91919fc22867159ed77bee1b3e70d2e222a5fe6e830fceb13b58b0daa5290100000000000000e03e94cd4419d9cb8709ad2859e598912c78c01b15eed53ec0c336d8d6c4914201000000000000003227028def74f8ea7bede3e112e4ce09d8fb823790ed599f2259019945f2690a0100000000000000c686fbbc968476537924f90aaa4993eef8314685d150228c462f8ae4e5e1e57f01000000000000004ca838afa9f12e88436eacb5024f3f94c95a66c32e114f65f3136176e426c75501000000000000000c60356c02d5d99293952c478fd07b2cff982dbad863ebdadf25c9e69206f14901000000000000003a8b589c8222ede45b3d95c8d9176543ffa9a29cbfa0ba2af60fc412e732d75e0100000000000000a43b19f13ec057124df240aad303e969f7d02fafc02c263d7ec814b6729d1b200100000000000000fc6b68c2f556cb4bbfb09cea4ee39e47aceb7809408e38ae4696d4caeed3c91b01000000000000000884c85734b971a88cd94d86d3c62fdf163256a0387e15e2d36d8f25523a77480100000000000000f2cd13ba1efd67dfd5f8c9150b1a74d1ed1bad1a72c36fed96163b062e463d0101000000000000005258f48e31bc89f5d53ea6a12eea9698f8e72c6068ac1588100d8632bc674d1e0100000000000000ecf0297bddebd3d766ea7def2bac79ad6eb650fabdcd029b99cb1649ff7dc8150100000000000000121f9d8ba85d89e3c6f9a0fedcdfc9b05cc40a6d3324eff6e8a58aec5f52590501000000000000008a16fb5a6718a714296cb8fa2ca708f677f78c7f883ba3c5ad1bbb9e23f37705010000000000000038c9a0897d9caff03a308d2120bbe892974ae8cb05f1cfe8b97259f0ac2e852901000000000000005c3615a5e2072a618f0e434f7c572f4e4b1a89348dfe0f7939c99de095d54a55010000000000000006adb1e6e78084fd5e5df37fafc180d1ed84377ca41de3b5ca43b764f0cb190901000000000000004e466f6a4930d856a1f53f21c1a44451ead20c8c71319f6a685f0e254d24c32101000000000000007617b69110c43683b5000788259be855890c474be8fed65d7b1dae1d534ef85c01000000000000005e0fa84f762f7d6e4c4b0c18a86e1b7da6cb4fe7dfcf6b5c0056a7ccd8eb201401000000000000002037d70f4c244c81422409ad01d28d72a30d26e595fbcc791daeb57f78a8567001000000000000006eebb90d453e3e26540730fe99339d907a0e46365f6f2c8e2bd1a2dc83c2897e010000000000000088fa8bb07ebce99964718c65d0d6f1b091ef2f4d4cdf7b94a22c42c007ecd706010000000000000000f79cec5a6b6b70f768ed05e94d2cfd70b13bc58fa16e62d742ee49aabe967e010000000000000052ac28ba2601723d23a086b5d775f19319f110ba5e9292f2af461e71903b5b50010000000000000002a4b2935b657f9ec563642ab0f34e223ef594cc70c856b9bd70fbe0837215600100000000000000c280e82e46ecabc4d68169e292c59cef96432f25fe849b8a147db5ca0ce7e17b010000000000000092e5bb9d0906f768dbdde0696b78e493cc78dc1f68789575b24f0b962799b51e01000000000000009295a1f023157921d346b73484b120d46048382107015aa9ed998f1fae95970e01000000000000004a512ac212da2c96d7bc8590865ce627e6b60246700595bb100b240e80a3f0760100000000000000f0c0cc64f8973ebc2322273e684b4f73f412503f124c130be0be1589718cdd780100000000000000c2ee94dce21b2c360a47081a4f30a9c9c14a6fa6cb71ca69a44e23116015c033010000000000000010e37a12fc6ed768d1a2d33c8abc6db675381dfe69c832abb77d9ba2341b3c4a01000000000000009a2efedf54df076e24d204b3921a835a47cd3afa7cc50a25b756bc6d72a13c470100000000000000d8de542a748c14224ee7faa16157727c852ce502a45b408de0975c88a39c690f01000000000000008013bf5a25c703e64dc4ae7e1248c0f2c7abad9e43672d82611d1097401998560100000000000000188d1a45dca0c370ba6b7952ba682570fd4f61501c4dea9826a981374a3f815f01000000000000004c1dbdaaf0fb061228d2245561476088bc608788cb3e9c5266f5a8e54bdd1e670100000000000000d23c53a531e356646133db73065cd83999693a5bdfc05931238434f5b031522f01000000000000006a40a8b74a142958efb2d75cd363635eccbfb70cddb24f0626d0ec927d98233801000000000000005e127fe875a9c6396693b778833a710b0426a4fc0af4af490e7ff0a6f3e8b61f01000000000000008af88ab005ea3b1a0b3412054c721e574c4b4469e231aa487d9132946e42bb690100000000000000aa74176b5870c97b754a157ec0d8032148c2ae717a905e0e5e626048b6f5334301000000000000003e07b075219fc7ace8dc3bf3a06f5dc12aa9c7e45fe30244d2284bcfb1e6ee190100000000000000c69e90c4bd0bd56246bbc856d4f2f3dbffd2d4e0d7afc92b7a0516e452db30290100000000000000a4a0bc81aaad1ebce3fdf896a8d6d081ab93efc2de9d5c56f2632edfeaa7ad0f0100000000000000465242c8915eea46e25549f2ab97cfe78784f25083e51773e07d5a0cafc2de320100000000000000b64ba96a10f5387463bc1d09b8fc05a810215959727960267a6ba046ecb32942010000000000000022376791bf19fefac611324d27bc6acb4b7f7eec713c186adbeda5a1e1b88f340100000000000000bc8f93a45201992fa9d04355095d03adeb5ff1aea206425eae4f902ffd47fe200100000000000000288c08430a7e427400dd5b61926b74a82abcbbc91ac739190cc791a581f6836a0100000000000000eec1df2a382f2f9d0e7dbd91ebffe7be19dc9e01159cf3b82229a3ad2a33685b0100000000000000e08b1d1e40c5452afab2df7f9ce391eab8fbe0096e9fe744c9b72c414127722f010000000000000028052d0b965ed862b7861aa7f3f91fe52ff8b0f795ff476c7e0a7aa42e79933001000000000000001c860d36fc84a54978d99ad400a719dbbef493f8631856e6def3e9ec998cde3e01000000000000002ef781a1d268b8afb0a8331ece83f3fff6877baa2d06ed9a23d484d5d70a50030100000000000000163687f38841bbbd2b93787f7f65cc74a2ab94478888abce52207e1b81f46c4d0100000000000000e0b770b1bcf7deb030ee75d5bad6ec1ebfe06ded0fc406a8520a9650fe83233001000000000000003622bfbaf9350b5906bdf9ce362e06726224ed141c5d29e8e175e0beedbd3d3d01000000000000002c6ef636d3bba8ef79dfc0e6d77bcb38426b54c92b764b29115d25f3af9c871601000000000000007a661c99fd40492b4893407b03822464e7d4853e9ba47fc9e9960c3800d6725f01000000000000007836067da2bc290dc3c428c548a4dbebfdeddbc10a2db206abb6ac11741dc63e01000000000000006ed90090a744a0d55adf8f8af5af4d5198bb67220ce33fe71121d7c51f27a4130100000000000000bc20aa968087f7c0d4bb35dd9c502db39fd7f4596a412880fdcd5ddba22fcf460100000000000000dc0aaa8a9d617e5d1ce58d8279747ac87766edfe7028c9c5a8793ea3ba9c94450100000000000000386f18b82ffe824f7ee1fda0f511d5112dee1c677bee0069f3d8e3d8be1a321d010000000000000072f2ff3d21f4126e217f10f9d9bd18069c12eaab6922d073dd5241ac718e91200100000000000000e4e005984bbae507a03d158ea8ca3a87505ae3e8723d8f5bfffccb63a23ea61c01000000000000008a40c3acc862dcac958866b738b304be7d84c33d9420b0747eb82aaa21b8c40c010000000000000094cc8c46f9670417f5ad9492d17189c4e03e96122782e92824f05e176d6843790100000000000000369a7419ed7884aecd3cda7ec3576942cacde7a9b8f2fe9a1115be827e2ba83b010000000000000096ef8b525c38b9a74a3014bd99979230dab2f20221e8c7d1db50c7a61a02e97e0100000000000000769d9f8b45bcbed8fd84b86d2203ee20d199212007387b10216f8fd9441dfa280100000000000000f814da51f3b4325f169ab9aa49354dac5666473330b3e0fb19268962eee96706010000000000000054a672d14f2d201c99ca725fae26f20cee76af6cc7f1113feeb82e837bc59c4d0100000000000000f2065428f52da2f7a881f9b94bfd38719bb6e5ff88a6800bbb3aebb1a9ad2102010000000000000092006149452119964a75232851f01361608dc0a52031f240e93e70e98a3ff21901000000000000009ad36892ec05281de9c63c7cefb3f31e448957a9572e650d9f3af1f21b2f515e0100000000000000bae8e68bc8f1b66fe3229ee72d77137b394c6b7dfbf55e424f9d2c82d5c99600010000000000000098f7988d5a74a0e52f58dd3d232ac3e93ff757480db9d4c12761b04fef032c460100000000000000b81bd21787e12343691c1fd404bb7f939d53b3c067a82aedcc0b0aca1e8fc17b0100000000000000a8c366514ae829385912b04b0192e934a20045b36cf1911bccc4c064d6d3c461010000000000000060b521110672f6f871978fd3ac4a835b5e30c3fa727c04c70dbc543fcad38b0e01000000000000002ab0b5cc358184be4fa29e7a3dc24806a72e55baad40ec9a117324a884242c280100000000000000e05c7c7d82498be85294ee984e1f0caf23c53fa9a64cc7e6c5053304c4bb785101000000000000005afe620da258a48f00c3afbb8a98161e977f076c7e7f8392975a4f0db4b57d610100000000000000a61667ea6442054b56111477f57ecf39b6e90480bfadf54c3e6cb5ac3a3e275801000000000000001ae9aab4a890c558ac8ab90ccbbf193b3841083670ebed278b2161fa2ec7b3040100000000000000c2d156c96e21691a06cecd4a396978f94cfb3a1760d41180efe382b7ce8e993f01000000000000004616ac86f0d45899eed3f1246dc5744858a694a92b0abd9f10e52dfc9c2867460100000000000000a4b31af719e5d9c3b69326ef920736e8b620b329eade475ae23a33fbd445df7201000000000000009281394b5d35827c826e1d7444f346c247b9a004aa0292a9ca2b16e0fb55687701000000000000002e1c4e3a1474325086c1ebf51c0cb6d335242921c645b7d0e070d9aa092afa68010000000000000012bfb35bdbc174f07745b29eb649c6c896fa7f38b13a728fedc4a4853a75014e01000000000000007e88cd54f47c1f4ddd9d3a198fc689d24a523fe186d526b14e476f14ced7db3c010000000000000024ad842dcdc5f4d84262c6aee5116e88116fb191dbbd1331453202d3583b1f440100000000000000c2a54db27458236d0902be95fe0e09227a0c07320855f1f1ead7e58bcaf0e3090100000000000000386bcf52f4c464e6a18169f776d69e90880301f01fcc8cc0ba451f1d7e6c3b7c0100000000000000da132f2f832c8e2a4e268b4faa923d9449c94ebe66f03fa0ac4303f2ceb1b0530100000000000000a8d082a4289fe5ccaada604e70c4b1473d6fae4374663672e61474852c1ebf2a0100000000000000309ab613bea03c4431f7602c937f5a4d17e2102db6fc7f77e32f7a245041b90c01000000000000009623ad5bd17b75cc58839c76474636ad5675c519e15f090ec008eb626db73b14010000000000000043b942134983bc52d73b298f4623aedf1a6b2081fae9cff0f3852ee83ca9b2e60100000000000000040000000000000002877d77dc713f5db844a860efb4ea0372343b3deca76cc7fa0827780217a6c4d336093501011e21000000000000d3570311000000006009000000000000a50432904ec260963195582a1d339f9fbd2d5d76f551160105c922423cad0d94482f010000000000000076441c448aefcf40a72128edc9b44a4f7ef9c267c503e98f5f9c72d5e9e92f000100000000000000526e055ade4ac425e9b5f93ce4394601335d3599a5b742603126d78ce99a4a540100000000000000d0e8ddfdeacd8e163b01ca4da1a4e856312b0de412b492247070f2721f7d803801000000000000008008c1b7061a2402634fc15d3849e2913863beb9f55024bc8cc7fa7d6e397817010000000000000024a51a9bdb67213626d1b52bd8dbc0e9b94ea88ea417aa17b56212d1cea3e1780100000000000000e033368bc2edee96d72e43448824a642d53939c6c190693971b05ccd1054464a01000000000000004ceef9b2b8e3b5cd971f7557c3a3ad02c9c7a7bbc7365c2db5622fa74853790d0100000000000000aca7a86b6fcf25daa7f0767bfe36b284f3100dc1ee4dcc971fbb3244bb57221c01000000000000004ea4871b3ccdd1276ee604eb0e06aa4a62536dfe8fb053042a8f36caddb94c510100000000000000ba395fcb33327501109ed40712c7a372d25bf3339edfabe2a1964fb7b5d4d82401000000000000009cb389c209afbebda2b12113e0266b3d30f46e2a91aaf4451c193d640288357101000000000000004c9886e2e62ee92a6778d6a7928052732044b64fa61969cd8e37f3f7e3406f7201000000000000005237e4509f24bc9e8bf9bfd78b594219d86853ae16601f692f10c9b16b88f83b01000000000000006869737a2873891c0e4ef80a69e331f64ffc3663c9f3cdf86b440bb41827a252010000000000000098192016f83ef2fe74dba1ecc6526efc61b79f3177c00dc7c053160391858f700100000000000000a6f10752adf745ad55866031836194ad027ed8d6710d9853ef62982bcf45fd0e010000000000000078c35105ea4cd9d6ea0ba91b2c19e78f60931bef5918c1bd2e14259229e7c330010000000000000006d2846642c835b0fb1ff1ef908449376aa8e7c0f3352e55da9a1e97e9528b230100000000000000f8a681118ea0bb9dfde2813ce5144eeb5cee881c27883de1c0c759255ec326540100000000000000ac8b2b59f77eb5f3725961767878166a3817747018f18cf48c933e284320b90e0100000000000000e67c524e443cda4cd27dfcce70488a5d23a93c8c46a5e83ef5a69eff3a02fa5a0100000000000000a42289d68c963358f3c450a850242bb53121e73e17f0e2ea2b93327446bea33c0100000000000000caa53cf3e8ff5604d82bac45868bf3e25115f7e8f4d1cdfada68f8487d03e91b01000000000000000219b9856c2d50592c3821d7df9329795c9f6bc1e8d62b76072a4289617e5a060100000000000000e4ba5ffce05c90e6a5eea52b15922b6b3a78d13ca98f53fdbe08e5c24ce3c8410100000000000000a8e470f2339e3ed0da456780dd9207e9c6a02459238ec3057a6ade01fd6cd60a01000000000000005c7f05d77f853f3eb8d4989fce36d0808b6d2b881e26f13c01e939b5d489a57d01000000000000002addf696d5a42b0a3dada689731e00c991db936909df869ac6600662abc35310010000000000000072ed7192625403acef94aa9189f9f179deb89e60478816ca96c79b742f757e750100000000000000b4ffe3c5959ff37c11c6f19d91926cb97aa4bf0f604919e1753bb55664d061680100000000000000bc4c9b5425f9a2aa09e3239332c702dedbfffa2b9f4cc1b978b307fc1fa1337c0100000000000000e07d5b19d98a6f8ef5c964b507fcd88f500a2a0a9afd5cffe9d4e3f74d83b27f01000000000000001ee57665488b5ad6f7358157b73009a4ec4b14b4a03c976487e188f54bff7d640100000000000000be18787b5177e58664cd893fdaa20a3ca1bc9f1acbbb15036b046ae49c17c15b01000000000000004c50abd9279d48439dc8f93aaf679e47981f25372b63d838786dcaf7a3f8d0740100000000000000c49cfd152ce3ac1fa142b3b6e720cb173eb7f43c82f021418253a070036f870c01000000000000006ec27dfa7ac9d35eb002c55d3e4d56b4df928dd5c44323ac228305741c9e093601000000000000002803ef26679fce0495aa4066e053c4fa9cda5bfb54e24497fcb1bcef2902cb400100000000000000125becf853d8dc03bc97114ca0c751f6045bd7ef5580e58d32e3b47d7ac5b60301000000000000009237113cf97fee5fafbeb82de593f6125e9c498bd59f0369625f46b326c7d9170100000000000000722d7d57085c250af633f2d461874d59aebc8021eb1112ec8805db5ddea53e5a0100000000000000562fd7529c92f9370dd6d7ce60d06ea4a826cbefa238231993ecfc9e7725ca240100000000000000a20797f3a8669a909adb22a3aee2844dba82d231cc33f5d9be0e2c533cb82a6701000000000000006a1274b6748bf822ba80c9a9416abd3cf591b7aee6adabb8359b7dbed8ebb3770100000000000000dc1274e0689c7a3eac31b41ce352719529e65c01f26999f74ce17c9905fce87401000000000000009c9bc1074cf465c0dd39f74bfdf16a67f81339ba2ad117a0c7030b4f06787717010000000000000090708d1a49ef0acfea32147a109d08d9aa15ee975b5237d56ca9b8e324108d0f0100000000000000d8b38c77823eb1912bf8b743cca6c655ea1844ee468fbd78b394bf222bf8bc2001000000000000007251d6c376064f07f27d2532b05c091bd0978067b078c9f8d9984fd4216bdd4b0100000000000000487c6aad1cc26893dc7e498916a4c23d303f098c04b0a8b0c8242fbb7e73a16e0100000000000000d6152835cb59040a40a5a4ee3a4d481937b7ee9d4a5649abeac6c535d9e177080100000000000000bc4b95226de4e10f91e0254cfe4541232252deaa347f567df124aba81bac4d3f01000000000000001eb833e31087d6baffee4e7f1d9a8e3b7013ea392c81f74313a354ba82e92f6b01000000000000009c8c7c8c91df0ed53864f69017d530b5ebda3ab4bde3c67027e70893213d533a010000000000000018ec239eec5457ba11a41518e7c5f98266d1bdbd67602641d04706f95dba5c560100000000000000ee0c4369d7e5dca53a68ef223db7c858f2a97f47394c7bc678a8edf719a49e13010000000000000024efac2829d615703c5375dae24d394207fdd26d9522bad7af6bac64ede127020100000000000000ac0596c32a2144b2214a588fa0dc2e589dd829395a569b1f60ee8db6a2b5b111010000000000000028a027ca1c0bdeebfc8fce85ac4bac48cc072523d9c4a86b4f2594f9142e7e3b010000000000000042e4c41a899dfb238649e5b17dc232c2699353635d60e6a3bdcd71f9b82cda300100000000000000ce4bfd8c5611b1637066ef9e579c85efadfc9513b882184e00b75871ef7f5a2d01000000000000005c0419f37036f2bf999f3958b49f63ab19d6dc19847a393dfd26cf303fc8d911010000000000000028558e46037c51ece4d39a8a4d34688662e629413c221d6226afe454240e702101000000000000000e76ad5033ec80da424503f80ce2bff64d8cad0e807d7c6516a369b46ed0355f01000000000000004a2073ae31b3df10d285eae6a5befe069183c4c6a6ffa1b2bf432011d0d475200100000000000000bad91c9aefe173441dae1f273e55090706d412b0723d39bd6c3af053feb183200100000000000000be03fe6bc03a7884524047567a8ccf43b3c988bf3b447ca9e1520d1c1f83c5390100000000000000b05ad6cde0dfc019d740c3f50b8aac16550ff4c197da19cf23b9293f0c5c39070100000000000000bc56c07cea21bcbbe058aedd2ced9fb4757caead55f96bda9bed1c9669c32b64010000000000000078e1a4fecbaac940c04e0b591a01ea66a574b5098852ded2810e3a534971111f01000000000000006ccf2ce8e149999a7bb996faa65194e60aeb7bcd1937c787f886fe979fb49e6601000000000000000e5650026c7bee4fa43a2c7fcdc3452daa10b0530863ec686b1d5ee4d707600501000000000000001e866bed92016cd2dcabe2d87fcaf8c1d7248255cafb9e10638fc3a2b476221b010000000000000092bb282d46ed819e46fb3ee929f7662354fd095b67a8ed51326b47e83f86653a010000000000000082b820c5bee8ee77e35203dab387f3434b8502e5f1c35dfb2ad15b5c89d47b3c01000000000000001cf3446b4b5116a1784d92cdc5101e55a5fb91ed3d93efccd06b304a94362d0a0100000000000000c6d5dc6e1ec83491397390449d8cddaa88631e8855efe50697788a93de00fb5501000000000000003a4b0919068523aa04ab29f1b49bdc03a176a4b93f9b5a7e6e0cdcc8318691030100000000000000b288a9832e07bef83c5a8ca72c5a5583b321672ba7c6cdd44a971f855d32d95c01000000000000007480edf84ab569e559dccc99b87ecb9ae9db670b45a259b7f6e618b063e43113010000000000000012e4e8f29b147f5596fa9f59ccdd35467884318f010063feac87e8985b00ba7f010000000000000026c4a27200f70748b52f7277150d2db7e192b258d5001412e42c62c6e3ee1e5101000000000000004628f93047462b43ec0886f2c7d7318ddad1764fd32af4f32ef0b2dcfa4b297a010000000000000040a2527ffa7d30d788eca127d435c8b5aa48972cda538b9a1627a57e85c8fa1901000000000000005673f82330a1ee6e6889f745fe15c353f5f8989e4a281e8aa53e38ce1e74556d01000000000000002254fb9324a6a9af450ce3a4f5ab25f55deb22161e520b2308b8aaff42e3aa740100000000000000a64dd29103d43e3e898a41f3630ff88b2420953febb931c70ff543673efa251b010000000000000028e972febaf463f22d1108053e7c26ccde1e6018d7c302985bc227557e0a663b01000000000000007c4f928b915062d9cb15e854a9476cddbf7126c9de2fd70f67beaf2ebf6dbc5c0100000000000000c473d994ae0f9b8532523f5ebc52014bb3fad20e68770fceaf80fa105cbefd0d0100000000000000fced8f1dff4f6c6852b0d643e26ee532086e72be7aecee28d94d1d59b5f9986701000000000000004a905d0574cebf6e8d00d382b104fc8ee1c008f1b9ffa6fa5c3b67ff29719c0d010000000000000002ecd96c1f4fe196d53f262e75770f1a81c80b5764b01383fb77e20684f2096d0100000000000000fcccf8e328b4cc968af52a23f6c960b5e34241047b630c19a0661ace6b9c273b0100000000000000be6106f9217a1847af66de9510fdfb40514409556506ddc1c1a897818434125b010000000000000094af0a39f196a145c9406ace38b2b2b9b9ccec2bf2da2e95d0b0b8507b6f38560100000000000000bca6409d6d7e4f94ce797594db4363bb8bebd5387770aee0bb7663b36354fe2a0100000000000000b2518044cc31062ee50fa81cb6983f314291a0300865fa5cfe149829c5050d24010000000000000086c1922e4ed392d72e0fbc0ee28e7ec0a8ba2b33470330a606cec9a159a79626010000000000000036465f4be77147914969ea78f8e39610310679011dfbb6137dab12e18a687a520100000000000000187fcd65da5b05c572bd1809b465ee23d8139deca61327a33a1cbbeccd5b335a01000000000000004ad8fedb395dc0ed63e0edbdbd2d20555b61a46aa7cd751e4308335c277cbd6a01000000000000004c5e6997b6f186855b1f4c9f8ab2d6cea3da2e86445605ab89e5b5821e05bd3d0100000000000000125f4bb2b8d56e62b303ed525cce2e08f1baf016c3e89f28df7f61a3222ddf4e010000000000000068508b2ca3e01d7c8d79d99f1bb06a93058d14f1061d5fed4df13d4bc30aa557010000000000000074f02ed037d28c883df643034a596e4d2a97a23782ee8483c9ae3429ede7e7090100000000000000566948c62b699e382e5379592d1ad3e1823640d386936142cb9b82915ed02d1801000000000000009493e6de34e09c9679b6dca602e38d8c07abb77b3cc487ae3a80661968caa37f0100000000000000dab69c099895a293508bafd5bd96a1f5ed7193012d71d546d4792f6452bec619010000000000000004734733edcd9cf662389208fb8ccb5f274a7db8187ccc53dc84250f8599d54d01000000000000004e1b48e67c1e62e46add39fa523b956946228ea0f08bd9d20ced798cfc9a0f5b0100000000000000ba78c26db96a9ce3ccc2980dfef7346042ade9769f95afaea559f784af167a5d0100000000000000faa6ae896c2d1040e495acbdcd8d90a02ccb17ba6e507efa2f7deacb3b28466e0100000000000000840290d318350bff32db3dcf6138b822cb2adf1dedf5bad8729471988955915c0100000000000000907ff7ac1e6c451d236c05c8d3f85640d9f9472d6a30115fc26135dae020e6380100000000000000c264fe63e84cd004530d2a3eabdde5098fe5c6b619af7fc6c9cfeba01e75ee5701000000000000001ec005e9ca3c15b2994641dd22efcbb20032f10894f76f57296d219dc149817b0100000000000000a07f151db53097c2da9dac4b2e0f194931a677a3ba99df0f3976e34409fd64760100000000000000d8faee17dcc461acb22ca1720b86385414ea8810ba31509fbd8da8733029eb190100000000000000b071e9d6b444a555e034ecdc4d04f2528cc36b347b231b33388564a40fd32b2c0100000000000000f820a8ed2c97f639fea2892d0a89ae98ffc4c0054f948f9a0108e4d99f89994c0100000000000000fcd5f4c4fe11f20ad99dc8345b7dc5600caba5d5b7d3f499c3253c095152d4540100000000000000dafd1b81e8401d6715a61ca7c3d32920b24cd28a8708ecdb65b5e7c557d14c4401000000000000005eac8ac37c95fc11921839550a30ef071bbc80fb10ea1482cc67818e184d544a0100000000000000ea2b17bd1b69a7b442dd000db0f12f0bd4bf7a87a540427986bd32f3d3bd55580100000000000000142445d894c1236a38c6b1bcd9f5a7245897026424ce9544002008a7702c3b1d010000000000000032f75d00cbb3125b7bbbea02cefa67be8dad66d54e84f7c116ddd0dd2e3d9f490100000000000000d6acabff06fe9a6ccf02f780f33902672fae0f038d8e19ee234ce28a0b6a01410100000000000000780e4353aca40b0f2b2403c862cb33032d49a820244bdc2853ce158d48c4f6100100000000000000104b41830f092484a00f2d595b8aac969bca6cbf7f386efdd0f79ee9a8c0201101000000000000000e2daa2ef7884bdc7ca5f843f4f33f070c790e9a19d314bceefd04622920216301000000000000003e8394db87d36ddce56bfe0b86922dcc9a86d1ba061600e22d9694027b18c840010000000000000042bbfd10e95a6a1a57b34cbe01ab26605536797742d6d24394ebe95f87bd925c010000000000000040b77fd8fcabe868dc7f2a08bf14c67e4d433886c3cd3738d1b0b9c649bafc230100000000000000f6147fc504809de982f75aa2a806945bad883bf3854f6cdecf6f8a7b79b998540100000000000000009463e59f6b021a1dbdbf65e56f568ac5736baf96470440d7123605a4bcd93f0100000000000000b633c47d126eceb0e36d788370ebaa179b0c7a3a21cf5f1421bfac40c895ed3c010000000000000092ee092cd2215c7c1628086c08be10a3cb969f6b276f600422f3526f303bd878010000000000000084a7633f080e6223b983763cc426583d4bd923709b327a38e5ebf4167f6767770100000000000000020d34131c7a0ab6d104839ed8b9e0cdf075b80409a36fbe94d0cf83f7ea1f1e010000000000000022333a4409728530184f55b95171d2ddcec037603382fc7d6443b1f7b96c813601000000000000009acfd215519f40156749868afc8d56e015759f71cf183fe68382e8c02c75b2510100000000000000f44b3ec5c7b2188f208d60d159d1f5b0914a51a0632eacea6b88ec7b26d6673d01000000000000005ce79c3ad8a0e1806e863f0858c28a81408d19870a62ac0316b3e6345cbb5f76010000000000000006451fa7b2d831264e40a3e5b8452ede10164b7162a0e93bb9789a102c3010420100000000000000b672ee2f0f9183585ac4875368a0defda6d3c81927fbfc34bbacc7481058cb4b010000000000000022a66dd6397c2631df509db3482baac28b546729e6ce965472a9ba2e648ccc74010000000000000082bb250beb58df1c5346dc5dc26dbc38647a59fcd5c220c41466606cd855a252010000000000000052b41700df65ea66ffc6cbae47c04a2f20618f5d62ce1ac9304313373d39fe440100000000000000767cb742c94b22fff80da70a4ea77069aecde7ded53fbf5d957b01196924cd2d0100000000000000a065f45a353f24ba187248aacd9c64d5c3a92ddf92b4a5c33994f56a07cea8400100000000000000e4a9f30dd10e786b66881c8811a0e1042df8b7bfa90ee55cbce2f4a9d1dcff5a01000000000000002ea8960211dab2883e7b15dc18336ccf12f096572c66831279c9a5e2492ef51b01000000000000005432de09683010f3c1a6a977dd0dfdd8c5ce9fdb85225b9b7dc8e451e340cb240100000000000000464cb5dfedc6938caef6caaf5a58f4925a295f24a4f37337033dafa0cc733e6601000000000000005c9b116ed7527b0521213299bee8025e89136d819295fa16ef7cf4f4b86887490100000000000000f60b5e74957220ed7664befb71e9621436e40f2b6c1bdb1c90a6de9c3540a84001000000000000002a98fbaf7ec22832522e3f96821711ef684283911a524960efb14953255baa2b0100000000000000fe0af833307f4cff497d006ec63385b1c191efd6a4547fb05a355cd23686dd0401000000000000004cb98af1a70e917453f5dea682917e7b3077ea9d41dda7764433258a9d5db54b01000000000000002a0fda136ae348db338b87bed349145a94ce091227774b0542e533a83d1ba455010000000000000036c5a061b47768957b2b939b2e37e4cdf8825a4abf963c4f912f3ba4cd567f1e01000000000000006a5607bc375d7ac0908e7643ea2e89dbe42f4f805c2fb6e2a22d0385c1232b310100000000000000f4ccdf83d734edcc568462572abaf32d22ac7faf8000195e02273d1c9665430801000000000000007eb2b0b6adbe5a5bad38f46db207f94c896d419661f4ab8f21e302a543df9b11010000000000000048ce0aba6f1554e139568b4d2358d6cca9bc291d3600787cc3e732291002ca220100000000000000e002b608a4148a8616e5435dfaa8681d0012bd78fea4502541249d97f56acc640100000000000000a8731d355eefdfbdb7fb12cfa5a280c0b1e408aca264ef585d42bf97fcfba1160100000000000000c4c5fe47a568c2fe4876eafd5e0093dcc31b450eb87bfe58397dfae2a590d4650100000000000000fa5a4da949ce29dd0fc20fe56c40d63ffded8e2dd88844f725efda0814ed5264010000000000000022350f7b389967ec6e8c8b6c56ac75a138db742abcff27b1d6b3bfab894d187201000000000000003ce775a4a6215dbfbdc2b0a8a8b71936abd61642b5fd1a0c1d06ba548ad3025e0100000000000000bcb998778b7c2c182f396b311f92ae1289daeed9e62a3d8a8298b8dde7e1a52401000000000000004a1069d2203a75cd1078c39de35c16a6c4c12acbad34f1cba8efc065f80398610100000000000000eedea8652413b5a97c1eda13e1e050b777bd0a8ca31dafd63aeab576a68fb75e01000000000000001836b6f7bcdf39ec4f786ee982799a549605b62f384a74981bf9de018c26fd430100000000000000245a9f1c784e83aa6e1a22b7a560de42348ae1c3402060929d669f110da1b7490100000000000000dc4ae9ca42fe496af7a466de59735813691d9c050f3256c3d4a96664cb6f9f6701000000000000005c25d331b2e023d12ee512689c3ea95edaadc300c9dc804e98806117f2edf57c01000000000000006205ea8c9da2e39792b9504100d0ce7eec4b9c732297afea3c2a885fe4f5832401000000000000009a64daca74d14dab93385e52ca70940732a8d45ae4b853ce156c3eeca06f0c5f0100000000000000c63e31fd558807e07f9c7dc51f8fa8110679bb1b1cf5585e56d0b6164179b9790100000000000000eed7e8e8a64dfa89c548a31c1b9fec7af5aef4dbbdb26997b2ddca72d4f8790c0100000000000000dcb8d42bd4e3b7b597542ea3dbbc6ac36058a9b73ca50b23bcc7fe19d08bbc580100000000000000fe5ba24461a8be22c5e553d2715748ece9c50a621d1794e36ad6c40dcd5d9c2301000000000000001e534cbbe982369a968006efa465cf2a16807a88a5c877d45f090192ea619c60010000000000000078cf1debe3fc0da2ed2473d1e1835a478cc3e7008e0cf42043f287bc36804b710100000000000000f853a1534a3af56217661420536dd7bea0db6f6db843d8fead77c308ed7dcc7c010000000000000032e2c97e308c84afea4b37d7dd8f62e67763126c357c9e6e49b27f54c3702b73010000000000000050d2e3ed042861cfddfecfb31d47caa1927064cb0372213a3015b2acdf1dd1450100000000000000843778dfeddea10578fab2773f2827c62fe0efe374d9a01eb370bd8f1427e7630100000000000000140fbeeabfb02dede7214a17c2cf78279d076c80d962431f35d1105c87b8d95501000000000000007cb1f225b90c00f426c33ac4338eeb2dae6467b8a9da5c1556e6588c12ca977b0100000000000000b261a66b9bae17b65e7f6a88d65efb4519925d6c418c9e2ba17bfdbf684b776301000000000000009c5d3bb1387f53f0306bf7f24e81dafa5bf972048de867e2e517938c4ebdf7120100000000000000560c91919fc22867159ed77bee1b3e70d2e222a5fe6e830fceb13b58b0daa5290100000000000000e03e94cd4419d9cb8709ad2859e598912c78c01b15eed53ec0c336d8d6c491420100000000000000fe9d62e17387326c0e4b75697b2f0fbdff9506992e745d61b4c536c4dc10f57d01000000000000003227028def74f8ea7bede3e112e4ce09d8fb823790ed599f2259019945f2690a0100000000000000c686fbbc968476537924f90aaa4993eef8314685d150228c462f8ae4e5e1e57f0100000000000000464d95a7c8cce76af088d8f781e3073fc194333ab20956b4dd2c25d4a29ac56d01000000000000004ca838afa9f12e88436eacb5024f3f94c95a66c32e114f65f3136176e426c75501000000000000000c60356c02d5d99293952c478fd07b2cff982dbad863ebdadf25c9e69206f14901000000000000003a8b589c8222ede45b3d95c8d9176543ffa9a29cbfa0ba2af60fc412e732d75e0100000000000000a43b19f13ec057124df240aad303e969f7d02fafc02c263d7ec814b6729d1b200100000000000000fc6b68c2f556cb4bbfb09cea4ee39e47aceb7809408e38ae4696d4caeed3c91b01000000000000000884c85734b971a88cd94d86d3c62fdf163256a0387e15e2d36d8f25523a77480100000000000000f2cd13ba1efd67dfd5f8c9150b1a74d1ed1bad1a72c36fed96163b062e463d0101000000000000005258f48e31bc89f5d53ea6a12eea9698f8e72c6068ac1588100d8632bc674d1e0100000000000000ecf0297bddebd3d766ea7def2bac79ad6eb650fabdcd029b99cb1649ff7dc8150100000000000000121f9d8ba85d89e3c6f9a0fedcdfc9b05cc40a6d3324eff6e8a58aec5f52590501000000000000008a16fb5a6718a714296cb8fa2ca708f677f78c7f883ba3c5ad1bbb9e23f37705010000000000000038c9a0897d9caff03a308d2120bbe892974ae8cb05f1cfe8b97259f0ac2e852901000000000000005c3615a5e2072a618f0e434f7c572f4e4b1a89348dfe0f7939c99de095d54a55010000000000000006adb1e6e78084fd5e5df37fafc180d1ed84377ca41de3b5ca43b764f0cb190901000000000000004e466f6a4930d856a1f53f21c1a44451ead20c8c71319f6a685f0e254d24c32101000000000000007617b69110c43683b5000788259be855890c474be8fed65d7b1dae1d534ef85c01000000000000005e0fa84f762f7d6e4c4b0c18a86e1b7da6cb4fe7dfcf6b5c0056a7ccd8eb201401000000000000002037d70f4c244c81422409ad01d28d72a30d26e595fbcc791daeb57f78a8567001000000000000006eebb90d453e3e26540730fe99339d907a0e46365f6f2c8e2bd1a2dc83c2897e010000000000000088fa8bb07ebce99964718c65d0d6f1b091ef2f4d4cdf7b94a22c42c007ecd706010000000000000000f79cec5a6b6b70f768ed05e94d2cfd70b13bc58fa16e62d742ee49aabe967e010000000000000052ac28ba2601723d23a086b5d775f19319f110ba5e9292f2af461e71903b5b50010000000000000002a4b2935b657f9ec563642ab0f34e223ef594cc70c856b9bd70fbe0837215600100000000000000c280e82e46ecabc4d68169e292c59cef96432f25fe849b8a147db5ca0ce7e17b010000000000000092e5bb9d0906f768dbdde0696b78e493cc78dc1f68789575b24f0b962799b51e01000000000000009295a1f023157921d346b73484b120d46048382107015aa9ed998f1fae95970e01000000000000004a512ac212da2c96d7bc8590865ce627e6b60246700595bb100b240e80a3f076010000000000000010e37a12fc6ed768d1a2d33c8abc6db675381dfe69c832abb77d9ba2341b3c4a0100000000000000d8de542a748c14224ee7faa16157727c852ce502a45b408de0975c88a39c690f0100000000000000188d1a45dca0c370ba6b7952ba682570fd4f61501c4dea9826a981374a3f815f01000000000000004c1dbdaaf0fb061228d2245561476088bc608788cb3e9c5266f5a8e54bdd1e670100000000000000d23c53a531e356646133db73065cd83999693a5bdfc05931238434f5b031522f01000000000000006a40a8b74a142958efb2d75cd363635eccbfb70cddb24f0626d0ec927d98233801000000000000005e127fe875a9c6396693b778833a710b0426a4fc0af4af490e7ff0a6f3e8b61f01000000000000008af88ab005ea3b1a0b3412054c721e574c4b4469e231aa487d9132946e42bb690100000000000000aa74176b5870c97b754a157ec0d8032148c2ae717a905e0e5e626048b6f5334301000000000000003e07b075219fc7ace8dc3bf3a06f5dc12aa9c7e45fe30244d2284bcfb1e6ee190100000000000000a4a0bc81aaad1ebce3fdf896a8d6d081ab93efc2de9d5c56f2632edfeaa7ad0f0100000000000000465242c8915eea46e25549f2ab97cfe78784f25083e51773e07d5a0cafc2de32010000000000000022376791bf19fefac611324d27bc6acb4b7f7eec713c186adbeda5a1e1b88f340100000000000000bc8f93a45201992fa9d04355095d03adeb5ff1aea206425eae4f902ffd47fe200100000000000000288c08430a7e427400dd5b61926b74a82abcbbc91ac739190cc791a581f6836a0100000000000000eec1df2a382f2f9d0e7dbd91ebffe7be19dc9e01159cf3b82229a3ad2a33685b0100000000000000e08b1d1e40c5452afab2df7f9ce391eab8fbe0096e9fe744c9b72c414127722f010000000000000028052d0b965ed862b7861aa7f3f91fe52ff8b0f795ff476c7e0a7aa42e79933001000000000000001c860d36fc84a54978d99ad400a719dbbef493f8631856e6def3e9ec998cde3e01000000000000002ef781a1d268b8afb0a8331ece83f3fff6877baa2d06ed9a23d484d5d70a50030100000000000000163687f38841bbbd2b93787f7f65cc74a2ab94478888abce52207e1b81f46c4d0100000000000000e0b770b1bcf7deb030ee75d5bad6ec1ebfe06ded0fc406a8520a9650fe832330010000000000000066a5a598bd5d484fe66e630a3e57f3b245fe0413f81401d7a5d59aeed1a3a46301000000000000003622bfbaf9350b5906bdf9ce362e06726224ed141c5d29e8e175e0beedbd3d3d01000000000000002c6ef636d3bba8ef79dfc0e6d77bcb38426b54c92b764b29115d25f3af9c871601000000000000007a661c99fd40492b4893407b03822464e7d4853e9ba47fc9e9960c3800d6725f01000000000000007836067da2bc290dc3c428c548a4dbebfdeddbc10a2db206abb6ac11741dc63e01000000000000006ed90090a744a0d55adf8f8af5af4d5198bb67220ce33fe71121d7c51f27a4130100000000000000bc20aa968087f7c0d4bb35dd9c502db39fd7f4596a412880fdcd5ddba22fcf460100000000000000dc0aaa8a9d617e5d1ce58d8279747ac87766edfe7028c9c5a8793ea3ba9c94450100000000000000386f18b82ffe824f7ee1fda0f511d5112dee1c677bee0069f3d8e3d8be1a321d010000000000000072f2ff3d21f4126e217f10f9d9bd18069c12eaab6922d073dd5241ac718e91200100000000000000e4e005984bbae507a03d158ea8ca3a87505ae3e8723d8f5bfffccb63a23ea61c01000000000000008a40c3acc862dcac958866b738b304be7d84c33d9420b0747eb82aaa21b8c40c010000000000000094cc8c46f9670417f5ad9492d17189c4e03e96122782e92824f05e176d6843790100000000000000369a7419ed7884aecd3cda7ec3576942cacde7a9b8f2fe9a1115be827e2ba83b010000000000000096ef8b525c38b9a74a3014bd99979230dab2f20221e8c7d1db50c7a61a02e97e0100000000000000769d9f8b45bcbed8fd84b86d2203ee20d199212007387b10216f8fd9441dfa28010000000000000092c996c1fedd09190bb0fa8cc79e4075ad79eca3d6895d2a99d20e6f89e4182b0100000000000000f2065428f52da2f7a881f9b94bfd38719bb6e5ff88a6800bbb3aebb1a9ad2102010000000000000092006149452119964a75232851f01361608dc0a52031f240e93e70e98a3ff21901000000000000009ad36892ec05281de9c63c7cefb3f31e448957a9572e650d9f3af1f21b2f515e0100000000000000bae8e68bc8f1b66fe3229ee72d77137b394c6b7dfbf55e424f9d2c82d5c99600010000000000000098f7988d5a74a0e52f58dd3d232ac3e93ff757480db9d4c12761b04fef032c4601000000000000004aa3c1b56e8c58951fb89119ce93f6dc3d42f114ee1679cc9bbb154d57f422360100000000000000b81bd21787e12343691c1fd404bb7f939d53b3c067a82aedcc0b0aca1e8fc17b0100000000000000a8c366514ae829385912b04b0192e934a20045b36cf1911bccc4c064d6d3c461010000000000000060b521110672f6f871978fd3ac4a835b5e30c3fa727c04c70dbc543fcad38b0e01000000000000002ab0b5cc358184be4fa29e7a3dc24806a72e55baad40ec9a117324a884242c280100000000000000e05c7c7d82498be85294ee984e1f0caf23c53fa9a64cc7e6c5053304c4bb785101000000000000005afe620da258a48f00c3afbb8a98161e977f076c7e7f8392975a4f0db4b57d6101000000000000001ae9aab4a890c558ac8ab90ccbbf193b3841083670ebed278b2161fa2ec7b3040100000000000000c2d156c96e21691a06cecd4a396978f94cfb3a1760d41180efe382b7ce8e993f01000000000000004616ac86f0d45899eed3f1246dc5744858a694a92b0abd9f10e52dfc9c2867460100000000000000a4b31af719e5d9c3b69326ef920736e8b620b329eade475ae23a33fbd445df7201000000000000009281394b5d35827c826e1d7444f346c247b9a004aa0292a9ca2b16e0fb55687701000000000000002e1c4e3a1474325086c1ebf51c0cb6d335242921c645b7d0e070d9aa092afa68010000000000000012bfb35bdbc174f07745b29eb649c6c896fa7f38b13a728fedc4a4853a75014e01000000000000007e88cd54f47c1f4ddd9d3a198fc689d24a523fe186d526b14e476f14ced7db3c010000000000000024ad842dcdc5f4d84262c6aee5116e88116fb191dbbd1331453202d3583b1f440100000000000000c2a54db27458236d0902be95fe0e09227a0c07320855f1f1ead7e58bcaf0e3090100000000000000068245d8a483bdbd4e9d88b49e17a651ec168f25e6851fc52c2e36a516031d5e0100000000000000386bcf52f4c464e6a18169f776d69e90880301f01fcc8cc0ba451f1d7e6c3b7c0100000000000000da132f2f832c8e2a4e268b4faa923d9449c94ebe66f03fa0ac4303f2ceb1b05301000000000000007e0da5500e4e91faec6b7c3763c52058a7a9350be3009f2fe00a8e3bf0c59e790100000000000000a8d082a4289fe5ccaada604e70c4b1473d6fae4374663672e61474852c1ebf2a0100000000000000309ab613bea03c4431f7602c937f5a4d17e2102db6fc7f77e32f7a245041b90c01000000000000009623ad5bd17b75cc58839c76474636ad5675c519e15f090ec008eb626db73b1401000000000000003519910296cbdb58e14288f16abf93393ffb8c9c91baa60093d1a7764459b6cc0100000000000000040000000000000002", + "babeFinalizedBlockWeight": 5057865, + "finalizedBlockHeader": "0x5a979217b503aa78e90ebcae20f6f220a4bc4ed6d776942fb850bcda517989e6a64bd4040e16472342dec8607f270f2d6ce99ceacb891aaddceaa3d7eace37129bca3338e2f6d0766dc5fcfc489eaa7a5d8284183494f34caa74847fed5c4fd8e05cbf290c0642414245b50103c9000000305803110000000098f2bd8c49c25f3a3ef98d184934741cd144aaf6d1ff9dd46479f449786a3d2941fb3a6b91133bd27200e607d83ce69787200ef74cf2708e876705e0657a9408debff3ab5bba7ae0c88832de6beee0f14de74abdf86218035889d763234fd00c04424545468403eb7277261742e27bca09f32dba2deb3ad262a859449d9bea27887340ba819a9205424142450101eaa77bb7093126995fc6905e2a89ee5d68de063bfae58eaaee9044deb42bef2372c3964800c13860b60bccf420d69bdbb6d1ea9cfdc58bfb9ea3ba0881236783", + "grandpaAuthoritySet": "0xa5046f706506065685b322054d22e8a1f23ca9df75c32a88dda5214ad58b553b4cca01000000000000008a239af78d4659897af698b5670533fa6d215864be8c41e3a2fc4309f9f83dcb0100000000000000e2b9e72d9202e99526fa626d9a6651dfd7c1daec8fc6ba1130af96f7d21a42da010000000000000056b838dd2005e499be47ceef086df4ca9c5fbc1f81968391c31af062a8a8bef301000000000000004a3fc0fe1020c7f460c7bd23d0b657c03368552b2f0a12d80a1c406fd066e0db01000000000000009b992b5e9b99eb2cd3b2b648d6db81ed722a2feb4938d998b58dcb5d159fadfa0100000000000000a8b2ff688a9b1709f0371b49fe31d4d5a362d3fa11f64fcdc2941df9351edebe01000000000000003255f477781804204f24ddfd080346b0e75c7c5a92b37cec1fbbe79fa93407b001000000000000005a40b78008713bef1a35714bd32e0ec4c8905dd0728aeb4943280efe766936080100000000000000907fc1295e137738f8862d34490ad0746b80926e236e05ef8b958084f1d91a850100000000000000e8d7333e457fa740db924866152f31c3bfa6124c0367b0878a61aff2d5d6e27e0100000000000000426b2be4596a759a15028d84e08c5c56440e6cede68d088f47c671cc3387c3e6010000000000000070ba6e5985990ba1b1392713236f1b50df750f10f744cc6eb95fa7c5cfbc68760100000000000000e511d441d6d3c822cb276bb2a14b1c8071d9fe1995802383fb5dcf8a92edcfc2010000000000000003e385d1bbcaeed57930ff625035cd65781e3fe9de1d350d783ba261e678c0ac0100000000000000be2235b9d9c9164f494dd688000fb569a37d5c47912ef99b9ebda9318d13345e010000000000000049c0902ee37b569482da5474a15458b5dee16102fbc09b45878bb05f4a717acf01000000000000000e0ac68072ac35b8f19f98d13385b6eb75cf6fd4d513d9a2abfe9711b19883bb01000000000000007818639057900f8fb58e3aa8180f6108c251884a9fcb8041ca645cf612bc1eda0100000000000000a8dbfc6cb88ac105e25b9dc7f11e883631824647cd4d0c18014bb6239627b2900100000000000000ed7a7ea18c2d3b3effd9e8d7031592bc99517ca321c1faf7370f7d6d0fdebc47010000000000000041ef4a31eb7dc1e01f4630604e1908e644d7cdee3f66a60f98d6d59605326f8b0100000000000000890f5c296681b8c23038b3d36a491ca9e0e7e809e6455b2bcd28a13700f81abb010000000000000098df914cfd089eee8993fbfbd1522d6a31700c98bdc3a31cf69014a0ac123ecf010000000000000045ee96016a01c74778a6589fb2934ee9d83fd7a9e36509c4ef794d3d4f309bc60100000000000000f7e159462ec9dc0e54c6f6b8a83c4b551ee91613cad4208bbd563f16418328710100000000000000acd71d4269b3ba2a9de822d494c4d841708e1519c08de41d7fc6153eaf48da8101000000000000007c1024f3b93e54cb1cdde0d2f685e2e16cadabe59e407ebc45eabb07efebca6101000000000000000f42866aa6927f1c5916a8a1a5a5cba2d88e1fff957d80df701617d93ee6407801000000000000005cba2c6f569da1edc3778308da406f266aa53140381dbb3f14f22909ba6e30040100000000000000dac2e90de824b109043f70818d53eabe05e79d518bda504e951d7f4056b0b2720100000000000000652f455eb3d30486151c716a4031bc02bd00254ef3e8290fd29f946d958a46b60100000000000000589fc35b132ef9d7ed9a6787a203e5a3a37f8cd6c775f47ac5e589d55d381a64010000000000000044d68d3dbde0fbc3d667b7a004882caa9413b54785d820dc3654aff3a5b8e57d0100000000000000dccafad8bba5affbc80095564afc9376881907073a060979fabbb962bef08d56010000000000000078774f4f6130efaa55b5a06d1ef94ca420739dff79cbc24074bba841053e0aa20100000000000000aa3be8112cdf851411fe9e00fe9ef0a6b58217326ba7c1ab7ed9ce8a34620b250100000000000000c1c1ff5f66fefb5c0849e3b2333411d1f7e9dd4888600e334e7a33623f15fa360100000000000000f23b0362de32f952573d64c1f52ac4b8db0a7e15e7ad49a0c81d8f15b1f2ca8e0100000000000000594f51d31b1ae51a8c8ec48f5ab2428607440dd9c8f690ea377e99444529acb501000000000000002f40f2660559a4472aa7d2b5dac22c8925b9baeaec9fa2463cef2a77eb9d3a1b0100000000000000fa2c21f1a03638d4cb35202102240c2b85f5667924d5838cc503721117049da601000000000000008c461493dcd314f4b384169f3741954d8cde37bc8ad988149e40ddf18b4b95e101000000000000008aabd4f6d7ecec7a749c83fc7be33f3b4818cca6f93a4927b4964900df9454e50100000000000000fcc0d954c7d519851e0094cd9a015b4789022a37091e3a04791d0731bd85f0d301000000000000003948bfd09bbbc2fe6ac5dfe53146e32df50828eecf7b2b18cdcff8dc385cbd750100000000000000a2a4af2a11ae7ba812fcc32845583d0354a0f2ffb1271a53c9a976a0f47fff440100000000000000214ce2bd2912889eca3c69f45a3677989d66e20c3b26a52bbd378a4a71f5aa05010000000000000058e304af91397247f704ce95d60845629aa59a50fba1c13896bb2300708db47201000000000000008663371a5899d5e7a8bc99b9a6ce24c8c3f5f1149c1e70accf9560405c1a5bf201000000000000003d28789c6d574f3aa6d14360471901c5bf8255d072c2209fa22ac773bd32e5bf010000000000000099f574f1c57e766376a6976ceb3f44ea0420be7426d5c55b016a91e34091a0980100000000000000cc0c6a91c7971438b621cd9a3bd37a67f52ec4093336585d1e2c73416195e28a0100000000000000de52bfa88c4a76bb22fbebb0f078dfcc5a327034e0044e8f8034f2a96e7adfef0100000000000000bf3fd3d4065b306638662c3e789d830a63d9b343cef5f863d346058387844b58010000000000000005197187ac7eb8d0a3cfadd32f1a7fb662e7e4a16ea718af3f1e4437b865205b01000000000000007d09497b4d65162d28d4940f8eaf8342798e7794ec0f5028d163fea6156cb4f30100000000000000a5aa8fc244c0d6036f96ca0585214448d94a124157dad6a09b585d1638c2362d01000000000000007c077f9fbba618995d7df802a578934d36a5c0bec16dfcbaa7bce3879b4c44ce0100000000000000b98c920666586f392d129d480e78a965764ac82de45e691589b3aab7831a7f020100000000000000cb92ffeace78dbafe6fbf275741b4b38657fb81590712aa0bca7877931f6ad39010000000000000034a18d21097f479eecbe51b91c522a798582caafc787134bab6888854742406e010000000000000027791275ae7d4735aa45e70210663067f7d268aa57126a26044c8f6d8572a7d80100000000000000f7c9f4bc8669969246cfb748ac6996db6cd4c1fc634d981a1093b2c3d7a2eadf0100000000000000576fd85592b4e01e1cb10b2ff002aee632e6e8fa7dfadb39cb788ee22854a73f0100000000000000f001e2e99b378fa4f2d1a50b28c3fcefcd7da3a66314af1280fb7f9cb429dd38010000000000000083a8ca034fded71f681224d5f905b69084b17a51c18f0a06aeff60e868898bb20100000000000000a9f24f0208a21e8cda4e450c72074f20d76a927bb80fa4418e480e0b59575c6b0100000000000000c8185ca8ae6330a1e03490e132163adf517f76402ecac6881a51c8a14ed62f940100000000000000c49e3cd2c701bb845963c2870dcca12ed070c3f67ffc20144327a93aa6e896ec010000000000000081b1fce3ee9e31723f1023eaa9f8793e8663e72c50fbb0fbcea9bc78bacc491b01000000000000002dad5b2212ee688f2eeb9ca1fb6a90574f006dc1c6680ac3a8523363a248940b01000000000000004bb953c285fc6de7ef27baf835e8d905e60d86fb1bca0e52af8323e9d1ff219d010000000000000050f9fd6c0623020debb7843bcb832ee1d80db9b156d8e6083ccebd434fe9794701000000000000002d575e29f7c1ea23bce864823ab34822606c5f0207bd18f471c9881a8c0e9d990100000000000000b7c13f1239888cda5c8e6ac9ea10675df17633368906e66a487f91ddd3268ca601000000000000002cd51e09c3197e04155b78f3d97742ceffface390dc46f81f2613a94b2e483fd0100000000000000affb713ecdae328aa4436756f6a3e8add6b274d5ef1cc19d7aa69ab82c80e472010000000000000052912b3dfd0ccacd00586b97f1abe32431a2f6fa9c2b3bb17837a1ecde61728001000000000000008a2b50acd1a4955fc814bf6720c7427902a6ce709f3a2d7c17c55b67f6f1c0630100000000000000ff80f99fcf0f4072402a4e522aecd41ff231c5b579d978d0383dda0407ee498b01000000000000007c4082f9595014d2c938afd242c5f4a285bf8d488ff134e60ca42e3efee5761001000000000000006565187c86eca2aaf37db6d59405535a5e6dd85e2743a07ebf50e55c2b7fbc890100000000000000aa674be249403288a8078e209231e764e3679f2f66a1070ea5d9b5b420fc53ab0100000000000000d1c146d2429a5a827660008721c7a880e71f44feaa3dc75524c1a9281bac48cd0100000000000000c68c7e0bafb7f0fb65a79f7517684f7693e7ae6435fb72773c3c52438c669e6f0100000000000000f42c2e2a4157d51d22d5997dea1342f65e1882e207fd0e64e8e5d44330857eef01000000000000001a13a82af5e22b9863c01e5f0f6bdcebc4a295934e339fa915cada1d5eba7eb80100000000000000c8be78d05f652edd0a64a5865455de36d0fadb0d91c470fd344f8de23c8a6b9c01000000000000006ad5224d5c8f7fb3ae15dcb3766c0956ca627a6c91e93c4e770a2908e8f5901501000000000000006faa2a994a276a5d8d029db32b4c05375412db8844ec0a1ecbbcce729f308e9c0100000000000000f5fef7a87c9f3917fd28640907ce59ad26f33e41baa25d8ead8033ae0b944d7901000000000000005d0124063ede3e49f037df33948477235e5a58f93f8b98bf7203f25e11d4f0b40100000000000000225c0d8471ce0f8bd50aea0e5c48b863788729eb6c06aa8f171adc6ce51bec850100000000000000e4dc36bfd9f67865042b7f3bfb4a07891f7b757b1a37c1ba7dc6e395f3e4657f010000000000000085b714accac0654ba57fac59b626dd35802269d2c1d995cea7c335cb05a88f7f010000000000000033346b5629c0c499b8cce8b797ee9a312d06155fbe898c8a4a09777ecf8ba91c01000000000000007448b6f6db7cfffd8650a1f3f08ddad1e114321ea770c9cfe6154882f586edb50100000000000000eea0e8d1a0aae5e5cd38dda0e172b49f8ea02287fd7d2ca79ffcdf6e593a2831010000000000000037483029302a84623f0a8db165fbed905b0a4fc25e7cfb56e975a0e98336a59b010000000000000053b5918f72e73f92f32b578d1b602f0cc554d98bee8c4e131ef0ac7a63399fb401000000000000002f4ab94586b2ba3b4983962b30aaa4faff06b6cd67ff1b6df06af0d9fcf34d2a0100000000000000587473ac474bbd8c99d14bec88d614426944b5c84dbf2912abac7610741560ff01000000000000001935d43843c66ecf76a9f4c4229de9ed7c172f52aa53d1a279f2856a736661b801000000000000004b1289d5bcb7ebef732dc630d99150de770499877ea75f9dd3e693871beacb3a0100000000000000cdeaed45451971dcdcf886df977f31b3c004c497037d9940bcbbf2bd6dd2e3340100000000000000cc5dc1c5155dfcf43ee8dc4443292e966cb3226aea4fdf88e73daa259d66b6730100000000000000f14cb581296c3261284a2ed4e5a85dc0280e5618cc8dc1e76d8ab4ab415ecdd30100000000000000096e6c93e51502bdb63438d1cc1207bc5fa4cc1a1330b152ce46ca62f0c88ffd0100000000000000be5a92b1661a385bbb5d42b4c53e5182988a80759eaeb5b76928f5ad726bd4920100000000000000c05f72a55f91f613b2da541ae27eb6053e80f267c906c135a4ebd848ecfb49db0100000000000000ec295fb809e22c332aa36a57afe05f2c093b2d13e52b0971d8265c5514e4e969010000000000000098237d7b68db1bb6e79c5174523a8806a88fe0fe427b40199b984216800517d30100000000000000efb5f1e4c4ba37f8c159d452d897c607a58518b8355a8454620b3e3ccc3271230100000000000000099a9eb71f9cb1b7d15eae384790b4ec35045a19acea1730ba62f3e7caf31e8b0100000000000000d34560b879f8f4dd8d2fbd4f6d51b9b6f41b76656860646fcef4e1498859a190010000000000000061914b4dba0a1e42e692016cb74943266b257339008ffed4644231a2b48df21a0100000000000000a703a37bd5d93619bfb6ad72c24840b396b2ddb8700db2e1d372a82363ec7d580100000000000000a892342c56149812a43e98c82b6a3dfee7eff384d9b6d832002ea63838f64900010000000000000081bbaa3313b09e3b0ea2817c3e968a33587ec8928539c3f3a6d0e65644612f4901000000000000003d884e3f58913c10c26d8af2a095e231079a3a0b69f775052f7173ff1c3ace2e0100000000000000c13b603b5fe774d98e59c26fac03f8096ccc42c57d0cbc6a443b4f07a3c077920100000000000000be6b59cb464fadec4e0b22a9f12857ba5cf7a14c4f9551439d36305d582dd7fb010000000000000090c47bdd7fcfa4f8ad90f21b09e45cc97ed7c8313f3d6e09e055c2b2d3fd277c0100000000000000f916634f9fd7e54374e30ac6b722ad1793c13cb2d5f2ad38769eaca2f79d414b01000000000000007ba967a2dae0d8839cf44710591db994d18e53b25ec6d0f861da0037c4a4366a0100000000000000222ee6c6a6c62d56cadb4eaad5104d595fe962fbbdd551c81562d3b5092129070100000000000000f1fb51ab1445fe4d14cd9a8c9248557fd1c9b669b9d7d72f5de4cad4ce120c08010000000000000055ca63358082034ddaf76b75f41a396081dd4f39a61eff13f7575e506e10335601000000000000000aadf1b2009026f8f5dd75d532e91dc756fd47572aa0f3c15d26790e6d6b2f2701000000000000005b64aaae945b4c5f90242dc5d9892f452dee7b41262adc26b494637953faee1b010000000000000050e16d897010823670148ef157d77933bc1721d82c45e80eb73b46b12b5daab601000000000000000228d7fc42b304906518cbd91d73a5384c4893de6cbfe1e7346999df642d3d000100000000000000db9e49a8dc2d75fc63151f9dadc11b7d2d435b9625f62747928fbf7f1be8506f010000000000000082e6b6bf1f275c59fbde0dad91393ae690d5e644d11d23898a9ccfdda025920a01000000000000008ea2528e80e6b0d60f6efa538840d0f00d1067a924f29fd51ad68c0aec3fde7801000000000000001bfc78866edf1c38c02c1d1fbea39a2a33f46227dca527ed002d96532e61114a0100000000000000d761043f405069ac01285f1ff258450aac675f08d906b1ae0a1ce54eabcb36d901000000000000000dfbc1b5757e1f0ba348f8af64fb631aaff86cd21fa0529e0bb1fbab250879260100000000000000e0c32c0314862bd3897796069a8b781ed1fe1a375575a8fe7b8c468f620c77a20100000000000000d791b58285e2c4f17c82a518e099812d2a3f63e1090f1cb2576e2c7695ee24970100000000000000de74612da9080d47be35bf4ded2094e23c1de14477114ddcd7b76b815456ec0c0100000000000000d3b3d9703a265a51a137b9de348587c645a168981ef3e01c9dc482856751b8ef010000000000000003dd543dddd6ad00137ddf94a218bfa19d2f08b4365d696765dc25deef76598b0100000000000000cfb9f7f1fcf903a51af729ed1647aee928630e148990309f9dc9f3b14b114b7601000000000000005216ff912251cd2bcf9db256b3927e737cf909e4b53a375586dad21bb7b907ef0100000000000000d14a779884de1b2fbf079b8e47e8c0edb1c29e282996899a4eab5aaf1f4f41130100000000000000b5b64e522ece2a1a3325f95082e33bbf5832e6116d378ac0f437b7b49727292401000000000000004bf6037c3820cb7468601051701164948b7f7cbbe1ac8cad97e809c76170dddf0100000000000000fe7280b7fd8850f810d56d30b0e3811aaf9bd4d4417fed9a704d9fdcc1f7c80b010000000000000061f8830d235dc8b50288a606b3570c8335eefac47874c26a45f170cd29a5dd3301000000000000001ec0811cbe4f2ea1e5a714d3ba08c6d7fdec138bcc6406da3c6cd32f1686616d0100000000000000faf22cf4b053a1a03afeea03d07a83a4693d0ce0838d68721de18d2e93f91e9701000000000000001edfbf4f258a7c9ee7a6195a728c2a4989338a0f9c3b5c9b799abecc8630562b01000000000000008b7baa89dbac95969a0042fa876a37eaccfcecd3591c4d7ed0e8051aea814cfa01000000000000004715211e268489d1eeccfbd8a5e67235244322c17127226184448741ae332ba10100000000000000b58b8af4f9a5c18d5e97d22ed2098cf2e6cae587400859041059ca8afeced7450100000000000000ddac76c2a61c9aef4a9b3247aa0953187533f346466f02840235662440d2945c0100000000000000055c25dcc9cf8a08ad007ed9c8afb0ba53cebd129a20f194d272535ca9fa06490100000000000000cc8db7467349129a20ab4ba7e705044216651c0eba9d39f1054849edbcd677af0100000000000000982d9e3cc8ef3f8d99638b6f9df32c82356e1cd88f123d1e586a604d1d4b0cb401000000000000009cfeed14dd2f96550a0e7edebd9c9a8c8b1d8f7efdd1abca01987654239f3c860100000000000000736925c31654df870fbc29437c9b2a488ac3262e5d80798534ad00c43a61e54701000000000000008404cabeb0674765bb77af690fa838ba28fa2045d602994a89f07680f4851c83010000000000000006b9e740c0a0e1f8fd31717438d5918ed8680eaccb70fdc9511931ce0d164ae50100000000000000b8cf76a8082d518016ea5588be57b64e156ed23b0f72248975522c23d15ef16101000000000000002565e04c6e0b665fac87f8238bee74837f8f621ed63409f3838d263603400a9801000000000000003a1e82e30d0eead0b6f4b8a23422d260890d9aabdc2901c81ec459ead88ed7980100000000000000056986ef8b6f0f9e092e29540e8d220b40bed9e459e7b9d0247e0e156601e3c20100000000000000620c78305072857b43dadced80ebc057dbfc82b58c14c7b63372ef02140867650100000000000000546ce2099b3863d2d75324d5866bfd5324d8ee4701a99dd53528f8a8c898ca48010000000000000046b45ec0a71351bec5563187491fa73d602d68d56b9faf3d59ba80c1fe66268601000000000000005d50d6099c7c88f367568fa473b44785acccd030251627cb371de16e5fa704260100000000000000301b983e5e1320b7c9ff0f2525121b9f3007f68c273ba8ff662b7244f1f95f210100000000000000ef5b937d1eb14d07785430ca8efb57cb965060fac808b9a25ab9d4ab52cf0ad10100000000000000a85e95b303450b71e03368ab702fe362ddb6710e9f374e0814f65fe4b46bd3f20100000000000000064d822e098e64fcaefe184a6038701fffb2f68dacf64f9c2d007fd58da92d0601000000000000009e4dc072780c293ebda8107e014d03b3dea3d3f14bc9d02cb0c9c0776ce63b990100000000000000d3ed238f520c7ce95663aeb66448e9bd02d68779471be8b8f0fb28265b44ad510100000000000000b1fb5116f8c92bf1d763969194db84f09eaac810117f40a8f84410dd54d6518f010000000000000081a47767e6abad1d3c805d4eedb10a226dd9efb967d5f78f8ac4cec55027f1ac010000000000000028139ae721b771cf57d5afa58579d8dc0f04f04c1e1b631cac64a9fdfaf8b5250100000000000000c5f7618b9d80d894e37364f041cc37cb1350386bc5e236dc91a41948e976c0e60100000000000000b66e24ea84d5e02a7b2b58e20bbf17a0f2a19c4654bf8b07669ba3b9fc4a46810100000000000000c924ec7ef0e00e00c269291948df5b8e7c8df7694049dced2aa7775871670e2d01000000000000000d8e0ceb31d11634ff50f20c90d57239a9307602e221baa190c784b144a7eb980100000000000000cab191a66c54e412fbe7fbc074ea0d916279d55d856d870d15bdf88c00538dda01000000000000000428e3ccdba17d779ffba05c9ec7a6264187d13bf89b6009e97200474ad3439701000000000000004c43a374e6b3e6f7d6c5a6b8518ae0d0d232a1c46d63af8fbc800045a14cbe930100000000000000c34f62968a87b2e4a9340a75004029dff5777a020f60fb287f08038491881f220100000000000000f54bb82d58c665ce3289b8765c40e60d84f74da663c164c38e16784d5c142b2c0100000000000000607737116e62ba11852c68515933afb8165f3174d594eef6d01dd7eaddb60ec30100000000000000dea32ed7afbb5b31cb45b6e5daff40fb33e80042994d8d6527ee262e32fb2131010000000000000065dc4c53802befd2acfc3d6d3f66eeb84947e5c15fc7a2165a375352a4faace101000000000000007c39d28f80a16bf0cedb70e36c5ac9063dd9b513c5fbbe2c2222389f428921340100000000000000bdee8597e248688fddc627ad9c95cbebf7d3b5f248b9a742aa2d8e761fa365050100000000000000a128a73c5eaa1803618a75bc368c38e4c5cd40999cb72d615b8af1d30cb8cf1d010000000000000020270811c3dc453f37b27d958ef7ad7dd4c7f217c83f94bd0ecd84c60018a8660100000000000000f595e043c5f1974fe8467f514a656265c4e64896b47c6dedddd35bbdcff2bded010000000000000020869a63e7a343094ad0b4ffaa3d83344ffec8c7fb9b177008f78d17eda7dcbf0100000000000000f549e094ce2c081069b7a39b67a13a00899882b79ed9ce8c63b2599cbb09009501000000000000003ee731da725307266b32393e3d353b49dcf27f3b55220edbe210af3094f1b2940100000000000000d64083c00178b8dd224afade9792fed8076031bdfe9efc5b8128e6372a9261e201000000000000001c6842f07fb07b318a8d00ce6258844374f8e894853ae5fd4a85c867d3fc32e30100000000000000417e120dbfd0297d59458b48407b62570987f1e907dd6dfa9a20bfe64eb489d80100000000000000443bd12fcb944a0e19b2f76ddd066a713a99d2dd3530a5f39275300d11ac9659010000000000000098b4b43d718a523ea7af6b507221638443f55e676b5e69f22bbf28b6e2d970740100000000000000be724139e9bdd099b70f7edab7d1acf0d05fa1a4ca212f5e2958d31f4272dcda0100000000000000134cf4720486824c6a27fa7892c8d82e805653ba1d98480267ec284a76b792c20100000000000000c3150e4ca47e7bc6486f198bf0a742a18ab0871bb1efa34e82c4ce81f27926670100000000000000c2eb94269c5e5d2ab9a1a300387358679640763b053aca99ba5c1c9083ee717f0100000000000000316bafdefb60951da2738d6c9c2ef1866d139b34b5eab6944d6bae754dd3fb110100000000000000b65475766e6229c87ff34263f5ca58525ab133962bc599ca0eab096ff296f4e60100000000000000ebb1834a568ea7653bc66f394937a0aa4f2f617118d2161e2c11c0d7d2febb9d0100000000000000c1b58624231cd77b450e0be515a576e8863cf47822e19b1bdf89bccfe65d41410100000000000000a51a49fa663cbea3b953fee99f911391d75d638349a2681e30759820c6f3c60b010000000000000042f47dad5949be7b7b8f81faaec17b1b53465b01b9f8f81e6a45f2fc74e12daf01000000000000007a1291795805dbe300425311ae50ed698450b1912b62e5b5a3264c68bfa970760100000000000000826fea075408d2c9331974dad61f4fedb0a7a306711c696997bc63b4b0e73e4c0100000000000000e0df5b2f299314d2d419b46d15c3c8a739182d91c3d4b98cd16c013c3a25c04b01000000000000003f2c01a2e1e996a73582943fd0749ec223b2ea8129513a2c5c4b52bedc1f75a6010000000000000098a6defcfeb3dfca36ec46eb373734627a2c395cdd2d886046a11788ed6467af01000000000000001701236903f6e923b35630f99bc6334e29df55d03a136d8acd93bac92f32045b0100000000000000853ba986f8785e8fc1a2ae2fb86f17cc91886d931182ccb8d148379a35cbf02701000000000000009bbc024bfe4f072b94735afda064dc3c7da2b4bc0c50cfad44722543583a372e010000000000000086dee2a2c1977cb6ff99dde8fc5b0cb10dcac44b50b19b80f8252899b091c84b0100000000000000496826b538d97906e14d417b48598d7d591a483ab5f4c6786cd0b96239c2f4cf010000000000000021235f4afb5b0d8ea5123cd4be4205ed27dc25e5e08813563e47f363590928400100000000000000c7009be830fe78c42f12f0753923131d16300bac230650001636b6a546cf0aa30100000000000000348e8bacc2d40191a6a00e137c745a422ff8fb03148d2ff9cad75efbb7a670140100000000000000768d47629bf074d88ded200706ce2f2ae38434c192129d1736ef8f6af01562b20100000000000000d227434a77cd7b7127c039eb9995aeb025a242c36ca7116372c7c8fe5bc921b50100000000000000510a0c61dca3e1044d3540c08272054462c6353aac4dc06cda265753b126b38501000000000000005db4206baa8706a1b1de0ac7edacbd2a2c93452481808b8fe6c582265b57a60d0100000000000000761ce3eef4bd0d15601aef70728f54ca72a9859e90841c3d02d5060201671878010000000000000000132d9e682cf8d45ce8efd4bef165a26da5d1349ea1fe9f51abd6dc762272020100000000000000f4d2f2eefe0c1c49856517be1829a9c54ec4de2dad8825dc5e366446729c160901000000000000001262625cc59c0e4b7548904c31a02231a601305881a231d4dea45eec6cbbbdcc0100000000000000c3576342cbf99792896ee5329b04ff2eee2fc2bb6d53c5c03d52c8957ee793fb01000000000000006ad4bc289673029ab44f3045eb6fdd3589d05e0e5fd76ee017f650a662f898fb0100000000000000a82f563264d1892dd46873205d03c098d8b03f53e21c797839737e4e5f66a87e010000000000000059dadf17dc0f84c1c334e6a815a04bdfcd0988a3f3bcb713c66ae29e17276cc60100000000000000297dc7cf28b3d40a42c5e8faac876bf7227c670e6e031dd0e0537f4fb70e6fbe010000000000000043601ae31cf5b03cb49395dda13809f7398d8670ee4d2172b14a1ab05986ac3b0100000000000000e7f57bd0bc756f24574e3a77c90616adb393e9d4ffceb2c63df19f605cb6a0240100000000000000f8e030baff510f2092279467b1f4b20a75da6d941011355269545f5a2dd66ec80100000000000000290321d793b7dcb12ad148c2438bb60821bd938b7e9164a0c3d0fc82987f8b6301000000000000002ef11bc5ce1e7b53f788ba01ba581b9171ef36449719ff3eb20973342a4a82850100000000000000ab45f730dd495f657b61b2777091fa8cd11b5a626bea2b514e5e6118021037970100000000000000b79f919442f4ca5ac9195fd09a1239b1a80bd225f8372f1b36a24a8c55de61f201000000000000002832b59000d2027d2bf57fdb40da04bd8aac1498923397517181cc487a92815201000000000000000cd7067f96a2d63fa72065302432f48690485fa5f47c9afab17123e0482785230100000000000000f6f23ae9bb4c269a5959d51f9173270ddefcc354b63de77b672bce58cabe60c8010000000000000049d34c7034103f19bbeb2c8029d96c82c753b088fccef038e7c5b009eb46d6e701000000000000004ab3fb4afcd05ee5df8e2bdc39a0a7ec1008355062b9d493fda9158a29f8bee40100000000000000be223d49fdccd102646c9b0d62130fbc8e7f0324d55a3eabaaffb5ed1616795a010000000000000062a91ffda8611ffce3edeb628ea6d3b8b12e5b2448beda6da8334e77a9ecbdd7010000000000000071893ca83ebe6ee06c3eb10dcbfaf70d8267959f6159b4ca36929a69604cadbc0100000000000000785825ab051127e981a7154947645df9d67416ea2499048815ed5f7aa358a21c010000000000000006cfc80018342011eef81de0346bbc3997cd97f04dcbeccaa30bd4529388976701000000000000004ad600cc461daf6d287d5d2ff0791f74fd7c6aab5714ad50340187a7ce509ea90100000000000000f9909408f9201a13dc8b04796d715d89beaab7dca5b7f3aad244165bbdb1a6810100000000000000b059f42934ee377fa5377a5886e2846c28556fb85e6488b8bf21c09c86b80b19010000000000000026cdfb88461d7125f438c599e062799219b385bacca93f3cdbe5418c9d4d499301000000000000000f19c3ed807ad5f2b7546f5e6c5e9bb934835d54ed1f4f989540b86a2ca02b550100000000000000e4c1d1377894eee032e1a60dbac6252e23f35bbb43ce51d5f98652cfee58d5bf0100000000000000666bc268601f06ff4b004b1509bf379603d3f4b7ea684f9638060c0ee5d400620100000000000000f2e75ee2303b2cf903b882c9888cc1c51f978abd58ba88354dcdad717f4b8a590100000000000000b426ef68c50245a003dd068c5c086fc9012c08a7f9ec53fbf7df4318261c8c2c0100000000000000e7931a825260ba7d4fdb5f4990d39a71e2a8b215a776ebf770102ca772f103a3010000000000000095fde7b91441fae9d2a6360d30228392519293be5e78cf3305667595cb15e566010000000000000096847258e5fdd261a8df1b3958366b29d28363aeb96a71c2b705e4c8864b97e10100000000000000e7eb7de26e0e24fd528fbbcecf837f26579784dfd4db512c9237e281113973870100000000000000eaaf51c4db0ac374aee2c43ce34866dbce4db52f43096392566898f8570d988f01000000000000000f256655890491ea13673e6cc79f06f3b44303badee1b5785fbca168337c9f5e0100000000000000fe76110186e8a72cb09ec93757b5447cc21d543888903f50e95c68dbea91b0630100000000000000716a181407939b3ea68289e09265d3b9d8a8f21ba7d9f50d8ef8a86fa3c0fd0301000000000000008e3d1c8c0261e193e87403c8959919ef035ba39175d3ba22f31190303601412e0100000000000000e2cbfcc26562b49e656aed7d837a26fe0f9802db088b10330227b6147e150012010000000000000094416582fe359e0a310da59bf93df8ff9665b89071d4977a9a9f3390b75c0c450100000000000000ac5230e4338aa51c44ab6a0fb903e6fd914fd029dab8f7ca447be54ceba749340100000000000000a76b32c8c28cce206ddf70ff3ad591ed01a0067f9f9baa77f9052ce938d359c701000000000000003a4bfd825ccd308def4a61bac80c579db42b02ea5f1a0768656a326e83a0dd8801000000000000007fab4769c41af85b9de8e784d3b1cda093fc0a8dffcdff21e914c62f131c77580100000000000000d2f1b3b5f7eb1b0d8328911d9ec920327d7a30729e80c1238f86dfe27c4fa347010000000000000078a2957fa87dcd755360693156976dc31d1ca27a869e032fb1a2d46ae06fd8d10100000000000000e38a7e0b1d2bad01565b8536e0851dd4daabdcf5a4ab415eee0357082d95d3550100000000000000841584e602ab975c936fe7c2025fcea2b5a0061e839b1ad96528942b33d0974b0100000000000000ca35d63347f9deafb433ec20ef8c469bf2e21dc5e67c0c048a5a04fa369424ac0100000000000000ef2deb3b9bae4be70f74994a67307177057e2e173061cf30bb25e5f8e620b06c0100000000000000daffd43670286cbddbf38953e6e33ba093f8c719e9fbf0a4aa76ff3ee97df307010000000000000098763eb72b3f7dbb7a793bd1d4367af5f072ff45a1a6eae0e002e1eaa24c5d550100000000000000b07738d501326a26acec24adfc2284f2f617e4042c738f7c0f15dc1c9006652801000000000000006d698963e0fa3c04ef2b32f638e0176e053cd021f6a49b55a4a4ebd4d5fbb11701000000000000002929dacc53614cea1848e7ba20fdeed7cb0bd81571aa72dfb63dfc84d3965d2b010000000000000031a46e639e57d1a11119b17f76617a35b3606d206fb5c3e87710f464f7a57de5010000000000000056b2cda89223ce64d8abd543ad66552bb84be82fb45e0ad6333e714eb20e5518010000000000000087070000000000000001e9123501001d1e00000000000000002904050001000000000000002a0d050002000000000000002f16050003000000000000008e1f05000400000000000000ee28050005000000000000004d32050006000000000000009d3b05000700000000000000fd44050008000000000000005c4e05000900000000000000b75705000a00000000000000176105000b00000000000000766a05000c00000000000000d67305000d00000000000000357d05000e00000000000000958605000f00000000000000f58f0500100000000000000055990500110000000000000095a205001200000000000000d8ab050013000000000000000db50500140000000000000024da05001500000000000000aaec05001600000000000000f4f5050017000000000000003bff050018000000000000008b0806001900000000000000992406001a00000000000000f92d06001b000000000000000d4a06001c00000000000000685306001d00000000000000b65c06001e00000000000000f76506001f00000000000000308b060020000000000000007b940600210000000000000025a70600220000000000000033c3060023000000000000007fcc06002400000000000000c3d50600250000000000000011df060026000000000000005ae806002700000000000000a0f106002800000000000000410407002900000000000000880d07002a000000000000001b3c07002b00000000000000764507002c00000000000000357407002d00000000000000239907002e000000000000006fa207002f00000000000000c3ab070030000000000000006abe07003100000000000000bdc7070032000000000000000fd107003300000000000000b2e3070034000000000000000aed07003500000000000000971b080036000000000000009d24080037000000000000009c4008003800000000000000255308003900000000000000735c08003a000000000000000c6f08003b00000000000000048b08003c00000000000000589408003d00000000000000d3c208003e00000000000000e4de08003f000000000000003fe808004000000000000000f7fa08004100000000000000aa0d09004200000000000000153309004300000000000000fc6a090044000000000000003e74090045000000000000009a7d0900460000000000000000a30900470000000000000014db0900480000000000000020130a004900000000000000791c0a004a00000000000000364b0a004b0000000000000043830a004c00000000000000e5950a004d0000000000000045bb0a004e0000000000000059f30a004f000000000000000e060b005000000000000000812b0b005100000000000000dc340b005200000000000000ef500b005300000000000000a3630b005400000000000000b69b0b005500000000000000c7d30b005600000000000000dd0b0c005700000000000000f3430c005800000000000000087c0c00590000000000000052b30c005a0000000000000060eb0c005b00000000000000baf40c005c0000000000000072230d005d00000000000000805b0d005e000000000000007e930d005f000000000000007ccb0d00600000000000000076030e006100000000000000793b0e00620000000000000088730e00630000000000000092ab0e00640000000000000083e30e006500000000000000731b0f00660000000000000079530f006700000000000000748b0f0068000000000000001fc30f006900000000000000d0fa0f006a00000000000000633210006b00000000000000826a10006c0000000000000028a210006d0000000000000005b310006e0000000000000055d810006f000000000000004810110070000000000000006548110071000000000000008e8011007200000000000000bfb811007300000000000000bbf011007400000000000000e828120075000000000000001561120076000000000000003b991200770000000000000058d112007800000000000000770913007900000000000000944113007a00000000000000c07913007b00000000000000e7b113007c000000000000000cea13007d0000000000000067f313007e00000000000000d31814007f000000000000002e22140080000000000000008c2b14008100000000000000545a14008200000000000000ad63140083000000000000000e89140084000000000000006892140085000000000000008dca14008600000000000000b00215008700000000000000d03a15008800000000000000f3721500890000000000000015ab15008a000000000000003be315008b000000000000005d1b16008c00000000000000855316008d00000000000000b18b16008e00000000000000d3c316008f00000000000000e9fb16009000000000000000073417009100000000000000bf4617009200000000000000286c1700930000000000000029a41700940000000000000041dc17009500000000000000591418009600000000000000bf3918009700000000000000704c18009800000000000000948418009900000000000000f28d18009a00000000000000bcbc18009b00000000000000e4f418009c000000000000000b2d19009d000000000000002c6519009e00000000000000896e19009f00000000000000519d1900a00000000000000075d51900a100000000000000920d1a00a200000000000000ec161a00a300000000000000b6451a00a400000000000000887d1a00a50000000000000077b51a00a600000000000000cdbe1a00a70000000000000070ed1a00a80000000000000083091b00a9000000000000004e251b00aa00000000000000fe371b00ab00000000000000065d1b00ac000000000000005f661b00ad00000000000000bd6f1b00ae00000000000000de941b00af00000000000000fecc1b00b0000000000000001f041c00b1000000000000000c321c00b2000000000000002f3b1c00b3000000000000002e721c00b4000000000000000ca01c00b50000000000000044a91c00b60000000000000022e11c00b70000000000000044191d00b8000000000000000c481d00b9000000000000006b511d00ba000000000000008b891d00bb00000000000000a5c11d00bc0000000000000053f91d00bd00000000000000ff301e00be00000000000000054d1e00bf0000000000000002691e00c000000000000000d1a01e00c100000000000000c5d81e00c200000000000000cf101f00c30000000000000083481f00c400000000000000af801f00c500000000000000d0b81f00c600000000000000f0f01f00c7000000000000001b292000c80000000000000039612000c90000000000000054992000ca000000000000004fd12000cb000000000000004c092100cc00000000000000031c2100cd000000000000006d412100ce00000000000000cc4a2100cf0000000000000098792100d000000000000000c4b12100d100000000000000eee92100d20000000000000011222200d300000000000000325a2200d40000000000000055922200d50000000000000075ca2200d6000000000000008f022300d700000000000000b13a2300d800000000000000cd722300d90000000000000078852300da00000000000000ce8e2300db00000000000000bdaa2300dc00000000000000abe22300dd0000000000000012112400de00000000000000501a2400df0000000000000045512400e000000000000000a1882400e1000000000000005fc02400e20000000000000013f82400e30000000000000007302500e40000000000000013682500e500000000000000c37a2500e600000000000000a8962500e700000000000000fb9f2500e80000000000000000d82500e90000000000000019102600ea000000000000002b482600eb0000000000000028802600ec000000000000002eb82600ed0000000000000044d42600ee0000000000000058f02600ef00000000000000b3f92600f00000000000000065282700f10000000000000057602700f20000000000000064982700f3000000000000008dd02700f400000000000000a7ec2700f500000000000000b9082800f600000000000000e0402800f700000000000000f6782800f80000000000000019b12800f90000000000000040e92800fa000000000000006c212900fb00000000000000a0592900fc00000000000000107f2900fd00000000000000bc912900fe00000000000000eac92900ff00000000000000fd012a000001000000000000ff1d2a0001010000000000000c3a2a0002010000000000002b722a00030100000000000005aa2a000401000000000000fce12a0005010000000000004ceb2a000601000000000000e0fd2a000701000000000000c3192b000801000000000000be512b0009010000000000000a772b000a01000000000000ae892b000b01000000000000b0a52b000c01000000000000abc12b000d010000000000009bf92b000e0100000000000093312c000f0100000000000087692c00100100000000000075a12c00110100000000000074d92c00120100000000000089112d00130100000000000099492d001401000000000000b0812d001501000000000000c3b92d001601000000000000d1f12d001701000000000000d6292e001801000000000000e9612e001901000000000000ea992e001a01000000000000efd12e001b01000000000000f8092f001c01000000000000f0412f001d01000000000000e9792f001e0100000000000036832f001f01000000000000b2b12f002001000000000000a9cd2f00210100000000000094e92f0022010000000000007121300023010000000000003b5930002401000000000000089130002501000000000000599a30002601000000000000f6c830002701000000000000e30031002801000000000000c03831002901000000000000a17031002a01000000000000f27931002b010000000000007fa831002c010000000000005de031002d01000000000000aae931002e01000000000000441832002f01000000000000295032003001000000000000fe8732003101000000000000aa9a3200320100000000000010c0320033010000000000003af8320034010000000000005f303300350100000000000059683300360100000000000078a0330037010000000000009bd833003801000000000000cb1034003901000000000000f44834003a010000000000001c8134003b0100000000000044b934003c0100000000000055f134003d010000000000009dfa34003e01000000000000302935003f01000000000000c6573500400100000000000023613500410100000000000053993500420100000000000080d135004301000000000000560036004401000000000000b10936004501000000000000ce4136004601000000000000037a3600470100000000000031b2360048010000000000005fea360049010000000000007b2237004a01000000000000995a37004b01000000000000f56337004c01000000000000c69237004d01000000000000feca37004e01000000000000340338004f01000000000000683b380050010000000000009e7338005101000000000000c9ab38005201000000000000dcc7380053010000000000003cd138005401000000000000f8e338005501000000000000b0f6380056010000000000001c1c390057010000000000007a2539005801000000000000da2e39005901000000000000525439005a01000000000000878c39005b01000000000000bbc439005c01000000000000f3fc39005d0100000000000028353a005e010000000000005f6d3a005f0100000000000098a53a006001000000000000cedd3a0061010000000000000c163b006201000000000000404e3b00630100000000000019853b006401000000000000608e3b006501000000000000b8973b0066010000000000000fa13b006701000000000000a7b33b006801000000000000fabc3b00690100000000000049c63b006a010000000000009ccf3b006b01000000000000eed83b006c01000000000000c1f43b006d0100000000000014fe3b006e0100000000000066073c006f01000000000000b7103c0070010000000000009e2c3c007101000000000000ee353c00720100000000000094483c007301000000000000e0513c0074010000000000007c643c0075010000000000001d773c0076010000000000004b9c3c00770100000000000010d43c007801000000000000d80b3d0079010000000000001a153d007a0100000000000053433d007b01000000000000ea553d007c01000000000000225f3d007d0100000000000072683d007e01000000000000b4713d007f01000000000000fb7a3d0080010000000000007a8d3d008101000000000000b8963d00820100000000000006a03d00830100000000000088b23d008401000000000000c8bb3d0085010000000000000bc53d0086010000000000001dea3d008701000000000000e9053e008801000000000000b5213e0089010000000000003b343e008a01000000000000843d3e008b010000000000005e593e008c010000000000001f913e008d0100000000000065c83e008e010000000000006bed3e008f01000000000000a9f63e009001000000000000f6ff3e009101000000000000c1373f0092010000000000005c4a3f0093010000000000003b663f009401000000000000856f3f009501000000000000cf783f0096010000000000003ea73f009701000000000000ccde3f0098010000000000008516400099010000000000001e2940009a010000000000006e4e40009b01000000000000c35740009c010000000000009b8640009d01000000000000cebe40009e0100000000000001f740009f01000000000000372f4100a00100000000000097384100a10100000000000070674100a201000000000000a99f4100a30100000000000065b24100a401000000000000ddd74100a50100000000000096ea4100a6010000000000000b104200a70100000000000044484200a8010000000000009c514200a9010000000000003b804200aa0100000000000051b84200ab010000000000006fd44200ac010000000000005ef04200ad01000000000000b9f94200ae010000000000006a284300af0100000000000078604300b00100000000000077984300b101000000000000abd04300b20100000000000064e34300b30100000000000072ff4300b401000000000000d2084400b50100000000000008414400b6010000000000002e794400b7010000000000005eb14400b8010000000000007de94400b9010000000000009e214500ba010000000000005d344500bb01000000000000d0594500bc0100000000000006924500bd010000000000001aca4500be010000000000004a024600bf01000000000000603a4600c00100000000000084724600c101000000000000abaa4600c20100000000000047bd4600c3010000000000009ec64600c401000000000000a0e24600c5010000000000005df54600c601000000000000bf1a4700c701000000000000d1524700c8010000000000007f814700c901000000000000dd8a4700ca0100000000000039944700cb01000000000000f2c24700cc0100000000000010fb4700cd01000000000000d5294800ce010000000000002c334800cf01000000000000f9614800d001000000000000596b4800d10100000000000078874800d2010000000000008da34800d301000000000000aadb4800d401000000000000c6134900d501000000000000eb4b4900d601000000000000e7834900d701000000000000f9bb4900d801000000000000b6ce4900d9010000000000001bf44900da010000000000004a2c4a00db0100000000000066644a00dc010000000000002f7d4a00dd0100000000000019994a00de01000000000000c0ab4a00df01000000000000aec74a00e001000000000000fed04a00e101000000000000bbff4a00e20100000000000019094b00e301000000000000902e4b00e40100000000000041414b00e50100000000000010704b00e6010000000000006e794b00e7010000000000002b8c4b00e80100000000000094b14b00e901000000000000a4e94b00ea01000000000000d4214c00eb01000000000000d7594c00ec01000000000000e8914c00ed0100000000000004ae4c00ee01000000000000ebc94c00ef0100000000000014024d00f001000000000000fe394d00f1010000000000000a724d00f201000000000000667b4d00f30100000000000013aa4d00f40100000000000031c64d00f50100000000000037e24d00f6010000000000004afe4d00f7010000000000002c1a4e00f801000000000000ea2c4e00f90100000000000049364e00fa010000000000004e524e00fb01000000000000628a4e00fc0100000000000079a64e00fd010000000000001ab94e00fe0100000000000079c24e00ff0100000000000094de4e000002000000000000aafa4e00010200000000000059324f00020200000000000004654f000302000000000000ff764f0004020000000000000d804f0005020000000000007e924f000602000000000000c29b4f000702000000000000f4d34f000802000000000000160c50000902000000000000504450000a02000000000000877c50000b02000000000000b6b450000c02000000000000e7ec50000d0200000000000046f650000e02000000000000b61b51000f020000000000001625510010020000000000004f5d510011020000000000000f7051001202000000000000889551001302000000000000b5cd5100140200000000000014d751001502000000000000e605520016020000000000001f3e5200170200000000000053765200180200000000000089ae52001902000000000000e8b752001a02000000000000b7e652001b0200000000000074f952001c02000000000000e81e53001d020000000000001a5753001e02000000000000558f53001f020000000000008ac753002002000000000000b9ff53002102000000000000f13754002202000000000000277054002302000000000000418c54002402000000000000d1a354002502000000000000d9c8540026020000000000007edb54002702000000000000b81355002802000000000000e34b55002902000000000000c58355002a02000000000000d6bb55002b0200000000000007f455002c02000000000000c30656002d020000000000002c2c56002e020000000000005d6456002f020000000000008f9c56003002000000000000c9d456003102000000000000070d570032020000000000004345570033020000000000007a7d570034020000000000007d99570035020000000000009ab557003602000000000000b4ed57003702000000000000f225580038020000000000002f5e580039020000000000006b9658003a02000000000000a6ce58003b02000000000000e30659003c02000000000000183f59003d02000000000000517759003e02000000000000ad8059003f020000000000008baf59004002000000000000e9b859004102000000000000c5e75900420200000000000002205a0043020000000000003f585a0044020000000000007c905a004502000000000000bcc85a004602000000000000f1005b004702000000000000111d5b00480200000000000030395b0049020000000000006f715b004a02000000000000aca95b004b02000000000000e9e15b004c02000000000000251a5c004d0200000000000060525c004e020000000000009f8a5c004f02000000000000dbc25c00500200000000000019fb5c00510200000000000058335d005202000000000000956b5d005302000000000000c7a35d005402000000000000f7db5d00550200000000000031145e0056020000000000006f4c5e005702000000000000a7845e005802000000000000e0bc5e0059020000000000003fc65e005a020000000000001cf55e005b02000000000000582d5f005c0200000000000093655f005d02000000000000cf9d5f005e0200000000000005d65f005f02000000000000440e600060020000000000008346600061020000000000006a7e6000620200000000000056b46000630200000000000000ec60006402000000000000a72361006502000000000000e25b61006602000000000000f293610067020000000000001bcc61006802000000000000dade61006902000000000000590462006a02000000000000963c62006b02000000000000cc7462006c020000000000008c8762006d02000000000000ffac62006e020000000000003ae562006f02000000000000731d63007002000000000000b05563007102000000000000e98d630072020000000000001dc6630073020000000000005dfe63007402000000000000993664007502000000000000d86e6400760200000000000017a76400770200000000000051df640078020000000000008a1765007902000000000000c34f65007a02000000000000018865007b020000000000003ec065007c020000000000007af865007d02000000000000b63066007e02000000000000f06866007f0200000000000004a16600800200000000000041d966008102000000000000711167008202000000000000ac4967008302000000000000de8167008402000000000000f8b967008502000000000000b8cc6700860200000000000035f2670087020000000000006e2a680088020000000000001c3d680089020000000000007f6268008a02000000000000ba9a68008b02000000000000f3d268008c02000000000000310b69008d02000000000000704369008e02000000000000ae7b69008f02000000000000eeb3690090020000000000002bec6900910200000000000065246a009202000000000000a45c6a009302000000000000e0946a0094020000000000001dcd6a009502000000000000dbdf6a00960200000000000059056b00970200000000000018186b009802000000000000923d6b009902000000000000b0756b009a02000000000000e6ad6b009b0200000000000021e66b009c020000000000005e1e6c009d0200000000000096566c009e02000000000000d28e6c009f020000000000000ac76c00a00200000000000047ff6c00a10200000000000077376d00a202000000000000876f6d00a3020000000000000fa76d00a40200000000000059dc6d00a50200000000000022146e00a602000000000000464c6e00a70200000000000071846e00a802000000000000eea96e00a902000000000000aabc6e00aa0200000000000085eb6e00ab02000000000000e4f46e00ac020000000000001c2d6f00ad02000000000000da3f6f00ae0200000000000053656f00af020000000000008c9d6f00b002000000000000c4d56f00b102000000000000d90d7000b202000000000000d7457000b302000000000000f67d7000b402000000000000deb57000b502000000000000b2ed7000b602000000000000a9257100b702000000000000975d7100b802000000000000338c7100b9020000000000007e957100ba0200000000000068b17100bb0200000000000050cd7100bc020000000000001c057200bd02000000000000610e7200be02000000000000c13c7200bf020000000000006b747200c0020000000000005aac7200c10200000000000032e47200c202000000000000dcf67200c302000000000000321c7300c4020000000000002b547300c5020000000000007d8b7300c60200000000000020c37300c702000000000000cefa7300c8020000000000003c327400c9020000000000009b697400ca02000000000000eda07400cb0200000000000056d87400cc0200000000000090107500cd02000000000000ad2c7500ce020000000000000b367500cf02000000000000c7487500d002000000000000fe807500d10200000000000039b97500d20200000000000073f17500d30200000000000030047600d4020000000000004b207600d502000000000000a9297600d60200000000000006337600d702000000000000d3617600d80200000000000090747600d902000000000000089a7600da020000000000002fd27600db020000000000001a0a7700dc0200000000000022427700dd02000000000000007a7700de02000000000000d2b17700df02000000000000f8e97700e0020000000000002b227800e102000000000000635a7800e202000000000000a0927800e302000000000000daca7800e40200000000000011037900e502000000000000483b7900e60200000000000085737900e702000000000000b1ab7900e802000000000000dae37900e902000000000000121c7a00ea0200000000000049547a00eb02000000000000878c7a00ec02000000000000bfc47a00ed02000000000000edfc7a00ee0200000000000026357b00ef02000000000000606d7b00f0020000000000009da57b00f102000000000000cddd7b00f20200000000000006167c00f3020000000000003f4e7c00f402000000000000fb607c00f50200000000000077867c00f602000000000000b4be7c00f70200000000000014c87c00f802000000000000e0f67c00f9020000000000001b2f7d00fa0200000000000058677d00fb02000000000000959f7d00fc02000000000000d2d77d00fd02000000000000ec0f7e00fe0200000000000025487e00ff020000000000005f807e0000030000000000009ab87e000103000000000000d3f07e000203000000000000ee0c7f0003030000000000000a297f000403000000000000c53b7f00050300000000000043617f0006030000000000007b997f000703000000000000b9d17f000803000000000000f20980000903000000000000284280000a030000000000005e7a80000b0300000000000099b280000c03000000000000d2ea80000d03000000000000082381000e030000000000003e5b81000f030000000000007b9381001003000000000000b8cb81001103000000000000f30382001203000000000000313c82001303000000000000697482001403000000000000a6ac82001503000000000000c4c882001603000000000000e0e482001703000000000000ff00830018030000000000001e1d83001903000000000000dd2f83001a030000000000005b5583001b03000000000000988d83001c03000000000000d5c583001d0300000000000010fe83001e030000000000004e3684001f03000000000000826e84002003000000000000bba684002103000000000000f5de840022030000000000006f0485002303000000000000cc0d850024030000000000002c1785002503000000000000ea2985002603000000000000634f850027030000000000007e6b850028030000000000009a878500290300000000000017ad85002a03000000000000d2bf85002b0300000000000031c985002c030000000000000ef885002d030000000000004a3086002e03000000000000866886002f03000000000000bea086003003000000000000f2d8860031030000000000002a1187003203000000000000871a870033030000000000006449870034030000000000001d5c87003503000000000000998187003603000000000000cfb987003703000000000000eed5870038030000000000000cf2870039030000000000004a2a88003a03000000000000a83388003b03000000000000826288003c03000000000000b69a88003d03000000000000efd288003e030000000000002d0b89003f030000000000004d27890040030000000000006c4389004103000000000000ab7b89004203000000000000eab38900430300000000000028ec8900440300000000000068248a004503000000000000a05c8a004603000000000000b4948a004703000000000000f4cc8a00480300000000000030058b0049030000000000006f3d8b004a030000000000008e598b004b03000000000000ae758b004c03000000000000ecad8b004d0300000000000028e68b004e03000000000000331e8c004f030000000000004f568c0050030000000000008e8e8c005103000000000000c7c68c00520300000000000005ff8c00530300000000000041378d005403000000000000746f8d005503000000000000a4a78d00560300000000000064ba8d005703000000000000e4df8d0058030000000000000a188e00590300000000000023508e005a0300000000000027888e005b03000000000000d89a8e005c0300000000000043c08e005d0300000000000082f88e005e03000000000000c0308f005f03000000000000ff688f0060030000000000001ba18f00610300000000000059d98f006203000000000000981190006303000000000000d64990006403000000000000f56590006503000000000000158290006603000000000000758b9000670300000000000053ba9000680300000000000092f290006903000000000000d22a91006a03000000000000106391006b03000000000000489b91006c03000000000000a2a491006d030000000000001bd391006e03000000000000530992006f03000000000000d32e9200700300000000000090419200710300000000000074799200720300000000000094b19200730300000000000072e092007403000000000000d2e992007503000000000000b21893007603000000000000122293007703000000000000445a93007803000000000000739293007903000000000000f3b793007a03000000000000abca93007b030000000000005ddd93007c03000000000000c40294007d03000000000000e13a94007e03000000000000217394007f0300000000000059ab9400800300000000000090e394008103000000000000c31b95008203000000000000ea53950083030000000000009866950084030000000000000b8c9500850300000000000046c49500860300000000000057fc950087030000000000008f3496008803000000000000cf6c960089030000000000000ba596008a0300000000000045dd96008b03000000000000a3e696008c03000000000000801597008d03000000000000bc4d97008e03000000000000f78597008f030000000000002ebe9700900300000000000030f6970091030000000000005a2e98009203000000000000956698009303000000000000d49e9800940300000000000014d7980095030000000000003b0f990096030000000000006c4799009703000000000000ac7f9900980300000000000078b79900990300000000000026ca99009a030000000000007cef99009b0300000000000085279a009c03000000000000be5f9a009d03000000000000fd979a009e03000000000000b9aa9a009f0300000000000022d09a00a0030000000000003dec9a00a10300000000000058089b00a20300000000000074249b00a3030000000000008b409b00a403000000000000e4499b00a50300000000000038789b00a60300000000000076819b00a703000000000000e4af9b00a803000000000000b7e79b00a903000000000000731f9c00aa03000000000000a6289c00ab030000000000002f3b9c00ac0300000000000012579c00ad030000000000005d609c00ae03000000000000cb8e9c00af0300000000000057a19c00b00300000000000086c69c00b1030000000000005afe9c00b20300000000000002369d00b303000000000000bc6d9d00b40300000000000099a59d00b5030000000000004edd9d00b603000000000000db149e00b703000000000000e0399e00b803000000000000724c9e00b9030000000000002a849e00ba03000000000000ee9f9e00bb03000000000000d1bb9e00bc030000000000007df39e00bd03000000000000f02a9f00be030000000000006a629f00bf03000000000000ff999f00c0030000000000002ed19f00c1030000000000004608a000c203000000000000893fa000c303000000000000a476a000c403000000000000dfada000c5030000000000001cb7a000c6030000000000003ce5a000c703000000000000921ca100c8030000000000008c53a100c903000000000000988aa100ca0300000000000010a6a100cb03000000000000a0c1a100cc03000000000000e5d3a100cd0300000000000072f8a100ce030000000000007c2fa200cf030000000000003766a200d003000000000000389da200d10300000000000056a6a200d203000000000000a9b8a200d303000000000000cac1a200d4030000000000001ad4a200d503000000000000200ba300d6030000000000002714a300d703000000000000bc41a300d8030000000000006778a300d9030000000000000aafa300da0300000000000046dca300db0300000000000065e5a300dc03000000000000a81ba400dd03000000000000d72da400de030000000000002352a400df030000000000006288a400e003000000000000c1bea400e103000000000000f8f4a400e203000000000000212ba500e3030000000000003f61a500e403000000000000656aa500e503000000000000e497a500e60300000000000040cea500e703000000000000b204a600e803000000000000fc3aa600e9030000000000009471a600ea0300000000000037a8a600eb030000000000001adfa600ec03000000000000ea0ca700ed030000000000000e16a700ee030000000000005228a700ef030000000000007d31a700f003000000000000034da700f1030000000000002084a700f2030000000000004a8da700f303000000000000a99fa700f403000000000000f6baa700f503000000000000c1f1a700f603000000000000be28a800f703000000000000a65fa800f8030000000000003e7ba800f903000000000000c296a800fa03000000000000c3cda800fb03000000000000d504a900fc03000000000000f83ba900fd030000000000005f73a900fe03000000000000ceaaa900ff030000000000000bb4a900000400000000000005e2a90001040000000000005e19aa000204000000000000c12baa0003040000000000008e50aa000404000000000000fd62aa0005040000000000008175aa000604000000000000fa87aa0007040000000000002f91aa0008040000000000005dbfaa000904000000000000a3c8aa000a04000000000000e5f6aa000b04000000000000e41bab000c040000000000005b2eab000d04000000000000e765ab000e040000000000004c9dab000f0400000000000085a6ab001004000000000000b8d4ab001104000000000000fdddab0012040000000000003b0cac001304000000000000d043ac001404000000000000827bac001504000000000000b8a0ac0016040000000000005bb3ac00170400000000000029ebac0018040000000000006af4ac0019040000000000000e07ad001a04000000000000f422ad001b04000000000000432cad001c040000000000009935ad001d04000000000000ee3ead001e04000000000000d55aad001f04000000000000bd76ad002004000000000000a592ad00210400000000000076caad002204000000000000f6dcad002304000000000000e001ae0024040000000000004f39ae0025040000000000001371ae0026040000000000005f7aae002704000000000000fc8cae002804000000000000cda8ae0029040000000000005ebbae002a0400000000000081e0ae002b040000000000004f18af002c040000000000001e50af002d04000000000000e687af002e04000000000000a0bfaf002f040000000000005ff7af003004000000000000042fb0003104000000000000da66b00032040000000000009a9eb000330400000000000063d6b0003404000000000000300eb1003504000000000000da45b10036040000000000009a7db100370400000000000050b5b100380400000000000029edb1003904000000000000971bb2003a04000000000000e024b2003b04000000000000995cb2003c040000000000006694b2003d0400000000000048b0b2003e040000000000002eccb2003f0400000000000075d5b200400400000000000008e8b2004104000000000000e703b3004204000000000000ce1fb3004304000000000000b63bb30044040000000000000d45b30045040000000000009f57b30046040000000000007573b3004704000000000000c67cb30048040000000000003aabb3004904000000000000e4e2b3004a04000000000000651ab4004b04000000000000f951b4004c040000000000009389b4004d0400000000000025c1b4004e04000000000000f6f8b4004f04000000000000241eb5005004000000000000b130b50051040000000000007068b500520400000000000040a0b5005304000000000000ecd7b50054040000000000000510b60055040000000000003e48b60056040000000000007a80b6005704000000000000b7b8b6005804000000000000f3f0b60059040000000000002f29b7005a04000000000000ae4eb7005b040000000000006861b7005c04000000000000a599b7005d04000000000000ded1b7005e040000000000005cf7b7005f04000000000000160ab80060040000000000005042b8006104000000000000964bb8006204000000000000687ab8006304000000000000a6b2b800640400000000000066c5b8006504000000000000e5eab80066040000000000000423b90067040000000000003f5bb90068040000000000005d77b90069040000000000007b93b9006a04000000000000b7cbb9006b04000000000000ef03ba006c04000000000000133cba006d040000000000003358ba006e040000000000005174ba006f0400000000000042acba0070040000000000006ce4ba007104000000000000a21cbb007204000000000000e054bb007304000000000000405ebb0074040000000000001b8dbb0075040000000000002ec5bb0076040000000000006dfdbb007704000000000000a435bc007804000000000000d06dbc0079040000000000000ca6bc007a040000000000004adebc007b040000000000008716bd007c04000000000000c34ebd007d04000000000000fc86bd007e040000000000003bbfbd007f040000000000007af7bd008004000000000000d500be008104000000000000b32fbe008204000000000000ea67be00830400000000000027a0be00840400000000000065d8be008504000000000000a410bf008604000000000000dd48bf0087040000000000003b52bf0088040000000000001881bf0089040000000000008fb8bf008a04000000000000cbc1bf008b04000000000000f8efbf008c040000000000007602c0008d040000000000008327c0008e04000000000000075fc0008f040000000000005d96c000900400000000000009cec00091040000000000003b06c10092040000000000002d3ec10093040000000000006476c10094040000000000007aaec1009504000000000000b9e6c1009604000000000000ef1ec20097040000000000002c57c2009804000000000000698fc20099040000000000008cc7c2009a040000000000009effc2009b04000000000000da37c3009c04000000000000ee6fc3009d0400000000000029a8c3009e0400000000000067e0c3009f04000000000000240fc400a0040000000000008218c400a104000000000000b150c400a204000000000000c088c400a304000000000000d2c0c400a404000000000000f6f8c400a5040000000000001231c500a604000000000000d143c500a7040000000000004d69c500a80400000000000089a1c500a904000000000000c4d9c500aa040000000000000112c600ab040000000000005c1bc600ac040000000000003a4ac600ad040000000000007482c600ae04000000000000abbac600af04000000000000e4f2c600b0040000000000001d2bc700b1040000000000002e47c700b2040000000000004863c700b304000000000000687fc700b404000000000000829bc700b5040000000000009bd3c700b604000000000000d80bc800b7040000000000001144c800b804000000000000704dc800b904000000000000d056c800ba040000000000004e7cc800bb0400000000000080b4c800bc04000000000000b1ecc800bd040000000000009808c900be040000000000008d24c900bf04000000000000c75cc900c004000000000000df94c900c104000000000000feb0c900c2040000000000001dcdc900c3040000000000004605ca00c4040000000000006e3dca00c5040000000000009e75ca00c604000000000000029bca00c704000000000000aeadca00c8040000000000008adcca00c904000000000000eae5ca00ca04000000000000251ecb00cb04000000000000fa55cb00cc04000000000000778ccb00cd04000000000000eec3cb00ce0400000000000005fccb00cf040000000000004134cc00d004000000000000716ccc00d10400000000000096a4cc00d204000000000000d3dccc00d30400000000000086efcc00d4040000000000000215cd00d504000000000000ac27cd00d604000000000000264dcd00d7040000000000008656cd00d8040000000000006385cd00d9040000000000003bb4cd00da0400000000000099bdcd00db04000000000000d8f5cd00dc04000000000000172ece00dd040000000000005366ce00de04000000000000909ece00df04000000000000b7d6ce00e00400000000000068e9ce00e104000000000000cc0ecf00e2040000000000000547cf00e304000000000000427fcf00e40400000000000079b7cf00e504000000000000b8efcf00e604000000000000f427d000e7040000000000000b60d000e8040000000000004698d000e90400000000000083d0d000ea04000000000000c008d100eb04000000000000fa40d100ec040000000000003679d100ed0400000000000073b1d100ee0400000000000087cdd100ef04000000000000a6e9d100f004000000000000e521d200f1040000000000001e5ad200f2040000000000005692d200f30400000000000092cad200f40400000000000052ddd200f504000000000000ce02d300f604000000000000e13ad300f7040000000000003444d300f804000000000000dc56d300f904000000000000ef72d300fa040000000000004d7cd300fb0400000000000024abd300fc04000000000000a1d0d300fd040000000000005be3d300fe04000000000000901bd400ff04000000000000ce53d40000050000000000000a8cd40001050000000000003ac4d40002050000000000004ae0d400030500000000000069fcd4000405000000000000a134d50005050000000000006047d5000605000000000000de6cd50007050000000000001ba5d500080500000000000058ddd50009050000000000009415d6000a05000000000000d24dd6000b05000000000000f085d6000c050000000000001ebed6000d05000000000000fbecd6000e050000000000005bf6d6000f050000000000008b2ed7001005000000000000c566d7001105000000000000029fd700120500000000000036d7d70013050000000000006f0fd80014050000000000009f47d8001505000000000000c97fd8001605000000000000e4b7d80017050000000000001ff0d80018050000000000005928d90019050000000000009560d9001a050000000000005473d9001b05000000000000718fd9001c05000000000000d198d9001d0500000000000031a2d9001e050000000000000fd1d9001f05000000000000cfe3d90020050000000000004f09da0021050000000000008941da002205000000000000b979da002305000000000000edb1da00240500000000000047bbda00250500000000000054d7da00260500000000000007eada00270500000000000067f3da0028050000000000003a22db0029050000000000005e5adb002a050000000000007892db002b05000000000000b0cadb002c05000000000000e702dc002d05000000000000183bdc002e050000000000007644dc002f050000000000002773dc003005000000000000dd85dc0031050000000000004dabdc00320500000000000086e3dc003305000000000000bb1bdd003405000000000000944add003505000000000000f453dd003605000000000000ad66dd003705000000000000298cdd00380500000000000060c4dd0039050000000000009cfcdd003a05000000000000fa05de003b05000000000000d734de003c05000000000000b56cde003d0500000000000045a4de003e05000000000000a1d2de003f05000000000000e4dbde0040050000000000002fe5de0041050000000000003c05df004205000000000000d81adf004305000000000000d636df0044050000000000002840df004505000000000000d252df004605000000000000cf6edf004705000000000000a9a6df004805000000000000eeafdf00490500000000000047b9df004a05000000000000b1dedf004b050000000000000de8df004c050000000000006e0de0004d05000000000000cb16e0004e05000000000000d84ee0004f050000000000007886e0005005000000000000b3bee0005105000000000000c3f6e0005205000000000000fe2ee10053050000000000002c67e1005405000000000000e679e1005505000000000000a68ce1005605000000000000629fe10057050000000000009bd7e10058050000000000005806e2005905000000000000b10fe2005a05000000000000e647e2005b050000000000001880e2005c050000000000007689e2005d050000000000004cb8e2005e050000000000007ef0e2005f05000000000000b228e3006005000000000000e760e30061050000000000002499e300620500000000000060d1e30063050000000000009c09e4006405000000000000d441e4006505000000000000334be40066050000000000000a7ae4006705000000000000e0a8e400680500000000000040b2e40069050000000000006feae4006a05000000000000a022e5006b05000000000000de5ae5006c050000000000001a93e5006d0500000000000055cbe5006e050000000000000bdee5006f050000000000008203e6007005000000000000db0ce6007105000000000000b53be6007205000000000000f073e60073050000000000004e7de60074050000000000002cace60075050000000000008cb5e60076050000000000006be4e6007705000000000000a51ce7007805000000000000dc54e7007905000000000000168de7007a050000000000004ac5e7007b0500000000000057fde7007c050000000000009335e8007d05000000000000d06de8007e050000000000002e77e8007f0500000000000004a6e80080050000000000003fdee80081050000000000007b16e9008205000000000000b74ee9008305000000000000e886e900840500000000000015bfe900850500000000000046f7e9008605000000000000602fea0087050000000000000442ea0088050000000000005a4bea0089050000000000006a67ea008a05000000000000889fea008b05000000000000daa8ea008c0500000000000079d7ea008d050000000000009f0feb008e050000000000005c22eb008f050000000000001c35eb009005000000000000d847eb0091050000000000000e80eb0092050000000000003eb8eb00930500000000000076f0eb009405000000000000ad28ec009505000000000000e660ec0096050000000000002399ec00970500000000000060d1ec0098050000000000009e09ed0099050000000000005e1ced009a05000000000000da41ed009b050000000000009654ed009c050000000000005567ed009d05000000000000127aed009e050000000000004ab2ed009f0500000000000082eaed00a005000000000000e1f3ed00a105000000000000bd22ee00a205000000000000fa5aee00a3050000000000003493ee00a405000000000000929cee00a50500000000000070cbee00a605000000000000ac03ef00a705000000000000eb3bef00a805000000000000fb73ef00a905000000000000feabef00aa05000000000000bebeef00ab0500000000000038e4ef00ac050000000000004e1cf000ad050000000000008854f000ae05000000000000958cf000af05000000000000c5c4f000b005000000000000fffcf000b1050000000000002e35f100b205000000000000de47f100b305000000000000466df100b4050000000000005da5f100b50500000000000094ddf100b605000000000000c115f200b705000000000000fa4df200b8050000000000002d86f200b90500000000000067bef200ba05000000000000a0f6f200bb05000000000000b52ef300bc050000000000003254f300bd05000000000000ef66f300be05000000000000239ff300bf0500000000000032d7f300c005000000000000dde9f300c1050000000000001e0ff400c2050000000000004f47f400c3050000000000008d7ff400c4050000000000006bb7f400c5050000000000009beff400c605000000000000c927f500c705000000000000ff5ff500c8050000000000003198f500c90500000000000063d0f500ca050000000000008908f600cb05000000000000c240f600cc050000000000001d66f600cd05000000000000ca78f600ce05000000000000fbb0f600cf0500000000000031e9f600d0050000000000006021f700d1050000000000009e59f700d205000000000000d891f700d3050000000000000acaf700d4050000000000004402f800d5050000000000007b3af800d605000000000000fa5ff800d705000000000000b672f800d805000000000000ebaaf800d90500000000000048b4f800da0500000000000024e3f800db05000000000000601bf900dc050000000000009753f900dd05000000000000ac8bf900de05000000000000e3c3f900df050000000000001cfcf900e0050000000000005934fa00e105000000000000936cfa00e205000000000000a7a4fa00e305000000000000dfdcfa00e4050000000000001a15fb00e5050000000000004d4dfb00e605000000000000a656fb00e7050000000000007b85fb00e805000000000000a2bdfb00e905000000000000dff5fb00ea050000000000005f1bfc00eb050000000000001e2efc00ec050000000000005266fc00ed050000000000000c79fc00ee05000000000000cc8bfc00ef050000000000002995fc00f005000000000000899efc00f105000000000000c1d6fc00f2050000000000007ee9fc00f3050000000000003dfcfc00f405000000000000f00efd00f5050000000000004c18fd00f6050000000000001a47fd00f7050000000000004a7ffd00f80500000000000086b7fd00f905000000000000beeffd00fa050000000000001ef9fd00fb05000000000000ee27fe00fc050000000000000944fe00fd050000000000002560fe00fe05000000000000307cfe00ff050000000000002798fe000006000000000000e2aafe00010600000000000042b4fe0002060000000000005dd0fe0003060000000000009a08ff000406000000000000ca40ff000506000000000000244aff000606000000000000f278ff0007060000000000002db1ff00080600000000000063e9ff000906000000000000712100010a06000000000000313400010b060000000000004c5000010c06000000000000ac5900010d06000000000000b49100010e06000000000000e3c900010f06000000000000f60101011006000000000000103a010111060000000000003056010112060000000000004c720101130600000000000084aa01011406000000000000c2e201011506000000000000fe1a02011606000000000000235302011706000000000000618b020118060000000000009dc3020119060000000000005ad602011a06000000000000badf02011b06000000000000d7fb02011c06000000000000370503011d06000000000000f71703011e06000000000000133403011f06000000000000516c03012006000000000000107f030121060000000000008da403012206000000000000cadc03012306000000000000f81404012406000000000000324d0401250600000000000070850401260600000000000080bd040127060000000000008bf504012806000000000000842d05012906000000000000d73605012a060000000000008b6505012b06000000000000c19d05012c06000000000000f9d505012d060000000000002e0e06012e06000000000000664606012f060000000000009d7e06013006000000000000d7b60601310600000000000011ef06013206000000000000442707013306000000000000725f07013406000000000000af9707013506000000000000e7cf070136060000000000001f0808013706000000000000372408013806000000000000544008013906000000000000917808013a06000000000000c8b008013b0600000000000001e908013c060000000000000f2109013d06000000000000085909013e06000000000000a99009013f06000000000000b5c809014006000000000000c5000a014106000000000000d2380a01420600000000000006710a014306000000000000f5a80a0144060000000000002be10a01450600000000000012190b01460600000000000048510b01470600000000000086890b014806000000000000e5920b014906000000000000c4c10b014a0600000000000000fa0b014b060000000000001d320c014c060000000000000b6a0c014d06000000000000c5980c014e060000000000001aa20c014f06000000000000d7d00c0150060000000000002dda0c01510600000000000069120d015206000000000000a44a0d015306000000000000df820d0154060000000000001dbb0d01550600000000000055f30d015606000000000000852b0e01570600000000000083630e015806000000000000c39b0e0159060000000000001ba50e015a060000000000007bae0e015b06000000000000f7d30e015c06000000000000afe60e015d06000000000000290c0f015e0600000000000065440f015f06000000000000db690f016006000000000000977c0f016106000000000000d2b40f016206000000000000ecec0f016306000000000000062510016406000000000000ea5c10016506000000000000f49410016606000000000000ffcc100167060000000000005ed610016806000000000000d6fb10016906000000000000340511016a06000000000000613d11016b060000000000008b7511016c06000000000000919111016d06000000000000abad11016e06000000000000e0e511016f060000000000001d1e120170060000000000005556120171060000000000006c8e120172060000000000008aaa12017306000000000000a3c612017406000000000000bdfe12017506000000000000f83613017606000000000000126f130177060000000000006c9413017806000000000000c99d1301790600000000000029a713017a060000000000005bdf13017b06000000000000b8e813017c0600000000000016f213017d060000000000008d1714017e06000000000000ec2014017f06000000000000a43314018006000000000000bc4f14018106000000000000d58714018206000000000000919a1401830600000000000005c0140184060000000000005fc914018506000000000000f8f714018606000000000000a10a15018706000000000000fa1315018806000000000000561d15018906000000000000fa2f15018a06000000000000513915018b06000000000000aa4215018c06000000000000106815018d060000000000002f8415018e060000000000004ba015018f060000000000002cbc15019006000000000000ccce1501910600000000000019d81501920600000000000076e115019306000000000000331016019406000000000000664816019506000000000000998016019606000000000000d5b81601970600000000000093cb16019806000000000000f3d4160199060000000000000ff116019a06000000000000cd0317019b06000000000000492917019c06000000000000a33217019d06000000000000444517019e060000000000003a6117019f06000000000000117d1701a0060000000000001c991701a10600000000000059d11701a2060000000000008c091801a306000000000000c2411801a4060000000000001e4b1801a50600000000000037671801a606000000000000f2791801a7060000000000001fb21801a806000000000000dec41801a90600000000000056ea1801aa0600000000000005fd1801ab0600000000000079221901ac06000000000000b25a1901ad06000000000000e5921901ae06000000000000f9ca1901af060000000000005df01901b00600000000000017031a01b1060000000000003a3b1a01b206000000000000e64d1a01b30600000000000044731a01b406000000000000a37c1a01b50600000000000078ab1a01b6060000000000006ee31a01b706000000000000921b1b01b806000000000000be531b01b9060000000000001d5d1b01ba06000000000000ec8b1b01bb0600000000000009c41b01bc06000000000000e5fb1b01bd06000000000000f1331c01be06000000000000ef6b1c01bf06000000000000a39a1c01c006000000000000fba31c01c106000000000000f2db1c01c206000000000000f8131d01c306000000000000df4b1d01c40600000000000075831d01c506000000000000aaa81d01c6060000000000003bbb1d01c7060000000000002fd71d01c80600000000000017f31d01c90600000000000067fc1d01ca06000000000000ad211e01cb06000000000000fb2a1e01cc0600000000000052341e01cd06000000000000da621e01ce06000000000000c87e1e01cf06000000000000b09a1e01d00600000000000089d21e01d1060000000000000fe51e01d2060000000000005fee1e01d3060000000000003b0a1f01d406000000000000f8411f01d50600000000000098541f01d606000000000000ac5d1f01d70600000000000094791f01d8060000000000006eb11f01d90600000000000038e91f01da060000000000000b212001db06000000000000e6582001dc06000000000000c8902001dd0600000000000062a32001de060000000000007ac82001df060000000000001cdb2001e0060000000000005d002101e10600000000000021382101e206000000000000f76f2101e3060000000000003d792101e406000000000000cea72101e50600000000000095df2101e6060000000000006e172201e706000000000000334f2201e80600000000000085582201e90600000000000010872201ea06000000000000eea22201eb06000000000000cbbe2201ec06000000000000a9da2201ed060000000000009ef62201ee060000000000003d092301ef06000000000000782e2301f0060000000000000c412301f1060000000000005e4a2301f20600000000000045662301f3060000000000003b822301f406000000000000299e2301f506000000000000fed52301f606000000000000990d2401f7060000000000002c202401f806000000000000173c2401f90600000000000063452401fa06000000000000fd572401fb060000000000002a7d2401fc0600000000000000b52401fd06000000000000b8ec2401fe0600000000000037242501ff06000000000000155c25010007000000000000e69325010107000000000000a6cb25010207000000000000630326010307000000000000b30c260104070000000000000916260105070000000000005b1f26010607000000000000523b260107070000000000004857260108070000000000002d732601090700000000000018ab26010a07000000000000fdc626010b07000000000000ede226010c070000000000008d1127010d07000000000000e31a27010e07000000000000cc5227010f07000000000000ac8a270110070000000000004b9d2701110700000000000090c22701120700000000000087fa27011307000000000000583228011407000000000000fe6928011507000000000000557328011607000000000000f4a128011707000000000000ced9280118070000000000007d1129011907000000000000414929011a070000000000001a8129011b07000000000000deb829011c07000000000000bff029011d07000000000000a8282a011e070000000000008b602a011f07000000000000dc692a0120070000000000002d732a0121070000000000007a7c2a012207000000000000198f2a01230700000000000069982a01240700000000000003ab2a0125070000000000004ab42a0126070000000000009ebd2a01270700000000000041d02a012807000000000000e7e22a01290700000000000089f52a012a0700000000000023082b012b07000000000000cb1a2b012c0700000000000018242b012d070000000000006b2d2b012e07000000000000ba362b012f070000000000000e402b013007000000000000af522b013107000000000000035c2b0132070000000000004c652b0133070000000000009b6e2b013407000000000000e4772b013507000000000000abaf2b013607000000000000f8b82b01370700000000000052c22b013807000000000000f0d42b0139070000000000008de72b013a0700000000000081032c013b070000000000005e1f2c013c070000000000004a3b2c013d0700000000000037572c013e070000000000000a8f2c013f070000000000005e982c014007000000000000eeaa2c0141070000000000007fbd2c014207000000000000d2c62c014307000000000000b6fe2c0144070000000000008f362d014507000000000000426e2d014607000000000000d9a52d014707000000000000a0dd2d0148070000000000003df02d0149070000000000004f152e014a07000000000000971e2e014b07000000000000e2272e014c0700000000000035312e014d07000000000000cb432e014e07000000000000174d2e014f07000000000000a57b2e015007000000000000f8842e015107000000000000e0bc2e015207000000000000bdf42e0153070000000000009d2c2f015407000000000000e9352f015507000000000000353f2f015607000000000000cf512f0157070000000000006e642f0158070000000000001b772f015907000000000000659c2f015a070000000000005bd42f015b0700000000000001e72f015c07000000000000470c30015d07000000000000464430015e07000000000000904d30015f07000000000000e456300160070000000000003b6030016107000000000000327c30016207000000000000d68e300163070000000000002d983001640700000000000032b430016507000000000000faeb30016607000000000000f12331016707000000000000c65b310168070000000000001c6531016907000000000000bb9331016a0700000000000002b931016b07000000000000a4cb31016c07000000000000870332016d07000000000000721f32016e070000000000006b3b32016f07000000000000675732017007000000000000647332017107000000000000ab7c3201720700000000000042ab32017307000000000000eebd320174070000000000003be33201750700000000000088ec32017607000000000000281b330177070000000000003d5333017807000000000000df6533017907000000000000d28133017a07000000000000248b33017b0700000000000012c333017c07000000000000b4f133017d0700000000000007fb33017e07000000000000fb1634017f07000000000000e93234018007000000000000914534018107000000000000c26a34018207000000000000117434018307000000000000b98634018407000000000000ada23401850700000000000092da340186070000000000008d123501" }, "name": "Polkadot", "properties": { diff --git a/artifacts/polkadot_metadata_small.scale b/artifacts/polkadot_metadata_small.scale index 86f4d6732b0a3ec5b657a31fbd2f07b1348d5eef..1a58319a8ea91d88652ec42c68b47cd4eafdb3bf 100644 GIT binary patch delta 13614 zcmbW84R}=5na9t$bHNEDFo8)j3Hg{LlP{RSOfrEG5(tDqQV9eJ2rdwZU1qmp=Ma4>mDi&H$X`}^}RusCWN|h?Es3?fIWm^=wWmmeo?tAY$b5BCrefHUh zd2a6ezvrI&yYKnD=e)e}w&6E#8;osA$UXdu%(hz!<7LJSR>qhS|FJ;^77G&3Dm2-r zHZ}RfzR+}c$j!~n%*{T(uSqd+^KA7mEYN&Fyt-&$0%Tpb}WA zH1`!PEdl?%im$I^Zt=R82UB@|b!RBxo}n6ySupq8SSnnvPTKAnKE%RJVP{b(V^)|{ zS?IE{SZ?w818r`vjmr&)?r&ED?vTgtiz>D@w-2%Xfi5itv%w2|bZ$P64Ucy*p5Gqu z`&$}=o_m#u#PS&%Y-e_S?qFz;3Jpe93frVnu)|;)RnE&7C{5+lJj;5yz4J%j7H7tRk(8haMd~85#Yl7WjQkCQ@9BN#hn6 zHe@cI-#sJ=&pU@aoWQuFp{y)YhijV|H-`Mt>#m`$qyg8d&O!IkiF!U~hAz_2t74n~ z*F4{g&E%`$KVtXlcf1rgUq8q}q{P{ej?BNy#Ejh1s#OaUw@>r>n^w#Y zw=GiwShyZvv(jn87F1ls*e2O>hY}2XLq@E;J#sZ~=0@Y36*B9=>dj)S0|A*eGsc-J zV3mIaN|N%q36>^}N%#TQeFu92k593u@TzgQo$ZDMOHRVGyj*E6Dk*VJEGw%IFY|hu z7<(4}lvHrrK5UpWI{^RY$Tz&m4?<$`V(4&Y@Yi6wvzwoQ_@cG^0v?ybmqj-IM=%$6 z@)u#1#mnvRx#hR~B{-N|#b1T%$@NGvE#(&pFX8i#up{d8T`u-2S}yh)+)NqE^C5qf z2lMo&y7_x>CiNjaE>82{@i%GSp&xM5GQZ!;WH|&EQ&Zs1^odx$+tX+AkKtT;08`D% z=!89^ipMcWv@WZj<2~GLtZhbLa9dPI4>5DCdR1m`fg$yKMelIyKZQ#tS&JM?RJXl_ zy;2W*2fGck)@{6pwuOCw&S30gL}u&)T+5h+kFKz$@B^^W+J)zTu;%d3;cIK5rer}) zW-PbC{LIDrwGT4Che~!<6Dr@&%FwIR$*lFcpUajx?P^~tW6^HlMiUMm3O?O5&)=rV zY=c&+e}tNbVyJOg_@7~!<3T*e+bz&AZshQ5I2hQLc|t87#oHYG8di-f<7x2oafRFi z7sic=xyEB_rr*KXHK@xTgJsc`UC93mKgph*T*@uf#WMC+d`}bm8sG36_KgWLZAox@ zPUb?+?RQ{ziXD{K?{4OtW3QRou3M>*3yhbqbbCEo|KF%p+c?fk7epn^;aCbm&vKtT z6b>ly@LEn1=U}oYL#ZuU8pPqCJ$vXNti87xV>pZ9z->u9PD`-OHgZU`6~uF>T$c?0 zZ5x%Gz z#O2wHRl|4r&XF#89yUkzsu<*IRXwqe(}lTQT&d&m;(`>|m!E7Z#$<7| zrX<3JF>!P@1REgs$V_VEaItU{z}P(A0k4crLGQjlcCpk!kbkw0N(`&Xx;VohlVjI# z%z?8tTE^cLrtN_1r?mvH8-|uwtfK~D$do)ym*M6<~?i&hq)WfP(EQ)x(WLtzLSfx=Qs=+ zxw*v?2!;+pc*0n&9&;tO6Mo~Wga=%yd=Kn)7K}RNi$=MZ_km;VFc`;|#hLmv z_@gjqd@?%PGd|O7@6){JDIv^>9fg-m3ivVjyd*p07&=or&Kdr&yFbZY>?EEUu=H>$ zb}HJ4<60d=0=}3$VQ5Z zTRqL_7*D8cH#vn0Sx>$2v$b1L-}{XMS!f8OKz!1w4Qv8%9nVh+8> zM0$_w+M}OEecQO;X2~;pM3@(cbV|ttr)&r;Uh?;yg7N zUUrYt6jHm+#A>xI1%o*D(XfH#Gmq@ZnDKuYR~Uym6V5nh>LGcS^8sB%kUsDiJmlc8!xqS1nH zZ}c?RfqOWA1c-b=`~Ki z2I_0_aD3{lNyGDB&UE4VpJzG;Z&bm;@Kucq-l#RhgxWl7&#hoR{qu&kwTaN4n$&x} zcCW;D!sD}U&#?1`Cj4|)%F6U666s)Ly^7BSyv`NBOMR4y?ZH2?5zA#SJXBXO)+C-L zCe)lc>fD`E+wlV*r-0~1T$xzas`xg*#k#DdK5xfu%}TpJ=)old1}U>E`F?b;)6A&& zJ{F~SP{J9ur8hLYS{`vo1&QPAu=@8DXGbM%+I!zT8@A-#^PEGDNj#0KU+DP|zj7pe zIj>Bc^`<7WW9lu(C5AtB2$D`o>?Ga&*&TP8(PGkRiQx~g#&Miid-%8vN zV~8`v8`yPNu`mUGe&^TFw$K70PwtRG29BR=Znan1w{Su?)@#mE>->R`+gl{7>q}D9 zEY?gz)O2a495qWcb5PVAubG3R<^;{eB^}DSR5OiHbE0O(Fl$}6_F$(&6NaEbwo|i* z>Nb(Z>NcUp={B(q(`|wquG>Us(rv0|{`1o`48PM(rX3H0w42Cg?T+Ch9f; zCh0Z-T6CKLlUaAb45l&Dca;Ai^@; zCKpbM+T#hZT(=3ZLbnNUvThUL6x}AkO5H|4wf#@k1tOfL+vLJ3-6p{4x=n!9QF{Ub z&d_ZFoT=LcSfks;a<|&!)an8eeowc_g}3WA0nXBG0<6<*0-UYe1UM&Zml9yTZacfR zj%Kbd5aAuVO)i|L+XUF4+XOgYw+V28ZWG|0x=nx!b-SAg7e$4MM0l5OlMDYzw+V2u zZWG`V-6p`Lx=nzMx=nz0NA2#3MCgtR6Nzw{ZWCY=vqgGJ2N5<4fe;lT5MzrF2y(d) zh_aR0qW!OfI6Wc>f!-qo0$m{lBJ~P^P}_7NGOYN7K&XBpbQ5d4P>8id2*er?0-*+l zK&T-h5NcQmgt}4)gu04#N8K73VLJ6BMa0@A1VX)62!wi{5D0a(5D0aR5D0axE_4?W zYqzcx5$if35bJtfh>SJ&3xQA{5CWlY5CWlY6at|>D4ttPtlt+&h;@??2z9d%2=yT$ z5b73Ph>SWtLLk(wQK8%EBGzqD#pxo}hlN0_j|hQKw+n$#9~AegD+FSFP6&kh6Cn`lJ|Ph5eqD%+Nk0_=q5h17ZnxJt zfmjcSB*c192;|o1g+Qn;2!T*v6at|h5(1(ATnH*Ej{m*75*eOe5(2Rv76PIELI{NV zOCb>I5g`!jQ6UiO%bL)Q(|%_uvA!ab5bLW#Ah#aVg~&MdDH#g>LP;$3d*W6G@2mO(Bq5 z-x30$o)!Y3{$2=#`nC`V^&KHhr1{SoU5SiXe-Hw(zAFSmeNPC4dR7R8`o0hd^Au?cnAp}DGSAG6bR7|XY6iJBniV(=H|0V=N{gV&~_0K{e)T=@u z)Gvh)ng4yIE0GcFnh=Qfx)2EUFG3*He-{Fw{#6KsdP4|=`XBoIqsT?9|0$9X>(@dc zx8Br+$bj`XArR_+34u_*5dxups|(2`#QNX5QbMfX!5+^fT>L!m**M}o?udk$%xTeL zArfHAJ!w1{(pQX5zGhPcNwnolo@T(665P*L_erjSdqn~4yJvRZ0kO`_<0P{dcfxVK zL}o5r)XOyBk_XKdeEwCwhJf1_bT_H{u4;ZIaDK%uZiM^1<+!(ZenmEX zy)^%Qvq?l9NdU2_KkK=WaL3xAQs)cNkpi@+G2a2dUP;@TVy}7^%a)t3*hz^jPCI^YM~ptXwl4Ig@HS2eXU9W*P7IzBF5$-OBP)AjW^Hl_r{A1 z>MK9mZZbe~6ZUj{`6E7Y2XQf1+%9d!1Zi8ZA zZakF^L1ueVvbttGE4nNn47md#THrQ;w>>?@r0yT`SahLw#yskcZ3fn6(3a-D3k^!0 z7sB;Lqg=xs@@$Ul!qz!WO<~+B#J%_qNDJCBx(wVkuc=jO4ttg6D%=pk5-`m`kE$E& z9hA|ojs#re>+P5}lAdS}dD@glf0)+bjDe}NVVecsz(`ynT^C5lW&NiERaxPFH3%Pd z>z+jy%<8bhzqY5$DU57_S)2S`uNu6x2J1&;&Aloj)i&e0`(pCd5O74WTd-I0uQeD2s!1hpXd5po5x|qW_X76%)kyAwC!Zi z%FJ6!sCW6>mAX}jY?l*v*LAkHDctP z4=XUn?P=jT+~xB(23!5B8iQWH8qG&)rB6|smF7lwba_1Lq*LU#%2mTN<5d6P(l+`h zvV*VyE8J<-17{5EjDf-l)~-sS)n@6eeye4@0dK`6av57Mt)Hv6o-@Gqg51ROY7Q3- z41c))ZR+5c4eT=AyY$|8j3hAeQe3g8pp9T-i$5?(jl#%+z4w|UO{;;MwdPL^(1Cm2 zP2RBfKA{`9SsZC7v+rM_zeTQp{F&$yZ2?KMxDyav43e=G0VT))8zKz<^#t3LHufUXL`))4D8}=U!9zM z6Em-0*@D}`?G4y(V7GBQ#-%W3hc$ThTe_+~`If6MthQ?1Sn+*hrEkew_uV%(k;}-0 z@lg09XU51ZMuz%|OxU}|T^uL(9}z^E#^Vi4JxB={>7m|@n+;gn$symVG{*_vkX4Ki*_GFX4S?RBaF`^`(wBb`czU9%h zv-+ux%eq3MeZY-%YK(?yeLCL-egK;afh~cL)@NzaHHl!p zKLH2c(f5zX7#H{bHoSAnx;*%3?WhtHlX<09hedcxa95-isnrr^GEBl*6aKV*q(a7l zT)lfrcX3_x*)`EXngMUbruK7w^+4xWW5!rW)v{J;UhmGDRNL>Cx`DUU(Jks9++@Z+ zeJ-9!^JO+)BRhD1j@g8f#HCFbPpdXgr4fTuTRY&3`>VBxq{8X{xVYG&eotRA@aaqF z=}Vw~gCl;Y8i0~7IsrFq-(X4oJE0wJ6%kV_cv}MeZ9{&6r{9B=fe%vXL2Y1s&<@|* z_-3~q=PMnUPMf0Hu~kH-XdRTW3o{h+xixa%)N3%wEy-0$Hm;X9%WOTKN*iUiQ8rG; z_=>i+Kx2ErgTXGIl}d0{wGV5rdzlxy9~=eyA1vlu;rxT?ciOpaHrDD$lz|zyxZ5z+ z*QWMIHRx`vJ6qLk?QDBLE;aB{e+g`$w@~eXjo+VAu(O|Ub`12*4$K;B%`RBGsT6~W zDMZ?VyQ595jkpK9Jk)B3w>IVQyA99jL^Ia{#8+uytbJk|qG8UjZb^&lvlEOl zI*;{~j#T&3T^@Bv(c(W^6y+RT?8zy}!J@n@8%qOFy)~E51@G2Ez5|}z z>cA+iH@CX@nMb$PNh}uTY1NcZg&UtJde+1rnEN{e%yusqo zB8VwmB$x>?kH3N4<>|+3F^8llTJXbW?Guf>qW6<0hDb5|kC^sb&RR1hv4mUXRqj@wbF@_$yW|7C^3_W*O zwYme#l|CPr7$U1i-NhSv5)73lbv_=O8VQ-f!Kn9V<%VQK5B%k4F6mkiKE`v!{**+ z594=DA-w;K(R_O^|K%7SSIARw;?y1v1*c*SnRvvFj{f11t+(DfA4-pYV<^PvKFGuSf-1W*D{JS4Md}TL&yUd3*ua;qW;E`9GCDU<8KlbeKZ~H_a#`7LHbL<(M zdxwAZ`mIkm2Qz>Cb#6VATTfphrQP zoBBU__fCB9hZ48<9(^C%>@GO*LAQKJmQTRubJ=juxfFbnjprW0>i)^QGkO<)_<@wL zc|hLBw7f@2(EMowzu0^9(|FFW^uBq)%K35l^Tp>RoIwBJv-Ohc3?yC3kW6Qx^isNH ov%tbjX_CnTt1j8FaG$!=z<2guzw|uEJa%7BlLj5Azbv!=0jqZd761SM delta 13759 zcmbW84_s7by2s!5oP!QH=%5S?FyMfoAfN*d2#5+I3Y#D*TDB^U!%-#&24)6@(vVGC z|EE3GW}BsLw*9m6Qk%6|TDn_XR#vvTciqj(yLqp+ddt0aSNGoMJlxd`0rxD;__U4p&xT5A^H$s0)L9G=eIy{%rw|L zw2n8z*I3X^Fx_OwdrM52c(2#A5K^lW;k1&A1xH1#!QXXJP22=$qGsZ6#*i}nT{>hb z_rYtUYIr+z#+0J+Tudsrz=@c7cs+VpB3@4(cDL2UosDH>;rCqIjAS8yhCbjH|)xAI6no&F+u$EA_i~jhw7sf70)I?5HAL4~?qjA&5=Px!KH2 z+}5JKNHfoy;q!Y|)pxcoR|ELcylu^Dml<2@q(a8JnCP@?72A9@*y#(Ilt$jARP$zT zGRrs{;XrH8aK;TMs|1PlojPjFdr+b+lpz-k^7-36{ls?St-ThPRHaEk|iMd0!VV7~Top3}>o4Nr#;KW`U-`?U5s+)LxgZL}j`f9Z;w1F$tjN3x~ zcCRP6joU=eYQzq8FXph5JphwzIs74*UY1;AYv^3=^Lm7PAK>L`b74_YL1|f8MBR%w zOb{a{)=&?5-_y_i1 z@K@odsS|i6{3g|FIf7$R7dwXIM7(%u3^u1vnrL!HdWLxEyo<-1YMT{o9GMXvUn`5R z6?YYO1pXua2N}n>toD38{QqW zM87vT^9QIrnCU^~Z<(X9W9+j!U|Lqs(66vYW_AI#kINMeU|c@`3jQ>%K6fU!(J0B- zC9`e0H?&&y#QOs{D_G_Pmpg@1zh!JFyTrbOjvO0|$VuYg!sU((iCsk@w<^-9ICd1d zLZoL=+-wiFH+lR4)gBCJjUaP@cV(M9)EU6qD~$87yNg{*8H!J{*>Pes?qf4%@7~os93eJuEX`zS`~cYV%2x*72{x(QG@9 zhCgH{M#mwi6w8?vZgJ+qdwD~nBQ;2Zto-pj70ViH?$?r&z>*)&(@}Q)L%=L8v$ygc zJO>KOlVEplCbzl3r0iv(%`XQgm?LV>k_D+`44in#IcRIS_!=V+;tgX6Zbyc&g>yjFvdCL~$S z%*M+*+t;`Q%}uRpFzCh!F&~^0#_>|PX+kcqgbfq2@TsRJc?mBI_Mbh@#jvF!(PGZr=#&(Y3sbnNCI6r>$i3Rt(n)!| zRlBMyw96{z@Ihh92weNrwrMY2VP4dhPD)E;tOIjX%&q)tG-sV6XB4`%XKM<^aW}LV zBx7ILTCgN~ow(c0S+92Yy|JS#7jSi!iQQp^SM@aq<2YOzTgI0{E_R%CuycVOI>(KO zxxmdeGv_n5kwb0cBuE%*lX^K!9DA3vnS;lc%@4sg+dBDG{xa;aErFJ#boo>MqIUgN zl0*J7e7!O`Q^G8^C3k_w zISKFOOiqt?@RCK5PPsr0;i82dhv~)R$Cz<&=KHuYK=1<`^T_t-E$b+3D^AYX$2q2C zJQF8d8c7cDeory>HfCpqt*(@`zni6r$FJ}Pf}!JZ%r$|F-?0)q5gvMm!==f?$npFn zTq+%d)XS!f8A@&c6s#|Ej2Jj*orY;;Ihm($z|yC=egoDS&1)z5Y0l2VD`i=WA5s?a zlh}cUV&TpJuE3j{+O*Y)BfN%o;8MITP4UX{}g?GaMArFb{XPI65-wwYn+*z>Szy+dXF)a8wbcMlUBIVhz*AF219)%hXdEQIp4tl1v~>7Oc@w`1H%=Wr@&xC3 zdRrC^ISy`~mcviMhG`i*3VuGVB*}`MM=@cQlkh@9D;57nNh}>MPn(Q0Z_f0JaamIT zYGx0rX0}$%9O#&y038)$lKXw7xLVy^O)7r*dE0_sPZm5|k&2VcyA}3?EQy!Uildx9 zY0#hfQutGB4rEj&!jGrhbNl6mpI%)}%f({3zla}bP1>hWKD;-5tW*@q!s-$oJp46> z4eq+HIZ}+TInBoTOVpvXaw4A!?^KShjkNgqH34r(4O^@dT_l^dL8n@CU!`PbwZeaB z)=7%F%D+Y|qfk;b9p@X<3|~oP+HwZlRZr7u{G7%0mM(f*+kMxI7I(WhSO?F{aOiWM zD;UDrERv8u_1MBbd)0>$UkuOBDud@{CBdRu3AGlizscKNiH@FwPOH^AEzS}+9^2fl z;>)`Kce*{Gx`Y0<;9`l}apfW|8FPzDErm;%W7Mq7=%o@(>~6@PJ+q)vitGk(3$6*M zsG0bsBDMwoUTN^?>}trI9S?tk9A5)D6tE5kMl?p}#)hCf#)KwWK0bZ;1aBXrajy1K3>@A`*X?GjmS zm)L#btS0i^eZQ@JO_KLWG*LZ0r+Bo3H+pcNKrJiNyBkd%-0V}^%=gr};`WJr%xpjY zQA{RDRw+~;Dgz65(7X`#s_OkeM0w+iueS%|;YDiac#dBQf zXuho}hb6R62np?z+CcUBeB3mFp$iK52`F8#NLyf}@>6{^jZIR_X^}LGvojK`otO+C zEfRCA3CA;}YjTIo5Orf7KLdp~=FyIfCxuL>_P&J z*KGo{>NWu;=r#c+>NWw|bejN^SWmddg+!RFCm_NU-6lZ0ZWCZ?#GXWeX}V2-qjj4A z9lA|`={>qYgc-U`gkyA@05f%)0JC(P0LSV!0gj8Gb5D4`)Lm<@K4S`VC z8UmrNGXz4tLl=4qiM2;p3W;^SArNb?E`;Zr9~lCn-f0Mgy1@_#b)z8=>Rm>;lZf@l zMiOG(WC(=1*$@bIiy;u|R$U0sI@=6^P`5{fo&p!K?uaM_E@Hjg5QufBArR^=Lm#J+z<%$ z2}2;%Cv_n_Cp~2dg!(iIJ#JsYWMX~BNJ6X!41wJGtRWEUbA~{u&l>`v9yA0({TD+J zs5t-i=}LHddchEg^+iJ<)L$3^p}u4YgnGyj2=!${Akdxk)$?;8T4eqactwEj7%E8!XI zLqj0ej|_oOKQ;tHJ!J@l`iUVB>TeB!P(MY1zP}0!i1oCQgjj!P2;|m()rIhc^?O4g z)H8-asDCg7Lj9v5xM=%TwiN_fV)WC+B1*$@czKMjFU zzcBR|x%GQp2v1o5Z3u+=S3@AwtA;?R*L1;N zM67?)l_FyOAF=a#CNnY%(eezwZE z=i|66U6H<*u1QgHv>YqP$t(%B-I@vstLn2i_d6coaZJw-CFS=hF!&A+CtG2m_sx;^5&SY$I5 zi!&k=)?$Q0DHf@PD6AD9QWT<4N@Z3GZuS(RDq zfLEA`XG+%{E~KL4@&69W`JF)W4c73%lf&cp`9zFTE55Pt9(z?-s%^%7_Rax$cMNVG z9q@DjBbS0BV#3?gY#kL-)nP^S#T_$75qh488fo%((gxqN9hKVoXc6w?jtivWnZ&F> zmDEd*{BLqhpM7SO;IVXYvk+?Xbse6preZ*=9=I8=N9-r^~+u9dTyd z=FDq%iFmfP#Akz&iJ2U^egl|L==KNnd zVi$Z;cxAuL4#?V;>aNx4*KMi3zB=D?P$W7avlq3hTRGY<3kmJR*Yzwb$DW1v6)goj zI>0w4aX1`S2<=f!-?&R>M?g>%!+cIt# zi)XrJd)Yi)ES(3#_jQS zHml9J-TghD`G)(RI4V3RUXI!9=4WMgUbqN_i&WBQYbQvTBbN%~ts4)I-aZE_`RCh{ z7l!K~v62NLH-?Gf`QvIFC%Y6p+|gphWY&Nunw}Qbv&!4H67SThtr(rCu<&V>!b%!e zufQbjjo4MOre26ChMj8@ao~GmtpiWFq$@JJMsK<4_Ax!* zQNGcrSu3|%q#w!WUSY_bwueURifW;}6 zIqiPmDtEI#)YKk;W%?et zhkH_%gj=CFCT;hx)?!@4j9fd1_4u3Bfodm)&ji#~x3>-3P9*J|0cz9o?vRQd%C%k$ zxQo`OCF}mcvnHn&f#YpkF2V$IV8{B~k|NoZ2UI*V4`64Yfx8;gdo%FxcV=%cp02j{ z7Gp5a&wDeax=1yK!(De~VV{fVC7wvsP7{XrwYcH+JF9W(kJ^x*^^fbw<_YK5DQuyU zVRR3k`Qs8P4|`@1!;dk#F<1)|dlnWh9^mAKgPpvPoV-+Ix)0-g6sRbUhpih@R-k3- zKT0jdHY0jOWoM|xkLSeQVvZHZp?@cmL>*A9dvLLCD%PtNchAP`jMf29cn3e>g*6*b z!m^E{VdY)J9S&TObYLQF@#QeqBOR3QI(X`?lHt9gQtK49QT%nl*}GhPBP9Gdt;fML z>#>o9N8)%q^KQjB%1lwa8hjDh&9~ztim6xGtgu~3W~}{?n0r^{+;g-!gIQnhboMnw9&vS?0 ztyc|-bh994%NTfR%MGw+OEQM&Ox!xUwuIZYz)TS+__hY%IeqyTP%gV zxF}vRAZnkT*0WE|5b*(y0a5enA54%z#>)9$bslREx8EF+*U) zHtQ%6AK>ze$x%%7BJVRWdE3~s{&}Ap)IL&iL2`YZvj|T?H=T#s+s9)>USNAZMvd*= z?&JsI1V$amHGCu zP58TRee4w3sj6? z4qTSHDl~NghQBPL=$9*!xkS?%yTZ!%7*kux-BQ)! z4y;uBeTiaFtqAXole?1S3X52oo9*Es8w|jC>FIJgOYVZdJnfP$bV1%TTa_GH*>=x? z1UUK3c*&d(*Pi*D?}N_{yo>Maz_Wl+jFr!oVeIGH=X^0)vi9#x>g0LwpU+*4UnrYG zU8!=m7LBCMQO>1(-#lL-iL8tIZpCoJy?q7T`?C-GI1a5Jy>J}kX0x$p;?ycWnm5b4 z`kr{PfMe+G?|v~JBTAxP%H^?EZpZamdne9O*fORba-+i^Ikf%yM=PQH<*Txl?|~_= z9KvDi+gDbibrzQWavlCX41f6LUi|#2gx*)n_)&QE)n>_j8Zr()HiAn=NMbbaf>Vco z#!o}{Yj0d%!Wp>X^+UMsR*uxjIN`$FBUQM%ha<=26W9%IKKg_lE6stkzaAy0Dp`>7 z#t8&H|Hgw@`eL~2&H4NqoPM(d*Y`IZ1O7ey@mM1U$GVOOt#9-4Rcdz=ZXjULmi7;E zyh>JI-I){#4t$gq=Ws@b*=`KI+s9k`V&9Tvj1028Q;c7fv)`F3?~|6m*Y70C-}7D2 z_s$3WzP=6b?%?=m)O)XR{#f68??1<_R|XZcyI(PufyF$u2TOU7_pLou!MUUF@F&USc*b>n85S-Eh%typ5ZudwLr$kBzr6mzQ^Wc^7x@-~FGdf{@$K ze&|n6|9<_i>Tgw7S2b0A;gE9SkYegrgRTje3~bO+m}O+lU}KD#@Q=k9SOV^2STgQo znR#$+-FORQjg0c(~tX1YssAWv4XZ4I3O^sI8$Q=n8HcNA8y~o{! z9&3gwwY#XK#91+CPSkDYZy54hT2`IC|XvK(Mn{b#<%$ zb-XIp62A^C^}1x-XPnG`7E=q|{Og!ivE5j#1lG$p8Z-HpnB+_kRCTCbRkiL7Y9QDU zRQu;K=0UyzHh?juP|P95#$Prj(NVmSCAX?BkBMm~+WAf6rlxLzs(}AHyjyt7xcuC0 zrux7@XP3_#P`!arpfiBD0fNSIS|K4+TFltZd?2=H7IRd0b@@WxV1u_?-2!c3HZ^o( z4T3%DBRVtdXN_zZe?4}|wYPz7b*Q}3R^(WN`LSJCwl;Pf*1TD-`8)9DF?Kh9DZY5} zK6|TsgVz-d`BiwBnZT^q*;9Pt_(IV3(-gLkADwLGcbP0H_d~JT)g5rj`oEu7nlj)) z-eIzje-JN_tzY2bNQy+B8<$l47%YgS5|?7^u>`AL1%B16pOhHdt$u>PZ<;#(3Cyrs z&+sW;6F<{Bnl%CPx_tfp?qI*_4L-y7#;4o%0oD!HOdwjMhhb#C&*)e$#(5@Lp}fQ8 zad*3dK7Xqk#6;W`Hyxhicf?J_2Ch8Mo<|JR3wHJbGAKI3NuFJ6;XB5sfA5WbnGYwX z@zY7uz{)>MO0&EI^>rIV?oGZfSJ3VAR@E2SmSGcm1;fe>uR#T0ljPt9Nw>mld`p6T zMx(I<-ZHkrIhG6#Ki=-{PH(7xz3PuN2C%uiv6$}Q)<*v0#C&**KQ+D)&fz1Hx8iN6 z7th6r8h%^Uur+deWL+59yOBmxTD*p_cd?iY^kROX75uGp>_d&KUE})rZ{wo6r}pzX zSn@gwY_0hWECCf8dbf1g$NX}_ve?hH>wJ8UXHGcJbCQb}#{kre$7Mt@VnCK7a{jNB zBaS;J&EO9t=kURK7JlcXc1Y(ROlpBbUYfFq4<}ccQvod6lih}QBNgyo+gUo_Jkgn& z1;$onV%Z}CvUtBGljlrqoSv;)g)ZZmttqTu*y+%Xcr-{mbv<5aB1;gO&=Q3vwj`km zZi3K6mn<~lO=PxkmpSpjl`FOcj~{(}X6#$wCvLMQ8#{XW>YRi-<5o z1Q21S&;)1|ngFw+dNu)GBQya{5t;yPLK9$iSQtc@BQz0C6`BC;LKEOLp$YI>p$RZI zs*4FQPiO)R=L>@frwdJlGlV9<0-*`8P-p_2DKr7j5}E)VLhFEG=8PI8L|7y=5zZEx z0E>ktz!ISeuvBOQEEAdl%Z1he!;Do3g9zscO;uPK)ujYjB{Tuf6`BC&2~B|Wg(koS zLL;E|{8tNu2p0-XRahf50oDplfOSz_Mu3ZiCcwo)6JWj2vyEY`$7v7-5iSv$s&J{$ z1lTAv0X7LufXjp?z~xb0PJqoqJHvWM(;^HayiRDU!d9UPuuW(JY!{jUJA@{{6+#o> zN}mW|I3?a}Pr9q&5(jZcgGzhg{7?EMcD-A;R zNh3_G1JWVZjnW`izcdInAPqtdN`p{C(je4L(je5$EF7)Y$OyAVgcK3$R%sCGP0}FL zA4r2xw@HIgw@ZUicL*a~M66-q6cOvq(jeBI!ibDDKa>Wc-XaY`-6ah|-7O75y;WX! zHnILlh7jv*(je45(je5^r9r5FCydCbbB8ntb#K%NJBx|+&Zy%oCf2*8L9BO6gHQ*h zL8$jggHX9N2z8${2sM1Ka3bT+ebOM-A4`K!@0SLl?w1CkJ|GQ3{d;K;>Vpv@>~WS5 z>j4=;tp6YlVtq&$k&)2Dp*|rE zLOm>u$e8qx(je3)$q2hV&N5QQMB>d&O1q2l;I zB%H|b^mAzt>oI8%>Mx{0sLx7+P@j_qp&pk8q5e`g!uZ%YhlV*RZ&s9Il<2BDsj2BH2=8ie|)Gzj%IX;jer&+Ed8j970-gIM2` z2BE$s4MIID4MP3BGzj%yr9r6Y(4hanik!rHUWO3sze$6t^$)^`3|MbVgHSI>gHZon z8ie|eG>Yl{>s{#(>wD55*7v1BsDG3Op?)9@LcJ)A$bj`9(je47iT979*~I#x3?bG_ z(x7VnNE(FtpVA=IkEKDVpGbpHKb1!0{qHm3L`JO7r9rHhr9r6wB@IITZ)p(f7t$cq zFQq}KUy1jRqGDqGT80qoH`1VLy&{arfb~DpAk_br2BCf{4MM#t3~LFo{#iIB#QGP; z4&%f{c~Upn+UCr`>7y>3KRTk%Wem@-@egOrvm66(EOdEXcxri%K38=NXHv!`^JN7k z{Of|$+I9B2EkVEA8*q2QFyO?kB{Iz|Cb%I_jYb4c0Zw@0q?bs8lV8I$Q*ujzv*70B z8kffdE9Jx*G=NzPcEMh4O304WKBu&)98Aho0w&&KzDj>sq+L*U!qyd=DoA+r52W-)3){ z-{lRsy0qCgEz=8n(etA#nXfq&eLAxf1WiBE^)hK`m9S}v@LA& zt7?;Lz+_wsF2Ko5JC^1XjaS<#mx1A?PjK0JlcNnT@<$w=StHp&8Cg`&=7L8T6%?N2 zoR9Ni%bYey<%3R3yluem+k_Lg0Zr!Msh>M%m~o~JFBGRFDl85Um40A}+*y{+9Yt&6 zCTdQq!cukTrBWNtTmGrk4%s}R%!2r4ra(PSW>(esJRWT}yrCPL#!R^x-!r?%3NbL&m6EMmQaajPsUPc zrK~Mp4Eg+yVmD5MepTFod%8yEatjE{NZn&Xo zR5@G5rfZ>e+K}fK6MRs&xfjjJXxC*ZBOZzObWJQ~MnI-xl~xG|=|fazqGK2e_`n z9$_4;$OO0Uy;PBw*RPCze7?b_XQP6T&sI#z@Q5iPg@qLEwPbKd|C1 zFk& zR@iC%5%^+$#`mr~orz{*E>SQO>{g7}!O$W{$2@-5!h#gc=Dfmi!!jpS!vzJqQtirb zF0@B_6l+b2ezY|Iy-}sRIJR^bsdN_+DxZhyQnD{$FG7Qh+7-esq}kT2{gtq`l%2%F3x~Y zg|<@?4GcHEfu3X&4I{gzRKu7~ITb^(v7{Q38~MIPi@9NO-l*Ozdu)QcH|9YD?`NeN>v2iT(Ui+yY;;!d!xx~uP0YvvFpBUm3F~>yraooFml+p;i&IMUi}5fhPO5{=(`En&41POe7GNr zC*N|cBa`3<65mO(aa3@~FfuxXxqc^Hvy7&#hMfksRYTlvVA~C*T3j^m@Ar2O_}%?( z{=u?*K6UwQ*v(fgzs6w&`!Zj5WWWHk8$VhI>@k2{s|ju05Fg3iT25BBNBgny*O#ZH ziZYIPFLU!N%Ln+C<}!R}oh|0^(KTpe*8$$#GEjKf0FG*p$G2JS);_cdV0Wv-TCMD$ zmh&M4!wuF_%LU26+J+Ggjw+pp&p?Mdbf zW3PLGuWp~t&$e~vzBj6AX>Z#t(RcF^x3z_j>zEO~d1V8>)7$E6deyEz{NLkx)$eOn z@!JyrAha#e-PQrMt3&k%@U{D1NGR96wk;87KO{JGXR+#41Ma{9uu%j}qT|DM5NvtT z+`H7n&{m);DkmJ_M>`zQ#NY3zf)jkoic(lN)UhJ07>2Rb=T>q2h{tpN9K%H%C=XwM zqv-@BQlFN;{RBx)|vQxJ;#Th+?J*A z@a=7|bLg$xixj*&v3q|4j6c11Tm3L3cvNq~83U``7*hRPJ9|{Mvm3t~b9(}&gwU2? bB;c%pHBtbz@6Mo43pGZY`;h<6KI8uZl1G56 delta 9878 zcma)?4_s8&mB;USGsvKTV;o>W&_PE91Y{5p6ct1wL{N}FiBUtw;VDxF24)78R-M{t znxwUjIZZaUv584+lFeV2wN0|I8@uL@yZNK7ZcS4YZJJHfO?G3OZqsf|dfq!T_c|rJ zpZdX>`TgeHd%yR-_wIdj?mK^2JAYVn4(Ji@MWF`qa zy(S9>y-pBLAtpFP?*6rn`yVIlvc)dC!PC=?78<2tPXzo9)1 z)wsg48fp8V+?sBL6Z!0!{HMF^{{$syW=&{}Z0wUAIIq~axO7TPA{LopUj zC^cVQ6RpDDp?d>1VVEv_U_xb5FO|9xA5ALB=!M#D-B-K9zeNv6nj`waQXvBPd+R#b zfUQaEUPS_E5IeBnIv)b~J!@XpcCdE@f)N2_ zoBg41q^D2!_UfSkzHW8q2Ef^5N+G^V)SY4v4J8dT{ksKkOfH{qE35bUf+K^G=D}Wl zJB^0J*4%3qHgLy%>VR;V-&)02@p$qzu07ydKT^HeRbIByIGW$2qb9`dRB^sp@psUk zk^{Hnyc9Rwji+tJdEbEw-ParTsxiHXqU+7*`|#eBJh%ssrObi{DLNm&l9FD0AJoN4 zbojRndLtttU5JONkY*No%s3TYkq-|LM8 zLmhggnY!>Cdg#l~Q*yfQcFQW^L6HgtzTm)sKQf>XMxKVI1}SP+j|^8{4(xNYnk*4 zb+gXw<|#~1pOOAbY`Ci`HVScuPSYIxOoTd`A2dThrZLP1bIB z+1deTgdNI4bewy82F-58P9$*od#U68$Y>MykeSbcv!J`!)ln$G8Pf~P=?OZs6tJ3GpGg`Uux3z-TrWL{m2yK~IoH`SJiEC1yhL24BlS#9k4sh@RgED=1 z#J@G@^G5u^!4L5BNtu{C`5Z2{&zPJrAW0A#(lpGmr)L5{le~81uwcO6MrW$##^X~K zrKJHljVrN}F2D@joiPoEu4+li1`5akk%yD7@?>OywS#&nvag8E$Dn;4I;YMkoDEjz znjwSCYVCx40GoYvaF9+>y8eR$x>e*;W%O5Qmher@h7xo+vhj?)3-YjNN;?$djwx4z zhujLB;mE{(nxLuYidJqo6%pgtfnu#cqdiYiqB`}((C!m^{^3ZvZ^NV9F0$8wSogb z&AMT#2gI;Z(FrkPyrqB`H3$B7=em@ghBFFcH~!99Fzt)xzP(1oZorc4LafWl#+$Rt zU_UO)$-&dv^YDk+(=aP%E`Cby>vCqoL3}Z1VU)T7BDXadig*L%bnK~yxLjaLOI%i% z(i)eQrc8>~FO+Tyatlqtg18Z{gCl$pjvGFW>|JxOXNOO=|@(xhg# zbg3C`veZmxmzwdW2v;=LAOl_{1DJ4XT$eMTLuv-hkeUHArDnh^sTt5IH3MdgXspNO zOqe4Bm~fiZ445l51Lno`0tTEeH3QC&ngLx>GhlvH8caA-Y9^c|H3Pb(X297}GvFMl z8E|e~S1@3K)C?Fclm-(PNzH`wq-MZksTr_DY6dKongQoa&46W6n}AW_i5rznSS~da zE|8i5E2L(?N~syJN@@mNC^Z9COKkws^;aVeCR`*n58>jtu42GisTpvI)C{;(Y6e^; zH3Qa3O@PMrUoQaVT05RxI$_MY>exL40yHF47gHi25gdgfz@bVG)sdCuaTOE zaFx^y*djFpwo1)_tEFbZHE~_dfNfHHqUJ=?E)6DJD>V;chtv$%DK!IjNzH)WQZwMS zQZwLnQb(C^UEHW)!t15xAzUvt18$I-0XIs`fHz3ZfIU((;Eiz|tzklM+^Au~O;R(U zPqFpDuWSqWiaDrWiaFxWiVx*aL4E0GUoKF5C;8{G8nX98B7{b2BQv0Betvz zDuYpj%7`-SkaC!HSQ*S3QU;@jmBFYHWiaZ9G8lEMG8lE6h{lICw!&H%di>UWjFsNYitquvuU zq5)4OvmR6-%=&$0Fzdb2h^<8TDT7fDDT7h(R|ca#pbQf=Djrl0vmRCkv;IICjQWr= z81-RgFzO@Hh^qduh!Mm?eoM*Rn6 z7^t-VjY%iAJpH3GnDwYK81;wBVALNegHfMW2BSWs3`Tv{G@^9d@2O_ie^MdL`kXR& zSdU2~wod(68I1bR%3##zmBFaTl|iV+`u`K&jr%Q_85}`=8U&iLF>a zRR**EOc{)NMj4EHRvC=?@5*4*pDTk=&ym5uzsfz#`i2T&)?X-thxJWq#1^byDuYqa zD}zzrQU;^Gt&9r3|GJhG1o zs2?kXQU9O}M*Sao|50AStbbG?%=(Ekcv$}=jo5f)}PITH^8q&9}ULL4@&JLXMK-vF-8MT;n#e>hU;Z8UJhu|7gyp(#h%hz z>}K*lQByLww8FOcUl{v4s5nH{Z`Rw{1Bo}hODB_%!!@F-K7UX;EegT@CJRJ zh0*zq$(%9La98PU%qyJ(XK_X8%;+1G&FdQM9}I3A>NHS`=P3?d&*r<}L;QGt5w0%lfJ=CPSpdIQnvXYlrc+{Tr^f|p_`JtC(KQqb zZlz3W*pM^nt9Lx}szJLF@p1yGTt%tVoQmmCgEbX%DW~bJ zn1;tIbMV=67e&8W?uP6;7UU)`Ap)&N!}$xZ!~4sf_|n2MD)`C54I7#hI@dV9bB)}& zR(iAA8jW0KdqR=c@kNYS8rd$B_GER5$(551#cFRMT!J%dvJ2NGRMj=UsxGc-BMvWG z!qwo(Mbp4bRZmCD;whkGeN8>(S>LL0PA>#-8T&gcyb-SuUJcw0!H^zH9T(y=HSWJH z(6J~MSn&VVNMwHcuj!f?z{QKV)(jhJKocYMZnb?va@250?$i>mu21OVqOYxH0A+fO zQ{28}CM4m4C9~?2=$ud+Ht{VMO4y3MX3ZYht%+NWs!8uNt&JM#{f0&QPP4vumWJVg z`DtibF=c^=7v-RL=`^?#cP=fo9MAxVmQAP4#Y08~sRuO=B!M_=R6))oX2Cm_%%v0S z*(KXj9yk0)G;zfAlWMyu;k==?d*$OA+}KL9j(>$eJTwx~J0g^UH};Nb+d_z=2}k$H z_@jG-s-+X<8M-WT@a_6^r^lFfPSC&%$2JH0fH*Nc(vcQ4P$`=TrTxB+)eqd7WO zO;({s)zIW&r93`wZW#5PG~wS`b~8MKdfj5!i-+n;;W(bEn+q@CCv~sPc{Ks}(LUWf~0mt$YU+>AFU!kU^|17|gH-T))xBJOU?!|ui+c$Yq{w7ehd zQ0a=VPmAq5(H?Bu*3E4peW=qvpa(}HHY#;$Mb?7Y_etjWjoWpf{Qg~T_%O7SA4`$lMnYx9P@#@6c}61skAeAh1-T^Hg{ zM*nOcI!Kp|7D$36@#L1r&mH-Kgbm(Pc6Bf&bhxt@duZn<>~D z-zE;XTcFN3P3lJ?eL;FsVANO%jji7=*i2rB$6DrU8@aB5*0tEa#&O5$ht~TEM%|RS z=$=F;AoHHYWh{$)8>BPQKtizN%3yPYJ|TD*+txU6-Wqqth|!T@ix@TD9b%{P=EBu$ zDx#wnz8h=Ny_?M?fcOgnBznvZeh0W$2YX|S133INZH0GQz-@He*g~XBVlP!@wT)PI zTg0sibbBpV;u&Fo)tP-3E1q35IYajMirYRN|FmW(+o;*$5C_dBA`WrL04H@A53P0J zaJv_13Z_px+T3*ibg0cSDZWK*^&PoyIdoxCv1d`EB5`hS@>Ri=Dc|Q1>uM{6fuM4qZF>*k&wCb%t82S zTNmzJo1FK!1+H7}-J~}T1$})D!NJY`EwMnF{7wF49R<;65>Cpa<4?+?)OosAj#*N3 z!$WjU+FA6(p^TkQ@`r2r8RKIwN(%p>%KOsS&qR)Jhu+%p_;(; zi!7IDnSA8>FWFuIJMFQ1FX6QHAKQ;X!KOga*Wc4e*NY3Zu^AhdX;h%+hJ%pyz~vi& zrl!w&eg@5BKfQ51K>JwfrV4{i z)qM}9RbKIgNz&LK`{rwK9_RKq!yjmE z*0F~MA2nL(7z)GlV=oPLXm&@LH$I#7&@(LFvCF%@OOH$3d@Ht&yiF)2TMxml`1;lt zVPx#CZQlZVn>~60pl$58Uw#tcqp|Pq=+Gu7*3vZg>8>|5aEzVXJyE04eCMXcupMXY zS#CXIv7W$(_RPXt_T<13d|*%1zC8gT@(fy+h#ng4*{th5z4Ta_ iKM=O1j%<&_0?u1R3kUEy-V+HLq1N~*KNk8{zx6ME@{r^J diff --git a/cli/src/commands/explore/pallets/calls.rs b/cli/src/commands/explore/pallets/calls.rs index 9fd3f3a0ef..ff52f21732 100644 --- a/cli/src/commands/explore/pallets/calls.rs +++ b/cli/src/commands/explore/pallets/calls.rs @@ -45,7 +45,7 @@ pub fn explore_calls( Usage: subxt explore pallet {pallet_name} calls explore a specific call of this pallet - + {calls} "} }; @@ -154,7 +154,10 @@ fn mocked_offline_client(metadata: Metadata) -> OfflineClient { H256::from_str("91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3") .expect("Valid hash; qed"); - let runtime_version = subxt::client::RuntimeVersion::new(9370, 20); + let runtime_version = subxt::client::RuntimeVersion { + spec_version: 9370, + transaction_version: 20, + }; OfflineClient::::new(genesis_hash, runtime_version, metadata) } diff --git a/codegen/src/api/calls.rs b/codegen/src/api/calls.rs index 8a173cf25a..4e48ebd28b 100644 --- a/codegen/src/api/calls.rs +++ b/codegen/src/api/calls.rs @@ -92,8 +92,8 @@ pub fn generate_calls( pub fn #fn_name( &self, #( #call_fn_args, )* - ) -> #crate_path::tx::Payload { - #crate_path::tx::Payload::new_static( + ) -> #crate_path::tx::payload::Payload { + #crate_path::tx::payload::Payload::new_static( #pallet_name, #call_name, types::#struct_name { #( #call_args, )* }, diff --git a/codegen/src/api/constants.rs b/codegen/src/api/constants.rs index 108e5cb765..6ddb9f11e2 100644 --- a/codegen/src/api/constants.rs +++ b/codegen/src/api/constants.rs @@ -68,8 +68,8 @@ pub fn generate_constants( Ok(quote! { #docs - pub fn #fn_name(&self) -> #crate_path::constants::Address<#return_ty> { - #crate_path::constants::Address::new_static( + pub fn #fn_name(&self) -> #crate_path::constants::address::Address<#return_ty> { + #crate_path::constants::address::Address::new_static( #pallet_name, #constant_name, [#(#constant_hash,)*] diff --git a/codegen/src/api/custom_values.rs b/codegen/src/api/custom_values.rs index b1b864d2f3..dd577d6e74 100644 --- a/codegen/src/api/custom_values.rs +++ b/codegen/src/api/custom_values.rs @@ -70,8 +70,8 @@ fn generate_custom_value_fn( }; Some(quote!( - pub fn #fn_name_ident(&self) -> #crate_path::custom_values::StaticAddress<#return_ty, #decodable> { - #crate_path::custom_values::StaticAddress::new_static(#name, [#(#custom_value_hash,)*]) + pub fn #fn_name_ident(&self) -> #crate_path::custom_values::address::StaticAddress<#return_ty, #decodable> { + #crate_path::custom_values::address::StaticAddress::new_static(#name, [#(#custom_value_hash,)*]) } )) } diff --git a/codegen/src/api/runtime_apis.rs b/codegen/src/api/runtime_apis.rs index b242cb4f10..69b8e786fe 100644 --- a/codegen/src/api/runtime_apis.rs +++ b/codegen/src/api/runtime_apis.rs @@ -135,8 +135,8 @@ fn generate_runtime_api( let method = quote!( #docs - pub fn #method_name(&self, #( #fn_params, )* ) -> #crate_path::runtime_api::Payload { - #crate_path::runtime_api::Payload::new_static( + pub fn #method_name(&self, #( #fn_params, )* ) -> #crate_path::runtime_api::payload::Payload { + #crate_path::runtime_api::payload::Payload::new_static( #trait_name_str, #method_name_str, types::#struct_name { #( #param_names, )* }, diff --git a/codegen/src/lib.rs b/codegen/src/lib.rs index 41feda0e7f..a981557e8b 100644 --- a/codegen/src/lib.rs +++ b/codegen/src/lib.rs @@ -224,7 +224,16 @@ impl CodegenBuilder { } /// Set the path to the `subxt` crate. By default, we expect it to be at `::subxt::ext::subxt_core`. + /// + /// # Panics + /// + /// Panics if the path provided is not an absolute path. pub fn set_subxt_crate_path(&mut self, crate_path: syn::Path) { + if absolute_path(crate_path.clone()).is_err() { + // Throw an error here, because otherwise we end up with a harder to comprehend error when + // substitute types don't begin with an absolute path. + panic!("The provided crate path must be an absolute path, ie prefixed with '::' or 'crate'"); + } self.crate_path = crate_path; } diff --git a/core/Cargo.toml b/core/Cargo.toml index 41be81d824..e1e08f1fea 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -67,11 +67,15 @@ sp-runtime = { workspace = true, optional = true } tracing = { workspace = true, default-features = false } [dev-dependencies] +assert_matches = { workspace = true } bitvec = { workspace = true } codec = { workspace = true, features = ["derive", "bit-vec"] } +subxt-macro = { workspace = true } +subxt-signer = { workspace = true, features = ["sr25519", "subxt"] } sp-core = { workspace = true } sp-keyring = { workspace = true } sp-runtime = { workspace = true } +hex = { workspace = true } [package.metadata.docs.rs] diff --git a/core/src/blocks/extrinsic_signed_extensions.rs b/core/src/blocks/extrinsic_signed_extensions.rs new file mode 100644 index 0000000000..fb654729aa --- /dev/null +++ b/core/src/blocks/extrinsic_signed_extensions.rs @@ -0,0 +1,169 @@ +// Copyright 2019-2024 Parity Technologies (UK) Ltd. +// This file is dual-licensed as Apache-2.0 or GPL-3.0. +// see LICENSE for license details. + +use crate::config::signed_extensions::{ + ChargeAssetTxPayment, ChargeTransactionPayment, CheckNonce, +}; +use crate::config::SignedExtension; +use crate::dynamic::Value; +use crate::{config::Config, error::Error, Metadata}; +use scale_decode::DecodeAsType; + +/// The signed extensions of an extrinsic. +#[derive(Debug, Clone)] +pub struct ExtrinsicSignedExtensions<'a, T: Config> { + bytes: &'a [u8], + metadata: &'a Metadata, + _marker: core::marker::PhantomData, +} + +impl<'a, T: Config> ExtrinsicSignedExtensions<'a, T> { + pub(crate) fn new(bytes: &'a [u8], metadata: &'a Metadata) -> Self { + Self { + bytes, + metadata, + _marker: core::marker::PhantomData, + } + } + + /// Returns an iterator over each of the signed extension details of the extrinsic. + /// If the decoding of any signed extension fails, an error item is yielded and the iterator stops. + pub fn iter(&self) -> impl Iterator, Error>> { + let signed_extension_types = self.metadata.extrinsic().signed_extensions(); + let num_signed_extensions = signed_extension_types.len(); + let bytes = self.bytes; + let mut index = 0; + let mut byte_start_idx = 0; + let metadata = &self.metadata; + + core::iter::from_fn(move || { + if index == num_signed_extensions { + return None; + } + + let extension = &signed_extension_types[index]; + let ty_id = extension.extra_ty(); + let cursor = &mut &bytes[byte_start_idx..]; + if let Err(err) = scale_decode::visitor::decode_with_visitor( + cursor, + &ty_id, + metadata.types(), + scale_decode::visitor::IgnoreVisitor::new(), + ) + .map_err(|e| Error::Decode(e.into())) + { + index = num_signed_extensions; // (such that None is returned in next iteration) + return Some(Err(err)); + } + let byte_end_idx = bytes.len() - cursor.len(); + let bytes = &bytes[byte_start_idx..byte_end_idx]; + byte_start_idx = byte_end_idx; + index += 1; + Some(Ok(ExtrinsicSignedExtension { + bytes, + ty_id, + identifier: extension.identifier(), + metadata, + _marker: core::marker::PhantomData, + })) + }) + } + + /// Searches through all signed extensions to find a specific one. + /// If the Signed Extension is not found `Ok(None)` is returned. + /// If the Signed Extension is found but decoding failed `Err(_)` is returned. + pub fn find>(&self) -> Result, Error> { + for ext in self.iter() { + // If we encounter an error while iterating, we won't get any more results + // back, so just return that error as we won't find the signed ext anyway. + let ext = ext?; + match ext.as_signed_extension::() { + // We found a match; return it: + Ok(Some(e)) => return Ok(Some(e)), + // No error, but no match either; next! + Ok(None) => continue, + // Error? return it + Err(e) => return Err(e), + } + } + Ok(None) + } + + /// The tip of an extrinsic, extracted from the ChargeTransactionPayment or ChargeAssetTxPayment + /// signed extension, depending on which is present. + /// + /// Returns `None` if `tip` was not found or decoding failed. + pub fn tip(&self) -> Option { + // Note: the overhead of iterating multiple time should be negligible. + self.find::() + .ok() + .flatten() + .map(|e| e.tip()) + .or_else(|| { + self.find::>() + .ok() + .flatten() + .map(|e| e.tip()) + }) + } + + /// The nonce of the account that submitted the extrinsic, extracted from the CheckNonce signed extension. + /// + /// Returns `None` if `nonce` was not found or decoding failed. + pub fn nonce(&self) -> Option { + self.find::().ok()? + } +} + +/// A single signed extension +#[derive(Debug, Clone)] +pub struct ExtrinsicSignedExtension<'a, T: Config> { + bytes: &'a [u8], + ty_id: u32, + identifier: &'a str, + metadata: &'a Metadata, + _marker: core::marker::PhantomData, +} + +impl<'a, T: Config> ExtrinsicSignedExtension<'a, T> { + /// The bytes representing this signed extension. + pub fn bytes(&self) -> &'a [u8] { + self.bytes + } + + /// The name of the signed extension. + pub fn name(&self) -> &'a str { + self.identifier + } + + /// The type id of the signed extension. + pub fn type_id(&self) -> u32 { + self.ty_id + } + + /// Signed Extension as a [`scale_value::Value`] + pub fn value(&self) -> Result, Error> { + let value = scale_value::scale::decode_as_type( + &mut &self.bytes[..], + &self.ty_id, + self.metadata.types(), + )?; + Ok(value) + } + + /// Decodes the bytes of this Signed Extension into its associated `Decoded` type. + /// Returns `Ok(None)` if the data we have doesn't match the Signed Extension we're asking to + /// decode with. + pub fn as_signed_extension>(&self) -> Result, Error> { + if !S::matches(self.identifier, self.ty_id, self.metadata.types()) { + return Ok(None); + } + self.as_type::().map(Some) + } + + fn as_type(&self) -> Result { + let value = E::decode_as_type(&mut &self.bytes[..], &self.ty_id, self.metadata.types())?; + Ok(value) + } +} diff --git a/core/src/blocks/extrinsics.rs b/core/src/blocks/extrinsics.rs new file mode 100644 index 0000000000..7a1f5f7149 --- /dev/null +++ b/core/src/blocks/extrinsics.rs @@ -0,0 +1,709 @@ +// Copyright 2019-2024 Parity Technologies (UK) Ltd. +// This file is dual-licensed as Apache-2.0 or GPL-3.0. +// see LICENSE for license details. + +use crate::blocks::extrinsic_signed_extensions::ExtrinsicSignedExtensions; +use crate::utils::strip_compact_prefix; +use crate::{ + config::Config, + error::{BlockError, Error, MetadataError}, + Metadata, +}; +use alloc::sync::Arc; +use alloc::vec::Vec; +use codec::Decode; +use scale_decode::DecodeAsType; +use subxt_metadata::PalletMetadata; + +pub use crate::blocks::StaticExtrinsic; + +/// The body of a block. +pub struct Extrinsics { + extrinsics: Vec>, + metadata: Metadata, + ids: ExtrinsicPartTypeIds, + _marker: core::marker::PhantomData, +} + +impl Extrinsics { + /// Instantiate a new [`Extrinsics`] object, given a vector containing + /// each extrinsic hash (in the form of bytes) and some metadata that + /// we'll use to decode them. + pub fn decode_from(extrinsics: Vec>, metadata: Metadata) -> Result { + let ids = ExtrinsicPartTypeIds::new(&metadata)?; + + Ok(Self { + extrinsics, + metadata, + ids, + _marker: core::marker::PhantomData, + }) + } + + /// The number of extrinsics. + pub fn len(&self) -> usize { + self.extrinsics.len() + } + + /// Are there no extrinsics in this block? + // Note: mainly here to satisfy clippy. + pub fn is_empty(&self) -> bool { + self.extrinsics.is_empty() + } + + /// Returns an iterator over the extrinsics in the block body. + // Dev note: The returned iterator is 'static + Send so that we can box it up and make + // use of it with our `FilterExtrinsic` stuff. + pub fn iter( + &self, + ) -> impl Iterator, Error>> + Send + Sync + 'static { + let extrinsics = self.extrinsics.clone(); + let num_extrinsics = self.extrinsics.len(); + let metadata = self.metadata.clone(); + let ids = self.ids; + let mut index = 0; + + core::iter::from_fn(move || { + if index == num_extrinsics { + None + } else { + match ExtrinsicDetails::decode_from( + index as u32, + &extrinsics[index], + metadata.clone(), + ids, + ) { + Ok(extrinsic_details) => { + index += 1; + Some(Ok(extrinsic_details)) + } + Err(e) => { + index = num_extrinsics; + Some(Err(e)) + } + } + } + }) + } + + /// Iterate through the extrinsics using metadata to dynamically decode and skip + /// them, and return only those which should decode to the provided `E` type. + /// If an error occurs, all subsequent iterations return `None`. + pub fn find( + &self, + ) -> impl Iterator, Error>> + '_ { + self.iter().filter_map(|res| match res { + Err(err) => Some(Err(err)), + Ok(details) => match details.as_extrinsic::() { + // Failed to decode extrinsic: + Err(err) => Some(Err(err)), + // Extrinsic for a different pallet / different call (skip): + Ok(None) => None, + Ok(Some(value)) => Some(Ok(FoundExtrinsic { details, value })), + }, + }) + } + + /// Iterate through the extrinsics using metadata to dynamically decode and skip + /// them, and return the first extrinsic found which decodes to the provided `E` type. + pub fn find_first(&self) -> Result>, Error> { + self.find::().next().transpose() + } + + /// Iterate through the extrinsics using metadata to dynamically decode and skip + /// them, and return the last extrinsic found which decodes to the provided `Ev` type. + pub fn find_last(&self) -> Result>, Error> { + self.find::().last().transpose() + } + + /// Find an extrinsics that decodes to the type provided. Returns true if it was found. + pub fn has(&self) -> Result { + Ok(self.find::().next().transpose()?.is_some()) + } +} + +/// A single extrinsic in a block. +pub struct ExtrinsicDetails { + /// The index of the extrinsic in the block. + index: u32, + /// Extrinsic bytes. + bytes: Arc<[u8]>, + /// Some if the extrinsic payload is signed. + signed_details: Option, + /// The start index in the `bytes` from which the call is encoded. + call_start_idx: usize, + /// The pallet index. + pallet_index: u8, + /// The variant index. + variant_index: u8, + /// Subxt metadata to fetch the extrinsic metadata. + metadata: Metadata, + _marker: core::marker::PhantomData, +} + +/// Details only available in signed extrinsics. +pub struct SignedExtrinsicDetails { + /// start index of the range in `bytes` of `ExtrinsicDetails` that encodes the address. + address_start_idx: usize, + /// end index of the range in `bytes` of `ExtrinsicDetails` that encodes the address. Equivalent to signature_start_idx. + address_end_idx: usize, + /// end index of the range in `bytes` of `ExtrinsicDetails` that encodes the signature. Equivalent to extra_start_idx. + signature_end_idx: usize, + /// end index of the range in `bytes` of `ExtrinsicDetails` that encodes the signature. + extra_end_idx: usize, +} + +impl ExtrinsicDetails +where + T: Config, +{ + // Attempt to dynamically decode a single extrinsic from the given input. + #[doc(hidden)] + pub fn decode_from( + index: u32, + extrinsic_bytes: &[u8], + metadata: Metadata, + ids: ExtrinsicPartTypeIds, + ) -> Result, Error> { + const SIGNATURE_MASK: u8 = 0b1000_0000; + const VERSION_MASK: u8 = 0b0111_1111; + const LATEST_EXTRINSIC_VERSION: u8 = 4; + + // removing the compact encoded prefix: + let bytes: Arc<[u8]> = strip_compact_prefix(extrinsic_bytes)?.1.into(); + + // Extrinsic are encoded in memory in the following way: + // - first byte: abbbbbbb (a = 0 for unsigned, 1 for signed, b = version) + // - signature: [unknown TBD with metadata]. + // - extrinsic data + let first_byte: u8 = Decode::decode(&mut &bytes[..])?; + + let version = first_byte & VERSION_MASK; + if version != LATEST_EXTRINSIC_VERSION { + return Err(BlockError::UnsupportedVersion(version).into()); + } + + let is_signed = first_byte & SIGNATURE_MASK != 0; + + // Skip over the first byte which denotes the version and signing. + let cursor = &mut &bytes[1..]; + + let signed_details = is_signed + .then(|| -> Result { + let address_start_idx = bytes.len() - cursor.len(); + // Skip over the address, signature and extra fields. + scale_decode::visitor::decode_with_visitor( + cursor, + &ids.address, + metadata.types(), + scale_decode::visitor::IgnoreVisitor::new(), + ) + .map_err(scale_decode::Error::from)?; + let address_end_idx = bytes.len() - cursor.len(); + + scale_decode::visitor::decode_with_visitor( + cursor, + &ids.signature, + metadata.types(), + scale_decode::visitor::IgnoreVisitor::new(), + ) + .map_err(scale_decode::Error::from)?; + let signature_end_idx = bytes.len() - cursor.len(); + + scale_decode::visitor::decode_with_visitor( + cursor, + &ids.extra, + metadata.types(), + scale_decode::visitor::IgnoreVisitor::new(), + ) + .map_err(scale_decode::Error::from)?; + let extra_end_idx = bytes.len() - cursor.len(); + + Ok(SignedExtrinsicDetails { + address_start_idx, + address_end_idx, + signature_end_idx, + extra_end_idx, + }) + }) + .transpose()?; + + let call_start_idx = bytes.len() - cursor.len(); + + // Decode the pallet index, then the call variant. + let cursor = &mut &bytes[call_start_idx..]; + + let pallet_index: u8 = Decode::decode(cursor)?; + let variant_index: u8 = Decode::decode(cursor)?; + + Ok(ExtrinsicDetails { + index, + bytes, + signed_details, + call_start_idx, + pallet_index, + variant_index, + metadata, + _marker: core::marker::PhantomData, + }) + } + + /// Is the extrinsic signed? + pub fn is_signed(&self) -> bool { + self.signed_details.is_some() + } + + /// The index of the extrinsic in the block. + pub fn index(&self) -> u32 { + self.index + } + + /// Return _all_ of the bytes representing this extrinsic, which include, in order: + /// - First byte: abbbbbbb (a = 0 for unsigned, 1 for signed, b = version) + /// - SignatureType (if the payload is signed) + /// - Address + /// - Signature + /// - Extra fields + /// - Extrinsic call bytes + pub fn bytes(&self) -> &[u8] { + &self.bytes + } + + /// Return only the bytes representing this extrinsic call: + /// - First byte is the pallet index + /// - Second byte is the variant (call) index + /// - Followed by field bytes. + /// + /// # Note + /// + /// Please use [`Self::bytes`] if you want to get all extrinsic bytes. + pub fn call_bytes(&self) -> &[u8] { + &self.bytes[self.call_start_idx..] + } + + /// Return the bytes representing the fields stored in this extrinsic. + /// + /// # Note + /// + /// This is a subset of [`Self::call_bytes`] that does not include the + /// first two bytes that denote the pallet index and the variant index. + pub fn field_bytes(&self) -> &[u8] { + // Note: this cannot panic because we checked the extrinsic bytes + // to contain at least two bytes. + &self.call_bytes()[2..] + } + + /// Return only the bytes of the address that signed this extrinsic. + /// + /// # Note + /// + /// Returns `None` if the extrinsic is not signed. + pub fn address_bytes(&self) -> Option<&[u8]> { + self.signed_details + .as_ref() + .map(|e| &self.bytes[e.address_start_idx..e.address_end_idx]) + } + + /// Returns Some(signature_bytes) if the extrinsic was signed otherwise None is returned. + pub fn signature_bytes(&self) -> Option<&[u8]> { + self.signed_details + .as_ref() + .map(|e| &self.bytes[e.address_end_idx..e.signature_end_idx]) + } + + /// Returns the signed extension `extra` bytes of the extrinsic. + /// Each signed extension has an `extra` type (May be zero-sized). + /// These bytes are the scale encoded `extra` fields of each signed extension in order of the signed extensions. + /// They do *not* include the `additional` signed bytes that are used as part of the payload that is signed. + /// + /// Note: Returns `None` if the extrinsic is not signed. + pub fn signed_extensions_bytes(&self) -> Option<&[u8]> { + self.signed_details + .as_ref() + .map(|e| &self.bytes[e.signature_end_idx..e.extra_end_idx]) + } + + /// Returns `None` if the extrinsic is not signed. + pub fn signed_extensions(&self) -> Option> { + let signed = self.signed_details.as_ref()?; + let extra_bytes = &self.bytes[signed.signature_end_idx..signed.extra_end_idx]; + Some(ExtrinsicSignedExtensions::new(extra_bytes, &self.metadata)) + } + + /// The index of the pallet that the extrinsic originated from. + pub fn pallet_index(&self) -> u8 { + self.pallet_index + } + + /// The index of the extrinsic variant that the extrinsic originated from. + pub fn variant_index(&self) -> u8 { + self.variant_index + } + + /// The name of the pallet from whence the extrinsic originated. + pub fn pallet_name(&self) -> Result<&str, Error> { + Ok(self.extrinsic_metadata()?.pallet.name()) + } + + /// The name of the call (ie the name of the variant that it corresponds to). + pub fn variant_name(&self) -> Result<&str, Error> { + Ok(&self.extrinsic_metadata()?.variant.name) + } + + /// Fetch the metadata for this extrinsic. + pub fn extrinsic_metadata(&self) -> Result { + let pallet = self.metadata.pallet_by_index_err(self.pallet_index())?; + let variant = pallet + .call_variant_by_index(self.variant_index()) + .ok_or_else(|| MetadataError::VariantIndexNotFound(self.variant_index()))?; + + Ok(ExtrinsicMetadataDetails { pallet, variant }) + } + + /// Decode and provide the extrinsic fields back in the form of a [`scale_value::Composite`] + /// type which represents the named or unnamed fields that were present in the extrinsic. + pub fn field_values(&self) -> Result, Error> { + let bytes = &mut self.field_bytes(); + let extrinsic_metadata = self.extrinsic_metadata()?; + + let mut fields = extrinsic_metadata + .variant + .fields + .iter() + .map(|f| scale_decode::Field::new(&f.ty.id, f.name.as_deref())); + let decoded = + scale_value::scale::decode_as_fields(bytes, &mut fields, self.metadata.types())?; + + Ok(decoded) + } + + /// Attempt to decode these [`ExtrinsicDetails`] into a type representing the extrinsic fields. + /// Such types are exposed in the codegen as `pallet_name::calls::types::CallName` types. + pub fn as_extrinsic(&self) -> Result, Error> { + let extrinsic_metadata = self.extrinsic_metadata()?; + if extrinsic_metadata.pallet.name() == E::PALLET + && extrinsic_metadata.variant.name == E::CALL + { + let mut fields = extrinsic_metadata + .variant + .fields + .iter() + .map(|f| scale_decode::Field::new(&f.ty.id, f.name.as_deref())); + let decoded = + E::decode_as_fields(&mut self.field_bytes(), &mut fields, self.metadata.types())?; + Ok(Some(decoded)) + } else { + Ok(None) + } + } + + /// Attempt to decode these [`ExtrinsicDetails`] into an outer call enum type (which includes + /// the pallet and extrinsic enum variants as well as the extrinsic fields). A compatible + /// type for this is exposed via static codegen as a root level `Call` type. + pub fn as_root_extrinsic(&self) -> Result { + let decoded = E::decode_as_type( + &mut &self.call_bytes()[..], + &self.metadata.outer_enums().call_enum_ty(), + self.metadata.types(), + )?; + + Ok(decoded) + } +} + +/// A Static Extrinsic found in a block coupled with it's details. +pub struct FoundExtrinsic { + /// Details for the extrinsic. + pub details: ExtrinsicDetails, + /// The decoded extrinsic value. + pub value: E, +} + +/// Details for the given extrinsic plucked from the metadata. +pub struct ExtrinsicMetadataDetails<'a> { + /// Metadata for the pallet that the extrinsic belongs to. + pub pallet: PalletMetadata<'a>, + /// Metadata for the variant which describes the pallet extrinsics. + pub variant: &'a scale_info::Variant, +} + +/// The type IDs extracted from the metadata that represent the +/// generic type parameters passed to the `UncheckedExtrinsic` from +/// the substrate-based chain. +#[doc(hidden)] +#[derive(Debug, Copy, Clone)] +pub struct ExtrinsicPartTypeIds { + /// The address (source) of the extrinsic. + address: u32, + /// The extrinsic call type. + // Note: the call type can be used to skip over the extrinsic bytes to check + // they are in line with our metadata. This operation is currently postponed. + _call: u32, + /// The signature of the extrinsic. + signature: u32, + /// The extra parameters of the extrinsic. + extra: u32, +} + +impl ExtrinsicPartTypeIds { + /// Extract the generic type parameters IDs from the extrinsic type. + fn new(metadata: &Metadata) -> Result { + Ok(ExtrinsicPartTypeIds { + address: metadata.extrinsic().address_ty(), + _call: metadata.extrinsic().call_ty(), + signature: metadata.extrinsic().signature_ty(), + extra: metadata.extrinsic().extra_ty(), + }) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::config::SubstrateConfig; + use assert_matches::assert_matches; + use codec::{Decode, Encode}; + use frame_metadata::v15::{CustomMetadata, OuterEnums}; + use frame_metadata::{ + v15::{ExtrinsicMetadata, PalletCallMetadata, PalletMetadata, RuntimeMetadataV15}, + RuntimeMetadataPrefixed, + }; + use scale_info::{meta_type, TypeInfo}; + use scale_value::Value; + + // Extrinsic needs to contain at least the generic type parameter "Call" + // for the metadata to be valid. + // The "Call" type from the metadata is used to decode extrinsics. + #[allow(unused)] + #[derive(TypeInfo)] + struct ExtrinsicType { + pub signature: Option<(Address, Signature, Extra)>, + pub function: Call, + } + + // Because this type is used to decode extrinsics, we expect this to be a TypeDefVariant. + // Each pallet must contain one single variant. + #[allow(unused)] + #[derive( + Encode, + Decode, + TypeInfo, + Clone, + Debug, + PartialEq, + Eq, + scale_encode::EncodeAsType, + scale_decode::DecodeAsType, + )] + enum RuntimeCall { + Test(Pallet), + } + + // The calls of the pallet. + #[allow(unused)] + #[derive( + Encode, + Decode, + TypeInfo, + Clone, + Debug, + PartialEq, + Eq, + scale_encode::EncodeAsType, + scale_decode::DecodeAsType, + )] + enum Pallet { + #[allow(unused)] + #[codec(index = 2)] + TestCall { + value: u128, + signed: bool, + name: String, + }, + } + + #[allow(unused)] + #[derive( + Encode, + Decode, + TypeInfo, + Clone, + Debug, + PartialEq, + Eq, + scale_encode::EncodeAsType, + scale_decode::DecodeAsType, + )] + struct TestCallExtrinsic { + value: u128, + signed: bool, + name: String, + } + + impl StaticExtrinsic for TestCallExtrinsic { + const PALLET: &'static str = "Test"; + const CALL: &'static str = "TestCall"; + } + + /// Build fake metadata consisting the types needed to represent an extrinsic. + fn metadata() -> Metadata { + let pallets = vec![PalletMetadata { + name: "Test", + storage: None, + calls: Some(PalletCallMetadata { + ty: meta_type::(), + }), + event: None, + constants: vec![], + error: None, + index: 0, + docs: vec![], + }]; + + let extrinsic = ExtrinsicMetadata { + version: 4, + signed_extensions: vec![], + address_ty: meta_type::<()>(), + call_ty: meta_type::(), + signature_ty: meta_type::<()>(), + extra_ty: meta_type::<()>(), + }; + + let meta = RuntimeMetadataV15::new( + pallets, + extrinsic, + meta_type::<()>(), + vec![], + OuterEnums { + call_enum_ty: meta_type::(), + event_enum_ty: meta_type::<()>(), + error_enum_ty: meta_type::<()>(), + }, + CustomMetadata { + map: Default::default(), + }, + ); + let runtime_metadata: RuntimeMetadataPrefixed = meta.into(); + let metadata: subxt_metadata::Metadata = runtime_metadata.try_into().unwrap(); + + Metadata::from(metadata) + } + + #[test] + fn extrinsic_metadata_consistency() { + let metadata = metadata(); + + // Except our metadata to contain the registered types. + let pallet = metadata.pallet_by_index(0).expect("pallet exists"); + let extrinsic = pallet + .call_variant_by_index(2) + .expect("metadata contains the RuntimeCall enum with this pallet"); + + assert_eq!(pallet.name(), "Test"); + assert_eq!(&extrinsic.name, "TestCall"); + } + + #[test] + fn insufficient_extrinsic_bytes() { + let metadata = metadata(); + let ids = ExtrinsicPartTypeIds::new(&metadata).unwrap(); + + // Decode with empty bytes. + let result = ExtrinsicDetails::::decode_from(0, &[], metadata, ids); + assert_matches!(result.err(), Some(crate::Error::Codec(_))); + } + + #[test] + fn unsupported_version_extrinsic() { + let metadata = metadata(); + let ids = ExtrinsicPartTypeIds::new(&metadata).unwrap(); + + // Decode with invalid version. + let result = + ExtrinsicDetails::::decode_from(0, &vec![3u8].encode(), metadata, ids); + + assert_matches!( + result.err(), + Some(crate::Error::Block( + crate::error::BlockError::UnsupportedVersion(3) + )) + ); + } + + #[test] + fn statically_decode_extrinsic() { + let metadata = metadata(); + let ids = ExtrinsicPartTypeIds::new(&metadata).unwrap(); + + let tx = crate::dynamic::tx( + "Test", + "TestCall", + vec![ + Value::u128(10), + Value::bool(true), + Value::string("SomeValue"), + ], + ); + let tx_encoded = crate::tx::create_unsigned::(&tx, &metadata) + .expect("Valid dynamic parameters are provided"); + + // Note: `create_unsigned` produces the extrinsic bytes by prefixing the extrinsic length. + // The length is handled deserializing `ChainBlockExtrinsic`, therefore the first byte is not needed. + let extrinsic = ExtrinsicDetails::::decode_from( + 1, + tx_encoded.encoded(), + metadata, + ids, + ) + .expect("Valid extrinsic"); + + assert!(!extrinsic.is_signed()); + + assert_eq!(extrinsic.index(), 1); + + assert_eq!(extrinsic.pallet_index(), 0); + assert_eq!( + extrinsic + .pallet_name() + .expect("Valid metadata contains pallet name"), + "Test" + ); + + assert_eq!(extrinsic.variant_index(), 2); + assert_eq!( + extrinsic + .variant_name() + .expect("Valid metadata contains variant name"), + "TestCall" + ); + + // Decode the extrinsic to the root enum. + let decoded_extrinsic = extrinsic + .as_root_extrinsic::() + .expect("can decode extrinsic to root enum"); + + assert_eq!( + decoded_extrinsic, + RuntimeCall::Test(Pallet::TestCall { + value: 10, + signed: true, + name: "SomeValue".into(), + }) + ); + + // Decode the extrinsic to the extrinsic variant. + let decoded_extrinsic = extrinsic + .as_extrinsic::() + .expect("can decode extrinsic to extrinsic variant") + .expect("value cannot be None"); + + assert_eq!( + decoded_extrinsic, + TestCallExtrinsic { + value: 10, + signed: true, + name: "SomeValue".into(), + } + ); + } +} diff --git a/core/src/blocks/mod.rs b/core/src/blocks/mod.rs index 5fca97cb87..9ece750e81 100644 --- a/core/src/blocks/mod.rs +++ b/core/src/blocks/mod.rs @@ -1,19 +1,93 @@ -use scale_decode::DecodeAsFields; +// Copyright 2019-2024 Parity Technologies (UK) Ltd. +// This file is dual-licensed as Apache-2.0 or GPL-3.0. +// see LICENSE for license details. -/// Trait to uniquely identify the extrinsic's identity from the runtime metadata. -/// -/// Generated API structures that represent an extrinsic implement this trait. -/// -/// The trait is utilized to decode emitted extrinsics from a block, via obtaining the -/// form of the `Extrinsic` from the metadata. -pub trait StaticExtrinsic: DecodeAsFields { - /// Pallet name. - const PALLET: &'static str; - /// Call name. - const CALL: &'static str; +//! Decode and iterate over the extrinsics in block bodies. +//! +//! Use the [`decode_from`] function as an entry point to decoding extrinsics, and then +//! have a look at [`Extrinsics`] and [`ExtrinsicDetails`] to see which methods are available +//! to work with the extrinsics. +//! +//! # Example +//! +//! ```rust +//! extern crate alloc; +//! +//! use subxt_macro::subxt; +//! use subxt_core::blocks; +//! use subxt_core::metadata; +//! use subxt_core::config::PolkadotConfig; +//! use alloc::vec; +//! +//! // If we generate types without `subxt`, we need to point to `::subxt_core`: +//! #[subxt( +//! crate = "::subxt_core", +//! runtime_metadata_path = "../artifacts/polkadot_metadata_small.scale", +//! )] +//! pub mod polkadot {} +//! +//! // Some metadata we'd like to use to help us decode extrinsics: +//! let metadata_bytes = include_bytes!("../../../artifacts/polkadot_metadata_small.scale"); +//! let metadata = metadata::decode_from(&metadata_bytes[..]).unwrap(); +//! +//! // Some extrinsics we'd like to decode: +//! let ext_bytes = vec![ +//! hex::decode("280402000bf18367a38e01").unwrap(), +//! hex::decode("c10184008eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a4801f4de97941fcc3f95c761cd58d480bb41ce64836850f51b6fcc7542e809eb0a346fe95eb1b72de542273d4f1b00b636eb025e2b0e98cc498a095e7ce48f3d4f82b501040000001848656c6c6f21").unwrap(), +//! hex::decode("5102840090b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe2201ac0c06f55cf3461067bbe48da16efbb50dfad555e2821ce20d37b2e42d6dcb439acd40f742b12ef00f8889944060b04373dc4d34a1992042fd269e8ec1e64a848502000004000090b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe2217000010632d5ec76b05").unwrap() +//! ]; +//! +//! // Given some chain config and metadata, we know how to decode the bytes. +//! let exts = blocks::decode_from::(ext_bytes, metadata).unwrap(); +//! +//! // We'll see 3 extrinsics: +//! assert_eq!(exts.len(), 3); +//! +//! // We can iterate over them and decode various details out of them. +//! for ext in exts.iter() { +//! let ext = ext.unwrap(); +//! println!("Pallet: {}", ext.pallet_name().unwrap()); +//! println!("Call: {}", ext.variant_name().unwrap()); +//! } +//! +//! # let ext_details: Vec<_> = exts.iter() +//! # .map(|ext| { +//! # let ext = ext.unwrap(); +//! # let pallet = ext.pallet_name().unwrap().to_string(); +//! # let call = ext.variant_name().unwrap().to_string(); +//! # (pallet, call) +//! # }) +//! # .collect(); +//! # +//! # assert_eq!(ext_details, vec![ +//! # ("Timestamp".to_owned(), "set".to_owned()), +//! # ("System".to_owned(), "remark".to_owned()), +//! # ("Balances".to_owned(), "transfer_allow_death".to_owned()), +//! # ]); +//! ``` + +mod extrinsic_signed_extensions; +mod extrinsics; +mod static_extrinsic; - /// Returns true if the given pallet and call names match this extrinsic. - fn is_extrinsic(pallet: &str, call: &str) -> bool { - Self::PALLET == pallet && Self::CALL == call - } +use crate::config::Config; +use crate::error::BlockError; +use crate::Metadata; +use alloc::vec::Vec; + +pub use extrinsic_signed_extensions::{ExtrinsicSignedExtension, ExtrinsicSignedExtensions}; +pub use extrinsics::{ + ExtrinsicDetails, ExtrinsicMetadataDetails, Extrinsics, FoundExtrinsic, SignedExtrinsicDetails, +}; +pub use static_extrinsic::StaticExtrinsic; + +/// Instantiate a new [`Extrinsics`] object, given a vector containing each extrinsic hash (in the +/// form of bytes) and some metadata that we'll use to decode them. +/// +/// This is a shortcut for [`Extrinsics::decode_from`]. +pub fn decode_from( + extrinsics: Vec>, + metadata: Metadata, +) -> Result, BlockError> { + Extrinsics::decode_from(extrinsics, metadata) } diff --git a/core/src/blocks/static_extrinsic.rs b/core/src/blocks/static_extrinsic.rs new file mode 100644 index 0000000000..263977863d --- /dev/null +++ b/core/src/blocks/static_extrinsic.rs @@ -0,0 +1,23 @@ +// Copyright 2019-2024 Parity Technologies (UK) Ltd. +// This file is dual-licensed as Apache-2.0 or GPL-3.0. +// see LICENSE for license details. + +use scale_decode::DecodeAsFields; + +/// Trait to uniquely identify the extrinsic's identity from the runtime metadata. +/// +/// Generated API structures that represent an extrinsic implement this trait. +/// +/// The trait is utilized to decode emitted extrinsics from a block, via obtaining the +/// form of the `Extrinsic` from the metadata. +pub trait StaticExtrinsic: DecodeAsFields { + /// Pallet name. + const PALLET: &'static str; + /// Call name. + const CALL: &'static str; + + /// Returns true if the given pallet and call names match this extrinsic. + fn is_extrinsic(pallet: &str, call: &str) -> bool { + Self::PALLET == pallet && Self::CALL == call + } +} diff --git a/core/src/client/mod.rs b/core/src/client.rs similarity index 50% rename from core/src/client/mod.rs rename to core/src/client.rs index 3368da606d..0c196ac888 100644 --- a/core/src/client/mod.rs +++ b/core/src/client.rs @@ -1,61 +1,31 @@ +// Copyright 2019-2024 Parity Technologies (UK) Ltd. +// This file is dual-licensed as Apache-2.0 or GPL-3.0. +// see LICENSE for license details. + +//! A couple of client types that we use elsewhere. + use crate::{config::Config, metadata::Metadata}; use derive_where::derive_where; -/// Each client should be able to provide access to the following fields -/// - runtime version -/// - genesis hash -/// - metadata +/// This provides access to some relevant client state in signed extensions, +/// and is just a combination of some of the available properties. #[derive_where(Clone, Debug)] pub struct ClientState { - genesis_hash: C::Hash, - runtime_version: RuntimeVersion, - metadata: Metadata, -} - -impl ClientState { - pub fn new(genesis_hash: C::Hash, runtime_version: RuntimeVersion, metadata: Metadata) -> Self { - Self { - genesis_hash, - runtime_version, - metadata, - } - } - - pub fn metadata(&self) -> Metadata { - self.metadata.clone() - } - - pub fn runtime_version(&self) -> RuntimeVersion { - self.runtime_version - } - - pub fn genesis_hash(&self) -> C::Hash { - self.genesis_hash - } + /// Genesis hash. + pub genesis_hash: C::Hash, + /// Runtime version. + pub runtime_version: RuntimeVersion, + /// Metadata. + pub metadata: Metadata, } /// Runtime version information needed to submit transactions. #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct RuntimeVersion { - spec_version: u32, - transaction_version: u32, -} - -impl RuntimeVersion { - pub fn new(spec_version: u32, transaction_version: u32) -> Self { - RuntimeVersion { - spec_version, - transaction_version, - } - } - /// Version of the runtime specification. A full-node will not attempt to use its native /// runtime in substitute for the on-chain Wasm runtime unless all of `spec_name`, /// `spec_version` and `authoring_version` are the same between Wasm and native. - pub fn spec_version(&self) -> u32 { - self.spec_version - } - + pub spec_version: u32, /// All existing dispatches are fully compatible when this number doesn't change. If this /// number changes, then `spec_version` must change, also. /// @@ -65,7 +35,5 @@ impl RuntimeVersion { /// dispatchable/module changing its index. /// /// It need *not* change when a new module is added or when a dispatchable is added. - pub fn transaction_version(&self) -> u32 { - self.transaction_version - } + pub transaction_version: u32, } diff --git a/core/src/config/default_extrinsic_params.rs b/core/src/config/default_extrinsic_params.rs index 1ed66c34fb..344c1a3c4e 100644 --- a/core/src/config/default_extrinsic_params.rs +++ b/core/src/config/default_extrinsic_params.rs @@ -1,4 +1,4 @@ -// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// Copyright 2019-2024 Parity Technologies (UK) Ltd. // This file is dual-licensed as Apache-2.0 or GPL-3.0. // see LICENSE for license details. diff --git a/core/src/config/extrinsic_params.rs b/core/src/config/extrinsic_params.rs index 51a1b0444e..1f13e45fe9 100644 --- a/core/src/config/extrinsic_params.rs +++ b/core/src/config/extrinsic_params.rs @@ -1,4 +1,4 @@ -// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// Copyright 2019-2024 Parity Technologies (UK) Ltd. // This file is dual-licensed as Apache-2.0 or GPL-3.0. // see LICENSE for license details. diff --git a/core/src/config/polkadot.rs b/core/src/config/polkadot.rs index 04e662277f..500ea80521 100644 --- a/core/src/config/polkadot.rs +++ b/core/src/config/polkadot.rs @@ -1,4 +1,4 @@ -// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// Copyright 2019-2024 Parity Technologies (UK) Ltd. // This file is dual-licensed as Apache-2.0 or GPL-3.0. // see LICENSE for license details. diff --git a/core/src/config/refine_params.rs b/core/src/config/refine_params.rs index 978c5f58e8..eaf7b44450 100644 --- a/core/src/config/refine_params.rs +++ b/core/src/config/refine_params.rs @@ -1,4 +1,4 @@ -// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// Copyright 2019-2024 Parity Technologies (UK) Ltd. // This file is dual-licensed as Apache-2.0 or GPL-3.0. // see LICENSE for license details. diff --git a/core/src/config/signed_extensions.rs b/core/src/config/signed_extensions.rs index 9b99fec022..4ecd6684db 100644 --- a/core/src/config/signed_extensions.rs +++ b/core/src/config/signed_extensions.rs @@ -1,4 +1,4 @@ -// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// Copyright 2019-2024 Parity Technologies (UK) Ltd. // This file is dual-licensed as Apache-2.0 or GPL-3.0. // see LICENSE for license details. @@ -47,7 +47,7 @@ impl ExtrinsicParams for CheckSpecVersion { type Params = (); fn new(client: &ClientState, _params: Self::Params) -> Result { - Ok(CheckSpecVersion(client.runtime_version().spec_version())) + Ok(CheckSpecVersion(client.runtime_version.spec_version)) } } @@ -109,9 +109,7 @@ impl ExtrinsicParams for CheckTxVersion { type Params = (); fn new(client: &ClientState, _params: Self::Params) -> Result { - Ok(CheckTxVersion( - client.runtime_version().transaction_version(), - )) + Ok(CheckTxVersion(client.runtime_version.transaction_version)) } } @@ -135,7 +133,7 @@ impl ExtrinsicParams for CheckGenesis { type Params = (); fn new(client: &ClientState, _params: Self::Params) -> Result { - Ok(CheckGenesis(client.genesis_hash())) + Ok(CheckGenesis(client.genesis_hash)) } } @@ -209,12 +207,12 @@ impl ExtrinsicParams for CheckMortality { let check_mortality = if let Some(params) = params.0 { CheckMortality { era: params.era, - checkpoint: params.checkpoint.unwrap_or(client.genesis_hash()), + checkpoint: params.checkpoint.unwrap_or(client.genesis_hash), } } else { CheckMortality { era: Era::Immortal, - checkpoint: client.genesis_hash(), + checkpoint: client.genesis_hash, } }; Ok(check_mortality) @@ -402,7 +400,7 @@ macro_rules! impl_tuples { client: &ClientState, params: Self::Params, ) -> Result { - let metadata = client.metadata(); + let metadata = &client.metadata; let types = metadata.types(); // For each signed extension in the tuple, find the matching index in the metadata, if diff --git a/core/src/config/substrate.rs b/core/src/config/substrate.rs index f0c7db78e5..9c7ff96e9e 100644 --- a/core/src/config/substrate.rs +++ b/core/src/config/substrate.rs @@ -1,4 +1,4 @@ -// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// Copyright 2019-2024 Parity Technologies (UK) Ltd. // This file is dual-licensed as Apache-2.0 or GPL-3.0. // see LICENSE for license details. diff --git a/core/src/constants/constant_address.rs b/core/src/constants/address.rs similarity index 93% rename from core/src/constants/constant_address.rs rename to core/src/constants/address.rs index da7b1bf982..c111277a8d 100644 --- a/core/src/constants/constant_address.rs +++ b/core/src/constants/address.rs @@ -1,7 +1,9 @@ -// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// Copyright 2019-2024 Parity Technologies (UK) Ltd. // This file is dual-licensed as Apache-2.0 or GPL-3.0. // see LICENSE for license details. +//! Construct addresses to access constants with. + use crate::dynamic::DecodedValueThunk; use crate::metadata::DecodeWithMetadata; use alloc::borrow::Cow; @@ -10,7 +12,7 @@ use derive_where::derive_where; /// This represents a constant address. Anything implementing this trait /// can be used to fetch constants. -pub trait ConstantAddress { +pub trait AddressT { /// The target type of the value that lives at this address. type Target: DecodeWithMetadata; @@ -78,7 +80,7 @@ impl Address { } } -impl ConstantAddress for Address { +impl AddressT for Address { type Target = ReturnTy; fn pallet_name(&self) -> &str { diff --git a/core/src/constants/mod.rs b/core/src/constants/mod.rs index 5d8419ae0b..6c2d0bcc1e 100644 --- a/core/src/constants/mod.rs +++ b/core/src/constants/mod.rs @@ -1,29 +1,56 @@ -// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// Copyright 2019-2024 Parity Technologies (UK) Ltd. // This file is dual-licensed as Apache-2.0 or GPL-3.0. // see LICENSE for license details. -//! Types associated with accessing constants. +//! Access constants from metadata. +//! +//! Use [`get`] to retrieve a constant from some metadata, or [`validate`] to check that a static +//! constant address lines up with the value seen in the metadata. +//! +//! # Example +//! +//! ```rust +//! use subxt_macro::subxt; +//! use subxt_core::constants; +//! use subxt_core::metadata; +//! +//! // If we generate types without `subxt`, we need to point to `::subxt_core`: +//! #[subxt( +//! crate = "::subxt_core", +//! runtime_metadata_path = "../artifacts/polkadot_metadata_small.scale", +//! )] +//! pub mod polkadot {} +//! +//! // Some metadata we'd like to access constants in: +//! let metadata_bytes = include_bytes!("../../../artifacts/polkadot_metadata_small.scale"); +//! let metadata = metadata::decode_from(&metadata_bytes[..]).unwrap(); +//! +//! // We can use a static address to obtain some constant: +//! let address = polkadot::constants().balances().existential_deposit(); +//! +//! // This validates that the address given is in line with the metadata +//! // we're trying to access the constant in: +//! constants::validate(&address, &metadata).expect("is valid"); +//! +//! // This acquires the constant (and internally also validates it): +//! let ed = constants::get(&address, &metadata).expect("can decode constant"); +//! +//! assert_eq!(ed, 33_333_333); +//! ``` -mod constant_address; - -pub use constant_address::{dynamic, Address, ConstantAddress, DynamicAddress}; +pub mod address; +use address::AddressT; use alloc::borrow::ToOwned; -use crate::{ - error::MetadataError, - metadata::{DecodeWithMetadata, MetadataExt}, - Error, Metadata, -}; +use crate::{error::MetadataError, metadata::DecodeWithMetadata, Error, Metadata}; -/// Run validation logic against some constant address you'd like to access. Returns `Ok(())` -/// if the address is valid (or if it's not possible to check since the address has no validation hash). -/// Return an error if the address was not valid or something went wrong trying to validate it (ie -/// the pallet or constant in question do not exist at all). -pub fn validate_constant( - metadata: &subxt_metadata::Metadata, - address: &Address, -) -> Result<(), Error> { +/// When the provided `address` is statically generated via the `#[subxt]` macro, this validates +/// that the shape of the constant value is the same as the shape expected by the static address. +/// +/// When the provided `address` is dynamic (and thus does not come with any expectation of the +/// shape of the constant value), this just returns `Ok(())` +pub fn validate(address: &Address, metadata: &Metadata) -> Result<(), Error> { if let Some(actual_hash) = address.validation_hash() { let expected_hash = metadata .pallet_by_name_err(address.pallet_name())? @@ -38,12 +65,14 @@ pub fn validate_constant( Ok(()) } -pub fn get_constant( - metadata: &Metadata, +/// Fetch a constant out of the metadata given a constant address. If the `address` has been +/// statically generated, this will validate that the constant shape is as expected, too. +pub fn get( address: &Address, + metadata: &Metadata, ) -> Result { // 1. Validate constant shape if hash given: - validate_constant(metadata, address)?; + validate(address, metadata)?; // 2. Attempt to decode the constant into the type given: let constant = metadata diff --git a/core/src/custom_values/custom_value_address.rs b/core/src/custom_values/address.rs similarity index 73% rename from core/src/custom_values/custom_value_address.rs rename to core/src/custom_values/address.rs index 0ba6c47836..7fbf02c7a6 100644 --- a/core/src/custom_values/custom_value_address.rs +++ b/core/src/custom_values/address.rs @@ -1,14 +1,20 @@ -use derive_where::derive_where; +// Copyright 2019-2024 Parity Technologies (UK) Ltd. +// This file is dual-licensed as Apache-2.0 or GPL-3.0. +// see LICENSE for license details. + +//! Construct addresses to access custom values with. use crate::dynamic::DecodedValueThunk; use crate::metadata::DecodeWithMetadata; -use crate::utils::Yes; +use derive_where::derive_where; + +/// Use this with [`AddressT::IsDecodable`]. +pub use crate::utils::Yes; -/// This represents the address of a custom value in the metadata. -/// Anything, that implements the [CustomValueAddress] trait can be used, to fetch -/// custom values from the metadata. -/// The trait is implemented by [str] for dynamic loopup and [StaticAddress] for static queries. -pub trait CustomValueAddress { +/// This represents the address of a custom value in in the metadata. +/// Anything that implements it can be used to fetch custom values from the metadata. +/// The trait is implemented by [`str`] for dynamic lookup and [`StaticAddress`] for static queries. +pub trait AddressT { /// The type of the custom value. type Target: DecodeWithMetadata; /// Should be set to `Yes` for Dynamic values and static values that have a valid type. @@ -24,7 +30,7 @@ pub trait CustomValueAddress { } } -impl CustomValueAddress for str { +impl AddressT for str { type Target = DecodedValueThunk; type IsDecodable = Yes; @@ -62,7 +68,7 @@ impl StaticAddress { } } -impl CustomValueAddress for StaticAddress { +impl AddressT for StaticAddress { type Target = R; type IsDecodable = Y; diff --git a/core/src/custom_values/mod.rs b/core/src/custom_values/mod.rs index a457c42506..2ecdfc89d4 100644 --- a/core/src/custom_values/mod.rs +++ b/core/src/custom_values/mod.rs @@ -1,27 +1,48 @@ -// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// Copyright 2019-2024 Parity Technologies (UK) Ltd. // This file is dual-licensed as Apache-2.0 or GPL-3.0. // see LICENSE for license details. -//! Types associated with accessing custom types - -mod custom_value_address; +//! Access custom values from metadata. +//! +//! Use [`get`] to retrieve a custom value from some metadata, or [`validate`] to check that a +//! static custom value address lines up with the value seen in the metadata. +//! +//! # Example +//! +//! ```rust +//! use subxt_macro::subxt; +//! use subxt_core::custom_values; +//! use subxt_core::metadata; +//! +//! // If we generate types without `subxt`, we need to point to `::subxt_core`: +//! #[subxt( +//! crate = "::subxt_core", +//! runtime_metadata_path = "../artifacts/polkadot_metadata_small.scale", +//! )] +//! pub mod polkadot {} +//! +//! // Some metadata we'd like to access custom values in: +//! let metadata_bytes = include_bytes!("../../../artifacts/polkadot_metadata_small.scale"); +//! let metadata = metadata::decode_from(&metadata_bytes[..]).unwrap(); +//! +//! // At the moment, we don't expect to see any custom values in the metadata +//! // for Polkadot, so this will return an error: +//! let err = custom_values::get("Foo", &metadata); +//! ``` + +pub mod address; use crate::utils::Yes; -pub use custom_value_address::{CustomValueAddress, StaticAddress}; - -use crate::{ - error::MetadataError, - metadata::{DecodeWithMetadata, MetadataExt}, - Error, Metadata, -}; +use crate::{error::MetadataError, metadata::DecodeWithMetadata, Error, Metadata}; +use address::AddressT; use alloc::vec::Vec; /// Run the validation logic against some custom value address you'd like to access. Returns `Ok(())` /// if the address is valid (or if it's not possible to check since the address has no validation hash). /// Returns an error if the address was not valid (wrong name, type or raw bytes) -pub fn validate_custom_value( - metadata: &Metadata, +pub fn validate( address: &Address, + metadata: &Metadata, ) -> Result<(), Error> { if let Some(actual_hash) = address.validation_hash() { let custom = metadata.custom(); @@ -41,12 +62,12 @@ pub fn validate_custom_value( /// Access a custom value by the address it is registered under. This can be just a [str] to get back a dynamic value, /// or a static address from the generated static interface to get a value of a static type returned. -pub fn get_custom_value + ?Sized>( - metadata: &Metadata, +pub fn get + ?Sized>( address: &Address, + metadata: &Metadata, ) -> Result { // 1. Validate custom value shape if hash given: - validate_custom_value(metadata, address)?; + validate(address, metadata)?; // 2. Attempt to decode custom value: let custom_value = metadata.custom_value_by_name_err(address.name())?; @@ -59,12 +80,12 @@ pub fn get_custom_value + ?Sized> } /// Access the bytes of a custom value by the address it is registered under. -pub fn get_custom_value_bytes( - metadata: &Metadata, +pub fn get_bytes( address: &Address, + metadata: &Metadata, ) -> Result, Error> { // 1. Validate custom value shape if hash given: - validate_custom_value(metadata, address)?; + validate(address, metadata)?; // 2. Return the underlying bytes: let custom_value = metadata.custom_value_by_name_err(address.name())?; @@ -73,6 +94,8 @@ pub fn get_custom_value_bytes( #[cfg(test)] mod tests { + use super::*; + use alloc::collections::BTreeMap; use codec::Encode; use scale_decode::DecodeAsType; @@ -83,8 +106,7 @@ mod tests { use alloc::string::String; use alloc::vec; - use crate::custom_values::get_custom_value; - use crate::Metadata; + use crate::custom_values; #[derive(Debug, Clone, PartialEq, Eq, Encode, TypeInfo, DecodeAsType)] pub struct Person { @@ -135,15 +157,15 @@ mod tests { }; let metadata: subxt_metadata::Metadata = frame_metadata.try_into().unwrap(); - Metadata::new(metadata) + Metadata::from(metadata) } #[test] fn test_decoding() { let metadata = mock_metadata(); - assert!(get_custom_value(&metadata, "Invalid Address").is_err()); - let person_decoded_value_thunk = get_custom_value(&metadata, "Mr. Robot").unwrap(); + assert!(custom_values::get("Invalid Address", &metadata).is_err()); + let person_decoded_value_thunk = custom_values::get("Mr. Robot", &metadata).unwrap(); let person: Person = person_decoded_value_thunk.as_type().unwrap(); assert_eq!( person, diff --git a/core/src/dynamic.rs b/core/src/dynamic.rs index 05a03117e7..76ac9f6d5f 100644 --- a/core/src/dynamic.rs +++ b/core/src/dynamic.rs @@ -1,4 +1,4 @@ -// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// Copyright 2019-2024 Parity Technologies (UK) Ltd. // This file is dual-licensed as Apache-2.0 or GPL-3.0. // see LICENSE for license details. @@ -17,16 +17,16 @@ pub use scale_value::{At, Value}; pub type DecodedValue = scale_value::Value; // Submit dynamic transactions. -pub use crate::tx::dynamic as tx; +pub use crate::tx::payload::dynamic as tx; // Lookup constants dynamically. -pub use crate::constants::dynamic as constant; +pub use crate::constants::address::dynamic as constant; // Lookup storage values dynamically. -pub use crate::storage::dynamic as storage; +pub use crate::storage::address::dynamic as storage; // Execute runtime API function call dynamically. -pub use crate::runtime_api::dynamic as runtime_api_call; +pub use crate::runtime_api::payload::dynamic as runtime_api_call; /// This is the result of making a dynamic request to a node. From this, /// we can return the raw SCALE bytes that we were handed back, or we can diff --git a/core/src/error.rs b/core/src/error.rs index 64fe0b7250..f9f8b0a629 100644 --- a/core/src/error.rs +++ b/core/src/error.rs @@ -1,15 +1,24 @@ +// Copyright 2019-2024 Parity Technologies (UK) Ltd. +// This file is dual-licensed as Apache-2.0 or GPL-3.0. +// see LICENSE for license details. + +//! The errors that can be emitted in this crate. + use alloc::boxed::Box; use alloc::string::String; use derive_more::{Display, From}; use subxt_metadata::StorageHasher; +/// The error emitted when something goes wrong. #[derive(Debug, Display, From)] pub enum Error { /// Codec error. #[display(fmt = "Scale codec error: {_0}")] Codec(codec::Error), + /// Metadata error. #[display(fmt = "Metadata Error: {_0}")] Metadata(MetadataError), + /// Storage address error. #[display(fmt = "Storage Error: {_0}")] StorageAddress(StorageAddressError), /// Error decoding to a [`crate::dynamic::Value`]. @@ -21,16 +30,39 @@ pub enum Error { /// Error constructing the appropriate extrinsic params. #[display(fmt = "Extrinsic params error: {_0}")] ExtrinsicParams(ExtrinsicParamsError), + /// Block body error. + #[display(fmt = "Error working with block body: {_0}")] + Block(BlockError), } +#[cfg(feature = "std")] +impl std::error::Error for Error {} + impl From for Error { fn from(value: scale_decode::visitor::DecodeError) -> Self { Error::Decode(value.into()) } } +/// Block error +#[derive(Clone, Debug, Display, Eq, PartialEq)] +pub enum BlockError { + /// Extrinsic type ID cannot be resolved with the provided metadata. + #[display( + fmt = "Extrinsic type ID cannot be resolved with the provided metadata. Make sure this is a valid metadata" + )] + MissingType, + /// Unsupported signature. + #[display(fmt = "Unsupported extrinsic version, only version 4 is supported currently")] + /// The extrinsic has an unsupported version. + UnsupportedVersion(u8), + /// Decoding error. + #[display(fmt = "Cannot decode extrinsic: {_0}")] + DecodingError(codec::Error), +} + #[cfg(feature = "std")] -impl std::error::Error for Error {} +impl std::error::Error for BlockError {} /// Something went wrong trying to access details in the metadata. #[derive(Clone, Debug, PartialEq, Display)] diff --git a/core/src/events/mod.rs b/core/src/events.rs similarity index 91% rename from core/src/events/mod.rs rename to core/src/events.rs index 456498bdb5..957d41de3e 100644 --- a/core/src/events/mod.rs +++ b/core/src/events.rs @@ -1,3 +1,43 @@ +// Copyright 2019-2024 Parity Technologies (UK) Ltd. +// This file is dual-licensed as Apache-2.0 or GPL-3.0. +// see LICENSE for license details. + +//! Decode and work with events. +//! +//! # Example +//! +//! ```rust +//! use subxt_macro::subxt; +//! use subxt_core::config::PolkadotConfig; +//! use subxt_core::events; +//! use subxt_core::metadata; +//! +//! // If we generate types without `subxt`, we need to point to `::subxt_core`: +//! #[subxt( +//! crate = "::subxt_core", +//! runtime_metadata_path = "../artifacts/polkadot_metadata_full.scale", +//! )] +//! pub mod polkadot {} +//! +//! // Some metadata we'll use to work with storage entries: +//! let metadata_bytes = include_bytes!("../../artifacts/polkadot_metadata_full.scale"); +//! let metadata = metadata::decode_from(&metadata_bytes[..]).unwrap(); +//! +//! // Some bytes representing events (located in System.Events storage): +//! let event_bytes = hex::decode("1c00000000000000a2e9b53d5517020000000100000000000310c96d901d0102000000020000000408d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27dbeea5a030000000000000000000000000000020000000402d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48102700000000000000000000000000000000020000000407be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25fbeea5a030000000000000000000000000000020000002100d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27dbeea5a03000000000000000000000000000000000000000000000000000000000000020000000000426df03e00000000").unwrap(); +//! +//! // We can decode these bytes like so: +//! let evs = events::decode_from::(event_bytes, metadata); +//! +//! // And then do things like iterate over them and inspect details: +//! for ev in evs.iter() { +//! let ev = ev.unwrap(); +//! println!("Index: {}", ev.index()); +//! println!("Name: {}.{}", ev.pallet_name(), ev.variant_name()); +//! println!("Fields: {:?}", ev.field_values().unwrap()); +//! } +//! ``` + use alloc::sync::Arc; use alloc::vec::Vec; use codec::{Compact, Decode, Encode}; @@ -7,6 +47,13 @@ use subxt_metadata::PalletMetadata; use crate::{error::MetadataError, Config, Error, Metadata}; +/// Create a new [`Events`] instance from the given bytes. +/// +/// This is a shortcut for [`Events::decode_from`]. +pub fn decode_from(event_bytes: Vec, metadata: Metadata) -> Events { + Events::decode_from(event_bytes, metadata) +} + /// Trait to uniquely identify the events's identity from the runtime metadata. /// /// Generated API structures that represent an event implement this trait. @@ -52,7 +99,7 @@ impl core::fmt::Debug for Events { impl Events { /// Create a new [`Events`] instance from the given bytes. - pub fn decode_from(metadata: Metadata, event_bytes: Vec) -> Self { + pub fn decode_from(event_bytes: Vec, metadata: Metadata) -> Self { // event_bytes is a SCALE encoded vector of events. So, pluck the // compact encoded length from the front, leaving the remaining bytes // for our iterating to decode. @@ -85,6 +132,11 @@ impl Events { self.num_events == 0 } + /// Return the bytes representing all of the events. + pub fn bytes(&self) -> &[u8] { + &self.event_bytes + } + /// Iterate over all of the events, using metadata to dynamically /// decode them as we go, and returning the raw bytes and other associated /// details. If an error occurs, all subsequent iterations return `None`. @@ -276,12 +328,12 @@ impl EventDetails { /// The name of the pallet from whence the Event originated. pub fn pallet_name(&self) -> &str { - self.event_metadata().pallet().name() + self.event_metadata().pallet.name() } /// The name of the event (ie the name of the variant that it corresponds to). pub fn variant_name(&self) -> &str { - &self.event_metadata().variant().name + &self.event_metadata().variant.name } /// Fetch details from the metadata for this event. @@ -370,17 +422,10 @@ impl EventDetails { /// Details for the given event plucked from the metadata. pub struct EventMetadataDetails<'a> { - pallet: PalletMetadata<'a>, - variant: &'a scale_info::Variant, -} - -impl<'a> EventMetadataDetails<'a> { - pub fn pallet(&self) -> PalletMetadata<'a> { - self.pallet - } - pub fn variant(&self) -> &'a scale_info::Variant { - self.variant - } + /// Metadata for the pallet that the event belongs to. + pub pallet: PalletMetadata<'a>, + /// Metadata for the variant which describes the pallet events. + pub variant: &'a scale_info::Variant, } /// Event related test utilities used outside this module. @@ -504,8 +549,9 @@ pub(crate) mod test_utils { }, ); let runtime_metadata: RuntimeMetadataPrefixed = meta.into(); + let metadata: subxt_metadata::Metadata = runtime_metadata.try_into().unwrap(); - Metadata::new(runtime_metadata.try_into().unwrap()) + Metadata::from(metadata) } /// Build an `Events` object for test purposes, based on the details provided, @@ -532,7 +578,7 @@ pub(crate) mod test_utils { // Prepend compact encoded length to event bytes: let mut all_event_bytes = Compact(num_events).encode(); all_event_bytes.extend(event_bytes); - Events::decode_from(metadata, all_event_bytes) + Events::decode_from(all_event_bytes, metadata) } } diff --git a/core/src/lib.rs b/core/src/lib.rs index ff7664b014..f76a80f1e8 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -2,13 +2,30 @@ // This file is dual-licensed as Apache-2.0 or GPL-3.0. // see LICENSE for license details. -//! # Subxt-core +//! # subxt-core +//! +//! A `#[no_std]` compatible subset of the functionality provided in the `subxt` crate. This +//! contains the core logic for encoding and decoding things, but nothing related to networking. +//! +//! Here's an overview of the main things exposed here: +//! +//! - [`blocks`]: decode and explore block bodies. +//! - [`constants`]: access and validate the constant addresses in some metadata. +//! - [`custom_values`]: access and validate the custom value addresses in some metadata. +//! - [`metadata`]: decode bytes into the metadata used throughout this library. +//! - [`storage`]: construct storage request payloads and decode the results you'd get back. +//! - [`tx`]: construct and sign transactions (extrinsics). +//! - [`runtime_api`]: construct runtime API request payloads and decode the results you'd get back. +//! - [`events`]: decode and explore events. //! -//! `#[no_std]` compatible core crate for subxt. +#![deny(missing_docs)] #![cfg_attr(not(feature = "std"), no_std)] pub extern crate alloc; +#[macro_use] +mod macros; + pub mod blocks; pub mod client; pub mod config; @@ -27,13 +44,12 @@ pub use config::Config; pub use error::Error; pub use metadata::Metadata; -#[macro_use] -mod macros; - +/// Re-exports of some of the key external crates. pub mod ext { pub use codec; pub use scale_decode; pub use scale_encode; + pub use scale_value; cfg_substrate_compat! { pub use sp_runtime; diff --git a/core/src/macros.rs b/core/src/macros.rs index 1a61ee9354..8e25742c88 100644 --- a/core/src/macros.rs +++ b/core/src/macros.rs @@ -1,3 +1,7 @@ +// Copyright 2019-2024 Parity Technologies (UK) Ltd. +// This file is dual-licensed as Apache-2.0 or GPL-3.0. +// see LICENSE for license details. + macro_rules! cfg_feature { ($feature:literal, $($item:item)*) => { $( diff --git a/core/src/metadata/decode_encode_traits.rs b/core/src/metadata/decode_encode_traits.rs index b0ca04fab0..13bbd0f605 100644 --- a/core/src/metadata/decode_encode_traits.rs +++ b/core/src/metadata/decode_encode_traits.rs @@ -1,4 +1,4 @@ -// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// Copyright 2019-2024 Parity Technologies (UK) Ltd. // This file is dual-licensed as Apache-2.0 or GPL-3.0. // see LICENSE for license details. diff --git a/core/src/metadata/metadata_type.rs b/core/src/metadata/metadata_type.rs index 7d394e93ec..a4e62f8239 100644 --- a/core/src/metadata/metadata_type.rs +++ b/core/src/metadata/metadata_type.rs @@ -1,4 +1,4 @@ -// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// Copyright 2019-2024 Parity Technologies (UK) Ltd. // This file is dual-licensed as Apache-2.0 or GPL-3.0. // see LICENSE for license details. @@ -21,12 +21,6 @@ impl core::ops::Deref for Metadata { } impl Metadata { - pub fn new(md: subxt_metadata::Metadata) -> Self { - Metadata { - inner: Arc::new(md), - } - } - /// Identical to `metadata.pallet_by_name()`, but returns an error if the pallet is not found. pub fn pallet_by_name_err( &self, @@ -53,11 +47,23 @@ impl Metadata { self.runtime_api_trait_by_name(name) .ok_or_else(|| MetadataError::RuntimeTraitNotFound(name.to_owned())) } + + /// Identical to `metadata.custom().get(name)`, but returns an error if the trait is not found. + pub fn custom_value_by_name_err( + &self, + name: &str, + ) -> Result { + self.custom() + .get(name) + .ok_or_else(|| MetadataError::CustomValueNameNotFound(name.to_owned())) + } } impl From for Metadata { fn from(md: subxt_metadata::Metadata) -> Self { - Metadata::new(md) + Metadata { + inner: Arc::new(md), + } } } @@ -70,68 +76,6 @@ impl TryFrom for Metadata { impl codec::Decode for Metadata { fn decode(input: &mut I) -> Result { - subxt_metadata::Metadata::decode(input).map(Metadata::new) - } -} - -/// Some extension methods on [`subxt_metadata::Metadata`] that return Errors instead of Options. -pub trait MetadataExt { - fn pallet_by_name_err( - &self, - name: &str, - ) -> Result; - - fn pallet_by_index_err( - &self, - index: u8, - ) -> Result; - - fn runtime_api_trait_by_name_err( - &self, - name: &str, - ) -> Result; - - fn custom_value_by_name_err( - &self, - name: &str, - ) -> Result; -} - -impl MetadataExt for subxt_metadata::Metadata { - /// Identical to `metadata.pallet_by_name()`, but returns an error if the pallet is not found. - fn pallet_by_name_err( - &self, - name: &str, - ) -> Result { - self.pallet_by_name(name) - .ok_or_else(|| MetadataError::PalletNameNotFound(name.to_owned())) - } - - /// Identical to `metadata.pallet_by_index()`, but returns an error if the pallet is not found. - fn pallet_by_index_err( - &self, - index: u8, - ) -> Result { - self.pallet_by_index(index) - .ok_or(MetadataError::PalletIndexNotFound(index)) - } - - /// Identical to `metadata.runtime_api_trait_by_name()`, but returns an error if the trait is not found. - fn runtime_api_trait_by_name_err( - &self, - name: &str, - ) -> Result { - self.runtime_api_trait_by_name(name) - .ok_or_else(|| MetadataError::RuntimeTraitNotFound(name.to_owned())) - } - - /// Identical to `metadata.runtime_api_trait_by_name()`, but returns an error if the trait is not found. - fn custom_value_by_name_err( - &self, - name: &str, - ) -> Result { - self.custom() - .get(name) - .ok_or_else(|| MetadataError::CustomValueNameNotFound(name.to_owned())) + subxt_metadata::Metadata::decode(input).map(Metadata::from) } } diff --git a/core/src/metadata/mod.rs b/core/src/metadata/mod.rs index 3a43853916..480b434bfc 100644 --- a/core/src/metadata/mod.rs +++ b/core/src/metadata/mod.rs @@ -1,14 +1,34 @@ -// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// Copyright 2019-2024 Parity Technologies (UK) Ltd. // This file is dual-licensed as Apache-2.0 or GPL-3.0. // see LICENSE for license details. -//! Types representing the metadata obtained from a node. +//! A [`Metadata`] type, which is used through this crate. +//! +//! This can be decoded from the bytes handed back from a node when asking for metadata. +//! +//! # Examples +//! +//! ```rust +//! use subxt_core::metadata; +//! +//! // We need to fetch the bytes from somewhere, and then we can decode them: +//! let metadata_bytes = include_bytes!("../../../artifacts/polkadot_metadata_small.scale"); +//! let metadata = metadata::decode_from(&metadata_bytes[..]).unwrap(); +//! ``` mod decode_encode_traits; mod metadata_type; +use codec::Decode; + pub use decode_encode_traits::{DecodeWithMetadata, EncodeWithMetadata}; -pub use metadata_type::{Metadata, MetadataExt}; +pub use metadata_type::Metadata; -// Expose metadata types under a sub module in case somebody needs to reference them: -pub use subxt_metadata as types; +/// Attempt to decode some bytes into [`Metadata`], returning an error +/// if decoding fails. +/// +/// This is a shortcut for importing [`codec::Decode`] and using the +/// implementation of that on [`Metadata`]. +pub fn decode_from(bytes: &[u8]) -> Result { + Metadata::decode(&mut &*bytes) +} diff --git a/core/src/runtime_api/mod.rs b/core/src/runtime_api/mod.rs index 4f0f16c5dd..48c83bd232 100644 --- a/core/src/runtime_api/mod.rs +++ b/core/src/runtime_api/mod.rs @@ -1,185 +1,105 @@ -// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// Copyright 2019-2024 Parity Technologies (UK) Ltd. // This file is dual-licensed as Apache-2.0 or GPL-3.0. // see LICENSE for license details. -use alloc::borrow::Cow; +//! Encode runtime API payloads, decode the associated values returned from them, and validate +//! static runtime API payloads. +//! +//! # Example +//! +//! ```rust +//! use subxt_macro::subxt; +//! use subxt_core::runtime_api; +//! use subxt_core::metadata; +//! +//! // If we generate types without `subxt`, we need to point to `::subxt_core`: +//! #[subxt( +//! crate = "::subxt_core", +//! runtime_metadata_path = "../artifacts/polkadot_metadata_small.scale", +//! )] +//! pub mod polkadot {} +//! +//! // Some metadata we'll use to work with storage entries: +//! let metadata_bytes = include_bytes!("../../../artifacts/polkadot_metadata_small.scale"); +//! let metadata = metadata::decode_from(&metadata_bytes[..]).unwrap(); +//! +//! // Build a storage query to access account information. +//! let payload = polkadot::apis().metadata().metadata_versions(); +//! +//! // We can validate that the payload is compatible with the given metadata. +//! runtime_api::validate(&payload, &metadata).unwrap(); +//! +//! // Encode the payload name and arguments to hand to a node: +//! let _call_name = runtime_api::call_name(&payload); +//! let _call_args = runtime_api::call_args(&payload, &metadata).unwrap(); +//! +//! // If we were to obtain a value back from the node, we could +//! // then decode it using the same payload and metadata like so: +//! let value_bytes = hex::decode("080e0000000f000000").unwrap(); +//! let value = runtime_api::decode_value(&mut &*value_bytes, &payload, &metadata).unwrap(); +//! +//! println!("Available metadata versions: {value:?}"); +//! ``` + +pub mod payload; + +use crate::error::{Error, MetadataError}; +use crate::metadata::{DecodeWithMetadata, Metadata}; use alloc::borrow::ToOwned; +use alloc::format; use alloc::string::String; use alloc::vec::Vec; -use core::marker::PhantomData; -use derive_where::derive_where; -use scale_encode::EncodeAsFields; -use scale_value::Composite; - -use crate::dynamic::DecodedValueThunk; -use crate::error::MetadataError; -use crate::Error; - -use crate::metadata::{DecodeWithMetadata, Metadata}; - -/// This represents a runtime API payload that can call into the runtime of node. -/// -/// # Components -/// -/// - associated return type -/// -/// Resulting bytes of the call are interpreted into this type. -/// -/// - runtime function name -/// -/// The function name of the runtime API call. This is obtained by concatenating -/// the runtime trait name with the trait's method. -/// -/// For example, the substrate runtime trait [Metadata](https://github.com/paritytech/substrate/blob/cb954820a8d8d765ce75021e244223a3b4d5722d/primitives/api/src/lib.rs#L745) -/// contains the `metadata_at_version` function. The corresponding runtime function -/// is `Metadata_metadata_at_version`. -/// -/// - encoded arguments -/// -/// Each argument of the runtime function must be scale-encoded. -pub trait RuntimeApiPayload { - /// The return type of the function call. - // Note: `DecodeWithMetadata` is needed to decode the function call result - // with the `subxt::Metadata. - type ReturnType: DecodeWithMetadata; - - /// The runtime API trait name. - fn trait_name(&self) -> &str; - - /// The runtime API method name. - fn method_name(&self) -> &str; - - /// Scale encode the arguments data. - fn encode_args_to(&self, metadata: &Metadata, out: &mut Vec) -> Result<(), Error>; - - /// Encode arguments data and return the output. This is a convenience - /// wrapper around [`RuntimeApiPayload::encode_args_to`]. - fn encode_args(&self, metadata: &Metadata) -> Result, Error> { - let mut v = Vec::new(); - self.encode_args_to(metadata, &mut v)?; - Ok(v) +use payload::PayloadT; + +/// Run the validation logic against some runtime API payload you'd like to use. Returns `Ok(())` +/// if the payload is valid (or if it's not possible to check since the payload has no validation hash). +/// Return an error if the payload was not valid or something went wrong trying to validate it (ie +/// the runtime API in question do not exist at all) +pub fn validate(payload: &Payload, metadata: &Metadata) -> Result<(), Error> { + let Some(static_hash) = payload.validation_hash() else { + return Ok(()); + }; + + let api_trait = metadata.runtime_api_trait_by_name_err(payload.trait_name())?; + + let Some(runtime_hash) = api_trait.method_hash(payload.method_name()) else { + return Err(MetadataError::IncompatibleCodegen.into()); + }; + if static_hash != runtime_hash { + return Err(MetadataError::IncompatibleCodegen.into()); } - - /// Returns the statically generated validation hash. - fn validation_hash(&self) -> Option<[u8; 32]> { - None - } -} - -/// A runtime API payload containing the generic argument data -/// and interpreting the result of the call as `ReturnTy`. -/// -/// This can be created from static values (ie those generated -/// via the `subxt` macro) or dynamic values via [`dynamic`]. -#[derive_where(Clone, Debug, Eq, Ord, PartialEq, PartialOrd; ArgsData)] -pub struct Payload { - trait_name: Cow<'static, str>, - method_name: Cow<'static, str>, - args_data: ArgsData, - validation_hash: Option<[u8; 32]>, - _marker: PhantomData, + Ok(()) } -impl RuntimeApiPayload - for Payload -{ - type ReturnType = ReturnTy; - - fn trait_name(&self) -> &str { - &self.trait_name - } - - fn method_name(&self) -> &str { - &self.method_name - } - - fn encode_args_to(&self, metadata: &Metadata, out: &mut Vec) -> Result<(), Error> { - let api_method = metadata - .runtime_api_trait_by_name_err(&self.trait_name)? - .method_by_name(&self.method_name) - .ok_or_else(|| MetadataError::RuntimeMethodNotFound((*self.method_name).to_owned()))?; - let mut fields = api_method - .inputs() - .map(|input| scale_encode::Field::named(&input.ty, &input.name)); - - self.args_data - .encode_as_fields_to(&mut fields, metadata.types(), out)?; - Ok(()) - } - - fn validation_hash(&self) -> Option<[u8; 32]> { - self.validation_hash - } +/// Return the name of the runtime API call from the payload. +pub fn call_name(payload: &Payload) -> String { + format!("{}_{}", payload.trait_name(), payload.method_name()) } -/// A dynamic runtime API payload. -pub type DynamicRuntimeApiPayload = Payload, DecodedValueThunk>; - -impl Payload { - /// Create a new [`Payload`]. - pub fn new( - trait_name: impl Into, - method_name: impl Into, - args_data: ArgsData, - ) -> Self { - Payload { - trait_name: Cow::Owned(trait_name.into()), - method_name: Cow::Owned(method_name.into()), - args_data, - validation_hash: None, - _marker: PhantomData, - } - } - - /// Create a new static [`Payload`] using static function name - /// and scale-encoded argument data. - /// - /// This is only expected to be used from codegen. - #[doc(hidden)] - pub fn new_static( - trait_name: &'static str, - method_name: &'static str, - args_data: ArgsData, - hash: [u8; 32], - ) -> Payload { - Payload { - trait_name: Cow::Borrowed(trait_name), - method_name: Cow::Borrowed(method_name), - args_data, - validation_hash: Some(hash), - _marker: core::marker::PhantomData, - } - } - - /// Do not validate this call prior to submitting it. - pub fn unvalidated(self) -> Self { - Self { - validation_hash: None, - ..self - } - } - - /// Returns the trait name. - pub fn trait_name(&self) -> &str { - &self.trait_name - } - - /// Returns the method name. - pub fn method_name(&self) -> &str { - &self.method_name - } - - /// Returns the arguments data. - pub fn args_data(&self) -> &ArgsData { - &self.args_data - } +/// Return the encoded call args given a runtime API payload. +pub fn call_args( + payload: &Payload, + metadata: &Metadata, +) -> Result, Error> { + payload.encode_args(metadata) } -/// Create a new [`DynamicRuntimeApiPayload`]. -pub fn dynamic( - trait_name: impl Into, - method_name: impl Into, - args_data: impl Into>, -) -> DynamicRuntimeApiPayload { - Payload::new(trait_name, method_name, args_data.into()) +/// Decode the value bytes at the location given by the provided runtime API payload. +pub fn decode_value( + bytes: &mut &[u8], + payload: &Payload, + metadata: &Metadata, +) -> Result { + let api_method = metadata + .runtime_api_trait_by_name_err(payload.trait_name())? + .method_by_name(payload.method_name()) + .ok_or_else(|| MetadataError::RuntimeMethodNotFound(payload.method_name().to_owned()))?; + + let val = ::decode_with_metadata( + &mut &bytes[..], + api_method.output_ty(), + metadata, + )?; + + Ok(val) } diff --git a/core/src/runtime_api/payload.rs b/core/src/runtime_api/payload.rs new file mode 100644 index 0000000000..0097fa9ab8 --- /dev/null +++ b/core/src/runtime_api/payload.rs @@ -0,0 +1,188 @@ +// Copyright 2019-2024 Parity Technologies (UK) Ltd. +// This file is dual-licensed as Apache-2.0 or GPL-3.0. +// see LICENSE for license details. + +//! This module contains the trait and types used to represent +//! runtime API calls that can be made. + +use alloc::borrow::Cow; +use alloc::borrow::ToOwned; +use alloc::string::String; +use alloc::vec::Vec; +use core::marker::PhantomData; +use derive_where::derive_where; +use scale_encode::EncodeAsFields; +use scale_value::Composite; + +use crate::dynamic::DecodedValueThunk; +use crate::error::MetadataError; +use crate::Error; + +use crate::metadata::{DecodeWithMetadata, Metadata}; + +/// This represents a runtime API payload that can call into the runtime of node. +/// +/// # Components +/// +/// - associated return type +/// +/// Resulting bytes of the call are interpreted into this type. +/// +/// - runtime function name +/// +/// The function name of the runtime API call. This is obtained by concatenating +/// the runtime trait name with the trait's method. +/// +/// For example, the substrate runtime trait [Metadata](https://github.com/paritytech/substrate/blob/cb954820a8d8d765ce75021e244223a3b4d5722d/primitives/api/src/lib.rs#L745) +/// contains the `metadata_at_version` function. The corresponding runtime function +/// is `Metadata_metadata_at_version`. +/// +/// - encoded arguments +/// +/// Each argument of the runtime function must be scale-encoded. +pub trait PayloadT { + /// The return type of the function call. + // Note: `DecodeWithMetadata` is needed to decode the function call result + // with the `subxt::Metadata. + type ReturnType: DecodeWithMetadata; + + /// The runtime API trait name. + fn trait_name(&self) -> &str; + + /// The runtime API method name. + fn method_name(&self) -> &str; + + /// Scale encode the arguments data. + fn encode_args_to(&self, metadata: &Metadata, out: &mut Vec) -> Result<(), Error>; + + /// Encode arguments data and return the output. This is a convenience + /// wrapper around [`PayloadT::encode_args_to`]. + fn encode_args(&self, metadata: &Metadata) -> Result, Error> { + let mut v = Vec::new(); + self.encode_args_to(metadata, &mut v)?; + Ok(v) + } + + /// Returns the statically generated validation hash. + fn validation_hash(&self) -> Option<[u8; 32]> { + None + } +} + +/// A runtime API payload containing the generic argument data +/// and interpreting the result of the call as `ReturnTy`. +/// +/// This can be created from static values (ie those generated +/// via the `subxt` macro) or dynamic values via [`dynamic`]. +#[derive_where(Clone, Debug, Eq, Ord, PartialEq, PartialOrd; ArgsData)] +pub struct Payload { + trait_name: Cow<'static, str>, + method_name: Cow<'static, str>, + args_data: ArgsData, + validation_hash: Option<[u8; 32]>, + _marker: PhantomData, +} + +impl PayloadT + for Payload +{ + type ReturnType = ReturnTy; + + fn trait_name(&self) -> &str { + &self.trait_name + } + + fn method_name(&self) -> &str { + &self.method_name + } + + fn encode_args_to(&self, metadata: &Metadata, out: &mut Vec) -> Result<(), Error> { + let api_method = metadata + .runtime_api_trait_by_name_err(&self.trait_name)? + .method_by_name(&self.method_name) + .ok_or_else(|| MetadataError::RuntimeMethodNotFound((*self.method_name).to_owned()))?; + let mut fields = api_method + .inputs() + .map(|input| scale_encode::Field::named(&input.ty, &input.name)); + + self.args_data + .encode_as_fields_to(&mut fields, metadata.types(), out)?; + Ok(()) + } + + fn validation_hash(&self) -> Option<[u8; 32]> { + self.validation_hash + } +} + +/// A dynamic runtime API payload. +pub type DynamicPayload = Payload, DecodedValueThunk>; + +impl Payload { + /// Create a new [`Payload`]. + pub fn new( + trait_name: impl Into, + method_name: impl Into, + args_data: ArgsData, + ) -> Self { + Payload { + trait_name: Cow::Owned(trait_name.into()), + method_name: Cow::Owned(method_name.into()), + args_data, + validation_hash: None, + _marker: PhantomData, + } + } + + /// Create a new static [`Payload`] using static function name + /// and scale-encoded argument data. + /// + /// This is only expected to be used from codegen. + #[doc(hidden)] + pub fn new_static( + trait_name: &'static str, + method_name: &'static str, + args_data: ArgsData, + hash: [u8; 32], + ) -> Payload { + Payload { + trait_name: Cow::Borrowed(trait_name), + method_name: Cow::Borrowed(method_name), + args_data, + validation_hash: Some(hash), + _marker: core::marker::PhantomData, + } + } + + /// Do not validate this call prior to submitting it. + pub fn unvalidated(self) -> Self { + Self { + validation_hash: None, + ..self + } + } + + /// Returns the trait name. + pub fn trait_name(&self) -> &str { + &self.trait_name + } + + /// Returns the method name. + pub fn method_name(&self) -> &str { + &self.method_name + } + + /// Returns the arguments data. + pub fn args_data(&self) -> &ArgsData { + &self.args_data + } +} + +/// Create a new [`DynamicPayload`]. +pub fn dynamic( + trait_name: impl Into, + method_name: impl Into, + args_data: impl Into>, +) -> DynamicPayload { + Payload::new(trait_name, method_name, args_data.into()) +} diff --git a/core/src/storage/storage_address.rs b/core/src/storage/address.rs similarity index 94% rename from core/src/storage/storage_address.rs rename to core/src/storage/address.rs index fbb3f267ba..a5bacf265a 100644 --- a/core/src/storage/storage_address.rs +++ b/core/src/storage/address.rs @@ -1,7 +1,9 @@ -// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// Copyright 2019-2024 Parity Technologies (UK) Ltd. // This file is dual-licensed as Apache-2.0 or GPL-3.0. // see LICENSE for license details. +//! Construct addresses to access storage entries with. + use crate::{ dynamic::DecodedValueThunk, error::{Error, MetadataError}, @@ -14,11 +16,12 @@ use alloc::borrow::{Cow, ToOwned}; use alloc::string::String; use alloc::vec::Vec; -use super::{storage_key::StorageHashers, StorageKey}; +// Re-export types used here: +pub use super::storage_key::{StaticStorageKey, StorageHashers, StorageHashersIter, StorageKey}; /// This represents a storage address. Anything implementing this trait /// can be used to fetch and iterate over storage entries. -pub trait StorageAddress { +pub trait AddressT { /// The target type of the value that lives at this address. type Target: DecodeWithMetadata; /// The keys type used to construct this address. @@ -120,11 +123,11 @@ where /// Return bytes representing the root of this storage entry (a hash of the pallet and entry name). pub fn to_root_bytes(&self) -> Vec { - super::utils::storage_address_root_bytes(self) + super::get_address_root_bytes(self) } } -impl StorageAddress +impl AddressT for Address where Keys: StorageKey, diff --git a/core/src/storage/mod.rs b/core/src/storage/mod.rs index e00d0b0758..ad1c3f4374 100644 --- a/core/src/storage/mod.rs +++ b/core/src/storage/mod.rs @@ -1,22 +1,142 @@ -// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// Copyright 2019-2024 Parity Technologies (UK) Ltd. // This file is dual-licensed as Apache-2.0 or GPL-3.0. // see LICENSE for license details. -//! Types associated with accessing and working with storage items. +//! Encode storage keys, decode storage values, and validate static storage addresses. +//! +//! # Example +//! +//! ```rust +//! use subxt_signer::sr25519::dev; +//! use subxt_macro::subxt; +//! use subxt_core::storage; +//! use subxt_core::metadata; +//! +//! // If we generate types without `subxt`, we need to point to `::subxt_core`: +//! #[subxt( +//! crate = "::subxt_core", +//! runtime_metadata_path = "../artifacts/polkadot_metadata_small.scale", +//! )] +//! pub mod polkadot {} +//! +//! // Some metadata we'll use to work with storage entries: +//! let metadata_bytes = include_bytes!("../../../artifacts/polkadot_metadata_small.scale"); +//! let metadata = metadata::decode_from(&metadata_bytes[..]).unwrap(); +//! +//! // Build a storage query to access account information. +//! let account = dev::alice().public_key().into(); +//! let address = polkadot::storage().system().account(&account); +//! +//! // We can validate that the address is compatible with the given metadata. +//! storage::validate(&address, &metadata).unwrap(); +//! +//! // Encode the address to bytes. These can be sent to a node to query the value. +//! storage::get_address_bytes(&address, &metadata).unwrap(); +//! +//! // If we were to obtain a value back from the node at that address, we could +//! // then decode it using the same address and metadata like so: +//! let value_bytes = hex::decode("00000000000000000100000000000000000064a7b3b6e00d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080").unwrap(); +//! let value = storage::decode_value(&mut &*value_bytes, &address, &metadata).unwrap(); +//! +//! println!("Alice's account info: {value:?}"); +//! ``` -mod storage_address; mod storage_key; -pub mod utils; +mod utils; -/// Types representing an address which describes where a storage -/// entry lives and how to properly decode it. -pub mod address { - pub use super::storage_address::{dynamic, Address, DynamicAddress, StorageAddress}; - pub use super::storage_key::{StaticStorageKey, StorageHashers, StorageKey}; +pub mod address; + +use crate::{error::MetadataError, metadata::DecodeWithMetadata, Error, Metadata}; +use address::AddressT; +use alloc::vec::Vec; + +// This isn't a part of the public API, but expose here because it's useful in Subxt. +#[doc(hidden)] +pub use utils::lookup_storage_entry_details; + +/// When the provided `address` is statically generated via the `#[subxt]` macro, this validates +/// that the shape of the storage value is the same as the shape expected by the static address. +/// +/// When the provided `address` is dynamic (and thus does not come with any expectation of the +/// shape of the constant value), this just returns `Ok(())` +pub fn validate(address: &Address, metadata: &Metadata) -> Result<(), Error> { + let Some(hash) = address.validation_hash() else { + return Ok(()); + }; + + let pallet_name = address.pallet_name(); + let entry_name = address.entry_name(); + + let pallet_metadata = metadata.pallet_by_name_err(pallet_name)?; + + let Some(expected_hash) = pallet_metadata.storage_hash(entry_name) else { + return Err(MetadataError::IncompatibleCodegen.into()); + }; + if expected_hash != hash { + return Err(MetadataError::IncompatibleCodegen.into()); + } + Ok(()) +} + +/// Given a storage address and some metadata, this encodes the address into bytes which can be +/// handed to a node to retrieve the corresponding value. +pub fn get_address_bytes( + address: &Address, + metadata: &Metadata, +) -> Result, Error> { + let mut bytes = Vec::new(); + utils::write_storage_address_root_bytes(address, &mut bytes); + address.append_entry_bytes(metadata, &mut bytes)?; + Ok(bytes) } -pub use storage_key::StorageKey; +/// Given a storage address and some metadata, this encodes the root of the address (ie the pallet +/// and storage entry part) into bytes. If the entry being addressed is inside a map, this returns +/// the bytes needed to iterate over all of the entries within it. +pub fn get_address_root_bytes(address: &Address) -> Vec { + let mut bytes = Vec::new(); + utils::write_storage_address_root_bytes(address, &mut bytes); + bytes +} + +/// Given some storage value that we've retrieved from a node, the address used to retrieve it, and +/// metadata from the node, this function attempts to decode the bytes into the target value specified +/// by the address. +pub fn decode_value( + bytes: &mut &[u8], + address: &Address, + metadata: &Metadata, +) -> Result { + let pallet_name = address.pallet_name(); + let entry_name = address.entry_name(); + + let (_, entry_metadata) = + utils::lookup_storage_entry_details(pallet_name, entry_name, metadata)?; + let value_ty_id = match entry_metadata.entry_type() { + subxt_metadata::StorageEntryType::Plain(ty) => *ty, + subxt_metadata::StorageEntryType::Map { value_ty, .. } => *value_ty, + }; + + let val = Address::Target::decode_with_metadata(bytes, value_ty_id, metadata)?; + Ok(val) +} + +/// Return the default value at a given storage address if one is available, or an error otherwise. +pub fn default_value( + address: &Address, + metadata: &Metadata, +) -> Result { + let pallet_name = address.pallet_name(); + let entry_name = address.entry_name(); -// For consistency with other modules, also expose -// the basic address stuff at the root of the module. -pub use storage_address::{dynamic, Address, DynamicAddress, StorageAddress}; + let (_, entry_metadata) = + utils::lookup_storage_entry_details(pallet_name, entry_name, metadata)?; + let value_ty_id = match entry_metadata.entry_type() { + subxt_metadata::StorageEntryType::Plain(ty) => *ty, + subxt_metadata::StorageEntryType::Map { value_ty, .. } => *value_ty, + }; + + let default_bytes = entry_metadata.default_bytes(); + let val = Address::Target::decode_with_metadata(&mut &*default_bytes, value_ty_id, metadata)?; + Ok(val) +} diff --git a/core/src/storage/storage_key.rs b/core/src/storage/storage_key.rs index d76246fb0e..9f7943abc9 100644 --- a/core/src/storage/storage_key.rs +++ b/core/src/storage/storage_key.rs @@ -1,3 +1,7 @@ +// Copyright 2019-2024 Parity Technologies (UK) Ltd. +// This file is dual-licensed as Apache-2.0 or GPL-3.0. +// see LICENSE for license details. + use super::utils::hash_bytes; use crate::{ error::{Error, MetadataError, StorageAddressError}, diff --git a/core/src/storage/utils.rs b/core/src/storage/utils.rs index f749df31c0..f17cd889ba 100644 --- a/core/src/storage/utils.rs +++ b/core/src/storage/utils.rs @@ -1,50 +1,25 @@ -// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// Copyright 2019-2024 Parity Technologies (UK) Ltd. // This file is dual-licensed as Apache-2.0 or GPL-3.0. // see LICENSE for license details. -//! these utility methods complement the [`StorageAddress`] trait, but +//! these utility methods complement the [`AddressT`] trait, but //! aren't things that should ever be overridden, and so don't exist on //! the trait itself. -use crate::error::MetadataError; -use crate::metadata::{DecodeWithMetadata, MetadataExt}; -use alloc::vec::Vec; -use subxt_metadata::PalletMetadata; -use subxt_metadata::{StorageEntryMetadata, StorageHasher}; - -use super::StorageAddress; -use crate::{error::Error, metadata::Metadata}; +use super::address::AddressT; +use crate::error::{Error, MetadataError}; +use crate::metadata::Metadata; use alloc::borrow::ToOwned; +use alloc::vec::Vec; +use subxt_metadata::{PalletMetadata, StorageEntryMetadata, StorageHasher}; -/// Return the root of a given [`StorageAddress`]: hash the pallet name and entry name +/// Return the root of a given [`AddressT`]: hash the pallet name and entry name /// and append those bytes to the output. -pub fn write_storage_address_root_bytes( - addr: &Address, - out: &mut Vec, -) { +pub fn write_storage_address_root_bytes(addr: &Address, out: &mut Vec) { out.extend(sp_crypto_hashing::twox_128(addr.pallet_name().as_bytes())); out.extend(sp_crypto_hashing::twox_128(addr.entry_name().as_bytes())); } -/// Outputs the [`storage_address_root_bytes`] as well as any additional bytes that represent -/// a lookup in a storage map at that location. -pub fn storage_address_bytes( - addr: &Address, - metadata: &Metadata, -) -> Result, Error> { - let mut bytes = Vec::new(); - write_storage_address_root_bytes(addr, &mut bytes); - addr.append_entry_bytes(metadata, &mut bytes)?; - Ok(bytes) -} - -/// Outputs a vector containing the bytes written by [`write_storage_address_root_bytes`]. -pub fn storage_address_root_bytes(addr: &Address) -> Vec { - let mut bytes = Vec::new(); - write_storage_address_root_bytes(addr, &mut bytes); - bytes -} - /// Take some SCALE encoded bytes and a [`StorageHasher`] and hash the bytes accordingly. pub fn hash_bytes(input: &[u8], hasher: StorageHasher, bytes: &mut Vec) { match hasher { @@ -65,10 +40,10 @@ pub fn hash_bytes(input: &[u8], hasher: StorageHasher, bytes: &mut Vec) { } /// Return details about the given storage entry. -pub fn lookup_entry_details<'a>( +pub fn lookup_storage_entry_details<'a>( pallet_name: &str, entry_name: &str, - metadata: &'a subxt_metadata::Metadata, + metadata: &'a Metadata, ) -> Result<(PalletMetadata<'a>, &'a StorageEntryMetadata), Error> { let pallet_metadata = metadata.pallet_by_name_err(pallet_name)?; let storage_metadata = pallet_metadata @@ -79,40 +54,3 @@ pub fn lookup_entry_details<'a>( .ok_or_else(|| MetadataError::StorageEntryNotFound(entry_name.to_owned()))?; Ok((pallet_metadata, storage_entry)) } - -/// Validate a storage address against the metadata. -pub fn validate_storage_address( - address: &Address, - pallet: PalletMetadata<'_>, -) -> Result<(), Error> { - if let Some(hash) = address.validation_hash() { - validate_storage(pallet, address.entry_name(), hash)?; - } - Ok(()) -} - -/// Validate a storage entry against the metadata. -fn validate_storage( - pallet: PalletMetadata<'_>, - storage_name: &str, - hash: [u8; 32], -) -> Result<(), Error> { - let Some(expected_hash) = pallet.storage_hash(storage_name) else { - return Err(MetadataError::IncompatibleCodegen.into()); - }; - if expected_hash != hash { - return Err(MetadataError::IncompatibleCodegen.into()); - } - Ok(()) -} - -/// Given some bytes, a pallet and storage name, decode the response. -pub fn decode_storage_with_metadata( - bytes: &mut &[u8], - metadata: &Metadata, - storage_metadata: &StorageEntryMetadata, -) -> Result { - let return_ty = storage_metadata.entry_type().value_ty(); - let val = T::decode_with_metadata(bytes, return_ty, metadata)?; - Ok(val) -} diff --git a/core/src/tx/mod.rs b/core/src/tx/mod.rs index 8266f0c687..2e8cc1d30e 100644 --- a/core/src/tx/mod.rs +++ b/core/src/tx/mod.rs @@ -1,180 +1,308 @@ -// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// Copyright 2019-2024 Parity Technologies (UK) Ltd. // This file is dual-licensed as Apache-2.0 or GPL-3.0. // see LICENSE for license details. -//! This module contains the trait and types used to represent -//! transactions that can be submitted. +//! Construct and sign transactions. +//! +//! # Example +//! +//! ```rust +//! use subxt_signer::sr25519::dev; +//! use subxt_macro::subxt; +//! use subxt_core::config::PolkadotConfig; +//! use subxt_core::config::DefaultExtrinsicParamsBuilder as Params; +//! use subxt_core::tx; +//! use subxt_core::utils::H256; +//! use subxt_core::metadata; +//! +//! // If we generate types without `subxt`, we need to point to `::subxt_core`: +//! #[subxt( +//! crate = "::subxt_core", +//! runtime_metadata_path = "../artifacts/polkadot_metadata_small.scale", +//! )] +//! pub mod polkadot {} +//! +//! // Gather some other information about the chain that we'll need to construct valid extrinsics: +//! let state = tx::ClientState:: { +//! metadata: { +//! let metadata_bytes = include_bytes!("../../../artifacts/polkadot_metadata_small.scale"); +//! metadata::decode_from(&metadata_bytes[..]).unwrap() +//! }, +//! genesis_hash: { +//! let h = "91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3"; +//! let bytes = hex::decode(h).unwrap(); +//! H256::from_slice(&bytes) +//! }, +//! runtime_version: tx::RuntimeVersion { +//! spec_version: 9370, +//! transaction_version: 20, +//! } +//! }; +//! +//! // Now we can build a balance transfer extrinsic. +//! let dest = dev::bob().public_key().into(); +//! let call = polkadot::tx().balances().transfer_allow_death(dest, 10_000); +//! let params = Params::new().tip(1_000).nonce(0).build(); +//! +//! // We can validate that this lines up with the given metadata: +//! tx::validate(&call, &state.metadata).unwrap(); +//! +//! // We can build a signed transaction: +//! let signed_call = tx::create_signed(&call, &state, &dev::alice(), params).unwrap(); +//! +//! // And log it: +//! println!("Tx: 0x{}", hex::encode(signed_call.encoded())); +//! ``` -use crate::error::MetadataError; +pub mod payload; +pub mod signer; + +use crate::config::{Config, ExtrinsicParams, ExtrinsicParamsEncoder, Hasher}; +use crate::error::{Error, MetadataError}; use crate::metadata::Metadata; -use crate::Error; +use crate::utils::Encoded; use alloc::borrow::{Cow, ToOwned}; -use alloc::string::String; - use alloc::vec::Vec; -use codec::Encode; -use scale_encode::EncodeAsFields; -use scale_value::{Composite, Value, ValueDef, Variant}; +use codec::{Compact, Encode}; +use payload::PayloadT; +use signer::Signer as SignerT; +use sp_crypto_hashing::blake2_256; -pub mod signer; -pub use signer::Signer; - -/// This represents a transaction payload that can be submitted -/// to a node. -pub trait TxPayload { - /// Encode call data to the provided output. - fn encode_call_data_to(&self, metadata: &Metadata, out: &mut Vec) -> Result<(), Error>; - - /// Encode call data and return the output. This is a convenience - /// wrapper around [`TxPayload::encode_call_data_to`]. - fn encode_call_data(&self, metadata: &Metadata) -> Result, Error> { - let mut v = Vec::new(); - self.encode_call_data_to(metadata, &mut v)?; - Ok(v) - } +// Expose these here since we expect them in some calls below. +pub use crate::client::{ClientState, RuntimeVersion}; - /// Returns the details needed to validate the call, which - /// include a statically generated hash, the pallet name, - /// and the call name. - fn validation_details(&self) -> Option> { - None +/// Run the validation logic against some extrinsic you'd like to submit. Returns `Ok(())` +/// if the call is valid (or if it's not possible to check since the call has no validation hash). +/// Return an error if the call was not valid or something went wrong trying to validate it (ie +/// the pallet or call in question do not exist at all). +pub fn validate(call: &Call, metadata: &Metadata) -> Result<(), Error> { + if let Some(details) = call.validation_details() { + let expected_hash = metadata + .pallet_by_name_err(details.pallet_name)? + .call_hash(details.call_name) + .ok_or_else(|| MetadataError::CallNameNotFound(details.call_name.to_owned()))?; + + if details.hash != expected_hash { + return Err(MetadataError::IncompatibleCodegen.into()); + } } + Ok(()) } -pub struct ValidationDetails<'a> { - /// The pallet name. - pub pallet_name: &'a str, - /// The call name. - pub call_name: &'a str, - /// A hash (this is generated at compile time in our codegen) - /// to compare against the runtime code. - pub hash: [u8; 32], +/// Return the SCALE encoded bytes representing the call data of the transaction. +pub fn call_data(call: &Call, metadata: &Metadata) -> Result, Error> { + let mut bytes = Vec::new(); + call.encode_call_data_to(metadata, &mut bytes)?; + Ok(bytes) } -/// A transaction payload containing some generic `CallData`. -#[derive(Clone, Debug, Eq, Ord, PartialEq, PartialOrd)] -pub struct Payload { - pallet_name: Cow<'static, str>, - call_name: Cow<'static, str>, - call_data: CallData, - validation_hash: Option<[u8; 32]>, +/// Creates an unsigned extrinsic without submitting it. +pub fn create_unsigned( + call: &Call, + metadata: &Metadata, +) -> Result, Error> { + // 1. Validate this call against the current node metadata if the call comes + // with a hash allowing us to do so. + validate(call, metadata)?; + + // 2. Encode extrinsic + let extrinsic = { + let mut encoded_inner = Vec::new(); + // transaction protocol version (4) (is not signed, so no 1 bit at the front). + 4u8.encode_to(&mut encoded_inner); + // encode call data after this byte. + call.encode_call_data_to(metadata, &mut encoded_inner)?; + // now, prefix byte length: + let len = Compact( + u32::try_from(encoded_inner.len()).expect("extrinsic size expected to be <4GB"), + ); + let mut encoded = Vec::new(); + len.encode_to(&mut encoded); + encoded.extend(encoded_inner); + encoded + }; + + // Wrap in Encoded to ensure that any more "encode" calls leave it in the right state. + Ok(Transaction::from_bytes(extrinsic)) } -/// The type of a payload typically used for dynamic transaction payloads. -pub type DynamicPayload = Payload>; - -impl Payload { - /// Create a new [`Payload`]. - pub fn new( - pallet_name: impl Into, - call_name: impl Into, - call_data: CallData, - ) -> Self { - Payload { - pallet_name: Cow::Owned(pallet_name.into()), - call_name: Cow::Owned(call_name.into()), - call_data, - validation_hash: None, - } - } +/// Create a partial extrinsic. +/// +/// Note: if not provided, the default account nonce will be set to 0 and the default mortality will be _immortal_. +/// This is because this method runs offline, and so is unable to fetch the data needed for more appropriate values. +pub fn create_partial_signed( + call: &Call, + client_state: &ClientState, + params: >::Params, +) -> Result, Error> { + // 1. Validate this call against the current node metadata if the call comes + // with a hash allowing us to do so. + validate(call, &client_state.metadata)?; - /// Create a new [`Payload`] using static strings for the pallet and call name. - /// This is only expected to be used from codegen. - #[doc(hidden)] - pub fn new_static( - pallet_name: &'static str, - call_name: &'static str, - call_data: CallData, - validation_hash: [u8; 32], - ) -> Self { - Payload { - pallet_name: Cow::Borrowed(pallet_name), - call_name: Cow::Borrowed(call_name), - call_data, - validation_hash: Some(validation_hash), - } - } + // 2. SCALE encode call data to bytes (pallet u8, call u8, call params). + let call_data = call_data(call, &client_state.metadata)?; - /// Do not validate this call prior to submitting it. - pub fn unvalidated(self) -> Self { - Self { - validation_hash: None, - ..self + // 3. Construct our custom additional/extra params. + let additional_and_extra_params = + >::new(client_state, params)?; + + // Return these details, ready to construct a signed extrinsic from. + Ok(PartialTransaction { + call_data, + additional_and_extra_params, + }) +} + +/// Creates a signed extrinsic without submitting it. +/// +/// Note: if not provided, the default account nonce will be set to 0 and the default mortality will be _immortal_. +/// This is because this method runs offline, and so is unable to fetch the data needed for more appropriate values. +pub fn create_signed( + call: &Call, + client_state: &ClientState, + signer: &Signer, + params: >::Params, +) -> Result, Error> +where + T: Config, + Call: PayloadT, + Signer: SignerT, +{ + // 1. Validate this call against the current node metadata if the call comes + // with a hash allowing us to do so. + validate(call, &client_state.metadata)?; + + // 2. Gather the "additional" and "extra" params along with the encoded call data, + // ready to be signed. + let partial_signed = create_partial_signed(call, client_state, params)?; + + // 3. Sign and construct an extrinsic from these details. + Ok(partial_signed.sign(signer)) +} + +/// This represents a partially constructed transaction that needs signing before it is ready +/// to submit. Use [`PartialTransaction::signer_payload()`] to return the payload that needs signing, +/// [`PartialTransaction::sign()`] to sign the transaction using a [`SignerT`] impl, or +/// [`PartialTransaction::sign_with_address_and_signature()`] to apply an existing signature and address +/// to the transaction. +pub struct PartialTransaction { + call_data: Vec, + additional_and_extra_params: T::ExtrinsicParams, +} + +impl PartialTransaction { + // Obtain bytes representing the signer payload and run call some function + // with them. This can avoid an allocation in some cases when compared to + // [`PartialExtrinsic::signer_payload()`]. + fn with_signer_payload(&self, f: F) -> R + where + F: for<'a> FnOnce(Cow<'a, [u8]>) -> R, + { + let mut bytes = self.call_data.clone(); + self.additional_and_extra_params.encode_extra_to(&mut bytes); + self.additional_and_extra_params + .encode_additional_to(&mut bytes); + if bytes.len() > 256 { + f(Cow::Borrowed(blake2_256(&bytes).as_ref())) + } else { + f(Cow::Owned(bytes)) } } - /// Returns the call data. - pub fn call_data(&self) -> &CallData { - &self.call_data + /// Return the signer payload for this extrinsic. These are the bytes that must + /// be signed in order to produce a valid signature for the extrinsic. + pub fn signer_payload(&self) -> Vec { + self.with_signer_payload(|bytes| bytes.to_vec()) } - /// Returns the pallet name. - pub fn pallet_name(&self) -> &str { - &self.pallet_name + /// Return the bytes representing the call data for this partially constructed + /// extrinsic. + pub fn call_data(&self) -> &[u8] { + &self.call_data } - /// Returns the call name. - pub fn call_name(&self) -> &str { - &self.call_name + /// Convert this [`PartialTransaction`] into a [`Transaction`], ready to submit. + /// The provided `signer` is responsible for providing the "from" address for the transaction, + /// as well as providing a signature to attach to it. + pub fn sign(&self, signer: &Signer) -> Transaction + where + Signer: SignerT, + { + // Given our signer, we can sign the payload representing this extrinsic. + let signature = self.with_signer_payload(|bytes| signer.sign(&bytes)); + // Now, use the signature and "from" address to build the extrinsic. + self.sign_with_address_and_signature(&signer.address(), &signature) } -} -impl Payload> { - /// Convert the dynamic `Composite` payload into a [`Value`]. - /// This is useful if you want to use this as an argument for a - /// larger dynamic call that wants to use this as a nested call. - pub fn into_value(self) -> Value<()> { - let call = Value { - context: (), - value: ValueDef::Variant(Variant { - name: self.call_name.into_owned(), - values: self.call_data, - }), + /// Convert this [`PartialTransaction`] into a [`Transaction`], ready to submit. + /// An address, and something representing a signature that can be SCALE encoded, are both + /// needed in order to construct it. If you have a `Signer` to hand, you can use + /// [`PartialTransaction::sign()`] instead. + pub fn sign_with_address_and_signature( + &self, + address: &T::Address, + signature: &T::Signature, + ) -> Transaction { + // Encode the extrinsic (into the format expected by protocol version 4) + let extrinsic = { + let mut encoded_inner = Vec::new(); + // "is signed" + transaction protocol version (4) + (0b10000000 + 4u8).encode_to(&mut encoded_inner); + // from address for signature + address.encode_to(&mut encoded_inner); + // the signature + signature.encode_to(&mut encoded_inner); + // attach custom extra params + self.additional_and_extra_params + .encode_extra_to(&mut encoded_inner); + // and now, call data (remembering that it's been encoded already and just needs appending) + encoded_inner.extend(&self.call_data); + // now, prefix byte length: + let len = Compact( + u32::try_from(encoded_inner.len()).expect("extrinsic size expected to be <4GB"), + ); + let mut encoded = Vec::new(); + len.encode_to(&mut encoded); + encoded.extend(encoded_inner); + encoded }; - Value::unnamed_variant(self.pallet_name, [call]) + // Return an extrinsic ready to be submitted. + Transaction::from_bytes(extrinsic) } } -impl TxPayload for Payload { - fn encode_call_data_to(&self, metadata: &Metadata, out: &mut Vec) -> Result<(), Error> { - let pallet = metadata.pallet_by_name_err(&self.pallet_name)?; - let call = pallet - .call_variant_by_name(&self.call_name) - .ok_or_else(|| MetadataError::CallNameNotFound((*self.call_name).to_owned()))?; - - let pallet_index = pallet.index(); - let call_index = call.index; - - pallet_index.encode_to(out); - call_index.encode_to(out); +/// This represents a signed transaction that's ready to be submitted. +/// Use [`Transaction::encoded()`] or [`Transaction::into_encoded()`] to +/// get the bytes for it, or [`Transaction::hash()`] to get the hash. +pub struct Transaction { + encoded: Encoded, + marker: core::marker::PhantomData, +} - let mut fields = call - .fields - .iter() - .map(|f| scale_encode::Field::new(&f.ty.id, f.name.as_deref())); +impl Transaction { + /// Create a [`Transaction`] from some already-signed and prepared + /// extrinsic bytes, + pub fn from_bytes(tx_bytes: Vec) -> Self { + Self { + encoded: Encoded(tx_bytes), + marker: core::marker::PhantomData, + } + } - self.call_data - .encode_as_fields_to(&mut fields, metadata.types(), out) - .expect("The fields are valid types from the metadata, qed;"); - Ok(()) + /// Calculate and return the hash of the extrinsic, based on the configured hasher. + pub fn hash(&self) -> T::Hash { + T::Hasher::hash_of(&self.encoded) } - fn validation_details(&self) -> Option> { - self.validation_hash.map(|hash| ValidationDetails { - pallet_name: &self.pallet_name, - call_name: &self.call_name, - hash, - }) + /// Returns the SCALE encoded extrinsic bytes. + pub fn encoded(&self) -> &[u8] { + &self.encoded.0 } -} -/// Construct a transaction at runtime; essentially an alias to [`Payload::new()`] -/// which provides a [`Composite`] value for the call data. -pub fn dynamic( - pallet_name: impl Into, - call_name: impl Into, - call_data: impl Into>, -) -> DynamicPayload { - Payload::new(pallet_name, call_name, call_data.into()) + /// Consumes this [`Transaction`] and returns the SCALE encoded + /// extrinsic bytes. + pub fn into_encoded(self) -> Vec { + self.encoded.0 + } } diff --git a/core/src/tx/payload.rs b/core/src/tx/payload.rs new file mode 100644 index 0000000000..69173aa80b --- /dev/null +++ b/core/src/tx/payload.rs @@ -0,0 +1,178 @@ +// Copyright 2019-2024 Parity Technologies (UK) Ltd. +// This file is dual-licensed as Apache-2.0 or GPL-3.0. +// see LICENSE for license details. + +//! This module contains the trait and types used to represent +//! transactions that can be submitted. + +use crate::error::MetadataError; +use crate::metadata::Metadata; +use crate::Error; +use alloc::borrow::{Cow, ToOwned}; +use alloc::string::String; + +use alloc::vec::Vec; +use codec::Encode; +use scale_encode::EncodeAsFields; +use scale_value::{Composite, Value, ValueDef, Variant}; + +/// This represents a transaction payload that can be submitted +/// to a node. +pub trait PayloadT { + /// Encode call data to the provided output. + fn encode_call_data_to(&self, metadata: &Metadata, out: &mut Vec) -> Result<(), Error>; + + /// Encode call data and return the output. This is a convenience + /// wrapper around [`PayloadT::encode_call_data_to`]. + fn encode_call_data(&self, metadata: &Metadata) -> Result, Error> { + let mut v = Vec::new(); + self.encode_call_data_to(metadata, &mut v)?; + Ok(v) + } + + /// Returns the details needed to validate the call, which + /// include a statically generated hash, the pallet name, + /// and the call name. + fn validation_details(&self) -> Option> { + None + } +} + +/// Details required to validate the shape of a transaction payload against some metadata. +pub struct ValidationDetails<'a> { + /// The pallet name. + pub pallet_name: &'a str, + /// The call name. + pub call_name: &'a str, + /// A hash (this is generated at compile time in our codegen) + /// to compare against the runtime code. + pub hash: [u8; 32], +} + +/// A transaction payload containing some generic `CallData`. +#[derive(Clone, Debug, Eq, Ord, PartialEq, PartialOrd)] +pub struct Payload { + pallet_name: Cow<'static, str>, + call_name: Cow<'static, str>, + call_data: CallData, + validation_hash: Option<[u8; 32]>, +} + +/// The type of a payload typically used for dynamic transaction payloads. +pub type DynamicPayload = Payload>; + +impl Payload { + /// Create a new [`Payload`]. + pub fn new( + pallet_name: impl Into, + call_name: impl Into, + call_data: CallData, + ) -> Self { + Payload { + pallet_name: Cow::Owned(pallet_name.into()), + call_name: Cow::Owned(call_name.into()), + call_data, + validation_hash: None, + } + } + + /// Create a new [`Payload`] using static strings for the pallet and call name. + /// This is only expected to be used from codegen. + #[doc(hidden)] + pub fn new_static( + pallet_name: &'static str, + call_name: &'static str, + call_data: CallData, + validation_hash: [u8; 32], + ) -> Self { + Payload { + pallet_name: Cow::Borrowed(pallet_name), + call_name: Cow::Borrowed(call_name), + call_data, + validation_hash: Some(validation_hash), + } + } + + /// Do not validate this call prior to submitting it. + pub fn unvalidated(self) -> Self { + Self { + validation_hash: None, + ..self + } + } + + /// Returns the call data. + pub fn call_data(&self) -> &CallData { + &self.call_data + } + + /// Returns the pallet name. + pub fn pallet_name(&self) -> &str { + &self.pallet_name + } + + /// Returns the call name. + pub fn call_name(&self) -> &str { + &self.call_name + } +} + +impl Payload> { + /// Convert the dynamic `Composite` payload into a [`Value`]. + /// This is useful if you want to use this as an argument for a + /// larger dynamic call that wants to use this as a nested call. + pub fn into_value(self) -> Value<()> { + let call = Value { + context: (), + value: ValueDef::Variant(Variant { + name: self.call_name.into_owned(), + values: self.call_data, + }), + }; + + Value::unnamed_variant(self.pallet_name, [call]) + } +} + +impl PayloadT for Payload { + fn encode_call_data_to(&self, metadata: &Metadata, out: &mut Vec) -> Result<(), Error> { + let pallet = metadata.pallet_by_name_err(&self.pallet_name)?; + let call = pallet + .call_variant_by_name(&self.call_name) + .ok_or_else(|| MetadataError::CallNameNotFound((*self.call_name).to_owned()))?; + + let pallet_index = pallet.index(); + let call_index = call.index; + + pallet_index.encode_to(out); + call_index.encode_to(out); + + let mut fields = call + .fields + .iter() + .map(|f| scale_encode::Field::new(&f.ty.id, f.name.as_deref())); + + self.call_data + .encode_as_fields_to(&mut fields, metadata.types(), out) + .expect("The fields are valid types from the metadata, qed;"); + Ok(()) + } + + fn validation_details(&self) -> Option> { + self.validation_hash.map(|hash| ValidationDetails { + pallet_name: &self.pallet_name, + call_name: &self.call_name, + hash, + }) + } +} + +/// Construct a transaction at runtime; essentially an alias to [`Payload::new()`] +/// which provides a [`Composite`] value for the call data. +pub fn dynamic( + pallet_name: impl Into, + call_name: impl Into, + call_data: impl Into>, +) -> DynamicPayload { + Payload::new(pallet_name, call_name, call_data.into()) +} diff --git a/core/src/tx/signer.rs b/core/src/tx/signer.rs index 444aa46477..466b84c15e 100644 --- a/core/src/tx/signer.rs +++ b/core/src/tx/signer.rs @@ -1,4 +1,4 @@ -// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// Copyright 2019-2024 Parity Technologies (UK) Ltd. // This file is dual-licensed as Apache-2.0 or GPL-3.0. // see LICENSE for license details. diff --git a/core/src/utils/account_id.rs b/core/src/utils/account_id.rs index ce2d343d17..d5cd65d6b6 100644 --- a/core/src/utils/account_id.rs +++ b/core/src/utils/account_id.rs @@ -1,4 +1,4 @@ -// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// Copyright 2019-2024 Parity Technologies (UK) Ltd. // This file is dual-licensed as Apache-2.0 or GPL-3.0. // see LICENSE for license details. diff --git a/core/src/utils/bits.rs b/core/src/utils/bits.rs index 8c83314e13..c5f9b3a40b 100644 --- a/core/src/utils/bits.rs +++ b/core/src/utils/bits.rs @@ -1,4 +1,4 @@ -// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// Copyright 2019-2024 Parity Technologies (UK) Ltd. // This file is dual-licensed as Apache-2.0 or GPL-3.0. // see LICENSE for license details. diff --git a/core/src/utils/era.rs b/core/src/utils/era.rs index c98ebe58f6..75ae36a791 100644 --- a/core/src/utils/era.rs +++ b/core/src/utils/era.rs @@ -1,4 +1,4 @@ -// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// Copyright 2019-2024 Parity Technologies (UK) Ltd. // This file is dual-licensed as Apache-2.0 or GPL-3.0. // see LICENSE for license details. diff --git a/core/src/utils/mod.rs b/core/src/utils/mod.rs index 6d57b974c3..034a5b12a8 100644 --- a/core/src/utils/mod.rs +++ b/core/src/utils/mod.rs @@ -1,4 +1,4 @@ -// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// Copyright 2019-2024 Parity Technologies (UK) Ltd. // This file is dual-licensed as Apache-2.0 or GPL-3.0. // see LICENSE for license details. @@ -24,14 +24,11 @@ pub use account_id::AccountId32; pub use era::Era; pub use multi_address::MultiAddress; pub use multi_signature::MultiSignature; +pub use primitive_types::{H160, H256, H512}; pub use static_type::Static; pub use unchecked_extrinsic::UncheckedExtrinsic; pub use wrapper_opaque::WrapperKeepOpaque; -// Used in codegen -#[doc(hidden)] -pub use primitive_types::{H160, H256, H512}; - /// Wraps an already encoded byte vector, prevents being encoded as a raw byte vector as part of /// the transaction payload #[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd)] @@ -74,7 +71,7 @@ unsafe impl Sync for PhantomDataSendSync {} /// as `BTreeMap` which allows us to easily swap the two during codegen. pub type KeyedVec = Vec<(K, V)>; -/// A unit marker struct signalling that some property is true +/// A unit marker struct. pub struct Yes; /// A quick helper to encode some bytes to hex. diff --git a/core/src/utils/multi_address.rs b/core/src/utils/multi_address.rs index 3a2d97297d..6bdbf79a6f 100644 --- a/core/src/utils/multi_address.rs +++ b/core/src/utils/multi_address.rs @@ -1,4 +1,4 @@ -// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// Copyright 2019-2024 Parity Technologies (UK) Ltd. // This file is dual-licensed as Apache-2.0 or GPL-3.0. // see LICENSE for license details. diff --git a/core/src/utils/multi_signature.rs b/core/src/utils/multi_signature.rs index 4ed9ea4bd5..63fabfd46f 100644 --- a/core/src/utils/multi_signature.rs +++ b/core/src/utils/multi_signature.rs @@ -1,4 +1,4 @@ -// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// Copyright 2019-2024 Parity Technologies (UK) Ltd. // This file is dual-licensed as Apache-2.0 or GPL-3.0. // see LICENSE for license details. diff --git a/core/src/utils/static_type.rs b/core/src/utils/static_type.rs index ad359886f5..3c34eee770 100644 --- a/core/src/utils/static_type.rs +++ b/core/src/utils/static_type.rs @@ -1,4 +1,4 @@ -// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// Copyright 2019-2024 Parity Technologies (UK) Ltd. // This file is dual-licensed as Apache-2.0 or GPL-3.0. // see LICENSE for license details. diff --git a/core/src/utils/unchecked_extrinsic.rs b/core/src/utils/unchecked_extrinsic.rs index 6f4c3e69b0..d8984b92a4 100644 --- a/core/src/utils/unchecked_extrinsic.rs +++ b/core/src/utils/unchecked_extrinsic.rs @@ -1,4 +1,4 @@ -// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// Copyright 2019-2024 Parity Technologies (UK) Ltd. // This file is dual-licensed as Apache-2.0 or GPL-3.0. // see LICENSE for license details. diff --git a/core/src/utils/wrapper_opaque.rs b/core/src/utils/wrapper_opaque.rs index f0414a9d17..01ee60a88d 100644 --- a/core/src/utils/wrapper_opaque.rs +++ b/core/src/utils/wrapper_opaque.rs @@ -1,4 +1,4 @@ -// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// Copyright 2019-2024 Parity Technologies (UK) Ltd. // This file is dual-licensed as Apache-2.0 or GPL-3.0. // see LICENSE for license details. diff --git a/examples/wasm-example/Cargo.lock b/examples/wasm-example/Cargo.lock index 5b14afaaf3..423e15de47 100644 --- a/examples/wasm-example/Cargo.lock +++ b/examples/wasm-example/Cargo.lock @@ -29,9 +29,9 @@ dependencies = [ [[package]] name = "ahash" -version = "0.8.7" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77c3a9648d43b9cd48db467b3f87fdd6e146bcc88ab0180006cef2179fe11d01" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", "once_cell", @@ -47,9 +47,9 @@ checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" [[package]] name = "anyhow" -version = "1.0.79" +version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" +checksum = "0952808a6c2afd1aa8947271f3a60f1a6763c7b912d210184c5149b5cf147247" [[package]] name = "anymap2" @@ -80,13 +80,13 @@ checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" [[package]] name = "async-channel" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ca33f4bc4ed1babef42cad36cc1f51fa88be00420404e5b1e80ab1b18f7678c" +checksum = "f28243a43d821d11341ab73c80bed182dc015c514b951616cf79bd4af39af0c3" dependencies = [ "concurrent-queue", - "event-listener", - "event-listener-strategy", + "event-listener 5.3.0", + "event-listener-strategy 0.5.1", "futures-core", "pin-project-lite", ] @@ -97,20 +97,20 @@ version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d034b430882f8381900d3fe6f0aaa3ad94f2cb4ac519b429692a1bc2dda4ae7b" dependencies = [ - "event-listener", - "event-listener-strategy", + "event-listener 4.0.3", + "event-listener-strategy 0.4.0", "pin-project-lite", ] [[package]] name = "async-trait" -version = "0.1.77" +version = "0.1.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" +checksum = "a507401cad91ec6a857ed5513a2073c82a9b9048762b885bb98655b306964681" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] @@ -121,15 +121,15 @@ checksum = "a8ab6b55fe97976e46f91ddbed8d147d966475dc29b2032757ba47e02376fbc3" [[package]] name = "autocfg" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" [[package]] name = "backtrace" -version = "0.3.69" +version = "0.3.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" dependencies = [ "addr2line", "cc", @@ -158,6 +158,12 @@ version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +[[package]] +name = "base64" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9475866fec1451be56a3c2400fd081ff546538961565ccb5b7142cbd22bc7a51" + [[package]] name = "beef" version = "0.5.2" @@ -265,18 +271,18 @@ checksum = "cfa8873f51c92e232f9bac4065cddef41b714152812bfc5f7672ba16d6ef8cd9" [[package]] name = "bs58" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5353f36341f7451062466f0b755b96ac3a9547e4d7f6b70d603fc721a7d7896" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" dependencies = [ "tinyvec", ] [[package]] name = "bumpalo" -version = "3.14.0" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "byte-slice-cast" @@ -292,18 +298,15 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.5.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" [[package]] name = "cc" -version = "1.0.83" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" -dependencies = [ - "libc", -] +checksum = "2678b2e3449475e95b0aa6f9b506a28e61b3dc8996592b983695e8ebb58a8b41" [[package]] name = "cfg-if" @@ -438,9 +441,9 @@ dependencies = [ [[package]] name = "curve25519-dalek" -version = "4.1.1" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89b8c6a2e4b1f45971ad09761aafb85514a84744b67a95e32c3cc1352d1f65c" +checksum = "0a677b8922c94e01bdbb12126b0bc852f00447528dee1782229af9c720c3f348" dependencies = [ "cfg-if", "cpufeatures", @@ -461,7 +464,17 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", +] + +[[package]] +name = "darling" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850" +dependencies = [ + "darling_core 0.14.4", + "darling_macro 0.14.4", ] [[package]] @@ -470,8 +483,22 @@ version = "0.20.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" dependencies = [ - "darling_core", - "darling_macro", + "darling_core 0.20.8", + "darling_macro 0.20.8", +] + +[[package]] +name = "darling_core" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 1.0.109", ] [[package]] @@ -485,7 +512,18 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.48", + "syn 2.0.58", +] + +[[package]] +name = "darling_macro" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e" +dependencies = [ + "darling_core 0.14.4", + "quote", + "syn 1.0.109", ] [[package]] @@ -494,20 +532,20 @@ version = "0.20.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" dependencies = [ - "darling_core", + "darling_core 0.20.8", "quote", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] -name = "derivative" -version = "2.2.0" +name = "derive-where" +version = "1.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +checksum = "62d671cc41a825ebabc75757b62d3d168c577f9149b2d49ece1dad1f72119d25" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.58", ] [[package]] @@ -545,9 +583,9 @@ dependencies = [ [[package]] name = "downcast-rs" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" [[package]] name = "ed25519" @@ -592,7 +630,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e" dependencies = [ "concurrent-queue", - "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d9944b8ca13534cdfb2800775f8dd4902ff3fc75a50101466decadfdf322a24" +dependencies = [ + "concurrent-queue", "pin-project-lite", ] @@ -602,15 +649,25 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" dependencies = [ - "event-listener", + "event-listener 4.0.3", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "332f51cb23d20b0de8458b86580878211da09bcd4503cb579c225b3d124cabb3" +dependencies = [ + "event-listener 5.3.0", "pin-project-lite", ] [[package]] name = "fiat-crypto" -version = "0.2.5" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27573eac26f4dd11e2b1916c3fe1baa56407c83c71a773a8ba17ec0bca03b6b7" +checksum = "c007b1ae3abe1cb6f85a16305acd418b7ca6343b953633fee2b76d8f108b830f" [[package]] name = "fixed-hash" @@ -618,6 +675,9 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" dependencies = [ + "byteorder", + "rand", + "rustc-hex", "static_assertions", ] @@ -656,6 +716,7 @@ dependencies = [ "cfg-if", "parity-scale-codec", "scale-info", + "serde", ] [[package]] @@ -714,9 +775,9 @@ checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" [[package]] name = "futures-lite" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445ba825b27408685aaecefd65178908c36c6e96aaf6d8599419d46e624192ba" +checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" dependencies = [ "futures-core", "pin-project-lite", @@ -730,7 +791,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] @@ -747,9 +808,9 @@ checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" [[package]] name = "futures-timer" -version = "3.0.2" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" +checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" dependencies = [ "gloo-timers", "send_wrapper 0.4.0", @@ -785,9 +846,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.12" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" +checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" dependencies = [ "cfg-if", "js-sys", @@ -1016,9 +1077,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.24" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" dependencies = [ "bytes", "fnv", @@ -1026,7 +1087,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap 2.1.0", + "indexmap 2.2.6", "slab", "tokio", "tokio-util", @@ -1058,9 +1119,9 @@ checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" -version = "0.3.4" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d3d0e0f38255e7fa3cf31335b3a56f05febd18025f4db5ef7a0cfb4f8da651f" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] name = "hex" @@ -1100,9 +1161,9 @@ dependencies = [ [[package]] name = "http" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" dependencies = [ "bytes", "fnv", @@ -1188,6 +1249,15 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "impl-codec" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" +dependencies = [ + "parity-scale-codec", +] + [[package]] name = "impl-serde" version = "0.4.0" @@ -1229,9 +1299,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.1.0" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" dependencies = [ "equivalent", "hashbrown 0.14.3", @@ -1266,18 +1336,18 @@ dependencies = [ [[package]] name = "itertools" -version = "0.12.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25db6b064527c5d482d0423354fcd07a89a2dfe07b67892e62411946db7f07b0" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" dependencies = [ "either", ] [[package]] name = "itoa" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "js-sys" @@ -1290,9 +1360,9 @@ dependencies = [ [[package]] name = "jsonrpsee" -version = "0.22.1" +version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16fcc9dd231e72d22993f1643d5f7f0db785737dbe3c3d7ca222916ab4280795" +checksum = "c4b0e68d9af1f066c06d6e2397583795b912d78537d7d907c561e82c13d69fa1" dependencies = [ "jsonrpsee-client-transport", "jsonrpsee-core", @@ -1302,9 +1372,9 @@ dependencies = [ [[package]] name = "jsonrpsee-client-transport" -version = "0.22.1" +version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0476c96eb741b40d39dcb39d0124e3b9be9840ec77653c42a0996563ae2a53f7" +checksum = "92f254f56af1ae84815b9b1325094743dcf05b92abb5e94da2e81a35cff0cada" dependencies = [ "futures-channel", "futures-util", @@ -1325,12 +1395,11 @@ dependencies = [ [[package]] name = "jsonrpsee-core" -version = "0.22.1" +version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b974d8f6139efbe8425f32cb33302aba6d5e049556b5bfc067874e7a0da54a2e" +checksum = "274d68152c24aa78977243bb56f28d7946e6aa309945b37d33174a3f92d89a3a" dependencies = [ "anyhow", - "async-lock", "async-trait", "beef", "futures-timer", @@ -1350,9 +1419,9 @@ dependencies = [ [[package]] name = "jsonrpsee-http-client" -version = "0.22.1" +version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19dc795a277cff37f27173b3ca790d042afcc0372c34a7ca068d2e76de2cb6d1" +checksum = "ac13bc1e44cd00448a5ff485824a128629c945f02077804cb659c07a0ba41395" dependencies = [ "async-trait", "hyper", @@ -1370,9 +1439,9 @@ dependencies = [ [[package]] name = "jsonrpsee-types" -version = "0.22.1" +version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b13dac43c1a9fc2648b37f306b0a5b0e29b2a6e1c36a33b95c1948da2494e9c5" +checksum = "3dc828e537868d6b12bbb07ec20324909a22ced6efca0057c825c3e1126b2c6d" dependencies = [ "anyhow", "beef", @@ -1392,9 +1461,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.152" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "libm" @@ -1452,24 +1521,24 @@ dependencies = [ [[package]] name = "log" -version = "0.4.20" +version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" [[package]] name = "lru" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2994eeba8ed550fd9b47a0b38f0242bc3344e496483c6180b69139cc2fa5d1d7" +checksum = "d3262e75e648fce39813cb56ac41f3c3e3f65217ebf3844d818d1f9398cfb0dc" dependencies = [ "hashbrown 0.14.3", ] [[package]] name = "memchr" -version = "2.7.1" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" +checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" [[package]] name = "merlin" @@ -1491,18 +1560,18 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" dependencies = [ "adler", ] [[package]] name = "mio" -version = "0.8.10" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", "wasi", @@ -1544,11 +1613,10 @@ dependencies = [ [[package]] name = "num-integer" -version = "0.1.45" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "autocfg", "num-traits", ] @@ -1566,9 +1634,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.17" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" dependencies = [ "autocfg", ] @@ -1600,9 +1668,9 @@ checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "opaque-debug" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] name = "openssl-probe" @@ -1630,18 +1698,12 @@ version = "3.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be30eaf4b0a9fba5336683b38de57bb86d179a35862ba6bfcf57625d006bde5b" dependencies = [ - "proc-macro-crate 2.0.1", + "proc-macro-crate 2.0.2", "proc-macro2", "quote", "syn 1.0.109", ] -[[package]] -name = "parking" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" - [[package]] name = "paste" version = "1.0.14" @@ -1680,14 +1742,14 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] name = "pin-project-lite" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" [[package]] name = "pin-utils" @@ -1708,9 +1770,9 @@ dependencies = [ [[package]] name = "platforms" -version = "3.3.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "626dec3cac7cc0e1577a2ec3fc496277ec2baa084bebad95bb6fdbfae235f84c" +checksum = "db23d408679286588f4d4644f965003d056e3dd5abcaaa938116871d7ce2fee7" [[package]] name = "poly1305" @@ -1746,6 +1808,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" dependencies = [ "fixed-hash", + "impl-codec", + "impl-serde", + "scale-info", "uint", ] @@ -1761,9 +1826,9 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97dc5fea232fc28d2f597b37c4876b348a40e33f3b02cc975c8d006d78d94b1a" +checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" dependencies = [ "toml_datetime", "toml_edit 0.20.2", @@ -1795,9 +1860,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.78" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" dependencies = [ "unicode-ident", ] @@ -1866,16 +1931,17 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.7" +version = "0.17.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", + "cfg-if", "getrandom", "libc", "spin", "untrusted", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -1896,6 +1962,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +[[package]] +name = "rustc-hex" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" + [[package]] name = "rustc_version" version = "0.4.0" @@ -1919,14 +1991,14 @@ dependencies = [ [[package]] name = "rustls" -version = "0.22.2" +version = "0.22.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e87c9956bd9807afa1f77e0f7594af32566e830e088a5576d27c5b6f30f49d41" +checksum = "99008d7ad0bbbea527ec27bddbc0e432c5b87d8175178cee68d2eec9c4a1813c" dependencies = [ "log", "ring", "rustls-pki-types", - "rustls-webpki 0.102.1", + "rustls-webpki 0.102.2", "subtle", "zeroize", ] @@ -1950,7 +2022,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792" dependencies = [ "openssl-probe", - "rustls-pemfile 2.0.0", + "rustls-pemfile 2.1.2", "rustls-pki-types", "schannel", "security-framework", @@ -1967,19 +2039,19 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "2.0.0" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35e4980fa29e4c4b212ffb3db068a564cbf560e51d3944b7c88bd8bf5bec64f4" +checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" dependencies = [ - "base64 0.21.7", + "base64 0.22.0", "rustls-pki-types", ] [[package]] name = "rustls-pki-types" -version = "1.1.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e9d979b3ce68192e42760c7810125eb6cf2ea10efae545a156063e61f314e2a" +checksum = "ecd36cc4259e3e4514335c4a138c6b43171a8d61d8f5c9348f9fc7529416f247" [[package]] name = "rustls-webpki" @@ -1993,9 +2065,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.102.1" +version = "0.102.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef4ca26037c909dedb327b48c3327d0ba91d3dd3c4e05dad328f210ffb68e95b" +checksum = "faaa0a62740bedb9b2ef5afa303da42764c012f743917351dc9a237ea1663610" dependencies = [ "ring", "rustls-pki-types", @@ -2004,9 +2076,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" +checksum = "80af6f9131f277a45a3fba6ce8e2258037bb0477a67e610d3c1fe046ab31de47" [[package]] name = "ruzstd" @@ -2021,9 +2093,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" [[package]] name = "scale-bits" @@ -2045,11 +2117,25 @@ checksum = "afc79ba56a1c742f5aeeed1f1801f3edf51f7e818f0a54582cac6f131364ea7b" dependencies = [ "derive_more", "parity-scale-codec", + "primitive-types", "scale-bits", + "scale-decode-derive", "scale-type-resolver", "smallvec", ] +[[package]] +name = "scale-decode-derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5398fdb3c7bea3cb419bac4983aadacae93fe1a7b5f693f4ebd98c3821aad7a5" +dependencies = [ + "darling 0.14.4", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "scale-encode" version = "0.6.0" @@ -2058,16 +2144,31 @@ checksum = "628800925a33794fb5387781b883b5e14d130fece9af5a63613867b8de07c5c7" dependencies = [ "derive_more", "parity-scale-codec", + "primitive-types", "scale-bits", + "scale-encode-derive", "scale-type-resolver", "smallvec", ] +[[package]] +name = "scale-encode-derive" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a304e1af7cdfbe7a24e08b012721456cc8cecdedadc14b3d10513eada63233c" +dependencies = [ + "darling 0.14.4", + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "scale-info" -version = "2.10.0" +version = "2.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7d66a1128282b7ef025a8ead62a4a9fcf017382ec53b8ffbf4d7bf77bd3c60" +checksum = "7c453e59a955f81fb62ee5d596b450383d699f152d350e9d23a0db2adb78e4c0" dependencies = [ "bitvec", "cfg-if", @@ -2079,9 +2180,9 @@ dependencies = [ [[package]] name = "scale-info-derive" -version = "2.10.0" +version = "2.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abf2c68b89cafb3b8d918dd07b42be0da66ff202cf1155c5739a4e0c1ea0dc19" +checksum = "18cf6c6447f813ef19eb450e985bcce6705f9ce7660db221b59093d15c79c4b7" dependencies = [ "proc-macro-crate 1.3.1", "proc-macro2", @@ -2101,14 +2202,15 @@ dependencies = [ [[package]] name = "scale-typegen" -version = "0.2.0" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d6108609f017741c78d35967c7afe4aeaa3999b848282581041428e10d23b63" +checksum = "ed57b2c642c1e8c905e904c866d16614a3b5621dad323e9b6a6bc902f1380aa9" dependencies = [ "proc-macro2", "quote", "scale-info", - "syn 2.0.48", + "smallvec", + "syn 2.0.58", "thiserror", ] @@ -2118,6 +2220,8 @@ version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c07ccfee963104335c971aaf8b7b0e749be8569116322df23f1f75c4ca9e4a28" dependencies = [ + "base58", + "blake2", "derive_more", "either", "frame-metadata 15.1.0", @@ -2127,6 +2231,8 @@ dependencies = [ "scale-encode", "scale-info", "scale-type-resolver", + "serde", + "yap", ] [[package]] @@ -2169,9 +2275,9 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.9.2" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" +checksum = "770452e37cad93e0a50d5abc3990d2bc351c36d0328f86cefec2f2fb206eaef6" dependencies = [ "bitflags", "core-foundation", @@ -2182,9 +2288,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.9.1" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" +checksum = "41f3cc463c0ef97e11c3461a9d3787412d30e8e7eb907c79180c4a57bf7c04ef" dependencies = [ "core-foundation-sys", "libc", @@ -2192,9 +2298,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.21" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" +checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" [[package]] name = "send_wrapper" @@ -2245,14 +2351,14 @@ checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] name = "serde_json" -version = "1.0.114" +version = "1.0.115" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" +checksum = "12dc5c46daa8e9fdf4f5e71b6cf9a53f2487da0e86e55808e2d35539666497dd" dependencies = [ "itoa", "ryu", @@ -2326,9 +2432,9 @@ checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" [[package]] name = "siphasher" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54ac45299ccbd390721be55b412d41931911f654fa99e2cb8bfb57184b2061fe" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" [[package]] name = "slab" @@ -2341,9 +2447,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.13.1" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "smoldot" @@ -2363,7 +2469,7 @@ dependencies = [ "derive_more", "ed25519-zebra", "either", - "event-listener", + "event-listener 4.0.3", "fnv", "futures-lite", "futures-util", @@ -2412,7 +2518,7 @@ dependencies = [ "blake2-rfc", "derive_more", "either", - "event-listener", + "event-listener 4.0.3", "fnv", "futures-channel", "futures-lite", @@ -2436,12 +2542,12 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.5" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" dependencies = [ "libc", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -2461,9 +2567,9 @@ dependencies = [ [[package]] name = "sp-crypto-hashing" -version = "15.0.0" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0f4990add7b2cefdeca883c0efa99bb4d912cb2196120e1500c0cc099553b0" +checksum = "bc9927a7f81334ed5b8a98a4a978c81324d12bd9713ec76b5c68fd410174c5eb" dependencies = [ "blake2b_simd", "byteorder", @@ -2502,7 +2608,7 @@ name = "subxt" version = "0.35.0" dependencies = [ "async-trait", - "derivative", + "derive-where", "either", "frame-metadata 16.0.0", "futures", @@ -2521,6 +2627,7 @@ dependencies = [ "serde", "serde_json", "sp-crypto-hashing", + "subxt-core", "subxt-lightclient", "subxt-macro", "subxt-metadata", @@ -2544,18 +2651,18 @@ dependencies = [ "scale-info", "scale-typegen", "subxt-metadata", - "syn 2.0.48", + "syn 2.0.58", "thiserror", "tokio", ] [[package]] name = "subxt-core" -version = "0.34.0" +version = "0.35.0" dependencies = [ "base58", "blake2", - "derivative", + "derive-where", "derive_more", "frame-metadata 16.0.0", "hashbrown 0.14.3", @@ -2570,7 +2677,7 @@ dependencies = [ "scale-value", "serde", "serde_json", - "sp-core-hashing", + "sp-crypto-hashing", "subxt-metadata", "tracing", ] @@ -2604,13 +2711,13 @@ dependencies = [ name = "subxt-macro" version = "0.35.0" dependencies = [ - "darling", + "darling 0.20.8", "parity-scale-codec", "proc-macro-error", "quote", "scale-typegen", "subxt-codegen", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] @@ -2638,9 +2745,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.48" +version = "2.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" +checksum = "44cfb93f38070beee36b3fef7d4f5a16f27751d94b187b666a5cc5e9b0d30687" dependencies = [ "proc-macro2", "quote", @@ -2655,22 +2762,22 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "thiserror" -version = "1.0.57" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" +checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.57" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" +checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] @@ -2690,9 +2797,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.36.0" +version = "1.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" +checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" dependencies = [ "backtrace", "bytes", @@ -2713,7 +2820,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] @@ -2732,16 +2839,16 @@ version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" dependencies = [ - "rustls 0.22.2", + "rustls 0.22.3", "rustls-pki-types", "tokio", ] [[package]] name = "tokio-stream" -version = "0.1.14" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" +checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" dependencies = [ "futures-core", "pin-project-lite", @@ -2775,7 +2882,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.1.0", + "indexmap 2.2.6", "toml_datetime", "winnow", ] @@ -2786,7 +2893,7 @@ version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" dependencies = [ - "indexmap 2.1.0", + "indexmap 2.2.6", "toml_datetime", "winnow", ] @@ -2838,7 +2945,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] @@ -2899,9 +3006,9 @@ checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-normalization" -version = "0.1.22" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" dependencies = [ "tinyvec", ] @@ -2975,15 +3082,15 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.40" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bde2032aeb86bdfaecc8b261eef3cba735cc426c1f3a3416d1e0791be95fc461" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" dependencies = [ "cfg-if", "js-sys", @@ -3009,7 +3116,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -3040,9 +3147,9 @@ dependencies = [ [[package]] name = "wasmi" -version = "0.31.1" +version = "0.31.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acfc1e384a36ca532d070a315925887247f3c7e23567e23e0ac9b1c5d6b8bf76" +checksum = "77a8281d1d660cdf54c76a3efa9ddd0c270cada1383a995db3ccb43d166456c7" dependencies = [ "smallvec", "spin", @@ -3053,9 +3160,9 @@ dependencies = [ [[package]] name = "wasmi_arena" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "401c1f35e413fac1846d4843745589d9ec678977ab35a384db8ae7830525d468" +checksum = "104a7f73be44570cac297b3035d76b169d6599637631cf37a1703326a0727073" [[package]] name = "wasmi_core" @@ -3103,7 +3210,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.4", ] [[package]] @@ -3123,17 +3230,17 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" dependencies = [ - "windows_aarch64_gnullvm 0.52.0", - "windows_aarch64_msvc 0.52.0", - "windows_i686_gnu 0.52.0", - "windows_i686_msvc 0.52.0", - "windows_x86_64_gnu 0.52.0", - "windows_x86_64_gnullvm 0.52.0", - "windows_x86_64_msvc 0.52.0", + "windows_aarch64_gnullvm 0.52.4", + "windows_aarch64_msvc 0.52.4", + "windows_i686_gnu 0.52.4", + "windows_i686_msvc 0.52.4", + "windows_x86_64_gnu 0.52.4", + "windows_x86_64_gnullvm 0.52.4", + "windows_x86_64_msvc 0.52.4", ] [[package]] @@ -3144,9 +3251,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" +checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" [[package]] name = "windows_aarch64_msvc" @@ -3156,9 +3263,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" +checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" [[package]] name = "windows_i686_gnu" @@ -3168,9 +3275,9 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" +checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" [[package]] name = "windows_i686_msvc" @@ -3180,9 +3287,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" +checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" [[package]] name = "windows_x86_64_gnu" @@ -3192,9 +3299,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" +checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" [[package]] name = "windows_x86_64_gnullvm" @@ -3204,9 +3311,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" +checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" [[package]] name = "windows_x86_64_msvc" @@ -3216,15 +3323,15 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" +checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" [[package]] name = "winnow" -version = "0.5.34" +version = "0.5.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7cf47b659b318dccbd69cc4797a39ae128f533dce7902a1096044d1967b9c16" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" dependencies = [ "memchr", ] @@ -3240,9 +3347,9 @@ dependencies = [ [[package]] name = "x25519-dalek" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb66477291e7e8d2b0ff1bcb900bf29489a9692816d79874bea351e7a8b6de96" +checksum = "c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277" dependencies = [ "curve25519-dalek", "rand_core", @@ -3250,6 +3357,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "yap" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff4524214bc4629eba08d78ceb1d6507070cc0bcbbed23af74e19e6e924a24cf" + [[package]] name = "yew" version = "0.20.0" @@ -3336,7 +3449,7 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", ] [[package]] @@ -3356,5 +3469,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.58", ] diff --git a/examples/wasm-example/src/routes/signing.rs b/examples/wasm-example/src/routes/signing.rs index 7891ef92f8..51798cf134 100644 --- a/examples/wasm-example/src/routes/signing.rs +++ b/examples/wasm-example/src/routes/signing.rs @@ -3,11 +3,11 @@ use futures::FutureExt; use subxt::{OnlineClient, PolkadotConfig}; +use subxt::config::DefaultExtrinsicParamsBuilder; use subxt::ext::codec::{Decode, Encode}; +use subxt::tx::PayloadT as _; use subxt::tx::SubmittableExtrinsic; -use subxt::tx::TxPayload; use subxt::utils::{AccountId32, MultiSignature}; -use subxt::config::DefaultExtrinsicParamsBuilder; use crate::services::{extension_signature_for_extrinsic, get_accounts, polkadot, Account}; use web_sys::HtmlInputElement; @@ -137,41 +137,54 @@ impl Component for SigningExamplesComponent { let api = self.online_client.as_ref().unwrap().clone(); - ctx.link() - .send_future( - async move { - let Ok(account_nonce) = api.tx().account_nonce(&account_id).await else { - return Message::Error(anyhow!("Fetching account nonce failed")); - }; - - let Ok(call_data) = api.tx().call_data(&remark_call) else { - return Message::Error(anyhow!("could not encode call data")); - }; - - let Ok(signature) = extension_signature_for_extrinsic(&call_data, &api, account_nonce, account_source, account_address).await else { - return Message::Error(anyhow!("Signing via extension failed")); - }; - - let Ok(multi_signature) = MultiSignature::decode(&mut &signature[..]) else { - return Message::Error(anyhow!("MultiSignature Decoding")); - }; - - let params = DefaultExtrinsicParamsBuilder::new().nonce(account_nonce).build(); - let Ok(partial_signed) = api.tx().create_partial_signed_offline(&remark_call, params) else { - return Message::Error(anyhow!("PartialExtrinsic creation failed")); - }; - - // Apply the signature - let signed_extrinsic = partial_signed.sign_with_address_and_signature(&account_id.into(), &multi_signature); - - // check the TX validity (to debug in the js console if the extrinsic would work) - let dry_res = signed_extrinsic.validate().await; - web_sys::console::log_1(&format!("Validation Result: {:?}", dry_res).into()); - - // return the signature and signed extrinsic - Message::ReceivedSignature(multi_signature, signed_extrinsic) - } + ctx.link().send_future(async move { + let Ok(account_nonce) = api.tx().account_nonce(&account_id).await else { + return Message::Error(anyhow!("Fetching account nonce failed")); + }; + + let Ok(call_data) = api.tx().call_data(&remark_call) else { + return Message::Error(anyhow!("could not encode call data")); + }; + + let Ok(signature) = extension_signature_for_extrinsic( + &call_data, + &api, + account_nonce, + account_source, + account_address, + ) + .await + else { + return Message::Error(anyhow!("Signing via extension failed")); + }; + + let Ok(multi_signature) = MultiSignature::decode(&mut &signature[..]) + else { + return Message::Error(anyhow!("MultiSignature Decoding")); + }; + + let params = DefaultExtrinsicParamsBuilder::new() + .nonce(account_nonce) + .build(); + let Ok(partial_signed) = + api.tx().create_partial_signed_offline(&remark_call, params) + else { + return Message::Error(anyhow!("PartialExtrinsic creation failed")); + }; + + // Apply the signature + let signed_extrinsic = partial_signed + .sign_with_address_and_signature(&account_id.into(), &multi_signature); + + // check the TX validity (to debug in the js console if the extrinsic would work) + let dry_res = signed_extrinsic.validate().await; + web_sys::console::log_1( + &format!("Validation Result: {:?}", dry_res).into(), ); + + // return the signature and signed extrinsic + Message::ReceivedSignature(multi_signature, signed_extrinsic) + }); } } Message::ReceivedSignature(signature, signed_extrinsic) => { @@ -192,7 +205,9 @@ impl Component for SigningExamplesComponent { .. } = &mut self.stage { - let SubmittingStage::Initial { signed_extrinsic } = std::mem::replace(submitting_stage, SubmittingStage::Submitting) else { + let SubmittingStage::Initial { signed_extrinsic } = + std::mem::replace(submitting_stage, SubmittingStage::Submitting) + else { panic!("unreachable") }; diff --git a/examples/wasm-example/src/services.rs b/examples/wasm-example/src/services.rs index c981364b01..5b8df203ef 100644 --- a/examples/wasm-example/src/services.rs +++ b/examples/wasm-example/src/services.rs @@ -130,8 +130,8 @@ pub async fn extension_signature_for_extrinsic( ) -> Result, anyhow::Error> { let genesis_hash = encode_then_hex(&api.genesis_hash()); // These numbers aren't SCALE encoded; their bytes are just converted to hex: - let spec_version = to_hex(&api.runtime_version().spec_version().to_be_bytes()); - let transaction_version = to_hex(&api.runtime_version().transaction_version().to_be_bytes()); + let spec_version = to_hex(&api.runtime_version().spec_version.to_be_bytes()); + let transaction_version = to_hex(&api.runtime_version().transaction_version.to_be_bytes()); let nonce = to_hex(&account_nonce.to_be_bytes()); // If you construct a mortal transaction, then this block hash needs to correspond // to the block number passed to `Era::mortal()`. diff --git a/signer/src/ecdsa.rs b/signer/src/ecdsa.rs index 4b7fb120ef..7a5fee996f 100644 --- a/signer/src/ecdsa.rs +++ b/signer/src/ecdsa.rs @@ -283,7 +283,7 @@ mod subxt_compat { use super::*; use subxt_core::config::Config; - use subxt_core::tx::Signer as SignerT; + use subxt_core::tx::signer::Signer as SignerT; use subxt_core::utils::{AccountId32, MultiAddress, MultiSignature}; impl From for MultiSignature { diff --git a/signer/src/sr25519.rs b/signer/src/sr25519.rs index 25db213a0d..f28302b422 100644 --- a/signer/src/sr25519.rs +++ b/signer/src/sr25519.rs @@ -259,7 +259,7 @@ mod subxt_compat { use super::*; use subxt_core::{ - tx::Signer as SignerT, + tx::signer::Signer as SignerT, utils::{AccountId32, MultiAddress, MultiSignature}, Config, }; diff --git a/subxt/examples/setup_client_offline.rs b/subxt/examples/setup_client_offline.rs index db3794661e..83e7fe9078 100644 --- a/subxt/examples/setup_client_offline.rs +++ b/subxt/examples/setup_client_offline.rs @@ -16,7 +16,10 @@ async fn main() -> Result<(), Box> { }; // 2. A runtime version (system_version constant on a Substrate node has these): - let runtime_version = subxt::client::RuntimeVersion::new(9370, 20); + let runtime_version = subxt::client::RuntimeVersion { + spec_version: 9370, + transaction_version: 20, + }; // 3. Metadata (I'll load it from the downloaded metadata, but you can use // `subxt metadata > file.scale` to download it): diff --git a/subxt/examples/setup_config_custom.rs b/subxt/examples/setup_config_custom.rs index 38cab069f9..cc4900d5d7 100644 --- a/subxt/examples/setup_config_custom.rs +++ b/subxt/examples/setup_config_custom.rs @@ -62,7 +62,7 @@ impl ExtrinsicParams for CustomExtrinsicParams { // Gather together all of the params we will need to encode: fn new(client: &ClientState, params: Self::Params) -> Result { Ok(Self { - genesis_hash: client.genesis_hash(), + genesis_hash: client.genesis_hash, tip: params.tip, foo: params.foo, }) diff --git a/subxt/examples/storage_fetch.rs b/subxt/examples/storage_fetch.rs index 910bd26ed8..1ee4be2949 100644 --- a/subxt/examples/storage_fetch.rs +++ b/subxt/examples/storage_fetch.rs @@ -22,9 +22,10 @@ async fn main() -> Result<(), Box> { .storage() .at_latest() .await? - .fetch(&storage_query) + .fetch_raw(subxt_core::storage::get_address_bytes(&storage_query, &api.metadata()).unwrap()) .await?; - println!("Alice has free balance: {}", result.unwrap().data.free); + let v = hex::encode(result.unwrap()); + println!("Alice: {v}"); Ok(()) } diff --git a/subxt/src/backend/legacy/mod.rs b/subxt/src/backend/legacy/mod.rs index 6c2a5a2563..425cf0c8bf 100644 --- a/subxt/src/backend/legacy/mod.rs +++ b/subxt/src/backend/legacy/mod.rs @@ -181,16 +181,20 @@ impl Backend for LegacyBackend { async fn current_runtime_version(&self) -> Result { let details = self.methods.state_get_runtime_version(None).await?; - Ok(RuntimeVersion::new( - details.spec_version, - details.transaction_version, - )) + Ok(RuntimeVersion { + spec_version: details.spec_version, + transaction_version: details.transaction_version, + }) } async fn stream_runtime_version(&self) -> Result, Error> { let sub = self.methods.state_subscribe_runtime_version().await?; - let sub = - sub.map(|r| r.map(|v| RuntimeVersion::new(v.spec_version, v.transaction_version))); + let sub = sub.map(|r| { + r.map(|v| RuntimeVersion { + spec_version: v.spec_version, + transaction_version: v.transaction_version, + }) + }); Ok(StreamOf(Box::pin(sub))) } diff --git a/subxt/src/backend/unstable/mod.rs b/subxt/src/backend/unstable/mod.rs index d126b8343b..24af5a88c2 100644 --- a/subxt/src/backend/unstable/mod.rs +++ b/subxt/src/backend/unstable/mod.rs @@ -416,7 +416,10 @@ impl Backend for UnstableBackend { RuntimeEvent::Valid(ev) => ev, }; - let runtime_version = RuntimeVersion::new(runtime_details.spec.spec_version, runtime_details.spec.transaction_version); + let runtime_version = RuntimeVersion { + spec_version: runtime_details.spec.spec_version, + transaction_version: runtime_details.spec.transaction_version + }; std::future::ready(Some(Ok(runtime_version))) }); diff --git a/subxt/src/blocks/block_types.rs b/subxt/src/blocks/block_types.rs index a1cb01ec25..b93a05ba3e 100644 --- a/subxt/src/blocks/block_types.rs +++ b/subxt/src/blocks/block_types.rs @@ -4,7 +4,7 @@ use crate::{ backend::BlockRef, - blocks::{extrinsic_types::ExtrinsicPartTypeIds, Extrinsics}, + blocks::Extrinsics, client::{OfflineClientT, OnlineClientT}, config::{Config, Header}, error::{BlockError, DecodeError, Error}, @@ -79,7 +79,6 @@ where /// Fetch and return the extrinsics in the block body. pub async fn extrinsics(&self) -> Result, Error> { - let ids = ExtrinsicPartTypeIds::new(&self.client.metadata())?; let block_hash = self.header.hash(); let Some(extrinsics) = self.client.backend().block_body(block_hash).await? else { return Err(BlockError::not_found(block_hash).into()); @@ -89,9 +88,8 @@ where self.client.clone(), extrinsics, self.cached_events.clone(), - ids, block_hash, - )) + )?) } /// Work with storage. diff --git a/subxt/src/blocks/extrinsic_types.rs b/subxt/src/blocks/extrinsic_types.rs index 4ebd7a0166..f334085ede 100644 --- a/subxt/src/blocks/extrinsic_types.rs +++ b/subxt/src/blocks/extrinsic_types.rs @@ -6,31 +6,24 @@ use crate::{ blocks::block_types::{get_events, CachedEvents}, client::{OfflineClientT, OnlineClientT}, config::{Config, Hasher}, - error::{BlockError, Error, MetadataError}, + error::{BlockError, Error}, events, - metadata::types::PalletMetadata, - Metadata, }; -use crate::config::signed_extensions::{ - ChargeAssetTxPayment, ChargeTransactionPayment, CheckNonce, -}; -use crate::config::SignedExtension; -use crate::dynamic::Value; -use crate::utils::strip_compact_prefix; -use codec::Decode; use derive_where::derive_where; use scale_decode::DecodeAsType; +use subxt_core::blocks::{ExtrinsicDetails as CoreExtrinsicDetails, Extrinsics as CoreExtrinsics}; -use std::sync::Arc; -pub use subxt_core::blocks::StaticExtrinsic; +// Re-export anything that's directly returned/used in the APIs below. +pub use subxt_core::blocks::{ + ExtrinsicMetadataDetails, ExtrinsicSignedExtension, ExtrinsicSignedExtensions, StaticExtrinsic, +}; /// The body of a block. pub struct Extrinsics { + inner: CoreExtrinsics, client: C, - extrinsics: Vec>, cached_events: CachedEvents, - ids: ExtrinsicPartTypeIds, hash: T::Hash, } @@ -43,27 +36,25 @@ where client: C, extrinsics: Vec>, cached_events: CachedEvents, - ids: ExtrinsicPartTypeIds, hash: T::Hash, - ) -> Self { - Self { + ) -> Result { + let inner = CoreExtrinsics::decode_from(extrinsics, client.metadata())?; + Ok(Self { + inner, client, - extrinsics, cached_events, - ids, hash, - } + }) } - /// The number of extrinsics. + /// See [`subxt_core::blocks::Extrinsics::len()`]. pub fn len(&self) -> usize { - self.extrinsics.len() + self.inner.len() } - /// Are there no extrinsics in this block? - // Note: mainly here to satisfy clippy. + /// See [`subxt_core::blocks::Extrinsics::is_empty()`]. pub fn is_empty(&self) -> bool { - self.extrinsics.is_empty() + self.inner.is_empty() } /// Return the block hash that these extrinsics are from. @@ -77,36 +68,18 @@ where pub fn iter( &self, ) -> impl Iterator, Error>> + Send + Sync + 'static { - let extrinsics = self.extrinsics.clone(); - let num_extrinsics = self.extrinsics.len(); let client = self.client.clone(); - let hash = self.hash; let cached_events = self.cached_events.clone(); - let ids = self.ids; - let mut index = 0; - - std::iter::from_fn(move || { - if index == num_extrinsics { - None - } else { - match ExtrinsicDetails::decode_from( - index as u32, - &extrinsics[index], - client.clone(), - hash, - cached_events.clone(), - ids, - ) { - Ok(extrinsic_details) => { - index += 1; - Some(Ok(extrinsic_details)) - } - Err(e) => { - index = num_extrinsics; - Some(Err(e)) - } - } - } + let block_hash = self.hash; + + self.inner.iter().map(move |res| { + let inner = res?; + Ok(ExtrinsicDetails::new( + inner, + client.clone(), + block_hash, + cached_events.clone(), + )) }) } @@ -116,15 +89,24 @@ where pub fn find( &self, ) -> impl Iterator, Error>> + '_ { - self.iter().filter_map(|res| match res { - Err(err) => Some(Err(err)), - Ok(details) => match details.as_extrinsic::() { - // Failed to decode extrinsic: - Err(err) => Some(Err(err)), - // Extrinsic for a different pallet / different call (skip): - Ok(None) => None, - Ok(Some(value)) => Some(Ok(FoundExtrinsic { details, value })), - }, + self.inner.find::().map(|res| { + match res { + Err(e) => Err(Error::from(e)), + Ok(ext) => { + // Wrap details from subxt-core into what we want here: + let details = ExtrinsicDetails::new( + ext.details, + self.client.clone(), + self.hash, + self.cached_events.clone(), + ); + + Ok(FoundExtrinsic { + details, + value: ext.value, + }) + } + } }) } @@ -148,39 +130,13 @@ where /// A single extrinsic in a block. pub struct ExtrinsicDetails { - /// The index of the extrinsic in the block. - index: u32, - /// Extrinsic bytes. - bytes: Arc<[u8]>, - /// Some if the extrinsic payload is signed. - signed_details: Option, - /// The start index in the `bytes` from which the call is encoded. - call_start_idx: usize, - /// The pallet index. - pallet_index: u8, - /// The variant index. - variant_index: u8, + inner: CoreExtrinsicDetails, /// The block hash of this extrinsic (needed to fetch events). block_hash: T::Hash, /// Subxt client. client: C, /// Cached events. cached_events: CachedEvents, - /// Subxt metadata to fetch the extrinsic metadata. - metadata: Metadata, - _marker: std::marker::PhantomData, -} - -/// Details only available in signed extrinsics. -pub struct SignedExtrinsicDetails { - /// start index of the range in `bytes` of `ExtrinsicDetails` that encodes the address. - address_start_idx: usize, - /// end index of the range in `bytes` of `ExtrinsicDetails` that encodes the address. Equivalent to signature_start_idx. - address_end_idx: usize, - /// end index of the range in `bytes` of `ExtrinsicDetails` that encodes the signature. Equivalent to extra_start_idx. - signature_end_idx: usize, - /// end index of the range in `bytes` of `ExtrinsicDetails` that encodes the signature. - extra_end_idx: usize, } impl ExtrinsicDetails @@ -189,266 +145,103 @@ where C: OfflineClientT, { // Attempt to dynamically decode a single extrinsic from the given input. - pub(crate) fn decode_from( - index: u32, - extrinsic_bytes: &[u8], + pub(crate) fn new( + inner: CoreExtrinsicDetails, client: C, block_hash: T::Hash, cached_events: CachedEvents, - ids: ExtrinsicPartTypeIds, - ) -> Result, Error> { - const SIGNATURE_MASK: u8 = 0b1000_0000; - const VERSION_MASK: u8 = 0b0111_1111; - const LATEST_EXTRINSIC_VERSION: u8 = 4; - - let metadata = client.metadata(); - - // removing the compact encoded prefix: - let bytes: Arc<[u8]> = strip_compact_prefix(extrinsic_bytes)?.1.into(); - - // Extrinsic are encoded in memory in the following way: - // - first byte: abbbbbbb (a = 0 for unsigned, 1 for signed, b = version) - // - signature: [unknown TBD with metadata]. - // - extrinsic data - let first_byte: u8 = Decode::decode(&mut &bytes[..])?; - - let version = first_byte & VERSION_MASK; - if version != LATEST_EXTRINSIC_VERSION { - return Err(BlockError::UnsupportedVersion(version).into()); - } - - let is_signed = first_byte & SIGNATURE_MASK != 0; - - // Skip over the first byte which denotes the version and signing. - let cursor = &mut &bytes[1..]; - - let signed_details = is_signed - .then(|| -> Result { - let address_start_idx = bytes.len() - cursor.len(); - // Skip over the address, signature and extra fields. - scale_decode::visitor::decode_with_visitor( - cursor, - &ids.address, - metadata.types(), - scale_decode::visitor::IgnoreVisitor::new(), - ) - .map_err(scale_decode::Error::from)?; - let address_end_idx = bytes.len() - cursor.len(); - - scale_decode::visitor::decode_with_visitor( - cursor, - &ids.signature, - metadata.types(), - scale_decode::visitor::IgnoreVisitor::new(), - ) - .map_err(scale_decode::Error::from)?; - let signature_end_idx = bytes.len() - cursor.len(); - - scale_decode::visitor::decode_with_visitor( - cursor, - &ids.extra, - metadata.types(), - scale_decode::visitor::IgnoreVisitor::new(), - ) - .map_err(scale_decode::Error::from)?; - let extra_end_idx = bytes.len() - cursor.len(); - - Ok(SignedExtrinsicDetails { - address_start_idx, - address_end_idx, - signature_end_idx, - extra_end_idx, - }) - }) - .transpose()?; - - let call_start_idx = bytes.len() - cursor.len(); - - // Decode the pallet index, then the call variant. - let cursor = &mut &bytes[call_start_idx..]; - - let pallet_index: u8 = Decode::decode(cursor)?; - let variant_index: u8 = Decode::decode(cursor)?; - - Ok(ExtrinsicDetails { - index, - bytes, - signed_details, - call_start_idx, - pallet_index, - variant_index, - block_hash, + ) -> ExtrinsicDetails { + ExtrinsicDetails { + inner, client, + block_hash, cached_events, - metadata, - _marker: std::marker::PhantomData, - }) + } } - /// Is the extrinsic signed? + /// See [`subxt_core::blocks::ExtrinsicDetails::is_signed()`]. pub fn is_signed(&self) -> bool { - self.signed_details.is_some() + self.inner.is_signed() } - /// The index of the extrinsic in the block. + /// See [`subxt_core::blocks::ExtrinsicDetails::index()`]. pub fn index(&self) -> u32 { - self.index + self.inner.index() } - /// Return _all_ of the bytes representing this extrinsic, which include, in order: - /// - First byte: abbbbbbb (a = 0 for unsigned, 1 for signed, b = version) - /// - SignatureType (if the payload is signed) - /// - Address - /// - Signature - /// - Extra fields - /// - Extrinsic call bytes + /// See [`subxt_core::blocks::ExtrinsicDetails::bytes()`]. pub fn bytes(&self) -> &[u8] { - &self.bytes + self.inner.bytes() } - /// Return only the bytes representing this extrinsic call: - /// - First byte is the pallet index - /// - Second byte is the variant (call) index - /// - Followed by field bytes. - /// - /// # Note - /// - /// Please use [`Self::bytes`] if you want to get all extrinsic bytes. + /// See [`subxt_core::blocks::ExtrinsicDetails::call_bytes()`]. pub fn call_bytes(&self) -> &[u8] { - &self.bytes[self.call_start_idx..] + self.inner.call_bytes() } - /// Return the bytes representing the fields stored in this extrinsic. - /// - /// # Note - /// - /// This is a subset of [`Self::call_bytes`] that does not include the - /// first two bytes that denote the pallet index and the variant index. + /// See [`subxt_core::blocks::ExtrinsicDetails::field_bytes()`]. pub fn field_bytes(&self) -> &[u8] { - // Note: this cannot panic because we checked the extrinsic bytes - // to contain at least two bytes. - &self.call_bytes()[2..] + self.inner.field_bytes() } - /// Return only the bytes of the address that signed this extrinsic. - /// - /// # Note - /// - /// Returns `None` if the extrinsic is not signed. + /// See [`subxt_core::blocks::ExtrinsicDetails::address_bytes()`]. pub fn address_bytes(&self) -> Option<&[u8]> { - self.signed_details - .as_ref() - .map(|e| &self.bytes[e.address_start_idx..e.address_end_idx]) + self.inner.address_bytes() } - /// Returns Some(signature_bytes) if the extrinsic was signed otherwise None is returned. + /// See [`subxt_core::blocks::ExtrinsicDetails::signature_bytes()`]. pub fn signature_bytes(&self) -> Option<&[u8]> { - self.signed_details - .as_ref() - .map(|e| &self.bytes[e.address_end_idx..e.signature_end_idx]) + self.inner.signature_bytes() } - /// Returns the signed extension `extra` bytes of the extrinsic. - /// Each signed extension has an `extra` type (May be zero-sized). - /// These bytes are the scale encoded `extra` fields of each signed extension in order of the signed extensions. - /// They do *not* include the `additional` signed bytes that are used as part of the payload that is signed. - /// - /// Note: Returns `None` if the extrinsic is not signed. + /// See [`subxt_core::blocks::ExtrinsicDetails::signed_extensions_bytes()`]. pub fn signed_extensions_bytes(&self) -> Option<&[u8]> { - self.signed_details - .as_ref() - .map(|e| &self.bytes[e.signature_end_idx..e.extra_end_idx]) + self.inner.signed_extensions_bytes() } - /// Returns `None` if the extrinsic is not signed. + /// See [`subxt_core::blocks::ExtrinsicDetails::signed_extensions()`]. pub fn signed_extensions(&self) -> Option> { - let signed = self.signed_details.as_ref()?; - let extra_bytes = &self.bytes[signed.signature_end_idx..signed.extra_end_idx]; - Some(ExtrinsicSignedExtensions { - bytes: extra_bytes, - metadata: &self.metadata, - _marker: std::marker::PhantomData, - }) + self.inner.signed_extensions() } - /// The index of the pallet that the extrinsic originated from. + /// See [`subxt_core::blocks::ExtrinsicDetails::pallet_index()`]. pub fn pallet_index(&self) -> u8 { - self.pallet_index + self.inner.pallet_index() } - /// The index of the extrinsic variant that the extrinsic originated from. + /// See [`subxt_core::blocks::ExtrinsicDetails::variant_index()`]. pub fn variant_index(&self) -> u8 { - self.variant_index + self.inner.variant_index() } - /// The name of the pallet from whence the extrinsic originated. + /// See [`subxt_core::blocks::ExtrinsicDetails::pallet_name()`]. pub fn pallet_name(&self) -> Result<&str, Error> { - Ok(self.extrinsic_metadata()?.pallet.name()) + self.inner.pallet_name().map_err(Into::into) } - /// The name of the call (ie the name of the variant that it corresponds to). + /// See [`subxt_core::blocks::ExtrinsicDetails::variant_name()`]. pub fn variant_name(&self) -> Result<&str, Error> { - Ok(&self.extrinsic_metadata()?.variant.name) + self.inner.variant_name().map_err(Into::into) } - /// Fetch the metadata for this extrinsic. + /// See [`subxt_core::blocks::ExtrinsicDetails::extrinsic_metadata()`]. pub fn extrinsic_metadata(&self) -> Result { - let pallet = self.metadata.pallet_by_index_err(self.pallet_index())?; - let variant = pallet - .call_variant_by_index(self.variant_index()) - .ok_or_else(|| MetadataError::VariantIndexNotFound(self.variant_index()))?; - - Ok(ExtrinsicMetadataDetails { pallet, variant }) + self.inner.extrinsic_metadata().map_err(Into::into) } - /// Decode and provide the extrinsic fields back in the form of a [`scale_value::Composite`] - /// type which represents the named or unnamed fields that were present in the extrinsic. + /// See [`subxt_core::blocks::ExtrinsicDetails::field_values()`]. pub fn field_values(&self) -> Result, Error> { - let bytes = &mut self.field_bytes(); - let extrinsic_metadata = self.extrinsic_metadata()?; - - let mut fields = extrinsic_metadata - .variant - .fields - .iter() - .map(|f| scale_decode::Field::new(&f.ty.id, f.name.as_deref())); - let decoded = - scale_value::scale::decode_as_fields(bytes, &mut fields, self.metadata.types())?; - - Ok(decoded) + self.inner.field_values().map_err(Into::into) } - /// Attempt to decode these [`ExtrinsicDetails`] into a type representing the extrinsic fields. - /// Such types are exposed in the codegen as `pallet_name::calls::types::CallName` types. + /// See [`subxt_core::blocks::ExtrinsicDetails::as_extrinsic()`]. pub fn as_extrinsic(&self) -> Result, Error> { - let extrinsic_metadata = self.extrinsic_metadata()?; - if extrinsic_metadata.pallet.name() == E::PALLET - && extrinsic_metadata.variant.name == E::CALL - { - let mut fields = extrinsic_metadata - .variant - .fields - .iter() - .map(|f| scale_decode::Field::new(&f.ty.id, f.name.as_deref())); - let decoded = - E::decode_as_fields(&mut self.field_bytes(), &mut fields, self.metadata.types())?; - Ok(Some(decoded)) - } else { - Ok(None) - } + self.inner.as_extrinsic::().map_err(Into::into) } - /// Attempt to decode these [`ExtrinsicDetails`] into an outer call enum type (which includes - /// the pallet and extrinsic enum variants as well as the extrinsic fields). A compatible - /// type for this is exposed via static codegen as a root level `Call` type. + /// See [`subxt_core::blocks::ExtrinsicDetails::as_root_extrinsic()`]. pub fn as_root_extrinsic(&self) -> Result { - let decoded = E::decode_as_type( - &mut &self.call_bytes()[..], - &self.metadata.outer_enums().call_enum_ty(), - self.metadata.types(), - )?; - - Ok(decoded) + self.inner.as_root_extrinsic::().map_err(Into::into) } } @@ -460,52 +253,19 @@ where /// The events associated with the extrinsic. pub async fn events(&self) -> Result, Error> { let events = get_events(&self.client, self.block_hash, &self.cached_events).await?; - let ext_hash = T::Hasher::hash_of(&self.bytes); - Ok(ExtrinsicEvents::new(ext_hash, self.index, events)) + let ext_hash = T::Hasher::hash_of(&self.bytes()); + Ok(ExtrinsicEvents::new(ext_hash, self.index(), events)) } } /// A Static Extrinsic found in a block coupled with it's details. pub struct FoundExtrinsic { + /// Details for the extrinsic. pub details: ExtrinsicDetails, + /// The decoded extrinsic value. pub value: E, } -/// Details for the given extrinsic plucked from the metadata. -pub struct ExtrinsicMetadataDetails<'a> { - pub pallet: PalletMetadata<'a>, - pub variant: &'a scale_info::Variant, -} - -/// The type IDs extracted from the metadata that represent the -/// generic type parameters passed to the `UncheckedExtrinsic` from -/// the substrate-based chain. -#[derive(Debug, Copy, Clone)] -pub(crate) struct ExtrinsicPartTypeIds { - /// The address (source) of the extrinsic. - address: u32, - /// The extrinsic call type. - // Note: the call type can be used to skip over the extrinsic bytes to check - // they are in line with our metadata. This operation is currently postponed. - _call: u32, - /// The signature of the extrinsic. - signature: u32, - /// The extra parameters of the extrinsic. - extra: u32, -} - -impl ExtrinsicPartTypeIds { - /// Extract the generic type parameters IDs from the extrinsic type. - pub(crate) fn new(metadata: &Metadata) -> Result { - Ok(ExtrinsicPartTypeIds { - address: metadata.extrinsic().address_ty(), - _call: metadata.extrinsic().call_ty(), - signature: metadata.extrinsic().signature_ty(), - extra: metadata.extrinsic().extra_ty(), - }) - } -} - /// The events associated with a given extrinsic. #[derive_where(Debug)] pub struct ExtrinsicEvents { @@ -596,427 +356,3 @@ impl ExtrinsicEvents { Ok(self.find::().next().transpose()?.is_some()) } } - -/// The signed extensions of an extrinsic. -#[derive(Debug, Clone)] -pub struct ExtrinsicSignedExtensions<'a, T: Config> { - bytes: &'a [u8], - metadata: &'a Metadata, - _marker: std::marker::PhantomData, -} - -impl<'a, T: Config> ExtrinsicSignedExtensions<'a, T> { - /// Returns an iterator over each of the signed extension details of the extrinsic. - /// If the decoding of any signed extension fails, an error item is yielded and the iterator stops. - pub fn iter(&self) -> impl Iterator, Error>> { - let signed_extension_types = self.metadata.extrinsic().signed_extensions(); - let num_signed_extensions = signed_extension_types.len(); - let bytes = self.bytes; - let mut index = 0; - let mut byte_start_idx = 0; - let metadata = &self.metadata; - - std::iter::from_fn(move || { - if index == num_signed_extensions { - return None; - } - - let extension = &signed_extension_types[index]; - let ty_id = extension.extra_ty(); - let cursor = &mut &bytes[byte_start_idx..]; - if let Err(err) = scale_decode::visitor::decode_with_visitor( - cursor, - &ty_id, - metadata.types(), - scale_decode::visitor::IgnoreVisitor::new(), - ) - .map_err(|e| Error::Decode(e.into())) - { - index = num_signed_extensions; // (such that None is returned in next iteration) - return Some(Err(err)); - } - let byte_end_idx = bytes.len() - cursor.len(); - let bytes = &bytes[byte_start_idx..byte_end_idx]; - byte_start_idx = byte_end_idx; - index += 1; - Some(Ok(ExtrinsicSignedExtension { - bytes, - ty_id, - identifier: extension.identifier(), - metadata, - _marker: std::marker::PhantomData, - })) - }) - } - - /// Searches through all signed extensions to find a specific one. - /// If the Signed Extension is not found `Ok(None)` is returned. - /// If the Signed Extension is found but decoding failed `Err(_)` is returned. - pub fn find>(&self) -> Result, Error> { - for ext in self.iter() { - // If we encounter an error while iterating, we won't get any more results - // back, so just return that error as we won't find the signed ext anyway. - let ext = ext?; - match ext.as_signed_extension::() { - // We found a match; return it: - Ok(Some(e)) => return Ok(Some(e)), - // No error, but no match either; next! - Ok(None) => continue, - // Error? return it - Err(e) => return Err(e), - } - } - Ok(None) - } - - /// The tip of an extrinsic, extracted from the ChargeTransactionPayment or ChargeAssetTxPayment - /// signed extension, depending on which is present. - /// - /// Returns `None` if `tip` was not found or decoding failed. - pub fn tip(&self) -> Option { - // Note: the overhead of iterating multiple time should be negligible. - self.find::() - .ok() - .flatten() - .map(|e| e.tip()) - .or_else(|| { - self.find::>() - .ok() - .flatten() - .map(|e| e.tip()) - }) - } - - /// The nonce of the account that submitted the extrinsic, extracted from the CheckNonce signed extension. - /// - /// Returns `None` if `nonce` was not found or decoding failed. - pub fn nonce(&self) -> Option { - self.find::().ok()? - } -} - -/// A single signed extension -#[derive(Debug, Clone)] -pub struct ExtrinsicSignedExtension<'a, T: Config> { - bytes: &'a [u8], - ty_id: u32, - identifier: &'a str, - metadata: &'a Metadata, - _marker: std::marker::PhantomData, -} - -impl<'a, T: Config> ExtrinsicSignedExtension<'a, T> { - /// The bytes representing this signed extension. - pub fn bytes(&self) -> &'a [u8] { - self.bytes - } - - /// The name of the signed extension. - pub fn name(&self) -> &'a str { - self.identifier - } - - /// The type id of the signed extension. - pub fn type_id(&self) -> u32 { - self.ty_id - } - - /// Signed Extension as a [`scale_value::Value`] - pub fn value(&self) -> Result, Error> { - let value = scale_value::scale::decode_as_type( - &mut &self.bytes[..], - &self.ty_id, - self.metadata.types(), - )?; - Ok(value) - } - - /// Decodes the bytes of this Signed Extension into its associated `Decoded` type. - /// Returns `Ok(None)` if the data we have doesn't match the Signed Extension we're asking to - /// decode with. - pub fn as_signed_extension>(&self) -> Result, Error> { - if !S::matches(self.identifier, self.ty_id, self.metadata.types()) { - return Ok(None); - } - self.as_type::().map(Some) - } - - fn as_type(&self) -> Result { - let value = E::decode_as_type(&mut &self.bytes[..], &self.ty_id, self.metadata.types())?; - Ok(value) - } -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::{OfflineClient, PolkadotConfig}; - use assert_matches::assert_matches; - use codec::{Decode, Encode}; - use frame_metadata::v15::{CustomMetadata, OuterEnums}; - use frame_metadata::{ - v15::{ExtrinsicMetadata, PalletCallMetadata, PalletMetadata, RuntimeMetadataV15}, - RuntimeMetadataPrefixed, - }; - use primitive_types::H256; - use scale_info::{meta_type, TypeInfo}; - use scale_value::Value; - use subxt_core::client::RuntimeVersion; - - // Extrinsic needs to contain at least the generic type parameter "Call" - // for the metadata to be valid. - // The "Call" type from the metadata is used to decode extrinsics. - #[allow(unused)] - #[derive(TypeInfo)] - struct ExtrinsicType { - pub signature: Option<(Address, Signature, Extra)>, - pub function: Call, - } - - // Because this type is used to decode extrinsics, we expect this to be a TypeDefVariant. - // Each pallet must contain one single variant. - #[allow(unused)] - #[derive( - Encode, - Decode, - TypeInfo, - Clone, - Debug, - PartialEq, - Eq, - scale_encode::EncodeAsType, - scale_decode::DecodeAsType, - )] - enum RuntimeCall { - Test(Pallet), - } - - // The calls of the pallet. - #[allow(unused)] - #[derive( - Encode, - Decode, - TypeInfo, - Clone, - Debug, - PartialEq, - Eq, - scale_encode::EncodeAsType, - scale_decode::DecodeAsType, - )] - enum Pallet { - #[allow(unused)] - #[codec(index = 2)] - TestCall { - value: u128, - signed: bool, - name: String, - }, - } - - #[allow(unused)] - #[derive( - Encode, - Decode, - TypeInfo, - Clone, - Debug, - PartialEq, - Eq, - scale_encode::EncodeAsType, - scale_decode::DecodeAsType, - )] - struct TestCallExtrinsic { - value: u128, - signed: bool, - name: String, - } - - impl StaticExtrinsic for TestCallExtrinsic { - const PALLET: &'static str = "Test"; - const CALL: &'static str = "TestCall"; - } - - /// Build fake metadata consisting the types needed to represent an extrinsic. - fn metadata() -> Metadata { - let pallets = vec![PalletMetadata { - name: "Test", - storage: None, - calls: Some(PalletCallMetadata { - ty: meta_type::(), - }), - event: None, - constants: vec![], - error: None, - index: 0, - docs: vec![], - }]; - - let extrinsic = ExtrinsicMetadata { - version: 4, - signed_extensions: vec![], - address_ty: meta_type::<()>(), - call_ty: meta_type::(), - signature_ty: meta_type::<()>(), - extra_ty: meta_type::<()>(), - }; - - let meta = RuntimeMetadataV15::new( - pallets, - extrinsic, - meta_type::<()>(), - vec![], - OuterEnums { - call_enum_ty: meta_type::(), - event_enum_ty: meta_type::<()>(), - error_enum_ty: meta_type::<()>(), - }, - CustomMetadata { - map: Default::default(), - }, - ); - let runtime_metadata: RuntimeMetadataPrefixed = meta.into(); - - Metadata::new(runtime_metadata.try_into().unwrap()) - } - - /// Build an offline client to work with the test metadata. - fn client(metadata: Metadata) -> OfflineClient { - // Create the encoded extrinsic bytes. - let rt_version = RuntimeVersion::new(1, 4); - let block_hash = H256::random(); - OfflineClient::new(block_hash, rt_version, metadata) - } - - #[test] - fn extrinsic_metadata_consistency() { - let metadata = metadata(); - - // Except our metadata to contain the registered types. - let pallet = metadata.pallet_by_index(0).expect("pallet exists"); - let extrinsic = pallet - .call_variant_by_index(2) - .expect("metadata contains the RuntimeCall enum with this pallet"); - - assert_eq!(pallet.name(), "Test"); - assert_eq!(&extrinsic.name, "TestCall"); - } - - #[test] - fn insufficient_extrinsic_bytes() { - let metadata = metadata(); - let client = client(metadata.clone()); - let ids = ExtrinsicPartTypeIds::new(&metadata).unwrap(); - - // Decode with empty bytes. - let result = - ExtrinsicDetails::decode_from(1, &[], client, H256::random(), Default::default(), ids); - assert_matches!(result.err(), Some(crate::Error::Codec(_))); - } - - #[test] - fn unsupported_version_extrinsic() { - let metadata = metadata(); - let client = client(metadata.clone()); - let ids = ExtrinsicPartTypeIds::new(&metadata).unwrap(); - - // Decode with invalid version. - let result = ExtrinsicDetails::decode_from( - 1, - &vec![3u8].encode(), - client, - H256::random(), - Default::default(), - ids, - ); - - assert_matches!( - result.err(), - Some(crate::Error::Block( - crate::error::BlockError::UnsupportedVersion(3) - )) - ); - } - - #[test] - fn statically_decode_extrinsic() { - let metadata = metadata(); - let client = client(metadata.clone()); - let ids = ExtrinsicPartTypeIds::new(&metadata).unwrap(); - - let tx = crate::tx::dynamic( - "Test", - "TestCall", - vec![ - Value::u128(10), - Value::bool(true), - Value::string("SomeValue"), - ], - ); - let tx_encoded = client - .tx() - .create_unsigned(&tx) - .expect("Valid dynamic parameters are provided"); - - // Note: `create_unsigned` produces the extrinsic bytes by prefixing the extrinsic length. - // The length is handled deserializing `ChainBlockExtrinsic`, therefore the first byte is not needed. - let extrinsic = ExtrinsicDetails::decode_from( - 1, - tx_encoded.encoded(), - client, - H256::random(), - Default::default(), - ids, - ) - .expect("Valid extrinsic"); - - assert!(!extrinsic.is_signed()); - - assert_eq!(extrinsic.index(), 1); - - assert_eq!(extrinsic.pallet_index(), 0); - assert_eq!( - extrinsic - .pallet_name() - .expect("Valid metadata contains pallet name"), - "Test" - ); - - assert_eq!(extrinsic.variant_index(), 2); - assert_eq!( - extrinsic - .variant_name() - .expect("Valid metadata contains variant name"), - "TestCall" - ); - - // Decode the extrinsic to the root enum. - let decoded_extrinsic = extrinsic - .as_root_extrinsic::() - .expect("can decode extrinsic to root enum"); - - assert_eq!( - decoded_extrinsic, - RuntimeCall::Test(Pallet::TestCall { - value: 10, - signed: true, - name: "SomeValue".into(), - }) - ); - - // Decode the extrinsic to the extrinsic variant. - let decoded_extrinsic = extrinsic - .as_extrinsic::() - .expect("can decode extrinsic to extrinsic variant") - .expect("value cannot be None"); - - assert_eq!( - decoded_extrinsic, - TestCallExtrinsic { - value: 10, - signed: true, - name: "SomeValue".into(), - } - ); - } -} diff --git a/subxt/src/blocks/mod.rs b/subxt/src/blocks/mod.rs index 7cf2501b9d..5a868872ac 100644 --- a/subxt/src/blocks/mod.rs +++ b/subxt/src/blocks/mod.rs @@ -15,7 +15,7 @@ pub use block_types::Block; pub use blocks_client::BlocksClient; pub use extrinsic_types::{ ExtrinsicDetails, ExtrinsicEvents, ExtrinsicSignedExtension, ExtrinsicSignedExtensions, - Extrinsics, StaticExtrinsic, + Extrinsics, FoundExtrinsic, StaticExtrinsic, }; // We get account nonce info in tx_client, too, so re-use the logic: diff --git a/subxt/src/book/usage/runtime_apis.rs b/subxt/src/book/usage/runtime_apis.rs index 30f8cab9df..b2a4f1d9e1 100644 --- a/subxt/src/book/usage/runtime_apis.rs +++ b/subxt/src/book/usage/runtime_apis.rs @@ -40,7 +40,7 @@ //! ); //! ``` //! -//! All valid runtime calls implement [`crate::runtime_api::RuntimeApiPayload`], a trait which +//! All valid runtime calls implement [`crate::runtime_api::PayloadT`], a trait which //! describes how to encode the runtime call arguments and what return type to decode from the //! response. //! diff --git a/subxt/src/book/usage/storage.rs b/subxt/src/book/usage/storage.rs index f1c9ede5ef..5ee17e65d7 100644 --- a/subxt/src/book/usage/storage.rs +++ b/subxt/src/book/usage/storage.rs @@ -66,7 +66,7 @@ //! - `runtime::storage().foo().bar_iter3(u8, bool, u16)`: iterate over all of the entries in the "bar" map under //! a given `u8`, `bool` and `u16` value. //! -//! All valid storage queries implement [`crate::storage::StorageAddress`]. As well as describing +//! All valid storage queries implement [`crate::storage::AddressT`]. As well as describing //! how to build a valid storage query, this trait also has some associated types that determine the //! shape of the result you'll get back, and determine what you can do with it (ie, can you iterate //! over storage entries using it). @@ -124,7 +124,7 @@ //! //! For more advanced use cases, have a look at [`crate::storage::Storage::fetch_raw`] and //! [`crate::storage::Storage::fetch_raw_keys`]. Both of these take raw bytes as arguments, which can be -//! obtained from a [`crate::storage::StorageAddress`] by using +//! obtained from a [`crate::storage::AddressT`] by using //! [`crate::storage::StorageClient::address_bytes()`] or //! [`crate::storage::StorageClient::address_root_bytes()`]. //! diff --git a/subxt/src/book/usage/transactions.rs b/subxt/src/book/usage/transactions.rs index e900846af2..9502846153 100644 --- a/subxt/src/book/usage/transactions.rs +++ b/subxt/src/book/usage/transactions.rs @@ -53,7 +53,7 @@ //! represents any type of data that can be SCALE encoded or decoded. It can be serialized, //! deserialized and parsed from/to strings. //! -//! A valid transaction payload is just something that implements the [`crate::tx::TxPayload`] trait; +//! A valid transaction payload is just something that implements the [`crate::tx::PayloadT`] trait; //! you can implement this trait on your own custom types if the built-in ones are not suitable for //! your needs. //! diff --git a/subxt/src/client/offline_client.rs b/subxt/src/client/offline_client.rs index 1960b36bd7..ccbe3ee093 100644 --- a/subxt/src/client/offline_client.rs +++ b/subxt/src/client/offline_client.rs @@ -17,13 +17,20 @@ use subxt_core::client::{ClientState, RuntimeVersion}; pub trait OfflineClientT: Clone + Send + Sync + 'static { /// Return the provided [`Metadata`]. fn metadata(&self) -> Metadata; + /// Return the provided genesis hash. fn genesis_hash(&self) -> T::Hash; + /// Return the provided [`RuntimeVersion`]. fn runtime_version(&self) -> RuntimeVersion; + /// Return the [subxt_core::client::ClientState] (metadata, runtime version and genesis hash). fn client_state(&self) -> ClientState { - ClientState::new(self.genesis_hash(), self.runtime_version(), self.metadata()) + ClientState { + genesis_hash: self.genesis_hash(), + runtime_version: self.runtime_version(), + metadata: self.metadata(), + } } /// Work with transactions. @@ -77,37 +84,30 @@ impl OfflineClient { runtime_version: RuntimeVersion, metadata: impl Into, ) -> OfflineClient { + let metadata = metadata.into(); + OfflineClient { - inner: Arc::new(ClientState::new( + inner: Arc::new(ClientState { genesis_hash, runtime_version, - metadata.into(), - )), + metadata, + }), } } /// Return the genesis hash. pub fn genesis_hash(&self) -> T::Hash { - self.inner.genesis_hash() + self.inner.genesis_hash } /// Return the runtime version. pub fn runtime_version(&self) -> RuntimeVersion { - self.inner.runtime_version() + self.inner.runtime_version } /// Return the [`Metadata`] used in this client. pub fn metadata(&self) -> Metadata { - self.inner.metadata() - } - - /// Return the [subxt_core::client::ClientState] (metadata, runtime version and genesis hash). - pub fn client_state(&self) -> ClientState { - ClientState::new( - self.inner.genesis_hash(), - self.inner.runtime_version(), - self.inner.metadata(), - ) + self.inner.metadata.clone() } // Just a copy of the most important trait methods so that people @@ -149,9 +149,6 @@ impl OfflineClientT for OfflineClient { fn metadata(&self) -> Metadata { self.metadata() } - fn client_state(&self) -> ClientState { - self.client_state() - } } // For ergonomics; cloning a client is deliberately fairly cheap (via Arc), diff --git a/subxt/src/client/online_client.rs b/subxt/src/client/online_client.rs index 5ac11826b2..eaf03fd671 100644 --- a/subxt/src/client/online_client.rs +++ b/subxt/src/client/online_client.rs @@ -228,7 +228,7 @@ impl OnlineClient { /// let mut update_stream = updater.runtime_updates().await.unwrap(); /// /// while let Some(Ok(update)) = update_stream.next().await { - /// let version = update.runtime_version().spec_version(); + /// let version = update.runtime_version().spec_version; /// /// match updater.apply_update(update) { /// Ok(()) => { @@ -286,16 +286,6 @@ impl OnlineClient { inner.runtime_version } - /// Return the [subxt_core::client::ClientState] (metadata, runtime version and genesis hash). - pub fn client_state(&self) -> ClientState { - let inner = self.inner.read().expect("shouldn't be poisoned"); - ClientState::new( - inner.genesis_hash, - inner.runtime_version, - inner.metadata.clone(), - ) - } - /// Change the [`RuntimeVersion`] used in this client. /// /// # Warning @@ -371,9 +361,14 @@ impl OfflineClientT for OnlineClient { fn runtime_version(&self) -> RuntimeVersion { self.runtime_version() } - + // This is provided by default, but we can optimise here and only lock once: fn client_state(&self) -> ClientState { - self.client_state() + let inner = self.inner.read().expect("shouldn't be poisoned"); + ClientState { + genesis_hash: inner.genesis_hash, + runtime_version: inner.runtime_version, + metadata: inner.metadata.clone(), + } } } @@ -551,7 +546,7 @@ async fn wait_runtime_upgrade_in_finalized_block( // We are waiting for the chain to have the same spec version // as sent out via the runtime subscription. - if spec_version == runtime_version.spec_version() { + if spec_version == runtime_version.spec_version { break block_ref; } }; diff --git a/subxt/src/constants/constants_client.rs b/subxt/src/constants/constants_client.rs index 7bdda7c9db..4fcccea1f0 100644 --- a/subxt/src/constants/constants_client.rs +++ b/subxt/src/constants/constants_client.rs @@ -2,9 +2,9 @@ // This file is dual-licensed as Apache-2.0 or GPL-3.0. // see LICENSE for license details. -use super::ConstantAddress; use crate::{client::OfflineClientT, error::Error, Config}; use derive_where::derive_where; +use subxt_core::constants::address::AddressT; /// A client for accessing constants. #[derive_where(Clone; Client)] @@ -28,19 +28,16 @@ impl> ConstantsClient { /// if the address is valid (or if it's not possible to check since the address has no validation hash). /// Return an error if the address was not valid or something went wrong trying to validate it (ie /// the pallet or constant in question do not exist at all). - pub fn validate(&self, address: &Address) -> Result<(), Error> { + pub fn validate(&self, address: &Address) -> Result<(), Error> { let metadata = self.client.metadata(); - subxt_core::constants::validate_constant(&metadata, address).map_err(Error::from) + subxt_core::constants::validate(address, &metadata).map_err(Error::from) } /// Access the constant at the address given, returning the type defined by this address. /// This is probably used with addresses given from static codegen, although you can manually /// construct your own, too. - pub fn at( - &self, - address: &Address, - ) -> Result { + pub fn at(&self, address: &Address) -> Result { let metadata = self.client.metadata(); - subxt_core::constants::get_constant(&metadata, address).map_err(Error::from) + subxt_core::constants::get(address, &metadata).map_err(Error::from) } } diff --git a/subxt/src/constants/mod.rs b/subxt/src/constants/mod.rs index a5321e7cb9..f63eae999b 100644 --- a/subxt/src/constants/mod.rs +++ b/subxt/src/constants/mod.rs @@ -7,4 +7,4 @@ mod constants_client; pub use constants_client::ConstantsClient; -pub use subxt_core::constants::{dynamic, Address, ConstantAddress, DynamicAddress}; +pub use subxt_core::constants::address::{dynamic, Address, AddressT, DynamicAddress}; diff --git a/subxt/src/custom_values/custom_values_client.rs b/subxt/src/custom_values/custom_values_client.rs index 4b85a64e5f..1868189e6b 100644 --- a/subxt/src/custom_values/custom_values_client.rs +++ b/subxt/src/custom_values/custom_values_client.rs @@ -2,10 +2,7 @@ use crate::client::OfflineClientT; use crate::{Config, Error}; use derive_where::derive_where; -use subxt_core::custom_values::{ - get_custom_value, get_custom_value_bytes, validate_custom_value, CustomValueAddress, -}; -use subxt_core::utils::Yes; +use subxt_core::custom_values::address::{AddressT, Yes}; /// A client for accessing custom values stored in the metadata. #[derive_where(Clone; Client)] @@ -27,29 +24,26 @@ impl CustomValuesClient { impl> CustomValuesClient { /// Access a custom value by the address it is registered under. This can be just a [str] to get back a dynamic value, /// or a static address from the generated static interface to get a value of a static type returned. - pub fn at + ?Sized>( + pub fn at + ?Sized>( &self, address: &Address, ) -> Result { - get_custom_value(&self.client.metadata(), address).map_err(Into::into) + subxt_core::custom_values::get(address, &self.client.metadata()).map_err(Into::into) } /// Access the bytes of a custom value by the address it is registered under. - pub fn bytes_at( + pub fn bytes_at( &self, address: &Address, ) -> Result, Error> { - get_custom_value_bytes(&self.client.metadata(), address).map_err(Into::into) + subxt_core::custom_values::get_bytes(address, &self.client.metadata()).map_err(Into::into) } /// Run the validation logic against some custom value address you'd like to access. Returns `Ok(())` /// if the address is valid (or if it's not possible to check since the address has no validation hash). /// Returns an error if the address was not valid (wrong name, type or raw bytes) - pub fn validate( - &self, - address: &Address, - ) -> Result<(), Error> { - validate_custom_value(&self.client.metadata(), address).map_err(Into::into) + pub fn validate(&self, address: &Address) -> Result<(), Error> { + subxt_core::custom_values::validate(address, &self.client.metadata()).map_err(Into::into) } } @@ -113,14 +107,17 @@ mod tests { }; let metadata: subxt_metadata::Metadata = frame_metadata.try_into().unwrap(); - Metadata::new(metadata) + Metadata::from(metadata) } #[test] fn test_decoding() { let client = OfflineClient::::new( Default::default(), - RuntimeVersion::new(0, 0), + RuntimeVersion { + spec_version: 0, + transaction_version: 0, + }, mock_metadata(), ); let custom_value_client = CustomValuesClient::new(client); diff --git a/subxt/src/custom_values/mod.rs b/subxt/src/custom_values/mod.rs index cd9ace6a06..ae752f4310 100644 --- a/subxt/src/custom_values/mod.rs +++ b/subxt/src/custom_values/mod.rs @@ -7,4 +7,4 @@ mod custom_values_client; pub use custom_values_client::CustomValuesClient; -pub use subxt_core::custom_values::{CustomValueAddress, StaticAddress}; +pub use subxt_core::custom_values::address::{AddressT, StaticAddress, Yes}; diff --git a/subxt/src/error/mod.rs b/subxt/src/error/mod.rs index ecfb3c7207..0f942a1c40 100644 --- a/subxt/src/error/mod.rs +++ b/subxt/src/error/mod.rs @@ -6,6 +6,8 @@ mod dispatch_error; +use subxt_core::error::{BlockError as CoreBlockError, Error as CoreError}; + crate::macros::cfg_unstable_light_client! { pub use subxt_lightclient::LightClientError; } @@ -80,15 +82,16 @@ pub enum Error { Other(String), } -impl From for Error { - fn from(value: subxt_core::Error) -> Self { +impl From for Error { + fn from(value: CoreError) -> Self { match value { - subxt_core::Error::Codec(e) => Error::Codec(e), - subxt_core::Error::Metadata(e) => Error::Metadata(e), - subxt_core::Error::StorageAddress(e) => Error::StorageAddress(e), - subxt_core::Error::Decode(e) => Error::Decode(e), - subxt_core::Error::Encode(e) => Error::Encode(e), - subxt_core::Error::ExtrinsicParams(e) => Error::ExtrinsicParams(e), + CoreError::Codec(e) => Error::Codec(e), + CoreError::Metadata(e) => Error::Metadata(e), + CoreError::StorageAddress(e) => Error::StorageAddress(e), + CoreError::Decode(e) => Error::Decode(e), + CoreError::Encode(e) => Error::Encode(e), + CoreError::ExtrinsicParams(e) => Error::ExtrinsicParams(e), + CoreError::Block(e) => Error::Block(e.into()), } } } @@ -175,6 +178,16 @@ pub enum BlockError { DecodingError(codec::Error), } +impl From for BlockError { + fn from(value: CoreBlockError) -> Self { + match value { + CoreBlockError::MissingType => BlockError::MissingType, + CoreBlockError::UnsupportedVersion(n) => BlockError::UnsupportedVersion(n), + CoreBlockError::DecodingError(e) => BlockError::DecodingError(e), + } + } +} + impl BlockError { /// Produce an error that a block with the given hash cannot be found. pub fn not_found(hash: impl AsRef<[u8]>) -> BlockError { diff --git a/subxt/src/events/events_client.rs b/subxt/src/events/events_client.rs index a23a8c07b7..5856484cef 100644 --- a/subxt/src/events/events_client.rs +++ b/subxt/src/events/events_client.rs @@ -64,7 +64,7 @@ where }; let event_bytes = get_event_bytes(client.backend(), block_ref.hash()).await?; - Ok(Events::decode_from(client.metadata(), event_bytes)) + Ok(Events::decode_from(event_bytes, client.metadata())) } } } diff --git a/subxt/src/events/mod.rs b/subxt/src/events/mod.rs index 4fbeaef06e..041c658964 100644 --- a/subxt/src/events/mod.rs +++ b/subxt/src/events/mod.rs @@ -24,5 +24,5 @@ where C: OnlineClientT, { let event_bytes = events_client::get_event_bytes(client.backend(), block_hash).await?; - Ok(Events::::decode_from(metadata, event_bytes)) + Ok(Events::::decode_from(event_bytes, metadata)) } diff --git a/subxt/src/lib.rs b/subxt/src/lib.rs index 250f470e8e..9967e479d7 100644 --- a/subxt/src/lib.rs +++ b/subxt/src/lib.rs @@ -71,7 +71,7 @@ pub mod config { /// Types representing the metadata obtained from a node. pub mod metadata { - pub use subxt_core::metadata::{DecodeWithMetadata, EncodeWithMetadata, Metadata, MetadataExt}; + pub use subxt_core::metadata::{DecodeWithMetadata, EncodeWithMetadata, Metadata}; // Expose metadata types under a sub module in case somebody needs to reference them: pub use subxt_metadata as types; } diff --git a/subxt/src/runtime_api/mod.rs b/subxt/src/runtime_api/mod.rs index 9eecb12978..f443d6b326 100644 --- a/subxt/src/runtime_api/mod.rs +++ b/subxt/src/runtime_api/mod.rs @@ -9,4 +9,4 @@ mod runtime_types; pub use runtime_client::RuntimeApiClient; pub use runtime_types::RuntimeApi; -pub use subxt_core::runtime_api::{dynamic, DynamicRuntimeApiPayload, Payload, RuntimeApiPayload}; +pub use subxt_core::runtime_api::payload::{dynamic, DynamicPayload, Payload, PayloadT}; diff --git a/subxt/src/runtime_api/runtime_types.rs b/subxt/src/runtime_api/runtime_types.rs index 6f0eb9e526..8b989af888 100644 --- a/subxt/src/runtime_api/runtime_types.rs +++ b/subxt/src/runtime_api/runtime_types.rs @@ -2,19 +2,17 @@ // This file is dual-licensed as Apache-2.0 or GPL-3.0. // see LICENSE for license details. +use super::PayloadT; use crate::{ backend::{BackendExt, BlockRef}, client::OnlineClientT, - error::{Error, MetadataError}, - metadata::DecodeWithMetadata, + error::Error, Config, }; use codec::Decode; use derive_where::derive_where; use std::{future::Future, marker::PhantomData}; -use super::RuntimeApiPayload; - /// Execute runtime API calls. #[derive_where(Clone; Client)] pub struct RuntimeApi { @@ -39,6 +37,14 @@ where T: Config, Client: OnlineClientT, { + /// Run the validation logic against some runtime API payload you'd like to use. Returns `Ok(())` + /// if the payload is valid (or if it's not possible to check since the payload has no validation hash). + /// Return an error if the payload was not valid or something went wrong trying to validate it (ie + /// the runtime API in question do not exist at all) + pub fn validate(&self, payload: &Call) -> Result<(), Error> { + subxt_core::runtime_api::validate(payload, &self.client.metadata()).map_err(Into::into) + } + /// Execute a raw runtime API call. pub fn call_raw<'a, Res: Decode>( &self, @@ -59,7 +65,7 @@ where } /// Execute a runtime API call. - pub fn call( + pub fn call( &self, payload: Call, ) -> impl Future> { @@ -70,39 +76,21 @@ where async move { let metadata = client.metadata(); - let api_trait = metadata.runtime_api_trait_by_name_err(payload.trait_name())?; - let api_method = api_trait - .method_by_name(payload.method_name()) - .ok_or_else(|| { - MetadataError::RuntimeMethodNotFound(payload.method_name().to_owned()) - })?; - // Validate the runtime API payload hash against the compile hash from codegen. - if let Some(static_hash) = payload.validation_hash() { - let Some(runtime_hash) = api_trait.method_hash(payload.method_name()) else { - return Err(MetadataError::IncompatibleCodegen.into()); - }; - if static_hash != runtime_hash { - return Err(MetadataError::IncompatibleCodegen.into()); - } - } + subxt_core::runtime_api::validate(&payload, &metadata)?; // Encode the arguments of the runtime call. - // For static payloads (codegen) this is pass-through, bytes are not altered. - // For dynamic payloads this relies on `scale_value::encode_as_fields_to`. - let params = payload.encode_args(&metadata)?; - let call_name = format!("{}_{}", payload.trait_name(), payload.method_name()); + let call_name = subxt_core::runtime_api::call_name(&payload); + let call_args = subxt_core::runtime_api::call_args(&payload, &metadata)?; + // Make the call. let bytes = client .backend() - .call(&call_name, Some(params.as_slice()), block_hash) + .call(&call_name, Some(call_args.as_slice()), block_hash) .await?; - let value = ::decode_with_metadata( - &mut &bytes[..], - api_method.output_ty(), - &metadata, - )?; + // Decode the response. + let value = subxt_core::runtime_api::decode_value(&mut &*bytes, &payload, &metadata)?; Ok(value) } } diff --git a/subxt/src/storage/mod.rs b/subxt/src/storage/mod.rs index a9837330f6..e37a9be543 100644 --- a/subxt/src/storage/mod.rs +++ b/subxt/src/storage/mod.rs @@ -8,19 +8,7 @@ mod storage_client; mod storage_type; pub use storage_client::StorageClient; - pub use storage_type::{Storage, StorageKeyValuePair}; - -/// Types representing an address which describes where a storage -/// entry lives and how to properly decode it. -pub mod address { - pub use subxt_core::storage::address::{ - dynamic, Address, DynamicAddress, StaticStorageKey, StorageAddress, StorageKey, - }; -} - -pub use subxt_core::storage::StorageKey; - -// For consistency with other modules, also expose -// the basic address stuff at the root of the module. -pub use address::{dynamic, Address, DynamicAddress, StorageAddress}; +pub use subxt_core::storage::address::{ + dynamic, Address, AddressT, DynamicAddress, StaticStorageKey, StorageKey, +}; diff --git a/subxt/src/storage/storage_client.rs b/subxt/src/storage/storage_client.rs index 942967ee95..106b63d6de 100644 --- a/subxt/src/storage/storage_client.rs +++ b/subxt/src/storage/storage_client.rs @@ -2,10 +2,7 @@ // This file is dual-licensed as Apache-2.0 or GPL-3.0. // see LICENSE for license details. -use super::{ - storage_type::{validate_storage_address, Storage}, - StorageAddress, -}; +use super::storage_type::Storage; use crate::{ backend::BlockRef, client::{OfflineClientT, OnlineClientT}, @@ -14,6 +11,7 @@ use crate::{ }; use derive_where::derive_where; use std::{future::Future, marker::PhantomData}; +use subxt_core::storage::address::AddressT; /// Query the runtime storage. #[derive_where(Clone; Client)] @@ -41,29 +39,23 @@ where /// if the address is valid (or if it's not possible to check since the address has no validation hash). /// Return an error if the address was not valid or something went wrong trying to validate it (ie /// the pallet or storage entry in question do not exist at all). - pub fn validate(&self, address: &Address) -> Result<(), Error> { - let metadata = self.client.metadata(); - let pallet_metadata = metadata.pallet_by_name_err(address.pallet_name())?; - validate_storage_address(address, pallet_metadata) + pub fn validate(&self, address: &Address) -> Result<(), Error> { + subxt_core::storage::validate(address, &self.client.metadata()).map_err(Into::into) } /// Convert some storage address into the raw bytes that would be submitted to the node in order /// to retrieve the entries at the root of the associated address. - pub fn address_root_bytes(&self, address: &Address) -> Vec { - subxt_core::storage::utils::storage_address_root_bytes(address) + pub fn address_root_bytes(&self, address: &Address) -> Vec { + subxt_core::storage::get_address_root_bytes(address) } /// Convert some storage address into the raw bytes that would be submitted to the node in order - /// to retrieve an entry. This fails if [`StorageAddress::append_entry_bytes`] does; in the built-in + /// to retrieve an entry. This fails if [`AddressT::append_entry_bytes`] does; in the built-in /// implementation this would be if the pallet and storage entry being asked for is not available on the /// node you're communicating with, or if the metadata is missing some type information (which should not /// happen). - pub fn address_bytes( - &self, - address: &Address, - ) -> Result, Error> { - subxt_core::storage::utils::storage_address_bytes(address, &self.client.metadata()) - .map_err(Into::into) + pub fn address_bytes(&self, address: &Address) -> Result, Error> { + subxt_core::storage::get_address_bytes(address, &self.client.metadata()).map_err(Into::into) } } diff --git a/subxt/src/storage/storage_type.rs b/subxt/src/storage/storage_type.rs index e6b8100907..0eee3a1a82 100644 --- a/subxt/src/storage/storage_type.rs +++ b/subxt/src/storage/storage_type.rs @@ -2,23 +2,19 @@ // This file is dual-licensed as Apache-2.0 or GPL-3.0. // see LICENSE for license details. -use subxt_core::storage::address::{StorageAddress, StorageHashers, StorageKey}; -use subxt_core::utils::Yes; - use crate::{ backend::{BackendExt, BlockRef}, client::OnlineClientT, error::{Error, MetadataError, StorageAddressError}, - metadata::{DecodeWithMetadata, Metadata}, + metadata::DecodeWithMetadata, Config, }; use codec::Decode; use derive_where::derive_where; use futures::StreamExt; - use std::{future::Future, marker::PhantomData}; - -use subxt_metadata::{PalletMetadata, StorageEntryMetadata, StorageEntryType}; +use subxt_core::storage::address::{AddressT, StorageHashers, StorageKey}; +use subxt_core::utils::Yes; /// This is returned from a couple of storage functions. pub use crate::backend::StreamOfResults; @@ -119,26 +115,22 @@ where address: &'address Address, ) -> impl Future, Error>> + 'address where - Address: StorageAddress + 'address, + Address: AddressT + 'address, { let client = self.clone(); async move { let metadata = client.client.metadata(); - let (pallet, entry) = - lookup_entry_details(address.pallet_name(), address.entry_name(), &metadata)?; // Metadata validation checks whether the static address given // is likely to actually correspond to a real storage entry or not. // if not, it means static codegen doesn't line up with runtime // metadata. - validate_storage_address(address, pallet)?; + subxt_core::storage::validate(address, &metadata)?; // Look up the return type ID to enable DecodeWithMetadata: - let lookup_bytes = - subxt_core::storage::utils::storage_address_bytes(address, &metadata)?; + let lookup_bytes = subxt_core::storage::get_address_bytes(address, &metadata)?; if let Some(data) = client.fetch_raw(lookup_bytes).await? { - let val = - decode_storage_with_metadata::(&mut &*data, &metadata, entry)?; + let val = subxt_core::storage::decode_value(&mut &*data, address, &metadata)?; Ok(Some(val)) } else { Ok(None) @@ -152,24 +144,16 @@ where address: &'address Address, ) -> impl Future> + 'address where - Address: StorageAddress + 'address, + Address: AddressT + 'address, { let client = self.clone(); async move { - let pallet_name = address.pallet_name(); - let entry_name = address.entry_name(); // Metadata validation happens via .fetch(): if let Some(data) = client.fetch(address).await? { Ok(data) } else { let metadata = client.client.metadata(); - let (_pallet_metadata, storage_entry) = - lookup_entry_details(pallet_name, entry_name, &metadata)?; - - let return_ty_id = return_type_from_storage_entry_type(storage_entry.entry_type()); - let bytes = &mut storage_entry.default_bytes(); - - let val = Address::Target::decode_with_metadata(bytes, return_ty_id, &metadata)?; + let val = subxt_core::storage::default_value(address, &metadata)?; Ok(val) } } @@ -211,21 +195,24 @@ where address: Address, ) -> impl Future>, Error>> + 'static where - Address: StorageAddress + 'static, + Address: AddressT + 'static, Address::Keys: 'static + Sized, { let client = self.client.clone(); let block_ref = self.block_ref.clone(); async move { let metadata = client.metadata(); - let (pallet, entry) = - lookup_entry_details(address.pallet_name(), address.entry_name(), &metadata)?; + let (_pallet, entry) = subxt_core::storage::lookup_storage_entry_details( + address.pallet_name(), + address.entry_name(), + &metadata, + )?; // Metadata validation checks whether the static address given // is likely to actually correspond to a real storage entry or not. // if not, it means static codegen doesn't line up with runtime // metadata. - validate_storage_address(&address, pallet)?; + subxt_core::storage::validate(&address, &metadata)?; // Look up the return type for flexible decoding. Do this once here to avoid // potentially doing it every iteration if we used `decode_storage_with_metadata` @@ -236,8 +223,7 @@ where let hashers = StorageHashers::new(entry, metadata.types())?; // The address bytes of this entry: - let address_bytes = - subxt_core::storage::utils::storage_address_bytes(&address, &metadata)?; + let address_bytes = subxt_core::storage::get_address_bytes(&address, &metadata)?; let s = client .backend() .storage_fetch_descendant_values(address_bytes, block_ref.hash()) @@ -327,7 +313,7 @@ fn strip_storage_address_root_bytes(address_bytes: &mut &[u8]) -> Result<(), Sto /// A pair of keys and values together with all the bytes that make up the storage address. /// `keys` is `None` if non-concat hashers are used. In this case the keys could not be extracted back from the key_bytes. #[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd)] -pub struct StorageKeyValuePair { +pub struct StorageKeyValuePair { /// The bytes that make up the address of the storage entry. pub key_bytes: Vec, /// The keys that can be used to construct the address of this storage entry. @@ -335,65 +321,3 @@ pub struct StorageKeyValuePair { /// The value of the storage entry. pub value: T::Target, } - -/// Validate a storage address against the metadata. -pub(crate) fn validate_storage_address( - address: &Address, - pallet: PalletMetadata<'_>, -) -> Result<(), Error> { - if let Some(hash) = address.validation_hash() { - validate_storage(pallet, address.entry_name(), hash)?; - } - Ok(()) -} - -/// Return details about the given storage entry. -fn lookup_entry_details<'a>( - pallet_name: &str, - entry_name: &str, - metadata: &'a Metadata, -) -> Result<(PalletMetadata<'a>, &'a StorageEntryMetadata), Error> { - let pallet_metadata = metadata.pallet_by_name_err(pallet_name)?; - let storage_metadata = pallet_metadata - .storage() - .ok_or_else(|| MetadataError::StorageNotFoundInPallet(pallet_name.to_owned()))?; - let storage_entry = storage_metadata - .entry_by_name(entry_name) - .ok_or_else(|| MetadataError::StorageEntryNotFound(entry_name.to_owned()))?; - Ok((pallet_metadata, storage_entry)) -} - -/// Validate a storage entry against the metadata. -fn validate_storage( - pallet: PalletMetadata<'_>, - storage_name: &str, - hash: [u8; 32], -) -> Result<(), Error> { - let Some(expected_hash) = pallet.storage_hash(storage_name) else { - return Err(MetadataError::IncompatibleCodegen.into()); - }; - if expected_hash != hash { - return Err(MetadataError::IncompatibleCodegen.into()); - } - Ok(()) -} - -/// Fetch the return type out of a [`StorageEntryType`]. -fn return_type_from_storage_entry_type(entry: &StorageEntryType) -> u32 { - match entry { - StorageEntryType::Plain(ty) => *ty, - StorageEntryType::Map { value_ty, .. } => *value_ty, - } -} - -/// Given some bytes, a pallet and storage name, decode the response. -fn decode_storage_with_metadata( - bytes: &mut &[u8], - metadata: &Metadata, - storage_metadata: &StorageEntryMetadata, -) -> Result { - let ty = storage_metadata.entry_type(); - let return_ty = return_type_from_storage_entry_type(ty); - let val = T::decode_with_metadata(bytes, return_ty, metadata)?; - Ok(val) -} diff --git a/subxt/src/storage/utils.rs b/subxt/src/storage/utils.rs deleted file mode 100644 index 6024d9efc8..0000000000 --- a/subxt/src/storage/utils.rs +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright 2019-2023 Parity Technologies (UK) Ltd. -// This file is dual-licensed as Apache-2.0 or GPL-3.0. -// see LICENSE for license details. - -//! these utility methods complement the [`StorageAddress`] trait, but -//! aren't things that should ever be overridden, and so don't exist on -//! the trait itself. - -use subxt_metadata::StorageHasher; - -use super::StorageAddress; -use crate::{error::Error, metadata::Metadata}; - -/// Return the root of a given [`StorageAddress`]: hash the pallet name and entry name -/// and append those bytes to the output. -pub fn write_storage_address_root_bytes( - addr: &Address, - out: &mut Vec, -) { - out.extend(sp_crypto_hashing::twox_128(addr.pallet_name().as_bytes())); - out.extend(sp_crypto_hashing::twox_128(addr.entry_name().as_bytes())); -} - -/// Outputs the [`storage_address_root_bytes`] as well as any additional bytes that represent -/// a lookup in a storage map at that location. -pub fn storage_address_bytes( - addr: &Address, - metadata: &Metadata, -) -> Result, Error> { - let mut bytes = Vec::new(); - write_storage_address_root_bytes(addr, &mut bytes); - addr.append_entry_bytes(metadata, &mut bytes)?; - Ok(bytes) -} - -/// Outputs a vector containing the bytes written by [`write_storage_address_root_bytes`]. -pub fn storage_address_root_bytes(addr: &Address) -> Vec { - let mut bytes = Vec::new(); - write_storage_address_root_bytes(addr, &mut bytes); - bytes -} - -/// Take some SCALE encoded bytes and a [`StorageHasher`] and hash the bytes accordingly. -pub fn hash_bytes(input: &[u8], hasher: StorageHasher, bytes: &mut Vec) { - match hasher { - StorageHasher::Identity => bytes.extend(input), - StorageHasher::Blake2_128 => bytes.extend(sp_crypto_hashing::blake2_128(input)), - StorageHasher::Blake2_128Concat => { - bytes.extend(sp_crypto_hashing::blake2_128(input)); - bytes.extend(input); - } - StorageHasher::Blake2_256 => bytes.extend(sp_crypto_hashing::blake2_256(input)), - StorageHasher::Twox128 => bytes.extend(sp_crypto_hashing::twox_128(input)), - StorageHasher::Twox256 => bytes.extend(sp_crypto_hashing::twox_256(input)), - StorageHasher::Twox64Concat => { - bytes.extend(sp_crypto_hashing::twox_64(input)); - bytes.extend(input); - } - } -} diff --git a/subxt/src/tx/mod.rs b/subxt/src/tx/mod.rs index e0288fbef4..53eeda0d69 100644 --- a/subxt/src/tx/mod.rs +++ b/subxt/src/tx/mod.rs @@ -14,21 +14,16 @@ use crate::macros::cfg_substrate_compat; mod tx_client; mod tx_progress; -pub use subxt_core::tx as tx_payload; -pub use subxt_core::tx::signer; - // The PairSigner impl currently relies on Substrate bits and pieces, so make it an optional // feature if we want to avoid needing sp_core and sp_runtime. cfg_substrate_compat! { - pub use signer::PairSigner; + pub use subxt_core::tx::signer::PairSigner; } -pub use self::{ - signer::Signer, - tx_client::{ - PartialExtrinsic, SubmittableExtrinsic, TransactionInvalid, TransactionUnknown, TxClient, - ValidationResult, - }, - tx_payload::{dynamic, DynamicPayload, Payload, TxPayload}, - tx_progress::{TxInBlock, TxProgress, TxStatus}, +pub use subxt_core::tx::payload::{dynamic, DynamicPayload, Payload, PayloadT}; +pub use subxt_core::tx::signer::{self, Signer}; +pub use tx_client::{ + PartialExtrinsic, SubmittableExtrinsic, TransactionInvalid, TransactionUnknown, TxClient, + ValidationResult, }; +pub use tx_progress::{TxInBlock, TxProgress, TxStatus}; diff --git a/subxt/src/tx/tx_client.rs b/subxt/src/tx/tx_client.rs index 31969d58ea..65c2b43698 100644 --- a/subxt/src/tx/tx_client.rs +++ b/subxt/src/tx/tx_client.rs @@ -2,22 +2,16 @@ // This file is dual-licensed as Apache-2.0 or GPL-3.0. // see LICENSE for license details. -use std::borrow::Cow; - use crate::{ backend::{BackendExt, BlockRef, TransactionStatus}, client::{OfflineClientT, OnlineClientT}, - config::{ - Config, ExtrinsicParams, ExtrinsicParamsEncoder, Hasher, Header, RefineParams, - RefineParamsData, - }, - error::{BlockError, Error, MetadataError}, - tx::{Signer as SignerT, TxPayload, TxProgress}, - utils::{Encoded, PhantomDataSendSync}, + config::{Config, ExtrinsicParams, Header, RefineParams, RefineParamsData}, + error::{BlockError, Error}, + tx::{PayloadT, Signer as SignerT, TxProgress}, + utils::PhantomDataSendSync, }; use codec::{Compact, Decode, Encode}; use derive_where::derive_where; -use sp_crypto_hashing::blake2_256; /// A client for working with transactions. #[derive_where(Clone; Client)] @@ -43,65 +37,30 @@ impl> TxClient { /// the pallet or call in question do not exist at all). pub fn validate(&self, call: &Call) -> Result<(), Error> where - Call: TxPayload, + Call: PayloadT, { - if let Some(details) = call.validation_details() { - let expected_hash = self - .client - .metadata() - .pallet_by_name_err(details.pallet_name)? - .call_hash(details.call_name) - .ok_or_else(|| MetadataError::CallNameNotFound(details.call_name.to_owned()))?; - - if details.hash != expected_hash { - return Err(MetadataError::IncompatibleCodegen.into()); - } - } - Ok(()) + subxt_core::tx::validate(call, &self.client.metadata()).map_err(Into::into) } /// Return the SCALE encoded bytes representing the call data of the transaction. pub fn call_data(&self, call: &Call) -> Result, Error> where - Call: TxPayload, + Call: PayloadT, { - let metadata = self.client.metadata(); - let mut bytes = Vec::new(); - call.encode_call_data_to(&metadata, &mut bytes)?; - Ok(bytes) + subxt_core::tx::call_data(call, &self.client.metadata()).map_err(Into::into) } /// Creates an unsigned extrinsic without submitting it. pub fn create_unsigned(&self, call: &Call) -> Result, Error> where - Call: TxPayload, + Call: PayloadT, { - // 1. Validate this call against the current node metadata if the call comes - // with a hash allowing us to do so. - self.validate(call)?; - - // 2. Encode extrinsic - let extrinsic = { - let mut encoded_inner = Vec::new(); - // transaction protocol version (4) (is not signed, so no 1 bit at the front). - 4u8.encode_to(&mut encoded_inner); - // encode call data after this byte. - call.encode_call_data_to(&self.client.metadata(), &mut encoded_inner)?; - // now, prefix byte length: - let len = Compact( - u32::try_from(encoded_inner.len()).expect("extrinsic size expected to be <4GB"), - ); - let mut encoded = Vec::new(); - len.encode_to(&mut encoded); - encoded.extend(encoded_inner); - encoded - }; - - // Wrap in Encoded to ensure that any more "encode" calls leave it in the right state. - Ok(SubmittableExtrinsic::from_bytes( - self.client.clone(), - extrinsic, - )) + subxt_core::tx::create_unsigned(call, &self.client.metadata()) + .map(|tx| SubmittableExtrinsic { + client: self.client.clone(), + inner: tx, + }) + .map_err(Into::into) } /// Create a partial extrinsic. @@ -114,25 +73,14 @@ impl> TxClient { params: >::Params, ) -> Result, Error> where - Call: TxPayload, + Call: PayloadT, { - // 1. Validate this call against the current node metadata if the call comes - // with a hash allowing us to do so. - self.validate(call)?; - - // 2. SCALE encode call data to bytes (pallet u8, call u8, call params). - let call_data = self.call_data(call)?; - - // 3. Construct our custom additional/extra params. - let additional_and_extra_params = - >::new(&self.client.client_state(), params)?; - - // Return these details, ready to construct a signed extrinsic from. - Ok(PartialExtrinsic { - client: self.client.clone(), - call_data, - additional_and_extra_params, - }) + subxt_core::tx::create_partial_signed(call, &self.client.client_state(), params) + .map(|tx| PartialExtrinsic { + client: self.client.clone(), + inner: tx, + }) + .map_err(Into::into) } /// Creates a signed extrinsic without submitting it. @@ -146,19 +94,15 @@ impl> TxClient { params: >::Params, ) -> Result, Error> where - Call: TxPayload, + Call: PayloadT, Signer: SignerT, { - // 1. Validate this call against the current node metadata if the call comes - // with a hash allowing us to do so. - self.validate(call)?; - - // 2. Gather the "additional" and "extra" params along with the encoded call data, - // ready to be signed. - let partial_signed = self.create_partial_signed_offline(call, params)?; - - // 3. Sign and construct an extrinsic from these details. - Ok(partial_signed.sign(signer)) + subxt_core::tx::create_signed(call, &self.client.client_state(), signer, params) + .map(|tx| SubmittableExtrinsic { + client: self.client.clone(), + inner: tx, + }) + .map_err(Into::into) } } @@ -205,7 +149,7 @@ where mut params: >::Params, ) -> Result, Error> where - Call: TxPayload, + Call: PayloadT, { // Refine the params by adding account nonce and latest block information: self.refine_params(account_id, &mut params).await?; @@ -221,7 +165,7 @@ where params: >::Params, ) -> Result, Error> where - Call: TxPayload, + Call: PayloadT, Signer: SignerT, { // 1. Validate this call against the current node metadata if the call comes @@ -249,7 +193,7 @@ where signer: &Signer, ) -> Result, Error> where - Call: TxPayload, + Call: PayloadT, Signer: SignerT, >::Params: Default, { @@ -268,7 +212,7 @@ where params: >::Params, ) -> Result, Error> where - Call: TxPayload, + Call: PayloadT, Signer: SignerT, { self.create_signed(call, signer, params) @@ -293,7 +237,7 @@ where signer: &Signer, ) -> Result where - Call: TxPayload, + Call: PayloadT, Signer: SignerT, >::Params: Default, { @@ -315,7 +259,7 @@ where params: >::Params, ) -> Result where - Call: TxPayload, + Call: PayloadT, Signer: SignerT, { self.create_signed(call, signer, params) @@ -328,8 +272,7 @@ where /// This payload contains the information needed to produce an extrinsic. pub struct PartialExtrinsic { client: C, - call_data: Vec, - additional_and_extra_params: T::ExtrinsicParams, + inner: subxt_core::tx::PartialTransaction, } impl PartialExtrinsic @@ -337,34 +280,16 @@ where T: Config, C: OfflineClientT, { - // Obtain bytes representing the signer payload and run call some function - // with them. This can avoid an allocation in some cases when compared to - // [`PartialExtrinsic::signer_payload()`]. - fn with_signer_payload(&self, f: F) -> R - where - F: for<'a> FnOnce(Cow<'a, [u8]>) -> R, - { - let mut bytes = self.call_data.clone(); - self.additional_and_extra_params.encode_extra_to(&mut bytes); - self.additional_and_extra_params - .encode_additional_to(&mut bytes); - if bytes.len() > 256 { - f(Cow::Borrowed(blake2_256(&bytes).as_ref())) - } else { - f(Cow::Owned(bytes)) - } - } - /// Return the signer payload for this extrinsic. These are the bytes that must /// be signed in order to produce a valid signature for the extrinsic. pub fn signer_payload(&self) -> Vec { - self.with_signer_payload(|bytes| bytes.to_vec()) + self.inner.signer_payload() } /// Return the bytes representing the call data for this partially constructed /// extrinsic. pub fn call_data(&self) -> &[u8] { - &self.call_data + self.inner.call_data() } /// Convert this [`PartialExtrinsic`] into a [`SubmittableExtrinsic`], ready to submit. @@ -374,10 +299,10 @@ where where Signer: SignerT, { - // Given our signer, we can sign the payload representing this extrinsic. - let signature = self.with_signer_payload(|bytes| signer.sign(&bytes)); - // Now, use the signature and "from" address to build the extrinsic. - self.sign_with_address_and_signature(&signer.address(), &signature) + SubmittableExtrinsic { + client: self.client.clone(), + inner: self.inner.sign(signer), + } } /// Convert this [`PartialExtrinsic`] into a [`SubmittableExtrinsic`], ready to submit. @@ -389,40 +314,19 @@ where address: &T::Address, signature: &T::Signature, ) -> SubmittableExtrinsic { - // Encode the extrinsic (into the format expected by protocol version 4) - let extrinsic = { - let mut encoded_inner = Vec::new(); - // "is signed" + transaction protocol version (4) - (0b10000000 + 4u8).encode_to(&mut encoded_inner); - // from address for signature - address.encode_to(&mut encoded_inner); - // the signature - signature.encode_to(&mut encoded_inner); - // attach custom extra params - self.additional_and_extra_params - .encode_extra_to(&mut encoded_inner); - // and now, call data (remembering that it's been encoded already and just needs appending) - encoded_inner.extend(&self.call_data); - // now, prefix byte length: - let len = Compact( - u32::try_from(encoded_inner.len()).expect("extrinsic size expected to be <4GB"), - ); - let mut encoded = Vec::new(); - len.encode_to(&mut encoded); - encoded.extend(encoded_inner); - encoded - }; - - // Return an extrinsic ready to be submitted. - SubmittableExtrinsic::from_bytes(self.client.clone(), extrinsic) + SubmittableExtrinsic { + client: self.client.clone(), + inner: self + .inner + .sign_with_address_and_signature(address, signature), + } } } /// This represents an extrinsic that has been signed and is ready to submit. pub struct SubmittableExtrinsic { client: C, - encoded: Encoded, - marker: std::marker::PhantomData, + inner: subxt_core::tx::Transaction, } impl SubmittableExtrinsic @@ -440,25 +344,24 @@ where pub fn from_bytes(client: C, tx_bytes: Vec) -> Self { Self { client, - encoded: Encoded(tx_bytes), - marker: std::marker::PhantomData, + inner: subxt_core::tx::Transaction::from_bytes(tx_bytes), } } /// Calculate and return the hash of the extrinsic, based on the configured hasher. pub fn hash(&self) -> T::Hash { - T::Hasher::hash_of(&self.encoded) + self.inner.hash() } /// Returns the SCALE encoded extrinsic bytes. pub fn encoded(&self) -> &[u8] { - &self.encoded.0 + self.inner.encoded() } /// Consumes [`SubmittableExtrinsic`] and returns the SCALE encoded /// extrinsic bytes. pub fn into_encoded(self) -> Vec { - self.encoded.0 + self.inner.into_encoded() } } @@ -479,7 +382,7 @@ where let sub = self .client .backend() - .submit_transaction(&self.encoded.0) + .submit_transaction(self.encoded()) .await?; Ok(TxProgress::new(sub, self.client.clone(), ext_hash)) @@ -495,7 +398,7 @@ where let mut sub = self .client .backend() - .submit_transaction(&self.encoded.0) + .submit_transaction(self.encoded()) .await?; // If we get a bad status or error back straight away then error, else return the hash. @@ -543,7 +446,7 @@ where let block_hash = at.into().hash(); // Approach taken from https://github.com/paritytech/json-rpc-interface-spec/issues/55. - let mut params = Vec::with_capacity(8 + self.encoded.0.len() + 8); + let mut params = Vec::with_capacity(8 + self.encoded().len() + 8); 2u8.encode_to(&mut params); params.extend(self.encoded().iter()); block_hash.encode_to(&mut params); diff --git a/testing/integration-tests/src/full_client/client/unstable_rpcs.rs b/testing/integration-tests/src/full_client/client/unstable_rpcs.rs index 19f8e549a8..9da3c33cc8 100644 --- a/testing/integration-tests/src/full_client/client/unstable_rpcs.rs +++ b/testing/integration-tests/src/full_client/client/unstable_rpcs.rs @@ -52,8 +52,8 @@ async fn chainhead_unstable_follow() { FollowEvent::Initialized(init) => { assert_eq!(init.finalized_block_hashes, vec![finalized_block_hash]); if let Some(RuntimeEvent::Valid(RuntimeVersionEvent { spec })) = init.finalized_block_runtime { - assert_eq!(spec.spec_version, runtime_version.spec_version()); - assert_eq!(spec.transaction_version, runtime_version.transaction_version()); + assert_eq!(spec.spec_version, runtime_version.spec_version); + assert_eq!(spec.transaction_version, runtime_version.transaction_version); } else { panic!("runtime details not provided with init event, got {:?}", init.finalized_block_runtime); } @@ -69,7 +69,7 @@ async fn chainhead_unstable_body() { let mut blocks = rpc.chainhead_unstable_follow(false).await.unwrap(); let event = blocks.next().await.unwrap().unwrap(); let hash = match event { - FollowEvent::Initialized(init) => init.finalized_block_hashes.last().unwrap().clone(), + FollowEvent::Initialized(init) => *init.finalized_block_hashes.last().unwrap(), _ => panic!("Unexpected event"), }; let sub_id = blocks.subscription_id().unwrap(); @@ -98,7 +98,7 @@ async fn chainhead_unstable_header() { let mut blocks = rpc.chainhead_unstable_follow(false).await.unwrap(); let event = blocks.next().await.unwrap().unwrap(); let hash = match event { - FollowEvent::Initialized(init) => init.finalized_block_hashes.last().unwrap().clone(), + FollowEvent::Initialized(init) => *init.finalized_block_hashes.last().unwrap(), _ => panic!("Unexpected event"), }; let sub_id = blocks.subscription_id().unwrap(); @@ -126,7 +126,7 @@ async fn chainhead_unstable_storage() { let mut blocks = rpc.chainhead_unstable_follow(false).await.unwrap(); let event = blocks.next().await.unwrap().unwrap(); let hash = match event { - FollowEvent::Initialized(init) => init.finalized_block_hashes.last().unwrap().clone(), + FollowEvent::Initialized(init) => *init.finalized_block_hashes.last().unwrap(), _ => panic!("Unexpected event"), }; let sub_id = blocks.subscription_id().unwrap(); @@ -171,7 +171,7 @@ async fn chainhead_unstable_call() { let mut blocks = rpc.chainhead_unstable_follow(true).await.unwrap(); let event = blocks.next().await.unwrap().unwrap(); let hash = match event { - FollowEvent::Initialized(init) => init.finalized_block_hashes.last().unwrap().clone(), + FollowEvent::Initialized(init) => *init.finalized_block_hashes.last().unwrap(), _ => panic!("Unexpected event"), }; let sub_id = blocks.subscription_id().unwrap(); @@ -208,7 +208,7 @@ async fn chainhead_unstable_unpin() { let mut blocks = rpc.chainhead_unstable_follow(true).await.unwrap(); let event = blocks.next().await.unwrap().unwrap(); let hash = match event { - FollowEvent::Initialized(init) => init.finalized_block_hashes.last().unwrap().clone(), + FollowEvent::Initialized(init) => *init.finalized_block_hashes.last().unwrap(), _ => panic!("Unexpected event"), }; let sub_id = blocks.subscription_id().unwrap(); @@ -414,7 +414,7 @@ async fn transaction_unstable_stop() { .unwrap() .expect("Server is not overloaded by 1 tx; qed"); - let _ = rpc.transaction_unstable_stop(&operation_id).await.unwrap(); + rpc.transaction_unstable_stop(&operation_id).await.unwrap(); // Cannot stop it twice. let _err = rpc .transaction_unstable_stop(&operation_id) diff --git a/testing/integration-tests/src/full_client/codegen/polkadot.rs b/testing/integration-tests/src/full_client/codegen/polkadot.rs index e25d14d698..566a4382d2 100644 --- a/testing/integration-tests/src/full_client/codegen/polkadot.rs +++ b/testing/integration-tests/src/full_client/codegen/polkadot.rs @@ -180,11 +180,11 @@ pub mod api { #[doc = " Returns the version of the runtime."] pub fn version( &self, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::Version, types::version::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "Core", "version", types::Version {}, @@ -200,11 +200,11 @@ pub mod api { pub fn execute_block( &self, block: types::execute_block::Block, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::ExecuteBlock, types::execute_block::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "Core", "execute_block", types::ExecuteBlock { block }, @@ -219,11 +219,11 @@ pub mod api { pub fn initialize_block( &self, header: types::initialize_block::Header, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::InitializeBlock, types::initialize_block::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "Core", "initialize_block", types::InitializeBlock { header }, @@ -321,11 +321,11 @@ pub mod api { #[doc = " Returns the metadata of a runtime."] pub fn metadata( &self, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::Metadata, types::metadata::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "Metadata", "metadata", types::Metadata {}, @@ -343,11 +343,11 @@ pub mod api { pub fn metadata_at_version( &self, version: types::metadata_at_version::Version, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::MetadataAtVersion, types::metadata_at_version::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "Metadata", "metadata_at_version", types::MetadataAtVersion { version }, @@ -364,11 +364,11 @@ pub mod api { #[doc = " This can be used to call `metadata_at_version`."] pub fn metadata_versions( &self, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::MetadataVersions, types::metadata_versions::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "Metadata", "metadata_versions", types::MetadataVersions {}, @@ -469,11 +469,11 @@ pub mod api { pub fn apply_extrinsic( &self, extrinsic: types::apply_extrinsic::Extrinsic, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::ApplyExtrinsic, types::apply_extrinsic::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "BlockBuilder", "apply_extrinsic", types::ApplyExtrinsic { extrinsic }, @@ -487,11 +487,11 @@ pub mod api { #[doc = " Finish the current block."] pub fn finalize_block( &self, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::FinalizeBlock, types::finalize_block::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "BlockBuilder", "finalize_block", types::FinalizeBlock {}, @@ -506,11 +506,11 @@ pub mod api { pub fn inherent_extrinsics( &self, inherent: types::inherent_extrinsics::Inherent, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::InherentExtrinsics, types::inherent_extrinsics::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "BlockBuilder", "inherent_extrinsics", types::InherentExtrinsics { inherent }, @@ -527,11 +527,11 @@ pub mod api { &self, block: types::check_inherents::Block, data: types::check_inherents::Data, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::CheckInherents, types::check_inherents::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "BlockBuilder", "check_inherents", types::CheckInherents { block, data }, @@ -669,11 +669,11 @@ pub mod api { source: types::validate_transaction::Source, tx: types::validate_transaction::Tx, block_hash: types::validate_transaction::BlockHash, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::ValidateTransaction, types::validate_transaction::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "TaggedTransactionQueue", "validate_transaction", types::ValidateTransaction { @@ -733,11 +733,11 @@ pub mod api { pub fn offchain_worker( &self, header: types::offchain_worker::Header, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::OffchainWorker, types::offchain_worker::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "OffchainWorkerApi", "offchain_worker", types::OffchainWorker { header }, @@ -788,11 +788,11 @@ pub mod api { #[doc = " Get the current validators."] pub fn validators( &self, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::Validators, types::validators::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "ParachainHost", "validators", types::Validators {}, @@ -809,11 +809,11 @@ pub mod api { #[doc = " should be the successor of the number of the block."] pub fn validator_groups( &self, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::ValidatorGroups, types::validator_groups::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "ParachainHost", "validator_groups", types::ValidatorGroups {}, @@ -829,11 +829,11 @@ pub mod api { #[doc = " Cores are either free or occupied. Free cores can have paras assigned to them."] pub fn availability_cores( &self, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::AvailabilityCores, types::availability_cores::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "ParachainHost", "availability_cores", types::AvailabilityCores {}, @@ -853,11 +853,11 @@ pub mod api { &self, para_id: types::persisted_validation_data::ParaId, assumption: types::persisted_validation_data::Assumption, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::PersistedValidationData, types::persisted_validation_data::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "ParachainHost", "persisted_validation_data", types::PersistedValidationData { @@ -878,11 +878,11 @@ pub mod api { &self, para_id: types::assumed_validation_data::ParaId, expected_persisted_validation_data_hash : types :: assumed_validation_data :: ExpectedPersistedValidationDataHash, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::AssumedValidationData, types::assumed_validation_data::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "ParachainHost", "assumed_validation_data", types::AssumedValidationData { @@ -901,11 +901,11 @@ pub mod api { &self, para_id: types::check_validation_outputs::ParaId, outputs: types::check_validation_outputs::Outputs, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::CheckValidationOutputs, types::check_validation_outputs::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "ParachainHost", "check_validation_outputs", types::CheckValidationOutputs { para_id, outputs }, @@ -922,11 +922,11 @@ pub mod api { #[doc = " This can be used to instantiate a `SigningContext`."] pub fn session_index_for_child( &self, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::SessionIndexForChild, types::session_index_for_child::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "ParachainHost", "session_index_for_child", types::SessionIndexForChild {}, @@ -945,11 +945,11 @@ pub mod api { &self, para_id: types::validation_code::ParaId, assumption: types::validation_code::Assumption, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::ValidationCode, types::validation_code::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "ParachainHost", "validation_code", types::ValidationCode { @@ -969,11 +969,11 @@ pub mod api { pub fn candidate_pending_availability( &self, para_id: types::candidate_pending_availability::ParaId, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::CandidatePendingAvailability, types::candidate_pending_availability::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "ParachainHost", "candidate_pending_availability", types::CandidatePendingAvailability { para_id }, @@ -988,11 +988,11 @@ pub mod api { #[doc = " Get a vector of events concerning candidates that occurred within a block."] pub fn candidate_events( &self, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::CandidateEvents, types::candidate_events::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "ParachainHost", "candidate_events", types::CandidateEvents {}, @@ -1008,11 +1008,11 @@ pub mod api { pub fn dmq_contents( &self, recipient: types::dmq_contents::Recipient, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::DmqContents, types::dmq_contents::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "ParachainHost", "dmq_contents", types::DmqContents { recipient }, @@ -1028,11 +1028,11 @@ pub mod api { pub fn inbound_hrmp_channels_contents( &self, recipient: types::inbound_hrmp_channels_contents::Recipient, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::InboundHrmpChannelsContents, types::inbound_hrmp_channels_contents::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "ParachainHost", "inbound_hrmp_channels_contents", types::InboundHrmpChannelsContents { recipient }, @@ -1047,11 +1047,11 @@ pub mod api { pub fn validation_code_by_hash( &self, hash: types::validation_code_by_hash::Hash, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::ValidationCodeByHash, types::validation_code_by_hash::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "ParachainHost", "validation_code_by_hash", types::ValidationCodeByHash { hash }, @@ -1066,11 +1066,11 @@ pub mod api { #[doc = " Scrape dispute relevant from on-chain, backing votes and resolved disputes."] pub fn on_chain_votes( &self, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::OnChainVotes, types::on_chain_votes::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "ParachainHost", "on_chain_votes", types::OnChainVotes {}, @@ -1087,11 +1087,11 @@ pub mod api { pub fn session_info( &self, index: types::session_info::Index, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::SessionInfo, types::session_info::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "ParachainHost", "session_info", types::SessionInfo { index }, @@ -1110,11 +1110,11 @@ pub mod api { &self, stmt: types::submit_pvf_check_statement::Stmt, signature: types::submit_pvf_check_statement::Signature, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::SubmitPvfCheckStatement, types::submit_pvf_check_statement::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "ParachainHost", "submit_pvf_check_statement", types::SubmitPvfCheckStatement { stmt, signature }, @@ -1131,11 +1131,11 @@ pub mod api { #[doc = " NOTE: This function is only available since parachain host version 2."] pub fn pvfs_require_precheck( &self, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::PvfsRequirePrecheck, types::pvfs_require_precheck::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "ParachainHost", "pvfs_require_precheck", types::PvfsRequirePrecheck {}, @@ -1153,11 +1153,11 @@ pub mod api { &self, para_id: types::validation_code_hash::ParaId, assumption: types::validation_code_hash::Assumption, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::ValidationCodeHash, types::validation_code_hash::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "ParachainHost", "validation_code_hash", types::ValidationCodeHash { @@ -1175,11 +1175,11 @@ pub mod api { #[doc = " Returns all onchain disputes."] pub fn disputes( &self, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::Disputes, types::disputes::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "ParachainHost", "disputes", types::Disputes {}, @@ -1194,11 +1194,11 @@ pub mod api { pub fn session_executor_params( &self, session_index: types::session_executor_params::SessionIndex, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::SessionExecutorParams, types::session_executor_params::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "ParachainHost", "session_executor_params", types::SessionExecutorParams { session_index }, @@ -1213,11 +1213,11 @@ pub mod api { #[doc = " NOTE: This function is only available since parachain host version 5."] pub fn unapplied_slashes( &self, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::UnappliedSlashes, types::unapplied_slashes::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "ParachainHost", "unapplied_slashes", types::UnappliedSlashes {}, @@ -1233,11 +1233,11 @@ pub mod api { pub fn key_ownership_proof( &self, validator_id: types::key_ownership_proof::ValidatorId, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::KeyOwnershipProof, types::key_ownership_proof::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "ParachainHost", "key_ownership_proof", types::KeyOwnershipProof { validator_id }, @@ -1255,11 +1255,11 @@ pub mod api { &self, dispute_proof: types::submit_report_dispute_lost::DisputeProof, key_ownership_proof: types::submit_report_dispute_lost::KeyOwnershipProof, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::SubmitReportDisputeLost, types::submit_report_dispute_lost::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "ParachainHost", "submit_report_dispute_lost", types::SubmitReportDisputeLost { @@ -1277,11 +1277,11 @@ pub mod api { #[doc = " This is a staging method! Do not use on production runtimes!"] pub fn minimum_backing_votes( &self, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::MinimumBackingVotes, types::minimum_backing_votes::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "ParachainHost", "minimum_backing_votes", types::MinimumBackingVotes {}, @@ -1297,11 +1297,11 @@ pub mod api { pub fn para_backing_state( &self, _0: types::para_backing_state::Param0, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::ParaBackingState, types::para_backing_state::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "ParachainHost", "para_backing_state", types::ParaBackingState { _0 }, @@ -1315,11 +1315,11 @@ pub mod api { #[doc = " Returns candidate's acceptance limitations for asynchronous backing for a relay parent."] pub fn async_backing_params( &self, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::AsyncBackingParams, types::async_backing_params::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "ParachainHost", "async_backing_params", types::AsyncBackingParams {}, @@ -1334,11 +1334,11 @@ pub mod api { #[doc = " Returns a list of all disabled validators at the given block."] pub fn disabled_validators( &self, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::DisabledValidators, types::disabled_validators::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "ParachainHost", "disabled_validators", types::DisabledValidators {}, @@ -2095,11 +2095,11 @@ pub mod api { #[doc = " Return the block number where BEEFY consensus is enabled/started"] pub fn beefy_genesis( &self, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::BeefyGenesis, types::beefy_genesis::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "BeefyApi", "beefy_genesis", types::BeefyGenesis {}, @@ -2114,11 +2114,11 @@ pub mod api { #[doc = " Return the current active BEEFY validator set"] pub fn validator_set( &self, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::ValidatorSet, types::validator_set::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "BeefyApi", "validator_set", types::ValidatorSet {}, @@ -2141,11 +2141,11 @@ pub mod api { &self, equivocation_proof : types :: submit_report_equivocation_unsigned_extrinsic :: EquivocationProof, key_owner_proof : types :: submit_report_equivocation_unsigned_extrinsic :: KeyOwnerProof, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::SubmitReportEquivocationUnsignedExtrinsic, types::submit_report_equivocation_unsigned_extrinsic::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "BeefyApi", "submit_report_equivocation_unsigned_extrinsic", types::SubmitReportEquivocationUnsignedExtrinsic { @@ -2175,11 +2175,11 @@ pub mod api { &self, set_id: types::generate_key_ownership_proof::SetId, authority_id: types::generate_key_ownership_proof::AuthorityId, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::GenerateKeyOwnershipProof, types::generate_key_ownership_proof::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "BeefyApi", "generate_key_ownership_proof", types::GenerateKeyOwnershipProof { @@ -2319,11 +2319,11 @@ pub mod api { #[doc = " Return the on-chain MMR root hash."] pub fn mmr_root( &self, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::MmrRoot, types::mmr_root::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "MmrApi", "mmr_root", types::MmrRoot {}, @@ -2337,11 +2337,11 @@ pub mod api { #[doc = " Return the number of MMR blocks in the chain."] pub fn mmr_leaf_count( &self, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::MmrLeafCount, types::mmr_leaf_count::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "MmrApi", "mmr_leaf_count", types::MmrLeafCount {}, @@ -2359,11 +2359,11 @@ pub mod api { &self, block_numbers: types::generate_proof::BlockNumbers, best_known_block_number: types::generate_proof::BestKnownBlockNumber, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::GenerateProof, types::generate_proof::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "MmrApi", "generate_proof", types::GenerateProof { @@ -2387,11 +2387,11 @@ pub mod api { &self, leaves: types::verify_proof::Leaves, proof: types::verify_proof::Proof, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::VerifyProof, types::verify_proof::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "MmrApi", "verify_proof", types::VerifyProof { leaves, proof }, @@ -2415,11 +2415,11 @@ pub mod api { root: types::verify_proof_stateless::Root, leaves: types::verify_proof_stateless::Leaves, proof: types::verify_proof_stateless::Proof, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::VerifyProofStateless, types::verify_proof_stateless::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "MmrApi", "verify_proof_stateless", types::VerifyProofStateless { @@ -2615,11 +2615,11 @@ pub mod api { #[doc = " is finalized by the authorities from block B-1."] pub fn grandpa_authorities( &self, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::GrandpaAuthorities, types::grandpa_authorities::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "GrandpaApi", "grandpa_authorities", types::GrandpaAuthorities {}, @@ -2643,11 +2643,11 @@ pub mod api { &self, equivocation_proof : types :: submit_report_equivocation_unsigned_extrinsic :: EquivocationProof, key_owner_proof : types :: submit_report_equivocation_unsigned_extrinsic :: KeyOwnerProof, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::SubmitReportEquivocationUnsignedExtrinsic, types::submit_report_equivocation_unsigned_extrinsic::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "GrandpaApi", "submit_report_equivocation_unsigned_extrinsic", types::SubmitReportEquivocationUnsignedExtrinsic { @@ -2677,11 +2677,11 @@ pub mod api { &self, set_id: types::generate_key_ownership_proof::SetId, authority_id: types::generate_key_ownership_proof::AuthorityId, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::GenerateKeyOwnershipProof, types::generate_key_ownership_proof::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "GrandpaApi", "generate_key_ownership_proof", types::GenerateKeyOwnershipProof { @@ -2699,11 +2699,11 @@ pub mod api { #[doc = " Get current GRANDPA authority set id."] pub fn current_set_id( &self, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::CurrentSetId, types::current_set_id::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "GrandpaApi", "current_set_id", types::CurrentSetId {}, @@ -2839,11 +2839,11 @@ pub mod api { #[doc = " Return the configuration for BABE."] pub fn configuration( &self, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::Configuration, types::configuration::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "BabeApi", "configuration", types::Configuration {}, @@ -2857,11 +2857,11 @@ pub mod api { #[doc = " Returns the slot that started the current epoch."] pub fn current_epoch_start( &self, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::CurrentEpochStart, types::current_epoch_start::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "BabeApi", "current_epoch_start", types::CurrentEpochStart {}, @@ -2876,11 +2876,11 @@ pub mod api { #[doc = " Returns information regarding the current epoch."] pub fn current_epoch( &self, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::CurrentEpoch, types::current_epoch::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "BabeApi", "current_epoch", types::CurrentEpoch {}, @@ -2895,11 +2895,11 @@ pub mod api { #[doc = " previously announced)."] pub fn next_epoch( &self, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::NextEpoch, types::next_epoch::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "BabeApi", "next_epoch", types::NextEpoch {}, @@ -2926,11 +2926,11 @@ pub mod api { &self, slot: types::generate_key_ownership_proof::Slot, authority_id: types::generate_key_ownership_proof::AuthorityId, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::GenerateKeyOwnershipProof, types::generate_key_ownership_proof::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "BabeApi", "generate_key_ownership_proof", types::GenerateKeyOwnershipProof { slot, authority_id }, @@ -2954,11 +2954,11 @@ pub mod api { &self, equivocation_proof : types :: submit_report_equivocation_unsigned_extrinsic :: EquivocationProof, key_owner_proof : types :: submit_report_equivocation_unsigned_extrinsic :: KeyOwnerProof, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::SubmitReportEquivocationUnsignedExtrinsic, types::submit_report_equivocation_unsigned_extrinsic::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "BabeApi", "submit_report_equivocation_unsigned_extrinsic", types::SubmitReportEquivocationUnsignedExtrinsic { @@ -3142,11 +3142,11 @@ pub mod api { #[doc = " Retrieve authority identifiers of the current and next authority set."] pub fn authorities( &self, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::Authorities, types::authorities::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "AuthorityDiscoveryApi", "authorities", types::Authorities {}, @@ -3202,11 +3202,11 @@ pub mod api { pub fn generate_session_keys( &self, seed: types::generate_session_keys::Seed, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::GenerateSessionKeys, types::generate_session_keys::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "SessionKeys", "generate_session_keys", types::GenerateSessionKeys { seed }, @@ -3223,11 +3223,11 @@ pub mod api { pub fn decode_session_keys( &self, encoded: types::decode_session_keys::Encoded, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::DecodeSessionKeys, types::decode_session_keys::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "SessionKeys", "decode_session_keys", types::DecodeSessionKeys { encoded }, @@ -3313,11 +3313,11 @@ pub mod api { pub fn account_nonce( &self, account: types::account_nonce::Account, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::AccountNonce, types::account_nonce::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "AccountNonceApi", "account_nonce", types::AccountNonce { account }, @@ -3368,11 +3368,11 @@ pub mod api { &self, uxt: types::query_info::Uxt, len: types::query_info::Len, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::QueryInfo, types::query_info::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "TransactionPaymentApi", "query_info", types::QueryInfo { uxt, len }, @@ -3387,11 +3387,11 @@ pub mod api { &self, uxt: types::query_fee_details::Uxt, len: types::query_fee_details::Len, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::QueryFeeDetails, types::query_fee_details::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "TransactionPaymentApi", "query_fee_details", types::QueryFeeDetails { uxt, len }, @@ -3406,11 +3406,11 @@ pub mod api { pub fn query_weight_to_fee( &self, weight: types::query_weight_to_fee::Weight, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::QueryWeightToFee, types::query_weight_to_fee::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "TransactionPaymentApi", "query_weight_to_fee", types::QueryWeightToFee { weight }, @@ -3425,11 +3425,11 @@ pub mod api { pub fn query_length_to_fee( &self, length: types::query_length_to_fee::Length, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::QueryLengthToFee, types::query_length_to_fee::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "TransactionPaymentApi", "query_length_to_fee", types::QueryLengthToFee { length }, @@ -3565,11 +3565,11 @@ pub mod api { #[doc = " Return the currently active BEEFY authority set proof."] pub fn authority_set_proof( &self, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::AuthoritySetProof, types::authority_set_proof::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "BeefyMmrApi", "authority_set_proof", types::AuthoritySetProof {}, @@ -3584,11 +3584,11 @@ pub mod api { #[doc = " Return the next/queued BEEFY authority set proof."] pub fn next_authority_set_proof( &self, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::NextAuthoritySetProof, types::next_authority_set_proof::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "BeefyMmrApi", "next_authority_set_proof", types::NextAuthoritySetProof {}, @@ -3664,11 +3664,11 @@ pub mod api { #[doc = " blob. It returns a `Vec` containing the JSON representation of the default `GenesisConfig`."] pub fn create_default_config( &self, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::CreateDefaultConfig, types::create_default_config::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "GenesisBuilder", "create_default_config", types::CreateDefaultConfig {}, @@ -3689,11 +3689,11 @@ pub mod api { pub fn build_config( &self, json: types::build_config::Json, - ) -> ::subxt::ext::subxt_core::runtime_api::Payload< + ) -> ::subxt::ext::subxt_core::runtime_api::payload::Payload< types::BuildConfig, types::build_config::output::Output, > { - ::subxt::ext::subxt_core::runtime_api::Payload::new_static( + ::subxt::ext::subxt_core::runtime_api::payload::Payload::new_static( "GenesisBuilder", "build_config", types::BuildConfig { json }, @@ -4471,8 +4471,8 @@ pub mod api { pub fn remark( &self, remark: types::remark::Remark, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "System", "remark", types::Remark { remark }, @@ -4488,8 +4488,9 @@ pub mod api { pub fn set_heap_pages( &self, pages: types::set_heap_pages::Pages, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "System", "set_heap_pages", types::SetHeapPages { pages }, @@ -4505,8 +4506,9 @@ pub mod api { pub fn set_code( &self, code: types::set_code::Code, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "System", "set_code", types::SetCode { code }, @@ -4521,9 +4523,9 @@ pub mod api { pub fn set_code_without_checks( &self, code: types::set_code_without_checks::Code, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "System", "set_code_without_checks", types::SetCodeWithoutChecks { code }, @@ -4539,8 +4541,9 @@ pub mod api { pub fn set_storage( &self, items: types::set_storage::Items, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "System", "set_storage", types::SetStorage { items }, @@ -4556,8 +4559,9 @@ pub mod api { pub fn kill_storage( &self, keys: types::kill_storage::Keys, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "System", "kill_storage", types::KillStorage { keys }, @@ -4574,8 +4578,9 @@ pub mod api { &self, prefix: types::kill_prefix::Prefix, subkeys: types::kill_prefix::Subkeys, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "System", "kill_prefix", types::KillPrefix { prefix, subkeys }, @@ -4591,8 +4596,9 @@ pub mod api { pub fn remark_with_event( &self, remark: types::remark_with_event::Remark, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "System", "remark_with_event", types::RemarkWithEvent { remark }, @@ -5311,10 +5317,10 @@ pub mod api { #[doc = " Block & extrinsics weights: base values and limits."] pub fn block_weights( &self, - ) -> ::subxt::ext::subxt_core::constants::Address< + ) -> ::subxt::ext::subxt_core::constants::address::Address< runtime_types::frame_system::limits::BlockWeights, > { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "System", "BlockWeights", [ @@ -5327,10 +5333,10 @@ pub mod api { #[doc = " The maximum length of a block (in bytes)."] pub fn block_length( &self, - ) -> ::subxt::ext::subxt_core::constants::Address< + ) -> ::subxt::ext::subxt_core::constants::address::Address< runtime_types::frame_system::limits::BlockLength, > { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "System", "BlockLength", [ @@ -5343,9 +5349,9 @@ pub mod api { #[doc = " Maximum number of block number to block hash mappings to keep (oldest pruned first)."] pub fn block_hash_count( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "System", "BlockHashCount", [ @@ -5359,10 +5365,10 @@ pub mod api { #[doc = " The weight of runtime database operations the runtime can invoke."] pub fn db_weight( &self, - ) -> ::subxt::ext::subxt_core::constants::Address< + ) -> ::subxt::ext::subxt_core::constants::address::Address< runtime_types::sp_weights::RuntimeDbWeight, > { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "System", "DbWeight", [ @@ -5376,10 +5382,10 @@ pub mod api { #[doc = " Get the chain's current version."] pub fn version( &self, - ) -> ::subxt::ext::subxt_core::constants::Address< + ) -> ::subxt::ext::subxt_core::constants::address::Address< runtime_types::sp_version::RuntimeVersion, > { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "System", "Version", [ @@ -5397,9 +5403,9 @@ pub mod api { #[doc = " an identifier of the chain."] pub fn ss58_prefix( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u16> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u16> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "System", "SS58Prefix", [ @@ -5532,9 +5538,9 @@ pub mod api { &self, equivocation_proof: types::report_equivocation::EquivocationProof, key_owner_proof: types::report_equivocation::KeyOwnerProof, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Babe", "report_equivocation", types::ReportEquivocation { @@ -5556,9 +5562,9 @@ pub mod api { &self, equivocation_proof: types::report_equivocation_unsigned::EquivocationProof, key_owner_proof: types::report_equivocation_unsigned::KeyOwnerProof, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Babe", "report_equivocation_unsigned", types::ReportEquivocationUnsigned { @@ -5578,9 +5584,9 @@ pub mod api { pub fn plan_config_change( &self, config: types::plan_config_change::Config, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Babe", "plan_config_change", types::PlanConfigChange { config }, @@ -6135,9 +6141,9 @@ pub mod api { #[doc = " the chain has started. Attempting to do so will brick block production."] pub fn epoch_duration( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u64> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u64> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Babe", "EpochDuration", [ @@ -6155,9 +6161,9 @@ pub mod api { #[doc = " the probability of a slot being empty)."] pub fn expected_block_time( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u64> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u64> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Babe", "ExpectedBlockTime", [ @@ -6171,9 +6177,9 @@ pub mod api { #[doc = " Max number of authorities allowed"] pub fn max_authorities( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Babe", "MaxAuthorities", [ @@ -6187,9 +6193,9 @@ pub mod api { #[doc = " The maximum number of nominators for each validator."] pub fn max_nominators( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Babe", "MaxNominators", [ @@ -6248,8 +6254,8 @@ pub mod api { pub fn set( &self, now: types::set::Now, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Timestamp", "set", types::Set { now }, @@ -6337,9 +6343,9 @@ pub mod api { #[doc = " period on default settings."] pub fn minimum_period( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u64> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u64> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Timestamp", "MinimumPeriod", [ @@ -6515,8 +6521,8 @@ pub mod api { pub fn claim( &self, index: types::claim::Index, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Indices", "claim", types::Claim { index }, @@ -6532,8 +6538,9 @@ pub mod api { &self, new: types::transfer::New, index: types::transfer::Index, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Indices", "transfer", types::Transfer { new, index }, @@ -6549,8 +6556,8 @@ pub mod api { pub fn free( &self, index: types::free::Index, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Indices", "free", types::Free { index }, @@ -6568,8 +6575,9 @@ pub mod api { new: types::force_transfer::New, index: types::force_transfer::Index, freeze: types::force_transfer::Freeze, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Indices", "force_transfer", types::ForceTransfer { new, index, freeze }, @@ -6585,8 +6593,8 @@ pub mod api { pub fn freeze( &self, index: types::freeze::Index, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Indices", "freeze", types::Freeze { index }, @@ -6749,9 +6757,9 @@ pub mod api { #[doc = " The deposit needed for reserving an index."] pub fn deposit( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u128> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u128> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Indices", "Deposit", [ @@ -7008,9 +7016,9 @@ pub mod api { &self, dest: types::transfer_allow_death::Dest, value: types::transfer_allow_death::Value, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Balances", "transfer_allow_death", types::TransferAllowDeath { dest, value }, @@ -7028,8 +7036,9 @@ pub mod api { source: types::force_transfer::Source, dest: types::force_transfer::Dest, value: types::force_transfer::Value, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Balances", "force_transfer", types::ForceTransfer { @@ -7049,9 +7058,9 @@ pub mod api { &self, dest: types::transfer_keep_alive::Dest, value: types::transfer_keep_alive::Value, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Balances", "transfer_keep_alive", types::TransferKeepAlive { dest, value }, @@ -7067,8 +7076,9 @@ pub mod api { &self, dest: types::transfer_all::Dest, keep_alive: types::transfer_all::KeepAlive, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Balances", "transfer_all", types::TransferAll { dest, keep_alive }, @@ -7084,8 +7094,9 @@ pub mod api { &self, who: types::force_unreserve::Who, amount: types::force_unreserve::Amount, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Balances", "force_unreserve", types::ForceUnreserve { who, amount }, @@ -7101,8 +7112,9 @@ pub mod api { pub fn upgrade_accounts( &self, who: types::upgrade_accounts::Who, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Balances", "upgrade_accounts", types::UpgradeAccounts { who }, @@ -7118,8 +7130,9 @@ pub mod api { &self, who: types::force_set_balance::Who, new_free: types::force_set_balance::NewFree, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Balances", "force_set_balance", types::ForceSetBalance { who, new_free }, @@ -8051,9 +8064,9 @@ pub mod api { #[doc = " Bottom line: Do yourself a favour and make it at least one!"] pub fn existential_deposit( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u128> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u128> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Balances", "ExistentialDeposit", [ @@ -8067,9 +8080,9 @@ pub mod api { #[doc = " Not strictly enforced, but used for weight estimation."] pub fn max_locks( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Balances", "MaxLocks", [ @@ -8083,9 +8096,9 @@ pub mod api { #[doc = " The maximum number of named reserves that can exist on an account."] pub fn max_reserves( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Balances", "MaxReserves", [ @@ -8099,9 +8112,9 @@ pub mod api { #[doc = " The maximum number of holds that can exist on an account at any time."] pub fn max_holds( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Balances", "MaxHolds", [ @@ -8115,9 +8128,9 @@ pub mod api { #[doc = " The maximum number of individual freeze locks that can exist on an account at any time."] pub fn max_freezes( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Balances", "MaxFreezes", [ @@ -8253,9 +8266,9 @@ pub mod api { #[doc = " transactions."] pub fn operational_fee_multiplier( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u8> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u8> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "TransactionPayment", "OperationalFeeMultiplier", [ @@ -8626,9 +8639,9 @@ pub mod api { &self, equivocation_proof: types::report_equivocation::EquivocationProof, key_owner_proof: types::report_equivocation::KeyOwnerProof, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Beefy", "report_equivocation", types::ReportEquivocation { @@ -8650,9 +8663,9 @@ pub mod api { &self, equivocation_proof: types::report_equivocation_unsigned::EquivocationProof, key_owner_proof: types::report_equivocation_unsigned::KeyOwnerProof, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Beefy", "report_equivocation_unsigned", types::ReportEquivocationUnsigned { @@ -8673,8 +8686,9 @@ pub mod api { pub fn set_new_genesis( &self, delay_in_blocks: types::set_new_genesis::DelayInBlocks, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Beefy", "set_new_genesis", types::SetNewGenesis { delay_in_blocks }, @@ -8882,9 +8896,9 @@ pub mod api { #[doc = " The maximum number of authorities that can be added."] pub fn max_authorities( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Beefy", "MaxAuthorities", [ @@ -8898,9 +8912,9 @@ pub mod api { #[doc = " The maximum number of nominators for each validator."] pub fn max_nominators( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Beefy", "MaxNominators", [ @@ -8919,9 +8933,9 @@ pub mod api { #[doc = " can be zero."] pub fn max_set_id_session_entries( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u64> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u64> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Beefy", "MaxSetIdSessionEntries", [ @@ -9198,8 +9212,9 @@ pub mod api { &self, keys: types::set_keys::Keys, proof: types::set_keys::Proof, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Session", "set_keys", types::SetKeys { keys, proof }, @@ -9213,8 +9228,9 @@ pub mod api { #[doc = "See [`Pallet::purge_keys`]."] pub fn purge_keys( &self, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Session", "purge_keys", types::PurgeKeys {}, @@ -9668,9 +9684,9 @@ pub mod api { &self, equivocation_proof: types::report_equivocation::EquivocationProof, key_owner_proof: types::report_equivocation::KeyOwnerProof, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Grandpa", "report_equivocation", types::ReportEquivocation { @@ -9691,9 +9707,9 @@ pub mod api { &self, equivocation_proof: types::report_equivocation_unsigned::EquivocationProof, key_owner_proof: types::report_equivocation_unsigned::KeyOwnerProof, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Grandpa", "report_equivocation_unsigned", types::ReportEquivocationUnsigned { @@ -9714,8 +9730,9 @@ pub mod api { &self, delay: types::note_stalled::Delay, best_finalized_block_number: types::note_stalled::BestFinalizedBlockNumber, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Grandpa", "note_stalled", types::NoteStalled { @@ -10009,9 +10026,9 @@ pub mod api { #[doc = " Max Authorities in use"] pub fn max_authorities( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Grandpa", "MaxAuthorities", [ @@ -10025,9 +10042,9 @@ pub mod api { #[doc = " The maximum number of nominators for each validator."] pub fn max_nominators( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Grandpa", "MaxNominators", [ @@ -10046,9 +10063,9 @@ pub mod api { #[doc = " can be zero."] pub fn max_set_id_session_entries( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u64> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u64> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Grandpa", "MaxSetIdSessionEntries", [ @@ -10113,8 +10130,9 @@ pub mod api { &self, heartbeat: types::heartbeat::Heartbeat, signature: types::heartbeat::Signature, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "ImOnline", "heartbeat", types::Heartbeat { @@ -10468,9 +10486,9 @@ pub mod api { #[doc = " multiple pallets send unsigned transactions."] pub fn unsigned_priority( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u64> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u64> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "ImOnline", "UnsignedPriority", [ @@ -10767,8 +10785,9 @@ pub mod api { &self, value: types::propose_spend::Value, beneficiary: types::propose_spend::Beneficiary, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Treasury", "propose_spend", types::ProposeSpend { value, beneficiary }, @@ -10783,8 +10802,9 @@ pub mod api { pub fn reject_proposal( &self, proposal_id: types::reject_proposal::ProposalId, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Treasury", "reject_proposal", types::RejectProposal { proposal_id }, @@ -10799,8 +10819,9 @@ pub mod api { pub fn approve_proposal( &self, proposal_id: types::approve_proposal::ProposalId, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Treasury", "approve_proposal", types::ApproveProposal { proposal_id }, @@ -10816,8 +10837,9 @@ pub mod api { &self, amount: types::spend_local::Amount, beneficiary: types::spend_local::Beneficiary, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Treasury", "spend_local", types::SpendLocal { @@ -10835,8 +10857,9 @@ pub mod api { pub fn remove_approval( &self, proposal_id: types::remove_approval::ProposalId, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Treasury", "remove_approval", types::RemoveApproval { proposal_id }, @@ -10855,8 +10878,8 @@ pub mod api { amount: types::spend::Amount, beneficiary: types::spend::Beneficiary, valid_from: types::spend::ValidFrom, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Treasury", "spend", types::Spend { @@ -10881,8 +10904,8 @@ pub mod api { pub fn payout( &self, index: types::payout::Index, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Treasury", "payout", types::Payout { index }, @@ -10897,8 +10920,9 @@ pub mod api { pub fn check_status( &self, index: types::check_status::Index, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Treasury", "check_status", types::CheckStatus { index }, @@ -10913,8 +10937,9 @@ pub mod api { pub fn void_spend( &self, index: types::void_spend::Index, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Treasury", "void_spend", types::VoidSpend { index }, @@ -11507,10 +11532,10 @@ pub mod api { #[doc = " An accepted proposal gets these back. A rejected proposal does not."] pub fn proposal_bond( &self, - ) -> ::subxt::ext::subxt_core::constants::Address< + ) -> ::subxt::ext::subxt_core::constants::address::Address< runtime_types::sp_arithmetic::per_things::Permill, > { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Treasury", "ProposalBond", [ @@ -11523,9 +11548,9 @@ pub mod api { #[doc = " Minimum amount of funds that should be placed in a deposit for making a proposal."] pub fn proposal_bond_minimum( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u128> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u128> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Treasury", "ProposalBondMinimum", [ @@ -11538,10 +11563,10 @@ pub mod api { #[doc = " Maximum amount of funds that should be placed in a deposit for making a proposal."] pub fn proposal_bond_maximum( &self, - ) -> ::subxt::ext::subxt_core::constants::Address< + ) -> ::subxt::ext::subxt_core::constants::address::Address< ::core::option::Option<::core::primitive::u128>, > { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Treasury", "ProposalBondMaximum", [ @@ -11555,9 +11580,9 @@ pub mod api { #[doc = " Period between successive spends."] pub fn spend_period( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Treasury", "SpendPeriod", [ @@ -11571,10 +11596,10 @@ pub mod api { #[doc = " Percentage of spare funds (if any) that are burnt per spend period."] pub fn burn( &self, - ) -> ::subxt::ext::subxt_core::constants::Address< + ) -> ::subxt::ext::subxt_core::constants::address::Address< runtime_types::sp_arithmetic::per_things::Permill, > { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Treasury", "Burn", [ @@ -11587,10 +11612,10 @@ pub mod api { #[doc = " The treasury's pallet id, used for deriving its sovereign account ID."] pub fn pallet_id( &self, - ) -> ::subxt::ext::subxt_core::constants::Address< + ) -> ::subxt::ext::subxt_core::constants::address::Address< runtime_types::frame_support::PalletId, > { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Treasury", "PalletId", [ @@ -11605,9 +11630,9 @@ pub mod api { #[doc = " NOTE: This parameter is also used within the Bounties Pallet extension if enabled."] pub fn max_approvals( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Treasury", "MaxApprovals", [ @@ -11621,9 +11646,9 @@ pub mod api { #[doc = " The period during which an approved treasury spend has to be claimed."] pub fn payout_period( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Treasury", "PayoutPeriod", [ @@ -11843,8 +11868,8 @@ pub mod api { &self, poll_index: types::vote::PollIndex, vote: types::vote::Vote, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "ConvictionVoting", "vote", types::Vote { poll_index, vote }, @@ -11863,8 +11888,9 @@ pub mod api { to: types::delegate::To, conviction: types::delegate::Conviction, balance: types::delegate::Balance, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "ConvictionVoting", "delegate", types::Delegate { @@ -11884,8 +11910,9 @@ pub mod api { pub fn undelegate( &self, class: types::undelegate::Class, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "ConvictionVoting", "undelegate", types::Undelegate { class }, @@ -11902,8 +11929,8 @@ pub mod api { &self, class: types::unlock::Class, target: types::unlock::Target, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "ConvictionVoting", "unlock", types::Unlock { class, target }, @@ -11920,8 +11947,9 @@ pub mod api { &self, class: types::remove_vote::Class, index: types::remove_vote::Index, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "ConvictionVoting", "remove_vote", types::RemoveVote { class, index }, @@ -11939,8 +11967,9 @@ pub mod api { target: types::remove_other_vote::Target, class: types::remove_other_vote::Class, index: types::remove_other_vote::Index, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "ConvictionVoting", "remove_other_vote", types::RemoveOtherVote { @@ -12180,9 +12209,9 @@ pub mod api { #[doc = " weight estimation: see `delegate` for instance."] pub fn max_votes( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "ConvictionVoting", "MaxVotes", [ @@ -12199,9 +12228,9 @@ pub mod api { #[doc = " those successful voters are locked into the consequences that their votes entail."] pub fn vote_locking_period( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "ConvictionVoting", "VoteLockingPeriod", [ @@ -12485,8 +12514,8 @@ pub mod api { proposal_origin: types::submit::ProposalOrigin, proposal: types::submit::Proposal, enactment_moment: types::submit::EnactmentMoment, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Referenda", "submit", types::Submit { @@ -12508,9 +12537,9 @@ pub mod api { pub fn place_decision_deposit( &self, index: types::place_decision_deposit::Index, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Referenda", "place_decision_deposit", types::PlaceDecisionDeposit { index }, @@ -12525,9 +12554,9 @@ pub mod api { pub fn refund_decision_deposit( &self, index: types::refund_decision_deposit::Index, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Referenda", "refund_decision_deposit", types::RefundDecisionDeposit { index }, @@ -12542,8 +12571,8 @@ pub mod api { pub fn cancel( &self, index: types::cancel::Index, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Referenda", "cancel", types::Cancel { index }, @@ -12559,8 +12588,8 @@ pub mod api { pub fn kill( &self, index: types::kill::Index, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Referenda", "kill", types::Kill { index }, @@ -12576,8 +12605,9 @@ pub mod api { pub fn nudge_referendum( &self, index: types::nudge_referendum::Index, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Referenda", "nudge_referendum", types::NudgeReferendum { index }, @@ -12593,9 +12623,9 @@ pub mod api { pub fn one_fewer_deciding( &self, track: types::one_fewer_deciding::Track, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Referenda", "one_fewer_deciding", types::OneFewerDeciding { track }, @@ -12611,9 +12641,9 @@ pub mod api { pub fn refund_submission_deposit( &self, index: types::refund_submission_deposit::Index, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Referenda", "refund_submission_deposit", types::RefundSubmissionDeposit { index }, @@ -12629,8 +12659,9 @@ pub mod api { &self, index: types::set_metadata::Index, maybe_hash: types::set_metadata::MaybeHash, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Referenda", "set_metadata", types::SetMetadata { index, maybe_hash }, @@ -13338,9 +13369,9 @@ pub mod api { #[doc = " The minimum amount to be used as a deposit for a public referendum proposal."] pub fn submission_deposit( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u128> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u128> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Referenda", "SubmissionDeposit", [ @@ -13353,9 +13384,9 @@ pub mod api { #[doc = " Maximum size of the referendum queue for a single track."] pub fn max_queued( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Referenda", "MaxQueued", [ @@ -13370,9 +13401,9 @@ pub mod api { #[doc = " Once this passes, then anyone may cancel the referendum."] pub fn undeciding_timeout( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Referenda", "UndecidingTimeout", [ @@ -13388,9 +13419,9 @@ pub mod api { #[doc = " automatic referendum status changes. Explicit servicing instructions are unaffected."] pub fn alarm_interval( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Referenda", "AlarmInterval", [ @@ -13404,7 +13435,7 @@ pub mod api { #[doc = " Information concerning the different referendum tracks."] pub fn tracks( &self, - ) -> ::subxt::ext::subxt_core::constants::Address< + ) -> ::subxt::ext::subxt_core::constants::address::Address< ::subxt::ext::subxt_core::alloc::vec::Vec<( ::core::primitive::u16, runtime_types::pallet_referenda::types::TrackInfo< @@ -13413,7 +13444,7 @@ pub mod api { >, )>, > { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Referenda", "Tracks", [ @@ -13621,8 +13652,9 @@ pub mod api { pub fn add_member( &self, who: types::add_member::Who, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "FellowshipCollective", "add_member", types::AddMember { who }, @@ -13637,8 +13669,9 @@ pub mod api { pub fn promote_member( &self, who: types::promote_member::Who, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "FellowshipCollective", "promote_member", types::PromoteMember { who }, @@ -13654,8 +13687,9 @@ pub mod api { pub fn demote_member( &self, who: types::demote_member::Who, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "FellowshipCollective", "demote_member", types::DemoteMember { who }, @@ -13672,8 +13706,9 @@ pub mod api { &self, who: types::remove_member::Who, min_rank: types::remove_member::MinRank, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "FellowshipCollective", "remove_member", types::RemoveMember { who, min_rank }, @@ -13690,8 +13725,8 @@ pub mod api { &self, poll: types::vote::Poll, aye: types::vote::Aye, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "FellowshipCollective", "vote", types::Vote { poll, aye }, @@ -13707,8 +13742,9 @@ pub mod api { &self, poll_index: types::cleanup_poll::PollIndex, max: types::cleanup_poll::Max, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "FellowshipCollective", "cleanup_poll", types::CleanupPoll { poll_index, max }, @@ -14546,8 +14582,8 @@ pub mod api { proposal_origin: types::submit::ProposalOrigin, proposal: types::submit::Proposal, enactment_moment: types::submit::EnactmentMoment, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "FellowshipReferenda", "submit", types::Submit { @@ -14569,9 +14605,9 @@ pub mod api { pub fn place_decision_deposit( &self, index: types::place_decision_deposit::Index, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "FellowshipReferenda", "place_decision_deposit", types::PlaceDecisionDeposit { index }, @@ -14586,9 +14622,9 @@ pub mod api { pub fn refund_decision_deposit( &self, index: types::refund_decision_deposit::Index, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "FellowshipReferenda", "refund_decision_deposit", types::RefundDecisionDeposit { index }, @@ -14603,8 +14639,8 @@ pub mod api { pub fn cancel( &self, index: types::cancel::Index, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "FellowshipReferenda", "cancel", types::Cancel { index }, @@ -14620,8 +14656,8 @@ pub mod api { pub fn kill( &self, index: types::kill::Index, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "FellowshipReferenda", "kill", types::Kill { index }, @@ -14637,8 +14673,9 @@ pub mod api { pub fn nudge_referendum( &self, index: types::nudge_referendum::Index, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "FellowshipReferenda", "nudge_referendum", types::NudgeReferendum { index }, @@ -14654,9 +14691,9 @@ pub mod api { pub fn one_fewer_deciding( &self, track: types::one_fewer_deciding::Track, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "FellowshipReferenda", "one_fewer_deciding", types::OneFewerDeciding { track }, @@ -14672,9 +14709,9 @@ pub mod api { pub fn refund_submission_deposit( &self, index: types::refund_submission_deposit::Index, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "FellowshipReferenda", "refund_submission_deposit", types::RefundSubmissionDeposit { index }, @@ -14690,8 +14727,9 @@ pub mod api { &self, index: types::set_metadata::Index, maybe_hash: types::set_metadata::MaybeHash, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "FellowshipReferenda", "set_metadata", types::SetMetadata { index, maybe_hash }, @@ -15393,9 +15431,9 @@ pub mod api { #[doc = " The minimum amount to be used as a deposit for a public referendum proposal."] pub fn submission_deposit( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u128> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u128> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "FellowshipReferenda", "SubmissionDeposit", [ @@ -15408,9 +15446,9 @@ pub mod api { #[doc = " Maximum size of the referendum queue for a single track."] pub fn max_queued( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "FellowshipReferenda", "MaxQueued", [ @@ -15425,9 +15463,9 @@ pub mod api { #[doc = " Once this passes, then anyone may cancel the referendum."] pub fn undeciding_timeout( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "FellowshipReferenda", "UndecidingTimeout", [ @@ -15443,9 +15481,9 @@ pub mod api { #[doc = " automatic referendum status changes. Explicit servicing instructions are unaffected."] pub fn alarm_interval( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "FellowshipReferenda", "AlarmInterval", [ @@ -15459,7 +15497,7 @@ pub mod api { #[doc = " Information concerning the different referendum tracks."] pub fn tracks( &self, - ) -> ::subxt::ext::subxt_core::constants::Address< + ) -> ::subxt::ext::subxt_core::constants::address::Address< ::subxt::ext::subxt_core::alloc::vec::Vec<( ::core::primitive::u16, runtime_types::pallet_referenda::types::TrackInfo< @@ -15468,7 +15506,7 @@ pub mod api { >, )>, > { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "FellowshipReferenda", "Tracks", [ @@ -15612,8 +15650,9 @@ pub mod api { pub fn whitelist_call( &self, call_hash: types::whitelist_call::CallHash, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Whitelist", "whitelist_call", types::WhitelistCall { call_hash }, @@ -15629,9 +15668,9 @@ pub mod api { pub fn remove_whitelisted_call( &self, call_hash: types::remove_whitelisted_call::CallHash, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Whitelist", "remove_whitelisted_call", types::RemoveWhitelistedCall { call_hash }, @@ -15649,9 +15688,9 @@ pub mod api { call_hash: types::dispatch_whitelisted_call::CallHash, call_encoded_len: types::dispatch_whitelisted_call::CallEncodedLen, call_weight_witness: types::dispatch_whitelisted_call::CallWeightWitness, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Whitelist", "dispatch_whitelisted_call", types::DispatchWhitelistedCall { @@ -15671,9 +15710,10 @@ pub mod api { pub fn dispatch_whitelisted_call_with_preimage( &self, call: types::dispatch_whitelisted_call_with_preimage::Call, - ) -> ::subxt::ext::subxt_core::tx::Payload - { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload< + types::DispatchWhitelistedCallWithPreimage, + > { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Whitelist", "dispatch_whitelisted_call_with_preimage", types::DispatchWhitelistedCallWithPreimage { @@ -16002,8 +16042,8 @@ pub mod api { &self, dest: types::claim::Dest, ethereum_signature: types::claim::EthereumSignature, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Claims", "claim", types::Claim { @@ -16025,8 +16065,9 @@ pub mod api { value: types::mint_claim::Value, vesting_schedule: types::mint_claim::VestingSchedule, statement: types::mint_claim::Statement, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Claims", "mint_claim", types::MintClaim { @@ -16048,8 +16089,9 @@ pub mod api { dest: types::claim_attest::Dest, ethereum_signature: types::claim_attest::EthereumSignature, statement: types::claim_attest::Statement, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Claims", "claim_attest", types::ClaimAttest { @@ -16068,8 +16110,8 @@ pub mod api { pub fn attest( &self, statement: types::attest::Statement, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Claims", "attest", types::Attest { statement }, @@ -16087,8 +16129,9 @@ pub mod api { old: types::move_claim::Old, new: types::move_claim::New, maybe_preclaim: types::move_claim::MaybePreclaim, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Claims", "move_claim", types::MoveClaim { @@ -16405,10 +16448,10 @@ pub mod api { impl ConstantsApi { pub fn prefix( &self, - ) -> ::subxt::ext::subxt_core::constants::Address< + ) -> ::subxt::ext::subxt_core::constants::address::Address< ::subxt::ext::subxt_core::alloc::vec::Vec<::core::primitive::u8>, > { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Claims", "Prefix", [ @@ -16611,8 +16654,8 @@ pub mod api { pub fn batch( &self, calls: types::batch::Calls, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Utility", "batch", types::Batch { calls }, @@ -16629,8 +16672,9 @@ pub mod api { &self, index: types::as_derivative::Index, call: types::as_derivative::Call, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Utility", "as_derivative", types::AsDerivative { @@ -16649,8 +16693,9 @@ pub mod api { pub fn batch_all( &self, calls: types::batch_all::Calls, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Utility", "batch_all", types::BatchAll { calls }, @@ -16666,8 +16711,9 @@ pub mod api { &self, as_origin: types::dispatch_as::AsOrigin, call: types::dispatch_as::Call, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Utility", "dispatch_as", types::DispatchAs { @@ -16686,8 +16732,9 @@ pub mod api { pub fn force_batch( &self, calls: types::force_batch::Calls, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Utility", "force_batch", types::ForceBatch { calls }, @@ -16704,8 +16751,9 @@ pub mod api { &self, call: types::with_weight::Call, weight: types::with_weight::Weight, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Utility", "with_weight", types::WithWeight { @@ -16852,9 +16900,9 @@ pub mod api { #[doc = " The limit on the number of batched calls."] pub fn batched_calls_limit( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Utility", "batched_calls_limit", [ @@ -17318,8 +17366,9 @@ pub mod api { pub fn add_registrar( &self, account: types::add_registrar::Account, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Identity", "add_registrar", types::AddRegistrar { account }, @@ -17334,8 +17383,9 @@ pub mod api { pub fn set_identity( &self, info: types::set_identity::Info, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Identity", "set_identity", types::SetIdentity { @@ -17353,8 +17403,9 @@ pub mod api { pub fn set_subs( &self, subs: types::set_subs::Subs, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Identity", "set_subs", types::SetSubs { subs }, @@ -17369,8 +17420,9 @@ pub mod api { #[doc = "See [`Pallet::clear_identity`]."] pub fn clear_identity( &self, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Identity", "clear_identity", types::ClearIdentity {}, @@ -17387,9 +17439,9 @@ pub mod api { &self, reg_index: types::request_judgement::RegIndex, max_fee: types::request_judgement::MaxFee, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Identity", "request_judgement", types::RequestJudgement { reg_index, max_fee }, @@ -17404,8 +17456,9 @@ pub mod api { pub fn cancel_request( &self, reg_index: types::cancel_request::RegIndex, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Identity", "cancel_request", types::CancelRequest { reg_index }, @@ -17422,8 +17475,8 @@ pub mod api { &self, index: types::set_fee::Index, fee: types::set_fee::Fee, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Identity", "set_fee", types::SetFee { index, fee }, @@ -17440,8 +17493,9 @@ pub mod api { &self, index: types::set_account_id::Index, new: types::set_account_id::New, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Identity", "set_account_id", types::SetAccountId { index, new }, @@ -17458,8 +17512,9 @@ pub mod api { &self, index: types::set_fields::Index, fields: types::set_fields::Fields, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Identity", "set_fields", types::SetFields { index, fields }, @@ -17477,9 +17532,9 @@ pub mod api { target: types::provide_judgement::Target, judgement: types::provide_judgement::Judgement, identity: types::provide_judgement::Identity, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Identity", "provide_judgement", types::ProvideJudgement { @@ -17500,8 +17555,9 @@ pub mod api { pub fn kill_identity( &self, target: types::kill_identity::Target, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Identity", "kill_identity", types::KillIdentity { target }, @@ -17518,8 +17574,8 @@ pub mod api { &self, sub: types::add_sub::Sub, data: types::add_sub::Data, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Identity", "add_sub", types::AddSub { sub, data }, @@ -17535,8 +17591,9 @@ pub mod api { &self, sub: types::rename_sub::Sub, data: types::rename_sub::Data, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Identity", "rename_sub", types::RenameSub { sub, data }, @@ -17552,8 +17609,9 @@ pub mod api { pub fn remove_sub( &self, sub: types::remove_sub::Sub, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Identity", "remove_sub", types::RemoveSub { sub }, @@ -17565,8 +17623,11 @@ pub mod api { ) } #[doc = "See [`Pallet::quit_sub`]."] - pub fn quit_sub(&self) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + pub fn quit_sub( + &self, + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Identity", "quit_sub", types::QuitSub {}, @@ -18063,9 +18124,9 @@ pub mod api { #[doc = " The amount held on deposit for a registered identity"] pub fn basic_deposit( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u128> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u128> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Identity", "BasicDeposit", [ @@ -18078,9 +18139,9 @@ pub mod api { #[doc = " The amount held on deposit per additional field for a registered identity."] pub fn field_deposit( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u128> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u128> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Identity", "FieldDeposit", [ @@ -18095,9 +18156,9 @@ pub mod api { #[doc = " be another trie item whose value is the size of an account ID plus 32 bytes."] pub fn sub_account_deposit( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u128> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u128> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Identity", "SubAccountDeposit", [ @@ -18110,9 +18171,9 @@ pub mod api { #[doc = " The maximum number of sub-accounts allowed per identified account."] pub fn max_sub_accounts( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Identity", "MaxSubAccounts", [ @@ -18127,9 +18188,9 @@ pub mod api { #[doc = " required to access an identity, but can be pretty high."] pub fn max_additional_fields( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Identity", "MaxAdditionalFields", [ @@ -18144,9 +18205,9 @@ pub mod api { #[doc = " of, e.g., updating judgements."] pub fn max_registrars( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Identity", "MaxRegistrars", [ @@ -18699,8 +18760,8 @@ pub mod api { pub fn bid( &self, value: types::bid::Value, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Society", "bid", types::Bid { value }, @@ -18712,8 +18773,10 @@ pub mod api { ) } #[doc = "See [`Pallet::unbid`]."] - pub fn unbid(&self) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + pub fn unbid( + &self, + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Society", "unbid", types::Unbid {}, @@ -18731,8 +18794,8 @@ pub mod api { who: types::vouch::Who, value: types::vouch::Value, tip: types::vouch::Tip, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Society", "vouch", types::Vouch { who, value, tip }, @@ -18744,8 +18807,11 @@ pub mod api { ) } #[doc = "See [`Pallet::unvouch`]."] - pub fn unvouch(&self) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + pub fn unvouch( + &self, + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Society", "unvouch", types::Unvouch {}, @@ -18762,8 +18828,8 @@ pub mod api { &self, candidate: types::vote::Candidate, approve: types::vote::Approve, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Society", "vote", types::Vote { candidate, approve }, @@ -18778,8 +18844,9 @@ pub mod api { pub fn defender_vote( &self, approve: types::defender_vote::Approve, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Society", "defender_vote", types::DefenderVote { approve }, @@ -18792,8 +18859,10 @@ pub mod api { ) } #[doc = "See [`Pallet::payout`]."] - pub fn payout(&self) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + pub fn payout( + &self, + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Society", "payout", types::Payout {}, @@ -18808,8 +18877,9 @@ pub mod api { pub fn waive_repay( &self, amount: types::waive_repay::Amount, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Society", "waive_repay", types::WaiveRepay { amount }, @@ -18829,8 +18899,9 @@ pub mod api { max_strikes: types::found_society::MaxStrikes, candidate_deposit: types::found_society::CandidateDeposit, rules: types::found_society::Rules, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Society", "found_society", types::FoundSociety { @@ -18850,8 +18921,11 @@ pub mod api { ) } #[doc = "See [`Pallet::dissolve`]."] - pub fn dissolve(&self) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + pub fn dissolve( + &self, + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Society", "dissolve", types::Dissolve {}, @@ -18868,9 +18942,9 @@ pub mod api { &self, who: types::judge_suspended_member::Who, forgive: types::judge_suspended_member::Forgive, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Society", "judge_suspended_member", types::JudgeSuspendedMember { who, forgive }, @@ -18888,8 +18962,9 @@ pub mod api { max_intake: types::set_parameters::MaxIntake, max_strikes: types::set_parameters::MaxStrikes, candidate_deposit: types::set_parameters::CandidateDeposit, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Society", "set_parameters", types::SetParameters { @@ -18909,8 +18984,9 @@ pub mod api { #[doc = "See [`Pallet::punish_skeptic`]."] pub fn punish_skeptic( &self, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Society", "punish_skeptic", types::PunishSkeptic {}, @@ -18925,8 +19001,9 @@ pub mod api { #[doc = "See [`Pallet::claim_membership`]."] pub fn claim_membership( &self, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Society", "claim_membership", types::ClaimMembership {}, @@ -18941,9 +19018,9 @@ pub mod api { pub fn bestow_membership( &self, candidate: types::bestow_membership::Candidate, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Society", "bestow_membership", types::BestowMembership { candidate }, @@ -18958,8 +19035,9 @@ pub mod api { pub fn kick_candidate( &self, candidate: types::kick_candidate::Candidate, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Society", "kick_candidate", types::KickCandidate { candidate }, @@ -18973,8 +19051,9 @@ pub mod api { #[doc = "See [`Pallet::resign_candidacy`]."] pub fn resign_candidacy( &self, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Society", "resign_candidacy", types::ResignCandidacy {}, @@ -18990,8 +19069,9 @@ pub mod api { pub fn drop_candidate( &self, candidate: types::drop_candidate::Candidate, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Society", "drop_candidate", types::DropCandidate { candidate }, @@ -19007,9 +19087,9 @@ pub mod api { &self, candidate: types::cleanup_candidacy::Candidate, max: types::cleanup_candidacy::Max, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Society", "cleanup_candidacy", types::CleanupCandidacy { candidate, max }, @@ -19026,9 +19106,9 @@ pub mod api { &self, challenge_round: types::cleanup_challenge::ChallengeRound, max: types::cleanup_challenge::Max, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Society", "cleanup_challenge", types::CleanupChallenge { @@ -20301,10 +20381,10 @@ pub mod api { #[doc = " The societies's pallet id"] pub fn pallet_id( &self, - ) -> ::subxt::ext::subxt_core::constants::Address< + ) -> ::subxt::ext::subxt_core::constants::address::Address< runtime_types::frame_support::PalletId, > { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Society", "PalletId", [ @@ -20317,9 +20397,9 @@ pub mod api { #[doc = " The maximum number of strikes before a member gets funds slashed."] pub fn grace_strikes( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Society", "GraceStrikes", [ @@ -20333,9 +20413,9 @@ pub mod api { #[doc = " The amount of incentive paid within each period. Doesn't include VoterTip."] pub fn period_spend( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u128> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u128> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Society", "PeriodSpend", [ @@ -20349,9 +20429,9 @@ pub mod api { #[doc = " `ClaimPeriod`, this sums to the number of blocks between candidate intake periods."] pub fn voting_period( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Society", "VotingPeriod", [ @@ -20366,9 +20446,9 @@ pub mod api { #[doc = " named head."] pub fn claim_period( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Society", "ClaimPeriod", [ @@ -20382,9 +20462,9 @@ pub mod api { #[doc = " The maximum duration of the payout lock."] pub fn max_lock_duration( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Society", "MaxLockDuration", [ @@ -20398,9 +20478,9 @@ pub mod api { #[doc = " The number of blocks between membership challenges."] pub fn challenge_period( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Society", "ChallengePeriod", [ @@ -20414,9 +20494,9 @@ pub mod api { #[doc = " The maximum number of payouts a member may have waiting unclaimed."] pub fn max_payouts( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Society", "MaxPayouts", [ @@ -20430,9 +20510,9 @@ pub mod api { #[doc = " The maximum number of bids at once."] pub fn max_bids( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Society", "MaxBids", [ @@ -20734,8 +20814,9 @@ pub mod api { &self, account: types::as_recovered::Account, call: types::as_recovered::Call, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Recovery", "as_recovered", types::AsRecovered { @@ -20755,8 +20836,9 @@ pub mod api { &self, lost: types::set_recovered::Lost, rescuer: types::set_recovered::Rescuer, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Recovery", "set_recovered", types::SetRecovered { lost, rescuer }, @@ -20773,8 +20855,9 @@ pub mod api { friends: types::create_recovery::Friends, threshold: types::create_recovery::Threshold, delay_period: types::create_recovery::DelayPeriod, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Recovery", "create_recovery", types::CreateRecovery { @@ -20793,9 +20876,9 @@ pub mod api { pub fn initiate_recovery( &self, account: types::initiate_recovery::Account, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Recovery", "initiate_recovery", types::InitiateRecovery { account }, @@ -20811,8 +20894,9 @@ pub mod api { &self, lost: types::vouch_recovery::Lost, rescuer: types::vouch_recovery::Rescuer, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Recovery", "vouch_recovery", types::VouchRecovery { lost, rescuer }, @@ -20827,8 +20911,9 @@ pub mod api { pub fn claim_recovery( &self, account: types::claim_recovery::Account, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Recovery", "claim_recovery", types::ClaimRecovery { account }, @@ -20844,8 +20929,9 @@ pub mod api { pub fn close_recovery( &self, rescuer: types::close_recovery::Rescuer, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Recovery", "close_recovery", types::CloseRecovery { rescuer }, @@ -20860,8 +20946,9 @@ pub mod api { #[doc = "See [`Pallet::remove_recovery`]."] pub fn remove_recovery( &self, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Recovery", "remove_recovery", types::RemoveRecovery {}, @@ -20877,8 +20964,9 @@ pub mod api { pub fn cancel_recovered( &self, account: types::cancel_recovered::Account, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Recovery", "cancel_recovered", types::CancelRecovered { account }, @@ -21280,9 +21368,9 @@ pub mod api { #[doc = " `2 + sizeof(BlockNumber, Balance)` bytes."] pub fn config_deposit_base( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u128> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u128> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Recovery", "ConfigDepositBase", [ @@ -21299,9 +21387,9 @@ pub mod api { #[doc = " value."] pub fn friend_deposit_factor( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u128> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u128> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Recovery", "FriendDepositFactor", [ @@ -21319,9 +21407,9 @@ pub mod api { #[doc = " to anyway..."] pub fn max_friends( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Recovery", "MaxFriends", [ @@ -21341,9 +21429,9 @@ pub mod api { #[doc = " threshold."] pub fn recovery_deposit( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u128> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u128> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Recovery", "RecoveryDeposit", [ @@ -21523,8 +21611,8 @@ pub mod api { pub struct TransactionApi; impl TransactionApi { #[doc = "See [`Pallet::vest`]."] - pub fn vest(&self) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + pub fn vest(&self) -> ::subxt::ext::subxt_core::tx::payload::Payload { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Vesting", "vest", types::Vest {}, @@ -21540,8 +21628,9 @@ pub mod api { pub fn vest_other( &self, target: types::vest_other::Target, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Vesting", "vest_other", types::VestOther { target }, @@ -21557,8 +21646,9 @@ pub mod api { &self, target: types::vested_transfer::Target, schedule: types::vested_transfer::Schedule, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Vesting", "vested_transfer", types::VestedTransfer { target, schedule }, @@ -21575,9 +21665,9 @@ pub mod api { source: types::force_vested_transfer::Source, target: types::force_vested_transfer::Target, schedule: types::force_vested_transfer::Schedule, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Vesting", "force_vested_transfer", types::ForceVestedTransfer { @@ -21598,8 +21688,9 @@ pub mod api { &self, schedule1_index: types::merge_schedules::Schedule1Index, schedule2_index: types::merge_schedules::Schedule2Index, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Vesting", "merge_schedules", types::MergeSchedules { @@ -21770,9 +21861,9 @@ pub mod api { #[doc = " The minimum amount transferred to call `vested_transfer`."] pub fn min_vested_transfer( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u128> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u128> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Vesting", "MinVestedTransfer", [ @@ -21784,9 +21875,9 @@ pub mod api { } pub fn max_vesting_schedules( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Vesting", "MaxVestingSchedules", [ @@ -22014,8 +22105,9 @@ pub mod api { maybe_periodic: types::schedule::MaybePeriodic, priority: types::schedule::Priority, call: types::schedule::Call, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Scheduler", "schedule", types::Schedule { @@ -22037,8 +22129,8 @@ pub mod api { &self, when: types::cancel::When, index: types::cancel::Index, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Scheduler", "cancel", types::Cancel { when, index }, @@ -22058,8 +22150,9 @@ pub mod api { maybe_periodic: types::schedule_named::MaybePeriodic, priority: types::schedule_named::Priority, call: types::schedule_named::Call, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Scheduler", "schedule_named", types::ScheduleNamed { @@ -22081,8 +22174,9 @@ pub mod api { pub fn cancel_named( &self, id: types::cancel_named::Id, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Scheduler", "cancel_named", types::CancelNamed { id }, @@ -22100,8 +22194,9 @@ pub mod api { maybe_periodic: types::schedule_after::MaybePeriodic, priority: types::schedule_after::Priority, call: types::schedule_after::Call, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Scheduler", "schedule_after", types::ScheduleAfter { @@ -22125,9 +22220,9 @@ pub mod api { maybe_periodic: types::schedule_named_after::MaybePeriodic, priority: types::schedule_named_after::Priority, call: types::schedule_named_after::Call, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Scheduler", "schedule_named_after", types::ScheduleNamedAfter { @@ -22461,10 +22556,10 @@ pub mod api { #[doc = " The maximum weight that may be scheduled per block for any dispatchables."] pub fn maximum_weight( &self, - ) -> ::subxt::ext::subxt_core::constants::Address< + ) -> ::subxt::ext::subxt_core::constants::address::Address< runtime_types::sp_weights::weight_v2::Weight, > { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Scheduler", "MaximumWeight", [ @@ -22482,9 +22577,9 @@ pub mod api { #[doc = " higher limit under `runtime-benchmarks` feature."] pub fn max_scheduled_per_block( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Scheduler", "MaxScheduledPerBlock", [ @@ -22841,8 +22936,8 @@ pub mod api { real: types::proxy::Real, force_proxy_type: types::proxy::ForceProxyType, call: types::proxy::Call, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Proxy", "proxy", types::Proxy { @@ -22863,8 +22958,9 @@ pub mod api { delegate: types::add_proxy::Delegate, proxy_type: types::add_proxy::ProxyType, delay: types::add_proxy::Delay, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Proxy", "add_proxy", types::AddProxy { @@ -22886,8 +22982,9 @@ pub mod api { delegate: types::remove_proxy::Delegate, proxy_type: types::remove_proxy::ProxyType, delay: types::remove_proxy::Delay, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Proxy", "remove_proxy", types::RemoveProxy { @@ -22905,8 +23002,9 @@ pub mod api { #[doc = "See [`Pallet::remove_proxies`]."] pub fn remove_proxies( &self, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Proxy", "remove_proxies", types::RemoveProxies {}, @@ -22924,8 +23022,9 @@ pub mod api { proxy_type: types::create_pure::ProxyType, delay: types::create_pure::Delay, index: types::create_pure::Index, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Proxy", "create_pure", types::CreatePure { @@ -22948,8 +23047,9 @@ pub mod api { index: types::kill_pure::Index, height: types::kill_pure::Height, ext_index: types::kill_pure::ExtIndex, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Proxy", "kill_pure", types::KillPure { @@ -22971,8 +23071,9 @@ pub mod api { &self, real: types::announce::Real, call_hash: types::announce::CallHash, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Proxy", "announce", types::Announce { real, call_hash }, @@ -22989,9 +23090,9 @@ pub mod api { &self, real: types::remove_announcement::Real, call_hash: types::remove_announcement::CallHash, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Proxy", "remove_announcement", types::RemoveAnnouncement { real, call_hash }, @@ -23007,9 +23108,9 @@ pub mod api { &self, delegate: types::reject_announcement::Delegate, call_hash: types::reject_announcement::CallHash, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Proxy", "reject_announcement", types::RejectAnnouncement { @@ -23030,8 +23131,9 @@ pub mod api { real: types::proxy_announced::Real, force_proxy_type: types::proxy_announced::ForceProxyType, call: types::proxy_announced::Call, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Proxy", "proxy_announced", types::ProxyAnnounced { @@ -23333,9 +23435,9 @@ pub mod api { #[doc = " `sizeof(Balance)` bytes and whose key size is `sizeof(AccountId)` bytes."] pub fn proxy_deposit_base( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u128> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u128> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Proxy", "ProxyDepositBase", [ @@ -23352,9 +23454,9 @@ pub mod api { #[doc = " into account `32 + proxy_type.encode().len()` bytes of data."] pub fn proxy_deposit_factor( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u128> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u128> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Proxy", "ProxyDepositFactor", [ @@ -23367,9 +23469,9 @@ pub mod api { #[doc = " The maximum amount of proxies allowed for a single account."] pub fn max_proxies( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Proxy", "MaxProxies", [ @@ -23383,9 +23485,9 @@ pub mod api { #[doc = " The maximum amount of time-delayed announcements that are allowed to be pending."] pub fn max_pending( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Proxy", "MaxPending", [ @@ -23402,9 +23504,9 @@ pub mod api { #[doc = " bytes)."] pub fn announcement_deposit_base( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u128> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u128> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Proxy", "AnnouncementDepositBase", [ @@ -23420,9 +23522,9 @@ pub mod api { #[doc = " into a pre-existing storage value."] pub fn announcement_deposit_factor( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u128> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u128> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Proxy", "AnnouncementDepositFactor", [ @@ -23598,9 +23700,9 @@ pub mod api { &self, other_signatories: types::as_multi_threshold1::OtherSignatories, call: types::as_multi_threshold1::Call, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Multisig", "as_multi_threshold_1", types::AsMultiThreshold1 { @@ -23623,8 +23725,9 @@ pub mod api { maybe_timepoint: types::as_multi::MaybeTimepoint, call: types::as_multi::Call, max_weight: types::as_multi::MaxWeight, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Multisig", "as_multi", types::AsMulti { @@ -23650,8 +23753,9 @@ pub mod api { maybe_timepoint: types::approve_as_multi::MaybeTimepoint, call_hash: types::approve_as_multi::CallHash, max_weight: types::approve_as_multi::MaxWeight, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Multisig", "approve_as_multi", types::ApproveAsMulti { @@ -23675,8 +23779,9 @@ pub mod api { other_signatories: types::cancel_as_multi::OtherSignatories, timepoint: types::cancel_as_multi::Timepoint, call_hash: types::cancel_as_multi::CallHash, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Multisig", "cancel_as_multi", types::CancelAsMulti { @@ -23930,9 +24035,9 @@ pub mod api { #[doc = " `32 + sizeof(AccountId)` bytes."] pub fn deposit_base( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u128> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u128> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Multisig", "DepositBase", [ @@ -23947,9 +24052,9 @@ pub mod api { #[doc = " This is held for adding 32 bytes more into a pre-existing storage value."] pub fn deposit_factor( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u128> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u128> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Multisig", "DepositFactor", [ @@ -23962,9 +24067,9 @@ pub mod api { #[doc = " The maximum amount of signatories allowed in the multisig."] pub fn max_signatories( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Multisig", "MaxSignatories", [ @@ -24131,8 +24236,9 @@ pub mod api { pub fn note_preimage( &self, bytes: types::note_preimage::Bytes, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Preimage", "note_preimage", types::NotePreimage { bytes }, @@ -24147,8 +24253,9 @@ pub mod api { pub fn unnote_preimage( &self, hash: types::unnote_preimage::Hash, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Preimage", "unnote_preimage", types::UnnotePreimage { hash }, @@ -24164,8 +24271,9 @@ pub mod api { pub fn request_preimage( &self, hash: types::request_preimage::Hash, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Preimage", "request_preimage", types::RequestPreimage { hash }, @@ -24180,9 +24288,9 @@ pub mod api { pub fn unrequest_preimage( &self, hash: types::unrequest_preimage::Hash, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Preimage", "unrequest_preimage", types::UnrequestPreimage { hash }, @@ -24198,8 +24306,9 @@ pub mod api { pub fn ensure_updated( &self, hashes: types::ensure_updated::Hashes, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Preimage", "ensure_updated", types::EnsureUpdated { hashes }, @@ -24605,8 +24714,8 @@ pub mod api { &self, asset_kind: types::create::AssetKind, rate: types::create::Rate, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "AssetRate", "create", types::Create { @@ -24628,8 +24737,8 @@ pub mod api { &self, asset_kind: types::update::AssetKind, rate: types::update::Rate, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "AssetRate", "update", types::Update { @@ -24650,8 +24759,8 @@ pub mod api { pub fn remove( &self, asset_kind: types::remove::AssetKind, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "AssetRate", "remove", types::Remove { @@ -25097,8 +25206,9 @@ pub mod api { &self, value: types::propose_bounty::Value, description: types::propose_bounty::Description, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Bounties", "propose_bounty", types::ProposeBounty { value, description }, @@ -25113,8 +25223,9 @@ pub mod api { pub fn approve_bounty( &self, bounty_id: types::approve_bounty::BountyId, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Bounties", "approve_bounty", types::ApproveBounty { bounty_id }, @@ -25132,8 +25243,9 @@ pub mod api { bounty_id: types::propose_curator::BountyId, curator: types::propose_curator::Curator, fee: types::propose_curator::Fee, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Bounties", "propose_curator", types::ProposeCurator { @@ -25152,8 +25264,9 @@ pub mod api { pub fn unassign_curator( &self, bounty_id: types::unassign_curator::BountyId, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Bounties", "unassign_curator", types::UnassignCurator { bounty_id }, @@ -25169,8 +25282,9 @@ pub mod api { pub fn accept_curator( &self, bounty_id: types::accept_curator::BountyId, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Bounties", "accept_curator", types::AcceptCurator { bounty_id }, @@ -25186,8 +25300,9 @@ pub mod api { &self, bounty_id: types::award_bounty::BountyId, beneficiary: types::award_bounty::Beneficiary, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Bounties", "award_bounty", types::AwardBounty { @@ -25205,8 +25320,9 @@ pub mod api { pub fn claim_bounty( &self, bounty_id: types::claim_bounty::BountyId, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Bounties", "claim_bounty", types::ClaimBounty { bounty_id }, @@ -25222,8 +25338,9 @@ pub mod api { pub fn close_bounty( &self, bounty_id: types::close_bounty::BountyId, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Bounties", "close_bounty", types::CloseBounty { bounty_id }, @@ -25240,9 +25357,9 @@ pub mod api { &self, bounty_id: types::extend_bounty_expiry::BountyId, remark: types::extend_bounty_expiry::Remark, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Bounties", "extend_bounty_expiry", types::ExtendBountyExpiry { bounty_id, remark }, @@ -25698,9 +25815,9 @@ pub mod api { #[doc = " The amount held on deposit for placing a bounty proposal."] pub fn bounty_deposit_base( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u128> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u128> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Bounties", "BountyDepositBase", [ @@ -25713,9 +25830,9 @@ pub mod api { #[doc = " The delay period for which a bounty beneficiary need to wait before claim the payout."] pub fn bounty_deposit_payout_delay( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Bounties", "BountyDepositPayoutDelay", [ @@ -25729,9 +25846,9 @@ pub mod api { #[doc = " Bounty duration in blocks."] pub fn bounty_update_period( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Bounties", "BountyUpdatePeriod", [ @@ -25748,10 +25865,10 @@ pub mod api { #[doc = " `CuratorDepositMin`."] pub fn curator_deposit_multiplier( &self, - ) -> ::subxt::ext::subxt_core::constants::Address< + ) -> ::subxt::ext::subxt_core::constants::address::Address< runtime_types::sp_arithmetic::per_things::Permill, > { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Bounties", "CuratorDepositMultiplier", [ @@ -25764,10 +25881,10 @@ pub mod api { #[doc = " Maximum amount of funds that should be placed in a deposit for making a proposal."] pub fn curator_deposit_max( &self, - ) -> ::subxt::ext::subxt_core::constants::Address< + ) -> ::subxt::ext::subxt_core::constants::address::Address< ::core::option::Option<::core::primitive::u128>, > { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Bounties", "CuratorDepositMax", [ @@ -25781,10 +25898,10 @@ pub mod api { #[doc = " Minimum amount of funds that should be placed in a deposit for making a proposal."] pub fn curator_deposit_min( &self, - ) -> ::subxt::ext::subxt_core::constants::Address< + ) -> ::subxt::ext::subxt_core::constants::address::Address< ::core::option::Option<::core::primitive::u128>, > { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Bounties", "CuratorDepositMin", [ @@ -25798,9 +25915,9 @@ pub mod api { #[doc = " Minimum value for a bounty."] pub fn bounty_value_minimum( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u128> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u128> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Bounties", "BountyValueMinimum", [ @@ -25813,9 +25930,9 @@ pub mod api { #[doc = " The amount held on deposit per byte within the tip report reason or bounty description."] pub fn data_deposit_per_byte( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u128> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u128> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Bounties", "DataDepositPerByte", [ @@ -25830,9 +25947,9 @@ pub mod api { #[doc = " Benchmarks depend on this value, be sure to update weights file when changing this value"] pub fn maximum_reason_length( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Bounties", "MaximumReasonLength", [ @@ -26094,8 +26211,9 @@ pub mod api { parent_bounty_id: types::add_child_bounty::ParentBountyId, value: types::add_child_bounty::Value, description: types::add_child_bounty::Description, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "ChildBounties", "add_child_bounty", types::AddChildBounty { @@ -26118,8 +26236,9 @@ pub mod api { child_bounty_id: types::propose_curator::ChildBountyId, curator: types::propose_curator::Curator, fee: types::propose_curator::Fee, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "ChildBounties", "propose_curator", types::ProposeCurator { @@ -26140,8 +26259,9 @@ pub mod api { &self, parent_bounty_id: types::accept_curator::ParentBountyId, child_bounty_id: types::accept_curator::ChildBountyId, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "ChildBounties", "accept_curator", types::AcceptCurator { @@ -26161,8 +26281,9 @@ pub mod api { &self, parent_bounty_id: types::unassign_curator::ParentBountyId, child_bounty_id: types::unassign_curator::ChildBountyId, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "ChildBounties", "unassign_curator", types::UnassignCurator { @@ -26183,9 +26304,9 @@ pub mod api { parent_bounty_id: types::award_child_bounty::ParentBountyId, child_bounty_id: types::award_child_bounty::ChildBountyId, beneficiary: types::award_child_bounty::Beneficiary, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "ChildBounties", "award_child_bounty", types::AwardChildBounty { @@ -26205,9 +26326,9 @@ pub mod api { &self, parent_bounty_id: types::claim_child_bounty::ParentBountyId, child_bounty_id: types::claim_child_bounty::ChildBountyId, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "ChildBounties", "claim_child_bounty", types::ClaimChildBounty { @@ -26226,9 +26347,9 @@ pub mod api { &self, parent_bounty_id: types::close_child_bounty::ParentBountyId, child_bounty_id: types::close_child_bounty::ChildBountyId, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "ChildBounties", "close_child_bounty", types::CloseChildBounty { @@ -26650,9 +26771,9 @@ pub mod api { #[doc = " Maximum number of child bounties that can be added to a parent bounty."] pub fn max_active_child_bounty_count( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "ChildBounties", "MaxActiveChildBountyCount", [ @@ -26666,9 +26787,9 @@ pub mod api { #[doc = " Minimum value for a child-bounty."] pub fn child_bounty_value_minimum( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u128> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u128> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "ChildBounties", "ChildBountyValueMinimum", [ @@ -26892,8 +27013,9 @@ pub mod api { &self, amount: types::place_bid::Amount, duration: types::place_bid::Duration, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Nis", "place_bid", types::PlaceBid { amount, duration }, @@ -26910,8 +27032,9 @@ pub mod api { &self, amount: types::retract_bid::Amount, duration: types::retract_bid::Duration, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Nis", "retract_bid", types::RetractBid { amount, duration }, @@ -26925,8 +27048,9 @@ pub mod api { #[doc = "See [`Pallet::fund_deficit`]."] pub fn fund_deficit( &self, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Nis", "fund_deficit", types::FundDeficit {}, @@ -26943,8 +27067,9 @@ pub mod api { &self, index: types::thaw_private::Index, maybe_proportion: types::thaw_private::MaybeProportion, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Nis", "thaw_private", types::ThawPrivate { @@ -26962,8 +27087,9 @@ pub mod api { pub fn thaw_communal( &self, index: types::thaw_communal::Index, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Nis", "thaw_communal", types::ThawCommunal { index }, @@ -26979,8 +27105,9 @@ pub mod api { pub fn communify( &self, index: types::communify::Index, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Nis", "communify", types::Communify { index }, @@ -26996,8 +27123,9 @@ pub mod api { pub fn privatize( &self, index: types::privatize::Index, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Nis", "privatize", types::Privatize { index }, @@ -27395,10 +27523,10 @@ pub mod api { #[doc = " The treasury's pallet id, used for deriving its sovereign account ID."] pub fn pallet_id( &self, - ) -> ::subxt::ext::subxt_core::constants::Address< + ) -> ::subxt::ext::subxt_core::constants::address::Address< runtime_types::frame_support::PalletId, > { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Nis", "PalletId", [ @@ -27412,9 +27540,9 @@ pub mod api { #[doc = " this value multiplied by `Period`."] pub fn queue_count( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Nis", "QueueCount", [ @@ -27430,9 +27558,9 @@ pub mod api { #[doc = " Must be larger than zero."] pub fn max_queue_len( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Nis", "MaxQueueLen", [ @@ -27448,9 +27576,9 @@ pub mod api { #[doc = " Must be no greater than `MaxQueueLen`."] pub fn fifo_queue_len( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Nis", "FifoQueueLen", [ @@ -27465,9 +27593,9 @@ pub mod api { #[doc = " supported freezing durations that can be bid upon."] pub fn base_period( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Nis", "BasePeriod", [ @@ -27486,9 +27614,9 @@ pub mod api { #[doc = " or queue-filling attack."] pub fn min_bid( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u128> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u128> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Nis", "MinBid", [ @@ -27502,10 +27630,10 @@ pub mod api { #[doc = " receipt."] pub fn min_receipt( &self, - ) -> ::subxt::ext::subxt_core::constants::Address< + ) -> ::subxt::ext::subxt_core::constants::address::Address< runtime_types::sp_arithmetic::per_things::Perquintill, > { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Nis", "MinReceipt", [ @@ -27522,9 +27650,9 @@ pub mod api { #[doc = " the target."] pub fn intake_period( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Nis", "IntakePeriod", [ @@ -27540,10 +27668,10 @@ pub mod api { #[doc = " glut of bids."] pub fn max_intake_weight( &self, - ) -> ::subxt::ext::subxt_core::constants::Address< + ) -> ::subxt::ext::subxt_core::constants::address::Address< runtime_types::sp_weights::weight_v2::Weight, > { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Nis", "MaxIntakeWeight", [ @@ -27557,11 +27685,11 @@ pub mod api { #[doc = " The maximum proportion which may be thawed and the period over which it is reset."] pub fn thaw_throttle( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<( + ) -> ::subxt::ext::subxt_core::constants::address::Address<( runtime_types::sp_arithmetic::per_things::Perquintill, ::core::primitive::u32, )> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Nis", "ThawThrottle", [ @@ -27819,9 +27947,9 @@ pub mod api { &self, dest: types::transfer_allow_death::Dest, value: types::transfer_allow_death::Value, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "NisCounterpartBalances", "transfer_allow_death", types::TransferAllowDeath { dest, value }, @@ -27839,8 +27967,9 @@ pub mod api { source: types::force_transfer::Source, dest: types::force_transfer::Dest, value: types::force_transfer::Value, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "NisCounterpartBalances", "force_transfer", types::ForceTransfer { @@ -27860,9 +27989,9 @@ pub mod api { &self, dest: types::transfer_keep_alive::Dest, value: types::transfer_keep_alive::Value, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "NisCounterpartBalances", "transfer_keep_alive", types::TransferKeepAlive { dest, value }, @@ -27878,8 +28007,9 @@ pub mod api { &self, dest: types::transfer_all::Dest, keep_alive: types::transfer_all::KeepAlive, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "NisCounterpartBalances", "transfer_all", types::TransferAll { dest, keep_alive }, @@ -27895,8 +28025,9 @@ pub mod api { &self, who: types::force_unreserve::Who, amount: types::force_unreserve::Amount, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "NisCounterpartBalances", "force_unreserve", types::ForceUnreserve { who, amount }, @@ -27912,8 +28043,9 @@ pub mod api { pub fn upgrade_accounts( &self, who: types::upgrade_accounts::Who, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "NisCounterpartBalances", "upgrade_accounts", types::UpgradeAccounts { who }, @@ -27929,8 +28061,9 @@ pub mod api { &self, who: types::force_set_balance::Who, new_free: types::force_set_balance::NewFree, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "NisCounterpartBalances", "force_set_balance", types::ForceSetBalance { who, new_free }, @@ -28862,9 +28995,9 @@ pub mod api { #[doc = " Bottom line: Do yourself a favour and make it at least one!"] pub fn existential_deposit( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u128> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u128> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "NisCounterpartBalances", "ExistentialDeposit", [ @@ -28878,9 +29011,9 @@ pub mod api { #[doc = " Not strictly enforced, but used for weight estimation."] pub fn max_locks( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "NisCounterpartBalances", "MaxLocks", [ @@ -28894,9 +29027,9 @@ pub mod api { #[doc = " The maximum number of named reserves that can exist on an account."] pub fn max_reserves( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "NisCounterpartBalances", "MaxReserves", [ @@ -28910,9 +29043,9 @@ pub mod api { #[doc = " The maximum number of holds that can exist on an account at any time."] pub fn max_holds( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "NisCounterpartBalances", "MaxHolds", [ @@ -28926,9 +29059,9 @@ pub mod api { #[doc = " The maximum number of individual freeze locks that can exist on an account at any time."] pub fn max_freezes( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "NisCounterpartBalances", "MaxFreezes", [ @@ -30140,9 +30273,10 @@ pub mod api { pub fn set_validation_upgrade_cooldown( &self, new: types::set_validation_upgrade_cooldown::New, - ) -> ::subxt::ext::subxt_core::tx::Payload - { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload< + types::SetValidationUpgradeCooldown, + > { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Configuration", "set_validation_upgrade_cooldown", types::SetValidationUpgradeCooldown { new }, @@ -30158,9 +30292,9 @@ pub mod api { pub fn set_validation_upgrade_delay( &self, new: types::set_validation_upgrade_delay::New, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Configuration", "set_validation_upgrade_delay", types::SetValidationUpgradeDelay { new }, @@ -30175,9 +30309,9 @@ pub mod api { pub fn set_code_retention_period( &self, new: types::set_code_retention_period::New, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Configuration", "set_code_retention_period", types::SetCodeRetentionPeriod { new }, @@ -30193,8 +30327,9 @@ pub mod api { pub fn set_max_code_size( &self, new: types::set_max_code_size::New, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Configuration", "set_max_code_size", types::SetMaxCodeSize { new }, @@ -30210,8 +30345,9 @@ pub mod api { pub fn set_max_pov_size( &self, new: types::set_max_pov_size::New, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Configuration", "set_max_pov_size", types::SetMaxPovSize { new }, @@ -30226,9 +30362,9 @@ pub mod api { pub fn set_max_head_data_size( &self, new: types::set_max_head_data_size::New, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Configuration", "set_max_head_data_size", types::SetMaxHeadDataSize { new }, @@ -30244,9 +30380,9 @@ pub mod api { pub fn set_on_demand_cores( &self, new: types::set_on_demand_cores::New, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Configuration", "set_on_demand_cores", types::SetOnDemandCores { new }, @@ -30262,9 +30398,9 @@ pub mod api { pub fn set_on_demand_retries( &self, new: types::set_on_demand_retries::New, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Configuration", "set_on_demand_retries", types::SetOnDemandRetries { new }, @@ -30280,9 +30416,9 @@ pub mod api { pub fn set_group_rotation_frequency( &self, new: types::set_group_rotation_frequency::New, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Configuration", "set_group_rotation_frequency", types::SetGroupRotationFrequency { new }, @@ -30297,9 +30433,9 @@ pub mod api { pub fn set_paras_availability_period( &self, new: types::set_paras_availability_period::New, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Configuration", "set_paras_availability_period", types::SetParasAvailabilityPeriod { new }, @@ -30314,9 +30450,9 @@ pub mod api { pub fn set_scheduling_lookahead( &self, new: types::set_scheduling_lookahead::New, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Configuration", "set_scheduling_lookahead", types::SetSchedulingLookahead { new }, @@ -30332,9 +30468,9 @@ pub mod api { pub fn set_max_validators_per_core( &self, new: types::set_max_validators_per_core::New, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Configuration", "set_max_validators_per_core", types::SetMaxValidatorsPerCore { new }, @@ -30350,9 +30486,9 @@ pub mod api { pub fn set_max_validators( &self, new: types::set_max_validators::New, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Configuration", "set_max_validators", types::SetMaxValidators { new }, @@ -30368,9 +30504,9 @@ pub mod api { pub fn set_dispute_period( &self, new: types::set_dispute_period::New, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Configuration", "set_dispute_period", types::SetDisputePeriod { new }, @@ -30386,10 +30522,10 @@ pub mod api { pub fn set_dispute_post_conclusion_acceptance_period( &self, new: types::set_dispute_post_conclusion_acceptance_period::New, - ) -> ::subxt::ext::subxt_core::tx::Payload< + ) -> ::subxt::ext::subxt_core::tx::payload::Payload< types::SetDisputePostConclusionAcceptancePeriod, > { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Configuration", "set_dispute_post_conclusion_acceptance_period", types::SetDisputePostConclusionAcceptancePeriod { new }, @@ -30405,8 +30541,9 @@ pub mod api { pub fn set_no_show_slots( &self, new: types::set_no_show_slots::New, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Configuration", "set_no_show_slots", types::SetNoShowSlots { new }, @@ -30421,9 +30558,9 @@ pub mod api { pub fn set_n_delay_tranches( &self, new: types::set_n_delay_tranches::New, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Configuration", "set_n_delay_tranches", types::SetNDelayTranches { new }, @@ -30439,9 +30576,9 @@ pub mod api { pub fn set_zeroth_delay_tranche_width( &self, new: types::set_zeroth_delay_tranche_width::New, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Configuration", "set_zeroth_delay_tranche_width", types::SetZerothDelayTrancheWidth { new }, @@ -30456,9 +30593,9 @@ pub mod api { pub fn set_needed_approvals( &self, new: types::set_needed_approvals::New, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Configuration", "set_needed_approvals", types::SetNeededApprovals { new }, @@ -30473,9 +30610,9 @@ pub mod api { pub fn set_relay_vrf_modulo_samples( &self, new: types::set_relay_vrf_modulo_samples::New, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Configuration", "set_relay_vrf_modulo_samples", types::SetRelayVrfModuloSamples { new }, @@ -30491,9 +30628,9 @@ pub mod api { pub fn set_max_upward_queue_count( &self, new: types::set_max_upward_queue_count::New, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Configuration", "set_max_upward_queue_count", types::SetMaxUpwardQueueCount { new }, @@ -30509,9 +30646,9 @@ pub mod api { pub fn set_max_upward_queue_size( &self, new: types::set_max_upward_queue_size::New, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Configuration", "set_max_upward_queue_size", types::SetMaxUpwardQueueSize { new }, @@ -30527,9 +30664,9 @@ pub mod api { pub fn set_max_downward_message_size( &self, new: types::set_max_downward_message_size::New, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Configuration", "set_max_downward_message_size", types::SetMaxDownwardMessageSize { new }, @@ -30544,9 +30681,9 @@ pub mod api { pub fn set_max_upward_message_size( &self, new: types::set_max_upward_message_size::New, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Configuration", "set_max_upward_message_size", types::SetMaxUpwardMessageSize { new }, @@ -30562,9 +30699,10 @@ pub mod api { pub fn set_max_upward_message_num_per_candidate( &self, new: types::set_max_upward_message_num_per_candidate::New, - ) -> ::subxt::ext::subxt_core::tx::Payload - { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload< + types::SetMaxUpwardMessageNumPerCandidate, + > { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Configuration", "set_max_upward_message_num_per_candidate", types::SetMaxUpwardMessageNumPerCandidate { new }, @@ -30579,9 +30717,9 @@ pub mod api { pub fn set_hrmp_open_request_ttl( &self, new: types::set_hrmp_open_request_ttl::New, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Configuration", "set_hrmp_open_request_ttl", types::SetHrmpOpenRequestTtl { new }, @@ -30596,9 +30734,9 @@ pub mod api { pub fn set_hrmp_sender_deposit( &self, new: types::set_hrmp_sender_deposit::New, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Configuration", "set_hrmp_sender_deposit", types::SetHrmpSenderDeposit { new }, @@ -30613,9 +30751,9 @@ pub mod api { pub fn set_hrmp_recipient_deposit( &self, new: types::set_hrmp_recipient_deposit::New, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Configuration", "set_hrmp_recipient_deposit", types::SetHrmpRecipientDeposit { new }, @@ -30631,9 +30769,9 @@ pub mod api { pub fn set_hrmp_channel_max_capacity( &self, new: types::set_hrmp_channel_max_capacity::New, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Configuration", "set_hrmp_channel_max_capacity", types::SetHrmpChannelMaxCapacity { new }, @@ -30649,9 +30787,9 @@ pub mod api { pub fn set_hrmp_channel_max_total_size( &self, new: types::set_hrmp_channel_max_total_size::New, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Configuration", "set_hrmp_channel_max_total_size", types::SetHrmpChannelMaxTotalSize { new }, @@ -30666,9 +30804,10 @@ pub mod api { pub fn set_hrmp_max_parachain_inbound_channels( &self, new: types::set_hrmp_max_parachain_inbound_channels::New, - ) -> ::subxt::ext::subxt_core::tx::Payload - { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload< + types::SetHrmpMaxParachainInboundChannels, + > { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Configuration", "set_hrmp_max_parachain_inbound_channels", types::SetHrmpMaxParachainInboundChannels { new }, @@ -30683,9 +30822,10 @@ pub mod api { pub fn set_hrmp_channel_max_message_size( &self, new: types::set_hrmp_channel_max_message_size::New, - ) -> ::subxt::ext::subxt_core::tx::Payload - { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload< + types::SetHrmpChannelMaxMessageSize, + > { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Configuration", "set_hrmp_channel_max_message_size", types::SetHrmpChannelMaxMessageSize { new }, @@ -30701,9 +30841,10 @@ pub mod api { pub fn set_hrmp_max_parachain_outbound_channels( &self, new: types::set_hrmp_max_parachain_outbound_channels::New, - ) -> ::subxt::ext::subxt_core::tx::Payload - { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload< + types::SetHrmpMaxParachainOutboundChannels, + > { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Configuration", "set_hrmp_max_parachain_outbound_channels", types::SetHrmpMaxParachainOutboundChannels { new }, @@ -30718,9 +30859,10 @@ pub mod api { pub fn set_hrmp_max_message_num_per_candidate( &self, new: types::set_hrmp_max_message_num_per_candidate::New, - ) -> ::subxt::ext::subxt_core::tx::Payload - { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload< + types::SetHrmpMaxMessageNumPerCandidate, + > { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Configuration", "set_hrmp_max_message_num_per_candidate", types::SetHrmpMaxMessageNumPerCandidate { new }, @@ -30735,8 +30877,9 @@ pub mod api { pub fn set_pvf_voting_ttl( &self, new: types::set_pvf_voting_ttl::New, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Configuration", "set_pvf_voting_ttl", types::SetPvfVotingTtl { new }, @@ -30752,9 +30895,10 @@ pub mod api { pub fn set_minimum_validation_upgrade_delay( &self, new: types::set_minimum_validation_upgrade_delay::New, - ) -> ::subxt::ext::subxt_core::tx::Payload - { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload< + types::SetMinimumValidationUpgradeDelay, + > { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Configuration", "set_minimum_validation_upgrade_delay", types::SetMinimumValidationUpgradeDelay { new }, @@ -30770,9 +30914,9 @@ pub mod api { pub fn set_bypass_consistency_check( &self, new: types::set_bypass_consistency_check::New, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Configuration", "set_bypass_consistency_check", types::SetBypassConsistencyCheck { new }, @@ -30788,9 +30932,9 @@ pub mod api { pub fn set_async_backing_params( &self, new: types::set_async_backing_params::New, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Configuration", "set_async_backing_params", types::SetAsyncBackingParams { new }, @@ -30806,9 +30950,9 @@ pub mod api { pub fn set_executor_params( &self, new: types::set_executor_params::New, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Configuration", "set_executor_params", types::SetExecutorParams { new }, @@ -30823,9 +30967,9 @@ pub mod api { pub fn set_on_demand_base_fee( &self, new: types::set_on_demand_base_fee::New, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Configuration", "set_on_demand_base_fee", types::SetOnDemandBaseFee { new }, @@ -30840,9 +30984,9 @@ pub mod api { pub fn set_on_demand_fee_variability( &self, new: types::set_on_demand_fee_variability::New, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Configuration", "set_on_demand_fee_variability", types::SetOnDemandFeeVariability { new }, @@ -30858,9 +31002,9 @@ pub mod api { pub fn set_on_demand_queue_max_size( &self, new: types::set_on_demand_queue_max_size::New, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Configuration", "set_on_demand_queue_max_size", types::SetOnDemandQueueMaxSize { new }, @@ -30875,9 +31019,10 @@ pub mod api { pub fn set_on_demand_target_queue_utilization( &self, new: types::set_on_demand_target_queue_utilization::New, - ) -> ::subxt::ext::subxt_core::tx::Payload - { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload< + types::SetOnDemandTargetQueueUtilization, + > { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Configuration", "set_on_demand_target_queue_utilization", types::SetOnDemandTargetQueueUtilization { new }, @@ -30893,8 +31038,9 @@ pub mod api { pub fn set_on_demand_ttl( &self, new: types::set_on_demand_ttl::New, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Configuration", "set_on_demand_ttl", types::SetOnDemandTtl { new }, @@ -30910,9 +31056,9 @@ pub mod api { pub fn set_minimum_backing_votes( &self, new: types::set_minimum_backing_votes::New, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Configuration", "set_minimum_backing_votes", types::SetMinimumBackingVotes { new }, @@ -31508,8 +31654,8 @@ pub mod api { pub fn enter( &self, data: types::enter::Data, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "ParaInherent", "enter", types::Enter { data }, @@ -32010,9 +32156,9 @@ pub mod api { &self, para: types::force_set_current_code::Para, new_code: types::force_set_current_code::NewCode, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Paras", "force_set_current_code", types::ForceSetCurrentCode { para, new_code }, @@ -32029,9 +32175,9 @@ pub mod api { &self, para: types::force_set_current_head::Para, new_head: types::force_set_current_head::NewHead, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Paras", "force_set_current_head", types::ForceSetCurrentHead { para, new_head }, @@ -32049,9 +32195,9 @@ pub mod api { para: types::force_schedule_code_upgrade::Para, new_code: types::force_schedule_code_upgrade::NewCode, relay_parent_number: types::force_schedule_code_upgrade::RelayParentNumber, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Paras", "force_schedule_code_upgrade", types::ForceScheduleCodeUpgrade { @@ -32072,9 +32218,9 @@ pub mod api { &self, para: types::force_note_new_head::Para, new_head: types::force_note_new_head::NewHead, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Paras", "force_note_new_head", types::ForceNoteNewHead { para, new_head }, @@ -32089,9 +32235,9 @@ pub mod api { pub fn force_queue_action( &self, para: types::force_queue_action::Para, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Paras", "force_queue_action", types::ForceQueueAction { para }, @@ -32107,9 +32253,9 @@ pub mod api { pub fn add_trusted_validation_code( &self, validation_code: types::add_trusted_validation_code::ValidationCode, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Paras", "add_trusted_validation_code", types::AddTrustedValidationCode { validation_code }, @@ -32125,9 +32271,9 @@ pub mod api { pub fn poke_unused_validation_code( &self, validation_code_hash: types::poke_unused_validation_code::ValidationCodeHash, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Paras", "poke_unused_validation_code", types::PokeUnusedValidationCode { @@ -32145,9 +32291,9 @@ pub mod api { &self, stmt: types::include_pvf_check_statement::Stmt, signature: types::include_pvf_check_statement::Signature, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Paras", "include_pvf_check_statement", types::IncludePvfCheckStatement { stmt, signature }, @@ -32164,9 +32310,9 @@ pub mod api { &self, para: types::force_set_most_recent_context::Para, context: types::force_set_most_recent_context::Context, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Paras", "force_set_most_recent_context", types::ForceSetMostRecentContext { para, context }, @@ -33450,9 +33596,9 @@ pub mod api { impl ConstantsApi { pub fn unsigned_priority( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u64> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u64> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Paras", "UnsignedPriority", [ @@ -33510,8 +33656,9 @@ pub mod api { pub fn force_approve( &self, up_to: types::force_approve::UpTo, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Initializer", "force_approve", types::ForceApprove { up_to }, @@ -34094,9 +34241,9 @@ pub mod api { recipient: types::hrmp_init_open_channel::Recipient, proposed_max_capacity: types::hrmp_init_open_channel::ProposedMaxCapacity, proposed_max_message_size : types :: hrmp_init_open_channel :: ProposedMaxMessageSize, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Hrmp", "hrmp_init_open_channel", types::HrmpInitOpenChannel { @@ -34116,9 +34263,9 @@ pub mod api { pub fn hrmp_accept_open_channel( &self, sender: types::hrmp_accept_open_channel::Sender, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Hrmp", "hrmp_accept_open_channel", types::HrmpAcceptOpenChannel { sender }, @@ -34133,9 +34280,9 @@ pub mod api { pub fn hrmp_close_channel( &self, channel_id: types::hrmp_close_channel::ChannelId, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Hrmp", "hrmp_close_channel", types::HrmpCloseChannel { channel_id }, @@ -34153,8 +34300,9 @@ pub mod api { para: types::force_clean_hrmp::Para, num_inbound: types::force_clean_hrmp::NumInbound, num_outbound: types::force_clean_hrmp::NumOutbound, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Hrmp", "force_clean_hrmp", types::ForceCleanHrmp { @@ -34173,9 +34321,9 @@ pub mod api { pub fn force_process_hrmp_open( &self, channels: types::force_process_hrmp_open::Channels, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Hrmp", "force_process_hrmp_open", types::ForceProcessHrmpOpen { channels }, @@ -34191,9 +34339,9 @@ pub mod api { pub fn force_process_hrmp_close( &self, channels: types::force_process_hrmp_close::Channels, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Hrmp", "force_process_hrmp_close", types::ForceProcessHrmpClose { channels }, @@ -34210,9 +34358,9 @@ pub mod api { &self, channel_id: types::hrmp_cancel_open_request::ChannelId, open_requests: types::hrmp_cancel_open_request::OpenRequests, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Hrmp", "hrmp_cancel_open_request", types::HrmpCancelOpenRequest { @@ -34233,9 +34381,9 @@ pub mod api { recipient: types::force_open_hrmp_channel::Recipient, max_capacity: types::force_open_hrmp_channel::MaxCapacity, max_message_size: types::force_open_hrmp_channel::MaxMessageSize, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Hrmp", "force_open_hrmp_channel", types::ForceOpenHrmpChannel { @@ -34256,9 +34404,9 @@ pub mod api { &self, sender: types::establish_system_channel::Sender, recipient: types::establish_system_channel::Recipient, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Hrmp", "establish_system_channel", types::EstablishSystemChannel { sender, recipient }, @@ -34274,9 +34422,9 @@ pub mod api { &self, sender: types::poke_channel_deposits::Sender, recipient: types::poke_channel_deposits::Recipient, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Hrmp", "poke_channel_deposits", types::PokeChannelDeposits { sender, recipient }, @@ -35443,8 +35591,9 @@ pub mod api { #[doc = "See [`Pallet::force_unfreeze`]."] pub fn force_unfreeze( &self, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "ParasDisputes", "force_unfreeze", types::ForceUnfreeze {}, @@ -35944,9 +36093,9 @@ pub mod api { &self, dispute_proof: types::report_dispute_lost_unsigned::DisputeProof, key_owner_proof: types::report_dispute_lost_unsigned::KeyOwnerProof, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "ParasSlashing", "report_dispute_lost_unsigned", types::ReportDisputeLostUnsigned { @@ -36202,8 +36351,9 @@ pub mod api { &self, message_origin: types::reap_page::MessageOrigin, page_index: types::reap_page::PageIndex, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "MessageQueue", "reap_page", types::ReapPage { @@ -36224,9 +36374,9 @@ pub mod api { page: types::execute_overweight::Page, index: types::execute_overweight::Index, weight_limit: types::execute_overweight::WeightLimit, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "MessageQueue", "execute_overweight", types::ExecuteOverweight { @@ -36555,9 +36705,9 @@ pub mod api { #[doc = " size is slightly lower than this as defined by [`MaxMessageLenOf`]."] pub fn heap_size( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "MessageQueue", "HeapSize", [ @@ -36573,9 +36723,9 @@ pub mod api { #[doc = " dropped, even if they contain unprocessed overweight messages."] pub fn max_stale( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "MessageQueue", "MaxStale", [ @@ -36593,10 +36743,10 @@ pub mod api { #[doc = " `ServiceQueues::service_queues` manually."] pub fn service_weight( &self, - ) -> ::subxt::ext::subxt_core::constants::Address< + ) -> ::subxt::ext::subxt_core::constants::address::Address< ::core::option::Option, > { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "MessageQueue", "ServiceWeight", [ @@ -36700,9 +36850,9 @@ pub mod api { &self, max_amount: types::place_order_allow_death::MaxAmount, para_id: types::place_order_allow_death::ParaId, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "OnDemandAssignmentProvider", "place_order_allow_death", types::PlaceOrderAllowDeath { @@ -36722,9 +36872,9 @@ pub mod api { &self, max_amount: types::place_order_keep_alive::MaxAmount, para_id: types::place_order_keep_alive::ParaId, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "OnDemandAssignmentProvider", "place_order_keep_alive", types::PlaceOrderKeepAlive { @@ -36915,10 +37065,10 @@ pub mod api { #[doc = " The default value for the spot traffic multiplier."] pub fn traffic_default_value( &self, - ) -> ::subxt::ext::subxt_core::constants::Address< + ) -> ::subxt::ext::subxt_core::constants::address::Address< runtime_types::sp_arithmetic::fixed_point::FixedU128, > { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "OnDemandAssignmentProvider", "TrafficDefaultValue", [ @@ -37210,8 +37360,9 @@ pub mod api { id: types::register::Id, genesis_head: types::register::GenesisHead, validation_code: types::register::ValidationCode, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Registrar", "register", types::Register { @@ -37234,8 +37385,9 @@ pub mod api { id: types::force_register::Id, genesis_head: types::force_register::GenesisHead, validation_code: types::force_register::ValidationCode, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Registrar", "force_register", types::ForceRegister { @@ -37257,8 +37409,9 @@ pub mod api { pub fn deregister( &self, id: types::deregister::Id, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Registrar", "deregister", types::Deregister { id }, @@ -37274,8 +37427,8 @@ pub mod api { &self, id: types::swap::Id, other: types::swap::Other, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Registrar", "swap", types::Swap { id, other }, @@ -37291,8 +37444,9 @@ pub mod api { pub fn remove_lock( &self, para: types::remove_lock::Para, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Registrar", "remove_lock", types::RemoveLock { para }, @@ -37304,8 +37458,11 @@ pub mod api { ) } #[doc = "See [`Pallet::reserve`]."] - pub fn reserve(&self) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + pub fn reserve( + &self, + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Registrar", "reserve", types::Reserve {}, @@ -37320,8 +37477,9 @@ pub mod api { pub fn add_lock( &self, para: types::add_lock::Para, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Registrar", "add_lock", types::AddLock { para }, @@ -37337,9 +37495,9 @@ pub mod api { &self, para: types::schedule_code_upgrade::Para, new_code: types::schedule_code_upgrade::NewCode, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Registrar", "schedule_code_upgrade", types::ScheduleCodeUpgrade { para, new_code }, @@ -37356,8 +37514,9 @@ pub mod api { &self, para: types::set_current_head::Para, new_head: types::set_current_head::NewHead, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Registrar", "set_current_head", types::SetCurrentHead { para, new_head }, @@ -37627,9 +37786,9 @@ pub mod api { #[doc = " This should include the cost for storing the genesis head and validation code."] pub fn para_deposit( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u128> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u128> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Registrar", "ParaDeposit", [ @@ -37642,9 +37801,9 @@ pub mod api { #[doc = " The deposit to be paid per byte stored on chain."] pub fn data_deposit_per_byte( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u128> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u128> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Registrar", "DataDepositPerByte", [ @@ -37767,8 +37926,9 @@ pub mod api { amount: types::force_lease::Amount, period_begin: types::force_lease::PeriodBegin, period_count: types::force_lease::PeriodCount, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Slots", "force_lease", types::ForceLease { @@ -37790,8 +37950,9 @@ pub mod api { pub fn clear_all_leases( &self, para: types::clear_all_leases::Para, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Slots", "clear_all_leases", types::ClearAllLeases { para }, @@ -37806,8 +37967,9 @@ pub mod api { pub fn trigger_onboard( &self, para: types::trigger_onboard::Para, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Slots", "trigger_onboard", types::TriggerOnboard { para }, @@ -37986,9 +38148,9 @@ pub mod api { #[doc = " The number of blocks over which a single period lasts."] pub fn lease_period( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Slots", "LeasePeriod", [ @@ -38002,9 +38164,9 @@ pub mod api { #[doc = " The number of blocks to offset each lease period by."] pub fn lease_offset( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Slots", "LeaseOffset", [ @@ -38128,8 +38290,9 @@ pub mod api { &self, duration: types::new_auction::Duration, lease_period_index: types::new_auction::LeasePeriodIndex, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Auctions", "new_auction", types::NewAuction { @@ -38152,8 +38315,8 @@ pub mod api { first_slot: types::bid::FirstSlot, last_slot: types::bid::LastSlot, amount: types::bid::Amount, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Auctions", "bid", types::Bid { @@ -38173,8 +38336,9 @@ pub mod api { #[doc = "See [`Pallet::cancel_auction`]."] pub fn cancel_auction( &self, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Auctions", "cancel_auction", types::CancelAuction {}, @@ -38600,9 +38764,9 @@ pub mod api { #[doc = " The number of blocks over which an auction may be retroactively ended."] pub fn ending_period( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Auctions", "EndingPeriod", [ @@ -38618,9 +38782,9 @@ pub mod api { #[doc = " `EndingPeriod` / `SampleLength` = Total # of Samples"] pub fn sample_length( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Auctions", "SampleLength", [ @@ -38633,9 +38797,9 @@ pub mod api { } pub fn slot_range_count( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Auctions", "SlotRangeCount", [ @@ -38648,9 +38812,9 @@ pub mod api { } pub fn lease_periods_per_slot( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Auctions", "LeasePeriodsPerSlot", [ @@ -38974,8 +39138,8 @@ pub mod api { last_period: types::create::LastPeriod, end: types::create::End, verifier: types::create::Verifier, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Crowdloan", "create", types::Create { @@ -38999,8 +39163,9 @@ pub mod api { index: types::contribute::Index, value: types::contribute::Value, signature: types::contribute::Signature, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Crowdloan", "contribute", types::Contribute { @@ -39021,8 +39186,9 @@ pub mod api { &self, who: types::withdraw::Who, index: types::withdraw::Index, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Crowdloan", "withdraw", types::Withdraw { who, index }, @@ -39037,8 +39203,8 @@ pub mod api { pub fn refund( &self, index: types::refund::Index, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Crowdloan", "refund", types::Refund { index }, @@ -39054,8 +39220,9 @@ pub mod api { pub fn dissolve( &self, index: types::dissolve::Index, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Crowdloan", "dissolve", types::Dissolve { index }, @@ -39076,8 +39243,8 @@ pub mod api { last_period: types::edit::LastPeriod, end: types::edit::End, verifier: types::edit::Verifier, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Crowdloan", "edit", types::Edit { @@ -39101,8 +39268,9 @@ pub mod api { &self, index: types::add_memo::Index, memo: types::add_memo::Memo, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Crowdloan", "add_memo", types::AddMemo { index, memo }, @@ -39118,8 +39286,8 @@ pub mod api { pub fn poke( &self, index: types::poke::Index, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Crowdloan", "poke", types::Poke { index }, @@ -39136,8 +39304,9 @@ pub mod api { &self, index: types::contribute_all::Index, signature: types::contribute_all::Signature, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Crowdloan", "contribute_all", types::ContributeAll { index, signature }, @@ -39547,10 +39716,10 @@ pub mod api { #[doc = " `PalletId(*b\"py/cfund\")`"] pub fn pallet_id( &self, - ) -> ::subxt::ext::subxt_core::constants::Address< + ) -> ::subxt::ext::subxt_core::constants::address::Address< runtime_types::frame_support::PalletId, > { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Crowdloan", "PalletId", [ @@ -39564,9 +39733,9 @@ pub mod api { #[doc = " at least `ExistentialDeposit`."] pub fn min_contribution( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u128> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u128> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Crowdloan", "MinContribution", [ @@ -39579,9 +39748,9 @@ pub mod api { #[doc = " Max number of storage keys to remove per extrinsic call."] pub fn remove_keys_limit( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "Crowdloan", "RemoveKeysLimit", [ @@ -39960,8 +40129,8 @@ pub mod api { &self, dest: types::send::Dest, message: types::send::Message, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "XcmPallet", "send", types::Send { @@ -39982,8 +40151,9 @@ pub mod api { beneficiary: types::teleport_assets::Beneficiary, assets: types::teleport_assets::Assets, fee_asset_item: types::teleport_assets::FeeAssetItem, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "XcmPallet", "teleport_assets", types::TeleportAssets { @@ -40008,9 +40178,9 @@ pub mod api { beneficiary: types::reserve_transfer_assets::Beneficiary, assets: types::reserve_transfer_assets::Assets, fee_asset_item: types::reserve_transfer_assets::FeeAssetItem, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "XcmPallet", "reserve_transfer_assets", types::ReserveTransferAssets { @@ -40033,8 +40203,9 @@ pub mod api { &self, message: types::execute::Message, max_weight: types::execute::MaxWeight, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "XcmPallet", "execute", types::Execute { @@ -40053,8 +40224,9 @@ pub mod api { &self, location: types::force_xcm_version::Location, version: types::force_xcm_version::Version, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "XcmPallet", "force_xcm_version", types::ForceXcmVersion { @@ -40072,9 +40244,9 @@ pub mod api { pub fn force_default_xcm_version( &self, maybe_xcm_version: types::force_default_xcm_version::MaybeXcmVersion, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "XcmPallet", "force_default_xcm_version", types::ForceDefaultXcmVersion { maybe_xcm_version }, @@ -40090,9 +40262,10 @@ pub mod api { pub fn force_subscribe_version_notify( &self, location: types::force_subscribe_version_notify::Location, - ) -> ::subxt::ext::subxt_core::tx::Payload - { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload< + types::ForceSubscribeVersionNotify, + > { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "XcmPallet", "force_subscribe_version_notify", types::ForceSubscribeVersionNotify { @@ -40109,9 +40282,10 @@ pub mod api { pub fn force_unsubscribe_version_notify( &self, location: types::force_unsubscribe_version_notify::Location, - ) -> ::subxt::ext::subxt_core::tx::Payload - { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload< + types::ForceUnsubscribeVersionNotify, + > { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "XcmPallet", "force_unsubscribe_version_notify", types::ForceUnsubscribeVersionNotify { @@ -40133,9 +40307,10 @@ pub mod api { assets: types::limited_reserve_transfer_assets::Assets, fee_asset_item: types::limited_reserve_transfer_assets::FeeAssetItem, weight_limit: types::limited_reserve_transfer_assets::WeightLimit, - ) -> ::subxt::ext::subxt_core::tx::Payload - { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload< + types::LimitedReserveTransferAssets, + > { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "XcmPallet", "limited_reserve_transfer_assets", types::LimitedReserveTransferAssets { @@ -40163,9 +40338,9 @@ pub mod api { assets: types::limited_teleport_assets::Assets, fee_asset_item: types::limited_teleport_assets::FeeAssetItem, weight_limit: types::limited_teleport_assets::WeightLimit, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "XcmPallet", "limited_teleport_assets", types::LimitedTeleportAssets { @@ -40189,8 +40364,9 @@ pub mod api { pub fn force_suspension( &self, suspended: types::force_suspension::Suspended, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "XcmPallet", "force_suspension", types::ForceSuspension { suspended }, @@ -41751,9 +41927,9 @@ pub mod api { &self, id: types::sudo_schedule_para_initialize::Id, genesis: types::sudo_schedule_para_initialize::Genesis, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "ParasSudoWrapper", "sudo_schedule_para_initialize", types::SudoScheduleParaInitialize { id, genesis }, @@ -41768,9 +41944,9 @@ pub mod api { pub fn sudo_schedule_para_cleanup( &self, id: types::sudo_schedule_para_cleanup::Id, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "ParasSudoWrapper", "sudo_schedule_para_cleanup", types::SudoScheduleParaCleanup { id }, @@ -41785,9 +41961,10 @@ pub mod api { pub fn sudo_schedule_parathread_upgrade( &self, id: types::sudo_schedule_parathread_upgrade::Id, - ) -> ::subxt::ext::subxt_core::tx::Payload - { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload< + types::SudoScheduleParathreadUpgrade, + > { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "ParasSudoWrapper", "sudo_schedule_parathread_upgrade", types::SudoScheduleParathreadUpgrade { id }, @@ -41803,9 +41980,10 @@ pub mod api { pub fn sudo_schedule_parachain_downgrade( &self, id: types::sudo_schedule_parachain_downgrade::Id, - ) -> ::subxt::ext::subxt_core::tx::Payload - { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload< + types::SudoScheduleParachainDowngrade, + > { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "ParasSudoWrapper", "sudo_schedule_parachain_downgrade", types::SudoScheduleParachainDowngrade { id }, @@ -41822,9 +42000,9 @@ pub mod api { &self, id: types::sudo_queue_downward_xcm::Id, xcm: types::sudo_queue_downward_xcm::Xcm, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "ParasSudoWrapper", "sudo_queue_downward_xcm", types::SudoQueueDownwardXcm { @@ -41846,9 +42024,9 @@ pub mod api { recipient: types::sudo_establish_hrmp_channel::Recipient, max_capacity: types::sudo_establish_hrmp_channel::MaxCapacity, max_message_size: types::sudo_establish_hrmp_channel::MaxMessageSize, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "ParasSudoWrapper", "sudo_establish_hrmp_channel", types::SudoEstablishHrmpChannel { @@ -42019,9 +42197,9 @@ pub mod api { pub fn assign_perm_parachain_slot( &self, id: types::assign_perm_parachain_slot::Id, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "AssignedSlots", "assign_perm_parachain_slot", types::AssignPermParachainSlot { id }, @@ -42037,9 +42215,9 @@ pub mod api { &self, id: types::assign_temp_parachain_slot::Id, lease_period_start: types::assign_temp_parachain_slot::LeasePeriodStart, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "AssignedSlots", "assign_temp_parachain_slot", types::AssignTempParachainSlot { @@ -42058,9 +42236,9 @@ pub mod api { pub fn unassign_parachain_slot( &self, id: types::unassign_parachain_slot::Id, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "AssignedSlots", "unassign_parachain_slot", types::UnassignParachainSlot { id }, @@ -42076,9 +42254,9 @@ pub mod api { pub fn set_max_permanent_slots( &self, slots: types::set_max_permanent_slots::Slots, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "AssignedSlots", "set_max_permanent_slots", types::SetMaxPermanentSlots { slots }, @@ -42093,9 +42271,9 @@ pub mod api { pub fn set_max_temporary_slots( &self, slots: types::set_max_temporary_slots::Slots, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "AssignedSlots", "set_max_temporary_slots", types::SetMaxTemporarySlots { slots }, @@ -42450,9 +42628,9 @@ pub mod api { #[doc = " The number of lease periods a permanent parachain slot lasts."] pub fn permanent_slot_lease_period_length( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "AssignedSlots", "PermanentSlotLeasePeriodLength", [ @@ -42466,9 +42644,9 @@ pub mod api { #[doc = " The number of lease periods a temporary parachain slot lasts."] pub fn temporary_slot_lease_period_length( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "AssignedSlots", "TemporarySlotLeasePeriodLength", [ @@ -42482,9 +42660,9 @@ pub mod api { #[doc = " The max number of temporary slots to be scheduled per lease periods."] pub fn max_temporary_slot_per_lease_period( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "AssignedSlots", "MaxTemporarySlotPerLeasePeriod", [ @@ -42572,9 +42750,9 @@ pub mod api { pub fn register_validators( &self, validators: types::register_validators::Validators, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "ValidatorManager", "register_validators", types::RegisterValidators { validators }, @@ -42590,9 +42768,9 @@ pub mod api { pub fn deregister_validators( &self, validators: types::deregister_validators::Validators, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "ValidatorManager", "deregister_validators", types::DeregisterValidators { validators }, @@ -42920,9 +43098,9 @@ pub mod api { pub fn control_auto_migration( &self, maybe_config: types::control_auto_migration::MaybeConfig, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "StateTrieMigration", "control_auto_migration", types::ControlAutoMigration { maybe_config }, @@ -42939,8 +43117,9 @@ pub mod api { limits: types::continue_migrate::Limits, real_size_upper: types::continue_migrate::RealSizeUpper, witness_task: types::continue_migrate::WitnessTask, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload + { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "StateTrieMigration", "continue_migrate", types::ContinueMigrate { @@ -42961,9 +43140,9 @@ pub mod api { &self, keys: types::migrate_custom_top::Keys, witness_size: types::migrate_custom_top::WitnessSize, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "StateTrieMigration", "migrate_custom_top", types::MigrateCustomTop { keys, witness_size }, @@ -42980,9 +43159,9 @@ pub mod api { root: types::migrate_custom_child::Root, child_keys: types::migrate_custom_child::ChildKeys, total_size: types::migrate_custom_child::TotalSize, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "StateTrieMigration", "migrate_custom_child", types::MigrateCustomChild { @@ -43001,9 +43180,9 @@ pub mod api { pub fn set_signed_max_limits( &self, limits: types::set_signed_max_limits::Limits, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "StateTrieMigration", "set_signed_max_limits", types::SetSignedMaxLimits { limits }, @@ -43019,9 +43198,9 @@ pub mod api { &self, progress_top: types::force_set_progress::ProgressTop, progress_child: types::force_set_progress::ProgressChild, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "StateTrieMigration", "force_set_progress", types::ForceSetProgress { @@ -43256,9 +43435,9 @@ pub mod api { #[doc = " "] pub fn max_key_len( &self, - ) -> ::subxt::ext::subxt_core::constants::Address<::core::primitive::u32> + ) -> ::subxt::ext::subxt_core::constants::address::Address<::core::primitive::u32> { - ::subxt::ext::subxt_core::constants::Address::new_static( + ::subxt::ext::subxt_core::constants::address::Address::new_static( "StateTrieMigration", "MaxKeyLen", [ @@ -43407,8 +43586,8 @@ pub mod api { pub fn sudo( &self, call: types::sudo::Call, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Sudo", "sudo", types::Sudo { @@ -43426,9 +43605,9 @@ pub mod api { &self, call: types::sudo_unchecked_weight::Call, weight: types::sudo_unchecked_weight::Weight, - ) -> ::subxt::ext::subxt_core::tx::Payload + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Sudo", "sudo_unchecked_weight", types::SudoUncheckedWeight { @@ -43447,8 +43626,8 @@ pub mod api { pub fn set_key( &self, new: types::set_key::New, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Sudo", "set_key", types::SetKey { new }, @@ -43464,8 +43643,8 @@ pub mod api { &self, who: types::sudo_as::Who, call: types::sudo_as::Call, - ) -> ::subxt::ext::subxt_core::tx::Payload { - ::subxt::ext::subxt_core::tx::Payload::new_static( + ) -> ::subxt::ext::subxt_core::tx::payload::Payload { + ::subxt::ext::subxt_core::tx::payload::Payload::new_static( "Sudo", "sudo_as", types::SudoAs { diff --git a/testing/ui-tests/src/correct/custom_values.rs b/testing/ui-tests/src/correct/custom_values.rs index 65487f7ee9..ca1b0539ae 100644 --- a/testing/ui-tests/src/correct/custom_values.rs +++ b/testing/ui-tests/src/correct/custom_values.rs @@ -35,8 +35,11 @@ fn construct_offline_client() -> OfflineClient { let bytes = hex::decode(h).unwrap(); H256::from_slice(&bytes) }; - let runtime_version = subxt::client::RuntimeVersion::new(9370, 20); - + let runtime_version = subxt::client::RuntimeVersion { + spec_version: 9370, + transaction_version: 20, + }; + let metadata = { let bytes = std::fs::read("../../../../artifacts/metadata_with_custom_values.scale").unwrap(); Metadata::decode(&mut &*bytes).unwrap()